From abb84101121bf74f85c59f9b11532f86f8ee2392 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 26 Jun 2014 01:14:26 -0700 Subject: [PATCH 0001/3147] skeleton. This commit was moved from ipfs/go-path@131d562d8e337f6d0e58a352e9e9f8014dd506a9 --- path/path.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 path/path.go diff --git a/path/path.go b/path/path.go new file mode 100644 index 0000000000..e69de29bb2 From 303470d7731d7f13ead75dbfeaf585f4908254ba Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 26 Jun 2014 01:14:26 -0700 Subject: [PATCH 0002/3147] skeleton. This commit was moved from ipfs/go-ipfs-routing@7aeccb3167ee10c49e0453dad879803564de7eee --- routing/routing.go | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 routing/routing.go diff --git a/routing/routing.go b/routing/routing.go new file mode 100644 index 0000000000..2ab572c9a3 --- /dev/null +++ b/routing/routing.go @@ -0,0 +1,4 @@ +package routing + + +TODO SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-routing/index.js From a0ab31b2da2f985ecea888753850cc256102122b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 6 Jul 2014 00:07:04 -0700 Subject: [PATCH 0003/3147] added path resolution This commit was moved from ipfs/go-path@a628e6e95aa290642e0580ae87e58b5f5ad13e7a --- path/path.go | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/path/path.go b/path/path.go index e69de29bb2..4eb7a3288b 100644 --- a/path/path.go +++ b/path/path.go @@ -0,0 +1,77 @@ +package path + +import ( + "fmt" + merkledag "github.com/jbenet/go-ipfs/merkledag" + u "github.com/jbenet/go-ipfs/util" + mh "github.com/jbenet/go-multihash" + "path" + "strings" +) + +// Path resolution for IPFS + +type Resolver struct { + DAG *merkledag.DAGService +} + +func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { + fpath = path.Clean(fpath) + + parts := strings.Split(fpath, "/") + + // skip over empty first elem + if len(parts[0]) == 0 { + parts = parts[1:] + } + + // if nothing, bail. + if len(parts) == 0 { + return nil, fmt.Errorf("ipfs path must contain at least one component.") + } + + // first element in the path is a b58 hash (for now) + h, err := mh.FromB58String(parts[0]) + if err != nil { + return nil, err + } + + nd, err := s.DAG.Get(u.Key(h)) + if err != nil { + return nil, err + } + + return s.ResolveLinks(nd, parts[1:]) +} + +func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( + nd *merkledag.Node, err error) { + + nd = ndd // dup arg workaround + + // for each of the path components + for _, name := range names { + + var next u.Key + // for each of the links in nd, the current object + for _, link := range nd.Links { + if link.Name == name { + next = u.Key(link.Hash) + break + } + } + + if next == "" { + h1, _ := nd.Multihash() + h2 := h1.B58String() + return nil, fmt.Errorf("no link named \"%s\" under %s", name, h2) + } + + // fetch object for link and assign to nd + nd, err = s.DAG.Get(next) + if err != nil { + return nd, err + } + } + return +} From 86898044bfad45b1e4f65225a891f7aa1975f648 Mon Sep 17 00:00:00 2001 From: Quinn Slack Date: Sun, 20 Jul 2014 23:18:05 -0700 Subject: [PATCH 0004/3147] add comment '//' before note so that package routing compiles This commit was moved from ipfs/go-ipfs-routing@dbe541a98afda0a49961083a021f6bd74544f12f --- routing/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/routing.go b/routing/routing.go index 2ab572c9a3..7ff550539f 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -1,4 +1,4 @@ package routing -TODO SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-routing/index.js +// TODO SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-routing/index.js From 7e2c357649b27b842184ba319e7234ca30c55cb7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 21 Jul 2014 00:09:21 -0700 Subject: [PATCH 0005/3147] using %q This commit was moved from ipfs/go-path@b38521adef60a22850ca3fabbb04ae567aa2bb11 --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index 4eb7a3288b..47d0346b7e 100644 --- a/path/path.go +++ b/path/path.go @@ -64,7 +64,7 @@ func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( if next == "" { h1, _ := nd.Multihash() h2 := h1.B58String() - return nil, fmt.Errorf("no link named \"%s\" under %s", name, h2) + return nil, fmt.Errorf("no link named %q under %s", name, h2) } // fetch object for link and assign to nd From c9f1432ed51dd53e6f90bfd88c34e0d0a1a1e659 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 21 Jul 2014 08:05:27 -0700 Subject: [PATCH 0006/3147] go lint link errors left: - protocol buffers output is not lint-friendly This commit was moved from ipfs/go-path@566301d4da337d012b7e77fdf85976e0cec441c9 --- path/path.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/path/path.go b/path/path.go index 47d0346b7e..3f1c3997e4 100644 --- a/path/path.go +++ b/path/path.go @@ -9,12 +9,15 @@ import ( "strings" ) -// Path resolution for IPFS - +// Resolver provides path resolution to IPFS +// It has a pointer to a DAGService, which is uses to resolve nodes. type Resolver struct { DAG *merkledag.DAGService } +// ResolvePath fetches the node for given path. It uses the first +// path component as a hash (key) of the first node, then resolves +// all other components walking the links, with ResolveLinks. func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { fpath = path.Clean(fpath) @@ -27,7 +30,7 @@ func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { // if nothing, bail. if len(parts) == 0 { - return nil, fmt.Errorf("ipfs path must contain at least one component.") + return nil, fmt.Errorf("ipfs path must contain at least one component") } // first element in the path is a b58 hash (for now) @@ -44,6 +47,12 @@ func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { return s.ResolveLinks(nd, parts[1:]) } +// ResolveLinks iteratively resolves names by walking the link hierarchy. +// Every node is fetched from the DAGService, resolving the next name. +// Returns the last node found. +// +// ResolveLinks(nd, []string{"foo", "bar", "baz"}) +// would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( nd *merkledag.Node, err error) { From 8f5f39282973ab8c2e179471fffe5b083e9afa22 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 22 Jul 2014 03:11:08 -0700 Subject: [PATCH 0007/3147] routing interface This commit was moved from ipfs/go-ipfs-routing@09a3b4b23e0dbe78ce636e25d7b4488b4d7270c3 --- routing/routing.go | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/routing/routing.go b/routing/routing.go index 7ff550539f..4a92401814 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -1,4 +1,36 @@ package routing +import ( + "time" + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) -// TODO SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-routing/index.js +// IpfsRouting is the routing module interface +// It is implemented by things like DHTs, etc. +type IpfsRouting interface { + + // Basic Put/Get + + // PutValue adds value corresponding to given Key. + PutValue(key u.Key, value []byte) (error) + + // GetValue searches for the value corresponding to given Key. + GetValue(key u.Key, timeout time.Duration) ([]byte, error) + + + // Value provider layer of indirection. + // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. + + // Announce that this node can provide value for given key + Provide(key u.Key) (error) + + // FindProviders searches for peers who can provide the value for given key. + FindProviders(key u.Key, timeout time.Duration) (*peer.Peer, error) + + + // Find specific Peer + + // FindPeer searches for a peer with given ID. + FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) +} From a01cfb7278b6a9239443745bca3cdb7cb438337f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 23 Jul 2014 04:48:30 -0700 Subject: [PATCH 0008/3147] dht interface beginnings This commit was moved from ipfs/go-ipfs-routing@d2022da92512613c2dc09e0b1c3980aa79a61463 --- routing/dht/dht.go | 10 +++++++ routing/dht/routing.go | 44 ++++++++++++++++++++++++++++++ routing/dht/table.go | 61 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 routing/dht/dht.go create mode 100644 routing/dht/routing.go create mode 100644 routing/dht/table.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go new file mode 100644 index 0000000000..e8f475a9ec --- /dev/null +++ b/routing/dht/dht.go @@ -0,0 +1,10 @@ +package dht + +// TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js + + +// IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. +// It is used to implement the base IpfsRouting module. +type IpfsDHT struct { + routes RoutingTable +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go new file mode 100644 index 0000000000..575f0a1bfd --- /dev/null +++ b/routing/dht/routing.go @@ -0,0 +1,44 @@ +package dht + +import ( + "time" + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) + + +// This file implements the Routing interface for the IpfsDHT struct. + +// Basic Put/Get + +// PutValue adds value corresponding to given Key. +func (s *IpfsDHT) PutValue(key u.Key, value []byte) (error) { + return u.ErrNotImplemented +} + +// GetValue searches for the value corresponding to given Key. +func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { + return nil, u.ErrNotImplemented +} + + +// Value provider layer of indirection. +// This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. + +// Announce that this node can provide value for given key +func (s *IpfsDHT) Provide(key u.Key) (error) { + return u.ErrNotImplemented +} + +// FindProviders searches for peers who can provide the value for given key. +func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) (*peer.Peer, error) { + return nil, u.ErrNotImplemented +} + + +// Find specific Peer + +// FindPeer searches for a peer with given ID. +func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { + return nil, u.ErrNotImplemented +} diff --git a/routing/dht/table.go b/routing/dht/table.go new file mode 100644 index 0000000000..5ac514e047 --- /dev/null +++ b/routing/dht/table.go @@ -0,0 +1,61 @@ +package dht + +import ( + "container/list" +) + + +// ID for IpfsDHT should be a byte slice, to allow for simpler operations +// (xor). DHT ids are based on the peer.IDs. +// +// NOTE: peer.IDs are biased because they are (a) multihashes (first bytes +// biased), and (b) first bits are zeroes when using the S/Kademlia PoW. +// Thus, may need to re-hash keys (uniform dist). TODO(jbenet) +type ID []byte + +// Bucket holds a list of peers. +type Bucket []*list.List + + +// RoutingTable defines the routing table. +type RoutingTable struct { + + // kBuckets define all the fingers to other nodes. + Buckets []Bucket +} + + +func (id ID) commonPrefixLen() int { + for i := 0; i < len(id); i++ { + for j := 0; j < 8; j++ { + if (id[i] >> uint8(7 - j)) & 0x1 != 0 { + return i * 8 + j; + } + } + } + return len(id) * 8 - 1; +} + +func xor(a, b ID) ID { + + // ids may actually be of different sizes. + var ba ID + var bb ID + if len(a) >= len(b) { + ba = a + bb = b + } else { + ba = b + bb = a + } + + c := make(ID, len(ba)) + for i := 0; i < len(ba); i++ { + if len(bb) > i { + c[i] = ba[i] ^ bb[i] + } else { + c[i] = ba[i] ^ 0 + } + } + return c +} From 3130079c48b7575a0dd256d241d029af7de9e60e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Jul 2014 22:14:27 -0700 Subject: [PATCH 0009/3147] working on upper level dht implementations, protbuf, etc This commit was moved from ipfs/go-ipfs-routing@33e27d5a58152295cbd8ee16742654e011ab4ee1 --- routing/dht/dht.go | 12 +++++ routing/dht/messages.pb.go | 96 ++++++++++++++++++++++++++++++++++++++ routing/dht/messages.proto | 16 +++++++ routing/dht/routing.go | 36 +++++++++++++- 4 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 routing/dht/messages.pb.go create mode 100644 routing/dht/messages.proto diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e8f475a9ec..16a10c9e1c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -1,5 +1,9 @@ package dht +import ( + swarm "github.com/jbenet/go-ipfs/swarm" +) + // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js @@ -7,4 +11,12 @@ package dht // It is used to implement the base IpfsRouting module. type IpfsDHT struct { routes RoutingTable + + network *swarm.Swarm +} + +func (dht *IpfsDHT) handleMessages() { + for mes := range dht.network.Chan.Incoming { + + } } diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go new file mode 100644 index 0000000000..718f86b922 --- /dev/null +++ b/routing/dht/messages.pb.go @@ -0,0 +1,96 @@ +// Code generated by protoc-gen-go. +// source: messages.proto +// DO NOT EDIT! + +/* +Package dht is a generated protocol buffer package. + +It is generated from these files: + messages.proto + +It has these top-level messages: + DHTMessage +*/ +package dht + +import proto "code.google.com/p/goprotobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type DHTMessage_MessageType int32 + +const ( + DHTMessage_PUT_VALUE DHTMessage_MessageType = 0 + DHTMessage_GET_VALUE DHTMessage_MessageType = 1 + DHTMessage_PING DHTMessage_MessageType = 2 + DHTMessage_FIND_NODE DHTMessage_MessageType = 3 +) + +var DHTMessage_MessageType_name = map[int32]string{ + 0: "PUT_VALUE", + 1: "GET_VALUE", + 2: "PING", + 3: "FIND_NODE", +} +var DHTMessage_MessageType_value = map[string]int32{ + "PUT_VALUE": 0, + "GET_VALUE": 1, + "PING": 2, + "FIND_NODE": 3, +} + +func (x DHTMessage_MessageType) Enum() *DHTMessage_MessageType { + p := new(DHTMessage_MessageType) + *p = x + return p +} +func (x DHTMessage_MessageType) String() string { + return proto.EnumName(DHTMessage_MessageType_name, int32(x)) +} +func (x *DHTMessage_MessageType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(DHTMessage_MessageType_value, data, "DHTMessage_MessageType") + if err != nil { + return err + } + *x = DHTMessage_MessageType(value) + return nil +} + +type DHTMessage struct { + Type *DHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.DHTMessage_MessageType" json:"type,omitempty"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DHTMessage) Reset() { *m = DHTMessage{} } +func (m *DHTMessage) String() string { return proto.CompactTextString(m) } +func (*DHTMessage) ProtoMessage() {} + +func (m *DHTMessage) GetType() DHTMessage_MessageType { + if m != nil && m.Type != nil { + return *m.Type + } + return DHTMessage_PUT_VALUE +} + +func (m *DHTMessage) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +func (m *DHTMessage) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterEnum("dht.DHTMessage_MessageType", DHTMessage_MessageType_name, DHTMessage_MessageType_value) +} diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto new file mode 100644 index 0000000000..458b80fb6c --- /dev/null +++ b/routing/dht/messages.proto @@ -0,0 +1,16 @@ +package dht; + +//run `protoc --go_out=. *.proto` to generate + +message DHTMessage { + enum MessageType { + PUT_VALUE = 0; + GET_VALUE = 1; + PING = 2; + FIND_NODE = 3; + } + + required MessageType type = 1; + optional string key = 2; + optional bytes value = 3; +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 575f0a1bfd..0242399dd2 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -4,6 +4,7 @@ import ( "time" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" + swarm "github.com/jbenet/go-ipfs/swarm" ) @@ -13,12 +14,43 @@ import ( // PutValue adds value corresponding to given Key. func (s *IpfsDHT) PutValue(key u.Key, value []byte) (error) { - return u.ErrNotImplemented + var p *peer.Peer + p = s.routes.NearestNode(key) + + pmes := new(PutValue) + pmes.Key = &key + pmes.Value = value + + mes := new(swarm.Message) + mes.Data = []byte(pmes.String()) + mes.Peer = p + + s.network.Chan.Outgoing <- mes + return nil } // GetValue searches for the value corresponding to given Key. func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { - return nil, u.ErrNotImplemented + var p *peer.Peer + p = s.routes.NearestNode(key) + + // protobuf structure + pmes := new(GetValue) + pmes.Key = &key + pmes.Id = GenerateMessageID() + + mes := new(swarm.Message) + mes.Data = []byte(pmes.String()) + mes.Peer = p + + response_chan := s.network.ListenFor(pmes.Id) + + timeup := time.After(timeout) + select { + case <-timeup: + return nil, timeoutError + case resp := <-response_chan: + } } From 73c1ebcb5761f09e39bff5ca0eb49f9bb7f8c789 Mon Sep 17 00:00:00 2001 From: Jeromy Johnson Date: Tue, 29 Jul 2014 14:50:33 -0700 Subject: [PATCH 0010/3147] update messages and add some new code around handling/creating messages This commit was moved from ipfs/go-ipfs-routing@43c955316609ebe79c75a66523f5ad9f14495b8f --- routing/dht/dht.go | 34 ++++++++++++++++++++++++++++++++-- routing/dht/messages.proto | 7 +++++-- routing/dht/routing.go | 8 +++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 16a10c9e1c..21f054e695 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -2,6 +2,7 @@ package dht import ( swarm "github.com/jbenet/go-ipfs/swarm" + "sync" ) // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js @@ -10,13 +11,42 @@ import ( // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { - routes RoutingTable + routes RoutingTable - network *swarm.Swarm + network *swarm.Swarm + + listeners map[uint64]chan swarm.Message + listenLock sync.RWMutex } +// Read in all messages from swarm and handle them appropriately +// NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { for mes := range dht.network.Chan.Incoming { + for { + select { + case mes := <-dht.network.Chan.Incoming: + // Unmarshal message + dht.listenLock.RLock() + ch, ok := dht.listeners[id] + dht.listenLock.RUnlock() + if ok { + // Send message to waiting goroutine + ch <- mes + } + //case closeChan: or something + } + } } } + +// Register a handler for a specific message ID, used for getting replies +// to certain messages (i.e. response to a GET_VALUE message) +func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan swarm.Message { + lchan := make(chan swarm.Message) + dht.listenLock.Lock() + dht.listeners[mesid] = lchan + dht.listenLock.Unlock() + return lchan +} diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index 458b80fb6c..37024037b6 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -6,11 +6,14 @@ message DHTMessage { enum MessageType { PUT_VALUE = 0; GET_VALUE = 1; - PING = 2; - FIND_NODE = 3; + ADD_PROVIDER = 2; + GET_PROVIDERS = 3; + FIND_NODE = 4; + PING = 5; } required MessageType type = 1; optional string key = 2; optional bytes value = 3; + required int64 id = 4; } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 0242399dd2..bcbdec1daa 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -43,14 +43,20 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { mes.Data = []byte(pmes.String()) mes.Peer = p - response_chan := s.network.ListenFor(pmes.Id) + response_chan := s.ListenFor(pmes.Id) + // Wait for either the response or a timeout timeup := time.After(timeout) select { case <-timeup: + // TODO: unregister listener return nil, timeoutError case resp := <-response_chan: + return resp.Data, nil } + + // Should never be hit + return nil, nil } From eabf71db11a4f339d7c84b85f1c4f6ede97fef8c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 29 Jul 2014 17:53:31 -0700 Subject: [PATCH 0011/3147] equalize sizes This commit was moved from ipfs/go-ipfs-routing@543158eca63e736c0ed715ec2abe2cb91d7bb619 --- routing/dht/table.go | 86 +++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/routing/dht/table.go b/routing/dht/table.go index 5ac514e047..53fd0f0d15 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -1,61 +1,75 @@ package dht import ( - "container/list" + "bytes" + "container/list" ) - // ID for IpfsDHT should be a byte slice, to allow for simpler operations // (xor). DHT ids are based on the peer.IDs. // -// NOTE: peer.IDs are biased because they are (a) multihashes (first bytes -// biased), and (b) first bits are zeroes when using the S/Kademlia PoW. -// Thus, may need to re-hash keys (uniform dist). TODO(jbenet) +// NOTE: peer.IDs are biased because they are multihashes (first bytes +// biased). Thus, may need to re-hash keys (uniform dist). TODO(jbenet) type ID []byte // Bucket holds a list of peers. type Bucket []*list.List - // RoutingTable defines the routing table. type RoutingTable struct { - // kBuckets define all the fingers to other nodes. - Buckets []Bucket + // kBuckets define all the fingers to other nodes. + Buckets []Bucket } +func (id ID) Equal(other ID) bool { + return bytes.Equal(id, other) +} + +func (id ID) Less(other interface{}) bool { + a, b := equalizeSizes(id, other.(ID)) + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return a[i] < b[i] + } + } + return len(a) < len(b) +} func (id ID) commonPrefixLen() int { - for i := 0; i < len(id); i++ { - for j := 0; j < 8; j++ { - if (id[i] >> uint8(7 - j)) & 0x1 != 0 { - return i * 8 + j; - } - } - } - return len(id) * 8 - 1; + for i := 0; i < len(id); i++ { + for j := 0; j < 8; j++ { + if (id[i]>>uint8(7-j))&0x1 != 0 { + return i*8 + j + } + } + } + return len(id)*8 - 1 } func xor(a, b ID) ID { + a, b = equalizeSizes(a, b) + + c := make(ID, len(a)) + for i := 0; i < len(a); i++ { + c[i] = a[i] ^ b[i] + } + return c +} + +func equalizeSizes(a, b ID) (ID, ID) { + la := len(a) + lb := len(b) + + if la < lb { + na := make([]byte, lb) + copy(na, a) + a = na + } else if lb < la { + nb := make([]byte, la) + copy(nb, b) + b = nb + } - // ids may actually be of different sizes. - var ba ID - var bb ID - if len(a) >= len(b) { - ba = a - bb = b - } else { - ba = b - bb = a - } - - c := make(ID, len(ba)) - for i := 0; i < len(ba); i++ { - if len(bb) > i { - c[i] = ba[i] ^ bb[i] - } else { - c[i] = ba[i] ^ 0 - } - } - return c + return a, b } From f8da9f24e4fe015163389b60353ba54d74e66045 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 29 Jul 2014 17:55:19 -0700 Subject: [PATCH 0012/3147] whole project go fmt This commit was moved from ipfs/go-ipfs-routing@cb492e66606565bfc4841a207e0e7a7eae853a58 --- routing/dht/dht.go | 5 ++--- routing/dht/routing.go | 31 ++++++++++++++----------------- routing/routing.go | 36 +++++++++++++++++------------------- 3 files changed, 33 insertions(+), 39 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 21f054e695..c7e6f3c2ca 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -7,7 +7,6 @@ import ( // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js - // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { @@ -15,7 +14,7 @@ type IpfsDHT struct { network *swarm.Swarm - listeners map[uint64]chan swarm.Message + listeners map[uint64]chan swarm.Message listenLock sync.RWMutex } @@ -35,7 +34,7 @@ func (dht *IpfsDHT) handleMessages() { ch <- mes } - //case closeChan: or something + //case closeChan: or something } } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index bcbdec1daa..2bbe93e328 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,19 +1,18 @@ package dht import ( - "time" - peer "github.com/jbenet/go-ipfs/peer" - u "github.com/jbenet/go-ipfs/util" - swarm "github.com/jbenet/go-ipfs/swarm" + peer "github.com/jbenet/go-ipfs/peer" + swarm "github.com/jbenet/go-ipfs/swarm" + u "github.com/jbenet/go-ipfs/util" + "time" ) - // This file implements the Routing interface for the IpfsDHT struct. // Basic Put/Get // PutValue adds value corresponding to given Key. -func (s *IpfsDHT) PutValue(key u.Key, value []byte) (error) { +func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer p = s.routes.NearestNode(key) @@ -48,35 +47,33 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // Wait for either the response or a timeout timeup := time.After(timeout) select { - case <-timeup: - // TODO: unregister listener - return nil, timeoutError - case resp := <-response_chan: - return resp.Data, nil + case <-timeup: + // TODO: unregister listener + return nil, timeoutError + case resp := <-response_chan: + return resp.Data, nil } // Should never be hit return nil, nil } - // Value provider layer of indirection. // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. // Announce that this node can provide value for given key -func (s *IpfsDHT) Provide(key u.Key) (error) { - return u.ErrNotImplemented +func (s *IpfsDHT) Provide(key u.Key) error { + return u.ErrNotImplemented } // FindProviders searches for peers who can provide the value for given key. func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) (*peer.Peer, error) { - return nil, u.ErrNotImplemented + return nil, u.ErrNotImplemented } - // Find specific Peer // FindPeer searches for a peer with given ID. func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { - return nil, u.ErrNotImplemented + return nil, u.ErrNotImplemented } diff --git a/routing/routing.go b/routing/routing.go index 4a92401814..933032f461 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -1,36 +1,34 @@ package routing import ( - "time" - peer "github.com/jbenet/go-ipfs/peer" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" + "time" ) // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { - // Basic Put/Get + // Basic Put/Get - // PutValue adds value corresponding to given Key. - PutValue(key u.Key, value []byte) (error) + // PutValue adds value corresponding to given Key. + PutValue(key u.Key, value []byte) error - // GetValue searches for the value corresponding to given Key. - GetValue(key u.Key, timeout time.Duration) ([]byte, error) + // GetValue searches for the value corresponding to given Key. + GetValue(key u.Key, timeout time.Duration) ([]byte, error) + // Value provider layer of indirection. + // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. - // Value provider layer of indirection. - // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. + // Announce that this node can provide value for given key + Provide(key u.Key) error - // Announce that this node can provide value for given key - Provide(key u.Key) (error) + // FindProviders searches for peers who can provide the value for given key. + FindProviders(key u.Key, timeout time.Duration) (*peer.Peer, error) - // FindProviders searches for peers who can provide the value for given key. - FindProviders(key u.Key, timeout time.Duration) (*peer.Peer, error) + // Find specific Peer - - // Find specific Peer - - // FindPeer searches for a peer with given ID. - FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) + // FindPeer searches for a peer with given ID. + FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) } From dafcb28099687af90a691f0aad1cdbd7f26dbf1e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 29 Jul 2014 19:33:51 -0700 Subject: [PATCH 0013/3147] work on framework for dht message handling This commit was moved from ipfs/go-ipfs-routing@3a85f36352cb48c9033ba18a8213e291fe70beb3 --- routing/dht/dht.go | 56 ++++++++++++++++++++++++++------------ routing/dht/messages.pb.go | 34 ++++++++++++++++------- routing/dht/messages.proto | 2 +- routing/dht/routing.go | 29 +++++++++++++++----- routing/dht/table.go | 8 ++++++ 5 files changed, 94 insertions(+), 35 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c7e6f3c2ca..e5d7e94226 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -2,6 +2,8 @@ package dht import ( swarm "github.com/jbenet/go-ipfs/swarm" + u "github.com/jbenet/go-ipfs/util" + "code.google.com/p/goprotobuf/proto" "sync" ) @@ -14,36 +16,56 @@ type IpfsDHT struct { network *swarm.Swarm - listeners map[uint64]chan swarm.Message + // map of channels waiting for reply messages + listeners map[uint64]chan *swarm.Message listenLock sync.RWMutex + + // Signal to shutdown dht + shutdown chan struct{} } // Read in all messages from swarm and handle them appropriately // NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { - for mes := range dht.network.Chan.Incoming { - for { - select { - case mes := <-dht.network.Chan.Incoming: - // Unmarshal message - dht.listenLock.RLock() - ch, ok := dht.listeners[id] - dht.listenLock.RUnlock() - if ok { - // Send message to waiting goroutine - ch <- mes - } - - //case closeChan: or something + for { + select { + case mes := <-dht.network.Chan.Incoming: + pmes := new(DHTMessage) + err := proto.Unmarshal(mes.Data, pmes) + if err != nil { + u.PErr("Failed to decode protobuf message: %s", err) + continue + } + + // Note: not sure if this is the correct place for this + dht.listenLock.RLock() + ch, ok := dht.listeners[pmes.GetId()] + dht.listenLock.RUnlock() + if ok { + ch <- mes } + // + + // Do something else with the messages? + switch pmes.GetType() { + case DHTMessage_ADD_PROVIDER: + case DHTMessage_FIND_NODE: + case DHTMessage_GET_PROVIDERS: + case DHTMessage_GET_VALUE: + case DHTMessage_PING: + case DHTMessage_PUT_VALUE: + } + + case <-dht.shutdown: + return } } } // Register a handler for a specific message ID, used for getting replies // to certain messages (i.e. response to a GET_VALUE message) -func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan swarm.Message { - lchan := make(chan swarm.Message) +func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan *swarm.Message { + lchan := make(chan *swarm.Message) dht.listenLock.Lock() dht.listeners[mesid] = lchan dht.listenLock.Unlock() diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index 718f86b922..f4fcb8dfdd 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -23,23 +23,29 @@ var _ = math.Inf type DHTMessage_MessageType int32 const ( - DHTMessage_PUT_VALUE DHTMessage_MessageType = 0 - DHTMessage_GET_VALUE DHTMessage_MessageType = 1 - DHTMessage_PING DHTMessage_MessageType = 2 - DHTMessage_FIND_NODE DHTMessage_MessageType = 3 + DHTMessage_PUT_VALUE DHTMessage_MessageType = 0 + DHTMessage_GET_VALUE DHTMessage_MessageType = 1 + DHTMessage_ADD_PROVIDER DHTMessage_MessageType = 2 + DHTMessage_GET_PROVIDERS DHTMessage_MessageType = 3 + DHTMessage_FIND_NODE DHTMessage_MessageType = 4 + DHTMessage_PING DHTMessage_MessageType = 5 ) var DHTMessage_MessageType_name = map[int32]string{ 0: "PUT_VALUE", 1: "GET_VALUE", - 2: "PING", - 3: "FIND_NODE", + 2: "ADD_PROVIDER", + 3: "GET_PROVIDERS", + 4: "FIND_NODE", + 5: "PING", } var DHTMessage_MessageType_value = map[string]int32{ - "PUT_VALUE": 0, - "GET_VALUE": 1, - "PING": 2, - "FIND_NODE": 3, + "PUT_VALUE": 0, + "GET_VALUE": 1, + "ADD_PROVIDER": 2, + "GET_PROVIDERS": 3, + "FIND_NODE": 4, + "PING": 5, } func (x DHTMessage_MessageType) Enum() *DHTMessage_MessageType { @@ -63,6 +69,7 @@ type DHTMessage struct { Type *DHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.DHTMessage_MessageType" json:"type,omitempty"` Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -91,6 +98,13 @@ func (m *DHTMessage) GetValue() []byte { return nil } +func (m *DHTMessage) GetId() uint64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + func init() { proto.RegisterEnum("dht.DHTMessage_MessageType", DHTMessage_MessageType_name, DHTMessage_MessageType_value) } diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index 37024037b6..67ffad447e 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -15,5 +15,5 @@ message DHTMessage { required MessageType type = 1; optional string key = 2; optional bytes value = 3; - required int64 id = 4; + required uint64 id = 4; } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2bbe93e328..dfdde4dd18 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -7,6 +7,11 @@ import ( "time" ) +// TODO: determine a way of creating and managing message IDs +func GenerateMessageID() uint64 { + return 4 +} + // This file implements the Routing interface for the IpfsDHT struct. // Basic Put/Get @@ -16,9 +21,15 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer p = s.routes.NearestNode(key) - pmes := new(PutValue) - pmes.Key = &key + pmes_type := DHTMessage_PUT_VALUE + str_key := string(key) + mes_id := GenerateMessageID() + + pmes := new(DHTMessage) + pmes.Type = &pmes_type + pmes.Key = &str_key pmes.Value = value + pmes.Id = &mes_id mes := new(swarm.Message) mes.Data = []byte(pmes.String()) @@ -33,23 +44,27 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { var p *peer.Peer p = s.routes.NearestNode(key) + str_key := string(key) + mes_type := DHTMessage_GET_VALUE + mes_id := GenerateMessageID() // protobuf structure - pmes := new(GetValue) - pmes.Key = &key - pmes.Id = GenerateMessageID() + pmes := new(DHTMessage) + pmes.Type = &mes_type + pmes.Key = &str_key + pmes.Id = &mes_id mes := new(swarm.Message) mes.Data = []byte(pmes.String()) mes.Peer = p - response_chan := s.ListenFor(pmes.Id) + response_chan := s.ListenFor(*pmes.Id) // Wait for either the response or a timeout timeup := time.After(timeout) select { case <-timeup: // TODO: unregister listener - return nil, timeoutError + return nil, u.ErrTimeout case resp := <-response_chan: return resp.Data, nil } diff --git a/routing/dht/table.go b/routing/dht/table.go index 53fd0f0d15..d7625e4628 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -3,6 +3,9 @@ package dht import ( "bytes" "container/list" + + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" ) // ID for IpfsDHT should be a byte slice, to allow for simpler operations @@ -22,6 +25,11 @@ type RoutingTable struct { Buckets []Bucket } +//TODO: make this accept an ID, requires method of converting keys to IDs +func (rt *RoutingTable) NearestNode(key u.Key) *peer.Peer { + panic("Function not implemented.") +} + func (id ID) Equal(other ID) bool { return bytes.Equal(id, other) } From a4a8554bed87e7e5a84384b29393c09360a91a44 Mon Sep 17 00:00:00 2001 From: Jeromy Johnson Date: Wed, 30 Jul 2014 17:46:56 -0700 Subject: [PATCH 0014/3147] a little more work on message handling stuff This commit was moved from ipfs/go-ipfs-routing@4998a96231785f9b38c101eacbfe551ce1d946b8 --- routing/dht/dht.go | 75 +++++++++++++++++++++++++++++++++----- routing/dht/messages.pb.go | 20 +++++++--- routing/dht/messages.proto | 5 +++ routing/dht/routing.go | 9 ++--- 4 files changed, 89 insertions(+), 20 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e5d7e94226..a1f63f106b 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -1,10 +1,12 @@ package dht import ( + "sync" + + peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" "code.google.com/p/goprotobuf/proto" - "sync" ) // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js @@ -16,6 +18,9 @@ type IpfsDHT struct { network *swarm.Swarm + // local data (TEMPORARY: until we formalize data storage with datastore) + data map[string][]byte + // map of channels waiting for reply messages listeners map[uint64]chan *swarm.Message listenLock sync.RWMutex @@ -38,22 +43,28 @@ func (dht *IpfsDHT) handleMessages() { } // Note: not sure if this is the correct place for this - dht.listenLock.RLock() - ch, ok := dht.listeners[pmes.GetId()] - dht.listenLock.RUnlock() - if ok { - ch <- mes + if pmes.GetResponse() { + dht.listenLock.RLock() + ch, ok := dht.listeners[pmes.GetId()] + dht.listenLock.RUnlock() + if ok { + ch <- mes + } + + // this is expected behaviour during a timeout + u.DOut("Received response with nobody listening...") + continue } // - // Do something else with the messages? switch pmes.GetType() { - case DHTMessage_ADD_PROVIDER: + case DHTMessage_GET_VALUE: + dht.handleGetValue(mes.Peer, pmes) + case DHTMessage_PUT_VALUE: case DHTMessage_FIND_NODE: + case DHTMessage_ADD_PROVIDER: case DHTMessage_GET_PROVIDERS: - case DHTMessage_GET_VALUE: case DHTMessage_PING: - case DHTMessage_PUT_VALUE: } case <-dht.shutdown: @@ -62,6 +73,44 @@ func (dht *IpfsDHT) handleMessages() { } } +func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { + val, found := dht.data[pmes.GetKey()] + if found { + isResponse := true + resp := new(DHTMessage) + resp.Response = &isResponse + resp.Id = pmes.Id + resp.Key = pmes.Key + resp.Value = val + } else { + // Find closest node(s) to desired key and reply with that info + // TODO: this will need some other metadata in the protobuf message + // to signal to the querying node that the data its receiving + // is actually a list of other nodes + } +} + +func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { + panic("Not implemented.") +} + +func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { + panic("Not implemented.") +} + +func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { + isResponse := true + resp := new(DHTMessage) + resp.Id = pmes.Id + resp.Response = &isResponse + + mes := new(swarm.Message) + mes.Peer = p + mes.Data = []byte(resp.String()) + dht.network.Chan.Outgoing <- mes +} + + // Register a handler for a specific message ID, used for getting replies // to certain messages (i.e. response to a GET_VALUE message) func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan *swarm.Message { @@ -71,3 +120,9 @@ func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan *swarm.Message { dht.listenLock.Unlock() return lchan } + +// Stop all communications from this node and shut down +func (dht *IpfsDHT) Halt() { + dht.shutdown <- struct{}{} + dht.network.Close() +} diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index f4fcb8dfdd..3283ef4e2e 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -66,11 +66,14 @@ func (x *DHTMessage_MessageType) UnmarshalJSON(data []byte) error { } type DHTMessage struct { - Type *DHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.DHTMessage_MessageType" json:"type,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` - Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` - XXX_unrecognized []byte `json:"-"` + Type *DHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.DHTMessage_MessageType" json:"type,omitempty"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + // Unique ID of this message, used to match queries with responses + Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` + // Signals whether or not this message is a response to another message + Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *DHTMessage) Reset() { *m = DHTMessage{} } @@ -105,6 +108,13 @@ func (m *DHTMessage) GetId() uint64 { return 0 } +func (m *DHTMessage) GetResponse() bool { + if m != nil && m.Response != nil { + return *m.Response + } + return false +} + func init() { proto.RegisterEnum("dht.DHTMessage_MessageType", DHTMessage_MessageType_name, DHTMessage_MessageType_value) } diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index 67ffad447e..d873c7559a 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -15,5 +15,10 @@ message DHTMessage { required MessageType type = 1; optional string key = 2; optional bytes value = 3; + + // Unique ID of this message, used to match queries with responses required uint64 id = 4; + + // Signals whether or not this message is a response to another message + optional bool response = 5; } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index dfdde4dd18..e9ed64d980 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,15 +1,17 @@ package dht import ( + "math/rand" + "time" + peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" - "time" ) // TODO: determine a way of creating and managing message IDs func GenerateMessageID() uint64 { - return 4 + return uint64(rand.Uint32()) << 32 & uint64(rand.Uint32()) } // This file implements the Routing interface for the IpfsDHT struct. @@ -68,9 +70,6 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { case resp := <-response_chan: return resp.Data, nil } - - // Should never be hit - return nil, nil } // Value provider layer of indirection. From f6964ed3b12abbb0ac95b5be98856a41861661ad Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 30 Jul 2014 20:16:34 -0700 Subject: [PATCH 0015/3147] use datastore for local data This commit was moved from ipfs/go-ipfs-routing@098a903b5bc609a63e134a5bd5daf3b1a9ca5c76 --- routing/dht/dht.go | 60 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index a1f63f106b..0f55ba45b0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -3,9 +3,12 @@ package dht import ( "sync" - peer "github.com/jbenet/go-ipfs/peer" - swarm "github.com/jbenet/go-ipfs/swarm" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/jbenet/go-ipfs/peer" + swarm "github.com/jbenet/go-ipfs/swarm" + u "github.com/jbenet/go-ipfs/util" + + ds "github.com/jbenet/datastore.go" + "code.google.com/p/goprotobuf/proto" ) @@ -18,8 +21,11 @@ type IpfsDHT struct { network *swarm.Swarm - // local data (TEMPORARY: until we formalize data storage with datastore) - data map[string][]byte + // Local peer (yourself) + self *peer.Peer + + // Local data + datastore ds.Datastore // map of channels waiting for reply messages listeners map[uint64]chan *swarm.Message @@ -29,6 +35,15 @@ type IpfsDHT struct { shutdown chan struct{} } +func NewDHT(p *peer.Peer) *IpfsDHT { + dht := new(IpfsDHT) + dht.self = p + dht.network = swarm.NewSwarm(p) + dht.listeners = make(map[uint64]chan *swarm.Message) + dht.shutdown = make(chan struct{}) + return dht +} + // Read in all messages from swarm and handle them appropriately // NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { @@ -61,10 +76,13 @@ func (dht *IpfsDHT) handleMessages() { case DHTMessage_GET_VALUE: dht.handleGetValue(mes.Peer, pmes) case DHTMessage_PUT_VALUE: + dht.handlePutValue(mes.Peer, pmes) case DHTMessage_FIND_NODE: + dht.handleFindNode(mes.Peer, pmes) case DHTMessage_ADD_PROVIDER: case DHTMessage_GET_PROVIDERS: case DHTMessage_PING: + dht.handleFindNode(mes.Peer, pmes) } case <-dht.shutdown: @@ -74,15 +92,22 @@ func (dht *IpfsDHT) handleMessages() { } func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { - val, found := dht.data[pmes.GetKey()] - if found { + dskey := ds.NewKey(pmes.GetKey()) + i_val, err := dht.datastore.Get(dskey) + if err == nil { isResponse := true resp := new(DHTMessage) resp.Response = &isResponse resp.Id = pmes.Id resp.Key = pmes.Key + + val := i_val.([]byte) resp.Value = val - } else { + + mes := new(swarm.Message) + mes.Peer = p + mes.Data = []byte(resp.String()) + } else if err == ds.ErrNotFound { // Find closest node(s) to desired key and reply with that info // TODO: this will need some other metadata in the protobuf message // to signal to the querying node that the data its receiving @@ -90,8 +115,14 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { } } +// Store a value in this nodes local storage func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { - panic("Not implemented.") + dskey := ds.NewKey(pmes.GetKey()) + err := dht.datastore.Put(dskey, pmes.GetValue()) + if err != nil { + // For now, just panic, handle this better later maybe + panic(err) + } } func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { @@ -121,6 +152,17 @@ func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan *swarm.Message { return lchan } +func (dht *IpfsDHT) Unlisten(mesid uint64) { + dht.listenLock.Lock() + ch, ok := dht.listeners[mesid] + if ok { + delete(dht.listeners, mesid) + } + dht.listenLock.Unlock() + close(ch) +} + + // Stop all communications from this node and shut down func (dht *IpfsDHT) Halt() { dht.shutdown <- struct{}{} From 54a3b5e8b9677b04b55d2aba6dd5eb14f2082833 Mon Sep 17 00:00:00 2001 From: Jeromy Johnson Date: Thu, 31 Jul 2014 17:43:48 -0700 Subject: [PATCH 0016/3147] begin planning of identification process This commit was moved from ipfs/go-ipfs-routing@2702818816297c6eeb0f161087a7d4a72151cc60 --- routing/dht/dht.go | 74 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0f55ba45b0..62d4a71cf4 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -2,10 +2,14 @@ package dht import ( "sync" + "time" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" + identify "github.com/jbenet/go-ipfs/identify" + + ma "github.com/jbenet/go-multiaddr" ds "github.com/jbenet/datastore.go" @@ -35,15 +39,44 @@ type IpfsDHT struct { shutdown chan struct{} } -func NewDHT(p *peer.Peer) *IpfsDHT { +// Create a new DHT object with the given peer as the 'local' host +func NewDHT(p *peer.Peer) (*IpfsDHT, error) { dht := new(IpfsDHT) - dht.self = p + dht.network = swarm.NewSwarm(p) + //TODO: should Listen return an error? + dht.network.Listen() + + dht.datastore = ds.NewMapDatastore() + + dht.self = p dht.listeners = make(map[uint64]chan *swarm.Message) dht.shutdown = make(chan struct{}) - return dht + return dht, nil +} + +// Connect to a new peer at the given address +func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) error { + peer := new(peer.Peer) + peer.AddAddress(addr) + + conn,err := swarm.Dial("tcp", peer) + if err != nil { + return err + } + + err = identify.Handshake(dht.self, conn) + if err != nil { + return err + } + + dht.network.StartConn(conn.Peer.Key(), conn) + + // TODO: Add this peer to our routing table + return nil } + // Read in all messages from swarm and handle them appropriately // NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { @@ -134,11 +167,9 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { resp := new(DHTMessage) resp.Id = pmes.Id resp.Response = &isResponse + resp.Type = pmes.Type - mes := new(swarm.Message) - mes.Peer = p - mes.Data = []byte(resp.String()) - dht.network.Chan.Outgoing <- mes + dht.network.Chan.Outgoing <-swarm.NewMessage(p, []byte(resp.String())) } @@ -162,9 +193,36 @@ func (dht *IpfsDHT) Unlisten(mesid uint64) { close(ch) } - // Stop all communications from this node and shut down func (dht *IpfsDHT) Halt() { dht.shutdown <- struct{}{} dht.network.Close() } + +// Ping a node, log the time it took +func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) { + // Thoughts: maybe this should accept an ID and do a peer lookup? + id := GenerateMessageID() + mes_type := DHTMessage_PING + pmes := new(DHTMessage) + pmes.Id = &id + pmes.Type = &mes_type + + mes := new(swarm.Message) + mes.Peer = p + mes.Data = []byte(pmes.String()) + + before := time.Now() + response_chan := dht.ListenFor(id) + dht.network.Chan.Outgoing <- mes + + tout := time.After(timeout) + select { + case <-response_chan: + roundtrip := time.Since(before) + u.DOut("Ping took %s.", roundtrip.String()) + case <-tout: + // Timed out, think about removing node from network + u.DOut("Ping node timed out.") + } +} From 31b32ef46acf1d665daa1a79809b95d3847a57a1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 31 Jul 2014 21:55:44 -0700 Subject: [PATCH 0017/3147] making connections between nodes get closer to working This commit was moved from ipfs/go-ipfs-routing@e3ecf3200340b724c27462c12c4e7a7b2e943c6c --- routing/dht/dht.go | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 62d4a71cf4..9d6d1223a5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -55,6 +55,10 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) { return dht, nil } +func (dht *IpfsDHT) Start() { + go dht.handleMessages() +} + // Connect to a new peer at the given address func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) error { peer := new(peer.Peer) @@ -65,24 +69,26 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) error { return err } - err = identify.Handshake(dht.self, conn) + err = identify.Handshake(dht.self, peer, conn.Incoming.MsgChan, conn.Outgoing.MsgChan) if err != nil { return err } - dht.network.StartConn(conn.Peer.Key(), conn) + dht.network.StartConn(conn) // TODO: Add this peer to our routing table return nil } - // Read in all messages from swarm and handle them appropriately // NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { + u.DOut("Being message handling routine") for { select { case mes := <-dht.network.Chan.Incoming: + u.DOut("recieved message from swarm.") + pmes := new(DHTMessage) err := proto.Unmarshal(mes.Data, pmes) if err != nil { @@ -118,6 +124,8 @@ func (dht *IpfsDHT) handleMessages() { dht.handleFindNode(mes.Peer, pmes) } + case err := <-dht.network.Chan.Errors: + panic(err) case <-dht.shutdown: return } @@ -158,10 +166,6 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { } } -func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { - panic("Not implemented.") -} - func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { isResponse := true resp := new(DHTMessage) @@ -172,6 +176,18 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { dht.network.Chan.Outgoing <-swarm.NewMessage(p, []byte(resp.String())) } +func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { + panic("Not implemented.") +} + +func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { + panic("Not implemented.") +} + +func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *DHTMessage) { + panic("Not implemented.") +} + // Register a handler for a specific message ID, used for getting replies // to certain messages (i.e. response to a GET_VALUE message) @@ -202,6 +218,8 @@ func (dht *IpfsDHT) Halt() { // Ping a node, log the time it took func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) { // Thoughts: maybe this should accept an ID and do a peer lookup? + u.DOut("Enter Ping.") + id := GenerateMessageID() mes_type := DHTMessage_PING pmes := new(DHTMessage) From e12a3068b349f07303f1fca5b06b17538bee179d Mon Sep 17 00:00:00 2001 From: Jeromy Johnson Date: Fri, 1 Aug 2014 13:21:51 -0700 Subject: [PATCH 0018/3147] finish basic communcations between nodes and add a test of the ping operation This commit was moved from ipfs/go-ipfs-routing@6c1225f8070c031735895db047844f37e3492391 --- routing/dht/dht.go | 70 ++++++++++++++++++-------------------- routing/dht/dht_test.go | 55 ++++++++++++++++++++++++++++++ routing/dht/pDHTMessage.go | 24 +++++++++++++ 3 files changed, 112 insertions(+), 37 deletions(-) create mode 100644 routing/dht/dht_test.go create mode 100644 routing/dht/pDHTMessage.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 9d6d1223a5..ae320426c3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -41,20 +41,22 @@ type IpfsDHT struct { // Create a new DHT object with the given peer as the 'local' host func NewDHT(p *peer.Peer) (*IpfsDHT, error) { - dht := new(IpfsDHT) - - dht.network = swarm.NewSwarm(p) - //TODO: should Listen return an error? - dht.network.Listen() + network := swarm.NewSwarm(p) + err := network.Listen() + if err != nil { + return nil,err + } + dht := new(IpfsDHT) + dht.network = network dht.datastore = ds.NewMapDatastore() - dht.self = p dht.listeners = make(map[uint64]chan *swarm.Message) dht.shutdown = make(chan struct{}) return dht, nil } +// Start up background goroutines needed by the DHT func (dht *IpfsDHT) Start() { go dht.handleMessages() } @@ -111,6 +113,7 @@ func (dht *IpfsDHT) handleMessages() { } // + u.DOut("Got message type: %d", pmes.GetType()) switch pmes.GetType() { case DHTMessage_GET_VALUE: dht.handleGetValue(mes.Peer, pmes) @@ -121,7 +124,7 @@ func (dht *IpfsDHT) handleMessages() { case DHTMessage_ADD_PROVIDER: case DHTMessage_GET_PROVIDERS: case DHTMessage_PING: - dht.handleFindNode(mes.Peer, pmes) + dht.handlePing(mes.Peer, pmes) } case err := <-dht.network.Chan.Errors: @@ -136,18 +139,15 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { dskey := ds.NewKey(pmes.GetKey()) i_val, err := dht.datastore.Get(dskey) if err == nil { - isResponse := true - resp := new(DHTMessage) - resp.Response = &isResponse - resp.Id = pmes.Id - resp.Key = pmes.Key - - val := i_val.([]byte) - resp.Value = val - - mes := new(swarm.Message) - mes.Peer = p - mes.Data = []byte(resp.String()) + resp := &pDHTMessage{ + Response: true, + Id: *pmes.Id, + Key: *pmes.Key, + Value: i_val.([]byte), + } + + mes := swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Chan.Outgoing <- mes } else if err == ds.ErrNotFound { // Find closest node(s) to desired key and reply with that info // TODO: this will need some other metadata in the protobuf message @@ -167,13 +167,13 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { } func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { - isResponse := true - resp := new(DHTMessage) - resp.Id = pmes.Id - resp.Response = &isResponse - resp.Type = pmes.Type + resp := &pDHTMessage{ + Type: pmes.GetType(), + Response: true, + Id: pmes.GetId(), + } - dht.network.Chan.Outgoing <-swarm.NewMessage(p, []byte(resp.String())) + dht.network.Chan.Outgoing <-swarm.NewMessage(p, resp.ToProtobuf()) } func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { @@ -199,6 +199,7 @@ func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan *swarm.Message { return lchan } +// Unregister the given message id from the listener map func (dht *IpfsDHT) Unlisten(mesid uint64) { dht.listenLock.Lock() ch, ok := dht.listeners[mesid] @@ -216,31 +217,26 @@ func (dht *IpfsDHT) Halt() { } // Ping a node, log the time it took -func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) { +func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { // Thoughts: maybe this should accept an ID and do a peer lookup? u.DOut("Enter Ping.") - id := GenerateMessageID() - mes_type := DHTMessage_PING - pmes := new(DHTMessage) - pmes.Id = &id - pmes.Type = &mes_type - - mes := new(swarm.Message) - mes.Peer = p - mes.Data = []byte(pmes.String()) + pmes := pDHTMessage{Id: GenerateMessageID(), Type: DHTMessage_PING} + mes := swarm.NewMessage(p, pmes.ToProtobuf()) before := time.Now() - response_chan := dht.ListenFor(id) + response_chan := dht.ListenFor(pmes.Id) dht.network.Chan.Outgoing <- mes tout := time.After(timeout) select { case <-response_chan: roundtrip := time.Since(before) - u.DOut("Ping took %s.", roundtrip.String()) + u.POut("Ping took %s.", roundtrip.String()) + return nil case <-tout: // Timed out, think about removing node from network u.DOut("Ping node timed out.") + return u.ErrTimeout } } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go new file mode 100644 index 0000000000..8485a1d837 --- /dev/null +++ b/routing/dht/dht_test.go @@ -0,0 +1,55 @@ +package dht + +import ( + "testing" + peer "github.com/jbenet/go-ipfs/peer" + ma "github.com/jbenet/go-multiaddr" + u "github.com/jbenet/go-ipfs/util" + + "time" +) + +func TestPing(t *testing.T) { + u.Debug = false + addr_a,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + if err != nil { + t.Fatal(err) + } + addr_b,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") + if err != nil { + t.Fatal(err) + } + + peer_a := new(peer.Peer) + peer_a.AddAddress(addr_a) + peer_a.ID = peer.ID([]byte("peer_a")) + + peer_b := new(peer.Peer) + peer_b.AddAddress(addr_b) + peer_b.ID = peer.ID([]byte("peer_b")) + + dht_a,err := NewDHT(peer_a) + if err != nil { + t.Fatal(err) + } + + dht_b,err := NewDHT(peer_b) + if err != nil { + t.Fatal(err) + } + + + dht_a.Start() + dht_b.Start() + + err = dht_a.Connect(addr_b) + if err != nil { + t.Fatal(err) + } + + //Test that we can ping the node + err = dht_a.Ping(peer_b, time.Second * 2) + if err != nil { + t.Fatal(err) + } +} diff --git a/routing/dht/pDHTMessage.go b/routing/dht/pDHTMessage.go new file mode 100644 index 0000000000..65c03b1f86 --- /dev/null +++ b/routing/dht/pDHTMessage.go @@ -0,0 +1,24 @@ +package dht + +// A helper struct to make working with protbuf types easier +type pDHTMessage struct { + Type DHTMessage_MessageType + Key string + Value []byte + Response bool + Id uint64 +} + +func (m *pDHTMessage) ToProtobuf() *DHTMessage { + pmes := new(DHTMessage) + if m.Value != nil { + pmes.Value = m.Value + } + + pmes.Type = &m.Type + pmes.Key = &m.Key + pmes.Response = &m.Response + pmes.Id = &m.Id + + return pmes +} From adb6643f08a905e498e86b2b80a648f689ac8b90 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 3 Aug 2014 13:37:09 -0700 Subject: [PATCH 0019/3147] rough kbucket implementation, tests and cleanup to follow This commit was moved from ipfs/go-ipfs-routing@7de73610a0a9e86c00230eda3d0de0fe2bd85c4c --- routing/dht/routing.go | 4 +- routing/dht/table.go | 170 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 168 insertions(+), 6 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e9ed64d980..66e27e3699 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -21,7 +21,7 @@ func GenerateMessageID() uint64 { // PutValue adds value corresponding to given Key. func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer - p = s.routes.NearestNode(key) + p = s.routes.NearestPeer(convertKey(key)) pmes_type := DHTMessage_PUT_VALUE str_key := string(key) @@ -44,7 +44,7 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { // GetValue searches for the value corresponding to given Key. func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { var p *peer.Peer - p = s.routes.NearestNode(key) + p = s.routes.NearestPeer(convertKey(key)) str_key := string(key) mes_type := DHTMessage_GET_VALUE diff --git a/routing/dht/table.go b/routing/dht/table.go index d7625e4628..b8c20f8ab0 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -3,6 +3,9 @@ package dht import ( "bytes" "container/list" + "sort" + + "crypto/sha256" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -16,18 +19,177 @@ import ( type ID []byte // Bucket holds a list of peers. -type Bucket []*list.List +type Bucket list.List + +func (b *Bucket) Find(id peer.ID) *list.Element { + bucket_list := (*list.List)(b) + for e := bucket_list.Front(); e != nil; e = e.Next() { + if e.Value.(*peer.Peer).ID.Equal(id) { + return e + } + } + return nil +} + +func (b *Bucket) MoveToFront(e *list.Element) { + bucket_list := (*list.List)(b) + bucket_list.MoveToFront(e) +} + +func (b *Bucket) PushFront(p *peer.Peer) { + bucket_list := (*list.List)(b) + bucket_list.PushFront(p) +} + +func (b *Bucket) PopBack() *peer.Peer { + bucket_list := (*list.List)(b) + last := bucket_list.Back() + bucket_list.Remove(last) + return last.Value.(*peer.Peer) +} + +func (b *Bucket) Len() int { + bucket_list := (*list.List)(b) + return bucket_list.Len() +} + +func (b *Bucket) Split(cpl int, target ID) *Bucket { + bucket_list := (*list.List)(b) + out := list.New() + e := bucket_list.Front() + for e != nil { + peer_id := convertPeerID(e.Value.(*peer.Peer).ID) + peer_cpl := xor(peer_id, target).commonPrefixLen() + if peer_cpl > cpl { + cur := e + out.PushBack(e.Value) + e = e.Next() + bucket_list.Remove(cur) + continue + } + } + return (*Bucket)(out) +} // RoutingTable defines the routing table. type RoutingTable struct { + // ID of the local peer + local ID + // kBuckets define all the fingers to other nodes. - Buckets []Bucket + Buckets []*Bucket + bucketsize int +} + +func convertPeerID(id peer.ID) ID { + hash := sha256.Sum256(id) + return hash[:] +} + +func convertKey(id u.Key) ID { + hash := sha256.Sum256([]byte(id)) + return hash[:] +} + +// Update adds or moves the given peer to the front of its respective bucket +// If a peer gets removed from a bucket, it is returned +func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { + peer_id := convertPeerID(p.ID) + cpl := xor(peer_id, rt.local).commonPrefixLen() + + b_id := cpl + if b_id >= len(rt.Buckets) { + b_id = len(rt.Buckets) - 1 + } + + bucket := rt.Buckets[b_id] + e := bucket.Find(p.ID) + if e == nil { + // New peer, add to bucket + bucket.PushFront(p) + + // Are we past the max bucket size? + if bucket.Len() > rt.bucketsize { + if b_id == len(rt.Buckets) - 1 { + new_bucket := bucket.Split(b_id, rt.local) + rt.Buckets = append(rt.Buckets, new_bucket) + + // If all elements were on left side of split... + if bucket.Len() > rt.bucketsize { + return bucket.PopBack() + } + } else { + // If the bucket cant split kick out least active node + return bucket.PopBack() + } + } + return nil + } else { + // If the peer is already in the table, move it to the front. + // This signifies that it it "more active" and the less active nodes + // Will as a result tend towards the back of the list + bucket.MoveToFront(e) + return nil + } +} + +// A helper struct to sort peers by their distance to the local node +type peerDistance struct { + p *peer.Peer + distance ID +} +type peerSorterArr []*peerDistance +func (p peerSorterArr) Len() int {return len(p)} +func (p peerSorterArr) Swap(a, b int) {p[a],p[b] = p[b],p[a]} +func (p peerSorterArr) Less(a, b int) bool { + return p[a].distance.Less(p[b]) +} +// + +func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { + peers := rt.NearestPeers(id, 1) + return peers[0] } //TODO: make this accept an ID, requires method of converting keys to IDs -func (rt *RoutingTable) NearestNode(key u.Key) *peer.Peer { - panic("Function not implemented.") +func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { + cpl := xor(id, rt.local).commonPrefixLen() + + // Get bucket at cpl index or last bucket + var bucket *Bucket + if cpl >= len(rt.Buckets) { + bucket = rt.Buckets[len(rt.Buckets) - 1] + } else { + bucket = rt.Buckets[cpl] + } + + if bucket.Len() == 0 { + // This can happen, very rarely. + panic("Case not yet implemented.") + } + + var peerArr peerSorterArr + + plist := (*list.List)(bucket) + for e := plist.Front();e != nil; e = e.Next() { + p := e.Value.(*peer.Peer) + p_id := convertPeerID(p.ID) + pd := peerDistance{ + p: p, + distance: xor(rt.local, p_id), + } + peerArr = append(peerArr, &pd) + } + + sort.Sort(peerArr) + + var out []*peer.Peer + for i := 0; i < count && i < peerArr.Len(); i++ { + out = append(out, peerArr[i].p) + } + + return out } func (id ID) Equal(other ID) bool { From 68c02451ae1acf426a83c5130e46cc3b435eeaf3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 3 Aug 2014 15:04:24 -0700 Subject: [PATCH 0020/3147] tests for kbucket and some code cleanup This commit was moved from ipfs/go-ipfs-routing@007f055191318c23c7c68cf4cfb7d4b80d55bea1 --- routing/dht/bucket.go | 63 +++++++++++++++++ routing/dht/table.go | 143 +++++--------------------------------- routing/dht/table_test.go | 92 ++++++++++++++++++++++++ routing/dht/util.go | 78 +++++++++++++++++++++ 4 files changed, 249 insertions(+), 127 deletions(-) create mode 100644 routing/dht/bucket.go create mode 100644 routing/dht/table_test.go create mode 100644 routing/dht/util.go diff --git a/routing/dht/bucket.go b/routing/dht/bucket.go new file mode 100644 index 0000000000..120ed29a4a --- /dev/null +++ b/routing/dht/bucket.go @@ -0,0 +1,63 @@ +package dht + +import ( + "container/list" + + peer "github.com/jbenet/go-ipfs/peer" +) +// Bucket holds a list of peers. +type Bucket list.List + +func (b *Bucket) Find(id peer.ID) *list.Element { + bucket_list := (*list.List)(b) + for e := bucket_list.Front(); e != nil; e = e.Next() { + if e.Value.(*peer.Peer).ID.Equal(id) { + return e + } + } + return nil +} + +func (b *Bucket) MoveToFront(e *list.Element) { + bucket_list := (*list.List)(b) + bucket_list.MoveToFront(e) +} + +func (b *Bucket) PushFront(p *peer.Peer) { + bucket_list := (*list.List)(b) + bucket_list.PushFront(p) +} + +func (b *Bucket) PopBack() *peer.Peer { + bucket_list := (*list.List)(b) + last := bucket_list.Back() + bucket_list.Remove(last) + return last.Value.(*peer.Peer) +} + +func (b *Bucket) Len() int { + bucket_list := (*list.List)(b) + return bucket_list.Len() +} + +// Splits a buckets peers into two buckets, the methods receiver will have +// peers with CPL equal to cpl, the returned bucket will have peers with CPL +// greater than cpl (returned bucket has closer peers) +func (b *Bucket) Split(cpl int, target ID) *Bucket { + bucket_list := (*list.List)(b) + out := list.New() + e := bucket_list.Front() + for e != nil { + peer_id := convertPeerID(e.Value.(*peer.Peer).ID) + peer_cpl := xor(peer_id, target).commonPrefixLen() + if peer_cpl > cpl { + cur := e + out.PushBack(e.Value) + e = e.Next() + bucket_list.Remove(cur) + continue + } + e = e.Next() + } + return (*Bucket)(out) +} diff --git a/routing/dht/table.go b/routing/dht/table.go index b8c20f8ab0..c1eed534bd 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -1,76 +1,12 @@ package dht import ( - "bytes" "container/list" "sort" - "crypto/sha256" - peer "github.com/jbenet/go-ipfs/peer" - u "github.com/jbenet/go-ipfs/util" ) -// ID for IpfsDHT should be a byte slice, to allow for simpler operations -// (xor). DHT ids are based on the peer.IDs. -// -// NOTE: peer.IDs are biased because they are multihashes (first bytes -// biased). Thus, may need to re-hash keys (uniform dist). TODO(jbenet) -type ID []byte - -// Bucket holds a list of peers. -type Bucket list.List - -func (b *Bucket) Find(id peer.ID) *list.Element { - bucket_list := (*list.List)(b) - for e := bucket_list.Front(); e != nil; e = e.Next() { - if e.Value.(*peer.Peer).ID.Equal(id) { - return e - } - } - return nil -} - -func (b *Bucket) MoveToFront(e *list.Element) { - bucket_list := (*list.List)(b) - bucket_list.MoveToFront(e) -} - -func (b *Bucket) PushFront(p *peer.Peer) { - bucket_list := (*list.List)(b) - bucket_list.PushFront(p) -} - -func (b *Bucket) PopBack() *peer.Peer { - bucket_list := (*list.List)(b) - last := bucket_list.Back() - bucket_list.Remove(last) - return last.Value.(*peer.Peer) -} - -func (b *Bucket) Len() int { - bucket_list := (*list.List)(b) - return bucket_list.Len() -} - -func (b *Bucket) Split(cpl int, target ID) *Bucket { - bucket_list := (*list.List)(b) - out := list.New() - e := bucket_list.Front() - for e != nil { - peer_id := convertPeerID(e.Value.(*peer.Peer).ID) - peer_cpl := xor(peer_id, target).commonPrefixLen() - if peer_cpl > cpl { - cur := e - out.PushBack(e.Value) - e = e.Next() - bucket_list.Remove(cur) - continue - } - } - return (*Bucket)(out) -} - // RoutingTable defines the routing table. type RoutingTable struct { @@ -82,14 +18,12 @@ type RoutingTable struct { bucketsize int } -func convertPeerID(id peer.ID) ID { - hash := sha256.Sum256(id) - return hash[:] -} - -func convertKey(id u.Key) ID { - hash := sha256.Sum256([]byte(id)) - return hash[:] +func NewRoutingTable(bucketsize int, local_id ID) *RoutingTable { + rt := new(RoutingTable) + rt.Buckets = []*Bucket{new(Bucket)} + rt.bucketsize = bucketsize + rt.local = local_id + return rt } // Update adds or moves the given peer to the front of its respective bucket @@ -114,6 +48,10 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { if b_id == len(rt.Buckets) - 1 { new_bucket := bucket.Split(b_id, rt.local) rt.Buckets = append(rt.Buckets, new_bucket) + if new_bucket.Len() > rt.bucketsize { + // This is another very rare and annoying case + panic("Case not handled.") + } // If all elements were on left side of split... if bucket.Len() > rt.bucketsize { @@ -139,20 +77,23 @@ type peerDistance struct { p *peer.Peer distance ID } + +// peerSorterArr implements sort.Interface to sort peers by xor distance type peerSorterArr []*peerDistance func (p peerSorterArr) Len() int {return len(p)} func (p peerSorterArr) Swap(a, b int) {p[a],p[b] = p[b],p[a]} func (p peerSorterArr) Less(a, b int) bool { - return p[a].distance.Less(p[b]) + return p[a].distance.Less(p[b].distance) } // +// Returns a single peer that is nearest to the given ID func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { peers := rt.NearestPeers(id, 1) return peers[0] } -//TODO: make this accept an ID, requires method of converting keys to IDs +// Returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { cpl := xor(id, rt.local).commonPrefixLen() @@ -170,7 +111,6 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { } var peerArr peerSorterArr - plist := (*list.List)(bucket) for e := plist.Front();e != nil; e = e.Next() { p := e.Value.(*peer.Peer) @@ -182,6 +122,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { peerArr = append(peerArr, &pd) } + // Sort by distance to local peer sort.Sort(peerArr) var out []*peer.Peer @@ -191,55 +132,3 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { return out } - -func (id ID) Equal(other ID) bool { - return bytes.Equal(id, other) -} - -func (id ID) Less(other interface{}) bool { - a, b := equalizeSizes(id, other.(ID)) - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - return a[i] < b[i] - } - } - return len(a) < len(b) -} - -func (id ID) commonPrefixLen() int { - for i := 0; i < len(id); i++ { - for j := 0; j < 8; j++ { - if (id[i]>>uint8(7-j))&0x1 != 0 { - return i*8 + j - } - } - } - return len(id)*8 - 1 -} - -func xor(a, b ID) ID { - a, b = equalizeSizes(a, b) - - c := make(ID, len(a)) - for i := 0; i < len(a); i++ { - c[i] = a[i] ^ b[i] - } - return c -} - -func equalizeSizes(a, b ID) (ID, ID) { - la := len(a) - lb := len(b) - - if la < lb { - na := make([]byte, lb) - copy(na, a) - a = na - } else if lb < la { - nb := make([]byte, la) - copy(nb, b) - b = nb - } - - return a, b -} diff --git a/routing/dht/table_test.go b/routing/dht/table_test.go new file mode 100644 index 0000000000..cb52bd1a0d --- /dev/null +++ b/routing/dht/table_test.go @@ -0,0 +1,92 @@ +package dht + +import ( + crand "crypto/rand" + "crypto/sha256" + "math/rand" + "container/list" + "testing" + + peer "github.com/jbenet/go-ipfs/peer" +) + +func _randPeer() *peer.Peer { + p := new(peer.Peer) + p.ID = make(peer.ID, 16) + crand.Read(p.ID) + return p +} + +func _randID() ID { + buf := make([]byte, 16) + crand.Read(buf) + + hash := sha256.Sum256(buf) + return ID(hash[:]) +} + +// Test basic features of the bucket struct +func TestBucket(t *testing.T) { + b := new(Bucket) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 100; i++ { + peers[i] = _randPeer() + b.PushFront(peers[i]) + } + + local := _randPeer() + local_id := convertPeerID(local.ID) + + i := rand.Intn(len(peers)) + e := b.Find(peers[i].ID) + if e == nil { + t.Errorf("Failed to find peer: %v", peers[i]) + } + + spl := b.Split(0, convertPeerID(local.ID)) + llist := (*list.List)(b) + for e := llist.Front(); e != nil; e = e.Next() { + p := convertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, local_id).commonPrefixLen() + if cpl > 0 { + t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") + } + } + + rlist := (*list.List)(spl) + for e := rlist.Front(); e != nil; e = e.Next() { + p := convertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, local_id).commonPrefixLen() + if cpl == 0 { + t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") + } + } +} + +// Right now, this just makes sure that it doesnt hang or crash +func TestTableUpdate(t *testing.T) { + local := _randPeer() + rt := NewRoutingTable(10, convertPeerID(local.ID)) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 100; i++ { + peers[i] = _randPeer() + } + + // Testing Update + for i := 0; i < 10000; i++ { + p := rt.Update(peers[rand.Intn(len(peers))]) + if p != nil { + t.Log("evicted peer.") + } + } + + for i := 0; i < 100; i++ { + id := _randID() + ret := rt.NearestPeers(id, 5) + if len(ret) == 0 { + t.Fatal("Failed to find node near ID.") + } + } +} diff --git a/routing/dht/util.go b/routing/dht/util.go new file mode 100644 index 0000000000..eed8d93013 --- /dev/null +++ b/routing/dht/util.go @@ -0,0 +1,78 @@ +package dht + +import ( + "bytes" + "crypto/sha256" + + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) + +// ID for IpfsDHT should be a byte slice, to allow for simpler operations +// (xor). DHT ids are based on the peer.IDs. +// +// NOTE: peer.IDs are biased because they are multihashes (first bytes +// biased). Thus, may need to re-hash keys (uniform dist). TODO(jbenet) +type ID []byte + +func (id ID) Equal(other ID) bool { + return bytes.Equal(id, other) +} + +func (id ID) Less(other interface{}) bool { + a, b := equalizeSizes(id, other.(ID)) + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return a[i] < b[i] + } + } + return len(a) < len(b) +} + +func (id ID) commonPrefixLen() int { + for i := 0; i < len(id); i++ { + for j := 0; j < 8; j++ { + if (id[i]>>uint8(7-j))&0x1 != 0 { + return i*8 + j + } + } + } + return len(id)*8 - 1 +} + +func xor(a, b ID) ID { + a, b = equalizeSizes(a, b) + + c := make(ID, len(a)) + for i := 0; i < len(a); i++ { + c[i] = a[i] ^ b[i] + } + return c +} + +func equalizeSizes(a, b ID) (ID, ID) { + la := len(a) + lb := len(b) + + if la < lb { + na := make([]byte, lb) + copy(na, a) + a = na + } else if lb < la { + nb := make([]byte, la) + copy(nb, b) + b = nb + } + + return a, b +} + +func convertPeerID(id peer.ID) ID { + hash := sha256.Sum256(id) + return hash[:] +} + +func convertKey(id u.Key) ID { + hash := sha256.Sum256([]byte(id)) + return hash[:] +} From 89b7f7e69192cda702d6f57d3064f48f4f904700 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 3 Aug 2014 17:35:12 -0700 Subject: [PATCH 0021/3147] finish implementation of Put and Get for DHT This commit was moved from ipfs/go-ipfs-routing@f92fff2d8b34fdb7d5987e7aa4efb0e831318c4e --- routing/dht/dht.go | 10 ++++--- routing/dht/dht_test.go | 60 ++++++++++++++++++++++++++++++++++++++++- routing/dht/routing.go | 58 ++++++++++++++++++++------------------- routing/dht/table.go | 51 +++++++++++++++++++++++------------ 4 files changed, 131 insertions(+), 48 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ae320426c3..02ef8c4f7e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -21,7 +21,7 @@ import ( // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { - routes RoutingTable + routes *RoutingTable network *swarm.Swarm @@ -53,6 +53,7 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) { dht.self = p dht.listeners = make(map[uint64]chan *swarm.Message) dht.shutdown = make(chan struct{}) + dht.routes = NewRoutingTable(20, convertPeerID(p.ID)) return dht, nil } @@ -78,14 +79,14 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) error { dht.network.StartConn(conn) - // TODO: Add this peer to our routing table + dht.routes.Update(peer) return nil } // Read in all messages from swarm and handle them appropriately // NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { - u.DOut("Being message handling routine") + u.DOut("Begin message handling routine") for { select { case mes := <-dht.network.Chan.Incoming: @@ -98,6 +99,9 @@ func (dht *IpfsDHT) handleMessages() { continue } + // Update peers latest visit in routing table + dht.routes.Update(mes.Peer) + // Note: not sure if this is the correct place for this if pmes.GetResponse() { dht.listenLock.RLock() diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 8485a1d837..0c4b7ee090 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -6,9 +6,13 @@ import ( ma "github.com/jbenet/go-multiaddr" u "github.com/jbenet/go-ipfs/util" + "fmt" + "time" ) +var _ = fmt.Println + func TestPing(t *testing.T) { u.Debug = false addr_a,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") @@ -38,7 +42,6 @@ func TestPing(t *testing.T) { t.Fatal(err) } - dht_a.Start() dht_b.Start() @@ -52,4 +55,59 @@ func TestPing(t *testing.T) { if err != nil { t.Fatal(err) } + + dht_a.Halt() + dht_b.Halt() +} + +func TestValueGetSet(t *testing.T) { + u.Debug = false + addr_a,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + if err != nil { + t.Fatal(err) + } + addr_b,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") + if err != nil { + t.Fatal(err) + } + + peer_a := new(peer.Peer) + peer_a.AddAddress(addr_a) + peer_a.ID = peer.ID([]byte("peer_a")) + + peer_b := new(peer.Peer) + peer_b.AddAddress(addr_b) + peer_b.ID = peer.ID([]byte("peer_b")) + + dht_a,err := NewDHT(peer_a) + if err != nil { + t.Fatal(err) + } + + dht_b,err := NewDHT(peer_b) + if err != nil { + t.Fatal(err) + } + + dht_a.Start() + dht_b.Start() + + err = dht_a.Connect(addr_b) + if err != nil { + t.Fatal(err) + } + + err = dht_a.PutValue("hello", []byte("world")) + if err != nil { + t.Fatal(err) + } + + val, err := dht_a.GetValue("hello", time.Second * 2) + if err != nil { + t.Fatal(err) + } + + if string(val) != "world" { + t.Fatalf("Expected 'world' got %s", string(val)) + } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 66e27e3699..2b37192cdf 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -4,6 +4,8 @@ import ( "math/rand" "time" + proto "code.google.com/p/goprotobuf/proto" + peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" @@ -22,21 +24,20 @@ func GenerateMessageID() uint64 { func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer p = s.routes.NearestPeer(convertKey(key)) + if p == nil { + u.POut("nbuckets: %d", len(s.routes.Buckets)) + u.POut("%d", s.routes.Buckets[0].Len()) + panic("Table returned nil peer!") + } - pmes_type := DHTMessage_PUT_VALUE - str_key := string(key) - mes_id := GenerateMessageID() - - pmes := new(DHTMessage) - pmes.Type = &pmes_type - pmes.Key = &str_key - pmes.Value = value - pmes.Id = &mes_id - - mes := new(swarm.Message) - mes.Data = []byte(pmes.String()) - mes.Peer = p + pmes := pDHTMessage{ + Type: DHTMessage_PUT_VALUE, + Key: string(key), + Value: value, + Id: GenerateMessageID(), + } + mes := swarm.NewMessage(p, pmes.ToProtobuf()) s.network.Chan.Outgoing <- mes return nil } @@ -45,21 +46,19 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { var p *peer.Peer p = s.routes.NearestPeer(convertKey(key)) + if p == nil { + panic("Table returned nil peer!") + } - str_key := string(key) - mes_type := DHTMessage_GET_VALUE - mes_id := GenerateMessageID() - // protobuf structure - pmes := new(DHTMessage) - pmes.Type = &mes_type - pmes.Key = &str_key - pmes.Id = &mes_id - - mes := new(swarm.Message) - mes.Data = []byte(pmes.String()) - mes.Peer = p + pmes := pDHTMessage{ + Type: DHTMessage_GET_VALUE, + Key: string(key), + Id: GenerateMessageID(), + } + response_chan := s.ListenFor(pmes.Id) - response_chan := s.ListenFor(*pmes.Id) + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + s.network.Chan.Outgoing <- mes // Wait for either the response or a timeout timeup := time.After(timeout) @@ -68,7 +67,12 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // TODO: unregister listener return nil, u.ErrTimeout case resp := <-response_chan: - return resp.Data, nil + pmes_out := new(DHTMessage) + err := proto.Unmarshal(resp.Data, pmes_out) + if err != nil { + return nil,err + } + return pmes_out.GetValue(), nil } } diff --git a/routing/dht/table.go b/routing/dht/table.go index c1eed534bd..17af957561 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -49,7 +49,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { new_bucket := bucket.Split(b_id, rt.local) rt.Buckets = append(rt.Buckets, new_bucket) if new_bucket.Len() > rt.bucketsize { - // This is another very rare and annoying case + // TODO: This is a very rare and annoying case panic("Case not handled.") } @@ -87,10 +87,27 @@ func (p peerSorterArr) Less(a, b int) bool { } // +func (rt *RoutingTable) copyPeersFromList(peerArr peerSorterArr, peerList *list.List) peerSorterArr { + for e := peerList.Front(); e != nil; e = e.Next() { + p := e.Value.(*peer.Peer) + p_id := convertPeerID(p.ID) + pd := peerDistance{ + p: p, + distance: xor(rt.local, p_id), + } + peerArr = append(peerArr, &pd) + } + return peerArr +} + // Returns a single peer that is nearest to the given ID func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { peers := rt.NearestPeers(id, 1) - return peers[0] + if len(peers) > 0 { + return peers[0] + } else { + return nil + } } // Returns a list of the 'count' closest peers to the given ID @@ -100,26 +117,26 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // Get bucket at cpl index or last bucket var bucket *Bucket if cpl >= len(rt.Buckets) { - bucket = rt.Buckets[len(rt.Buckets) - 1] - } else { - bucket = rt.Buckets[cpl] + cpl = len(rt.Buckets) - 1 } + bucket = rt.Buckets[cpl] + var peerArr peerSorterArr if bucket.Len() == 0 { - // This can happen, very rarely. - panic("Case not yet implemented.") - } + // In the case of an unusual split, one bucket may be empty. + // if this happens, search both surrounding buckets for nearest peer + if cpl > 0 { + plist := (*list.List)(rt.Buckets[cpl - 1]) + peerArr = rt.copyPeersFromList(peerArr, plist) + } - var peerArr peerSorterArr - plist := (*list.List)(bucket) - for e := plist.Front();e != nil; e = e.Next() { - p := e.Value.(*peer.Peer) - p_id := convertPeerID(p.ID) - pd := peerDistance{ - p: p, - distance: xor(rt.local, p_id), + if cpl < len(rt.Buckets) - 1 { + plist := (*list.List)(rt.Buckets[cpl + 1]) + peerArr = rt.copyPeersFromList(peerArr, plist) } - peerArr = append(peerArr, &pd) + } else { + plist := (*list.List)(bucket) + peerArr = rt.copyPeersFromList(peerArr, plist) } // Sort by distance to local peer From 27c08bd681aa6f436f6fae7690ea0096621488d4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 3 Aug 2014 21:46:01 -0700 Subject: [PATCH 0022/3147] working towards Providers implementation This commit was moved from ipfs/go-ipfs-routing@860a2a20f0925e7310f6fa57e37bd56184194c61 --- routing/dht/dht.go | 42 +++++++++++++++++++++-- routing/dht/routing.go | 78 ++++++++++++++++++++++++++++++++++++++---- routing/routing.go | 2 +- 3 files changed, 112 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 02ef8c4f7e..e0c6650517 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -3,6 +3,7 @@ package dht import ( "sync" "time" + "encoding/json" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" @@ -31,6 +32,10 @@ type IpfsDHT struct { // Local data datastore ds.Datastore + // Map keys to peers that can provide their value + // TODO: implement a TTL on each of these keys + providers map[u.Key][]*peer.Peer + // map of channels waiting for reply messages listeners map[uint64]chan *swarm.Message listenLock sync.RWMutex @@ -185,11 +190,44 @@ func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { } func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { - panic("Not implemented.") + providers := dht.providers[u.Key(pmes.GetKey())] + if providers == nil || len(providers) == 0 { + // ????? + } + + var addrs []string + for _,prov := range providers { + ma := prov.NetAddress("tcp") + str,err := ma.String() + if err != nil { + u.PErr("Error: %s", err) + continue + } + + addrs = append(addrs, str) + } + + data,err := json.Marshal(addrs) + if err != nil { + panic(err) + } + + resp := pDHTMessage{ + Type: DHTMessage_GET_PROVIDERS, + Key: pmes.GetKey(), + Value: data, + Id: pmes.GetId(), + } + + mes := swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Chan.Outgoing <-mes } func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *DHTMessage) { - panic("Not implemented.") + //TODO: need to implement TTLs on providers + key := u.Key(pmes.GetKey()) + parr := dht.providers[key] + dht.providers[key] = append(parr, p) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2b37192cdf..699242f569 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -11,6 +11,9 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +// Pool size is the number of nodes used for group find/set RPC calls +var PoolSize = 6 + // TODO: determine a way of creating and managing message IDs func GenerateMessageID() uint64 { return uint64(rand.Uint32()) << 32 & uint64(rand.Uint32()) @@ -25,8 +28,6 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer p = s.routes.NearestPeer(convertKey(key)) if p == nil { - u.POut("nbuckets: %d", len(s.routes.Buckets)) - u.POut("%d", s.routes.Buckets[0].Len()) panic("Table returned nil peer!") } @@ -64,7 +65,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { timeup := time.After(timeout) select { case <-timeup: - // TODO: unregister listener + s.Unlisten(pmes.Id) return nil, u.ErrTimeout case resp := <-response_chan: pmes_out := new(DHTMessage) @@ -81,17 +82,80 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // Announce that this node can provide value for given key func (s *IpfsDHT) Provide(key u.Key) error { - return u.ErrNotImplemented + peers := s.routes.NearestPeers(convertKey(key), PoolSize) + if len(peers) == 0 { + //return an error + } + + pmes := pDHTMessage{ + Type: DHTMessage_ADD_PROVIDER, + Key: string(key), + } + pbmes := pmes.ToProtobuf() + + for _,p := range peers { + mes := swarm.NewMessage(p, pbmes) + s.network.Chan.Outgoing <-mes + } + return nil } // FindProviders searches for peers who can provide the value for given key. -func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) (*peer.Peer, error) { - return nil, u.ErrNotImplemented +func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { + p := s.routes.NearestPeer(convertKey(key)) + + pmes := pDHTMessage{ + Type: DHTMessage_GET_PROVIDERS, + Key: string(key), + Id: GenerateMessageID(), + } + + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + + listen_chan := s.ListenFor(pmes.Id) + s.network.Chan.Outgoing <-mes + after := time.After(timeout) + select { + case <-after: + s.Unlisten(pmes.Id) + return nil, u.ErrTimeout + case resp := <-listen_chan: + pmes_out := new(DHTMessage) + err := proto.Unmarshal(resp.Data, pmes_out) + if err != nil { + return nil, err + } + panic("Not yet implemented.") + } } // Find specific Peer // FindPeer searches for a peer with given ID. func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { - return nil, u.ErrNotImplemented + p := s.routes.NearestPeer(convertPeerID(id)) + + pmes := pDHTMessage{ + Type: DHTMessage_FIND_NODE, + Key: string(id), + Id: GenerateMessageID(), + } + + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + + listen_chan := s.ListenFor(pmes.Id) + s.network.Chan.Outgoing <-mes + after := time.After(timeout) + select { + case <-after: + s.Unlisten(pmes.Id) + return nil, u.ErrTimeout + case resp := <-listen_chan: + pmes_out := new(DHTMessage) + err := proto.Unmarshal(resp.Data, pmes_out) + if err != nil { + return nil, err + } + panic("Not yet implemented.") + } } diff --git a/routing/routing.go b/routing/routing.go index 933032f461..3826f13cbd 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -25,7 +25,7 @@ type IpfsRouting interface { Provide(key u.Key) error // FindProviders searches for peers who can provide the value for given key. - FindProviders(key u.Key, timeout time.Duration) (*peer.Peer, error) + FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) // Find specific Peer From 4d64cdb924dcdb6b4e11e6feb431e68d83b3c90a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Aug 2014 09:38:26 -0700 Subject: [PATCH 0023/3147] a little error handling and some work on providers This commit was moved from ipfs/go-ipfs-routing@94b1179309095720bddf9f86f75c4252b2432c02 --- routing/dht/dht.go | 16 ++++++++++++---- routing/dht/routing.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e0c6650517..0341218ae9 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -35,6 +35,7 @@ type IpfsDHT struct { // Map keys to peers that can provide their value // TODO: implement a TTL on each of these keys providers map[u.Key][]*peer.Peer + providerLock sync.RWMutex // map of channels waiting for reply messages listeners map[uint64]chan *swarm.Message @@ -46,6 +47,9 @@ type IpfsDHT struct { // Create a new DHT object with the given peer as the 'local' host func NewDHT(p *peer.Peer) (*IpfsDHT, error) { + if p == nil { + panic("Tried to create new dht with nil peer") + } network := swarm.NewSwarm(p) err := network.Listen() if err != nil { @@ -68,24 +72,27 @@ func (dht *IpfsDHT) Start() { } // Connect to a new peer at the given address -func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) error { +func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { + if addr == nil { + panic("addr was nil!") + } peer := new(peer.Peer) peer.AddAddress(addr) conn,err := swarm.Dial("tcp", peer) if err != nil { - return err + return nil, err } err = identify.Handshake(dht.self, peer, conn.Incoming.MsgChan, conn.Outgoing.MsgChan) if err != nil { - return err + return nil, err } dht.network.StartConn(conn) dht.routes.Update(peer) - return nil + return peer, nil } // Read in all messages from swarm and handle them appropriately @@ -195,6 +202,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { // ????? } + // This is just a quick hack, formalize method of sending addrs later var addrs []string for _,prov := range providers { ma := prov.NetAddress("tcp") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 699242f569..0180998d9f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,9 +3,12 @@ package dht import ( "math/rand" "time" + "encoding/json" proto "code.google.com/p/goprotobuf/proto" + ma "github.com/jbenet/go-multiaddr" + peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" @@ -125,7 +128,32 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, if err != nil { return nil, err } - panic("Not yet implemented.") + var addrs map[string]string + err := json.Unmarshal(pmes_out.GetValue(), &addrs) + if err != nil { + return nil, err + } + + for key,addr := range addrs { + p := s.network.Find(u.Key(key)) + if p == nil { + maddr,err := ma.NewMultiaddr(addr) + if err != nil { + u.PErr("error connecting to new peer: %s", err) + continue + } + p, err := s.Connect(maddr) + if err != nil { + u.PErr("error connecting to new peer: %s", err) + continue + } + } + s.providerLock.Lock() + prov_arr := s.providers[key] + s.providers[key] = append(prov_arr, p) + s.providerLock.Unlock() + } + } } From 3417315188e2f7381dfde444566590b5b19e02e7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Aug 2014 18:32:22 -0700 Subject: [PATCH 0024/3147] providers interface is coming along nicely This commit was moved from ipfs/go-ipfs-routing@5484d862e8d1ad1945ceee78dda8be3ce1c1e5cd --- routing/dht/dht.go | 39 +++++++++++++++++++++++++++----------- routing/dht/pDHTMessage.go | 11 +++++++++++ routing/dht/routing.go | 24 +++++++++++++---------- 3 files changed, 53 insertions(+), 21 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0341218ae9..c12e351908 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -61,6 +61,7 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) { dht.datastore = ds.NewMapDatastore() dht.self = p dht.listeners = make(map[uint64]chan *swarm.Message) + dht.providers = make(map[u.Key][]*peer.Peer) dht.shutdown = make(chan struct{}) dht.routes = NewRoutingTable(20, convertPeerID(p.ID)) return dht, nil @@ -101,9 +102,11 @@ func (dht *IpfsDHT) handleMessages() { u.DOut("Begin message handling routine") for { select { - case mes := <-dht.network.Chan.Incoming: - u.DOut("recieved message from swarm.") - + case mes,ok := <-dht.network.Chan.Incoming: + if !ok { + u.DOut("handleMessages closing, bad recv on incoming") + return + } pmes := new(DHTMessage) err := proto.Unmarshal(mes.Data, pmes) if err != nil { @@ -121,15 +124,16 @@ func (dht *IpfsDHT) handleMessages() { dht.listenLock.RUnlock() if ok { ch <- mes + } else { + // this is expected behaviour during a timeout + u.DOut("Received response with nobody listening...") } - // this is expected behaviour during a timeout - u.DOut("Received response with nobody listening...") continue } // - u.DOut("Got message type: %d", pmes.GetType()) + u.DOut("Got message type: '%s' [id = %x]", mesNames[pmes.GetType()], pmes.GetId()) switch pmes.GetType() { case DHTMessage_GET_VALUE: dht.handleGetValue(mes.Peer, pmes) @@ -138,13 +142,15 @@ func (dht *IpfsDHT) handleMessages() { case DHTMessage_FIND_NODE: dht.handleFindNode(mes.Peer, pmes) case DHTMessage_ADD_PROVIDER: + dht.handleAddProvider(mes.Peer, pmes) case DHTMessage_GET_PROVIDERS: + dht.handleGetProviders(mes.Peer, pmes) case DHTMessage_PING: dht.handlePing(mes.Peer, pmes) } case err := <-dht.network.Chan.Errors: - panic(err) + u.DErr("dht err: %s", err) case <-dht.shutdown: return } @@ -197,13 +203,16 @@ func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { } func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { + dht.providerLock.RLock() providers := dht.providers[u.Key(pmes.GetKey())] + dht.providerLock.RUnlock() if providers == nil || len(providers) == 0 { // ????? + u.DOut("No known providers for requested key.") } // This is just a quick hack, formalize method of sending addrs later - var addrs []string + addrs := make(map[u.Key]string) for _,prov := range providers { ma := prov.NetAddress("tcp") str,err := ma.String() @@ -212,7 +221,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { continue } - addrs = append(addrs, str) + addrs[prov.Key()] = str } data,err := json.Marshal(addrs) @@ -225,6 +234,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { Key: pmes.GetKey(), Value: data, Id: pmes.GetId(), + Response: true, } mes := swarm.NewMessage(p, resp.ToProtobuf()) @@ -234,8 +244,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *DHTMessage) { //TODO: need to implement TTLs on providers key := u.Key(pmes.GetKey()) - parr := dht.providers[key] - dht.providers[key] = append(parr, p) + dht.addProviderEntry(key, p) } @@ -290,3 +299,11 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { return u.ErrTimeout } } + +func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { + u.DOut("Adding %s as provider for '%s'", p.Key().Pretty(), key) + dht.providerLock.Lock() + provs := dht.providers[key] + dht.providers[key] = append(provs, p) + dht.providerLock.Unlock() +} diff --git a/routing/dht/pDHTMessage.go b/routing/dht/pDHTMessage.go index 65c03b1f86..8b862dbc97 100644 --- a/routing/dht/pDHTMessage.go +++ b/routing/dht/pDHTMessage.go @@ -9,6 +9,17 @@ type pDHTMessage struct { Id uint64 } +var mesNames [10]string + +func init() { + mesNames[DHTMessage_ADD_PROVIDER] = "add provider" + mesNames[DHTMessage_FIND_NODE] = "find node" + mesNames[DHTMessage_GET_PROVIDERS] = "get providers" + mesNames[DHTMessage_GET_VALUE] = "get value" + mesNames[DHTMessage_PUT_VALUE] = "put value" + mesNames[DHTMessage_PING] = "ping" +} + func (m *pDHTMessage) ToProtobuf() *DHTMessage { pmes := new(DHTMessage) if m.Value != nil { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 0180998d9f..cbe0e92461 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -19,7 +19,8 @@ var PoolSize = 6 // TODO: determine a way of creating and managing message IDs func GenerateMessageID() uint64 { - return uint64(rand.Uint32()) << 32 & uint64(rand.Uint32()) + //return (uint64(rand.Uint32()) << 32) & uint64(rand.Uint32()) + return uint64(rand.Uint32()) } // This file implements the Routing interface for the IpfsDHT struct. @@ -116,6 +117,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, mes := swarm.NewMessage(p, pmes.ToProtobuf()) listen_chan := s.ListenFor(pmes.Id) + u.DOut("Find providers for: '%s'", key) s.network.Chan.Outgoing <-mes after := time.After(timeout) select { @@ -123,37 +125,39 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, s.Unlisten(pmes.Id) return nil, u.ErrTimeout case resp := <-listen_chan: + u.DOut("FindProviders: got response.") pmes_out := new(DHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { return nil, err } - var addrs map[string]string - err := json.Unmarshal(pmes_out.GetValue(), &addrs) + var addrs map[u.Key]string + err = json.Unmarshal(pmes_out.GetValue(), &addrs) if err != nil { return nil, err } - for key,addr := range addrs { - p := s.network.Find(u.Key(key)) + var prov_arr []*peer.Peer + for pid,addr := range addrs { + p := s.network.Find(pid) if p == nil { maddr,err := ma.NewMultiaddr(addr) if err != nil { u.PErr("error connecting to new peer: %s", err) continue } - p, err := s.Connect(maddr) + p, err = s.Connect(maddr) if err != nil { u.PErr("error connecting to new peer: %s", err) continue } } - s.providerLock.Lock() - prov_arr := s.providers[key] - s.providers[key] = append(prov_arr, p) - s.providerLock.Unlock() + s.addProviderEntry(key, p) + prov_arr = append(prov_arr, p) } + return prov_arr, nil + } } From 2897e072a0f0ff23afabdb64953706fce581c9cd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Aug 2014 20:31:48 -0700 Subject: [PATCH 0025/3147] implement find peer rpc This commit was moved from ipfs/go-ipfs-routing@bedc1d551550a475298911c7767b168b3d1a72d4 --- routing/dht/dht.go | 65 +++++++++++++++++++++++++++++++++--------- routing/dht/routing.go | 8 +++++- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c12e351908..c2c1b63bee 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -73,6 +73,7 @@ func (dht *IpfsDHT) Start() { } // Connect to a new peer at the given address +// TODO: move this into swarm func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { if addr == nil { panic("addr was nil!") @@ -90,9 +91,21 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { return nil, err } + // Send node an address that you can be reached on + myaddr := dht.self.NetAddress("tcp") + mastr,err := myaddr.String() + if err != nil { + panic("No local address to send") + } + + conn.Outgoing.MsgChan <- []byte(mastr) + dht.network.StartConn(conn) - dht.routes.Update(peer) + removed := dht.routes.Update(peer) + if removed != nil { + panic("need to remove this peer.") + } return peer, nil } @@ -115,7 +128,10 @@ func (dht *IpfsDHT) handleMessages() { } // Update peers latest visit in routing table - dht.routes.Update(mes.Peer) + removed := dht.routes.Update(mes.Peer) + if removed != nil { + panic("Need to handle removed peer.") + } // Note: not sure if this is the correct place for this if pmes.GetResponse() { @@ -140,7 +156,7 @@ func (dht *IpfsDHT) handleMessages() { case DHTMessage_PUT_VALUE: dht.handlePutValue(mes.Peer, pmes) case DHTMessage_FIND_NODE: - dht.handleFindNode(mes.Peer, pmes) + dht.handleFindPeer(mes.Peer, pmes) case DHTMessage_ADD_PROVIDER: dht.handleAddProvider(mes.Peer, pmes) case DHTMessage_GET_PROVIDERS: @@ -171,14 +187,14 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { mes := swarm.NewMessage(p, resp.ToProtobuf()) dht.network.Chan.Outgoing <- mes } else if err == ds.ErrNotFound { - // Find closest node(s) to desired key and reply with that info + // Find closest peer(s) to desired key and reply with that info // TODO: this will need some other metadata in the protobuf message - // to signal to the querying node that the data its receiving - // is actually a list of other nodes + // to signal to the querying peer that the data its receiving + // is actually a list of other peer } } -// Store a value in this nodes local storage +// Store a value in this peer local storage func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { dskey := ds.NewKey(pmes.GetKey()) err := dht.datastore.Put(dskey, pmes.GetValue()) @@ -189,7 +205,7 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { } func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { - resp := &pDHTMessage{ + resp := pDHTMessage{ Type: pmes.GetType(), Response: true, Id: pmes.GetId(), @@ -198,8 +214,29 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { dht.network.Chan.Outgoing <-swarm.NewMessage(p, resp.ToProtobuf()) } -func (dht *IpfsDHT) handleFindNode(p *peer.Peer, pmes *DHTMessage) { - panic("Not implemented.") +func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *DHTMessage) { + closest := dht.routes.NearestPeer(convertKey(u.Key(pmes.GetKey()))) + if closest == nil { + } + + if len(closest.Addresses) == 0 { + panic("no addresses for connected peer...") + } + + addr,err := closest.Addresses[0].String() + if err != nil { + panic(err) + } + + resp := pDHTMessage{ + Type: pmes.GetType(), + Response: true, + Id: pmes.GetId(), + Value: []byte(addr), + } + + mes := swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Chan.Outgoing <-mes } func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { @@ -269,13 +306,13 @@ func (dht *IpfsDHT) Unlisten(mesid uint64) { close(ch) } -// Stop all communications from this node and shut down +// Stop all communications from this peer and shut down func (dht *IpfsDHT) Halt() { dht.shutdown <- struct{}{} dht.network.Close() } -// Ping a node, log the time it took +// Ping a peer, log the time it took func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { // Thoughts: maybe this should accept an ID and do a peer lookup? u.DOut("Enter Ping.") @@ -294,8 +331,8 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { u.POut("Ping took %s.", roundtrip.String()) return nil case <-tout: - // Timed out, think about removing node from network - u.DOut("Ping node timed out.") + // Timed out, think about removing peer from network + u.DOut("Ping peer timed out.") return u.ErrTimeout } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index cbe0e92461..138a0ee92e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -188,6 +188,12 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error if err != nil { return nil, err } - panic("Not yet implemented.") + addr := string(pmes_out.GetValue()) + maddr, err := ma.NewMultiaddr(addr) + if err != nil { + return nil, err + } + + return s.Connect(maddr) } } From c8794ded008dbbbdcc6e778c68be2b4c8a60859f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 6 Aug 2014 10:02:53 -0700 Subject: [PATCH 0026/3147] fix bug in routing table lookups This commit was moved from ipfs/go-ipfs-routing@1d8385d1fc3ded2ab31dac191a0df6674e41e878 --- routing/dht/dht.go | 14 +++++++++++++- routing/dht/dht_test.go | 4 ++-- routing/dht/messages.pb.go | 17 +++++++++-------- routing/dht/messages.proto | 1 + routing/dht/pDHTMessage.go | 11 ----------- routing/dht/routing.go | 13 ++++++++++++- routing/dht/table.go | 24 +++++++++++++++++++----- routing/dht/table_test.go | 17 +++++++++++++++++ 8 files changed, 73 insertions(+), 28 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c2c1b63bee..9b4854cfeb 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -106,6 +106,14 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { if removed != nil { panic("need to remove this peer.") } + + // Ping new peer to register in their routing table + // NOTE: this should be done better... + err = dht.Ping(peer, time.Second * 2) + if err != nil { + panic("Failed to ping new peer.") + } + return peer, nil } @@ -149,7 +157,7 @@ func (dht *IpfsDHT) handleMessages() { } // - u.DOut("Got message type: '%s' [id = %x]", mesNames[pmes.GetType()], pmes.GetId()) + u.DOut("Got message type: '%s' [id = %x]", DHTMessage_MessageType_name[int32(pmes.GetType())], pmes.GetId()) switch pmes.GetType() { case DHTMessage_GET_VALUE: dht.handleGetValue(mes.Peer, pmes) @@ -215,14 +223,18 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { } func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *DHTMessage) { + u.POut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) closest := dht.routes.NearestPeer(convertKey(u.Key(pmes.GetKey()))) if closest == nil { + panic("could not find anything.") } if len(closest.Addresses) == 0 { panic("no addresses for connected peer...") } + u.POut("handleFindPeer: sending back '%s'", closest.ID.Pretty()) + addr,err := closest.Addresses[0].String() if err != nil { panic(err) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 0c4b7ee090..6217c29f24 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -45,7 +45,7 @@ func TestPing(t *testing.T) { dht_a.Start() dht_b.Start() - err = dht_a.Connect(addr_b) + _,err = dht_a.Connect(addr_b) if err != nil { t.Fatal(err) } @@ -92,7 +92,7 @@ func TestValueGetSet(t *testing.T) { dht_a.Start() dht_b.Start() - err = dht_a.Connect(addr_b) + _,err = dht_a.Connect(addr_b) if err != nil { t.Fatal(err) } diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index 3283ef4e2e..e95f487c1b 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -29,6 +29,7 @@ const ( DHTMessage_GET_PROVIDERS DHTMessage_MessageType = 3 DHTMessage_FIND_NODE DHTMessage_MessageType = 4 DHTMessage_PING DHTMessage_MessageType = 5 + DHTMessage_DIAGNOSTIC DHTMessage_MessageType = 6 ) var DHTMessage_MessageType_name = map[int32]string{ @@ -38,6 +39,7 @@ var DHTMessage_MessageType_name = map[int32]string{ 3: "GET_PROVIDERS", 4: "FIND_NODE", 5: "PING", + 6: "DIAGNOSTIC", } var DHTMessage_MessageType_value = map[string]int32{ "PUT_VALUE": 0, @@ -46,6 +48,7 @@ var DHTMessage_MessageType_value = map[string]int32{ "GET_PROVIDERS": 3, "FIND_NODE": 4, "PING": 5, + "DIAGNOSTIC": 6, } func (x DHTMessage_MessageType) Enum() *DHTMessage_MessageType { @@ -66,14 +69,12 @@ func (x *DHTMessage_MessageType) UnmarshalJSON(data []byte) error { } type DHTMessage struct { - Type *DHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.DHTMessage_MessageType" json:"type,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` - // Unique ID of this message, used to match queries with responses - Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` - // Signals whether or not this message is a response to another message - Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` - XXX_unrecognized []byte `json:"-"` + Type *DHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.DHTMessage_MessageType" json:"type,omitempty"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` + Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *DHTMessage) Reset() { *m = DHTMessage{} } diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index d873c7559a..a9a7fd3c6c 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -10,6 +10,7 @@ message DHTMessage { GET_PROVIDERS = 3; FIND_NODE = 4; PING = 5; + DIAGNOSTIC = 6; } required MessageType type = 1; diff --git a/routing/dht/pDHTMessage.go b/routing/dht/pDHTMessage.go index 8b862dbc97..65c03b1f86 100644 --- a/routing/dht/pDHTMessage.go +++ b/routing/dht/pDHTMessage.go @@ -9,17 +9,6 @@ type pDHTMessage struct { Id uint64 } -var mesNames [10]string - -func init() { - mesNames[DHTMessage_ADD_PROVIDER] = "add provider" - mesNames[DHTMessage_FIND_NODE] = "find node" - mesNames[DHTMessage_GET_PROVIDERS] = "get providers" - mesNames[DHTMessage_GET_VALUE] = "get value" - mesNames[DHTMessage_PUT_VALUE] = "put value" - mesNames[DHTMessage_PING] = "ping" -} - func (m *pDHTMessage) ToProtobuf() *DHTMessage { pmes := new(DHTMessage) if m.Value != nil { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 138a0ee92e..4894983504 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -194,6 +194,17 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error return nil, err } - return s.Connect(maddr) + found_peer, err := s.Connect(maddr) + if err != nil { + u.POut("Found peer but couldnt connect.") + return nil, err + } + + if !found_peer.ID.Equal(id) { + u.POut("FindPeer: searching for '%s' but found '%s'", id.Pretty(), found_peer.ID.Pretty()) + return found_peer, u.ErrSearchIncomplete + } + + return found_peer, nil } } diff --git a/routing/dht/table.go b/routing/dht/table.go index 17af957561..ce8fdbc245 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -1,10 +1,12 @@ package dht import ( + "encoding/hex" "container/list" "sort" peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" ) // RoutingTable defines the routing table. @@ -87,13 +89,13 @@ func (p peerSorterArr) Less(a, b int) bool { } // -func (rt *RoutingTable) copyPeersFromList(peerArr peerSorterArr, peerList *list.List) peerSorterArr { +func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) p_id := convertPeerID(p.ID) pd := peerDistance{ p: p, - distance: xor(rt.local, p_id), + distance: xor(target, p_id), } peerArr = append(peerArr, &pd) } @@ -112,6 +114,7 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { // Returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { + u.POut("Searching table, size = %d", rt.Size()) cpl := xor(id, rt.local).commonPrefixLen() // Get bucket at cpl index or last bucket @@ -127,16 +130,16 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { plist := (*list.List)(rt.Buckets[cpl - 1]) - peerArr = rt.copyPeersFromList(peerArr, plist) + peerArr = copyPeersFromList(id, peerArr, plist) } if cpl < len(rt.Buckets) - 1 { plist := (*list.List)(rt.Buckets[cpl + 1]) - peerArr = rt.copyPeersFromList(peerArr, plist) + peerArr = copyPeersFromList(id, peerArr, plist) } } else { plist := (*list.List)(bucket) - peerArr = rt.copyPeersFromList(peerArr, plist) + peerArr = copyPeersFromList(id, peerArr, plist) } // Sort by distance to local peer @@ -145,7 +148,18 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { var out []*peer.Peer for i := 0; i < count && i < peerArr.Len(); i++ { out = append(out, peerArr[i].p) + u.POut("peer out: %s - %s", peerArr[i].p.ID.Pretty(), + hex.EncodeToString(xor(id, convertPeerID(peerArr[i].p.ID)))) } return out } + +// Returns the total number of peers in the routing table +func (rt *RoutingTable) Size() int { + var tot int + for _,buck := range rt.Buckets { + tot += buck.Len() + } + return tot +} diff --git a/routing/dht/table_test.go b/routing/dht/table_test.go index cb52bd1a0d..debec5e164 100644 --- a/routing/dht/table_test.go +++ b/routing/dht/table_test.go @@ -90,3 +90,20 @@ func TestTableUpdate(t *testing.T) { } } } + +func TestTableFind(t *testing.T) { + local := _randPeer() + rt := NewRoutingTable(10, convertPeerID(local.ID)) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 5; i++ { + peers[i] = _randPeer() + rt.Update(peers[i]) + } + + t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + found := rt.NearestPeer(convertPeerID(peers[2].ID)) + if !found.ID.Equal(peers[2].ID) { + t.Fatalf("Failed to lookup known node...") + } +} From 781aab21b4a8ce40304e025852d33c6e23f417be Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 6 Aug 2014 18:37:45 -0700 Subject: [PATCH 0027/3147] worked on gathering data for diagnostic messages and some other misc cleanup This commit was moved from ipfs/go-ipfs-routing@03eef3e3bcb87a405dd86654f5609301c6e429de --- routing/dht/bucket.go | 5 +++ routing/dht/dht.go | 87 +++++++++++++++++++++----------------- routing/dht/dht_test.go | 4 -- routing/dht/messages.pb.go | 8 ++++ routing/dht/messages.proto | 1 + routing/dht/pDHTMessage.go | 2 + routing/dht/routing.go | 27 ++++++++++++ routing/dht/table.go | 16 ++++--- routing/dht/util.go | 4 +- 9 files changed, 105 insertions(+), 49 deletions(-) diff --git a/routing/dht/bucket.go b/routing/dht/bucket.go index 120ed29a4a..996d299d9b 100644 --- a/routing/dht/bucket.go +++ b/routing/dht/bucket.go @@ -61,3 +61,8 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { } return (*Bucket)(out) } + +func (b *Bucket) getIter() *list.Element { + bucket_list := (*list.List)(b) + return bucket_list.Front() +} diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 9b4854cfeb..44a56831b7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -34,7 +34,7 @@ type IpfsDHT struct { // Map keys to peers that can provide their value // TODO: implement a TTL on each of these keys - providers map[u.Key][]*peer.Peer + providers map[u.Key][]*providerInfo providerLock sync.RWMutex // map of channels waiting for reply messages @@ -43,6 +43,9 @@ type IpfsDHT struct { // Signal to shutdown dht shutdown chan struct{} + + // When this peer started up + birth time.Time } // Create a new DHT object with the given peer as the 'local' host @@ -61,9 +64,10 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) { dht.datastore = ds.NewMapDatastore() dht.self = p dht.listeners = make(map[uint64]chan *swarm.Message) - dht.providers = make(map[u.Key][]*peer.Peer) + dht.providers = make(map[u.Key][]*providerInfo) dht.shutdown = make(chan struct{}) dht.routes = NewRoutingTable(20, convertPeerID(p.ID)) + dht.birth = time.Now() return dht, nil } @@ -121,6 +125,8 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { // NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { u.DOut("Begin message handling routine") + + checkTimeouts := time.NewTicker(time.Minute * 5) for { select { case mes,ok := <-dht.network.Chan.Incoming: @@ -157,7 +163,10 @@ func (dht *IpfsDHT) handleMessages() { } // - u.DOut("Got message type: '%s' [id = %x]", DHTMessage_MessageType_name[int32(pmes.GetType())], pmes.GetId()) + u.DOut("[peer: %s]", dht.self.ID.Pretty()) + u.DOut("Got message type: '%s' [id = %x, from = %s]", + DHTMessage_MessageType_name[int32(pmes.GetType())], + pmes.GetId(), mes.Peer.ID.Pretty()) switch pmes.GetType() { case DHTMessage_GET_VALUE: dht.handleGetValue(mes.Peer, pmes) @@ -171,35 +180,57 @@ func (dht *IpfsDHT) handleMessages() { dht.handleGetProviders(mes.Peer, pmes) case DHTMessage_PING: dht.handlePing(mes.Peer, pmes) + case DHTMessage_DIAGNOSTIC: + // TODO: network diagnostic messages } case err := <-dht.network.Chan.Errors: u.DErr("dht err: %s", err) case <-dht.shutdown: + checkTimeouts.Stop() return + case <-checkTimeouts.C: + dht.providerLock.Lock() + for k,parr := range dht.providers { + var cleaned []*providerInfo + for _,v := range parr { + if time.Since(v.Creation) < time.Hour { + cleaned = append(cleaned, v) + } + } + dht.providers[k] = cleaned + } + dht.providerLock.Unlock() } } } func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { dskey := ds.NewKey(pmes.GetKey()) + var resp *pDHTMessage i_val, err := dht.datastore.Get(dskey) if err == nil { - resp := &pDHTMessage{ + resp = &pDHTMessage{ Response: true, Id: *pmes.Id, Key: *pmes.Key, Value: i_val.([]byte), + Success: true, } - - mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <- mes } else if err == ds.ErrNotFound { // Find closest peer(s) to desired key and reply with that info - // TODO: this will need some other metadata in the protobuf message - // to signal to the querying peer that the data its receiving - // is actually a list of other peer + closer := dht.routes.NearestPeer(convertKey(u.Key(pmes.GetKey()))) + resp = &pDHTMessage{ + Response: true, + Id: *pmes.Id, + Key: *pmes.Key, + Value: closer.ID, + Success: false, + } } + + mes := swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Chan.Outgoing <- mes } // Store a value in this peer local storage @@ -263,14 +294,14 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { // This is just a quick hack, formalize method of sending addrs later addrs := make(map[u.Key]string) for _,prov := range providers { - ma := prov.NetAddress("tcp") + ma := prov.Value.NetAddress("tcp") str,err := ma.String() if err != nil { u.PErr("Error: %s", err) continue } - addrs[prov.Key()] = str + addrs[prov.Value.Key()] = str } data,err := json.Marshal(addrs) @@ -290,6 +321,11 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { dht.network.Chan.Outgoing <-mes } +type providerInfo struct { + Creation time.Time + Value *peer.Peer +} + func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *DHTMessage) { //TODO: need to implement TTLs on providers key := u.Key(pmes.GetKey()) @@ -324,35 +360,10 @@ func (dht *IpfsDHT) Halt() { dht.network.Close() } -// Ping a peer, log the time it took -func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { - // Thoughts: maybe this should accept an ID and do a peer lookup? - u.DOut("Enter Ping.") - - pmes := pDHTMessage{Id: GenerateMessageID(), Type: DHTMessage_PING} - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - - before := time.Now() - response_chan := dht.ListenFor(pmes.Id) - dht.network.Chan.Outgoing <- mes - - tout := time.After(timeout) - select { - case <-response_chan: - roundtrip := time.Since(before) - u.POut("Ping took %s.", roundtrip.String()) - return nil - case <-tout: - // Timed out, think about removing peer from network - u.DOut("Ping peer timed out.") - return u.ErrTimeout - } -} - func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { u.DOut("Adding %s as provider for '%s'", p.Key().Pretty(), key) dht.providerLock.Lock() provs := dht.providers[key] - dht.providers[key] = append(provs, p) + dht.providers[key] = append(provs, &providerInfo{time.Now(), p}) dht.providerLock.Unlock() } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 6217c29f24..b57ca3f7b6 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -6,13 +6,9 @@ import ( ma "github.com/jbenet/go-multiaddr" u "github.com/jbenet/go-ipfs/util" - "fmt" - "time" ) -var _ = fmt.Println - func TestPing(t *testing.T) { u.Debug = false addr_a,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index e95f487c1b..4f427efa1d 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -74,6 +74,7 @@ type DHTMessage struct { Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` + Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -116,6 +117,13 @@ func (m *DHTMessage) GetResponse() bool { return false } +func (m *DHTMessage) GetSuccess() bool { + if m != nil && m.Success != nil { + return *m.Success + } + return false +} + func init() { proto.RegisterEnum("dht.DHTMessage_MessageType", DHTMessage_MessageType_name, DHTMessage_MessageType_value) } diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index a9a7fd3c6c..278a95202b 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -22,4 +22,5 @@ message DHTMessage { // Signals whether or not this message is a response to another message optional bool response = 5; + optional bool success = 6; } diff --git a/routing/dht/pDHTMessage.go b/routing/dht/pDHTMessage.go index 65c03b1f86..bfe37d35f3 100644 --- a/routing/dht/pDHTMessage.go +++ b/routing/dht/pDHTMessage.go @@ -7,6 +7,7 @@ type pDHTMessage struct { Value []byte Response bool Id uint64 + Success bool } func (m *pDHTMessage) ToProtobuf() *DHTMessage { @@ -19,6 +20,7 @@ func (m *pDHTMessage) ToProtobuf() *DHTMessage { pmes.Key = &m.Key pmes.Response = &m.Response pmes.Id = &m.Id + pmes.Success = &m.Success return pmes } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4894983504..82c88960db 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -208,3 +208,30 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error return found_peer, nil } } + +// Ping a peer, log the time it took +func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { + // Thoughts: maybe this should accept an ID and do a peer lookup? + u.DOut("Enter Ping.") + + pmes := pDHTMessage{Id: GenerateMessageID(), Type: DHTMessage_PING} + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + + before := time.Now() + response_chan := dht.ListenFor(pmes.Id) + dht.network.Chan.Outgoing <- mes + + tout := time.After(timeout) + select { + case <-response_chan: + roundtrip := time.Since(before) + p.Distance = roundtrip //TODO: This isnt threadsafe + u.POut("Ping took %s.", roundtrip.String()) + return nil + case <-tout: + // Timed out, think about removing peer from network + u.DOut("Ping peer timed out.") + dht.Unlisten(pmes.Id) + return u.ErrTimeout + } +} diff --git a/routing/dht/table.go b/routing/dht/table.go index ce8fdbc245..07ed70cb44 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -1,12 +1,10 @@ package dht import ( - "encoding/hex" "container/list" "sort" peer "github.com/jbenet/go-ipfs/peer" - u "github.com/jbenet/go-ipfs/util" ) // RoutingTable defines the routing table. @@ -114,7 +112,6 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { // Returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { - u.POut("Searching table, size = %d", rt.Size()) cpl := xor(id, rt.local).commonPrefixLen() // Get bucket at cpl index or last bucket @@ -148,8 +145,6 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { var out []*peer.Peer for i := 0; i < count && i < peerArr.Len(); i++ { out = append(out, peerArr[i].p) - u.POut("peer out: %s - %s", peerArr[i].p.ID.Pretty(), - hex.EncodeToString(xor(id, convertPeerID(peerArr[i].p.ID)))) } return out @@ -163,3 +158,14 @@ func (rt *RoutingTable) Size() int { } return tot } + +// NOTE: This is potentially unsafe... use at your own risk +func (rt *RoutingTable) listpeers() []*peer.Peer { + var peers []*peer.Peer + for _,buck := range rt.Buckets { + for e := buck.getIter(); e != nil; e = e.Next() { + peers = append(peers, e.Value.(*peer.Peer)) + } + } + return peers +} diff --git a/routing/dht/util.go b/routing/dht/util.go index eed8d93013..2adc8b765b 100644 --- a/routing/dht/util.go +++ b/routing/dht/util.go @@ -11,8 +11,8 @@ import ( // ID for IpfsDHT should be a byte slice, to allow for simpler operations // (xor). DHT ids are based on the peer.IDs. // -// NOTE: peer.IDs are biased because they are multihashes (first bytes -// biased). Thus, may need to re-hash keys (uniform dist). TODO(jbenet) +// The type dht.ID signifies that its contents have been hashed from either a +// peer.ID or a util.Key. This unifies the keyspace type ID []byte func (id ID) Equal(other ID) bool { From 4667843ec190089fd587e971a86f3cad38fbf621 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 6 Aug 2014 21:36:56 -0700 Subject: [PATCH 0028/3147] fixing some race conditions This commit was moved from ipfs/go-ipfs-routing@55c2ff223dd325fbe64967896f63e76356bee0bd --- routing/dht/dht.go | 1 + routing/dht/routing.go | 10 ++++++++-- routing/dht/table.go | 20 +++++++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 44a56831b7..19dfac99c7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -186,6 +186,7 @@ func (dht *IpfsDHT) handleMessages() { case err := <-dht.network.Chan.Errors: u.DErr("dht err: %s", err) + panic(err) case <-dht.shutdown: checkTimeouts.Stop() return diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 82c88960db..22a7cf886e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -48,6 +48,8 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { } // GetValue searches for the value corresponding to given Key. +// If the search does not succeed, a multiaddr string of a closer peer is +// returned along with util.ErrSearchIncomplete func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { var p *peer.Peer p = s.routes.NearestPeer(convertKey(key)) @@ -77,7 +79,11 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { if err != nil { return nil,err } - return pmes_out.GetValue(), nil + if pmes_out.GetSuccess() { + return pmes_out.GetValue(), nil + } else { + return pmes_out.GetValue(), u.ErrSearchIncomplete + } } } @@ -225,7 +231,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { select { case <-response_chan: roundtrip := time.Since(before) - p.Distance = roundtrip //TODO: This isnt threadsafe + p.SetDistance(roundtrip) u.POut("Ping took %s.", roundtrip.String()) return nil case <-tout: diff --git a/routing/dht/table.go b/routing/dht/table.go index 07ed70cb44..b4be9c321e 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -3,8 +3,10 @@ package dht import ( "container/list" "sort" + "sync" peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" ) // RoutingTable defines the routing table. @@ -13,6 +15,9 @@ type RoutingTable struct { // ID of the local peer local ID + // Blanket lock, refine later for better performance + tabLock sync.RWMutex + // kBuckets define all the fingers to other nodes. Buckets []*Bucket bucketsize int @@ -29,6 +34,8 @@ func NewRoutingTable(bucketsize int, local_id ID) *RoutingTable { // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { + rt.tabLock.Lock() + defer rt.tabLock.Unlock() peer_id := convertPeerID(p.ID) cpl := xor(peer_id, rt.local).commonPrefixLen() @@ -88,7 +95,11 @@ func (p peerSorterArr) Less(a, b int) bool { // func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - for e := peerList.Front(); e != nil; e = e.Next() { + if peerList == nil { + return peerSorterArr{} + } + e := peerList.Front() + for ; e != nil; { p := e.Value.(*peer.Peer) p_id := convertPeerID(p.ID) pd := peerDistance{ @@ -96,6 +107,11 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe distance: xor(target, p_id), } peerArr = append(peerArr, &pd) + if e != nil { + u.POut("list element was nil.") + return peerArr + } + e = e.Next() } return peerArr } @@ -112,6 +128,8 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { // Returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { + rt.tabLock.RLock() + defer rt.tabLock.RUnlock() cpl := xor(id, rt.local).commonPrefixLen() // Get bucket at cpl index or last bucket From 3614ba52fa30086f544ddbc5c2da7375aab611e2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 7 Aug 2014 14:16:24 -0700 Subject: [PATCH 0029/3147] fixed small bug introduced during race condition frustration This commit was moved from ipfs/go-ipfs-routing@e5ebcf6ac89e4af177fb3aea9ecd84f3244cf2db --- routing/dht/dht.go | 100 ++++++++++++++++++++++++++++++++++------- routing/dht/routing.go | 71 ++++++++++++++++++++++++----- routing/dht/table.go | 9 +--- 3 files changed, 148 insertions(+), 32 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 19dfac99c7..5791c3fed1 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -3,6 +3,7 @@ package dht import ( "sync" "time" + "bytes" "encoding/json" peer "github.com/jbenet/go-ipfs/peer" @@ -22,7 +23,7 @@ import ( // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { - routes *RoutingTable + routes []*RoutingTable network *swarm.Swarm @@ -38,7 +39,7 @@ type IpfsDHT struct { providerLock sync.RWMutex // map of channels waiting for reply messages - listeners map[uint64]chan *swarm.Message + listeners map[uint64]*listenInfo listenLock sync.RWMutex // Signal to shutdown dht @@ -46,6 +47,14 @@ type IpfsDHT struct { // When this peer started up birth time.Time + + //lock to make diagnostics work better + diaglock sync.Mutex +} + +type listenInfo struct { + resp chan *swarm.Message + count int } // Create a new DHT object with the given peer as the 'local' host @@ -63,10 +72,11 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) { dht.network = network dht.datastore = ds.NewMapDatastore() dht.self = p - dht.listeners = make(map[uint64]chan *swarm.Message) + dht.listeners = make(map[uint64]*listenInfo) dht.providers = make(map[u.Key][]*providerInfo) dht.shutdown = make(chan struct{}) - dht.routes = NewRoutingTable(20, convertPeerID(p.ID)) + dht.routes = make([]*RoutingTable, 1) + dht.routes[0] = NewRoutingTable(20, convertPeerID(p.ID)) dht.birth = time.Now() return dht, nil } @@ -106,7 +116,7 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { dht.network.StartConn(conn) - removed := dht.routes.Update(peer) + removed := dht.routes[0].Update(peer) if removed != nil { panic("need to remove this peer.") } @@ -142,7 +152,7 @@ func (dht *IpfsDHT) handleMessages() { } // Update peers latest visit in routing table - removed := dht.routes.Update(mes.Peer) + removed := dht.routes[0].Update(mes.Peer) if removed != nil { panic("Need to handle removed peer.") } @@ -150,10 +160,15 @@ func (dht *IpfsDHT) handleMessages() { // Note: not sure if this is the correct place for this if pmes.GetResponse() { dht.listenLock.RLock() - ch, ok := dht.listeners[pmes.GetId()] + list, ok := dht.listeners[pmes.GetId()] + if list.count > 1 { + list.count-- + } else if list.count == 1 { + delete(dht.listeners, pmes.GetId()) + } dht.listenLock.RUnlock() if ok { - ch <- mes + list.resp <- mes } else { // this is expected behaviour during a timeout u.DOut("Received response with nobody listening...") @@ -181,7 +196,7 @@ func (dht *IpfsDHT) handleMessages() { case DHTMessage_PING: dht.handlePing(mes.Peer, pmes) case DHTMessage_DIAGNOSTIC: - // TODO: network diagnostic messages + dht.handleDiagnostic(mes.Peer, pmes) } case err := <-dht.network.Chan.Errors: @@ -220,7 +235,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { } } else if err == ds.ErrNotFound { // Find closest peer(s) to desired key and reply with that info - closer := dht.routes.NearestPeer(convertKey(u.Key(pmes.GetKey()))) + closer := dht.routes[0].NearestPeer(convertKey(u.Key(pmes.GetKey()))) resp = &pDHTMessage{ Response: true, Id: *pmes.Id, @@ -256,7 +271,7 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *DHTMessage) { u.POut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) - closest := dht.routes.NearestPeer(convertKey(u.Key(pmes.GetKey()))) + closest := dht.routes[0].NearestPeer(convertKey(u.Key(pmes.GetKey()))) if closest == nil { panic("could not find anything.") } @@ -336,10 +351,10 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *DHTMessage) { // Register a handler for a specific message ID, used for getting replies // to certain messages (i.e. response to a GET_VALUE message) -func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan *swarm.Message { +func (dht *IpfsDHT) ListenFor(mesid uint64, count int) <-chan *swarm.Message { lchan := make(chan *swarm.Message) dht.listenLock.Lock() - dht.listeners[mesid] = lchan + dht.listeners[mesid] = &listenInfo{lchan, count} dht.listenLock.Unlock() return lchan } @@ -347,12 +362,19 @@ func (dht *IpfsDHT) ListenFor(mesid uint64) <-chan *swarm.Message { // Unregister the given message id from the listener map func (dht *IpfsDHT) Unlisten(mesid uint64) { dht.listenLock.Lock() - ch, ok := dht.listeners[mesid] + list, ok := dht.listeners[mesid] if ok { delete(dht.listeners, mesid) } dht.listenLock.Unlock() - close(ch) + close(list.resp) +} + +func (dht *IpfsDHT) IsListening(mesid uint64) bool { + dht.listenLock.RLock() + _,ok := dht.listeners[mesid] + dht.listenLock.RUnlock() + return ok } // Stop all communications from this peer and shut down @@ -368,3 +390,51 @@ func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { dht.providers[key] = append(provs, &providerInfo{time.Now(), p}) dht.providerLock.Unlock() } + +func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { + dht.diaglock.Lock() + if dht.IsListening(pmes.GetId()) { + //TODO: ehhh.......... + dht.diaglock.Unlock() + return + } + dht.diaglock.Unlock() + + seq := dht.routes[0].NearestPeers(convertPeerID(dht.self.ID), 10) + listen_chan := dht.ListenFor(pmes.GetId(), len(seq)) + + for _,ps := range seq { + mes := swarm.NewMessage(ps, pmes) + dht.network.Chan.Outgoing <-mes + } + + + + buf := new(bytes.Buffer) + // NOTE: this shouldnt be a hardcoded value + after := time.After(time.Second * 20) + count := len(seq) + for count > 0 { + select { + case <-after: + //Timeout, return what we have + goto out + case req_resp := <-listen_chan: + buf.Write(req_resp.Data) + count-- + } + } + +out: + di := dht.getDiagInfo() + buf.Write(di.Marshal()) + resp := pDHTMessage{ + Type: DHTMessage_DIAGNOSTIC, + Id: pmes.GetId(), + Value: buf.Bytes(), + Response: true, + } + + mes := swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Chan.Outgoing <-mes +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 22a7cf886e..8d45a4a432 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,6 +3,7 @@ package dht import ( "math/rand" "time" + "bytes" "encoding/json" proto "code.google.com/p/goprotobuf/proto" @@ -30,7 +31,7 @@ func GenerateMessageID() uint64 { // PutValue adds value corresponding to given Key. func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer - p = s.routes.NearestPeer(convertKey(key)) + p = s.routes[0].NearestPeer(convertKey(key)) if p == nil { panic("Table returned nil peer!") } @@ -52,7 +53,7 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { // returned along with util.ErrSearchIncomplete func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { var p *peer.Peer - p = s.routes.NearestPeer(convertKey(key)) + p = s.routes[0].NearestPeer(convertKey(key)) if p == nil { panic("Table returned nil peer!") } @@ -62,7 +63,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { Key: string(key), Id: GenerateMessageID(), } - response_chan := s.ListenFor(pmes.Id) + response_chan := s.ListenFor(pmes.Id, 1) mes := swarm.NewMessage(p, pmes.ToProtobuf()) s.network.Chan.Outgoing <- mes @@ -92,7 +93,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // Announce that this node can provide value for given key func (s *IpfsDHT) Provide(key u.Key) error { - peers := s.routes.NearestPeers(convertKey(key), PoolSize) + peers := s.routes[0].NearestPeers(convertKey(key), PoolSize) if len(peers) == 0 { //return an error } @@ -112,7 +113,7 @@ func (s *IpfsDHT) Provide(key u.Key) error { // FindProviders searches for peers who can provide the value for given key. func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { - p := s.routes.NearestPeer(convertKey(key)) + p := s.routes[0].NearestPeer(convertKey(key)) pmes := pDHTMessage{ Type: DHTMessage_GET_PROVIDERS, @@ -122,7 +123,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listen_chan := s.ListenFor(pmes.Id) + listen_chan := s.ListenFor(pmes.Id, 1) u.DOut("Find providers for: '%s'", key) s.network.Chan.Outgoing <-mes after := time.After(timeout) @@ -163,7 +164,6 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, } return prov_arr, nil - } } @@ -171,7 +171,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, // FindPeer searches for a peer with given ID. func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { - p := s.routes.NearestPeer(convertPeerID(id)) + p := s.routes[0].NearestPeer(convertPeerID(id)) pmes := pDHTMessage{ Type: DHTMessage_FIND_NODE, @@ -181,7 +181,7 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listen_chan := s.ListenFor(pmes.Id) + listen_chan := s.ListenFor(pmes.Id, 1) s.network.Chan.Outgoing <-mes after := time.After(timeout) select { @@ -224,7 +224,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { mes := swarm.NewMessage(p, pmes.ToProtobuf()) before := time.Now() - response_chan := dht.ListenFor(pmes.Id) + response_chan := dht.ListenFor(pmes.Id, 1) dht.network.Chan.Outgoing <- mes tout := time.After(timeout) @@ -241,3 +241,54 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { return u.ErrTimeout } } + +func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { + u.DOut("Begin Diagnostic") + //Send to N closest peers + targets := dht.routes[0].NearestPeers(convertPeerID(dht.self.ID), 10) + + // TODO: Add timeout to this struct so nodes know when to return + pmes := pDHTMessage{ + Type: DHTMessage_DIAGNOSTIC, + Id: GenerateMessageID(), + } + + listen_chan := dht.ListenFor(pmes.Id, len(targets)) + + pbmes := pmes.ToProtobuf() + for _,p := range targets { + mes := swarm.NewMessage(p, pbmes) + dht.network.Chan.Outgoing <-mes + } + + var out []*diagInfo + after := time.After(timeout) + for count := len(targets); count > 0; { + select { + case <-after: + u.DOut("Diagnostic request timed out.") + return out, u.ErrTimeout + case resp := <-listen_chan: + pmes_out := new(DHTMessage) + err := proto.Unmarshal(resp.Data, pmes_out) + if err != nil { + // NOTE: here and elsewhere, need to audit error handling, + // some errors should be continued on from + return out, err + } + + dec := json.NewDecoder(bytes.NewBuffer(pmes_out.GetValue())) + for { + di := new(diagInfo) + err := dec.Decode(di) + if err != nil { + break + } + + out = append(out, di) + } + } + } + + return nil,nil +} diff --git a/routing/dht/table.go b/routing/dht/table.go index b4be9c321e..be4a4b3926 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -95,11 +95,7 @@ func (p peerSorterArr) Less(a, b int) bool { // func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - if peerList == nil { - return peerSorterArr{} - } - e := peerList.Front() - for ; e != nil; { + for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) p_id := convertPeerID(p.ID) pd := peerDistance{ @@ -107,11 +103,10 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe distance: xor(target, p_id), } peerArr = append(peerArr, &pd) - if e != nil { + if e == nil { u.POut("list element was nil.") return peerArr } - e = e.Next() } return peerArr } From 4ca6b62a3fbd2885dab98b503f79e68112794260 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 7 Aug 2014 18:06:50 -0700 Subject: [PATCH 0030/3147] implement timeouts on listeners for the dht and add diagnostic stuff This commit was moved from ipfs/go-ipfs-routing@bdafd309859b6e1b52718105c7c158a50e082f7f --- routing/dht/dht.go | 64 +++++++++++++++++++++++++++++++++------ routing/dht/diag.go | 44 +++++++++++++++++++++++++++ routing/dht/routing.go | 30 +++++++++--------- routing/dht/table_test.go | 17 +++++++++++ 4 files changed, 130 insertions(+), 25 deletions(-) create mode 100644 routing/dht/diag.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5791c3fed1..63a368b323 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -23,6 +23,8 @@ import ( // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { + // Array of routing tables for differently distanced nodes + // NOTE: (currently, only a single table is used) routes []*RoutingTable network *swarm.Swarm @@ -55,6 +57,7 @@ type IpfsDHT struct { type listenInfo struct { resp chan *swarm.Message count int + eol time.Time } // Create a new DHT object with the given peer as the 'local' host @@ -161,14 +164,19 @@ func (dht *IpfsDHT) handleMessages() { if pmes.GetResponse() { dht.listenLock.RLock() list, ok := dht.listeners[pmes.GetId()] + dht.listenLock.RUnlock() + if time.Now().After(list.eol) { + dht.Unlisten(pmes.GetId()) + ok = false + } if list.count > 1 { list.count-- - } else if list.count == 1 { - delete(dht.listeners, pmes.GetId()) } - dht.listenLock.RUnlock() if ok { list.resp <- mes + if list.count == 1 { + dht.Unlisten(pmes.GetId()) + } } else { // this is expected behaviour during a timeout u.DOut("Received response with nobody listening...") @@ -217,10 +225,35 @@ func (dht *IpfsDHT) handleMessages() { dht.providers[k] = cleaned } dht.providerLock.Unlock() + dht.listenLock.Lock() + var remove []uint64 + now := time.Now() + for k,v := range dht.listeners { + if now.After(v.eol) { + remove = append(remove, k) + } + } + for _,k := range remove { + delete(dht.listeners, k) + } + dht.listenLock.Unlock() } } } +func (dht *IpfsDHT) putValueToPeer(p *peer.Peer, key string, value []byte) error { + pmes := pDHTMessage{ + Type: DHTMessage_PUT_VALUE, + Key: key, + Value: value, + Id: GenerateMessageID(), + } + + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + dht.network.Chan.Outgoing <- mes + return nil +} + func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { dskey := ds.NewKey(pmes.GetKey()) var resp *pDHTMessage @@ -351,10 +384,10 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *DHTMessage) { // Register a handler for a specific message ID, used for getting replies // to certain messages (i.e. response to a GET_VALUE message) -func (dht *IpfsDHT) ListenFor(mesid uint64, count int) <-chan *swarm.Message { +func (dht *IpfsDHT) ListenFor(mesid uint64, count int, timeout time.Duration) <-chan *swarm.Message { lchan := make(chan *swarm.Message) dht.listenLock.Lock() - dht.listeners[mesid] = &listenInfo{lchan, count} + dht.listeners[mesid] = &listenInfo{lchan, count, time.Now().Add(timeout)} dht.listenLock.Unlock() return lchan } @@ -372,8 +405,14 @@ func (dht *IpfsDHT) Unlisten(mesid uint64) { func (dht *IpfsDHT) IsListening(mesid uint64) bool { dht.listenLock.RLock() - _,ok := dht.listeners[mesid] + li,ok := dht.listeners[mesid] dht.listenLock.RUnlock() + if time.Now().After(li.eol) { + dht.listenLock.Lock() + delete(dht.listeners, mesid) + dht.listenLock.Unlock() + return false + } return ok } @@ -401,7 +440,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { dht.diaglock.Unlock() seq := dht.routes[0].NearestPeers(convertPeerID(dht.self.ID), 10) - listen_chan := dht.ListenFor(pmes.GetId(), len(seq)) + listen_chan := dht.ListenFor(pmes.GetId(), len(seq), time.Second * 30) for _,ps := range seq { mes := swarm.NewMessage(ps, pmes) @@ -411,6 +450,9 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { buf := new(bytes.Buffer) + di := dht.getDiagInfo() + buf.Write(di.Marshal()) + // NOTE: this shouldnt be a hardcoded value after := time.After(time.Second * 20) count := len(seq) @@ -420,14 +462,18 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { //Timeout, return what we have goto out case req_resp := <-listen_chan: + pmes_out := new(DHTMessage) + err := proto.Unmarshal(req_resp.Data, pmes_out) + if err != nil { + // It broke? eh, whatever, keep going + continue + } buf.Write(req_resp.Data) count-- } } out: - di := dht.getDiagInfo() - buf.Write(di.Marshal()) resp := pDHTMessage{ Type: DHTMessage_DIAGNOSTIC, Id: pmes.GetId(), diff --git a/routing/dht/diag.go b/routing/dht/diag.go new file mode 100644 index 0000000000..b8f211e402 --- /dev/null +++ b/routing/dht/diag.go @@ -0,0 +1,44 @@ +package dht + +import ( + "encoding/json" + "time" + + peer "github.com/jbenet/go-ipfs/peer" +) + +type connDiagInfo struct { + Latency time.Duration + Id peer.ID +} + +type diagInfo struct { + Id peer.ID + Connections []connDiagInfo + Keys []string + LifeSpan time.Duration + CodeVersion string +} + +func (di *diagInfo) Marshal() []byte { + b, err := json.Marshal(di) + if err != nil { + panic(err) + } + //TODO: also consider compressing this. There will be a lot of these + return b +} + + +func (dht *IpfsDHT) getDiagInfo() *diagInfo { + di := new(diagInfo) + di.CodeVersion = "github.com/jbenet/go-ipfs" + di.Id = dht.self.ID + di.LifeSpan = time.Since(dht.birth) + di.Keys = nil // Currently no way to query datastore + + for _,p := range dht.routes[0].listpeers() { + di.Connections = append(di.Connections, connDiagInfo{p.GetDistance(), p.ID}) + } + return di +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 8d45a4a432..1a90ce76b6 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -29,6 +29,7 @@ func GenerateMessageID() uint64 { // Basic Put/Get // PutValue adds value corresponding to given Key. +// This is the top level "Store" operation of the DHT func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer p = s.routes[0].NearestPeer(convertKey(key)) @@ -36,16 +37,7 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { panic("Table returned nil peer!") } - pmes := pDHTMessage{ - Type: DHTMessage_PUT_VALUE, - Key: string(key), - Value: value, - Id: GenerateMessageID(), - } - - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - s.network.Chan.Outgoing <- mes - return nil + return s.putValueToPeer(p, string(key), value) } // GetValue searches for the value corresponding to given Key. @@ -63,7 +55,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { Key: string(key), Id: GenerateMessageID(), } - response_chan := s.ListenFor(pmes.Id, 1) + response_chan := s.ListenFor(pmes.Id, 1, time.Minute) mes := swarm.NewMessage(p, pmes.ToProtobuf()) s.network.Chan.Outgoing <- mes @@ -74,7 +66,13 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { case <-timeup: s.Unlisten(pmes.Id) return nil, u.ErrTimeout - case resp := <-response_chan: + case resp, ok := <-response_chan: + if !ok { + panic("Channel was closed...") + } + if resp == nil { + panic("Why the hell is this response nil?") + } pmes_out := new(DHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { @@ -123,7 +121,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listen_chan := s.ListenFor(pmes.Id, 1) + listen_chan := s.ListenFor(pmes.Id, 1, time.Minute) u.DOut("Find providers for: '%s'", key) s.network.Chan.Outgoing <-mes after := time.After(timeout) @@ -181,7 +179,7 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listen_chan := s.ListenFor(pmes.Id, 1) + listen_chan := s.ListenFor(pmes.Id, 1, time.Minute) s.network.Chan.Outgoing <-mes after := time.After(timeout) select { @@ -224,7 +222,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { mes := swarm.NewMessage(p, pmes.ToProtobuf()) before := time.Now() - response_chan := dht.ListenFor(pmes.Id, 1) + response_chan := dht.ListenFor(pmes.Id, 1, time.Minute) dht.network.Chan.Outgoing <- mes tout := time.After(timeout) @@ -253,7 +251,7 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { Id: GenerateMessageID(), } - listen_chan := dht.ListenFor(pmes.Id, len(targets)) + listen_chan := dht.ListenFor(pmes.Id, len(targets), time.Minute * 2) pbmes := pmes.ToProtobuf() for _,p := range targets { diff --git a/routing/dht/table_test.go b/routing/dht/table_test.go index debec5e164..393a1c5851 100644 --- a/routing/dht/table_test.go +++ b/routing/dht/table_test.go @@ -107,3 +107,20 @@ func TestTableFind(t *testing.T) { t.Fatalf("Failed to lookup known node...") } } + +func TestTableFindMultiple(t *testing.T) { + local := _randPeer() + rt := NewRoutingTable(20, convertPeerID(local.ID)) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 18; i++ { + peers[i] = _randPeer() + rt.Update(peers[i]) + } + + t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + found := rt.NearestPeers(convertPeerID(peers[2].ID), 15) + if len(found) != 15 { + t.Fatalf("Got back different number of peers than we expected.") + } +} From b36b9ccd3559c27076261c931359c7f33185e098 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 7 Aug 2014 21:52:11 -0700 Subject: [PATCH 0031/3147] add a unit test for provides functionality This commit was moved from ipfs/go-ipfs-routing@b4e278a5a6672cbe28faeaee5ba08e54f0be84da --- routing/dht/dht.go | 14 +++++++++ routing/dht/dht_test.go | 70 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 63a368b323..47f93e65f8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -92,6 +92,8 @@ func (dht *IpfsDHT) Start() { // Connect to a new peer at the given address // TODO: move this into swarm func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { + maddrstr,_ := addr.String() + u.DOut("Connect to new peer: %s", maddrstr) if addr == nil { panic("addr was nil!") } @@ -484,3 +486,15 @@ out: mes := swarm.NewMessage(p, resp.ToProtobuf()) dht.network.Chan.Outgoing <-mes } + +func (dht *IpfsDHT) GetLocal(key u.Key) ([]byte, error) { + v,err := dht.datastore.Get(ds.NewKey(string(key))) + if err != nil { + return nil, err + } + return v.([]byte), nil +} + +func (dht *IpfsDHT) PutLocal(key u.Key, value []byte) error { + return dht.datastore.Put(ds.NewKey(string(key)), value) +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b57ca3f7b6..2de027a3d1 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -7,6 +7,7 @@ import ( u "github.com/jbenet/go-ipfs/util" "time" + "fmt" ) func TestPing(t *testing.T) { @@ -107,3 +108,72 @@ func TestValueGetSet(t *testing.T) { t.Fatalf("Expected 'world' got %s", string(val)) } } + +func TestProvides(t *testing.T) { + u.Debug = false + var addrs []*ma.Multiaddr + for i := 0; i < 4; i++ { + a,err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000 + i)) + if err != nil { + t.Fatal(err) + } + addrs = append(addrs, a) + } + + + var peers []*peer.Peer + for i := 0; i < 4; i++ { + p := new(peer.Peer) + p.AddAddress(addrs[i]) + p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i))) + peers = append(peers, p) + } + + var dhts []*IpfsDHT + for i := 0; i < 4; i++ { + d,err := NewDHT(peers[i]) + if err != nil { + t.Fatal(err) + } + dhts = append(dhts, d) + d.Start() + } + + _, err := dhts[0].Connect(addrs[1]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(addrs[2]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(addrs[3]) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].PutLocal(u.Key("hello"), []byte("world")) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].Provide(u.Key("hello")) + if err != nil { + t.Fatal(err) + } + + time.Sleep(time.Millisecond * 60) + + provs,err := dhts[0].FindProviders(u.Key("hello"), time.Second) + if err != nil { + t.Fatal(err) + } + + if len(provs) != 1 { + t.Fatal("Didnt get back providers") + } +} + + From ab409cf7dd48f048e0a8d1e6f69a2c74f8d30068 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 8 Aug 2014 18:09:21 -0700 Subject: [PATCH 0032/3147] address issues from code review (issue #25) This commit was moved from ipfs/go-ipfs-routing@c3810e2a697eac377c587f43273caaa57ec1bc02 --- routing/dht/{pDHTMessage.go => DHTMessage.go} | 16 +- routing/dht/bucket.go | 2 +- routing/dht/dht.go | 276 +++++++++--------- routing/dht/dht_test.go | 42 +-- routing/dht/diag.go | 2 +- routing/dht/messages.pb.go | 106 ++++--- routing/dht/messages.proto | 10 +- routing/dht/routing.go | 85 +++--- routing/dht/table.go | 2 +- routing/dht/util.go | 4 + 10 files changed, 293 insertions(+), 252 deletions(-) rename routing/dht/{pDHTMessage.go => DHTMessage.go} (56%) diff --git a/routing/dht/pDHTMessage.go b/routing/dht/DHTMessage.go similarity index 56% rename from routing/dht/pDHTMessage.go rename to routing/dht/DHTMessage.go index bfe37d35f3..64ca5bcab9 100644 --- a/routing/dht/pDHTMessage.go +++ b/routing/dht/DHTMessage.go @@ -1,17 +1,17 @@ package dht // A helper struct to make working with protbuf types easier -type pDHTMessage struct { - Type DHTMessage_MessageType - Key string - Value []byte +type DHTMessage struct { + Type PBDHTMessage_MessageType + Key string + Value []byte Response bool - Id uint64 - Success bool + Id uint64 + Success bool } -func (m *pDHTMessage) ToProtobuf() *DHTMessage { - pmes := new(DHTMessage) +func (m *DHTMessage) ToProtobuf() *PBDHTMessage { + pmes := new(PBDHTMessage) if m.Value != nil { pmes.Value = m.Value } diff --git a/routing/dht/bucket.go b/routing/dht/bucket.go index 996d299d9b..7aa8d0a940 100644 --- a/routing/dht/bucket.go +++ b/routing/dht/bucket.go @@ -49,7 +49,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { e := bucket_list.Front() for e != nil { peer_id := convertPeerID(e.Value.(*peer.Peer).ID) - peer_cpl := xor(peer_id, target).commonPrefixLen() + peer_cpl := prefLen(peer_id, target) if peer_cpl > cpl { cur := e out.PushBack(e.Value) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 47f93e65f8..8fbd5c092c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -1,15 +1,15 @@ package dht import ( - "sync" - "time" "bytes" "encoding/json" + "errors" + "sync" + "time" - peer "github.com/jbenet/go-ipfs/peer" - swarm "github.com/jbenet/go-ipfs/swarm" - u "github.com/jbenet/go-ipfs/util" - identify "github.com/jbenet/go-ipfs/identify" + peer "github.com/jbenet/go-ipfs/peer" + swarm "github.com/jbenet/go-ipfs/swarm" + u "github.com/jbenet/go-ipfs/util" ma "github.com/jbenet/go-multiaddr" @@ -37,7 +37,7 @@ type IpfsDHT struct { // Map keys to peers that can provide their value // TODO: implement a TTL on each of these keys - providers map[u.Key][]*providerInfo + providers map[u.Key][]*providerInfo providerLock sync.RWMutex // map of channels waiting for reply messages @@ -54,21 +54,27 @@ type IpfsDHT struct { diaglock sync.Mutex } +// The listen info struct holds information about a message that is being waited for type listenInfo struct { + // Responses matching the listen ID will be sent through resp resp chan *swarm.Message + + // count is the number of responses to listen for count int + + // eol is the time at which this listener will expire eol time.Time } // Create a new DHT object with the given peer as the 'local' host func NewDHT(p *peer.Peer) (*IpfsDHT, error) { if p == nil { - panic("Tried to create new dht with nil peer") + return nil, errors.New("nil peer passed to NewDHT()") } network := swarm.NewSwarm(p) err := network.Listen() if err != nil { - return nil,err + return nil, err } dht := new(IpfsDHT) @@ -90,50 +96,24 @@ func (dht *IpfsDHT) Start() { } // Connect to a new peer at the given address -// TODO: move this into swarm func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { - maddrstr,_ := addr.String() + maddrstr, _ := addr.String() u.DOut("Connect to new peer: %s", maddrstr) - if addr == nil { - panic("addr was nil!") - } - peer := new(peer.Peer) - peer.AddAddress(addr) - - conn,err := swarm.Dial("tcp", peer) - if err != nil { - return nil, err - } - - err = identify.Handshake(dht.self, peer, conn.Incoming.MsgChan, conn.Outgoing.MsgChan) + npeer, err := dht.network.Connect(addr) if err != nil { return nil, err } - // Send node an address that you can be reached on - myaddr := dht.self.NetAddress("tcp") - mastr,err := myaddr.String() - if err != nil { - panic("No local address to send") - } - - conn.Outgoing.MsgChan <- []byte(mastr) - - dht.network.StartConn(conn) - - removed := dht.routes[0].Update(peer) - if removed != nil { - panic("need to remove this peer.") - } + dht.Update(npeer) // Ping new peer to register in their routing table // NOTE: this should be done better... - err = dht.Ping(peer, time.Second * 2) + err = dht.Ping(npeer, time.Second*2) if err != nil { - panic("Failed to ping new peer.") + return nil, errors.New("Failed to ping newly connected peer.") } - return peer, nil + return npeer, nil } // Read in all messages from swarm and handle them appropriately @@ -144,23 +124,19 @@ func (dht *IpfsDHT) handleMessages() { checkTimeouts := time.NewTicker(time.Minute * 5) for { select { - case mes,ok := <-dht.network.Chan.Incoming: + case mes, ok := <-dht.network.Chan.Incoming: if !ok { u.DOut("handleMessages closing, bad recv on incoming") return } - pmes := new(DHTMessage) + pmes := new(PBDHTMessage) err := proto.Unmarshal(mes.Data, pmes) if err != nil { u.PErr("Failed to decode protobuf message: %s", err) continue } - // Update peers latest visit in routing table - removed := dht.routes[0].Update(mes.Peer) - if removed != nil { - panic("Need to handle removed peer.") - } + dht.Update(mes.Peer) // Note: not sure if this is the correct place for this if pmes.GetResponse() { @@ -180,7 +156,6 @@ func (dht *IpfsDHT) handleMessages() { dht.Unlisten(pmes.GetId()) } } else { - // this is expected behaviour during a timeout u.DOut("Received response with nobody listening...") } @@ -190,65 +165,73 @@ func (dht *IpfsDHT) handleMessages() { u.DOut("[peer: %s]", dht.self.ID.Pretty()) u.DOut("Got message type: '%s' [id = %x, from = %s]", - DHTMessage_MessageType_name[int32(pmes.GetType())], + PBDHTMessage_MessageType_name[int32(pmes.GetType())], pmes.GetId(), mes.Peer.ID.Pretty()) switch pmes.GetType() { - case DHTMessage_GET_VALUE: + case PBDHTMessage_GET_VALUE: dht.handleGetValue(mes.Peer, pmes) - case DHTMessage_PUT_VALUE: + case PBDHTMessage_PUT_VALUE: dht.handlePutValue(mes.Peer, pmes) - case DHTMessage_FIND_NODE: + case PBDHTMessage_FIND_NODE: dht.handleFindPeer(mes.Peer, pmes) - case DHTMessage_ADD_PROVIDER: + case PBDHTMessage_ADD_PROVIDER: dht.handleAddProvider(mes.Peer, pmes) - case DHTMessage_GET_PROVIDERS: + case PBDHTMessage_GET_PROVIDERS: dht.handleGetProviders(mes.Peer, pmes) - case DHTMessage_PING: + case PBDHTMessage_PING: dht.handlePing(mes.Peer, pmes) - case DHTMessage_DIAGNOSTIC: + case PBDHTMessage_DIAGNOSTIC: dht.handleDiagnostic(mes.Peer, pmes) } case err := <-dht.network.Chan.Errors: u.DErr("dht err: %s", err) - panic(err) case <-dht.shutdown: checkTimeouts.Stop() return case <-checkTimeouts.C: - dht.providerLock.Lock() - for k,parr := range dht.providers { - var cleaned []*providerInfo - for _,v := range parr { - if time.Since(v.Creation) < time.Hour { - cleaned = append(cleaned, v) - } - } - dht.providers[k] = cleaned - } - dht.providerLock.Unlock() - dht.listenLock.Lock() - var remove []uint64 - now := time.Now() - for k,v := range dht.listeners { - if now.After(v.eol) { - remove = append(remove, k) - } - } - for _,k := range remove { - delete(dht.listeners, k) + // Time to collect some garbage! + dht.cleanExpiredProviders() + dht.cleanExpiredListeners() + } + } +} + +func (dht *IpfsDHT) cleanExpiredProviders() { + dht.providerLock.Lock() + for k, parr := range dht.providers { + var cleaned []*providerInfo + for _, v := range parr { + if time.Since(v.Creation) < time.Hour { + cleaned = append(cleaned, v) } - dht.listenLock.Unlock() } + dht.providers[k] = cleaned } + dht.providerLock.Unlock() +} + +func (dht *IpfsDHT) cleanExpiredListeners() { + dht.listenLock.Lock() + var remove []uint64 + now := time.Now() + for k, v := range dht.listeners { + if now.After(v.eol) { + remove = append(remove, k) + } + } + for _, k := range remove { + delete(dht.listeners, k) + } + dht.listenLock.Unlock() } func (dht *IpfsDHT) putValueToPeer(p *peer.Peer, key string, value []byte) error { - pmes := pDHTMessage{ - Type: DHTMessage_PUT_VALUE, - Key: key, + pmes := DHTMessage{ + Type: PBDHTMessage_PUT_VALUE, + Key: key, Value: value, - Id: GenerateMessageID(), + Id: GenerateMessageID(), } mes := swarm.NewMessage(p, pmes.ToProtobuf()) @@ -256,27 +239,27 @@ func (dht *IpfsDHT) putValueToPeer(p *peer.Peer, key string, value []byte) error return nil } -func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { +func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { dskey := ds.NewKey(pmes.GetKey()) - var resp *pDHTMessage + var resp *DHTMessage i_val, err := dht.datastore.Get(dskey) if err == nil { - resp = &pDHTMessage{ + resp = &DHTMessage{ Response: true, - Id: *pmes.Id, - Key: *pmes.Key, - Value: i_val.([]byte), - Success: true, + Id: *pmes.Id, + Key: *pmes.Key, + Value: i_val.([]byte), + Success: true, } } else if err == ds.ErrNotFound { // Find closest peer(s) to desired key and reply with that info closer := dht.routes[0].NearestPeer(convertKey(u.Key(pmes.GetKey()))) - resp = &pDHTMessage{ + resp = &DHTMessage{ Response: true, - Id: *pmes.Id, - Key: *pmes.Key, - Value: closer.ID, - Success: false, + Id: *pmes.Id, + Key: *pmes.Key, + Value: closer.ID, + Success: false, } } @@ -285,7 +268,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *DHTMessage) { } // Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { +func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *PBDHTMessage) { dskey := ds.NewKey(pmes.GetKey()) err := dht.datastore.Put(dskey, pmes.GetValue()) if err != nil { @@ -294,46 +277,51 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *DHTMessage) { } } -func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *DHTMessage) { - resp := pDHTMessage{ - Type: pmes.GetType(), +func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { + resp := DHTMessage{ + Type: pmes.GetType(), Response: true, - Id: pmes.GetId(), + Id: pmes.GetId(), } - dht.network.Chan.Outgoing <-swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Chan.Outgoing <- swarm.NewMessage(p, resp.ToProtobuf()) } -func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *DHTMessage) { +func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { + success := true u.POut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) closest := dht.routes[0].NearestPeer(convertKey(u.Key(pmes.GetKey()))) if closest == nil { - panic("could not find anything.") + u.PErr("handleFindPeer: could not find anything.") + success = false } if len(closest.Addresses) == 0 { - panic("no addresses for connected peer...") + u.PErr("handleFindPeer: no addresses for connected peer...") + success = false } u.POut("handleFindPeer: sending back '%s'", closest.ID.Pretty()) - addr,err := closest.Addresses[0].String() + addr, err := closest.Addresses[0].String() if err != nil { - panic(err) + u.PErr(err.Error()) + success = false } - resp := pDHTMessage{ - Type: pmes.GetType(), + resp := DHTMessage{ + Type: pmes.GetType(), Response: true, - Id: pmes.GetId(), - Value: []byte(addr), + Id: pmes.GetId(), + Value: []byte(addr), + Success: success, } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <-mes + dht.network.Chan.Outgoing <- mes } -func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { +func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { dht.providerLock.RLock() providers := dht.providers[u.Key(pmes.GetKey())] dht.providerLock.RUnlock() @@ -344,9 +332,9 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { // This is just a quick hack, formalize method of sending addrs later addrs := make(map[u.Key]string) - for _,prov := range providers { + for _, prov := range providers { ma := prov.Value.NetAddress("tcp") - str,err := ma.String() + str, err := ma.String() if err != nil { u.PErr("Error: %s", err) continue @@ -355,35 +343,38 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *DHTMessage) { addrs[prov.Value.Key()] = str } - data,err := json.Marshal(addrs) + success := true + data, err := json.Marshal(addrs) if err != nil { - panic(err) + u.POut("handleGetProviders: error marshalling struct to JSON: %s", err) + data = nil + success = false } - resp := pDHTMessage{ - Type: DHTMessage_GET_PROVIDERS, - Key: pmes.GetKey(), - Value: data, - Id: pmes.GetId(), + resp := DHTMessage{ + Type: PBDHTMessage_GET_PROVIDERS, + Key: pmes.GetKey(), + Value: data, + Id: pmes.GetId(), Response: true, + Success: success, } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <-mes + dht.network.Chan.Outgoing <- mes } type providerInfo struct { Creation time.Time - Value *peer.Peer + Value *peer.Peer } -func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *DHTMessage) { +func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *PBDHTMessage) { //TODO: need to implement TTLs on providers key := u.Key(pmes.GetKey()) dht.addProviderEntry(key, p) } - // Register a handler for a specific message ID, used for getting replies // to certain messages (i.e. response to a GET_VALUE message) func (dht *IpfsDHT) ListenFor(mesid uint64, count int, timeout time.Duration) <-chan *swarm.Message { @@ -407,7 +398,7 @@ func (dht *IpfsDHT) Unlisten(mesid uint64) { func (dht *IpfsDHT) IsListening(mesid uint64) bool { dht.listenLock.RLock() - li,ok := dht.listeners[mesid] + li, ok := dht.listeners[mesid] dht.listenLock.RUnlock() if time.Now().After(li.eol) { dht.listenLock.Lock() @@ -432,7 +423,7 @@ func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { dht.providerLock.Unlock() } -func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { +func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { dht.diaglock.Lock() if dht.IsListening(pmes.GetId()) { //TODO: ehhh.......... @@ -442,15 +433,13 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { dht.diaglock.Unlock() seq := dht.routes[0].NearestPeers(convertPeerID(dht.self.ID), 10) - listen_chan := dht.ListenFor(pmes.GetId(), len(seq), time.Second * 30) + listen_chan := dht.ListenFor(pmes.GetId(), len(seq), time.Second*30) - for _,ps := range seq { + for _, ps := range seq { mes := swarm.NewMessage(ps, pmes) - dht.network.Chan.Outgoing <-mes + dht.network.Chan.Outgoing <- mes } - - buf := new(bytes.Buffer) di := dht.getDiagInfo() buf.Write(di.Marshal()) @@ -464,7 +453,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { //Timeout, return what we have goto out case req_resp := <-listen_chan: - pmes_out := new(DHTMessage) + pmes_out := new(PBDHTMessage) err := proto.Unmarshal(req_resp.Data, pmes_out) if err != nil { // It broke? eh, whatever, keep going @@ -476,19 +465,19 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *DHTMessage) { } out: - resp := pDHTMessage{ - Type: DHTMessage_DIAGNOSTIC, - Id: pmes.GetId(), - Value: buf.Bytes(), + resp := DHTMessage{ + Type: PBDHTMessage_DIAGNOSTIC, + Id: pmes.GetId(), + Value: buf.Bytes(), Response: true, } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <-mes + dht.network.Chan.Outgoing <- mes } func (dht *IpfsDHT) GetLocal(key u.Key) ([]byte, error) { - v,err := dht.datastore.Get(ds.NewKey(string(key))) + v, err := dht.datastore.Get(ds.NewKey(string(key))) if err != nil { return nil, err } @@ -498,3 +487,10 @@ func (dht *IpfsDHT) GetLocal(key u.Key) ([]byte, error) { func (dht *IpfsDHT) PutLocal(key u.Key, value []byte) error { return dht.datastore.Put(ds.NewKey(string(key)), value) } + +func (dht *IpfsDHT) Update(p *peer.Peer) { + removed := dht.routes[0].Update(p) + if removed != nil { + dht.network.Drop(removed) + } +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2de027a3d1..e24ada020b 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -2,21 +2,22 @@ package dht import ( "testing" + peer "github.com/jbenet/go-ipfs/peer" - ma "github.com/jbenet/go-multiaddr" u "github.com/jbenet/go-ipfs/util" + ma "github.com/jbenet/go-multiaddr" - "time" "fmt" + "time" ) func TestPing(t *testing.T) { u.Debug = false - addr_a,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") if err != nil { t.Fatal(err) } - addr_b,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") + addr_b, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") if err != nil { t.Fatal(err) } @@ -29,12 +30,12 @@ func TestPing(t *testing.T) { peer_b.AddAddress(addr_b) peer_b.ID = peer.ID([]byte("peer_b")) - dht_a,err := NewDHT(peer_a) + dht_a, err := NewDHT(peer_a) if err != nil { t.Fatal(err) } - dht_b,err := NewDHT(peer_b) + dht_b, err := NewDHT(peer_b) if err != nil { t.Fatal(err) } @@ -42,13 +43,13 @@ func TestPing(t *testing.T) { dht_a.Start() dht_b.Start() - _,err = dht_a.Connect(addr_b) + _, err = dht_a.Connect(addr_b) if err != nil { t.Fatal(err) } //Test that we can ping the node - err = dht_a.Ping(peer_b, time.Second * 2) + err = dht_a.Ping(peer_b, time.Second*2) if err != nil { t.Fatal(err) } @@ -59,11 +60,11 @@ func TestPing(t *testing.T) { func TestValueGetSet(t *testing.T) { u.Debug = false - addr_a,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") if err != nil { t.Fatal(err) } - addr_b,err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") + addr_b, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") if err != nil { t.Fatal(err) } @@ -76,12 +77,12 @@ func TestValueGetSet(t *testing.T) { peer_b.AddAddress(addr_b) peer_b.ID = peer.ID([]byte("peer_b")) - dht_a,err := NewDHT(peer_a) + dht_a, err := NewDHT(peer_a) if err != nil { t.Fatal(err) } - dht_b,err := NewDHT(peer_b) + dht_b, err := NewDHT(peer_b) if err != nil { t.Fatal(err) } @@ -89,7 +90,7 @@ func TestValueGetSet(t *testing.T) { dht_a.Start() dht_b.Start() - _,err = dht_a.Connect(addr_b) + _, err = dht_a.Connect(addr_b) if err != nil { t.Fatal(err) } @@ -99,7 +100,7 @@ func TestValueGetSet(t *testing.T) { t.Fatal(err) } - val, err := dht_a.GetValue("hello", time.Second * 2) + val, err := dht_a.GetValue("hello", time.Second*2) if err != nil { t.Fatal(err) } @@ -113,14 +114,13 @@ func TestProvides(t *testing.T) { u.Debug = false var addrs []*ma.Multiaddr for i := 0; i < 4; i++ { - a,err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000 + i)) + a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) if err != nil { t.Fatal(err) } addrs = append(addrs, a) } - var peers []*peer.Peer for i := 0; i < 4; i++ { p := new(peer.Peer) @@ -131,7 +131,7 @@ func TestProvides(t *testing.T) { var dhts []*IpfsDHT for i := 0; i < 4; i++ { - d,err := NewDHT(peers[i]) + d, err := NewDHT(peers[i]) if err != nil { t.Fatal(err) } @@ -166,7 +166,7 @@ func TestProvides(t *testing.T) { time.Sleep(time.Millisecond * 60) - provs,err := dhts[0].FindProviders(u.Key("hello"), time.Second) + provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) if err != nil { t.Fatal(err) } @@ -174,6 +174,8 @@ func TestProvides(t *testing.T) { if len(provs) != 1 { t.Fatal("Didnt get back providers") } -} - + for i := 0; i < 4; i++ { + dhts[i].Halt() + } +} diff --git a/routing/dht/diag.go b/routing/dht/diag.go index b8f211e402..4bc752f924 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -38,7 +38,7 @@ func (dht *IpfsDHT) getDiagInfo() *diagInfo { di.Keys = nil // Currently no way to query datastore for _,p := range dht.routes[0].listpeers() { - di.Connections = append(di.Connections, connDiagInfo{p.GetDistance(), p.ID}) + di.Connections = append(di.Connections, connDiagInfo{p.GetLatency(), p.ID}) } return di } diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index 4f427efa1d..a852c5e1f1 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -9,7 +9,7 @@ It is generated from these files: messages.proto It has these top-level messages: - DHTMessage + PBDHTMessage */ package dht @@ -20,19 +20,19 @@ import math "math" var _ = proto.Marshal var _ = math.Inf -type DHTMessage_MessageType int32 +type PBDHTMessage_MessageType int32 const ( - DHTMessage_PUT_VALUE DHTMessage_MessageType = 0 - DHTMessage_GET_VALUE DHTMessage_MessageType = 1 - DHTMessage_ADD_PROVIDER DHTMessage_MessageType = 2 - DHTMessage_GET_PROVIDERS DHTMessage_MessageType = 3 - DHTMessage_FIND_NODE DHTMessage_MessageType = 4 - DHTMessage_PING DHTMessage_MessageType = 5 - DHTMessage_DIAGNOSTIC DHTMessage_MessageType = 6 + PBDHTMessage_PUT_VALUE PBDHTMessage_MessageType = 0 + PBDHTMessage_GET_VALUE PBDHTMessage_MessageType = 1 + PBDHTMessage_ADD_PROVIDER PBDHTMessage_MessageType = 2 + PBDHTMessage_GET_PROVIDERS PBDHTMessage_MessageType = 3 + PBDHTMessage_FIND_NODE PBDHTMessage_MessageType = 4 + PBDHTMessage_PING PBDHTMessage_MessageType = 5 + PBDHTMessage_DIAGNOSTIC PBDHTMessage_MessageType = 6 ) -var DHTMessage_MessageType_name = map[int32]string{ +var PBDHTMessage_MessageType_name = map[int32]string{ 0: "PUT_VALUE", 1: "GET_VALUE", 2: "ADD_PROVIDER", @@ -41,7 +41,7 @@ var DHTMessage_MessageType_name = map[int32]string{ 5: "PING", 6: "DIAGNOSTIC", } -var DHTMessage_MessageType_value = map[string]int32{ +var PBDHTMessage_MessageType_value = map[string]int32{ "PUT_VALUE": 0, "GET_VALUE": 1, "ADD_PROVIDER": 2, @@ -51,79 +51,111 @@ var DHTMessage_MessageType_value = map[string]int32{ "DIAGNOSTIC": 6, } -func (x DHTMessage_MessageType) Enum() *DHTMessage_MessageType { - p := new(DHTMessage_MessageType) +func (x PBDHTMessage_MessageType) Enum() *PBDHTMessage_MessageType { + p := new(PBDHTMessage_MessageType) *p = x return p } -func (x DHTMessage_MessageType) String() string { - return proto.EnumName(DHTMessage_MessageType_name, int32(x)) +func (x PBDHTMessage_MessageType) String() string { + return proto.EnumName(PBDHTMessage_MessageType_name, int32(x)) } -func (x *DHTMessage_MessageType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(DHTMessage_MessageType_value, data, "DHTMessage_MessageType") +func (x *PBDHTMessage_MessageType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PBDHTMessage_MessageType_value, data, "PBDHTMessage_MessageType") if err != nil { return err } - *x = DHTMessage_MessageType(value) + *x = PBDHTMessage_MessageType(value) return nil } -type DHTMessage struct { - Type *DHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.DHTMessage_MessageType" json:"type,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` - Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` - Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` - Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` - XXX_unrecognized []byte `json:"-"` +type PBDHTMessage struct { + Type *PBDHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.PBDHTMessage_MessageType" json:"type,omitempty"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` + Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` + Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` + Peers []*PBDHTMessage_PBPeer `protobuf:"bytes,7,rep,name=peers" json:"peers,omitempty"` + XXX_unrecognized []byte `json:"-"` } -func (m *DHTMessage) Reset() { *m = DHTMessage{} } -func (m *DHTMessage) String() string { return proto.CompactTextString(m) } -func (*DHTMessage) ProtoMessage() {} +func (m *PBDHTMessage) Reset() { *m = PBDHTMessage{} } +func (m *PBDHTMessage) String() string { return proto.CompactTextString(m) } +func (*PBDHTMessage) ProtoMessage() {} -func (m *DHTMessage) GetType() DHTMessage_MessageType { +func (m *PBDHTMessage) GetType() PBDHTMessage_MessageType { if m != nil && m.Type != nil { return *m.Type } - return DHTMessage_PUT_VALUE + return PBDHTMessage_PUT_VALUE } -func (m *DHTMessage) GetKey() string { +func (m *PBDHTMessage) GetKey() string { if m != nil && m.Key != nil { return *m.Key } return "" } -func (m *DHTMessage) GetValue() []byte { +func (m *PBDHTMessage) GetValue() []byte { if m != nil { return m.Value } return nil } -func (m *DHTMessage) GetId() uint64 { +func (m *PBDHTMessage) GetId() uint64 { if m != nil && m.Id != nil { return *m.Id } return 0 } -func (m *DHTMessage) GetResponse() bool { +func (m *PBDHTMessage) GetResponse() bool { if m != nil && m.Response != nil { return *m.Response } return false } -func (m *DHTMessage) GetSuccess() bool { +func (m *PBDHTMessage) GetSuccess() bool { if m != nil && m.Success != nil { return *m.Success } return false } +func (m *PBDHTMessage) GetPeers() []*PBDHTMessage_PBPeer { + if m != nil { + return m.Peers + } + return nil +} + +type PBDHTMessage_PBPeer struct { + Id *string `protobuf:"bytes,1,req,name=id" json:"id,omitempty"` + Addr *string `protobuf:"bytes,2,req,name=addr" json:"addr,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PBDHTMessage_PBPeer) Reset() { *m = PBDHTMessage_PBPeer{} } +func (m *PBDHTMessage_PBPeer) String() string { return proto.CompactTextString(m) } +func (*PBDHTMessage_PBPeer) ProtoMessage() {} + +func (m *PBDHTMessage_PBPeer) GetId() string { + if m != nil && m.Id != nil { + return *m.Id + } + return "" +} + +func (m *PBDHTMessage_PBPeer) GetAddr() string { + if m != nil && m.Addr != nil { + return *m.Addr + } + return "" +} + func init() { - proto.RegisterEnum("dht.DHTMessage_MessageType", DHTMessage_MessageType_name, DHTMessage_MessageType_value) + proto.RegisterEnum("dht.PBDHTMessage_MessageType", PBDHTMessage_MessageType_name, PBDHTMessage_MessageType_value) } diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index 278a95202b..4d4e8c61fd 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -2,7 +2,7 @@ package dht; //run `protoc --go_out=. *.proto` to generate -message DHTMessage { +message PBDHTMessage { enum MessageType { PUT_VALUE = 0; GET_VALUE = 1; @@ -13,6 +13,11 @@ message DHTMessage { DIAGNOSTIC = 6; } + message PBPeer { + required string id = 1; + required string addr = 2; + } + required MessageType type = 1; optional string key = 2; optional bytes value = 3; @@ -23,4 +28,7 @@ message DHTMessage { // Signals whether or not this message is a response to another message optional bool response = 5; optional bool success = 6; + + // Used for returning peers from queries (normally, peers closer to X) + repeated PBPeer peers = 7; } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 1a90ce76b6..57d087fdc0 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,10 +1,11 @@ package dht import ( - "math/rand" - "time" "bytes" "encoding/json" + "errors" + "math/rand" + "time" proto "code.google.com/p/goprotobuf/proto" @@ -34,7 +35,7 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer p = s.routes[0].NearestPeer(convertKey(key)) if p == nil { - panic("Table returned nil peer!") + return errors.New("Table returned nil peer!") } return s.putValueToPeer(p, string(key), value) @@ -47,13 +48,13 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { var p *peer.Peer p = s.routes[0].NearestPeer(convertKey(key)) if p == nil { - panic("Table returned nil peer!") + return nil, errors.New("Table returned nil peer!") } - pmes := pDHTMessage{ - Type: DHTMessage_GET_VALUE, - Key: string(key), - Id: GenerateMessageID(), + pmes := DHTMessage{ + Type: PBDHTMessage_GET_VALUE, + Key: string(key), + Id: GenerateMessageID(), } response_chan := s.ListenFor(pmes.Id, 1, time.Minute) @@ -68,15 +69,13 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { return nil, u.ErrTimeout case resp, ok := <-response_chan: if !ok { - panic("Channel was closed...") + u.PErr("response channel closed before timeout, please investigate.") + return nil, u.ErrTimeout } - if resp == nil { - panic("Why the hell is this response nil?") - } - pmes_out := new(DHTMessage) + pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { - return nil,err + return nil, err } if pmes_out.GetSuccess() { return pmes_out.GetValue(), nil @@ -96,15 +95,15 @@ func (s *IpfsDHT) Provide(key u.Key) error { //return an error } - pmes := pDHTMessage{ - Type: DHTMessage_ADD_PROVIDER, - Key: string(key), + pmes := DHTMessage{ + Type: PBDHTMessage_ADD_PROVIDER, + Key: string(key), } pbmes := pmes.ToProtobuf() - for _,p := range peers { + for _, p := range peers { mes := swarm.NewMessage(p, pbmes) - s.network.Chan.Outgoing <-mes + s.network.Chan.Outgoing <- mes } return nil } @@ -113,17 +112,17 @@ func (s *IpfsDHT) Provide(key u.Key) error { func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { p := s.routes[0].NearestPeer(convertKey(key)) - pmes := pDHTMessage{ - Type: DHTMessage_GET_PROVIDERS, - Key: string(key), - Id: GenerateMessageID(), + pmes := DHTMessage{ + Type: PBDHTMessage_GET_PROVIDERS, + Key: string(key), + Id: GenerateMessageID(), } mes := swarm.NewMessage(p, pmes.ToProtobuf()) listen_chan := s.ListenFor(pmes.Id, 1, time.Minute) u.DOut("Find providers for: '%s'", key) - s.network.Chan.Outgoing <-mes + s.network.Chan.Outgoing <- mes after := time.After(timeout) select { case <-after: @@ -131,7 +130,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, return nil, u.ErrTimeout case resp := <-listen_chan: u.DOut("FindProviders: got response.") - pmes_out := new(DHTMessage) + pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { return nil, err @@ -143,10 +142,10 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, } var prov_arr []*peer.Peer - for pid,addr := range addrs { + for pid, addr := range addrs { p := s.network.Find(pid) if p == nil { - maddr,err := ma.NewMultiaddr(addr) + maddr, err := ma.NewMultiaddr(addr) if err != nil { u.PErr("error connecting to new peer: %s", err) continue @@ -171,23 +170,23 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { p := s.routes[0].NearestPeer(convertPeerID(id)) - pmes := pDHTMessage{ - Type: DHTMessage_FIND_NODE, - Key: string(id), - Id: GenerateMessageID(), + pmes := DHTMessage{ + Type: PBDHTMessage_FIND_NODE, + Key: string(id), + Id: GenerateMessageID(), } mes := swarm.NewMessage(p, pmes.ToProtobuf()) listen_chan := s.ListenFor(pmes.Id, 1, time.Minute) - s.network.Chan.Outgoing <-mes + s.network.Chan.Outgoing <- mes after := time.After(timeout) select { case <-after: s.Unlisten(pmes.Id) return nil, u.ErrTimeout case resp := <-listen_chan: - pmes_out := new(DHTMessage) + pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { return nil, err @@ -218,7 +217,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { // Thoughts: maybe this should accept an ID and do a peer lookup? u.DOut("Enter Ping.") - pmes := pDHTMessage{Id: GenerateMessageID(), Type: DHTMessage_PING} + pmes := DHTMessage{Id: GenerateMessageID(), Type: PBDHTMessage_PING} mes := swarm.NewMessage(p, pmes.ToProtobuf()) before := time.Now() @@ -229,7 +228,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { select { case <-response_chan: roundtrip := time.Since(before) - p.SetDistance(roundtrip) + p.SetLatency(roundtrip) u.POut("Ping took %s.", roundtrip.String()) return nil case <-tout: @@ -246,17 +245,17 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { targets := dht.routes[0].NearestPeers(convertPeerID(dht.self.ID), 10) // TODO: Add timeout to this struct so nodes know when to return - pmes := pDHTMessage{ - Type: DHTMessage_DIAGNOSTIC, - Id: GenerateMessageID(), + pmes := DHTMessage{ + Type: PBDHTMessage_DIAGNOSTIC, + Id: GenerateMessageID(), } - listen_chan := dht.ListenFor(pmes.Id, len(targets), time.Minute * 2) + listen_chan := dht.ListenFor(pmes.Id, len(targets), time.Minute*2) pbmes := pmes.ToProtobuf() - for _,p := range targets { + for _, p := range targets { mes := swarm.NewMessage(p, pbmes) - dht.network.Chan.Outgoing <-mes + dht.network.Chan.Outgoing <- mes } var out []*diagInfo @@ -267,7 +266,7 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { u.DOut("Diagnostic request timed out.") return out, u.ErrTimeout case resp := <-listen_chan: - pmes_out := new(DHTMessage) + pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { // NOTE: here and elsewhere, need to audit error handling, @@ -288,5 +287,5 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { } } - return nil,nil + return nil, nil } diff --git a/routing/dht/table.go b/routing/dht/table.go index be4a4b3926..7a121234f1 100644 --- a/routing/dht/table.go +++ b/routing/dht/table.go @@ -125,7 +125,7 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { rt.tabLock.RLock() defer rt.tabLock.RUnlock() - cpl := xor(id, rt.local).commonPrefixLen() + cpl := prefLen(id, rt.local) // Get bucket at cpl index or last bucket var bucket *Bucket diff --git a/routing/dht/util.go b/routing/dht/util.go index 2adc8b765b..5961cd2263 100644 --- a/routing/dht/util.go +++ b/routing/dht/util.go @@ -40,6 +40,10 @@ func (id ID) commonPrefixLen() int { return len(id)*8 - 1 } +func prefLen(a, b ID) int { + return xor(a, b).commonPrefixLen() +} + func xor(a, b ID) ID { a, b = equalizeSizes(a, b) From 59b791e9ef4c353b963cab164128987e5c1ccf31 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 8 Aug 2014 19:49:27 -0700 Subject: [PATCH 0033/3147] make tests pass a little more reliably by changing a port to not overlap This commit was moved from ipfs/go-ipfs-routing@f4af2651347c5d95d16ce1fe9bf6f28512240d36 --- routing/dht/dht_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index e24ada020b..a5b47cb214 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -13,7 +13,7 @@ import ( func TestPing(t *testing.T) { u.Debug = false - addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1234") + addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") if err != nil { t.Fatal(err) } From a59c5f93aeaffd572bdf319245cde62bfd00efeb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 8 Aug 2014 19:58:42 -0700 Subject: [PATCH 0034/3147] moved routing table code into its own package This commit was moved from ipfs/go-ipfs-routing@fed1d4079ee17350b4d15b6cee91b472fea262cf --- routing/dht/dht.go | 13 +++++++------ routing/dht/diag.go | 2 +- routing/dht/routing.go | 13 +++++++------ routing/{dht => kbucket}/bucket.go | 2 +- routing/{dht => kbucket}/table.go | 6 +++--- routing/{dht => kbucket}/table_test.go | 18 +++++++++--------- routing/{dht => kbucket}/util.go | 4 ++-- 7 files changed, 30 insertions(+), 28 deletions(-) rename routing/{dht => kbucket}/bucket.go (96%) rename routing/{dht => kbucket}/table.go (97%) rename routing/{dht => kbucket}/table_test.go (83%) rename routing/{dht => kbucket}/util.go (95%) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 8fbd5c092c..7188fc8937 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,6 +10,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" + kb "github.com/jbenet/go-ipfs/routing/kbucket" ma "github.com/jbenet/go-multiaddr" @@ -25,7 +26,7 @@ import ( type IpfsDHT struct { // Array of routing tables for differently distanced nodes // NOTE: (currently, only a single table is used) - routes []*RoutingTable + routes []*kb.RoutingTable network *swarm.Swarm @@ -84,8 +85,8 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) { dht.listeners = make(map[uint64]*listenInfo) dht.providers = make(map[u.Key][]*providerInfo) dht.shutdown = make(chan struct{}) - dht.routes = make([]*RoutingTable, 1) - dht.routes[0] = NewRoutingTable(20, convertPeerID(p.ID)) + dht.routes = make([]*kb.RoutingTable, 1) + dht.routes[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID)) dht.birth = time.Now() return dht, nil } @@ -253,7 +254,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { } } else if err == ds.ErrNotFound { // Find closest peer(s) to desired key and reply with that info - closer := dht.routes[0].NearestPeer(convertKey(u.Key(pmes.GetKey()))) + closer := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) resp = &DHTMessage{ Response: true, Id: *pmes.Id, @@ -290,7 +291,7 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { success := true u.POut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) - closest := dht.routes[0].NearestPeer(convertKey(u.Key(pmes.GetKey()))) + closest := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if closest == nil { u.PErr("handleFindPeer: could not find anything.") success = false @@ -432,7 +433,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { } dht.diaglock.Unlock() - seq := dht.routes[0].NearestPeers(convertPeerID(dht.self.ID), 10) + seq := dht.routes[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) listen_chan := dht.ListenFor(pmes.GetId(), len(seq), time.Second*30) for _, ps := range seq { diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 4bc752f924..50d5a3d506 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -37,7 +37,7 @@ func (dht *IpfsDHT) getDiagInfo() *diagInfo { di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore - for _,p := range dht.routes[0].listpeers() { + for _,p := range dht.routes[0].Listpeers() { di.Connections = append(di.Connections, connDiagInfo{p.GetLatency(), p.ID}) } return di diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 57d087fdc0..8898aaf159 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,6 +12,7 @@ import ( ma "github.com/jbenet/go-multiaddr" peer "github.com/jbenet/go-ipfs/peer" + kb "github.com/jbenet/go-ipfs/routing/kbucket" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" ) @@ -33,7 +34,7 @@ func GenerateMessageID() uint64 { // This is the top level "Store" operation of the DHT func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { var p *peer.Peer - p = s.routes[0].NearestPeer(convertKey(key)) + p = s.routes[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return errors.New("Table returned nil peer!") } @@ -46,7 +47,7 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { // returned along with util.ErrSearchIncomplete func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { var p *peer.Peer - p = s.routes[0].NearestPeer(convertKey(key)) + p = s.routes[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, errors.New("Table returned nil peer!") } @@ -90,7 +91,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // Announce that this node can provide value for given key func (s *IpfsDHT) Provide(key u.Key) error { - peers := s.routes[0].NearestPeers(convertKey(key), PoolSize) + peers := s.routes[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { //return an error } @@ -110,7 +111,7 @@ func (s *IpfsDHT) Provide(key u.Key) error { // FindProviders searches for peers who can provide the value for given key. func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { - p := s.routes[0].NearestPeer(convertKey(key)) + p := s.routes[0].NearestPeer(kb.ConvertKey(key)) pmes := DHTMessage{ Type: PBDHTMessage_GET_PROVIDERS, @@ -168,7 +169,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, // FindPeer searches for a peer with given ID. func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { - p := s.routes[0].NearestPeer(convertPeerID(id)) + p := s.routes[0].NearestPeer(kb.ConvertPeerID(id)) pmes := DHTMessage{ Type: PBDHTMessage_FIND_NODE, @@ -242,7 +243,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { u.DOut("Begin Diagnostic") //Send to N closest peers - targets := dht.routes[0].NearestPeers(convertPeerID(dht.self.ID), 10) + targets := dht.routes[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) // TODO: Add timeout to this struct so nodes know when to return pmes := DHTMessage{ diff --git a/routing/dht/bucket.go b/routing/kbucket/bucket.go similarity index 96% rename from routing/dht/bucket.go rename to routing/kbucket/bucket.go index 7aa8d0a940..a56db74fec 100644 --- a/routing/dht/bucket.go +++ b/routing/kbucket/bucket.go @@ -48,7 +48,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { out := list.New() e := bucket_list.Front() for e != nil { - peer_id := convertPeerID(e.Value.(*peer.Peer).ID) + peer_id := ConvertPeerID(e.Value.(*peer.Peer).ID) peer_cpl := prefLen(peer_id, target) if peer_cpl > cpl { cur := e diff --git a/routing/dht/table.go b/routing/kbucket/table.go similarity index 97% rename from routing/dht/table.go rename to routing/kbucket/table.go index 7a121234f1..de971ea218 100644 --- a/routing/dht/table.go +++ b/routing/kbucket/table.go @@ -36,7 +36,7 @@ func NewRoutingTable(bucketsize int, local_id ID) *RoutingTable { func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peer_id := convertPeerID(p.ID) + peer_id := ConvertPeerID(p.ID) cpl := xor(peer_id, rt.local).commonPrefixLen() b_id := cpl @@ -97,7 +97,7 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) - p_id := convertPeerID(p.ID) + p_id := ConvertPeerID(p.ID) pd := peerDistance{ p: p, distance: xor(target, p_id), @@ -173,7 +173,7 @@ func (rt *RoutingTable) Size() int { } // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) listpeers() []*peer.Peer { +func (rt *RoutingTable) Listpeers() []*peer.Peer { var peers []*peer.Peer for _,buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { diff --git a/routing/dht/table_test.go b/routing/kbucket/table_test.go similarity index 83% rename from routing/dht/table_test.go rename to routing/kbucket/table_test.go index 393a1c5851..4305d8d1fd 100644 --- a/routing/dht/table_test.go +++ b/routing/kbucket/table_test.go @@ -36,7 +36,7 @@ func TestBucket(t *testing.T) { } local := _randPeer() - local_id := convertPeerID(local.ID) + local_id := ConvertPeerID(local.ID) i := rand.Intn(len(peers)) e := b.Find(peers[i].ID) @@ -44,10 +44,10 @@ func TestBucket(t *testing.T) { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, convertPeerID(local.ID)) + spl := b.Split(0, ConvertPeerID(local.ID)) llist := (*list.List)(b) for e := llist.Front(); e != nil; e = e.Next() { - p := convertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, local_id).commonPrefixLen() if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") @@ -56,7 +56,7 @@ func TestBucket(t *testing.T) { rlist := (*list.List)(spl) for e := rlist.Front(); e != nil; e = e.Next() { - p := convertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, local_id).commonPrefixLen() if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") @@ -67,7 +67,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, convertPeerID(local.ID)) + rt := NewRoutingTable(10, ConvertPeerID(local.ID)) peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -93,7 +93,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, convertPeerID(local.ID)) + rt := NewRoutingTable(10, ConvertPeerID(local.ID)) peers := make([]*peer.Peer, 100) for i := 0; i < 5; i++ { @@ -102,7 +102,7 @@ func TestTableFind(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeer(convertPeerID(peers[2].ID)) + found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) if !found.ID.Equal(peers[2].ID) { t.Fatalf("Failed to lookup known node...") } @@ -110,7 +110,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(20, convertPeerID(local.ID)) + rt := NewRoutingTable(20, ConvertPeerID(local.ID)) peers := make([]*peer.Peer, 100) for i := 0; i < 18; i++ { @@ -119,7 +119,7 @@ func TestTableFindMultiple(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeers(convertPeerID(peers[2].ID), 15) + found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } diff --git a/routing/dht/util.go b/routing/kbucket/util.go similarity index 95% rename from routing/dht/util.go rename to routing/kbucket/util.go index 5961cd2263..095d0b03e3 100644 --- a/routing/dht/util.go +++ b/routing/kbucket/util.go @@ -71,12 +71,12 @@ func equalizeSizes(a, b ID) (ID, ID) { return a, b } -func convertPeerID(id peer.ID) ID { +func ConvertPeerID(id peer.ID) ID { hash := sha256.Sum256(id) return hash[:] } -func convertKey(id u.Key) ID { +func ConvertKey(id u.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } From ea9f8367821d4007a7b3a55b515e44aa70ce2105 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 9 Aug 2014 22:28:46 -0700 Subject: [PATCH 0035/3147] tiered put/get implemented This commit was moved from ipfs/go-ipfs-routing@2af8878482b878fb1f8e2bb6c5260bf68642ecc8 --- routing/dht/DHTMessage.go | 21 ++++++ routing/dht/dht.go | 137 ++++++++++++++++++++++++++++------ routing/dht/dht_test.go | 84 ++++++++++++++++++++- routing/dht/diag.go | 11 ++- routing/dht/routing.go | 85 ++++++++++----------- routing/kbucket/bucket.go | 1 + routing/kbucket/table.go | 35 ++++++--- routing/kbucket/table_test.go | 2 +- 8 files changed, 283 insertions(+), 93 deletions(-) diff --git a/routing/dht/DHTMessage.go b/routing/dht/DHTMessage.go index 64ca5bcab9..701f36687b 100644 --- a/routing/dht/DHTMessage.go +++ b/routing/dht/DHTMessage.go @@ -1,5 +1,9 @@ package dht +import ( + peer "github.com/jbenet/go-ipfs/peer" +) + // A helper struct to make working with protbuf types easier type DHTMessage struct { Type PBDHTMessage_MessageType @@ -8,6 +12,20 @@ type DHTMessage struct { Response bool Id uint64 Success bool + Peers []*peer.Peer +} + +func peerInfo(p *peer.Peer) *PBDHTMessage_PBPeer { + pbp := new(PBDHTMessage_PBPeer) + addr, err := p.Addresses[0].String() + if err != nil { + //Temp: what situations could cause this? + panic(err) + } + pbp.Addr = &addr + pid := string(p.ID) + pbp.Id = &pid + return pbp } func (m *DHTMessage) ToProtobuf() *PBDHTMessage { @@ -21,6 +39,9 @@ func (m *DHTMessage) ToProtobuf() *PBDHTMessage { pmes.Response = &m.Response pmes.Id = &m.Id pmes.Success = &m.Success + for _, p := range m.Peers { + pmes.Peers = append(pmes.Peers, peerInfo(p)) + } return pmes } diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 7188fc8937..10954d2bad 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -8,9 +8,9 @@ import ( "time" peer "github.com/jbenet/go-ipfs/peer" + kb "github.com/jbenet/go-ipfs/routing/kbucket" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" - kb "github.com/jbenet/go-ipfs/routing/kbucket" ma "github.com/jbenet/go-multiaddr" @@ -37,7 +37,6 @@ type IpfsDHT struct { datastore ds.Datastore // Map keys to peers that can provide their value - // TODO: implement a TTL on each of these keys providers map[u.Key][]*providerInfo providerLock sync.RWMutex @@ -67,7 +66,7 @@ type listenInfo struct { eol time.Time } -// Create a new DHT object with the given peer as the 'local' host +// NewDHT creates a new DHT object with the given peer as the 'local' host func NewDHT(p *peer.Peer) (*IpfsDHT, error) { if p == nil { return nil, errors.New("nil peer passed to NewDHT()") @@ -111,7 +110,7 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { // NOTE: this should be done better... err = dht.Ping(npeer, time.Second*2) if err != nil { - return nil, errors.New("Failed to ping newly connected peer.") + return nil, errors.New("failed to ping newly connected peer") } return npeer, nil @@ -227,7 +226,7 @@ func (dht *IpfsDHT) cleanExpiredListeners() { dht.listenLock.Unlock() } -func (dht *IpfsDHT) putValueToPeer(p *peer.Peer, key string, value []byte) error { +func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { pmes := DHTMessage{ Type: PBDHTMessage_PUT_VALUE, Key: key, @@ -242,26 +241,32 @@ func (dht *IpfsDHT) putValueToPeer(p *peer.Peer, key string, value []byte) error func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { dskey := ds.NewKey(pmes.GetKey()) - var resp *DHTMessage - i_val, err := dht.datastore.Get(dskey) + resp := &DHTMessage{ + Response: true, + Id: pmes.GetId(), + Key: pmes.GetKey(), + } + iVal, err := dht.datastore.Get(dskey) if err == nil { - resp = &DHTMessage{ - Response: true, - Id: *pmes.Id, - Key: *pmes.Key, - Value: i_val.([]byte), - Success: true, - } + resp.Success = true + resp.Value = iVal.([]byte) } else if err == ds.ErrNotFound { - // Find closest peer(s) to desired key and reply with that info - closer := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) - resp = &DHTMessage{ - Response: true, - Id: *pmes.Id, - Key: *pmes.Key, - Value: closer.ID, - Success: false, + // Check if we know any providers for the requested value + provs, ok := dht.providers[u.Key(pmes.GetKey())] + if ok && len(provs) > 0 { + for _, prov := range provs { + resp.Peers = append(resp.Peers, prov.Value) + } + resp.Success = true + } else { + // No providers? + // Find closest peer(s) to desired key and reply with that info + closer := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + resp.Peers = []*peer.Peer{closer} } + } else { + //temp: what other errors can a datastore throw? + panic(err) } mes := swarm.NewMessage(p, resp.ToProtobuf()) @@ -397,6 +402,7 @@ func (dht *IpfsDHT) Unlisten(mesid uint64) { close(list.resp) } +// Check whether or not the dht is currently listening for mesid func (dht *IpfsDHT) IsListening(mesid uint64) bool { dht.listenLock.RLock() li, ok := dht.listeners[mesid] @@ -424,6 +430,7 @@ func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { dht.providerLock.Unlock() } +// NOTE: not yet finished, low priority func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { dht.diaglock.Lock() if dht.IsListening(pmes.GetId()) { @@ -434,7 +441,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { dht.diaglock.Unlock() seq := dht.routes[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - listen_chan := dht.ListenFor(pmes.GetId(), len(seq), time.Second*30) + listenChan := dht.ListenFor(pmes.GetId(), len(seq), time.Second*30) for _, ps := range seq { mes := swarm.NewMessage(ps, pmes) @@ -453,7 +460,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { case <-after: //Timeout, return what we have goto out - case req_resp := <-listen_chan: + case req_resp := <-listenChan: pmes_out := new(PBDHTMessage) err := proto.Unmarshal(req_resp.Data, pmes_out) if err != nil { @@ -477,6 +484,77 @@ out: dht.network.Chan.Outgoing <- mes } +func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration) ([]byte, error) { + pmes := DHTMessage{ + Type: PBDHTMessage_GET_VALUE, + Key: string(key), + Id: GenerateMessageID(), + } + response_chan := dht.ListenFor(pmes.Id, 1, time.Minute) + + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + dht.network.Chan.Outgoing <- mes + + // Wait for either the response or a timeout + timeup := time.After(timeout) + select { + case <-timeup: + dht.Unlisten(pmes.Id) + return nil, u.ErrTimeout + case resp, ok := <-response_chan: + if !ok { + u.PErr("response channel closed before timeout, please investigate.") + return nil, u.ErrTimeout + } + pmes_out := new(PBDHTMessage) + err := proto.Unmarshal(resp.Data, pmes_out) + if err != nil { + return nil, err + } + // TODO: debate moving this logic out of this function to be handled by the caller + if pmes_out.GetSuccess() { + if pmes_out.Value == nil { + // We were given provider[s] + return dht.getFromProviderList(key, timeout, pmes_out.GetPeers()) + } + // We were given the value + return pmes_out.GetValue(), nil + } else { + return pmes_out.GetValue(), u.ErrSearchIncomplete + } + } +} + +// TODO: Im not certain on this implementation, we get a list of providers from someone +// what do we do with it? Connect to each of them? randomly pick one to get the value from? +// Or just connect to one at a time until we get a successful connection and request the +// value from it? +func (dht *IpfsDHT) getFromProviderList(key u.Key, timeout time.Duration, provlist []*PBDHTMessage_PBPeer) ([]byte, error) { + for _, prov := range provlist { + prov_p, _ := dht.Find(peer.ID(prov.GetId())) + if prov_p == nil { + maddr, err := ma.NewMultiaddr(prov.GetAddr()) + if err != nil { + u.PErr("getValue error: %s", err) + continue + } + prov_p, err = dht.Connect(maddr) + if err != nil { + u.PErr("getValue error: %s", err) + continue + } + } + data, err := dht.getValueSingle(prov_p, key, timeout) + if err != nil { + u.DErr("getFromProvs error: %s", err) + continue + } + + return data, nil + } + return nil, u.ErrNotFound +} + func (dht *IpfsDHT) GetLocal(key u.Key) ([]byte, error) { v, err := dht.datastore.Get(ds.NewKey(string(key))) if err != nil { @@ -495,3 +573,14 @@ func (dht *IpfsDHT) Update(p *peer.Peer) { dht.network.Drop(removed) } } + +// Look for a peer with a given ID connected to this dht +func (dht *IpfsDHT) Find(id peer.ID) (*peer.Peer, *kb.RoutingTable) { + for _, table := range dht.routes { + p := table.Find(id) + if p != nil { + return p, table + } + } + return nil, nil +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index a5b47cb214..1771289783 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -90,15 +90,21 @@ func TestValueGetSet(t *testing.T) { dht_a.Start() dht_b.Start() + go func() { + select { + case err := <-dht_a.network.Chan.Errors: + t.Fatal(err) + case err := <-dht_b.network.Chan.Errors: + t.Fatal(err) + } + }() + _, err = dht_a.Connect(addr_b) if err != nil { t.Fatal(err) } - err = dht_a.PutValue("hello", []byte("world")) - if err != nil { - t.Fatal(err) - } + dht_a.PutValue("hello", []byte("world")) val, err := dht_a.GetValue("hello", time.Second*2) if err != nil { @@ -179,3 +185,73 @@ func TestProvides(t *testing.T) { dhts[i].Halt() } } + +func TestLayeredGet(t *testing.T) { + u.Debug = false + var addrs []*ma.Multiaddr + for i := 0; i < 4; i++ { + a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) + if err != nil { + t.Fatal(err) + } + addrs = append(addrs, a) + } + + var peers []*peer.Peer + for i := 0; i < 4; i++ { + p := new(peer.Peer) + p.AddAddress(addrs[i]) + p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i))) + peers = append(peers, p) + } + + var dhts []*IpfsDHT + for i := 0; i < 4; i++ { + d, err := NewDHT(peers[i]) + if err != nil { + t.Fatal(err) + } + dhts = append(dhts, d) + d.Start() + } + + _, err := dhts[0].Connect(addrs[1]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(addrs[2]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(addrs[3]) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].PutLocal(u.Key("hello"), []byte("world")) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].Provide(u.Key("hello")) + if err != nil { + t.Fatal(err) + } + + time.Sleep(time.Millisecond * 60) + + val, err := dhts[0].GetValue(u.Key("hello"), time.Second) + if err != nil { + t.Fatal(err) + } + + if string(val) != "world" { + t.Fatal("Got incorrect value.") + } + + for i := 0; i < 4; i++ { + dhts[i].Halt() + } +} diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 50d5a3d506..03997c5e78 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -9,14 +9,14 @@ import ( type connDiagInfo struct { Latency time.Duration - Id peer.ID + Id peer.ID } type diagInfo struct { - Id peer.ID + Id peer.ID Connections []connDiagInfo - Keys []string - LifeSpan time.Duration + Keys []string + LifeSpan time.Duration CodeVersion string } @@ -29,7 +29,6 @@ func (di *diagInfo) Marshal() []byte { return b } - func (dht *IpfsDHT) getDiagInfo() *diagInfo { di := new(diagInfo) di.CodeVersion = "github.com/jbenet/go-ipfs" @@ -37,7 +36,7 @@ func (dht *IpfsDHT) getDiagInfo() *diagInfo { di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore - for _,p := range dht.routes[0].Listpeers() { + for _, p := range dht.routes[0].Listpeers() { di.Connections = append(di.Connections, connDiagInfo{p.GetLatency(), p.ID}) } return di diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 8898aaf159..2c6a9b74c3 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "errors" + "fmt" "math/rand" "time" @@ -32,58 +33,50 @@ func GenerateMessageID() uint64 { // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (s *IpfsDHT) PutValue(key u.Key, value []byte) error { - var p *peer.Peer - p = s.routes[0].NearestPeer(kb.ConvertKey(key)) - if p == nil { - return errors.New("Table returned nil peer!") +func (s *IpfsDHT) PutValue(key u.Key, value []byte) { + complete := make(chan struct{}) + for i, route := range s.routes { + p := route.NearestPeer(kb.ConvertKey(key)) + if p == nil { + s.network.Chan.Errors <- fmt.Errorf("No peer found on level %d", i) + continue + go func() { + complete <- struct{}{} + }() + } + go func() { + err := s.putValueToNetwork(p, string(key), value) + if err != nil { + s.network.Chan.Errors <- err + } + complete <- struct{}{} + }() + } + for _, _ = range s.routes { + <-complete } - - return s.putValueToPeer(p, string(key), value) } // GetValue searches for the value corresponding to given Key. // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { - var p *peer.Peer - p = s.routes[0].NearestPeer(kb.ConvertKey(key)) - if p == nil { - return nil, errors.New("Table returned nil peer!") - } - - pmes := DHTMessage{ - Type: PBDHTMessage_GET_VALUE, - Key: string(key), - Id: GenerateMessageID(), - } - response_chan := s.ListenFor(pmes.Id, 1, time.Minute) - - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - s.network.Chan.Outgoing <- mes + for _, route := range s.routes { + var p *peer.Peer + p = route.NearestPeer(kb.ConvertKey(key)) + if p == nil { + return nil, errors.New("Table returned nil peer!") + } - // Wait for either the response or a timeout - timeup := time.After(timeout) - select { - case <-timeup: - s.Unlisten(pmes.Id) - return nil, u.ErrTimeout - case resp, ok := <-response_chan: - if !ok { - u.PErr("response channel closed before timeout, please investigate.") - return nil, u.ErrTimeout + b, err := s.getValueSingle(p, key, timeout) + if err == nil { + return b, nil } - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmes_out) - if err != nil { + if err != u.ErrSearchIncomplete { return nil, err } - if pmes_out.GetSuccess() { - return pmes_out.GetValue(), nil - } else { - return pmes_out.GetValue(), u.ErrSearchIncomplete - } } + return nil, u.ErrNotFound } // Value provider layer of indirection. @@ -121,7 +114,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listen_chan := s.ListenFor(pmes.Id, 1, time.Minute) + listenChan := s.ListenFor(pmes.Id, 1, time.Minute) u.DOut("Find providers for: '%s'", key) s.network.Chan.Outgoing <- mes after := time.After(timeout) @@ -129,7 +122,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, case <-after: s.Unlisten(pmes.Id) return nil, u.ErrTimeout - case resp := <-listen_chan: + case resp := <-listenChan: u.DOut("FindProviders: got response.") pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) @@ -179,14 +172,14 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listen_chan := s.ListenFor(pmes.Id, 1, time.Minute) + listenChan := s.ListenFor(pmes.Id, 1, time.Minute) s.network.Chan.Outgoing <- mes after := time.After(timeout) select { case <-after: s.Unlisten(pmes.Id) return nil, u.ErrTimeout - case resp := <-listen_chan: + case resp := <-listenChan: pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { @@ -251,7 +244,7 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { Id: GenerateMessageID(), } - listen_chan := dht.ListenFor(pmes.Id, len(targets), time.Minute*2) + listenChan := dht.ListenFor(pmes.Id, len(targets), time.Minute*2) pbmes := pmes.ToProtobuf() for _, p := range targets { @@ -266,7 +259,7 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { case <-after: u.DOut("Diagnostic request timed out.") return out, u.ErrTimeout - case resp := <-listen_chan: + case resp := <-listenChan: pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index a56db74fec..5abd2c9107 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -5,6 +5,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) + // Bucket holds a list of peers. type Bucket list.List diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index de971ea218..788d12265f 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -19,7 +19,7 @@ type RoutingTable struct { tabLock sync.RWMutex // kBuckets define all the fingers to other nodes. - Buckets []*Bucket + Buckets []*Bucket bucketsize int } @@ -52,7 +52,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { // Are we past the max bucket size? if bucket.Len() > rt.bucketsize { - if b_id == len(rt.Buckets) - 1 { + if b_id == len(rt.Buckets)-1 { new_bucket := bucket.Split(b_id, rt.local) rt.Buckets = append(rt.Buckets, new_bucket) if new_bucket.Len() > rt.bucketsize { @@ -81,25 +81,27 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { // A helper struct to sort peers by their distance to the local node type peerDistance struct { - p *peer.Peer + p *peer.Peer distance ID } // peerSorterArr implements sort.Interface to sort peers by xor distance type peerSorterArr []*peerDistance -func (p peerSorterArr) Len() int {return len(p)} -func (p peerSorterArr) Swap(a, b int) {p[a],p[b] = p[b],p[a]} + +func (p peerSorterArr) Len() int { return len(p) } +func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } func (p peerSorterArr) Less(a, b int) bool { return p[a].distance.Less(p[b].distance) } + // func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - for e := peerList.Front(); e != nil; e = e.Next() { + for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) p_id := ConvertPeerID(p.ID) pd := peerDistance{ - p: p, + p: p, distance: xor(target, p_id), } peerArr = append(peerArr, &pd) @@ -111,6 +113,15 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe return peerArr } +// Find a specific peer by ID or return nil +func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { + srch := rt.NearestPeers(ConvertPeerID(id), 1) + if len(srch) == 0 || !srch[0].ID.Equal(id) { + return nil + } + return srch[0] +} + // Returns a single peer that is nearest to the given ID func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { peers := rt.NearestPeers(id, 1) @@ -139,12 +150,12 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { - plist := (*list.List)(rt.Buckets[cpl - 1]) + plist := (*list.List)(rt.Buckets[cpl-1]) peerArr = copyPeersFromList(id, peerArr, plist) } - if cpl < len(rt.Buckets) - 1 { - plist := (*list.List)(rt.Buckets[cpl + 1]) + if cpl < len(rt.Buckets)-1 { + plist := (*list.List)(rt.Buckets[cpl+1]) peerArr = copyPeersFromList(id, peerArr, plist) } } else { @@ -166,7 +177,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // Returns the total number of peers in the routing table func (rt *RoutingTable) Size() int { var tot int - for _,buck := range rt.Buckets { + for _, buck := range rt.Buckets { tot += buck.Len() } return tot @@ -175,7 +186,7 @@ func (rt *RoutingTable) Size() int { // NOTE: This is potentially unsafe... use at your own risk func (rt *RoutingTable) Listpeers() []*peer.Peer { var peers []*peer.Peer - for _,buck := range rt.Buckets { + for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { peers = append(peers, e.Value.(*peer.Peer)) } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 4305d8d1fd..842c925108 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -1,10 +1,10 @@ package dht import ( + "container/list" crand "crypto/rand" "crypto/sha256" "math/rand" - "container/list" "testing" peer "github.com/jbenet/go-ipfs/peer" From 032e25e412e1c3ea15a50de93c8bbf68c4baabf3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Aug 2014 21:02:05 -0700 Subject: [PATCH 0036/3147] more work implementing coral type lookups This commit was moved from ipfs/go-ipfs-routing@e3e249ee656ca63b84aa91b9645752835a041d02 --- routing/dht/dht.go | 211 +++++++++++++++++++++------------------- routing/dht/dht_test.go | 111 +++++++++++++++++---- routing/dht/routing.go | 137 ++++++++++++++------------ routing/kbucket/util.go | 20 +++- 4 files changed, 296 insertions(+), 183 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 10954d2bad..388ab9ab1c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -2,7 +2,6 @@ package dht import ( "bytes" - "encoding/json" "errors" "sync" "time" @@ -28,7 +27,7 @@ type IpfsDHT struct { // NOTE: (currently, only a single table is used) routes []*kb.RoutingTable - network *swarm.Swarm + network swarm.Network // Local peer (yourself) self *peer.Peer @@ -95,7 +94,7 @@ func (dht *IpfsDHT) Start() { go dht.handleMessages() } -// Connect to a new peer at the given address +// Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { maddrstr, _ := addr.String() u.DOut("Connect to new peer: %s", maddrstr) @@ -104,8 +103,6 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { return nil, err } - dht.Update(npeer) - // Ping new peer to register in their routing table // NOTE: this should be done better... err = dht.Ping(npeer, time.Second*2) @@ -113,6 +110,8 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { return nil, errors.New("failed to ping newly connected peer") } + dht.Update(npeer) + return npeer, nil } @@ -122,9 +121,10 @@ func (dht *IpfsDHT) handleMessages() { u.DOut("Begin message handling routine") checkTimeouts := time.NewTicker(time.Minute * 5) + ch := dht.network.GetChan() for { select { - case mes, ok := <-dht.network.Chan.Incoming: + case mes, ok := <-ch.Incoming: if !ok { u.DOut("handleMessages closing, bad recv on incoming") return @@ -184,8 +184,8 @@ func (dht *IpfsDHT) handleMessages() { dht.handleDiagnostic(mes.Peer, pmes) } - case err := <-dht.network.Chan.Errors: - u.DErr("dht err: %s", err) + case err := <-ch.Errors: + u.PErr("dht err: %s", err) case <-dht.shutdown: checkTimeouts.Stop() return @@ -235,7 +235,7 @@ func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) er } mes := swarm.NewMessage(p, pmes.ToProtobuf()) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) return nil } @@ -260,17 +260,26 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { resp.Success = true } else { // No providers? - // Find closest peer(s) to desired key and reply with that info - closer := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) - resp.Peers = []*peer.Peer{closer} + // Find closest peer on given cluster to desired key and reply with that info + + level := pmes.GetValue()[0] // Using value field to specify cluster level + + closer := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + + // If this peer is closer than the one from the table, return nil + if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { + resp.Peers = nil + } else { + resp.Peers = []*peer.Peer{closer} + } } } else { - //temp: what other errors can a datastore throw? + //temp: what other errors can a datastore return? panic(err) } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) } // Store a value in this peer local storage @@ -290,84 +299,66 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { Id: pmes.GetId(), } - dht.network.Chan.Outgoing <- swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Send(swarm.NewMessage(p, resp.ToProtobuf())) } func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { - success := true - u.POut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) - closest := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + resp := DHTMessage{ + Type: pmes.GetType(), + Id: pmes.GetId(), + Response: true, + } + defer func() { + mes := swarm.NewMessage(p, resp.ToProtobuf()) + dht.network.Send(mes) + }() + level := pmes.GetValue()[0] + u.DOut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) + closest := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if closest == nil { u.PErr("handleFindPeer: could not find anything.") - success = false + return } if len(closest.Addresses) == 0 { u.PErr("handleFindPeer: no addresses for connected peer...") - success = false + return } - u.POut("handleFindPeer: sending back '%s'", closest.ID.Pretty()) - - addr, err := closest.Addresses[0].String() - if err != nil { - u.PErr(err.Error()) - success = false + // If the found peer further away than this peer... + if kb.Closer(dht.self.ID, closest.ID, u.Key(pmes.GetKey())) { + return } + u.DOut("handleFindPeer: sending back '%s'", closest.ID.Pretty()) + resp.Peers = []*peer.Peer{closest} + resp.Success = true +} + +func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { resp := DHTMessage{ - Type: pmes.GetType(), - Response: true, + Type: PBDHTMessage_GET_PROVIDERS, + Key: pmes.GetKey(), Id: pmes.GetId(), - Value: []byte(addr), - Success: success, + Response: true, } - mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <- mes -} - -func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { dht.providerLock.RLock() providers := dht.providers[u.Key(pmes.GetKey())] dht.providerLock.RUnlock() if providers == nil || len(providers) == 0 { - // ????? - u.DOut("No known providers for requested key.") - } - - // This is just a quick hack, formalize method of sending addrs later - addrs := make(map[u.Key]string) - for _, prov := range providers { - ma := prov.Value.NetAddress("tcp") - str, err := ma.String() - if err != nil { - u.PErr("Error: %s", err) - continue + // TODO: work on tiering this + closer := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + resp.Peers = []*peer.Peer{closer} + } else { + for _, prov := range providers { + resp.Peers = append(resp.Peers, prov.Value) } - - addrs[prov.Value.Key()] = str - } - - success := true - data, err := json.Marshal(addrs) - if err != nil { - u.POut("handleGetProviders: error marshalling struct to JSON: %s", err) - data = nil - success = false - } - - resp := DHTMessage{ - Type: PBDHTMessage_GET_PROVIDERS, - Key: pmes.GetKey(), - Value: data, - Id: pmes.GetId(), - Response: true, - Success: success, + resp.Success = true } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) } type providerInfo struct { @@ -445,7 +436,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { for _, ps := range seq { mes := swarm.NewMessage(ps, pmes) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) } buf := new(bytes.Buffer) @@ -481,19 +472,21 @@ out: } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) } -func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration) ([]byte, error) { +// getValueSingle simply performs the get value RPC with the given parameters +func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration, level int) (*PBDHTMessage, error) { pmes := DHTMessage{ - Type: PBDHTMessage_GET_VALUE, - Key: string(key), - Id: GenerateMessageID(), + Type: PBDHTMessage_GET_VALUE, + Key: string(key), + Value: []byte{byte(level)}, + Id: GenerateMessageID(), } response_chan := dht.ListenFor(pmes.Id, 1, time.Minute) mes := swarm.NewMessage(p, pmes.ToProtobuf()) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) // Wait for either the response or a timeout timeup := time.After(timeout) @@ -511,46 +504,41 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio if err != nil { return nil, err } - // TODO: debate moving this logic out of this function to be handled by the caller - if pmes_out.GetSuccess() { - if pmes_out.Value == nil { - // We were given provider[s] - return dht.getFromProviderList(key, timeout, pmes_out.GetPeers()) - } - // We were given the value - return pmes_out.GetValue(), nil - } else { - return pmes_out.GetValue(), u.ErrSearchIncomplete - } + return pmes_out, nil } } -// TODO: Im not certain on this implementation, we get a list of providers from someone -// what do we do with it? Connect to each of them? randomly pick one to get the value from? -// Or just connect to one at a time until we get a successful connection and request the -// value from it? -func (dht *IpfsDHT) getFromProviderList(key u.Key, timeout time.Duration, provlist []*PBDHTMessage_PBPeer) ([]byte, error) { - for _, prov := range provlist { - prov_p, _ := dht.Find(peer.ID(prov.GetId())) - if prov_p == nil { - maddr, err := ma.NewMultiaddr(prov.GetAddr()) +// TODO: Im not certain on this implementation, we get a list of peers/providers +// from someone what do we do with it? Connect to each of them? randomly pick +// one to get the value from? Or just connect to one at a time until we get a +// successful connection and request the value from it? +func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, + peerlist []*PBDHTMessage_PBPeer, level int) ([]byte, error) { + for _, pinfo := range peerlist { + p, _ := dht.Find(peer.ID(pinfo.GetId())) + if p == nil { + maddr, err := ma.NewMultiaddr(pinfo.GetAddr()) if err != nil { u.PErr("getValue error: %s", err) continue } - prov_p, err = dht.Connect(maddr) + p, err = dht.Connect(maddr) if err != nil { u.PErr("getValue error: %s", err) continue } } - data, err := dht.getValueSingle(prov_p, key, timeout) + pmes, err := dht.getValueSingle(p, key, timeout, level) if err != nil { - u.DErr("getFromProvs error: %s", err) + u.DErr("getFromPeers error: %s", err) continue } + dht.addProviderEntry(key, p) - return data, nil + // Make sure it was a successful get + if pmes.GetSuccess() && pmes.Value != nil { + return pmes.GetValue(), nil + } } return nil, u.ErrNotFound } @@ -584,3 +572,30 @@ func (dht *IpfsDHT) Find(id peer.ID) (*peer.Peer, *kb.RoutingTable) { } return nil, nil } + +func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Duration, level int) (*PBDHTMessage, error) { + pmes := DHTMessage{ + Type: PBDHTMessage_FIND_NODE, + Key: string(id), + Id: GenerateMessageID(), + Value: []byte{byte(level)}, + } + + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + listenChan := dht.ListenFor(pmes.Id, 1, time.Minute) + dht.network.Send(mes) + after := time.After(timeout) + select { + case <-after: + dht.Unlisten(pmes.Id) + return nil, u.ErrTimeout + case resp := <-listenChan: + pmes_out := new(PBDHTMessage) + err := proto.Unmarshal(resp.Data, pmes_out) + if err != nil { + return nil, err + } + + return pmes_out, nil + } +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1771289783..3d1679397b 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,6 +11,37 @@ import ( "time" ) +func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { + var addrs []*ma.Multiaddr + for i := 0; i < 4; i++ { + a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) + if err != nil { + t.Fatal(err) + } + addrs = append(addrs, a) + } + + var peers []*peer.Peer + for i := 0; i < 4; i++ { + p := new(peer.Peer) + p.AddAddress(addrs[i]) + p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i))) + peers = append(peers, p) + } + + var dhts []*IpfsDHT + for i := 0; i < 4; i++ { + d, err := NewDHT(peers[i]) + if err != nil { + t.Fatal(err) + } + dhts = append(dhts, d) + d.Start() + } + + return addrs, peers, dhts +} + func TestPing(t *testing.T) { u.Debug = false addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") @@ -90,11 +121,13 @@ func TestValueGetSet(t *testing.T) { dht_a.Start() dht_b.Start() + errsa := dht_a.network.GetChan().Errors + errsb := dht_b.network.GetChan().Errors go func() { select { - case err := <-dht_a.network.Chan.Errors: + case err := <-errsa: t.Fatal(err) - case err := <-dht_b.network.Chan.Errors: + case err := <-errsb: t.Fatal(err) } }() @@ -118,6 +151,52 @@ func TestValueGetSet(t *testing.T) { func TestProvides(t *testing.T) { u.Debug = false + + addrs, _, dhts := setupDHTS(4, t) + + _, err := dhts[0].Connect(addrs[1]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(addrs[2]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(addrs[3]) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].PutLocal(u.Key("hello"), []byte("world")) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].Provide(u.Key("hello")) + if err != nil { + t.Fatal(err) + } + + time.Sleep(time.Millisecond * 60) + + provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) + if err != nil { + t.Fatal(err) + } + + if len(provs) != 1 { + t.Fatal("Didnt get back providers") + } + + for i := 0; i < 4; i++ { + dhts[i].Halt() + } +} + +func TestLayeredGet(t *testing.T) { + u.Debug = false var addrs []*ma.Multiaddr for i := 0; i < 4; i++ { a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) @@ -147,7 +226,7 @@ func TestProvides(t *testing.T) { _, err := dhts[0].Connect(addrs[1]) if err != nil { - t.Fatal(err) + t.Fatalf("Failed to connect: %s", err) } _, err = dhts[1].Connect(addrs[2]) @@ -172,13 +251,13 @@ func TestProvides(t *testing.T) { time.Sleep(time.Millisecond * 60) - provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) + val, err := dhts[0].GetValue(u.Key("hello"), time.Second) if err != nil { t.Fatal(err) } - if len(provs) != 1 { - t.Fatal("Didnt get back providers") + if string(val) != "world" { + t.Fatal("Got incorrect value.") } for i := 0; i < 4; i++ { @@ -186,7 +265,7 @@ func TestProvides(t *testing.T) { } } -func TestLayeredGet(t *testing.T) { +func TestFindPeer(t *testing.T) { u.Debug = false var addrs []*ma.Multiaddr for i := 0; i < 4; i++ { @@ -230,25 +309,17 @@ func TestLayeredGet(t *testing.T) { t.Fatal(err) } - err = dhts[3].PutLocal(u.Key("hello"), []byte("world")) + p, err := dhts[0].FindPeer(peers[2].ID, time.Second) if err != nil { t.Fatal(err) } - err = dhts[3].Provide(u.Key("hello")) - if err != nil { - t.Fatal(err) + if p == nil { + t.Fatal("Failed to find peer.") } - time.Sleep(time.Millisecond * 60) - - val, err := dhts[0].GetValue(u.Key("hello"), time.Second) - if err != nil { - t.Fatal(err) - } - - if string(val) != "world" { - t.Fatal("Got incorrect value.") + if !p.ID.Equal(peers[2].ID) { + t.Fatal("Didnt find expected peer.") } for i := 0; i < 4; i++ { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2c6a9b74c3..711866f8eb 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,8 +3,6 @@ package dht import ( "bytes" "encoding/json" - "errors" - "fmt" "math/rand" "time" @@ -35,19 +33,19 @@ func GenerateMessageID() uint64 { // This is the top level "Store" operation of the DHT func (s *IpfsDHT) PutValue(key u.Key, value []byte) { complete := make(chan struct{}) - for i, route := range s.routes { + for _, route := range s.routes { p := route.NearestPeer(kb.ConvertKey(key)) if p == nil { - s.network.Chan.Errors <- fmt.Errorf("No peer found on level %d", i) - continue + s.network.Error(kb.ErrLookupFailure) go func() { complete <- struct{}{} }() + continue } go func() { err := s.putValueToNetwork(p, string(key), value) if err != nil { - s.network.Chan.Errors <- err + s.network.Error(err) } complete <- struct{}{} }() @@ -61,19 +59,46 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) { // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { - for _, route := range s.routes { - var p *peer.Peer - p = route.NearestPeer(kb.ConvertKey(key)) - if p == nil { - return nil, errors.New("Table returned nil peer!") - } + route_level := 0 - b, err := s.getValueSingle(p, key, timeout) - if err == nil { - return b, nil + p := s.routes[route_level].NearestPeer(kb.ConvertKey(key)) + if p == nil { + return nil, kb.ErrLookupFailure + } + + for route_level < len(s.routes) && p != nil { + pmes, err := s.getValueSingle(p, key, timeout, route_level) + if err != nil { + return nil, u.WrapError(err, "getValue Error") } - if err != u.ErrSearchIncomplete { - return nil, err + + if pmes.GetSuccess() { + if pmes.Value == nil { // We were given provider[s] + return s.getFromPeerList(key, timeout, pmes.GetPeers(), route_level) + } + + // Success! We were given the value + return pmes.GetValue(), nil + } else { + // We were given a closer node + closers := pmes.GetPeers() + if len(closers) > 0 { + maddr, err := ma.NewMultiaddr(closers[0].GetAddr()) + if err != nil { + // ??? Move up route level??? + panic("not yet implemented") + } + + // TODO: dht.Connect has overhead due to an internal + // ping to the target. Use something else + p, err = s.Connect(maddr) + if err != nil { + // Move up route level + panic("not yet implemented.") + } + } else { + route_level++ + } } } return nil, u.ErrNotFound @@ -86,7 +111,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { func (s *IpfsDHT) Provide(key u.Key) error { peers := s.routes[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { - //return an error + return kb.ErrLookupFailure } pmes := DHTMessage{ @@ -97,7 +122,7 @@ func (s *IpfsDHT) Provide(key u.Key) error { for _, p := range peers { mes := swarm.NewMessage(p, pbmes) - s.network.Chan.Outgoing <- mes + s.network.Send(mes) } return nil } @@ -105,6 +130,9 @@ func (s *IpfsDHT) Provide(key u.Key) error { // FindProviders searches for peers who can provide the value for given key. func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { p := s.routes[0].NearestPeer(kb.ConvertKey(key)) + if p == nil { + return nil, kb.ErrLookupFailure + } pmes := DHTMessage{ Type: PBDHTMessage_GET_PROVIDERS, @@ -116,7 +144,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, listenChan := s.ListenFor(pmes.Id, 1, time.Minute) u.DOut("Find providers for: '%s'", key) - s.network.Chan.Outgoing <- mes + s.network.Send(mes) after := time.After(timeout) select { case <-after: @@ -129,17 +157,12 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, if err != nil { return nil, err } - var addrs map[u.Key]string - err = json.Unmarshal(pmes_out.GetValue(), &addrs) - if err != nil { - return nil, err - } var prov_arr []*peer.Peer - for pid, addr := range addrs { - p := s.network.Find(pid) + for _, prov := range pmes_out.GetPeers() { + p := s.network.Find(u.Key(prov.GetId())) if p == nil { - maddr, err := ma.NewMultiaddr(addr) + maddr, err := ma.NewMultiaddr(prov.GetAddr()) if err != nil { u.PErr("error connecting to new peer: %s", err) continue @@ -162,48 +185,36 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, // FindPeer searches for a peer with given ID. func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { - p := s.routes[0].NearestPeer(kb.ConvertPeerID(id)) - - pmes := DHTMessage{ - Type: PBDHTMessage_FIND_NODE, - Key: string(id), - Id: GenerateMessageID(), + route_level := 0 + p := s.routes[route_level].NearestPeer(kb.ConvertPeerID(id)) + if p == nil { + return nil, kb.ErrLookupFailure } - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - - listenChan := s.ListenFor(pmes.Id, 1, time.Minute) - s.network.Chan.Outgoing <- mes - after := time.After(timeout) - select { - case <-after: - s.Unlisten(pmes.Id) - return nil, u.ErrTimeout - case resp := <-listenChan: - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmes_out) - if err != nil { - return nil, err + for route_level < len(s.routes) { + pmes, err := s.findPeerSingle(p, id, timeout, route_level) + plist := pmes.GetPeers() + if len(plist) == 0 { + route_level++ } - addr := string(pmes_out.GetValue()) - maddr, err := ma.NewMultiaddr(addr) + found := plist[0] + + addr, err := ma.NewMultiaddr(found.GetAddr()) if err != nil { - return nil, err + return nil, u.WrapError(err, "FindPeer received bad info") } - found_peer, err := s.Connect(maddr) + nxtPeer, err := s.Connect(addr) if err != nil { - u.POut("Found peer but couldnt connect.") - return nil, err + return nil, u.WrapError(err, "FindPeer failed to connect to new peer.") } - - if !found_peer.ID.Equal(id) { - u.POut("FindPeer: searching for '%s' but found '%s'", id.Pretty(), found_peer.ID.Pretty()) - return found_peer, u.ErrSearchIncomplete + if pmes.GetSuccess() { + return nxtPeer, nil + } else { + p = nxtPeer } - - return found_peer, nil } + return nil, u.ErrNotFound } // Ping a peer, log the time it took @@ -216,14 +227,14 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { before := time.Now() response_chan := dht.ListenFor(pmes.Id, 1, time.Minute) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) tout := time.After(timeout) select { case <-response_chan: roundtrip := time.Since(before) p.SetLatency(roundtrip) - u.POut("Ping took %s.", roundtrip.String()) + u.DOut("Ping took %s.", roundtrip.String()) return nil case <-tout: // Timed out, think about removing peer from network @@ -249,7 +260,7 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { pbmes := pmes.ToProtobuf() for _, p := range targets { mes := swarm.NewMessage(p, pbmes) - dht.network.Chan.Outgoing <- mes + dht.network.Send(mes) } var out []*diagInfo diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 095d0b03e3..32ff2c269c 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -3,11 +3,16 @@ package dht import ( "bytes" "crypto/sha256" + "errors" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" ) +// Returned if a routing table query returns no results. This is NOT expected +// behaviour +var ErrLookupFailure = errors.New("failed to find any peer in table") + // ID for IpfsDHT should be a byte slice, to allow for simpler operations // (xor). DHT ids are based on the peer.IDs. // @@ -19,8 +24,8 @@ func (id ID) Equal(other ID) bool { return bytes.Equal(id, other) } -func (id ID) Less(other interface{}) bool { - a, b := equalizeSizes(id, other.(ID)) +func (id ID) Less(other ID) bool { + a, b := equalizeSizes(id, other) for i := 0; i < len(a); i++ { if a[i] != b[i] { return a[i] < b[i] @@ -80,3 +85,14 @@ func ConvertKey(id u.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } + +// Returns true if a is closer to key than b is +func Closer(a, b peer.ID, key u.Key) bool { + aid := ConvertPeerID(a) + bid := ConvertPeerID(b) + tgt := ConvertKey(key) + adist := xor(aid, tgt) + bdist := xor(bid, tgt) + + return adist.Less(bdist) +} From d72ecc1d0ecec399f66c98dab28a1d6ef2cb227f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Aug 2014 21:40:17 -0700 Subject: [PATCH 0037/3147] starting a new testing framework This commit was moved from ipfs/go-ipfs-routing@4868ae293bf406e80265d5c072a56a60d079c5e2 --- routing/dht/dht.go | 15 ++------ routing/dht/dht_test.go | 74 ++++++++++----------------------------- routing/dht/ext_test.go | 77 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 68 deletions(-) create mode 100644 routing/dht/ext_test.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 388ab9ab1c..e62b1fda84 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -66,18 +66,9 @@ type listenInfo struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(p *peer.Peer) (*IpfsDHT, error) { - if p == nil { - return nil, errors.New("nil peer passed to NewDHT()") - } - network := swarm.NewSwarm(p) - err := network.Listen() - if err != nil { - return nil, err - } - +func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht := new(IpfsDHT) - dht.network = network + dht.network = net dht.datastore = ds.NewMapDatastore() dht.self = p dht.listeners = make(map[uint64]*listenInfo) @@ -86,7 +77,7 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) { dht.routes = make([]*kb.RoutingTable, 1) dht.routes[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID)) dht.birth = time.Now() - return dht, nil + return dht } // Start up background goroutines needed by the DHT diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3d1679397b..9c198eb6b8 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -4,6 +4,7 @@ import ( "testing" peer "github.com/jbenet/go-ipfs/peer" + swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" ma "github.com/jbenet/go-multiaddr" @@ -31,10 +32,12 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) var dhts []*IpfsDHT for i := 0; i < 4; i++ { - d, err := NewDHT(peers[i]) + net := swarm.NewSwarm(peers[i]) + err := net.Listen() if err != nil { t.Fatal(err) } + d := NewDHT(peers[i], net) dhts = append(dhts, d) d.Start() } @@ -61,15 +64,19 @@ func TestPing(t *testing.T) { peer_b.AddAddress(addr_b) peer_b.ID = peer.ID([]byte("peer_b")) - dht_a, err := NewDHT(peer_a) + neta := swarm.NewSwarm(peer_a) + err = neta.Listen() if err != nil { t.Fatal(err) } + dht_a := NewDHT(peer_a, neta) - dht_b, err := NewDHT(peer_b) + netb := swarm.NewSwarm(peer_b) + err = netb.Listen() if err != nil { t.Fatal(err) } + dht_b := NewDHT(peer_b, netb) dht_a.Start() dht_b.Start() @@ -108,15 +115,19 @@ func TestValueGetSet(t *testing.T) { peer_b.AddAddress(addr_b) peer_b.ID = peer.ID([]byte("peer_b")) - dht_a, err := NewDHT(peer_a) + neta := swarm.NewSwarm(peer_a) + err = neta.Listen() if err != nil { t.Fatal(err) } + dht_a := NewDHT(peer_a, neta) - dht_b, err := NewDHT(peer_b) + netb := swarm.NewSwarm(peer_b) + err = netb.Listen() if err != nil { t.Fatal(err) } + dht_b := NewDHT(peer_b, netb) dht_a.Start() dht_b.Start() @@ -197,32 +208,7 @@ func TestProvides(t *testing.T) { func TestLayeredGet(t *testing.T) { u.Debug = false - var addrs []*ma.Multiaddr - for i := 0; i < 4; i++ { - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) - if err != nil { - t.Fatal(err) - } - addrs = append(addrs, a) - } - - var peers []*peer.Peer - for i := 0; i < 4; i++ { - p := new(peer.Peer) - p.AddAddress(addrs[i]) - p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i))) - peers = append(peers, p) - } - - var dhts []*IpfsDHT - for i := 0; i < 4; i++ { - d, err := NewDHT(peers[i]) - if err != nil { - t.Fatal(err) - } - dhts = append(dhts, d) - d.Start() - } + addrs,_,dhts := setupDHTS(4, t) _, err := dhts[0].Connect(addrs[1]) if err != nil { @@ -267,32 +253,8 @@ func TestLayeredGet(t *testing.T) { func TestFindPeer(t *testing.T) { u.Debug = false - var addrs []*ma.Multiaddr - for i := 0; i < 4; i++ { - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) - if err != nil { - t.Fatal(err) - } - addrs = append(addrs, a) - } - - var peers []*peer.Peer - for i := 0; i < 4; i++ { - p := new(peer.Peer) - p.AddAddress(addrs[i]) - p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i))) - peers = append(peers, p) - } - var dhts []*IpfsDHT - for i := 0; i < 4; i++ { - d, err := NewDHT(peers[i]) - if err != nil { - t.Fatal(err) - } - dhts = append(dhts, d) - d.Start() - } + addrs,peers,dhts := setupDHTS(4, t) _, err := dhts[0].Connect(addrs[1]) if err != nil { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go new file mode 100644 index 0000000000..dd781d8672 --- /dev/null +++ b/routing/dht/ext_test.go @@ -0,0 +1,77 @@ +package dht + +import ( + "testing" + + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" + swarm "github.com/jbenet/go-ipfs/swarm" + //ma "github.com/jbenet/go-multiaddr" + + "fmt" + "time" +) + +// fauxNet is a standin for a swarm.Network in order to more easily recreate +// different testing scenarios +type fauxNet struct { + Chan *swarm.Chan + + swarm.Network + + handlers []mesHandleFunc +} + +type mesHandleFunc func(*swarm.Message) *swarm.Message + +func newFauxNet() *fauxNet { + fn := new(fauxNet) + fn.Chan = swarm.NewChan(8) + + return fn +} + +func (f *fauxNet) Listen() error { + go func() { + for { + select { + case in := <-f.Chan.Outgoing: + for _,h := range f.handlers { + reply := h(in) + if reply != nil { + f.Chan.Incoming <- reply + break + } + } + } + } + }() + return nil +} + +func (f *fauxNet) AddHandler(fn func(*swarm.Message) *swarm.Message) { + f.handlers = append(f.handlers, fn) +} + +func (f *fauxNet) Send(mes *swarm.Message) { + +} + +func TestGetFailure(t *testing.T) { + fn := newFauxNet() + fn.Listen() + + local := new(peer.Peer) + local.ID = peer.ID([]byte("test_peer")) + + d := NewDHT(local, fn) + + d.Start() + + b, err := d.GetValue(u.Key("test"), time.Second) + if err != nil { + t.Fatal(err) + } + + fmt.Println(b) +} From 6243d14f2409b5326fa4b6e99e84cf25477d15b1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Aug 2014 09:06:20 -0700 Subject: [PATCH 0038/3147] add fauxNet to stand in for Swarm in tests to reproduce various network conditions This commit was moved from ipfs/go-ipfs-routing@f44fa212d3174540801e8cf3b4415ab91540c25f --- routing/dht/dht_test.go | 4 +-- routing/dht/ext_test.go | 64 +++++++++++++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 9c198eb6b8..2b0fb4a6b6 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -208,7 +208,7 @@ func TestProvides(t *testing.T) { func TestLayeredGet(t *testing.T) { u.Debug = false - addrs,_,dhts := setupDHTS(4, t) + addrs, _, dhts := setupDHTS(4, t) _, err := dhts[0].Connect(addrs[1]) if err != nil { @@ -254,7 +254,7 @@ func TestLayeredGet(t *testing.T) { func TestFindPeer(t *testing.T) { u.Debug = false - addrs,peers,dhts := setupDHTS(4, t) + addrs, peers, dhts := setupDHTS(4, t) _, err := dhts[0].Connect(addrs[1]) if err != nil { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index dd781d8672..4dff368864 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -3,12 +3,13 @@ package dht import ( "testing" + "code.google.com/p/goprotobuf/proto" + peer "github.com/jbenet/go-ipfs/peer" - u "github.com/jbenet/go-ipfs/util" swarm "github.com/jbenet/go-ipfs/swarm" - //ma "github.com/jbenet/go-multiaddr" + u "github.com/jbenet/go-ipfs/util" + ma "github.com/jbenet/go-multiaddr" - "fmt" "time" ) @@ -36,7 +37,7 @@ func (f *fauxNet) Listen() error { for { select { case in := <-f.Chan.Outgoing: - for _,h := range f.handlers { + for _, h := range f.handlers { reply := h(in) if reply != nil { f.Chan.Incoming <- reply @@ -54,24 +55,69 @@ func (f *fauxNet) AddHandler(fn func(*swarm.Message) *swarm.Message) { } func (f *fauxNet) Send(mes *swarm.Message) { + f.Chan.Outgoing <- mes +} +func (f *fauxNet) GetChan() *swarm.Chan { + return f.Chan } -func TestGetFailure(t *testing.T) { +func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { + return nil, nil +} + +func TestGetFailures(t *testing.T) { fn := newFauxNet() fn.Listen() local := new(peer.Peer) - local.ID = peer.ID([]byte("test_peer")) + local.ID = peer.ID("test_peer") d := NewDHT(local, fn) + other := &peer.Peer{ID: peer.ID("other_peer")} + d.Start() - b, err := d.GetValue(u.Key("test"), time.Second) + d.Update(other) + + // This one should time out + _, err := d.GetValue(u.Key("test"), time.Millisecond*5) if err != nil { - t.Fatal(err) + nerr, ok := err.(*u.IpfsError) + if !ok { + t.Fatal("Got different error than we expected.") + } + if nerr.Inner != u.ErrTimeout { + t.Fatal("Got different error than we expected.") + } + } else { + t.Fatal("Did not get expected error!") } - fmt.Println(b) + fn.AddHandler(func(mes *swarm.Message) *swarm.Message { + pmes := new(PBDHTMessage) + err := proto.Unmarshal(mes.Data, pmes) + if err != nil { + t.Fatal(err) + } + + resp := DHTMessage{ + Type: pmes.GetType(), + Id: pmes.GetId(), + Response: true, + Success: false, + } + return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + }) + + // This one should fail with NotFound + _, err = d.GetValue(u.Key("test"), time.Millisecond*5) + if err != nil { + if err != u.ErrNotFound { + t.Fatal("Expected ErrNotFound, got: %s", err) + } + } else { + t.Fatal("expected error, got none.") + } } From 9069eebb7cd579663209189b0d1d140b96322f22 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Aug 2014 20:11:23 -0700 Subject: [PATCH 0039/3147] more tests and add in table filtering by peer latency This commit was moved from ipfs/go-ipfs-routing@6a54273799a62b83fa8c89d74f5f60d5a4490dc2 --- routing/dht/dht.go | 49 +++++++++++++++++--- routing/dht/ext_test.go | 39 ++++++++++++++-- routing/dht/routing.go | 8 ++-- routing/kbucket/bucket.go | 54 ++++++++++++++-------- routing/kbucket/table.go | 30 +++++++++--- routing/kbucket/table_test.go | 87 ++++++++++++++++++++++++++++++++--- 6 files changed, 221 insertions(+), 46 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e62b1fda84..018c22a01c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -74,8 +74,12 @@ func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht.listeners = make(map[uint64]*listenInfo) dht.providers = make(map[u.Key][]*providerInfo) dht.shutdown = make(chan struct{}) - dht.routes = make([]*kb.RoutingTable, 1) - dht.routes[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID)) + + dht.routes = make([]*kb.RoutingTable, 3) + dht.routes[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) + dht.routes[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) + dht.routes[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) + dht.birth = time.Now() return dht } @@ -253,7 +257,13 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { // No providers? // Find closest peer on given cluster to desired key and reply with that info - level := pmes.GetValue()[0] // Using value field to specify cluster level + level := 0 + if len(pmes.GetValue()) < 1 { + // TODO: maybe return an error? Defaulting isnt a good idea IMO + u.PErr("handleGetValue: no routing level specified, assuming 0") + } else { + level = int(pmes.GetValue()[0]) // Using value field to specify cluster level + } closer := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) @@ -477,6 +487,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio response_chan := dht.ListenFor(pmes.Id, 1, time.Minute) mes := swarm.NewMessage(p, pmes.ToProtobuf()) + t := time.Now() dht.network.Send(mes) // Wait for either the response or a timeout @@ -490,6 +501,8 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio u.PErr("response channel closed before timeout, please investigate.") return nil, u.ErrTimeout } + roundtrip := time.Since(t) + resp.Peer.SetLatency(roundtrip) pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { @@ -513,7 +526,8 @@ func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, u.PErr("getValue error: %s", err) continue } - p, err = dht.Connect(maddr) + + p, err = dht.network.Connect(maddr) if err != nil { u.PErr("getValue error: %s", err) continue @@ -547,9 +561,21 @@ func (dht *IpfsDHT) PutLocal(key u.Key, value []byte) error { } func (dht *IpfsDHT) Update(p *peer.Peer) { - removed := dht.routes[0].Update(p) - if removed != nil { - dht.network.Drop(removed) + for _, route := range dht.routes { + removed := route.Update(p) + // Only drop the connection if no tables refer to this peer + if removed != nil { + found := false + for _, r := range dht.routes { + if r.Find(removed.ID) != nil { + found = true + break + } + } + if !found { + dht.network.Drop(removed) + } + } } } @@ -574,6 +600,7 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati mes := swarm.NewMessage(p, pmes.ToProtobuf()) listenChan := dht.ListenFor(pmes.Id, 1, time.Minute) + t := time.Now() dht.network.Send(mes) after := time.After(timeout) select { @@ -581,6 +608,8 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati dht.Unlisten(pmes.Id) return nil, u.ErrTimeout case resp := <-listenChan: + roundtrip := time.Since(t) + resp.Peer.SetLatency(roundtrip) pmes_out := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmes_out) if err != nil { @@ -590,3 +619,9 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati return pmes_out, nil } } + +func (dht *IpfsDHT) PrintTables() { + for _, route := range dht.routes { + route.Print() + } +} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 4dff368864..fbf52a2637 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,13 +16,16 @@ import ( // fauxNet is a standin for a swarm.Network in order to more easily recreate // different testing scenarios type fauxNet struct { - Chan *swarm.Chan + Chan *swarm.Chan + handlers []mesHandleFunc swarm.Network - - handlers []mesHandleFunc } +// mesHandleFunc is a function that takes in outgoing messages +// and can respond to them, simulating other peers on the network. +// returning nil will chose not to respond and pass the message onto the +// next registered handler type mesHandleFunc func(*swarm.Message) *swarm.Message func newFauxNet() *fauxNet { @@ -32,6 +35,9 @@ func newFauxNet() *fauxNet { return fn } +// Instead of 'Listening' Start up a goroutine that will check +// all outgoing messages against registered message handlers, +// and reply if needed func (f *fauxNet) Listen() error { go func() { for { @@ -95,6 +101,7 @@ func TestGetFailures(t *testing.T) { t.Fatal("Did not get expected error!") } + // Reply with failures to every message fn.AddHandler(func(mes *swarm.Message) *swarm.Message { pmes := new(PBDHTMessage) err := proto.Unmarshal(mes.Data, pmes) @@ -120,4 +127,30 @@ func TestGetFailures(t *testing.T) { } else { t.Fatal("expected error, got none.") } + + success := make(chan struct{}) + fn.handlers = nil + fn.AddHandler(func(mes *swarm.Message) *swarm.Message { + resp := new(PBDHTMessage) + err := proto.Unmarshal(mes.Data, resp) + if err != nil { + t.Fatal(err) + } + if resp.GetSuccess() { + t.Fatal("Get returned success when it shouldnt have.") + } + success <- struct{}{} + return nil + }) + + // Now we test this DHT's handleGetValue failure + req := DHTMessage{ + Type: PBDHTMessage_GET_VALUE, + Key: "hello", + Id: GenerateMessageID(), + Value: []byte{0}, + } + fn.Chan.Incoming <- swarm.NewMessage(other, req.ToProtobuf()) + + <-success } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 711866f8eb..71e9501025 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -89,9 +89,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { panic("not yet implemented") } - // TODO: dht.Connect has overhead due to an internal - // ping to the target. Use something else - p, err = s.Connect(maddr) + p, err = s.network.Connect(maddr) if err != nil { // Move up route level panic("not yet implemented.") @@ -167,7 +165,7 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, u.PErr("error connecting to new peer: %s", err) continue } - p, err = s.Connect(maddr) + p, err = s.network.Connect(maddr) if err != nil { u.PErr("error connecting to new peer: %s", err) continue @@ -204,7 +202,7 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error return nil, u.WrapError(err, "FindPeer received bad info") } - nxtPeer, err := s.Connect(addr) + nxtPeer, err := s.network.Connect(addr) if err != nil { return nil, u.WrapError(err, "FindPeer failed to connect to new peer.") } diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 5abd2c9107..1a55a0f690 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -2,16 +2,27 @@ package dht import ( "container/list" + "sync" peer "github.com/jbenet/go-ipfs/peer" ) // Bucket holds a list of peers. -type Bucket list.List +type Bucket struct { + lk sync.RWMutex + list *list.List +} + +func NewBucket() *Bucket { + b := new(Bucket) + b.list = list.New() + return b +} func (b *Bucket) Find(id peer.ID) *list.Element { - bucket_list := (*list.List)(b) - for e := bucket_list.Front(); e != nil; e = e.Next() { + b.lk.RLock() + defer b.lk.RUnlock() + for e := b.list.Front(); e != nil; e = e.Next() { if e.Value.(*peer.Peer).ID.Equal(id) { return e } @@ -20,34 +31,42 @@ func (b *Bucket) Find(id peer.ID) *list.Element { } func (b *Bucket) MoveToFront(e *list.Element) { - bucket_list := (*list.List)(b) - bucket_list.MoveToFront(e) + b.lk.Lock() + b.list.MoveToFront(e) + b.lk.Unlock() } func (b *Bucket) PushFront(p *peer.Peer) { - bucket_list := (*list.List)(b) - bucket_list.PushFront(p) + b.lk.Lock() + b.list.PushFront(p) + b.lk.Unlock() } func (b *Bucket) PopBack() *peer.Peer { - bucket_list := (*list.List)(b) - last := bucket_list.Back() - bucket_list.Remove(last) + b.lk.Lock() + defer b.lk.Unlock() + last := b.list.Back() + b.list.Remove(last) return last.Value.(*peer.Peer) } func (b *Bucket) Len() int { - bucket_list := (*list.List)(b) - return bucket_list.Len() + b.lk.RLock() + defer b.lk.RUnlock() + return b.list.Len() } // Splits a buckets peers into two buckets, the methods receiver will have // peers with CPL equal to cpl, the returned bucket will have peers with CPL // greater than cpl (returned bucket has closer peers) func (b *Bucket) Split(cpl int, target ID) *Bucket { - bucket_list := (*list.List)(b) + b.lk.Lock() + defer b.lk.Unlock() + out := list.New() - e := bucket_list.Front() + newbuck := NewBucket() + newbuck.list = out + e := b.list.Front() for e != nil { peer_id := ConvertPeerID(e.Value.(*peer.Peer).ID) peer_cpl := prefLen(peer_id, target) @@ -55,15 +74,14 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { cur := e out.PushBack(e.Value) e = e.Next() - bucket_list.Remove(cur) + b.list.Remove(cur) continue } e = e.Next() } - return (*Bucket)(out) + return newbuck } func (b *Bucket) getIter() *list.Element { - bucket_list := (*list.List)(b) - return bucket_list.Front() + return b.list.Front() } diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 788d12265f..86a7031ce8 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -2,8 +2,10 @@ package dht import ( "container/list" + "fmt" "sort" "sync" + "time" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -18,16 +20,20 @@ type RoutingTable struct { // Blanket lock, refine later for better performance tabLock sync.RWMutex + // Maximum acceptable latency for peers in this cluster + maxLatency time.Duration + // kBuckets define all the fingers to other nodes. Buckets []*Bucket bucketsize int } -func NewRoutingTable(bucketsize int, local_id ID) *RoutingTable { +func NewRoutingTable(bucketsize int, local_id ID, latency time.Duration) *RoutingTable { rt := new(RoutingTable) - rt.Buckets = []*Bucket{new(Bucket)} + rt.Buckets = []*Bucket{NewBucket()} rt.bucketsize = bucketsize rt.local = local_id + rt.maxLatency = latency return rt } @@ -48,6 +54,10 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { e := bucket.Find(p.ID) if e == nil { // New peer, add to bucket + if p.GetLatency() > rt.maxLatency { + // Connection doesnt meet requirements, skip! + return nil + } bucket.PushFront(p) // Are we past the max bucket size? @@ -150,17 +160,16 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { - plist := (*list.List)(rt.Buckets[cpl-1]) + plist := rt.Buckets[cpl-1].list peerArr = copyPeersFromList(id, peerArr, plist) } if cpl < len(rt.Buckets)-1 { - plist := (*list.List)(rt.Buckets[cpl+1]) + plist := rt.Buckets[cpl+1].list peerArr = copyPeersFromList(id, peerArr, plist) } } else { - plist := (*list.List)(bucket) - peerArr = copyPeersFromList(id, peerArr, plist) + peerArr = copyPeersFromList(id, peerArr, bucket.list) } // Sort by distance to local peer @@ -193,3 +202,12 @@ func (rt *RoutingTable) Listpeers() []*peer.Peer { } return peers } + +func (rt *RoutingTable) Print() { + fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) + rt.tabLock.RLock() + peers := rt.Listpeers() + for i, p := range peers { + fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) + } +} diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 842c925108..02d8f5e0e9 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -1,11 +1,11 @@ package dht import ( - "container/list" crand "crypto/rand" "crypto/sha256" "math/rand" "testing" + "time" peer "github.com/jbenet/go-ipfs/peer" ) @@ -27,7 +27,7 @@ func _randID() ID { // Test basic features of the bucket struct func TestBucket(t *testing.T) { - b := new(Bucket) + b := NewBucket() peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -45,7 +45,7 @@ func TestBucket(t *testing.T) { } spl := b.Split(0, ConvertPeerID(local.ID)) - llist := (*list.List)(b) + llist := b.list for e := llist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, local_id).commonPrefixLen() @@ -54,7 +54,7 @@ func TestBucket(t *testing.T) { } } - rlist := (*list.List)(spl) + rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, local_id).commonPrefixLen() @@ -67,7 +67,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID)) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -93,7 +93,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID)) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 5; i++ { @@ -110,7 +110,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID)) + rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 18; i++ { @@ -124,3 +124,76 @@ func TestTableFindMultiple(t *testing.T) { t.Fatalf("Got back different number of peers than we expected.") } } + +// Looks for race conditions in table operations. For a more 'certain' +// test, increase the loop counter from 1000 to a much higher number +// and set GOMAXPROCS above 1 +func TestTableMultithreaded(t *testing.T) { + local := peer.ID("localPeer") + tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) + var peers []*peer.Peer + for i := 0; i < 500; i++ { + peers = append(peers, _randPeer()) + } + + done := make(chan struct{}) + go func() { + for i := 0; i < 1000; i++ { + n := rand.Intn(len(peers)) + tab.Update(peers[n]) + } + done <- struct{}{} + }() + + go func() { + for i := 0; i < 1000; i++ { + n := rand.Intn(len(peers)) + tab.Update(peers[n]) + } + done <- struct{}{} + }() + + go func() { + for i := 0; i < 1000; i++ { + n := rand.Intn(len(peers)) + tab.Find(peers[n].ID) + } + done <- struct{}{} + }() + <-done + <-done + <-done +} + +func BenchmarkUpdates(b *testing.B) { + b.StopTimer() + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) + + var peers []*peer.Peer + for i := 0; i < b.N; i++ { + peers = append(peers, _randPeer()) + } + + b.StartTimer() + for i := 0; i < b.N; i++ { + tab.Update(peers[i]) + } +} + +func BenchmarkFinds(b *testing.B) { + b.StopTimer() + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) + + var peers []*peer.Peer + for i := 0; i < b.N; i++ { + peers = append(peers, _randPeer()) + tab.Update(peers[i]) + } + + b.StartTimer() + for i := 0; i < b.N; i++ { + tab.Find(peers[i].ID) + } +} From c220c54c518f6b971d8b24682734ad382ee48b64 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 12 Aug 2014 15:37:26 -0700 Subject: [PATCH 0040/3147] modify use of swarm to not make duplicate connections This commit was moved from ipfs/go-ipfs-routing@b0f6618d30151a39aa6dcfdec4718b29363010ab --- routing/dht/DHTMessage.go | 2 ++ routing/dht/dht.go | 4 ++-- routing/dht/routing.go | 26 ++++++++++++++++++++------ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/routing/dht/DHTMessage.go b/routing/dht/DHTMessage.go index 701f36687b..e2034d7e00 100644 --- a/routing/dht/DHTMessage.go +++ b/routing/dht/DHTMessage.go @@ -28,6 +28,8 @@ func peerInfo(p *peer.Peer) *PBDHTMessage_PBPeer { return pbp } +// TODO: building the protobuf message this way is a little wasteful +// Unused fields wont be omitted, find a better way to do this func (m *DHTMessage) ToProtobuf() *PBDHTMessage { pmes := new(PBDHTMessage) if m.Value != nil { diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 018c22a01c..c9b32f90b0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -93,7 +93,7 @@ func (dht *IpfsDHT) Start() { func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { maddrstr, _ := addr.String() u.DOut("Connect to new peer: %s", maddrstr) - npeer, err := dht.network.Connect(addr) + npeer, err := dht.network.ConnectNew(addr) if err != nil { return nil, err } @@ -527,7 +527,7 @@ func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, continue } - p, err = dht.network.Connect(maddr) + p, err = dht.network.GetConnection(peer.ID(pinfo.GetId()), maddr) if err != nil { u.PErr("getValue error: %s", err) continue diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 71e9501025..045b17f412 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,6 +3,7 @@ package dht import ( "bytes" "encoding/json" + "errors" "math/rand" "time" @@ -89,10 +90,10 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { panic("not yet implemented") } - p, err = s.network.Connect(maddr) + p, err = s.network.GetConnection(peer.ID(closers[0].GetId()), maddr) if err != nil { - // Move up route level - panic("not yet implemented.") + u.PErr("[%s] Failed to connect to: %s", s.self.ID.Pretty(), closers[0].GetAddr()) + route_level++ } } else { route_level++ @@ -160,12 +161,13 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, for _, prov := range pmes_out.GetPeers() { p := s.network.Find(u.Key(prov.GetId())) if p == nil { + u.DOut("given provider %s was not in our network already.", peer.ID(prov.GetId()).Pretty()) maddr, err := ma.NewMultiaddr(prov.GetAddr()) if err != nil { u.PErr("error connecting to new peer: %s", err) continue } - p, err = s.network.Connect(maddr) + p, err = s.network.GetConnection(peer.ID(prov.GetId()), maddr) if err != nil { u.PErr("error connecting to new peer: %s", err) continue @@ -183,11 +185,20 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, // FindPeer searches for a peer with given ID. func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { + // Check if were already connected to them + p, _ := s.Find(id) + if p != nil { + return p, nil + } + route_level := 0 - p := s.routes[route_level].NearestPeer(kb.ConvertPeerID(id)) + p = s.routes[route_level].NearestPeer(kb.ConvertPeerID(id)) if p == nil { return nil, kb.ErrLookupFailure } + if p.ID.Equal(id) { + return p, nil + } for route_level < len(s.routes) { pmes, err := s.findPeerSingle(p, id, timeout, route_level) @@ -202,11 +213,14 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error return nil, u.WrapError(err, "FindPeer received bad info") } - nxtPeer, err := s.network.Connect(addr) + nxtPeer, err := s.network.GetConnection(peer.ID(found.GetId()), addr) if err != nil { return nil, u.WrapError(err, "FindPeer failed to connect to new peer.") } if pmes.GetSuccess() { + if !id.Equal(nxtPeer.ID) { + return nil, errors.New("got back invalid peer from 'successful' response") + } return nxtPeer, nil } else { p = nxtPeer From d41cca04b8410b23ffde3ccd57a54bbcee1a9647 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 12 Aug 2014 22:10:44 -0700 Subject: [PATCH 0041/3147] not quite working yet, but closer This commit was moved from ipfs/go-ipfs-routing@591436962e6a6984db2d874a9a5d952cd29fe161 --- routing/dht/dht.go | 5 +++-- routing/dht/routing.go | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c9b32f90b0..04935ea824 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -158,8 +158,8 @@ func (dht *IpfsDHT) handleMessages() { } // - u.DOut("[peer: %s]", dht.self.ID.Pretty()) - u.DOut("Got message type: '%s' [id = %x, from = %s]", + u.DOut("[peer: %s]\nGot message type: '%s' [id = %x, from = %s]", + dht.self.ID.Pretty(), PBDHTMessage_MessageType_name[int32(pmes.GetType())], pmes.GetId(), mes.Peer.ID.Pretty()) switch pmes.GetType() { @@ -235,6 +235,7 @@ func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) er } func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { + u.DOut("handleGetValue for key: %s", pmes.GetKey()) dskey := ds.NewKey(pmes.GetKey()) resp := &DHTMessage{ Response: true, diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 045b17f412..6dc4aa060e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -62,11 +62,22 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) { func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { route_level := 0 + // If we have it local, dont bother doing an RPC! + // NOTE: this might not be what we want to do... + val,err := s.GetLocal(key) + if err != nil { + return val, nil + } + p := s.routes[route_level].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, kb.ErrLookupFailure } + if kb.Closer(s.self.ID, p.ID, key) { + return nil, u.ErrNotFound + } + for route_level < len(s.routes) && p != nil { pmes, err := s.getValueSingle(p, key, timeout, route_level) if err != nil { @@ -84,17 +95,21 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // We were given a closer node closers := pmes.GetPeers() if len(closers) > 0 { + if peer.ID(closers[0].GetId()).Equal(s.self.ID) { + return nil, u.ErrNotFound + } maddr, err := ma.NewMultiaddr(closers[0].GetAddr()) if err != nil { // ??? Move up route level??? panic("not yet implemented") } - p, err = s.network.GetConnection(peer.ID(closers[0].GetId()), maddr) + np, err := s.network.GetConnection(peer.ID(closers[0].GetId()), maddr) if err != nil { u.PErr("[%s] Failed to connect to: %s", s.self.ID.Pretty(), closers[0].GetAddr()) route_level++ } + p = np } else { route_level++ } @@ -159,6 +174,9 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, var prov_arr []*peer.Peer for _, prov := range pmes_out.GetPeers() { + if peer.ID(prov.GetId()).Equal(s.self.ID) { + continue + } p := s.network.Find(u.Key(prov.GetId())) if p == nil { u.DOut("given provider %s was not in our network already.", peer.ID(prov.GetId()).Pretty()) From 7ee2113410514ce0d3cf2fe68263fcfaaa006bfe Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 14 Aug 2014 08:32:17 -0700 Subject: [PATCH 0042/3147] fix a few infinitely looping RPCs This commit was moved from ipfs/go-ipfs-routing@14fb5f5d4326234f116a36c777d64e5c58bd9073 --- routing/dht/dht.go | 82 ++++++++++++++++++++++++++++++++-- routing/dht/dht_logger.go | 38 ++++++++++++++++ routing/dht/dht_test.go | 2 +- routing/dht/routing.go | 94 +++++++++++++++++++-------------------- 4 files changed, 165 insertions(+), 51 deletions(-) create mode 100644 routing/dht/dht_logger.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 04935ea824..ea8e1d861e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -244,12 +244,14 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { } iVal, err := dht.datastore.Get(dskey) if err == nil { + u.DOut("handleGetValue success!") resp.Success = true resp.Value = iVal.([]byte) } else if err == ds.ErrNotFound { // Check if we know any providers for the requested value provs, ok := dht.providers[u.Key(pmes.GetKey())] if ok && len(provs) > 0 { + u.DOut("handleGetValue returning %d provider[s]", len(provs)) for _, prov := range provs { resp.Peers = append(resp.Peers, prov.Value) } @@ -265,13 +267,21 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { } else { level = int(pmes.GetValue()[0]) // Using value field to specify cluster level } + u.DOut("handleGetValue searching level %d clusters", level) closer := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + if closer.ID.Equal(dht.self.ID) { + u.DOut("Attempted to return self! this shouldnt happen...") + resp.Peers = nil + goto out + } // If this peer is closer than the one from the table, return nil if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { resp.Peers = nil + u.DOut("handleGetValue could not find a closer node than myself.") } else { + u.DOut("handleGetValue returning a closer peer: '%s'", closer.ID.Pretty()) resp.Peers = []*peer.Peer{closer} } } @@ -280,6 +290,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { panic(err) } +out: mes := swarm.NewMessage(p, resp.ToProtobuf()) dht.network.Send(mes) } @@ -349,9 +360,17 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { providers := dht.providers[u.Key(pmes.GetKey())] dht.providerLock.RUnlock() if providers == nil || len(providers) == 0 { - // TODO: work on tiering this - closer := dht.routes[0].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) - resp.Peers = []*peer.Peer{closer} + level := 0 + if len(pmes.GetValue()) > 0 { + level = int(pmes.GetValue()[0]) + } + + closer := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { + resp.Peers = nil + } else { + resp.Peers = []*peer.Peer{closer} + } } else { for _, prov := range providers { resp.Peers = append(resp.Peers, prov.Value) @@ -626,3 +645,60 @@ func (dht *IpfsDHT) PrintTables() { route.Print() } } + +func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, timeout time.Duration) (*PBDHTMessage, error) { + pmes := DHTMessage{ + Type: PBDHTMessage_GET_PROVIDERS, + Key: string(key), + Id: GenerateMessageID(), + Value: []byte{byte(level)}, + } + + mes := swarm.NewMessage(p, pmes.ToProtobuf()) + + listenChan := dht.ListenFor(pmes.Id, 1, time.Minute) + dht.network.Send(mes) + after := time.After(timeout) + select { + case <-after: + dht.Unlisten(pmes.Id) + return nil, u.ErrTimeout + case resp := <-listenChan: + u.DOut("FindProviders: got response.") + pmes_out := new(PBDHTMessage) + err := proto.Unmarshal(resp.Data, pmes_out) + if err != nil { + return nil, err + } + + return pmes_out, nil + } +} + +func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer.Peer { + var prov_arr []*peer.Peer + for _, prov := range peers { + // Dont add outselves to the list + if peer.ID(prov.GetId()).Equal(dht.self.ID) { + continue + } + // Dont add someone who is already on the list + p := dht.network.Find(u.Key(prov.GetId())) + if p == nil { + u.DOut("given provider %s was not in our network already.", peer.ID(prov.GetId()).Pretty()) + maddr, err := ma.NewMultiaddr(prov.GetAddr()) + if err != nil { + u.PErr("error connecting to new peer: %s", err) + continue + } + p, err = dht.network.GetConnection(peer.ID(prov.GetId()), maddr) + if err != nil { + u.PErr("error connecting to new peer: %s", err) + continue + } + } + dht.addProviderEntry(key, p) + prov_arr = append(prov_arr, p) + } + return prov_arr +} diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go new file mode 100644 index 0000000000..c363add7bb --- /dev/null +++ b/routing/dht/dht_logger.go @@ -0,0 +1,38 @@ +package dht + +import ( + "encoding/json" + "time" + + u "github.com/jbenet/go-ipfs/util" +) + +type logDhtRpc struct { + Type string + Start time.Time + End time.Time + Duration time.Duration + RpcCount int + Success bool +} + +func startNewRpc(name string) *logDhtRpc { + r := new(logDhtRpc) + r.Type = name + r.Start = time.Now() + return r +} + +func (l *logDhtRpc) EndLog() { + l.End = time.Now() + l.Duration = l.End.Sub(l.Start) +} + +func (l *logDhtRpc) Print() { + b, err := json.Marshal(l) + if err != nil { + u.POut(err.Error()) + } else { + u.POut(string(b)) + } +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2b0fb4a6b6..a7e14d7038 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -156,7 +156,7 @@ func TestValueGetSet(t *testing.T) { } if string(val) != "world" { - t.Fatalf("Expected 'world' got %s", string(val)) + t.Fatalf("Expected 'world' got '%s'", string(val)) } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 6dc4aa060e..9923961d14 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -60,12 +60,19 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) { // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { + ll := startNewRpc("GET") + defer func() { + ll.EndLog() + ll.Print() + }() route_level := 0 // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... - val,err := s.GetLocal(key) - if err != nil { + val, err := s.GetLocal(key) + if err == nil { + ll.Success = true + u.DOut("Found local, returning.") return val, nil } @@ -74,11 +81,8 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { return nil, kb.ErrLookupFailure } - if kb.Closer(s.self.ID, p.ID, key) { - return nil, u.ErrNotFound - } - for route_level < len(s.routes) && p != nil { + ll.RpcCount++ pmes, err := s.getValueSingle(p, key, timeout, route_level) if err != nil { return nil, u.WrapError(err, "getValue Error") @@ -86,16 +90,19 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { if pmes.GetSuccess() { if pmes.Value == nil { // We were given provider[s] + ll.RpcCount++ return s.getFromPeerList(key, timeout, pmes.GetPeers(), route_level) } // Success! We were given the value + ll.Success = true return pmes.GetValue(), nil } else { // We were given a closer node closers := pmes.GetPeers() if len(closers) > 0 { if peer.ID(closers[0].GetId()).Equal(s.self.ID) { + u.DOut("Got myself back as a closer peer.") return nil, u.ErrNotFound } maddr, err := ma.NewMultiaddr(closers[0].GetAddr()) @@ -108,6 +115,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { if err != nil { u.PErr("[%s] Failed to connect to: %s", s.self.ID.Pretty(), closers[0].GetAddr()) route_level++ + continue } p = np } else { @@ -143,60 +151,52 @@ func (s *IpfsDHT) Provide(key u.Key) error { // FindProviders searches for peers who can provide the value for given key. func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { + ll := startNewRpc("FindProviders") + defer func() { + ll.EndLog() + ll.Print() + }() + u.DOut("Find providers for: '%s'", key) p := s.routes[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, kb.ErrLookupFailure } - pmes := DHTMessage{ - Type: PBDHTMessage_GET_PROVIDERS, - Key: string(key), - Id: GenerateMessageID(), - } - - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - - listenChan := s.ListenFor(pmes.Id, 1, time.Minute) - u.DOut("Find providers for: '%s'", key) - s.network.Send(mes) - after := time.After(timeout) - select { - case <-after: - s.Unlisten(pmes.Id) - return nil, u.ErrTimeout - case resp := <-listenChan: - u.DOut("FindProviders: got response.") - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmes_out) + for level := 0; level < len(s.routes); { + pmes, err := s.findProvidersSingle(p, key, level, timeout) if err != nil { return nil, err } - - var prov_arr []*peer.Peer - for _, prov := range pmes_out.GetPeers() { - if peer.ID(prov.GetId()).Equal(s.self.ID) { + if pmes.GetSuccess() { + provs := s.addPeerList(key, pmes.GetPeers()) + ll.Success = true + return provs, nil + } else { + closer := pmes.GetPeers() + if len(closer) == 0 { + level++ continue } - p := s.network.Find(u.Key(prov.GetId())) - if p == nil { - u.DOut("given provider %s was not in our network already.", peer.ID(prov.GetId()).Pretty()) - maddr, err := ma.NewMultiaddr(prov.GetAddr()) - if err != nil { - u.PErr("error connecting to new peer: %s", err) - continue - } - p, err = s.network.GetConnection(peer.ID(prov.GetId()), maddr) - if err != nil { - u.PErr("error connecting to new peer: %s", err) - continue - } + if peer.ID(closer[0].GetId()).Equal(s.self.ID) { + u.DOut("Got myself back as a closer peer.") + return nil, u.ErrNotFound + } + maddr, err := ma.NewMultiaddr(closer[0].GetAddr()) + if err != nil { + // ??? Move up route level??? + panic("not yet implemented") } - s.addProviderEntry(key, p) - prov_arr = append(prov_arr, p) - } - return prov_arr, nil + np, err := s.network.GetConnection(peer.ID(closer[0].GetId()), maddr) + if err != nil { + u.PErr("[%s] Failed to connect to: %s", s.self.ID.Pretty(), closer[0].GetAddr()) + level++ + continue + } + p = np + } } + return nil, u.ErrNotFound } // Find specific Peer From df3bcc0ef72bb752bea11058895c51ea6367a199 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 15 Aug 2014 09:39:38 -0700 Subject: [PATCH 0043/3147] get implementation according to kademlia spec. This commit was moved from ipfs/go-ipfs-routing@2b20a4deb656bac0087372d2abb894a3c69b7825 --- routing/dht/dht.go | 39 ++++++++++++ routing/dht/dht_logger.go | 4 +- routing/dht/ext_test.go | 12 ++-- routing/dht/routing.go | 130 ++++++++++++++++++++++++++++---------- 4 files changed, 140 insertions(+), 45 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ea8e1d861e..b00ae0a4d5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -496,6 +496,45 @@ out: dht.network.Send(mes) } +func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Duration, level int) ([]byte, []*peer.Peer, error) { + pmes, err := dht.getValueSingle(p, key, timeout, level) + if err != nil { + return nil, nil, u.WrapError(err, "getValue Error") + } + + if pmes.GetSuccess() { + if pmes.Value == nil { // We were given provider[s] + val, err := dht.getFromPeerList(key, timeout, pmes.GetPeers(), level) + if err != nil { + return nil, nil, err + } + return val, nil, nil + } + + // Success! We were given the value + return pmes.GetValue(), nil, nil + } else { + // We were given a closer node + var peers []*peer.Peer + for _, pb := range pmes.GetPeers() { + addr, err := ma.NewMultiaddr(pb.GetAddr()) + if err != nil { + u.PErr(err.Error()) + continue + } + + np, err := dht.network.GetConnection(peer.ID(pb.GetId()), addr) + if err != nil { + u.PErr(err.Error()) + continue + } + + peers = append(peers, np) + } + return nil, peers, nil + } +} + // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration, level int) (*PBDHTMessage, error) { pmes := DHTMessage{ diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go index c363add7bb..c892959f06 100644 --- a/routing/dht/dht_logger.go +++ b/routing/dht/dht_logger.go @@ -31,8 +31,8 @@ func (l *logDhtRpc) EndLog() { func (l *logDhtRpc) Print() { b, err := json.Marshal(l) if err != nil { - u.POut(err.Error()) + u.DOut(err.Error()) } else { - u.POut(string(b)) + u.DOut(string(b)) } } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index fbf52a2637..490c9f493e 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -88,13 +88,9 @@ func TestGetFailures(t *testing.T) { d.Update(other) // This one should time out - _, err := d.GetValue(u.Key("test"), time.Millisecond*5) + _, err := d.GetValue(u.Key("test"), time.Millisecond*10) if err != nil { - nerr, ok := err.(*u.IpfsError) - if !ok { - t.Fatal("Got different error than we expected.") - } - if nerr.Inner != u.ErrTimeout { + if err != u.ErrTimeout { t.Fatal("Got different error than we expected.") } } else { @@ -119,10 +115,10 @@ func TestGetFailures(t *testing.T) { }) // This one should fail with NotFound - _, err = d.GetValue(u.Key("test"), time.Millisecond*5) + _, err = d.GetValue(u.Key("test"), time.Millisecond*1000) if err != nil { if err != u.ErrNotFound { - t.Fatal("Expected ErrNotFound, got: %s", err) + t.Fatalf("Expected ErrNotFound, got: %s", err) } } else { t.Fatal("expected error, got none.") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9923961d14..2ecd8ba459 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "math/rand" + "sync" "time" proto "code.google.com/p/goprotobuf/proto" @@ -56,6 +57,30 @@ func (s *IpfsDHT) PutValue(key u.Key, value []byte) { } } +// A counter for incrementing a variable across multiple threads +type counter struct { + n int + mut sync.RWMutex +} + +func (c *counter) Increment() { + c.mut.Lock() + c.n++ + c.mut.Unlock() +} + +func (c *counter) Decrement() { + c.mut.Lock() + c.n-- + c.mut.Unlock() +} + +func (c *counter) Size() int { + c.mut.RLock() + defer c.mut.RUnlock() + return c.n +} + // GetValue searches for the value corresponding to given Key. // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete @@ -65,7 +90,6 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { ll.EndLog() ll.Print() }() - route_level := 0 // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... @@ -76,54 +100,90 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { return val, nil } - p := s.routes[route_level].NearestPeer(kb.ConvertKey(key)) - if p == nil { + route_level := 0 + closest := s.routes[route_level].NearestPeers(kb.ConvertKey(key), PoolSize) + if closest == nil || len(closest) == 0 { return nil, kb.ErrLookupFailure } - for route_level < len(s.routes) && p != nil { - ll.RpcCount++ - pmes, err := s.getValueSingle(p, key, timeout, route_level) - if err != nil { - return nil, u.WrapError(err, "getValue Error") - } + val_chan := make(chan []byte) + npeer_chan := make(chan *peer.Peer, 30) + proc_peer := make(chan *peer.Peer, 30) + err_chan := make(chan error) + after := time.After(timeout) - if pmes.GetSuccess() { - if pmes.Value == nil { // We were given provider[s] - ll.RpcCount++ - return s.getFromPeerList(key, timeout, pmes.GetPeers(), route_level) - } + for _, p := range closest { + npeer_chan <- p + } - // Success! We were given the value - ll.Success = true - return pmes.GetValue(), nil - } else { - // We were given a closer node - closers := pmes.GetPeers() - if len(closers) > 0 { - if peer.ID(closers[0].GetId()).Equal(s.self.ID) { - u.DOut("Got myself back as a closer peer.") - return nil, u.ErrNotFound + c := counter{} + + // This limit value is referred to as k in the kademlia paper + limit := 20 + count := 0 + go func() { + for { + select { + case p := <-npeer_chan: + count++ + if count >= limit { + break } - maddr, err := ma.NewMultiaddr(closers[0].GetAddr()) - if err != nil { - // ??? Move up route level??? - panic("not yet implemented") + c.Increment() + proc_peer <- p + default: + if c.Size() == 0 { + err_chan <- u.ErrNotFound } + } + } + }() - np, err := s.network.GetConnection(peer.ID(closers[0].GetId()), maddr) + process := func() { + for { + select { + case p, ok := <-proc_peer: + if !ok || p == nil { + c.Decrement() + return + } + val, peers, err := s.getValueOrPeers(p, key, timeout/4, route_level) if err != nil { - u.PErr("[%s] Failed to connect to: %s", s.self.ID.Pretty(), closers[0].GetAddr()) - route_level++ + u.DErr(err.Error()) + c.Decrement() continue } - p = np - } else { - route_level++ + if val != nil { + val_chan <- val + c.Decrement() + return + } + + for _, np := range peers { + // TODO: filter out peers that arent closer + npeer_chan <- np + } + c.Decrement() } } } - return nil, u.ErrNotFound + + concurFactor := 3 + for i := 0; i < concurFactor; i++ { + go process() + } + + select { + case val := <-val_chan: + close(npeer_chan) + return val, nil + case err := <-err_chan: + close(npeer_chan) + return nil, err + case <-after: + close(npeer_chan) + return nil, u.ErrTimeout + } } // Value provider layer of indirection. From e9eb246948e6a0c652e8a0dbdbd8f31f0efac6bb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 15 Aug 2014 22:37:53 -0700 Subject: [PATCH 0044/3147] rewrite message response listening framework This commit was moved from ipfs/go-ipfs-routing@f85c3338a2ba590eefc3852210e53635c5618100 --- routing/dht/dht.go | 117 ++++++----------------------------------- routing/dht/routing.go | 51 ++++++++++++++---- 2 files changed, 57 insertions(+), 111 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b00ae0a4d5..c28ca0a0f0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -39,10 +39,6 @@ type IpfsDHT struct { providers map[u.Key][]*providerInfo providerLock sync.RWMutex - // map of channels waiting for reply messages - listeners map[uint64]*listenInfo - listenLock sync.RWMutex - // Signal to shutdown dht shutdown chan struct{} @@ -51,18 +47,9 @@ type IpfsDHT struct { //lock to make diagnostics work better diaglock sync.Mutex -} - -// The listen info struct holds information about a message that is being waited for -type listenInfo struct { - // Responses matching the listen ID will be sent through resp - resp chan *swarm.Message - - // count is the number of responses to listen for - count int - // eol is the time at which this listener will expire - eol time.Time + // listener is a server to register to listen for responses to messages + listener *MesListener } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -71,7 +58,6 @@ func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht.network = net dht.datastore = ds.NewMapDatastore() dht.self = p - dht.listeners = make(map[uint64]*listenInfo) dht.providers = make(map[u.Key][]*providerInfo) dht.shutdown = make(chan struct{}) @@ -80,6 +66,7 @@ func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht.routes[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) dht.routes[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) + dht.listener = NewMesListener() dht.birth = time.Now() return dht } @@ -135,25 +122,7 @@ func (dht *IpfsDHT) handleMessages() { // Note: not sure if this is the correct place for this if pmes.GetResponse() { - dht.listenLock.RLock() - list, ok := dht.listeners[pmes.GetId()] - dht.listenLock.RUnlock() - if time.Now().After(list.eol) { - dht.Unlisten(pmes.GetId()) - ok = false - } - if list.count > 1 { - list.count-- - } - if ok { - list.resp <- mes - if list.count == 1 { - dht.Unlisten(pmes.GetId()) - } - } else { - u.DOut("Received response with nobody listening...") - } - + dht.listener.Respond(pmes.GetId(), mes) continue } // @@ -187,7 +156,6 @@ func (dht *IpfsDHT) handleMessages() { case <-checkTimeouts.C: // Time to collect some garbage! dht.cleanExpiredProviders() - dht.cleanExpiredListeners() } } } @@ -206,21 +174,6 @@ func (dht *IpfsDHT) cleanExpiredProviders() { dht.providerLock.Unlock() } -func (dht *IpfsDHT) cleanExpiredListeners() { - dht.listenLock.Lock() - var remove []uint64 - now := time.Now() - for k, v := range dht.listeners { - if now.After(v.eol) { - remove = append(remove, k) - } - } - for _, k := range remove { - delete(dht.listeners, k) - } - dht.listenLock.Unlock() -} - func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { pmes := DHTMessage{ Type: PBDHTMessage_PUT_VALUE, @@ -393,41 +346,6 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *PBDHTMessage) { dht.addProviderEntry(key, p) } -// Register a handler for a specific message ID, used for getting replies -// to certain messages (i.e. response to a GET_VALUE message) -func (dht *IpfsDHT) ListenFor(mesid uint64, count int, timeout time.Duration) <-chan *swarm.Message { - lchan := make(chan *swarm.Message) - dht.listenLock.Lock() - dht.listeners[mesid] = &listenInfo{lchan, count, time.Now().Add(timeout)} - dht.listenLock.Unlock() - return lchan -} - -// Unregister the given message id from the listener map -func (dht *IpfsDHT) Unlisten(mesid uint64) { - dht.listenLock.Lock() - list, ok := dht.listeners[mesid] - if ok { - delete(dht.listeners, mesid) - } - dht.listenLock.Unlock() - close(list.resp) -} - -// Check whether or not the dht is currently listening for mesid -func (dht *IpfsDHT) IsListening(mesid uint64) bool { - dht.listenLock.RLock() - li, ok := dht.listeners[mesid] - dht.listenLock.RUnlock() - if time.Now().After(li.eol) { - dht.listenLock.Lock() - delete(dht.listeners, mesid) - dht.listenLock.Unlock() - return false - } - return ok -} - // Stop all communications from this peer and shut down func (dht *IpfsDHT) Halt() { dht.shutdown <- struct{}{} @@ -444,16 +362,8 @@ func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { // NOTE: not yet finished, low priority func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { - dht.diaglock.Lock() - if dht.IsListening(pmes.GetId()) { - //TODO: ehhh.......... - dht.diaglock.Unlock() - return - } - dht.diaglock.Unlock() - seq := dht.routes[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - listenChan := dht.ListenFor(pmes.GetId(), len(seq), time.Second*30) + listenChan := dht.listener.Listen(pmes.GetId(), len(seq), time.Second*30) for _, ps := range seq { mes := swarm.NewMessage(ps, pmes) @@ -499,7 +409,7 @@ out: func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Duration, level int) ([]byte, []*peer.Peer, error) { pmes, err := dht.getValueSingle(p, key, timeout, level) if err != nil { - return nil, nil, u.WrapError(err, "getValue Error") + return nil, nil, err } if pmes.GetSuccess() { @@ -517,6 +427,9 @@ func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Durati // We were given a closer node var peers []*peer.Peer for _, pb := range pmes.GetPeers() { + if peer.ID(pb.GetId()).Equal(dht.self.ID) { + continue + } addr, err := ma.NewMultiaddr(pb.GetAddr()) if err != nil { u.PErr(err.Error()) @@ -543,7 +456,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio Value: []byte{byte(level)}, Id: GenerateMessageID(), } - response_chan := dht.ListenFor(pmes.Id, 1, time.Minute) + response_chan := dht.listener.Listen(pmes.Id, 1, time.Minute) mes := swarm.NewMessage(p, pmes.ToProtobuf()) t := time.Now() @@ -553,7 +466,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio timeup := time.After(timeout) select { case <-timeup: - dht.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.Id) return nil, u.ErrTimeout case resp, ok := <-response_chan: if !ok { @@ -658,13 +571,13 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati } mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listenChan := dht.ListenFor(pmes.Id, 1, time.Minute) + listenChan := dht.listener.Listen(pmes.Id, 1, time.Minute) t := time.Now() dht.network.Send(mes) after := time.After(timeout) select { case <-after: - dht.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.Id) return nil, u.ErrTimeout case resp := <-listenChan: roundtrip := time.Since(t) @@ -695,12 +608,12 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listenChan := dht.ListenFor(pmes.Id, 1, time.Minute) + listenChan := dht.listener.Listen(pmes.Id, 1, time.Minute) dht.network.Send(mes) after := time.After(timeout) select { case <-after: - dht.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.Id) return nil, u.ErrTimeout case resp := <-listenChan: u.DOut("FindProviders: got response.") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2ecd8ba459..e56a54e0ce 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -81,6 +81,36 @@ func (c *counter) Size() int { return c.n } +type peerSet struct { + ps map[string]bool + lk sync.RWMutex +} + +func newPeerSet() *peerSet { + ps := new(peerSet) + ps.ps = make(map[string]bool) + return ps +} + +func (ps *peerSet) Add(p *peer.Peer) { + ps.lk.Lock() + ps.ps[string(p.ID)] = true + ps.lk.Unlock() +} + +func (ps *peerSet) Contains(p *peer.Peer) bool { + ps.lk.RLock() + _, ok := ps.ps[string(p.ID)] + ps.lk.RUnlock() + return ok +} + +func (ps *peerSet) Size() int { + ps.lk.RLock() + defer ps.lk.RUnlock() + return len(ps.ps) +} + // GetValue searches for the value corresponding to given Key. // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete @@ -111,8 +141,10 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { proc_peer := make(chan *peer.Peer, 30) err_chan := make(chan error) after := time.After(timeout) + pset := newPeerSet() for _, p := range closest { + pset.Add(p) npeer_chan <- p } @@ -130,6 +162,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { break } c.Increment() + proc_peer <- p default: if c.Size() == 0 { @@ -161,7 +194,10 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { for _, np := range peers { // TODO: filter out peers that arent closer - npeer_chan <- np + if !pset.Contains(np) && pset.Size() < limit { + pset.Add(np) //This is racey... make a single function to do operation + npeer_chan <- np + } } c.Decrement() } @@ -175,13 +211,10 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { select { case val := <-val_chan: - close(npeer_chan) return val, nil case err := <-err_chan: - close(npeer_chan) return nil, err case <-after: - close(npeer_chan) return nil, u.ErrTimeout } } @@ -288,12 +321,12 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error addr, err := ma.NewMultiaddr(found.GetAddr()) if err != nil { - return nil, u.WrapError(err, "FindPeer received bad info") + return nil, err } nxtPeer, err := s.network.GetConnection(peer.ID(found.GetId()), addr) if err != nil { - return nil, u.WrapError(err, "FindPeer failed to connect to new peer.") + return nil, err } if pmes.GetSuccess() { if !id.Equal(nxtPeer.ID) { @@ -316,7 +349,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { mes := swarm.NewMessage(p, pmes.ToProtobuf()) before := time.Now() - response_chan := dht.ListenFor(pmes.Id, 1, time.Minute) + response_chan := dht.listener.Listen(pmes.Id, 1, time.Minute) dht.network.Send(mes) tout := time.After(timeout) @@ -329,7 +362,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { case <-tout: // Timed out, think about removing peer from network u.DOut("Ping peer timed out.") - dht.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.Id) return u.ErrTimeout } } @@ -345,7 +378,7 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { Id: GenerateMessageID(), } - listenChan := dht.ListenFor(pmes.Id, len(targets), time.Minute*2) + listenChan := dht.listener.Listen(pmes.Id, len(targets), time.Minute*2) pbmes := pmes.ToProtobuf() for _, p := range targets { From 102df0192196e6f0ba702e2ba6e1a92462409aa5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 16 Aug 2014 08:20:29 -0700 Subject: [PATCH 0045/3147] add files i forgot to last night This commit was moved from ipfs/go-ipfs-routing@f054a9ed517c6883442463fc401dd702357db382 --- routing/dht/mes_listener.go | 116 ++++++++++++++++++++++++++++++++++++ routing/dht/routing.go | 44 +++++++------- 2 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 routing/dht/mes_listener.go diff --git a/routing/dht/mes_listener.go b/routing/dht/mes_listener.go new file mode 100644 index 0000000000..2fcd99fc1c --- /dev/null +++ b/routing/dht/mes_listener.go @@ -0,0 +1,116 @@ +package dht + +import ( + "sync" + "time" + + swarm "github.com/jbenet/go-ipfs/swarm" + u "github.com/jbenet/go-ipfs/util" +) + +type MesListener struct { + listeners map[uint64]*listenInfo + haltchan chan struct{} + unlist chan uint64 + nlist chan *listenInfo + send chan *respMes +} + +// The listen info struct holds information about a message that is being waited for +type listenInfo struct { + // Responses matching the listen ID will be sent through resp + resp chan *swarm.Message + + // count is the number of responses to listen for + count int + + // eol is the time at which this listener will expire + eol time.Time + + // sendlock is used to prevent conditions where we try to send on the resp + // channel as its being closed by a timeout in another thread + sendLock sync.Mutex + + closed bool + + id uint64 +} + +func NewMesListener() *MesListener { + ml := new(MesListener) + ml.haltchan = make(chan struct{}) + ml.listeners = make(map[uint64]*listenInfo) + ml.nlist = make(chan *listenInfo, 16) + ml.send = make(chan *respMes, 16) + ml.unlist = make(chan uint64, 16) + go ml.run() + return ml +} + +func (ml *MesListener) Listen(id uint64, count int, timeout time.Duration) <-chan *swarm.Message { + li := new(listenInfo) + li.count = count + li.eol = time.Now().Add(timeout) + li.resp = make(chan *swarm.Message, count) + li.id = id + ml.nlist <- li + return li.resp +} + +func (ml *MesListener) Unlisten(id uint64) { + ml.unlist <- id +} + +type respMes struct { + id uint64 + mes *swarm.Message +} + +func (ml *MesListener) Respond(id uint64, mes *swarm.Message) { + ml.send <- &respMes{ + id: id, + mes: mes, + } +} + +func (ml *MesListener) Halt() { + ml.haltchan <- struct{}{} +} + +func (ml *MesListener) run() { + for { + select { + case <-ml.haltchan: + return + case id := <-ml.unlist: + trg, ok := ml.listeners[id] + if !ok { + continue + } + close(trg.resp) + delete(ml.listeners, id) + case li := <-ml.nlist: + ml.listeners[li.id] = li + case s := <-ml.send: + trg, ok := ml.listeners[s.id] + if !ok { + u.DOut("Send with no listener.") + continue + } + + if time.Now().After(trg.eol) { + close(trg.resp) + delete(ml.listeners, s.id) + continue + } + + trg.resp <- s.mes + trg.count-- + + if trg.count == 0 { + close(trg.resp) + delete(ml.listeners, s.id) + } + } + } +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e56a54e0ce..309962a930 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -21,6 +21,12 @@ import ( // Pool size is the number of nodes used for group find/set RPC calls var PoolSize = 6 +// We put the 'K' in kademlia! +var KValue = 10 + +// Its in the paper, i swear +var AlphaValue = 3 + // TODO: determine a way of creating and managing message IDs func GenerateMessageID() uint64 { //return (uint64(rand.Uint32()) << 32) & uint64(rand.Uint32()) @@ -35,24 +41,25 @@ func GenerateMessageID() uint64 { // This is the top level "Store" operation of the DHT func (s *IpfsDHT) PutValue(key u.Key, value []byte) { complete := make(chan struct{}) + count := 0 for _, route := range s.routes { - p := route.NearestPeer(kb.ConvertKey(key)) - if p == nil { - s.network.Error(kb.ErrLookupFailure) - go func() { + peers := route.NearestPeers(kb.ConvertKey(key), KValue) + for _, p := range peers { + if p == nil { + s.network.Error(kb.ErrLookupFailure) + continue + } + count++ + go func(sp *peer.Peer) { + err := s.putValueToNetwork(sp, string(key), value) + if err != nil { + s.network.Error(err) + } complete <- struct{}{} - }() - continue + }(p) } - go func() { - err := s.putValueToNetwork(p, string(key), value) - if err != nil { - s.network.Error(err) - } - complete <- struct{}{} - }() } - for _, _ = range s.routes { + for i := 0; i < count; i++ { <-complete } } @@ -150,15 +157,13 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { c := counter{} - // This limit value is referred to as k in the kademlia paper - limit := 20 count := 0 go func() { for { select { case p := <-npeer_chan: count++ - if count >= limit { + if count >= KValue { break } c.Increment() @@ -194,7 +199,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { for _, np := range peers { // TODO: filter out peers that arent closer - if !pset.Contains(np) && pset.Size() < limit { + if !pset.Contains(np) && pset.Size() < KValue { pset.Add(np) //This is racey... make a single function to do operation npeer_chan <- np } @@ -204,8 +209,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { } } - concurFactor := 3 - for i := 0; i < concurFactor; i++ { + for i := 0; i < AlphaValue; i++ { go process() } From a07b0942b86839341dc6fa2be31a06cdec7504ee Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 16 Aug 2014 18:06:14 -0700 Subject: [PATCH 0046/3147] POut should not have a newline This commit was moved from ipfs/go-ipfs-routing@da9107320d642e7c0af41bd624a344aad32015a4 --- routing/kbucket/table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 86a7031ce8..d0137c6d75 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -116,7 +116,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } peerArr = append(peerArr, &pd) if e == nil { - u.POut("list element was nil.") + u.POut("list element was nil.\n") return peerArr } } From 876b58a8c382d7e3755afa53891356fa3f37ef14 Mon Sep 17 00:00:00 2001 From: Chas Leichner Date: Sat, 16 Aug 2014 23:03:36 -0700 Subject: [PATCH 0047/3147] Made the DHT module pass golint This commit was moved from ipfs/go-ipfs-routing@3a8c02460b79dc77d8a9ce0cdfdc4dd534318d28 --- routing/dht/{DHTMessage.go => Message.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename routing/dht/{DHTMessage.go => Message.go} (100%) diff --git a/routing/dht/DHTMessage.go b/routing/dht/Message.go similarity index 100% rename from routing/dht/DHTMessage.go rename to routing/dht/Message.go From 8b2c678d076725ee564ff2f988a7cb60a28378e7 Mon Sep 17 00:00:00 2001 From: Chas Leichner Date: Sat, 16 Aug 2014 23:03:36 -0700 Subject: [PATCH 0048/3147] Made the DHT module pass golint This commit was moved from ipfs/go-ipfs-routing@db5b20dc3c79a83e261bf6231ec801b34ef50074 --- routing/dht/Message.go | 11 +-- routing/dht/dht.go | 162 +++++++++++++++++----------------- routing/dht/dht_logger.go | 12 +-- routing/dht/dht_test.go | 74 ++++++++-------- routing/dht/diag.go | 8 +- routing/dht/mes_listener.go | 16 ++-- routing/dht/messages.pb.go | 23 ++--- routing/dht/routing.go | 158 ++++++++++++++++----------------- routing/kbucket/bucket.go | 22 ++--- routing/kbucket/table.go | 76 ++++++++-------- routing/kbucket/table_test.go | 38 ++++---- routing/kbucket/util.go | 18 ++-- routing/routing.go | 3 +- 13 files changed, 312 insertions(+), 309 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index e2034d7e00..71a9537f96 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -4,13 +4,13 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) -// A helper struct to make working with protbuf types easier -type DHTMessage struct { +// Message is a a helper struct which makes working with protbuf types easier +type Message struct { Type PBDHTMessage_MessageType Key string Value []byte Response bool - Id uint64 + ID uint64 Success bool Peers []*peer.Peer } @@ -28,9 +28,10 @@ func peerInfo(p *peer.Peer) *PBDHTMessage_PBPeer { return pbp } +// ToProtobuf takes a Message and produces a protobuf with it. // TODO: building the protobuf message this way is a little wasteful // Unused fields wont be omitted, find a better way to do this -func (m *DHTMessage) ToProtobuf() *PBDHTMessage { +func (m *Message) ToProtobuf() *PBDHTMessage { pmes := new(PBDHTMessage) if m.Value != nil { pmes.Value = m.Value @@ -39,7 +40,7 @@ func (m *DHTMessage) ToProtobuf() *PBDHTMessage { pmes.Type = &m.Type pmes.Key = &m.Key pmes.Response = &m.Response - pmes.Id = &m.Id + pmes.Id = &m.ID pmes.Success = &m.Success for _, p := range m.Peers { pmes.Peers = append(pmes.Peers, peerInfo(p)) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c28ca0a0f0..901f1a861a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -25,7 +25,7 @@ import ( type IpfsDHT struct { // Array of routing tables for differently distanced nodes // NOTE: (currently, only a single table is used) - routes []*kb.RoutingTable + routingTables []*kb.RoutingTable network swarm.Network @@ -49,7 +49,7 @@ type IpfsDHT struct { diaglock sync.Mutex // listener is a server to register to listen for responses to messages - listener *MesListener + listener *mesListener } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -61,12 +61,11 @@ func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht.providers = make(map[u.Key][]*providerInfo) dht.shutdown = make(chan struct{}) - dht.routes = make([]*kb.RoutingTable, 3) - dht.routes[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) - dht.routes[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) - dht.routes[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) - - dht.listener = NewMesListener() + dht.routingTables = make([]*kb.RoutingTable, 3) + dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) + dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) + dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) + dht.listener = newMesListener() dht.birth = time.Now() return dht } @@ -175,11 +174,11 @@ func (dht *IpfsDHT) cleanExpiredProviders() { } func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { - pmes := DHTMessage{ + pmes := Message{ Type: PBDHTMessage_PUT_VALUE, Key: key, Value: value, - Id: GenerateMessageID(), + ID: GenerateMessageID(), } mes := swarm.NewMessage(p, pmes.ToProtobuf()) @@ -190,9 +189,9 @@ func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) er func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { u.DOut("handleGetValue for key: %s", pmes.GetKey()) dskey := ds.NewKey(pmes.GetKey()) - resp := &DHTMessage{ + resp := &Message{ Response: true, - Id: pmes.GetId(), + ID: pmes.GetId(), Key: pmes.GetKey(), } iVal, err := dht.datastore.Get(dskey) @@ -222,7 +221,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { } u.DOut("handleGetValue searching level %d clusters", level) - closer := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + closer := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if closer.ID.Equal(dht.self.ID) { u.DOut("Attempted to return self! this shouldnt happen...") @@ -259,19 +258,19 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *PBDHTMessage) { } func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { - resp := DHTMessage{ + resp := Message{ Type: pmes.GetType(), Response: true, - Id: pmes.GetId(), + ID: pmes.GetId(), } dht.network.Send(swarm.NewMessage(p, resp.ToProtobuf())) } func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { - resp := DHTMessage{ + resp := Message{ Type: pmes.GetType(), - Id: pmes.GetId(), + ID: pmes.GetId(), Response: true, } defer func() { @@ -280,7 +279,7 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { }() level := pmes.GetValue()[0] u.DOut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) - closest := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + closest := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if closest == nil { u.PErr("handleFindPeer: could not find anything.") return @@ -302,10 +301,10 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { } func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { - resp := DHTMessage{ + resp := Message{ Type: PBDHTMessage_GET_PROVIDERS, Key: pmes.GetKey(), - Id: pmes.GetId(), + ID: pmes.GetId(), Response: true, } @@ -318,7 +317,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { level = int(pmes.GetValue()[0]) } - closer := dht.routes[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + closer := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { resp.Peers = nil } else { @@ -346,7 +345,7 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *PBDHTMessage) { dht.addProviderEntry(key, p) } -// Stop all communications from this peer and shut down +// Halt stops all communications from this peer and shut down func (dht *IpfsDHT) Halt() { dht.shutdown <- struct{}{} dht.network.Close() @@ -362,7 +361,7 @@ func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { // NOTE: not yet finished, low priority func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { - seq := dht.routes[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) + seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) listenChan := dht.listener.Listen(pmes.GetId(), len(seq), time.Second*30) for _, ps := range seq { @@ -382,22 +381,22 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { case <-after: //Timeout, return what we have goto out - case req_resp := <-listenChan: - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(req_resp.Data, pmes_out) + case reqResp := <-listenChan: + pmesOut := new(PBDHTMessage) + err := proto.Unmarshal(reqResp.Data, pmesOut) if err != nil { // It broke? eh, whatever, keep going continue } - buf.Write(req_resp.Data) + buf.Write(reqResp.Data) count-- } } out: - resp := DHTMessage{ + resp := Message{ Type: PBDHTMessage_DIAGNOSTIC, - Id: pmes.GetId(), + ID: pmes.GetId(), Value: buf.Bytes(), Response: true, } @@ -423,40 +422,40 @@ func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Durati // Success! We were given the value return pmes.GetValue(), nil, nil - } else { - // We were given a closer node - var peers []*peer.Peer - for _, pb := range pmes.GetPeers() { - if peer.ID(pb.GetId()).Equal(dht.self.ID) { - continue - } - addr, err := ma.NewMultiaddr(pb.GetAddr()) - if err != nil { - u.PErr(err.Error()) - continue - } + } - np, err := dht.network.GetConnection(peer.ID(pb.GetId()), addr) - if err != nil { - u.PErr(err.Error()) - continue - } + // We were given a closer node + var peers []*peer.Peer + for _, pb := range pmes.GetPeers() { + if peer.ID(pb.GetId()).Equal(dht.self.ID) { + continue + } + addr, err := ma.NewMultiaddr(pb.GetAddr()) + if err != nil { + u.PErr(err.Error()) + continue + } - peers = append(peers, np) + np, err := dht.network.GetConnection(peer.ID(pb.GetId()), addr) + if err != nil { + u.PErr(err.Error()) + continue } - return nil, peers, nil + + peers = append(peers, np) } + return nil, peers, nil } // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration, level int) (*PBDHTMessage, error) { - pmes := DHTMessage{ + pmes := Message{ Type: PBDHTMessage_GET_VALUE, Key: string(key), Value: []byte{byte(level)}, - Id: GenerateMessageID(), + ID: GenerateMessageID(), } - response_chan := dht.listener.Listen(pmes.Id, 1, time.Minute) + responseChan := dht.listener.Listen(pmes.ID, 1, time.Minute) mes := swarm.NewMessage(p, pmes.ToProtobuf()) t := time.Now() @@ -466,21 +465,21 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio timeup := time.After(timeout) select { case <-timeup: - dht.listener.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.ID) return nil, u.ErrTimeout - case resp, ok := <-response_chan: + case resp, ok := <-responseChan: if !ok { u.PErr("response channel closed before timeout, please investigate.") return nil, u.ErrTimeout } roundtrip := time.Since(t) resp.Peer.SetLatency(roundtrip) - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmes_out) + pmesOut := new(PBDHTMessage) + err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { return nil, err } - return pmes_out, nil + return pmesOut, nil } } @@ -520,7 +519,7 @@ func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, return nil, u.ErrNotFound } -func (dht *IpfsDHT) GetLocal(key u.Key) ([]byte, error) { +func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { v, err := dht.datastore.Get(ds.NewKey(string(key))) if err != nil { return nil, err @@ -528,17 +527,18 @@ func (dht *IpfsDHT) GetLocal(key u.Key) ([]byte, error) { return v.([]byte), nil } -func (dht *IpfsDHT) PutLocal(key u.Key, value []byte) error { +func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { return dht.datastore.Put(ds.NewKey(string(key)), value) } +// Update TODO(chas) Document this function func (dht *IpfsDHT) Update(p *peer.Peer) { - for _, route := range dht.routes { + for _, route := range dht.routingTables { removed := route.Update(p) // Only drop the connection if no tables refer to this peer if removed != nil { found := false - for _, r := range dht.routes { + for _, r := range dht.routingTables { if r.Find(removed.ID) != nil { found = true break @@ -551,9 +551,9 @@ func (dht *IpfsDHT) Update(p *peer.Peer) { } } -// Look for a peer with a given ID connected to this dht +// Find looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. func (dht *IpfsDHT) Find(id peer.ID) (*peer.Peer, *kb.RoutingTable) { - for _, table := range dht.routes { + for _, table := range dht.routingTables { p := table.Find(id) if p != nil { return p, table @@ -563,72 +563,72 @@ func (dht *IpfsDHT) Find(id peer.ID) (*peer.Peer, *kb.RoutingTable) { } func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Duration, level int) (*PBDHTMessage, error) { - pmes := DHTMessage{ + pmes := Message{ Type: PBDHTMessage_FIND_NODE, Key: string(id), - Id: GenerateMessageID(), + ID: GenerateMessageID(), Value: []byte{byte(level)}, } mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listenChan := dht.listener.Listen(pmes.Id, 1, time.Minute) + listenChan := dht.listener.Listen(pmes.ID, 1, time.Minute) t := time.Now() dht.network.Send(mes) after := time.After(timeout) select { case <-after: - dht.listener.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.ID) return nil, u.ErrTimeout case resp := <-listenChan: roundtrip := time.Since(t) resp.Peer.SetLatency(roundtrip) - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmes_out) + pmesOut := new(PBDHTMessage) + err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { return nil, err } - return pmes_out, nil + return pmesOut, nil } } -func (dht *IpfsDHT) PrintTables() { - for _, route := range dht.routes { +func (dht *IpfsDHT) printTables() { + for _, route := range dht.routingTables { route.Print() } } func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, timeout time.Duration) (*PBDHTMessage, error) { - pmes := DHTMessage{ + pmes := Message{ Type: PBDHTMessage_GET_PROVIDERS, Key: string(key), - Id: GenerateMessageID(), + ID: GenerateMessageID(), Value: []byte{byte(level)}, } mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listenChan := dht.listener.Listen(pmes.Id, 1, time.Minute) + listenChan := dht.listener.Listen(pmes.ID, 1, time.Minute) dht.network.Send(mes) after := time.After(timeout) select { case <-after: - dht.listener.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.ID) return nil, u.ErrTimeout case resp := <-listenChan: u.DOut("FindProviders: got response.") - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmes_out) + pmesOut := new(PBDHTMessage) + err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { return nil, err } - return pmes_out, nil + return pmesOut, nil } } func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer.Peer { - var prov_arr []*peer.Peer + var provArr []*peer.Peer for _, prov := range peers { // Dont add outselves to the list if peer.ID(prov.GetId()).Equal(dht.self.ID) { @@ -650,7 +650,7 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer } } dht.addProviderEntry(key, p) - prov_arr = append(prov_arr, p) + provArr = append(provArr, p) } - return prov_arr + return provArr } diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go index c892959f06..4a02fc3047 100644 --- a/routing/dht/dht_logger.go +++ b/routing/dht/dht_logger.go @@ -7,28 +7,28 @@ import ( u "github.com/jbenet/go-ipfs/util" ) -type logDhtRpc struct { +type logDhtRPC struct { Type string Start time.Time End time.Time Duration time.Duration - RpcCount int + RPCCount int Success bool } -func startNewRpc(name string) *logDhtRpc { - r := new(logDhtRpc) +func startNewRPC(name string) *logDhtRPC { + r := new(logDhtRPC) r.Type = name r.Start = time.Now() return r } -func (l *logDhtRpc) EndLog() { +func (l *logDhtRPC) EndLog() { l.End = time.Now() l.Duration = l.End.Sub(l.Start) } -func (l *logDhtRpc) Print() { +func (l *logDhtRPC) Print() { b, err := json.Marshal(l) if err != nil { u.DOut(err.Error()) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index a7e14d7038..581e192771 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -47,93 +47,93 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) func TestPing(t *testing.T) { u.Debug = false - addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") if err != nil { t.Fatal(err) } - addr_b, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") if err != nil { t.Fatal(err) } - peer_a := new(peer.Peer) - peer_a.AddAddress(addr_a) - peer_a.ID = peer.ID([]byte("peer_a")) + peerA := new(peer.Peer) + peerA.AddAddress(addrA) + peerA.ID = peer.ID([]byte("peerA")) - peer_b := new(peer.Peer) - peer_b.AddAddress(addr_b) - peer_b.ID = peer.ID([]byte("peer_b")) + peerB := new(peer.Peer) + peerB.AddAddress(addrB) + peerB.ID = peer.ID([]byte("peerB")) - neta := swarm.NewSwarm(peer_a) + neta := swarm.NewSwarm(peerA) err = neta.Listen() if err != nil { t.Fatal(err) } - dht_a := NewDHT(peer_a, neta) + dhtA := NewDHT(peerA, neta) - netb := swarm.NewSwarm(peer_b) + netb := swarm.NewSwarm(peerB) err = netb.Listen() if err != nil { t.Fatal(err) } - dht_b := NewDHT(peer_b, netb) + dhtB := NewDHT(peerB, netb) - dht_a.Start() - dht_b.Start() + dhtA.Start() + dhtB.Start() - _, err = dht_a.Connect(addr_b) + _, err = dhtA.Connect(addrB) if err != nil { t.Fatal(err) } //Test that we can ping the node - err = dht_a.Ping(peer_b, time.Second*2) + err = dhtA.Ping(peerB, time.Second*2) if err != nil { t.Fatal(err) } - dht_a.Halt() - dht_b.Halt() + dhtA.Halt() + dhtB.Halt() } func TestValueGetSet(t *testing.T) { u.Debug = false - addr_a, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") if err != nil { t.Fatal(err) } - addr_b, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") if err != nil { t.Fatal(err) } - peer_a := new(peer.Peer) - peer_a.AddAddress(addr_a) - peer_a.ID = peer.ID([]byte("peer_a")) + peerA := new(peer.Peer) + peerA.AddAddress(addrA) + peerA.ID = peer.ID([]byte("peerA")) - peer_b := new(peer.Peer) - peer_b.AddAddress(addr_b) - peer_b.ID = peer.ID([]byte("peer_b")) + peerB := new(peer.Peer) + peerB.AddAddress(addrB) + peerB.ID = peer.ID([]byte("peerB")) - neta := swarm.NewSwarm(peer_a) + neta := swarm.NewSwarm(peerA) err = neta.Listen() if err != nil { t.Fatal(err) } - dht_a := NewDHT(peer_a, neta) + dhtA := NewDHT(peerA, neta) - netb := swarm.NewSwarm(peer_b) + netb := swarm.NewSwarm(peerB) err = netb.Listen() if err != nil { t.Fatal(err) } - dht_b := NewDHT(peer_b, netb) + dhtB := NewDHT(peerB, netb) - dht_a.Start() - dht_b.Start() + dhtA.Start() + dhtB.Start() - errsa := dht_a.network.GetChan().Errors - errsb := dht_b.network.GetChan().Errors + errsa := dhtA.network.GetChan().Errors + errsb := dhtB.network.GetChan().Errors go func() { select { case err := <-errsa: @@ -143,14 +143,14 @@ func TestValueGetSet(t *testing.T) { } }() - _, err = dht_a.Connect(addr_b) + _, err = dhtA.Connect(addrB) if err != nil { t.Fatal(err) } - dht_a.PutValue("hello", []byte("world")) + dhtA.PutValue("hello", []byte("world")) - val, err := dht_a.GetValue("hello", time.Second*2) + val, err := dhtA.GetValue("hello", time.Second*2) if err != nil { t.Fatal(err) } diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 03997c5e78..d6bc6bacf8 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -9,11 +9,11 @@ import ( type connDiagInfo struct { Latency time.Duration - Id peer.ID + ID peer.ID } type diagInfo struct { - Id peer.ID + ID peer.ID Connections []connDiagInfo Keys []string LifeSpan time.Duration @@ -32,11 +32,11 @@ func (di *diagInfo) Marshal() []byte { func (dht *IpfsDHT) getDiagInfo() *diagInfo { di := new(diagInfo) di.CodeVersion = "github.com/jbenet/go-ipfs" - di.Id = dht.self.ID + di.ID = dht.self.ID di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore - for _, p := range dht.routes[0].Listpeers() { + for _, p := range dht.routingTables[0].Listpeers() { di.Connections = append(di.Connections, connDiagInfo{p.GetLatency(), p.ID}) } return di diff --git a/routing/dht/mes_listener.go b/routing/dht/mes_listener.go index 2fcd99fc1c..133be877a5 100644 --- a/routing/dht/mes_listener.go +++ b/routing/dht/mes_listener.go @@ -8,7 +8,7 @@ import ( u "github.com/jbenet/go-ipfs/util" ) -type MesListener struct { +type mesListener struct { listeners map[uint64]*listenInfo haltchan chan struct{} unlist chan uint64 @@ -36,8 +36,8 @@ type listenInfo struct { id uint64 } -func NewMesListener() *MesListener { - ml := new(MesListener) +func newMesListener() *mesListener { + ml := new(mesListener) ml.haltchan = make(chan struct{}) ml.listeners = make(map[uint64]*listenInfo) ml.nlist = make(chan *listenInfo, 16) @@ -47,7 +47,7 @@ func NewMesListener() *MesListener { return ml } -func (ml *MesListener) Listen(id uint64, count int, timeout time.Duration) <-chan *swarm.Message { +func (ml *mesListener) Listen(id uint64, count int, timeout time.Duration) <-chan *swarm.Message { li := new(listenInfo) li.count = count li.eol = time.Now().Add(timeout) @@ -57,7 +57,7 @@ func (ml *MesListener) Listen(id uint64, count int, timeout time.Duration) <-cha return li.resp } -func (ml *MesListener) Unlisten(id uint64) { +func (ml *mesListener) Unlisten(id uint64) { ml.unlist <- id } @@ -66,18 +66,18 @@ type respMes struct { mes *swarm.Message } -func (ml *MesListener) Respond(id uint64, mes *swarm.Message) { +func (ml *mesListener) Respond(id uint64, mes *swarm.Message) { ml.send <- &respMes{ id: id, mes: mes, } } -func (ml *MesListener) Halt() { +func (ml *mesListener) Halt() { ml.haltchan <- struct{}{} } -func (ml *MesListener) run() { +func (ml *mesListener) run() { for { select { case <-ml.haltchan: diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index a852c5e1f1..7c337d3067 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go. +// Code generated by protoc-gen-gogo. // source: messages.proto // DO NOT EDIT! @@ -13,7 +13,7 @@ It has these top-level messages: */ package dht -import proto "code.google.com/p/goprotobuf/proto" +import proto "code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -69,14 +69,17 @@ func (x *PBDHTMessage_MessageType) UnmarshalJSON(data []byte) error { } type PBDHTMessage struct { - Type *PBDHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.PBDHTMessage_MessageType" json:"type,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` - Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` - Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` - Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` - Peers []*PBDHTMessage_PBPeer `protobuf:"bytes,7,rep,name=peers" json:"peers,omitempty"` - XXX_unrecognized []byte `json:"-"` + Type *PBDHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.PBDHTMessage_MessageType" json:"type,omitempty"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + // Unique ID of this message, used to match queries with responses + Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` + // Signals whether or not this message is a response to another message + Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` + Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` + // Used for returning peers from queries (normally, peers closer to X) + Peers []*PBDHTMessage_PBPeer `protobuf:"bytes,7,rep,name=peers" json:"peers,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *PBDHTMessage) Reset() { *m = PBDHTMessage{} } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 309962a930..4e91e0eb40 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -27,6 +27,7 @@ var KValue = 10 // Its in the paper, i swear var AlphaValue = 3 +// GenerateMessageID creates and returns a new message ID // TODO: determine a way of creating and managing message IDs func GenerateMessageID() uint64 { //return (uint64(rand.Uint32()) << 32) & uint64(rand.Uint32()) @@ -39,21 +40,21 @@ func GenerateMessageID() uint64 { // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (s *IpfsDHT) PutValue(key u.Key, value []byte) { +func (dht *IpfsDHT) PutValue(key u.Key, value []byte) { complete := make(chan struct{}) count := 0 - for _, route := range s.routes { + for _, route := range dht.routingTables { peers := route.NearestPeers(kb.ConvertKey(key), KValue) for _, p := range peers { if p == nil { - s.network.Error(kb.ErrLookupFailure) + dht.network.Error(kb.ErrLookupFailure) continue } count++ go func(sp *peer.Peer) { - err := s.putValueToNetwork(sp, string(key), value) + err := dht.putValueToNetwork(sp, string(key), value) if err != nil { - s.network.Error(err) + dht.network.Error(err) } complete <- struct{}{} }(p) @@ -121,8 +122,8 @@ func (ps *peerSet) Size() int { // GetValue searches for the value corresponding to given Key. // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete -func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { - ll := startNewRpc("GET") +func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { + ll := startNewRPC("GET") defer func() { ll.EndLog() ll.Print() @@ -130,29 +131,29 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... - val, err := s.GetLocal(key) + val, err := dht.getLocal(key) if err == nil { ll.Success = true u.DOut("Found local, returning.") return val, nil } - route_level := 0 - closest := s.routes[route_level].NearestPeers(kb.ConvertKey(key), PoolSize) + routeLevel := 0 + closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { return nil, kb.ErrLookupFailure } - val_chan := make(chan []byte) - npeer_chan := make(chan *peer.Peer, 30) - proc_peer := make(chan *peer.Peer, 30) - err_chan := make(chan error) + valChan := make(chan []byte) + npeerChan := make(chan *peer.Peer, 30) + procPeer := make(chan *peer.Peer, 30) + errChan := make(chan error) after := time.After(timeout) pset := newPeerSet() for _, p := range closest { pset.Add(p) - npeer_chan <- p + npeerChan <- p } c := counter{} @@ -161,17 +162,17 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { go func() { for { select { - case p := <-npeer_chan: + case p := <-npeerChan: count++ if count >= KValue { break } c.Increment() - proc_peer <- p + procPeer <- p default: if c.Size() == 0 { - err_chan <- u.ErrNotFound + errChan <- u.ErrNotFound } } } @@ -180,19 +181,19 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { process := func() { for { select { - case p, ok := <-proc_peer: + case p, ok := <-procPeer: if !ok || p == nil { c.Decrement() return } - val, peers, err := s.getValueOrPeers(p, key, timeout/4, route_level) + val, peers, err := dht.getValueOrPeers(p, key, timeout/4, routeLevel) if err != nil { u.DErr(err.Error()) c.Decrement() continue } if val != nil { - val_chan <- val + valChan <- val c.Decrement() return } @@ -201,7 +202,7 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // TODO: filter out peers that arent closer if !pset.Contains(np) && pset.Size() < KValue { pset.Add(np) //This is racey... make a single function to do operation - npeer_chan <- np + npeerChan <- np } } c.Decrement() @@ -214,9 +215,9 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { } select { - case val := <-val_chan: + case val := <-valChan: return val, nil - case err := <-err_chan: + case err := <-errChan: return nil, err case <-after: return nil, u.ErrTimeout @@ -226,14 +227,14 @@ func (s *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // Value provider layer of indirection. // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. -// Announce that this node can provide value for given key -func (s *IpfsDHT) Provide(key u.Key) error { - peers := s.routes[0].NearestPeers(kb.ConvertKey(key), PoolSize) +// Provide makes this node announce that it can provide a value for the given key +func (dht *IpfsDHT) Provide(key u.Key) error { + peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { return kb.ErrLookupFailure } - pmes := DHTMessage{ + pmes := Message{ Type: PBDHTMessage_ADD_PROVIDER, Key: string(key), } @@ -241,57 +242,57 @@ func (s *IpfsDHT) Provide(key u.Key) error { for _, p := range peers { mes := swarm.NewMessage(p, pbmes) - s.network.Send(mes) + dht.network.Send(mes) } return nil } // FindProviders searches for peers who can provide the value for given key. -func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { - ll := startNewRpc("FindProviders") +func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { + ll := startNewRPC("FindProviders") defer func() { ll.EndLog() ll.Print() }() u.DOut("Find providers for: '%s'", key) - p := s.routes[0].NearestPeer(kb.ConvertKey(key)) + p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, kb.ErrLookupFailure } - for level := 0; level < len(s.routes); { - pmes, err := s.findProvidersSingle(p, key, level, timeout) + for level := 0; level < len(dht.routingTables); { + pmes, err := dht.findProvidersSingle(p, key, level, timeout) if err != nil { return nil, err } if pmes.GetSuccess() { - provs := s.addPeerList(key, pmes.GetPeers()) + provs := dht.addPeerList(key, pmes.GetPeers()) ll.Success = true return provs, nil - } else { - closer := pmes.GetPeers() - if len(closer) == 0 { - level++ - continue - } - if peer.ID(closer[0].GetId()).Equal(s.self.ID) { - u.DOut("Got myself back as a closer peer.") - return nil, u.ErrNotFound - } - maddr, err := ma.NewMultiaddr(closer[0].GetAddr()) - if err != nil { - // ??? Move up route level??? - panic("not yet implemented") - } + } - np, err := s.network.GetConnection(peer.ID(closer[0].GetId()), maddr) - if err != nil { - u.PErr("[%s] Failed to connect to: %s", s.self.ID.Pretty(), closer[0].GetAddr()) - level++ - continue - } - p = np + closer := pmes.GetPeers() + if len(closer) == 0 { + level++ + continue + } + if peer.ID(closer[0].GetId()).Equal(dht.self.ID) { + u.DOut("Got myself back as a closer peer.") + return nil, u.ErrNotFound + } + maddr, err := ma.NewMultiaddr(closer[0].GetAddr()) + if err != nil { + // ??? Move up route level??? + panic("not yet implemented") + } + + np, err := dht.network.GetConnection(peer.ID(closer[0].GetId()), maddr) + if err != nil { + u.PErr("[%s] Failed to connect to: %s", dht.self.ID.Pretty(), closer[0].GetAddr()) + level++ + continue } + p = np } return nil, u.ErrNotFound } @@ -299,15 +300,15 @@ func (s *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, // Find specific Peer // FindPeer searches for a peer with given ID. -func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { +func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { // Check if were already connected to them - p, _ := s.Find(id) + p, _ := dht.Find(id) if p != nil { return p, nil } - route_level := 0 - p = s.routes[route_level].NearestPeer(kb.ConvertPeerID(id)) + routeLevel := 0 + p = dht.routingTables[routeLevel].NearestPeer(kb.ConvertPeerID(id)) if p == nil { return nil, kb.ErrLookupFailure } @@ -315,11 +316,11 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error return p, nil } - for route_level < len(s.routes) { - pmes, err := s.findPeerSingle(p, id, timeout, route_level) + for routeLevel < len(dht.routingTables) { + pmes, err := dht.findPeerSingle(p, id, timeout, routeLevel) plist := pmes.GetPeers() if len(plist) == 0 { - route_level++ + routeLevel++ } found := plist[0] @@ -328,7 +329,7 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error return nil, err } - nxtPeer, err := s.network.GetConnection(peer.ID(found.GetId()), addr) + nxtPeer, err := dht.network.GetConnection(peer.ID(found.GetId()), addr) if err != nil { return nil, err } @@ -337,9 +338,8 @@ func (s *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error return nil, errors.New("got back invalid peer from 'successful' response") } return nxtPeer, nil - } else { - p = nxtPeer } + p = nxtPeer } return nil, u.ErrNotFound } @@ -349,16 +349,16 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { // Thoughts: maybe this should accept an ID and do a peer lookup? u.DOut("Enter Ping.") - pmes := DHTMessage{Id: GenerateMessageID(), Type: PBDHTMessage_PING} + pmes := Message{ID: GenerateMessageID(), Type: PBDHTMessage_PING} mes := swarm.NewMessage(p, pmes.ToProtobuf()) before := time.Now() - response_chan := dht.listener.Listen(pmes.Id, 1, time.Minute) + responseChan := dht.listener.Listen(pmes.ID, 1, time.Minute) dht.network.Send(mes) tout := time.After(timeout) select { - case <-response_chan: + case <-responseChan: roundtrip := time.Since(before) p.SetLatency(roundtrip) u.DOut("Ping took %s.", roundtrip.String()) @@ -366,23 +366,23 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { case <-tout: // Timed out, think about removing peer from network u.DOut("Ping peer timed out.") - dht.listener.Unlisten(pmes.Id) + dht.listener.Unlisten(pmes.ID) return u.ErrTimeout } } -func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { +func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) { u.DOut("Begin Diagnostic") //Send to N closest peers - targets := dht.routes[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) + targets := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) // TODO: Add timeout to this struct so nodes know when to return - pmes := DHTMessage{ + pmes := Message{ Type: PBDHTMessage_DIAGNOSTIC, - Id: GenerateMessageID(), + ID: GenerateMessageID(), } - listenChan := dht.listener.Listen(pmes.Id, len(targets), time.Minute*2) + listenChan := dht.listener.Listen(pmes.ID, len(targets), time.Minute*2) pbmes := pmes.ToProtobuf() for _, p := range targets { @@ -398,15 +398,15 @@ func (dht *IpfsDHT) GetDiagnostic(timeout time.Duration) ([]*diagInfo, error) { u.DOut("Diagnostic request timed out.") return out, u.ErrTimeout case resp := <-listenChan: - pmes_out := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmes_out) + pmesOut := new(PBDHTMessage) + err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { // NOTE: here and elsewhere, need to audit error handling, // some errors should be continued on from return out, err } - dec := json.NewDecoder(bytes.NewBuffer(pmes_out.GetValue())) + dec := json.NewDecoder(bytes.NewBuffer(pmesOut.GetValue())) for { di := new(diagInfo) err := dec.Decode(di) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 1a55a0f690..77ed596db6 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -13,13 +13,13 @@ type Bucket struct { list *list.List } -func NewBucket() *Bucket { +func newBucket() *Bucket { b := new(Bucket) b.list = list.New() return b } -func (b *Bucket) Find(id peer.ID) *list.Element { +func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { @@ -30,19 +30,19 @@ func (b *Bucket) Find(id peer.ID) *list.Element { return nil } -func (b *Bucket) MoveToFront(e *list.Element) { +func (b *Bucket) moveToFront(e *list.Element) { b.lk.Lock() b.list.MoveToFront(e) b.lk.Unlock() } -func (b *Bucket) PushFront(p *peer.Peer) { +func (b *Bucket) pushFront(p *peer.Peer) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) PopBack() *peer.Peer { +func (b *Bucket) popBack() *peer.Peer { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() @@ -50,13 +50,13 @@ func (b *Bucket) PopBack() *peer.Peer { return last.Value.(*peer.Peer) } -func (b *Bucket) Len() int { +func (b *Bucket) len() int { b.lk.RLock() defer b.lk.RUnlock() return b.list.Len() } -// Splits a buckets peers into two buckets, the methods receiver will have +// Split splits a buckets peers into two buckets, the methods receiver will have // peers with CPL equal to cpl, the returned bucket will have peers with CPL // greater than cpl (returned bucket has closer peers) func (b *Bucket) Split(cpl int, target ID) *Bucket { @@ -64,13 +64,13 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { defer b.lk.Unlock() out := list.New() - newbuck := NewBucket() + newbuck := newBucket() newbuck.list = out e := b.list.Front() for e != nil { - peer_id := ConvertPeerID(e.Value.(*peer.Peer).ID) - peer_cpl := prefLen(peer_id, target) - if peer_cpl > cpl { + peerID := convertPeerID(e.Value.(*peer.Peer).ID) + peerCPL := prefLen(peerID, target) + if peerCPL > cpl { cur := e out.PushBack(e.Value) e = e.Next() diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index d0137c6d75..3bbd56d074 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -28,11 +28,11 @@ type RoutingTable struct { bucketsize int } -func NewRoutingTable(bucketsize int, local_id ID, latency time.Duration) *RoutingTable { +func newRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { rt := new(RoutingTable) - rt.Buckets = []*Bucket{NewBucket()} + rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize - rt.local = local_id + rt.local = localID rt.maxLatency = latency return rt } @@ -42,51 +42,50 @@ func NewRoutingTable(bucketsize int, local_id ID, latency time.Duration) *Routin func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peer_id := ConvertPeerID(p.ID) - cpl := xor(peer_id, rt.local).commonPrefixLen() + peerID := convertPeerID(p.ID) + cpl := xor(peerID, rt.local).commonPrefixLen() - b_id := cpl - if b_id >= len(rt.Buckets) { - b_id = len(rt.Buckets) - 1 + bucketID := cpl + if bucketID >= len(rt.Buckets) { + bucketID = len(rt.Buckets) - 1 } - bucket := rt.Buckets[b_id] - e := bucket.Find(p.ID) + bucket := rt.Buckets[bucketID] + e := bucket.find(p.ID) if e == nil { // New peer, add to bucket if p.GetLatency() > rt.maxLatency { // Connection doesnt meet requirements, skip! return nil } - bucket.PushFront(p) + bucket.pushFront(p) // Are we past the max bucket size? - if bucket.Len() > rt.bucketsize { - if b_id == len(rt.Buckets)-1 { - new_bucket := bucket.Split(b_id, rt.local) - rt.Buckets = append(rt.Buckets, new_bucket) - if new_bucket.Len() > rt.bucketsize { + if bucket.len() > rt.bucketsize { + if bucketID == len(rt.Buckets)-1 { + newBucket := bucket.Split(bucketID, rt.local) + rt.Buckets = append(rt.Buckets, newBucket) + if newBucket.len() > rt.bucketsize { // TODO: This is a very rare and annoying case panic("Case not handled.") } // If all elements were on left side of split... - if bucket.Len() > rt.bucketsize { - return bucket.PopBack() + if bucket.len() > rt.bucketsize { + return bucket.popBack() } } else { // If the bucket cant split kick out least active node - return bucket.PopBack() + return bucket.popBack() } } return nil - } else { - // If the peer is already in the table, move it to the front. - // This signifies that it it "more active" and the less active nodes - // Will as a result tend towards the back of the list - bucket.MoveToFront(e) - return nil } + // If the peer is already in the table, move it to the front. + // This signifies that it it "more active" and the less active nodes + // Will as a result tend towards the back of the list + bucket.moveToFront(e) + return nil } // A helper struct to sort peers by their distance to the local node @@ -101,7 +100,7 @@ type peerSorterArr []*peerDistance func (p peerSorterArr) Len() int { return len(p) } func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } func (p peerSorterArr) Less(a, b int) bool { - return p[a].distance.Less(p[b].distance) + return p[a].distance.less(p[b].distance) } // @@ -109,10 +108,10 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) - p_id := ConvertPeerID(p.ID) + pID := convertPeerID(p.ID) pd := peerDistance{ p: p, - distance: xor(target, p_id), + distance: xor(target, pID), } peerArr = append(peerArr, &pd) if e == nil { @@ -125,24 +124,23 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe // Find a specific peer by ID or return nil func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { - srch := rt.NearestPeers(ConvertPeerID(id), 1) + srch := rt.NearestPeers(convertPeerID(id), 1) if len(srch) == 0 || !srch[0].ID.Equal(id) { return nil } return srch[0] } -// Returns a single peer that is nearest to the given ID +// NearestPeer returns a single peer that is nearest to the given ID func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { peers := rt.NearestPeers(id, 1) if len(peers) > 0 { return peers[0] - } else { - return nil } + return nil } -// Returns a list of the 'count' closest peers to the given ID +// NearestPeers returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { rt.tabLock.RLock() defer rt.tabLock.RUnlock() @@ -156,7 +154,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { bucket = rt.Buckets[cpl] var peerArr peerSorterArr - if bucket.Len() == 0 { + if bucket.len() == 0 { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { @@ -183,17 +181,17 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { return out } -// Returns the total number of peers in the routing table +// Size returns the total number of peers in the routing table func (rt *RoutingTable) Size() int { var tot int for _, buck := range rt.Buckets { - tot += buck.Len() + tot += buck.len() } return tot } // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) Listpeers() []*peer.Peer { +func (rt *RoutingTable) listPeers() []*peer.Peer { var peers []*peer.Peer for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { @@ -203,10 +201,10 @@ func (rt *RoutingTable) Listpeers() []*peer.Peer { return peers } -func (rt *RoutingTable) Print() { +func (rt *RoutingTable) print() { fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) rt.tabLock.RLock() - peers := rt.Listpeers() + peers := rt.listPeers() for i, p := range peers { fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 02d8f5e0e9..ba5baee136 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -27,28 +27,28 @@ func _randID() ID { // Test basic features of the bucket struct func TestBucket(t *testing.T) { - b := NewBucket() + b := newBucket() peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { peers[i] = _randPeer() - b.PushFront(peers[i]) + b.pushFront(peers[i]) } local := _randPeer() - local_id := ConvertPeerID(local.ID) + localID := convertPeerID(local.ID) i := rand.Intn(len(peers)) - e := b.Find(peers[i].ID) + e := b.find(peers[i].ID) if e == nil { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, ConvertPeerID(local.ID)) + spl := b.Split(0, convertPeerID(local.ID)) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, local_id).commonPrefixLen() + p := convertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, localID).commonPrefixLen() if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") } @@ -56,8 +56,8 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, local_id).commonPrefixLen() + p := convertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, localID).commonPrefixLen() if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") } @@ -67,7 +67,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -93,7 +93,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 5; i++ { @@ -102,7 +102,7 @@ func TestTableFind(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) + found := rt.NearestPeer(convertPeerID(peers[2].ID)) if !found.ID.Equal(peers[2].ID) { t.Fatalf("Failed to lookup known node...") } @@ -110,7 +110,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) + rt := newRoutingTable(20, convertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 18; i++ { @@ -119,7 +119,7 @@ func TestTableFindMultiple(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) + found := rt.NearestPeers(convertPeerID(peers[2].ID), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -130,7 +130,7 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) + tab := newRoutingTable(20, convertPeerID(local), time.Hour) var peers []*peer.Peer for i := 0; i < 500; i++ { peers = append(peers, _randPeer()) @@ -167,8 +167,8 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() - local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + local := convertKey("localKey") + tab := newRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { @@ -183,8 +183,8 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() - local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + local := convertKey("localKey") + tab := newRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 32ff2c269c..addd925652 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -20,11 +20,11 @@ var ErrLookupFailure = errors.New("failed to find any peer in table") // peer.ID or a util.Key. This unifies the keyspace type ID []byte -func (id ID) Equal(other ID) bool { +func (id ID) equal(other ID) bool { return bytes.Equal(id, other) } -func (id ID) Less(other ID) bool { +func (id ID) less(other ID) bool { a, b := equalizeSizes(id, other) for i := 0; i < len(a); i++ { if a[i] != b[i] { @@ -76,23 +76,23 @@ func equalizeSizes(a, b ID) (ID, ID) { return a, b } -func ConvertPeerID(id peer.ID) ID { +func convertPeerID(id peer.ID) ID { hash := sha256.Sum256(id) return hash[:] } -func ConvertKey(id u.Key) ID { +func convertKey(id u.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } -// Returns true if a is closer to key than b is +// Closer returns true if a is closer to key than b is func Closer(a, b peer.ID, key u.Key) bool { - aid := ConvertPeerID(a) - bid := ConvertPeerID(b) - tgt := ConvertKey(key) + aid := convertPeerID(a) + bid := convertPeerID(b) + tgt := convertKey(key) adist := xor(aid, tgt) bdist := xor(bid, tgt) - return adist.Less(bdist) + return adist.less(bdist) } diff --git a/routing/routing.go b/routing/routing.go index 3826f13cbd..fdf3507491 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -1,9 +1,10 @@ package routing import ( + "time" + peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" - "time" ) // IpfsRouting is the routing module interface From d0127a362242b443e008ece313954f76b57f4412 Mon Sep 17 00:00:00 2001 From: Chas Leichner Date: Sat, 16 Aug 2014 23:48:03 -0700 Subject: [PATCH 0049/3147] Made routing code pass golint. This commit was moved from ipfs/go-ipfs-routing@31356db8461d470697f90aaa163405d7e6a9fb21 --- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 8 ++++---- routing/kbucket/bucket.go | 2 +- routing/kbucket/table.go | 17 ++++++++++------- routing/kbucket/table_test.go | 28 ++++++++++++++-------------- routing/kbucket/util.go | 12 +++++++----- 7 files changed, 39 insertions(+), 34 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 581e192771..6296d10294 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -180,7 +180,7 @@ func TestProvides(t *testing.T) { t.Fatal(err) } - err = dhts[3].PutLocal(u.Key("hello"), []byte("world")) + err = dhts[3].putLocal(u.Key("hello"), []byte("world")) if err != nil { t.Fatal(err) } @@ -225,7 +225,7 @@ func TestLayeredGet(t *testing.T) { t.Fatal(err) } - err = dhts[3].PutLocal(u.Key("hello"), []byte("world")) + err = dhts[3].putLocal(u.Key("hello"), []byte("world")) if err != nil { t.Fatal(err) } diff --git a/routing/dht/diag.go b/routing/dht/diag.go index d6bc6bacf8..8fd581a454 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -36,7 +36,7 @@ func (dht *IpfsDHT) getDiagInfo() *diagInfo { di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore - for _, p := range dht.routingTables[0].Listpeers() { + for _, p := range dht.routingTables[0].ListPeers() { di.Connections = append(di.Connections, connDiagInfo{p.GetLatency(), p.ID}) } return di diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 490c9f493e..ee03c48503 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -105,9 +105,9 @@ func TestGetFailures(t *testing.T) { t.Fatal(err) } - resp := DHTMessage{ + resp := Message{ Type: pmes.GetType(), - Id: pmes.GetId(), + ID: pmes.GetId(), Response: true, Success: false, } @@ -140,10 +140,10 @@ func TestGetFailures(t *testing.T) { }) // Now we test this DHT's handleGetValue failure - req := DHTMessage{ + req := Message{ Type: PBDHTMessage_GET_VALUE, Key: "hello", - Id: GenerateMessageID(), + ID: GenerateMessageID(), Value: []byte{0}, } fn.Chan.Incoming <- swarm.NewMessage(other, req.ToProtobuf()) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 77ed596db6..a4eb914158 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -68,7 +68,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { newbuck.list = out e := b.list.Front() for e != nil { - peerID := convertPeerID(e.Value.(*peer.Peer).ID) + peerID := ConvertPeerID(e.Value.(*peer.Peer).ID) peerCPL := prefLen(peerID, target) if peerCPL > cpl { cur := e diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 3bbd56d074..5f1e5c8701 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -28,7 +28,8 @@ type RoutingTable struct { bucketsize int } -func newRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { +// NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. +func NewRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { rt := new(RoutingTable) rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize @@ -42,7 +43,7 @@ func newRoutingTable(bucketsize int, localID ID, latency time.Duration) *Routing func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peerID := convertPeerID(p.ID) + peerID := ConvertPeerID(p.ID) cpl := xor(peerID, rt.local).commonPrefixLen() bucketID := cpl @@ -108,7 +109,7 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) - pID := convertPeerID(p.ID) + pID := ConvertPeerID(p.ID) pd := peerDistance{ p: p, distance: xor(target, pID), @@ -124,7 +125,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe // Find a specific peer by ID or return nil func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { - srch := rt.NearestPeers(convertPeerID(id), 1) + srch := rt.NearestPeers(ConvertPeerID(id), 1) if len(srch) == 0 || !srch[0].ID.Equal(id) { return nil } @@ -190,8 +191,9 @@ func (rt *RoutingTable) Size() int { return tot } +// ListPeers takes a RoutingTable and returns a list of all peers from all buckets in the table. // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) listPeers() []*peer.Peer { +func (rt *RoutingTable) ListPeers() []*peer.Peer { var peers []*peer.Peer for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { @@ -201,10 +203,11 @@ func (rt *RoutingTable) listPeers() []*peer.Peer { return peers } -func (rt *RoutingTable) print() { +// Print prints a descriptive statement about the provided RoutingTable +func (rt *RoutingTable) Print() { fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) rt.tabLock.RLock() - peers := rt.listPeers() + peers := rt.ListPeers() for i, p := range peers { fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index ba5baee136..13a55d14cf 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -36,7 +36,7 @@ func TestBucket(t *testing.T) { } local := _randPeer() - localID := convertPeerID(local.ID) + localID := ConvertPeerID(local.ID) i := rand.Intn(len(peers)) e := b.find(peers[i].ID) @@ -44,10 +44,10 @@ func TestBucket(t *testing.T) { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, convertPeerID(local.ID)) + spl := b.Split(0, ConvertPeerID(local.ID)) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := convertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, localID).commonPrefixLen() if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") @@ -56,7 +56,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := convertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, localID).commonPrefixLen() if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") @@ -67,7 +67,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -93,7 +93,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 5; i++ { @@ -102,7 +102,7 @@ func TestTableFind(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeer(convertPeerID(peers[2].ID)) + found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) if !found.ID.Equal(peers[2].ID) { t.Fatalf("Failed to lookup known node...") } @@ -110,7 +110,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := newRoutingTable(20, convertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 18; i++ { @@ -119,7 +119,7 @@ func TestTableFindMultiple(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeers(convertPeerID(peers[2].ID), 15) + found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -130,7 +130,7 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - tab := newRoutingTable(20, convertPeerID(local), time.Hour) + tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) var peers []*peer.Peer for i := 0; i < 500; i++ { peers = append(peers, _randPeer()) @@ -167,8 +167,8 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() - local := convertKey("localKey") - tab := newRoutingTable(20, local, time.Hour) + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { @@ -183,8 +183,8 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() - local := convertKey("localKey") - tab := newRoutingTable(20, local, time.Hour) + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index addd925652..1195022b0b 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -76,21 +76,23 @@ func equalizeSizes(a, b ID) (ID, ID) { return a, b } -func convertPeerID(id peer.ID) ID { +// ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) +func ConvertPeerID(id peer.ID) ID { hash := sha256.Sum256(id) return hash[:] } -func convertKey(id u.Key) ID { +// ConvertKey creates a DHT ID by hashing a local key (String) +func ConvertKey(id u.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } // Closer returns true if a is closer to key than b is func Closer(a, b peer.ID, key u.Key) bool { - aid := convertPeerID(a) - bid := convertPeerID(b) - tgt := convertKey(key) + aid := ConvertPeerID(a) + bid := ConvertPeerID(b) + tgt := ConvertKey(key) adist := xor(aid, tgt) bdist := xor(bid, tgt) From cc547ceaccc101715d193abb30fffab73f50fb6b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 17 Aug 2014 20:17:43 -0700 Subject: [PATCH 0050/3147] fix a few race conditions and add in newlines to print statements This commit was moved from ipfs/go-ipfs-routing@c3aa90580f0e8fc580321904ddfbe4dfbbc12b7a --- routing/dht/dht.go | 45 ++++++++++++++++++++++++------------------ routing/dht/routing.go | 11 +++++------ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 901f1a861a..e548a272d7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -34,6 +34,7 @@ type IpfsDHT struct { // Local data datastore ds.Datastore + dslock sync.Mutex // Map keys to peers that can provide their value providers map[u.Key][]*providerInfo @@ -78,7 +79,7 @@ func (dht *IpfsDHT) Start() { // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { maddrstr, _ := addr.String() - u.DOut("Connect to new peer: %s", maddrstr) + u.DOut("Connect to new peer: %s\n", maddrstr) npeer, err := dht.network.ConnectNew(addr) if err != nil { return nil, err @@ -113,7 +114,7 @@ func (dht *IpfsDHT) handleMessages() { pmes := new(PBDHTMessage) err := proto.Unmarshal(mes.Data, pmes) if err != nil { - u.PErr("Failed to decode protobuf message: %s", err) + u.PErr("Failed to decode protobuf message: %s\n", err) continue } @@ -126,7 +127,7 @@ func (dht *IpfsDHT) handleMessages() { } // - u.DOut("[peer: %s]\nGot message type: '%s' [id = %x, from = %s]", + u.DOut("[peer: %s]\nGot message type: '%s' [id = %x, from = %s]\n", dht.self.ID.Pretty(), PBDHTMessage_MessageType_name[int32(pmes.GetType())], pmes.GetId(), mes.Peer.ID.Pretty()) @@ -148,7 +149,7 @@ func (dht *IpfsDHT) handleMessages() { } case err := <-ch.Errors: - u.PErr("dht err: %s", err) + u.PErr("dht err: %s\n", err) case <-dht.shutdown: checkTimeouts.Stop() return @@ -187,7 +188,7 @@ func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) er } func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { - u.DOut("handleGetValue for key: %s", pmes.GetKey()) + u.DOut("handleGetValue for key: %s\n", pmes.GetKey()) dskey := ds.NewKey(pmes.GetKey()) resp := &Message{ Response: true, @@ -201,9 +202,11 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { resp.Value = iVal.([]byte) } else if err == ds.ErrNotFound { // Check if we know any providers for the requested value + dht.providerLock.RLock() provs, ok := dht.providers[u.Key(pmes.GetKey())] + dht.providerLock.RUnlock() if ok && len(provs) > 0 { - u.DOut("handleGetValue returning %d provider[s]", len(provs)) + u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) for _, prov := range provs { resp.Peers = append(resp.Peers, prov.Value) } @@ -219,7 +222,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { } else { level = int(pmes.GetValue()[0]) // Using value field to specify cluster level } - u.DOut("handleGetValue searching level %d clusters", level) + u.DOut("handleGetValue searching level %d clusters\n", level) closer := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) @@ -233,7 +236,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { resp.Peers = nil u.DOut("handleGetValue could not find a closer node than myself.") } else { - u.DOut("handleGetValue returning a closer peer: '%s'", closer.ID.Pretty()) + u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) resp.Peers = []*peer.Peer{closer} } } @@ -249,6 +252,8 @@ out: // Store a value in this peer local storage func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *PBDHTMessage) { + dht.dslock.Lock() + defer dht.dslock.Unlock() dskey := ds.NewKey(pmes.GetKey()) err := dht.datastore.Put(dskey, pmes.GetValue()) if err != nil { @@ -278,7 +283,7 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { dht.network.Send(mes) }() level := pmes.GetValue()[0] - u.DOut("handleFindPeer: searching for '%s'", peer.ID(pmes.GetKey()).Pretty()) + u.DOut("handleFindPeer: searching for '%s'\n", peer.ID(pmes.GetKey()).Pretty()) closest := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if closest == nil { u.PErr("handleFindPeer: could not find anything.") @@ -295,7 +300,7 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { return } - u.DOut("handleFindPeer: sending back '%s'", closest.ID.Pretty()) + u.DOut("handleFindPeer: sending back '%s'\n", closest.ID.Pretty()) resp.Peers = []*peer.Peer{closest} resp.Success = true } @@ -352,7 +357,7 @@ func (dht *IpfsDHT) Halt() { } func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { - u.DOut("Adding %s as provider for '%s'", p.Key().Pretty(), key) + u.DOut("Adding %s as provider for '%s'\n", p.Key().Pretty(), key) dht.providerLock.Lock() provs := dht.providers[key] dht.providers[key] = append(provs, &providerInfo{time.Now(), p}) @@ -432,13 +437,13 @@ func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Durati } addr, err := ma.NewMultiaddr(pb.GetAddr()) if err != nil { - u.PErr(err.Error()) + u.PErr("%v\n", err.Error()) continue } np, err := dht.network.GetConnection(peer.ID(pb.GetId()), addr) if err != nil { - u.PErr(err.Error()) + u.PErr("%v\n", err.Error()) continue } @@ -494,19 +499,19 @@ func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, if p == nil { maddr, err := ma.NewMultiaddr(pinfo.GetAddr()) if err != nil { - u.PErr("getValue error: %s", err) + u.PErr("getValue error: %s\n", err) continue } p, err = dht.network.GetConnection(peer.ID(pinfo.GetId()), maddr) if err != nil { - u.PErr("getValue error: %s", err) + u.PErr("getValue error: %s\n", err) continue } } pmes, err := dht.getValueSingle(p, key, timeout, level) if err != nil { - u.DErr("getFromPeers error: %s", err) + u.DErr("getFromPeers error: %s\n", err) continue } dht.addProviderEntry(key, p) @@ -520,6 +525,8 @@ func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, } func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { + dht.dslock.Lock() + defer dht.dslock.Unlock() v, err := dht.datastore.Get(ds.NewKey(string(key))) if err != nil { return nil, err @@ -637,15 +644,15 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer // Dont add someone who is already on the list p := dht.network.Find(u.Key(prov.GetId())) if p == nil { - u.DOut("given provider %s was not in our network already.", peer.ID(prov.GetId()).Pretty()) + u.DOut("given provider %s was not in our network already.\n", peer.ID(prov.GetId()).Pretty()) maddr, err := ma.NewMultiaddr(prov.GetAddr()) if err != nil { - u.PErr("error connecting to new peer: %s", err) + u.PErr("error connecting to new peer: %s\n", err) continue } p, err = dht.network.GetConnection(peer.ID(prov.GetId()), maddr) if err != nil { - u.PErr("error connecting to new peer: %s", err) + u.PErr("error connecting to new peer: %s\n", err) continue } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4e91e0eb40..e3d34325dc 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -30,8 +30,7 @@ var AlphaValue = 3 // GenerateMessageID creates and returns a new message ID // TODO: determine a way of creating and managing message IDs func GenerateMessageID() uint64 { - //return (uint64(rand.Uint32()) << 32) & uint64(rand.Uint32()) - return uint64(rand.Uint32()) + return (uint64(rand.Uint32()) << 32) | uint64(rand.Uint32()) } // This file implements the Routing interface for the IpfsDHT struct. @@ -188,7 +187,7 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { } val, peers, err := dht.getValueOrPeers(p, key, timeout/4, routeLevel) if err != nil { - u.DErr(err.Error()) + u.DErr("%v\n", err.Error()) c.Decrement() continue } @@ -254,7 +253,7 @@ func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Pee ll.EndLog() ll.Print() }() - u.DOut("Find providers for: '%s'", key) + u.DOut("Find providers for: '%s'\n", key) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, kb.ErrLookupFailure @@ -288,7 +287,7 @@ func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Pee np, err := dht.network.GetConnection(peer.ID(closer[0].GetId()), maddr) if err != nil { - u.PErr("[%s] Failed to connect to: %s", dht.self.ID.Pretty(), closer[0].GetAddr()) + u.PErr("[%s] Failed to connect to: %s\n", dht.self.ID.Pretty(), closer[0].GetAddr()) level++ continue } @@ -361,7 +360,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { case <-responseChan: roundtrip := time.Since(before) p.SetLatency(roundtrip) - u.DOut("Ping took %s.", roundtrip.String()) + u.DOut("Ping took %s.\n", roundtrip.String()) return nil case <-tout: // Timed out, think about removing peer from network From 02183a984bebd093db86862c8acebb165bec91df Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 18 Aug 2014 20:38:44 -0700 Subject: [PATCH 0051/3147] change providers map and lock over to an agent based approach for managing providers This commit was moved from ipfs/go-ipfs-routing@1d0d5d6361864b0a9020f1b91d7345989af05a76 --- routing/dht/dht.go | 60 ++++++----------------------- routing/dht/providers.go | 83 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 routing/dht/providers.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e548a272d7..4c6da064be 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -36,9 +36,7 @@ type IpfsDHT struct { datastore ds.Datastore dslock sync.Mutex - // Map keys to peers that can provide their value - providers map[u.Key][]*providerInfo - providerLock sync.RWMutex + providers *ProviderManager // Signal to shutdown dht shutdown chan struct{} @@ -59,7 +57,7 @@ func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht.network = net dht.datastore = ds.NewMapDatastore() dht.self = p - dht.providers = make(map[u.Key][]*providerInfo) + dht.providers = NewProviderManager() dht.shutdown = make(chan struct{}) dht.routingTables = make([]*kb.RoutingTable, 3) @@ -102,7 +100,6 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { func (dht *IpfsDHT) handleMessages() { u.DOut("Begin message handling routine") - checkTimeouts := time.NewTicker(time.Minute * 5) ch := dht.network.GetChan() for { select { @@ -146,34 +143,18 @@ func (dht *IpfsDHT) handleMessages() { dht.handlePing(mes.Peer, pmes) case PBDHTMessage_DIAGNOSTIC: dht.handleDiagnostic(mes.Peer, pmes) + default: + u.PErr("Recieved invalid message type") } case err := <-ch.Errors: u.PErr("dht err: %s\n", err) case <-dht.shutdown: - checkTimeouts.Stop() return - case <-checkTimeouts.C: - // Time to collect some garbage! - dht.cleanExpiredProviders() } } } -func (dht *IpfsDHT) cleanExpiredProviders() { - dht.providerLock.Lock() - for k, parr := range dht.providers { - var cleaned []*providerInfo - for _, v := range parr { - if time.Since(v.Creation) < time.Hour { - cleaned = append(cleaned, v) - } - } - dht.providers[k] = cleaned - } - dht.providerLock.Unlock() -} - func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { pmes := Message{ Type: PBDHTMessage_PUT_VALUE, @@ -202,14 +183,10 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { resp.Value = iVal.([]byte) } else if err == ds.ErrNotFound { // Check if we know any providers for the requested value - dht.providerLock.RLock() - provs, ok := dht.providers[u.Key(pmes.GetKey())] - dht.providerLock.RUnlock() - if ok && len(provs) > 0 { + provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) + if len(provs) > 0 { u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) - for _, prov := range provs { - resp.Peers = append(resp.Peers, prov.Value) - } + resp.Peers = provs resp.Success = true } else { // No providers? @@ -313,9 +290,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { Response: true, } - dht.providerLock.RLock() - providers := dht.providers[u.Key(pmes.GetKey())] - dht.providerLock.RUnlock() + providers := dht.providers.GetProviders(u.Key(pmes.GetKey())) if providers == nil || len(providers) == 0 { level := 0 if len(pmes.GetValue()) > 0 { @@ -329,9 +304,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { resp.Peers = []*peer.Peer{closer} } } else { - for _, prov := range providers { - resp.Peers = append(resp.Peers, prov.Value) - } + resp.Peers = providers resp.Success = true } @@ -345,9 +318,8 @@ type providerInfo struct { } func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *PBDHTMessage) { - //TODO: need to implement TTLs on providers key := u.Key(pmes.GetKey()) - dht.addProviderEntry(key, p) + dht.providers.AddProvider(key, p) } // Halt stops all communications from this peer and shut down @@ -356,14 +328,6 @@ func (dht *IpfsDHT) Halt() { dht.network.Close() } -func (dht *IpfsDHT) addProviderEntry(key u.Key, p *peer.Peer) { - u.DOut("Adding %s as provider for '%s'\n", p.Key().Pretty(), key) - dht.providerLock.Lock() - provs := dht.providers[key] - dht.providers[key] = append(provs, &providerInfo{time.Now(), p}) - dht.providerLock.Unlock() -} - // NOTE: not yet finished, low priority func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) @@ -514,7 +478,7 @@ func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, u.DErr("getFromPeers error: %s\n", err) continue } - dht.addProviderEntry(key, p) + dht.providers.AddProvider(key, p) // Make sure it was a successful get if pmes.GetSuccess() && pmes.Value != nil { @@ -656,7 +620,7 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer continue } } - dht.addProviderEntry(key, p) + dht.providers.AddProvider(key, p) provArr = append(provArr, p) } return provArr diff --git a/routing/dht/providers.go b/routing/dht/providers.go new file mode 100644 index 0000000000..3dc3b7b057 --- /dev/null +++ b/routing/dht/providers.go @@ -0,0 +1,83 @@ +package dht + +import ( + "time" + + u "github.com/jbenet/go-ipfs/util" + peer "github.com/jbenet/go-ipfs/peer" +) + +type ProviderManager struct { + providers map[u.Key][]*providerInfo + newprovs chan *addProv + getprovs chan *getProv + halt chan struct{} +} + +type addProv struct { + k u.Key + val *peer.Peer +} + +type getProv struct { + k u.Key + resp chan []*peer.Peer +} + +func NewProviderManager() *ProviderManager { + pm := new(ProviderManager) + pm.getprovs = make(chan *getProv) + pm.newprovs = make(chan *addProv) + pm.providers = make(map[u.Key][]*providerInfo) + pm.halt = make(chan struct{}) + go pm.run() + return pm +} + +func (pm *ProviderManager) run() { + tick := time.NewTicker(time.Hour) + for { + select { + case np := <-pm.newprovs: + pi := new(providerInfo) + pi.Creation = time.Now() + pi.Value = np.val + arr := pm.providers[np.k] + pm.providers[np.k] = append(arr, pi) + case gp := <-pm.getprovs: + var parr []*peer.Peer + provs := pm.providers[gp.k] + for _, p := range provs { + parr = append(parr, p.Value) + } + gp.resp <- parr + case <-tick.C: + for k, provs := range pm.providers { + var filtered []*providerInfo + for _, p := range provs { + if time.Now().Sub(p.Creation) < time.Hour * 24 { + filtered = append(filtered, p) + } + } + pm.providers[k] = filtered + } + case <-pm.halt: + return + } + } +} + +func (pm *ProviderManager) AddProvider(k u.Key, val *peer.Peer) { + pm.newprovs <- &addProv{ + k: k, + val: val, + } +} + +func (pm *ProviderManager) GetProviders(k u.Key) []*peer.Peer { + gp := new(getProv) + gp.k = k + gp.resp = make(chan []*peer.Peer) + pm.getprovs <- gp + return <-gp.resp +} From 9fac1607a17adf2774f4ae3e19db970d2988b4d4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 19 Aug 2014 19:14:52 -0700 Subject: [PATCH 0052/3147] add some more tests in This commit was moved from ipfs/go-ipfs-routing@c945c1b5ce7d212766947b5e26ec010c2078dd3a --- routing/dht/Message.go | 15 ++++--- routing/dht/dht.go | 22 ++++----- routing/dht/ext_test.go | 76 ++++++++++++++++++++++++++++++++ routing/dht/mes_listener_test.go | 33 ++++++++++++++ 4 files changed, 130 insertions(+), 16 deletions(-) create mode 100644 routing/dht/mes_listener_test.go diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 71a9537f96..20c311d802 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -1,6 +1,7 @@ package dht import ( + "code.google.com/p/goprotobuf/proto" peer "github.com/jbenet/go-ipfs/peer" ) @@ -17,12 +18,16 @@ type Message struct { func peerInfo(p *peer.Peer) *PBDHTMessage_PBPeer { pbp := new(PBDHTMessage_PBPeer) - addr, err := p.Addresses[0].String() - if err != nil { - //Temp: what situations could cause this? - panic(err) + if len(p.Addresses) == 0 || p.Addresses[0] == nil { + pbp.Addr = proto.String("") + } else { + addr, err := p.Addresses[0].String() + if err != nil { + //Temp: what situations could cause this? + panic(err) + } + pbp.Addr = &addr } - pbp.Addr = &addr pid := string(p.ID) pbp.Id = &pid return pbp diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4c6da064be..146de751b5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -87,7 +87,7 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { // NOTE: this should be done better... err = dht.Ping(npeer, time.Second*2) if err != nil { - return nil, errors.New("failed to ping newly connected peer") + return nil, errors.New("failed to ping newly connected peer\n") } dht.Update(npeer) @@ -98,14 +98,14 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { // Read in all messages from swarm and handle them appropriately // NOTE: this function is just a quick sketch func (dht *IpfsDHT) handleMessages() { - u.DOut("Begin message handling routine") + u.DOut("Begin message handling routine\n") ch := dht.network.GetChan() for { select { case mes, ok := <-ch.Incoming: if !ok { - u.DOut("handleMessages closing, bad recv on incoming") + u.DOut("handleMessages closing, bad recv on incoming\n") return } pmes := new(PBDHTMessage) @@ -178,7 +178,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { } iVal, err := dht.datastore.Get(dskey) if err == nil { - u.DOut("handleGetValue success!") + u.DOut("handleGetValue success!\n") resp.Success = true resp.Value = iVal.([]byte) } else if err == ds.ErrNotFound { @@ -195,7 +195,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { level := 0 if len(pmes.GetValue()) < 1 { // TODO: maybe return an error? Defaulting isnt a good idea IMO - u.PErr("handleGetValue: no routing level specified, assuming 0") + u.PErr("handleGetValue: no routing level specified, assuming 0\n") } else { level = int(pmes.GetValue()[0]) // Using value field to specify cluster level } @@ -204,14 +204,14 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { closer := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if closer.ID.Equal(dht.self.ID) { - u.DOut("Attempted to return self! this shouldnt happen...") + u.DOut("Attempted to return self! this shouldnt happen...\n") resp.Peers = nil goto out } // If this peer is closer than the one from the table, return nil if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { resp.Peers = nil - u.DOut("handleGetValue could not find a closer node than myself.") + u.DOut("handleGetValue could not find a closer node than myself.\n") } else { u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) resp.Peers = []*peer.Peer{closer} @@ -263,12 +263,12 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { u.DOut("handleFindPeer: searching for '%s'\n", peer.ID(pmes.GetKey()).Pretty()) closest := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) if closest == nil { - u.PErr("handleFindPeer: could not find anything.") + u.PErr("handleFindPeer: could not find anything.\n") return } if len(closest.Addresses) == 0 { - u.PErr("handleFindPeer: no addresses for connected peer...") + u.PErr("handleFindPeer: no addresses for connected peer...\n") return } @@ -438,7 +438,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio return nil, u.ErrTimeout case resp, ok := <-responseChan: if !ok { - u.PErr("response channel closed before timeout, please investigate.") + u.PErr("response channel closed before timeout, please investigate.\n") return nil, u.ErrTimeout } roundtrip := time.Since(t) @@ -587,7 +587,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time dht.listener.Unlisten(pmes.ID) return nil, u.ErrTimeout case resp := <-listenChan: - u.DOut("FindProviders: got response.") + u.DOut("FindProviders: got response.\n") pmesOut := new(PBDHTMessage) err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index ee03c48503..1ef68fbec2 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -3,6 +3,8 @@ package dht import ( "testing" + crand "crypto/rand" + "code.google.com/p/goprotobuf/proto" peer "github.com/jbenet/go-ipfs/peer" @@ -72,6 +74,10 @@ func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { return nil, nil } +func (f *fauxNet) GetConnection(id peer.ID, addr *ma.Multiaddr) (*peer.Peer, error) { + return &peer.Peer{ID: id, Addresses: []*ma.Multiaddr{addr}}, nil +} + func TestGetFailures(t *testing.T) { fn := newFauxNet() fn.Listen() @@ -150,3 +156,73 @@ func TestGetFailures(t *testing.T) { <-success } + +// TODO: Maybe put these in some sort of "ipfs_testutil" package +func _randPeer() *peer.Peer { + p := new(peer.Peer) + p.ID = make(peer.ID, 16) + p.Addresses = []*ma.Multiaddr{nil} + crand.Read(p.ID) + return p +} + +func TestNotFound(t *testing.T) { + u.Debug = true + fn := newFauxNet() + fn.Listen() + + local := new(peer.Peer) + local.ID = peer.ID("test_peer") + + d := NewDHT(local, fn) + d.Start() + + var ps []*peer.Peer + for i := 0; i < 5; i++ { + ps = append(ps, _randPeer()) + d.Update(ps[i]) + } + + // Reply with random peers to every message + fn.AddHandler(func(mes *swarm.Message) *swarm.Message { + t.Log("Handling message...") + pmes := new(PBDHTMessage) + err := proto.Unmarshal(mes.Data, pmes) + if err != nil { + t.Fatal(err) + } + + switch pmes.GetType() { + case PBDHTMessage_GET_VALUE: + resp := Message{ + Type: pmes.GetType(), + ID: pmes.GetId(), + Response: true, + Success: false, + } + + for i := 0; i < 7; i++ { + resp.Peers = append(resp.Peers, _randPeer()) + } + return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + default: + panic("Shouldnt recieve this.") + } + + }) + + _, err := d.GetValue(u.Key("hello"), time.Second*30) + if err != nil { + switch err { + case u.ErrNotFound: + t.Fail() + //Success! + return + case u.ErrTimeout: + t.Fatal("Should not have gotten timeout!") + default: + t.Fatalf("Got unexpected error: %s", err) + } + } + t.Fatal("Expected to recieve an error.") +} diff --git a/routing/dht/mes_listener_test.go b/routing/dht/mes_listener_test.go new file mode 100644 index 0000000000..8e494aabce --- /dev/null +++ b/routing/dht/mes_listener_test.go @@ -0,0 +1,33 @@ +package dht + +import ( + "testing" + "time" + + "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/swarm" +) + +// Ensure that the Message Listeners basic functionality works +func TestMesListenerBasic(t *testing.T) { + ml := newMesListener() + a := GenerateMessageID() + resp := ml.Listen(a, 1, time.Minute) + + pmes := new(swarm.PBWrapper) + pmes.Message = []byte("Hello") + pmes.Type = new(swarm.PBWrapper_MessageType) + mes := swarm.NewMessage(new(peer.Peer), pmes) + + go ml.Respond(a, mes) + + del := time.After(time.Millisecond * 10) + select { + case get := <-resp: + if string(get.Data) != string(mes.Data) { + t.Fatal("Something got really messed up") + } + case <-del: + t.Fatal("Waiting on message response timed out.") + } +} From fd2365be7d2e71765b5621ca98abd0b02cd9deb5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 19 Aug 2014 20:02:42 -0700 Subject: [PATCH 0053/3147] removed failure call i forgot to remove This commit was moved from ipfs/go-ipfs-routing@f544b4e454742a1c3d04976f42d8a21540637412 --- routing/dht/ext_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 1ef68fbec2..8d1e74ba55 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -215,7 +215,6 @@ func TestNotFound(t *testing.T) { if err != nil { switch err { case u.ErrNotFound: - t.Fail() //Success! return case u.ErrTimeout: From 09bff5085e0253f65ce11ea8fa64a8cc0642d947 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 19 Aug 2014 22:05:49 -0700 Subject: [PATCH 0054/3147] add in message type routing to the swarm object. tired, needs cleanup. This commit was moved from ipfs/go-ipfs-routing@d1a94612fd301828be7c0e8a14f73f30b12aeed1 --- routing/dht/dht.go | 7 ++-- routing/dht/dht_test.go | 4 +-- routing/dht/ext_test.go | 70 ++++++++++++++++++++++++++++++++++++++-- routing/dht/providers.go | 16 ++++----- routing/dht/routing.go | 51 ++++++++++++++--------------- 5 files changed, 106 insertions(+), 42 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 146de751b5..b0a2a0481f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -100,10 +100,11 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { func (dht *IpfsDHT) handleMessages() { u.DOut("Begin message handling routine\n") - ch := dht.network.GetChan() + errs := dht.network.GetErrChan() + dhtmes := dht.network.GetChannel(swarm.PBWrapper_DHT_MESSAGE) for { select { - case mes, ok := <-ch.Incoming: + case mes, ok := <-dhtmes: if !ok { u.DOut("handleMessages closing, bad recv on incoming\n") return @@ -147,7 +148,7 @@ func (dht *IpfsDHT) handleMessages() { u.PErr("Recieved invalid message type") } - case err := <-ch.Errors: + case err := <-errs: u.PErr("dht err: %s\n", err) case <-dht.shutdown: return diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 6296d10294..92d0931fb3 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -132,8 +132,8 @@ func TestValueGetSet(t *testing.T) { dhtA.Start() dhtB.Start() - errsa := dhtA.network.GetChan().Errors - errsb := dhtB.network.GetChan().Errors + errsa := dhtA.network.GetErrChan() + errsb := dhtB.network.GetErrChan() go func() { select { case err := <-errsa: diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 8d1e74ba55..79cfd27bc6 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -66,8 +66,12 @@ func (f *fauxNet) Send(mes *swarm.Message) { f.Chan.Outgoing <- mes } -func (f *fauxNet) GetChan() *swarm.Chan { - return f.Chan +func (f *fauxNet) GetErrChan() chan error { + return f.Chan.Errors +} + +func (f *fauxNet) GetChannel(t swarm.PBWrapper_MessageType) chan *swarm.Message { + return f.Chan.Incoming } func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { @@ -167,7 +171,6 @@ func _randPeer() *peer.Peer { } func TestNotFound(t *testing.T) { - u.Debug = true fn := newFauxNet() fn.Listen() @@ -225,3 +228,64 @@ func TestNotFound(t *testing.T) { } t.Fatal("Expected to recieve an error.") } + +// If less than K nodes are in the entire network, it should fail when we make +// a GET rpc and nobody has the value +func TestLessThanKResponses(t *testing.T) { + u.Debug = false + fn := newFauxNet() + fn.Listen() + + local := new(peer.Peer) + local.ID = peer.ID("test_peer") + + d := NewDHT(local, fn) + d.Start() + + var ps []*peer.Peer + for i := 0; i < 5; i++ { + ps = append(ps, _randPeer()) + d.Update(ps[i]) + } + other := _randPeer() + + // Reply with random peers to every message + fn.AddHandler(func(mes *swarm.Message) *swarm.Message { + t.Log("Handling message...") + pmes := new(PBDHTMessage) + err := proto.Unmarshal(mes.Data, pmes) + if err != nil { + t.Fatal(err) + } + + switch pmes.GetType() { + case PBDHTMessage_GET_VALUE: + resp := Message{ + Type: pmes.GetType(), + ID: pmes.GetId(), + Response: true, + Success: false, + Peers: []*peer.Peer{other}, + } + + return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + default: + panic("Shouldnt recieve this.") + } + + }) + + _, err := d.GetValue(u.Key("hello"), time.Second*30) + if err != nil { + switch err { + case u.ErrNotFound: + //Success! + return + case u.ErrTimeout: + t.Fatal("Should not have gotten timeout!") + default: + t.Fatalf("Got unexpected error: %s", err) + } + } + t.Fatal("Expected to recieve an error.") +} diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 3dc3b7b057..fdf8d6581a 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -3,24 +3,24 @@ package dht import ( "time" - u "github.com/jbenet/go-ipfs/util" peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" ) type ProviderManager struct { providers map[u.Key][]*providerInfo - newprovs chan *addProv - getprovs chan *getProv - halt chan struct{} + newprovs chan *addProv + getprovs chan *getProv + halt chan struct{} } type addProv struct { - k u.Key + k u.Key val *peer.Peer } type getProv struct { - k u.Key + k u.Key resp chan []*peer.Peer } @@ -55,7 +55,7 @@ func (pm *ProviderManager) run() { for k, provs := range pm.providers { var filtered []*providerInfo for _, p := range provs { - if time.Now().Sub(p.Creation) < time.Hour * 24 { + if time.Now().Sub(p.Creation) < time.Hour*24 { filtered = append(filtered, p) } } @@ -69,7 +69,7 @@ func (pm *ProviderManager) run() { func (pm *ProviderManager) AddProvider(k u.Key, val *peer.Peer) { pm.newprovs <- &addProv{ - k: k, + k: k, val: val, } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e3d34325dc..3a4ebd33d0 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -164,7 +164,8 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { case p := <-npeerChan: count++ if count >= KValue { - break + errChan <- u.ErrNotFound + return } c.Increment() @@ -172,40 +173,38 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { default: if c.Size() == 0 { errChan <- u.ErrNotFound + return } } } }() process := func() { - for { - select { - case p, ok := <-procPeer: - if !ok || p == nil { - c.Decrement() - return - } - val, peers, err := dht.getValueOrPeers(p, key, timeout/4, routeLevel) - if err != nil { - u.DErr("%v\n", err.Error()) - c.Decrement() - continue - } - if val != nil { - valChan <- val - c.Decrement() - return - } + for p := range procPeer { + if p == nil { + c.Decrement() + return + } + val, peers, err := dht.getValueOrPeers(p, key, timeout/4, routeLevel) + if err != nil { + u.DErr("%v\n", err.Error()) + c.Decrement() + continue + } + if val != nil { + valChan <- val + c.Decrement() + return + } - for _, np := range peers { - // TODO: filter out peers that arent closer - if !pset.Contains(np) && pset.Size() < KValue { - pset.Add(np) //This is racey... make a single function to do operation - npeerChan <- np - } + for _, np := range peers { + // TODO: filter out peers that arent closer + if !pset.Contains(np) && pset.Size() < KValue { + pset.Add(np) //This is racey... make a single function to do operation + npeerChan <- np } - c.Decrement() } + c.Decrement() } } From 797427ce19747093d5b3043e545e72af12a2b44d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 20 Aug 2014 16:51:03 -0700 Subject: [PATCH 0055/3147] fix swarm message type code, i beleive it works well now This commit was moved from ipfs/go-ipfs-routing@275fcaa9bcb154ad5ccb378c0754b6da29c71eaf --- routing/dht/dht.go | 25 +++++++++++++------------ routing/dht/ext_test.go | 4 ++-- routing/dht/routing.go | 6 +++--- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b0a2a0481f..4c0751aa5e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -28,6 +28,7 @@ type IpfsDHT struct { routingTables []*kb.RoutingTable network swarm.Network + netChan *swarm.Chan // Local peer (yourself) self *peer.Peer @@ -55,6 +56,7 @@ type IpfsDHT struct { func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht := new(IpfsDHT) dht.network = net + dht.netChan = net.GetChannel(swarm.PBWrapper_DHT_MESSAGE) dht.datastore = ds.NewMapDatastore() dht.self = p dht.providers = NewProviderManager() @@ -101,10 +103,9 @@ func (dht *IpfsDHT) handleMessages() { u.DOut("Begin message handling routine\n") errs := dht.network.GetErrChan() - dhtmes := dht.network.GetChannel(swarm.PBWrapper_DHT_MESSAGE) for { select { - case mes, ok := <-dhtmes: + case mes, ok := <-dht.netChan.Incoming: if !ok { u.DOut("handleMessages closing, bad recv on incoming\n") return @@ -165,7 +166,7 @@ func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) er } mes := swarm.NewMessage(p, pmes.ToProtobuf()) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes return nil } @@ -225,7 +226,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { out: mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes } // Store a value in this peer local storage @@ -247,7 +248,7 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { ID: pmes.GetId(), } - dht.network.Send(swarm.NewMessage(p, resp.ToProtobuf())) + dht.netChan.Outgoing <- swarm.NewMessage(p, resp.ToProtobuf()) } func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { @@ -258,7 +259,7 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { } defer func() { mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes }() level := pmes.GetValue()[0] u.DOut("handleFindPeer: searching for '%s'\n", peer.ID(pmes.GetKey()).Pretty()) @@ -310,7 +311,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes } type providerInfo struct { @@ -336,7 +337,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { for _, ps := range seq { mes := swarm.NewMessage(ps, pmes) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes } buf := new(bytes.Buffer) @@ -372,7 +373,7 @@ out: } mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes } func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Duration, level int) ([]byte, []*peer.Peer, error) { @@ -429,7 +430,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio mes := swarm.NewMessage(p, pmes.ToProtobuf()) t := time.Now() - dht.network.Send(mes) + dht.netChan.Outgoing <- mes // Wait for either the response or a timeout timeup := time.After(timeout) @@ -545,7 +546,7 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati mes := swarm.NewMessage(p, pmes.ToProtobuf()) listenChan := dht.listener.Listen(pmes.ID, 1, time.Minute) t := time.Now() - dht.network.Send(mes) + dht.netChan.Outgoing <- mes after := time.After(timeout) select { case <-after: @@ -581,7 +582,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time mes := swarm.NewMessage(p, pmes.ToProtobuf()) listenChan := dht.listener.Listen(pmes.ID, 1, time.Minute) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes after := time.After(timeout) select { case <-after: diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 79cfd27bc6..6e034c69dc 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -70,8 +70,8 @@ func (f *fauxNet) GetErrChan() chan error { return f.Chan.Errors } -func (f *fauxNet) GetChannel(t swarm.PBWrapper_MessageType) chan *swarm.Message { - return f.Chan.Incoming +func (f *fauxNet) GetChannel(t swarm.PBWrapper_MessageType) *swarm.Chan { + return f.Chan } func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3a4ebd33d0..3c4ad9e00e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -240,7 +240,7 @@ func (dht *IpfsDHT) Provide(key u.Key) error { for _, p := range peers { mes := swarm.NewMessage(p, pbmes) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes } return nil } @@ -352,7 +352,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { before := time.Now() responseChan := dht.listener.Listen(pmes.ID, 1, time.Minute) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes tout := time.After(timeout) select { @@ -385,7 +385,7 @@ func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) { pbmes := pmes.ToProtobuf() for _, p := range targets { mes := swarm.NewMessage(p, pbmes) - dht.network.Send(mes) + dht.netChan.Outgoing <- mes } var out []*diagInfo From 6c323bcb01abd2b653b0fa49778c8eac13d12b12 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 23 Aug 2014 22:21:20 -0700 Subject: [PATCH 0056/3147] refactor to allow use of mes_listener outside of dht This commit was moved from ipfs/go-ipfs-routing@318a5d4d4652778095b2d87f9145219e2a23db7e --- routing/dht/dht.go | 33 +++++---- routing/dht/ext_test.go | 2 +- routing/dht/mes_listener.go | 116 ------------------------------- routing/dht/mes_listener_test.go | 33 --------- routing/dht/providers.go | 4 ++ routing/dht/routing.go | 100 +++++--------------------- routing/dht/util.go | 71 +++++++++++++++++++ 7 files changed, 113 insertions(+), 246 deletions(-) delete mode 100644 routing/dht/mes_listener.go delete mode 100644 routing/dht/mes_listener_test.go create mode 100644 routing/dht/util.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4c0751aa5e..aa3a8da8b5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -2,7 +2,7 @@ package dht import ( "bytes" - "errors" + "fmt" "sync" "time" @@ -49,7 +49,7 @@ type IpfsDHT struct { diaglock sync.Mutex // listener is a server to register to listen for responses to messages - listener *mesListener + listener *swarm.MesListener } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -66,7 +66,7 @@ func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) - dht.listener = newMesListener() + dht.listener = swarm.NewMesListener() dht.birth = time.Now() return dht } @@ -89,7 +89,7 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { // NOTE: this should be done better... err = dht.Ping(npeer, time.Second*2) if err != nil { - return nil, errors.New("failed to ping newly connected peer\n") + return nil, fmt.Errorf("failed to ping newly connected peer: %s\n", err) } dht.Update(npeer) @@ -132,19 +132,19 @@ func (dht *IpfsDHT) handleMessages() { pmes.GetId(), mes.Peer.ID.Pretty()) switch pmes.GetType() { case PBDHTMessage_GET_VALUE: - dht.handleGetValue(mes.Peer, pmes) + go dht.handleGetValue(mes.Peer, pmes) case PBDHTMessage_PUT_VALUE: - dht.handlePutValue(mes.Peer, pmes) + go dht.handlePutValue(mes.Peer, pmes) case PBDHTMessage_FIND_NODE: - dht.handleFindPeer(mes.Peer, pmes) + go dht.handleFindPeer(mes.Peer, pmes) case PBDHTMessage_ADD_PROVIDER: - dht.handleAddProvider(mes.Peer, pmes) + go dht.handleAddProvider(mes.Peer, pmes) case PBDHTMessage_GET_PROVIDERS: - dht.handleGetProviders(mes.Peer, pmes) + go dht.handleGetProviders(mes.Peer, pmes) case PBDHTMessage_PING: - dht.handlePing(mes.Peer, pmes) + go dht.handlePing(mes.Peer, pmes) case PBDHTMessage_DIAGNOSTIC: - dht.handleDiagnostic(mes.Peer, pmes) + go dht.handleDiagnostic(mes.Peer, pmes) default: u.PErr("Recieved invalid message type") } @@ -162,7 +162,7 @@ func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) er Type: PBDHTMessage_PUT_VALUE, Key: key, Value: value, - ID: GenerateMessageID(), + ID: swarm.GenerateMessageID(), } mes := swarm.NewMessage(p, pmes.ToProtobuf()) @@ -242,6 +242,7 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *PBDHTMessage) { } func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { + u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) resp := Message{ Type: pmes.GetType(), Response: true, @@ -328,6 +329,8 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *PBDHTMessage) { func (dht *IpfsDHT) Halt() { dht.shutdown <- struct{}{} dht.network.Close() + dht.providers.Halt() + dht.listener.Halt() } // NOTE: not yet finished, low priority @@ -424,7 +427,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio Type: PBDHTMessage_GET_VALUE, Key: string(key), Value: []byte{byte(level)}, - ID: GenerateMessageID(), + ID: swarm.GenerateMessageID(), } responseChan := dht.listener.Listen(pmes.ID, 1, time.Minute) @@ -539,7 +542,7 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati pmes := Message{ Type: PBDHTMessage_FIND_NODE, Key: string(id), - ID: GenerateMessageID(), + ID: swarm.GenerateMessageID(), Value: []byte{byte(level)}, } @@ -575,7 +578,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time pmes := Message{ Type: PBDHTMessage_GET_PROVIDERS, Key: string(key), - ID: GenerateMessageID(), + ID: swarm.GenerateMessageID(), Value: []byte{byte(level)}, } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 6e034c69dc..e631e27ca8 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -153,7 +153,7 @@ func TestGetFailures(t *testing.T) { req := Message{ Type: PBDHTMessage_GET_VALUE, Key: "hello", - ID: GenerateMessageID(), + ID: swarm.GenerateMessageID(), Value: []byte{0}, } fn.Chan.Incoming <- swarm.NewMessage(other, req.ToProtobuf()) diff --git a/routing/dht/mes_listener.go b/routing/dht/mes_listener.go deleted file mode 100644 index 133be877a5..0000000000 --- a/routing/dht/mes_listener.go +++ /dev/null @@ -1,116 +0,0 @@ -package dht - -import ( - "sync" - "time" - - swarm "github.com/jbenet/go-ipfs/swarm" - u "github.com/jbenet/go-ipfs/util" -) - -type mesListener struct { - listeners map[uint64]*listenInfo - haltchan chan struct{} - unlist chan uint64 - nlist chan *listenInfo - send chan *respMes -} - -// The listen info struct holds information about a message that is being waited for -type listenInfo struct { - // Responses matching the listen ID will be sent through resp - resp chan *swarm.Message - - // count is the number of responses to listen for - count int - - // eol is the time at which this listener will expire - eol time.Time - - // sendlock is used to prevent conditions where we try to send on the resp - // channel as its being closed by a timeout in another thread - sendLock sync.Mutex - - closed bool - - id uint64 -} - -func newMesListener() *mesListener { - ml := new(mesListener) - ml.haltchan = make(chan struct{}) - ml.listeners = make(map[uint64]*listenInfo) - ml.nlist = make(chan *listenInfo, 16) - ml.send = make(chan *respMes, 16) - ml.unlist = make(chan uint64, 16) - go ml.run() - return ml -} - -func (ml *mesListener) Listen(id uint64, count int, timeout time.Duration) <-chan *swarm.Message { - li := new(listenInfo) - li.count = count - li.eol = time.Now().Add(timeout) - li.resp = make(chan *swarm.Message, count) - li.id = id - ml.nlist <- li - return li.resp -} - -func (ml *mesListener) Unlisten(id uint64) { - ml.unlist <- id -} - -type respMes struct { - id uint64 - mes *swarm.Message -} - -func (ml *mesListener) Respond(id uint64, mes *swarm.Message) { - ml.send <- &respMes{ - id: id, - mes: mes, - } -} - -func (ml *mesListener) Halt() { - ml.haltchan <- struct{}{} -} - -func (ml *mesListener) run() { - for { - select { - case <-ml.haltchan: - return - case id := <-ml.unlist: - trg, ok := ml.listeners[id] - if !ok { - continue - } - close(trg.resp) - delete(ml.listeners, id) - case li := <-ml.nlist: - ml.listeners[li.id] = li - case s := <-ml.send: - trg, ok := ml.listeners[s.id] - if !ok { - u.DOut("Send with no listener.") - continue - } - - if time.Now().After(trg.eol) { - close(trg.resp) - delete(ml.listeners, s.id) - continue - } - - trg.resp <- s.mes - trg.count-- - - if trg.count == 0 { - close(trg.resp) - delete(ml.listeners, s.id) - } - } - } -} diff --git a/routing/dht/mes_listener_test.go b/routing/dht/mes_listener_test.go deleted file mode 100644 index 8e494aabce..0000000000 --- a/routing/dht/mes_listener_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package dht - -import ( - "testing" - "time" - - "github.com/jbenet/go-ipfs/peer" - "github.com/jbenet/go-ipfs/swarm" -) - -// Ensure that the Message Listeners basic functionality works -func TestMesListenerBasic(t *testing.T) { - ml := newMesListener() - a := GenerateMessageID() - resp := ml.Listen(a, 1, time.Minute) - - pmes := new(swarm.PBWrapper) - pmes.Message = []byte("Hello") - pmes.Type = new(swarm.PBWrapper_MessageType) - mes := swarm.NewMessage(new(peer.Peer), pmes) - - go ml.Respond(a, mes) - - del := time.After(time.Millisecond * 10) - select { - case get := <-resp: - if string(get.Data) != string(mes.Data) { - t.Fatal("Something got really messed up") - } - case <-del: - t.Fatal("Waiting on message response timed out.") - } -} diff --git a/routing/dht/providers.go b/routing/dht/providers.go index fdf8d6581a..2e89eea4c0 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -81,3 +81,7 @@ func (pm *ProviderManager) GetProviders(k u.Key) []*peer.Peer { pm.getprovs <- gp return <-gp.resp } + +func (pm *ProviderManager) Halt() { + pm.halt <- struct{}{} +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3c4ad9e00e..62ba4a53b1 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -4,8 +4,6 @@ import ( "bytes" "encoding/json" "errors" - "math/rand" - "sync" "time" proto "code.google.com/p/goprotobuf/proto" @@ -18,21 +16,6 @@ import ( u "github.com/jbenet/go-ipfs/util" ) -// Pool size is the number of nodes used for group find/set RPC calls -var PoolSize = 6 - -// We put the 'K' in kademlia! -var KValue = 10 - -// Its in the paper, i swear -var AlphaValue = 3 - -// GenerateMessageID creates and returns a new message ID -// TODO: determine a way of creating and managing message IDs -func GenerateMessageID() uint64 { - return (uint64(rand.Uint32()) << 32) | uint64(rand.Uint32()) -} - // This file implements the Routing interface for the IpfsDHT struct. // Basic Put/Get @@ -64,60 +47,6 @@ func (dht *IpfsDHT) PutValue(key u.Key, value []byte) { } } -// A counter for incrementing a variable across multiple threads -type counter struct { - n int - mut sync.RWMutex -} - -func (c *counter) Increment() { - c.mut.Lock() - c.n++ - c.mut.Unlock() -} - -func (c *counter) Decrement() { - c.mut.Lock() - c.n-- - c.mut.Unlock() -} - -func (c *counter) Size() int { - c.mut.RLock() - defer c.mut.RUnlock() - return c.n -} - -type peerSet struct { - ps map[string]bool - lk sync.RWMutex -} - -func newPeerSet() *peerSet { - ps := new(peerSet) - ps.ps = make(map[string]bool) - return ps -} - -func (ps *peerSet) Add(p *peer.Peer) { - ps.lk.Lock() - ps.ps[string(p.ID)] = true - ps.lk.Unlock() -} - -func (ps *peerSet) Contains(p *peer.Peer) bool { - ps.lk.RLock() - _, ok := ps.ps[string(p.ID)] - ps.lk.RUnlock() - return ok -} - -func (ps *peerSet) Size() int { - ps.lk.RLock() - defer ps.lk.RUnlock() - return len(ps.ps) -} - // GetValue searches for the value corresponding to given Key. // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete @@ -159,9 +88,13 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { count := 0 go func() { + defer close(procPeer) for { select { - case p := <-npeerChan: + case p, ok := <-npeerChan: + if !ok { + return + } count++ if count >= KValue { errChan <- u.ErrNotFound @@ -171,8 +104,11 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { procPeer <- p default: - if c.Size() == 0 { - errChan <- u.ErrNotFound + if c.Size() <= 0 { + select { + case errChan <- u.ErrNotFound: + default: + } return } } @@ -180,20 +116,22 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { }() process := func() { + defer c.Decrement() for p := range procPeer { if p == nil { - c.Decrement() return } val, peers, err := dht.getValueOrPeers(p, key, timeout/4, routeLevel) if err != nil { u.DErr("%v\n", err.Error()) - c.Decrement() continue } if val != nil { - valChan <- val - c.Decrement() + select { + case valChan <- val: + default: + u.DOut("Wasnt the first to return the value!") + } return } @@ -347,7 +285,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { // Thoughts: maybe this should accept an ID and do a peer lookup? u.DOut("Enter Ping.") - pmes := Message{ID: GenerateMessageID(), Type: PBDHTMessage_PING} + pmes := Message{ID: swarm.GenerateMessageID(), Type: PBDHTMessage_PING} mes := swarm.NewMessage(p, pmes.ToProtobuf()) before := time.Now() @@ -363,7 +301,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { return nil case <-tout: // Timed out, think about removing peer from network - u.DOut("Ping peer timed out.") + u.DOut("[%s] Ping peer [%s] timed out.", dht.self.ID.Pretty(), p.ID.Pretty()) dht.listener.Unlisten(pmes.ID) return u.ErrTimeout } @@ -377,7 +315,7 @@ func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) { // TODO: Add timeout to this struct so nodes know when to return pmes := Message{ Type: PBDHTMessage_DIAGNOSTIC, - ID: GenerateMessageID(), + ID: swarm.GenerateMessageID(), } listenChan := dht.listener.Listen(pmes.ID, len(targets), time.Minute*2) diff --git a/routing/dht/util.go b/routing/dht/util.go new file mode 100644 index 0000000000..18c4555a9b --- /dev/null +++ b/routing/dht/util.go @@ -0,0 +1,71 @@ +package dht + +import ( + "sync" + + peer "github.com/jbenet/go-ipfs/peer" +) + +// Pool size is the number of nodes used for group find/set RPC calls +var PoolSize = 6 + +// We put the 'K' in kademlia! +var KValue = 10 + +// Its in the paper, i swear +var AlphaValue = 3 + +// A counter for incrementing a variable across multiple threads +type counter struct { + n int + mut sync.Mutex +} + +func (c *counter) Increment() { + c.mut.Lock() + c.n++ + c.mut.Unlock() +} + +func (c *counter) Decrement() { + c.mut.Lock() + c.n-- + c.mut.Unlock() +} + +func (c *counter) Size() (s int) { + c.mut.Lock() + s = c.n + c.mut.Unlock() + return +} + +type peerSet struct { + ps map[string]bool + lk sync.RWMutex +} + +func newPeerSet() *peerSet { + ps := new(peerSet) + ps.ps = make(map[string]bool) + return ps +} + +func (ps *peerSet) Add(p *peer.Peer) { + ps.lk.Lock() + ps.ps[string(p.ID)] = true + ps.lk.Unlock() +} + +func (ps *peerSet) Contains(p *peer.Peer) bool { + ps.lk.RLock() + _, ok := ps.ps[string(p.ID)] + ps.lk.RUnlock() + return ok +} + +func (ps *peerSet) Size() int { + ps.lk.RLock() + defer ps.lk.RUnlock() + return len(ps.ps) +} From 9ec5168f1eb45014abc0b4a8cedf58e7e08b9619 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 24 Aug 2014 18:13:05 -0700 Subject: [PATCH 0057/3147] basic implementation of bitswap, needs testing/verification that it works This commit was moved from ipfs/go-blockservice@86681190298aa0ffbf736ce0225461a289f188f9 --- blockservice/blockservice.go | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 blockservice/blockservice.go diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go new file mode 100644 index 0000000000..0f5dbd888f --- /dev/null +++ b/blockservice/blockservice.go @@ -0,0 +1,54 @@ +package blockservice + +import ( + "fmt" + + ds "github.com/jbenet/datastore.go" + bitswap "github.com/jbenet/go-ipfs/bitswap" + blocks "github.com/jbenet/go-ipfs/blocks" + u "github.com/jbenet/go-ipfs/util" + + mh "github.com/jbenet/go-multihash" +) + +// BlockService is a block datastore. +// It uses an internal `datastore.Datastore` instance to store values. +type BlockService struct { + Datastore ds.Datastore + Remote *bitswap.BitSwap +} + +// NewBlockService creates a BlockService with given datastore instance. +func NewBlockService(d ds.Datastore) (*BlockService, error) { + if d == nil { + return nil, fmt.Errorf("BlockService requires valid datastore") + } + return &BlockService{Datastore: d}, nil +} + +// AddBlock adds a particular block to the service, Putting it into the datastore. +func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { + k := b.Key() + dsk := ds.NewKey(string(k)) + return k, s.Datastore.Put(dsk, b.Data) +} + +// GetBlock retrieves a particular block from the service, +// Getting it from the datastore using the key (hash). +func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { + dsk := ds.NewKey(string(k)) + datai, err := s.Datastore.Get(dsk) + if err != nil { + return nil, err + } + + data, ok := datai.([]byte) + if !ok { + return nil, fmt.Errorf("data associated with %s is not a []byte", k) + } + + return &blocks.Block{ + Multihash: mh.Multihash(k), + Data: data, + }, nil +} From 3de2f9aca4798a8a2c1d3e4e01e50711b929dbfa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 24 Aug 2014 18:13:05 -0700 Subject: [PATCH 0058/3147] basic implementation of bitswap, needs testing/verification that it works This commit was moved from ipfs/go-ipfs-routing@8505073e1b7b7dbd4d2650efe602eb9243fe4d61 --- routing/dht/dht.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index aa3a8da8b5..593310d64f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -603,6 +603,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time } } +// TODO: Could be done async func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer.Peer { var provArr []*peer.Peer for _, prov := range peers { From c9ec1cc98b5d4a3bbb0f3f63b872c87309681856 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 25 Aug 2014 09:44:42 -0700 Subject: [PATCH 0059/3147] more work on bitswap and other code cleanup This commit was moved from ipfs/go-blockservice@ffc60abb306372b47deb28bb640479cae78602d0 --- blockservice/blocks_test.go | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 blockservice/blocks_test.go diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go new file mode 100644 index 0000000000..d1fe5f0807 --- /dev/null +++ b/blockservice/blocks_test.go @@ -0,0 +1,68 @@ +package blockservice + +import ( + "bytes" + "fmt" + "testing" + + ds "github.com/jbenet/datastore.go" + blocks "github.com/jbenet/go-ipfs/blocks" + u "github.com/jbenet/go-ipfs/util" +) + +func TestBlocks(t *testing.T) { + + d := ds.NewMapDatastore() + bs, err := NewBlockService(d) + if err != nil { + t.Error("failed to construct block service", err) + return + } + + b, err := blocks.NewBlock([]byte("beep boop")) + if err != nil { + t.Error("failed to construct block", err) + return + } + + h, err := u.Hash([]byte("beep boop")) + if err != nil { + t.Error("failed to hash data", err) + return + } + + if !bytes.Equal(b.Multihash, h) { + t.Error("Block Multihash and data multihash not equal") + } + + if b.Key() != u.Key(h) { + t.Error("Block key and data multihash key not equal") + } + + k, err := bs.AddBlock(b) + if err != nil { + t.Error("failed to add block to BlockService", err) + return + } + + if k != b.Key() { + t.Error("returned key is not equal to block key", err) + } + + b2, err := bs.GetBlock(b.Key()) + if err != nil { + t.Error("failed to retrieve block from BlockService", err) + return + } + + if b.Key() != b2.Key() { + t.Error("Block keys not equal.") + } + + if !bytes.Equal(b.Data, b2.Data) { + t.Error("Block data is not equal.") + } + + fmt.Printf("key: %s\n", b.Key()) + fmt.Printf("data: %v\n", b.Data) +} From e661c0676bd272df4bd6739229755a164d4e99d5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 25 Aug 2014 09:44:42 -0700 Subject: [PATCH 0060/3147] more work on bitswap and other code cleanup This commit was moved from ipfs/go-ipfs-routing@5052ac4a9d4b82c1887d49d4408799af4a057931 --- routing/dht/routing.go | 56 +++++++++++++++++++++++++++++++++++++++++- routing/dht/util.go | 12 +++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 62ba4a53b1..e4073c260f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -22,7 +22,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(key u.Key, value []byte) { +func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { complete := make(chan struct{}) count := 0 for _, route := range dht.routingTables { @@ -45,6 +45,7 @@ func (dht *IpfsDHT) PutValue(key u.Key, value []byte) { for i := 0; i < count; i++ { <-complete } + return nil } // GetValue searches for the value corresponding to given Key. @@ -183,6 +184,59 @@ func (dht *IpfsDHT) Provide(key u.Key) error { return nil } +func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Duration) chan *peer.Peer { + peerOut := make(chan *peer.Peer, count) + go func() { + ps := newPeerSet() + provs := dht.providers.GetProviders(key) + for _, p := range provs { + count-- + // NOTE: assuming that the list of peers is unique + ps.Add(p) + peerOut <- p + if count <= 0 { + return + } + } + + peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) + for _, pp := range peers { + go func() { + pmes, err := dht.findProvidersSingle(pp, key, 0, timeout) + if err != nil { + u.PErr("%v\n", err) + return + } + dht.addPeerListAsync(key, pmes.GetPeers(), ps, count, peerOut) + }() + } + + }() + return peerOut +} + +//TODO: this function could also be done asynchronously +func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*PBDHTMessage_PBPeer, ps *peerSet, count int, out chan *peer.Peer) { + for _, pbp := range peers { + maddr, err := ma.NewMultiaddr(pbp.GetAddr()) + if err != nil { + u.PErr("%v\n", err) + continue + } + p, err := dht.network.GetConnection(peer.ID(pbp.GetId()), maddr) + if err != nil { + u.PErr("%v\n", err) + continue + } + dht.providers.AddProvider(k, p) + if ps.AddIfSmallerThan(p, count) { + out <- p + } else if ps.Size() >= count { + return + } + } +} + // FindProviders searches for peers who can provide the value for given key. func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { ll := startNewRPC("FindProviders") diff --git a/routing/dht/util.go b/routing/dht/util.go index 18c4555a9b..d12f7f9dfd 100644 --- a/routing/dht/util.go +++ b/routing/dht/util.go @@ -40,6 +40,7 @@ func (c *counter) Size() (s int) { return } +// peerSet is a threadsafe set of peers type peerSet struct { ps map[string]bool lk sync.RWMutex @@ -69,3 +70,14 @@ func (ps *peerSet) Size() int { defer ps.lk.RUnlock() return len(ps.ps) } + +func (ps *peerSet) AddIfSmallerThan(p *peer.Peer, maxsize int) bool { + var success bool + ps.lk.Lock() + if _, ok := ps.ps[string(p.ID)]; !ok && len(ps.ps) < maxsize { + success = true + ps.ps[string(p.ID)] = true + } + ps.lk.Unlock() + return success +} From f322871ddc2f2cbf42cd096b66dd3f5766222db1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Aug 2014 14:24:51 -0700 Subject: [PATCH 0061/3147] bitswap first working commit! This commit was moved from ipfs/go-blockservice@54ff6ea4b67564c7861486dc08285c398a4d90fe --- blockservice/blockservice.go | 45 ++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0f5dbd888f..a645c29173 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -2,6 +2,7 @@ package blockservice import ( "fmt" + "time" ds "github.com/jbenet/datastore.go" bitswap "github.com/jbenet/go-ipfs/bitswap" @@ -19,18 +20,27 @@ type BlockService struct { } // NewBlockService creates a BlockService with given datastore instance. -func NewBlockService(d ds.Datastore) (*BlockService, error) { +func NewBlockService(d ds.Datastore, rem *bitswap.BitSwap) (*BlockService, error) { if d == nil { return nil, fmt.Errorf("BlockService requires valid datastore") } - return &BlockService{Datastore: d}, nil + if rem == nil { + return nil, fmt.Errorf("BlockService requires a valid bitswap") + } + return &BlockService{Datastore: d, Remote: rem}, nil } // AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() dsk := ds.NewKey(string(k)) - return k, s.Datastore.Put(dsk, b.Data) + u.DOut("storing [%s] in datastore\n", k.Pretty()) + err := s.Datastore.Put(dsk, b.Data) + if err != nil { + return k, err + } + err = s.Remote.HaveBlock(b.Key()) + return k, err } // GetBlock retrieves a particular block from the service, @@ -38,17 +48,22 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { dsk := ds.NewKey(string(k)) datai, err := s.Datastore.Get(dsk) - if err != nil { - return nil, err + if err == nil { + bdata, ok := datai.([]byte) + if !ok { + return nil, fmt.Errorf("data associated with %s is not a []byte", k) + } + return &blocks.Block{ + Multihash: mh.Multihash(k), + Data: bdata, + }, nil + } else if err == ds.ErrNotFound { + blk, err := s.Remote.GetBlock(k, time.Second*5) + if err != nil { + return nil, err + } + return blk, nil + } else { + return nil, u.ErrNotFound } - - data, ok := datai.([]byte) - if !ok { - return nil, fmt.Errorf("data associated with %s is not a []byte", k) - } - - return &blocks.Block{ - Multihash: mh.Multihash(k), - Data: data, - }, nil } From 4b7945e3c69763ab4806a1d306cf6a6a0d3b8127 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Aug 2014 14:24:51 -0700 Subject: [PATCH 0062/3147] bitswap first working commit! This commit was moved from ipfs/go-ipfs-routing@1ecb7edab5f1e26d965f1bcb0a1847d35a60069e --- routing/dht/dht.go | 22 ++++++++++++++-------- routing/dht/dht_test.go | 11 ++++++----- routing/dht/ext_test.go | 7 ++++--- routing/dht/routing.go | 10 ++++++++-- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 593310d64f..f340bf805e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -53,11 +53,11 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT { +func NewDHT(p *peer.Peer, net swarm.Network, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) dht.network = net dht.netChan = net.GetChannel(swarm.PBWrapper_DHT_MESSAGE) - dht.datastore = ds.NewMapDatastore() + dht.datastore = dstore dht.self = p dht.providers = NewProviderManager() dht.shutdown = make(chan struct{}) @@ -322,6 +322,7 @@ type providerInfo struct { func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *PBDHTMessage) { key := u.Key(pmes.GetKey()) + u.DOut("[%s] Adding [%s] as a provider for '%s'\n", dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) dht.providers.AddProvider(key, p) } @@ -615,12 +616,8 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer p := dht.network.Find(u.Key(prov.GetId())) if p == nil { u.DOut("given provider %s was not in our network already.\n", peer.ID(prov.GetId()).Pretty()) - maddr, err := ma.NewMultiaddr(prov.GetAddr()) - if err != nil { - u.PErr("error connecting to new peer: %s\n", err) - continue - } - p, err = dht.network.GetConnection(peer.ID(prov.GetId()), maddr) + var err error + p, err = dht.peerFromInfo(prov) if err != nil { u.PErr("error connecting to new peer: %s\n", err) continue @@ -631,3 +628,12 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer } return provArr } + +func (dht *IpfsDHT) peerFromInfo(pbp *PBDHTMessage_PBPeer) (*peer.Peer, error) { + maddr, err := ma.NewMultiaddr(pbp.GetAddr()) + if err != nil { + return nil, err + } + + return dht.network.GetConnection(peer.ID(pbp.GetId()), maddr) +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 92d0931fb3..817ecec37d 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -3,6 +3,7 @@ package dht import ( "testing" + ds "github.com/jbenet/datastore.go" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" @@ -37,7 +38,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) if err != nil { t.Fatal(err) } - d := NewDHT(peers[i], net) + d := NewDHT(peers[i], net, ds.NewMapDatastore()) dhts = append(dhts, d) d.Start() } @@ -69,14 +70,14 @@ func TestPing(t *testing.T) { if err != nil { t.Fatal(err) } - dhtA := NewDHT(peerA, neta) + dhtA := NewDHT(peerA, neta, ds.NewMapDatastore()) netb := swarm.NewSwarm(peerB) err = netb.Listen() if err != nil { t.Fatal(err) } - dhtB := NewDHT(peerB, netb) + dhtB := NewDHT(peerB, netb, ds.NewMapDatastore()) dhtA.Start() dhtB.Start() @@ -120,14 +121,14 @@ func TestValueGetSet(t *testing.T) { if err != nil { t.Fatal(err) } - dhtA := NewDHT(peerA, neta) + dhtA := NewDHT(peerA, neta, ds.NewMapDatastore()) netb := swarm.NewSwarm(peerB) err = netb.Listen() if err != nil { t.Fatal(err) } - dhtB := NewDHT(peerB, netb) + dhtB := NewDHT(peerB, netb, ds.NewMapDatastore()) dhtA.Start() dhtB.Start() diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index e631e27ca8..67b108a484 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,6 +7,7 @@ import ( "code.google.com/p/goprotobuf/proto" + ds "github.com/jbenet/datastore.go" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" @@ -89,7 +90,7 @@ func TestGetFailures(t *testing.T) { local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, fn) + d := NewDHT(local, fn, ds.NewMapDatastore()) other := &peer.Peer{ID: peer.ID("other_peer")} @@ -177,7 +178,7 @@ func TestNotFound(t *testing.T) { local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, fn) + d := NewDHT(local, fn, ds.NewMapDatastore()) d.Start() var ps []*peer.Peer @@ -239,7 +240,7 @@ func TestLessThanKResponses(t *testing.T) { local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, fn) + d := NewDHT(local, fn, ds.NewMapDatastore()) d.Start() var ps []*peer.Peer diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e4073c260f..082f737f5e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -63,7 +63,7 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { val, err := dht.getLocal(key) if err == nil { ll.Success = true - u.DOut("Found local, returning.") + u.DOut("Found local, returning.\n") return val, nil } @@ -218,6 +218,9 @@ func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Durati //TODO: this function could also be done asynchronously func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*PBDHTMessage_PBPeer, ps *peerSet, count int, out chan *peer.Peer) { for _, pbp := range peers { + if peer.ID(pbp.GetId()).Equal(dht.self.ID) { + continue + } maddr, err := ma.NewMultiaddr(pbp.GetAddr()) if err != nil { u.PErr("%v\n", err) @@ -256,11 +259,14 @@ func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Pee return nil, err } if pmes.GetSuccess() { + u.DOut("Got providers back from findProviders call!\n") provs := dht.addPeerList(key, pmes.GetPeers()) ll.Success = true return provs, nil } + u.DOut("Didnt get providers, just closer peers.\n") + closer := pmes.GetPeers() if len(closer) == 0 { level++ @@ -337,7 +343,7 @@ func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, err // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { // Thoughts: maybe this should accept an ID and do a peer lookup? - u.DOut("Enter Ping.") + u.DOut("Enter Ping.\n") pmes := Message{ID: swarm.GenerateMessageID(), Type: PBDHTMessage_PING} mes := swarm.NewMessage(p, pmes.ToProtobuf()) From 76bb6e16714c51d7124b91cb99a9f226c596d53c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Aug 2014 12:01:03 -0700 Subject: [PATCH 0063/3147] fixing up some bitswap stuff after the PR This commit was moved from ipfs/go-blockservice@732b9a7e3ab43f8f28e0b867f4831c240523ca26 --- blockservice/blocks_test.go | 7 +------ blockservice/blockservice.go | 8 +++++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index d1fe5f0807..28034b711c 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -2,7 +2,6 @@ package blockservice import ( "bytes" - "fmt" "testing" ds "github.com/jbenet/datastore.go" @@ -11,9 +10,8 @@ import ( ) func TestBlocks(t *testing.T) { - d := ds.NewMapDatastore() - bs, err := NewBlockService(d) + bs, err := NewBlockService(d, nil) if err != nil { t.Error("failed to construct block service", err) return @@ -62,7 +60,4 @@ func TestBlocks(t *testing.T) { if !bytes.Equal(b.Data, b2.Data) { t.Error("Block data is not equal.") } - - fmt.Printf("key: %s\n", b.Key()) - fmt.Printf("data: %v\n", b.Data) } diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index a645c29173..eb59151cd9 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -25,7 +25,7 @@ func NewBlockService(d ds.Datastore, rem *bitswap.BitSwap) (*BlockService, error return nil, fmt.Errorf("BlockService requires valid datastore") } if rem == nil { - return nil, fmt.Errorf("BlockService requires a valid bitswap") + u.PErr("Caution: blockservice running in local (offline) mode.\n") } return &BlockService{Datastore: d, Remote: rem}, nil } @@ -39,7 +39,9 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { if err != nil { return k, err } - err = s.Remote.HaveBlock(b.Key()) + if s.Remote != nil { + err = s.Remote.HaveBlock(b.Key()) + } return k, err } @@ -57,7 +59,7 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { Multihash: mh.Multihash(k), Data: bdata, }, nil - } else if err == ds.ErrNotFound { + } else if err == ds.ErrNotFound && s.Remote != nil { blk, err := s.Remote.GetBlock(k, time.Second*5) if err != nil { return nil, err From 17308802c8ac91d980deb6327f8ac24da865739f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Aug 2014 12:01:03 -0700 Subject: [PATCH 0064/3147] fixing up some bitswap stuff after the PR This commit was moved from ipfs/go-ipfs-routing@3745c3277fba428a1209d9528b0cdfb513e11cd9 --- routing/dht/dht.go | 4 ++-- routing/kbucket/table_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f340bf805e..b1a6e59c9e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -49,7 +49,7 @@ type IpfsDHT struct { diaglock sync.Mutex // listener is a server to register to listen for responses to messages - listener *swarm.MesListener + listener *swarm.MessageListener } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -66,7 +66,7 @@ func NewDHT(p *peer.Peer, net swarm.Network, dstore ds.Datastore) *IpfsDHT { dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) - dht.listener = swarm.NewMesListener() + dht.listener = swarm.NewMessageListener() dht.birth = time.Now() return dht } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 13a55d14cf..dbb391ff38 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -78,7 +78,7 @@ func TestTableUpdate(t *testing.T) { for i := 0; i < 10000; i++ { p := rt.Update(peers[rand.Intn(len(peers))]) if p != nil { - t.Log("evicted peer.") + //t.Log("evicted peer.") } } From 322a6713c58b51f0e5328e0073430ae0c7babd78 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Aug 2014 16:48:00 -0700 Subject: [PATCH 0065/3147] rework bitswap to reflect discussion on PR #32 This commit was moved from ipfs/go-blockservice@1c51a5220b9041c5c9dfc20d9180887e9311deda --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index eb59151cd9..a2924d73f9 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -40,7 +40,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { return k, err } if s.Remote != nil { - err = s.Remote.HaveBlock(b.Key()) + err = s.Remote.HaveBlock(b) } return k, err } From 5c1236969e2cde874fa24b3c9e6bc42aedfd8324 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Aug 2014 16:48:00 -0700 Subject: [PATCH 0066/3147] rework bitswap to reflect discussion on PR #32 This commit was moved from ipfs/go-ipfs-routing@d018b754e60a76dc51a4029edf1492195d9a9992 --- routing/dht/Message.go | 2 +- routing/dht/messages.pb.go | 27 ++++++++++++--------------- routing/dht/messages.proto | 2 +- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 20c311d802..4163fb4859 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -11,7 +11,7 @@ type Message struct { Key string Value []byte Response bool - ID uint64 + ID string Success bool Peers []*peer.Peer } diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index 7c337d3067..a2452dc287 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-go. // source: messages.proto // DO NOT EDIT! @@ -13,7 +13,7 @@ It has these top-level messages: */ package dht -import proto "code.google.com/p/gogoprotobuf/proto" +import proto "code.google.com/p/goprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -69,17 +69,14 @@ func (x *PBDHTMessage_MessageType) UnmarshalJSON(data []byte) error { } type PBDHTMessage struct { - Type *PBDHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.PBDHTMessage_MessageType" json:"type,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` - // Unique ID of this message, used to match queries with responses - Id *uint64 `protobuf:"varint,4,req,name=id" json:"id,omitempty"` - // Signals whether or not this message is a response to another message - Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` - Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` - // Used for returning peers from queries (normally, peers closer to X) - Peers []*PBDHTMessage_PBPeer `protobuf:"bytes,7,rep,name=peers" json:"peers,omitempty"` - XXX_unrecognized []byte `json:"-"` + Type *PBDHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.PBDHTMessage_MessageType" json:"type,omitempty"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + Id *string `protobuf:"bytes,4,req,name=id" json:"id,omitempty"` + Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` + Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` + Peers []*PBDHTMessage_PBPeer `protobuf:"bytes,7,rep,name=peers" json:"peers,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *PBDHTMessage) Reset() { *m = PBDHTMessage{} } @@ -107,11 +104,11 @@ func (m *PBDHTMessage) GetValue() []byte { return nil } -func (m *PBDHTMessage) GetId() uint64 { +func (m *PBDHTMessage) GetId() string { if m != nil && m.Id != nil { return *m.Id } - return 0 + return "" } func (m *PBDHTMessage) GetResponse() bool { diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index 4d4e8c61fd..c2c5cc30d8 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -23,7 +23,7 @@ message PBDHTMessage { optional bytes value = 3; // Unique ID of this message, used to match queries with responses - required uint64 id = 4; + required string id = 4; // Signals whether or not this message is a response to another message optional bool response = 5; From 6acb2cb3dc0b1eaa6fe9eb89a1b893ceddd675da Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 29 Aug 2014 11:34:50 -0700 Subject: [PATCH 0067/3147] integrate bitswap and blockservice into the core package This commit was moved from ipfs/go-blockservice@3df9fe4b697b5fec2c06ee16a3ed57c3b965e54a --- blockservice/blockservice.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index a2924d73f9..ceb806f9b3 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -48,24 +48,29 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { + u.DOut("BlockService GetBlock: '%s'\n", k.Pretty()) dsk := ds.NewKey(string(k)) datai, err := s.Datastore.Get(dsk) if err == nil { + u.DOut("Blockservice: Got data in datastore.\n") bdata, ok := datai.([]byte) if !ok { return nil, fmt.Errorf("data associated with %s is not a []byte", k) } + u.DOut("Got data: %v\n", bdata) return &blocks.Block{ Multihash: mh.Multihash(k), Data: bdata, }, nil } else if err == ds.ErrNotFound && s.Remote != nil { + u.DOut("Blockservice: Searching bitswap.\n") blk, err := s.Remote.GetBlock(k, time.Second*5) if err != nil { return nil, err } return blk, nil } else { + u.DOut("Blockservice GetBlock: Not found.\n") return nil, u.ErrNotFound } } From bc878f3978b9a0ed8ede6ed8a67a1a92354422da Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 29 Aug 2014 11:34:50 -0700 Subject: [PATCH 0068/3147] integrate bitswap and blockservice into the core package This commit was moved from ipfs/go-path@2ef7f7b2ec05c6064764ef3da796a56cd74476f7 --- path/path.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 3f1c3997e4..ffcfd47c25 100644 --- a/path/path.go +++ b/path/path.go @@ -2,11 +2,12 @@ package path import ( "fmt" + "path" + "strings" + merkledag "github.com/jbenet/go-ipfs/merkledag" u "github.com/jbenet/go-ipfs/util" mh "github.com/jbenet/go-multihash" - "path" - "strings" ) // Resolver provides path resolution to IPFS @@ -19,6 +20,7 @@ type Resolver struct { // path component as a hash (key) of the first node, then resolves // all other components walking the links, with ResolveLinks. func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { + u.DOut("Resolve: '%s'\n", fpath) fpath = path.Clean(fpath) parts := strings.Split(fpath, "/") @@ -39,6 +41,7 @@ func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { return nil, err } + u.DOut("Resolve dag get.\n") nd, err := s.DAG.Get(u.Key(h)) if err != nil { return nil, err From cc664062bd045e670fb36aa135e47ddc2faa09ea Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Sep 2014 16:09:03 -0700 Subject: [PATCH 0069/3147] add pub/priv key code to identify, not complete yet This commit was moved from ipfs/go-ipfs-routing@4e1b2d3f8f9c0642f48336bf3c2e7ed433aba90e --- routing/dht/dht.go | 8 +++++++ routing/dht/routing.go | 50 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b1a6e59c9e..3be7a2cbb5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -2,6 +2,7 @@ package dht import ( "bytes" + "crypto/rand" "fmt" "sync" "time" @@ -637,3 +638,10 @@ func (dht *IpfsDHT) peerFromInfo(pbp *PBDHTMessage_PBPeer) (*peer.Peer, error) { return dht.network.GetConnection(peer.ID(pbp.GetId()), maddr) } + +// Builds up list of peers by requesting random peer IDs +func (dht *IpfsDHT) Bootstrap() { + id := make([]byte, 16) + rand.Read(id) + dht.FindPeer(peer.ID(id), time.Second*10) +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 082f737f5e..5ab1b65de7 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -340,6 +340,56 @@ func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, err return nil, u.ErrNotFound } +func (dht *IpfsDHT) findPeerMultiple(id peer.ID, timeout time.Duration) (*peer.Peer, error) { + // Check if were already connected to them + p, _ := dht.Find(id) + if p != nil { + return p, nil + } + + routeLevel := 0 + peers := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) + if len(peers) == 0 { + return nil, kb.ErrLookupFailure + } + + found := make(chan *peer.Peer) + after := time.After(timeout) + + for _, p := range peers { + go func(p *peer.Peer) { + pmes, err := dht.findPeerSingle(p, id, timeout, routeLevel) + if err != nil { + u.DErr("getPeer error: %v\n", err) + return + } + plist := pmes.GetPeers() + if len(plist) == 0 { + routeLevel++ + } + for _, fp := range plist { + nxtp, err := dht.peerFromInfo(fp) + if err != nil { + u.DErr("findPeer error: %v\n", err) + continue + } + + if nxtp.ID.Equal(dht.self.ID) { + found <- nxtp + return + } + } + }(p) + } + + select { + case p := <-found: + return p, nil + case <-after: + return nil, u.ErrTimeout + } +} + // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { // Thoughts: maybe this should accept an ID and do a peer lookup? From 92b0a3b2484d73076521c9c0ec997bd5424ecd86 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Sep 2014 21:55:59 -0700 Subject: [PATCH 0070/3147] fix up tests that started failing after changing identify code This commit was moved from ipfs/go-ipfs-routing@2004a97626ec2c78f805b80254ad8cdb750c831a --- routing/dht/dht_test.go | 51 ++++++++++++++++++++++++++++------------- routing/dht/routing.go | 3 ++- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 817ecec37d..c8a0859d30 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -4,6 +4,7 @@ import ( "testing" ds "github.com/jbenet/datastore.go" + identify "github.com/jbenet/go-ipfs/identify" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" @@ -27,7 +28,17 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) for i := 0; i < 4; i++ { p := new(peer.Peer) p.AddAddress(addrs[i]) - p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i))) + kp, err := identify.GenKeypair(256) + if err != nil { + panic(err) + } + p.PubKey = kp.Pub + p.PrivKey = kp.Priv + id, err := kp.ID() + if err != nil { + panic(err) + } + p.ID = id peers = append(peers, p) } @@ -46,8 +57,26 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) return addrs, peers, dhts } +func makePeer(addr *ma.Multiaddr) *peer.Peer { + p := new(peer.Peer) + p.AddAddress(addr) + kp, err := identify.GenKeypair(256) + if err != nil { + panic(err) + } + p.PrivKey = kp.Priv + p.PubKey = kp.Pub + id, err := kp.ID() + if err != nil { + panic(err) + } + + p.ID = id + return p +} + func TestPing(t *testing.T) { - u.Debug = false + u.Debug = true addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") if err != nil { t.Fatal(err) @@ -57,13 +86,8 @@ func TestPing(t *testing.T) { t.Fatal(err) } - peerA := new(peer.Peer) - peerA.AddAddress(addrA) - peerA.ID = peer.ID([]byte("peerA")) - - peerB := new(peer.Peer) - peerB.AddAddress(addrB) - peerB.ID = peer.ID([]byte("peerB")) + peerA := makePeer(addrA) + peerB := makePeer(addrB) neta := swarm.NewSwarm(peerA) err = neta.Listen() @@ -108,13 +132,8 @@ func TestValueGetSet(t *testing.T) { t.Fatal(err) } - peerA := new(peer.Peer) - peerA.AddAddress(addrA) - peerA.ID = peer.ID([]byte("peerA")) - - peerB := new(peer.Peer) - peerB.AddAddress(addrB) - peerB.ID = peer.ID([]byte("peerB")) + peerA := makePeer(addrA) + peerB := makePeer(addrB) neta := swarm.NewSwarm(peerA) err = neta.Listen() diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 5ab1b65de7..3b3b4875bb 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -315,8 +315,9 @@ func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, err for routeLevel < len(dht.routingTables) { pmes, err := dht.findPeerSingle(p, id, timeout, routeLevel) plist := pmes.GetPeers() - if len(plist) == 0 { + if plist == nil || len(plist) == 0 { routeLevel++ + continue } found := plist[0] From b2b52f1d6a5a62e2dc1ec7200ca9c93e0cb342f3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 3 Sep 2014 20:15:10 +0000 Subject: [PATCH 0071/3147] create new crypto package and make rest of repo use it This commit was moved from ipfs/go-ipfs-routing@a7105317133b7002ec8dd9eaa2d267ac9e57ee72 --- routing/dht/dht_test.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index c8a0859d30..1efb5e77b0 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -4,6 +4,7 @@ import ( "testing" ds "github.com/jbenet/datastore.go" + ci "github.com/jbenet/go-ipfs/crypto" identify "github.com/jbenet/go-ipfs/identify" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" @@ -28,13 +29,13 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) for i := 0; i < 4; i++ { p := new(peer.Peer) p.AddAddress(addrs[i]) - kp, err := identify.GenKeypair(256) + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 256) if err != nil { panic(err) } - p.PubKey = kp.Pub - p.PrivKey = kp.Priv - id, err := kp.ID() + p.PubKey = pk + p.PrivKey = sk + id, err := identify.IdFromPubKey(pk) if err != nil { panic(err) } @@ -60,13 +61,13 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) func makePeer(addr *ma.Multiaddr) *peer.Peer { p := new(peer.Peer) p.AddAddress(addr) - kp, err := identify.GenKeypair(256) + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 256) if err != nil { panic(err) } - p.PrivKey = kp.Priv - p.PubKey = kp.Pub - id, err := kp.ID() + p.PrivKey = sk + p.PubKey = pk + id, err := identify.IdFromPubKey(pk) if err != nil { panic(err) } From e68651740a71c30fba3c49f9067aa0fdbf0f7d0e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 4 Sep 2014 03:37:29 +0000 Subject: [PATCH 0072/3147] fix issue with blocks not actually being stored via dagservice This commit was moved from ipfs/go-blockservice@136d8df3f0a13367151dd7b3e4fe72713d09a56b --- blockservice/blockservice.go | 1 - 1 file changed, 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index ceb806f9b3..9c114a5d69 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -57,7 +57,6 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { if !ok { return nil, fmt.Errorf("data associated with %s is not a []byte", k) } - u.DOut("Got data: %v\n", bdata) return &blocks.Block{ Multihash: mh.Multihash(k), Data: bdata, From 41297dfd60476cd14c2cf819c5900c34edfd803a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 4 Sep 2014 20:32:46 +0000 Subject: [PATCH 0073/3147] allow peers to realize that they are actually a provider for a value This commit was moved from ipfs/go-ipfs-routing@c11a55367069ba17ca3da897cd8042889c5ff9f3 --- routing/dht/dht.go | 26 +++++++++++++++++++++++++- routing/dht/providers.go | 23 ++++++++++++++++++++++- routing/dht/providers_test.go | 20 ++++++++++++++++++++ routing/dht/routing.go | 1 + 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 routing/dht/providers_test.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b1a6e59c9e..7a88bebc0d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -2,6 +2,7 @@ package dht import ( "bytes" + "crypto/rand" "fmt" "sync" "time" @@ -59,7 +60,7 @@ func NewDHT(p *peer.Peer, net swarm.Network, dstore ds.Datastore) *IpfsDHT { dht.netChan = net.GetChannel(swarm.PBWrapper_DHT_MESSAGE) dht.datastore = dstore dht.self = p - dht.providers = NewProviderManager() + dht.providers = NewProviderManager(p.ID) dht.shutdown = make(chan struct{}) dht.routingTables = make([]*kb.RoutingTable, 3) @@ -293,7 +294,15 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { Response: true, } + has, err := dht.datastore.Has(ds.NewKey(pmes.GetKey())) + if err != nil { + dht.netChan.Errors <- err + } + providers := dht.providers.GetProviders(u.Key(pmes.GetKey())) + if has { + providers = append(providers, dht.self) + } if providers == nil || len(providers) == 0 { level := 0 if len(pmes.GetValue()) > 0 { @@ -637,3 +646,18 @@ func (dht *IpfsDHT) peerFromInfo(pbp *PBDHTMessage_PBPeer) (*peer.Peer, error) { return dht.network.GetConnection(peer.ID(pbp.GetId()), maddr) } + +func (dht *IpfsDHT) loadProvidableKeys() error { + kl := dht.datastore.KeyList() + for _, k := range kl { + dht.providers.AddProvider(u.Key(k.Bytes()), dht.self) + } + return nil +} + +// Builds up list of peers by requesting random peer IDs +func (dht *IpfsDHT) Bootstrap() { + id := make([]byte, 16) + rand.Read(id) + dht.FindPeer(peer.ID(id), time.Second*10) +} diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 2e89eea4c0..c62755cf2b 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -9,9 +9,13 @@ import ( type ProviderManager struct { providers map[u.Key][]*providerInfo + local map[u.Key]struct{} + lpeer peer.ID + getlocal chan chan []u.Key newprovs chan *addProv getprovs chan *getProv halt chan struct{} + period time.Duration } type addProv struct { @@ -24,11 +28,13 @@ type getProv struct { resp chan []*peer.Peer } -func NewProviderManager() *ProviderManager { +func NewProviderManager(local peer.ID) *ProviderManager { pm := new(ProviderManager) pm.getprovs = make(chan *getProv) pm.newprovs = make(chan *addProv) pm.providers = make(map[u.Key][]*providerInfo) + pm.getlocal = make(chan chan []u.Key) + pm.local = make(map[u.Key]struct{}) pm.halt = make(chan struct{}) go pm.run() return pm @@ -39,6 +45,9 @@ func (pm *ProviderManager) run() { for { select { case np := <-pm.newprovs: + if np.val.ID.Equal(pm.lpeer) { + pm.local[np.k] = struct{}{} + } pi := new(providerInfo) pi.Creation = time.Now() pi.Value = np.val @@ -51,6 +60,12 @@ func (pm *ProviderManager) run() { parr = append(parr, p.Value) } gp.resp <- parr + case lc := <-pm.getlocal: + var keys []u.Key + for k, _ := range pm.local { + keys = append(keys, k) + } + lc <- keys case <-tick.C: for k, provs := range pm.providers { var filtered []*providerInfo @@ -82,6 +97,12 @@ func (pm *ProviderManager) GetProviders(k u.Key) []*peer.Peer { return <-gp.resp } +func (pm *ProviderManager) GetLocal() []u.Key { + resp := make(chan []u.Key) + pm.getlocal <- resp + return <-resp +} + func (pm *ProviderManager) Halt() { pm.halt <- struct{}{} } diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go new file mode 100644 index 0000000000..0cdfa4fcc7 --- /dev/null +++ b/routing/dht/providers_test.go @@ -0,0 +1,20 @@ +package dht + +import ( + "testing" + + "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) + +func TestProviderManager(t *testing.T) { + mid := peer.ID("testing") + p := NewProviderManager(mid) + a := u.Key("test") + p.AddProvider(a, &peer.Peer{}) + resp := p.GetProviders(a) + if len(resp) != 1 { + t.Fatal("Could not retrieve provider.") + } + p.Halt() +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 082f737f5e..6ceeb9a93f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -166,6 +166,7 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // Provide makes this node announce that it can provide a value for the given key func (dht *IpfsDHT) Provide(key u.Key) error { + dht.providers.AddProvider(key, dht.self) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { return kb.ErrLookupFailure From 3af22e03fd3e24fb5725674bdfd847fb1fbc85fa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 6 Sep 2014 22:11:44 +0000 Subject: [PATCH 0074/3147] rework dagreader to have a dagservice for node resolution This commit was moved from ipfs/go-ipfs-routing@d84b8812aab5eac0b2b09eb4ff4403d9c7de8e09 --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 1565133dc4..31a99def67 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -192,7 +192,7 @@ func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Durati provs := dht.providers.GetProviders(key) for _, p := range provs { count-- - // NOTE: assuming that the list of peers is unique + // NOTE: assuming that this list of peers is unique ps.Add(p) peerOut <- p if count <= 0 { From 68f50d42f908daf1817892ca6c0ac49533c105e0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 7 Sep 2014 04:25:13 +0000 Subject: [PATCH 0075/3147] clean up merge of bren2010's crypto branch and merge into master This commit was moved from ipfs/go-ipfs-routing@be98a6e4250d888df0b2a6bdeafa54ed65824e29 --- routing/dht/dht.go | 5 ++++- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 2 -- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 7a88bebc0d..883fec3331 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -648,7 +648,10 @@ func (dht *IpfsDHT) peerFromInfo(pbp *PBDHTMessage_PBPeer) (*peer.Peer, error) { } func (dht *IpfsDHT) loadProvidableKeys() error { - kl := dht.datastore.KeyList() + kl, err := dht.datastore.KeyList() + if err != nil { + return err + } for _, k := range kl { dht.providers.AddProvider(u.Key(k.Bytes()), dht.self) } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1efb5e77b0..2997d3797a 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -29,7 +29,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) for i := 0; i < 4; i++ { p := new(peer.Peer) p.AddAddress(addrs[i]) - sk, pk, err := ci.GenerateKeyPair(ci.RSA, 256) + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) if err != nil { panic(err) } @@ -61,7 +61,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) func makePeer(addr *ma.Multiaddr) *peer.Peer { p := new(peer.Peer) p.AddAddress(addr) - sk, pk, err := ci.GenerateKeyPair(ci.RSA, 256) + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) if err != nil { panic(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 67b108a484..2b5f3ff72f 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -189,7 +189,6 @@ func TestNotFound(t *testing.T) { // Reply with random peers to every message fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - t.Log("Handling message...") pmes := new(PBDHTMessage) err := proto.Unmarshal(mes.Data, pmes) if err != nil { @@ -252,7 +251,6 @@ func TestLessThanKResponses(t *testing.T) { // Reply with random peers to every message fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - t.Log("Handling message...") pmes := new(PBDHTMessage) err := proto.Unmarshal(mes.Data, pmes) if err != nil { From 4d3b3120b818d68fa43f6e95d6e239a2b589d7f3 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 9 Sep 2014 22:39:42 -0700 Subject: [PATCH 0076/3147] vendor dependencies with godep dependencies are vendored into Godeps/_workspace and commit versions are recorded in Godeps.json update datastore to e89f0511 update go.crypto This commit was moved from ipfs/go-ipfs-routing@476e5f580448dd58427336226d8f77100a1347cf --- routing/dht/Message.go | 2 +- routing/dht/dht.go | 6 +++--- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 6 +++--- routing/dht/messages.pb.go | 2 +- routing/dht/routing.go | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 4163fb4859..21bd26a85d 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -1,7 +1,7 @@ package dht import ( - "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" peer "github.com/jbenet/go-ipfs/peer" ) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 883fec3331..83962e2108 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -12,11 +12,11 @@ import ( swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" - ma "github.com/jbenet/go-multiaddr" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ds "github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2997d3797a..9e14987d8c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -3,13 +3,13 @@ package dht import ( "testing" - ds "github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ci "github.com/jbenet/go-ipfs/crypto" identify "github.com/jbenet/go-ipfs/identify" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" - ma "github.com/jbenet/go-multiaddr" "fmt" "time" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 2b5f3ff72f..82337bfa6f 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -5,13 +5,13 @@ import ( crand "crypto/rand" - "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ds "github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" peer "github.com/jbenet/go-ipfs/peer" swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" - ma "github.com/jbenet/go-multiaddr" "time" ) diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index a2452dc287..90c936eb91 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package dht -import proto "code.google.com/p/goprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 31a99def67..383c64a989 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -6,9 +6,9 @@ import ( "errors" "time" - proto "code.google.com/p/goprotobuf/proto" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ma "github.com/jbenet/go-multiaddr" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" From 7ec74b5c1afe7202ae4926263c75925fd9bf13f9 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 9 Sep 2014 22:39:42 -0700 Subject: [PATCH 0077/3147] vendor dependencies with godep dependencies are vendored into Godeps/_workspace and commit versions are recorded in Godeps.json update datastore to e89f0511 update go.crypto This commit was moved from ipfs/go-blockservice@e35b46ebfcf4f550f6ac927f606e177573d4f35e --- blockservice/blocks_test.go | 2 +- blockservice/blockservice.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 28034b711c..c610fbd2a1 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - ds "github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 9c114a5d69..8f923c76bb 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -4,12 +4,12 @@ import ( "fmt" "time" - ds "github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" bitswap "github.com/jbenet/go-ipfs/bitswap" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" - mh "github.com/jbenet/go-multihash" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ) // BlockService is a block datastore. From fe65d60df329c4553c1599868045e49e167b1a41 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 9 Sep 2014 22:39:42 -0700 Subject: [PATCH 0078/3147] vendor dependencies with godep dependencies are vendored into Godeps/_workspace and commit versions are recorded in Godeps.json update datastore to e89f0511 update go.crypto This commit was moved from ipfs/go-path@59d3e5c03913e079d5457b171ef6065991a11ebc --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index ffcfd47c25..a06fb98cb2 100644 --- a/path/path.go +++ b/path/path.go @@ -5,9 +5,9 @@ import ( "path" "strings" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" merkledag "github.com/jbenet/go-ipfs/merkledag" u "github.com/jbenet/go-ipfs/util" - mh "github.com/jbenet/go-multihash" ) // Resolver provides path resolution to IPFS From fd85679563af5dab4a2c232e0220521767407e47 Mon Sep 17 00:00:00 2001 From: Siraj Ravel Date: Thu, 11 Sep 2014 12:25:52 -0700 Subject: [PATCH 0079/3147] golint cleanup This commit was moved from ipfs/go-ipfs-routing@9fe70ae2f948a5b0af6e41005a54c8289603ef56 --- routing/dht/dht_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 9e14987d8c..3b8f7f7d11 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -35,7 +35,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) } p.PubKey = pk p.PrivKey = sk - id, err := identify.IdFromPubKey(pk) + id, err := identify.IDFromPubKey(pk) if err != nil { panic(err) } @@ -67,7 +67,7 @@ func makePeer(addr *ma.Multiaddr) *peer.Peer { } p.PrivKey = sk p.PubKey = pk - id, err := identify.IdFromPubKey(pk) + id, err := identify.IDFromPubKey(pk) if err != nil { panic(err) } From 1324b9295c0f629c3f710cbc82a6f4b9ce1785b9 Mon Sep 17 00:00:00 2001 From: Siraj Ravel Date: Sun, 14 Sep 2014 20:59:09 -0700 Subject: [PATCH 0080/3147] Test for getLocal method in DHT This commit was moved from ipfs/go-ipfs-routing@eb90de892375faea55a01ec9ab254b792b0af510 --- routing/dht/dht_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3b8f7f7d11..68812669c8 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -179,6 +179,7 @@ func TestValueGetSet(t *testing.T) { if string(val) != "world" { t.Fatalf("Expected 'world' got '%s'", string(val)) } + } func TestProvides(t *testing.T) { @@ -206,6 +207,11 @@ func TestProvides(t *testing.T) { t.Fatal(err) } + _, err = dhts[3].getLocal(u.Key("hello")) + if err != nil { + t.Fatal(err) + } + err = dhts[3].Provide(u.Key("hello")) if err != nil { t.Fatal(err) From aa386b8e034a0ce06b3f84fdf97aca9612e00429 Mon Sep 17 00:00:00 2001 From: Siraj Ravel Date: Sun, 14 Sep 2014 21:44:19 -0700 Subject: [PATCH 0081/3147] checking returned value This commit was moved from ipfs/go-ipfs-routing@43c04039baf69770fd3cc31d5af5347e0c419b82 --- routing/dht/dht_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 68812669c8..f532308644 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,6 +11,7 @@ import ( swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" + "bytes" "fmt" "time" ) @@ -207,8 +208,8 @@ func TestProvides(t *testing.T) { t.Fatal(err) } - _, err = dhts[3].getLocal(u.Key("hello")) - if err != nil { + bits, err := dhts[3].getLocal(u.Key("hello")) + if err != nil && bytes.Equal(bits, []byte("world")) { t.Fatal(err) } From eb4b7f068b814a559025d2c3342887bf808a0cb6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 15 Sep 2014 20:45:36 +0000 Subject: [PATCH 0082/3147] improve cleaning up in dht tests. This commit was moved from ipfs/go-ipfs-routing@129bd922379458b9a0d923329be867bc044da190 --- routing/dht/dht_test.go | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f532308644..b2e72eded8 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -107,6 +107,8 @@ func TestPing(t *testing.T) { dhtA.Start() dhtB.Start() + defer dhtA.Halt() + defer dhtB.Halt() _, err = dhtA.Connect(addrB) if err != nil { @@ -118,9 +120,6 @@ func TestPing(t *testing.T) { if err != nil { t.Fatal(err) } - - dhtA.Halt() - dhtB.Halt() } func TestValueGetSet(t *testing.T) { @@ -153,6 +152,8 @@ func TestValueGetSet(t *testing.T) { dhtA.Start() dhtB.Start() + defer dhtA.Halt() + defer dhtB.Halt() errsa := dhtA.network.GetErrChan() errsb := dhtB.network.GetErrChan() @@ -187,6 +188,11 @@ func TestProvides(t *testing.T) { u.Debug = false addrs, _, dhts := setupDHTS(4, t) + defer func() { + for i := 0; i < 4; i++ { + dhts[i].Halt() + } + }() _, err := dhts[0].Connect(addrs[1]) if err != nil { @@ -228,15 +234,16 @@ func TestProvides(t *testing.T) { if len(provs) != 1 { t.Fatal("Didnt get back providers") } - - for i := 0; i < 4; i++ { - dhts[i].Halt() - } } func TestLayeredGet(t *testing.T) { u.Debug = false addrs, _, dhts := setupDHTS(4, t) + defer func() { + for i := 0; i < 4; i++ { + dhts[i].Halt() + } + }() _, err := dhts[0].Connect(addrs[1]) if err != nil { @@ -274,15 +281,17 @@ func TestLayeredGet(t *testing.T) { t.Fatal("Got incorrect value.") } - for i := 0; i < 4; i++ { - dhts[i].Halt() - } } func TestFindPeer(t *testing.T) { u.Debug = false addrs, peers, dhts := setupDHTS(4, t) + go func() { + for i := 0; i < 4; i++ { + dhts[i].Halt() + } + }() _, err := dhts[0].Connect(addrs[1]) if err != nil { @@ -311,8 +320,4 @@ func TestFindPeer(t *testing.T) { if !p.ID.Equal(peers[2].ID) { t.Fatal("Didnt find expected peer.") } - - for i := 0; i < 4; i++ { - dhts[i].Halt() - } } From 3918c0e1182aaeac2d78de2c50f40a682dcf76b9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 18 Sep 2014 18:32:58 +0000 Subject: [PATCH 0083/3147] fix typo that caused test failure in dht_test.go This commit was moved from ipfs/go-ipfs-routing@a14e27ae2941f8a898ad17e7a97ba33831fad455 --- routing/dht/dht_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b2e72eded8..86dace2cc4 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -287,7 +287,7 @@ func TestFindPeer(t *testing.T) { u.Debug = false addrs, peers, dhts := setupDHTS(4, t) - go func() { + defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() } From 367312da46cd6b410238732e2ec9b7db186bd777 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 30 Aug 2014 00:00:52 -0700 Subject: [PATCH 0084/3147] Drop -> CloseConnection This commit was moved from ipfs/go-ipfs-routing@9741fa1f614bf7e1273ca43e0e8b83468a61ee56 --- routing/dht/dht.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 83962e2108..f8e5e02021 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -521,7 +521,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { func (dht *IpfsDHT) Update(p *peer.Peer) { for _, route := range dht.routingTables { removed := route.Update(p) - // Only drop the connection if no tables refer to this peer + // Only close the connection if no tables refer to this peer if removed != nil { found := false for _, r := range dht.routingTables { @@ -531,7 +531,7 @@ func (dht *IpfsDHT) Update(p *peer.Peer) { } } if !found { - dht.network.Drop(removed) + dht.network.CloseConnection(removed) } } } From fb9739ce3aba8833defe077bfb16c7e58698e546 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 30 Aug 2014 00:24:04 -0700 Subject: [PATCH 0085/3147] network.Find -> network.GetPeer This commit was moved from ipfs/go-ipfs-routing@0761ec6c096260e73dcff68802507cd937c86786 --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f8e5e02021..074815a186 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -622,7 +622,7 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer continue } // Dont add someone who is already on the list - p := dht.network.Find(u.Key(prov.GetId())) + p := dht.network.GetPeer(u.Key(prov.GetId())) if p == nil { u.DOut("given provider %s was not in our network already.\n", peer.ID(prov.GetId()).Pretty()) var err error From 81489380f44eabff09c40e38ca9add529e4c7536 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 14 Sep 2014 01:42:00 -0700 Subject: [PATCH 0086/3147] godeps multiaddr + swarm move. This commit was moved from ipfs/go-ipfs-routing@151fab28ae0f06c3433eec9745220751824087c2 --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 2 +- routing/dht/routing.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 074815a186..d78c78b542 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -7,9 +7,9 @@ import ( "sync" "time" + swarm "github.com/jbenet/go-ipfs/net/swarm" peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" - swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 86dace2cc4..24d4d4461f 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -7,8 +7,8 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ci "github.com/jbenet/go-ipfs/crypto" identify "github.com/jbenet/go-ipfs/identify" + swarm "github.com/jbenet/go-ipfs/net/swarm" peer "github.com/jbenet/go-ipfs/peer" - swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" "bytes" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 82337bfa6f..fe98443adb 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -9,8 +9,8 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + swarm "github.com/jbenet/go-ipfs/net/swarm" peer "github.com/jbenet/go-ipfs/peer" - swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" "time" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 383c64a989..3b8b25f5ca 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -10,9 +10,9 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + swarm "github.com/jbenet/go-ipfs/net/swarm" peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" - swarm "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" ) From 1a70a76247835f51a4a56be53f438a3527877569 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 14 Sep 2014 04:52:08 -0700 Subject: [PATCH 0087/3147] starting to integrate new net This commit was moved from ipfs/go-ipfs-routing@b8aa0fea62c3349c0e41db3cd5f88938334e4d1c --- routing/dht/dht.go | 8 ++------ routing/dht/dht_test.go | 6 +++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d78c78b542..788f235124 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -7,7 +7,7 @@ import ( "sync" "time" - swarm "github.com/jbenet/go-ipfs/net/swarm" + inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" @@ -28,8 +28,7 @@ type IpfsDHT struct { // NOTE: (currently, only a single table is used) routingTables []*kb.RoutingTable - network swarm.Network - netChan *swarm.Chan + network inet.Network // Local peer (yourself) self *peer.Peer @@ -48,9 +47,6 @@ type IpfsDHT struct { //lock to make diagnostics work better diaglock sync.Mutex - - // listener is a server to register to listen for responses to messages - listener *swarm.MessageListener } // NewDHT creates a new DHT object with the given peer as the 'local' host diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 24d4d4461f..f021835e27 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -6,7 +6,7 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ci "github.com/jbenet/go-ipfs/crypto" - identify "github.com/jbenet/go-ipfs/identify" + spipe "github.com/jbenet/go-ipfs/crypto/spipe" swarm "github.com/jbenet/go-ipfs/net/swarm" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -36,7 +36,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) } p.PubKey = pk p.PrivKey = sk - id, err := identify.IDFromPubKey(pk) + id, err := spipe.IDFromPubKey(pk) if err != nil { panic(err) } @@ -68,7 +68,7 @@ func makePeer(addr *ma.Multiaddr) *peer.Peer { } p.PrivKey = sk p.PubKey = pk - id, err := identify.IDFromPubKey(pk) + id, err := spipe.IDFromPubKey(pk) if err != nil { panic(err) } From 0e1afdd43d8c47f6ac129c1149544c7c068bcf74 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 14 Sep 2014 14:30:52 -0700 Subject: [PATCH 0088/3147] fix(bs) remove concrete refs to swarm and dht This commit was moved from ipfs/go-ipfs-routing@e11d77d51d3b325a0f2ccea02bb177fda89ad9bd --- routing/routing.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routing/routing.go b/routing/routing.go index fdf3507491..c8dc2772b4 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -10,6 +10,7 @@ import ( // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { + FindProvidersAsync(u.Key, int, time.Duration) <-chan *peer.Peer // Basic Put/Get From b7bac0155f8e8d8dea1f141e929d2dfd4b8fa054 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 15 Sep 2014 04:24:03 -0700 Subject: [PATCH 0089/3147] todo(blockservice, core) add notes * to wrap datastore for ease of use * to pass a non-responsive bitswap mock rather than performing nil * checks internally This commit was moved from ipfs/go-blockservice@d308efc7e9fadd455a559077ab5dd3c94e276963 --- blockservice/blockservice.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 8f923c76bb..8bd61a85d4 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -35,6 +35,8 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() dsk := ds.NewKey(string(k)) u.DOut("storing [%s] in datastore\n", k.Pretty()) + // TODO(brian): define a block datastore with a Put method which accepts a + // block parameter err := s.Datastore.Put(dsk, b.Data) if err != nil { return k, err From 9652236eea8ae22e025aa19fcb00a6a532d2c28a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 15 Sep 2014 18:29:42 -0700 Subject: [PATCH 0090/3147] better protobuf Makefile with wildcard. This commit was moved from ipfs/go-ipfs-routing@c109b7c034e568d96d4ef9ac8a937adc096428ae --- routing/dht/Makefile | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 routing/dht/Makefile diff --git a/routing/dht/Makefile b/routing/dht/Makefile new file mode 100644 index 0000000000..563234b1d3 --- /dev/null +++ b/routing/dht/Makefile @@ -0,0 +1,11 @@ + +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --gogo_out=. --proto_path=../../../../:/usr/local/opt/protobuf/include:. $< + +clean: + rm *.pb.go From 068dd4897e19a9a0acb86dc39165495969afd73f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 15 Sep 2014 04:35:30 -0700 Subject: [PATCH 0091/3147] refactor(blockservice) use bitswap.Exchange interface This commit was moved from ipfs/go-blockservice@8362ab4e71f3733d7dc9490ce76406a22eab7a28 --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 8bd61a85d4..6f5bf5104e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -16,11 +16,11 @@ import ( // It uses an internal `datastore.Datastore` instance to store values. type BlockService struct { Datastore ds.Datastore - Remote *bitswap.BitSwap + Remote bitswap.Exchange } // NewBlockService creates a BlockService with given datastore instance. -func NewBlockService(d ds.Datastore, rem *bitswap.BitSwap) (*BlockService, error) { +func NewBlockService(d ds.Datastore, rem bitswap.Exchange) (*BlockService, error) { if d == nil { return nil, fmt.Errorf("BlockService requires valid datastore") } From a0caefb47643a98e92a3e61fbe446d5a8fa8683a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 00:52:57 -0700 Subject: [PATCH 0092/3147] simpler, clearer dht message This commit was moved from ipfs/go-ipfs-routing@17616d5924a9460277271a2e28ae69d264020c43 --- routing/dht/Message.go | 44 ++++-------- routing/dht/messages.pb.go | 138 +++++++++++++++++++------------------ routing/dht/messages.proto | 28 +++++--- 3 files changed, 102 insertions(+), 108 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 21bd26a85d..210fd69685 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -5,19 +5,8 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) -// Message is a a helper struct which makes working with protbuf types easier -type Message struct { - Type PBDHTMessage_MessageType - Key string - Value []byte - Response bool - ID string - Success bool - Peers []*peer.Peer -} - -func peerInfo(p *peer.Peer) *PBDHTMessage_PBPeer { - pbp := new(PBDHTMessage_PBPeer) +func peerInfo(p *peer.Peer) *Message_Peer { + pbp := new(Message_Peer) if len(p.Addresses) == 0 || p.Addresses[0] == nil { pbp.Addr = proto.String("") } else { @@ -33,23 +22,16 @@ func peerInfo(p *peer.Peer) *PBDHTMessage_PBPeer { return pbp } -// ToProtobuf takes a Message and produces a protobuf with it. -// TODO: building the protobuf message this way is a little wasteful -// Unused fields wont be omitted, find a better way to do this -func (m *Message) ToProtobuf() *PBDHTMessage { - pmes := new(PBDHTMessage) - if m.Value != nil { - pmes.Value = m.Value - } - - pmes.Type = &m.Type - pmes.Key = &m.Key - pmes.Response = &m.Response - pmes.Id = &m.ID - pmes.Success = &m.Success - for _, p := range m.Peers { - pmes.Peers = append(pmes.Peers, peerInfo(p)) - } +// GetClusterLevel gets and adjusts the cluster level on the message. +// a +/- 1 adjustment is needed to distinguish a valid first level (1) and +// default "no value" protobuf behavior (0) +func (m *Message) GetClusterLevel() int32 { + return m.GetClusterLevelRaw() - 1 +} - return pmes +// SetClusterLevel adjusts and sets the cluster level on the message. +// a +/- 1 adjustment is needed to distinguish a valid first level (1) and +// default "no value" protobuf behavior (0) +func (m *Message) SetClusterLevel(level int32) { + m.ClusterLevelRaw = &level } diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index 90c936eb91..d85e819057 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-go. +// Code generated by protoc-gen-gogo. // source: messages.proto // DO NOT EDIT! @@ -9,30 +9,32 @@ It is generated from these files: messages.proto It has these top-level messages: - PBDHTMessage + Message */ package dht -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" +import proto "code.google.com/p/gogoprotobuf/proto" +import json "encoding/json" import math "math" -// Reference imports to suppress errors if they are not otherwise used. +// Reference proto, json, and math imports to suppress error if they are not otherwise used. var _ = proto.Marshal +var _ = &json.SyntaxError{} var _ = math.Inf -type PBDHTMessage_MessageType int32 +type Message_MessageType int32 const ( - PBDHTMessage_PUT_VALUE PBDHTMessage_MessageType = 0 - PBDHTMessage_GET_VALUE PBDHTMessage_MessageType = 1 - PBDHTMessage_ADD_PROVIDER PBDHTMessage_MessageType = 2 - PBDHTMessage_GET_PROVIDERS PBDHTMessage_MessageType = 3 - PBDHTMessage_FIND_NODE PBDHTMessage_MessageType = 4 - PBDHTMessage_PING PBDHTMessage_MessageType = 5 - PBDHTMessage_DIAGNOSTIC PBDHTMessage_MessageType = 6 + Message_PUT_VALUE Message_MessageType = 0 + Message_GET_VALUE Message_MessageType = 1 + Message_ADD_PROVIDER Message_MessageType = 2 + Message_GET_PROVIDERS Message_MessageType = 3 + Message_FIND_NODE Message_MessageType = 4 + Message_PING Message_MessageType = 5 + Message_DIAGNOSTIC Message_MessageType = 6 ) -var PBDHTMessage_MessageType_name = map[int32]string{ +var Message_MessageType_name = map[int32]string{ 0: "PUT_VALUE", 1: "GET_VALUE", 2: "ADD_PROVIDER", @@ -41,7 +43,7 @@ var PBDHTMessage_MessageType_name = map[int32]string{ 5: "PING", 6: "DIAGNOSTIC", } -var PBDHTMessage_MessageType_value = map[string]int32{ +var Message_MessageType_value = map[string]int32{ "PUT_VALUE": 0, "GET_VALUE": 1, "ADD_PROVIDER": 2, @@ -51,105 +53,107 @@ var PBDHTMessage_MessageType_value = map[string]int32{ "DIAGNOSTIC": 6, } -func (x PBDHTMessage_MessageType) Enum() *PBDHTMessage_MessageType { - p := new(PBDHTMessage_MessageType) +func (x Message_MessageType) Enum() *Message_MessageType { + p := new(Message_MessageType) *p = x return p } -func (x PBDHTMessage_MessageType) String() string { - return proto.EnumName(PBDHTMessage_MessageType_name, int32(x)) +func (x Message_MessageType) String() string { + return proto.EnumName(Message_MessageType_name, int32(x)) } -func (x *PBDHTMessage_MessageType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PBDHTMessage_MessageType_value, data, "PBDHTMessage_MessageType") +func (x *Message_MessageType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Message_MessageType_value, data, "Message_MessageType") if err != nil { return err } - *x = PBDHTMessage_MessageType(value) + *x = Message_MessageType(value) return nil } -type PBDHTMessage struct { - Type *PBDHTMessage_MessageType `protobuf:"varint,1,req,name=type,enum=dht.PBDHTMessage_MessageType" json:"type,omitempty"` - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` - Id *string `protobuf:"bytes,4,req,name=id" json:"id,omitempty"` - Response *bool `protobuf:"varint,5,opt,name=response" json:"response,omitempty"` - Success *bool `protobuf:"varint,6,opt,name=success" json:"success,omitempty"` - Peers []*PBDHTMessage_PBPeer `protobuf:"bytes,7,rep,name=peers" json:"peers,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PBDHTMessage) Reset() { *m = PBDHTMessage{} } -func (m *PBDHTMessage) String() string { return proto.CompactTextString(m) } -func (*PBDHTMessage) ProtoMessage() {} - -func (m *PBDHTMessage) GetType() PBDHTMessage_MessageType { +type Message struct { + // defines what type of message it is. + Type *Message_MessageType `protobuf:"varint,1,req,name=type,enum=dht.Message_MessageType" json:"type,omitempty"` + // defines what coral cluster level this query/response belongs to. + ClusterLevelRaw *int32 `protobuf:"varint,10,opt,name=clusterLevelRaw" json:"clusterLevelRaw,omitempty"` + // Used to specify the key associated with this message. + // PUT_VALUE, GET_VALUE, ADD_PROVIDER, GET_PROVIDERS + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + // Used to return a value + // PUT_VALUE, GET_VALUE + Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + // Used to return peers closer to a key in a query + // GET_VALUE, GET_PROVIDERS, FIND_NODE + CloserPeers []*Message_Peer `protobuf:"bytes,8,rep,name=closerPeers" json:"closerPeers,omitempty"` + // Used to return Providers + // GET_VALUE, ADD_PROVIDER, GET_PROVIDERS + ProviderPeers []*Message_Peer `protobuf:"bytes,9,rep,name=providerPeers" json:"providerPeers,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} + +func (m *Message) GetType() Message_MessageType { if m != nil && m.Type != nil { return *m.Type } - return PBDHTMessage_PUT_VALUE + return Message_PUT_VALUE } -func (m *PBDHTMessage) GetKey() string { +func (m *Message) GetClusterLevelRaw() int32 { + if m != nil && m.ClusterLevelRaw != nil { + return *m.ClusterLevelRaw + } + return 0 +} + +func (m *Message) GetKey() string { if m != nil && m.Key != nil { return *m.Key } return "" } -func (m *PBDHTMessage) GetValue() []byte { +func (m *Message) GetValue() []byte { if m != nil { return m.Value } return nil } -func (m *PBDHTMessage) GetId() string { - if m != nil && m.Id != nil { - return *m.Id - } - return "" -} - -func (m *PBDHTMessage) GetResponse() bool { - if m != nil && m.Response != nil { - return *m.Response - } - return false -} - -func (m *PBDHTMessage) GetSuccess() bool { - if m != nil && m.Success != nil { - return *m.Success +func (m *Message) GetCloserPeers() []*Message_Peer { + if m != nil { + return m.CloserPeers } - return false + return nil } -func (m *PBDHTMessage) GetPeers() []*PBDHTMessage_PBPeer { +func (m *Message) GetProviderPeers() []*Message_Peer { if m != nil { - return m.Peers + return m.ProviderPeers } return nil } -type PBDHTMessage_PBPeer struct { +type Message_Peer struct { Id *string `protobuf:"bytes,1,req,name=id" json:"id,omitempty"` Addr *string `protobuf:"bytes,2,req,name=addr" json:"addr,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *PBDHTMessage_PBPeer) Reset() { *m = PBDHTMessage_PBPeer{} } -func (m *PBDHTMessage_PBPeer) String() string { return proto.CompactTextString(m) } -func (*PBDHTMessage_PBPeer) ProtoMessage() {} +func (m *Message_Peer) Reset() { *m = Message_Peer{} } +func (m *Message_Peer) String() string { return proto.CompactTextString(m) } +func (*Message_Peer) ProtoMessage() {} -func (m *PBDHTMessage_PBPeer) GetId() string { +func (m *Message_Peer) GetId() string { if m != nil && m.Id != nil { return *m.Id } return "" } -func (m *PBDHTMessage_PBPeer) GetAddr() string { +func (m *Message_Peer) GetAddr() string { if m != nil && m.Addr != nil { return *m.Addr } @@ -157,5 +161,5 @@ func (m *PBDHTMessage_PBPeer) GetAddr() string { } func init() { - proto.RegisterEnum("dht.PBDHTMessage_MessageType", PBDHTMessage_MessageType_name, PBDHTMessage_MessageType_value) + proto.RegisterEnum("dht.Message_MessageType", Message_MessageType_name, Message_MessageType_value) } diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index c2c5cc30d8..3c33f9382b 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -2,7 +2,7 @@ package dht; //run `protoc --go_out=. *.proto` to generate -message PBDHTMessage { +message Message { enum MessageType { PUT_VALUE = 0; GET_VALUE = 1; @@ -13,22 +13,30 @@ message PBDHTMessage { DIAGNOSTIC = 6; } - message PBPeer { + message Peer { required string id = 1; required string addr = 2; } + // defines what type of message it is. required MessageType type = 1; + + // defines what coral cluster level this query/response belongs to. + optional int32 clusterLevelRaw = 10; + + // Used to specify the key associated with this message. + // PUT_VALUE, GET_VALUE, ADD_PROVIDER, GET_PROVIDERS optional string key = 2; - optional bytes value = 3; - // Unique ID of this message, used to match queries with responses - required string id = 4; + // Used to return a value + // PUT_VALUE, GET_VALUE + optional bytes value = 3; - // Signals whether or not this message is a response to another message - optional bool response = 5; - optional bool success = 6; + // Used to return peers closer to a key in a query + // GET_VALUE, GET_PROVIDERS, FIND_NODE + repeated Peer closerPeers = 8; - // Used for returning peers from queries (normally, peers closer to X) - repeated PBPeer peers = 7; + // Used to return Providers + // GET_VALUE, ADD_PROVIDER, GET_PROVIDERS + repeated Peer providerPeers = 9; } From 7f12ccf9ddd2cf2df08c39c79306350a72d5b2e5 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 00:56:40 -0700 Subject: [PATCH 0093/3147] starting on dht-- msg handler This commit was moved from ipfs/go-ipfs-routing@1b9544070173ec14afcf42a7f1689772b8134a37 --- routing/dht/dht.go | 150 +++++++++++++++++++++++++++------------------ 1 file changed, 90 insertions(+), 60 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 788f235124..5ee59cd67d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -3,18 +3,20 @@ package dht import ( "bytes" "crypto/rand" + "errors" "fmt" "sync" "time" inet "github.com/jbenet/go-ipfs/net" + msg "github.com/jbenet/go-ipfs/net/message" peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) @@ -28,7 +30,9 @@ type IpfsDHT struct { // NOTE: (currently, only a single table is used) routingTables []*kb.RoutingTable + // the network interface. service network inet.Network + sender inet.Sender // Local peer (yourself) self *peer.Peer @@ -50,12 +54,13 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(p *peer.Peer, net swarm.Network, dstore ds.Datastore) *IpfsDHT { +func NewDHT(p *peer.Peer, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) dht.network = net - dht.netChan = net.GetChannel(swarm.PBWrapper_DHT_MESSAGE) + dht.sender = sender dht.datastore = dstore dht.self = p + dht.providers = NewProviderManager(p.ID) dht.shutdown = make(chan struct{}) @@ -63,21 +68,32 @@ func NewDHT(p *peer.Peer, net swarm.Network, dstore ds.Datastore) *IpfsDHT { dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) - dht.listener = swarm.NewMessageListener() dht.birth = time.Now() return dht } // Start up background goroutines needed by the DHT func (dht *IpfsDHT) Start() { - go dht.handleMessages() + panic("the service is already started. rmv this method") } // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { maddrstr, _ := addr.String() u.DOut("Connect to new peer: %s\n", maddrstr) - npeer, err := dht.network.ConnectNew(addr) + + // TODO(jbenet,whyrusleeping) + // + // Connect should take in a Peer (with ID). In a sense, we shouldn't be + // allowing connections to random multiaddrs without knowing who we're + // speaking to (i.e. peer.ID). In terms of moving around simple addresses + // -- instead of an (ID, Addr) pair -- we can use: + // + // /ip4/10.20.30.40/tcp/1234/ipfs/Qxhxxchxzcncxnzcnxzcxzm + // + npeer := &peer.Peer{} + npeer.AddAddress(addr) + err := dht.network.DialPeer(npeer) if err != nil { return nil, err } @@ -94,63 +110,77 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { return npeer, nil } -// Read in all messages from swarm and handle them appropriately -// NOTE: this function is just a quick sketch -func (dht *IpfsDHT) handleMessages() { - u.DOut("Begin message handling routine\n") +// HandleMessage implements the inet.Handler interface. +func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg.NetMessage, error) { - errs := dht.network.GetErrChan() - for { - select { - case mes, ok := <-dht.netChan.Incoming: - if !ok { - u.DOut("handleMessages closing, bad recv on incoming\n") - return - } - pmes := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, pmes) - if err != nil { - u.PErr("Failed to decode protobuf message: %s\n", err) - continue - } + mData := mes.Data() + if mData == nil { + return nil, errors.New("message did not include Data") + } - dht.Update(mes.Peer) + mPeer := mes.Peer() + if mPeer == nil { + return nil, errors.New("message did not include a Peer") + } - // Note: not sure if this is the correct place for this - if pmes.GetResponse() { - dht.listener.Respond(pmes.GetId(), mes) - continue - } - // - - u.DOut("[peer: %s]\nGot message type: '%s' [id = %x, from = %s]\n", - dht.self.ID.Pretty(), - PBDHTMessage_MessageType_name[int32(pmes.GetType())], - pmes.GetId(), mes.Peer.ID.Pretty()) - switch pmes.GetType() { - case PBDHTMessage_GET_VALUE: - go dht.handleGetValue(mes.Peer, pmes) - case PBDHTMessage_PUT_VALUE: - go dht.handlePutValue(mes.Peer, pmes) - case PBDHTMessage_FIND_NODE: - go dht.handleFindPeer(mes.Peer, pmes) - case PBDHTMessage_ADD_PROVIDER: - go dht.handleAddProvider(mes.Peer, pmes) - case PBDHTMessage_GET_PROVIDERS: - go dht.handleGetProviders(mes.Peer, pmes) - case PBDHTMessage_PING: - go dht.handlePing(mes.Peer, pmes) - case PBDHTMessage_DIAGNOSTIC: - go dht.handleDiagnostic(mes.Peer, pmes) - default: - u.PErr("Recieved invalid message type") - } + // deserialize msg + pmes := new(Message) + err := proto.Unmarshal(mData, pmes) + if err != nil { + return nil, fmt.Errorf("Failed to decode protobuf message: %v\n", err) + } - case err := <-errs: - u.PErr("dht err: %s\n", err) - case <-dht.shutdown: - return - } + // update the peer (on valid msgs only) + dht.Update(mPeer) + + // Print out diagnostic + u.DOut("[peer: %s]\nGot message type: '%s' [from = %s]\n", + dht.self.ID.Pretty(), + Message_MessageType_name[int32(pmes.GetType())], mPeer.ID.Pretty()) + + // get handler for this msg type. + var resp *Message + handler := dht.handlerForMsgType(pmes.GetType()) + if handler == nil { + return nil, errors.New("Recieved invalid message type") + } + + // dispatch handler. + rpmes, err := handler(mPeer, pmes) + if err != nil { + return nil, err + } + + // serialize response msg + rmes, err := msg.FromObject(mPeer, rpmes) + if err != nil { + return nil, fmt.Errorf("Failed to encode protobuf message: %v\n", err) + } + + return rmes, nil +} + +// dhthandler specifies the signature of functions that handle DHT messages. +type dhtHandler func(*peer.Peer, *Message) (*Message, error) + +func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { + switch t { + case Message_GET_VALUE: + return dht.handleGetValue + // case Message_PUT_VALUE: + // return dht.handlePutValue + // case Message_FIND_NODE: + // return dht.handleFindPeer + // case Message_ADD_PROVIDER: + // return dht.handleAddProvider + // case Message_GET_PROVIDERS: + // return dht.handleGetProviders + // case Message_PING: + // return dht.handlePing + // case Message_DIAGNOSTIC: + // return dht.handleDiagnostic + default: + return nil } } From 7a2294876ba6c01c712c7081a251486facb393d6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 00:57:20 -0700 Subject: [PATCH 0094/3147] handleGetValue This commit was moved from ipfs/go-ipfs-routing@5c3a52c2044e064a5df6591d424aed1857dc1c8c --- routing/dht/dht.go | 131 ++++++++++++++++++++++++++------------------- 1 file changed, 77 insertions(+), 54 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5ee59cd67d..6d105ddfc0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -185,75 +185,98 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { } func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { - pmes := Message{ - Type: PBDHTMessage_PUT_VALUE, - Key: key, + typ := Message_PUT_VALUE + pmes := &Message{ + Type: &typ, + Key: &key, Value: value, - ID: swarm.GenerateMessageID(), } - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - dht.netChan.Outgoing <- mes - return nil + mes, err := msg.FromObject(p, pmes) + if err != nil { + return err + } + return dht.sender.SendMessage(context.TODO(), mes) } -func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) { +func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error) { u.DOut("handleGetValue for key: %s\n", pmes.GetKey()) - dskey := ds.NewKey(pmes.GetKey()) + + // setup response resp := &Message{ - Response: true, - ID: pmes.GetId(), - Key: pmes.GetKey(), + Type: pmes.Type, + Key: pmes.Key, + } + + // first, is the key even a key? + key := pmes.GetKey() + if key == "" { + return nil, errors.New("handleGetValue but no key was provided.") } + + // let's first check if we have the value locally. + dskey := ds.NewKey(pmes.GetKey()) iVal, err := dht.datastore.Get(dskey) + + // if we got an unexpected error, bail. + if err != ds.ErrNotFound { + return nil, err + } + + // if we have the value, respond with it! if err == nil { u.DOut("handleGetValue success!\n") - resp.Success = true - resp.Value = iVal.([]byte) - } else if err == ds.ErrNotFound { - // Check if we know any providers for the requested value - provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) - if len(provs) > 0 { - u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) - resp.Peers = provs - resp.Success = true - } else { - // No providers? - // Find closest peer on given cluster to desired key and reply with that info - - level := 0 - if len(pmes.GetValue()) < 1 { - // TODO: maybe return an error? Defaulting isnt a good idea IMO - u.PErr("handleGetValue: no routing level specified, assuming 0\n") - } else { - level = int(pmes.GetValue()[0]) // Using value field to specify cluster level - } - u.DOut("handleGetValue searching level %d clusters\n", level) - - closer := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) - if closer.ID.Equal(dht.self.ID) { - u.DOut("Attempted to return self! this shouldnt happen...\n") - resp.Peers = nil - goto out - } - // If this peer is closer than the one from the table, return nil - if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { - resp.Peers = nil - u.DOut("handleGetValue could not find a closer node than myself.\n") - } else { - u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) - resp.Peers = []*peer.Peer{closer} - } + byts, ok := iVal.([]byte) + if !ok { + return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) } - } else { - //temp: what other errors can a datastore return? - panic(err) + + resp.Value = byts + return resp, nil } -out: - mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.netChan.Outgoing <- mes + // if we know any providers for the requested value, return those. + provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) + if len(provs) > 0 { + u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) + resp.ProviderPeers = provs + return resp, nil + } + + // Find closest peer on given cluster to desired key and reply with that info + // TODO: this should probably be decomposed. + + // stored levels are > 1, to distinguish missing levels. + level := pmes.GetClusterLevel() + if level < 0 { + // TODO: maybe return an error? Defaulting isnt a good idea IMO + u.PErr("handleGetValue: no routing level specified, assuming 0\n") + level = 0 + } + u.DOut("handleGetValue searching level %d clusters\n", level) + + ck := kb.ConvertKey(u.Key(pmes.GetKey())) + closer := dht.routingTables[level].NearestPeer(ck) + + // if closer peer is self, return nil + if closer.ID.Equal(dht.self.ID) { + u.DOut("Attempted to return self! this shouldnt happen...\n") + resp.CloserPeers = nil + return resp, nil + } + + // if self is closer than the one from the table, return nil + if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { + u.DOut("handleGetValue could not find a closer node than myself.\n") + resp.CloserPeers = nil + return resp, nil + } + + // we got a closer peer, it seems. return it. + u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) + resp.CloserPeers = []*peer.Peer{closer} + return resp, nil } // Store a value in this peer local storage From c12a704e3d69d58c04b325c73ba05d717aac1a7a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 00:57:46 -0700 Subject: [PATCH 0095/3147] refactor symbol This commit was moved from ipfs/go-ipfs-routing@7ec38e713c3b09cd065ae0806f3bff2f53462974 --- routing/dht/dht.go | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6d105ddfc0..c13ed9a983 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -280,7 +280,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } // Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *PBDHTMessage) { +func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) { dht.dslock.Lock() defer dht.dslock.Unlock() dskey := ds.NewKey(pmes.GetKey()) @@ -291,7 +291,7 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *PBDHTMessage) { } } -func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { +func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) { u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) resp := Message{ Type: pmes.GetType(), @@ -302,7 +302,7 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) { dht.netChan.Outgoing <- swarm.NewMessage(p, resp.ToProtobuf()) } -func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { +func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) { resp := Message{ Type: pmes.GetType(), ID: pmes.GetId(), @@ -335,9 +335,9 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) { resp.Success = true } -func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) { +func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) { resp := Message{ - Type: PBDHTMessage_GET_PROVIDERS, + Type: Message_GET_PROVIDERS, Key: pmes.GetKey(), ID: pmes.GetId(), Response: true, @@ -378,7 +378,7 @@ type providerInfo struct { Value *peer.Peer } -func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *PBDHTMessage) { +func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) { key := u.Key(pmes.GetKey()) u.DOut("[%s] Adding [%s] as a provider for '%s'\n", dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) dht.providers.AddProvider(key, p) @@ -393,7 +393,7 @@ func (dht *IpfsDHT) Halt() { } // NOTE: not yet finished, low priority -func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { +func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) { seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) listenChan := dht.listener.Listen(pmes.GetId(), len(seq), time.Second*30) @@ -415,7 +415,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { //Timeout, return what we have goto out case reqResp := <-listenChan: - pmesOut := new(PBDHTMessage) + pmesOut := new(Message) err := proto.Unmarshal(reqResp.Data, pmesOut) if err != nil { // It broke? eh, whatever, keep going @@ -428,7 +428,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) { out: resp := Message{ - Type: PBDHTMessage_DIAGNOSTIC, + Type: Message_DIAGNOSTIC, ID: pmes.GetId(), Value: buf.Bytes(), Response: true, @@ -481,9 +481,9 @@ func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Durati } // getValueSingle simply performs the get value RPC with the given parameters -func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration, level int) (*PBDHTMessage, error) { +func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration, level int) (*Message, error) { pmes := Message{ - Type: PBDHTMessage_GET_VALUE, + Type: Message_GET_VALUE, Key: string(key), Value: []byte{byte(level)}, ID: swarm.GenerateMessageID(), @@ -507,7 +507,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio } roundtrip := time.Since(t) resp.Peer.SetLatency(roundtrip) - pmesOut := new(PBDHTMessage) + pmesOut := new(Message) err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { return nil, err @@ -521,7 +521,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio // one to get the value from? Or just connect to one at a time until we get a // successful connection and request the value from it? func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, - peerlist []*PBDHTMessage_PBPeer, level int) ([]byte, error) { + peerlist []*Message_PBPeer, level int) ([]byte, error) { for _, pinfo := range peerlist { p, _ := dht.Find(peer.ID(pinfo.GetId())) if p == nil { @@ -597,9 +597,9 @@ func (dht *IpfsDHT) Find(id peer.ID) (*peer.Peer, *kb.RoutingTable) { return nil, nil } -func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Duration, level int) (*PBDHTMessage, error) { +func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Duration, level int) (*Message, error) { pmes := Message{ - Type: PBDHTMessage_FIND_NODE, + Type: Message_FIND_NODE, Key: string(id), ID: swarm.GenerateMessageID(), Value: []byte{byte(level)}, @@ -617,7 +617,7 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati case resp := <-listenChan: roundtrip := time.Since(t) resp.Peer.SetLatency(roundtrip) - pmesOut := new(PBDHTMessage) + pmesOut := new(Message) err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { return nil, err @@ -633,9 +633,9 @@ func (dht *IpfsDHT) printTables() { } } -func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, timeout time.Duration) (*PBDHTMessage, error) { +func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, timeout time.Duration) (*Message, error) { pmes := Message{ - Type: PBDHTMessage_GET_PROVIDERS, + Type: Message_GET_PROVIDERS, Key: string(key), ID: swarm.GenerateMessageID(), Value: []byte{byte(level)}, @@ -652,7 +652,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time return nil, u.ErrTimeout case resp := <-listenChan: u.DOut("FindProviders: got response.\n") - pmesOut := new(PBDHTMessage) + pmesOut := new(Message) err := proto.Unmarshal(resp.Data, pmesOut) if err != nil { return nil, err @@ -663,7 +663,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time } // TODO: Could be done async -func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer.Peer { +func (dht *IpfsDHT) addPeerList(key u.Key, peers []*Message_PBPeer) []*peer.Peer { var provArr []*peer.Peer for _, prov := range peers { // Dont add outselves to the list @@ -687,7 +687,7 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*PBDHTMessage_PBPeer) []*peer return provArr } -func (dht *IpfsDHT) peerFromInfo(pbp *PBDHTMessage_PBPeer) (*peer.Peer, error) { +func (dht *IpfsDHT) peerFromInfo(pbp *Message_PBPeer) (*peer.Peer, error) { maddr, err := ma.NewMultiaddr(pbp.GetAddr()) if err != nil { return nil, err From 817abc8de40ce427aa98f7aa54e9a588bf4f8a70 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 00:58:08 -0700 Subject: [PATCH 0096/3147] lint nit This commit was moved from ipfs/go-ipfs-routing@56064b74c3223807dfa552170349b644c78d6212 --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c13ed9a983..645ffb236f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -211,7 +211,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // first, is the key even a key? key := pmes.GetKey() if key == "" { - return nil, errors.New("handleGetValue but no key was provided.") + return nil, errors.New("handleGetValue but no key was provided") } // let's first check if we have the value locally. From 37a746754c139a560df2b876d7387e71e14b5525 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 01:09:34 -0700 Subject: [PATCH 0097/3147] ping + find peer This commit was moved from ipfs/go-ipfs-routing@ea2170d069ad7f8abb415433878a1c58d12dcb13 --- routing/dht/Message.go | 18 ++++++++++++-- routing/dht/dht.go | 56 +++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 210fd69685..bf592799de 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -3,9 +3,10 @@ package dht import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" ) -func peerInfo(p *peer.Peer) *Message_Peer { +func peerToPBPeer(p *peer.Peer) *Message_Peer { pbp := new(Message_Peer) if len(p.Addresses) == 0 || p.Addresses[0] == nil { pbp.Addr = proto.String("") @@ -22,11 +23,24 @@ func peerInfo(p *peer.Peer) *Message_Peer { return pbp } +func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { + pbpeers = make([]*Message_Peer, len(peers)) + for i, p := range peers { + pbpeers[i] = peerToPBPeer(p) + } + return pbpeers +} + // GetClusterLevel gets and adjusts the cluster level on the message. // a +/- 1 adjustment is needed to distinguish a valid first level (1) and // default "no value" protobuf behavior (0) func (m *Message) GetClusterLevel() int32 { - return m.GetClusterLevelRaw() - 1 + level := m.GetClusterLevelRaw() - 1 + if level < 0 { + u.PErr("handleGetValue: no routing level specified, assuming 0\n") + level = 0 + } + return level } // SetClusterLevel adjusts and sets the cluster level on the message. diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 645ffb236f..144841442a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -169,14 +169,14 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { return dht.handleGetValue // case Message_PUT_VALUE: // return dht.handlePutValue - // case Message_FIND_NODE: - // return dht.handleFindPeer + case Message_FIND_NODE: + return dht.handleFindPeer // case Message_ADD_PROVIDER: // return dht.handleAddProvider // case Message_GET_PROVIDERS: // return dht.handleGetProviders - // case Message_PING: - // return dht.handlePing + case Message_PING: + return dht.handlePing // case Message_DIAGNOSTIC: // return dht.handleDiagnostic default: @@ -240,7 +240,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) if len(provs) > 0 { u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) - resp.ProviderPeers = provs + resp.ProviderPeers = peersToPBPeers(provs) return resp, nil } @@ -249,11 +249,6 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // stored levels are > 1, to distinguish missing levels. level := pmes.GetClusterLevel() - if level < 0 { - // TODO: maybe return an error? Defaulting isnt a good idea IMO - u.PErr("handleGetValue: no routing level specified, assuming 0\n") - level = 0 - } u.DOut("handleGetValue searching level %d clusters\n", level) ck := kb.ConvertKey(u.Key(pmes.GetKey())) @@ -275,7 +270,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // we got a closer peer, it seems. return it. u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) - resp.CloserPeers = []*peer.Peer{closer} + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) return resp, nil } @@ -291,48 +286,37 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) { } } -func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) { +func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) - resp := Message{ - Type: pmes.GetType(), - Response: true, - ID: pmes.GetId(), - } - - dht.netChan.Outgoing <- swarm.NewMessage(p, resp.ToProtobuf()) + return &Message{Type: pmes.Type}, nil } -func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) { - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - } - defer func() { - mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.netChan.Outgoing <- mes - }() - level := pmes.GetValue()[0] +func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { + resp := &Message{Type: pmes.Type} + + level := pmes.GetClusterLevel() u.DOut("handleFindPeer: searching for '%s'\n", peer.ID(pmes.GetKey()).Pretty()) - closest := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) + + ck := kb.ConvertKey(u.Key(pmes.GetKey())) + closest := dht.routingTables[level].NearestPeer(ck) if closest == nil { u.PErr("handleFindPeer: could not find anything.\n") - return + return resp, nil } if len(closest.Addresses) == 0 { u.PErr("handleFindPeer: no addresses for connected peer...\n") - return + return resp, nil } // If the found peer further away than this peer... if kb.Closer(dht.self.ID, closest.ID, u.Key(pmes.GetKey())) { - return + return resp, nil } u.DOut("handleFindPeer: sending back '%s'\n", closest.ID.Pretty()) - resp.Peers = []*peer.Peer{closest} - resp.Success = true + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closest}) + return resp, nil } func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) { From 4584fdd35d357d8fcdfd63c5eaaafebe6b84718f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 01:54:53 -0700 Subject: [PATCH 0098/3147] refactor peer distance search + handleGetProviders This commit was moved from ipfs/go-ipfs-routing@194a54bfd7525ecef66e004089b32164bc3b4de7 --- routing/dht/dht.go | 113 +++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 144841442a..e0553c9a7d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -245,24 +245,8 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } // Find closest peer on given cluster to desired key and reply with that info - // TODO: this should probably be decomposed. - - // stored levels are > 1, to distinguish missing levels. - level := pmes.GetClusterLevel() - u.DOut("handleGetValue searching level %d clusters\n", level) - - ck := kb.ConvertKey(u.Key(pmes.GetKey())) - closer := dht.routingTables[level].NearestPeer(ck) - - // if closer peer is self, return nil - if closer.ID.Equal(dht.self.ID) { - u.DOut("Attempted to return self! this shouldnt happen...\n") - resp.CloserPeers = nil - return resp, nil - } - - // if self is closer than the one from the table, return nil - if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { + closer := dht.betterPeerToQuery(pmes) + if closer == nil { u.DOut("handleGetValue could not find a closer node than myself.\n") resp.CloserPeers = nil return resp, nil @@ -293,12 +277,15 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { resp := &Message{Type: pmes.Type} + var closest *peer.Peer - level := pmes.GetClusterLevel() - u.DOut("handleFindPeer: searching for '%s'\n", peer.ID(pmes.GetKey()).Pretty()) + // if looking for self... special case where we send it on CloserPeers. + if peer.ID(pmes.GetKey()).Equal(dht.self.ID) { + closest = dht.self + } else { + closest = dht.betterPeerToQuery(pmes) + } - ck := kb.ConvertKey(u.Key(pmes.GetKey())) - closest := dht.routingTables[level].NearestPeer(ck) if closest == nil { u.PErr("handleFindPeer: could not find anything.\n") return resp, nil @@ -309,52 +296,42 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error return resp, nil } - // If the found peer further away than this peer... - if kb.Closer(dht.self.ID, closest.ID, u.Key(pmes.GetKey())) { - return resp, nil - } - u.DOut("handleFindPeer: sending back '%s'\n", closest.ID.Pretty()) resp.CloserPeers = peersToPBPeers([]*peer.Peer{closest}) return resp, nil } -func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) { - resp := Message{ - Type: Message_GET_PROVIDERS, - Key: pmes.GetKey(), - ID: pmes.GetId(), - Response: true, +func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, error) { + resp := &Message{ + Type: pmes.Type, + Key: pmes.Key, } + // check if we have this value, to add ourselves as provider. has, err := dht.datastore.Has(ds.NewKey(pmes.GetKey())) - if err != nil { - dht.netChan.Errors <- err + if err != nil && err != ds.ErrNotFound { + u.PErr("unexpected datastore error: %v\n", err) + has = false } + // setup providers providers := dht.providers.GetProviders(u.Key(pmes.GetKey())) if has { providers = append(providers, dht.self) } - if providers == nil || len(providers) == 0 { - level := 0 - if len(pmes.GetValue()) > 0 { - level = int(pmes.GetValue()[0]) - } - closer := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey()))) - if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) { - resp.Peers = nil - } else { - resp.Peers = []*peer.Peer{closer} - } - } else { - resp.Peers = providers - resp.Success = true + // if we've got providers, send thos those. + if providers != nil && len(providers) > 0 { + resp.ProviderPeers = peersToPBPeers(providers) } - mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.netChan.Outgoing <- mes + // Also send closer peers. + closer := dht.betterPeerToQuery(pmes) + if closer != nil { + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) + } + + return resp, nil } type providerInfo struct { @@ -671,6 +648,40 @@ func (dht *IpfsDHT) addPeerList(key u.Key, peers []*Message_PBPeer) []*peer.Peer return provArr } +// nearestPeerToQuery returns the routing tables closest peers. +func (dht *IpfsDHT) nearestPeerToQuery(pmes *Message) *peer.Peer { + level := pmes.GetClusterLevel() + cluster := dht.routingTables[level] + + key := u.Key(pmes.GetKey()) + closer := cluster.NearestPeer(kb.ConvertKey(key)) + return closer +} + +// betterPeerToQuery returns nearestPeerToQuery, but iff closer than self. +func (dht *IpfsDHT) betterPeerToQuery(pmes *Message) *peer.Peer { + closer := dht.nearestPeerToQuery(pmes) + + // no node? nil + if closer == nil { + return nil + } + + // == to self? nil + if closer.ID.Equal(dht.self.ID) { + u.DOut("Attempted to return self! this shouldnt happen...\n") + return nil + } + + // self is closer? nil + if kb.Closer(dht.self.ID, closer.ID, key) { + return nil + } + + // ok seems like a closer node. + return closer +} + func (dht *IpfsDHT) peerFromInfo(pbp *Message_PBPeer) (*peer.Peer, error) { maddr, err := ma.NewMultiaddr(pbp.GetAddr()) if err != nil { From 31f2c1b6ce232f56560dd3e991675af6a419497a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 02:04:11 -0700 Subject: [PATCH 0099/3147] comment out diagnostic it'll have to change lots since the listener is gone This commit was moved from ipfs/go-ipfs-routing@b2d8b3fc4c6159e9101400f1d7b852604258304e --- routing/dht/dht.go | 84 ++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e0553c9a7d..91ad573072 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -1,7 +1,6 @@ package dht import ( - "bytes" "crypto/rand" "errors" "fmt" @@ -341,62 +340,67 @@ type providerInfo struct { func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) { key := u.Key(pmes.GetKey()) - u.DOut("[%s] Adding [%s] as a provider for '%s'\n", dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) + u.DOut("[%s] Adding [%s] as a provider for '%s'\n", + dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) dht.providers.AddProvider(key, p) } // Halt stops all communications from this peer and shut down +// TODO -- remove this in favor of context func (dht *IpfsDHT) Halt() { dht.shutdown <- struct{}{} dht.network.Close() dht.providers.Halt() - dht.listener.Halt() } // NOTE: not yet finished, low priority -func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) { +func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) (*Message, error) { seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - listenChan := dht.listener.Listen(pmes.GetId(), len(seq), time.Second*30) for _, ps := range seq { - mes := swarm.NewMessage(ps, pmes) - dht.netChan.Outgoing <- mes - } - - buf := new(bytes.Buffer) - di := dht.getDiagInfo() - buf.Write(di.Marshal()) - - // NOTE: this shouldnt be a hardcoded value - after := time.After(time.Second * 20) - count := len(seq) - for count > 0 { - select { - case <-after: - //Timeout, return what we have - goto out - case reqResp := <-listenChan: - pmesOut := new(Message) - err := proto.Unmarshal(reqResp.Data, pmesOut) - if err != nil { - // It broke? eh, whatever, keep going - continue - } - buf.Write(reqResp.Data) - count-- + mes, err := msg.FromObject(ps, pmes) + if err != nil { + u.PErr("handleDiagnostics error creating message: %v\n", err) + continue } + // dht.sender.SendRequest(context.TODO(), mes) } + return nil, errors.New("not yet ported back") -out: - resp := Message{ - Type: Message_DIAGNOSTIC, - ID: pmes.GetId(), - Value: buf.Bytes(), - Response: true, - } - - mes := swarm.NewMessage(p, resp.ToProtobuf()) - dht.netChan.Outgoing <- mes + // buf := new(bytes.Buffer) + // di := dht.getDiagInfo() + // buf.Write(di.Marshal()) + // + // // NOTE: this shouldnt be a hardcoded value + // after := time.After(time.Second * 20) + // count := len(seq) + // for count > 0 { + // select { + // case <-after: + // //Timeout, return what we have + // goto out + // case reqResp := <-listenChan: + // pmesOut := new(Message) + // err := proto.Unmarshal(reqResp.Data, pmesOut) + // if err != nil { + // // It broke? eh, whatever, keep going + // continue + // } + // buf.Write(reqResp.Data) + // count-- + // } + // } + // + // out: + // resp := Message{ + // Type: Message_DIAGNOSTIC, + // ID: pmes.GetId(), + // Value: buf.Bytes(), + // Response: true, + // } + // + // mes := swarm.NewMessage(p, resp.ToProtobuf()) + // dht.netChan.Outgoing <- mes } func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Duration, level int) ([]byte, []*peer.Peer, error) { From 8486f72e2ecaf822e9945758d5c5a77bd340526d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 02:07:59 -0700 Subject: [PATCH 0100/3147] moved handlers to own file This commit was moved from ipfs/go-ipfs-routing@94a3fd409d85923bd535cde26bc856a38c6e0712 --- routing/dht/dht.go | 244 ------------------------------------- routing/dht/handlers.go | 259 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 259 insertions(+), 244 deletions(-) create mode 100644 routing/dht/handlers.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 91ad573072..5090764137 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -159,250 +159,6 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg. return rmes, nil } -// dhthandler specifies the signature of functions that handle DHT messages. -type dhtHandler func(*peer.Peer, *Message) (*Message, error) - -func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { - switch t { - case Message_GET_VALUE: - return dht.handleGetValue - // case Message_PUT_VALUE: - // return dht.handlePutValue - case Message_FIND_NODE: - return dht.handleFindPeer - // case Message_ADD_PROVIDER: - // return dht.handleAddProvider - // case Message_GET_PROVIDERS: - // return dht.handleGetProviders - case Message_PING: - return dht.handlePing - // case Message_DIAGNOSTIC: - // return dht.handleDiagnostic - default: - return nil - } -} - -func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { - typ := Message_PUT_VALUE - pmes := &Message{ - Type: &typ, - Key: &key, - Value: value, - } - - mes, err := msg.FromObject(p, pmes) - if err != nil { - return err - } - return dht.sender.SendMessage(context.TODO(), mes) -} - -func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error) { - u.DOut("handleGetValue for key: %s\n", pmes.GetKey()) - - // setup response - resp := &Message{ - Type: pmes.Type, - Key: pmes.Key, - } - - // first, is the key even a key? - key := pmes.GetKey() - if key == "" { - return nil, errors.New("handleGetValue but no key was provided") - } - - // let's first check if we have the value locally. - dskey := ds.NewKey(pmes.GetKey()) - iVal, err := dht.datastore.Get(dskey) - - // if we got an unexpected error, bail. - if err != ds.ErrNotFound { - return nil, err - } - - // if we have the value, respond with it! - if err == nil { - u.DOut("handleGetValue success!\n") - - byts, ok := iVal.([]byte) - if !ok { - return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) - } - - resp.Value = byts - return resp, nil - } - - // if we know any providers for the requested value, return those. - provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) - if len(provs) > 0 { - u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) - resp.ProviderPeers = peersToPBPeers(provs) - return resp, nil - } - - // Find closest peer on given cluster to desired key and reply with that info - closer := dht.betterPeerToQuery(pmes) - if closer == nil { - u.DOut("handleGetValue could not find a closer node than myself.\n") - resp.CloserPeers = nil - return resp, nil - } - - // we got a closer peer, it seems. return it. - u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) - resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) - return resp, nil -} - -// Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) { - dht.dslock.Lock() - defer dht.dslock.Unlock() - dskey := ds.NewKey(pmes.GetKey()) - err := dht.datastore.Put(dskey, pmes.GetValue()) - if err != nil { - // For now, just panic, handle this better later maybe - panic(err) - } -} - -func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { - u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) - return &Message{Type: pmes.Type}, nil -} - -func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { - resp := &Message{Type: pmes.Type} - var closest *peer.Peer - - // if looking for self... special case where we send it on CloserPeers. - if peer.ID(pmes.GetKey()).Equal(dht.self.ID) { - closest = dht.self - } else { - closest = dht.betterPeerToQuery(pmes) - } - - if closest == nil { - u.PErr("handleFindPeer: could not find anything.\n") - return resp, nil - } - - if len(closest.Addresses) == 0 { - u.PErr("handleFindPeer: no addresses for connected peer...\n") - return resp, nil - } - - u.DOut("handleFindPeer: sending back '%s'\n", closest.ID.Pretty()) - resp.CloserPeers = peersToPBPeers([]*peer.Peer{closest}) - return resp, nil -} - -func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, error) { - resp := &Message{ - Type: pmes.Type, - Key: pmes.Key, - } - - // check if we have this value, to add ourselves as provider. - has, err := dht.datastore.Has(ds.NewKey(pmes.GetKey())) - if err != nil && err != ds.ErrNotFound { - u.PErr("unexpected datastore error: %v\n", err) - has = false - } - - // setup providers - providers := dht.providers.GetProviders(u.Key(pmes.GetKey())) - if has { - providers = append(providers, dht.self) - } - - // if we've got providers, send thos those. - if providers != nil && len(providers) > 0 { - resp.ProviderPeers = peersToPBPeers(providers) - } - - // Also send closer peers. - closer := dht.betterPeerToQuery(pmes) - if closer != nil { - resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) - } - - return resp, nil -} - -type providerInfo struct { - Creation time.Time - Value *peer.Peer -} - -func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) { - key := u.Key(pmes.GetKey()) - u.DOut("[%s] Adding [%s] as a provider for '%s'\n", - dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) - dht.providers.AddProvider(key, p) -} - -// Halt stops all communications from this peer and shut down -// TODO -- remove this in favor of context -func (dht *IpfsDHT) Halt() { - dht.shutdown <- struct{}{} - dht.network.Close() - dht.providers.Halt() -} - -// NOTE: not yet finished, low priority -func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) (*Message, error) { - seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - - for _, ps := range seq { - mes, err := msg.FromObject(ps, pmes) - if err != nil { - u.PErr("handleDiagnostics error creating message: %v\n", err) - continue - } - // dht.sender.SendRequest(context.TODO(), mes) - } - return nil, errors.New("not yet ported back") - - // buf := new(bytes.Buffer) - // di := dht.getDiagInfo() - // buf.Write(di.Marshal()) - // - // // NOTE: this shouldnt be a hardcoded value - // after := time.After(time.Second * 20) - // count := len(seq) - // for count > 0 { - // select { - // case <-after: - // //Timeout, return what we have - // goto out - // case reqResp := <-listenChan: - // pmesOut := new(Message) - // err := proto.Unmarshal(reqResp.Data, pmesOut) - // if err != nil { - // // It broke? eh, whatever, keep going - // continue - // } - // buf.Write(reqResp.Data) - // count-- - // } - // } - // - // out: - // resp := Message{ - // Type: Message_DIAGNOSTIC, - // ID: pmes.GetId(), - // Value: buf.Bytes(), - // Response: true, - // } - // - // mes := swarm.NewMessage(p, resp.ToProtobuf()) - // dht.netChan.Outgoing <- mes -} - func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Duration, level int) ([]byte, []*peer.Peer, error) { pmes, err := dht.getValueSingle(p, key, timeout, level) if err != nil { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go new file mode 100644 index 0000000000..86593d1bf8 --- /dev/null +++ b/routing/dht/handlers.go @@ -0,0 +1,259 @@ +package dht + +import ( + "errors" + "fmt" + "time" + + msg "github.com/jbenet/go-ipfs/net/message" + peer "github.com/jbenet/go-ipfs/peer" + kb "github.com/jbenet/go-ipfs/routing/kbucket" + u "github.com/jbenet/go-ipfs/util" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" +) + +// dhthandler specifies the signature of functions that handle DHT messages. +type dhtHandler func(*peer.Peer, *Message) (*Message, error) + +func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { + switch t { + case Message_GET_VALUE: + return dht.handleGetValue + // case Message_PUT_VALUE: + // return dht.handlePutValue + case Message_FIND_NODE: + return dht.handleFindPeer + // case Message_ADD_PROVIDER: + // return dht.handleAddProvider + // case Message_GET_PROVIDERS: + // return dht.handleGetProviders + case Message_PING: + return dht.handlePing + // case Message_DIAGNOSTIC: + // return dht.handleDiagnostic + default: + return nil + } +} + +func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { + typ := Message_PUT_VALUE + pmes := &Message{ + Type: &typ, + Key: &key, + Value: value, + } + + mes, err := msg.FromObject(p, pmes) + if err != nil { + return err + } + return dht.sender.SendMessage(context.TODO(), mes) +} + +func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error) { + u.DOut("handleGetValue for key: %s\n", pmes.GetKey()) + + // setup response + resp := &Message{ + Type: pmes.Type, + Key: pmes.Key, + } + + // first, is the key even a key? + key := pmes.GetKey() + if key == "" { + return nil, errors.New("handleGetValue but no key was provided") + } + + // let's first check if we have the value locally. + dskey := ds.NewKey(pmes.GetKey()) + iVal, err := dht.datastore.Get(dskey) + + // if we got an unexpected error, bail. + if err != ds.ErrNotFound { + return nil, err + } + + // if we have the value, respond with it! + if err == nil { + u.DOut("handleGetValue success!\n") + + byts, ok := iVal.([]byte) + if !ok { + return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) + } + + resp.Value = byts + return resp, nil + } + + // if we know any providers for the requested value, return those. + provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) + if len(provs) > 0 { + u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) + resp.ProviderPeers = peersToPBPeers(provs) + return resp, nil + } + + // Find closest peer on given cluster to desired key and reply with that info + closer := dht.betterPeerToQuery(pmes) + if closer == nil { + u.DOut("handleGetValue could not find a closer node than myself.\n") + resp.CloserPeers = nil + return resp, nil + } + + // we got a closer peer, it seems. return it. + u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) + return resp, nil +} + +// Store a value in this peer local storage +func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) { + dht.dslock.Lock() + defer dht.dslock.Unlock() + dskey := ds.NewKey(pmes.GetKey()) + err := dht.datastore.Put(dskey, pmes.GetValue()) + if err != nil { + // For now, just panic, handle this better later maybe + panic(err) + } +} + +func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { + u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) + return &Message{Type: pmes.Type}, nil +} + +func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { + resp := &Message{Type: pmes.Type} + var closest *peer.Peer + + // if looking for self... special case where we send it on CloserPeers. + if peer.ID(pmes.GetKey()).Equal(dht.self.ID) { + closest = dht.self + } else { + closest = dht.betterPeerToQuery(pmes) + } + + if closest == nil { + u.PErr("handleFindPeer: could not find anything.\n") + return resp, nil + } + + if len(closest.Addresses) == 0 { + u.PErr("handleFindPeer: no addresses for connected peer...\n") + return resp, nil + } + + u.DOut("handleFindPeer: sending back '%s'\n", closest.ID.Pretty()) + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closest}) + return resp, nil +} + +func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, error) { + resp := &Message{ + Type: pmes.Type, + Key: pmes.Key, + } + + // check if we have this value, to add ourselves as provider. + has, err := dht.datastore.Has(ds.NewKey(pmes.GetKey())) + if err != nil && err != ds.ErrNotFound { + u.PErr("unexpected datastore error: %v\n", err) + has = false + } + + // setup providers + providers := dht.providers.GetProviders(u.Key(pmes.GetKey())) + if has { + providers = append(providers, dht.self) + } + + // if we've got providers, send thos those. + if providers != nil && len(providers) > 0 { + resp.ProviderPeers = peersToPBPeers(providers) + } + + // Also send closer peers. + closer := dht.betterPeerToQuery(pmes) + if closer != nil { + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) + } + + return resp, nil +} + +type providerInfo struct { + Creation time.Time + Value *peer.Peer +} + +func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) { + key := u.Key(pmes.GetKey()) + u.DOut("[%s] Adding [%s] as a provider for '%s'\n", + dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) + dht.providers.AddProvider(key, p) +} + +// Halt stops all communications from this peer and shut down +// TODO -- remove this in favor of context +func (dht *IpfsDHT) Halt() { + dht.shutdown <- struct{}{} + dht.network.Close() + dht.providers.Halt() +} + +// NOTE: not yet finished, low priority +func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) (*Message, error) { + seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) + + for _, ps := range seq { + mes, err := msg.FromObject(ps, pmes) + if err != nil { + u.PErr("handleDiagnostics error creating message: %v\n", err) + continue + } + // dht.sender.SendRequest(context.TODO(), mes) + } + return nil, errors.New("not yet ported back") + + // buf := new(bytes.Buffer) + // di := dht.getDiagInfo() + // buf.Write(di.Marshal()) + // + // // NOTE: this shouldnt be a hardcoded value + // after := time.After(time.Second * 20) + // count := len(seq) + // for count > 0 { + // select { + // case <-after: + // //Timeout, return what we have + // goto out + // case reqResp := <-listenChan: + // pmesOut := new(Message) + // err := proto.Unmarshal(reqResp.Data, pmesOut) + // if err != nil { + // // It broke? eh, whatever, keep going + // continue + // } + // buf.Write(reqResp.Data) + // count-- + // } + // } + // + // out: + // resp := Message{ + // Type: Message_DIAGNOSTIC, + // ID: pmes.GetId(), + // Value: buf.Bytes(), + // Response: true, + // } + // + // mes := swarm.NewMessage(p, resp.ToProtobuf()) + // dht.netChan.Outgoing <- mes +} From 4240102243c29ffe4f084af04017fd5a7f4c8314 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 15 Sep 2014 04:50:56 -0700 Subject: [PATCH 0101/3147] refac(bitswap:interface) GetBlock, HaveBlock -> Block, HasBlock This commit was moved from ipfs/go-blockservice@246c55618a4836cd7e0054f098cf1cc2f5848f28 --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 6f5bf5104e..7008a5b2b1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -42,7 +42,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { return k, err } if s.Remote != nil { - err = s.Remote.HaveBlock(b) + err = s.Remote.HasBlock(b) } return k, err } @@ -65,7 +65,7 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { }, nil } else if err == ds.ErrNotFound && s.Remote != nil { u.DOut("Blockservice: Searching bitswap.\n") - blk, err := s.Remote.GetBlock(k, time.Second*5) + blk, err := s.Remote.Block(k, time.Second*5) if err != nil { return nil, err } From 23e0931992aa6776444b21f9aa3ccd46ba44bb38 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 02:16:57 -0700 Subject: [PATCH 0102/3147] uncomment all handlers This commit was moved from ipfs/go-ipfs-routing@562522951df82b96a7f77768c90989e5dd06f018 --- routing/dht/handlers.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 86593d1bf8..909ec839ac 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -21,18 +21,18 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { switch t { case Message_GET_VALUE: return dht.handleGetValue - // case Message_PUT_VALUE: - // return dht.handlePutValue + case Message_PUT_VALUE: + return dht.handlePutValue case Message_FIND_NODE: return dht.handleFindPeer - // case Message_ADD_PROVIDER: - // return dht.handleAddProvider - // case Message_GET_PROVIDERS: - // return dht.handleGetProviders + case Message_ADD_PROVIDER: + return dht.handleAddProvider + case Message_GET_PROVIDERS: + return dht.handleGetProviders case Message_PING: return dht.handlePing - // case Message_DIAGNOSTIC: - // return dht.handleDiagnostic + case Message_DIAGNOSTIC: + return dht.handleDiagnostic default: return nil } From 650ded671547200a2d9258daf079c1242dd93b61 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 02:26:46 -0700 Subject: [PATCH 0103/3147] check type assertion `v.([]byte)` coming from a datastore can panic. `byt, ok := v.([]byte)` to be safe. @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@177acbbcf0be2ca6b5c9b032deb660e350d51abf --- routing/dht/dht.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5090764137..c8b3bdabae 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -280,7 +280,12 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { if err != nil { return nil, err } - return v.([]byte), nil + + byt, ok := v.([]byte) + if !ok { + return byt, errors.New("value stored in datastore not []byte") + } + return byt, nil } func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { From c658ab0bb5f9cf3d052be47f5136e27fd2069150 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 02:43:11 -0700 Subject: [PATCH 0104/3147] getValueSingle using SendRequest This commit was moved from ipfs/go-ipfs-routing@fbdc727918223372a5aa6a3149c247534cb77269 --- routing/dht/dht.go | 71 +++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c8b3bdabae..da58089f34 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -159,8 +159,37 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg. return rmes, nil } -func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Duration, level int) ([]byte, []*peer.Peer, error) { - pmes, err := dht.getValueSingle(p, key, timeout, level) +// sendRequest sends out a request using dht.sender, but also makes sure to +// measure the RTT for latency measurements. +func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message) (*Message, error) { + + mes, err := msg.FromObject(p, pmes) + if err != nil { + return nil, err + } + + start := time.Now() + + rmes, err := dht.sender.SendRequest(ctx, mes) + if err != nil { + return nil, err + } + + rtt := time.Since(start) + rmes.Peer().SetLatency(rtt) + + rpmes := new(Message) + if err := proto.Unmarshal(rmes.Data(), rpmes); err != nil { + return nil, err + } + + return rpmes, nil +} + +func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, + key u.Key, level int) ([]byte, []*peer.Peer, error) { + + pmes, err := dht.getValueSingle(ctx, p, key, level) if err != nil { return nil, nil, err } @@ -202,39 +231,15 @@ func (dht *IpfsDHT) getValueOrPeers(p *peer.Peer, key u.Key, timeout time.Durati } // getValueSingle simply performs the get value RPC with the given parameters -func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duration, level int) (*Message, error) { - pmes := Message{ - Type: Message_GET_VALUE, - Key: string(key), - Value: []byte{byte(level)}, - ID: swarm.GenerateMessageID(), - } - responseChan := dht.listener.Listen(pmes.ID, 1, time.Minute) +func (dht *IpfsDHT) getValueSingle(ctx context.Context, p *peer.Peer, + key u.Key, level int) (*Message, error) { - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - t := time.Now() - dht.netChan.Outgoing <- mes + typ := Message_GET_VALUE + skey := string(key) + pmes := &Message{Type: &typ, Key: &skey} + pmes.SetClusterLevel(int32(level)) - // Wait for either the response or a timeout - timeup := time.After(timeout) - select { - case <-timeup: - dht.listener.Unlisten(pmes.ID) - return nil, u.ErrTimeout - case resp, ok := <-responseChan: - if !ok { - u.PErr("response channel closed before timeout, please investigate.\n") - return nil, u.ErrTimeout - } - roundtrip := time.Since(t) - resp.Peer.SetLatency(roundtrip) - pmesOut := new(Message) - err := proto.Unmarshal(resp.Data, pmesOut) - if err != nil { - return nil, err - } - return pmesOut, nil - } + return dht.sendRequest(ctx, p, pmes) } // TODO: Im not certain on this implementation, we get a list of peers/providers From 165372a29a254f9df63112a29a6500431509a639 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 15 Sep 2014 07:59:02 -0700 Subject: [PATCH 0105/3147] refac(bitswap:exch) HasBlock(ptr) -> HasBlock(val) This commit was moved from ipfs/go-blockservice@f6e006bd9940a509b16ba68a57b9099ebffdb184 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 7008a5b2b1..0b4f15b987 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -42,7 +42,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { return k, err } if s.Remote != nil { - err = s.Remote.HasBlock(b) + err = s.Remote.HasBlock(*b) } return k, err } From 1f88de77f22fe912a5822e2dcb0b42fef1a8174b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 05:05:32 -0700 Subject: [PATCH 0106/3147] Peerstore -- threadsafe collection this will later have persistent storage, but no need yet This commit was moved from ipfs/go-ipfs-routing@950f56ee148fe6454c1948e5886025348add53b3 --- routing/dht/dht.go | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index da58089f34..756c1803a8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -194,25 +194,27 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, return nil, nil, err } - if pmes.GetSuccess() { - if pmes.Value == nil { // We were given provider[s] - val, err := dht.getFromPeerList(key, timeout, pmes.GetPeers(), level) - if err != nil { - return nil, nil, err - } - return val, nil, nil - } - + if value := pmes.GetValue(); value != nil { // Success! We were given the value - return pmes.GetValue(), nil, nil + return value, nil, nil } - // We were given a closer node + // TODO decide on providers. This probably shouldn't be happening. + // if prv := pmes.GetProviderPeers(); prv != nil && len(prv) > 0 { + // val, err := dht.getFromPeerList(key, timeout,, level) + // if err != nil { + // return nil, nil, err + // } + // return val, nil, nil + // } + + // Perhaps we were given closer peers var peers []*peer.Peer - for _, pb := range pmes.GetPeers() { + for _, pb := range pmes.GetCloserPeers() { if peer.ID(pb.GetId()).Equal(dht.self.ID) { continue } + addr, err := ma.NewMultiaddr(pb.GetAddr()) if err != nil { u.PErr("%v\n", err.Error()) @@ -227,7 +229,12 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, peers = append(peers, np) } - return nil, peers, nil + + if len(peers) > 0 { + return nil, peers, nil + } + + return nil, nil, errors.New("NotFound. did not get value or closer peers.") } // getValueSingle simply performs the get value RPC with the given parameters From 56f6a0c52e19b6f82287b0a2a070f30af02f7221 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 06:10:08 -0700 Subject: [PATCH 0107/3147] godep multiaddr update This commit was moved from ipfs/go-ipfs-routing@1ef551903ba60dec76a8ed8687f32efb49d5d624 --- routing/dht/messages.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index d85e819057..b6e9fa4f26 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package dht -import proto "code.google.com/p/gogoprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import json "encoding/json" import math "math" From fbeb862b0e7478aa2daa6afc539b0c1a5f72b6c4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 06:18:26 -0700 Subject: [PATCH 0108/3147] add Peerstore to dht This commit was moved from ipfs/go-ipfs-routing@3aa025b23062c6a7461c39a2539c589d823bb043 --- routing/dht/dht.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 756c1803a8..8e26241b1a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -36,6 +36,9 @@ type IpfsDHT struct { // Local peer (yourself) self *peer.Peer + // Other peers + peerstore peer.Peerstore + // Local data datastore ds.Datastore dslock sync.Mutex @@ -53,12 +56,13 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(p *peer.Peer, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { +func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) dht.network = net dht.sender = sender dht.datastore = dstore dht.self = p + dht.peerstore = ps dht.providers = NewProviderManager(p.ID) dht.shutdown = make(chan struct{}) From 8b37885f89f72fc5b47b00bf5962924f1ba40016 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 06:33:51 -0700 Subject: [PATCH 0109/3147] getFromPeerList and peerFromInfo This commit was moved from ipfs/go-ipfs-routing@e0dd642a15f5766be0460b9529d898c73951ad06 --- routing/dht/dht.go | 75 +++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 8e26241b1a..596ba3dd76 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -225,13 +225,14 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, continue } - np, err := dht.network.GetConnection(peer.ID(pb.GetId()), addr) - if err != nil { - u.PErr("%v\n", err.Error()) - continue + // check if we already have this peer. + pr, _ := dht.peerstore.Get(peer.ID(pb.GetId())) + if pr == nil { + pr = &peer.Peer{ID: peer.ID(pb.GetId())} + dht.peerstore.Put(pr) } - - peers = append(peers, np) + pr.AddAddress(addr) // idempotent + peers = append(peers, pr) } if len(peers) > 0 { @@ -257,33 +258,26 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p *peer.Peer, // from someone what do we do with it? Connect to each of them? randomly pick // one to get the value from? Or just connect to one at a time until we get a // successful connection and request the value from it? -func (dht *IpfsDHT) getFromPeerList(key u.Key, timeout time.Duration, - peerlist []*Message_PBPeer, level int) ([]byte, error) { - for _, pinfo := range peerlist { - p, _ := dht.Find(peer.ID(pinfo.GetId())) - if p == nil { - maddr, err := ma.NewMultiaddr(pinfo.GetAddr()) - if err != nil { - u.PErr("getValue error: %s\n", err) - continue - } +func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, + peerlist []*Message_Peer, level int) ([]byte, error) { - p, err = dht.network.GetConnection(peer.ID(pinfo.GetId()), maddr) - if err != nil { - u.PErr("getValue error: %s\n", err) - continue - } + for _, pinfo := range peerlist { + p, err := dht.peerFromInfo(pinfo) + if err != nil { + u.DErr("getFromPeers error: %s\n", err) + continue } - pmes, err := dht.getValueSingle(p, key, timeout, level) + + pmes, err := dht.getValueSingle(ctx, p, key, level) if err != nil { u.DErr("getFromPeers error: %s\n", err) continue } - dht.providers.AddProvider(key, p) - // Make sure it was a successful get - if pmes.GetSuccess() && pmes.Value != nil { - return pmes.GetValue(), nil + if value := pmes.GetValue(); value != nil { + // Success! We were given the value + dht.providers.AddProvider(key, p) + return value, nil } } return nil, u.ErrNotFound @@ -463,13 +457,32 @@ func (dht *IpfsDHT) betterPeerToQuery(pmes *Message) *peer.Peer { return closer } -func (dht *IpfsDHT) peerFromInfo(pbp *Message_PBPeer) (*peer.Peer, error) { - maddr, err := ma.NewMultiaddr(pbp.GetAddr()) - if err != nil { - return nil, err +func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { + + id := peer.ID(pbp.GetId()) + p, _ := dht.peerstore.Get(id) + if p == nil { + p, _ = dht.Find(id) + if p != nil { + panic("somehow peer not getting into peerstore") + } + } + + if p == nil { + maddr, err := ma.NewMultiaddr(pbp.GetAddr()) + if err != nil { + return nil, err + } + + // create new Peer + p := &peer.Peer{ID: id} + p.AddAddress(maddr) + dht.peerstore.Put(pr) } - return dht.network.GetConnection(peer.ID(pbp.GetId()), maddr) + // dial connection + err = dht.network.Dial(p) + return p, err } func (dht *IpfsDHT) loadProvidableKeys() error { From d7d3e4232ca30e7eb18f18b8d6ca28cf07f54ce2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 06:40:17 -0700 Subject: [PATCH 0110/3147] updated Update function This commit was moved from ipfs/go-ipfs-routing@3d3ebd99f2ce1509eb037c2b9ce0244950e85f1b --- routing/dht/dht.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 596ba3dd76..f2de949c33 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -302,24 +302,25 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { return dht.datastore.Put(ds.NewKey(string(key)), value) } -// Update TODO(chas) Document this function +// Update signals to all routingTables to Update their last-seen status +// on the given peer. func (dht *IpfsDHT) Update(p *peer.Peer) { + removedCount := 0 for _, route := range dht.routingTables { removed := route.Update(p) // Only close the connection if no tables refer to this peer if removed != nil { - found := false - for _, r := range dht.routingTables { - if r.Find(removed.ID) != nil { - found = true - break - } - } - if !found { - dht.network.CloseConnection(removed) - } + removedCount++ } } + + // Only close the connection if no tables refer to this peer + // if removedCount == len(dht.routingTables) { + // dht.network.ClosePeer(p) + // } + // ACTUALLY, no, let's not just close the connection. it may be connected + // due to other things. it seems that we just need connection timeouts + // after some deadline of inactivity. } // Find looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. From 6fd89ec3e634defefb855ffa4ec15ceb2354a0ed Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Sep 2014 07:17:55 -0700 Subject: [PATCH 0111/3147] newMessage and more impl. This commit was moved from ipfs/go-ipfs-routing@ce3da2d129b9963dbd70dbe12af900cee15f436b --- routing/dht/Message.go | 20 ++++++-- routing/dht/dht.go | 107 +++++++++++----------------------------- routing/dht/handlers.go | 34 +++++-------- routing/dht/routing.go | 2 +- 4 files changed, 59 insertions(+), 104 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index bf592799de..d82b3bb442 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -6,6 +6,15 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +func newMessage(typ Message_MessageType, key string, level int) *Message { + m := &Message{ + Type: &typ, + Key: &key, + } + m.SetClusterLevel(level) + return m +} + func peerToPBPeer(p *peer.Peer) *Message_Peer { pbp := new(Message_Peer) if len(p.Addresses) == 0 || p.Addresses[0] == nil { @@ -24,7 +33,7 @@ func peerToPBPeer(p *peer.Peer) *Message_Peer { } func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { - pbpeers = make([]*Message_Peer, len(peers)) + pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { pbpeers[i] = peerToPBPeer(p) } @@ -34,18 +43,19 @@ func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { // GetClusterLevel gets and adjusts the cluster level on the message. // a +/- 1 adjustment is needed to distinguish a valid first level (1) and // default "no value" protobuf behavior (0) -func (m *Message) GetClusterLevel() int32 { +func (m *Message) GetClusterLevel() int { level := m.GetClusterLevelRaw() - 1 if level < 0 { u.PErr("handleGetValue: no routing level specified, assuming 0\n") level = 0 } - return level + return int(level) } // SetClusterLevel adjusts and sets the cluster level on the message. // a +/- 1 adjustment is needed to distinguish a valid first level (1) and // default "no value" protobuf behavior (0) -func (m *Message) SetClusterLevel(level int32) { - m.ClusterLevelRaw = &level +func (m *Message) SetClusterLevel(level int) { + lvl := int32(level) + m.ClusterLevelRaw = &lvl } diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f2de949c33..37205374f7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -246,11 +246,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, func (dht *IpfsDHT) getValueSingle(ctx context.Context, p *peer.Peer, key u.Key, level int) (*Message, error) { - typ := Message_GET_VALUE - skey := string(key) - pmes := &Message{Type: &typ, Key: &skey} - pmes.SetClusterLevel(int32(level)) - + pmes := newMessage(Message_GET_VALUE, string(key), level) return dht.sendRequest(ctx, p, pmes) } @@ -262,7 +258,7 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, peerlist []*Message_Peer, level int) ([]byte, error) { for _, pinfo := range peerlist { - p, err := dht.peerFromInfo(pinfo) + p, err := dht.ensureConnectedToPeer(pinfo) if err != nil { u.DErr("getFromPeers error: %s\n", err) continue @@ -334,34 +330,9 @@ func (dht *IpfsDHT) Find(id peer.ID) (*peer.Peer, *kb.RoutingTable) { return nil, nil } -func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Duration, level int) (*Message, error) { - pmes := Message{ - Type: Message_FIND_NODE, - Key: string(id), - ID: swarm.GenerateMessageID(), - Value: []byte{byte(level)}, - } - - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - listenChan := dht.listener.Listen(pmes.ID, 1, time.Minute) - t := time.Now() - dht.netChan.Outgoing <- mes - after := time.After(timeout) - select { - case <-after: - dht.listener.Unlisten(pmes.ID) - return nil, u.ErrTimeout - case resp := <-listenChan: - roundtrip := time.Since(t) - resp.Peer.SetLatency(roundtrip) - pmesOut := new(Message) - err := proto.Unmarshal(resp.Data, pmesOut) - if err != nil { - return nil, err - } - - return pmesOut, nil - } +func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p *peer.Peer, id peer.ID, level int) (*Message, error) { + pmes := newMessage(Message_FIND_NODE, string(id), level) + return dht.sendRequest(ctx, p, pmes) } func (dht *IpfsDHT) printTables() { @@ -370,54 +341,27 @@ func (dht *IpfsDHT) printTables() { } } -func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, timeout time.Duration) (*Message, error) { - pmes := Message{ - Type: Message_GET_PROVIDERS, - Key: string(key), - ID: swarm.GenerateMessageID(), - Value: []byte{byte(level)}, - } - - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - - listenChan := dht.listener.Listen(pmes.ID, 1, time.Minute) - dht.netChan.Outgoing <- mes - after := time.After(timeout) - select { - case <-after: - dht.listener.Unlisten(pmes.ID) - return nil, u.ErrTimeout - case resp := <-listenChan: - u.DOut("FindProviders: got response.\n") - pmesOut := new(Message) - err := proto.Unmarshal(resp.Data, pmesOut) - if err != nil { - return nil, err - } - - return pmesOut, nil - } +func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p *peer.Peer, key u.Key, level int) (*Message, error) { + pmes := newMessage(Message_GET_PROVIDERS, string(key), level) + return dht.sendRequest(ctx, p, pmes) } // TODO: Could be done async -func (dht *IpfsDHT) addPeerList(key u.Key, peers []*Message_PBPeer) []*peer.Peer { +func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer { var provArr []*peer.Peer for _, prov := range peers { - // Dont add outselves to the list - if peer.ID(prov.GetId()).Equal(dht.self.ID) { + p, err := dht.peerFromInfo(prov) + if err != nil { + u.PErr("error getting peer from info: %v\n", err) continue } - // Dont add someone who is already on the list - p := dht.network.GetPeer(u.Key(prov.GetId())) - if p == nil { - u.DOut("given provider %s was not in our network already.\n", peer.ID(prov.GetId()).Pretty()) - var err error - p, err = dht.peerFromInfo(prov) - if err != nil { - u.PErr("error connecting to new peer: %s\n", err) - continue - } + + // Dont add outselves to the list + if p.ID.Equal(dht.self.ID) { + continue } + + // TODO(jbenet) ensure providers is idempotent dht.providers.AddProvider(key, p) provArr = append(provArr, p) } @@ -450,6 +394,7 @@ func (dht *IpfsDHT) betterPeerToQuery(pmes *Message) *peer.Peer { } // self is closer? nil + key := u.Key(pmes.GetKey()) if kb.Closer(dht.self.ID, closer.ID, key) { return nil } @@ -478,11 +423,19 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { // create new Peer p := &peer.Peer{ID: id} p.AddAddress(maddr) - dht.peerstore.Put(pr) + dht.peerstore.Put(p) + } + return p, nil +} + +func (dht *IpfsDHT) ensureConnectedToPeer(pbp *Message_Peer) (*peer.Peer, error) { + p, err := dht.peerFromInfo(pbp) + if err != nil { + return nil, err } // dial connection - err = dht.network.Dial(p) + err = dht.network.DialPeer(p) return p, err } @@ -497,7 +450,7 @@ func (dht *IpfsDHT) loadProvidableKeys() error { return nil } -// Builds up list of peers by requesting random peer IDs +// Bootstrap builds up list of peers by requesting random peer IDs func (dht *IpfsDHT) Bootstrap() { id := make([]byte, 16) rand.Read(id) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 909ec839ac..710478e451 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -40,11 +40,8 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { typ := Message_PUT_VALUE - pmes := &Message{ - Type: &typ, - Key: &key, - Value: value, - } + pmes := newMessage(Message_PUT_VALUE, string(key), 0) + pmes.Value = value mes, err := msg.FromObject(p, pmes) if err != nil { @@ -57,10 +54,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error u.DOut("handleGetValue for key: %s\n", pmes.GetKey()) // setup response - resp := &Message{ - Type: pmes.Type, - Key: pmes.Key, - } + resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // first, is the key even a key? key := pmes.GetKey() @@ -113,24 +107,22 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } // Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) { +func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error) { dht.dslock.Lock() defer dht.dslock.Unlock() dskey := ds.NewKey(pmes.GetKey()) err := dht.datastore.Put(dskey, pmes.GetValue()) - if err != nil { - // For now, just panic, handle this better later maybe - panic(err) - } + return nil, err } func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) - return &Message{Type: pmes.Type}, nil + + return newMessage(pmes.GetType(), "", int(pmes.GetClusterLevel())), nil } func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { - resp := &Message{Type: pmes.Type} + resp := newMessage(pmes.GetType(), "", pmes.GetClusterLevel()) var closest *peer.Peer // if looking for self... special case where we send it on CloserPeers. @@ -156,10 +148,7 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error } func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, error) { - resp := &Message{ - Type: pmes.Type, - Key: pmes.Key, - } + resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. has, err := dht.datastore.Has(ds.NewKey(pmes.GetKey())) @@ -193,11 +182,14 @@ type providerInfo struct { Value *peer.Peer } -func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) { +func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, error) { key := u.Key(pmes.GetKey()) + u.DOut("[%s] Adding [%s] as a provider for '%s'\n", dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) + dht.providers.AddProvider(key, p) + return nil, nil } // Halt stops all communications from this peer and shut down diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3b8b25f5ca..49fdb06ee0 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -261,7 +261,7 @@ func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Pee } if pmes.GetSuccess() { u.DOut("Got providers back from findProviders call!\n") - provs := dht.addPeerList(key, pmes.GetPeers()) + provs := dht.addProviders(key, pmes.GetPeers()) ll.Success = true return provs, nil } From 789b6f1ea17f75d2f8387d3e7899b515ad865fe7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 01:39:08 -0700 Subject: [PATCH 0112/3147] cleaner KeySpace abstraction. This commit was moved from ipfs/go-ipfs-routing@85d17fc5e3824abb040072b4a3552f556b32f069 --- routing/dht/keyspace/keyspace.go | 95 +++++++++++++++++++++ routing/dht/keyspace/xor.go | 74 ++++++++++++++++ routing/dht/keyspace/xor_test.go | 139 +++++++++++++++++++++++++++++++ 3 files changed, 308 insertions(+) create mode 100644 routing/dht/keyspace/keyspace.go create mode 100644 routing/dht/keyspace/xor.go create mode 100644 routing/dht/keyspace/xor_test.go diff --git a/routing/dht/keyspace/keyspace.go b/routing/dht/keyspace/keyspace.go new file mode 100644 index 0000000000..3d3260b260 --- /dev/null +++ b/routing/dht/keyspace/keyspace.go @@ -0,0 +1,95 @@ +package keyspace + +import ( + "sort" + + "math/big" +) + +// Key represents an identifier in a KeySpace. It holds a reference to the +// associated KeySpace, as well references to both the Original identifier, +// as well as the new, KeySpace Adjusted one. +type Key struct { + + // Space is the KeySpace this Key is related to. + Space KeySpace + + // Original is the original value of the identifier + Original []byte + + // Adjusted is the new value of the identifier, in the KeySpace. + Adjusted []byte +} + +// Equal returns whether this key is equal to another. +func (k1 Key) Equal(k2 Key) bool { + if k1.Space != k2.Space { + panic("k1 and k2 not in same key space.") + } + return k1.Space.Equal(k1, k2) +} + +// Less returns whether this key comes before another. +func (k1 Key) Less(k2 Key) bool { + if k1.Space != k2.Space { + panic("k1 and k2 not in same key space.") + } + return k1.Space.Less(k1, k2) +} + +// Distance returns this key's distance to another +func (k1 Key) Distance(k2 Key) *big.Int { + if k1.Space != k2.Space { + panic("k1 and k2 not in same key space.") + } + return k1.Space.Distance(k1, k2) +} + +// KeySpace is an object used to do math on identifiers. Each keyspace has its +// own properties and rules. See XorKeySpace. +type KeySpace interface { + + // Key converts an identifier into a Key in this space. + Key([]byte) Key + + // Equal returns whether keys are equal in this key space + Equal(Key, Key) bool + + // Distance returns the distance metric in this key space + Distance(Key, Key) *big.Int + + // Less returns whether the first key is smaller than the second. + Less(Key, Key) bool +} + +// byDistanceToCenter is a type used to sort Keys by proximity to a center. +type byDistanceToCenter struct { + Center Key + Keys []Key +} + +func (s byDistanceToCenter) Len() int { + return len(s.Keys) +} + +func (s byDistanceToCenter) Swap(i, j int) { + s.Keys[i], s.Keys[j] = s.Keys[j], s.Keys[i] +} + +func (s byDistanceToCenter) Less(i, j int) bool { + a := s.Center.Distance(s.Keys[i]) + b := s.Center.Distance(s.Keys[j]) + return a.Cmp(b) == -1 +} + +// SortByDistance takes a KeySpace, a center Key, and a list of Keys toSort. +// It returns a new list, where the Keys toSort have been sorted by their +// distance to the center Key. +func SortByDistance(sp KeySpace, center Key, toSort []Key) []Key { + bdtc := &byDistanceToCenter{ + Center: center, + Keys: toSort[:], // copy + } + sort.Sort(bdtc) + return bdtc.Keys +} diff --git a/routing/dht/keyspace/xor.go b/routing/dht/keyspace/xor.go new file mode 100644 index 0000000000..8cbef30eb4 --- /dev/null +++ b/routing/dht/keyspace/xor.go @@ -0,0 +1,74 @@ +package keyspace + +import ( + "bytes" + "crypto/sha256" + "math/big" +) + +// XORKeySpace is a KeySpace which: +// - normalizes identifiers using a cryptographic hash (sha256) +// - measures distance by XORing keys together +var XORKeySpace = &xorKeySpace{} +var _ KeySpace = XORKeySpace // ensure it conforms + +type xorKeySpace struct{} + +// Key converts an identifier into a Key in this space. +func (s *xorKeySpace) Key(id []byte) Key { + hash := sha256.Sum256(id) + key := hash[:] + return Key{ + Space: s, + Original: id, + Adjusted: key, + } +} + +// Equal returns whether keys are equal in this key space +func (s *xorKeySpace) Equal(k1, k2 Key) bool { + return bytes.Equal(k1.Adjusted, k2.Adjusted) +} + +// Distance returns the distance metric in this key space +func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { + // XOR the keys + k3 := XOR(k1.Adjusted, k2.Adjusted) + + // interpret it as an integer + dist := big.NewInt(0).SetBytes(k3) + return dist +} + +// Less returns whether the first key is smaller than the second. +func (s *xorKeySpace) Less(k1, k2 Key) bool { + a := k1.Adjusted + b := k2.Adjusted + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return a[i] < b[i] + } + } + return true +} + +// XOR takes two byte slices, XORs them together, returns the resulting slice. +func XOR(a, b []byte) []byte { + c := make([]byte, len(a)) + for i := 0; i < len(a); i++ { + c[i] = a[i] ^ b[i] + } + return c +} + +// ZeroPrefixLen returns the number of consecutive zeroes in a byte slice. +func ZeroPrefixLen(id []byte) int { + for i := 0; i < len(id); i++ { + for j := 0; j < 8; j++ { + if (id[i]>>uint8(7-j))&0x1 != 0 { + return i*8 + j + } + } + } + return len(id) * 8 +} diff --git a/routing/dht/keyspace/xor_test.go b/routing/dht/keyspace/xor_test.go new file mode 100644 index 0000000000..58987ad10b --- /dev/null +++ b/routing/dht/keyspace/xor_test.go @@ -0,0 +1,139 @@ +package keyspace + +import ( + "bytes" + "math/big" + "testing" +) + +func TestXOR(t *testing.T) { + cases := [][3][]byte{ + [3][]byte{ + []byte{0xFF, 0xFF, 0xFF}, + []byte{0xFF, 0xFF, 0xFF}, + []byte{0x00, 0x00, 0x00}, + }, + [3][]byte{ + []byte{0x00, 0xFF, 0x00}, + []byte{0xFF, 0xFF, 0xFF}, + []byte{0xFF, 0x00, 0xFF}, + }, + [3][]byte{ + []byte{0x55, 0x55, 0x55}, + []byte{0x55, 0xFF, 0xAA}, + []byte{0x00, 0xAA, 0xFF}, + }, + } + + for _, c := range cases { + r := XOR(c[0], c[1]) + if !bytes.Equal(r, c[2]) { + t.Error("XOR failed") + } + } +} + +func TestPrefixLen(t *testing.T) { + cases := [][]byte{ + []byte{0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}, + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + []byte{0x00, 0x58, 0xFF, 0x80, 0x00, 0x00, 0xF0}, + } + lens := []int{24, 56, 9} + + for i, c := range cases { + r := ZeroPrefixLen(c) + if r != lens[i] { + t.Errorf("ZeroPrefixLen failed: %v != %v", r, lens[i]) + } + } + +} + +func TestXorKeySpace(t *testing.T) { + + ids := [][]byte{ + []byte{0xFF, 0xFF, 0xFF, 0xFF}, + []byte{0x00, 0x00, 0x00, 0x00}, + []byte{0xFF, 0xFF, 0xFF, 0xF0}, + } + + ks := [][2]Key{ + [2]Key{XORKeySpace.Key(ids[0]), XORKeySpace.Key(ids[0])}, + [2]Key{XORKeySpace.Key(ids[1]), XORKeySpace.Key(ids[1])}, + [2]Key{XORKeySpace.Key(ids[2]), XORKeySpace.Key(ids[2])}, + } + + for i, set := range ks { + if !set[0].Equal(set[1]) { + t.Errorf("Key not eq. %v != %v", set[0], set[1]) + } + + if !bytes.Equal(set[0].Adjusted, set[1].Adjusted) { + t.Errorf("Key gen failed. %v != %v", set[0].Adjusted, set[1].Adjusted) + } + + if !bytes.Equal(set[0].Original, ids[i]) { + t.Errorf("ptrs to original. %v != %v", set[0].Original, ids[i]) + } + + if len(set[0].Adjusted) != 32 { + t.Errorf("key length incorrect. 32 != %d", len(set[0].Adjusted)) + } + } + + for i := 1; i < len(ks); i++ { + if ks[i][0].Less(ks[i-1][0]) == ks[i-1][0].Less(ks[i][0]) { + t.Errorf("less should be different.") + } + + if ks[i][0].Distance(ks[i-1][0]).Cmp(ks[i-1][0].Distance(ks[i][0])) != 0 { + t.Errorf("distance should be the same.") + } + + if ks[i][0].Equal(ks[i-1][0]) { + t.Errorf("Keys should not be eq. %v != %v", ks[i][0], ks[i-1][0]) + } + } +} + +func TestCenterSorting(t *testing.T) { + + adjs := [][]byte{ + []byte{173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, + []byte{223, 63, 97, 152, 4, 169, 47, 219, 64, 87, 25, 45, 196, 61, 215, 72, 234, 119, 138, 220, 82, 188, 73, 140, 232, 5, 36, 192, 20, 184, 17, 25}, + []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 126}, + []byte{73, 0, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + } + + keys := make([]Key, len(adjs)) + for i, a := range adjs { + keys[i] = Key{Space: XORKeySpace, Adjusted: a} + } + + cmp := func(a int, b *big.Int) int { + return big.NewInt(int64(a)).Cmp(b) + } + + if 0 != cmp(0, keys[2].Distance(keys[3])) { + t.Errorf("distance calculation wrong: %v", keys[2].Distance(keys[3])) + } + + if 0 != cmp(1, keys[2].Distance(keys[4])) { + t.Errorf("distance calculation wrong: %v", keys[2].Distance(keys[4])) + } + + d1 := keys[2].Distance(keys[5]) + d2 := XOR(keys[2].Adjusted, keys[5].Adjusted) + d2 = d2[len(keys[2].Adjusted)-len(d1.Bytes()):] // skip empty space for big + if !bytes.Equal(d1.Bytes(), d2) { + t.Errorf("bytes should be the same. %v == %v", d1.Bytes(), d2) + } + + if -1 != cmp(2<<32, keys[2].Distance(keys[5])) { + t.Errorf("2<<32 should be smaller") + } + +} From 0997bcea6c2ce42119b6d4a049bb9552aa87f90b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 01:51:03 -0700 Subject: [PATCH 0113/3147] SortByDistance copy fix This commit was moved from ipfs/go-ipfs-routing@35fcaf876a3da2d5071ffb86bd44c3328325cc94 --- routing/dht/keyspace/keyspace.go | 4 +++- routing/dht/keyspace/xor_test.go | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/routing/dht/keyspace/keyspace.go b/routing/dht/keyspace/keyspace.go index 3d3260b260..a385e9a027 100644 --- a/routing/dht/keyspace/keyspace.go +++ b/routing/dht/keyspace/keyspace.go @@ -86,9 +86,11 @@ func (s byDistanceToCenter) Less(i, j int) bool { // It returns a new list, where the Keys toSort have been sorted by their // distance to the center Key. func SortByDistance(sp KeySpace, center Key, toSort []Key) []Key { + toSortCopy := make([]Key, len(toSort)) + copy(toSortCopy, toSort) bdtc := &byDistanceToCenter{ Center: center, - Keys: toSort[:], // copy + Keys: toSortCopy, // copy } sort.Sort(bdtc) return bdtc.Keys diff --git a/routing/dht/keyspace/xor_test.go b/routing/dht/keyspace/xor_test.go index 58987ad10b..46757b7fd2 100644 --- a/routing/dht/keyspace/xor_test.go +++ b/routing/dht/keyspace/xor_test.go @@ -97,7 +97,7 @@ func TestXorKeySpace(t *testing.T) { } } -func TestCenterSorting(t *testing.T) { +func TestDistancesAndCenterSorting(t *testing.T) { adjs := [][]byte{ []byte{173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, @@ -136,4 +136,12 @@ func TestCenterSorting(t *testing.T) { t.Errorf("2<<32 should be smaller") } + keys2 := SortByDistance(XORKeySpace, keys[2], keys) + order := []int{2, 3, 4, 5, 1, 0} + for i, o := range order { + if !bytes.Equal(keys[o].Adjusted, keys2[i].Adjusted) { + t.Errorf("order is wrong. %d?? %v == %v", o, keys[o], keys2[i]) + } + } + } From 1ba133998d7702028d552f547027c4ce92f27ef9 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 02:02:13 -0700 Subject: [PATCH 0114/3147] moved keyspace This commit was moved from ipfs/go-ipfs-routing@7cb38547369c09e15d54a87fc043268c6f756add --- routing/{dht => }/keyspace/keyspace.go | 0 routing/{dht => }/keyspace/xor.go | 0 routing/{dht => }/keyspace/xor_test.go | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename routing/{dht => }/keyspace/keyspace.go (100%) rename routing/{dht => }/keyspace/xor.go (100%) rename routing/{dht => }/keyspace/xor_test.go (100%) diff --git a/routing/dht/keyspace/keyspace.go b/routing/keyspace/keyspace.go similarity index 100% rename from routing/dht/keyspace/keyspace.go rename to routing/keyspace/keyspace.go diff --git a/routing/dht/keyspace/xor.go b/routing/keyspace/xor.go similarity index 100% rename from routing/dht/keyspace/xor.go rename to routing/keyspace/xor.go diff --git a/routing/dht/keyspace/xor_test.go b/routing/keyspace/xor_test.go similarity index 100% rename from routing/dht/keyspace/xor_test.go rename to routing/keyspace/xor_test.go From 41505dec8de3b64cd97beae7a4520f72c294255e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 02:02:44 -0700 Subject: [PATCH 0115/3147] kbucket use new keyspace This commit was moved from ipfs/go-ipfs-routing@5e044d90433bb129556fb4a65f7936f1229205b3 --- routing/kbucket/bucket.go | 2 +- routing/kbucket/table.go | 4 +-- routing/kbucket/table_test.go | 4 +-- routing/kbucket/util.go | 54 ++++++----------------------------- 4 files changed, 13 insertions(+), 51 deletions(-) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index a4eb914158..3a9c71fad9 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -69,7 +69,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { e := b.list.Front() for e != nil { peerID := ConvertPeerID(e.Value.(*peer.Peer).ID) - peerCPL := prefLen(peerID, target) + peerCPL := commonPrefixLen(peerID, target) if peerCPL > cpl { cur := e out.PushBack(e.Value) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 5f1e5c8701..2a0f16d1a0 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -44,7 +44,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() peerID := ConvertPeerID(p.ID) - cpl := xor(peerID, rt.local).commonPrefixLen() + cpl := commonPrefixLen(peerID, rt.local) bucketID := cpl if bucketID >= len(rt.Buckets) { @@ -145,7 +145,7 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { rt.tabLock.RLock() defer rt.tabLock.RUnlock() - cpl := prefLen(id, rt.local) + cpl := commonPrefixLen(id, rt.local) // Get bucket at cpl index or last bucket var bucket *Bucket diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index dbb391ff38..49be52c655 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -48,7 +48,7 @@ func TestBucket(t *testing.T) { llist := b.list for e := llist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, localID).commonPrefixLen() + cpl := commonPrefixLen(p, localID) if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") } @@ -57,7 +57,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, localID).commonPrefixLen() + cpl := commonPrefixLen(p, localID) if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") } diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 1195022b0b..ded28bb528 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -6,6 +6,7 @@ import ( "errors" peer "github.com/jbenet/go-ipfs/peer" + ks "github.com/jbenet/go-ipfs/routing/keyspace" u "github.com/jbenet/go-ipfs/util" ) @@ -13,8 +14,7 @@ import ( // behaviour var ErrLookupFailure = errors.New("failed to find any peer in table") -// ID for IpfsDHT should be a byte slice, to allow for simpler operations -// (xor). DHT ids are based on the peer.IDs. +// ID for IpfsDHT is in the XORKeySpace // // The type dht.ID signifies that its contents have been hashed from either a // peer.ID or a util.Key. This unifies the keyspace @@ -25,55 +25,17 @@ func (id ID) equal(other ID) bool { } func (id ID) less(other ID) bool { - a, b := equalizeSizes(id, other) - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - return a[i] < b[i] - } - } - return len(a) < len(b) -} - -func (id ID) commonPrefixLen() int { - for i := 0; i < len(id); i++ { - for j := 0; j < 8; j++ { - if (id[i]>>uint8(7-j))&0x1 != 0 { - return i*8 + j - } - } - } - return len(id)*8 - 1 -} - -func prefLen(a, b ID) int { - return xor(a, b).commonPrefixLen() + a := ks.Key{Space: ks.XORKeySpace, Adjusted: id} + b := ks.Key{Space: ks.XORKeySpace, Adjusted: other} + return a.Less(b) } func xor(a, b ID) ID { - a, b = equalizeSizes(a, b) - - c := make(ID, len(a)) - for i := 0; i < len(a); i++ { - c[i] = a[i] ^ b[i] - } - return c + return ID(ks.XOR(a, b)) } -func equalizeSizes(a, b ID) (ID, ID) { - la := len(a) - lb := len(b) - - if la < lb { - na := make([]byte, lb) - copy(na, a) - a = na - } else if lb < la { - nb := make([]byte, la) - copy(nb, b) - b = nb - } - - return a, b +func commonPrefixLen(a, b ID) int { + return ks.ZeroPrefixLen(ks.XOR(a, b)) } // ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) From 4a96eb4487a11989a1cd29aaccfcfc5643a2bb0f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 02:46:54 -0700 Subject: [PATCH 0116/3147] refactored keyspace Adjusted -> Bytes This commit was moved from ipfs/go-ipfs-routing@b948f06dffe2b66d0cfbc1bf6d64127f9e8f3320 --- routing/kbucket/util.go | 4 ++-- routing/keyspace/keyspace.go | 6 +++--- routing/keyspace/xor.go | 10 +++++----- routing/keyspace/xor_test.go | 16 ++++++++-------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index ded28bb528..3aca06f6af 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -25,8 +25,8 @@ func (id ID) equal(other ID) bool { } func (id ID) less(other ID) bool { - a := ks.Key{Space: ks.XORKeySpace, Adjusted: id} - b := ks.Key{Space: ks.XORKeySpace, Adjusted: other} + a := ks.Key{Space: ks.XORKeySpace, Bytes: id} + b := ks.Key{Space: ks.XORKeySpace, Bytes: other} return a.Less(b) } diff --git a/routing/keyspace/keyspace.go b/routing/keyspace/keyspace.go index a385e9a027..e26a0e6d0d 100644 --- a/routing/keyspace/keyspace.go +++ b/routing/keyspace/keyspace.go @@ -8,7 +8,7 @@ import ( // Key represents an identifier in a KeySpace. It holds a reference to the // associated KeySpace, as well references to both the Original identifier, -// as well as the new, KeySpace Adjusted one. +// as well as the new, KeySpace Bytes one. type Key struct { // Space is the KeySpace this Key is related to. @@ -17,8 +17,8 @@ type Key struct { // Original is the original value of the identifier Original []byte - // Adjusted is the new value of the identifier, in the KeySpace. - Adjusted []byte + // Bytes is the new value of the identifier, in the KeySpace. + Bytes []byte } // Equal returns whether this key is equal to another. diff --git a/routing/keyspace/xor.go b/routing/keyspace/xor.go index 8cbef30eb4..dbb7c68516 100644 --- a/routing/keyspace/xor.go +++ b/routing/keyspace/xor.go @@ -21,19 +21,19 @@ func (s *xorKeySpace) Key(id []byte) Key { return Key{ Space: s, Original: id, - Adjusted: key, + Bytes: key, } } // Equal returns whether keys are equal in this key space func (s *xorKeySpace) Equal(k1, k2 Key) bool { - return bytes.Equal(k1.Adjusted, k2.Adjusted) + return bytes.Equal(k1.Bytes, k2.Bytes) } // Distance returns the distance metric in this key space func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { // XOR the keys - k3 := XOR(k1.Adjusted, k2.Adjusted) + k3 := XOR(k1.Bytes, k2.Bytes) // interpret it as an integer dist := big.NewInt(0).SetBytes(k3) @@ -42,8 +42,8 @@ func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { // Less returns whether the first key is smaller than the second. func (s *xorKeySpace) Less(k1, k2 Key) bool { - a := k1.Adjusted - b := k2.Adjusted + a := k1.Bytes + b := k2.Bytes for i := 0; i < len(a); i++ { if a[i] != b[i] { return a[i] < b[i] diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go index 46757b7fd2..d7d83afa20 100644 --- a/routing/keyspace/xor_test.go +++ b/routing/keyspace/xor_test.go @@ -69,16 +69,16 @@ func TestXorKeySpace(t *testing.T) { t.Errorf("Key not eq. %v != %v", set[0], set[1]) } - if !bytes.Equal(set[0].Adjusted, set[1].Adjusted) { - t.Errorf("Key gen failed. %v != %v", set[0].Adjusted, set[1].Adjusted) + if !bytes.Equal(set[0].Bytes, set[1].Bytes) { + t.Errorf("Key gen failed. %v != %v", set[0].Bytes, set[1].Bytes) } if !bytes.Equal(set[0].Original, ids[i]) { t.Errorf("ptrs to original. %v != %v", set[0].Original, ids[i]) } - if len(set[0].Adjusted) != 32 { - t.Errorf("key length incorrect. 32 != %d", len(set[0].Adjusted)) + if len(set[0].Bytes) != 32 { + t.Errorf("key length incorrect. 32 != %d", len(set[0].Bytes)) } } @@ -110,7 +110,7 @@ func TestDistancesAndCenterSorting(t *testing.T) { keys := make([]Key, len(adjs)) for i, a := range adjs { - keys[i] = Key{Space: XORKeySpace, Adjusted: a} + keys[i] = Key{Space: XORKeySpace, Bytes: a} } cmp := func(a int, b *big.Int) int { @@ -126,8 +126,8 @@ func TestDistancesAndCenterSorting(t *testing.T) { } d1 := keys[2].Distance(keys[5]) - d2 := XOR(keys[2].Adjusted, keys[5].Adjusted) - d2 = d2[len(keys[2].Adjusted)-len(d1.Bytes()):] // skip empty space for big + d2 := XOR(keys[2].Bytes, keys[5].Bytes) + d2 = d2[len(keys[2].Bytes)-len(d1.Bytes()):] // skip empty space for big if !bytes.Equal(d1.Bytes(), d2) { t.Errorf("bytes should be the same. %v == %v", d1.Bytes(), d2) } @@ -139,7 +139,7 @@ func TestDistancesAndCenterSorting(t *testing.T) { keys2 := SortByDistance(XORKeySpace, keys[2], keys) order := []int{2, 3, 4, 5, 1, 0} for i, o := range order { - if !bytes.Equal(keys[o].Adjusted, keys2[i].Adjusted) { + if !bytes.Equal(keys[o].Bytes, keys2[i].Bytes) { t.Errorf("order is wrong. %d?? %v == %v", o, keys[o], keys2[i]) } } From 326dbab87d03d317322fb971fd53d3bf4e5c7edf Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 07:19:40 -0700 Subject: [PATCH 0117/3147] got everything to build This commit was moved from ipfs/go-ipfs-routing@9c06c5def265b58f67341b256b5d0dd83ee59b71 --- routing/dht/dht.go | 28 ++- routing/dht/dht_logger.go | 5 + routing/dht/handlers.go | 15 +- routing/dht/query.go | 85 +++++++++ routing/dht/routing.go | 390 +++++++++++++++----------------------- 5 files changed, 270 insertions(+), 253 deletions(-) create mode 100644 routing/dht/query.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 37205374f7..d3f0757622 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -142,7 +142,6 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg. Message_MessageType_name[int32(pmes.GetType())], mPeer.ID.Pretty()) // get handler for this msg type. - var resp *Message handler := dht.handlerForMsgType(pmes.GetType()) if handler == nil { return nil, errors.New("Recieved invalid message type") @@ -190,6 +189,27 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message return rpmes, nil } +func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, key string, value []byte) error { + pmes := newMessage(Message_PUT_VALUE, string(key), 0) + pmes.Value = value + + mes, err := msg.FromObject(p, pmes) + if err != nil { + return err + } + return dht.sender.SendMessage(ctx, mes) +} + +func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) error { + pmes := newMessage(Message_ADD_PROVIDER, string(key), 0) + + mes, err := msg.FromObject(p, pmes) + if err != nil { + return err + } + return dht.sender.SendMessage(ctx, mes) +} + func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, key u.Key, level int) ([]byte, []*peer.Peer, error) { @@ -406,6 +426,12 @@ func (dht *IpfsDHT) betterPeerToQuery(pmes *Message) *peer.Peer { func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { id := peer.ID(pbp.GetId()) + + // continue if it's ourselves + if id.Equal(dht.self.ID) { + return nil, errors.New("found self") + } + p, _ := dht.peerstore.Get(id) if p == nil { p, _ = dht.Find(id) diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go index 4a02fc3047..403c2a66f0 100644 --- a/routing/dht/dht_logger.go +++ b/routing/dht/dht_logger.go @@ -36,3 +36,8 @@ func (l *logDhtRPC) Print() { u.DOut(string(b)) } } + +func (l *logDhtRPC) EndAndPrint() { + l.EndLog() + l.Print() +} diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 710478e451..71e5eb0377 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -10,7 +10,6 @@ import ( kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ) @@ -38,18 +37,6 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { } } -func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) error { - typ := Message_PUT_VALUE - pmes := newMessage(Message_PUT_VALUE, string(key), 0) - pmes.Value = value - - mes, err := msg.FromObject(p, pmes) - if err != nil { - return err - } - return dht.sender.SendMessage(context.TODO(), mes) -} - func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error) { u.DOut("handleGetValue for key: %s\n", pmes.GetKey()) @@ -205,7 +192,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) (*Message, err seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) for _, ps := range seq { - mes, err := msg.FromObject(ps, pmes) + _, err := msg.FromObject(ps, pmes) if err != nil { u.PErr("handleDiagnostics error creating message: %v\n", err) continue diff --git a/routing/dht/query.go b/routing/dht/query.go new file mode 100644 index 0000000000..efedfcd8a3 --- /dev/null +++ b/routing/dht/query.go @@ -0,0 +1,85 @@ +package dht + +import ( + peer "github.com/jbenet/go-ipfs/peer" + queue "github.com/jbenet/go-ipfs/peer/queue" + u "github.com/jbenet/go-ipfs/util" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +type dhtQuery struct { + // a PeerQueue + peers queue.PeerQueue + + // the function to execute per peer + qfunc queryFunc +} + +// QueryFunc is a function that runs a particular query with a given peer. +// It returns either: +// - the value +// - a list of peers potentially better able to serve the query +// - an error +type queryFunc func(context.Context, *peer.Peer) (interface{}, []*peer.Peer, error) + +func (q *dhtQuery) Run(ctx context.Context, concurrency int) (interface{}, error) { + // get own cancel function to signal when we've found the value + ctx, cancel := context.WithCancel(ctx) + + // the variable waiting to be populated upon success + var result interface{} + + // chanQueue is how workers receive their work + chanQueue := queue.NewChanQueue(ctx, q.peers) + + // worker + worker := func() { + for { + select { + case p := <-chanQueue.DeqChan: + + val, closer, err := q.qfunc(ctx, p) + if err != nil { + u.PErr("error running query: %v\n", err) + continue + } + + if val != nil { + result = val + cancel() // signal we're done. + return + } + + if closer != nil { + for _, p := range closer { + select { + case chanQueue.EnqChan <- p: + case <-ctx.Done(): + return + } + } + } + + case <-ctx.Done(): + return + } + } + } + + // launch all workers + for i := 0; i < concurrency; i++ { + go worker() + } + + // wait until we're done. yep. + select { + case <-ctx.Done(): + } + + if result != nil { + return result, nil + } + + return nil, ctx.Err() +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 49fdb06ee0..bee640e8f4 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -4,14 +4,13 @@ import ( "bytes" "encoding/json" "errors" + "fmt" "time" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - - swarm "github.com/jbenet/go-ipfs/net/swarm" peer "github.com/jbenet/go-ipfs/peer" + queue "github.com/jbenet/go-ipfs/peer/queue" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" ) @@ -23,29 +22,31 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { - complete := make(chan struct{}) - count := 0 + ctx := context.TODO() + + query := &dhtQuery{} + query.peers = queue.NewXORDistancePQ(key) + + // get the peers we need to announce to for _, route := range dht.routingTables { peers := route.NearestPeers(kb.ConvertKey(key), KValue) for _, p := range peers { if p == nil { - dht.network.Error(kb.ErrLookupFailure) - continue + // this shouldn't be happening. + panic("p should not be nil") } - count++ - go func(sp *peer.Peer) { - err := dht.putValueToNetwork(sp, string(key), value) - if err != nil { - dht.network.Error(err) - } - complete <- struct{}{} - }(p) + + query.peers.Enqueue(p) } } - for i := 0; i < count; i++ { - <-complete + + query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { + dht.putValueToNetwork(ctx, p, string(key), value) + return nil, nil, nil } - return nil + + _, err := query.Run(ctx, query.peers.Len()) + return err } // GetValue searches for the value corresponding to given Key. @@ -53,10 +54,9 @@ func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { // returned along with util.ErrSearchIncomplete func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { ll := startNewRPC("GET") - defer func() { - ll.EndLog() - ll.Print() - }() + defer ll.EndAndPrint() + + ctx, _ := context.WithTimeout(context.TODO(), timeout) // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... @@ -67,98 +67,37 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { return val, nil } + // get closest peers in the routing tables routeLevel := 0 closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { return nil, kb.ErrLookupFailure } - valChan := make(chan []byte) - npeerChan := make(chan *peer.Peer, 30) - procPeer := make(chan *peer.Peer, 30) - errChan := make(chan error) - after := time.After(timeout) - pset := newPeerSet() + query := &dhtQuery{} + query.peers = queue.NewXORDistancePQ(key) + // get the peers we need to announce to for _, p := range closest { - pset.Add(p) - npeerChan <- p + query.peers.Enqueue(p) } - c := counter{} - - count := 0 - go func() { - defer close(procPeer) - for { - select { - case p, ok := <-npeerChan: - if !ok { - return - } - count++ - if count >= KValue { - errChan <- u.ErrNotFound - return - } - c.Increment() - - procPeer <- p - default: - if c.Size() <= 0 { - select { - case errChan <- u.ErrNotFound: - default: - } - return - } - } - } - }() - - process := func() { - defer c.Decrement() - for p := range procPeer { - if p == nil { - return - } - val, peers, err := dht.getValueOrPeers(p, key, timeout/4, routeLevel) - if err != nil { - u.DErr("%v\n", err.Error()) - continue - } - if val != nil { - select { - case valChan <- val: - default: - u.DOut("Wasnt the first to return the value!") - } - return - } - - for _, np := range peers { - // TODO: filter out peers that arent closer - if !pset.Contains(np) && pset.Size() < KValue { - pset.Add(np) //This is racey... make a single function to do operation - npeerChan <- np - } - } - c.Decrement() - } + // setup the Query Function + query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { + return dht.getValueOrPeers(ctx, p, key, routeLevel) } - for i := 0; i < AlphaValue; i++ { - go process() + // run it! + result, err := query.Run(ctx, query.peers.Len()) + if err != nil { + return nil, err } - select { - case val := <-valChan: - return val, nil - case err := <-errChan: - return nil, err - case <-after: - return nil, u.ErrTimeout + byt, ok := result.([]byte) + if !ok { + return nil, fmt.Errorf("received non-byte slice value") } + return byt, nil } // Value provider layer of indirection. @@ -166,26 +105,27 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // Provide makes this node announce that it can provide a value for the given key func (dht *IpfsDHT) Provide(key u.Key) error { + ctx := context.TODO() + dht.providers.AddProvider(key, dht.self) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { return kb.ErrLookupFailure } - pmes := Message{ - Type: PBDHTMessage_ADD_PROVIDER, - Key: string(key), - } - pbmes := pmes.ToProtobuf() - for _, p := range peers { - mes := swarm.NewMessage(p, pbmes) - dht.netChan.Outgoing <- mes + err := dht.putProvider(ctx, p, string(key)) + if err != nil { + return err + } } return nil } +// FindProvidersAsync runs FindProviders and sends back results over a channel func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Duration) chan *peer.Peer { + ctx, _ := context.WithTimeout(context.TODO(), timeout) + peerOut := make(chan *peer.Peer, count) go func() { ps := newPeerSet() @@ -202,13 +142,14 @@ func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Durati peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) for _, pp := range peers { + ppp := pp go func() { - pmes, err := dht.findProvidersSingle(pp, key, 0, timeout) + pmes, err := dht.findProvidersSingle(ctx, ppp, key, 0) if err != nil { u.PErr("%v\n", err) return } - dht.addPeerListAsync(key, pmes.GetPeers(), ps, count, peerOut) + dht.addPeerListAsync(key, pmes.GetProviderPeers(), ps, count, peerOut) }() } @@ -217,21 +158,15 @@ func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Durati } //TODO: this function could also be done asynchronously -func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*PBDHTMessage_PBPeer, ps *peerSet, count int, out chan *peer.Peer) { +func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet, count int, out chan *peer.Peer) { for _, pbp := range peers { - if peer.ID(pbp.GetId()).Equal(dht.self.ID) { - continue - } - maddr, err := ma.NewMultiaddr(pbp.GetAddr()) - if err != nil { - u.PErr("%v\n", err) - continue - } - p, err := dht.network.GetConnection(peer.ID(pbp.GetId()), maddr) + + // construct new peer + p, err := dht.ensureConnectedToPeer(pbp) if err != nil { - u.PErr("%v\n", err) continue } + dht.providers.AddProvider(k, p) if ps.AddIfSmallerThan(p, count) { out <- p @@ -244,10 +179,11 @@ func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*PBDHTMessage_PBPeer, ps * // FindProviders searches for peers who can provide the value for given key. func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { ll := startNewRPC("FindProviders") - defer func() { - ll.EndLog() - ll.Print() - }() + ll.EndAndPrint() + + ctx, _ := context.WithTimeout(context.TODO(), timeout) + + // get closest peer u.DOut("Find providers for: '%s'\n", key) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { @@ -255,37 +191,30 @@ func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Pee } for level := 0; level < len(dht.routingTables); { - pmes, err := dht.findProvidersSingle(p, key, level, timeout) + + // attempt retrieving providers + pmes, err := dht.findProvidersSingle(ctx, p, key, level) if err != nil { return nil, err } - if pmes.GetSuccess() { + + // handle providers + provs := pmes.GetProviderPeers() + if provs != nil { u.DOut("Got providers back from findProviders call!\n") - provs := dht.addProviders(key, pmes.GetPeers()) - ll.Success = true - return provs, nil + return dht.addProviders(key, provs), nil } u.DOut("Didnt get providers, just closer peers.\n") - - closer := pmes.GetPeers() + closer := pmes.GetCloserPeers() if len(closer) == 0 { level++ continue } - if peer.ID(closer[0].GetId()).Equal(dht.self.ID) { - u.DOut("Got myself back as a closer peer.") - return nil, u.ErrNotFound - } - maddr, err := ma.NewMultiaddr(closer[0].GetAddr()) - if err != nil { - // ??? Move up route level??? - panic("not yet implemented") - } - np, err := dht.network.GetConnection(peer.ID(closer[0].GetId()), maddr) + np, err := dht.peerFromInfo(closer[0]) if err != nil { - u.PErr("[%s] Failed to connect to: %s\n", dht.self.ID.Pretty(), closer[0].GetAddr()) + u.DOut("no peerFromInfo") level++ continue } @@ -298,12 +227,15 @@ func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Pee // FindPeer searches for a peer with given ID. func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { + ctx, _ := context.WithTimeout(context.TODO(), timeout) + // Check if were already connected to them p, _ := dht.Find(id) if p != nil { return p, nil } + // @whyrusleeping why is this here? doesn't the dht.Find above cover it? routeLevel := 0 p = dht.routingTables[routeLevel].NearestPeer(kb.ConvertPeerID(id)) if p == nil { @@ -314,158 +246,140 @@ func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, err } for routeLevel < len(dht.routingTables) { - pmes, err := dht.findPeerSingle(p, id, timeout, routeLevel) - plist := pmes.GetPeers() + pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) + plist := pmes.GetCloserPeers() if plist == nil || len(plist) == 0 { routeLevel++ continue } found := plist[0] - addr, err := ma.NewMultiaddr(found.GetAddr()) + nxtPeer, err := dht.ensureConnectedToPeer(found) if err != nil { - return nil, err + routeLevel++ + continue } - nxtPeer, err := dht.network.GetConnection(peer.ID(found.GetId()), addr) - if err != nil { - return nil, err - } - if pmes.GetSuccess() { - if !id.Equal(nxtPeer.ID) { - return nil, errors.New("got back invalid peer from 'successful' response") - } + if nxtPeer.ID.Equal(id) { return nxtPeer, nil } + p = nxtPeer } return nil, u.ErrNotFound } func (dht *IpfsDHT) findPeerMultiple(id peer.ID, timeout time.Duration) (*peer.Peer, error) { + ctx, _ := context.WithTimeout(context.TODO(), timeout) + // Check if were already connected to them p, _ := dht.Find(id) if p != nil { return p, nil } + query := &dhtQuery{} + query.peers = queue.NewXORDistancePQ(u.Key(id)) + + // get the peers we need to announce to routeLevel := 0 peers := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { return nil, kb.ErrLookupFailure } + for _, p := range peers { + query.peers.Enqueue(p) + } + + // setup query function + query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { + pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) + if err != nil { + u.DErr("getPeer error: %v\n", err) + return nil, nil, err + } - found := make(chan *peer.Peer) - after := time.After(timeout) + plist := pmes.GetCloserPeers() + if len(plist) == 0 { + routeLevel++ + } - for _, p := range peers { - go func(p *peer.Peer) { - pmes, err := dht.findPeerSingle(p, id, timeout, routeLevel) + nxtprs := make([]*peer.Peer, len(plist)) + for i, fp := range plist { + nxtp, err := dht.peerFromInfo(fp) if err != nil { - u.DErr("getPeer error: %v\n", err) - return - } - plist := pmes.GetPeers() - if len(plist) == 0 { - routeLevel++ + u.DErr("findPeer error: %v\n", err) + continue } - for _, fp := range plist { - nxtp, err := dht.peerFromInfo(fp) - if err != nil { - u.DErr("findPeer error: %v\n", err) - continue - } - if nxtp.ID.Equal(dht.self.ID) { - found <- nxtp - return - } + if nxtp.ID.Equal(id) { + return nxtp, nil, nil } - }(p) + + nxtprs[i] = nxtp + } + + return nil, nxtprs, nil } - select { - case p := <-found: - return p, nil - case <-after: - return nil, u.ErrTimeout + p5, err := query.Run(ctx, query.peers.Len()) + if err != nil { + return nil, err + } + + p6, ok := p5.(*peer.Peer) + if !ok { + return nil, errors.New("received non peer object") } + return p6, nil } // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { + ctx, _ := context.WithTimeout(context.TODO(), timeout) + // Thoughts: maybe this should accept an ID and do a peer lookup? u.DOut("Enter Ping.\n") - pmes := Message{ID: swarm.GenerateMessageID(), Type: PBDHTMessage_PING} - mes := swarm.NewMessage(p, pmes.ToProtobuf()) - - before := time.Now() - responseChan := dht.listener.Listen(pmes.ID, 1, time.Minute) - dht.netChan.Outgoing <- mes - - tout := time.After(timeout) - select { - case <-responseChan: - roundtrip := time.Since(before) - p.SetLatency(roundtrip) - u.DOut("Ping took %s.\n", roundtrip.String()) - return nil - case <-tout: - // Timed out, think about removing peer from network - u.DOut("[%s] Ping peer [%s] timed out.", dht.self.ID.Pretty(), p.ID.Pretty()) - dht.listener.Unlisten(pmes.ID) - return u.ErrTimeout - } + pmes := newMessage(Message_PING, "", 0) + _, err := dht.sendRequest(ctx, p, pmes) + return err } func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) { - u.DOut("Begin Diagnostic") - //Send to N closest peers - targets := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - - // TODO: Add timeout to this struct so nodes know when to return - pmes := Message{ - Type: PBDHTMessage_DIAGNOSTIC, - ID: swarm.GenerateMessageID(), - } + ctx, _ := context.WithTimeout(context.TODO(), timeout) - listenChan := dht.listener.Listen(pmes.ID, len(targets), time.Minute*2) + u.DOut("Begin Diagnostic") + query := &dhtQuery{} + query.peers = queue.NewXORDistancePQ(u.Key(dht.self.ID)) - pbmes := pmes.ToProtobuf() + targets := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) for _, p := range targets { - mes := swarm.NewMessage(p, pbmes) - dht.netChan.Outgoing <- mes + query.peers.Enqueue(p) } var out []*diagInfo - after := time.After(timeout) - for count := len(targets); count > 0; { - select { - case <-after: - u.DOut("Diagnostic request timed out.") - return out, u.ErrTimeout - case resp := <-listenChan: - pmesOut := new(PBDHTMessage) - err := proto.Unmarshal(resp.Data, pmesOut) - if err != nil { - // NOTE: here and elsewhere, need to audit error handling, - // some errors should be continued on from - return out, err - } - dec := json.NewDecoder(bytes.NewBuffer(pmesOut.GetValue())) - for { - di := new(diagInfo) - err := dec.Decode(di) - if err != nil { - break - } + query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { + pmes := newMessage(Message_DIAGNOSTIC, "", 0) + rpmes, err := dht.sendRequest(ctx, p, pmes) + if err != nil { + return nil, nil, err + } - out = append(out, di) + dec := json.NewDecoder(bytes.NewBuffer(rpmes.GetValue())) + for { + di := new(diagInfo) + err := dec.Decode(di) + if err != nil { + break } + + out = append(out, di) } + return nil, nil, nil } - return nil, nil + _, err := query.Run(ctx, query.peers.Len()) + return out, err } From 785a52ff039745e982bd9297a4f84fc40ebd6d3b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 10:30:38 -0700 Subject: [PATCH 0118/3147] tests compile This commit was moved from ipfs/go-ipfs-routing@5525115e58bcd3e1ea0f3b78aea5241121f4a8d8 --- routing/dht/dht_test.go | 81 +++++++--------- routing/dht/ext_test.go | 205 +++++++++++++++++++++------------------- 2 files changed, 145 insertions(+), 141 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f021835e27..70fbb2ba26 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -3,11 +3,16 @@ package dht import ( "testing" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ci "github.com/jbenet/go-ipfs/crypto" spipe "github.com/jbenet/go-ipfs/crypto/spipe" - swarm "github.com/jbenet/go-ipfs/net/swarm" + inet "github.com/jbenet/go-ipfs/net" + mux "github.com/jbenet/go-ipfs/net/mux" + netservice "github.com/jbenet/go-ipfs/net/service" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -16,6 +21,30 @@ import ( "time" ) +func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { + ctx := context.TODO() + + peerstore := peer.NewPeerstore() + + ctx, _ = context.WithCancel(ctx) + dhts := netservice.NewService(nil) // nil handler for now, need to patch it + if err := dhts.Start(ctx); err != nil { + t.Fatal(err) + } + + net, err := inet.NewIpfsNetwork(context.TODO(), p, &mux.ProtocolMap{ + mux.ProtocolID_Routing: dhts, + }) + if err != nil { + t.Fatal(err) + } + + d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) + dhts.Handler = d + d.Start() + return d +} + func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { var addrs []*ma.Multiaddr for i := 0; i < 4; i++ { @@ -46,14 +75,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) var dhts []*IpfsDHT for i := 0; i < 4; i++ { - net := swarm.NewSwarm(peers[i]) - err := net.Listen() - if err != nil { - t.Fatal(err) - } - d := NewDHT(peers[i], net, ds.NewMapDatastore()) - dhts = append(dhts, d) - d.Start() + dhts[i] = setupDHT(t, peers[i]) } return addrs, peers, dhts @@ -91,19 +113,8 @@ func TestPing(t *testing.T) { peerA := makePeer(addrA) peerB := makePeer(addrB) - neta := swarm.NewSwarm(peerA) - err = neta.Listen() - if err != nil { - t.Fatal(err) - } - dhtA := NewDHT(peerA, neta, ds.NewMapDatastore()) - - netb := swarm.NewSwarm(peerB) - err = netb.Listen() - if err != nil { - t.Fatal(err) - } - dhtB := NewDHT(peerB, netb, ds.NewMapDatastore()) + dhtA := setupDHT(t, peerA) + dhtB := setupDHT(t, peerB) dhtA.Start() dhtB.Start() @@ -136,36 +147,14 @@ func TestValueGetSet(t *testing.T) { peerA := makePeer(addrA) peerB := makePeer(addrB) - neta := swarm.NewSwarm(peerA) - err = neta.Listen() - if err != nil { - t.Fatal(err) - } - dhtA := NewDHT(peerA, neta, ds.NewMapDatastore()) - - netb := swarm.NewSwarm(peerB) - err = netb.Listen() - if err != nil { - t.Fatal(err) - } - dhtB := NewDHT(peerB, netb, ds.NewMapDatastore()) + dhtA := setupDHT(t, peerA) + dhtB := setupDHT(t, peerB) dhtA.Start() dhtB.Start() defer dhtA.Halt() defer dhtB.Halt() - errsa := dhtA.network.GetErrChan() - errsb := dhtB.network.GetErrChan() - go func() { - select { - case err := <-errsa: - t.Fatal(err) - case err := <-errsb: - t.Fatal(err) - } - }() - _, err = dhtA.Connect(addrB) if err != nil { t.Fatal(err) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index fe98443adb..64abb96443 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -5,11 +5,13 @@ import ( crand "crypto/rand" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - swarm "github.com/jbenet/go-ipfs/net/swarm" + msg "github.com/jbenet/go-ipfs/net/message" + mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -18,79 +20,84 @@ import ( // fauxNet is a standin for a swarm.Network in order to more easily recreate // different testing scenarios -type fauxNet struct { - Chan *swarm.Chan +type fauxSender struct { handlers []mesHandleFunc - - swarm.Network } -// mesHandleFunc is a function that takes in outgoing messages -// and can respond to them, simulating other peers on the network. -// returning nil will chose not to respond and pass the message onto the -// next registered handler -type mesHandleFunc func(*swarm.Message) *swarm.Message +func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.NetMessage, error) { -func newFauxNet() *fauxNet { - fn := new(fauxNet) - fn.Chan = swarm.NewChan(8) + for _, h := range f.handlers { + reply := h(m) + if reply != nil { + return reply, nil + } + } - return fn + return nil, nil } -// Instead of 'Listening' Start up a goroutine that will check -// all outgoing messages against registered message handlers, -// and reply if needed -func (f *fauxNet) Listen() error { - go func() { - for { - select { - case in := <-f.Chan.Outgoing: - for _, h := range f.handlers { - reply := h(in) - if reply != nil { - f.Chan.Incoming <- reply - break - } - } - } +func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error { + for _, h := range f.handlers { + reply := h(m) + if reply != nil { + return nil } - }() + } return nil } -func (f *fauxNet) AddHandler(fn func(*swarm.Message) *swarm.Message) { - f.handlers = append(f.handlers, fn) +// fauxNet is a standin for a swarm.Network in order to more easily recreate +// different testing scenarios +type fauxNet struct { + handlers []mesHandleFunc } -func (f *fauxNet) Send(mes *swarm.Message) { - f.Chan.Outgoing <- mes +// mesHandleFunc is a function that takes in outgoing messages +// and can respond to them, simulating other peers on the network. +// returning nil will chose not to respond and pass the message onto the +// next registered handler +type mesHandleFunc func(msg.NetMessage) msg.NetMessage + +func (f *fauxNet) AddHandler(fn func(msg.NetMessage) msg.NetMessage) { + f.handlers = append(f.handlers, fn) } -func (f *fauxNet) GetErrChan() chan error { - return f.Chan.Errors +// DialPeer attempts to establish a connection to a given peer +func (f *fauxNet) DialPeer(*peer.Peer) error { + return nil } -func (f *fauxNet) GetChannel(t swarm.PBWrapper_MessageType) *swarm.Chan { - return f.Chan +// ClosePeer connection to peer +func (f *fauxNet) ClosePeer(*peer.Peer) error { + return nil } -func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { - return nil, nil +// IsConnected returns whether a connection to given peer exists. +func (f *fauxNet) IsConnected(*peer.Peer) (bool, error) { + return true, nil } -func (f *fauxNet) GetConnection(id peer.ID, addr *ma.Multiaddr) (*peer.Peer, error) { - return &peer.Peer{ID: id, Addresses: []*ma.Multiaddr{addr}}, nil +// GetProtocols returns the protocols registered in the network. +func (f *fauxNet) GetProtocols() *mux.ProtocolMap { return nil } + +// SendMessage sends given Message out +func (f *fauxNet) SendMessage(msg.NetMessage) error { + return nil } +// Close terminates all network operation +func (f *fauxNet) Close() error { return nil } + func TestGetFailures(t *testing.T) { - fn := newFauxNet() - fn.Listen() + ctx := context.Background() + fn := &fauxNet{} + fs := &fauxSender{} + peerstore := peer.NewPeerstore() local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, fn, ds.NewMapDatastore()) + d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) other := &peer.Peer{ID: peer.ID("other_peer")} @@ -109,20 +116,18 @@ func TestGetFailures(t *testing.T) { } // Reply with failures to every message - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - pmes := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, pmes) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + pmes := new(Message) + err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - Success: false, + resp := &Message{ + Type: pmes.Type, } - return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + m, err := msg.FromObject(mes.Peer(), resp) + return m }) // This one should fail with NotFound @@ -137,27 +142,34 @@ func TestGetFailures(t *testing.T) { success := make(chan struct{}) fn.handlers = nil - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - resp := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, resp) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + resp := new(Message) + err := proto.Unmarshal(mes.Data(), resp) if err != nil { t.Fatal(err) } - if resp.GetSuccess() { - t.Fatal("Get returned success when it shouldnt have.") - } success <- struct{}{} return nil }) // Now we test this DHT's handleGetValue failure + typ := Message_GET_VALUE + str := "hello" req := Message{ - Type: PBDHTMessage_GET_VALUE, - Key: "hello", - ID: swarm.GenerateMessageID(), + Type: &typ, + Key: &str, Value: []byte{0}, } - fn.Chan.Incoming <- swarm.NewMessage(other, req.ToProtobuf()) + + mes, err := msg.FromObject(other, &req) + if err != nil { + t.Error(err) + } + + mes, err = fs.SendRequest(ctx, mes) + if err != nil { + t.Error(err) + } <-success } @@ -172,13 +184,14 @@ func _randPeer() *peer.Peer { } func TestNotFound(t *testing.T) { - fn := newFauxNet() - fn.Listen() + fn := &fauxNet{} + fs := &fauxSender{} local := new(peer.Peer) local.ID = peer.ID("test_peer") + peerstore := peer.NewPeerstore() - d := NewDHT(local, fn, ds.NewMapDatastore()) + d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) d.Start() var ps []*peer.Peer @@ -188,26 +201,27 @@ func TestNotFound(t *testing.T) { } // Reply with random peers to every message - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - pmes := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, pmes) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + pmes := new(Message) + err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } switch pmes.GetType() { - case PBDHTMessage_GET_VALUE: - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - Success: false, - } + case Message_GET_VALUE: + resp := &Message{Type: pmes.Type} + peers := []*peer.Peer{} for i := 0; i < 7; i++ { - resp.Peers = append(resp.Peers, _randPeer()) + peers = append(peers, _randPeer()) + } + resp.CloserPeers = peersToPBPeers(peers) + mes, err := msg.FromObject(mes.Peer(), resp) + if err != nil { + t.Error(err) } - return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + return mes default: panic("Shouldnt recieve this.") } @@ -233,13 +247,13 @@ func TestNotFound(t *testing.T) { // a GET rpc and nobody has the value func TestLessThanKResponses(t *testing.T) { u.Debug = false - fn := newFauxNet() - fn.Listen() - + fn := &fauxNet{} + fs := &fauxSender{} + peerstore := peer.NewPeerstore() local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, fn, ds.NewMapDatastore()) + d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) d.Start() var ps []*peer.Peer @@ -250,24 +264,25 @@ func TestLessThanKResponses(t *testing.T) { other := _randPeer() // Reply with random peers to every message - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - pmes := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, pmes) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + pmes := new(Message) + err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } switch pmes.GetType() { - case PBDHTMessage_GET_VALUE: - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - Success: false, - Peers: []*peer.Peer{other}, + case Message_GET_VALUE: + resp := &Message{ + Type: pmes.Type, + CloserPeers: peersToPBPeers([]*peer.Peer{other}), } - return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + mes, err := msg.FromObject(mes.Peer(), resp) + if err != nil { + t.Error(err) + } + return mes default: panic("Shouldnt recieve this.") } From f960c8fd8e20d6fabc80695f7ae66b8c3b845940 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 17 Sep 2014 13:51:52 -0700 Subject: [PATCH 0119/3147] fix(routing/dht) match the routing interface the channel's "spin" is specified in the interface now =) This commit was moved from ipfs/go-ipfs-routing@4e20cc595082c961aa189a3ee72302b3f199db0d --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index bee640e8f4..06fe39bcb9 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -123,7 +123,7 @@ func (dht *IpfsDHT) Provide(key u.Key) error { } // FindProvidersAsync runs FindProviders and sends back results over a channel -func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Duration) chan *peer.Peer { +func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Duration) <-chan *peer.Peer { ctx, _ := context.WithTimeout(context.TODO(), timeout) peerOut := make(chan *peer.Peer, count) From 236e065d25543a433d5cac517cb1afbe65e68f69 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 18 Sep 2014 19:30:04 -0700 Subject: [PATCH 0120/3147] better query processing (runner) This commit was moved from ipfs/go-ipfs-routing@b52d14c01e89ad7081da8d17fa3f867dc879196f --- routing/dht/dht.go | 24 +++-- routing/dht/ext_test.go | 82 +++++++------- routing/dht/handlers.go | 16 ++- routing/dht/query.go | 231 +++++++++++++++++++++++++++++++--------- routing/dht/routing.go | 108 ++++++++----------- 5 files changed, 291 insertions(+), 170 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d3f0757622..13311f6143 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -177,6 +177,9 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message if err != nil { return nil, err } + if rmes == nil { + return nil, errors.New("no response to request") + } rtt := time.Since(start) rmes.Peer().SetLatency(rtt) @@ -218,19 +221,22 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, return nil, nil, err } + u.POut("pmes.GetValue() %v\n", pmes.GetValue()) if value := pmes.GetValue(); value != nil { // Success! We were given the value + u.POut("getValueOrPeers: got value\n") return value, nil, nil } // TODO decide on providers. This probably shouldn't be happening. - // if prv := pmes.GetProviderPeers(); prv != nil && len(prv) > 0 { - // val, err := dht.getFromPeerList(key, timeout,, level) - // if err != nil { - // return nil, nil, err - // } - // return val, nil, nil - // } + if prv := pmes.GetProviderPeers(); prv != nil && len(prv) > 0 { + val, err := dht.getFromPeerList(ctx, key, prv, level) + if err != nil { + return nil, nil, err + } + u.POut("getValueOrPeers: get from providers\n") + return val, nil, nil + } // Perhaps we were given closer peers var peers []*peer.Peer @@ -256,10 +262,12 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, } if len(peers) > 0 { + u.POut("getValueOrPeers: peers\n") return nil, peers, nil } - return nil, nil, errors.New("NotFound. did not get value or closer peers.") + u.POut("getValueOrPeers: u.ErrNotFound\n") + return nil, nil, u.ErrNotFound } // getValueSingle simply performs the get value RPC with the given parameters diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 64abb96443..47eb6429a2 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -18,14 +18,23 @@ import ( "time" ) +// mesHandleFunc is a function that takes in outgoing messages +// and can respond to them, simulating other peers on the network. +// returning nil will chose not to respond and pass the message onto the +// next registered handler +type mesHandleFunc func(msg.NetMessage) msg.NetMessage + // fauxNet is a standin for a swarm.Network in order to more easily recreate // different testing scenarios type fauxSender struct { handlers []mesHandleFunc } -func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.NetMessage, error) { +func (f *fauxSender) AddHandler(fn func(msg.NetMessage) msg.NetMessage) { + f.handlers = append(f.handlers, fn) +} +func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.NetMessage, error) { for _, h := range f.handlers { reply := h(m) if reply != nil { @@ -33,7 +42,12 @@ func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.Net } } - return nil, nil + // no reply? ok force a timeout + select { + case <-ctx.Done(): + } + + return nil, ctx.Err() } func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error { @@ -49,17 +63,6 @@ func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error { // fauxNet is a standin for a swarm.Network in order to more easily recreate // different testing scenarios type fauxNet struct { - handlers []mesHandleFunc -} - -// mesHandleFunc is a function that takes in outgoing messages -// and can respond to them, simulating other peers on the network. -// returning nil will chose not to respond and pass the message onto the -// next registered handler -type mesHandleFunc func(msg.NetMessage) msg.NetMessage - -func (f *fauxNet) AddHandler(fn func(msg.NetMessage) msg.NetMessage) { - f.handlers = append(f.handlers, fn) } // DialPeer attempts to establish a connection to a given peer @@ -98,25 +101,23 @@ func TestGetFailures(t *testing.T) { local.ID = peer.ID("test_peer") d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) - other := &peer.Peer{ID: peer.ID("other_peer")} - - d.Start() - d.Update(other) // This one should time out + // u.POut("Timout Test\n") _, err := d.GetValue(u.Key("test"), time.Millisecond*10) if err != nil { - if err != u.ErrTimeout { - t.Fatal("Got different error than we expected.") + if err != context.DeadlineExceeded { + t.Fatal("Got different error than we expected", err) } } else { t.Fatal("Did not get expected error!") } + // u.POut("NotFound Test\n") // Reply with failures to every message - fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { pmes := new(Message) err := proto.Unmarshal(mes.Data(), pmes) if err != nil { @@ -140,18 +141,7 @@ func TestGetFailures(t *testing.T) { t.Fatal("expected error, got none.") } - success := make(chan struct{}) - fn.handlers = nil - fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { - resp := new(Message) - err := proto.Unmarshal(mes.Data(), resp) - if err != nil { - t.Fatal(err) - } - success <- struct{}{} - return nil - }) - + fs.handlers = nil // Now we test this DHT's handleGetValue failure typ := Message_GET_VALUE str := "hello" @@ -161,17 +151,32 @@ func TestGetFailures(t *testing.T) { Value: []byte{0}, } + // u.POut("handleGetValue Test\n") mes, err := msg.FromObject(other, &req) if err != nil { t.Error(err) } - mes, err = fs.SendRequest(ctx, mes) + mes, err = d.HandleMessage(ctx, mes) if err != nil { t.Error(err) } - <-success + pmes := new(Message) + err = proto.Unmarshal(mes.Data(), pmes) + if err != nil { + t.Fatal(err) + } + if pmes.GetValue() != nil { + t.Fatal("shouldnt have value") + } + if pmes.GetCloserPeers() != nil { + t.Fatal("shouldnt have closer peers") + } + if pmes.GetProviderPeers() != nil { + t.Fatal("shouldnt have provider peers") + } + } // TODO: Maybe put these in some sort of "ipfs_testutil" package @@ -192,7 +197,6 @@ func TestNotFound(t *testing.T) { peerstore := peer.NewPeerstore() d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) - d.Start() var ps []*peer.Peer for i := 0; i < 5; i++ { @@ -201,7 +205,7 @@ func TestNotFound(t *testing.T) { } // Reply with random peers to every message - fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { pmes := new(Message) err := proto.Unmarshal(mes.Data(), pmes) if err != nil { @@ -228,7 +232,8 @@ func TestNotFound(t *testing.T) { }) - _, err := d.GetValue(u.Key("hello"), time.Second*30) + v, err := d.GetValue(u.Key("hello"), time.Second*5) + u.POut("get value got %v\n", v) if err != nil { switch err { case u.ErrNotFound: @@ -254,7 +259,6 @@ func TestLessThanKResponses(t *testing.T) { local.ID = peer.ID("test_peer") d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) - d.Start() var ps []*peer.Peer for i := 0; i < 5; i++ { @@ -264,7 +268,7 @@ func TestLessThanKResponses(t *testing.T) { other := _randPeer() // Reply with random peers to every message - fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { pmes := new(Message) err := proto.Unmarshal(mes.Data(), pmes) if err != nil { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 71e5eb0377..ddf76a6697 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -58,7 +58,10 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error return nil, err } - // if we have the value, respond with it! + // Note: changed the behavior here to return _as much_ info as possible + // (potentially all of {value, closer peers, provider}) + + // if we have the value, send it back if err == nil { u.DOut("handleGetValue success!\n") @@ -68,7 +71,6 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } resp.Value = byts - return resp, nil } // if we know any providers for the requested value, return those. @@ -76,20 +78,16 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error if len(provs) > 0 { u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) resp.ProviderPeers = peersToPBPeers(provs) - return resp, nil } // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeerToQuery(pmes) - if closer == nil { - u.DOut("handleGetValue could not find a closer node than myself.\n") - resp.CloserPeers = nil + if closer != nil { + u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) + resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) return resp, nil } - // we got a closer peer, it seems. return it. - u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) - resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) return resp, nil } diff --git a/routing/dht/query.go b/routing/dht/query.go index efedfcd8a3..ecdc4c62c8 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -1,19 +1,45 @@ package dht import ( + "sync" + peer "github.com/jbenet/go-ipfs/peer" queue "github.com/jbenet/go-ipfs/peer/queue" + kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" + todoctr "github.com/jbenet/go-ipfs/util/todocounter" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) +const maxQueryConcurrency = 5 + type dhtQuery struct { - // a PeerQueue - peers queue.PeerQueue + // the key we're querying for + key u.Key // the function to execute per peer qfunc queryFunc + + // the concurrency parameter + concurrency int +} + +type dhtQueryResult struct { + value []byte // GetValue + peer *peer.Peer // FindPeer + providerPeers []*peer.Peer // GetProviders + closerPeers []*peer.Peer // * + success bool +} + +// constructs query +func newQuery(k u.Key, f queryFunc) *dhtQuery { + return &dhtQuery{ + key: k, + qfunc: f, + concurrency: maxQueryConcurrency, + } } // QueryFunc is a function that runs a particular query with a given peer. @@ -21,65 +47,170 @@ type dhtQuery struct { // - the value // - a list of peers potentially better able to serve the query // - an error -type queryFunc func(context.Context, *peer.Peer) (interface{}, []*peer.Peer, error) +type queryFunc func(context.Context, *peer.Peer) (*dhtQueryResult, error) + +// Run runs the query at hand. pass in a list of peers to use first. +func (q *dhtQuery) Run(ctx context.Context, peers []*peer.Peer) (*dhtQueryResult, error) { + runner := newQueryRunner(ctx, q) + return runner.Run(peers) +} + +type dhtQueryRunner struct { + + // the query to run + query *dhtQuery + + // peersToQuery is a list of peers remaining to query + peersToQuery *queue.ChanQueue + + // peersSeen are all the peers queried. used to prevent querying same peer 2x + peersSeen peer.Map -func (q *dhtQuery) Run(ctx context.Context, concurrency int) (interface{}, error) { - // get own cancel function to signal when we've found the value + // rateLimit is a channel used to rate limit our processing (semaphore) + rateLimit chan struct{} + + // peersRemaining is a counter of peers remaining (toQuery + processing) + peersRemaining todoctr.Counter + + // context + ctx context.Context + cancel context.CancelFunc + + // result + result *dhtQueryResult + + // result errors + errs []error + + // lock for concurrent access to fields + sync.RWMutex +} + +func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { ctx, cancel := context.WithCancel(ctx) - // the variable waiting to be populated upon success - var result interface{} - - // chanQueue is how workers receive their work - chanQueue := queue.NewChanQueue(ctx, q.peers) - - // worker - worker := func() { - for { - select { - case p := <-chanQueue.DeqChan: - - val, closer, err := q.qfunc(ctx, p) - if err != nil { - u.PErr("error running query: %v\n", err) - continue - } - - if val != nil { - result = val - cancel() // signal we're done. - return - } - - if closer != nil { - for _, p := range closer { - select { - case chanQueue.EnqChan <- p: - case <-ctx.Done(): - return - } - } - } - - case <-ctx.Done(): - return - } - } + return &dhtQueryRunner{ + ctx: ctx, + cancel: cancel, + query: q, + peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(q.key)), + peersRemaining: todoctr.NewSyncCounter(), + peersSeen: peer.Map{}, + rateLimit: make(chan struct{}, q.concurrency), + } +} + +func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { + // setup concurrency rate limiting + for i := 0; i < r.query.concurrency; i++ { + r.rateLimit <- struct{}{} } - // launch all workers - for i := 0; i < concurrency; i++ { - go worker() + // add all the peers we got first. + for _, p := range peers { + r.addPeerToQuery(p, nil) // don't have access to self here... } // wait until we're done. yep. select { - case <-ctx.Done(): + case <-r.peersRemaining.Done(): + r.cancel() // ran all and nothing. cancel all outstanding workers. + + r.RLock() + defer r.RUnlock() + + if len(r.errs) > 0 { + return nil, r.errs[0] + } + return nil, u.ErrNotFound + + case <-r.ctx.Done(): + r.RLock() + defer r.RUnlock() + + if r.result != nil && r.result.success { + return r.result, nil + } + return nil, r.ctx.Err() + } + +} + +func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { + if next == nil { + // wtf why are peers nil?!? + u.PErr("Query getting nil peers!!!\n") + return + } + + // if new peer further away than whom we got it from, bother (loops) + if benchmark != nil && kb.Closer(benchmark.ID, next.ID, r.query.key) { + return + } + + // if already seen, no need. + r.Lock() + _, found := r.peersSeen[next.Key()] + if found { + r.Unlock() + return + } + r.peersSeen[next.Key()] = next + r.Unlock() + + // do this after unlocking to prevent possible deadlocks. + r.peersRemaining.Increment(1) + select { + case r.peersToQuery.EnqChan <- next: + case <-r.ctx.Done(): } +} + +func (r *dhtQueryRunner) spawnWorkers(p *peer.Peer) { + for { + select { + case <-r.peersRemaining.Done(): + return + + case <-r.ctx.Done(): + return + + case p := <-r.peersToQuery.DeqChan: + go r.queryPeer(p) + } + } +} - if result != nil { - return result, nil +func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { + // make sure we rate limit concurrency. + select { + case <-r.rateLimit: + case <-r.ctx.Done(): + r.peersRemaining.Decrement(1) + return + } + + // finally, run the query against this peer + res, err := r.query.qfunc(r.ctx, p) + + if err != nil { + r.Lock() + r.errs = append(r.errs, err) + r.Unlock() + + } else if res.success { + r.Lock() + r.result = res + r.Unlock() + r.cancel() // signal to everyone that we're done. + + } else if res.closerPeers != nil { + for _, next := range res.closerPeers { + r.addPeerToQuery(next, p) + } } - return nil, ctx.Err() + // signal we're done proccessing peer p + r.peersRemaining.Decrement(1) + r.rateLimit <- struct{}{} } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 06fe39bcb9..2410dcd3a0 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,14 +3,11 @@ package dht import ( "bytes" "encoding/json" - "errors" - "fmt" "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" peer "github.com/jbenet/go-ipfs/peer" - queue "github.com/jbenet/go-ipfs/peer/queue" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" ) @@ -24,28 +21,23 @@ import ( func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { ctx := context.TODO() - query := &dhtQuery{} - query.peers = queue.NewXORDistancePQ(key) + peers := []*peer.Peer{} // get the peers we need to announce to for _, route := range dht.routingTables { - peers := route.NearestPeers(kb.ConvertKey(key), KValue) - for _, p := range peers { - if p == nil { - // this shouldn't be happening. - panic("p should not be nil") - } - - query.peers.Enqueue(p) - } + npeers := route.NearestPeers(kb.ConvertKey(key), KValue) + peers = append(peers, npeers...) } - query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { - dht.putValueToNetwork(ctx, p, string(key), value) - return nil, nil, nil - } + query := newQuery(key, func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { + err := dht.putValueToNetwork(ctx, p, string(key), value) + if err != nil { + return nil, err + } + return &dhtQueryResult{success: true}, nil + }) - _, err := query.Run(ctx, query.peers.Len()) + _, err := query.Run(ctx, peers) return err } @@ -63,7 +55,6 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { val, err := dht.getLocal(key) if err == nil { ll.Success = true - u.DOut("Found local, returning.\n") return val, nil } @@ -74,30 +65,33 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { return nil, kb.ErrLookupFailure } - query := &dhtQuery{} - query.peers = queue.NewXORDistancePQ(key) + // setup the Query + query := newQuery(key, func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { - // get the peers we need to announce to - for _, p := range closest { - query.peers.Enqueue(p) - } + val, peers, err := dht.getValueOrPeers(ctx, p, key, routeLevel) + if err != nil { + return nil, err + } - // setup the Query Function - query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { - return dht.getValueOrPeers(ctx, p, key, routeLevel) - } + res := &dhtQueryResult{value: val, closerPeers: peers} + if val != nil { + res.success = true + } + + return res, nil + }) // run it! - result, err := query.Run(ctx, query.peers.Len()) + result, err := query.Run(ctx, closest) if err != nil { return nil, err } - byt, ok := result.([]byte) - if !ok { - return nil, fmt.Errorf("received non-byte slice value") + if result.value == nil { + return nil, u.ErrNotFound } - return byt, nil + + return result.value, nil } // Value provider layer of indirection. @@ -278,25 +272,19 @@ func (dht *IpfsDHT) findPeerMultiple(id peer.ID, timeout time.Duration) (*peer.P return p, nil } - query := &dhtQuery{} - query.peers = queue.NewXORDistancePQ(u.Key(id)) - // get the peers we need to announce to routeLevel := 0 peers := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { return nil, kb.ErrLookupFailure } - for _, p := range peers { - query.peers.Enqueue(p) - } // setup query function - query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { + query := newQuery(u.Key(id), func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) if err != nil { u.DErr("getPeer error: %v\n", err) - return nil, nil, err + return nil, err } plist := pmes.GetCloserPeers() @@ -313,25 +301,24 @@ func (dht *IpfsDHT) findPeerMultiple(id peer.ID, timeout time.Duration) (*peer.P } if nxtp.ID.Equal(id) { - return nxtp, nil, nil + return &dhtQueryResult{peer: nxtp, success: true}, nil } nxtprs[i] = nxtp } - return nil, nxtprs, nil - } + return &dhtQueryResult{closerPeers: nxtprs}, nil + }) - p5, err := query.Run(ctx, query.peers.Len()) + result, err := query.Run(ctx, peers) if err != nil { return nil, err } - p6, ok := p5.(*peer.Peer) - if !ok { - return nil, errors.New("received non peer object") + if result.peer == nil { + return nil, u.ErrNotFound } - return p6, nil + return result.peer, nil } // Ping a peer, log the time it took @@ -350,21 +337,14 @@ func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) { ctx, _ := context.WithTimeout(context.TODO(), timeout) u.DOut("Begin Diagnostic") - query := &dhtQuery{} - query.peers = queue.NewXORDistancePQ(u.Key(dht.self.ID)) - - targets := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - for _, p := range targets { - query.peers.Enqueue(p) - } - + peers := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) var out []*diagInfo - query.qfunc = func(ctx context.Context, p *peer.Peer) (interface{}, []*peer.Peer, error) { + query := newQuery(dht.self.Key(), func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { pmes := newMessage(Message_DIAGNOSTIC, "", 0) rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { - return nil, nil, err + return nil, err } dec := json.NewDecoder(bytes.NewBuffer(rpmes.GetValue())) @@ -377,9 +357,9 @@ func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) { out = append(out, di) } - return nil, nil, nil - } + return &dhtQueryResult{success: true}, nil + }) - _, err := query.Run(ctx, query.peers.Len()) + _, err := query.Run(ctx, peers) return out, err } From bd8b1c54eaa1ea9b1d490da5094884b43490abf7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 18 Sep 2014 19:41:41 -0700 Subject: [PATCH 0121/3147] added some logging This commit was moved from ipfs/go-ipfs-routing@80b92f566f6e15a5c9908140de4b591548c52d2e --- routing/dht/query.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index ecdc4c62c8..4002596359 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -111,7 +111,12 @@ func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { r.addPeerToQuery(p, nil) // don't have access to self here... } - // wait until we're done. yep. + // go do this thing. + go r.spawnWorkers() + + // so workers are working. + + // wait until they're done. select { case <-r.peersRemaining.Done(): r.cancel() // ran all and nothing. cancel all outstanding workers. @@ -158,6 +163,8 @@ func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { r.peersSeen[next.Key()] = next r.Unlock() + u.POut("adding peer to query: %v\n", next.ID.Pretty()) + // do this after unlocking to prevent possible deadlocks. r.peersRemaining.Increment(1) select { @@ -166,8 +173,9 @@ func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { } } -func (r *dhtQueryRunner) spawnWorkers(p *peer.Peer) { +func (r *dhtQueryRunner) spawnWorkers() { for { + select { case <-r.peersRemaining.Done(): return @@ -175,13 +183,19 @@ func (r *dhtQueryRunner) spawnWorkers(p *peer.Peer) { case <-r.ctx.Done(): return - case p := <-r.peersToQuery.DeqChan: + case p, more := <-r.peersToQuery.DeqChan: + if !more { + return // channel closed. + } + u.POut("spawning worker for: %v\n", p.ID.Pretty()) go r.queryPeer(p) } } } func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { + u.POut("spawned worker for: %v\n", p.ID.Pretty()) + // make sure we rate limit concurrency. select { case <-r.rateLimit: @@ -190,27 +204,33 @@ func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { return } + u.POut("running worker for: %v\n", p.ID.Pretty()) + // finally, run the query against this peer res, err := r.query.qfunc(r.ctx, p) if err != nil { + u.POut("ERROR worker for: %v %v\n", p.ID.Pretty(), err) r.Lock() r.errs = append(r.errs, err) r.Unlock() } else if res.success { + u.POut("SUCCESS worker for: %v\n", p.ID.Pretty(), res) r.Lock() r.result = res r.Unlock() r.cancel() // signal to everyone that we're done. } else if res.closerPeers != nil { + u.POut("PEERS CLOSER -- worker for: %v\n", p.ID.Pretty()) for _, next := range res.closerPeers { r.addPeerToQuery(next, p) } } // signal we're done proccessing peer p + u.POut("completing worker for: %v\n", p.ID.Pretty()) r.peersRemaining.Decrement(1) r.rateLimit <- struct{}{} } From a0e2d3c0cbdbf1ed644dcaa9ec07106d941f8aa1 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 18 Sep 2014 20:38:24 -0700 Subject: [PATCH 0122/3147] remove start This commit was moved from ipfs/go-ipfs-routing@a2b7b62ad72fd2bf8298c2d1672428357bf34bca --- routing/dht/dht.go | 9 --------- routing/dht/dht_test.go | 5 ----- routing/dht/handlers.go | 2 -- 3 files changed, 16 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 13311f6143..d1b610c5ee 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -45,9 +45,6 @@ type IpfsDHT struct { providers *ProviderManager - // Signal to shutdown dht - shutdown chan struct{} - // When this peer started up birth time.Time @@ -65,7 +62,6 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende dht.peerstore = ps dht.providers = NewProviderManager(p.ID) - dht.shutdown = make(chan struct{}) dht.routingTables = make([]*kb.RoutingTable, 3) dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) @@ -75,11 +71,6 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende return dht } -// Start up background goroutines needed by the DHT -func (dht *IpfsDHT) Start() { - panic("the service is already started. rmv this method") -} - // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { maddrstr, _ := addr.String() diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 70fbb2ba26..2ed9174018 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -41,7 +41,6 @@ func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) dhts.Handler = d - d.Start() return d } @@ -116,8 +115,6 @@ func TestPing(t *testing.T) { dhtA := setupDHT(t, peerA) dhtB := setupDHT(t, peerB) - dhtA.Start() - dhtB.Start() defer dhtA.Halt() defer dhtB.Halt() @@ -150,8 +147,6 @@ func TestValueGetSet(t *testing.T) { dhtA := setupDHT(t, peerA) dhtB := setupDHT(t, peerB) - dhtA.Start() - dhtB.Start() defer dhtA.Halt() defer dhtB.Halt() diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index ddf76a6697..a12a2f3d44 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -180,8 +180,6 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, er // Halt stops all communications from this peer and shut down // TODO -- remove this in favor of context func (dht *IpfsDHT) Halt() { - dht.shutdown <- struct{}{} - dht.network.Close() dht.providers.Halt() } From 1eee20dc8060ed316cddcbc92997877a826cdab3 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 18 Sep 2014 20:58:26 -0700 Subject: [PATCH 0123/3147] comment out dht_test for now. This commit was moved from ipfs/go-ipfs-routing@74e08a362572e64fd5a4cb9f394a5bd6ef928595 --- routing/dht/dht_test.go | 610 ++++++++++++++++++++-------------------- 1 file changed, 305 insertions(+), 305 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2ed9174018..768aa47670 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -1,307 +1,307 @@ package dht -import ( - "testing" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - - ci "github.com/jbenet/go-ipfs/crypto" - spipe "github.com/jbenet/go-ipfs/crypto/spipe" - inet "github.com/jbenet/go-ipfs/net" - mux "github.com/jbenet/go-ipfs/net/mux" - netservice "github.com/jbenet/go-ipfs/net/service" - peer "github.com/jbenet/go-ipfs/peer" - u "github.com/jbenet/go-ipfs/util" - - "bytes" - "fmt" - "time" -) - -func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { - ctx := context.TODO() - - peerstore := peer.NewPeerstore() - - ctx, _ = context.WithCancel(ctx) - dhts := netservice.NewService(nil) // nil handler for now, need to patch it - if err := dhts.Start(ctx); err != nil { - t.Fatal(err) - } - - net, err := inet.NewIpfsNetwork(context.TODO(), p, &mux.ProtocolMap{ - mux.ProtocolID_Routing: dhts, - }) - if err != nil { - t.Fatal(err) - } - - d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) - dhts.Handler = d - return d -} - -func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { - var addrs []*ma.Multiaddr - for i := 0; i < 4; i++ { - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) - if err != nil { - t.Fatal(err) - } - addrs = append(addrs, a) - } - - var peers []*peer.Peer - for i := 0; i < 4; i++ { - p := new(peer.Peer) - p.AddAddress(addrs[i]) - sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) - if err != nil { - panic(err) - } - p.PubKey = pk - p.PrivKey = sk - id, err := spipe.IDFromPubKey(pk) - if err != nil { - panic(err) - } - p.ID = id - peers = append(peers, p) - } - - var dhts []*IpfsDHT - for i := 0; i < 4; i++ { - dhts[i] = setupDHT(t, peers[i]) - } - - return addrs, peers, dhts -} - -func makePeer(addr *ma.Multiaddr) *peer.Peer { - p := new(peer.Peer) - p.AddAddress(addr) - sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) - if err != nil { - panic(err) - } - p.PrivKey = sk - p.PubKey = pk - id, err := spipe.IDFromPubKey(pk) - if err != nil { - panic(err) - } - - p.ID = id - return p -} - -func TestPing(t *testing.T) { - u.Debug = true - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") - if err != nil { - t.Fatal(err) - } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") - if err != nil { - t.Fatal(err) - } - - peerA := makePeer(addrA) - peerB := makePeer(addrB) - - dhtA := setupDHT(t, peerA) - dhtB := setupDHT(t, peerB) - - defer dhtA.Halt() - defer dhtB.Halt() - - _, err = dhtA.Connect(addrB) - if err != nil { - t.Fatal(err) - } - - //Test that we can ping the node - err = dhtA.Ping(peerB, time.Second*2) - if err != nil { - t.Fatal(err) - } -} - -func TestValueGetSet(t *testing.T) { - u.Debug = false - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") - if err != nil { - t.Fatal(err) - } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") - if err != nil { - t.Fatal(err) - } - - peerA := makePeer(addrA) - peerB := makePeer(addrB) - - dhtA := setupDHT(t, peerA) - dhtB := setupDHT(t, peerB) - - defer dhtA.Halt() - defer dhtB.Halt() - - _, err = dhtA.Connect(addrB) - if err != nil { - t.Fatal(err) - } - - dhtA.PutValue("hello", []byte("world")) - - val, err := dhtA.GetValue("hello", time.Second*2) - if err != nil { - t.Fatal(err) - } - - if string(val) != "world" { - t.Fatalf("Expected 'world' got '%s'", string(val)) - } - -} - -func TestProvides(t *testing.T) { - u.Debug = false - - addrs, _, dhts := setupDHTS(4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Halt() - } - }() - - _, err := dhts[0].Connect(addrs[1]) - if err != nil { - t.Fatal(err) - } - - _, err = dhts[1].Connect(addrs[2]) - if err != nil { - t.Fatal(err) - } - - _, err = dhts[1].Connect(addrs[3]) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].putLocal(u.Key("hello"), []byte("world")) - if err != nil { - t.Fatal(err) - } - - bits, err := dhts[3].getLocal(u.Key("hello")) - if err != nil && bytes.Equal(bits, []byte("world")) { - t.Fatal(err) - } - - err = dhts[3].Provide(u.Key("hello")) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 60) - - provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) - if err != nil { - t.Fatal(err) - } - - if len(provs) != 1 { - t.Fatal("Didnt get back providers") - } -} - -func TestLayeredGet(t *testing.T) { - u.Debug = false - addrs, _, dhts := setupDHTS(4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Halt() - } - }() - - _, err := dhts[0].Connect(addrs[1]) - if err != nil { - t.Fatalf("Failed to connect: %s", err) - } - - _, err = dhts[1].Connect(addrs[2]) - if err != nil { - t.Fatal(err) - } - - _, err = dhts[1].Connect(addrs[3]) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].putLocal(u.Key("hello"), []byte("world")) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].Provide(u.Key("hello")) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 60) - - val, err := dhts[0].GetValue(u.Key("hello"), time.Second) - if err != nil { - t.Fatal(err) - } - - if string(val) != "world" { - t.Fatal("Got incorrect value.") - } - -} - -func TestFindPeer(t *testing.T) { - u.Debug = false - - addrs, peers, dhts := setupDHTS(4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Halt() - } - }() - - _, err := dhts[0].Connect(addrs[1]) - if err != nil { - t.Fatal(err) - } - - _, err = dhts[1].Connect(addrs[2]) - if err != nil { - t.Fatal(err) - } - - _, err = dhts[1].Connect(addrs[3]) - if err != nil { - t.Fatal(err) - } - - p, err := dhts[0].FindPeer(peers[2].ID, time.Second) - if err != nil { - t.Fatal(err) - } - - if p == nil { - t.Fatal("Failed to find peer.") - } - - if !p.ID.Equal(peers[2].ID) { - t.Fatal("Didnt find expected peer.") - } -} +// import ( +// "testing" +// +// context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +// +// ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" +// ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +// +// ci "github.com/jbenet/go-ipfs/crypto" +// spipe "github.com/jbenet/go-ipfs/crypto/spipe" +// inet "github.com/jbenet/go-ipfs/net" +// mux "github.com/jbenet/go-ipfs/net/mux" +// netservice "github.com/jbenet/go-ipfs/net/service" +// peer "github.com/jbenet/go-ipfs/peer" +// u "github.com/jbenet/go-ipfs/util" +// +// "bytes" +// "fmt" +// "time" +// ) +// +// func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { +// ctx := context.TODO() +// +// peerstore := peer.NewPeerstore() +// +// ctx, _ = context.WithCancel(ctx) +// dhts := netservice.NewService(nil) // nil handler for now, need to patch it +// if err := dhts.Start(ctx); err != nil { +// t.Fatal(err) +// } +// +// net, err := inet.NewIpfsNetwork(context.TODO(), p, &mux.ProtocolMap{ +// mux.ProtocolID_Routing: dhts, +// }) +// if err != nil { +// t.Fatal(err) +// } +// +// d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) +// dhts.Handler = d +// return d +// } +// +// func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { +// var addrs []*ma.Multiaddr +// for i := 0; i < 4; i++ { +// a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) +// if err != nil { +// t.Fatal(err) +// } +// addrs = append(addrs, a) +// } +// +// var peers []*peer.Peer +// for i := 0; i < 4; i++ { +// p := new(peer.Peer) +// p.AddAddress(addrs[i]) +// sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) +// if err != nil { +// panic(err) +// } +// p.PubKey = pk +// p.PrivKey = sk +// id, err := spipe.IDFromPubKey(pk) +// if err != nil { +// panic(err) +// } +// p.ID = id +// peers = append(peers, p) +// } +// +// var dhts []*IpfsDHT +// for i := 0; i < 4; i++ { +// dhts[i] = setupDHT(t, peers[i]) +// } +// +// return addrs, peers, dhts +// } +// +// func makePeer(addr *ma.Multiaddr) *peer.Peer { +// p := new(peer.Peer) +// p.AddAddress(addr) +// sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) +// if err != nil { +// panic(err) +// } +// p.PrivKey = sk +// p.PubKey = pk +// id, err := spipe.IDFromPubKey(pk) +// if err != nil { +// panic(err) +// } +// +// p.ID = id +// return p +// } +// +// func TestPing(t *testing.T) { +// u.Debug = true +// addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") +// if err != nil { +// t.Fatal(err) +// } +// addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") +// if err != nil { +// t.Fatal(err) +// } +// +// peerA := makePeer(addrA) +// peerB := makePeer(addrB) +// +// dhtA := setupDHT(t, peerA) +// dhtB := setupDHT(t, peerB) +// +// defer dhtA.Halt() +// defer dhtB.Halt() +// +// _, err = dhtA.Connect(addrB) +// if err != nil { +// t.Fatal(err) +// } +// +// //Test that we can ping the node +// err = dhtA.Ping(peerB, time.Second*2) +// if err != nil { +// t.Fatal(err) +// } +// } +// +// func TestValueGetSet(t *testing.T) { +// u.Debug = false +// addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") +// if err != nil { +// t.Fatal(err) +// } +// addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") +// if err != nil { +// t.Fatal(err) +// } +// +// peerA := makePeer(addrA) +// peerB := makePeer(addrB) +// +// dhtA := setupDHT(t, peerA) +// dhtB := setupDHT(t, peerB) +// +// defer dhtA.Halt() +// defer dhtB.Halt() +// +// _, err = dhtA.Connect(addrB) +// if err != nil { +// t.Fatal(err) +// } +// +// dhtA.PutValue("hello", []byte("world")) +// +// val, err := dhtA.GetValue("hello", time.Second*2) +// if err != nil { +// t.Fatal(err) +// } +// +// if string(val) != "world" { +// t.Fatalf("Expected 'world' got '%s'", string(val)) +// } +// +// } +// +// func TestProvides(t *testing.T) { +// u.Debug = false +// +// addrs, _, dhts := setupDHTS(4, t) +// defer func() { +// for i := 0; i < 4; i++ { +// dhts[i].Halt() +// } +// }() +// +// _, err := dhts[0].Connect(addrs[1]) +// if err != nil { +// t.Fatal(err) +// } +// +// _, err = dhts[1].Connect(addrs[2]) +// if err != nil { +// t.Fatal(err) +// } +// +// _, err = dhts[1].Connect(addrs[3]) +// if err != nil { +// t.Fatal(err) +// } +// +// err = dhts[3].putLocal(u.Key("hello"), []byte("world")) +// if err != nil { +// t.Fatal(err) +// } +// +// bits, err := dhts[3].getLocal(u.Key("hello")) +// if err != nil && bytes.Equal(bits, []byte("world")) { +// t.Fatal(err) +// } +// +// err = dhts[3].Provide(u.Key("hello")) +// if err != nil { +// t.Fatal(err) +// } +// +// time.Sleep(time.Millisecond * 60) +// +// provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) +// if err != nil { +// t.Fatal(err) +// } +// +// if len(provs) != 1 { +// t.Fatal("Didnt get back providers") +// } +// } +// +// func TestLayeredGet(t *testing.T) { +// u.Debug = false +// addrs, _, dhts := setupDHTS(4, t) +// defer func() { +// for i := 0; i < 4; i++ { +// dhts[i].Halt() +// } +// }() +// +// _, err := dhts[0].Connect(addrs[1]) +// if err != nil { +// t.Fatalf("Failed to connect: %s", err) +// } +// +// _, err = dhts[1].Connect(addrs[2]) +// if err != nil { +// t.Fatal(err) +// } +// +// _, err = dhts[1].Connect(addrs[3]) +// if err != nil { +// t.Fatal(err) +// } +// +// err = dhts[3].putLocal(u.Key("hello"), []byte("world")) +// if err != nil { +// t.Fatal(err) +// } +// +// err = dhts[3].Provide(u.Key("hello")) +// if err != nil { +// t.Fatal(err) +// } +// +// time.Sleep(time.Millisecond * 60) +// +// val, err := dhts[0].GetValue(u.Key("hello"), time.Second) +// if err != nil { +// t.Fatal(err) +// } +// +// if string(val) != "world" { +// t.Fatal("Got incorrect value.") +// } +// +// } +// +// func TestFindPeer(t *testing.T) { +// u.Debug = false +// +// addrs, peers, dhts := setupDHTS(4, t) +// go func() { +// for i := 0; i < 4; i++ { +// dhts[i].Halt() +// } +// }() +// +// _, err := dhts[0].Connect(addrs[1]) +// if err != nil { +// t.Fatal(err) +// } +// +// _, err = dhts[1].Connect(addrs[2]) +// if err != nil { +// t.Fatal(err) +// } +// +// _, err = dhts[1].Connect(addrs[3]) +// if err != nil { +// t.Fatal(err) +// } +// +// p, err := dhts[0].FindPeer(peers[2].ID, time.Second) +// if err != nil { +// t.Fatal(err) +// } +// +// if p == nil { +// t.Fatal("Failed to find peer.") +// } +// +// if !p.ID.Equal(peers[2].ID) { +// t.Fatal("Didnt find expected peer.") +// } +// } From 3b3234de71c9abb48be5b82b130439c552d4f397 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Sep 2014 05:01:25 -0700 Subject: [PATCH 0124/3147] dht.Connect(Peer) This commit was moved from ipfs/go-ipfs-routing@22fdbcdd850b76bdabf60b6735a4dd72fbead053 --- routing/dht/dht.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d1b610c5ee..8a8d82151d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -72,9 +72,8 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende } // Connect to a new peer at the given address, ping and add to the routing table -func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { - maddrstr, _ := addr.String() - u.DOut("Connect to new peer: %s\n", maddrstr) +func (dht *IpfsDHT) Connect(npeer *peer.Peer) (*peer.Peer, error) { + u.DOut("Connect to new peer: %s\n", npeer.ID.Pretty()) // TODO(jbenet,whyrusleeping) // @@ -85,8 +84,6 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { // // /ip4/10.20.30.40/tcp/1234/ipfs/Qxhxxchxzcncxnzcnxzcxzm // - npeer := &peer.Peer{} - npeer.AddAddress(addr) err := dht.network.DialPeer(npeer) if err != nil { return nil, err From c800867c14511d311470b47eeef8a43bfe6db2bb Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Sep 2014 05:23:57 -0700 Subject: [PATCH 0125/3147] use Alpha as the concurrency. cc @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@164f56cdf84ad2a43db7588c7616604ca7045fba --- routing/dht/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index 4002596359..f4cf6ca1ad 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -12,7 +12,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) -const maxQueryConcurrency = 5 +var maxQueryConcurrency = AlphaValue type dhtQuery struct { // the key we're querying for From e1b3a65f6f4887b6b06f2f8a0da6c5bd810ef69b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Sep 2014 07:51:03 -0700 Subject: [PATCH 0126/3147] Fixed connections all over. This commit was moved from ipfs/go-ipfs-routing@aab538ffff1e4cb83bb65155622ab92778f3f402 --- routing/dht/Message.go | 2 +- routing/dht/dht.go | 22 ++- routing/dht/dht_test.go | 330 +++++++++++++++++++--------------------- routing/dht/handlers.go | 1 + routing/dht/query.go | 16 +- routing/dht/routing.go | 2 + 6 files changed, 186 insertions(+), 187 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index d82b3bb442..ed7dc2a21d 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -46,7 +46,7 @@ func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { func (m *Message) GetClusterLevel() int { level := m.GetClusterLevelRaw() - 1 if level < 0 { - u.PErr("handleGetValue: no routing level specified, assuming 0\n") + u.PErr("GetClusterLevel: no routing level specified, assuming 0\n") level = 0 } return int(level) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 8a8d82151d..9338339da7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -125,7 +125,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg. dht.Update(mPeer) // Print out diagnostic - u.DOut("[peer: %s]\nGot message type: '%s' [from = %s]\n", + u.DOut("[peer: %s] Got message type: '%s' [from = %s]\n", dht.self.ID.Pretty(), Message_MessageType_name[int32(pmes.GetType())], mPeer.ID.Pretty()) @@ -141,6 +141,11 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg. return nil, err } + // if nil response, return it before serializing + if rpmes == nil { + return nil, nil + } + // serialize response msg rmes, err := msg.FromObject(mPeer, rpmes) if err != nil { @@ -161,6 +166,11 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message start := time.Now() + // Print out diagnostic + u.DOut("[peer: %s] Sent message type: '%s' [to = %s]\n", + dht.self.ID.Pretty(), + Message_MessageType_name[int32(pmes.GetType())], p.ID.Pretty()) + rmes, err := dht.sender.SendRequest(ctx, mes) if err != nil { return nil, err @@ -209,10 +219,10 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, return nil, nil, err } - u.POut("pmes.GetValue() %v\n", pmes.GetValue()) + u.DOut("pmes.GetValue() %v\n", pmes.GetValue()) if value := pmes.GetValue(); value != nil { // Success! We were given the value - u.POut("getValueOrPeers: got value\n") + u.DOut("getValueOrPeers: got value\n") return value, nil, nil } @@ -222,7 +232,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, if err != nil { return nil, nil, err } - u.POut("getValueOrPeers: get from providers\n") + u.DOut("getValueOrPeers: get from providers\n") return val, nil, nil } @@ -250,11 +260,11 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, } if len(peers) > 0 { - u.POut("getValueOrPeers: peers\n") + u.DOut("getValueOrPeers: peers\n") return nil, peers, nil } - u.POut("getValueOrPeers: u.ErrNotFound\n") + u.DOut("getValueOrPeers: u.ErrNotFound\n") return nil, nil, u.ErrNotFound } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 768aa47670..6cf9c115df 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -1,194 +1,180 @@ package dht -// import ( -// "testing" -// -// context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -// -// ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" -// ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -// -// ci "github.com/jbenet/go-ipfs/crypto" -// spipe "github.com/jbenet/go-ipfs/crypto/spipe" -// inet "github.com/jbenet/go-ipfs/net" -// mux "github.com/jbenet/go-ipfs/net/mux" -// netservice "github.com/jbenet/go-ipfs/net/service" -// peer "github.com/jbenet/go-ipfs/peer" -// u "github.com/jbenet/go-ipfs/util" -// -// "bytes" -// "fmt" -// "time" -// ) -// -// func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { -// ctx := context.TODO() -// -// peerstore := peer.NewPeerstore() -// -// ctx, _ = context.WithCancel(ctx) -// dhts := netservice.NewService(nil) // nil handler for now, need to patch it -// if err := dhts.Start(ctx); err != nil { -// t.Fatal(err) -// } -// -// net, err := inet.NewIpfsNetwork(context.TODO(), p, &mux.ProtocolMap{ -// mux.ProtocolID_Routing: dhts, -// }) -// if err != nil { -// t.Fatal(err) -// } -// -// d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) -// dhts.Handler = d -// return d -// } -// -// func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { -// var addrs []*ma.Multiaddr -// for i := 0; i < 4; i++ { -// a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) -// if err != nil { -// t.Fatal(err) -// } -// addrs = append(addrs, a) -// } -// -// var peers []*peer.Peer -// for i := 0; i < 4; i++ { -// p := new(peer.Peer) -// p.AddAddress(addrs[i]) -// sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) -// if err != nil { -// panic(err) -// } -// p.PubKey = pk -// p.PrivKey = sk -// id, err := spipe.IDFromPubKey(pk) -// if err != nil { -// panic(err) -// } -// p.ID = id -// peers = append(peers, p) -// } -// -// var dhts []*IpfsDHT -// for i := 0; i < 4; i++ { -// dhts[i] = setupDHT(t, peers[i]) -// } -// -// return addrs, peers, dhts -// } -// -// func makePeer(addr *ma.Multiaddr) *peer.Peer { -// p := new(peer.Peer) -// p.AddAddress(addr) -// sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) -// if err != nil { -// panic(err) -// } -// p.PrivKey = sk -// p.PubKey = pk -// id, err := spipe.IDFromPubKey(pk) -// if err != nil { -// panic(err) -// } -// -// p.ID = id -// return p -// } -// -// func TestPing(t *testing.T) { -// u.Debug = true -// addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") -// if err != nil { -// t.Fatal(err) -// } -// addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") -// if err != nil { -// t.Fatal(err) -// } -// -// peerA := makePeer(addrA) -// peerB := makePeer(addrB) -// -// dhtA := setupDHT(t, peerA) -// dhtB := setupDHT(t, peerB) -// -// defer dhtA.Halt() -// defer dhtB.Halt() -// -// _, err = dhtA.Connect(addrB) -// if err != nil { -// t.Fatal(err) -// } -// -// //Test that we can ping the node -// err = dhtA.Ping(peerB, time.Second*2) -// if err != nil { -// t.Fatal(err) -// } -// } -// -// func TestValueGetSet(t *testing.T) { -// u.Debug = false -// addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") -// if err != nil { -// t.Fatal(err) -// } -// addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") -// if err != nil { -// t.Fatal(err) -// } -// -// peerA := makePeer(addrA) -// peerB := makePeer(addrB) -// -// dhtA := setupDHT(t, peerA) -// dhtB := setupDHT(t, peerB) -// -// defer dhtA.Halt() -// defer dhtB.Halt() -// -// _, err = dhtA.Connect(addrB) -// if err != nil { -// t.Fatal(err) -// } -// -// dhtA.PutValue("hello", []byte("world")) -// -// val, err := dhtA.GetValue("hello", time.Second*2) -// if err != nil { -// t.Fatal(err) -// } -// -// if string(val) != "world" { -// t.Fatalf("Expected 'world' got '%s'", string(val)) -// } -// -// } -// +import ( + "testing" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + + ci "github.com/jbenet/go-ipfs/crypto" + spipe "github.com/jbenet/go-ipfs/crypto/spipe" + inet "github.com/jbenet/go-ipfs/net" + mux "github.com/jbenet/go-ipfs/net/mux" + netservice "github.com/jbenet/go-ipfs/net/service" + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" + + "fmt" + "time" +) + +func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { + ctx, _ := context.WithCancel(context.TODO()) + + peerstore := peer.NewPeerstore() + + dhts := netservice.NewService(nil) // nil handler for now, need to patch it + if err := dhts.Start(ctx); err != nil { + t.Fatal(err) + } + + net, err := inet.NewIpfsNetwork(ctx, p, &mux.ProtocolMap{ + mux.ProtocolID_Routing: dhts, + }) + if err != nil { + t.Fatal(err) + } + + d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) + dhts.Handler = d + return d +} + +func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { + var addrs []*ma.Multiaddr + for i := 0; i < 4; i++ { + a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) + if err != nil { + t.Fatal(err) + } + addrs = append(addrs, a) + } + + var peers []*peer.Peer + for i := 0; i < 4; i++ { + p := makePeer(addrs[i]) + peers = append(peers, p) + } + + var dhts []*IpfsDHT + for i := 0; i < 4; i++ { + dhts[i] = setupDHT(t, peers[i]) + } + + return addrs, peers, dhts +} + +func makePeer(addr *ma.Multiaddr) *peer.Peer { + p := new(peer.Peer) + p.AddAddress(addr) + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) + if err != nil { + panic(err) + } + p.PrivKey = sk + p.PubKey = pk + id, err := spipe.IDFromPubKey(pk) + if err != nil { + panic(err) + } + + p.ID = id + return p +} + +func TestPing(t *testing.T) { + u.Debug = true + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") + if err != nil { + t.Fatal(err) + } + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") + if err != nil { + t.Fatal(err) + } + + peerA := makePeer(addrA) + peerB := makePeer(addrB) + + dhtA := setupDHT(t, peerA) + dhtB := setupDHT(t, peerB) + + defer dhtA.Halt() + defer dhtB.Halt() + + _, err = dhtA.Connect(peerB) + if err != nil { + t.Fatal(err) + } + + //Test that we can ping the node + err = dhtA.Ping(peerB, time.Second*2) + if err != nil { + t.Fatal(err) + } +} + +func TestValueGetSet(t *testing.T) { + u.Debug = false + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + if err != nil { + t.Fatal(err) + } + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") + if err != nil { + t.Fatal(err) + } + + peerA := makePeer(addrA) + peerB := makePeer(addrB) + + dhtA := setupDHT(t, peerA) + dhtB := setupDHT(t, peerB) + + defer dhtA.Halt() + defer dhtB.Halt() + + _, err = dhtA.Connect(peerB) + if err != nil { + t.Fatal(err) + } + + dhtA.PutValue("hello", []byte("world")) + + val, err := dhtA.GetValue("hello", time.Second*2) + if err != nil { + t.Fatal(err) + } + + if string(val) != "world" { + t.Fatalf("Expected 'world' got '%s'", string(val)) + } + +} + // func TestProvides(t *testing.T) { // u.Debug = false // -// addrs, _, dhts := setupDHTS(4, t) +// _, peers, dhts := setupDHTS(4, t) // defer func() { // for i := 0; i < 4; i++ { // dhts[i].Halt() // } // }() // -// _, err := dhts[0].Connect(addrs[1]) +// _, err := dhts[0].Connect(peers[1]) // if err != nil { // t.Fatal(err) // } // -// _, err = dhts[1].Connect(addrs[2]) +// _, err = dhts[1].Connect(peers[2]) // if err != nil { // t.Fatal(err) // } // -// _, err = dhts[1].Connect(addrs[3]) +// _, err = dhts[1].Connect(peers[3]) // if err != nil { // t.Fatal(err) // } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index a12a2f3d44..124bd76f56 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -97,6 +97,7 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error defer dht.dslock.Unlock() dskey := ds.NewKey(pmes.GetKey()) err := dht.datastore.Put(dskey, pmes.GetValue()) + u.DOut("[%s] handlePutValue %v %v", dht.self.ID.Pretty(), dskey, pmes.GetValue()) return nil, err } diff --git a/routing/dht/query.go b/routing/dht/query.go index f4cf6ca1ad..f4695845fc 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -163,7 +163,7 @@ func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { r.peersSeen[next.Key()] = next r.Unlock() - u.POut("adding peer to query: %v\n", next.ID.Pretty()) + u.DOut("adding peer to query: %v\n", next.ID.Pretty()) // do this after unlocking to prevent possible deadlocks. r.peersRemaining.Increment(1) @@ -187,14 +187,14 @@ func (r *dhtQueryRunner) spawnWorkers() { if !more { return // channel closed. } - u.POut("spawning worker for: %v\n", p.ID.Pretty()) + u.DOut("spawning worker for: %v\n", p.ID.Pretty()) go r.queryPeer(p) } } } func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { - u.POut("spawned worker for: %v\n", p.ID.Pretty()) + u.DOut("spawned worker for: %v\n", p.ID.Pretty()) // make sure we rate limit concurrency. select { @@ -204,33 +204,33 @@ func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { return } - u.POut("running worker for: %v\n", p.ID.Pretty()) + u.DOut("running worker for: %v\n", p.ID.Pretty()) // finally, run the query against this peer res, err := r.query.qfunc(r.ctx, p) if err != nil { - u.POut("ERROR worker for: %v %v\n", p.ID.Pretty(), err) + u.DOut("ERROR worker for: %v %v\n", p.ID.Pretty(), err) r.Lock() r.errs = append(r.errs, err) r.Unlock() } else if res.success { - u.POut("SUCCESS worker for: %v\n", p.ID.Pretty(), res) + u.DOut("SUCCESS worker for: %v\n", p.ID.Pretty(), res) r.Lock() r.result = res r.Unlock() r.cancel() // signal to everyone that we're done. } else if res.closerPeers != nil { - u.POut("PEERS CLOSER -- worker for: %v\n", p.ID.Pretty()) + u.DOut("PEERS CLOSER -- worker for: %v\n", p.ID.Pretty()) for _, next := range res.closerPeers { r.addPeerToQuery(next, p) } } // signal we're done proccessing peer p - u.POut("completing worker for: %v\n", p.ID.Pretty()) + u.DOut("completing worker for: %v\n", p.ID.Pretty()) r.peersRemaining.Decrement(1) r.rateLimit <- struct{}{} } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2410dcd3a0..b9fdbeef40 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -30,6 +30,7 @@ func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { } query := newQuery(key, func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { + u.DOut("[%s] PutValue qry part %v\n", dht.self.ID.Pretty(), p.ID.Pretty()) err := dht.putValueToNetwork(ctx, p, string(key), value) if err != nil { return nil, err @@ -38,6 +39,7 @@ func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { }) _, err := query.Run(ctx, peers) + u.DOut("[%s] PutValue %v %v\n", dht.self.ID.Pretty(), key, value) return err } From 14b6c92e7e03da0f169f2ab47c9ffaa209d3d14f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Sep 2014 08:07:56 -0700 Subject: [PATCH 0127/3147] fixed get/put This commit was moved from ipfs/go-ipfs-routing@2641a0840eddc53dd1df984f18edbc568f6303c5 --- routing/dht/dht.go | 14 ++++++++++---- routing/dht/dht_test.go | 2 +- routing/dht/handlers.go | 13 +++++++------ routing/dht/query.go | 15 ++++++++------- routing/dht/routing.go | 2 ++ 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 9338339da7..89abd093ae 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -1,6 +1,7 @@ package dht import ( + "bytes" "crypto/rand" "errors" "fmt" @@ -190,15 +191,20 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message return rpmes, nil } -func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, key string, value []byte) error { +func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, + key string, value []byte) error { + pmes := newMessage(Message_PUT_VALUE, string(key), 0) pmes.Value = value - - mes, err := msg.FromObject(p, pmes) + rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { return err } - return dht.sender.SendMessage(ctx, mes) + + if !bytes.Equal(rpmes.Value, pmes.Value) { + return errors.New("value not put correctly") + } + return nil } func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) error { diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 6cf9c115df..b7e24b1d78 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -117,7 +117,7 @@ func TestPing(t *testing.T) { } func TestValueGetSet(t *testing.T) { - u.Debug = false + u.Debug = true addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") if err != nil { t.Fatal(err) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 124bd76f56..5320cc10aa 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -38,7 +38,7 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { } func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error) { - u.DOut("handleGetValue for key: %s\n", pmes.GetKey()) + u.DOut("[%s] handleGetValue for key: %s\n", dht.self.ID.Pretty(), pmes.GetKey()) // setup response resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) @@ -50,11 +50,13 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } // let's first check if we have the value locally. + u.DOut("[%s] handleGetValue looking into ds\n", dht.self.ID.Pretty()) dskey := ds.NewKey(pmes.GetKey()) iVal, err := dht.datastore.Get(dskey) + u.DOut("[%s] handleGetValue looking into ds GOT %v\n", dht.self.ID.Pretty(), iVal) // if we got an unexpected error, bail. - if err != ds.ErrNotFound { + if err != nil && err != ds.ErrNotFound { return nil, err } @@ -63,7 +65,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // if we have the value, send it back if err == nil { - u.DOut("handleGetValue success!\n") + u.DOut("[%s] handleGetValue success!\n", dht.self.ID.Pretty()) byts, ok := iVal.([]byte) if !ok { @@ -85,7 +87,6 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error if closer != nil { u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) - return resp, nil } return resp, nil @@ -97,8 +98,8 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error defer dht.dslock.Unlock() dskey := ds.NewKey(pmes.GetKey()) err := dht.datastore.Put(dskey, pmes.GetValue()) - u.DOut("[%s] handlePutValue %v %v", dht.self.ID.Pretty(), dskey, pmes.GetValue()) - return nil, err + u.DOut("[%s] handlePutValue %v %v\n", dht.self.ID.Pretty(), dskey, pmes.GetValue()) + return pmes, err } func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { diff --git a/routing/dht/query.go b/routing/dht/query.go index f4695845fc..4db3f70e72 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -117,28 +117,29 @@ func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { // so workers are working. // wait until they're done. + err := u.ErrNotFound + select { case <-r.peersRemaining.Done(): r.cancel() // ran all and nothing. cancel all outstanding workers. - r.RLock() defer r.RUnlock() if len(r.errs) > 0 { - return nil, r.errs[0] + err = r.errs[0] } - return nil, u.ErrNotFound case <-r.ctx.Done(): r.RLock() defer r.RUnlock() + err = r.ctx.Err() + } - if r.result != nil && r.result.success { - return r.result, nil - } - return nil, r.ctx.Err() + if r.result != nil && r.result.success { + return r.result, nil } + return nil, err } func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b9fdbeef40..4991a06f38 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -89,6 +89,8 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { return nil, err } + u.DOut("[%s] GetValue %v %v\n", dht.self.ID.Pretty(), key, result.value) + if result.value == nil { return nil, u.ErrNotFound } From ec0a2f4c17c5528d1d84c4c0f28d8c41b70f32d4 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 17:09:22 -0700 Subject: [PATCH 0128/3147] refac(exchange) bitswap -> exchange/bitswap Move go-ipfs/bitswap package to go-ipfs/exchange/bitswap * Delineates the difference between the generic exchange interface and implementations (eg. BitSwap protocol) Thus, the bitswap protocol can be refined without having to overthink how future exchanges will work. Aspects common to BitSwap and other exchanges can be extracted out to the exchange package in piecemeal. Future exchange implementations can be placed in sibling packages next to exchange/bitswap. (eg. exchange/multilateral) This commit was moved from ipfs/go-ipfs-exchange-interface@9c8e0caebd973678ba1d24a01820e82bfe72a5dc --- exchange/interface.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 exchange/interface.go diff --git a/exchange/interface.go b/exchange/interface.go new file mode 100644 index 0000000000..73c3ba6033 --- /dev/null +++ b/exchange/interface.go @@ -0,0 +1,28 @@ +package bitswap + +import ( + "time" + + blocks "github.com/jbenet/go-ipfs/blocks" + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) + +type Exchange interface { + + // Block returns the block associated with a given key. + // TODO(brian): pass a context instead of a timeout + Block(k u.Key, timeout time.Duration) (*blocks.Block, error) + + // HasBlock asserts the existence of this block + // TODO(brian): rename -> HasBlock + // TODO(brian): accept a value, not a pointer + // TODO(brian): remove error return value. Should callers be concerned with + // whether the block was made available on the network? + HasBlock(blocks.Block) error +} + +type Directory interface { + FindProvidersAsync(u.Key, int, time.Duration) <-chan *peer.Peer + Provide(key u.Key) error +} From 06477956e980efeebbb19069acbedc68c8e3aa6b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 17:09:22 -0700 Subject: [PATCH 0129/3147] refac(exchange) bitswap -> exchange/bitswap Move go-ipfs/bitswap package to go-ipfs/exchange/bitswap * Delineates the difference between the generic exchange interface and implementations (eg. BitSwap protocol) Thus, the bitswap protocol can be refined without having to overthink how future exchanges will work. Aspects common to BitSwap and other exchanges can be extracted out to the exchange package in piecemeal. Future exchange implementations can be placed in sibling packages next to exchange/bitswap. (eg. exchange/multilateral) This commit was moved from ipfs/go-blockservice@1382a525dc152e159316dad4dba3c74c596fe4be --- blockservice/blockservice.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0b4f15b987..011ad0283f 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -5,8 +5,8 @@ import ( "time" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - bitswap "github.com/jbenet/go-ipfs/bitswap" blocks "github.com/jbenet/go-ipfs/blocks" + exchange "github.com/jbenet/go-ipfs/exchange" u "github.com/jbenet/go-ipfs/util" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" @@ -16,11 +16,11 @@ import ( // It uses an internal `datastore.Datastore` instance to store values. type BlockService struct { Datastore ds.Datastore - Remote bitswap.Exchange + Remote exchange.Exchange } // NewBlockService creates a BlockService with given datastore instance. -func NewBlockService(d ds.Datastore, rem bitswap.Exchange) (*BlockService, error) { +func NewBlockService(d ds.Datastore, rem exchange.Exchange) (*BlockService, error) { if d == nil { return nil, fmt.Errorf("BlockService requires valid datastore") } From a9a82e044ea5fba1d371c11fe559ffbd5249edab Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 17:30:06 -0700 Subject: [PATCH 0130/3147] refac(exchange) rename exchange.Interface to match golang conventions examples: http://golang.org/pkg/container/heap/#Interface http://golang.org/pkg/net/#Interface http://golang.org/pkg/sort/#Interface This commit was moved from ipfs/go-ipfs-exchange-interface@1d5a8e9f1ab6d50fbd7d26aeaf26232965bce71e --- exchange/interface.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 73c3ba6033..75eca06bf8 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -4,11 +4,12 @@ import ( "time" blocks "github.com/jbenet/go-ipfs/blocks" - peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" ) -type Exchange interface { +// Any type that implements exchange.Interface may be used as an IPFS block +// exchange protocol. +type Interface interface { // Block returns the block associated with a given key. // TODO(brian): pass a context instead of a timeout @@ -21,8 +22,3 @@ type Exchange interface { // whether the block was made available on the network? HasBlock(blocks.Block) error } - -type Directory interface { - FindProvidersAsync(u.Key, int, time.Duration) <-chan *peer.Peer - Provide(key u.Key) error -} From 252db7682bc9ae2496694ec14cd7cbcb572455ad Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 17:30:06 -0700 Subject: [PATCH 0131/3147] refac(exchange) rename exchange.Interface to match golang conventions examples: http://golang.org/pkg/container/heap/#Interface http://golang.org/pkg/net/#Interface http://golang.org/pkg/sort/#Interface This commit was moved from ipfs/go-blockservice@7c577eb53e66c6284ed75b98b3d6d39fc212d024 --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 011ad0283f..89136edb02 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -16,11 +16,11 @@ import ( // It uses an internal `datastore.Datastore` instance to store values. type BlockService struct { Datastore ds.Datastore - Remote exchange.Exchange + Remote exchange.Interface } // NewBlockService creates a BlockService with given datastore instance. -func NewBlockService(d ds.Datastore, rem exchange.Exchange) (*BlockService, error) { +func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, error) { if d == nil { return nil, fmt.Errorf("BlockService requires valid datastore") } From 713d68296f39672d551df63ef7a22f176b073190 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 19:36:18 -0700 Subject: [PATCH 0132/3147] refac(exchange) replace timeout -> context in API This commit was moved from ipfs/go-ipfs-exchange-interface@36dca820ae9844ed84a1a47ad526aaa73c34607f --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 75eca06bf8..7e06e1ed14 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -1,7 +1,7 @@ package bitswap import ( - "time" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" @@ -13,7 +13,7 @@ type Interface interface { // Block returns the block associated with a given key. // TODO(brian): pass a context instead of a timeout - Block(k u.Key, timeout time.Duration) (*blocks.Block, error) + Block(context.Context, u.Key) (*blocks.Block, error) // HasBlock asserts the existence of this block // TODO(brian): rename -> HasBlock From 56411d525456e5426941bae02f0163c052922998 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 19:36:18 -0700 Subject: [PATCH 0133/3147] refac(exchange) replace timeout -> context in API This commit was moved from ipfs/go-blockservice@07b321372a091c328906e493048c707cf712d434 --- blockservice/blockservice.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 89136edb02..3018ae0d87 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -4,12 +4,13 @@ import ( "fmt" "time" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + blocks "github.com/jbenet/go-ipfs/blocks" exchange "github.com/jbenet/go-ipfs/exchange" u "github.com/jbenet/go-ipfs/util" - - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ) // BlockService is a block datastore. @@ -65,7 +66,8 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { }, nil } else if err == ds.ErrNotFound && s.Remote != nil { u.DOut("Blockservice: Searching bitswap.\n") - blk, err := s.Remote.Block(k, time.Second*5) + ctx, _ := context.WithTimeout(context.TODO(), 5*time.Second) + blk, err := s.Remote.Block(ctx, k) if err != nil { return nil, err } From eabdda08bc95c523fe4e9355a17527c4999aed45 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 19:15:15 -0700 Subject: [PATCH 0134/3147] refac(routing) replace timeout -> ctx @jbenet oh hai there! This commit was moved from ipfs/go-ipfs-routing@2e150db89c06b1f988cbae50da2701a26504355c --- routing/dht/routing.go | 4 +--- routing/routing.go | 4 +++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4991a06f38..9e6c5ff29f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -121,9 +121,7 @@ func (dht *IpfsDHT) Provide(key u.Key) error { } // FindProvidersAsync runs FindProviders and sends back results over a channel -func (dht *IpfsDHT) FindProvidersAsync(key u.Key, count int, timeout time.Duration) <-chan *peer.Peer { - ctx, _ := context.WithTimeout(context.TODO(), timeout) - +func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan *peer.Peer { peerOut := make(chan *peer.Peer, count) go func() { ps := newPeerSet() diff --git a/routing/routing.go b/routing/routing.go index c8dc2772b4..872bad6f8e 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -3,6 +3,8 @@ package routing import ( "time" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" ) @@ -10,7 +12,7 @@ import ( // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { - FindProvidersAsync(u.Key, int, time.Duration) <-chan *peer.Peer + FindProvidersAsync(context.Context, u.Key, int) <-chan *peer.Peer // Basic Put/Get From 022af657931e63d37036e6275d8324751a4927a3 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 19:43:03 -0700 Subject: [PATCH 0135/3147] feat(exchange) pass ctx to exchange.HasBlock(...) This commit was moved from ipfs/go-ipfs-exchange-interface@ac8c699864f37aaea132696771f3944c06af7367 --- exchange/interface.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 7e06e1ed14..a96094eaa8 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -12,13 +12,9 @@ import ( type Interface interface { // Block returns the block associated with a given key. - // TODO(brian): pass a context instead of a timeout Block(context.Context, u.Key) (*blocks.Block, error) - // HasBlock asserts the existence of this block - // TODO(brian): rename -> HasBlock - // TODO(brian): accept a value, not a pointer - // TODO(brian): remove error return value. Should callers be concerned with - // whether the block was made available on the network? - HasBlock(blocks.Block) error + // TODO Should callers be concerned with whether the block was made + // available on the network? + HasBlock(context.Context, blocks.Block) error } From 1eb482018908a15ffd384f920305835d2c0090bb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Sep 2014 19:43:03 -0700 Subject: [PATCH 0136/3147] feat(exchange) pass ctx to exchange.HasBlock(...) This commit was moved from ipfs/go-blockservice@c5ebe0fb414b654f18e826e513dfd725e25a0017 --- blockservice/blockservice.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3018ae0d87..e3c7402bd6 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -43,7 +43,8 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { return k, err } if s.Remote != nil { - err = s.Remote.HasBlock(*b) + ctx := context.TODO() + err = s.Remote.HasBlock(ctx, *b) } return k, err } From e6f094759ea512c3d2158116007b02fbac2f8891 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Sep 2014 14:31:10 -0700 Subject: [PATCH 0137/3147] provider testing This commit was moved from ipfs/go-ipfs-routing@9215b454a03ce87b1f962b4a86a6666c37a1370c --- routing/dht/dht.go | 11 ++++++++--- routing/dht/dht_test.go | 9 +++++---- routing/dht/routing.go | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 89abd093ae..ec22da9b0c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -208,13 +208,18 @@ func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, } func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) error { - pmes := newMessage(Message_ADD_PROVIDER, string(key), 0) - mes, err := msg.FromObject(p, pmes) + pmes := newMessage(Message_ADD_PROVIDER, string(key), 0) + rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { return err } - return dht.sender.SendMessage(ctx, mes) + + if *rpmes.Key != *pmes.Key { + return errors.New("provider not added correctly") + } + + return nil } func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b7e24b1d78..94e9ee6d35 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -1,6 +1,7 @@ package dht import ( + "bytes" "testing" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -44,7 +45,7 @@ func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { var addrs []*ma.Multiaddr - for i := 0; i < 4; i++ { + for i := 0; i < n; i++ { a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) if err != nil { t.Fatal(err) @@ -53,13 +54,13 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) } var peers []*peer.Peer - for i := 0; i < 4; i++ { + for i := 0; i < n; i++ { p := makePeer(addrs[i]) peers = append(peers, p) } - var dhts []*IpfsDHT - for i := 0; i < 4; i++ { + dhts := make([]*IpfsDHT, n) + for i := 0; i < n; i++ { dhts[i] = setupDHT(t, peers[i]) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9e6c5ff29f..acb4cab45c 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -90,7 +90,6 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { } u.DOut("[%s] GetValue %v %v\n", dht.self.ID.Pretty(), key, result.value) - if result.value == nil { return nil, u.ErrNotFound } @@ -111,6 +110,8 @@ func (dht *IpfsDHT) Provide(key u.Key) error { return kb.ErrLookupFailure } + //TODO FIX: this doesn't work! it needs to be sent to the actual nearest peers. + // `peers` are the closest peers we have, not the ones that should get the value. for _, p := range peers { err := dht.putProvider(ctx, p, string(key)) if err != nil { From 32627aefd2b8a4204a56d28e626d23232d9d3f0e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 19 Sep 2014 15:35:06 -0700 Subject: [PATCH 0138/3147] refac(exch:offline) move offline exchange to its own package This commit was moved from ipfs/go-ipfs-exchange-offline@a9531a8171017885104c233c442ab219da0ffc15 --- exchange/offline/offline.go | 32 ++++++++++++++++++++++++++++++++ exchange/offline/offline_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 exchange/offline/offline.go create mode 100644 exchange/offline/offline_test.go diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go new file mode 100644 index 0000000000..9695b0b568 --- /dev/null +++ b/exchange/offline/offline.go @@ -0,0 +1,32 @@ +package bitswap + +import ( + "errors" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + blocks "github.com/jbenet/go-ipfs/blocks" + exchange "github.com/jbenet/go-ipfs/exchange" + u "github.com/jbenet/go-ipfs/util" +) + +func NewOfflineExchange() exchange.Interface { + return &offlineExchange{} +} + +// offlineExchange implements the Exchange interface but doesn't return blocks. +// For use in offline mode. +type offlineExchange struct { +} + +// Block returns nil to signal that a block could not be retrieved for the +// given key. +// NB: This function may return before the timeout expires. +func (_ *offlineExchange) Block(context.Context, u.Key) (*blocks.Block, error) { + return nil, errors.New("Block unavailable. Operating in offline mode") +} + +// HasBlock always returns nil. +func (_ *offlineExchange) HasBlock(context.Context, blocks.Block) error { + return nil +} diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go new file mode 100644 index 0000000000..26821f2c8a --- /dev/null +++ b/exchange/offline/offline_test.go @@ -0,0 +1,28 @@ +package bitswap + +import ( + "testing" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + u "github.com/jbenet/go-ipfs/util" + testutil "github.com/jbenet/go-ipfs/util/testutil" +) + +func TestBlockReturnsErr(t *testing.T) { + off := NewOfflineExchange() + _, err := off.Block(context.Background(), u.Key("foo")) + if err != nil { + return // as desired + } + t.Fail() +} + +func TestHasBlockReturnsNil(t *testing.T) { + off := NewOfflineExchange() + block := testutil.NewBlockOrFail(t, "data") + err := off.HasBlock(context.Background(), block) + if err != nil { + t.Fatal("") + } +} From d29247093f45253b5196ddbc8349ec2695cf13fd Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 19 Sep 2014 00:08:15 -0700 Subject: [PATCH 0139/3147] fix(exchange) package name This commit was moved from ipfs/go-ipfs-exchange-interface@8171130d624b7eee81ce830834dae68e13a698f6 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index a96094eaa8..682c983486 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -1,4 +1,4 @@ -package bitswap +package exchange import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" From 4332c069c4b8a87be20af1e9d7d7dcb012bcbef0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Sep 2014 18:11:05 -0700 Subject: [PATCH 0140/3147] dht tests pass again This commit was moved from ipfs/go-ipfs-routing@f1df72769abf9acc97a2d8d81e5904d821388c26 --- routing/dht/Message.go | 2 +- routing/dht/dht.go | 5 +- routing/dht/dht_test.go | 295 +++++++++++++++++++++------------------- routing/dht/ext_test.go | 8 +- routing/dht/handlers.go | 2 +- 5 files changed, 169 insertions(+), 143 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index ed7dc2a21d..1be9a3b801 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -46,7 +46,7 @@ func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { func (m *Message) GetClusterLevel() int { level := m.GetClusterLevelRaw() - 1 if level < 0 { - u.PErr("GetClusterLevel: no routing level specified, assuming 0\n") + u.DErr("GetClusterLevel: no routing level specified, assuming 0\n") level = 0 } return int(level) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ec22da9b0c..148168d012 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -215,6 +215,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) e return err } + u.DOut("[%s] putProvider: %s for %s\n", dht.self.ID.Pretty(), p.ID.Pretty(), key) if *rpmes.Key != *pmes.Key { return errors.New("provider not added correctly") } @@ -393,6 +394,8 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer continue } + u.DOut("[%s] adding provider: %s for %s", dht.self.ID.Pretty(), p, key) + // Dont add outselves to the list if p.ID.Equal(dht.self.ID) { continue @@ -464,7 +467,7 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { } // create new Peer - p := &peer.Peer{ID: id} + p = &peer.Peer{ID: id} p.AddAddress(maddr) dht.peerstore.Put(p) } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 94e9ee6d35..e3f056ce2b 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -86,7 +86,9 @@ func makePeer(addr *ma.Multiaddr) *peer.Peer { } func TestPing(t *testing.T) { - u.Debug = true + // t.Skip("skipping test to debug another") + + u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") if err != nil { t.Fatal(err) @@ -104,6 +106,8 @@ func TestPing(t *testing.T) { defer dhtA.Halt() defer dhtB.Halt() + defer dhtA.network.Close() + defer dhtB.network.Close() _, err = dhtA.Connect(peerB) if err != nil { @@ -118,7 +122,9 @@ func TestPing(t *testing.T) { } func TestValueGetSet(t *testing.T) { - u.Debug = true + // t.Skip("skipping test to debug another") + + u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") if err != nil { t.Fatal(err) @@ -136,6 +142,8 @@ func TestValueGetSet(t *testing.T) { defer dhtA.Halt() defer dhtB.Halt() + defer dhtA.network.Close() + defer dhtB.network.Close() _, err = dhtA.Connect(peerB) if err != nil { @@ -155,140 +163,149 @@ func TestValueGetSet(t *testing.T) { } -// func TestProvides(t *testing.T) { -// u.Debug = false -// -// _, peers, dhts := setupDHTS(4, t) -// defer func() { -// for i := 0; i < 4; i++ { -// dhts[i].Halt() -// } -// }() -// -// _, err := dhts[0].Connect(peers[1]) -// if err != nil { -// t.Fatal(err) -// } -// -// _, err = dhts[1].Connect(peers[2]) -// if err != nil { -// t.Fatal(err) -// } -// -// _, err = dhts[1].Connect(peers[3]) -// if err != nil { -// t.Fatal(err) -// } -// -// err = dhts[3].putLocal(u.Key("hello"), []byte("world")) -// if err != nil { -// t.Fatal(err) -// } -// -// bits, err := dhts[3].getLocal(u.Key("hello")) -// if err != nil && bytes.Equal(bits, []byte("world")) { -// t.Fatal(err) -// } -// -// err = dhts[3].Provide(u.Key("hello")) -// if err != nil { -// t.Fatal(err) -// } -// -// time.Sleep(time.Millisecond * 60) -// -// provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) -// if err != nil { -// t.Fatal(err) -// } -// -// if len(provs) != 1 { -// t.Fatal("Didnt get back providers") -// } -// } -// -// func TestLayeredGet(t *testing.T) { -// u.Debug = false -// addrs, _, dhts := setupDHTS(4, t) -// defer func() { -// for i := 0; i < 4; i++ { -// dhts[i].Halt() -// } -// }() -// -// _, err := dhts[0].Connect(addrs[1]) -// if err != nil { -// t.Fatalf("Failed to connect: %s", err) -// } -// -// _, err = dhts[1].Connect(addrs[2]) -// if err != nil { -// t.Fatal(err) -// } -// -// _, err = dhts[1].Connect(addrs[3]) -// if err != nil { -// t.Fatal(err) -// } -// -// err = dhts[3].putLocal(u.Key("hello"), []byte("world")) -// if err != nil { -// t.Fatal(err) -// } -// -// err = dhts[3].Provide(u.Key("hello")) -// if err != nil { -// t.Fatal(err) -// } -// -// time.Sleep(time.Millisecond * 60) -// -// val, err := dhts[0].GetValue(u.Key("hello"), time.Second) -// if err != nil { -// t.Fatal(err) -// } -// -// if string(val) != "world" { -// t.Fatal("Got incorrect value.") -// } -// -// } -// -// func TestFindPeer(t *testing.T) { -// u.Debug = false -// -// addrs, peers, dhts := setupDHTS(4, t) -// go func() { -// for i := 0; i < 4; i++ { -// dhts[i].Halt() -// } -// }() -// -// _, err := dhts[0].Connect(addrs[1]) -// if err != nil { -// t.Fatal(err) -// } -// -// _, err = dhts[1].Connect(addrs[2]) -// if err != nil { -// t.Fatal(err) -// } -// -// _, err = dhts[1].Connect(addrs[3]) -// if err != nil { -// t.Fatal(err) -// } -// -// p, err := dhts[0].FindPeer(peers[2].ID, time.Second) -// if err != nil { -// t.Fatal(err) -// } -// -// if p == nil { -// t.Fatal("Failed to find peer.") -// } -// -// if !p.ID.Equal(peers[2].ID) { -// t.Fatal("Didnt find expected peer.") -// } -// } +func TestProvides(t *testing.T) { + // t.Skip("skipping test to debug another") + + u.Debug = false + + _, peers, dhts := setupDHTS(4, t) + defer func() { + for i := 0; i < 4; i++ { + dhts[i].Halt() + defer dhts[i].network.Close() + } + }() + + _, err := dhts[0].Connect(peers[1]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(peers[2]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(peers[3]) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].putLocal(u.Key("hello"), []byte("world")) + if err != nil { + t.Fatal(err) + } + + bits, err := dhts[3].getLocal(u.Key("hello")) + if err != nil && bytes.Equal(bits, []byte("world")) { + t.Fatal(err) + } + + err = dhts[3].Provide(u.Key("hello")) + if err != nil { + t.Fatal(err) + } + + time.Sleep(time.Millisecond * 60) + + provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) + if err != nil { + t.Fatal(err) + } + + if len(provs) != 1 { + t.Fatal("Didnt get back providers") + } +} + +func TestLayeredGet(t *testing.T) { + // t.Skip("skipping test to debug another") + + u.Debug = false + _, peers, dhts := setupDHTS(4, t) + defer func() { + for i := 0; i < 4; i++ { + dhts[i].Halt() + defer dhts[i].network.Close() + } + }() + + _, err := dhts[0].Connect(peers[1]) + if err != nil { + t.Fatalf("Failed to connect: %s", err) + } + + _, err = dhts[1].Connect(peers[2]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(peers[3]) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].putLocal(u.Key("hello"), []byte("world")) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].Provide(u.Key("hello")) + if err != nil { + t.Fatal(err) + } + + time.Sleep(time.Millisecond * 60) + + val, err := dhts[0].GetValue(u.Key("hello"), time.Second) + if err != nil { + t.Fatal(err) + } + + if string(val) != "world" { + t.Fatal("Got incorrect value.") + } + +} + +func TestFindPeer(t *testing.T) { + // t.Skip("skipping test to debug another") + + u.Debug = false + + _, peers, dhts := setupDHTS(4, t) + defer func() { + for i := 0; i < 4; i++ { + dhts[i].Halt() + dhts[i].network.Close() + } + }() + + _, err := dhts[0].Connect(peers[1]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(peers[2]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(peers[3]) + if err != nil { + t.Fatal(err) + } + + p, err := dhts[0].FindPeer(peers[2].ID, time.Second) + if err != nil { + t.Fatal(err) + } + + if p == nil { + t.Fatal("Failed to find peer.") + } + + if !p.ID.Equal(peers[2].ID) { + t.Fatal("Didnt find expected peer.") + } +} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 47eb6429a2..26fbfea35c 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -92,6 +92,8 @@ func (f *fauxNet) SendMessage(msg.NetMessage) error { func (f *fauxNet) Close() error { return nil } func TestGetFailures(t *testing.T) { + // t.Skip("skipping test because it makes a lot of output") + ctx := context.Background() fn := &fauxNet{} fs := &fauxSender{} @@ -189,6 +191,8 @@ func _randPeer() *peer.Peer { } func TestNotFound(t *testing.T) { + // t.Skip("skipping test because it makes a lot of output") + fn := &fauxNet{} fs := &fauxSender{} @@ -233,7 +237,7 @@ func TestNotFound(t *testing.T) { }) v, err := d.GetValue(u.Key("hello"), time.Second*5) - u.POut("get value got %v\n", v) + u.DOut("get value got %v\n", v) if err != nil { switch err { case u.ErrNotFound: @@ -251,6 +255,8 @@ func TestNotFound(t *testing.T) { // If less than K nodes are in the entire network, it should fail when we make // a GET rpc and nobody has the value func TestLessThanKResponses(t *testing.T) { + // t.Skip("skipping test because it makes a lot of output") + u.Debug = false fn := &fauxNet{} fs := &fauxSender{} diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 5320cc10aa..fe22121bb2 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -176,7 +176,7 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, er dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) dht.providers.AddProvider(key, p) - return nil, nil + return pmes, nil // send back same msg as confirmation. } // Halt stops all communications from this peer and shut down From 919f7bf4bd9ee255b028b6ccd81600f6226b8e53 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 20 Sep 2014 07:19:35 -0700 Subject: [PATCH 0141/3147] this warning should only print out on debug (perhaps should be logged instead) This commit was moved from ipfs/go-blockservice@29a24c8bbe4fbc0ca49a7ba1e1b44dd402aa0749 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index e3c7402bd6..1fbbfcb440 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -26,7 +26,7 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err return nil, fmt.Errorf("BlockService requires valid datastore") } if rem == nil { - u.PErr("Caution: blockservice running in local (offline) mode.\n") + u.DErr("Caution: blockservice running in local (offline) mode.\n") } return &BlockService{Datastore: d, Remote: rem}, nil } From 210aad6a57278caec98316faea637747daa3fdf1 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 21 Sep 2014 18:04:43 -0700 Subject: [PATCH 0142/3147] Routing uses context now @perfmode boom This commit was moved from ipfs/go-ipfs-routing@dd20457e1c3858af42fd965c5a8a31adf8f26092 --- routing/dht/dht.go | 8 ++--- routing/dht/dht_test.go | 74 +++++++++++++++++++++++++++++++++++++---- routing/dht/ext_test.go | 12 ++++--- routing/dht/routing.go | 29 +++++----------- routing/routing.go | 12 +++---- 5 files changed, 93 insertions(+), 42 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 148168d012..507c19c3f5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -73,7 +73,7 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende } // Connect to a new peer at the given address, ping and add to the routing table -func (dht *IpfsDHT) Connect(npeer *peer.Peer) (*peer.Peer, error) { +func (dht *IpfsDHT) Connect(ctx context.Context, npeer *peer.Peer) (*peer.Peer, error) { u.DOut("Connect to new peer: %s\n", npeer.ID.Pretty()) // TODO(jbenet,whyrusleeping) @@ -92,7 +92,7 @@ func (dht *IpfsDHT) Connect(npeer *peer.Peer) (*peer.Peer, error) { // Ping new peer to register in their routing table // NOTE: this should be done better... - err = dht.Ping(npeer, time.Second*2) + err = dht.Ping(ctx, npeer) if err != nil { return nil, fmt.Errorf("failed to ping newly connected peer: %s\n", err) } @@ -497,8 +497,8 @@ func (dht *IpfsDHT) loadProvidableKeys() error { } // Bootstrap builds up list of peers by requesting random peer IDs -func (dht *IpfsDHT) Bootstrap() { +func (dht *IpfsDHT) Bootstrap(ctx context.Context) { id := make([]byte, 16) rand.Read(id) - dht.FindPeer(peer.ID(id), time.Second*10) + dht.FindPeer(ctx, peer.ID(id)) } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index e3f056ce2b..675d80dde2 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -22,7 +22,7 @@ import ( ) func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { - ctx, _ := context.WithCancel(context.TODO()) + ctx := context.Background() peerstore := peer.NewPeerstore() @@ -150,9 +150,11 @@ func TestValueGetSet(t *testing.T) { t.Fatal(err) } - dhtA.PutValue("hello", []byte("world")) + ctxT, _ := context.WithTimeout(context.Background(), time.Second) + dhtA.PutValue(ctxT, "hello", []byte("world")) - val, err := dhtA.GetValue("hello", time.Second*2) + ctxT, _ = context.WithTimeout(context.Background(), time.Second*2) + val, err := dhtA.GetValue(ctxT, "hello") if err != nil { t.Fatal(err) } @@ -208,7 +210,8 @@ func TestProvides(t *testing.T) { time.Sleep(time.Millisecond * 60) - provs, err := dhts[0].FindProviders(u.Key("hello"), time.Second) + ctxT, _ := context.WithTimeout(context.Background(), time.Second) + provs, err := dhts[0].FindProviders(ctxT, u.Key("hello")) if err != nil { t.Fatal(err) } @@ -218,6 +221,63 @@ func TestProvides(t *testing.T) { } } +func TestProvidesAsync(t *testing.T) { + // t.Skip("skipping test to debug another") + + u.Debug = false + + _, peers, dhts := setupDHTS(4, t) + defer func() { + for i := 0; i < 4; i++ { + dhts[i].Halt() + defer dhts[i].network.Close() + } + }() + + _, err := dhts[0].Connect(peers[1]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(peers[2]) + if err != nil { + t.Fatal(err) + } + + _, err = dhts[1].Connect(peers[3]) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].putLocal(u.Key("hello"), []byte("world")) + if err != nil { + t.Fatal(err) + } + + bits, err := dhts[3].getLocal(u.Key("hello")) + if err != nil && bytes.Equal(bits, []byte("world")) { + t.Fatal(err) + } + + err = dhts[3].Provide(u.Key("hello")) + if err != nil { + t.Fatal(err) + } + + time.Sleep(time.Millisecond * 60) + + ctx, _ := context.WithTimeout(context.TODO(), time.Millisecond*300) + provs := dhts[0].FindProvidersAsync(ctx, u.Key("hello"), 5) + select { + case p := <-provs: + if !p.ID.Equal(dhts[3].self.ID) { + t.Fatalf("got a provider, but not the right one. %v", p.ID.Pretty()) + } + case <-ctx.Done(): + t.Fatal("Didnt get back providers") + } +} + func TestLayeredGet(t *testing.T) { // t.Skip("skipping test to debug another") @@ -257,7 +317,8 @@ func TestLayeredGet(t *testing.T) { time.Sleep(time.Millisecond * 60) - val, err := dhts[0].GetValue(u.Key("hello"), time.Second) + ctxT, _ := context.WithTimeout(context.Background(), time.Second) + val, err := dhts[0].GetValue(ctxT, u.Key("hello")) if err != nil { t.Fatal(err) } @@ -296,7 +357,8 @@ func TestFindPeer(t *testing.T) { t.Fatal(err) } - p, err := dhts[0].FindPeer(peers[2].ID, time.Second) + ctxT, _ := context.WithTimeout(context.Background(), time.Second) + p, err := dhts[0].FindPeer(ctxT, peers[2].ID) if err != nil { t.Fatal(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 26fbfea35c..07999e651a 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -108,7 +108,8 @@ func TestGetFailures(t *testing.T) { // This one should time out // u.POut("Timout Test\n") - _, err := d.GetValue(u.Key("test"), time.Millisecond*10) + ctx1, _ := context.WithTimeout(context.Background(), time.Second) + _, err := d.GetValue(ctx1, u.Key("test")) if err != nil { if err != context.DeadlineExceeded { t.Fatal("Got different error than we expected", err) @@ -134,7 +135,8 @@ func TestGetFailures(t *testing.T) { }) // This one should fail with NotFound - _, err = d.GetValue(u.Key("test"), time.Millisecond*1000) + ctx2, _ := context.WithTimeout(context.Background(), time.Second) + _, err = d.GetValue(ctx2, u.Key("test")) if err != nil { if err != u.ErrNotFound { t.Fatalf("Expected ErrNotFound, got: %s", err) @@ -236,7 +238,8 @@ func TestNotFound(t *testing.T) { }) - v, err := d.GetValue(u.Key("hello"), time.Second*5) + ctx, _ := context.WithTimeout(context.Background(), time.Second*5) + v, err := d.GetValue(ctx, u.Key("hello")) u.DOut("get value got %v\n", v) if err != nil { switch err { @@ -299,7 +302,8 @@ func TestLessThanKResponses(t *testing.T) { }) - _, err := d.GetValue(u.Key("hello"), time.Second*30) + ctx, _ := context.WithTimeout(context.Background(), time.Second*30) + _, err := d.GetValue(ctx, u.Key("hello")) if err != nil { switch err { case u.ErrNotFound: diff --git a/routing/dht/routing.go b/routing/dht/routing.go index acb4cab45c..9f4a916e72 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,7 +3,6 @@ package dht import ( "bytes" "encoding/json" - "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -18,9 +17,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { - ctx := context.TODO() - +func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { peers := []*peer.Peer{} // get the peers we need to announce to @@ -46,12 +43,10 @@ func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { // GetValue searches for the value corresponding to given Key. // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete -func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { +func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { ll := startNewRPC("GET") defer ll.EndAndPrint() - ctx, _ := context.WithTimeout(context.TODO(), timeout) - // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... val, err := dht.getLocal(key) @@ -101,8 +96,7 @@ func (dht *IpfsDHT) GetValue(key u.Key, timeout time.Duration) ([]byte, error) { // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. // Provide makes this node announce that it can provide a value for the given key -func (dht *IpfsDHT) Provide(key u.Key) error { - ctx := context.TODO() +func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { dht.providers.AddProvider(key, dht.self) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) @@ -174,12 +168,10 @@ func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet } // FindProviders searches for peers who can provide the value for given key. -func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) { +func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, error) { ll := startNewRPC("FindProviders") ll.EndAndPrint() - ctx, _ := context.WithTimeout(context.TODO(), timeout) - // get closest peer u.DOut("Find providers for: '%s'\n", key) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) @@ -223,8 +215,7 @@ func (dht *IpfsDHT) FindProviders(key u.Key, timeout time.Duration) ([]*peer.Pee // Find specific Peer // FindPeer searches for a peer with given ID. -func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) { - ctx, _ := context.WithTimeout(context.TODO(), timeout) +func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error) { // Check if were already connected to them p, _ := dht.Find(id) @@ -266,8 +257,7 @@ func (dht *IpfsDHT) FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, err return nil, u.ErrNotFound } -func (dht *IpfsDHT) findPeerMultiple(id peer.ID, timeout time.Duration) (*peer.Peer, error) { - ctx, _ := context.WithTimeout(context.TODO(), timeout) +func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Peer, error) { // Check if were already connected to them p, _ := dht.Find(id) @@ -325,9 +315,7 @@ func (dht *IpfsDHT) findPeerMultiple(id peer.ID, timeout time.Duration) (*peer.P } // Ping a peer, log the time it took -func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { - ctx, _ := context.WithTimeout(context.TODO(), timeout) - +func (dht *IpfsDHT) Ping(ctx context.Context, p *peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? u.DOut("Enter Ping.\n") @@ -336,8 +324,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error { return err } -func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) { - ctx, _ := context.WithTimeout(context.TODO(), timeout) +func (dht *IpfsDHT) getDiagnostic(ctx context.Context) ([]*diagInfo, error) { u.DOut("Begin Diagnostic") peers := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) diff --git a/routing/routing.go b/routing/routing.go index 872bad6f8e..4669fb48c7 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -1,8 +1,6 @@ package routing import ( - "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" peer "github.com/jbenet/go-ipfs/peer" @@ -17,22 +15,22 @@ type IpfsRouting interface { // Basic Put/Get // PutValue adds value corresponding to given Key. - PutValue(key u.Key, value []byte) error + PutValue(context.Context, u.Key, []byte) error // GetValue searches for the value corresponding to given Key. - GetValue(key u.Key, timeout time.Duration) ([]byte, error) + GetValue(context.Context, u.Key) ([]byte, error) // Value provider layer of indirection. // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. // Announce that this node can provide value for given key - Provide(key u.Key) error + Provide(context.Context, u.Key) error // FindProviders searches for peers who can provide the value for given key. - FindProviders(key u.Key, timeout time.Duration) ([]*peer.Peer, error) + FindProviders(context.Context, u.Key) ([]*peer.Peer, error) // Find specific Peer // FindPeer searches for a peer with given ID. - FindPeer(id peer.ID, timeout time.Duration) (*peer.Peer, error) + FindPeer(context.Context, peer.ID) (*peer.Peer, error) } From 182d85427ed84818f9ea5ea09c2797be53bac786 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 21 Sep 2014 22:06:12 -0700 Subject: [PATCH 0143/3147] fix(routing:dht) implement FindProvidersAsync in terms of FindProviders until construction is complete on the actual async method reverts changes from ec50703395098f75946f0bad01816cc54ab18a58 https://github.com/jbenet/go-ipfs/commit/ec50703395098f75946f0bad01816cc54ab18a58 This commit was moved from ipfs/go-ipfs-routing@b20ad05062044669c196fed343941760419ed19d --- routing/dht/routing.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9f4a916e72..762a8cfd97 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -115,8 +115,26 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { return nil } -// FindProvidersAsync runs FindProviders and sends back results over a channel +// NB: not actually async. Used to keep the interface consistent while the +// actual async method, FindProvidersAsync2 is under construction func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan *peer.Peer { + ch := make(chan *peer.Peer) + providers, err := dht.FindProviders(ctx, key) + if err != nil { + close(ch) + return ch + } + go func() { + defer close(ch) + for _, p := range providers { + ch <- p + } + }() + return ch +} + +// FIXME: there's a bug here! +func (dht *IpfsDHT) FindProvidersAsync2(ctx context.Context, key u.Key, count int) <-chan *peer.Peer { peerOut := make(chan *peer.Peer, count) go func() { ps := newPeerSet() From 23bd11cd78c2a3cefb6880de7284b29fd419a514 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 21 Sep 2014 02:26:23 -0700 Subject: [PATCH 0144/3147] fix(exch) name the error This commit was moved from ipfs/go-ipfs-exchange-offline@392991c6227e2f292d48b9fe16ec3aef6701433c --- exchange/offline/offline.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 9695b0b568..2a7527f56c 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -10,6 +10,8 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +var OfflineMode = errors.New("Block unavailable. Operating in offline mode") + func NewOfflineExchange() exchange.Interface { return &offlineExchange{} } @@ -23,7 +25,7 @@ type offlineExchange struct { // given key. // NB: This function may return before the timeout expires. func (_ *offlineExchange) Block(context.Context, u.Key) (*blocks.Block, error) { - return nil, errors.New("Block unavailable. Operating in offline mode") + return nil, OfflineMode } // HasBlock always returns nil. From 95df066118f4aad8b89f2274529fd8f81663ea69 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 22 Sep 2014 03:41:56 -0700 Subject: [PATCH 0145/3147] fix(routing:dht) add ctx args This commit was moved from ipfs/go-ipfs-routing@03d6fd4a2b008fb9e6ddcfe26e937a54d8ec837b --- routing/dht/dht_test.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 675d80dde2..7ad439ebb7 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -109,13 +109,14 @@ func TestPing(t *testing.T) { defer dhtA.network.Close() defer dhtB.network.Close() - _, err = dhtA.Connect(peerB) + _, err = dhtA.Connect(context.Background(), peerB) if err != nil { t.Fatal(err) } //Test that we can ping the node - err = dhtA.Ping(peerB, time.Second*2) + ctx, _ := context.WithTimeout(context.Background(), 2*time.Millisecond) + err = dhtA.Ping(ctx, peerB) if err != nil { t.Fatal(err) } @@ -145,7 +146,7 @@ func TestValueGetSet(t *testing.T) { defer dhtA.network.Close() defer dhtB.network.Close() - _, err = dhtA.Connect(peerB) + _, err = dhtA.Connect(context.Background(), peerB) if err != nil { t.Fatal(err) } @@ -178,17 +179,17 @@ func TestProvides(t *testing.T) { } }() - _, err := dhts[0].Connect(peers[1]) + _, err := dhts[0].Connect(context.Background(), peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(peers[2]) + _, err = dhts[1].Connect(context.Background(), peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(peers[3]) + _, err = dhts[1].Connect(context.Background(), peers[3]) if err != nil { t.Fatal(err) } @@ -203,7 +204,7 @@ func TestProvides(t *testing.T) { t.Fatal(err) } - err = dhts[3].Provide(u.Key("hello")) + err = dhts[3].Provide(context.Background(), u.Key("hello")) if err != nil { t.Fatal(err) } @@ -234,17 +235,17 @@ func TestProvidesAsync(t *testing.T) { } }() - _, err := dhts[0].Connect(peers[1]) + _, err := dhts[0].Connect(context.Background(), peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(peers[2]) + _, err = dhts[1].Connect(context.Background(), peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(peers[3]) + _, err = dhts[1].Connect(context.Background(), peers[3]) if err != nil { t.Fatal(err) } @@ -259,7 +260,7 @@ func TestProvidesAsync(t *testing.T) { t.Fatal(err) } - err = dhts[3].Provide(u.Key("hello")) + err = dhts[3].Provide(context.Background(), u.Key("hello")) if err != nil { t.Fatal(err) } @@ -290,17 +291,17 @@ func TestLayeredGet(t *testing.T) { } }() - _, err := dhts[0].Connect(peers[1]) + _, err := dhts[0].Connect(context.Background(), peers[1]) if err != nil { t.Fatalf("Failed to connect: %s", err) } - _, err = dhts[1].Connect(peers[2]) + _, err = dhts[1].Connect(context.Background(), peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(peers[3]) + _, err = dhts[1].Connect(context.Background(), peers[3]) if err != nil { t.Fatal(err) } @@ -310,7 +311,7 @@ func TestLayeredGet(t *testing.T) { t.Fatal(err) } - err = dhts[3].Provide(u.Key("hello")) + err = dhts[3].Provide(context.Background(), u.Key("hello")) if err != nil { t.Fatal(err) } @@ -342,17 +343,17 @@ func TestFindPeer(t *testing.T) { } }() - _, err := dhts[0].Connect(peers[1]) + _, err := dhts[0].Connect(context.Background(), peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(peers[2]) + _, err = dhts[1].Connect(context.Background(), peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(peers[3]) + _, err = dhts[1].Connect(context.Background(), peers[3]) if err != nil { t.Fatal(err) } From 297384d5ebb24e264b60a30372af63031f8c7aad Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 22 Sep 2014 15:53:37 -0700 Subject: [PATCH 0146/3147] better logging for ping This commit was moved from ipfs/go-ipfs-routing@86e5c1448bf39a11eee2a1e6a8c34ccd1b3912ba --- routing/dht/routing.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 762a8cfd97..164e6ee3a9 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -335,10 +335,11 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(ctx context.Context, p *peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? - u.DOut("Enter Ping.\n") + u.DOut("[%s] ping %s start\n", dht.self.ID.Pretty(), p.ID.Pretty()) pmes := newMessage(Message_PING, "", 0) _, err := dht.sendRequest(ctx, p, pmes) + u.DOut("[%s] ping %s end (err = %s)\n", dht.self.ID.Pretty(), p.ID.Pretty(), err) return err } From 1a91bd8c33f85da49b891fc94024b8d4f3ef1b56 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Sep 2014 19:22:04 -0700 Subject: [PATCH 0147/3147] turn logging on by default, also make Provide not fail when no peers connected This commit was moved from ipfs/go-ipfs-routing@c32602a7632e23e724a3c915cdf412b8f63cfef3 --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 164e6ee3a9..a057ca8284 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -194,7 +194,7 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, u.DOut("Find providers for: '%s'\n", key) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { - return nil, kb.ErrLookupFailure + return nil, nil } for level := 0; level < len(dht.routingTables); { From 4245ffe6dae6c76d36b4595acc9bc7198c416d67 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Sep 2014 22:34:30 -0700 Subject: [PATCH 0148/3147] make a few tests perform operations in two directions instead of one This commit was moved from ipfs/go-ipfs-routing@6265fa8e537c957e8c25c96fddc88d5504dc9517 --- routing/dht/dht_test.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 7ad439ebb7..1f41e754ac 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -115,11 +115,17 @@ func TestPing(t *testing.T) { } //Test that we can ping the node - ctx, _ := context.WithTimeout(context.Background(), 2*time.Millisecond) + ctx, _ := context.WithTimeout(context.Background(), 5*time.Millisecond) err = dhtA.Ping(ctx, peerB) if err != nil { t.Fatal(err) } + + ctx, _ = context.WithTimeout(context.Background(), 5*time.Millisecond) + err = dhtB.Ping(ctx, peerA) + if err != nil { + t.Fatal(err) + } } func TestValueGetSet(t *testing.T) { @@ -164,6 +170,15 @@ func TestValueGetSet(t *testing.T) { t.Fatalf("Expected 'world' got '%s'", string(val)) } + ctxT, _ = context.WithTimeout(context.Background(), time.Second*2) + val, err = dhtB.GetValue(ctxT, "hello") + if err != nil { + t.Fatal(err) + } + + if string(val) != "world" { + t.Fatalf("Expected 'world' got '%s'", string(val)) + } } func TestProvides(t *testing.T) { From 754b5030e8b48ea0517d3f1fd1e6bc9dee6abca4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Sep 2014 05:21:35 -0700 Subject: [PATCH 0149/3147] ping: return sme msg This fixes the broken pinging. (the issue was the cluster level, it's bein set incorrectly (off by one)) Anyway, this works now: [peer: QmfQTbC3LxfpK5WoyHW2WgnAzo6d6GePuq2wHTsJNXM5PS] Sent message type: 'PING' [to = QmNXUeFrV9gxR4aqJddEsfhWZLSJrUsfpUSeRb3R7xvSp9] [QmfQTbC3LxfpK5WoyHW2WgnAzo6d6GePuq2wHTsJNXM5PS] ping QmNXUeFrV9gxR4aqJddEsfhWZLSJrUsfpUSeRb3R7xvSp9 end (err = %!s()) cc @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@1f77bb3ac6d1119315a60c4ca74d54fd30fe2aac --- routing/dht/handlers.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index fe22121bb2..4301d1e4e9 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -104,8 +104,7 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) - - return newMessage(pmes.GetType(), "", int(pmes.GetClusterLevel())), nil + return pmes, nil } func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { From ff3367ccbc8c56e7093e92e865d571dcbd05fb67 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Sep 2014 21:11:06 -0700 Subject: [PATCH 0150/3147] implement a mock dht for use in testing This commit was moved from ipfs/go-ipfs-routing@f91d5225d8258026b914c0512b5fccfd680c6633 --- routing/mock/routing.go | 130 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 routing/mock/routing.go diff --git a/routing/mock/routing.go b/routing/mock/routing.go new file mode 100644 index 0000000000..c239c634ea --- /dev/null +++ b/routing/mock/routing.go @@ -0,0 +1,130 @@ +package mockrouter + +import ( + "errors" + "math/rand" + "sync" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + peer "github.com/jbenet/go-ipfs/peer" + routing "github.com/jbenet/go-ipfs/routing" + u "github.com/jbenet/go-ipfs/util" +) + +var _ routing.IpfsRouting = &MockRouter{} + +type MockRouter struct { + datastore ds.Datastore + hashTable RoutingServer + peer *peer.Peer +} + +func NewMockRouter(local *peer.Peer, dstore ds.Datastore) *MockRouter { + return &MockRouter{ + datastore: dstore, + peer: local, + hashTable: VirtualRoutingServer(), + } +} + +func (mr *MockRouter) SetRoutingServer(rs RoutingServer) { + mr.hashTable = rs +} + +func (mr *MockRouter) PutValue(ctx context.Context, key u.Key, val []byte) error { + return mr.datastore.Put(ds.NewKey(string(key)), val) +} + +func (mr *MockRouter) GetValue(ctx context.Context, key u.Key) ([]byte, error) { + v, err := mr.datastore.Get(ds.NewKey(string(key))) + if err != nil { + return nil, err + } + + data, ok := v.([]byte) + if !ok { + return nil, errors.New("could not cast value from datastore") + } + + return data, nil +} + +func (mr *MockRouter) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, error) { + return nil, nil +} + +func (mr *MockRouter) FindPeer(ctx context.Context, pid peer.ID) (*peer.Peer, error) { + return nil, nil +} + +func (mr *MockRouter) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan *peer.Peer { + out := make(chan *peer.Peer) + go func() { + defer close(out) + for i, p := range mr.hashTable.Providers(k) { + if max <= i { + return + } + select { + case out <- p: + case <-ctx.Done(): + return + } + } + }() + return out +} + +func (mr *MockRouter) Provide(_ context.Context, key u.Key) error { + return mr.hashTable.Announce(mr.peer, key) +} + +type RoutingServer interface { + Announce(*peer.Peer, u.Key) error + + Providers(u.Key) []*peer.Peer +} + +func VirtualRoutingServer() RoutingServer { + return &hashTable{ + providers: make(map[u.Key]peer.Map), + } +} + +type hashTable struct { + lock sync.RWMutex + providers map[u.Key]peer.Map +} + +func (rs *hashTable) Announce(p *peer.Peer, k u.Key) error { + rs.lock.Lock() + defer rs.lock.Unlock() + + _, ok := rs.providers[k] + if !ok { + rs.providers[k] = make(peer.Map) + } + rs.providers[k][p.Key()] = p + return nil +} + +func (rs *hashTable) Providers(k u.Key) []*peer.Peer { + rs.lock.RLock() + defer rs.lock.RUnlock() + ret := make([]*peer.Peer, 0) + peerset, ok := rs.providers[k] + if !ok { + return ret + } + for _, peer := range peerset { + ret = append(ret, peer) + } + + for i := range ret { + j := rand.Intn(i + 1) + ret[i], ret[j] = ret[j], ret[i] + } + + return ret +} From a5de1f52a12be0c76d87096da0e2aa8716cdc024 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 23 Sep 2014 11:45:02 -0700 Subject: [PATCH 0151/3147] change back to using Client method This commit was moved from ipfs/go-ipfs-routing@0febff309e1df0a737bf918caf41e89037df75cd --- routing/mock/routing.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/routing/mock/routing.go b/routing/mock/routing.go index c239c634ea..43aecf269c 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -20,7 +20,7 @@ type MockRouter struct { peer *peer.Peer } -func NewMockRouter(local *peer.Peer, dstore ds.Datastore) *MockRouter { +func NewMockRouter(local *peer.Peer, dstore ds.Datastore) routing.IpfsRouting { return &MockRouter{ datastore: dstore, peer: local, @@ -84,6 +84,8 @@ type RoutingServer interface { Announce(*peer.Peer, u.Key) error Providers(u.Key) []*peer.Peer + + Client(p *peer.Peer) routing.IpfsRouting } func VirtualRoutingServer() RoutingServer { @@ -128,3 +130,10 @@ func (rs *hashTable) Providers(k u.Key) []*peer.Peer { return ret } + +func (rs *hashTable) Client(p *peer.Peer) routing.IpfsRouting { + return &MockRouter{ + peer: p, + hashTable: rs, + } +} From 635c1e6fa252ce62bd2f4e2d40ebc0d28ba461c8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 23 Sep 2014 14:08:37 -0700 Subject: [PATCH 0152/3147] move mock routing tests to proper directory This commit was moved from ipfs/go-ipfs-routing@f386e017e2dceb5c139f45daf7fa19aa4bcfca66 --- routing/mock/routing.go | 2 +- routing/mock/routing_test.go | 154 +++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 routing/mock/routing_test.go diff --git a/routing/mock/routing.go b/routing/mock/routing.go index 43aecf269c..e5fdb96fca 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -1,4 +1,4 @@ -package mockrouter +package mock import ( "errors" diff --git a/routing/mock/routing_test.go b/routing/mock/routing_test.go new file mode 100644 index 0000000000..650f5d3d59 --- /dev/null +++ b/routing/mock/routing_test.go @@ -0,0 +1,154 @@ +package mock + +import ( + "bytes" + "testing" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) + +func TestKeyNotFound(t *testing.T) { + + vrs := VirtualRoutingServer() + empty := vrs.Providers(u.Key("not there")) + if len(empty) != 0 { + t.Fatal("should be empty") + } +} + +func TestSetAndGet(t *testing.T) { + pid := peer.ID([]byte("the peer id")) + p := &peer.Peer{ + ID: pid, + } + k := u.Key("42") + rs := VirtualRoutingServer() + err := rs.Announce(p, k) + if err != nil { + t.Fatal(err) + } + providers := rs.Providers(k) + if len(providers) != 1 { + t.Fatal("should be one") + } + for _, elem := range providers { + if bytes.Equal(elem.ID, pid) { + return + } + } + t.Fatal("ID should have matched") +} + +func TestClientFindProviders(t *testing.T) { + peer := &peer.Peer{ID: []byte("42")} + rs := VirtualRoutingServer() + client := rs.Client(peer) + + k := u.Key("hello") + err := client.Provide(context.Background(), k) + if err != nil { + t.Fatal(err) + } + max := 100 + + providersFromHashTable := rs.Providers(k) + + isInHT := false + for _, p := range providersFromHashTable { + if bytes.Equal(p.ID, peer.ID) { + isInHT = true + } + } + if !isInHT { + t.Fatal("Despite client providing key, peer wasn't in hash table as a provider") + } + providersFromClient := client.FindProvidersAsync(context.Background(), u.Key("hello"), max) + isInClient := false + for p := range providersFromClient { + if bytes.Equal(p.ID, peer.ID) { + isInClient = true + } + } + if !isInClient { + t.Fatal("Despite client providing key, client didn't receive peer when finding providers") + } +} + +func TestClientOverMax(t *testing.T) { + rs := VirtualRoutingServer() + k := u.Key("hello") + numProvidersForHelloKey := 100 + for i := 0; i < numProvidersForHelloKey; i++ { + peer := &peer.Peer{ + ID: []byte(string(i)), + } + err := rs.Announce(peer, k) + if err != nil { + t.Fatal(err) + } + } + providersFromHashTable := rs.Providers(k) + if len(providersFromHashTable) != numProvidersForHelloKey { + t.Log(1 == len(providersFromHashTable)) + t.Fatal("not all providers were returned") + } + + max := 10 + peer := &peer.Peer{ID: []byte("TODO")} + client := rs.Client(peer) + + providersFromClient := client.FindProvidersAsync(context.Background(), k, max) + i := 0 + for _ = range providersFromClient { + i++ + } + if i != max { + t.Fatal("Too many providers returned") + } +} + +// TODO does dht ensure won't receive self as a provider? probably not. +func TestCanceledContext(t *testing.T) { + rs := VirtualRoutingServer() + k := u.Key("hello") + + t.Log("async'ly announce infinite stream of providers for key") + i := 0 + go func() { // infinite stream + for { + peer := &peer.Peer{ + ID: []byte(string(i)), + } + err := rs.Announce(peer, k) + if err != nil { + t.Fatal(err) + } + i++ + } + }() + + local := &peer.Peer{ID: []byte("peer id doesn't matter")} + client := rs.Client(local) + + t.Log("warning: max is finite so this test is non-deterministic") + t.Log("context cancellation could simply take lower priority") + t.Log("and result in receiving the max number of results") + max := 1000 + + t.Log("cancel the context before consuming") + ctx, cancelFunc := context.WithCancel(context.Background()) + cancelFunc() + providers := client.FindProvidersAsync(ctx, k, max) + + numProvidersReturned := 0 + for _ = range providers { + numProvidersReturned++ + } + t.Log(numProvidersReturned) + + if numProvidersReturned == max { + t.Fatal("Context cancel had no effect") + } +} From e7b3ec8f190b8014dba4e16235b4578d3571eba9 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 22 Sep 2014 14:04:41 -0400 Subject: [PATCH 0153/3147] feat(net:service, routing) remove error return value This commit was moved from ipfs/go-ipfs-routing@ee17430ae255f391e3d490f2a7e26059d0cff669 --- routing/dht/dht.go | 24 +++++++++++++++--------- routing/dht/ext_test.go | 5 +---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 507c19c3f5..8ebecd5bd8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -103,23 +103,26 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer *peer.Peer) (*peer.Peer, } // HandleMessage implements the inet.Handler interface. -func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg.NetMessage, error) { +func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.NetMessage { mData := mes.Data() if mData == nil { - return nil, errors.New("message did not include Data") + // TODO handle/log err + return nil } mPeer := mes.Peer() if mPeer == nil { - return nil, errors.New("message did not include a Peer") + // TODO handle/log err + return nil } // deserialize msg pmes := new(Message) err := proto.Unmarshal(mData, pmes) if err != nil { - return nil, fmt.Errorf("Failed to decode protobuf message: %v\n", err) + // TODO handle/log err + return nil } // update the peer (on valid msgs only) @@ -133,27 +136,30 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) (msg. // get handler for this msg type. handler := dht.handlerForMsgType(pmes.GetType()) if handler == nil { - return nil, errors.New("Recieved invalid message type") + // TODO handle/log err + return nil } // dispatch handler. rpmes, err := handler(mPeer, pmes) if err != nil { - return nil, err + // TODO handle/log err + return nil } // if nil response, return it before serializing if rpmes == nil { - return nil, nil + return nil } // serialize response msg rmes, err := msg.FromObject(mPeer, rpmes) if err != nil { - return nil, fmt.Errorf("Failed to encode protobuf message: %v\n", err) + // TODO handle/log err + return nil } - return rmes, nil + return rmes } // sendRequest sends out a request using dht.sender, but also makes sure to diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 07999e651a..f8b9293a87 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -161,10 +161,7 @@ func TestGetFailures(t *testing.T) { t.Error(err) } - mes, err = d.HandleMessage(ctx, mes) - if err != nil { - t.Error(err) - } + mes = d.HandleMessage(ctx, mes) pmes := new(Message) err = proto.Unmarshal(mes.Data(), pmes) From 19c5d9912a2a5bbd5c428081e052dc281cf54d0f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 26 Sep 2014 02:09:48 -0700 Subject: [PATCH 0154/3147] update net with peerstore This commit was moved from ipfs/go-ipfs-routing@dfb0add1faff06479aa6f96dc7f4606fc97232a5 --- routing/dht/dht_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1f41e754ac..1bbc62cdc0 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -31,7 +31,7 @@ func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { t.Fatal(err) } - net, err := inet.NewIpfsNetwork(ctx, p, &mux.ProtocolMap{ + net, err := inet.NewIpfsNetwork(ctx, p, peerstore, &mux.ProtocolMap{ mux.ProtocolID_Routing: dhts, }) if err != nil { From ab879ffdc0562a8a866df2c405ce8a91fa302cca Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 27 Sep 2014 16:02:50 -0700 Subject: [PATCH 0155/3147] udpated commands and RPC dialing to work with new configuration changes This commit was moved from ipfs/go-ipfs-routing@a4f725dea53b8b7958a771798f8cc71788b2bd70 --- routing/dht/routing.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index a057ca8284..66ae098487 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -59,7 +59,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { routeLevel := 0 closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { - return nil, kb.ErrLookupFailure + return nil, nil } // setup the Query @@ -101,7 +101,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { dht.providers.AddProvider(key, dht.self) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { - return kb.ErrLookupFailure + return nil } //TODO FIX: this doesn't work! it needs to be sent to the actual nearest peers. @@ -245,7 +245,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error routeLevel := 0 p = dht.routingTables[routeLevel].NearestPeer(kb.ConvertPeerID(id)) if p == nil { - return nil, kb.ErrLookupFailure + return nil, nil } if p.ID.Equal(id) { return p, nil @@ -287,7 +287,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee routeLevel := 0 peers := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { - return nil, kb.ErrLookupFailure + return nil, nil } // setup query function From 556b935c0aed82080c6d4801ec127abff021984f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 10 Sep 2014 16:55:49 +0000 Subject: [PATCH 0156/3147] implement namesys resolvers (thanks to bren2010 for dns and proquint) This commit was moved from ipfs/go-namesys@59eb2350afba56e0461dda65fd0999e7e17d513e --- namesys/dns.go | 33 +++++++++++++++++++ namesys/entry.pb.go | 48 +++++++++++++++++++++++++++ namesys/entry.proto | 6 ++++ namesys/nsresolver.go | 5 +++ namesys/proquint.go | 22 +++++++++++++ namesys/resolver.go | 21 ++++++++++++ namesys/routing.go | 77 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 212 insertions(+) create mode 100644 namesys/dns.go create mode 100644 namesys/entry.pb.go create mode 100644 namesys/entry.proto create mode 100644 namesys/nsresolver.go create mode 100644 namesys/proquint.go create mode 100644 namesys/resolver.go create mode 100644 namesys/routing.go diff --git a/namesys/dns.go b/namesys/dns.go new file mode 100644 index 0000000000..b12bc0d38a --- /dev/null +++ b/namesys/dns.go @@ -0,0 +1,33 @@ +package namesys + +import ( + "net" + "strings" + + u "github.com/jbenet/go-ipfs/util" +) + +type DNSResolver struct { + // TODO: maybe some sort of caching? + // cache would need a timeout +} + +func (r *DNSResolver) Resolve(name string) (string, error) { + txt, err := net.LookupTXT(name) + if err != nil { + return "", err + } + + for _, t := range txt { + pair := strings.Split(t, "=") + if len(pair) < 2 { + // Log error? + u.DErr("Incorrectly formatted text record.") + continue + } + if pair[0] == name { + return pair[1], nil + } + } + return "", u.ErrNotFound +} diff --git a/namesys/entry.pb.go b/namesys/entry.pb.go new file mode 100644 index 0000000000..c05efeb2f2 --- /dev/null +++ b/namesys/entry.pb.go @@ -0,0 +1,48 @@ +// Code generated by protoc-gen-go. +// source: entry.proto +// DO NOT EDIT! + +/* +Package namesys is a generated protocol buffer package. + +It is generated from these files: + entry.proto + +It has these top-level messages: + InpsEntry +*/ +package namesys + +import proto "code.google.com/p/goprotobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type InpsEntry struct { + Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *InpsEntry) Reset() { *m = InpsEntry{} } +func (m *InpsEntry) String() string { return proto.CompactTextString(m) } +func (*InpsEntry) ProtoMessage() {} + +func (m *InpsEntry) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *InpsEntry) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func init() { +} diff --git a/namesys/entry.proto b/namesys/entry.proto new file mode 100644 index 0000000000..b7b09f0417 --- /dev/null +++ b/namesys/entry.proto @@ -0,0 +1,6 @@ +package namesys; + +message InpsEntry { + required bytes value = 1; + required bytes signature = 2; +} diff --git a/namesys/nsresolver.go b/namesys/nsresolver.go new file mode 100644 index 0000000000..ef5bc65cbd --- /dev/null +++ b/namesys/nsresolver.go @@ -0,0 +1,5 @@ +package namesys + +type NSResolver interface { + Resolve(string) (string, error) +} diff --git a/namesys/proquint.go b/namesys/proquint.go new file mode 100644 index 0000000000..8583a53908 --- /dev/null +++ b/namesys/proquint.go @@ -0,0 +1,22 @@ +package namesys + +import ( + "errors" + + proquint "github.com/bren2010/proquint" +) + +var _ = proquint.Encode + +type ProquintResolver struct{} + +func (r *ProquintResolver) Resolve(name string) (string, error) { + ok, err := proquint.IsProquint(name) + if err != nil { + return "", err + } + if !ok { + return "", errors.New("not a valid proquint string") + } + return string(proquint.Decode(name)), nil +} diff --git a/namesys/resolver.go b/namesys/resolver.go new file mode 100644 index 0000000000..3498cbd463 --- /dev/null +++ b/namesys/resolver.go @@ -0,0 +1,21 @@ +package namesys + +import "strings" + +type MasterResolver struct { + dns *DNSResolver + routing *RoutingResolver + pro *ProquintResolver +} + +func (mr *MasterResolver) Resolve(name string) (string, error) { + if strings.Contains(name, ".") { + return mr.dns.Resolve(name) + } + + if strings.Contains(name, "-") { + return mr.pro.Resolve(name) + } + + return mr.routing.Resolve(name) +} diff --git a/namesys/routing.go b/namesys/routing.go new file mode 100644 index 0000000000..f37b6485fd --- /dev/null +++ b/namesys/routing.go @@ -0,0 +1,77 @@ +package namesys + +import ( + "fmt" + "time" + + "code.google.com/p/goprotobuf/proto" + + ci "github.com/jbenet/go-ipfs/crypto" + mdag "github.com/jbenet/go-ipfs/merkledag" + "github.com/jbenet/go-ipfs/routing" + u "github.com/jbenet/go-ipfs/util" + mh "github.com/jbenet/go-multihash" +) + +// RoutingName is the de-serialized name structure that is stored (serialized) +// in the routing system. Basically, a hash + a digital signature. (serialization can be +// protobuf, or a simple binary format) +type RoutingName struct { + Hash u.Key + Signature []byte +} + +// RoutingResolver implements NSResolver for the main IPFS SFS-like naming +type RoutingResolver struct { + routing routing.IpfsRouting + dag mdag.DAGService +} + +func (r *RoutingResolver) Resolve(name string) (string, error) { + hash, err := mh.FromB58String(name) + if err != nil { + return "", err + } + // name should be a multihash. if it isn't, error out here. + + // use the routing system to get the name. + // /ipns/ + h, err := u.Hash([]byte("ipns:" + name)) + if err != nil { + return "", err + } + + inpsKey := u.Key(h) + val, err := r.routing.GetValue(inpsKey, time.Second*10) + if err != nil { + return "", err + } + + entry := new(InpsEntry) + err = proto.Unmarshal(val, entry) + if err != nil { + return "", err + } + + // name should be a public key retrievable from ipfs + // /ipfs/ + key := u.Key(hash) + node, err := r.dag.Get(key) + if err != nil { + return "", err + } + + // get PublicKey from node.Data + pk, err := ci.UnmarshalPublicKey(node.Data) + if err != nil { + return "", err + } + + // check sig with pk + if ok, err := pk.Verify(entry.GetValue(), entry.GetSignature()); err != nil && ok { + return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pk) + } + + // ok sig checks out. this is a valid name. + return string(entry.GetValue()), nil +} From c8e9c15b59ee4e314307302e11a466de0aa4fc3f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 10 Sep 2014 20:56:29 +0000 Subject: [PATCH 0157/3147] fixes to make interface more usable This commit was moved from ipfs/go-ipfs-routing@6b26888c7691d2c538b5e9c11304d9dd6ce62392 --- routing/dht/routing.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 66ae098487..16f74380b1 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -101,6 +101,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { dht.providers.AddProvider(key, dht.self) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { + // Early out for no targets return nil } From ac74870471e322666f4f47096160e41c92760710 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 12 Sep 2014 02:41:46 +0000 Subject: [PATCH 0158/3147] implement ipns publisher code This commit was moved from ipfs/go-namesys@771520354e26eba71474f246531c131c02510943 --- namesys/entry.pb.go | 14 +++++----- namesys/entry.proto | 2 +- namesys/publisher.go | 64 ++++++++++++++++++++++++++++++++++++++++++++ namesys/resolver.go | 15 ++++++++++- namesys/routing.go | 19 +++++++------ 5 files changed, 95 insertions(+), 19 deletions(-) create mode 100644 namesys/publisher.go diff --git a/namesys/entry.pb.go b/namesys/entry.pb.go index c05efeb2f2..e4420e9f97 100644 --- a/namesys/entry.pb.go +++ b/namesys/entry.pb.go @@ -9,7 +9,7 @@ It is generated from these files: entry.proto It has these top-level messages: - InpsEntry + IpnsEntry */ package namesys @@ -20,24 +20,24 @@ import math "math" var _ = proto.Marshal var _ = math.Inf -type InpsEntry struct { +type IpnsEntry struct { Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *InpsEntry) Reset() { *m = InpsEntry{} } -func (m *InpsEntry) String() string { return proto.CompactTextString(m) } -func (*InpsEntry) ProtoMessage() {} +func (m *IpnsEntry) Reset() { *m = IpnsEntry{} } +func (m *IpnsEntry) String() string { return proto.CompactTextString(m) } +func (*IpnsEntry) ProtoMessage() {} -func (m *InpsEntry) GetValue() []byte { +func (m *IpnsEntry) GetValue() []byte { if m != nil { return m.Value } return nil } -func (m *InpsEntry) GetSignature() []byte { +func (m *IpnsEntry) GetSignature() []byte { if m != nil { return m.Signature } diff --git a/namesys/entry.proto b/namesys/entry.proto index b7b09f0417..fee830d7eb 100644 --- a/namesys/entry.proto +++ b/namesys/entry.proto @@ -1,6 +1,6 @@ package namesys; -message InpsEntry { +message IpnsEntry { required bytes value = 1; required bytes signature = 2; } diff --git a/namesys/publisher.go b/namesys/publisher.go new file mode 100644 index 0000000000..4588ccb6a8 --- /dev/null +++ b/namesys/publisher.go @@ -0,0 +1,64 @@ +package namesys + +import ( + "code.google.com/p/goprotobuf/proto" + + ci "github.com/jbenet/go-ipfs/crypto" + mdag "github.com/jbenet/go-ipfs/merkledag" + routing "github.com/jbenet/go-ipfs/routing" + u "github.com/jbenet/go-ipfs/util" +) + +type IpnsPublisher struct { + dag *mdag.DAGService + routing routing.IpfsRouting +} + +// Publish accepts a keypair and a value, +func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { + data, err := CreateEntryData(k, value) + if err != nil { + return err + } + pubkey := k.GetPublic() + pkbytes, err := pubkey.Bytes() + if err != nil { + return nil + } + + nameb, err := u.Hash(pkbytes) + if err != nil { + return nil + } + namekey := u.Key(nameb).Pretty() + + ipnskey, err := u.Hash([]byte("ipns:" + namekey)) + if err != nil { + return err + } + + // Store associated public key + err = p.routing.PutValue(u.Key(nameb), pkbytes) + if err != nil { + return err + } + + // Store ipns entry at h("ipns:"+b58(h(pubkey))) + err = p.routing.PutValue(u.Key(ipnskey), data) + if err != nil { + return err + } + + return nil +} + +func CreateEntryData(pk ci.PrivKey, val u.Key) ([]byte, error) { + entry := new(IpnsEntry) + sig, err := pk.Sign([]byte(val)) + if err != nil { + return nil, err + } + entry.Signature = sig + entry.Value = []byte(val) + return proto.Marshal(entry) +} diff --git a/namesys/resolver.go b/namesys/resolver.go index 3498cbd463..e440946b98 100644 --- a/namesys/resolver.go +++ b/namesys/resolver.go @@ -1,6 +1,11 @@ package namesys -import "strings" +import ( + "strings" + + mdag "github.com/jbenet/go-ipfs/merkledag" + "github.com/jbenet/go-ipfs/routing" +) type MasterResolver struct { dns *DNSResolver @@ -8,6 +13,14 @@ type MasterResolver struct { pro *ProquintResolver } +func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver { + mr := new(MasterResolver) + mr.dns = new(DNSResolver) + mr.pro = new(ProquintResolver) + mr.routing = NewRoutingResolver(r, dag) + return mr +} + func (mr *MasterResolver) Resolve(name string) (string, error) { if strings.Contains(name, ".") { return mr.dns.Resolve(name) diff --git a/namesys/routing.go b/namesys/routing.go index f37b6485fd..ff0c2df397 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,18 +13,17 @@ import ( mh "github.com/jbenet/go-multihash" ) -// RoutingName is the de-serialized name structure that is stored (serialized) -// in the routing system. Basically, a hash + a digital signature. (serialization can be -// protobuf, or a simple binary format) -type RoutingName struct { - Hash u.Key - Signature []byte -} - // RoutingResolver implements NSResolver for the main IPFS SFS-like naming type RoutingResolver struct { routing routing.IpfsRouting - dag mdag.DAGService + dag *mdag.DAGService +} + +func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) *RoutingResolver { + return &RoutingResolver{ + routing: route, + dag: dagservice, + } } func (r *RoutingResolver) Resolve(name string) (string, error) { @@ -47,7 +46,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { return "", err } - entry := new(InpsEntry) + entry := new(IpnsEntry) err = proto.Unmarshal(val, entry) if err != nil { return "", err From 9c0f349ae3f1491e8f1472c46e23a12b08d2017b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 11 Sep 2014 19:12:14 +0000 Subject: [PATCH 0159/3147] some bugfixes and added logging This commit was moved from ipfs/go-ipfs-routing@209a5c9b35bc05e6d6313ecfad47852ad7eb10bd --- routing/dht/routing.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 16f74380b1..3d7a4bf0a7 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -152,15 +152,14 @@ func (dht *IpfsDHT) FindProvidersAsync2(ctx context.Context, key u.Key, count in peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) for _, pp := range peers { - ppp := pp - go func() { - pmes, err := dht.findProvidersSingle(ctx, ppp, key, 0) + go func(p *peer.Peer) { + pmes, err := dht.findProvidersSingle(p, key, 0, timeout) if err != nil { u.PErr("%v\n", err) return } - dht.addPeerListAsync(key, pmes.GetProviderPeers(), ps, count, peerOut) - }() + dht.addPeerListAsync(key, pmes.GetPeers(), ps, count, peerOut) + }(pp) } }() From 46077b36f459c5da8cba88e1db51e4e9684a8d42 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 12 Sep 2014 17:34:07 +0000 Subject: [PATCH 0160/3147] add routing resolver test This commit was moved from ipfs/go-namesys@fe8c47c89e1e8cb8c318ede9b546e250436bcdb7 --- namesys/nsresolver.go | 2 +- namesys/resolve_test.go | 66 +++++++++++++++++++++++++++++++++++++++++ namesys/routing.go | 7 +++-- 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 namesys/resolve_test.go diff --git a/namesys/nsresolver.go b/namesys/nsresolver.go index ef5bc65cbd..5dd9813306 100644 --- a/namesys/nsresolver.go +++ b/namesys/nsresolver.go @@ -1,5 +1,5 @@ package namesys -type NSResolver interface { +type Resolver interface { Resolve(string) (string, error) } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go new file mode 100644 index 0000000000..0620bd446e --- /dev/null +++ b/namesys/resolve_test.go @@ -0,0 +1,66 @@ +package namesys + +import ( + "testing" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + bs "github.com/jbenet/go-ipfs/blockservice" + ci "github.com/jbenet/go-ipfs/crypto" + mdag "github.com/jbenet/go-ipfs/merkledag" + "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/routing/dht" + "github.com/jbenet/go-ipfs/swarm" + u "github.com/jbenet/go-ipfs/util" +) + +func TestRoutingResolve(t *testing.T) { + local := &peer.Peer{ + ID: []byte("testID"), + } + net := swarm.NewSwarm(local) + lds := ds.NewMapDatastore() + d := dht.NewDHT(local, net, lds) + + bserv, err := bs.NewBlockService(lds, nil) + if err != nil { + t.Fatal(err) + } + + dag := &mdag.DAGService{Blocks: bserv} + + resolve := NewMasterResolver(d, dag) + + pub := IpnsPublisher{ + dag: dag, + routing: d, + } + + privk, pubk, err := ci.GenerateKeyPair(ci.RSA, 512) + if err != nil { + t.Fatal(err) + } + + err = pub.Publish(privk, u.Key("Hello")) + if err != nil { + t.Fatal(err) + } + + pubkb, err := pubk.Bytes() + if err != nil { + t.Fatal(err) + } + + pkhash, err := u.Hash(pubkb) + if err != nil { + t.Fatal(err) + } + + res, err := resolve.Resolve(u.Key(pkhash).Pretty()) + if err != nil { + t.Fatal(err) + } + + if res != "Hello" { + t.Fatal("Got back incorrect value.") + } +} diff --git a/namesys/routing.go b/namesys/routing.go index ff0c2df397..e667f5b68f 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -29,6 +29,7 @@ func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) func (r *RoutingResolver) Resolve(name string) (string, error) { hash, err := mh.FromB58String(name) if err != nil { + u.DOut("RoutingResolve: bad input hash: [%s]\n", name) return "", err } // name should be a multihash. if it isn't, error out here. @@ -43,6 +44,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { inpsKey := u.Key(h) val, err := r.routing.GetValue(inpsKey, time.Second*10) if err != nil { + u.DOut("RoutingResolve get failed.\n") return "", err } @@ -55,13 +57,14 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { // name should be a public key retrievable from ipfs // /ipfs/ key := u.Key(hash) - node, err := r.dag.Get(key) + pkval, err := r.routing.GetValue(key, time.Second*10) if err != nil { + u.DOut("RoutingResolve PubKey Get failed.\n") return "", err } // get PublicKey from node.Data - pk, err := ci.UnmarshalPublicKey(node.Data) + pk, err := ci.UnmarshalPublicKey(pkval) if err != nil { return "", err } From d8e683be9f2eab9978370800a9f5a50147731757 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 12 Sep 2014 17:34:07 +0000 Subject: [PATCH 0161/3147] add routing resolver test This commit was moved from ipfs/go-ipfs-routing@baa2eaae3558de348fdaa9793a0cb9d416f42417 --- routing/dht/routing.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3d7a4bf0a7..b2c4038032 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -17,10 +17,13 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { - peers := []*peer.Peer{} +func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { + err := dht.putLocal(key, value) + if err != nil { + return err + } - // get the peers we need to announce to + var peers []*peer.Peer for _, route := range dht.routingTables { npeers := route.NearestPeers(kb.ConvertKey(key), KValue) peers = append(peers, npeers...) From 1dd5b343ae43a249c90350f3d53736e8abc7c45e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 11 Sep 2014 02:20:04 +0000 Subject: [PATCH 0162/3147] make disconnects and reconnects work a little better This commit was moved from ipfs/go-path@70cdee43132325d10366536221874a881b59d845 --- path/path.go | 1 + 1 file changed, 1 insertion(+) diff --git a/path/path.go b/path/path.go index a06fb98cb2..eb5ce6660f 100644 --- a/path/path.go +++ b/path/path.go @@ -38,6 +38,7 @@ func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { // first element in the path is a b58 hash (for now) h, err := mh.FromB58String(parts[0]) if err != nil { + u.DOut("given path element is not a base58 string.\n") return nil, err } From 90b73a95fcebc5b724b4bd7e0309266364f541dd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 15 Sep 2014 20:32:37 +0000 Subject: [PATCH 0163/3147] address comments from the PR #45 This commit was moved from ipfs/go-namesys@17e28f4077be4d04f8cf06db1971fad2fdf32707 --- namesys/dns.go | 4 ++++ namesys/nsresolver.go | 1 + namesys/proquint.go | 5 +++++ namesys/publisher.go | 4 ++-- namesys/resolver.go | 34 +++++++++++++++++++++------------- namesys/routing.go | 13 +++++++++---- 6 files changed, 42 insertions(+), 19 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index b12bc0d38a..51e99ed78b 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -12,6 +12,10 @@ type DNSResolver struct { // cache would need a timeout } +func (r *DNSResolver) Matches(name string) bool { + return strings.Contains(name, ".") +} + func (r *DNSResolver) Resolve(name string) (string, error) { txt, err := net.LookupTXT(name) if err != nil { diff --git a/namesys/nsresolver.go b/namesys/nsresolver.go index 5dd9813306..c8d40dcb3d 100644 --- a/namesys/nsresolver.go +++ b/namesys/nsresolver.go @@ -2,4 +2,5 @@ package namesys type Resolver interface { Resolve(string) (string, error) + Matches(string) bool } diff --git a/namesys/proquint.go b/namesys/proquint.go index 8583a53908..8c4db27994 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -10,6 +10,11 @@ var _ = proquint.Encode type ProquintResolver struct{} +func (r *ProquintResolver) Matches(name string) bool { + ok, err := proquint.IsProquint(name) + return err == nil && ok +} + func (r *ProquintResolver) Resolve(name string) (string, error) { ok, err := proquint.IsProquint(name) if err != nil { diff --git a/namesys/publisher.go b/namesys/publisher.go index 4588ccb6a8..d64d7954b8 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -32,7 +32,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { } namekey := u.Key(nameb).Pretty() - ipnskey, err := u.Hash([]byte("ipns:" + namekey)) + ipnskey, err := u.Hash([]byte("/ipns/" + namekey)) if err != nil { return err } @@ -43,7 +43,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { return err } - // Store ipns entry at h("ipns:"+b58(h(pubkey))) + // Store ipns entry at h("/ipns/"+b58(h(pubkey))) err = p.routing.PutValue(u.Key(ipnskey), data) if err != nil { return err diff --git a/namesys/resolver.go b/namesys/resolver.go index e440946b98..2fedf210c0 100644 --- a/namesys/resolver.go +++ b/namesys/resolver.go @@ -1,34 +1,42 @@ package namesys import ( - "strings" + "errors" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/routing" ) +var ErrCouldntResolve = errors.New("could not resolve name.") + type MasterResolver struct { - dns *DNSResolver - routing *RoutingResolver - pro *ProquintResolver + res []Resolver } func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver { mr := new(MasterResolver) - mr.dns = new(DNSResolver) - mr.pro = new(ProquintResolver) - mr.routing = NewRoutingResolver(r, dag) + mr.res = []Resolver{ + new(DNSResolver), + new(ProquintResolver), + NewRoutingResolver(r, dag), + } return mr } func (mr *MasterResolver) Resolve(name string) (string, error) { - if strings.Contains(name, ".") { - return mr.dns.Resolve(name) + for _, r := range mr.res { + if r.Matches(name) { + return r.Resolve(name) + } } + return "", ErrCouldntResolve +} - if strings.Contains(name, "-") { - return mr.pro.Resolve(name) +func (mr *MasterResolver) Matches(name string) bool { + for _, r := range mr.res { + if r.Matches(name) { + return true + } } - - return mr.routing.Resolve(name) + return false } diff --git a/namesys/routing.go b/namesys/routing.go index e667f5b68f..5f85e942fb 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -26,6 +26,11 @@ func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) } } +func (r *RoutingResolver) Matches(name string) bool { + _, err := mh.FromB58String(name) + return err == nil +} + func (r *RoutingResolver) Resolve(name string) (string, error) { hash, err := mh.FromB58String(name) if err != nil { @@ -36,13 +41,13 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { // use the routing system to get the name. // /ipns/ - h, err := u.Hash([]byte("ipns:" + name)) + h, err := u.Hash([]byte("/ipns/" + name)) if err != nil { return "", err } - inpsKey := u.Key(h) - val, err := r.routing.GetValue(inpsKey, time.Second*10) + ipnsKey := u.Key(h) + val, err := r.routing.GetValue(ipnsKey, time.Second*10) if err != nil { u.DOut("RoutingResolve get failed.\n") return "", err @@ -70,7 +75,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { } // check sig with pk - if ok, err := pk.Verify(entry.GetValue(), entry.GetSignature()); err != nil && ok { + if ok, err := pk.Verify(entry.GetValue(), entry.GetSignature()); err != nil || !ok { return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pk) } From d4f1ce55641126e60c9cfd90829199cf499c2339 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 16 Sep 2014 03:44:53 +0000 Subject: [PATCH 0164/3147] Address concerns from PR This commit was moved from ipfs/go-namesys@7ef34bee76ecabd55909bbc5165bd37663fc14d1 --- namesys/proquint.go | 7 +------ namesys/resolver.go | 10 +++++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/namesys/proquint.go b/namesys/proquint.go index 8c4db27994..9b64f3fde5 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -6,8 +6,6 @@ import ( proquint "github.com/bren2010/proquint" ) -var _ = proquint.Encode - type ProquintResolver struct{} func (r *ProquintResolver) Matches(name string) bool { @@ -16,10 +14,7 @@ func (r *ProquintResolver) Matches(name string) bool { } func (r *ProquintResolver) Resolve(name string) (string, error) { - ok, err := proquint.IsProquint(name) - if err != nil { - return "", err - } + ok := r.Matches(name) if !ok { return "", errors.New("not a valid proquint string") } diff --git a/namesys/resolver.go b/namesys/resolver.go index 2fedf210c0..7765a4ba07 100644 --- a/namesys/resolver.go +++ b/namesys/resolver.go @@ -9,12 +9,12 @@ import ( var ErrCouldntResolve = errors.New("could not resolve name.") -type MasterResolver struct { +type masterResolver struct { res []Resolver } -func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver { - mr := new(MasterResolver) +func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) Resolver { + mr := new(masterResolver) mr.res = []Resolver{ new(DNSResolver), new(ProquintResolver), @@ -23,7 +23,7 @@ func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResol return mr } -func (mr *MasterResolver) Resolve(name string) (string, error) { +func (mr *masterResolver) Resolve(name string) (string, error) { for _, r := range mr.res { if r.Matches(name) { return r.Resolve(name) @@ -32,7 +32,7 @@ func (mr *MasterResolver) Resolve(name string) (string, error) { return "", ErrCouldntResolve } -func (mr *MasterResolver) Matches(name string) bool { +func (mr *masterResolver) Matches(name string) bool { for _, r := range mr.res { if r.Matches(name) { return true From f345e59c4e1f2ef87090cadc8afbdefa62df1798 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Sep 2014 15:14:19 -0700 Subject: [PATCH 0165/3147] catch ipns branch up to master and make all things compile This commit was moved from ipfs/go-ipfs-routing@01d68e36504e4152173e8330ababa31f73163d3e --- routing/dht/dht.go | 1 + routing/dht/routing.go | 16 ++++++---------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 8ebecd5bd8..11712338b5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -345,6 +345,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals to all routingTables to Update their last-seen status // on the given peer. func (dht *IpfsDHT) Update(p *peer.Peer) { + u.DOut("updating peer: [%s] latency = %f\n", p.ID.Pretty(), p.GetLatency().Seconds()) removedCount := 0 for _, route := range dht.routingTables { removed := route.Update(p) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b2c4038032..778aaba758 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -17,7 +17,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { +func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { err := dht.putLocal(key, value) if err != nil { return err @@ -38,7 +38,7 @@ func (dht *IpfsDHT) PutValue(key u.Key, value []byte) error { return &dhtQueryResult{success: true}, nil }) - _, err := query.Run(ctx, peers) + _, err = query.Run(ctx, peers) u.DOut("[%s] PutValue %v %v\n", dht.self.ID.Pretty(), key, value) return err } @@ -104,8 +104,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { dht.providers.AddProvider(key, dht.self) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { - // Early out for no targets - return nil + return kb.ErrLookupFailure } //TODO FIX: this doesn't work! it needs to be sent to the actual nearest peers. @@ -156,12 +155,12 @@ func (dht *IpfsDHT) FindProvidersAsync2(ctx context.Context, key u.Key, count in peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) for _, pp := range peers { go func(p *peer.Peer) { - pmes, err := dht.findProvidersSingle(p, key, 0, timeout) + pmes, err := dht.findProvidersSingle(ctx, p, key, 0) if err != nil { u.PErr("%v\n", err) return } - dht.addPeerListAsync(key, pmes.GetPeers(), ps, count, peerOut) + dht.addPeerListAsync(key, pmes.GetProviderPeers(), ps, count, peerOut) }(pp) } @@ -190,11 +189,8 @@ func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet // FindProviders searches for peers who can provide the value for given key. func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, error) { - ll := startNewRPC("FindProviders") - ll.EndAndPrint() - // get closest peer - u.DOut("Find providers for: '%s'\n", key) + u.DOut("Find providers for: '%s'\n", key.Pretty()) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, nil From 7176bb48e4e5878304380de5b67bf9dc6748ec17 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Sep 2014 15:14:19 -0700 Subject: [PATCH 0166/3147] catch ipns branch up to master and make all things compile This commit was moved from ipfs/go-namesys@eaf0d669c794dba127b64db1a8164a6888ccfd7a --- namesys/dns.go | 18 ++++++++++++------ namesys/publisher.go | 6 ++++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 16 ++++++++++------ 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 51e99ed78b..55d00f9451 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -4,6 +4,8 @@ import ( "net" "strings" + b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" u "github.com/jbenet/go-ipfs/util" ) @@ -16,6 +18,8 @@ func (r *DNSResolver) Matches(name string) bool { return strings.Contains(name, ".") } +// TXT records for a given domain name should contain a b58 +// encoded multihash. func (r *DNSResolver) Resolve(name string) (string, error) { txt, err := net.LookupTXT(name) if err != nil { @@ -23,15 +27,17 @@ func (r *DNSResolver) Resolve(name string) (string, error) { } for _, t := range txt { - pair := strings.Split(t, "=") - if len(pair) < 2 { - // Log error? - u.DErr("Incorrectly formatted text record.") + chk := b58.Decode(t) + if len(chk) == 0 { continue } - if pair[0] == name { - return pair[1], nil + + _, err := mh.Cast(chk) + if err != nil { + continue } + return t, nil } + return "", u.ErrNotFound } diff --git a/namesys/publisher.go b/namesys/publisher.go index d64d7954b8..83f418a571 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -1,6 +1,7 @@ package namesys import ( + "code.google.com/p/go.net/context" "code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" @@ -16,6 +17,7 @@ type IpnsPublisher struct { // Publish accepts a keypair and a value, func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { + ctx := context.TODO() data, err := CreateEntryData(k, value) if err != nil { return err @@ -38,13 +40,13 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { } // Store associated public key - err = p.routing.PutValue(u.Key(nameb), pkbytes) + err = p.routing.PutValue(ctx, u.Key(nameb), pkbytes) if err != nil { return err } // Store ipns entry at h("/ipns/"+b58(h(pubkey))) - err = p.routing.PutValue(u.Key(ipnskey), data) + err = p.routing.PutValue(ctx, u.Key(ipnskey), data) if err != nil { return err } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 0620bd446e..32a12cf76a 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -7,9 +7,9 @@ import ( bs "github.com/jbenet/go-ipfs/blockservice" ci "github.com/jbenet/go-ipfs/crypto" mdag "github.com/jbenet/go-ipfs/merkledag" + "github.com/jbenet/go-ipfs/net/swarm" "github.com/jbenet/go-ipfs/peer" "github.com/jbenet/go-ipfs/routing/dht" - "github.com/jbenet/go-ipfs/swarm" u "github.com/jbenet/go-ipfs/util" ) diff --git a/namesys/routing.go b/namesys/routing.go index 5f85e942fb..2b1d06c806 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -2,8 +2,8 @@ package namesys import ( "fmt" - "time" + "code.google.com/p/go.net/context" "code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" @@ -11,8 +11,11 @@ import ( "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" mh "github.com/jbenet/go-multihash" + "github.com/op/go-logging" ) +var log = logging.MustGetLogger("namesys") + // RoutingResolver implements NSResolver for the main IPFS SFS-like naming type RoutingResolver struct { routing routing.IpfsRouting @@ -32,9 +35,10 @@ func (r *RoutingResolver) Matches(name string) bool { } func (r *RoutingResolver) Resolve(name string) (string, error) { + ctx := context.TODO() hash, err := mh.FromB58String(name) if err != nil { - u.DOut("RoutingResolve: bad input hash: [%s]\n", name) + log.Warning("RoutingResolve: bad input hash: [%s]\n", name) return "", err } // name should be a multihash. if it isn't, error out here. @@ -47,9 +51,9 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { } ipnsKey := u.Key(h) - val, err := r.routing.GetValue(ipnsKey, time.Second*10) + val, err := r.routing.GetValue(ctx, ipnsKey) if err != nil { - u.DOut("RoutingResolve get failed.\n") + log.Warning("RoutingResolve get failed.") return "", err } @@ -62,9 +66,9 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { // name should be a public key retrievable from ipfs // /ipfs/ key := u.Key(hash) - pkval, err := r.routing.GetValue(key, time.Second*10) + pkval, err := r.routing.GetValue(ctx, key) if err != nil { - u.DOut("RoutingResolve PubKey Get failed.\n") + log.Warning("RoutingResolve PubKey Get failed.") return "", err } From 6db5be9a3296f4b98e8f913bd9092806eb89d837 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 25 Sep 2014 15:10:57 -0700 Subject: [PATCH 0167/3147] add basic publish command, needs polish This commit was moved from ipfs/go-ipfs-routing@b30288aa3312e77ec0d3882783a6d1b16d7db722 --- routing/dht/dht.go | 3 +++ routing/dht/query.go | 7 ++++++- routing/dht/routing.go | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 11712338b5..f9f52b1082 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -13,6 +13,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" + "github.com/op/go-logging" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" @@ -21,6 +22,8 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) +var log = logging.MustGetLogger("dht") + // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. diff --git a/routing/dht/query.go b/routing/dht/query.go index 4db3f70e72..cc709d7e9b 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -101,6 +101,11 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { } func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { + log.Debug("Run query with %d peers.", len(peers)) + if len(peers) == 0 { + log.Warning("Running query with no peers!") + return nil, nil + } // setup concurrency rate limiting for i := 0; i < r.query.concurrency; i++ { r.rateLimit <- struct{}{} @@ -164,7 +169,7 @@ func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { r.peersSeen[next.Key()] = next r.Unlock() - u.DOut("adding peer to query: %v\n", next.ID.Pretty()) + log.Debug("adding peer to query: %v\n", next.ID.Pretty()) // do this after unlocking to prevent possible deadlocks. r.peersRemaining.Increment(1) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 778aaba758..6a2a0cdcb6 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -18,6 +18,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { + log.Debug("[%s] PutValue %v %v", dht.self.ID.Pretty(), key, value) err := dht.putLocal(key, value) if err != nil { return err @@ -30,7 +31,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error } query := newQuery(key, func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { - u.DOut("[%s] PutValue qry part %v\n", dht.self.ID.Pretty(), p.ID.Pretty()) + log.Debug("[%s] PutValue qry part %v", dht.self.ID.Pretty(), p.ID.Pretty()) err := dht.putValueToNetwork(ctx, p, string(key), value) if err != nil { return nil, err @@ -39,7 +40,6 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error }) _, err = query.Run(ctx, peers) - u.DOut("[%s] PutValue %v %v\n", dht.self.ID.Pretty(), key, value) return err } From 8a4afadf3af221a30bc4c9f74771e192f79d8eb6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 25 Sep 2014 18:29:05 -0700 Subject: [PATCH 0168/3147] implement initial ipns filesystem interface as well as plumbing command for publishing This commit was moved from ipfs/go-ipfs-routing@3fd024ce5b9f829b88db9c68bced77de2da96113 --- routing/dht/query.go | 1 + routing/dht/routing.go | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index cc709d7e9b..a62646f05b 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -106,6 +106,7 @@ func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { log.Warning("Running query with no peers!") return nil, nil } + // setup concurrency rate limiting for i := 0; i < r.query.concurrency; i++ { r.rateLimit <- struct{}{} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 6a2a0cdcb6..a62f4c01be 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -47,14 +47,13 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { - ll := startNewRPC("GET") - defer ll.EndAndPrint() + log.Debug("Get Value [%s]", key.Pretty()) // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... val, err := dht.getLocal(key) if err == nil { - ll.Success = true + log.Debug("Got value locally!") return val, nil } From fa73f16614660001b9fc5d1c4b4ea0c1ba2d921d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 25 Sep 2014 22:00:05 -0700 Subject: [PATCH 0169/3147] writes to ipns work if the top object is the written file (no directories yet!) This commit was moved from ipfs/go-ipfs-routing@2cb6d50703fad21d5ac25a68eda4f6e9a2b0d194 --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index a62f4c01be..65e4e3b54f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -103,7 +103,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { dht.providers.AddProvider(key, dht.self) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { - return kb.ErrLookupFailure + return nil } //TODO FIX: this doesn't work! it needs to be sent to the actual nearest peers. From ede6567bfa257c4ac3b02cf71fc1b6db49acd8b5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 25 Sep 2014 15:10:57 -0700 Subject: [PATCH 0170/3147] add basic publish command, needs polish This commit was moved from ipfs/go-namesys@ee57663f4c125bac79573eead4149913ad34776b --- namesys/publisher.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 83f418a571..67830eb6be 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -1,6 +1,8 @@ package namesys import ( + "time" + "code.google.com/p/go.net/context" "code.google.com/p/goprotobuf/proto" @@ -15,8 +17,16 @@ type IpnsPublisher struct { routing routing.IpfsRouting } +func NewPublisher(dag *mdag.DAGService, route routing.IpfsRouting) *IpnsPublisher { + return &IpnsPublisher{ + dag: dag, + routing: route, + } +} + // Publish accepts a keypair and a value, func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { + log.Debug("namesys: Publish %s", value.Pretty()) ctx := context.TODO() data, err := CreateEntryData(k, value) if err != nil { @@ -40,13 +50,15 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { } // Store associated public key - err = p.routing.PutValue(ctx, u.Key(nameb), pkbytes) + timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*4)) + err = p.routing.PutValue(timectx, u.Key(nameb), pkbytes) if err != nil { return err } // Store ipns entry at h("/ipns/"+b58(h(pubkey))) - err = p.routing.PutValue(ctx, u.Key(ipnskey), data) + timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*4)) + err = p.routing.PutValue(timectx, u.Key(ipnskey), data) if err != nil { return err } From 2f47d6b99c8fc2f079041af8790ffd572573e91b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 26 Sep 2014 00:09:27 -0700 Subject: [PATCH 0171/3147] WIP: getting closer to being able to write in ipns dirs This commit was moved from ipfs/go-ipfs-routing@206251e99cfe057311c13f7e019839a697d4b50f --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 65e4e3b54f..e7f98ad4eb 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -18,7 +18,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { - log.Debug("[%s] PutValue %v %v", dht.self.ID.Pretty(), key, value) + log.Debug("[%s] PutValue %v %v", dht.self.ID.Pretty(), key.Pretty(), value) err := dht.putLocal(key, value) if err != nil { return err From aa2571389c450b435f822b37ee9f35b0ed227a52 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 26 Sep 2014 12:08:00 -0700 Subject: [PATCH 0172/3147] writing files inside ipns works now! also implemented resolve cli command This commit was moved from ipfs/go-ipfs-routing@eaa11048756da415cd57e40c89370ddead0ee2bb --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e7f98ad4eb..c1b85cefaf 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -18,7 +18,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { - log.Debug("[%s] PutValue %v %v", dht.self.ID.Pretty(), key.Pretty(), value) + log.Debug("PutValue %s %v", key.Pretty(), value) err := dht.putLocal(key, value) if err != nil { return err From 8de7c55ebfa888d37f34be5be2850d7f7954529b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 26 Sep 2014 12:08:00 -0700 Subject: [PATCH 0173/3147] writing files inside ipns works now! also implemented resolve cli command This commit was moved from ipfs/go-namesys@01cb315707c7dbd7a2d5845ee5acfe30fcffef6f --- namesys/nsresolver.go | 2 ++ namesys/publisher.go | 6 +++--- namesys/resolve_test.go | 8 +++----- namesys/routing.go | 1 + 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/namesys/nsresolver.go b/namesys/nsresolver.go index c8d40dcb3d..89ef9ff5a8 100644 --- a/namesys/nsresolver.go +++ b/namesys/nsresolver.go @@ -1,6 +1,8 @@ package namesys type Resolver interface { + // Resolve returns a base58 encoded string Resolve(string) (string, error) + Matches(string) bool } diff --git a/namesys/publisher.go b/namesys/publisher.go index 67830eb6be..73a4197e1b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -25,8 +25,8 @@ func NewPublisher(dag *mdag.DAGService, route routing.IpfsRouting) *IpnsPublishe } // Publish accepts a keypair and a value, -func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { - log.Debug("namesys: Publish %s", value.Pretty()) +func (p *IpnsPublisher) Publish(k ci.PrivKey, value string) error { + log.Debug("namesys: Publish %s", value) ctx := context.TODO() data, err := CreateEntryData(k, value) if err != nil { @@ -66,7 +66,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { return nil } -func CreateEntryData(pk ci.PrivKey, val u.Key) ([]byte, error) { +func CreateEntryData(pk ci.PrivKey, val string) ([]byte, error) { entry := new(IpnsEntry) sig, err := pk.Sign([]byte(val)) if err != nil { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 32a12cf76a..7cad8bef09 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -7,9 +7,8 @@ import ( bs "github.com/jbenet/go-ipfs/blockservice" ci "github.com/jbenet/go-ipfs/crypto" mdag "github.com/jbenet/go-ipfs/merkledag" - "github.com/jbenet/go-ipfs/net/swarm" "github.com/jbenet/go-ipfs/peer" - "github.com/jbenet/go-ipfs/routing/dht" + mock "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" ) @@ -17,9 +16,8 @@ func TestRoutingResolve(t *testing.T) { local := &peer.Peer{ ID: []byte("testID"), } - net := swarm.NewSwarm(local) lds := ds.NewMapDatastore() - d := dht.NewDHT(local, net, lds) + d := mock.NewMockRouter(local, lds) bserv, err := bs.NewBlockService(lds, nil) if err != nil { @@ -40,7 +38,7 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - err = pub.Publish(privk, u.Key("Hello")) + err = pub.Publish(privk, "Hello") if err != nil { t.Fatal(err) } diff --git a/namesys/routing.go b/namesys/routing.go index 2b1d06c806..605458eef0 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -35,6 +35,7 @@ func (r *RoutingResolver) Matches(name string) bool { } func (r *RoutingResolver) Resolve(name string) (string, error) { + log.Debug("RoutingResolve: '%s'", name) ctx := context.TODO() hash, err := mh.FromB58String(name) if err != nil { From 87991e8fcc5a48777f94e238a58c1dc8fc553ede Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 26 Sep 2014 12:08:00 -0700 Subject: [PATCH 0174/3147] writing files inside ipns works now! also implemented resolve cli command This commit was moved from ipfs/go-path@ee3799867af57d1c0836ce65b9d75b3cd58198b0 --- path/path.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index eb5ce6660f..533afc7cd1 100644 --- a/path/path.go +++ b/path/path.go @@ -8,8 +8,11 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" merkledag "github.com/jbenet/go-ipfs/merkledag" u "github.com/jbenet/go-ipfs/util" + "github.com/op/go-logging" ) +var log = logging.MustGetLogger("path") + // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. type Resolver struct { @@ -20,7 +23,7 @@ type Resolver struct { // path component as a hash (key) of the first node, then resolves // all other components walking the links, with ResolveLinks. func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { - u.DOut("Resolve: '%s'\n", fpath) + log.Debug("Resolve: '%s'", fpath) fpath = path.Clean(fpath) parts := strings.Split(fpath, "/") @@ -66,10 +69,12 @@ func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( for _, name := range names { var next u.Key + var nlink *merkledag.Link // for each of the links in nd, the current object for _, link := range nd.Links { if link.Name == name { next = u.Key(link.Hash) + nlink = link break } } @@ -80,10 +85,15 @@ func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( return nil, fmt.Errorf("no link named %q under %s", name, h2) } - // fetch object for link and assign to nd - nd, err = s.DAG.Get(next) - if err != nil { - return nd, err + if nlink.Node == nil { + // fetch object for link and assign to nd + nd, err = s.DAG.Get(next) + if err != nil { + return nd, err + } + nlink.Node = nd + } else { + nd = nlink.Node } } return From 7341e5845959d7fac25df0275398b928857b8207 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 28 Sep 2014 00:13:07 -0700 Subject: [PATCH 0175/3147] update logging in multiple packages This commit was moved from ipfs/go-ipfs-routing@91341560eca12f0143101aa8c2e2a034b71a08ce --- routing/dht/dht.go | 30 +++++++++++++++--------------- routing/dht/routing.go | 10 +++++----- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f9f52b1082..4e844ecd6f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -77,7 +77,7 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer *peer.Peer) (*peer.Peer, error) { - u.DOut("Connect to new peer: %s\n", npeer.ID.Pretty()) + log.Debug("Connect to new peer: %s\n", npeer.ID.Pretty()) // TODO(jbenet,whyrusleeping) // @@ -132,7 +132,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N dht.Update(mPeer) // Print out diagnostic - u.DOut("[peer: %s] Got message type: '%s' [from = %s]\n", + log.Debug("[peer: %s] Got message type: '%s' [from = %s]\n", dht.self.ID.Pretty(), Message_MessageType_name[int32(pmes.GetType())], mPeer.ID.Pretty()) @@ -177,7 +177,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message start := time.Now() // Print out diagnostic - u.DOut("[peer: %s] Sent message type: '%s' [to = %s]\n", + log.Debug("[peer: %s] Sent message type: '%s' [to = %s]\n", dht.self.ID.Pretty(), Message_MessageType_name[int32(pmes.GetType())], p.ID.Pretty()) @@ -224,7 +224,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) e return err } - u.DOut("[%s] putProvider: %s for %s\n", dht.self.ID.Pretty(), p.ID.Pretty(), key) + log.Debug("[%s] putProvider: %s for %s", dht.self.ID.Pretty(), p.ID.Pretty(), key) if *rpmes.Key != *pmes.Key { return errors.New("provider not added correctly") } @@ -240,10 +240,10 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, return nil, nil, err } - u.DOut("pmes.GetValue() %v\n", pmes.GetValue()) + log.Debug("pmes.GetValue() %v", pmes.GetValue()) if value := pmes.GetValue(); value != nil { // Success! We were given the value - u.DOut("getValueOrPeers: got value\n") + log.Debug("getValueOrPeers: got value") return value, nil, nil } @@ -253,7 +253,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, if err != nil { return nil, nil, err } - u.DOut("getValueOrPeers: get from providers\n") + log.Debug("getValueOrPeers: get from providers") return val, nil, nil } @@ -266,7 +266,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, addr, err := ma.NewMultiaddr(pb.GetAddr()) if err != nil { - u.PErr("%v\n", err.Error()) + log.Error("%v", err.Error()) continue } @@ -281,11 +281,11 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, } if len(peers) > 0 { - u.DOut("getValueOrPeers: peers\n") + u.DOut("getValueOrPeers: peers") return nil, peers, nil } - u.DOut("getValueOrPeers: u.ErrNotFound\n") + log.Warning("getValueOrPeers: u.ErrNotFound") return nil, nil, u.ErrNotFound } @@ -307,13 +307,13 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, for _, pinfo := range peerlist { p, err := dht.ensureConnectedToPeer(pinfo) if err != nil { - u.DErr("getFromPeers error: %s\n", err) + log.Error("getFromPeers error: %s", err) continue } pmes, err := dht.getValueSingle(ctx, p, key, level) if err != nil { - u.DErr("getFromPeers error: %s\n", err) + log.Error("getFromPeers error: %s\n", err) continue } @@ -348,7 +348,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals to all routingTables to Update their last-seen status // on the given peer. func (dht *IpfsDHT) Update(p *peer.Peer) { - u.DOut("updating peer: [%s] latency = %f\n", p.ID.Pretty(), p.GetLatency().Seconds()) + log.Debug("updating peer: [%s] latency = %f\n", p.ID.Pretty(), p.GetLatency().Seconds()) removedCount := 0 for _, route := range dht.routingTables { removed := route.Update(p) @@ -404,7 +404,7 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer continue } - u.DOut("[%s] adding provider: %s for %s", dht.self.ID.Pretty(), p, key) + log.Debug("[%s] adding provider: %s for %s", dht.self.ID.Pretty(), p, key) // Dont add outselves to the list if p.ID.Equal(dht.self.ID) { @@ -439,7 +439,7 @@ func (dht *IpfsDHT) betterPeerToQuery(pmes *Message) *peer.Peer { // == to self? nil if closer.ID.Equal(dht.self.ID) { - u.DOut("Attempted to return self! this shouldnt happen...\n") + log.Error("Attempted to return self! this shouldnt happen...") return nil } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index c1b85cefaf..d1f50afb88 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -86,7 +86,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { return nil, err } - u.DOut("[%s] GetValue %v %v\n", dht.self.ID.Pretty(), key, result.value) + log.Debug("GetValue %v %v", key, result.value) if result.value == nil { return nil, u.ErrNotFound } @@ -189,7 +189,7 @@ func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet // FindProviders searches for peers who can provide the value for given key. func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, error) { // get closest peer - u.DOut("Find providers for: '%s'\n", key.Pretty()) + log.Debug("Find providers for: '%s'", key.Pretty()) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, nil @@ -333,17 +333,17 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(ctx context.Context, p *peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? - u.DOut("[%s] ping %s start\n", dht.self.ID.Pretty(), p.ID.Pretty()) + log.Info("ping %s start", p.ID.Pretty()) pmes := newMessage(Message_PING, "", 0) _, err := dht.sendRequest(ctx, p, pmes) - u.DOut("[%s] ping %s end (err = %s)\n", dht.self.ID.Pretty(), p.ID.Pretty(), err) + log.Info("ping %s end (err = %s)", p.ID.Pretty(), err) return err } func (dht *IpfsDHT) getDiagnostic(ctx context.Context) ([]*diagInfo, error) { - u.DOut("Begin Diagnostic") + log.Info("Begin Diagnostic") peers := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) var out []*diagInfo From ea856c44a64c17338b10888eaeb6e7c3361d1732 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 27 Sep 2014 12:38:32 -0700 Subject: [PATCH 0176/3147] new files and directories appear to work properly This commit was moved from ipfs/go-namesys@c2c453ae44f1bd452496364f594f083d30c571c4 --- namesys/dns.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index 55d00f9451..1154a66fec 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -15,7 +15,7 @@ type DNSResolver struct { } func (r *DNSResolver) Matches(name string) bool { - return strings.Contains(name, ".") + return strings.Contains(name, ".") && !strings.HasPrefix(name, ".") } // TXT records for a given domain name should contain a b58 From 7cca48d11c310fb406e0050b81dbab1740dc2d5b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 28 Sep 2014 00:13:07 -0700 Subject: [PATCH 0177/3147] update logging in multiple packages This commit was moved from ipfs/go-blockservice@6f1789fd89fa90862a4e316e619c33365cea8de5 --- blockservice/blockservice.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 1fbbfcb440..51a6e0014e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -7,12 +7,15 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + "github.com/op/go-logging" blocks "github.com/jbenet/go-ipfs/blocks" exchange "github.com/jbenet/go-ipfs/exchange" u "github.com/jbenet/go-ipfs/util" ) +var log = logging.MustGetLogger("blockservice") + // BlockService is a block datastore. // It uses an internal `datastore.Datastore` instance to store values. type BlockService struct { @@ -26,7 +29,7 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err return nil, fmt.Errorf("BlockService requires valid datastore") } if rem == nil { - u.DErr("Caution: blockservice running in local (offline) mode.\n") + log.Warning("blockservice running in local (offline) mode.") } return &BlockService{Datastore: d, Remote: rem}, nil } @@ -35,7 +38,7 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() dsk := ds.NewKey(string(k)) - u.DOut("storing [%s] in datastore\n", k.Pretty()) + log.Debug("storing [%s] in datastore", k.Pretty()) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter err := s.Datastore.Put(dsk, b.Data) @@ -52,11 +55,11 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { - u.DOut("BlockService GetBlock: '%s'\n", k.Pretty()) + log.Debug("BlockService GetBlock: '%s'", k.Pretty()) dsk := ds.NewKey(string(k)) datai, err := s.Datastore.Get(dsk) if err == nil { - u.DOut("Blockservice: Got data in datastore.\n") + log.Debug("Blockservice: Got data in datastore.") bdata, ok := datai.([]byte) if !ok { return nil, fmt.Errorf("data associated with %s is not a []byte", k) @@ -66,7 +69,7 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { Data: bdata, }, nil } else if err == ds.ErrNotFound && s.Remote != nil { - u.DOut("Blockservice: Searching bitswap.\n") + log.Debug("Blockservice: Searching bitswap.") ctx, _ := context.WithTimeout(context.TODO(), 5*time.Second) blk, err := s.Remote.Block(ctx, k) if err != nil { @@ -74,7 +77,7 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { } return blk, nil } else { - u.DOut("Blockservice GetBlock: Not found.\n") + log.Debug("Blockservice GetBlock: Not found.") return nil, u.ErrNotFound } } From d50a969a5a94c13f93d5ad9fcf4460b8d6c85884 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 29 Sep 2014 17:47:13 +0000 Subject: [PATCH 0178/3147] implement publisher for ipns to wait until moments of rapid churn die down This commit was moved from ipfs/go-ipfs-routing@04044e46d61913590424886a4763959e9d4435ec --- routing/dht/dht.go | 7 +++---- routing/dht/routing.go | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4e844ecd6f..eccfd7e451 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -177,8 +177,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message start := time.Now() // Print out diagnostic - log.Debug("[peer: %s] Sent message type: '%s' [to = %s]\n", - dht.self.ID.Pretty(), + log.Debug("Sent message type: '%s' [to = %s]", Message_MessageType_name[int32(pmes.GetType())], p.ID.Pretty()) rmes, err := dht.sender.SendRequest(ctx, mes) @@ -281,7 +280,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, } if len(peers) > 0 { - u.DOut("getValueOrPeers: peers") + log.Debug("getValueOrPeers: peers") return nil, peers, nil } @@ -400,7 +399,7 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer for _, prov := range peers { p, err := dht.peerFromInfo(prov) if err != nil { - u.PErr("error getting peer from info: %v\n", err) + log.Error("error getting peer from info: %v", err) continue } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index d1f50afb88..4fa6c8c946 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -18,7 +18,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { - log.Debug("PutValue %s %v", key.Pretty(), value) + log.Debug("PutValue %s", key.Pretty()) err := dht.putLocal(key, value) if err != nil { return err From 61cbda30b0b01238f818a4a7b0008ee24f187a4f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 1 Oct 2014 00:44:22 -0700 Subject: [PATCH 0179/3147] vendoring ipns things This commit was moved from ipfs/go-namesys@502ca33f131a0ed9668aa62427518576d3391eaa --- namesys/entry.pb.go | 2 +- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/routing.go | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/namesys/entry.pb.go b/namesys/entry.pb.go index e4420e9f97..d9dc5160b4 100644 --- a/namesys/entry.pb.go +++ b/namesys/entry.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package namesys -import proto "code.google.com/p/goprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/namesys/proquint.go b/namesys/proquint.go index 9b64f3fde5..bf34c3b6c9 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -3,7 +3,7 @@ package namesys import ( "errors" - proquint "github.com/bren2010/proquint" + proquint "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 73a4197e1b..a4292d7fed 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -3,8 +3,8 @@ package namesys import ( "time" - "code.google.com/p/go.net/context" - "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" mdag "github.com/jbenet/go-ipfs/merkledag" diff --git a/namesys/routing.go b/namesys/routing.go index 605458eef0..4c2b0d8165 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -3,15 +3,15 @@ package namesys import ( "fmt" - "code.google.com/p/go.net/context" - "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" - mh "github.com/jbenet/go-multihash" - "github.com/op/go-logging" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" ) var log = logging.MustGetLogger("namesys") From f78093f8c22591388b4db486600e24275256fabc Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 1 Oct 2014 00:44:22 -0700 Subject: [PATCH 0180/3147] vendoring ipns things This commit was moved from ipfs/go-ipfs-routing@60e0ad063fb2d82da18dc5c398d501775b77b7fb --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index eccfd7e451..f02be47114 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -13,7 +13,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" - "github.com/op/go-logging" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" From 574776c9aebae9dbb24833e2dbcaaee73d5dda30 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 1 Oct 2014 00:44:22 -0700 Subject: [PATCH 0181/3147] vendoring ipns things This commit was moved from ipfs/go-blockservice@dbe004fac140bcec450b1af039c4a6f34e09c00e --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 51a6e0014e..36c3ed607b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - "github.com/op/go-logging" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" blocks "github.com/jbenet/go-ipfs/blocks" exchange "github.com/jbenet/go-ipfs/exchange" From c4b96ee05d542eb2aff5c57822b15262c5932e77 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 1 Oct 2014 00:44:22 -0700 Subject: [PATCH 0182/3147] vendoring ipns things This commit was moved from ipfs/go-path@50b3b95b4e1cfe7fd8f8065905344463e74b3823 --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index 533afc7cd1..ebc9d81d66 100644 --- a/path/path.go +++ b/path/path.go @@ -8,7 +8,7 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" merkledag "github.com/jbenet/go-ipfs/merkledag" u "github.com/jbenet/go-ipfs/util" - "github.com/op/go-logging" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" ) var log = logging.MustGetLogger("path") From 07b7038ab3fa90195158ae677e25e7f240e5a452 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 1 Oct 2014 01:36:21 -0700 Subject: [PATCH 0183/3147] IpnsPublicher -> Publisher interface This commit was moved from ipfs/go-namesys@4c087f14446f9c5b5a8a4575ab3a56b85596a81e --- namesys/publisher.go | 12 ++++++++---- namesys/resolve_test.go | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index a4292d7fed..76eb6a55b0 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -12,20 +12,24 @@ import ( u "github.com/jbenet/go-ipfs/util" ) -type IpnsPublisher struct { +type ipnsPublisher struct { dag *mdag.DAGService routing routing.IpfsRouting } -func NewPublisher(dag *mdag.DAGService, route routing.IpfsRouting) *IpnsPublisher { - return &IpnsPublisher{ +type Publisher interface { + Publish(ci.PrivKey, string) error +} + +func NewPublisher(dag *mdag.DAGService, route routing.IpfsRouting) Publisher { + return &ipnsPublisher{ dag: dag, routing: route, } } // Publish accepts a keypair and a value, -func (p *IpnsPublisher) Publish(k ci.PrivKey, value string) error { +func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { log.Debug("namesys: Publish %s", value) ctx := context.TODO() data, err := CreateEntryData(k, value) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 7cad8bef09..35898b50f2 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -28,7 +28,7 @@ func TestRoutingResolve(t *testing.T) { resolve := NewMasterResolver(d, dag) - pub := IpnsPublisher{ + pub := ipnsPublisher{ dag: dag, routing: d, } From f0432059093fb058f61bdfac315ce66a88663c94 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 3 Oct 2014 15:34:08 -0700 Subject: [PATCH 0184/3147] use string datastore keys. This commit was moved from ipfs/go-ipfs-routing@649624f0d25346d8c87a8dc66d8778e6ec7620cb --- routing/dht/dht.go | 16 +++++++++++----- routing/dht/handlers.go | 7 ++++--- routing/mock/routing.go | 4 ++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f02be47114..aa7361e53a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -13,11 +13,11 @@ import ( peer "github.com/jbenet/go-ipfs/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) @@ -328,7 +328,7 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { dht.dslock.Lock() defer dht.dslock.Unlock() - v, err := dht.datastore.Get(ds.NewKey(string(key))) + v, err := dht.datastore.Get(key.DsKey()) if err != nil { return nil, err } @@ -341,7 +341,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { } func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { - return dht.datastore.Put(ds.NewKey(string(key)), value) + return dht.datastore.Put(key.DsKey(), value) } // Update signals to all routingTables to Update their last-seen status @@ -494,13 +494,19 @@ func (dht *IpfsDHT) ensureConnectedToPeer(pbp *Message_Peer) (*peer.Peer, error) return p, err } +//TODO: this should be smarter about which keys it selects. func (dht *IpfsDHT) loadProvidableKeys() error { kl, err := dht.datastore.KeyList() if err != nil { return err } - for _, k := range kl { - dht.providers.AddProvider(u.Key(k.Bytes()), dht.self) + for _, dsk := range kl { + k := u.KeyFromDsKey(dsk) + if len(k) == 0 { + log.Error("loadProvidableKeys error: %v", dsk) + } + + dht.providers.AddProvider(k, dht.self) } return nil } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 4301d1e4e9..ac03ed3e8f 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -51,7 +51,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // let's first check if we have the value locally. u.DOut("[%s] handleGetValue looking into ds\n", dht.self.ID.Pretty()) - dskey := ds.NewKey(pmes.GetKey()) + dskey := u.Key(pmes.GetKey()).DsKey() iVal, err := dht.datastore.Get(dskey) u.DOut("[%s] handleGetValue looking into ds GOT %v\n", dht.self.ID.Pretty(), iVal) @@ -96,7 +96,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error) { dht.dslock.Lock() defer dht.dslock.Unlock() - dskey := ds.NewKey(pmes.GetKey()) + dskey := u.Key(pmes.GetKey()).DsKey() err := dht.datastore.Put(dskey, pmes.GetValue()) u.DOut("[%s] handlePutValue %v %v\n", dht.self.ID.Pretty(), dskey, pmes.GetValue()) return pmes, err @@ -137,7 +137,8 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, e resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. - has, err := dht.datastore.Has(ds.NewKey(pmes.GetKey())) + dsk := u.Key(pmes.GetKey()).DsKey() + has, err := dht.datastore.Has(dsk) if err != nil && err != ds.ErrNotFound { u.PErr("unexpected datastore error: %v\n", err) has = false diff --git a/routing/mock/routing.go b/routing/mock/routing.go index e5fdb96fca..954914c3be 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -33,11 +33,11 @@ func (mr *MockRouter) SetRoutingServer(rs RoutingServer) { } func (mr *MockRouter) PutValue(ctx context.Context, key u.Key, val []byte) error { - return mr.datastore.Put(ds.NewKey(string(key)), val) + return mr.datastore.Put(key.DsKey(), val) } func (mr *MockRouter) GetValue(ctx context.Context, key u.Key) ([]byte, error) { - v, err := mr.datastore.Get(ds.NewKey(string(key))) + v, err := mr.datastore.Get(key.DsKey()) if err != nil { return nil, err } From 39f67332e345eced7c66dbb11982babb7778ec38 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 3 Oct 2014 15:34:08 -0700 Subject: [PATCH 0185/3147] use string datastore keys. This commit was moved from ipfs/go-blockservice@aecb4cb77199ca3fc48fed324221a751e253effe --- blockservice/blockservice.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 36c3ed607b..369cacc2ac 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" + logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" blocks "github.com/jbenet/go-ipfs/blocks" exchange "github.com/jbenet/go-ipfs/exchange" @@ -37,11 +37,10 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err // AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() - dsk := ds.NewKey(string(k)) log.Debug("storing [%s] in datastore", k.Pretty()) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter - err := s.Datastore.Put(dsk, b.Data) + err := s.Datastore.Put(k.DsKey(), b.Data) if err != nil { return k, err } @@ -56,8 +55,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { log.Debug("BlockService GetBlock: '%s'", k.Pretty()) - dsk := ds.NewKey(string(k)) - datai, err := s.Datastore.Get(dsk) + datai, err := s.Datastore.Get(k.DsKey()) if err == nil { log.Debug("Blockservice: Got data in datastore.") bdata, ok := datai.([]byte) From 7cedf9de8781eadadb83da8423d47c29a3077eb3 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 3 Oct 2014 18:08:21 -0700 Subject: [PATCH 0186/3147] DNSResolver: use isd.IsDomain this commit dedicated to @whyrusleeping This commit was moved from ipfs/go-namesys@e6ce1e383d8e45216a61ef65df72ad2d41da5d30 --- namesys/dns.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 1154a66fec..e9c4097d83 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -2,25 +2,29 @@ package namesys import ( "net" - "strings" b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" u "github.com/jbenet/go-ipfs/util" + isd "github.com/jbenet/go-is-domain" ) +// DNSResolver implements a Resolver on DNS domains type DNSResolver struct { // TODO: maybe some sort of caching? // cache would need a timeout } +// Matches implements Resolver func (r *DNSResolver) Matches(name string) bool { - return strings.Contains(name, ".") && !strings.HasPrefix(name, ".") + return isd.IsDomain(name) } +// Resolve implements Resolver // TXT records for a given domain name should contain a b58 // encoded multihash. func (r *DNSResolver) Resolve(name string) (string, error) { + log.Info("DNSResolver resolving %v", name) txt, err := net.LookupTXT(name) if err != nil { return "", err From bbcab0de5fc29eb5b9f1f085b8e462c5e3c3855c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:36:30 -0700 Subject: [PATCH 0187/3147] initialize loggers at ERROR This commit was moved from ipfs/go-ipfs-routing@7416ccbaaf23e6ff93ba4e2b5ee83968a4cd31ae --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index aa7361e53a..d45c5aabfb 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -22,7 +22,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) -var log = logging.MustGetLogger("dht") +var log = u.Logger("dht", logging.ERROR) // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js From 057b0591d83e73a6518c7ff194dd9fbdfbde4a65 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:36:30 -0700 Subject: [PATCH 0188/3147] initialize loggers at ERROR This commit was moved from ipfs/go-namesys@90964c306ee5d53629876d77a385800a687de521 --- namesys/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/routing.go b/namesys/routing.go index 4c2b0d8165..ba7c4a7239 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,7 +14,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" ) -var log = logging.MustGetLogger("namesys") +var log = u.Logger("namesys", logging.ERROR) // RoutingResolver implements NSResolver for the main IPFS SFS-like naming type RoutingResolver struct { From 2589bfab8a755014bd52c909ecfbb61dde1a46fc Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:36:30 -0700 Subject: [PATCH 0189/3147] initialize loggers at ERROR This commit was moved from ipfs/go-blockservice@ad3eb746293e21bf65ecb51569cd6644f453876f --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 369cacc2ac..6970f363b5 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -14,7 +14,7 @@ import ( u "github.com/jbenet/go-ipfs/util" ) -var log = logging.MustGetLogger("blockservice") +var log = u.Logger("blockservice", logging.ERROR) // BlockService is a block datastore. // It uses an internal `datastore.Datastore` instance to store values. From 16e510978daa4d7aaaff961eae6c4d3e1a402962 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:36:30 -0700 Subject: [PATCH 0190/3147] initialize loggers at ERROR This commit was moved from ipfs/go-path@c94c35dc884b1a103acd51c0bbd7e63a4e0d1baf --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index ebc9d81d66..83d1aa8b60 100644 --- a/path/path.go +++ b/path/path.go @@ -11,7 +11,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" ) -var log = logging.MustGetLogger("path") +var log = u.Logger("path", logging.ERROR) // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. From b1172c469d9512feb9f2414a9cef2c4b9e249d5c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:53:21 -0700 Subject: [PATCH 0191/3147] loggers: set level This commit was moved from ipfs/go-ipfs-routing@c77a7071fe4301ede5b25d4eea4429ef60c131cf --- routing/dht/dht.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d45c5aabfb..8cf3a11539 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -17,12 +17,11 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) -var log = u.Logger("dht", logging.ERROR) +var log = u.Logger("dht") // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js From a8f0e067724734be0b3199e9ae4d308738c8233d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:53:21 -0700 Subject: [PATCH 0192/3147] loggers: set level This commit was moved from ipfs/go-namesys@ab3dab3ec3c42f9e80146e0b1385dab5c3dd7bf7 --- namesys/routing.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index ba7c4a7239..942263e8ef 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,15 +6,14 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ci "github.com/jbenet/go-ipfs/crypto" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" ) -var log = u.Logger("namesys", logging.ERROR) +var log = u.Logger("namesys") // RoutingResolver implements NSResolver for the main IPFS SFS-like naming type RoutingResolver struct { From 023d733068b1108f7b5462d68c49e7c0783d5a16 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:53:21 -0700 Subject: [PATCH 0193/3147] loggers: set level This commit was moved from ipfs/go-blockservice@413d09dcad8726d913cf32efca24a2f7b01d8538 --- blockservice/blockservice.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 6970f363b5..21bb75c6f3 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -7,14 +7,13 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" blocks "github.com/jbenet/go-ipfs/blocks" exchange "github.com/jbenet/go-ipfs/exchange" u "github.com/jbenet/go-ipfs/util" ) -var log = u.Logger("blockservice", logging.ERROR) +var log = u.Logger("blockservice") // BlockService is a block datastore. // It uses an internal `datastore.Datastore` instance to store values. From 70467ab790a8267ad9c2472ec7a2382868e1bc26 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 4 Oct 2014 03:53:21 -0700 Subject: [PATCH 0194/3147] loggers: set level This commit was moved from ipfs/go-path@4b44c90209f34e8a24ae631a237083600df952c3 --- path/path.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 83d1aa8b60..2392031407 100644 --- a/path/path.go +++ b/path/path.go @@ -8,10 +8,9 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" merkledag "github.com/jbenet/go-ipfs/merkledag" u "github.com/jbenet/go-ipfs/util" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" ) -var log = u.Logger("path", logging.ERROR) +var log = u.Logger("path") // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. From 8102d08e92d8c6605348b8e1162522030f10407b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 4 Oct 2014 19:29:08 +0000 Subject: [PATCH 0195/3147] fixed keyspace tests on 32 bit systems This commit was moved from ipfs/go-ipfs-routing@b445ef47b07684f7cf155127522cc0eeb809e3a2 --- routing/keyspace/xor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go index d7d83afa20..7963ea014a 100644 --- a/routing/keyspace/xor_test.go +++ b/routing/keyspace/xor_test.go @@ -113,8 +113,8 @@ func TestDistancesAndCenterSorting(t *testing.T) { keys[i] = Key{Space: XORKeySpace, Bytes: a} } - cmp := func(a int, b *big.Int) int { - return big.NewInt(int64(a)).Cmp(b) + cmp := func(a int64, b *big.Int) int { + return big.NewInt(a).Cmp(b) } if 0 != cmp(0, keys[2].Distance(keys[3])) { From 66e25981dfdaf71c478b9adc8e1b3d5ca4c75136 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 5 Oct 2014 15:15:49 -0700 Subject: [PATCH 0196/3147] vendoring protobuf + go-is-domain This commit was moved from ipfs/go-namesys@2fde043fb1e3275d218293b33d1a0bed79d0fa52 --- namesys/dns.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index e9c4097d83..8dda6cb51e 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,7 +6,7 @@ import ( b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" u "github.com/jbenet/go-ipfs/util" - isd "github.com/jbenet/go-is-domain" + isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" ) // DNSResolver implements a Resolver on DNS domains From 993f49c24c7b21d0f03784d57bc0b8985edea758 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 6 Oct 2014 02:26:50 -0700 Subject: [PATCH 0197/3147] u.Hash - error the u.Hash error can be safely ignored (panic) because multihash only fails from the selection of hash function. If the fn + length are valid, it won't error. cc @whyrusleeping This commit was moved from ipfs/go-blockservice@7abc7289a26040e1856384206db29d66c7075e7e --- blockservice/blocks_test.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index c610fbd2a1..bfffc37b8c 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -23,12 +23,7 @@ func TestBlocks(t *testing.T) { return } - h, err := u.Hash([]byte("beep boop")) - if err != nil { - t.Error("failed to hash data", err) - return - } - + h := u.Hash([]byte("beep boop")) if !bytes.Equal(b.Multihash, h) { t.Error("Block Multihash and data multihash not equal") } From 77520b9296cb9bcf43b50c6054785848aced4f0a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 6 Oct 2014 02:26:50 -0700 Subject: [PATCH 0198/3147] u.Hash - error the u.Hash error can be safely ignored (panic) because multihash only fails from the selection of hash function. If the fn + length are valid, it won't error. cc @whyrusleeping This commit was moved from ipfs/go-namesys@2323ba4fb0827bbc8c5d69f732efcb4d08b4d4b4 --- namesys/publisher.go | 11 ++--------- namesys/resolve_test.go | 6 +----- namesys/routing.go | 5 +---- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 76eb6a55b0..0c605301c9 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -42,16 +42,9 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { return nil } - nameb, err := u.Hash(pkbytes) - if err != nil { - return nil - } + nameb := u.Hash(pkbytes) namekey := u.Key(nameb).Pretty() - - ipnskey, err := u.Hash([]byte("/ipns/" + namekey)) - if err != nil { - return err - } + ipnskey := u.Hash([]byte("/ipns/" + namekey)) // Store associated public key timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*4)) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 35898b50f2..ff5292224f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -48,11 +48,7 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - pkhash, err := u.Hash(pubkb) - if err != nil { - t.Fatal(err) - } - + pkhash := u.Hash(pubkb) res, err := resolve.Resolve(u.Key(pkhash).Pretty()) if err != nil { t.Fatal(err) diff --git a/namesys/routing.go b/namesys/routing.go index 942263e8ef..abacb22d4f 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -45,10 +45,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { // use the routing system to get the name. // /ipns/ - h, err := u.Hash([]byte("/ipns/" + name)) - if err != nil { - return "", err - } + h := u.Hash([]byte("/ipns/" + name)) ipnsKey := u.Key(h) val, err := r.routing.GetValue(ctx, ipnsKey) From f904c76b7714d313583168788d05e6286cbaef05 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 6 Oct 2014 04:13:39 -0700 Subject: [PATCH 0199/3147] updated multiaddr use across codebase This commit was moved from ipfs/go-ipfs-routing@108e5e76eb278164ce4adcb416e4638f2427a1a3 --- routing/dht/Message.go | 6 +----- routing/dht/dht_test.go | 6 +++--- routing/dht/ext_test.go | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 1be9a3b801..84d323c37b 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -20,11 +20,7 @@ func peerToPBPeer(p *peer.Peer) *Message_Peer { if len(p.Addresses) == 0 || p.Addresses[0] == nil { pbp.Addr = proto.String("") } else { - addr, err := p.Addresses[0].String() - if err != nil { - //Temp: what situations could cause this? - panic(err) - } + addr := p.Addresses[0].String() pbp.Addr = &addr } pid := string(p.ID) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1bbc62cdc0..f5d391387b 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -43,8 +43,8 @@ func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { return d } -func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { - var addrs []*ma.Multiaddr +func setupDHTS(n int, t *testing.T) ([]ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { + var addrs []ma.Multiaddr for i := 0; i < n; i++ { a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) if err != nil { @@ -67,7 +67,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) return addrs, peers, dhts } -func makePeer(addr *ma.Multiaddr) *peer.Peer { +func makePeer(addr ma.Multiaddr) *peer.Peer { p := new(peer.Peer) p.AddAddress(addr) sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index f8b9293a87..df8f26ff3d 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -184,7 +184,7 @@ func TestGetFailures(t *testing.T) { func _randPeer() *peer.Peer { p := new(peer.Peer) p.ID = make(peer.ID, 16) - p.Addresses = []*ma.Multiaddr{nil} + p.Addresses = []ma.Multiaddr{nil} crand.Read(p.ID) return p } From a19fcfad1b83099c4f16bc054fad2d1898002a58 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 6 Oct 2014 04:23:55 -0700 Subject: [PATCH 0200/3147] Obviated need for `.ID.Pretty()` all over the place. This commit was moved from ipfs/go-blockservice@d78eeadef617990130d39aafe99ff97b30b138b6 --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 21bb75c6f3..9b15014244 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -36,7 +36,7 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err // AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() - log.Debug("storing [%s] in datastore", k.Pretty()) + log.Debug("storing [%s] in datastore", k) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter err := s.Datastore.Put(k.DsKey(), b.Data) @@ -53,7 +53,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { - log.Debug("BlockService GetBlock: '%s'", k.Pretty()) + log.Debug("BlockService GetBlock: '%s'", k) datai, err := s.Datastore.Get(k.DsKey()) if err == nil { log.Debug("Blockservice: Got data in datastore.") From afd1c47924926a2225543d79dbb729289f6e4bbb Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 6 Oct 2014 04:23:55 -0700 Subject: [PATCH 0201/3147] Obviated need for `.ID.Pretty()` all over the place. This commit was moved from ipfs/go-ipfs-routing@185bd4e329ddc710c2ec1fb703ca23aa3561c060 --- routing/dht/dht.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 8cf3a11539..1f1fdd3e5b 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -76,7 +76,7 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer *peer.Peer) (*peer.Peer, error) { - log.Debug("Connect to new peer: %s\n", npeer.ID.Pretty()) + log.Debug("Connect to new peer: %s\n", npeer) // TODO(jbenet,whyrusleeping) // @@ -132,8 +132,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // Print out diagnostic log.Debug("[peer: %s] Got message type: '%s' [from = %s]\n", - dht.self.ID.Pretty(), - Message_MessageType_name[int32(pmes.GetType())], mPeer.ID.Pretty()) + dht.self, Message_MessageType_name[int32(pmes.GetType())], mPeer) // get handler for this msg type. handler := dht.handlerForMsgType(pmes.GetType()) @@ -177,7 +176,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message // Print out diagnostic log.Debug("Sent message type: '%s' [to = %s]", - Message_MessageType_name[int32(pmes.GetType())], p.ID.Pretty()) + Message_MessageType_name[int32(pmes.GetType())], p) rmes, err := dht.sender.SendRequest(ctx, mes) if err != nil { @@ -222,7 +221,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) e return err } - log.Debug("[%s] putProvider: %s for %s", dht.self.ID.Pretty(), p.ID.Pretty(), key) + log.Debug("[%s] putProvider: %s for %s", dht.self, p, key) if *rpmes.Key != *pmes.Key { return errors.New("provider not added correctly") } @@ -346,7 +345,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals to all routingTables to Update their last-seen status // on the given peer. func (dht *IpfsDHT) Update(p *peer.Peer) { - log.Debug("updating peer: [%s] latency = %f\n", p.ID.Pretty(), p.GetLatency().Seconds()) + log.Debug("updating peer: [%s] latency = %f\n", p, p.GetLatency().Seconds()) removedCount := 0 for _, route := range dht.routingTables { removed := route.Update(p) @@ -402,7 +401,7 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer continue } - log.Debug("[%s] adding provider: %s for %s", dht.self.ID.Pretty(), p, key) + log.Debug("[%s] adding provider: %s for %s", dht.self, p, key) // Dont add outselves to the list if p.ID.Equal(dht.self.ID) { From a0945f47630871b5058ccdba4a2b1c829eae301e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 6 Oct 2014 23:49:45 +0000 Subject: [PATCH 0202/3147] implement dagmodifier and tests. This commit was moved from ipfs/go-blockservice@bdf9a42a9f10383c561b58871b7100fe0bae6565 --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 9b15014244..b8e445568e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -36,7 +36,7 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err // AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() - log.Debug("storing [%s] in datastore", k) + log.Debug("blockservice: storing [%s] in datastore", k.Pretty()) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter err := s.Datastore.Put(k.DsKey(), b.Data) @@ -53,7 +53,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { - log.Debug("BlockService GetBlock: '%s'", k) + log.Debug("BlockService GetBlock: '%s'", k.Pretty()) datai, err := s.Datastore.Get(k.DsKey()) if err == nil { log.Debug("Blockservice: Got data in datastore.") From 6bcdfb445a0f4cf7caf32bd9e30d580696200a3c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 7 Oct 2014 20:46:01 +0000 Subject: [PATCH 0203/3147] removed error from return type of blocks.NewBlock() This commit was moved from ipfs/go-ipfs-exchange-offline@1c357a55c671d2d3b35d03afff0af50626518f93 --- exchange/offline/offline_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 26821f2c8a..b759a61ca3 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -5,8 +5,8 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" - testutil "github.com/jbenet/go-ipfs/util/testutil" ) func TestBlockReturnsErr(t *testing.T) { @@ -20,8 +20,8 @@ func TestBlockReturnsErr(t *testing.T) { func TestHasBlockReturnsNil(t *testing.T) { off := NewOfflineExchange() - block := testutil.NewBlockOrFail(t, "data") - err := off.HasBlock(context.Background(), block) + block := blocks.NewBlock([]byte("data")) + err := off.HasBlock(context.Background(), *block) if err != nil { t.Fatal("") } From ff453b93fb74a60e368be0b0e1410aeba9d34d3b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Oct 2014 03:42:29 +0000 Subject: [PATCH 0204/3147] some performance tweaks for the dagwriter write path This commit was moved from ipfs/go-blockservice@2a7a5b63d3ae3668f7c0afefc1dc9b2ce5d82d10 --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index b8e445568e..dcf15ce95b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -36,7 +36,7 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err // AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() - log.Debug("blockservice: storing [%s] in datastore", k.Pretty()) + log.Debug("blockservice: storing [%s] in datastore", k) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter err := s.Datastore.Put(k.DsKey(), b.Data) @@ -53,7 +53,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { - log.Debug("BlockService GetBlock: '%s'", k.Pretty()) + log.Debug("BlockService GetBlock: '%s'", k) datai, err := s.Datastore.Get(k.DsKey()) if err == nil { log.Debug("Blockservice: Got data in datastore.") From 3fbd42acc69030a2881376a4d0167f2ded5e53b8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Oct 2014 04:25:51 +0000 Subject: [PATCH 0205/3147] make tests pass This commit was moved from ipfs/go-blockservice@c8c176c87cb93078b8f4e0dec9cff292a522f48b --- blockservice/blocks_test.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index bfffc37b8c..764d2d400e 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -17,12 +17,7 @@ func TestBlocks(t *testing.T) { return } - b, err := blocks.NewBlock([]byte("beep boop")) - if err != nil { - t.Error("failed to construct block", err) - return - } - + b := blocks.NewBlock([]byte("beep boop")) h := u.Hash([]byte("beep boop")) if !bytes.Equal(b.Multihash, h) { t.Error("Block Multihash and data multihash not equal") From 79afabb0b1766d5f512dbb8bbbeb72e98d836858 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 7 Oct 2014 21:29:03 -0700 Subject: [PATCH 0206/3147] changed logging, in dht and elsewhere - use log.* instead of u.* - use automatic type conversions to .String() (Peer.String() prints nicely, and avoids calling b58 encoding until needed) This commit was moved from ipfs/go-ipfs-routing@e977a444ef5ca3be687e14927dcf6c4a29a46f65 --- routing/dht/dht.go | 6 +++--- routing/dht/dht_test.go | 2 +- routing/dht/handlers.go | 29 ++++++++++++++--------------- routing/dht/query.go | 18 +++++++++--------- routing/dht/routing.go | 12 ++++++------ routing/kbucket/table_test.go | 4 ++-- 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1f1fdd3e5b..cfa500ee28 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -221,7 +221,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) e return err } - log.Debug("[%s] putProvider: %s for %s", dht.self, p, key) + log.Debug("%s putProvider: %s for %s", dht.self, p, key) if *rpmes.Key != *pmes.Key { return errors.New("provider not added correctly") } @@ -345,7 +345,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals to all routingTables to Update their last-seen status // on the given peer. func (dht *IpfsDHT) Update(p *peer.Peer) { - log.Debug("updating peer: [%s] latency = %f\n", p, p.GetLatency().Seconds()) + log.Debug("updating peer: %s latency = %f\n", p, p.GetLatency().Seconds()) removedCount := 0 for _, route := range dht.routingTables { removed := route.Update(p) @@ -401,7 +401,7 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer continue } - log.Debug("[%s] adding provider: %s for %s", dht.self, p, key) + log.Debug("%s adding provider: %s for %s", dht.self, p, key) // Dont add outselves to the list if p.ID.Equal(dht.self.ID) { diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f5d391387b..23bdb88e72 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -287,7 +287,7 @@ func TestProvidesAsync(t *testing.T) { select { case p := <-provs: if !p.ID.Equal(dhts[3].self.ID) { - t.Fatalf("got a provider, but not the right one. %v", p.ID.Pretty()) + t.Fatalf("got a provider, but not the right one. %s", p) } case <-ctx.Done(): t.Fatal("Didnt get back providers") diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index ac03ed3e8f..49e3eb7508 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -38,7 +38,7 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { } func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error) { - u.DOut("[%s] handleGetValue for key: %s\n", dht.self.ID.Pretty(), pmes.GetKey()) + log.Debug("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) // setup response resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) @@ -50,10 +50,10 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } // let's first check if we have the value locally. - u.DOut("[%s] handleGetValue looking into ds\n", dht.self.ID.Pretty()) + log.Debug("%s handleGetValue looking into ds\n", dht.self) dskey := u.Key(pmes.GetKey()).DsKey() iVal, err := dht.datastore.Get(dskey) - u.DOut("[%s] handleGetValue looking into ds GOT %v\n", dht.self.ID.Pretty(), iVal) + log.Debug("%s handleGetValue looking into ds GOT %v\n", dht.self, iVal) // if we got an unexpected error, bail. if err != nil && err != ds.ErrNotFound { @@ -65,7 +65,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // if we have the value, send it back if err == nil { - u.DOut("[%s] handleGetValue success!\n", dht.self.ID.Pretty()) + log.Debug("%s handleGetValue success!\n", dht.self) byts, ok := iVal.([]byte) if !ok { @@ -78,14 +78,14 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error // if we know any providers for the requested value, return those. provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) if len(provs) > 0 { - u.DOut("handleGetValue returning %d provider[s]\n", len(provs)) + log.Debug("handleGetValue returning %d provider[s]\n", len(provs)) resp.ProviderPeers = peersToPBPeers(provs) } // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeerToQuery(pmes) if closer != nil { - u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty()) + log.Debug("handleGetValue returning a closer peer: '%s'\n", closer) resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) } @@ -98,12 +98,12 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error defer dht.dslock.Unlock() dskey := u.Key(pmes.GetKey()).DsKey() err := dht.datastore.Put(dskey, pmes.GetValue()) - u.DOut("[%s] handlePutValue %v %v\n", dht.self.ID.Pretty(), dskey, pmes.GetValue()) + log.Debug("%s handlePutValue %v %v\n", dht.self, dskey, pmes.GetValue()) return pmes, err } func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { - u.DOut("[%s] Responding to ping from [%s]!\n", dht.self.ID.Pretty(), p.ID.Pretty()) + log.Debug("%s Responding to ping from %s!\n", dht.self, p) return pmes, nil } @@ -119,16 +119,16 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error } if closest == nil { - u.PErr("handleFindPeer: could not find anything.\n") + log.Error("handleFindPeer: could not find anything.\n") return resp, nil } if len(closest.Addresses) == 0 { - u.PErr("handleFindPeer: no addresses for connected peer...\n") + log.Error("handleFindPeer: no addresses for connected peer...\n") return resp, nil } - u.DOut("handleFindPeer: sending back '%s'\n", closest.ID.Pretty()) + log.Debug("handleFindPeer: sending back '%s'\n", closest) resp.CloserPeers = peersToPBPeers([]*peer.Peer{closest}) return resp, nil } @@ -140,7 +140,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, e dsk := u.Key(pmes.GetKey()).DsKey() has, err := dht.datastore.Has(dsk) if err != nil && err != ds.ErrNotFound { - u.PErr("unexpected datastore error: %v\n", err) + log.Error("unexpected datastore error: %v\n", err) has = false } @@ -172,8 +172,7 @@ type providerInfo struct { func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, error) { key := u.Key(pmes.GetKey()) - u.DOut("[%s] Adding [%s] as a provider for '%s'\n", - dht.self.ID.Pretty(), p.ID.Pretty(), peer.ID(key).Pretty()) + log.Debug("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) dht.providers.AddProvider(key, p) return pmes, nil // send back same msg as confirmation. @@ -192,7 +191,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) (*Message, err for _, ps := range seq { _, err := msg.FromObject(ps, pmes) if err != nil { - u.PErr("handleDiagnostics error creating message: %v\n", err) + log.Error("handleDiagnostics error creating message: %v\n", err) continue } // dht.sender.SendRequest(context.TODO(), mes) diff --git a/routing/dht/query.go b/routing/dht/query.go index a62646f05b..0a9ca0bd83 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -151,7 +151,7 @@ func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { if next == nil { // wtf why are peers nil?!? - u.PErr("Query getting nil peers!!!\n") + log.Error("Query getting nil peers!!!\n") return } @@ -170,7 +170,7 @@ func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { r.peersSeen[next.Key()] = next r.Unlock() - log.Debug("adding peer to query: %v\n", next.ID.Pretty()) + log.Debug("adding peer to query: %v\n", next) // do this after unlocking to prevent possible deadlocks. r.peersRemaining.Increment(1) @@ -194,14 +194,14 @@ func (r *dhtQueryRunner) spawnWorkers() { if !more { return // channel closed. } - u.DOut("spawning worker for: %v\n", p.ID.Pretty()) + log.Debug("spawning worker for: %v\n", p) go r.queryPeer(p) } } } func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { - u.DOut("spawned worker for: %v\n", p.ID.Pretty()) + log.Debug("spawned worker for: %v\n", p) // make sure we rate limit concurrency. select { @@ -211,33 +211,33 @@ func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { return } - u.DOut("running worker for: %v\n", p.ID.Pretty()) + log.Debug("running worker for: %v\n", p) // finally, run the query against this peer res, err := r.query.qfunc(r.ctx, p) if err != nil { - u.DOut("ERROR worker for: %v %v\n", p.ID.Pretty(), err) + log.Debug("ERROR worker for: %v %v\n", p, err) r.Lock() r.errs = append(r.errs, err) r.Unlock() } else if res.success { - u.DOut("SUCCESS worker for: %v\n", p.ID.Pretty(), res) + log.Debug("SUCCESS worker for: %v\n", p, res) r.Lock() r.result = res r.Unlock() r.cancel() // signal to everyone that we're done. } else if res.closerPeers != nil { - u.DOut("PEERS CLOSER -- worker for: %v\n", p.ID.Pretty()) + log.Debug("PEERS CLOSER -- worker for: %v\n", p) for _, next := range res.closerPeers { r.addPeerToQuery(next, p) } } // signal we're done proccessing peer p - u.DOut("completing worker for: %v\n", p.ID.Pretty()) + log.Debug("completing worker for: %v\n", p) r.peersRemaining.Decrement(1) r.rateLimit <- struct{}{} } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4fa6c8c946..25567038cd 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -18,7 +18,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { - log.Debug("PutValue %s", key.Pretty()) + log.Debug("PutValue %s", key) err := dht.putLocal(key, value) if err != nil { return err @@ -31,7 +31,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error } query := newQuery(key, func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { - log.Debug("[%s] PutValue qry part %v", dht.self.ID.Pretty(), p.ID.Pretty()) + log.Debug("%s PutValue qry part %v", dht.self, p) err := dht.putValueToNetwork(ctx, p, string(key), value) if err != nil { return nil, err @@ -47,7 +47,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { - log.Debug("Get Value [%s]", key.Pretty()) + log.Debug("Get Value [%s]", key) // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... @@ -189,7 +189,7 @@ func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet // FindProviders searches for peers who can provide the value for given key. func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, error) { // get closest peer - log.Debug("Find providers for: '%s'", key.Pretty()) + log.Debug("Find providers for: '%s'", key) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { return nil, nil @@ -333,11 +333,11 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(ctx context.Context, p *peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? - log.Info("ping %s start", p.ID.Pretty()) + log.Info("ping %s start", p) pmes := newMessage(Message_PING, "", 0) _, err := dht.sendRequest(ctx, p, pmes) - log.Info("ping %s end (err = %s)", p.ID.Pretty(), err) + log.Info("ping %s end (err = %s)", p, err) return err } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 49be52c655..cc1cdfba1d 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -101,7 +101,7 @@ func TestTableFind(t *testing.T) { rt.Update(peers[i]) } - t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + t.Logf("Searching for peer: '%s'", peers[2]) found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) if !found.ID.Equal(peers[2].ID) { t.Fatalf("Failed to lookup known node...") @@ -118,7 +118,7 @@ func TestTableFindMultiple(t *testing.T) { rt.Update(peers[i]) } - t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + t.Logf("Searching for peer: '%s'", peers[2]) found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") From f82b3d880582f184fe357f17546b44aaad1db94b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 8 Oct 2014 04:14:50 -0700 Subject: [PATCH 0207/3147] New NameSystem interface type NameSystem interface { Resolver Publisher } should say it all. cc @whyrusleeping This commit was moved from ipfs/go-namesys@21228bf8b077d5c17c8f56df2ead9c329981e58b --- namesys/dns.go | 7 ++--- namesys/interface.go | 43 +++++++++++++++++++++++++++++++ namesys/namesys.go | 57 +++++++++++++++++++++++++++++++++++++++++ namesys/nsresolver.go | 8 ------ namesys/proquint.go | 6 +++-- namesys/publisher.go | 22 ++++++---------- namesys/resolve_test.go | 21 +++------------ namesys/resolver.go | 42 ------------------------------ namesys/routing.go | 24 ++++++++--------- 9 files changed, 132 insertions(+), 98 deletions(-) create mode 100644 namesys/interface.go create mode 100644 namesys/namesys.go delete mode 100644 namesys/nsresolver.go delete mode 100644 namesys/resolver.go diff --git a/namesys/dns.go b/namesys/dns.go index 8dda6cb51e..66448511f8 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -4,9 +4,10 @@ import ( "net" b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" + isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + u "github.com/jbenet/go-ipfs/util" - isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" ) // DNSResolver implements a Resolver on DNS domains @@ -15,8 +16,8 @@ type DNSResolver struct { // cache would need a timeout } -// Matches implements Resolver -func (r *DNSResolver) Matches(name string) bool { +// CanResolve implements Resolver +func (r *DNSResolver) CanResolve(name string) bool { return isd.IsDomain(name) } diff --git a/namesys/interface.go b/namesys/interface.go new file mode 100644 index 0000000000..eef1fc32b2 --- /dev/null +++ b/namesys/interface.go @@ -0,0 +1,43 @@ +package namesys + +import ( + "errors" + + ci "github.com/jbenet/go-ipfs/crypto" +) + +// ErrResolveFailed signals an error when attempting to resolve. +var ErrResolveFailed = errors.New("could not resolve name.") + +// ErrPublishFailed signals an error when attempting to publish. +var ErrPublishFailed = errors.New("could not publish name.") + +// Namesys represents a cohesive name publishing and resolving system. +// +// Publishing a name is the process of establishing a mapping, a key-value +// pair, according to naming rules and databases. +// +// Resolving a name is the process of looking up the value associated with the +// key (name). +type NameSystem interface { + Resolver + Publisher +} + +// Resolver is an object capable of resolving names. +type Resolver interface { + + // Resolve looks up a name, and returns the value previously published. + Resolve(name string) (value string, err error) + + // CanResolve checks whether this Resolver can resolve a name + CanResolve(name string) bool +} + +// Publisher is an object capable of publishing particular names. +type Publisher interface { + + // Publish establishes a name-value mapping. + // TODO make this not PrivKey specific. + Publish(name ci.PrivKey, value string) error +} diff --git a/namesys/namesys.go b/namesys/namesys.go new file mode 100644 index 0000000000..2ea9a30bdf --- /dev/null +++ b/namesys/namesys.go @@ -0,0 +1,57 @@ +package namesys + +import ( + ci "github.com/jbenet/go-ipfs/crypto" + routing "github.com/jbenet/go-ipfs/routing" +) + +// ipnsNameSystem implements IPNS naming. +// +// Uses three Resolvers: +// (a) ipfs routing naming: SFS-like PKI names. +// (b) dns domains: resolves using links in DNS TXT records +// (c) proquints: interprets string as the raw byte data. +// +// It can only publish to: (a) ipfs routing naming. +// +type ipns struct { + resolvers []Resolver + publisher Publisher +} + +// NewNameSystem will construct the IPFS naming system based on Routing +func NewNameSystem(r routing.IpfsRouting) NameSystem { + return &ipns{ + resolvers: []Resolver{ + new(DNSResolver), + new(ProquintResolver), + NewRoutingResolver(r), + }, + publisher: NewRoutingPublisher(r), + } +} + +// Resolve implements Resolver +func (ns *ipns) Resolve(name string) (string, error) { + for _, r := range ns.resolvers { + if r.CanResolve(name) { + return r.Resolve(name) + } + } + return "", ErrResolveFailed +} + +// CanResolve implements Resolver +func (ns *ipns) CanResolve(name string) bool { + for _, r := range ns.resolvers { + if r.CanResolve(name) { + return true + } + } + return false +} + +// Publish implements Publisher +func (ns *ipns) Publish(name ci.PrivKey, value string) error { + return ns.publisher.Publish(name, value) +} diff --git a/namesys/nsresolver.go b/namesys/nsresolver.go deleted file mode 100644 index 89ef9ff5a8..0000000000 --- a/namesys/nsresolver.go +++ /dev/null @@ -1,8 +0,0 @@ -package namesys - -type Resolver interface { - // Resolve returns a base58 encoded string - Resolve(string) (string, error) - - Matches(string) bool -} diff --git a/namesys/proquint.go b/namesys/proquint.go index bf34c3b6c9..89bbc4a44c 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -8,13 +8,15 @@ import ( type ProquintResolver struct{} -func (r *ProquintResolver) Matches(name string) bool { +// CanResolve implements Resolver. Checks whether the name is a proquint string. +func (r *ProquintResolver) CanResolve(name string) bool { ok, err := proquint.IsProquint(name) return err == nil && ok } +// Resolve implements Resolver. Decodes the proquint string. func (r *ProquintResolver) Resolve(name string) (string, error) { - ok := r.Matches(name) + ok := r.CanResolve(name) if !ok { return "", errors.New("not a valid proquint string") } diff --git a/namesys/publisher.go b/namesys/publisher.go index 0c605301c9..0828f5e086 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,32 +7,26 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" - mdag "github.com/jbenet/go-ipfs/merkledag" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) +// ipnsPublisher is capable of publishing and resolving names to the IPFS +// routing system. type ipnsPublisher struct { - dag *mdag.DAGService routing routing.IpfsRouting } -type Publisher interface { - Publish(ci.PrivKey, string) error +// NewRoutingPublisher constructs a publisher for the IPFS Routing name system. +func NewRoutingPublisher(route routing.IpfsRouting) Publisher { + return &ipnsPublisher{routing: route} } -func NewPublisher(dag *mdag.DAGService, route routing.IpfsRouting) Publisher { - return &ipnsPublisher{ - dag: dag, - routing: route, - } -} - -// Publish accepts a keypair and a value, +// Publish implements Publisher. Accepts a keypair and a value, func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { log.Debug("namesys: Publish %s", value) ctx := context.TODO() - data, err := CreateEntryData(k, value) + data, err := createRoutingEntryData(k, value) if err != nil { return err } @@ -63,7 +57,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { return nil } -func CreateEntryData(pk ci.PrivKey, val string) ([]byte, error) { +func createRoutingEntryData(pk ci.PrivKey, val string) ([]byte, error) { entry := new(IpnsEntry) sig, err := pk.Sign([]byte(val)) if err != nil { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index ff5292224f..30b996647d 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -4,9 +4,7 @@ import ( "testing" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - bs "github.com/jbenet/go-ipfs/blockservice" ci "github.com/jbenet/go-ipfs/crypto" - mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/peer" mock "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" @@ -19,26 +17,15 @@ func TestRoutingResolve(t *testing.T) { lds := ds.NewMapDatastore() d := mock.NewMockRouter(local, lds) - bserv, err := bs.NewBlockService(lds, nil) - if err != nil { - t.Fatal(err) - } - - dag := &mdag.DAGService{Blocks: bserv} - - resolve := NewMasterResolver(d, dag) - - pub := ipnsPublisher{ - dag: dag, - routing: d, - } + resolver := NewRoutingResolver(d) + publisher := NewRoutingPublisher(d) privk, pubk, err := ci.GenerateKeyPair(ci.RSA, 512) if err != nil { t.Fatal(err) } - err = pub.Publish(privk, "Hello") + err = publisher.Publish(privk, "Hello") if err != nil { t.Fatal(err) } @@ -49,7 +36,7 @@ func TestRoutingResolve(t *testing.T) { } pkhash := u.Hash(pubkb) - res, err := resolve.Resolve(u.Key(pkhash).Pretty()) + res, err := resolver.Resolve(u.Key(pkhash).Pretty()) if err != nil { t.Fatal(err) } diff --git a/namesys/resolver.go b/namesys/resolver.go deleted file mode 100644 index 7765a4ba07..0000000000 --- a/namesys/resolver.go +++ /dev/null @@ -1,42 +0,0 @@ -package namesys - -import ( - "errors" - - mdag "github.com/jbenet/go-ipfs/merkledag" - "github.com/jbenet/go-ipfs/routing" -) - -var ErrCouldntResolve = errors.New("could not resolve name.") - -type masterResolver struct { - res []Resolver -} - -func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) Resolver { - mr := new(masterResolver) - mr.res = []Resolver{ - new(DNSResolver), - new(ProquintResolver), - NewRoutingResolver(r, dag), - } - return mr -} - -func (mr *masterResolver) Resolve(name string) (string, error) { - for _, r := range mr.res { - if r.Matches(name) { - return r.Resolve(name) - } - } - return "", ErrCouldntResolve -} - -func (mr *masterResolver) Matches(name string) bool { - for _, r := range mr.res { - if r.Matches(name) { - return true - } - } - return false -} diff --git a/namesys/routing.go b/namesys/routing.go index abacb22d4f..da1c05d0e8 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -8,32 +8,32 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ci "github.com/jbenet/go-ipfs/crypto" - mdag "github.com/jbenet/go-ipfs/merkledag" - "github.com/jbenet/go-ipfs/routing" + routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) var log = u.Logger("namesys") -// RoutingResolver implements NSResolver for the main IPFS SFS-like naming -type RoutingResolver struct { +// routingResolver implements NSResolver for the main IPFS SFS-like naming +type routingResolver struct { routing routing.IpfsRouting - dag *mdag.DAGService } -func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) *RoutingResolver { - return &RoutingResolver{ - routing: route, - dag: dagservice, - } +// NewRoutingResolver constructs a name resolver using the IPFS Routing system +// to implement SFS-like naming on top. +func NewRoutingResolver(route routing.IpfsRouting) Resolver { + return &routingResolver{routing: route} } -func (r *RoutingResolver) Matches(name string) bool { +// CanResolve implements Resolver. Checks whether name is a b58 encoded string. +func (r *routingResolver) CanResolve(name string) bool { _, err := mh.FromB58String(name) return err == nil } -func (r *RoutingResolver) Resolve(name string) (string, error) { +// Resolve implements Resolver. Uses the IPFS routing system to resolve SFS-like +// names. +func (r *routingResolver) Resolve(name string) (string, error) { log.Debug("RoutingResolve: '%s'", name) ctx := context.TODO() hash, err := mh.FromB58String(name) From 29709bec0ed4835173b4db34aa5a9500ec0cf16d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Oct 2014 21:14:18 +0000 Subject: [PATCH 0208/3147] Rework package structure for unixfs and subpackage cc @jbenet This commit was moved from ipfs/go-unixfs@26ca445614bc2b7780e5d7421b8a785ffbc2e165 --- unixfs/Makefile | 5 + unixfs/data.pb.go | 101 ++++++++++++++++++ unixfs/data.proto | 14 +++ unixfs/format.go | 119 +++++++++++++++++++++ unixfs/format_test.go | 36 +++++++ unixfs/io/dagmodifier.go | 192 ++++++++++++++++++++++++++++++++++ unixfs/io/dagmodifier_test.go | 159 ++++++++++++++++++++++++++++ unixfs/io/dagreader.go | 145 +++++++++++++++++++++++++ unixfs/io/dagwriter.go | 107 +++++++++++++++++++ unixfs/io/dagwriter_test.go | 127 ++++++++++++++++++++++ 10 files changed, 1005 insertions(+) create mode 100644 unixfs/Makefile create mode 100644 unixfs/data.pb.go create mode 100644 unixfs/data.proto create mode 100644 unixfs/format.go create mode 100644 unixfs/format_test.go create mode 100644 unixfs/io/dagmodifier.go create mode 100644 unixfs/io/dagmodifier_test.go create mode 100644 unixfs/io/dagreader.go create mode 100644 unixfs/io/dagwriter.go create mode 100644 unixfs/io/dagwriter_test.go diff --git a/unixfs/Makefile b/unixfs/Makefile new file mode 100644 index 0000000000..87f182fe5b --- /dev/null +++ b/unixfs/Makefile @@ -0,0 +1,5 @@ +all: data.pb.go + +data.pb.go: data.proto + protoc --go_out=. data.proto + diff --git a/unixfs/data.pb.go b/unixfs/data.pb.go new file mode 100644 index 0000000000..89e5f80844 --- /dev/null +++ b/unixfs/data.pb.go @@ -0,0 +1,101 @@ +// Code generated by protoc-gen-go. +// source: data.proto +// DO NOT EDIT! + +/* +Package unixfs is a generated protocol buffer package. + +It is generated from these files: + data.proto + +It has these top-level messages: + PBData +*/ +package unixfs + +import proto "code.google.com/p/goprotobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type PBData_DataType int32 + +const ( + PBData_Raw PBData_DataType = 0 + PBData_Directory PBData_DataType = 1 + PBData_File PBData_DataType = 2 +) + +var PBData_DataType_name = map[int32]string{ + 0: "Raw", + 1: "Directory", + 2: "File", +} +var PBData_DataType_value = map[string]int32{ + "Raw": 0, + "Directory": 1, + "File": 2, +} + +func (x PBData_DataType) Enum() *PBData_DataType { + p := new(PBData_DataType) + *p = x + return p +} +func (x PBData_DataType) String() string { + return proto.EnumName(PBData_DataType_name, int32(x)) +} +func (x *PBData_DataType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PBData_DataType_value, data, "PBData_DataType") + if err != nil { + return err + } + *x = PBData_DataType(value) + return nil +} + +type PBData struct { + Type *PBData_DataType `protobuf:"varint,1,req,enum=unixfs.PBData_DataType" json:"Type,omitempty"` + Data []byte `protobuf:"bytes,2,opt" json:"Data,omitempty"` + Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` + Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PBData) Reset() { *m = PBData{} } +func (m *PBData) String() string { return proto.CompactTextString(m) } +func (*PBData) ProtoMessage() {} + +func (m *PBData) GetType() PBData_DataType { + if m != nil && m.Type != nil { + return *m.Type + } + return PBData_Raw +} + +func (m *PBData) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *PBData) GetFilesize() uint64 { + if m != nil && m.Filesize != nil { + return *m.Filesize + } + return 0 +} + +func (m *PBData) GetBlocksizes() []uint64 { + if m != nil { + return m.Blocksizes + } + return nil +} + +func init() { + proto.RegisterEnum("unixfs.PBData_DataType", PBData_DataType_name, PBData_DataType_value) +} diff --git a/unixfs/data.proto b/unixfs/data.proto new file mode 100644 index 0000000000..b9504b0c32 --- /dev/null +++ b/unixfs/data.proto @@ -0,0 +1,14 @@ +package unixfs; + +message PBData { + enum DataType { + Raw = 0; + Directory = 1; + File = 2; + } + + required DataType Type = 1; + optional bytes Data = 2; + optional uint64 filesize = 3; + repeated uint64 blocksizes = 4; +} diff --git a/unixfs/format.go b/unixfs/format.go new file mode 100644 index 0000000000..6ba8e3aa47 --- /dev/null +++ b/unixfs/format.go @@ -0,0 +1,119 @@ +// Package format implements a data format for files in the ipfs filesystem +// It is not the only format in ipfs, but it is the one that the filesystem assumes +package unixfs + +import ( + "errors" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" +) + +var ErrMalformedFileFormat = errors.New("malformed data in file format") +var ErrInvalidDirLocation = errors.New("found directory node in unexpected place") +var ErrUnrecognizedType = errors.New("unrecognized node type") + +func FromBytes(data []byte) (*PBData, error) { + pbdata := new(PBData) + err := proto.Unmarshal(data, pbdata) + if err != nil { + return nil, err + } + return pbdata, nil +} + +func FilePBData(data []byte, totalsize uint64) []byte { + pbfile := new(PBData) + typ := PBData_File + pbfile.Type = &typ + pbfile.Data = data + pbfile.Filesize = proto.Uint64(totalsize) + + data, err := proto.Marshal(pbfile) + if err != nil { + // This really shouldnt happen, i promise + // The only failure case for marshal is if required fields + // are not filled out, and they all are. If the proto object + // gets changed and nobody updates this function, the code + // should panic due to programmer error + panic(err) + } + return data +} + +// Returns Bytes that represent a Directory +func FolderPBData() []byte { + pbfile := new(PBData) + typ := PBData_Directory + pbfile.Type = &typ + + data, err := proto.Marshal(pbfile) + if err != nil { + //this really shouldnt happen, i promise + panic(err) + } + return data +} + +func WrapData(b []byte) []byte { + pbdata := new(PBData) + typ := PBData_Raw + pbdata.Data = b + pbdata.Type = &typ + + out, err := proto.Marshal(pbdata) + if err != nil { + // This shouldnt happen. seriously. + panic(err) + } + + return out +} + +func UnwrapData(data []byte) ([]byte, error) { + pbdata := new(PBData) + err := proto.Unmarshal(data, pbdata) + if err != nil { + return nil, err + } + return pbdata.GetData(), nil +} + +func DataSize(data []byte) (uint64, error) { + pbdata := new(PBData) + err := proto.Unmarshal(data, pbdata) + if err != nil { + return 0, err + } + + switch pbdata.GetType() { + case PBData_Directory: + return 0, errors.New("Cant get data size of directory!") + case PBData_File: + return pbdata.GetFilesize(), nil + case PBData_Raw: + return uint64(len(pbdata.GetData())), nil + default: + return 0, errors.New("Unrecognized node data type!") + } +} + +type MultiBlock struct { + Data []byte + blocksizes []uint64 + subtotal uint64 +} + +func (mb *MultiBlock) AddBlockSize(s uint64) { + mb.subtotal += s + mb.blocksizes = append(mb.blocksizes, s) +} + +func (mb *MultiBlock) GetBytes() ([]byte, error) { + pbn := new(PBData) + t := PBData_File + pbn.Type = &t + pbn.Filesize = proto.Uint64(uint64(len(mb.Data)) + mb.subtotal) + pbn.Blocksizes = mb.blocksizes + pbn.Data = mb.Data + return proto.Marshal(pbn) +} diff --git a/unixfs/format_test.go b/unixfs/format_test.go new file mode 100644 index 0000000000..eca926e9f1 --- /dev/null +++ b/unixfs/format_test.go @@ -0,0 +1,36 @@ +package unixfs + +import ( + "testing" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" +) + +func TestMultiBlock(t *testing.T) { + mbf := new(MultiBlock) + for i := 0; i < 15; i++ { + mbf.AddBlockSize(100) + } + + mbf.Data = make([]byte, 128) + + b, err := mbf.GetBytes() + if err != nil { + t.Fatal(err) + } + + pbn := new(PBData) + err = proto.Unmarshal(b, pbn) + if err != nil { + t.Fatal(err) + } + + ds, err := DataSize(b) + if err != nil { + t.Fatal(err) + } + + if ds != (100*15)+128 { + t.Fatal("Datasize calculations incorrect!") + } +} diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go new file mode 100644 index 0000000000..8680da46a2 --- /dev/null +++ b/unixfs/io/dagmodifier.go @@ -0,0 +1,192 @@ +package io + +import ( + "bytes" + "errors" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + + "github.com/jbenet/go-ipfs/importer/chunk" + mdag "github.com/jbenet/go-ipfs/merkledag" + ft "github.com/jbenet/go-ipfs/unixfs" + u "github.com/jbenet/go-ipfs/util" +) + +// DagModifier is the only struct licensed and able to correctly +// perform surgery on a DAG 'file' +// Dear god, please rename this to something more pleasant +type DagModifier struct { + dagserv *mdag.DAGService + curNode *mdag.Node + + pbdata *ft.PBData + splitter chunk.BlockSplitter +} + +func NewDagModifier(from *mdag.Node, serv *mdag.DAGService, spl chunk.BlockSplitter) (*DagModifier, error) { + pbd, err := ft.FromBytes(from.Data) + if err != nil { + return nil, err + } + + return &DagModifier{ + curNode: from.Copy(), + dagserv: serv, + pbdata: pbd, + splitter: spl, + }, nil +} + +// WriteAt will modify a dag file in place +// NOTE: it currently assumes only a single level of indirection +func (dm *DagModifier) WriteAt(b []byte, offset uint64) (int, error) { + + // Check bounds + if dm.pbdata.GetFilesize() < offset { + return 0, errors.New("Attempted to perform write starting past end of file") + } + + // First need to find where we are writing at + end := uint64(len(b)) + offset + + // This shouldnt be necessary if we do subblocks sizes properly + newsize := dm.pbdata.GetFilesize() + if end > dm.pbdata.GetFilesize() { + newsize = end + } + zeroblocklen := uint64(len(dm.pbdata.Data)) + origlen := len(b) + + if end <= zeroblocklen { + log.Debug("Writing into zero block.") + // Replacing zeroeth data block (embedded in the root node) + //TODO: check chunking here + copy(dm.pbdata.Data[offset:], b) + return len(b), nil + } + + // Find where write should start + var traversed uint64 + startsubblk := len(dm.pbdata.Blocksizes) + if offset < zeroblocklen { + dm.pbdata.Data = dm.pbdata.Data[:offset] + startsubblk = 0 + } else { + traversed = uint64(zeroblocklen) + for i, size := range dm.pbdata.Blocksizes { + if uint64(offset) < traversed+size { + log.Debug("Starting mod at block %d. [%d < %d + %d]", i, offset, traversed, size) + // Here is where we start + startsubblk = i + lnk := dm.curNode.Links[i] + node, err := dm.dagserv.Get(u.Key(lnk.Hash)) + if err != nil { + return 0, err + } + data, err := ft.UnwrapData(node.Data) + if err != nil { + return 0, err + } + + // We have to rewrite the data before our write in this block. + b = append(data[:offset-traversed], b...) + break + } + traversed += size + } + if startsubblk == len(dm.pbdata.Blocksizes) { + // TODO: Im not sure if theres any case that isnt being handled here. + // leaving this note here as a future reference in case something breaks + } + } + + // Find blocks that need to be overwritten + var changed []int + mid := -1 + var midoff uint64 + for i, size := range dm.pbdata.Blocksizes[startsubblk:] { + if end > traversed { + changed = append(changed, i+startsubblk) + } else { + break + } + traversed += size + if end < traversed { + mid = i + startsubblk + midoff = end - (traversed - size) + break + } + } + + // If our write starts in the middle of a block... + var midlnk *mdag.Link + if mid >= 0 { + midlnk = dm.curNode.Links[mid] + midnode, err := dm.dagserv.Get(u.Key(midlnk.Hash)) + if err != nil { + return 0, err + } + + // NOTE: this may have to be changed later when we have multiple + // layers of indirection + data, err := ft.UnwrapData(midnode.Data) + if err != nil { + return 0, err + } + b = append(b, data[midoff:]...) + } + + // Generate new sub-blocks, and sizes + subblocks := splitBytes(b, dm.splitter) + var links []*mdag.Link + var sizes []uint64 + for _, sb := range subblocks { + n := &mdag.Node{Data: ft.WrapData(sb)} + _, err := dm.dagserv.Add(n) + if err != nil { + log.Error("Failed adding node to DAG service: %s", err) + return 0, err + } + lnk, err := mdag.MakeLink(n) + if err != nil { + return 0, err + } + links = append(links, lnk) + sizes = append(sizes, uint64(len(sb))) + } + + // This is disgusting (and can be rewritten if performance demands) + if len(changed) > 0 { + sechalflink := append(links, dm.curNode.Links[changed[len(changed)-1]+1:]...) + dm.curNode.Links = append(dm.curNode.Links[:changed[0]], sechalflink...) + sechalfblks := append(sizes, dm.pbdata.Blocksizes[changed[len(changed)-1]+1:]...) + dm.pbdata.Blocksizes = append(dm.pbdata.Blocksizes[:changed[0]], sechalfblks...) + } else { + dm.curNode.Links = append(dm.curNode.Links, links...) + dm.pbdata.Blocksizes = append(dm.pbdata.Blocksizes, sizes...) + } + dm.pbdata.Filesize = proto.Uint64(newsize) + + return origlen, nil +} + +// splitBytes uses a splitterFunc to turn a large array of bytes +// into many smaller arrays of bytes +func splitBytes(b []byte, spl chunk.BlockSplitter) [][]byte { + out := spl.Split(bytes.NewReader(b)) + var arr [][]byte + for blk := range out { + arr = append(arr, blk) + } + return arr +} + +// GetNode gets the modified DAG Node +func (dm *DagModifier) GetNode() (*mdag.Node, error) { + b, err := proto.Marshal(dm.pbdata) + if err != nil { + return nil, err + } + dm.curNode.Data = b + return dm.curNode.Copy(), nil +} diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go new file mode 100644 index 0000000000..e3ea8e4f76 --- /dev/null +++ b/unixfs/io/dagmodifier_test.go @@ -0,0 +1,159 @@ +package io + +import ( + "fmt" + "io" + "io/ioutil" + "testing" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" + bs "github.com/jbenet/go-ipfs/blockservice" + "github.com/jbenet/go-ipfs/importer/chunk" + mdag "github.com/jbenet/go-ipfs/merkledag" + ft "github.com/jbenet/go-ipfs/unixfs" + u "github.com/jbenet/go-ipfs/util" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" +) + +func getMockDagServ(t *testing.T) *mdag.DAGService { + dstore := ds.NewMapDatastore() + bserv, err := bs.NewBlockService(dstore, nil) + if err != nil { + t.Fatal(err) + } + return &mdag.DAGService{bserv} +} + +func getNode(t *testing.T, dserv *mdag.DAGService, size int64) ([]byte, *mdag.Node) { + dw := NewDagWriter(dserv, &chunk.SizeSplitter{500}) + + n, err := io.CopyN(dw, u.NewFastRand(), size) + if err != nil { + t.Fatal(err) + } + if n != size { + t.Fatal("Incorrect copy amount!") + } + + dw.Close() + node := dw.GetNode() + + dr, err := NewDagReader(node, dserv) + if err != nil { + t.Fatal(err) + } + + b, err := ioutil.ReadAll(dr) + if err != nil { + t.Fatal(err) + } + + return b, node +} + +func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { + newdata := make([]byte, size) + r := u.NewFastRand() + r.Read(newdata) + + if size+beg > uint64(len(orig)) { + orig = append(orig, make([]byte, (size+beg)-uint64(len(orig)))...) + } + copy(orig[beg:], newdata) + + nmod, err := dm.WriteAt(newdata, uint64(beg)) + if err != nil { + t.Fatal(err) + } + + if nmod != int(size) { + t.Fatalf("Mod length not correct! %d != %d", nmod, size) + } + + nd, err := dm.GetNode() + if err != nil { + t.Fatal(err) + } + + rd, err := NewDagReader(nd, dm.dagserv) + if err != nil { + t.Fatal(err) + } + + after, err := ioutil.ReadAll(rd) + if err != nil { + t.Fatal(err) + } + + err = arrComp(after, orig) + if err != nil { + t.Fatal(err) + } + return orig +} + +func TestDagModifierBasic(t *testing.T) { + logging.SetLevel(logging.CRITICAL, "blockservice") + logging.SetLevel(logging.CRITICAL, "merkledag") + dserv := getMockDagServ(t) + b, n := getNode(t, dserv, 50000) + + dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{512}) + if err != nil { + t.Fatal(err) + } + + // Within zero block + beg := uint64(15) + length := uint64(60) + + t.Log("Testing mod within zero block") + b = testModWrite(t, beg, length, b, dagmod) + + // Within bounds of existing file + beg = 1000 + length = 4000 + t.Log("Testing mod within bounds of existing file.") + b = testModWrite(t, beg, length, b, dagmod) + + // Extend bounds + beg = 49500 + length = 4000 + + t.Log("Testing mod that extends file.") + b = testModWrite(t, beg, length, b, dagmod) + + // "Append" + beg = uint64(len(b)) + length = 3000 + b = testModWrite(t, beg, length, b, dagmod) + + // Verify reported length + node, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + size, err := ft.DataSize(node.Data) + if err != nil { + t.Fatal(err) + } + + expected := uint64(50000 + 3500 + 3000) + if size != expected { + t.Fatal("Final reported size is incorrect [%d != %d]", size, expected) + } +} + +func arrComp(a, b []byte) error { + if len(a) != len(b) { + return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) + } + for i, v := range a { + if v != b[i] { + return fmt.Errorf("Arrays differ at index: %d", i) + } + } + return nil +} diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go new file mode 100644 index 0000000000..29196a1e3f --- /dev/null +++ b/unixfs/io/dagreader.go @@ -0,0 +1,145 @@ +package io + +import ( + "bytes" + "errors" + "io" + + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + mdag "github.com/jbenet/go-ipfs/merkledag" + ft "github.com/jbenet/go-ipfs/unixfs" + u "github.com/jbenet/go-ipfs/util" +) + +var ErrIsDir = errors.New("this dag node is a directory") + +// DagReader provides a way to easily read the data contained in a dag. +type DagReader struct { + serv *mdag.DAGService + node *mdag.Node + position int + buf *bytes.Buffer +} + +// NewDagReader creates a new reader object that reads the data represented by the given +// node, using the passed in DAGService for data retreival +func NewDagReader(n *mdag.Node, serv *mdag.DAGService) (io.Reader, error) { + pb := new(ft.PBData) + err := proto.Unmarshal(n.Data, pb) + if err != nil { + return nil, err + } + + switch pb.GetType() { + case ft.PBData_Directory: + // Dont allow reading directories + return nil, ErrIsDir + case ft.PBData_File: + return &DagReader{ + node: n, + serv: serv, + buf: bytes.NewBuffer(pb.GetData()), + }, nil + case ft.PBData_Raw: + // Raw block will just be a single level, return a byte buffer + return bytes.NewBuffer(pb.GetData()), nil + default: + return nil, ft.ErrUnrecognizedType + } +} + +// Follows the next link in line and loads it from the DAGService, +// setting the next buffer to read from +func (dr *DagReader) precalcNextBuf() error { + if dr.position >= len(dr.node.Links) { + return io.EOF + } + nxtLink := dr.node.Links[dr.position] + nxt := nxtLink.Node + if nxt == nil { + nxtNode, err := dr.serv.Get(u.Key(nxtLink.Hash)) + if err != nil { + return err + } + nxt = nxtNode + } + pb := new(ft.PBData) + err := proto.Unmarshal(nxt.Data, pb) + if err != nil { + return err + } + dr.position++ + + switch pb.GetType() { + case ft.PBData_Directory: + return ft.ErrInvalidDirLocation + case ft.PBData_File: + //TODO: this *should* work, needs testing first + //return NewDagReader(nxt, dr.serv) + panic("Not yet handling different layers of indirection!") + case ft.PBData_Raw: + dr.buf = bytes.NewBuffer(pb.GetData()) + return nil + default: + return ft.ErrUnrecognizedType + } +} + +func (dr *DagReader) Read(b []byte) (int, error) { + // If no cached buffer, load one + if dr.buf == nil { + err := dr.precalcNextBuf() + if err != nil { + return 0, err + } + } + total := 0 + for { + // Attempt to fill bytes from cached buffer + n, err := dr.buf.Read(b[total:]) + total += n + if err != nil { + // EOF is expected + if err != io.EOF { + return total, err + } + } + + // If weve read enough bytes, return + if total == len(b) { + return total, nil + } + + // Otherwise, load up the next block + err = dr.precalcNextBuf() + if err != nil { + return total, err + } + } +} + +/* +func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { + switch whence { + case os.SEEK_SET: + for i := 0; i < len(dr.node.Links); i++ { + nsize := dr.node.Links[i].Size - 8 + if offset > nsize { + offset -= nsize + } else { + break + } + } + dr.position = i + err := dr.precalcNextBuf() + if err != nil { + return 0, err + } + case os.SEEK_CUR: + case os.SEEK_END: + default: + return 0, errors.New("invalid whence") + } + return 0, nil +} +*/ diff --git a/unixfs/io/dagwriter.go b/unixfs/io/dagwriter.go new file mode 100644 index 0000000000..4abb1b36c7 --- /dev/null +++ b/unixfs/io/dagwriter.go @@ -0,0 +1,107 @@ +package io + +import ( + "github.com/jbenet/go-ipfs/importer/chunk" + dag "github.com/jbenet/go-ipfs/merkledag" + ft "github.com/jbenet/go-ipfs/unixfs" + "github.com/jbenet/go-ipfs/util" +) + +var log = util.Logger("dagwriter") + +type DagWriter struct { + dagserv *dag.DAGService + node *dag.Node + totalSize int64 + splChan chan []byte + done chan struct{} + splitter chunk.BlockSplitter + seterr error +} + +func NewDagWriter(ds *dag.DAGService, splitter chunk.BlockSplitter) *DagWriter { + dw := new(DagWriter) + dw.dagserv = ds + dw.splChan = make(chan []byte, 8) + dw.splitter = splitter + dw.done = make(chan struct{}) + go dw.startSplitter() + return dw +} + +// startSplitter manages splitting incoming bytes and +// creating dag nodes from them. Created nodes are stored +// in the DAGService and then released to the GC. +func (dw *DagWriter) startSplitter() { + + // Since the splitter functions take a reader (and should!) + // we wrap our byte chan input in a reader + r := util.NewByteChanReader(dw.splChan) + blkchan := dw.splitter.Split(r) + + // First data block is reserved for storage in the root node + first := <-blkchan + mbf := new(ft.MultiBlock) + root := new(dag.Node) + + for blkData := range blkchan { + // Store the block size in the root node + mbf.AddBlockSize(uint64(len(blkData))) + node := &dag.Node{Data: ft.WrapData(blkData)} + _, err := dw.dagserv.Add(node) + if err != nil { + dw.seterr = err + log.Critical("Got error adding created node to dagservice: %s", err) + return + } + + // Add a link to this node without storing a reference to the memory + err = root.AddNodeLinkClean("", node) + if err != nil { + dw.seterr = err + log.Critical("Got error adding created node to root node: %s", err) + return + } + } + + // Generate the root node data + mbf.Data = first + data, err := mbf.GetBytes() + if err != nil { + dw.seterr = err + log.Critical("Failed generating bytes for multiblock file: %s", err) + return + } + root.Data = data + + // Add root node to the dagservice + _, err = dw.dagserv.Add(root) + if err != nil { + dw.seterr = err + log.Critical("Got error adding created node to dagservice: %s", err) + return + } + dw.node = root + dw.done <- struct{}{} +} + +func (dw *DagWriter) Write(b []byte) (int, error) { + if dw.seterr != nil { + return 0, dw.seterr + } + dw.splChan <- b + return len(b), nil +} + +// Close the splitters input channel and wait for it to finish +// Must be called to finish up splitting, otherwise split method +// will never halt +func (dw *DagWriter) Close() error { + close(dw.splChan) + <-dw.done + return nil +} + +func (dw *DagWriter) GetNode() *dag.Node { + return dw.node +} diff --git a/unixfs/io/dagwriter_test.go b/unixfs/io/dagwriter_test.go new file mode 100644 index 0000000000..73ba5c4e91 --- /dev/null +++ b/unixfs/io/dagwriter_test.go @@ -0,0 +1,127 @@ +package io + +import ( + "testing" + + "io" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + bs "github.com/jbenet/go-ipfs/blockservice" + chunk "github.com/jbenet/go-ipfs/importer/chunk" + mdag "github.com/jbenet/go-ipfs/merkledag" +) + +type datasource struct { + i int +} + +func (d *datasource) Read(b []byte) (int, error) { + for i, _ := range b { + b[i] = byte(d.i % 256) + d.i++ + } + return len(b), nil +} + +func (d *datasource) Matches(t *testing.T, r io.Reader, length int) bool { + b := make([]byte, 100) + i := 0 + for { + n, err := r.Read(b) + if err != nil && err != io.EOF { + t.Fatal(err) + } + for _, v := range b[:n] { + if v != byte(i%256) { + t.Fatalf("Buffers differed at byte: %d (%d != %d)", i, v, (i % 256)) + } + i++ + } + if err == io.EOF { + break + } + } + if i != length { + t.Fatalf("Incorrect length. (%d != %d)", i, length) + } + return true +} + +func TestDagWriter(t *testing.T) { + dstore := ds.NewMapDatastore() + bserv, err := bs.NewBlockService(dstore, nil) + if err != nil { + t.Fatal(err) + } + dag := &mdag.DAGService{bserv} + dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + + nbytes := int64(1024 * 1024 * 2) + n, err := io.CopyN(dw, &datasource{}, nbytes) + if err != nil { + t.Fatal(err) + } + + if n != nbytes { + t.Fatal("Copied incorrect amount of bytes!") + } + + dw.Close() + + node := dw.GetNode() + read, err := NewDagReader(node, dag) + if err != nil { + t.Fatal(err) + } + + d := &datasource{} + if !d.Matches(t, read, int(nbytes)) { + t.Fatal("Failed to validate!") + } +} + +func TestMassiveWrite(t *testing.T) { + t.SkipNow() + dstore := ds.NewNullDatastore() + bserv, err := bs.NewBlockService(dstore, nil) + if err != nil { + t.Fatal(err) + } + dag := &mdag.DAGService{bserv} + dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + + nbytes := int64(1024 * 1024 * 1024 * 16) + n, err := io.CopyN(dw, &datasource{}, nbytes) + if err != nil { + t.Fatal(err) + } + if n != nbytes { + t.Fatal("Incorrect copy size.") + } + dw.Close() +} + +func BenchmarkDagWriter(b *testing.B) { + dstore := ds.NewNullDatastore() + bserv, err := bs.NewBlockService(dstore, nil) + if err != nil { + b.Fatal(err) + } + dag := &mdag.DAGService{bserv} + + b.ResetTimer() + nbytes := int64(100000) + for i := 0; i < b.N; i++ { + b.SetBytes(nbytes) + dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + n, err := io.CopyN(dw, &datasource{}, nbytes) + if err != nil { + b.Fatal(err) + } + if n != nbytes { + b.Fatal("Incorrect copy size.") + } + dw.Close() + } + +} From 7f6d0a3fb8004ad21fa1d0f16503f7168112668b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Oct 2014 21:14:18 +0000 Subject: [PATCH 0209/3147] Rework package structure for unixfs and subpackage cc @jbenet This commit was moved from ipfs/go-ipfs-chunker@50a89a045ab61e5b436fc299f101f268934f7ae8 --- chunker/rabin.go | 94 ++++++++++++++++++++++++++++++++++++++++++++ chunker/splitting.go | 45 +++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 chunker/rabin.go create mode 100644 chunker/splitting.go diff --git a/chunker/rabin.go b/chunker/rabin.go new file mode 100644 index 0000000000..fbfb4cec41 --- /dev/null +++ b/chunker/rabin.go @@ -0,0 +1,94 @@ +package chunk + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" +) + +type MaybeRabin struct { + mask int + windowSize int + MinBlockSize int + MaxBlockSize int +} + +func NewMaybeRabin(avgBlkSize int) *MaybeRabin { + blkbits := uint(math.Log2(float64(avgBlkSize))) + rb := new(MaybeRabin) + rb.mask = (1 << blkbits) - 1 + rb.windowSize = 16 // probably a good number... + rb.MinBlockSize = avgBlkSize / 2 + rb.MaxBlockSize = (avgBlkSize / 2) * 3 + return rb +} + +func (mr *MaybeRabin) Split(r io.Reader) chan []byte { + out := make(chan []byte, 16) + go func() { + inbuf := bufio.NewReader(r) + blkbuf := new(bytes.Buffer) + + // some bullshit numbers i made up + a := 10 // honestly, no idea what this is + MOD := 33554383 // randomly chosen (seriously) + an := 1 + rollingHash := 0 + + // Window is a circular buffer + window := make([]byte, mr.windowSize) + push := func(i int, val byte) (outval int) { + outval = int(window[i%len(window)]) + window[i%len(window)] = val + return + } + + // Duplicate byte slice + dup := func(b []byte) []byte { + d := make([]byte, len(b)) + copy(d, b) + return d + } + + // Fill up the window + i := 0 + for ; i < mr.windowSize; i++ { + b, err := inbuf.ReadByte() + if err != nil { + fmt.Println(err) + return + } + blkbuf.WriteByte(b) + push(i, b) + rollingHash = (rollingHash*a + int(b)) % MOD + an = (an * a) % MOD + } + + for ; true; i++ { + b, err := inbuf.ReadByte() + if err != nil { + break + } + outval := push(i, b) + blkbuf.WriteByte(b) + rollingHash = (rollingHash*a + int(b) - an*outval) % MOD + if (rollingHash&mr.mask == mr.mask && blkbuf.Len() > mr.MinBlockSize) || + blkbuf.Len() >= mr.MaxBlockSize { + out <- dup(blkbuf.Bytes()) + blkbuf.Reset() + } + + // Check if there are enough remaining + peek, err := inbuf.Peek(mr.windowSize) + if err != nil || len(peek) != mr.windowSize { + break + } + } + io.Copy(blkbuf, inbuf) + out <- blkbuf.Bytes() + close(out) + }() + return out +} diff --git a/chunker/splitting.go b/chunker/splitting.go new file mode 100644 index 0000000000..0b5717eaf6 --- /dev/null +++ b/chunker/splitting.go @@ -0,0 +1,45 @@ +package chunk + +import ( + "io" + + "github.com/jbenet/go-ipfs/util" +) + +var log = util.Logger("chunk") + +var DefaultSplitter = &SizeSplitter{1024 * 512} + +type BlockSplitter interface { + Split(r io.Reader) chan []byte +} + +type SizeSplitter struct { + Size int +} + +func (ss *SizeSplitter) Split(r io.Reader) chan []byte { + out := make(chan []byte) + go func() { + defer close(out) + for { + chunk := make([]byte, ss.Size) + nread, err := r.Read(chunk) + if err != nil { + if err == io.EOF { + if nread > 0 { + out <- chunk[:nread] + } + return + } + log.Error("Block split error: %s", err) + return + } + if nread < ss.Size { + chunk = chunk[:nread] + } + out <- chunk + } + }() + return out +} From 2c639c9fb6189d531f4f089bbe1294f952107adf Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 8 Oct 2014 14:48:32 -0700 Subject: [PATCH 0210/3147] make vendor is your friend cc @whyrusleeping This commit was moved from ipfs/go-unixfs@68523aae982f6341a9696d8257ed01249d904af6 --- unixfs/data.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/data.pb.go b/unixfs/data.pb.go index 89e5f80844..2efdd8a4ca 100644 --- a/unixfs/data.pb.go +++ b/unixfs/data.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package unixfs -import proto "code.google.com/p/goprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 2c8268f3c05a627a3e871a644180ba31769fb82a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Oct 2014 21:55:50 +0000 Subject: [PATCH 0211/3147] add in some extra debug logging, and increase routing table latencies This commit was moved from ipfs/go-ipfs-routing@936c6a022a7a7d299a0414a51009b0226bbd8612 --- routing/dht/dht.go | 4 ++-- routing/dht/handlers.go | 1 + routing/dht/routing.go | 1 + routing/kbucket/table.go | 4 ++++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index cfa500ee28..c95e075113 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -67,8 +67,8 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende dht.providers = NewProviderManager(p.ID) dht.routingTables = make([]*kb.RoutingTable, 3) - dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*30) - dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*100) + dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*1000) + dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*1000) dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) dht.birth = time.Now() return dht diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 49e3eb7508..417dd0918f 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -137,6 +137,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, e resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. + log.Debug("handling GetProviders: '%s'", pmes.GetKey()) dsk := u.Key(pmes.GetKey()).DsKey() has, err := dht.datastore.Has(dsk) if err != nil && err != ds.ErrNotFound { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 25567038cd..d29a46fef0 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -192,6 +192,7 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, log.Debug("Find providers for: '%s'", key) p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) if p == nil { + log.Warning("Got no nearest peer for find providers: '%s'", key) return nil, nil } diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 2a0f16d1a0..242546ba40 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -11,6 +11,8 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +var log = u.Logger("table") + // RoutingTable defines the routing table. type RoutingTable struct { @@ -138,6 +140,8 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { if len(peers) > 0 { return peers[0] } + + log.Error("NearestPeer: Returning nil, table size = %d", rt.Size()) return nil } From 394ca707d1263ab617ff489e3a1bb1f47c8bd849 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Oct 2014 22:38:33 +0000 Subject: [PATCH 0212/3147] add another test to try and reproduce data loss issue This commit was moved from ipfs/go-unixfs@e46c1f5a46c7fa7931fd4b095ce388ed7fe67d75 --- unixfs/io/dagmodifier_test.go | 41 +++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index e3ea8e4f76..32d9a84b5d 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -146,6 +146,47 @@ func TestDagModifierBasic(t *testing.T) { } } +func TestMultiWrite(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + + dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{512}) + if err != nil { + t.Fatal(err) + } + + data := make([]byte, 4000) + u.NewFastRand().Read(data) + + for i := 0; i < len(data); i++ { + n, err := dagmod.WriteAt(data[i:i+1], uint64(i)) + if err != nil { + t.Fatal(err) + } + if n != 1 { + t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") + } + } + nd, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + read, err := NewDagReader(nd, dserv) + if err != nil { + t.Fatal(err) + } + rbuf, err := ioutil.ReadAll(read) + if err != nil { + t.Fatal(err) + } + + err = arrComp(rbuf, data) + if err != nil { + t.Fatal(err) + } +} + func arrComp(a, b []byte) error { if len(a) != len(b) { return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) From 9e5597c1356eba12e7e9271bb89a50df4e8f2961 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Oct 2014 03:39:45 -0700 Subject: [PATCH 0213/3147] ipfs name cmd improvements - cleaned up cmd help - ipfs name publish [] - ipfs name resolve [] - publish validates - both validate n args This commit was moved from ipfs/go-namesys@badb37ef0321365a23bb51138b3b7c8d34bf4cf1 --- namesys/publisher.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 0828f5e086..88533f8a08 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -1,10 +1,12 @@ package namesys import ( + "fmt" "time" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ci "github.com/jbenet/go-ipfs/crypto" routing "github.com/jbenet/go-ipfs/routing" @@ -25,6 +27,13 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { // Publish implements Publisher. Accepts a keypair and a value, func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { log.Debug("namesys: Publish %s", value) + + // validate `value` is a ref (multihash) + _, err := mh.FromB58String(value) + if err != nil { + return fmt.Errorf("publish value must be str multihash. %v", err) + } + ctx := context.TODO() data, err := createRoutingEntryData(k, value) if err != nil { From 7a8a8d2a3b5518e50f08b37fa51847c2b2cbe6b8 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Oct 2014 03:50:52 -0700 Subject: [PATCH 0214/3147] fixed resolver test This commit was moved from ipfs/go-namesys@fa4ebefd08a7037166b616e7c6dec0a372f30ff2 --- namesys/resolve_test.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 30b996647d..5e652f42f8 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -26,6 +26,12 @@ func TestRoutingResolve(t *testing.T) { } err = publisher.Publish(privk, "Hello") + if err == nil { + t.Fatal("should have errored out when publishing a non-multihash val") + } + + h := u.Key(u.Hash([]byte("Hello"))).Pretty() + err = publisher.Publish(privk, h) if err != nil { t.Fatal(err) } @@ -41,7 +47,7 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - if res != "Hello" { + if res != h { t.Fatal("Got back incorrect value.") } } From 3030c06ef719fc490b548676be425c4198b1fd0e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Oct 2014 04:48:13 -0700 Subject: [PATCH 0215/3147] u.DOut -> log.Debug and other logging switches. I kept the u.PErr and u.POut in cli commands, as those do need to write raw output directly. This commit was moved from ipfs/go-ipfs-routing@50a7c15a0a25433a24e6c32bff6290c29f07faed --- routing/dht/Message.go | 3 +-- routing/dht/dht_logger.go | 6 ++---- routing/dht/ext_test.go | 2 +- routing/dht/routing.go | 12 ++++++------ routing/kbucket/table.go | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 84d323c37b..435a536b19 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -3,7 +3,6 @@ package dht import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" peer "github.com/jbenet/go-ipfs/peer" - u "github.com/jbenet/go-ipfs/util" ) func newMessage(typ Message_MessageType, key string, level int) *Message { @@ -42,7 +41,7 @@ func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { func (m *Message) GetClusterLevel() int { level := m.GetClusterLevelRaw() - 1 if level < 0 { - u.DErr("GetClusterLevel: no routing level specified, assuming 0\n") + log.Error("GetClusterLevel: no routing level specified, assuming 0") level = 0 } return int(level) diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go index 403c2a66f0..1a0878bf7a 100644 --- a/routing/dht/dht_logger.go +++ b/routing/dht/dht_logger.go @@ -3,8 +3,6 @@ package dht import ( "encoding/json" "time" - - u "github.com/jbenet/go-ipfs/util" ) type logDhtRPC struct { @@ -31,9 +29,9 @@ func (l *logDhtRPC) EndLog() { func (l *logDhtRPC) Print() { b, err := json.Marshal(l) if err != nil { - u.DOut(err.Error()) + log.Debug(err.Error()) } else { - u.DOut(string(b)) + log.Debug(string(b)) } } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index df8f26ff3d..a9a9acba0a 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -237,7 +237,7 @@ func TestNotFound(t *testing.T) { ctx, _ := context.WithTimeout(context.Background(), time.Second*5) v, err := d.GetValue(ctx, u.Key("hello")) - u.DOut("get value got %v\n", v) + log.Debug("get value got %v", v) if err != nil { switch err { case u.ErrNotFound: diff --git a/routing/dht/routing.go b/routing/dht/routing.go index d29a46fef0..c14031ce2b 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -156,7 +156,7 @@ func (dht *IpfsDHT) FindProvidersAsync2(ctx context.Context, key u.Key, count in go func(p *peer.Peer) { pmes, err := dht.findProvidersSingle(ctx, p, key, 0) if err != nil { - u.PErr("%v\n", err) + log.Error("%s", err) return } dht.addPeerListAsync(key, pmes.GetProviderPeers(), ps, count, peerOut) @@ -207,11 +207,11 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, // handle providers provs := pmes.GetProviderPeers() if provs != nil { - u.DOut("Got providers back from findProviders call!\n") + log.Debug("Got providers back from findProviders call!") return dht.addProviders(key, provs), nil } - u.DOut("Didnt get providers, just closer peers.\n") + log.Debug("Didnt get providers, just closer peers.") closer := pmes.GetCloserPeers() if len(closer) == 0 { level++ @@ -220,7 +220,7 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, np, err := dht.peerFromInfo(closer[0]) if err != nil { - u.DOut("no peerFromInfo") + log.Debug("no peerFromInfo") level++ continue } @@ -293,7 +293,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee query := newQuery(u.Key(id), func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) if err != nil { - u.DErr("getPeer error: %v\n", err) + log.Error("%s getPeer error: %v", dht.self, err) return nil, err } @@ -306,7 +306,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee for i, fp := range plist { nxtp, err := dht.peerFromInfo(fp) if err != nil { - u.DErr("findPeer error: %v\n", err) + log.Error("%s findPeer error: %v", dht.self, err) continue } diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 242546ba40..45ffb3cdf6 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -118,7 +118,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } peerArr = append(peerArr, &pd) if e == nil { - u.POut("list element was nil.\n") + log.Debug("list element was nil.\n") return peerArr } } From 3633b0bdd5d0e635a304901d80b8f188820ebaae Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Oct 2014 04:48:13 -0700 Subject: [PATCH 0216/3147] u.DOut -> log.Debug and other logging switches. I kept the u.PErr and u.POut in cli commands, as those do need to write raw output directly. This commit was moved from ipfs/go-path@3ba12e03fd68016e12942ddb9c325352ea5e6551 --- path/path.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 2392031407..03c1a481e5 100644 --- a/path/path.go +++ b/path/path.go @@ -40,11 +40,11 @@ func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { // first element in the path is a b58 hash (for now) h, err := mh.FromB58String(parts[0]) if err != nil { - u.DOut("given path element is not a base58 string.\n") + log.Debug("given path element is not a base58 string.\n") return nil, err } - u.DOut("Resolve dag get.\n") + log.Debug("Resolve dag get.\n") nd, err := s.DAG.Get(u.Key(h)) if err != nil { return nil, err From 0661a7564c62112a87c627b681f746c2c884453b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Oct 2014 04:53:02 -0700 Subject: [PATCH 0217/3147] bugfixes to prev commit This commit was moved from ipfs/go-ipfs-routing@ce10b9281490715745b2412617dce4ea44a39926 --- routing/dht/Message.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 435a536b19..e4607f1de3 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -41,7 +41,7 @@ func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { func (m *Message) GetClusterLevel() int { level := m.GetClusterLevelRaw() - 1 if level < 0 { - log.Error("GetClusterLevel: no routing level specified, assuming 0") + log.Debug("GetClusterLevel: no routing level specified, assuming 0") level = 0 } return int(level) From 8eed10a264e0b7463bd21ef03f0f23b85de095ec Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 10 Oct 2014 14:52:59 -0700 Subject: [PATCH 0218/3147] update dht tests to new network interface This commit was moved from ipfs/go-ipfs-routing@2d707721e9203ce84250da312466a02ab13a248a --- routing/dht/ext_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index a9a9acba0a..88f5123785 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -88,6 +88,10 @@ func (f *fauxNet) SendMessage(msg.NetMessage) error { return nil } +func (f *fauxNet) GetPeerList() []*peer.Peer { + return nil +} + // Close terminates all network operation func (f *fauxNet) Close() error { return nil } From ea74fbd21af504ee61f2f96ffe06ee0cb082df67 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 10 Oct 2014 20:48:20 -0700 Subject: [PATCH 0219/3147] handler fixes for tests This commit was moved from ipfs/go-ipfs-routing@96e76747131e596b8943e7ee5a395d1cd0e1930c --- routing/dht/dht_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 23bdb88e72..1d7413fd53 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -39,7 +39,7 @@ func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { } d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) - dhts.Handler = d + dhts.SetHandler(d) return d } From 850558e8749cc498d45a88118f750a88bc98c40c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 11 Oct 2014 06:33:57 -0700 Subject: [PATCH 0220/3147] dht handleAddProviders adds addr in msg Otherwise don't have the peer's target address. This commit was moved from ipfs/go-ipfs-routing@e7c7c714bcdf0cf1e66bf92237263b0ac7e22202 --- routing/dht/Message.go | 11 +++++++++++ routing/dht/dht.go | 4 ++++ routing/dht/handlers.go | 13 +++++++++++++ 3 files changed, 28 insertions(+) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index e4607f1de3..526724287b 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -1,7 +1,10 @@ package dht import ( + "errors" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" peer "github.com/jbenet/go-ipfs/peer" ) @@ -35,6 +38,14 @@ func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { return pbpeers } +// Address returns a multiaddr associated with the Message_Peer entry +func (m *Message_Peer) Address() (ma.Multiaddr, error) { + if m == nil { + return nil, errors.New("MessagePeer is nil") + } + return ma.NewMultiaddr(*m.Addr) +} + // GetClusterLevel gets and adjusts the cluster level on the message. // a +/- 1 adjustment is needed to distinguish a valid first level (1) and // default "no value" protobuf behavior (0) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c95e075113..1c5beedac1 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -216,6 +216,10 @@ func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) error { pmes := newMessage(Message_ADD_PROVIDER, string(key), 0) + + // add self as the provider + pmes.ProviderPeers = peersToPBPeers([]*peer.Peer{dht.self}) + rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { return err diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 417dd0918f..0c739ab174 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -175,6 +175,19 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, er log.Debug("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) + // add provider should use the address given in the message + for _, pb := range pmes.GetCloserPeers() { + if peer.ID(pb.GetId()).Equal(p.ID) { + + addr, err := pb.Address() + if err != nil { + log.Error("provider %s error with address %s", p, *pb.Addr) + continue + } + p.AddAddress(addr) + } + } + dht.providers.AddProvider(key, p) return pmes, nil // send back same msg as confirmation. } From ed257a30956f0754602fcf069016091735af063c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 13 Oct 2014 01:31:51 -0700 Subject: [PATCH 0221/3147] logging + tweaks This commit was moved from ipfs/go-ipfs-routing@1bc91b14e9415aa7dd83cda4a56e4c41349e3b0e --- routing/dht/dht.go | 3 ++- routing/dht/handlers.go | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1c5beedac1..6486ce40d3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -472,7 +472,7 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { } if p == nil { - maddr, err := ma.NewMultiaddr(pbp.GetAddr()) + maddr, err := pbp.Address() if err != nil { return nil, err } @@ -481,6 +481,7 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { p = &peer.Peer{ID: id} p.AddAddress(maddr) dht.peerstore.Put(p) + log.Info("dht found new peer: %s %s", p, maddr) } return p, nil } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 0c739ab174..0fcbb2be65 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -176,19 +176,25 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, er log.Debug("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) // add provider should use the address given in the message - for _, pb := range pmes.GetCloserPeers() { - if peer.ID(pb.GetId()).Equal(p.ID) { + for _, pb := range pmes.GetProviderPeers() { + pid := peer.ID(pb.GetId()) + if pid.Equal(p.ID) { addr, err := pb.Address() if err != nil { log.Error("provider %s error with address %s", p, *pb.Addr) continue } + + log.Info("received provider %s %s for %s", p, addr, key) p.AddAddress(addr) + dht.providers.AddProvider(key, p) + + } else { + log.Error("handleAddProvider received provider %s from %s", pid, p) } } - dht.providers.AddProvider(key, p) return pmes, nil // send back same msg as confirmation. } From 5ecb22f87ca460adf244ba29b886b2420c33e005 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Oct 2014 10:43:54 -0700 Subject: [PATCH 0222/3147] fix up FindProvidersAsync This commit was moved from ipfs/go-ipfs-routing@f477e5c1b9269f410408c86546c7bf0a53129848 --- routing/dht/dht.go | 6 ++-- routing/dht/dht_test.go | 15 +++++---- routing/dht/routing.go | 75 +++++------------------------------------ routing/routing.go | 4 --- 4 files changed, 20 insertions(+), 80 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6486ce40d3..bfaa167355 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -368,8 +368,8 @@ func (dht *IpfsDHT) Update(p *peer.Peer) { // after some deadline of inactivity. } -// Find looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. -func (dht *IpfsDHT) Find(id peer.ID) (*peer.Peer, *kb.RoutingTable) { +// FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. +func (dht *IpfsDHT) FindLocal(id peer.ID) (*peer.Peer, *kb.RoutingTable) { for _, table := range dht.routingTables { p := table.Find(id) if p != nil { @@ -465,7 +465,7 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { p, _ := dht.peerstore.Get(id) if p == nil { - p, _ = dht.Find(id) + p, _ = dht.FindLocal(id) if p != nil { panic("somehow peer not getting into peerstore") } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1d7413fd53..bedda1afcd 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -227,13 +227,16 @@ func TestProvides(t *testing.T) { time.Sleep(time.Millisecond * 60) ctxT, _ := context.WithTimeout(context.Background(), time.Second) - provs, err := dhts[0].FindProviders(ctxT, u.Key("hello")) - if err != nil { - t.Fatal(err) - } + provchan := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 1) - if len(provs) != 1 { - t.Fatal("Didnt get back providers") + after := time.After(time.Second) + select { + case prov := <-provchan: + if prov == nil { + t.Fatal("Got back nil provider") + } + case <-after: + t.Fatal("Did not get a provider back.") } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index c14031ce2b..03d94d118f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,6 +3,7 @@ package dht import ( "bytes" "encoding/json" + "sync" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -117,26 +118,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { return nil } -// NB: not actually async. Used to keep the interface consistent while the -// actual async method, FindProvidersAsync2 is under construction func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan *peer.Peer { - ch := make(chan *peer.Peer) - providers, err := dht.FindProviders(ctx, key) - if err != nil { - close(ch) - return ch - } - go func() { - defer close(ch) - for _, p := range providers { - ch <- p - } - }() - return ch -} - -// FIXME: there's a bug here! -func (dht *IpfsDHT) FindProvidersAsync2(ctx context.Context, key u.Key, count int) <-chan *peer.Peer { peerOut := make(chan *peer.Peer, count) go func() { ps := newPeerSet() @@ -151,9 +133,12 @@ func (dht *IpfsDHT) FindProvidersAsync2(ctx context.Context, key u.Key, count in } } + wg := new(sync.WaitGroup) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) for _, pp := range peers { + wg.Add(1) go func(p *peer.Peer) { + defer wg.Done() pmes, err := dht.findProvidersSingle(ctx, p, key, 0) if err != nil { log.Error("%s", err) @@ -162,7 +147,8 @@ func (dht *IpfsDHT) FindProvidersAsync2(ctx context.Context, key u.Key, count in dht.addPeerListAsync(key, pmes.GetProviderPeers(), ps, count, peerOut) }(pp) } - + wg.Wait() + close(peerOut) }() return peerOut } @@ -186,61 +172,16 @@ func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet } } -// FindProviders searches for peers who can provide the value for given key. -func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, error) { - // get closest peer - log.Debug("Find providers for: '%s'", key) - p := dht.routingTables[0].NearestPeer(kb.ConvertKey(key)) - if p == nil { - log.Warning("Got no nearest peer for find providers: '%s'", key) - return nil, nil - } - - for level := 0; level < len(dht.routingTables); { - - // attempt retrieving providers - pmes, err := dht.findProvidersSingle(ctx, p, key, level) - if err != nil { - return nil, err - } - - // handle providers - provs := pmes.GetProviderPeers() - if provs != nil { - log.Debug("Got providers back from findProviders call!") - return dht.addProviders(key, provs), nil - } - - log.Debug("Didnt get providers, just closer peers.") - closer := pmes.GetCloserPeers() - if len(closer) == 0 { - level++ - continue - } - - np, err := dht.peerFromInfo(closer[0]) - if err != nil { - log.Debug("no peerFromInfo") - level++ - continue - } - p = np - } - return nil, u.ErrNotFound -} - // Find specific Peer - // FindPeer searches for a peer with given ID. func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error) { // Check if were already connected to them - p, _ := dht.Find(id) + p, _ := dht.FindLocal(id) if p != nil { return p, nil } - // @whyrusleeping why is this here? doesn't the dht.Find above cover it? routeLevel := 0 p = dht.routingTables[routeLevel].NearestPeer(kb.ConvertPeerID(id)) if p == nil { @@ -277,7 +218,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Peer, error) { // Check if were already connected to them - p, _ := dht.Find(id) + p, _ := dht.FindLocal(id) if p != nil { return p, nil } diff --git a/routing/routing.go b/routing/routing.go index 4669fb48c7..f3dd0c9d86 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -26,11 +26,7 @@ type IpfsRouting interface { // Announce that this node can provide value for given key Provide(context.Context, u.Key) error - // FindProviders searches for peers who can provide the value for given key. - FindProviders(context.Context, u.Key) ([]*peer.Peer, error) - // Find specific Peer - // FindPeer searches for a peer with given ID. FindPeer(context.Context, peer.ID) (*peer.Peer, error) } From 8f3c9ca3a2ce8c1274f10df25623b41b0148b46f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 12 Oct 2014 23:07:30 -0700 Subject: [PATCH 0223/3147] fix bug in diagnostics, and add more peers to closer peer responses This commit was moved from ipfs/go-ipfs-routing@5505c12e2266dc8970ad9df123905d9fe22eab30 --- routing/dht/dht.go | 93 +++++++++++++++++++++++++---------------- routing/dht/handlers.go | 36 +++++++++------- 2 files changed, 78 insertions(+), 51 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index bfaa167355..e00b82bf2c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -76,7 +76,7 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer *peer.Peer) (*peer.Peer, error) { - log.Debug("Connect to new peer: %s\n", npeer) + log.Debug("Connect to new peer: %s", npeer) // TODO(jbenet,whyrusleeping) // @@ -109,13 +109,13 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N mData := mes.Data() if mData == nil { - // TODO handle/log err + log.Error("Message contained nil data.") return nil } mPeer := mes.Peer() if mPeer == nil { - // TODO handle/log err + log.Error("Message contained nil peer.") return nil } @@ -123,7 +123,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N pmes := new(Message) err := proto.Unmarshal(mData, pmes) if err != nil { - // TODO handle/log err + log.Error("Error unmarshaling data") return nil } @@ -138,25 +138,27 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N handler := dht.handlerForMsgType(pmes.GetType()) if handler == nil { // TODO handle/log err + log.Error("got back nil handler from handlerForMsgType") return nil } // dispatch handler. rpmes, err := handler(mPeer, pmes) if err != nil { - // TODO handle/log err + log.Error("handle message error: %s", err) return nil } // if nil response, return it before serializing if rpmes == nil { + log.Warning("Got back nil response from request.") return nil } // serialize response msg rmes, err := msg.FromObject(mPeer, rpmes) if err != nil { - // TODO handle/log err + log.Error("serialze response error: %s", err) return nil } @@ -197,6 +199,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message return rpmes, nil } +// putValueToNetwork stores the given key/value pair at the peer 'p' func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, key string, value []byte) error { @@ -226,7 +229,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) e } log.Debug("%s putProvider: %s for %s", dht.self, p, key) - if *rpmes.Key != *pmes.Key { + if rpmes.GetKey() != pmes.GetKey() { return errors.New("provider not added correctly") } @@ -261,23 +264,11 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, // Perhaps we were given closer peers var peers []*peer.Peer for _, pb := range pmes.GetCloserPeers() { - if peer.ID(pb.GetId()).Equal(dht.self.ID) { - continue - } - - addr, err := ma.NewMultiaddr(pb.GetAddr()) + pr, err := dht.addPeer(pb) if err != nil { - log.Error("%v", err.Error()) + log.Error("%s", err) continue } - - // check if we already have this peer. - pr, _ := dht.peerstore.Get(peer.ID(pb.GetId())) - if pr == nil { - pr = &peer.Peer{ID: peer.ID(pb.GetId())} - dht.peerstore.Put(pr) - } - pr.AddAddress(addr) // idempotent peers = append(peers, pr) } @@ -290,6 +281,27 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, return nil, nil, u.ErrNotFound } +func (dht *IpfsDHT) addPeer(pb *Message_Peer) (*peer.Peer, error) { + if peer.ID(pb.GetId()).Equal(dht.self.ID) { + return nil, errors.New("cannot add self as peer") + } + + addr, err := ma.NewMultiaddr(pb.GetAddr()) + if err != nil { + return nil, err + } + + // check if we already have this peer. + pr, _ := dht.peerstore.Get(peer.ID(pb.GetId())) + if pr == nil { + pr = &peer.Peer{ID: peer.ID(pb.GetId())} + dht.peerstore.Put(pr) + } + pr.AddAddress(addr) // idempotent + + return pr, nil +} + // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(ctx context.Context, p *peer.Peer, key u.Key, level int) (*Message, error) { @@ -327,6 +339,7 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, return nil, u.ErrNotFound } +// getLocal attempts to retrieve the value from the datastore func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { dht.dslock.Lock() defer dht.dslock.Unlock() @@ -342,6 +355,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { return byt, nil } +// putLocal stores the key value pair in the datastore func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { return dht.datastore.Put(key.DsKey(), value) } @@ -419,39 +433,44 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer return provArr } -// nearestPeerToQuery returns the routing tables closest peers. -func (dht *IpfsDHT) nearestPeerToQuery(pmes *Message) *peer.Peer { +// nearestPeersToQuery returns the routing tables closest peers. +func (dht *IpfsDHT) nearestPeersToQuery(pmes *Message, count int) []*peer.Peer { level := pmes.GetClusterLevel() cluster := dht.routingTables[level] key := u.Key(pmes.GetKey()) - closer := cluster.NearestPeer(kb.ConvertKey(key)) + closer := cluster.NearestPeers(kb.ConvertKey(key), count) return closer } -// betterPeerToQuery returns nearestPeerToQuery, but iff closer than self. -func (dht *IpfsDHT) betterPeerToQuery(pmes *Message) *peer.Peer { - closer := dht.nearestPeerToQuery(pmes) +// betterPeerToQuery returns nearestPeersToQuery, but iff closer than self. +func (dht *IpfsDHT) betterPeersToQuery(pmes *Message, count int) []*peer.Peer { + closer := dht.nearestPeersToQuery(pmes, count) // no node? nil if closer == nil { return nil } - // == to self? nil - if closer.ID.Equal(dht.self.ID) { - log.Error("Attempted to return self! this shouldnt happen...") - return nil + // == to self? thats bad + for _, p := range closer { + if p.ID.Equal(dht.self.ID) { + log.Error("Attempted to return self! this shouldnt happen...") + return nil + } } - // self is closer? nil - key := u.Key(pmes.GetKey()) - if kb.Closer(dht.self.ID, closer.ID, key) { - return nil + var filtered []*peer.Peer + for _, p := range closer { + // must all be closer than self + key := u.Key(pmes.GetKey()) + if !kb.Closer(dht.self.ID, p.ID, key) { + filtered = append(filtered, p) + } } - // ok seems like a closer node. - return closer + // ok seems like closer nodes + return filtered } func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 0fcbb2be65..4a9de160ea 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -13,6 +13,8 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ) +var CloserPeerCount = 4 + // dhthandler specifies the signature of functions that handle DHT messages. type dhtHandler func(*peer.Peer, *Message) (*Message, error) @@ -83,10 +85,12 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } // Find closest peer on given cluster to desired key and reply with that info - closer := dht.betterPeerToQuery(pmes) + closer := dht.betterPeersToQuery(pmes, CloserPeerCount) if closer != nil { - log.Debug("handleGetValue returning a closer peer: '%s'\n", closer) - resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) + for _, p := range closer { + log.Debug("handleGetValue returning closer peer: '%s'", p) + } + resp.CloserPeers = peersToPBPeers(closer) } return resp, nil @@ -109,27 +113,31 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { resp := newMessage(pmes.GetType(), "", pmes.GetClusterLevel()) - var closest *peer.Peer + var closest []*peer.Peer // if looking for self... special case where we send it on CloserPeers. if peer.ID(pmes.GetKey()).Equal(dht.self.ID) { - closest = dht.self + closest = []*peer.Peer{dht.self} } else { - closest = dht.betterPeerToQuery(pmes) + closest = dht.betterPeersToQuery(pmes, CloserPeerCount) } if closest == nil { - log.Error("handleFindPeer: could not find anything.\n") + log.Error("handleFindPeer: could not find anything.") return resp, nil } - if len(closest.Addresses) == 0 { - log.Error("handleFindPeer: no addresses for connected peer...\n") - return resp, nil + var withAddresses []*peer.Peer + for _, p := range closest { + if len(p.Addresses) > 0 { + withAddresses = append(withAddresses, p) + } } - log.Debug("handleFindPeer: sending back '%s'\n", closest) - resp.CloserPeers = peersToPBPeers([]*peer.Peer{closest}) + for _, p := range withAddresses { + log.Debug("handleFindPeer: sending back '%s'", p) + } + resp.CloserPeers = peersToPBPeers(withAddresses) return resp, nil } @@ -157,9 +165,9 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, e } // Also send closer peers. - closer := dht.betterPeerToQuery(pmes) + closer := dht.betterPeersToQuery(pmes, CloserPeerCount) if closer != nil { - resp.CloserPeers = peersToPBPeers([]*peer.Peer{closer}) + resp.CloserPeers = peersToPBPeers(closer) } return resp, nil From 935d32ed387e64e7fdb11b3beded7e93c0a57ede Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 14 Oct 2014 13:40:55 -0700 Subject: [PATCH 0224/3147] Add test to test conncurrent connects between two peers This commit was moved from ipfs/go-ipfs-routing@09c0deffb50388ab491ef8649b98ba7722e85ce4 --- routing/dht/dht_test.go | 44 +++++++++++++++++++++++++++++++++++++++++ routing/dht/ext_test.go | 4 ++++ 2 files changed, 48 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index bedda1afcd..9e8251a432 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -390,3 +390,47 @@ func TestFindPeer(t *testing.T) { t.Fatal("Didnt find expected peer.") } } + +func TestConnectCollision(t *testing.T) { + // t.Skip("skipping test to debug another") + + u.Debug = false + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + if err != nil { + t.Fatal(err) + } + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") + if err != nil { + t.Fatal(err) + } + + peerA := makePeer(addrA) + peerB := makePeer(addrB) + + dhtA := setupDHT(t, peerA) + dhtB := setupDHT(t, peerB) + + defer dhtA.Halt() + defer dhtB.Halt() + defer dhtA.network.Close() + defer dhtB.network.Close() + + done := make(chan struct{}) + go func() { + _, err = dhtA.Connect(context.Background(), peerB) + if err != nil { + t.Fatal(err) + } + done <- struct{}{} + }() + go func() { + _, err = dhtB.Connect(context.Background(), peerA) + if err != nil { + t.Fatal(err) + } + done <- struct{}{} + }() + + <-done + <-done +} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 88f5123785..ca88a83f4e 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -92,6 +92,10 @@ func (f *fauxNet) GetPeerList() []*peer.Peer { return nil } +func (f *fauxNet) GetBandwidthTotals() (uint64, uint64) { + return 0, 0 +} + // Close terminates all network operation func (f *fauxNet) Close() error { return nil } From 49ee8a5e42b4117323d96d5b24a15cedff6e26b3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 14 Oct 2014 17:46:11 -0700 Subject: [PATCH 0225/3147] make test fail instead of hang This commit was moved from ipfs/go-ipfs-routing@d8426038417a7a4dcc8391f0e5f0409809cb418b --- routing/dht/dht_test.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 9e8251a432..84f5f830ed 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -431,6 +431,15 @@ func TestConnectCollision(t *testing.T) { done <- struct{}{} }() - <-done - <-done + timeout := time.After(time.Second * 5) + select { + case <-done: + case <-timeout: + t.Fatal("Timeout received!") + } + select { + case <-done: + case <-timeout: + t.Fatal("Timeout received!") + } } From eff070f32a39b10f3c45e8108dcae6180362a3ce Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 15 Oct 2014 12:30:52 -0700 Subject: [PATCH 0226/3147] some dht cleanup, and make DHTs take a master context This commit was moved from ipfs/go-ipfs-routing@e55b78bb514e3b440ff9928fcc0c116336631d98 --- routing/dht/dht.go | 31 +++++++++++++++++++--- routing/dht/dht_logger.go | 7 ++++- routing/dht/handlers.go | 54 -------------------------------------- routing/dht/messages.pb.go | 17 +++++------- routing/dht/messages.proto | 7 +++-- routing/dht/routing.go | 33 +---------------------- 6 files changed, 44 insertions(+), 105 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e00b82bf2c..22523f0bb7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -53,16 +53,19 @@ type IpfsDHT struct { //lock to make diagnostics work better diaglock sync.Mutex + + ctx context.Context } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { +func NewDHT(ctx context.Context, p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) dht.network = net dht.sender = sender dht.datastore = dstore dht.self = p dht.peerstore = ps + dht.ctx = ctx dht.providers = NewProviderManager(p.ID) @@ -71,6 +74,8 @@ func NewDHT(p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sende dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*1000) dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) dht.birth = time.Now() + + go dht.PingRoutine(time.Second * 10) return dht } @@ -137,7 +142,6 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // get handler for this msg type. handler := dht.handlerForMsgType(pmes.GetType()) if handler == nil { - // TODO handle/log err log.Error("got back nil handler from handlerForMsgType") return nil } @@ -350,7 +354,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { byt, ok := v.([]byte) if !ok { - return byt, errors.New("value stored in datastore not []byte") + return nil, errors.New("value stored in datastore not []byte") } return byt, nil } @@ -533,6 +537,27 @@ func (dht *IpfsDHT) loadProvidableKeys() error { return nil } +func (dht *IpfsDHT) PingRoutine(t time.Duration) { + tick := time.Tick(t) + for { + select { + case <-tick: + id := make([]byte, 16) + rand.Read(id) + peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(u.Key(id)), 5) + for _, p := range peers { + ctx, _ := context.WithTimeout(dht.ctx, time.Second*5) + err := dht.Ping(ctx, p) + if err != nil { + log.Error("Ping error: %s", err) + } + } + case <-dht.ctx.Done(): + return + } + } +} + // Bootstrap builds up list of peers by requesting random peer IDs func (dht *IpfsDHT) Bootstrap(ctx context.Context) { id := make([]byte, 16) diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go index 1a0878bf7a..0ff012956c 100644 --- a/routing/dht/dht_logger.go +++ b/routing/dht/dht_logger.go @@ -2,6 +2,7 @@ package dht import ( "encoding/json" + "fmt" "time" ) @@ -29,12 +30,16 @@ func (l *logDhtRPC) EndLog() { func (l *logDhtRPC) Print() { b, err := json.Marshal(l) if err != nil { - log.Debug(err.Error()) + log.Debug("Error marshaling logDhtRPC object: %s", err) } else { log.Debug(string(b)) } } +func (l *logDhtRPC) String() string { + return fmt.Sprintf("DHT RPC: %s took %s, success = %s", l.Type, l.Duration, l.Success) +} + func (l *logDhtRPC) EndAndPrint() { l.EndLog() l.Print() diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 4a9de160ea..1046516b66 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,9 +5,7 @@ import ( "fmt" "time" - msg "github.com/jbenet/go-ipfs/net/message" peer "github.com/jbenet/go-ipfs/peer" - kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" @@ -32,8 +30,6 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { return dht.handleGetProviders case Message_PING: return dht.handlePing - case Message_DIAGNOSTIC: - return dht.handleDiagnostic default: return nil } @@ -211,53 +207,3 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, er func (dht *IpfsDHT) Halt() { dht.providers.Halt() } - -// NOTE: not yet finished, low priority -func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *Message) (*Message, error) { - seq := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - - for _, ps := range seq { - _, err := msg.FromObject(ps, pmes) - if err != nil { - log.Error("handleDiagnostics error creating message: %v\n", err) - continue - } - // dht.sender.SendRequest(context.TODO(), mes) - } - return nil, errors.New("not yet ported back") - - // buf := new(bytes.Buffer) - // di := dht.getDiagInfo() - // buf.Write(di.Marshal()) - // - // // NOTE: this shouldnt be a hardcoded value - // after := time.After(time.Second * 20) - // count := len(seq) - // for count > 0 { - // select { - // case <-after: - // //Timeout, return what we have - // goto out - // case reqResp := <-listenChan: - // pmesOut := new(Message) - // err := proto.Unmarshal(reqResp.Data, pmesOut) - // if err != nil { - // // It broke? eh, whatever, keep going - // continue - // } - // buf.Write(reqResp.Data) - // count-- - // } - // } - // - // out: - // resp := Message{ - // Type: Message_DIAGNOSTIC, - // ID: pmes.GetId(), - // Value: buf.Bytes(), - // Response: true, - // } - // - // mes := swarm.NewMessage(p, resp.ToProtobuf()) - // dht.netChan.Outgoing <- mes -} diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index b6e9fa4f26..f204544eaf 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -1,4 +1,4 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-go. // source: messages.proto // DO NOT EDIT! @@ -13,13 +13,11 @@ It has these top-level messages: */ package dht -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" -import json "encoding/json" +import proto "code.google.com/p/goprotobuf/proto" import math "math" -// Reference proto, json, and math imports to suppress error if they are not otherwise used. +// Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal -var _ = &json.SyntaxError{} var _ = math.Inf type Message_MessageType int32 @@ -31,7 +29,6 @@ const ( Message_GET_PROVIDERS Message_MessageType = 3 Message_FIND_NODE Message_MessageType = 4 Message_PING Message_MessageType = 5 - Message_DIAGNOSTIC Message_MessageType = 6 ) var Message_MessageType_name = map[int32]string{ @@ -41,7 +38,6 @@ var Message_MessageType_name = map[int32]string{ 3: "GET_PROVIDERS", 4: "FIND_NODE", 5: "PING", - 6: "DIAGNOSTIC", } var Message_MessageType_value = map[string]int32{ "PUT_VALUE": 0, @@ -50,7 +46,6 @@ var Message_MessageType_value = map[string]int32{ "GET_PROVIDERS": 3, "FIND_NODE": 4, "PING": 5, - "DIAGNOSTIC": 6, } func (x Message_MessageType) Enum() *Message_MessageType { @@ -72,7 +67,7 @@ func (x *Message_MessageType) UnmarshalJSON(data []byte) error { type Message struct { // defines what type of message it is. - Type *Message_MessageType `protobuf:"varint,1,req,name=type,enum=dht.Message_MessageType" json:"type,omitempty"` + Type *Message_MessageType `protobuf:"varint,1,opt,name=type,enum=dht.Message_MessageType" json:"type,omitempty"` // defines what coral cluster level this query/response belongs to. ClusterLevelRaw *int32 `protobuf:"varint,10,opt,name=clusterLevelRaw" json:"clusterLevelRaw,omitempty"` // Used to specify the key associated with this message. @@ -137,8 +132,8 @@ func (m *Message) GetProviderPeers() []*Message_Peer { } type Message_Peer struct { - Id *string `protobuf:"bytes,1,req,name=id" json:"id,omitempty"` - Addr *string `protobuf:"bytes,2,req,name=addr" json:"addr,omitempty"` + Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` + Addr *string `protobuf:"bytes,2,opt,name=addr" json:"addr,omitempty"` XXX_unrecognized []byte `json:"-"` } diff --git a/routing/dht/messages.proto b/routing/dht/messages.proto index 3c33f9382b..0676901504 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/messages.proto @@ -10,16 +10,15 @@ message Message { GET_PROVIDERS = 3; FIND_NODE = 4; PING = 5; - DIAGNOSTIC = 6; } message Peer { - required string id = 1; - required string addr = 2; + optional string id = 1; + optional string addr = 2; } // defines what type of message it is. - required MessageType type = 1; + optional MessageType type = 1; // defines what coral cluster level this query/response belongs to. optional int32 clusterLevelRaw = 10; diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 03d94d118f..55ef265cb7 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,8 +1,6 @@ package dht import ( - "bytes" - "encoding/json" "sync" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -62,6 +60,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { routeLevel := 0 closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { + log.Warning("Got no peers back from routing table!") return nil, nil } @@ -282,33 +281,3 @@ func (dht *IpfsDHT) Ping(ctx context.Context, p *peer.Peer) error { log.Info("ping %s end (err = %s)", p, err) return err } - -func (dht *IpfsDHT) getDiagnostic(ctx context.Context) ([]*diagInfo, error) { - - log.Info("Begin Diagnostic") - peers := dht.routingTables[0].NearestPeers(kb.ConvertPeerID(dht.self.ID), 10) - var out []*diagInfo - - query := newQuery(dht.self.Key(), func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { - pmes := newMessage(Message_DIAGNOSTIC, "", 0) - rpmes, err := dht.sendRequest(ctx, p, pmes) - if err != nil { - return nil, err - } - - dec := json.NewDecoder(bytes.NewBuffer(rpmes.GetValue())) - for { - di := new(diagInfo) - err := dec.Decode(di) - if err != nil { - break - } - - out = append(out, di) - } - return &dhtQueryResult{success: true}, nil - }) - - _, err := query.Run(ctx, peers) - return out, err -} From c29287257cc7a747c08a4060178acae98d177e35 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Oct 2014 17:54:47 -0700 Subject: [PATCH 0227/3147] small changes to auxiliary dht functions This commit was moved from ipfs/go-ipfs-routing@9aae21190ac3200218dd8066732dde52e30d64dd --- routing/dht/dht.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 22523f0bb7..2d4c9852e8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -23,6 +23,8 @@ import ( var log = u.Logger("dht") +const doPinging = true + // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. @@ -75,7 +77,9 @@ func NewDHT(ctx context.Context, p *peer.Peer, ps peer.Peerstore, net inet.Netwo dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) dht.birth = time.Now() - go dht.PingRoutine(time.Second * 10) + if doPinging { + go dht.PingRoutine(time.Second * 10) + } return dht } @@ -562,5 +566,8 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { func (dht *IpfsDHT) Bootstrap(ctx context.Context) { id := make([]byte, 16) rand.Read(id) - dht.FindPeer(ctx, peer.ID(id)) + _, err := dht.FindPeer(ctx, peer.ID(id)) + if err != nil { + log.Error("Bootstrap peer error: %s", err) + } } From 4011db44c60ab07c9a129823b2b04c9f26959b4f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 18 Oct 2014 04:19:12 -0700 Subject: [PATCH 0228/3147] dht tests with context This commit was moved from ipfs/go-ipfs-routing@ec874c217b2d19aae628dfcbd5a4c589f96f1a81 --- routing/dht/dht_test.go | 102 +++++++++++++++++++++------------------- routing/dht/ext_test.go | 12 +++-- 2 files changed, 60 insertions(+), 54 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 84f5f830ed..36f27a2223 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -21,9 +21,7 @@ import ( "time" ) -func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { - ctx := context.Background() - +func setupDHT(ctx context.Context, t *testing.T, p *peer.Peer) *IpfsDHT { peerstore := peer.NewPeerstore() dhts := netservice.NewService(nil) // nil handler for now, need to patch it @@ -38,12 +36,12 @@ func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { t.Fatal(err) } - d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) + d := NewDHT(ctx, p, peerstore, net, dhts, ds.NewMapDatastore()) dhts.SetHandler(d) return d } -func setupDHTS(n int, t *testing.T) ([]ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { +func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { var addrs []ma.Multiaddr for i := 0; i < n; i++ { a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) @@ -61,7 +59,7 @@ func setupDHTS(n int, t *testing.T) ([]ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { dhts := make([]*IpfsDHT, n) for i := 0; i < n; i++ { - dhts[i] = setupDHT(t, peers[i]) + dhts[i] = setupDHT(ctx, t, peers[i]) } return addrs, peers, dhts @@ -87,7 +85,7 @@ func makePeer(addr ma.Multiaddr) *peer.Peer { func TestPing(t *testing.T) { // t.Skip("skipping test to debug another") - + ctx := context.Background() u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") if err != nil { @@ -101,28 +99,28 @@ func TestPing(t *testing.T) { peerA := makePeer(addrA) peerB := makePeer(addrB) - dhtA := setupDHT(t, peerA) - dhtB := setupDHT(t, peerB) + dhtA := setupDHT(ctx, t, peerA) + dhtB := setupDHT(ctx, t, peerB) defer dhtA.Halt() defer dhtB.Halt() defer dhtA.network.Close() defer dhtB.network.Close() - _, err = dhtA.Connect(context.Background(), peerB) + _, err = dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } //Test that we can ping the node - ctx, _ := context.WithTimeout(context.Background(), 5*time.Millisecond) - err = dhtA.Ping(ctx, peerB) + ctxT, _ := context.WithTimeout(ctx, 5*time.Millisecond) + err = dhtA.Ping(ctxT, peerB) if err != nil { t.Fatal(err) } - ctx, _ = context.WithTimeout(context.Background(), 5*time.Millisecond) - err = dhtB.Ping(ctx, peerA) + ctxT, _ = context.WithTimeout(ctx, 5*time.Millisecond) + err = dhtB.Ping(ctxT, peerA) if err != nil { t.Fatal(err) } @@ -131,6 +129,7 @@ func TestPing(t *testing.T) { func TestValueGetSet(t *testing.T) { // t.Skip("skipping test to debug another") + ctx := context.Background() u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") if err != nil { @@ -144,23 +143,23 @@ func TestValueGetSet(t *testing.T) { peerA := makePeer(addrA) peerB := makePeer(addrB) - dhtA := setupDHT(t, peerA) - dhtB := setupDHT(t, peerB) + dhtA := setupDHT(ctx, t, peerA) + dhtB := setupDHT(ctx, t, peerB) defer dhtA.Halt() defer dhtB.Halt() defer dhtA.network.Close() defer dhtB.network.Close() - _, err = dhtA.Connect(context.Background(), peerB) + _, err = dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } - ctxT, _ := context.WithTimeout(context.Background(), time.Second) + ctxT, _ := context.WithTimeout(ctx, time.Second) dhtA.PutValue(ctxT, "hello", []byte("world")) - ctxT, _ = context.WithTimeout(context.Background(), time.Second*2) + ctxT, _ = context.WithTimeout(ctx, time.Second*2) val, err := dhtA.GetValue(ctxT, "hello") if err != nil { t.Fatal(err) @@ -170,7 +169,7 @@ func TestValueGetSet(t *testing.T) { t.Fatalf("Expected 'world' got '%s'", string(val)) } - ctxT, _ = context.WithTimeout(context.Background(), time.Second*2) + ctxT, _ = context.WithTimeout(ctx, time.Second*2) val, err = dhtB.GetValue(ctxT, "hello") if err != nil { t.Fatal(err) @@ -183,10 +182,11 @@ func TestValueGetSet(t *testing.T) { func TestProvides(t *testing.T) { // t.Skip("skipping test to debug another") + ctx := context.Background() u.Debug = false - _, peers, dhts := setupDHTS(4, t) + _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() @@ -194,17 +194,17 @@ func TestProvides(t *testing.T) { } }() - _, err := dhts[0].Connect(context.Background(), peers[1]) + _, err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(context.Background(), peers[2]) + _, err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(context.Background(), peers[3]) + _, err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } @@ -219,14 +219,14 @@ func TestProvides(t *testing.T) { t.Fatal(err) } - err = dhts[3].Provide(context.Background(), u.Key("hello")) + err = dhts[3].Provide(ctx, u.Key("hello")) if err != nil { t.Fatal(err) } time.Sleep(time.Millisecond * 60) - ctxT, _ := context.WithTimeout(context.Background(), time.Second) + ctxT, _ := context.WithTimeout(ctx, time.Second) provchan := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 1) after := time.After(time.Second) @@ -243,9 +243,10 @@ func TestProvides(t *testing.T) { func TestProvidesAsync(t *testing.T) { // t.Skip("skipping test to debug another") + ctx := context.Background() u.Debug = false - _, peers, dhts := setupDHTS(4, t) + _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() @@ -253,17 +254,17 @@ func TestProvidesAsync(t *testing.T) { } }() - _, err := dhts[0].Connect(context.Background(), peers[1]) + _, err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(context.Background(), peers[2]) + _, err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(context.Background(), peers[3]) + _, err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } @@ -278,21 +279,21 @@ func TestProvidesAsync(t *testing.T) { t.Fatal(err) } - err = dhts[3].Provide(context.Background(), u.Key("hello")) + err = dhts[3].Provide(ctx, u.Key("hello")) if err != nil { t.Fatal(err) } time.Sleep(time.Millisecond * 60) - ctx, _ := context.WithTimeout(context.TODO(), time.Millisecond*300) - provs := dhts[0].FindProvidersAsync(ctx, u.Key("hello"), 5) + ctxT, _ := context.WithTimeout(ctx, time.Millisecond*300) + provs := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 5) select { case p := <-provs: if !p.ID.Equal(dhts[3].self.ID) { t.Fatalf("got a provider, but not the right one. %s", p) } - case <-ctx.Done(): + case <-ctxT.Done(): t.Fatal("Didnt get back providers") } } @@ -300,8 +301,9 @@ func TestProvidesAsync(t *testing.T) { func TestLayeredGet(t *testing.T) { // t.Skip("skipping test to debug another") + ctx := context.Background() u.Debug = false - _, peers, dhts := setupDHTS(4, t) + _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() @@ -309,17 +311,17 @@ func TestLayeredGet(t *testing.T) { } }() - _, err := dhts[0].Connect(context.Background(), peers[1]) + _, err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatalf("Failed to connect: %s", err) } - _, err = dhts[1].Connect(context.Background(), peers[2]) + _, err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(context.Background(), peers[3]) + _, err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } @@ -329,14 +331,14 @@ func TestLayeredGet(t *testing.T) { t.Fatal(err) } - err = dhts[3].Provide(context.Background(), u.Key("hello")) + err = dhts[3].Provide(ctx, u.Key("hello")) if err != nil { t.Fatal(err) } time.Sleep(time.Millisecond * 60) - ctxT, _ := context.WithTimeout(context.Background(), time.Second) + ctxT, _ := context.WithTimeout(ctx, time.Second) val, err := dhts[0].GetValue(ctxT, u.Key("hello")) if err != nil { t.Fatal(err) @@ -351,9 +353,10 @@ func TestLayeredGet(t *testing.T) { func TestFindPeer(t *testing.T) { // t.Skip("skipping test to debug another") + ctx := context.Background() u.Debug = false - _, peers, dhts := setupDHTS(4, t) + _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() @@ -361,22 +364,22 @@ func TestFindPeer(t *testing.T) { } }() - _, err := dhts[0].Connect(context.Background(), peers[1]) + _, err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(context.Background(), peers[2]) + _, err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(context.Background(), peers[3]) + _, err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } - ctxT, _ := context.WithTimeout(context.Background(), time.Second) + ctxT, _ := context.WithTimeout(ctx, time.Second) p, err := dhts[0].FindPeer(ctxT, peers[2].ID) if err != nil { t.Fatal(err) @@ -394,6 +397,7 @@ func TestFindPeer(t *testing.T) { func TestConnectCollision(t *testing.T) { // t.Skip("skipping test to debug another") + ctx := context.Background() u.Debug = false addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") if err != nil { @@ -407,8 +411,8 @@ func TestConnectCollision(t *testing.T) { peerA := makePeer(addrA) peerB := makePeer(addrB) - dhtA := setupDHT(t, peerA) - dhtB := setupDHT(t, peerB) + dhtA := setupDHT(ctx, t, peerA) + dhtB := setupDHT(ctx, t, peerB) defer dhtA.Halt() defer dhtB.Halt() @@ -417,14 +421,14 @@ func TestConnectCollision(t *testing.T) { done := make(chan struct{}) go func() { - _, err = dhtA.Connect(context.Background(), peerB) + _, err = dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } done <- struct{}{} }() go func() { - _, err = dhtB.Connect(context.Background(), peerA) + _, err = dhtB.Connect(ctx, peerA) if err != nil { t.Fatal(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index ca88a83f4e..b5bf487722 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -110,7 +110,7 @@ func TestGetFailures(t *testing.T) { local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) + d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) other := &peer.Peer{ID: peer.ID("other_peer")} d.Update(other) @@ -200,6 +200,7 @@ func _randPeer() *peer.Peer { func TestNotFound(t *testing.T) { // t.Skip("skipping test because it makes a lot of output") + ctx := context.Background() fn := &fauxNet{} fs := &fauxSender{} @@ -207,7 +208,7 @@ func TestNotFound(t *testing.T) { local.ID = peer.ID("test_peer") peerstore := peer.NewPeerstore() - d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) + d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) var ps []*peer.Peer for i := 0; i < 5; i++ { @@ -243,7 +244,7 @@ func TestNotFound(t *testing.T) { }) - ctx, _ := context.WithTimeout(context.Background(), time.Second*5) + ctx, _ = context.WithTimeout(ctx, time.Second*5) v, err := d.GetValue(ctx, u.Key("hello")) log.Debug("get value got %v", v) if err != nil { @@ -265,6 +266,7 @@ func TestNotFound(t *testing.T) { func TestLessThanKResponses(t *testing.T) { // t.Skip("skipping test because it makes a lot of output") + ctx := context.Background() u.Debug = false fn := &fauxNet{} fs := &fauxSender{} @@ -272,7 +274,7 @@ func TestLessThanKResponses(t *testing.T) { local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) + d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) var ps []*peer.Peer for i := 0; i < 5; i++ { @@ -307,7 +309,7 @@ func TestLessThanKResponses(t *testing.T) { }) - ctx, _ := context.WithTimeout(context.Background(), time.Second*30) + ctx, _ = context.WithTimeout(ctx, time.Second*30) _, err := d.GetValue(ctx, u.Key("hello")) if err != nil { switch err { From 7c96b81f1bebbaf46529f2379da3cb4c756e6555 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 16 Oct 2014 07:17:49 -0700 Subject: [PATCH 0229/3147] move IDFromPubKey to peer pkg This commit was moved from ipfs/go-ipfs-routing@734180186bb409ed8a91e50924bea312ed0e2487 --- routing/dht/dht_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 36f27a2223..2861be73a5 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -10,7 +10,6 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ci "github.com/jbenet/go-ipfs/crypto" - spipe "github.com/jbenet/go-ipfs/crypto/spipe" inet "github.com/jbenet/go-ipfs/net" mux "github.com/jbenet/go-ipfs/net/mux" netservice "github.com/jbenet/go-ipfs/net/service" @@ -74,7 +73,7 @@ func makePeer(addr ma.Multiaddr) *peer.Peer { } p.PrivKey = sk p.PubKey = pk - id, err := spipe.IDFromPubKey(pk) + id, err := peer.IDFromPubKey(pk) if err != nil { panic(err) } From 1ec63750cd58a02972c52418a0ab985f7041343d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 18 Oct 2014 12:07:46 -0700 Subject: [PATCH 0230/3147] add another ipns test to simulate coalesced writes This commit was moved from ipfs/go-unixfs@82ab6d5ce56c851a71b8528b10936e8877c09f01 --- unixfs/io/dagmodifier_test.go | 41 +++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 32d9a84b5d..5c96aaae4d 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -187,6 +187,47 @@ func TestMultiWrite(t *testing.T) { } } +func TestMultiWriteCoal(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + + dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{512}) + if err != nil { + t.Fatal(err) + } + + data := make([]byte, 4000) + u.NewFastRand().Read(data) + + for i := 0; i < len(data); i++ { + n, err := dagmod.WriteAt(data[:i+1], 0) + if err != nil { + t.Fatal(err) + } + if n != i+1 { + t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") + } + } + nd, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + read, err := NewDagReader(nd, dserv) + if err != nil { + t.Fatal(err) + } + rbuf, err := ioutil.ReadAll(read) + if err != nil { + t.Fatal(err) + } + + err = arrComp(rbuf, data) + if err != nil { + t.Fatal(err) + } +} + func arrComp(a, b []byte) error { if len(a) != len(b) { return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) From fd170bced3af060a554e7e47648dc55e08c441b2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 18 Oct 2014 05:52:24 -0700 Subject: [PATCH 0231/3147] moved XOR keyspace -> util This commit was moved from ipfs/go-ipfs-routing@a0d739fa00b96367b10bbd50b0a0fe87faed02ea --- routing/keyspace/xor.go | 13 +++---------- routing/keyspace/xor_test.go | 31 +++---------------------------- 2 files changed, 6 insertions(+), 38 deletions(-) diff --git a/routing/keyspace/xor.go b/routing/keyspace/xor.go index dbb7c68516..7159f2cadd 100644 --- a/routing/keyspace/xor.go +++ b/routing/keyspace/xor.go @@ -4,6 +4,8 @@ import ( "bytes" "crypto/sha256" "math/big" + + u "github.com/jbenet/go-ipfs/util" ) // XORKeySpace is a KeySpace which: @@ -33,7 +35,7 @@ func (s *xorKeySpace) Equal(k1, k2 Key) bool { // Distance returns the distance metric in this key space func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { // XOR the keys - k3 := XOR(k1.Bytes, k2.Bytes) + k3 := u.XOR(k1.Bytes, k2.Bytes) // interpret it as an integer dist := big.NewInt(0).SetBytes(k3) @@ -52,15 +54,6 @@ func (s *xorKeySpace) Less(k1, k2 Key) bool { return true } -// XOR takes two byte slices, XORs them together, returns the resulting slice. -func XOR(a, b []byte) []byte { - c := make([]byte, len(a)) - for i := 0; i < len(a); i++ { - c[i] = a[i] ^ b[i] - } - return c -} - // ZeroPrefixLen returns the number of consecutive zeroes in a byte slice. func ZeroPrefixLen(id []byte) int { for i := 0; i < len(id); i++ { diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go index 7963ea014a..8db4b926cd 100644 --- a/routing/keyspace/xor_test.go +++ b/routing/keyspace/xor_test.go @@ -4,34 +4,9 @@ import ( "bytes" "math/big" "testing" -) - -func TestXOR(t *testing.T) { - cases := [][3][]byte{ - [3][]byte{ - []byte{0xFF, 0xFF, 0xFF}, - []byte{0xFF, 0xFF, 0xFF}, - []byte{0x00, 0x00, 0x00}, - }, - [3][]byte{ - []byte{0x00, 0xFF, 0x00}, - []byte{0xFF, 0xFF, 0xFF}, - []byte{0xFF, 0x00, 0xFF}, - }, - [3][]byte{ - []byte{0x55, 0x55, 0x55}, - []byte{0x55, 0xFF, 0xAA}, - []byte{0x00, 0xAA, 0xFF}, - }, - } - for _, c := range cases { - r := XOR(c[0], c[1]) - if !bytes.Equal(r, c[2]) { - t.Error("XOR failed") - } - } -} + u "github.com/jbenet/go-ipfs/util" +) func TestPrefixLen(t *testing.T) { cases := [][]byte{ @@ -126,7 +101,7 @@ func TestDistancesAndCenterSorting(t *testing.T) { } d1 := keys[2].Distance(keys[5]) - d2 := XOR(keys[2].Bytes, keys[5].Bytes) + d2 := u.XOR(keys[2].Bytes, keys[5].Bytes) d2 = d2[len(keys[2].Bytes)-len(d1.Bytes()):] // skip empty space for big if !bytes.Equal(d1.Bytes(), d2) { t.Errorf("bytes should be the same. %v == %v", d1.Bytes(), d2) From 9b97818583989a3b5541112053878ddf99f40f2e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 18 Oct 2014 20:00:13 -0700 Subject: [PATCH 0232/3147] keyspace XOR naming This commit was moved from ipfs/go-ipfs-routing@5532288d1ac46da272db9d3f77c1b46ebcde948a --- routing/kbucket/util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 3aca06f6af..02994230a6 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -31,11 +31,11 @@ func (id ID) less(other ID) bool { } func xor(a, b ID) ID { - return ID(ks.XOR(a, b)) + return ID(u.XOR(a, b)) } func commonPrefixLen(a, b ID) int { - return ks.ZeroPrefixLen(ks.XOR(a, b)) + return ks.ZeroPrefixLen(u.XOR(a, b)) } // ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) From 843e9fc9400c9cab06dea4dead086716f61c7504 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 18 Oct 2014 20:04:05 -0700 Subject: [PATCH 0233/3147] make vendor @whyrusleeping pre-commit hook? This commit was moved from ipfs/go-ipfs-routing@0b714cae3ac0ed6b13d9af490296f063f4d1d08f --- routing/dht/messages.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/messages.pb.go b/routing/dht/messages.pb.go index f204544eaf..2da77e7bc2 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/messages.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package dht -import proto "code.google.com/p/goprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 591a0d98498b89139f30b76d948592e44976d37e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 19 Oct 2014 02:05:29 -0700 Subject: [PATCH 0234/3147] fixed tests This commit was moved from ipfs/go-ipfs-routing@79e3d948085862705773442a9db91d854934966c --- routing/dht/dht_test.go | 90 ++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2861be73a5..ff28ab2edd 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -112,13 +112,13 @@ func TestPing(t *testing.T) { } //Test that we can ping the node - ctxT, _ := context.WithTimeout(ctx, 5*time.Millisecond) + ctxT, _ := context.WithTimeout(ctx, 100*time.Millisecond) err = dhtA.Ping(ctxT, peerB) if err != nil { t.Fatal(err) } - ctxT, _ = context.WithTimeout(ctx, 5*time.Millisecond) + ctxT, _ = context.WithTimeout(ctx, 100*time.Millisecond) err = dhtB.Ping(ctxT, peerA) if err != nil { t.Fatal(err) @@ -396,53 +396,61 @@ func TestFindPeer(t *testing.T) { func TestConnectCollision(t *testing.T) { // t.Skip("skipping test to debug another") - ctx := context.Background() - u.Debug = false - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") - if err != nil { - t.Fatal(err) - } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") - if err != nil { - t.Fatal(err) - } - - peerA := makePeer(addrA) - peerB := makePeer(addrB) - - dhtA := setupDHT(ctx, t, peerA) - dhtB := setupDHT(ctx, t, peerB) + runTimes := 100 - defer dhtA.Halt() - defer dhtB.Halt() - defer dhtA.network.Close() - defer dhtB.network.Close() + for rtime := 0; rtime < runTimes; rtime++ { + log.Notice("Running Time: ", rtime) - done := make(chan struct{}) - go func() { - _, err = dhtA.Connect(ctx, peerB) + ctx := context.Background() + u.Debug = false + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") if err != nil { t.Fatal(err) } - done <- struct{}{} - }() - go func() { - _, err = dhtB.Connect(ctx, peerA) + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") if err != nil { t.Fatal(err) } - done <- struct{}{} - }() - timeout := time.After(time.Second * 5) - select { - case <-done: - case <-timeout: - t.Fatal("Timeout received!") - } - select { - case <-done: - case <-timeout: - t.Fatal("Timeout received!") + peerA := makePeer(addrA) + peerB := makePeer(addrB) + + dhtA := setupDHT(ctx, t, peerA) + dhtB := setupDHT(ctx, t, peerB) + + defer dhtA.Halt() + defer dhtB.Halt() + defer dhtA.network.Close() + defer dhtB.network.Close() + + done := make(chan struct{}) + go func() { + _, err = dhtA.Connect(ctx, peerB) + if err != nil { + t.Fatal(err) + } + done <- struct{}{} + }() + go func() { + _, err = dhtB.Connect(ctx, peerA) + if err != nil { + t.Fatal(err) + } + done <- struct{}{} + }() + + timeout := time.After(time.Second) + select { + case <-done: + case <-timeout: + t.Fatal("Timeout received!") + } + select { + case <-done: + case <-timeout: + t.Fatal("Timeout received!") + } + + <-time.After(100 * time.Millisecond) } } From 232b2bdc2bb6db422a834c9a81bd0107f402e2c6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 19 Oct 2014 06:29:18 -0700 Subject: [PATCH 0235/3147] differentiate ports cause timing. This commit was moved from ipfs/go-ipfs-routing@08177bd39c1bd0d12c846d5897a9e5e5945c794d --- routing/dht/dht_test.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index ff28ab2edd..98b196da53 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -130,11 +130,11 @@ func TestValueGetSet(t *testing.T) { ctx := context.Background() u.Debug = false - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/11235") if err != nil { t.Fatal(err) } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/15679") if err != nil { t.Fatal(err) } @@ -396,18 +396,18 @@ func TestFindPeer(t *testing.T) { func TestConnectCollision(t *testing.T) { // t.Skip("skipping test to debug another") - runTimes := 100 + runTimes := 10 for rtime := 0; rtime < runTimes; rtime++ { log.Notice("Running Time: ", rtime) ctx := context.Background() u.Debug = false - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/1235") + addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/11235") if err != nil { t.Fatal(err) } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5679") + addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/15679") if err != nil { t.Fatal(err) } @@ -418,11 +418,6 @@ func TestConnectCollision(t *testing.T) { dhtA := setupDHT(ctx, t, peerA) dhtB := setupDHT(ctx, t, peerB) - defer dhtA.Halt() - defer dhtB.Halt() - defer dhtA.network.Close() - defer dhtB.network.Close() - done := make(chan struct{}) go func() { _, err = dhtA.Connect(ctx, peerB) @@ -451,6 +446,11 @@ func TestConnectCollision(t *testing.T) { t.Fatal("Timeout received!") } - <-time.After(100 * time.Millisecond) + dhtA.Halt() + dhtB.Halt() + dhtA.network.Close() + dhtB.network.Close() + + <-time.After(200 * time.Millisecond) } } From 893f230c8a5e27063dab59147d3b748ed29da085 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 19 Oct 2014 23:40:14 -0700 Subject: [PATCH 0236/3147] peerstore constructs peers Now, all peers should be retrieved from the Peerstore, which will construct the peers accordingly. This ensures there's only one peer object per peer (opposite would be bad: things get out sync) cc @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@531682c2472cdc5e17b86a0d4f32a14672d62c1e --- routing/dht/dht.go | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 2d4c9852e8..683b5785b3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -300,10 +300,9 @@ func (dht *IpfsDHT) addPeer(pb *Message_Peer) (*peer.Peer, error) { } // check if we already have this peer. - pr, _ := dht.peerstore.Get(peer.ID(pb.GetId())) - if pr == nil { - pr = &peer.Peer{ID: peer.ID(pb.GetId())} - dht.peerstore.Put(pr) + pr, err := dht.getPeer(peer.ID(pb.GetId())) + if err != nil { + return nil, err } pr.AddAddress(addr) // idempotent @@ -481,6 +480,16 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *Message, count int) []*peer.Peer { return filtered } +func (dht *IpfsDHT) getPeer(id peer.ID) (*peer.Peer, error) { + p, err := dht.peerstore.Get(id) + if err != nil { + err = fmt.Errorf("Failed to get peer from peerstore: %s", err) + log.Error("%s", err) + return nil, err + } + return p, nil +} + func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { id := peer.ID(pbp.GetId()) @@ -490,26 +499,16 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { return nil, errors.New("found self") } - p, _ := dht.peerstore.Get(id) - if p == nil { - p, _ = dht.FindLocal(id) - if p != nil { - panic("somehow peer not getting into peerstore") - } + p, err := dht.getPeer(id) + if err != nil { + return nil, err } - if p == nil { - maddr, err := pbp.Address() - if err != nil { - return nil, err - } - - // create new Peer - p = &peer.Peer{ID: id} - p.AddAddress(maddr) - dht.peerstore.Put(p) - log.Info("dht found new peer: %s %s", p, maddr) + maddr, err := pbp.Address() + if err != nil { + return nil, err } + p.AddAddress(maddr) return p, nil } @@ -541,6 +540,7 @@ func (dht *IpfsDHT) loadProvidableKeys() error { return nil } +// PingRoutine periodically pings nearest neighbors. func (dht *IpfsDHT) PingRoutine(t time.Duration) { tick := time.Tick(t) for { From 3433cce9cd41884947a6c3d7d1b9d1eb63ac5000 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 20 Oct 2014 03:26:44 -0700 Subject: [PATCH 0237/3147] peer.Peer is now an interface ![](http://m.memegen.com/77n7dk.jpg) This commit was moved from ipfs/go-ipfs-routing@be07f83e37101063df61d4429424d5fd078732de --- routing/dht/Message.go | 11 +++--- routing/dht/dht.go | 66 +++++++++++++++++------------------ routing/dht/dht_test.go | 23 +++++------- routing/dht/diag.go | 5 +-- routing/dht/ext_test.go | 39 ++++++++++----------- routing/dht/handlers.go | 28 +++++++-------- routing/dht/providers.go | 14 ++++---- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 20 +++++------ routing/dht/routing.go | 30 ++++++++-------- routing/dht/util.go | 14 ++++---- routing/kbucket/bucket.go | 10 +++--- routing/kbucket/table.go | 30 ++++++++-------- routing/kbucket/table_test.go | 49 +++++++++++++------------- routing/mock/routing.go | 26 +++++++------- routing/mock/routing_test.go | 24 +++++-------- routing/routing.go | 4 +-- 17 files changed, 191 insertions(+), 204 deletions(-) diff --git a/routing/dht/Message.go b/routing/dht/Message.go index 526724287b..ae78d1f399 100644 --- a/routing/dht/Message.go +++ b/routing/dht/Message.go @@ -17,20 +17,21 @@ func newMessage(typ Message_MessageType, key string, level int) *Message { return m } -func peerToPBPeer(p *peer.Peer) *Message_Peer { +func peerToPBPeer(p peer.Peer) *Message_Peer { pbp := new(Message_Peer) - if len(p.Addresses) == 0 || p.Addresses[0] == nil { + addrs := p.Addresses() + if len(addrs) == 0 || addrs[0] == nil { pbp.Addr = proto.String("") } else { - addr := p.Addresses[0].String() + addr := addrs[0].String() pbp.Addr = &addr } - pid := string(p.ID) + pid := string(p.ID()) pbp.Id = &pid return pbp } -func peersToPBPeers(peers []*peer.Peer) []*Message_Peer { +func peersToPBPeers(peers []peer.Peer) []*Message_Peer { pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { pbpeers[i] = peerToPBPeer(p) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 683b5785b3..3617b7142d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -39,7 +39,7 @@ type IpfsDHT struct { sender inet.Sender // Local peer (yourself) - self *peer.Peer + self peer.Peer // Other peers peerstore peer.Peerstore @@ -60,7 +60,7 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, p *peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { +func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) dht.network = net dht.sender = sender @@ -69,12 +69,12 @@ func NewDHT(ctx context.Context, p *peer.Peer, ps peer.Peerstore, net inet.Netwo dht.peerstore = ps dht.ctx = ctx - dht.providers = NewProviderManager(p.ID) + dht.providers = NewProviderManager(p.ID()) dht.routingTables = make([]*kb.RoutingTable, 3) - dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*1000) - dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Millisecond*1000) - dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID), time.Hour) + dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Millisecond*1000) + dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Millisecond*1000) + dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Hour) dht.birth = time.Now() if doPinging { @@ -84,7 +84,7 @@ func NewDHT(ctx context.Context, p *peer.Peer, ps peer.Peerstore, net inet.Netwo } // Connect to a new peer at the given address, ping and add to the routing table -func (dht *IpfsDHT) Connect(ctx context.Context, npeer *peer.Peer) (*peer.Peer, error) { +func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, error) { log.Debug("Connect to new peer: %s", npeer) // TODO(jbenet,whyrusleeping) @@ -175,7 +175,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // sendRequest sends out a request using dht.sender, but also makes sure to // measure the RTT for latency measurements. -func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *Message) (*Message, error) { mes, err := msg.FromObject(p, pmes) if err != nil { @@ -208,7 +208,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p *peer.Peer, pmes *Message } // putValueToNetwork stores the given key/value pair at the peer 'p' -func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, +func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, key string, value []byte) error { pmes := newMessage(Message_PUT_VALUE, string(key), 0) @@ -224,12 +224,12 @@ func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p *peer.Peer, return nil } -func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) error { +func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) error { pmes := newMessage(Message_ADD_PROVIDER, string(key), 0) // add self as the provider - pmes.ProviderPeers = peersToPBPeers([]*peer.Peer{dht.self}) + pmes.ProviderPeers = peersToPBPeers([]peer.Peer{dht.self}) rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { @@ -244,8 +244,8 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p *peer.Peer, key string) e return nil } -func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, - key u.Key, level int) ([]byte, []*peer.Peer, error) { +func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, + key u.Key, level int) ([]byte, []peer.Peer, error) { pmes, err := dht.getValueSingle(ctx, p, key, level) if err != nil { @@ -270,7 +270,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, } // Perhaps we were given closer peers - var peers []*peer.Peer + var peers []peer.Peer for _, pb := range pmes.GetCloserPeers() { pr, err := dht.addPeer(pb) if err != nil { @@ -289,8 +289,8 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p *peer.Peer, return nil, nil, u.ErrNotFound } -func (dht *IpfsDHT) addPeer(pb *Message_Peer) (*peer.Peer, error) { - if peer.ID(pb.GetId()).Equal(dht.self.ID) { +func (dht *IpfsDHT) addPeer(pb *Message_Peer) (peer.Peer, error) { + if peer.ID(pb.GetId()).Equal(dht.self.ID()) { return nil, errors.New("cannot add self as peer") } @@ -310,7 +310,7 @@ func (dht *IpfsDHT) addPeer(pb *Message_Peer) (*peer.Peer, error) { } // getValueSingle simply performs the get value RPC with the given parameters -func (dht *IpfsDHT) getValueSingle(ctx context.Context, p *peer.Peer, +func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.Peer, key u.Key, level int) (*Message, error) { pmes := newMessage(Message_GET_VALUE, string(key), level) @@ -369,7 +369,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals to all routingTables to Update their last-seen status // on the given peer. -func (dht *IpfsDHT) Update(p *peer.Peer) { +func (dht *IpfsDHT) Update(p peer.Peer) { log.Debug("updating peer: %s latency = %f\n", p, p.GetLatency().Seconds()) removedCount := 0 for _, route := range dht.routingTables { @@ -390,7 +390,7 @@ func (dht *IpfsDHT) Update(p *peer.Peer) { } // FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. -func (dht *IpfsDHT) FindLocal(id peer.ID) (*peer.Peer, *kb.RoutingTable) { +func (dht *IpfsDHT) FindLocal(id peer.ID) (peer.Peer, *kb.RoutingTable) { for _, table := range dht.routingTables { p := table.Find(id) if p != nil { @@ -400,7 +400,7 @@ func (dht *IpfsDHT) FindLocal(id peer.ID) (*peer.Peer, *kb.RoutingTable) { return nil, nil } -func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p *peer.Peer, id peer.ID, level int) (*Message, error) { +func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID, level int) (*Message, error) { pmes := newMessage(Message_FIND_NODE, string(id), level) return dht.sendRequest(ctx, p, pmes) } @@ -411,14 +411,14 @@ func (dht *IpfsDHT) printTables() { } } -func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p *peer.Peer, key u.Key, level int) (*Message, error) { +func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u.Key, level int) (*Message, error) { pmes := newMessage(Message_GET_PROVIDERS, string(key), level) return dht.sendRequest(ctx, p, pmes) } // TODO: Could be done async -func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer { - var provArr []*peer.Peer +func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []peer.Peer { + var provArr []peer.Peer for _, prov := range peers { p, err := dht.peerFromInfo(prov) if err != nil { @@ -429,7 +429,7 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer log.Debug("%s adding provider: %s for %s", dht.self, p, key) // Dont add outselves to the list - if p.ID.Equal(dht.self.ID) { + if p.ID().Equal(dht.self.ID()) { continue } @@ -441,7 +441,7 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []*peer.Peer } // nearestPeersToQuery returns the routing tables closest peers. -func (dht *IpfsDHT) nearestPeersToQuery(pmes *Message, count int) []*peer.Peer { +func (dht *IpfsDHT) nearestPeersToQuery(pmes *Message, count int) []peer.Peer { level := pmes.GetClusterLevel() cluster := dht.routingTables[level] @@ -451,7 +451,7 @@ func (dht *IpfsDHT) nearestPeersToQuery(pmes *Message, count int) []*peer.Peer { } // betterPeerToQuery returns nearestPeersToQuery, but iff closer than self. -func (dht *IpfsDHT) betterPeersToQuery(pmes *Message, count int) []*peer.Peer { +func (dht *IpfsDHT) betterPeersToQuery(pmes *Message, count int) []peer.Peer { closer := dht.nearestPeersToQuery(pmes, count) // no node? nil @@ -461,17 +461,17 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *Message, count int) []*peer.Peer { // == to self? thats bad for _, p := range closer { - if p.ID.Equal(dht.self.ID) { + if p.ID().Equal(dht.self.ID()) { log.Error("Attempted to return self! this shouldnt happen...") return nil } } - var filtered []*peer.Peer + var filtered []peer.Peer for _, p := range closer { // must all be closer than self key := u.Key(pmes.GetKey()) - if !kb.Closer(dht.self.ID, p.ID, key) { + if !kb.Closer(dht.self.ID(), p.ID(), key) { filtered = append(filtered, p) } } @@ -480,7 +480,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *Message, count int) []*peer.Peer { return filtered } -func (dht *IpfsDHT) getPeer(id peer.ID) (*peer.Peer, error) { +func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { p, err := dht.peerstore.Get(id) if err != nil { err = fmt.Errorf("Failed to get peer from peerstore: %s", err) @@ -490,12 +490,12 @@ func (dht *IpfsDHT) getPeer(id peer.ID) (*peer.Peer, error) { return p, nil } -func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { +func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (peer.Peer, error) { id := peer.ID(pbp.GetId()) // continue if it's ourselves - if id.Equal(dht.self.ID) { + if id.Equal(dht.self.ID()) { return nil, errors.New("found self") } @@ -512,7 +512,7 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (*peer.Peer, error) { return p, nil } -func (dht *IpfsDHT) ensureConnectedToPeer(pbp *Message_Peer) (*peer.Peer, error) { +func (dht *IpfsDHT) ensureConnectedToPeer(pbp *Message_Peer) (peer.Peer, error) { p, err := dht.peerFromInfo(pbp) if err != nil { return nil, err diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 98b196da53..23d9fcf171 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -20,7 +20,7 @@ import ( "time" ) -func setupDHT(ctx context.Context, t *testing.T, p *peer.Peer) *IpfsDHT { +func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { peerstore := peer.NewPeerstore() dhts := netservice.NewService(nil) // nil handler for now, need to patch it @@ -40,7 +40,7 @@ func setupDHT(ctx context.Context, t *testing.T, p *peer.Peer) *IpfsDHT { return d } -func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { +func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.Peer, []*IpfsDHT) { var addrs []ma.Multiaddr for i := 0; i < n; i++ { a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) @@ -50,7 +50,7 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []*pee addrs = append(addrs, a) } - var peers []*peer.Peer + var peers []peer.Peer for i := 0; i < n; i++ { p := makePeer(addrs[i]) peers = append(peers, p) @@ -64,21 +64,16 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []*pee return addrs, peers, dhts } -func makePeer(addr ma.Multiaddr) *peer.Peer { - p := new(peer.Peer) - p.AddAddress(addr) +func makePeer(addr ma.Multiaddr) peer.Peer { sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) if err != nil { panic(err) } - p.PrivKey = sk - p.PubKey = pk - id, err := peer.IDFromPubKey(pk) + p, err := peer.WithKeyPair(sk, pk) if err != nil { panic(err) } - - p.ID = id + p.AddAddress(addr) return p } @@ -289,7 +284,7 @@ func TestProvidesAsync(t *testing.T) { provs := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 5) select { case p := <-provs: - if !p.ID.Equal(dhts[3].self.ID) { + if !p.ID().Equal(dhts[3].self.ID()) { t.Fatalf("got a provider, but not the right one. %s", p) } case <-ctxT.Done(): @@ -379,7 +374,7 @@ func TestFindPeer(t *testing.T) { } ctxT, _ := context.WithTimeout(ctx, time.Second) - p, err := dhts[0].FindPeer(ctxT, peers[2].ID) + p, err := dhts[0].FindPeer(ctxT, peers[2].ID()) if err != nil { t.Fatal(err) } @@ -388,7 +383,7 @@ func TestFindPeer(t *testing.T) { t.Fatal("Failed to find peer.") } - if !p.ID.Equal(peers[2].ID) { + if !p.ID().Equal(peers[2].ID()) { t.Fatal("Didnt find expected peer.") } } diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 8fd581a454..e91ba9bee1 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -32,12 +32,13 @@ func (di *diagInfo) Marshal() []byte { func (dht *IpfsDHT) getDiagInfo() *diagInfo { di := new(diagInfo) di.CodeVersion = "github.com/jbenet/go-ipfs" - di.ID = dht.self.ID + di.ID = dht.self.ID() di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore for _, p := range dht.routingTables[0].ListPeers() { - di.Connections = append(di.Connections, connDiagInfo{p.GetLatency(), p.ID}) + d := connDiagInfo{p.GetLatency(), p.ID()} + di.Connections = append(di.Connections, d) } return di } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index b5bf487722..c4ba09414c 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -9,7 +9,6 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" msg "github.com/jbenet/go-ipfs/net/message" mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" @@ -66,17 +65,17 @@ type fauxNet struct { } // DialPeer attempts to establish a connection to a given peer -func (f *fauxNet) DialPeer(*peer.Peer) error { +func (f *fauxNet) DialPeer(peer.Peer) error { return nil } // ClosePeer connection to peer -func (f *fauxNet) ClosePeer(*peer.Peer) error { +func (f *fauxNet) ClosePeer(peer.Peer) error { return nil } // IsConnected returns whether a connection to given peer exists. -func (f *fauxNet) IsConnected(*peer.Peer) (bool, error) { +func (f *fauxNet) IsConnected(peer.Peer) (bool, error) { return true, nil } @@ -88,7 +87,7 @@ func (f *fauxNet) SendMessage(msg.NetMessage) error { return nil } -func (f *fauxNet) GetPeerList() []*peer.Peer { +func (f *fauxNet) GetPeerList() []peer.Peer { return nil } @@ -107,11 +106,10 @@ func TestGetFailures(t *testing.T) { fs := &fauxSender{} peerstore := peer.NewPeerstore() - local := new(peer.Peer) - local.ID = peer.ID("test_peer") + local := peer.WithIDString("test_peer") d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) - other := &peer.Peer{ID: peer.ID("other_peer")} + other := peer.WithIDString("other_peer") d.Update(other) // This one should time out @@ -189,11 +187,10 @@ func TestGetFailures(t *testing.T) { } // TODO: Maybe put these in some sort of "ipfs_testutil" package -func _randPeer() *peer.Peer { - p := new(peer.Peer) - p.ID = make(peer.ID, 16) - p.Addresses = []ma.Multiaddr{nil} - crand.Read(p.ID) +func _randPeer() peer.Peer { + id := make(peer.ID, 16) + crand.Read(id) + p := peer.WithID(id) return p } @@ -204,13 +201,13 @@ func TestNotFound(t *testing.T) { fn := &fauxNet{} fs := &fauxSender{} - local := new(peer.Peer) - local.ID = peer.ID("test_peer") + local := peer.WithIDString("test_peer") peerstore := peer.NewPeerstore() + peerstore.Put(local) d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) - var ps []*peer.Peer + var ps []peer.Peer for i := 0; i < 5; i++ { ps = append(ps, _randPeer()) d.Update(ps[i]) @@ -228,7 +225,7 @@ func TestNotFound(t *testing.T) { case Message_GET_VALUE: resp := &Message{Type: pmes.Type} - peers := []*peer.Peer{} + peers := []peer.Peer{} for i := 0; i < 7; i++ { peers = append(peers, _randPeer()) } @@ -270,13 +267,13 @@ func TestLessThanKResponses(t *testing.T) { u.Debug = false fn := &fauxNet{} fs := &fauxSender{} + local := peer.WithIDString("test_peer") peerstore := peer.NewPeerstore() - local := new(peer.Peer) - local.ID = peer.ID("test_peer") + peerstore.Put(local) d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) - var ps []*peer.Peer + var ps []peer.Peer for i := 0; i < 5; i++ { ps = append(ps, _randPeer()) d.Update(ps[i]) @@ -295,7 +292,7 @@ func TestLessThanKResponses(t *testing.T) { case Message_GET_VALUE: resp := &Message{ Type: pmes.Type, - CloserPeers: peersToPBPeers([]*peer.Peer{other}), + CloserPeers: peersToPBPeers([]peer.Peer{other}), } mes, err := msg.FromObject(mes.Peer(), resp) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 1046516b66..44802babb8 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -14,7 +14,7 @@ import ( var CloserPeerCount = 4 // dhthandler specifies the signature of functions that handle DHT messages. -type dhtHandler func(*peer.Peer, *Message) (*Message, error) +type dhtHandler func(peer.Peer, *Message) (*Message, error) func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { switch t { @@ -35,7 +35,7 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { } } -func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) { log.Debug("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) // setup response @@ -93,7 +93,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *Message) (*Message, error } // Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *Message) (*Message, error) { dht.dslock.Lock() defer dht.dslock.Unlock() dskey := u.Key(pmes.GetKey()).DsKey() @@ -102,18 +102,18 @@ func (dht *IpfsDHT) handlePutValue(p *peer.Peer, pmes *Message) (*Message, error return pmes, err } -func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handlePing(p peer.Peer, pmes *Message) (*Message, error) { log.Debug("%s Responding to ping from %s!\n", dht.self, p) return pmes, nil } -func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *Message) (*Message, error) { resp := newMessage(pmes.GetType(), "", pmes.GetClusterLevel()) - var closest []*peer.Peer + var closest []peer.Peer // if looking for self... special case where we send it on CloserPeers. - if peer.ID(pmes.GetKey()).Equal(dht.self.ID) { - closest = []*peer.Peer{dht.self} + if peer.ID(pmes.GetKey()).Equal(dht.self.ID()) { + closest = []peer.Peer{dht.self} } else { closest = dht.betterPeersToQuery(pmes, CloserPeerCount) } @@ -123,9 +123,9 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error return resp, nil } - var withAddresses []*peer.Peer + var withAddresses []peer.Peer for _, p := range closest { - if len(p.Addresses) > 0 { + if len(p.Addresses()) > 0 { withAddresses = append(withAddresses, p) } } @@ -137,7 +137,7 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *Message) (*Message, error return resp, nil } -func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *Message) (*Message, error) { resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. @@ -171,10 +171,10 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *Message) (*Message, e type providerInfo struct { Creation time.Time - Value *peer.Peer + Value peer.Peer } -func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handleAddProvider(p peer.Peer, pmes *Message) (*Message, error) { key := u.Key(pmes.GetKey()) log.Debug("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) @@ -182,7 +182,7 @@ func (dht *IpfsDHT) handleAddProvider(p *peer.Peer, pmes *Message) (*Message, er // add provider should use the address given in the message for _, pb := range pmes.GetProviderPeers() { pid := peer.ID(pb.GetId()) - if pid.Equal(p.ID) { + if pid.Equal(p.ID()) { addr, err := pb.Address() if err != nil { diff --git a/routing/dht/providers.go b/routing/dht/providers.go index c62755cf2b..204fdf7d5d 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -20,12 +20,12 @@ type ProviderManager struct { type addProv struct { k u.Key - val *peer.Peer + val peer.Peer } type getProv struct { k u.Key - resp chan []*peer.Peer + resp chan []peer.Peer } func NewProviderManager(local peer.ID) *ProviderManager { @@ -45,7 +45,7 @@ func (pm *ProviderManager) run() { for { select { case np := <-pm.newprovs: - if np.val.ID.Equal(pm.lpeer) { + if np.val.ID().Equal(pm.lpeer) { pm.local[np.k] = struct{}{} } pi := new(providerInfo) @@ -54,7 +54,7 @@ func (pm *ProviderManager) run() { arr := pm.providers[np.k] pm.providers[np.k] = append(arr, pi) case gp := <-pm.getprovs: - var parr []*peer.Peer + var parr []peer.Peer provs := pm.providers[gp.k] for _, p := range provs { parr = append(parr, p.Value) @@ -82,17 +82,17 @@ func (pm *ProviderManager) run() { } } -func (pm *ProviderManager) AddProvider(k u.Key, val *peer.Peer) { +func (pm *ProviderManager) AddProvider(k u.Key, val peer.Peer) { pm.newprovs <- &addProv{ k: k, val: val, } } -func (pm *ProviderManager) GetProviders(k u.Key) []*peer.Peer { +func (pm *ProviderManager) GetProviders(k u.Key) []peer.Peer { gp := new(getProv) gp.k = k - gp.resp = make(chan []*peer.Peer) + gp.resp = make(chan []peer.Peer) pm.getprovs <- gp return <-gp.resp } diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 0cdfa4fcc7..b37327d2e7 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -11,7 +11,7 @@ func TestProviderManager(t *testing.T) { mid := peer.ID("testing") p := NewProviderManager(mid) a := u.Key("test") - p.AddProvider(a, &peer.Peer{}) + p.AddProvider(a, peer.WithIDString("testingprovider")) resp := p.GetProviders(a) if len(resp) != 1 { t.Fatal("Could not retrieve provider.") diff --git a/routing/dht/query.go b/routing/dht/query.go index 0a9ca0bd83..ef3670c7db 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -26,10 +26,10 @@ type dhtQuery struct { } type dhtQueryResult struct { - value []byte // GetValue - peer *peer.Peer // FindPeer - providerPeers []*peer.Peer // GetProviders - closerPeers []*peer.Peer // * + value []byte // GetValue + peer peer.Peer // FindPeer + providerPeers []peer.Peer // GetProviders + closerPeers []peer.Peer // * success bool } @@ -47,10 +47,10 @@ func newQuery(k u.Key, f queryFunc) *dhtQuery { // - the value // - a list of peers potentially better able to serve the query // - an error -type queryFunc func(context.Context, *peer.Peer) (*dhtQueryResult, error) +type queryFunc func(context.Context, peer.Peer) (*dhtQueryResult, error) // Run runs the query at hand. pass in a list of peers to use first. -func (q *dhtQuery) Run(ctx context.Context, peers []*peer.Peer) (*dhtQueryResult, error) { +func (q *dhtQuery) Run(ctx context.Context, peers []peer.Peer) (*dhtQueryResult, error) { runner := newQueryRunner(ctx, q) return runner.Run(peers) } @@ -100,7 +100,7 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { } } -func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { +func (r *dhtQueryRunner) Run(peers []peer.Peer) (*dhtQueryResult, error) { log.Debug("Run query with %d peers.", len(peers)) if len(peers) == 0 { log.Warning("Running query with no peers!") @@ -148,7 +148,7 @@ func (r *dhtQueryRunner) Run(peers []*peer.Peer) (*dhtQueryResult, error) { return nil, err } -func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { +func (r *dhtQueryRunner) addPeerToQuery(next peer.Peer, benchmark peer.Peer) { if next == nil { // wtf why are peers nil?!? log.Error("Query getting nil peers!!!\n") @@ -156,7 +156,7 @@ func (r *dhtQueryRunner) addPeerToQuery(next *peer.Peer, benchmark *peer.Peer) { } // if new peer further away than whom we got it from, bother (loops) - if benchmark != nil && kb.Closer(benchmark.ID, next.ID, r.query.key) { + if benchmark != nil && kb.Closer(benchmark.ID(), next.ID(), r.query.key) { return } @@ -200,7 +200,7 @@ func (r *dhtQueryRunner) spawnWorkers() { } } -func (r *dhtQueryRunner) queryPeer(p *peer.Peer) { +func (r *dhtQueryRunner) queryPeer(p peer.Peer) { log.Debug("spawned worker for: %v\n", p) // make sure we rate limit concurrency. diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 55ef265cb7..7f004dc47a 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -23,13 +23,13 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - var peers []*peer.Peer + var peers []peer.Peer for _, route := range dht.routingTables { npeers := route.NearestPeers(kb.ConvertKey(key), KValue) peers = append(peers, npeers...) } - query := newQuery(key, func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { log.Debug("%s PutValue qry part %v", dht.self, p) err := dht.putValueToNetwork(ctx, p, string(key), value) if err != nil { @@ -65,7 +65,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // setup the Query - query := newQuery(key, func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { val, peers, err := dht.getValueOrPeers(ctx, p, key, routeLevel) if err != nil { @@ -117,8 +117,8 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { return nil } -func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan *peer.Peer { - peerOut := make(chan *peer.Peer, count) +func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { + peerOut := make(chan peer.Peer, count) go func() { ps := newPeerSet() provs := dht.providers.GetProviders(key) @@ -136,7 +136,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) for _, pp := range peers { wg.Add(1) - go func(p *peer.Peer) { + go func(p peer.Peer) { defer wg.Done() pmes, err := dht.findProvidersSingle(ctx, p, key, 0) if err != nil { @@ -153,7 +153,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int } //TODO: this function could also be done asynchronously -func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet, count int, out chan *peer.Peer) { +func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet, count int, out chan peer.Peer) { for _, pbp := range peers { // construct new peer @@ -173,7 +173,7 @@ func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet // Find specific Peer // FindPeer searches for a peer with given ID. -func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error) { +func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) { // Check if were already connected to them p, _ := dht.FindLocal(id) @@ -186,7 +186,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error if p == nil { return nil, nil } - if p.ID.Equal(id) { + if p.ID().Equal(id) { return p, nil } @@ -205,7 +205,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error continue } - if nxtPeer.ID.Equal(id) { + if nxtPeer.ID().Equal(id) { return nxtPeer, nil } @@ -214,7 +214,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (*peer.Peer, error return nil, u.ErrNotFound } -func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Peer, error) { +func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (peer.Peer, error) { // Check if were already connected to them p, _ := dht.FindLocal(id) @@ -230,7 +230,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee } // setup query function - query := newQuery(u.Key(id), func(ctx context.Context, p *peer.Peer) (*dhtQueryResult, error) { + query := newQuery(u.Key(id), func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) if err != nil { log.Error("%s getPeer error: %v", dht.self, err) @@ -242,7 +242,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee routeLevel++ } - nxtprs := make([]*peer.Peer, len(plist)) + nxtprs := make([]peer.Peer, len(plist)) for i, fp := range plist { nxtp, err := dht.peerFromInfo(fp) if err != nil { @@ -250,7 +250,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee continue } - if nxtp.ID.Equal(id) { + if nxtp.ID().Equal(id) { return &dhtQueryResult{peer: nxtp, success: true}, nil } @@ -272,7 +272,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (*peer.Pee } // Ping a peer, log the time it took -func (dht *IpfsDHT) Ping(ctx context.Context, p *peer.Peer) error { +func (dht *IpfsDHT) Ping(ctx context.Context, p peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? log.Info("ping %s start", p) diff --git a/routing/dht/util.go b/routing/dht/util.go index d12f7f9dfd..3cc812638e 100644 --- a/routing/dht/util.go +++ b/routing/dht/util.go @@ -52,15 +52,15 @@ func newPeerSet() *peerSet { return ps } -func (ps *peerSet) Add(p *peer.Peer) { +func (ps *peerSet) Add(p peer.Peer) { ps.lk.Lock() - ps.ps[string(p.ID)] = true + ps.ps[string(p.ID())] = true ps.lk.Unlock() } -func (ps *peerSet) Contains(p *peer.Peer) bool { +func (ps *peerSet) Contains(p peer.Peer) bool { ps.lk.RLock() - _, ok := ps.ps[string(p.ID)] + _, ok := ps.ps[string(p.ID())] ps.lk.RUnlock() return ok } @@ -71,12 +71,12 @@ func (ps *peerSet) Size() int { return len(ps.ps) } -func (ps *peerSet) AddIfSmallerThan(p *peer.Peer, maxsize int) bool { +func (ps *peerSet) AddIfSmallerThan(p peer.Peer, maxsize int) bool { var success bool ps.lk.Lock() - if _, ok := ps.ps[string(p.ID)]; !ok && len(ps.ps) < maxsize { + if _, ok := ps.ps[string(p.ID())]; !ok && len(ps.ps) < maxsize { success = true - ps.ps[string(p.ID)] = true + ps.ps[string(p.ID())] = true } ps.lk.Unlock() return success diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 3a9c71fad9..b114f9e217 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -23,7 +23,7 @@ func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { - if e.Value.(*peer.Peer).ID.Equal(id) { + if e.Value.(peer.Peer).ID().Equal(id) { return e } } @@ -36,18 +36,18 @@ func (b *Bucket) moveToFront(e *list.Element) { b.lk.Unlock() } -func (b *Bucket) pushFront(p *peer.Peer) { +func (b *Bucket) pushFront(p peer.Peer) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) popBack() *peer.Peer { +func (b *Bucket) popBack() peer.Peer { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() b.list.Remove(last) - return last.Value.(*peer.Peer) + return last.Value.(peer.Peer) } func (b *Bucket) len() int { @@ -68,7 +68,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { newbuck.list = out e := b.list.Front() for e != nil { - peerID := ConvertPeerID(e.Value.(*peer.Peer).ID) + peerID := ConvertPeerID(e.Value.(peer.Peer).ID()) peerCPL := commonPrefixLen(peerID, target) if peerCPL > cpl { cur := e diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 45ffb3cdf6..6f37e94de1 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -42,10 +42,10 @@ func NewRoutingTable(bucketsize int, localID ID, latency time.Duration) *Routing // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned -func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { +func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peerID := ConvertPeerID(p.ID) + peerID := ConvertPeerID(p.ID()) cpl := commonPrefixLen(peerID, rt.local) bucketID := cpl @@ -54,7 +54,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { } bucket := rt.Buckets[bucketID] - e := bucket.find(p.ID) + e := bucket.find(p.ID()) if e == nil { // New peer, add to bucket if p.GetLatency() > rt.maxLatency { @@ -93,7 +93,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { // A helper struct to sort peers by their distance to the local node type peerDistance struct { - p *peer.Peer + p peer.Peer distance ID } @@ -110,8 +110,8 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(*peer.Peer) - pID := ConvertPeerID(p.ID) + p := e.Value.(peer.Peer) + pID := ConvertPeerID(p.ID()) pd := peerDistance{ p: p, distance: xor(target, pID), @@ -126,16 +126,16 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } // Find a specific peer by ID or return nil -func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { +func (rt *RoutingTable) Find(id peer.ID) peer.Peer { srch := rt.NearestPeers(ConvertPeerID(id), 1) - if len(srch) == 0 || !srch[0].ID.Equal(id) { + if len(srch) == 0 || !srch[0].ID().Equal(id) { return nil } return srch[0] } // NearestPeer returns a single peer that is nearest to the given ID -func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { +func (rt *RoutingTable) NearestPeer(id ID) peer.Peer { peers := rt.NearestPeers(id, 1) if len(peers) > 0 { return peers[0] @@ -146,7 +146,7 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { } // NearestPeers returns a list of the 'count' closest peers to the given ID -func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { +func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.Peer { rt.tabLock.RLock() defer rt.tabLock.RUnlock() cpl := commonPrefixLen(id, rt.local) @@ -178,7 +178,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // Sort by distance to local peer sort.Sort(peerArr) - var out []*peer.Peer + var out []peer.Peer for i := 0; i < count && i < peerArr.Len(); i++ { out = append(out, peerArr[i].p) } @@ -197,11 +197,11 @@ func (rt *RoutingTable) Size() int { // ListPeers takes a RoutingTable and returns a list of all peers from all buckets in the table. // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) ListPeers() []*peer.Peer { - var peers []*peer.Peer +func (rt *RoutingTable) ListPeers() []peer.Peer { + var peers []peer.Peer for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { - peers = append(peers, e.Value.(*peer.Peer)) + peers = append(peers, e.Value.(peer.Peer)) } } return peers @@ -213,6 +213,6 @@ func (rt *RoutingTable) Print() { rt.tabLock.RLock() peers := rt.ListPeers() for i, p := range peers { - fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) + fmt.Printf("%d) %s %s\n", i, p.ID().Pretty(), p.GetLatency().String()) } } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index cc1cdfba1d..2b45d15729 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -10,11 +10,10 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) -func _randPeer() *peer.Peer { - p := new(peer.Peer) - p.ID = make(peer.ID, 16) - crand.Read(p.ID) - return p +func _randPeer() peer.Peer { + id := make(peer.ID, 16) + crand.Read(id) + return peer.WithID(id) } func _randID() ID { @@ -29,25 +28,25 @@ func _randID() ID { func TestBucket(t *testing.T) { b := newBucket() - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { peers[i] = _randPeer() b.pushFront(peers[i]) } local := _randPeer() - localID := ConvertPeerID(local.ID) + localID := ConvertPeerID(local.ID()) i := rand.Intn(len(peers)) - e := b.find(peers[i].ID) + e := b.find(peers[i].ID()) if e == nil { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, ConvertPeerID(local.ID)) + spl := b.Split(0, ConvertPeerID(local.ID())) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(peer.Peer).ID()) cpl := commonPrefixLen(p, localID) if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") @@ -56,7 +55,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(peer.Peer).ID()) cpl := commonPrefixLen(p, localID) if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") @@ -67,9 +66,9 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { peers[i] = _randPeer() } @@ -93,33 +92,33 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 5; i++ { peers[i] = _randPeer() rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) - if !found.ID.Equal(peers[2].ID) { + found := rt.NearestPeer(ConvertPeerID(peers[2].ID())) + if !found.ID().Equal(peers[2].ID()) { t.Fatalf("Failed to lookup known node...") } } func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(20, ConvertPeerID(local.ID()), time.Hour) - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 18; i++ { peers[i] = _randPeer() rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) + found := rt.NearestPeers(ConvertPeerID(peers[2].ID()), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -131,7 +130,7 @@ func TestTableFindMultiple(t *testing.T) { func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) - var peers []*peer.Peer + var peers []peer.Peer for i := 0; i < 500; i++ { peers = append(peers, _randPeer()) } @@ -156,7 +155,7 @@ func TestTableMultithreaded(t *testing.T) { go func() { for i := 0; i < 1000; i++ { n := rand.Intn(len(peers)) - tab.Find(peers[n].ID) + tab.Find(peers[n].ID()) } done <- struct{}{} }() @@ -170,7 +169,7 @@ func BenchmarkUpdates(b *testing.B) { local := ConvertKey("localKey") tab := NewRoutingTable(20, local, time.Hour) - var peers []*peer.Peer + var peers []peer.Peer for i := 0; i < b.N; i++ { peers = append(peers, _randPeer()) } @@ -186,7 +185,7 @@ func BenchmarkFinds(b *testing.B) { local := ConvertKey("localKey") tab := NewRoutingTable(20, local, time.Hour) - var peers []*peer.Peer + var peers []peer.Peer for i := 0; i < b.N; i++ { peers = append(peers, _randPeer()) tab.Update(peers[i]) @@ -194,6 +193,6 @@ func BenchmarkFinds(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { - tab.Find(peers[i].ID) + tab.Find(peers[i].ID()) } } diff --git a/routing/mock/routing.go b/routing/mock/routing.go index 954914c3be..caa74ffe37 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -17,10 +17,10 @@ var _ routing.IpfsRouting = &MockRouter{} type MockRouter struct { datastore ds.Datastore hashTable RoutingServer - peer *peer.Peer + peer peer.Peer } -func NewMockRouter(local *peer.Peer, dstore ds.Datastore) routing.IpfsRouting { +func NewMockRouter(local peer.Peer, dstore ds.Datastore) routing.IpfsRouting { return &MockRouter{ datastore: dstore, peer: local, @@ -50,16 +50,16 @@ func (mr *MockRouter) GetValue(ctx context.Context, key u.Key) ([]byte, error) { return data, nil } -func (mr *MockRouter) FindProviders(ctx context.Context, key u.Key) ([]*peer.Peer, error) { +func (mr *MockRouter) FindProviders(ctx context.Context, key u.Key) ([]peer.Peer, error) { return nil, nil } -func (mr *MockRouter) FindPeer(ctx context.Context, pid peer.ID) (*peer.Peer, error) { +func (mr *MockRouter) FindPeer(ctx context.Context, pid peer.ID) (peer.Peer, error) { return nil, nil } -func (mr *MockRouter) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan *peer.Peer { - out := make(chan *peer.Peer) +func (mr *MockRouter) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.Peer { + out := make(chan peer.Peer) go func() { defer close(out) for i, p := range mr.hashTable.Providers(k) { @@ -81,11 +81,11 @@ func (mr *MockRouter) Provide(_ context.Context, key u.Key) error { } type RoutingServer interface { - Announce(*peer.Peer, u.Key) error + Announce(peer.Peer, u.Key) error - Providers(u.Key) []*peer.Peer + Providers(u.Key) []peer.Peer - Client(p *peer.Peer) routing.IpfsRouting + Client(p peer.Peer) routing.IpfsRouting } func VirtualRoutingServer() RoutingServer { @@ -99,7 +99,7 @@ type hashTable struct { providers map[u.Key]peer.Map } -func (rs *hashTable) Announce(p *peer.Peer, k u.Key) error { +func (rs *hashTable) Announce(p peer.Peer, k u.Key) error { rs.lock.Lock() defer rs.lock.Unlock() @@ -111,10 +111,10 @@ func (rs *hashTable) Announce(p *peer.Peer, k u.Key) error { return nil } -func (rs *hashTable) Providers(k u.Key) []*peer.Peer { +func (rs *hashTable) Providers(k u.Key) []peer.Peer { rs.lock.RLock() defer rs.lock.RUnlock() - ret := make([]*peer.Peer, 0) + ret := make([]peer.Peer, 0) peerset, ok := rs.providers[k] if !ok { return ret @@ -131,7 +131,7 @@ func (rs *hashTable) Providers(k u.Key) []*peer.Peer { return ret } -func (rs *hashTable) Client(p *peer.Peer) routing.IpfsRouting { +func (rs *hashTable) Client(p peer.Peer) routing.IpfsRouting { return &MockRouter{ peer: p, hashTable: rs, diff --git a/routing/mock/routing_test.go b/routing/mock/routing_test.go index 650f5d3d59..196e00b5e6 100644 --- a/routing/mock/routing_test.go +++ b/routing/mock/routing_test.go @@ -20,9 +20,7 @@ func TestKeyNotFound(t *testing.T) { func TestSetAndGet(t *testing.T) { pid := peer.ID([]byte("the peer id")) - p := &peer.Peer{ - ID: pid, - } + p := peer.WithID(pid) k := u.Key("42") rs := VirtualRoutingServer() err := rs.Announce(p, k) @@ -34,7 +32,7 @@ func TestSetAndGet(t *testing.T) { t.Fatal("should be one") } for _, elem := range providers { - if bytes.Equal(elem.ID, pid) { + if bytes.Equal(elem.ID(), pid) { return } } @@ -42,7 +40,7 @@ func TestSetAndGet(t *testing.T) { } func TestClientFindProviders(t *testing.T) { - peer := &peer.Peer{ID: []byte("42")} + peer := peer.WithIDString("42") rs := VirtualRoutingServer() client := rs.Client(peer) @@ -57,7 +55,7 @@ func TestClientFindProviders(t *testing.T) { isInHT := false for _, p := range providersFromHashTable { - if bytes.Equal(p.ID, peer.ID) { + if bytes.Equal(p.ID(), peer.ID()) { isInHT = true } } @@ -67,7 +65,7 @@ func TestClientFindProviders(t *testing.T) { providersFromClient := client.FindProvidersAsync(context.Background(), u.Key("hello"), max) isInClient := false for p := range providersFromClient { - if bytes.Equal(p.ID, peer.ID) { + if bytes.Equal(p.ID(), peer.ID()) { isInClient = true } } @@ -81,9 +79,7 @@ func TestClientOverMax(t *testing.T) { k := u.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { - peer := &peer.Peer{ - ID: []byte(string(i)), - } + peer := peer.WithIDString(string(i)) err := rs.Announce(peer, k) if err != nil { t.Fatal(err) @@ -96,7 +92,7 @@ func TestClientOverMax(t *testing.T) { } max := 10 - peer := &peer.Peer{ID: []byte("TODO")} + peer := peer.WithIDString("TODO") client := rs.Client(peer) providersFromClient := client.FindProvidersAsync(context.Background(), k, max) @@ -118,9 +114,7 @@ func TestCanceledContext(t *testing.T) { i := 0 go func() { // infinite stream for { - peer := &peer.Peer{ - ID: []byte(string(i)), - } + peer := peer.WithIDString(string(i)) err := rs.Announce(peer, k) if err != nil { t.Fatal(err) @@ -129,7 +123,7 @@ func TestCanceledContext(t *testing.T) { } }() - local := &peer.Peer{ID: []byte("peer id doesn't matter")} + local := peer.WithIDString("peer id doesn't matter") client := rs.Client(local) t.Log("warning: max is finite so this test is non-deterministic") diff --git a/routing/routing.go b/routing/routing.go index f3dd0c9d86..cb60e5ee8a 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -10,7 +10,7 @@ import ( // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { - FindProvidersAsync(context.Context, u.Key, int) <-chan *peer.Peer + FindProvidersAsync(context.Context, u.Key, int) <-chan peer.Peer // Basic Put/Get @@ -28,5 +28,5 @@ type IpfsRouting interface { // Find specific Peer // FindPeer searches for a peer with given ID. - FindPeer(context.Context, peer.ID) (*peer.Peer, error) + FindPeer(context.Context, peer.ID) (peer.Peer, error) } From 90cc3562e2ad8f9b10051bee62cfb85f9b28879e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 20 Oct 2014 03:26:44 -0700 Subject: [PATCH 0238/3147] peer.Peer is now an interface ![](http://m.memegen.com/77n7dk.jpg) This commit was moved from ipfs/go-namesys@4b49a77243866d5ac8fdb68245beb81b00589241 --- namesys/resolve_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 5e652f42f8..c6ee633512 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,9 +11,7 @@ import ( ) func TestRoutingResolve(t *testing.T) { - local := &peer.Peer{ - ID: []byte("testID"), - } + local := peer.WithIDString("testID") lds := ds.NewMapDatastore() d := mock.NewMockRouter(local, lds) From ebe77f4d4426ba6cc8eb2d00a83a73067ffede85 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 20 Oct 2014 06:37:09 -0700 Subject: [PATCH 0239/3147] peerstore Put -> Add Changed lots of peer use, and changed the peerstore to ensure there is only ever one peer in use. Fixed #174 This commit was moved from ipfs/go-ipfs-routing@e90a5ad21dcb2b77cfbb11222a5de267d5fb6342 --- routing/dht/ext_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index c4ba09414c..b38b12d6c7 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -203,7 +203,7 @@ func TestNotFound(t *testing.T) { local := peer.WithIDString("test_peer") peerstore := peer.NewPeerstore() - peerstore.Put(local) + peerstore.Add(local) d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) @@ -269,7 +269,7 @@ func TestLessThanKResponses(t *testing.T) { fs := &fauxSender{} local := peer.WithIDString("test_peer") peerstore := peer.NewPeerstore() - peerstore.Put(local) + peerstore.Add(local) d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) From 904eced75a31a514c9303302bf8a0530d7893f03 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 15:10:58 -0700 Subject: [PATCH 0240/3147] renamed datastore.go -> go-datastore This commit was moved from ipfs/go-ipfs-routing@edcabfa15356d57197d5158a85babe0ede6406b6 --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 2 +- routing/mock/routing.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 3617b7142d..a0f14aa912 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,7 +15,7 @@ import ( u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 23d9fcf171..590d5ead3a 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -6,7 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ci "github.com/jbenet/go-ipfs/crypto" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index b38b12d6c7..43bd34f8a2 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -8,7 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" msg "github.com/jbenet/go-ipfs/net/message" mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 44802babb8..d3c4d23e3b 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -8,7 +8,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ) var CloserPeerCount = 4 diff --git a/routing/mock/routing.go b/routing/mock/routing.go index caa74ffe37..9c69195896 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" From 1ef2560705fd508d957a45487688c3db6af534af Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 15:10:58 -0700 Subject: [PATCH 0241/3147] renamed datastore.go -> go-datastore This commit was moved from ipfs/go-namesys@52bed613052f4d8140d5675e8714560fed1f645c --- namesys/resolve_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index c6ee633512..d7d49c5a64 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -3,7 +3,7 @@ package namesys import ( "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ci "github.com/jbenet/go-ipfs/crypto" "github.com/jbenet/go-ipfs/peer" mock "github.com/jbenet/go-ipfs/routing/mock" From f1b5aa263bfdcc7e0142cbfa82eae992080b1795 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 15:10:58 -0700 Subject: [PATCH 0242/3147] renamed datastore.go -> go-datastore This commit was moved from ipfs/go-unixfs@668d7de7e64318cbf218a425d16755c487a5723a --- unixfs/io/dagmodifier_test.go | 2 +- unixfs/io/dagwriter_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 5c96aaae4d..5e9edb7273 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -13,7 +13,7 @@ import ( ft "github.com/jbenet/go-ipfs/unixfs" u "github.com/jbenet/go-ipfs/util" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ) func getMockDagServ(t *testing.T) *mdag.DAGService { diff --git a/unixfs/io/dagwriter_test.go b/unixfs/io/dagwriter_test.go index 73ba5c4e91..ddf5f9d667 100644 --- a/unixfs/io/dagwriter_test.go +++ b/unixfs/io/dagwriter_test.go @@ -5,7 +5,7 @@ import ( "io" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" bs "github.com/jbenet/go-ipfs/blockservice" chunk "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" From 658d2c22f8f36844b5a4ed4a458d8881ce7feaf3 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 15:10:58 -0700 Subject: [PATCH 0243/3147] renamed datastore.go -> go-datastore This commit was moved from ipfs/go-blockservice@131764a94b78a597a3eebdf79e6900a4eab7b67a --- blockservice/blocks_test.go | 2 +- blockservice/blockservice.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 764d2d400e..41eceaae62 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index dcf15ce95b..9f914dc38b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -5,7 +5,7 @@ import ( "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" blocks "github.com/jbenet/go-ipfs/blocks" From 90b06f6cb8954ed2e99a0c5e9ca197dc99a3cd82 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 16 Oct 2014 00:20:46 -0700 Subject: [PATCH 0244/3147] add blockset and bloomfilter and beginnings of pinning service This commit was moved from ipfs/go-ipfs-pinner@c16410f95946003a63b5b1b1f4cff8eeb80b0928 --- pinning/pinner/pin.go | 88 ++++++++++++++++++++++++++++++++++++++++ pinning/pinner/refset.go | 40 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 pinning/pinner/pin.go create mode 100644 pinning/pinner/refset.go diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go new file mode 100644 index 0000000000..9607d00bc3 --- /dev/null +++ b/pinning/pinner/pin.go @@ -0,0 +1,88 @@ +package pin + +import ( + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + "github.com/jbenet/go-ipfs/blocks/set" + mdag "github.com/jbenet/go-ipfs/merkledag" + "github.com/jbenet/go-ipfs/util" +) + +type Pinner interface { + Pin(*mdag.Node, bool) error + Unpin(util.Key, bool) error +} + +type pinner struct { + recursePin set.BlockSet + directPin set.BlockSet + indirPin set.BlockSet + dserv *mdag.DAGService +} + +func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { + return &pinner{ + recursePin: set.NewSimpleBlockSet(), + directPin: set.NewSimpleBlockSet(), + indirPin: NewRefCountBlockSet(), + dserv: serv, + } +} + +func (p *pinner) Pin(node *mdag.Node, recurse bool) error { + k, err := node.Key() + if err != nil { + return err + } + + if recurse { + if p.recursePin.HasKey(k) { + return nil + } + + p.recursePin.AddBlock(k) + + err := p.pinLinks(node) + if err != nil { + return err + } + } else { + p.directPin.AddBlock(k) + } + return nil +} + +func (p *pinner) Unpin(k util.Key, recurse bool) error { + panic("not yet implemented!") + return nil +} + +func (p *pinner) pinIndirectRecurse(node *mdag.Node) error { + k, err := node.Key() + if err != nil { + return err + } + + p.indirPin.AddBlock(k) + return p.pinLinks(node) +} + +func (p *pinner) pinLinks(node *mdag.Node) error { + for _, l := range node.Links { + subnode, err := l.GetNode(p.dserv) + if err != nil { + // TODO: Maybe just log and continue? + return err + } + err = p.pinIndirectRecurse(subnode) + if err != nil { + return err + } + } + return nil +} + +func (p *pinner) IsPinned(key util.Key) bool { + return p.recursePin.HasKey(key) || + p.directPin.HasKey(key) || + p.indirPin.HasKey(key) +} diff --git a/pinning/pinner/refset.go b/pinning/pinner/refset.go new file mode 100644 index 0000000000..1756bf50ab --- /dev/null +++ b/pinning/pinner/refset.go @@ -0,0 +1,40 @@ +package pin + +import ( + "github.com/jbenet/go-ipfs/blocks/bloom" + "github.com/jbenet/go-ipfs/blocks/set" + "github.com/jbenet/go-ipfs/util" +) + +type refCntBlockSet struct { + blocks map[util.Key]int +} + +func NewRefCountBlockSet() set.BlockSet { + return &refCntBlockSet{blocks: make(map[util.Key]int)} +} + +func (r *refCntBlockSet) AddBlock(k util.Key) { + r.blocks[k]++ +} + +func (r *refCntBlockSet) RemoveBlock(k util.Key) { + v, ok := r.blocks[k] + if !ok { + return + } + if v <= 1 { + delete(r.blocks, k) + } else { + r.blocks[k] = v - 1 + } +} + +func (r *refCntBlockSet) HasKey(k util.Key) bool { + _, ok := r.blocks[k] + return ok +} + +func (r *refCntBlockSet) GetBloomFilter() bloom.Filter { + return nil +} From 868cd44ce61646de6bf653167530394c1ac99ac8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 16 Oct 2014 19:20:33 -0700 Subject: [PATCH 0245/3147] implement unpin and add a datastore backed blockset This commit was moved from ipfs/go-ipfs-pinner@93a20c7f60c949cad5d711718291adbd3b13ff5b --- pinning/pinner/pin.go | 45 ++++++++++++++++++++++++++++++++++++---- pinning/pinner/refset.go | 40 ----------------------------------- 2 files changed, 41 insertions(+), 44 deletions(-) delete mode 100644 pinning/pinner/refset.go diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 9607d00bc3..d7184e24fa 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -17,14 +17,19 @@ type pinner struct { directPin set.BlockSet indirPin set.BlockSet dserv *mdag.DAGService + dstore ds.Datastore } func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { + rcset := set.NewDBWrapperSet(dstore, "/pinned/recurse/", set.NewSimpleBlockSet()) + dirset := set.NewDBWrapperSet(dstore, "/pinned/direct/", set.NewSimpleBlockSet()) + indset := set.NewDBWrapperSet(dstore, "/pinned/indirect/", set.NewRefCountBlockSet()) return &pinner{ - recursePin: set.NewSimpleBlockSet(), - directPin: set.NewSimpleBlockSet(), - indirPin: NewRefCountBlockSet(), + recursePin: rcset, + directPin: dirset, + indirPin: indset, dserv: serv, + dstore: dstore, } } @@ -52,7 +57,39 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { } func (p *pinner) Unpin(k util.Key, recurse bool) error { - panic("not yet implemented!") + if recurse { + p.recursePin.RemoveBlock(k) + node, err := p.dserv.Get(k) + if err != nil { + return err + } + + return p.unpinLinks(node) + } else { + p.directPin.RemoveBlock(k) + } + return nil +} + +func (p *pinner) unpinLinks(node *mdag.Node) error { + for _, l := range node.Links { + node, err := l.GetNode(p.dserv) + if err != nil { + return err + } + + k, err := node.Key() + if err != nil { + return err + } + + p.recursePin.RemoveBlock(k) + + err = p.unpinLinks(node) + if err != nil { + return err + } + } return nil } diff --git a/pinning/pinner/refset.go b/pinning/pinner/refset.go deleted file mode 100644 index 1756bf50ab..0000000000 --- a/pinning/pinner/refset.go +++ /dev/null @@ -1,40 +0,0 @@ -package pin - -import ( - "github.com/jbenet/go-ipfs/blocks/bloom" - "github.com/jbenet/go-ipfs/blocks/set" - "github.com/jbenet/go-ipfs/util" -) - -type refCntBlockSet struct { - blocks map[util.Key]int -} - -func NewRefCountBlockSet() set.BlockSet { - return &refCntBlockSet{blocks: make(map[util.Key]int)} -} - -func (r *refCntBlockSet) AddBlock(k util.Key) { - r.blocks[k]++ -} - -func (r *refCntBlockSet) RemoveBlock(k util.Key) { - v, ok := r.blocks[k] - if !ok { - return - } - if v <= 1 { - delete(r.blocks, k) - } else { - r.blocks[k] = v - 1 - } -} - -func (r *refCntBlockSet) HasKey(k util.Key) bool { - _, ok := r.blocks[k] - return ok -} - -func (r *refCntBlockSet) GetBloomFilter() bloom.Filter { - return nil -} From 2425c242e80f6c3d47dfe248b6ada1d1e5737705 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Oct 2014 13:53:49 -0700 Subject: [PATCH 0246/3147] move indirect pinning to its own structure This commit was moved from ipfs/go-ipfs-pinner@bf289f5a6877d6e282e1e7b6c946bc543d9730a4 --- pinning/pinner/indirect.go | 43 ++++++++++++++++++++++++++++++++++++++ pinning/pinner/pin.go | 11 ++++++---- 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 pinning/pinner/indirect.go diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go new file mode 100644 index 0000000000..b3b60e7535 --- /dev/null +++ b/pinning/pinner/indirect.go @@ -0,0 +1,43 @@ +package pin + +import ( + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + bc "github.com/jbenet/go-ipfs/blocks/set" + "github.com/jbenet/go-ipfs/util" +) + +type indirectPin struct { + blockset bc.BlockSet + refCounts map[util.Key]int +} + +func loadBlockSet(d ds.Datastore) (bc.BlockSet, map[util.Key]int) { + panic("Not yet implemented!") + return nil, nil +} + +func newIndirectPin(d ds.Datastore) indirectPin { + // suppose the blockset actually takes blocks, not just keys + bs, rc := loadBlockSet(d) + return indirectPin{bs, rc} +} + +func (i *indirectPin) Increment(k util.Key) { + c := i.refCounts[k] + i.refCounts[k] = c + 1 + if c <= 0 { + i.blockset.AddBlock(k) + } +} + +func (i *indirectPin) Decrement(k util.Key) { + c := i.refCounts[k] - 1 + i.refCounts[k] = c + if c <= 0 { + i.blockset.RemoveBlock(k) + } +} + +func (i *indirectPin) HasKey(k util.Key) bool { + return i.blockset.HasKey(k) +} diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d7184e24fa..86fff2afb8 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -15,19 +15,22 @@ type Pinner interface { type pinner struct { recursePin set.BlockSet directPin set.BlockSet - indirPin set.BlockSet + indirPin indirectPin dserv *mdag.DAGService dstore ds.Datastore } func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { + + // Load set from given datastore... rcset := set.NewDBWrapperSet(dstore, "/pinned/recurse/", set.NewSimpleBlockSet()) dirset := set.NewDBWrapperSet(dstore, "/pinned/direct/", set.NewSimpleBlockSet()) - indset := set.NewDBWrapperSet(dstore, "/pinned/indirect/", set.NewRefCountBlockSet()) + + nsdstore := dstore // WRAP IN NAMESPACE return &pinner{ recursePin: rcset, directPin: dirset, - indirPin: indset, + indirPin: newIndirectPin(nsdstore), dserv: serv, dstore: dstore, } @@ -99,7 +102,7 @@ func (p *pinner) pinIndirectRecurse(node *mdag.Node) error { return err } - p.indirPin.AddBlock(k) + p.indirPin.Increment(k) return p.pinLinks(node) } From 301564baf5ba306dbdf06effc7bfa2342b281704 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 19 Oct 2014 15:28:38 -0700 Subject: [PATCH 0247/3147] flesh out pinning object, needs tests and cli wiring still This commit was moved from ipfs/go-ipfs-pinner@829b696baf1864b10755b8bd5a50ffbad99a96ba --- pinning/pinner/indirect.go | 34 +++++++++++++++------ pinning/pinner/pin.go | 62 +++++++++++++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index b3b60e7535..bff1e545f3 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -1,25 +1,41 @@ package pin import ( + "errors" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - bc "github.com/jbenet/go-ipfs/blocks/set" + "github.com/jbenet/go-ipfs/blocks/set" "github.com/jbenet/go-ipfs/util" ) type indirectPin struct { - blockset bc.BlockSet + blockset set.BlockSet refCounts map[util.Key]int } -func loadBlockSet(d ds.Datastore) (bc.BlockSet, map[util.Key]int) { - panic("Not yet implemented!") - return nil, nil +func NewIndirectPin(dstore ds.Datastore) *indirectPin { + return &indirectPin{ + blockset: set.NewDBWrapperSet(dstore, set.NewSimpleBlockSet()), + refCounts: make(map[util.Key]int), + } } -func newIndirectPin(d ds.Datastore) indirectPin { - // suppose the blockset actually takes blocks, not just keys - bs, rc := loadBlockSet(d) - return indirectPin{bs, rc} +func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { + irefcnt, err := d.Get(k) + if err != nil { + return nil, err + } + refcnt, ok := irefcnt.(map[util.Key]int) + if !ok { + return nil, errors.New("invalid type from datastore") + } + + var keys []util.Key + for k, _ := range refcnt { + keys = append(keys, k) + } + + return &indirectPin{blockset: set.SimpleSetFromKeys(keys), refCounts: refcnt}, nil } func (i *indirectPin) Increment(k util.Key) { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 86fff2afb8..d6f7f0f191 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -1,21 +1,29 @@ package pin import ( + + //ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/namespace" "github.com/jbenet/go-ipfs/blocks/set" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/util" ) +var recursePinDatastoreKey = ds.NewKey("/local/pins/recursive/keys") +var directPinDatastoreKey = ds.NewKey("/local/pins/direct/keys") +var indirectPinDatastoreKey = ds.NewKey("/local/pins/indirect/keys") + type Pinner interface { Pin(*mdag.Node, bool) error Unpin(util.Key, bool) error + Flush() error } type pinner struct { recursePin set.BlockSet directPin set.BlockSet - indirPin indirectPin + indirPin *indirectPin dserv *mdag.DAGService dstore ds.Datastore } @@ -23,14 +31,17 @@ type pinner struct { func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { // Load set from given datastore... - rcset := set.NewDBWrapperSet(dstore, "/pinned/recurse/", set.NewSimpleBlockSet()) - dirset := set.NewDBWrapperSet(dstore, "/pinned/direct/", set.NewSimpleBlockSet()) + rcds := nsds.Wrap(dstore, recursePinDatastoreKey) + rcset := set.NewDBWrapperSet(rcds, set.NewSimpleBlockSet()) - nsdstore := dstore // WRAP IN NAMESPACE + dirds := nsds.Wrap(dstore, directPinDatastoreKey) + dirset := set.NewDBWrapperSet(dirds, set.NewSimpleBlockSet()) + + nsdstore := nsds.Wrap(dstore, indirectPinDatastoreKey) return &pinner{ recursePin: rcset, directPin: dirset, - indirPin: newIndirectPin(nsdstore), + indirPin: NewIndirectPin(nsdstore), dserv: serv, dstore: dstore, } @@ -126,3 +137,44 @@ func (p *pinner) IsPinned(key util.Key) bool { p.directPin.HasKey(key) || p.indirPin.HasKey(key) } + +func LoadPinner(d ds.Datastore) (Pinner, error) { + p := new(pinner) + + var err error + p.recursePin, err = set.SetFromDatastore(d, recursePinDatastoreKey) + if err != nil { + return nil, err + } + p.directPin, err = set.SetFromDatastore(d, directPinDatastoreKey) + if err != nil { + return nil, err + } + + p.indirPin, err = loadIndirPin(d, indirectPinDatastoreKey) + if err != nil { + return nil, err + } + + return p, nil +} + +func (p *pinner) Flush() error { + recurse := p.recursePin.GetKeys() + err := p.dstore.Put(recursePinDatastoreKey, recurse) + if err != nil { + return err + } + + direct := p.directPin.GetKeys() + err = p.dstore.Put(directPinDatastoreKey, direct) + if err != nil { + return err + } + + err = p.dstore.Put(indirectPinDatastoreKey, p.indirPin.refCounts) + if err != nil { + return err + } + return nil +} From df4981acbb0c3c61405ab31ee4f5fe9cc791027d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 19 Oct 2014 19:41:49 -0700 Subject: [PATCH 0248/3147] add testing for pins This commit was moved from ipfs/go-ipfs-pinner@73a9d9a9e056599c276dca96fc0dc77ff50a63e3 --- pinning/pinner/pin.go | 6 +- pinning/pinner/pin_test.go | 133 +++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 pinning/pinner/pin_test.go diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d6f7f0f191..1792020084 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -15,6 +15,7 @@ var directPinDatastoreKey = ds.NewKey("/local/pins/direct/keys") var indirectPinDatastoreKey = ds.NewKey("/local/pins/indirect/keys") type Pinner interface { + IsPinned(util.Key) bool Pin(*mdag.Node, bool) error Unpin(util.Key, bool) error Flush() error @@ -138,7 +139,7 @@ func (p *pinner) IsPinned(key util.Key) bool { p.indirPin.HasKey(key) } -func LoadPinner(d ds.Datastore) (Pinner, error) { +func LoadPinner(d ds.Datastore, dserv *mdag.DAGService) (Pinner, error) { p := new(pinner) var err error @@ -156,6 +157,9 @@ func LoadPinner(d ds.Datastore) (Pinner, error) { return nil, err } + p.dserv = dserv + p.dstore = d + return p, nil } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go new file mode 100644 index 0000000000..72c15d90dc --- /dev/null +++ b/pinning/pinner/pin_test.go @@ -0,0 +1,133 @@ +package pin + +import ( + "testing" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + bs "github.com/jbenet/go-ipfs/blockservice" + mdag "github.com/jbenet/go-ipfs/merkledag" + "github.com/jbenet/go-ipfs/util" +) + +func randNode() (*mdag.Node, util.Key) { + nd := new(mdag.Node) + nd.Data = make([]byte, 32) + util.NewFastRand().Read(nd.Data) + k, _ := nd.Key() + return nd, k +} + +func TestPinnerBasic(t *testing.T) { + dstore := datastore.NewMapDatastore() + bserv, err := bs.NewBlockService(dstore, nil) + if err != nil { + t.Fatal(err) + } + + dserv := &mdag.DAGService{bserv} + + p := NewPinner(dstore, dserv) + + a, ak := randNode() + + // Pin A{} + err = p.Pin(a, false) + if err != nil { + t.Fatal(err) + } + + if !p.IsPinned(ak) { + t.Fatal("Failed to find key") + } + + b, _ := randNode() + err = b.AddNodeLink("child", a) + if err != nil { + t.Fatal(err) + } + + c, ck := randNode() + err = b.AddNodeLink("otherchild", c) + if err != nil { + t.Fatal(err) + } + + // recursively pin B{A,C} + err = p.Pin(b, true) + if err != nil { + t.Fatal(err) + } + + if !p.IsPinned(ck) { + t.Fatal("Child of recursively pinned node not found") + } + + bk, _ := b.Key() + if !p.IsPinned(bk) { + t.Fatal("Recursively pinned node not found..") + } + + d, _ := randNode() + d.AddNodeLink("a", a) + d.AddNodeLink("c", c) + + e, ek := randNode() + d.AddNodeLink("e", e) + + // Must be in dagserv for unpin to work + err = dserv.AddRecursive(d) + if err != nil { + t.Fatal(err) + } + + // Add D{A,C,E} + err = p.Pin(d, true) + if err != nil { + t.Fatal(err) + } + + if !p.IsPinned(ek) { + t.Fatal(err) + } + + dk, _ := d.Key() + if !p.IsPinned(dk) { + t.Fatal("pinned node not found.") + } + + // Test recursive unpin + err = p.Unpin(dk, true) + if err != nil { + t.Fatal(err) + } + + // c should still be pinned under b + if !p.IsPinned(ck) { + t.Fatal("Recursive unpin fail.") + } + + err = p.Flush() + if err != nil { + t.Fatal(err) + } + + np, err := LoadPinner(dstore, dserv) + if err != nil { + t.Fatal(err) + } + + // Test directly pinned + if !np.IsPinned(ak) { + t.Fatal("Could not find pinned node!") + } + + // Test indirectly pinned + if !np.IsPinned(ck) { + t.Fatal("could not find indirectly pinned node") + } + + // Test recursively pinned + if !np.IsPinned(bk) { + t.Fatal("could not find recursively pinned node") + } +} From 298075bb82b6cc8e1d531975d6c7e540cdd36199 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 20 Oct 2014 12:40:18 -0700 Subject: [PATCH 0249/3147] add lock to pinner and rework cli This commit was moved from ipfs/go-ipfs-pinner@3d5b74c7c946cc02393f201997a436fd44cb4824 --- pinning/pinner/pin.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 1792020084..7e73b33f25 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -3,6 +3,8 @@ package pin import ( //ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + "sync" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/namespace" "github.com/jbenet/go-ipfs/blocks/set" @@ -22,6 +24,7 @@ type Pinner interface { } type pinner struct { + lock sync.RWMutex recursePin set.BlockSet directPin set.BlockSet indirPin *indirectPin @@ -49,6 +52,8 @@ func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { } func (p *pinner) Pin(node *mdag.Node, recurse bool) error { + p.lock.Lock() + defer p.lock.Unlock() k, err := node.Key() if err != nil { return err @@ -72,6 +77,8 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { } func (p *pinner) Unpin(k util.Key, recurse bool) error { + p.lock.Lock() + defer p.lock.Unlock() if recurse { p.recursePin.RemoveBlock(k) node, err := p.dserv.Get(k) @@ -134,6 +141,8 @@ func (p *pinner) pinLinks(node *mdag.Node) error { } func (p *pinner) IsPinned(key util.Key) bool { + p.lock.RLock() + defer p.lock.RUnlock() return p.recursePin.HasKey(key) || p.directPin.HasKey(key) || p.indirPin.HasKey(key) @@ -164,6 +173,8 @@ func LoadPinner(d ds.Datastore, dserv *mdag.DAGService) (Pinner, error) { } func (p *pinner) Flush() error { + p.lock.RLock() + defer p.lock.RUnlock() recurse := p.recursePin.GetKeys() err := p.dstore.Put(recursePinDatastoreKey, recurse) if err != nil { From fedb2dbe2a03303fd4a03d6d24be5be6198e368d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 21 Oct 2014 23:03:10 -0700 Subject: [PATCH 0250/3147] flush! This commit was moved from ipfs/go-ipfs-pinner@ea997ccefa6500e773990c0f18d8d175c1156ee6 --- pinning/pinner/pin.go | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 7e73b33f25..a63dcff57e 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -3,6 +3,8 @@ package pin import ( //ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + "bytes" + "encoding/json" "sync" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" @@ -175,19 +177,41 @@ func LoadPinner(d ds.Datastore, dserv *mdag.DAGService) (Pinner, error) { func (p *pinner) Flush() error { p.lock.RLock() defer p.lock.RUnlock() + buf := new(bytes.Buffer) + enc := json.NewEncoder(buf) + recurse := p.recursePin.GetKeys() - err := p.dstore.Put(recursePinDatastoreKey, recurse) + err := enc.Encode(recurse) if err != nil { return err } + err = p.dstore.Put(recursePinDatastoreKey, buf.Bytes()) + if err != nil { + return err + } + + buf = new(bytes.Buffer) + enc = json.NewEncoder(buf) direct := p.directPin.GetKeys() - err = p.dstore.Put(directPinDatastoreKey, direct) + err = enc.Encode(direct) + if err != nil { + return err + } + + err = p.dstore.Put(directPinDatastoreKey, buf.Bytes()) + if err != nil { + return err + } + + buf = new(bytes.Buffer) + enc = json.NewEncoder(buf) + err = enc.Encode(p.indirPin.refCounts) if err != nil { return err } - err = p.dstore.Put(indirectPinDatastoreKey, p.indirPin.refCounts) + err = p.dstore.Put(indirectPinDatastoreKey, buf.Bytes()) if err != nil { return err } From da5ee04a3bb466c6b70be1f08bba9a3cf1726cbd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Oct 2014 00:33:14 -0700 Subject: [PATCH 0251/3147] update datastore paths This commit was moved from ipfs/go-ipfs-pinner@e49d98cd91cf385185ff3c6fef6cc5650ab92ea0 --- pinning/pinner/indirect.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index bff1e545f3..27b11292ce 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -3,7 +3,7 @@ package pin import ( "errors" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" "github.com/jbenet/go-ipfs/blocks/set" "github.com/jbenet/go-ipfs/util" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index a63dcff57e..1c02fd0386 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -7,8 +7,8 @@ import ( "encoding/json" "sync" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/namespace" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" "github.com/jbenet/go-ipfs/blocks/set" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/util" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 72c15d90dc..00c9c6f3c5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -3,7 +3,7 @@ package pin import ( "testing" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" bs "github.com/jbenet/go-ipfs/blockservice" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/util" From fcc9d3b7b8adc4a8c598224ea72af1f565094a10 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 22 Oct 2014 02:55:22 -0700 Subject: [PATCH 0252/3147] fixed pin json marshal This commit was moved from ipfs/go-ipfs-pinner@f4a287b93c4053cbc687163b62608ab031822a90 --- pinning/pinner/indirect.go | 24 ++++++++----- pinning/pinner/pin.go | 71 ++++++++++++++++++++++---------------- pinning/pinner/pin_test.go | 6 ++-- 3 files changed, 60 insertions(+), 41 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 27b11292ce..2eb303de2b 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -1,8 +1,6 @@ package pin import ( - "errors" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" "github.com/jbenet/go-ipfs/blocks/set" "github.com/jbenet/go-ipfs/util" @@ -21,23 +19,33 @@ func NewIndirectPin(dstore ds.Datastore) *indirectPin { } func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { - irefcnt, err := d.Get(k) + var rcStore map[string]int + err := loadSet(d, k, &rcStore) if err != nil { return nil, err } - refcnt, ok := irefcnt.(map[util.Key]int) - if !ok { - return nil, errors.New("invalid type from datastore") - } + refcnt := make(map[util.Key]int) var keys []util.Key - for k, _ := range refcnt { + for encK, v := range rcStore { + k := util.B58KeyDecode(encK) keys = append(keys, k) + refcnt[k] = v } + log.Debug("indirPin keys: %#v", keys) return &indirectPin{blockset: set.SimpleSetFromKeys(keys), refCounts: refcnt}, nil } +func storeIndirPin(d ds.Datastore, k ds.Key, p *indirectPin) error { + + rcStore := map[string]int{} + for k, v := range p.refCounts { + rcStore[util.B58KeyEncode(k)] = v + } + return storeSet(d, k, rcStore) +} + func (i *indirectPin) Increment(k util.Key) { c := i.refCounts[k] i.refCounts[k] = c + 1 diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 1c02fd0386..b9c509a034 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -3,8 +3,9 @@ package pin import ( //ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - "bytes" + "encoding/json" + "errors" "sync" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -14,6 +15,7 @@ import ( "github.com/jbenet/go-ipfs/util" ) +var log = util.Logger("pin") var recursePinDatastoreKey = ds.NewKey("/local/pins/recursive/keys") var directPinDatastoreKey = ds.NewKey("/local/pins/direct/keys") var indirectPinDatastoreKey = ds.NewKey("/local/pins/indirect/keys") @@ -89,9 +91,8 @@ func (p *pinner) Unpin(k util.Key, recurse bool) error { } return p.unpinLinks(node) - } else { - p.directPin.RemoveBlock(k) } + p.directPin.RemoveBlock(k) return nil } @@ -153,21 +154,31 @@ func (p *pinner) IsPinned(key util.Key) bool { func LoadPinner(d ds.Datastore, dserv *mdag.DAGService) (Pinner, error) { p := new(pinner) - var err error - p.recursePin, err = set.SetFromDatastore(d, recursePinDatastoreKey) - if err != nil { - return nil, err + { // load recursive set + var recurseKeys []util.Key + if err := loadSet(d, recursePinDatastoreKey, &recurseKeys); err != nil { + return nil, err + } + p.recursePin = set.SimpleSetFromKeys(recurseKeys) } - p.directPin, err = set.SetFromDatastore(d, directPinDatastoreKey) - if err != nil { - return nil, err + + { // load direct set + var directKeys []util.Key + if err := loadSet(d, directPinDatastoreKey, &directKeys); err != nil { + return nil, err + } + p.directPin = set.SimpleSetFromKeys(directKeys) } - p.indirPin, err = loadIndirPin(d, indirectPinDatastoreKey) - if err != nil { - return nil, err + { // load indirect set + var err error + p.indirPin, err = loadIndirPin(d, indirectPinDatastoreKey) + if err != nil { + return nil, err + } } + // assign services p.dserv = dserv p.dstore = d @@ -177,43 +188,43 @@ func LoadPinner(d ds.Datastore, dserv *mdag.DAGService) (Pinner, error) { func (p *pinner) Flush() error { p.lock.RLock() defer p.lock.RUnlock() - buf := new(bytes.Buffer) - enc := json.NewEncoder(buf) - recurse := p.recursePin.GetKeys() - err := enc.Encode(recurse) + err := storeSet(p.dstore, directPinDatastoreKey, p.directPin.GetKeys()) if err != nil { return err } - err = p.dstore.Put(recursePinDatastoreKey, buf.Bytes()) + err = storeSet(p.dstore, recursePinDatastoreKey, p.recursePin.GetKeys()) if err != nil { return err } - buf = new(bytes.Buffer) - enc = json.NewEncoder(buf) - direct := p.directPin.GetKeys() - err = enc.Encode(direct) + err = storeIndirPin(p.dstore, indirectPinDatastoreKey, p.indirPin) if err != nil { return err } + return nil +} - err = p.dstore.Put(directPinDatastoreKey, buf.Bytes()) +// helpers to marshal / unmarshal a pin set +func storeSet(d ds.Datastore, k ds.Key, val interface{}) error { + buf, err := json.Marshal(val) if err != nil { return err } - buf = new(bytes.Buffer) - enc = json.NewEncoder(buf) - err = enc.Encode(p.indirPin.refCounts) + return d.Put(k, buf) +} + +func loadSet(d ds.Datastore, k ds.Key, val interface{}) error { + buf, err := d.Get(k) if err != nil { return err } - err = p.dstore.Put(indirectPinDatastoreKey, buf.Bytes()) - if err != nil { - return err + bf, ok := buf.([]byte) + if !ok { + return errors.New("invalid pin set value in datastore") } - return nil + return json.Unmarshal(bf, val) } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 00c9c6f3c5..10b5862b9b 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -3,7 +3,7 @@ package pin import ( "testing" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" bs "github.com/jbenet/go-ipfs/blockservice" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/util" @@ -18,7 +18,7 @@ func randNode() (*mdag.Node, util.Key) { } func TestPinnerBasic(t *testing.T) { - dstore := datastore.NewMapDatastore() + dstore := ds.NewMapDatastore() bserv, err := bs.NewBlockService(dstore, nil) if err != nil { t.Fatal(err) @@ -103,7 +103,7 @@ func TestPinnerBasic(t *testing.T) { // c should still be pinned under b if !p.IsPinned(ck) { - t.Fatal("Recursive unpin fail.") + t.Fatal("Recursive / indirect unpin fail.") } err = p.Flush() From 38b097ccd73bd14a33b7209c9aefda8fe291a217 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 20 Oct 2014 22:49:13 -0700 Subject: [PATCH 0253/3147] working on debugging dht issues This commit was moved from ipfs/go-ipfs-routing@39421de95036191f1943f120292fe31599091fb4 --- routing/dht/dht.go | 2 +- routing/dht/handlers.go | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index a0f14aa912..5068717e74 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -272,7 +272,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, // Perhaps we were given closer peers var peers []peer.Peer for _, pb := range pmes.GetCloserPeers() { - pr, err := dht.addPeer(pb) + pr, err := dht.ensureConnectedToPeer(pb) if err != nil { log.Error("%s", err) continue diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index d3c4d23e3b..fce25454cb 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -48,10 +48,10 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) } // let's first check if we have the value locally. - log.Debug("%s handleGetValue looking into ds\n", dht.self) + log.Debug("%s handleGetValue looking into ds", dht.self) dskey := u.Key(pmes.GetKey()).DsKey() iVal, err := dht.datastore.Get(dskey) - log.Debug("%s handleGetValue looking into ds GOT %v\n", dht.self, iVal) + log.Debug("%s handleGetValue looking into ds GOT %v", dht.self, iVal) // if we got an unexpected error, bail. if err != nil && err != ds.ErrNotFound { @@ -63,7 +63,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) // if we have the value, send it back if err == nil { - log.Debug("%s handleGetValue success!\n", dht.self) + log.Debug("%s handleGetValue success!", dht.self) byts, ok := iVal.([]byte) if !ok { @@ -85,6 +85,9 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) if closer != nil { for _, p := range closer { log.Debug("handleGetValue returning closer peer: '%s'", p) + if len(p.Addresses()) < 1 { + log.Error("no addresses on peer being sent!") + } } resp.CloserPeers = peersToPBPeers(closer) } From 5b7f41e8850f4672a924ed4a2369cdc9feb8d74d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 01:18:20 -0700 Subject: [PATCH 0254/3147] this shouldn't connect quite yet. This commit was moved from ipfs/go-ipfs-routing@ef8463bda425f468975060e051f520f3877b1f20 --- routing/dht/dht.go | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5068717e74..1cbb73df4d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -16,7 +16,6 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) @@ -272,7 +271,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, // Perhaps we were given closer peers var peers []peer.Peer for _, pb := range pmes.GetCloserPeers() { - pr, err := dht.ensureConnectedToPeer(pb) + pr, err := dht.peerFromInfo(pb) if err != nil { log.Error("%s", err) continue @@ -289,26 +288,6 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, return nil, nil, u.ErrNotFound } -func (dht *IpfsDHT) addPeer(pb *Message_Peer) (peer.Peer, error) { - if peer.ID(pb.GetId()).Equal(dht.self.ID()) { - return nil, errors.New("cannot add self as peer") - } - - addr, err := ma.NewMultiaddr(pb.GetAddr()) - if err != nil { - return nil, err - } - - // check if we already have this peer. - pr, err := dht.getPeer(peer.ID(pb.GetId())) - if err != nil { - return nil, err - } - pr.AddAddress(addr) // idempotent - - return pr, nil -} - // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.Peer, key u.Key, level int) (*Message, error) { @@ -494,7 +473,8 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (peer.Peer, error) { id := peer.ID(pbp.GetId()) - // continue if it's ourselves + // bail out if it's ourselves + //TODO(jbenet) not sure this should be an error _here_ if id.Equal(dht.self.ID()) { return nil, errors.New("found self") } From 4020b1cb87829d90ad3ae2bb399640a760a13273 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 01:18:38 -0700 Subject: [PATCH 0255/3147] query wasnt ensuring conn The query-- once it's actually attempting to connect to a peer-- should be the one connecting. This commit was moved from ipfs/go-ipfs-routing@e400dd26a4c97aa3b85a93aaca22bb1b20441dcc --- routing/dht/query.go | 41 ++++++++++++++++++++++++++++++++--------- routing/dht/routing.go | 6 +++--- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index ef3670c7db..0019987ca3 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -14,10 +14,18 @@ import ( var maxQueryConcurrency = AlphaValue +type dhtDialer interface { + // DialPeer attempts to establish a connection to a given peer + DialPeer(peer.Peer) error +} + type dhtQuery struct { // the key we're querying for key u.Key + // dialer used to ensure we're connected to peers + dialer dhtDialer + // the function to execute per peer qfunc queryFunc @@ -34,9 +42,10 @@ type dhtQueryResult struct { } // constructs query -func newQuery(k u.Key, f queryFunc) *dhtQuery { +func newQuery(k u.Key, d dhtDialer, f queryFunc) *dhtQuery { return &dhtQuery{ key: k, + dialer: d, qfunc: f, concurrency: maxQueryConcurrency, } @@ -211,19 +220,38 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { return } - log.Debug("running worker for: %v\n", p) + // ok let's do this! + log.Debug("running worker for: %v", p) + + // make sure we do this when we exit + defer func() { + // signal we're done proccessing peer p + log.Debug("completing worker for: %v", p) + r.peersRemaining.Decrement(1) + r.rateLimit <- struct{}{} + }() + + // make sure we're connected to the peer. + err := r.query.dialer.DialPeer(p) + if err != nil { + log.Debug("ERROR worker for: %v -- err connecting: %v", p, err) + r.Lock() + r.errs = append(r.errs, err) + r.Unlock() + return + } // finally, run the query against this peer res, err := r.query.qfunc(r.ctx, p) if err != nil { - log.Debug("ERROR worker for: %v %v\n", p, err) + log.Debug("ERROR worker for: %v %v", p, err) r.Lock() r.errs = append(r.errs, err) r.Unlock() } else if res.success { - log.Debug("SUCCESS worker for: %v\n", p, res) + log.Debug("SUCCESS worker for: %v", p, res) r.Lock() r.result = res r.Unlock() @@ -235,9 +263,4 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { r.addPeerToQuery(next, p) } } - - // signal we're done proccessing peer p - log.Debug("completing worker for: %v\n", p) - r.peersRemaining.Decrement(1) - r.rateLimit <- struct{}{} } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 7f004dc47a..8c0d698607 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -29,7 +29,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error peers = append(peers, npeers...) } - query := newQuery(key, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { log.Debug("%s PutValue qry part %v", dht.self, p) err := dht.putValueToNetwork(ctx, p, string(key), value) if err != nil { @@ -65,7 +65,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // setup the Query - query := newQuery(key, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { val, peers, err := dht.getValueOrPeers(ctx, p, key, routeLevel) if err != nil { @@ -230,7 +230,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (peer.Peer } // setup query function - query := newQuery(u.Key(id), func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) if err != nil { log.Error("%s getPeer error: %v", dht.self, err) From a1149f07bfb552947cf5358050151d168650dd32 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 03:02:31 -0700 Subject: [PATCH 0256/3147] notes This commit was moved from ipfs/go-ipfs-routing@39aad1cc3611227709d640163c7cfe9c044d776b --- routing/dht/handlers.go | 2 +- routing/dht/query.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index fce25454cb..2e51171046 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -86,7 +86,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) for _, p := range closer { log.Debug("handleGetValue returning closer peer: '%s'", p) if len(p.Addresses()) < 1 { - log.Error("no addresses on peer being sent!") + log.Critical("no addresses on peer being sent!") } } resp.CloserPeers = peersToPBPeers(closer) diff --git a/routing/dht/query.go b/routing/dht/query.go index 0019987ca3..4096632b6a 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -232,6 +232,7 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { }() // make sure we're connected to the peer. + // (Incidentally, this will add it to the peerstore too) err := r.query.dialer.DialPeer(p) if err != nil { log.Debug("ERROR worker for: %v -- err connecting: %v", p, err) From e7a22f5353498a0e03a4ba48e0241448ccc526e6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 21 Oct 2014 03:13:10 -0700 Subject: [PATCH 0257/3147] Dialer for dht dht doesn't need the whole network interface, only needs a Dialer. (much reduced surface of possible errors) This commit was moved from ipfs/go-ipfs-routing@e0e2ef3b6f24081f65707a5a601405ee7baebf2c --- routing/dht/dht.go | 14 +++++++------- routing/dht/query.go | 10 +++------- routing/dht/routing.go | 6 +++--- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1cbb73df4d..c6079855ac 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -33,9 +33,9 @@ type IpfsDHT struct { // NOTE: (currently, only a single table is used) routingTables []*kb.RoutingTable - // the network interface. service - network inet.Network - sender inet.Sender + // the network services we need + dialer inet.Dialer + sender inet.Sender // Local peer (yourself) self peer.Peer @@ -59,9 +59,9 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, net inet.Network, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { +func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dialer, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) - dht.network = net + dht.dialer = dialer dht.sender = sender dht.datastore = dstore dht.self = p @@ -95,7 +95,7 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, er // // /ip4/10.20.30.40/tcp/1234/ipfs/Qxhxxchxzcncxnzcnxzcxzm // - err := dht.network.DialPeer(npeer) + err := dht.dialer.DialPeer(npeer) if err != nil { return nil, err } @@ -499,7 +499,7 @@ func (dht *IpfsDHT) ensureConnectedToPeer(pbp *Message_Peer) (peer.Peer, error) } // dial connection - err = dht.network.DialPeer(p) + err = dht.dialer.DialPeer(p) return p, err } diff --git a/routing/dht/query.go b/routing/dht/query.go index 4096632b6a..d15e939b7b 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,6 +3,7 @@ package dht import ( "sync" + inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" queue "github.com/jbenet/go-ipfs/peer/queue" kb "github.com/jbenet/go-ipfs/routing/kbucket" @@ -14,17 +15,12 @@ import ( var maxQueryConcurrency = AlphaValue -type dhtDialer interface { - // DialPeer attempts to establish a connection to a given peer - DialPeer(peer.Peer) error -} - type dhtQuery struct { // the key we're querying for key u.Key // dialer used to ensure we're connected to peers - dialer dhtDialer + dialer inet.Dialer // the function to execute per peer qfunc queryFunc @@ -42,7 +38,7 @@ type dhtQueryResult struct { } // constructs query -func newQuery(k u.Key, d dhtDialer, f queryFunc) *dhtQuery { +func newQuery(k u.Key, d inet.Dialer, f queryFunc) *dhtQuery { return &dhtQuery{ key: k, dialer: d, diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 8c0d698607..b557aa76c5 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -29,7 +29,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error peers = append(peers, npeers...) } - query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { log.Debug("%s PutValue qry part %v", dht.self, p) err := dht.putValueToNetwork(ctx, p, string(key), value) if err != nil { @@ -65,7 +65,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // setup the Query - query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { val, peers, err := dht.getValueOrPeers(ctx, p, key, routeLevel) if err != nil { @@ -230,7 +230,7 @@ func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (peer.Peer } // setup query function - query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(u.Key(id), dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) if err != nil { log.Error("%s getPeer error: %v", dht.self, err) From 0b072311e1f194a3db4fe19004a606501f4be95b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 22 Oct 2014 05:31:49 -0700 Subject: [PATCH 0258/3147] dht test fix (net) This commit was moved from ipfs/go-ipfs-routing@a53d5e1f564b54d0fb410cbcb8e75e11719dfa4d --- routing/dht/dht_test.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 590d5ead3a..136be4efe3 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -98,8 +98,8 @@ func TestPing(t *testing.T) { defer dhtA.Halt() defer dhtB.Halt() - defer dhtA.network.Close() - defer dhtB.network.Close() + defer dhtA.dialer.(inet.Network).Close() + defer dhtB.dialer.(inet.Network).Close() _, err = dhtA.Connect(ctx, peerB) if err != nil { @@ -142,8 +142,8 @@ func TestValueGetSet(t *testing.T) { defer dhtA.Halt() defer dhtB.Halt() - defer dhtA.network.Close() - defer dhtB.network.Close() + defer dhtA.dialer.(inet.Network).Close() + defer dhtB.dialer.(inet.Network).Close() _, err = dhtA.Connect(ctx, peerB) if err != nil { @@ -184,7 +184,7 @@ func TestProvides(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() - defer dhts[i].network.Close() + defer dhts[i].dialer.(inet.Network).Close() } }() @@ -244,7 +244,7 @@ func TestProvidesAsync(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() - defer dhts[i].network.Close() + defer dhts[i].dialer.(inet.Network).Close() } }() @@ -301,7 +301,7 @@ func TestLayeredGet(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() - defer dhts[i].network.Close() + defer dhts[i].dialer.(inet.Network).Close() } }() @@ -354,7 +354,7 @@ func TestFindPeer(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Halt() - dhts[i].network.Close() + dhts[i].dialer.(inet.Network).Close() } }() @@ -443,8 +443,8 @@ func TestConnectCollision(t *testing.T) { dhtA.Halt() dhtB.Halt() - dhtA.network.Close() - dhtB.network.Close() + dhtA.dialer.(inet.Network).Close() + dhtB.dialer.(inet.Network).Close() <-time.After(200 * time.Millisecond) } From e7745b2724441f0b6d03a2bf4fd8943765809db3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Oct 2014 15:08:32 -0700 Subject: [PATCH 0259/3147] fix for #141, routing table segmentation This commit was moved from ipfs/go-ipfs-routing@f428f6f9f861bfcac86036ef607dbb01a38f18e7 --- routing/kbucket/table.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 6f37e94de1..5c3e048676 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -65,18 +65,10 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { // Are we past the max bucket size? if bucket.len() > rt.bucketsize { + // If this bucket is the rightmost bucket, and its full + // we need to split it and create a new bucket if bucketID == len(rt.Buckets)-1 { - newBucket := bucket.Split(bucketID, rt.local) - rt.Buckets = append(rt.Buckets, newBucket) - if newBucket.len() > rt.bucketsize { - // TODO: This is a very rare and annoying case - panic("Case not handled.") - } - - // If all elements were on left side of split... - if bucket.len() > rt.bucketsize { - return bucket.popBack() - } + return rt.nextBucket() } else { // If the bucket cant split kick out least active node return bucket.popBack() @@ -91,6 +83,22 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { return nil } +func (rt *RoutingTable) nextBucket() peer.Peer { + bucket := rt.Buckets[len(rt.Buckets)-1] + newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) + rt.Buckets = append(rt.Buckets, newBucket) + if newBucket.len() > rt.bucketsize { + // TODO: This is a very rare and annoying case + return rt.nextBucket() + } + + // If all elements were on left side of split... + if bucket.len() > rt.bucketsize { + return bucket.popBack() + } + return nil +} + // A helper struct to sort peers by their distance to the local node type peerDistance struct { p peer.Peer From 3f59ea70e59a1dd6a8b2d799a8b97f597c4253fb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 22 Oct 2014 04:17:20 -0700 Subject: [PATCH 0260/3147] refactor(namesys) move proto to internal pb package This commit was moved from ipfs/go-namesys@6eefc9e8fe4dfe820c98236dc640ff4ebf529ca8 --- namesys/{ => internal/pb}/entry.pb.go | 0 namesys/{ => internal/pb}/entry.proto | 0 namesys/publisher.go | 3 ++- namesys/routing.go | 3 ++- 4 files changed, 4 insertions(+), 2 deletions(-) rename namesys/{ => internal/pb}/entry.pb.go (100%) rename namesys/{ => internal/pb}/entry.proto (100%) diff --git a/namesys/entry.pb.go b/namesys/internal/pb/entry.pb.go similarity index 100% rename from namesys/entry.pb.go rename to namesys/internal/pb/entry.pb.go diff --git a/namesys/entry.proto b/namesys/internal/pb/entry.proto similarity index 100% rename from namesys/entry.proto rename to namesys/internal/pb/entry.proto diff --git a/namesys/publisher.go b/namesys/publisher.go index 88533f8a08..7203fb1d4a 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -9,6 +9,7 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ci "github.com/jbenet/go-ipfs/crypto" + pb "github.com/jbenet/go-ipfs/namesys/internal/pb" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) @@ -67,7 +68,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { } func createRoutingEntryData(pk ci.PrivKey, val string) ([]byte, error) { - entry := new(IpnsEntry) + entry := new(pb.IpnsEntry) sig, err := pk.Sign([]byte(val)) if err != nil { return nil, err diff --git a/namesys/routing.go b/namesys/routing.go index da1c05d0e8..ce1755f692 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -8,6 +8,7 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ci "github.com/jbenet/go-ipfs/crypto" + pb "github.com/jbenet/go-ipfs/namesys/internal/pb" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) @@ -54,7 +55,7 @@ func (r *routingResolver) Resolve(name string) (string, error) { return "", err } - entry := new(IpnsEntry) + entry := new(pb.IpnsEntry) err = proto.Unmarshal(val, entry) if err != nil { return "", err From ab9e7039ccad6e60d89c81c61632cc3ddca36c77 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 22 Oct 2014 04:57:15 -0700 Subject: [PATCH 0261/3147] refactor(unixfs) move proto to pb package not internal since io needs it fix(fuse/ipns) use pb package fix(fuse) import protos from unixfs/pb package This commit was moved from ipfs/go-unixfs@a12326b80f5bea017cb3f31a8ac320b00a5ce971 --- unixfs/format.go | 33 +++++++++++++++++---------------- unixfs/format_test.go | 5 +++-- unixfs/io/dagmodifier.go | 7 ++++--- unixfs/io/dagreader.go | 17 +++++++++-------- unixfs/{ => pb}/Makefile | 0 unixfs/{ => pb}/data.pb.go | 0 unixfs/{ => pb}/data.proto | 0 7 files changed, 33 insertions(+), 29 deletions(-) rename unixfs/{ => pb}/Makefile (100%) rename unixfs/{ => pb}/data.pb.go (100%) rename unixfs/{ => pb}/data.proto (100%) diff --git a/unixfs/format.go b/unixfs/format.go index 6ba8e3aa47..d73958636f 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -5,15 +5,16 @@ package unixfs import ( "errors" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + pb "github.com/jbenet/go-ipfs/unixfs/pb" ) var ErrMalformedFileFormat = errors.New("malformed data in file format") var ErrInvalidDirLocation = errors.New("found directory node in unexpected place") var ErrUnrecognizedType = errors.New("unrecognized node type") -func FromBytes(data []byte) (*PBData, error) { - pbdata := new(PBData) +func FromBytes(data []byte) (*pb.PBData, error) { + pbdata := new(pb.PBData) err := proto.Unmarshal(data, pbdata) if err != nil { return nil, err @@ -22,8 +23,8 @@ func FromBytes(data []byte) (*PBData, error) { } func FilePBData(data []byte, totalsize uint64) []byte { - pbfile := new(PBData) - typ := PBData_File + pbfile := new(pb.PBData) + typ := pb.PBData_File pbfile.Type = &typ pbfile.Data = data pbfile.Filesize = proto.Uint64(totalsize) @@ -42,8 +43,8 @@ func FilePBData(data []byte, totalsize uint64) []byte { // Returns Bytes that represent a Directory func FolderPBData() []byte { - pbfile := new(PBData) - typ := PBData_Directory + pbfile := new(pb.PBData) + typ := pb.PBData_Directory pbfile.Type = &typ data, err := proto.Marshal(pbfile) @@ -55,8 +56,8 @@ func FolderPBData() []byte { } func WrapData(b []byte) []byte { - pbdata := new(PBData) - typ := PBData_Raw + pbdata := new(pb.PBData) + typ := pb.PBData_Raw pbdata.Data = b pbdata.Type = &typ @@ -70,7 +71,7 @@ func WrapData(b []byte) []byte { } func UnwrapData(data []byte) ([]byte, error) { - pbdata := new(PBData) + pbdata := new(pb.PBData) err := proto.Unmarshal(data, pbdata) if err != nil { return nil, err @@ -79,18 +80,18 @@ func UnwrapData(data []byte) ([]byte, error) { } func DataSize(data []byte) (uint64, error) { - pbdata := new(PBData) + pbdata := new(pb.PBData) err := proto.Unmarshal(data, pbdata) if err != nil { return 0, err } switch pbdata.GetType() { - case PBData_Directory: + case pb.PBData_Directory: return 0, errors.New("Cant get data size of directory!") - case PBData_File: + case pb.PBData_File: return pbdata.GetFilesize(), nil - case PBData_Raw: + case pb.PBData_Raw: return uint64(len(pbdata.GetData())), nil default: return 0, errors.New("Unrecognized node data type!") @@ -109,8 +110,8 @@ func (mb *MultiBlock) AddBlockSize(s uint64) { } func (mb *MultiBlock) GetBytes() ([]byte, error) { - pbn := new(PBData) - t := PBData_File + pbn := new(pb.PBData) + t := pb.PBData_File pbn.Type = &t pbn.Filesize = proto.Uint64(uint64(len(mb.Data)) + mb.subtotal) pbn.Blocksizes = mb.blocksizes diff --git a/unixfs/format_test.go b/unixfs/format_test.go index eca926e9f1..9dfd12cc0a 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -3,7 +3,8 @@ package unixfs import ( "testing" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + pb "github.com/jbenet/go-ipfs/unixfs/pb" ) func TestMultiBlock(t *testing.T) { @@ -19,7 +20,7 @@ func TestMultiBlock(t *testing.T) { t.Fatal(err) } - pbn := new(PBData) + pbn := new(pb.PBData) err = proto.Unmarshal(b, pbn) if err != nil { t.Fatal(err) diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go index 8680da46a2..d9af9c00b5 100644 --- a/unixfs/io/dagmodifier.go +++ b/unixfs/io/dagmodifier.go @@ -4,11 +4,12 @@ import ( "bytes" "errors" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - "github.com/jbenet/go-ipfs/importer/chunk" + chunk "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" + ftpb "github.com/jbenet/go-ipfs/unixfs/pb" u "github.com/jbenet/go-ipfs/util" ) @@ -19,7 +20,7 @@ type DagModifier struct { dagserv *mdag.DAGService curNode *mdag.Node - pbdata *ft.PBData + pbdata *ftpb.PBData splitter chunk.BlockSplitter } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 29196a1e3f..0f9b5af433 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -8,6 +8,7 @@ import ( proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" + ftpb "github.com/jbenet/go-ipfs/unixfs/pb" u "github.com/jbenet/go-ipfs/util" ) @@ -24,23 +25,23 @@ type DagReader struct { // NewDagReader creates a new reader object that reads the data represented by the given // node, using the passed in DAGService for data retreival func NewDagReader(n *mdag.Node, serv *mdag.DAGService) (io.Reader, error) { - pb := new(ft.PBData) + pb := new(ftpb.PBData) err := proto.Unmarshal(n.Data, pb) if err != nil { return nil, err } switch pb.GetType() { - case ft.PBData_Directory: + case ftpb.PBData_Directory: // Dont allow reading directories return nil, ErrIsDir - case ft.PBData_File: + case ftpb.PBData_File: return &DagReader{ node: n, serv: serv, buf: bytes.NewBuffer(pb.GetData()), }, nil - case ft.PBData_Raw: + case ftpb.PBData_Raw: // Raw block will just be a single level, return a byte buffer return bytes.NewBuffer(pb.GetData()), nil default: @@ -63,7 +64,7 @@ func (dr *DagReader) precalcNextBuf() error { } nxt = nxtNode } - pb := new(ft.PBData) + pb := new(ftpb.PBData) err := proto.Unmarshal(nxt.Data, pb) if err != nil { return err @@ -71,13 +72,13 @@ func (dr *DagReader) precalcNextBuf() error { dr.position++ switch pb.GetType() { - case ft.PBData_Directory: + case ftpb.PBData_Directory: return ft.ErrInvalidDirLocation - case ft.PBData_File: + case ftpb.PBData_File: //TODO: this *should* work, needs testing first //return NewDagReader(nxt, dr.serv) panic("Not yet handling different layers of indirection!") - case ft.PBData_Raw: + case ftpb.PBData_Raw: dr.buf = bytes.NewBuffer(pb.GetData()) return nil default: diff --git a/unixfs/Makefile b/unixfs/pb/Makefile similarity index 100% rename from unixfs/Makefile rename to unixfs/pb/Makefile diff --git a/unixfs/data.pb.go b/unixfs/pb/data.pb.go similarity index 100% rename from unixfs/data.pb.go rename to unixfs/pb/data.pb.go diff --git a/unixfs/data.proto b/unixfs/pb/data.proto similarity index 100% rename from unixfs/data.proto rename to unixfs/pb/data.proto From 9909d8b2a2d234a60679a443b7ac6ad03860de95 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 22 Oct 2014 05:13:48 -0700 Subject: [PATCH 0262/3147] fix(unixfs/pb) rename proto package -> unixfs_pb This commit was moved from ipfs/go-unixfs@4e5cff061dc2a2d9832fffd024f32a07a760838d --- unixfs/pb/Makefile | 11 ++++++++--- unixfs/pb/{data.pb.go => unixfs.pb.go} | 16 ++++++++-------- unixfs/pb/{data.proto => unixfs.proto} | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) rename unixfs/pb/{data.pb.go => unixfs.pb.go} (86%) rename unixfs/pb/{data.proto => unixfs.proto} (91%) diff --git a/unixfs/pb/Makefile b/unixfs/pb/Makefile index 87f182fe5b..334feee741 100644 --- a/unixfs/pb/Makefile +++ b/unixfs/pb/Makefile @@ -1,5 +1,10 @@ -all: data.pb.go +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) -data.pb.go: data.proto - protoc --go_out=. data.proto +all: $(GO) +%.pb.go: %.proto + protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< + +clean: + rm *.pb.go diff --git a/unixfs/pb/data.pb.go b/unixfs/pb/unixfs.pb.go similarity index 86% rename from unixfs/pb/data.pb.go rename to unixfs/pb/unixfs.pb.go index 2efdd8a4ca..2ef262bd75 100644 --- a/unixfs/pb/data.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -1,19 +1,19 @@ -// Code generated by protoc-gen-go. -// source: data.proto +// Code generated by protoc-gen-gogo. +// source: unixfs.proto // DO NOT EDIT! /* -Package unixfs is a generated protocol buffer package. +Package unixfs_pb is a generated protocol buffer package. It is generated from these files: - data.proto + unixfs.proto It has these top-level messages: PBData */ -package unixfs +package unixfs_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -57,7 +57,7 @@ func (x *PBData_DataType) UnmarshalJSON(data []byte) error { } type PBData struct { - Type *PBData_DataType `protobuf:"varint,1,req,enum=unixfs.PBData_DataType" json:"Type,omitempty"` + Type *PBData_DataType `protobuf:"varint,1,req,enum=unixfs.pb.PBData_DataType" json:"Type,omitempty"` Data []byte `protobuf:"bytes,2,opt" json:"Data,omitempty"` Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` @@ -97,5 +97,5 @@ func (m *PBData) GetBlocksizes() []uint64 { } func init() { - proto.RegisterEnum("unixfs.PBData_DataType", PBData_DataType_name, PBData_DataType_value) + proto.RegisterEnum("unixfs.pb.PBData_DataType", PBData_DataType_name, PBData_DataType_value) } diff --git a/unixfs/pb/data.proto b/unixfs/pb/unixfs.proto similarity index 91% rename from unixfs/pb/data.proto rename to unixfs/pb/unixfs.proto index b9504b0c32..68afa66818 100644 --- a/unixfs/pb/data.proto +++ b/unixfs/pb/unixfs.proto @@ -1,4 +1,4 @@ -package unixfs; +package unixfs.pb; message PBData { enum DataType { From 51d954210ae275d7285df82941fe8460373e2c35 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 22 Oct 2014 05:11:28 -0700 Subject: [PATCH 0263/3147] fix(namesys/pb) rename proto package -> namesys_pb This commit was moved from ipfs/go-namesys@0a93fdf7604fec8bbf49add569c8840002c6f73a --- namesys/internal/pb/Makefile | 10 ++++++++++ namesys/internal/pb/{entry.pb.go => namesys.pb.go} | 12 ++++++------ namesys/internal/pb/{entry.proto => namesys.proto} | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 namesys/internal/pb/Makefile rename namesys/internal/pb/{entry.pb.go => namesys.pb.go} (82%) rename namesys/internal/pb/{entry.proto => namesys.proto} (80%) diff --git a/namesys/internal/pb/Makefile b/namesys/internal/pb/Makefile new file mode 100644 index 0000000000..334feee741 --- /dev/null +++ b/namesys/internal/pb/Makefile @@ -0,0 +1,10 @@ +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< + +clean: + rm *.pb.go diff --git a/namesys/internal/pb/entry.pb.go b/namesys/internal/pb/namesys.pb.go similarity index 82% rename from namesys/internal/pb/entry.pb.go rename to namesys/internal/pb/namesys.pb.go index d9dc5160b4..b5d8885a26 100644 --- a/namesys/internal/pb/entry.pb.go +++ b/namesys/internal/pb/namesys.pb.go @@ -1,19 +1,19 @@ -// Code generated by protoc-gen-go. -// source: entry.proto +// Code generated by protoc-gen-gogo. +// source: namesys.proto // DO NOT EDIT! /* -Package namesys is a generated protocol buffer package. +Package namesys_pb is a generated protocol buffer package. It is generated from these files: - entry.proto + namesys.proto It has these top-level messages: IpnsEntry */ -package namesys +package namesys_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/namesys/internal/pb/entry.proto b/namesys/internal/pb/namesys.proto similarity index 80% rename from namesys/internal/pb/entry.proto rename to namesys/internal/pb/namesys.proto index fee830d7eb..ac8a78da3f 100644 --- a/namesys/internal/pb/entry.proto +++ b/namesys/internal/pb/namesys.proto @@ -1,4 +1,4 @@ -package namesys; +package namesys.pb; message IpnsEntry { required bytes value = 1; From 3b7306a5d73e12f57ed7f39f3812cba794d3f23f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 22 Oct 2014 21:48:35 -0700 Subject: [PATCH 0264/3147] refactor(unixfs/pb) mv proto PBData -> Data, etc. This commit was moved from ipfs/go-unixfs@11d6f4eff6057271327e50b2b06393c9db0bb9cc --- unixfs/format.go | 30 ++++++++++----------- unixfs/format_test.go | 2 +- unixfs/io/dagmodifier.go | 2 +- unixfs/io/dagreader.go | 16 +++++------ unixfs/pb/unixfs.pb.go | 58 ++++++++++++++++++++-------------------- unixfs/pb/unixfs.proto | 2 +- 6 files changed, 55 insertions(+), 55 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index d73958636f..0fd29d358e 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -13,8 +13,8 @@ var ErrMalformedFileFormat = errors.New("malformed data in file format") var ErrInvalidDirLocation = errors.New("found directory node in unexpected place") var ErrUnrecognizedType = errors.New("unrecognized node type") -func FromBytes(data []byte) (*pb.PBData, error) { - pbdata := new(pb.PBData) +func FromBytes(data []byte) (*pb.Data, error) { + pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) if err != nil { return nil, err @@ -23,8 +23,8 @@ func FromBytes(data []byte) (*pb.PBData, error) { } func FilePBData(data []byte, totalsize uint64) []byte { - pbfile := new(pb.PBData) - typ := pb.PBData_File + pbfile := new(pb.Data) + typ := pb.Data_File pbfile.Type = &typ pbfile.Data = data pbfile.Filesize = proto.Uint64(totalsize) @@ -43,8 +43,8 @@ func FilePBData(data []byte, totalsize uint64) []byte { // Returns Bytes that represent a Directory func FolderPBData() []byte { - pbfile := new(pb.PBData) - typ := pb.PBData_Directory + pbfile := new(pb.Data) + typ := pb.Data_Directory pbfile.Type = &typ data, err := proto.Marshal(pbfile) @@ -56,8 +56,8 @@ func FolderPBData() []byte { } func WrapData(b []byte) []byte { - pbdata := new(pb.PBData) - typ := pb.PBData_Raw + pbdata := new(pb.Data) + typ := pb.Data_Raw pbdata.Data = b pbdata.Type = &typ @@ -71,7 +71,7 @@ func WrapData(b []byte) []byte { } func UnwrapData(data []byte) ([]byte, error) { - pbdata := new(pb.PBData) + pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) if err != nil { return nil, err @@ -80,18 +80,18 @@ func UnwrapData(data []byte) ([]byte, error) { } func DataSize(data []byte) (uint64, error) { - pbdata := new(pb.PBData) + pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) if err != nil { return 0, err } switch pbdata.GetType() { - case pb.PBData_Directory: + case pb.Data_Directory: return 0, errors.New("Cant get data size of directory!") - case pb.PBData_File: + case pb.Data_File: return pbdata.GetFilesize(), nil - case pb.PBData_Raw: + case pb.Data_Raw: return uint64(len(pbdata.GetData())), nil default: return 0, errors.New("Unrecognized node data type!") @@ -110,8 +110,8 @@ func (mb *MultiBlock) AddBlockSize(s uint64) { } func (mb *MultiBlock) GetBytes() ([]byte, error) { - pbn := new(pb.PBData) - t := pb.PBData_File + pbn := new(pb.Data) + t := pb.Data_File pbn.Type = &t pbn.Filesize = proto.Uint64(uint64(len(mb.Data)) + mb.subtotal) pbn.Blocksizes = mb.blocksizes diff --git a/unixfs/format_test.go b/unixfs/format_test.go index 9dfd12cc0a..5065c7bc5e 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -20,7 +20,7 @@ func TestMultiBlock(t *testing.T) { t.Fatal(err) } - pbn := new(pb.PBData) + pbn := new(pb.Data) err = proto.Unmarshal(b, pbn) if err != nil { t.Fatal(err) diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go index d9af9c00b5..ec8f7fbeb8 100644 --- a/unixfs/io/dagmodifier.go +++ b/unixfs/io/dagmodifier.go @@ -20,7 +20,7 @@ type DagModifier struct { dagserv *mdag.DAGService curNode *mdag.Node - pbdata *ftpb.PBData + pbdata *ftpb.Data splitter chunk.BlockSplitter } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 0f9b5af433..8469161037 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -25,23 +25,23 @@ type DagReader struct { // NewDagReader creates a new reader object that reads the data represented by the given // node, using the passed in DAGService for data retreival func NewDagReader(n *mdag.Node, serv *mdag.DAGService) (io.Reader, error) { - pb := new(ftpb.PBData) + pb := new(ftpb.Data) err := proto.Unmarshal(n.Data, pb) if err != nil { return nil, err } switch pb.GetType() { - case ftpb.PBData_Directory: + case ftpb.Data_Directory: // Dont allow reading directories return nil, ErrIsDir - case ftpb.PBData_File: + case ftpb.Data_File: return &DagReader{ node: n, serv: serv, buf: bytes.NewBuffer(pb.GetData()), }, nil - case ftpb.PBData_Raw: + case ftpb.Data_Raw: // Raw block will just be a single level, return a byte buffer return bytes.NewBuffer(pb.GetData()), nil default: @@ -64,7 +64,7 @@ func (dr *DagReader) precalcNextBuf() error { } nxt = nxtNode } - pb := new(ftpb.PBData) + pb := new(ftpb.Data) err := proto.Unmarshal(nxt.Data, pb) if err != nil { return err @@ -72,13 +72,13 @@ func (dr *DagReader) precalcNextBuf() error { dr.position++ switch pb.GetType() { - case ftpb.PBData_Directory: + case ftpb.Data_Directory: return ft.ErrInvalidDirLocation - case ftpb.PBData_File: + case ftpb.Data_File: //TODO: this *should* work, needs testing first //return NewDagReader(nxt, dr.serv) panic("Not yet handling different layers of indirection!") - case ftpb.PBData_Raw: + case ftpb.Data_Raw: dr.buf = bytes.NewBuffer(pb.GetData()) return nil default: diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 2ef262bd75..999aa6d929 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -9,7 +9,7 @@ It is generated from these files: unixfs.proto It has these top-level messages: - PBData + Data */ package unixfs_pb @@ -20,76 +20,76 @@ import math "math" var _ = proto.Marshal var _ = math.Inf -type PBData_DataType int32 +type Data_DataType int32 const ( - PBData_Raw PBData_DataType = 0 - PBData_Directory PBData_DataType = 1 - PBData_File PBData_DataType = 2 + Data_Raw Data_DataType = 0 + Data_Directory Data_DataType = 1 + Data_File Data_DataType = 2 ) -var PBData_DataType_name = map[int32]string{ +var Data_DataType_name = map[int32]string{ 0: "Raw", 1: "Directory", 2: "File", } -var PBData_DataType_value = map[string]int32{ +var Data_DataType_value = map[string]int32{ "Raw": 0, "Directory": 1, "File": 2, } -func (x PBData_DataType) Enum() *PBData_DataType { - p := new(PBData_DataType) +func (x Data_DataType) Enum() *Data_DataType { + p := new(Data_DataType) *p = x return p } -func (x PBData_DataType) String() string { - return proto.EnumName(PBData_DataType_name, int32(x)) +func (x Data_DataType) String() string { + return proto.EnumName(Data_DataType_name, int32(x)) } -func (x *PBData_DataType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PBData_DataType_value, data, "PBData_DataType") +func (x *Data_DataType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Data_DataType_value, data, "Data_DataType") if err != nil { return err } - *x = PBData_DataType(value) + *x = Data_DataType(value) return nil } -type PBData struct { - Type *PBData_DataType `protobuf:"varint,1,req,enum=unixfs.pb.PBData_DataType" json:"Type,omitempty"` - Data []byte `protobuf:"bytes,2,opt" json:"Data,omitempty"` - Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` - Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` - XXX_unrecognized []byte `json:"-"` +type Data struct { + Type *Data_DataType `protobuf:"varint,1,req,enum=unixfs.pb.Data_DataType" json:"Type,omitempty"` + Data []byte `protobuf:"bytes,2,opt" json:"Data,omitempty"` + Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` + Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` + XXX_unrecognized []byte `json:"-"` } -func (m *PBData) Reset() { *m = PBData{} } -func (m *PBData) String() string { return proto.CompactTextString(m) } -func (*PBData) ProtoMessage() {} +func (m *Data) Reset() { *m = Data{} } +func (m *Data) String() string { return proto.CompactTextString(m) } +func (*Data) ProtoMessage() {} -func (m *PBData) GetType() PBData_DataType { +func (m *Data) GetType() Data_DataType { if m != nil && m.Type != nil { return *m.Type } - return PBData_Raw + return Data_Raw } -func (m *PBData) GetData() []byte { +func (m *Data) GetData() []byte { if m != nil { return m.Data } return nil } -func (m *PBData) GetFilesize() uint64 { +func (m *Data) GetFilesize() uint64 { if m != nil && m.Filesize != nil { return *m.Filesize } return 0 } -func (m *PBData) GetBlocksizes() []uint64 { +func (m *Data) GetBlocksizes() []uint64 { if m != nil { return m.Blocksizes } @@ -97,5 +97,5 @@ func (m *PBData) GetBlocksizes() []uint64 { } func init() { - proto.RegisterEnum("unixfs.pb.PBData_DataType", PBData_DataType_name, PBData_DataType_value) + proto.RegisterEnum("unixfs.pb.Data_DataType", Data_DataType_name, Data_DataType_value) } diff --git a/unixfs/pb/unixfs.proto b/unixfs/pb/unixfs.proto index 68afa66818..618fb61594 100644 --- a/unixfs/pb/unixfs.proto +++ b/unixfs/pb/unixfs.proto @@ -1,6 +1,6 @@ package unixfs.pb; -message PBData { +message Data { enum DataType { Raw = 0; Directory = 1; From 653cc13a50c27ff7acae787cd13c49d7f2ac88e4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Oct 2014 18:32:28 -0700 Subject: [PATCH 0265/3147] rewrite findpeer and other dht tweaks This commit was moved from ipfs/go-ipfs-routing@c36e5be20338fea00afa018706a3ccf8e7980e9f --- routing/dht/dht.go | 7 --- routing/dht/dht_test.go | 8 ++- routing/dht/routing.go | 130 +++++++++++++++++---------------------- routing/kbucket/table.go | 1 - 4 files changed, 63 insertions(+), 83 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c6079855ac..118c7bb2e9 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -384,18 +384,11 @@ func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID, return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) printTables() { - for _, route := range dht.routingTables { - route.Print() - } -} - func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u.Key, level int) (*Message, error) { pmes := newMessage(Message_GET_PROVIDERS, string(key), level) return dht.sendRequest(ctx, p, pmes) } -// TODO: Could be done async func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []peer.Peer { var provArr []peer.Peer for _, prov := range peers { diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 136be4efe3..507db4eec5 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -283,7 +283,13 @@ func TestProvidesAsync(t *testing.T) { ctxT, _ := context.WithTimeout(ctx, time.Millisecond*300) provs := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 5) select { - case p := <-provs: + case p, ok := <-provs: + if !ok { + t.Fatal("Provider channel was closed...") + } + if p == nil { + t.Fatal("Got back nil provider!") + } if !p.ID().Equal(dhts[3].self.ID()) { t.Fatalf("got a provider, but not the right one. %s", p) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b557aa76c5..9ca521af77 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -61,7 +61,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { log.Warning("Got no peers back from routing table!") - return nil, nil + return nil, kb.ErrLookupFailure } // setup the Query @@ -152,22 +152,32 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int return peerOut } -//TODO: this function could also be done asynchronously func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet, count int, out chan peer.Peer) { + done := make(chan struct{}) for _, pbp := range peers { + go func(mp *Message_Peer) { + defer func() { done <- struct{}{} }() + // construct new peer + p, err := dht.ensureConnectedToPeer(mp) + if err != nil { + log.Error("%s", err) + return + } + if p == nil { + log.Error("Got nil peer from ensureConnectedToPeer") + return + } - // construct new peer - p, err := dht.ensureConnectedToPeer(pbp) - if err != nil { - continue - } - - dht.providers.AddProvider(k, p) - if ps.AddIfSmallerThan(p, count) { - out <- p - } else if ps.Size() >= count { - return - } + dht.providers.AddProvider(k, p) + if ps.AddIfSmallerThan(p, count) { + out <- p + } else if ps.Size() >= count { + return + } + }(pbp) + } + for _ = range peers { + <-done } } @@ -182,92 +192,64 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) } routeLevel := 0 - p = dht.routingTables[routeLevel].NearestPeer(kb.ConvertPeerID(id)) - if p == nil { - return nil, nil - } - if p.ID().Equal(id) { - return p, nil + closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) + if closest == nil || len(closest) == 0 { + return nil, kb.ErrLookupFailure } - for routeLevel < len(dht.routingTables) { - pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) - plist := pmes.GetCloserPeers() - if plist == nil || len(plist) == 0 { - routeLevel++ - continue + // Sanity... + for _, p := range closest { + if p.ID().Equal(id) { + log.Error("Found target peer in list of closest peers...") + return p, nil } - found := plist[0] - - nxtPeer, err := dht.ensureConnectedToPeer(found) - if err != nil { - routeLevel++ - continue - } - - if nxtPeer.ID().Equal(id) { - return nxtPeer, nil - } - - p = nxtPeer - } - return nil, u.ErrNotFound -} - -func (dht *IpfsDHT) findPeerMultiple(ctx context.Context, id peer.ID) (peer.Peer, error) { - - // Check if were already connected to them - p, _ := dht.FindLocal(id) - if p != nil { - return p, nil - } - - // get the peers we need to announce to - routeLevel := 0 - peers := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) - if len(peers) == 0 { - return nil, nil } - // setup query function + // setup the Query query := newQuery(u.Key(id), dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) if err != nil { - log.Error("%s getPeer error: %v", dht.self, err) return nil, err } - plist := pmes.GetCloserPeers() - if len(plist) == 0 { - routeLevel++ - } - - nxtprs := make([]peer.Peer, len(plist)) - for i, fp := range plist { - nxtp, err := dht.peerFromInfo(fp) + closer := pmes.GetCloserPeers() + var clpeers []peer.Peer + for _, pbp := range closer { + np, err := dht.getPeer(peer.ID(pbp.GetId())) if err != nil { - log.Error("%s findPeer error: %v", dht.self, err) + log.Warning("Received invalid peer from query") continue } - - if nxtp.ID().Equal(id) { - return &dhtQueryResult{peer: nxtp, success: true}, nil + ma, err := pbp.Address() + if err != nil { + log.Warning("Received peer with bad or missing address.") + continue } - - nxtprs[i] = nxtp + np.AddAddress(ma) + if pbp.GetId() == string(id) { + return &dhtQueryResult{ + peer: np, + success: true, + }, nil + } + clpeers = append(clpeers, np) } - return &dhtQueryResult{closerPeers: nxtprs}, nil + return &dhtQueryResult{closerPeers: clpeers}, nil }) - result, err := query.Run(ctx, peers) + // run it! + result, err := query.Run(ctx, closest) if err != nil { return nil, err } + log.Debug("FindPeer %v %v", id, result.success) if result.peer == nil { return nil, u.ErrNotFound } + return result.peer, nil } diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 5c3e048676..7b9d88fdaf 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -88,7 +88,6 @@ func (rt *RoutingTable) nextBucket() peer.Peer { newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) rt.Buckets = append(rt.Buckets, newBucket) if newBucket.len() > rt.bucketsize { - // TODO: This is a very rare and annoying case return rt.nextBucket() } From f6f7c74ba00f94b2cae63b6f3e4e9b0064c40fc4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 02:50:13 -0700 Subject: [PATCH 0266/3147] use my go-logging fork until https://github.com/op/go-logging/pull/30 is merged This commit was moved from ipfs/go-unixfs@8e3a21011ec65d94b26af0586ff06f07c61127b1 --- unixfs/io/dagmodifier_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 5e9edb7273..22dceaf4ca 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "testing" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/op/go-logging" bs "github.com/jbenet/go-ipfs/blockservice" "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" @@ -14,6 +13,7 @@ import ( u "github.com/jbenet/go-ipfs/util" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-logging" ) func getMockDagServ(t *testing.T) *mdag.DAGService { From 1b7e718ae4ba269fc28c9f4f75d1eb711aa3b839 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 03:17:14 -0700 Subject: [PATCH 0267/3147] go-vet friendly codebase - distinguish log.Error and log.Errorf functions - Initialize structs with field names - A bit of unreachable code (defers) This commit was moved from ipfs/go-ipfs-routing@62fae319223b323c93df5d29dafb80eeb81d1510 --- routing/dht/dht.go | 34 +++++++++++++++++----------------- routing/dht/dht_logger.go | 4 ++-- routing/dht/handlers.go | 32 ++++++++++++++++---------------- routing/dht/routing.go | 16 ++++++++-------- routing/kbucket/table.go | 4 ++-- 5 files changed, 45 insertions(+), 45 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 118c7bb2e9..60032f389a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -84,7 +84,7 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, error) { - log.Debug("Connect to new peer: %s", npeer) + log.Debugf("Connect to new peer: %s", npeer) // TODO(jbenet,whyrusleeping) // @@ -139,7 +139,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N dht.Update(mPeer) // Print out diagnostic - log.Debug("[peer: %s] Got message type: '%s' [from = %s]\n", + log.Debugf("%s got message type: '%s' from %s", dht.self, Message_MessageType_name[int32(pmes.GetType())], mPeer) // get handler for this msg type. @@ -152,7 +152,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // dispatch handler. rpmes, err := handler(mPeer, pmes) if err != nil { - log.Error("handle message error: %s", err) + log.Errorf("handle message error: %s", err) return nil } @@ -165,7 +165,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // serialize response msg rmes, err := msg.FromObject(mPeer, rpmes) if err != nil { - log.Error("serialze response error: %s", err) + log.Errorf("serialze response error: %s", err) return nil } @@ -184,7 +184,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *Message) start := time.Now() // Print out diagnostic - log.Debug("Sent message type: '%s' [to = %s]", + log.Debugf("Sent message type: '%s' to %s", Message_MessageType_name[int32(pmes.GetType())], p) rmes, err := dht.sender.SendRequest(ctx, mes) @@ -235,7 +235,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) er return err } - log.Debug("%s putProvider: %s for %s", dht.self, p, key) + log.Debugf("%s putProvider: %s for %s", dht.self, p, key) if rpmes.GetKey() != pmes.GetKey() { return errors.New("provider not added correctly") } @@ -251,7 +251,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, return nil, nil, err } - log.Debug("pmes.GetValue() %v", pmes.GetValue()) + log.Debugf("pmes.GetValue() %v", pmes.GetValue()) if value := pmes.GetValue(); value != nil { // Success! We were given the value log.Debug("getValueOrPeers: got value") @@ -273,7 +273,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, for _, pb := range pmes.GetCloserPeers() { pr, err := dht.peerFromInfo(pb) if err != nil { - log.Error("%s", err) + log.Error(err) continue } peers = append(peers, pr) @@ -306,13 +306,13 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, for _, pinfo := range peerlist { p, err := dht.ensureConnectedToPeer(pinfo) if err != nil { - log.Error("getFromPeers error: %s", err) + log.Errorf("getFromPeers error: %s", err) continue } pmes, err := dht.getValueSingle(ctx, p, key, level) if err != nil { - log.Error("getFromPeers error: %s\n", err) + log.Errorf("getFromPeers error: %s\n", err) continue } @@ -349,7 +349,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals to all routingTables to Update their last-seen status // on the given peer. func (dht *IpfsDHT) Update(p peer.Peer) { - log.Debug("updating peer: %s latency = %f\n", p, p.GetLatency().Seconds()) + log.Debugf("updating peer: %s latency = %f\n", p, p.GetLatency().Seconds()) removedCount := 0 for _, route := range dht.routingTables { removed := route.Update(p) @@ -394,11 +394,11 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []peer.Peer { for _, prov := range peers { p, err := dht.peerFromInfo(prov) if err != nil { - log.Error("error getting peer from info: %v", err) + log.Errorf("error getting peer from info: %v", err) continue } - log.Debug("%s adding provider: %s for %s", dht.self, p, key) + log.Debugf("%s adding provider: %s for %s", dht.self, p, key) // Dont add outselves to the list if p.ID().Equal(dht.self.ID()) { @@ -456,7 +456,7 @@ func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { p, err := dht.peerstore.Get(id) if err != nil { err = fmt.Errorf("Failed to get peer from peerstore: %s", err) - log.Error("%s", err) + log.Error(err) return nil, err } return p, nil @@ -505,7 +505,7 @@ func (dht *IpfsDHT) loadProvidableKeys() error { for _, dsk := range kl { k := u.KeyFromDsKey(dsk) if len(k) == 0 { - log.Error("loadProvidableKeys error: %v", dsk) + log.Errorf("loadProvidableKeys error: %v", dsk) } dht.providers.AddProvider(k, dht.self) @@ -526,7 +526,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { ctx, _ := context.WithTimeout(dht.ctx, time.Second*5) err := dht.Ping(ctx, p) if err != nil { - log.Error("Ping error: %s", err) + log.Errorf("Ping error: %s", err) } } case <-dht.ctx.Done(): @@ -541,6 +541,6 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context) { rand.Read(id) _, err := dht.FindPeer(ctx, peer.ID(id)) if err != nil { - log.Error("Bootstrap peer error: %s", err) + log.Errorf("Bootstrap peer error: %s", err) } } diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go index 0ff012956c..eea47ec1ae 100644 --- a/routing/dht/dht_logger.go +++ b/routing/dht/dht_logger.go @@ -30,14 +30,14 @@ func (l *logDhtRPC) EndLog() { func (l *logDhtRPC) Print() { b, err := json.Marshal(l) if err != nil { - log.Debug("Error marshaling logDhtRPC object: %s", err) + log.Debugf("Error marshaling logDhtRPC object: %s", err) } else { log.Debug(string(b)) } } func (l *logDhtRPC) String() string { - return fmt.Sprintf("DHT RPC: %s took %s, success = %s", l.Type, l.Duration, l.Success) + return fmt.Sprintf("DHT RPC: %s took %s, success = %v", l.Type, l.Duration, l.Success) } func (l *logDhtRPC) EndAndPrint() { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 2e51171046..8aeb4251b1 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -36,7 +36,7 @@ func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { } func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) { - log.Debug("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) + log.Debugf("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) // setup response resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) @@ -48,10 +48,10 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) } // let's first check if we have the value locally. - log.Debug("%s handleGetValue looking into ds", dht.self) + log.Debugf("%s handleGetValue looking into ds", dht.self) dskey := u.Key(pmes.GetKey()).DsKey() iVal, err := dht.datastore.Get(dskey) - log.Debug("%s handleGetValue looking into ds GOT %v", dht.self, iVal) + log.Debugf("%s handleGetValue looking into ds GOT %v", dht.self, iVal) // if we got an unexpected error, bail. if err != nil && err != ds.ErrNotFound { @@ -63,7 +63,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) // if we have the value, send it back if err == nil { - log.Debug("%s handleGetValue success!", dht.self) + log.Debugf("%s handleGetValue success!", dht.self) byts, ok := iVal.([]byte) if !ok { @@ -76,7 +76,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) // if we know any providers for the requested value, return those. provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) if len(provs) > 0 { - log.Debug("handleGetValue returning %d provider[s]\n", len(provs)) + log.Debugf("handleGetValue returning %d provider[s]", len(provs)) resp.ProviderPeers = peersToPBPeers(provs) } @@ -84,7 +84,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) closer := dht.betterPeersToQuery(pmes, CloserPeerCount) if closer != nil { for _, p := range closer { - log.Debug("handleGetValue returning closer peer: '%s'", p) + log.Debugf("handleGetValue returning closer peer: '%s'", p) if len(p.Addresses()) < 1 { log.Critical("no addresses on peer being sent!") } @@ -101,12 +101,12 @@ func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *Message) (*Message, error) defer dht.dslock.Unlock() dskey := u.Key(pmes.GetKey()).DsKey() err := dht.datastore.Put(dskey, pmes.GetValue()) - log.Debug("%s handlePutValue %v %v\n", dht.self, dskey, pmes.GetValue()) + log.Debugf("%s handlePutValue %v %v\n", dht.self, dskey, pmes.GetValue()) return pmes, err } func (dht *IpfsDHT) handlePing(p peer.Peer, pmes *Message) (*Message, error) { - log.Debug("%s Responding to ping from %s!\n", dht.self, p) + log.Debugf("%s Responding to ping from %s!\n", dht.self, p) return pmes, nil } @@ -122,7 +122,7 @@ func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *Message) (*Message, error) } if closest == nil { - log.Error("handleFindPeer: could not find anything.") + log.Errorf("handleFindPeer: could not find anything.") return resp, nil } @@ -134,7 +134,7 @@ func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *Message) (*Message, error) } for _, p := range withAddresses { - log.Debug("handleFindPeer: sending back '%s'", p) + log.Debugf("handleFindPeer: sending back '%s'", p) } resp.CloserPeers = peersToPBPeers(withAddresses) return resp, nil @@ -144,11 +144,11 @@ func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *Message) (*Message, er resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. - log.Debug("handling GetProviders: '%s'", pmes.GetKey()) + log.Debugf("handling GetProviders: '%s'", pmes.GetKey()) dsk := u.Key(pmes.GetKey()).DsKey() has, err := dht.datastore.Has(dsk) if err != nil && err != ds.ErrNotFound { - log.Error("unexpected datastore error: %v\n", err) + log.Errorf("unexpected datastore error: %v\n", err) has = false } @@ -180,7 +180,7 @@ type providerInfo struct { func (dht *IpfsDHT) handleAddProvider(p peer.Peer, pmes *Message) (*Message, error) { key := u.Key(pmes.GetKey()) - log.Debug("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) + log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) // add provider should use the address given in the message for _, pb := range pmes.GetProviderPeers() { @@ -189,16 +189,16 @@ func (dht *IpfsDHT) handleAddProvider(p peer.Peer, pmes *Message) (*Message, err addr, err := pb.Address() if err != nil { - log.Error("provider %s error with address %s", p, *pb.Addr) + log.Errorf("provider %s error with address %s", p, *pb.Addr) continue } - log.Info("received provider %s %s for %s", p, addr, key) + log.Infof("received provider %s %s for %s", p, addr, key) p.AddAddress(addr) dht.providers.AddProvider(key, p) } else { - log.Error("handleAddProvider received provider %s from %s", pid, p) + log.Errorf("handleAddProvider received provider %s from %s", pid, p) } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9ca521af77..26d17cbc4c 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -17,7 +17,7 @@ import ( // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { - log.Debug("PutValue %s", key) + log.Debugf("PutValue %s", key) err := dht.putLocal(key, value) if err != nil { return err @@ -30,7 +30,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error } query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { - log.Debug("%s PutValue qry part %v", dht.self, p) + log.Debugf("%s PutValue qry part %v", dht.self, p) err := dht.putValueToNetwork(ctx, p, string(key), value) if err != nil { return nil, err @@ -46,7 +46,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { - log.Debug("Get Value [%s]", key) + log.Debugf("Get Value [%s]", key) // If we have it local, dont bother doing an RPC! // NOTE: this might not be what we want to do... @@ -86,7 +86,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { return nil, err } - log.Debug("GetValue %v %v", key, result.value) + log.Debugf("GetValue %v %v", key, result.value) if result.value == nil { return nil, u.ErrNotFound } @@ -140,7 +140,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int defer wg.Done() pmes, err := dht.findProvidersSingle(ctx, p, key, 0) if err != nil { - log.Error("%s", err) + log.Error(err) return } dht.addPeerListAsync(key, pmes.GetProviderPeers(), ps, count, peerOut) @@ -218,7 +218,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) for _, pbp := range closer { np, err := dht.getPeer(peer.ID(pbp.GetId())) if err != nil { - log.Warning("Received invalid peer from query") + log.Warningf("Received invalid peer from query: %v", err) continue } ma, err := pbp.Address() @@ -256,10 +256,10 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(ctx context.Context, p peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? - log.Info("ping %s start", p) + log.Infof("ping %s start", p) pmes := newMessage(Message_PING, "", 0) _, err := dht.sendRequest(ctx, p, pmes) - log.Info("ping %s end (err = %s)", p, err) + log.Infof("ping %s end (err = %s)", p, err) return err } diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 7b9d88fdaf..491a06c685 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -125,7 +125,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } peerArr = append(peerArr, &pd) if e == nil { - log.Debug("list element was nil.\n") + log.Debug("list element was nil") return peerArr } } @@ -148,7 +148,7 @@ func (rt *RoutingTable) NearestPeer(id ID) peer.Peer { return peers[0] } - log.Error("NearestPeer: Returning nil, table size = %d", rt.Size()) + log.Errorf("NearestPeer: Returning nil, table size = %d", rt.Size()) return nil } From 03623919545081e7346f721c7adaad679ca18235 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 03:17:14 -0700 Subject: [PATCH 0268/3147] go-vet friendly codebase - distinguish log.Error and log.Errorf functions - Initialize structs with field names - A bit of unreachable code (defers) This commit was moved from ipfs/go-unixfs@f7a6bca9147c5e03067271bb13534c7517120d24 --- unixfs/io/dagmodifier.go | 6 +++--- unixfs/io/dagmodifier_test.go | 12 ++++++------ unixfs/io/dagwriter_test.go | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go index ec8f7fbeb8..2d5fb77d92 100644 --- a/unixfs/io/dagmodifier.go +++ b/unixfs/io/dagmodifier.go @@ -59,7 +59,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset uint64) (int, error) { origlen := len(b) if end <= zeroblocklen { - log.Debug("Writing into zero block.") + log.Debug("Writing into zero block") // Replacing zeroeth data block (embedded in the root node) //TODO: check chunking here copy(dm.pbdata.Data[offset:], b) @@ -76,7 +76,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset uint64) (int, error) { traversed = uint64(zeroblocklen) for i, size := range dm.pbdata.Blocksizes { if uint64(offset) < traversed+size { - log.Debug("Starting mod at block %d. [%d < %d + %d]", i, offset, traversed, size) + log.Debugf("Starting mod at block %d. [%d < %d + %d]", i, offset, traversed, size) // Here is where we start startsubblk = i lnk := dm.curNode.Links[i] @@ -145,7 +145,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset uint64) (int, error) { n := &mdag.Node{Data: ft.WrapData(sb)} _, err := dm.dagserv.Add(n) if err != nil { - log.Error("Failed adding node to DAG service: %s", err) + log.Errorf("Failed adding node to DAG service: %s", err) return 0, err } lnk, err := mdag.MakeLink(n) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 22dceaf4ca..3686ff859a 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -22,11 +22,11 @@ func getMockDagServ(t *testing.T) *mdag.DAGService { if err != nil { t.Fatal(err) } - return &mdag.DAGService{bserv} + return &mdag.DAGService{Blocks: bserv} } func getNode(t *testing.T, dserv *mdag.DAGService, size int64) ([]byte, *mdag.Node) { - dw := NewDagWriter(dserv, &chunk.SizeSplitter{500}) + dw := NewDagWriter(dserv, &chunk.SizeSplitter{Size: 500}) n, err := io.CopyN(dw, u.NewFastRand(), size) if err != nil { @@ -99,7 +99,7 @@ func TestDagModifierBasic(t *testing.T) { dserv := getMockDagServ(t) b, n := getNode(t, dserv, 50000) - dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{512}) + dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -142,7 +142,7 @@ func TestDagModifierBasic(t *testing.T) { expected := uint64(50000 + 3500 + 3000) if size != expected { - t.Fatal("Final reported size is incorrect [%d != %d]", size, expected) + t.Fatalf("Final reported size is incorrect [%d != %d]", size, expected) } } @@ -150,7 +150,7 @@ func TestMultiWrite(t *testing.T) { dserv := getMockDagServ(t) _, n := getNode(t, dserv, 0) - dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{512}) + dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -191,7 +191,7 @@ func TestMultiWriteCoal(t *testing.T) { dserv := getMockDagServ(t) _, n := getNode(t, dserv, 0) - dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{512}) + dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } diff --git a/unixfs/io/dagwriter_test.go b/unixfs/io/dagwriter_test.go index ddf5f9d667..d0b8f45d16 100644 --- a/unixfs/io/dagwriter_test.go +++ b/unixfs/io/dagwriter_test.go @@ -53,8 +53,8 @@ func TestDagWriter(t *testing.T) { if err != nil { t.Fatal(err) } - dag := &mdag.DAGService{bserv} - dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + dag := &mdag.DAGService{Blocks: bserv} + dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) nbytes := int64(1024 * 1024 * 2) n, err := io.CopyN(dw, &datasource{}, nbytes) @@ -87,8 +87,8 @@ func TestMassiveWrite(t *testing.T) { if err != nil { t.Fatal(err) } - dag := &mdag.DAGService{bserv} - dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + dag := &mdag.DAGService{Blocks: bserv} + dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) nbytes := int64(1024 * 1024 * 1024 * 16) n, err := io.CopyN(dw, &datasource{}, nbytes) @@ -107,13 +107,13 @@ func BenchmarkDagWriter(b *testing.B) { if err != nil { b.Fatal(err) } - dag := &mdag.DAGService{bserv} + dag := &mdag.DAGService{Blocks: bserv} b.ResetTimer() nbytes := int64(100000) for i := 0; i < b.N; i++ { b.SetBytes(nbytes) - dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) n, err := io.CopyN(dw, &datasource{}, nbytes) if err != nil { b.Fatal(err) From c18235b6702f9edb9bbbfb505bde2a1bd4dc4e56 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 03:17:14 -0700 Subject: [PATCH 0269/3147] go-vet friendly codebase - distinguish log.Error and log.Errorf functions - Initialize structs with field names - A bit of unreachable code (defers) This commit was moved from ipfs/go-ipfs-pinner@8b6cef69a144c4a4be6def7ea76ccdfdea211197 --- pinning/pinner/pin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 10b5862b9b..8f6f6c343b 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -24,7 +24,7 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - dserv := &mdag.DAGService{bserv} + dserv := &mdag.DAGService{Blocks: bserv} p := NewPinner(dstore, dserv) From e210af5519b77d8d13574a929420590ddfb67584 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 03:17:14 -0700 Subject: [PATCH 0270/3147] go-vet friendly codebase - distinguish log.Error and log.Errorf functions - Initialize structs with field names - A bit of unreachable code (defers) This commit was moved from ipfs/go-ipfs-chunker@a753a87fbed09f7bffff4271ae34e91e738a1ae8 --- chunker/splitting.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 0b5717eaf6..f5a6f735ce 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -8,7 +8,7 @@ import ( var log = util.Logger("chunk") -var DefaultSplitter = &SizeSplitter{1024 * 512} +var DefaultSplitter = &SizeSplitter{Size: 1024 * 512} type BlockSplitter interface { Split(r io.Reader) chan []byte @@ -32,7 +32,7 @@ func (ss *SizeSplitter) Split(r io.Reader) chan []byte { } return } - log.Error("Block split error: %s", err) + log.Errorf("Block split error: %s", err) return } if nread < ss.Size { From 2048a40597dde5602ef81f1af7b8b6f224eab956 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 25 Oct 2014 04:13:28 -0700 Subject: [PATCH 0271/3147] refactor(dht/pb) move proto to pb package This commit was moved from ipfs/go-ipfs-routing@05ac1e87cd24870cac6c6027488785ab8f17d9ce --- routing/dht/Makefile | 11 ----- routing/dht/dht.go | 41 +++++++++--------- routing/dht/ext_test.go | 27 ++++++------ routing/dht/handlers.go | 45 ++++++++++---------- routing/dht/pb/Makefile | 11 +++++ routing/dht/{messages.pb.go => pb/dht.pb.go} | 16 +++---- routing/dht/{messages.proto => pb/dht.proto} | 2 +- routing/dht/{Message.go => pb/message.go} | 9 ++-- routing/dht/routing.go | 7 +-- 9 files changed, 86 insertions(+), 83 deletions(-) delete mode 100644 routing/dht/Makefile create mode 100644 routing/dht/pb/Makefile rename routing/dht/{messages.pb.go => pb/dht.pb.go} (92%) rename routing/dht/{messages.proto => pb/dht.proto} (98%) rename routing/dht/{Message.go => pb/message.go} (87%) diff --git a/routing/dht/Makefile b/routing/dht/Makefile deleted file mode 100644 index 563234b1d3..0000000000 --- a/routing/dht/Makefile +++ /dev/null @@ -1,11 +0,0 @@ - -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --gogo_out=. --proto_path=../../../../:/usr/local/opt/protobuf/include:. $< - -clean: - rm *.pb.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 60032f389a..52ae1f76c4 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -11,6 +11,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" msg "github.com/jbenet/go-ipfs/net/message" peer "github.com/jbenet/go-ipfs/peer" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" @@ -128,7 +129,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N } // deserialize msg - pmes := new(Message) + pmes := new(pb.Message) err := proto.Unmarshal(mData, pmes) if err != nil { log.Error("Error unmarshaling data") @@ -140,7 +141,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // Print out diagnostic log.Debugf("%s got message type: '%s' from %s", - dht.self, Message_MessageType_name[int32(pmes.GetType())], mPeer) + dht.self, pb.Message_MessageType_name[int32(pmes.GetType())], mPeer) // get handler for this msg type. handler := dht.handlerForMsgType(pmes.GetType()) @@ -174,7 +175,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // sendRequest sends out a request using dht.sender, but also makes sure to // measure the RTT for latency measurements. -func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { mes, err := msg.FromObject(p, pmes) if err != nil { @@ -185,7 +186,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *Message) // Print out diagnostic log.Debugf("Sent message type: '%s' to %s", - Message_MessageType_name[int32(pmes.GetType())], p) + pb.Message_MessageType_name[int32(pmes.GetType())], p) rmes, err := dht.sender.SendRequest(ctx, mes) if err != nil { @@ -198,7 +199,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *Message) rtt := time.Since(start) rmes.Peer().SetLatency(rtt) - rpmes := new(Message) + rpmes := new(pb.Message) if err := proto.Unmarshal(rmes.Data(), rpmes); err != nil { return nil, err } @@ -210,7 +211,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *Message) func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, key string, value []byte) error { - pmes := newMessage(Message_PUT_VALUE, string(key), 0) + pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) pmes.Value = value rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { @@ -225,10 +226,10 @@ func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) error { - pmes := newMessage(Message_ADD_PROVIDER, string(key), 0) + pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) // add self as the provider - pmes.ProviderPeers = peersToPBPeers([]peer.Peer{dht.self}) + pmes.ProviderPeers = pb.PeersToPBPeers([]peer.Peer{dht.self}) rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { @@ -290,9 +291,9 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.Peer, - key u.Key, level int) (*Message, error) { + key u.Key, level int) (*pb.Message, error) { - pmes := newMessage(Message_GET_VALUE, string(key), level) + pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), level) return dht.sendRequest(ctx, p, pmes) } @@ -301,7 +302,7 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.Peer, // one to get the value from? Or just connect to one at a time until we get a // successful connection and request the value from it? func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, - peerlist []*Message_Peer, level int) ([]byte, error) { + peerlist []*pb.Message_Peer, level int) ([]byte, error) { for _, pinfo := range peerlist { p, err := dht.ensureConnectedToPeer(pinfo) @@ -379,17 +380,17 @@ func (dht *IpfsDHT) FindLocal(id peer.ID) (peer.Peer, *kb.RoutingTable) { return nil, nil } -func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID, level int) (*Message, error) { - pmes := newMessage(Message_FIND_NODE, string(id), level) +func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID, level int) (*pb.Message, error) { + pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), level) return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u.Key, level int) (*Message, error) { - pmes := newMessage(Message_GET_PROVIDERS, string(key), level) +func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u.Key, level int) (*pb.Message, error) { + pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), level) return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []peer.Peer { +func (dht *IpfsDHT) addProviders(key u.Key, peers []*pb.Message_Peer) []peer.Peer { var provArr []peer.Peer for _, prov := range peers { p, err := dht.peerFromInfo(prov) @@ -413,7 +414,7 @@ func (dht *IpfsDHT) addProviders(key u.Key, peers []*Message_Peer) []peer.Peer { } // nearestPeersToQuery returns the routing tables closest peers. -func (dht *IpfsDHT) nearestPeersToQuery(pmes *Message, count int) []peer.Peer { +func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.Peer { level := pmes.GetClusterLevel() cluster := dht.routingTables[level] @@ -423,7 +424,7 @@ func (dht *IpfsDHT) nearestPeersToQuery(pmes *Message, count int) []peer.Peer { } // betterPeerToQuery returns nearestPeersToQuery, but iff closer than self. -func (dht *IpfsDHT) betterPeersToQuery(pmes *Message, count int) []peer.Peer { +func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.Peer { closer := dht.nearestPeersToQuery(pmes, count) // no node? nil @@ -462,7 +463,7 @@ func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { return p, nil } -func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (peer.Peer, error) { +func (dht *IpfsDHT) peerFromInfo(pbp *pb.Message_Peer) (peer.Peer, error) { id := peer.ID(pbp.GetId()) @@ -485,7 +486,7 @@ func (dht *IpfsDHT) peerFromInfo(pbp *Message_Peer) (peer.Peer, error) { return p, nil } -func (dht *IpfsDHT) ensureConnectedToPeer(pbp *Message_Peer) (peer.Peer, error) { +func (dht *IpfsDHT) ensureConnectedToPeer(pbp *pb.Message_Peer) (peer.Peer, error) { p, err := dht.peerFromInfo(pbp) if err != nil { return nil, err diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 43bd34f8a2..be6f17d96e 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -12,6 +12,7 @@ import ( msg "github.com/jbenet/go-ipfs/net/message" mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" "time" @@ -127,13 +128,13 @@ func TestGetFailures(t *testing.T) { // u.POut("NotFound Test\n") // Reply with failures to every message fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { - pmes := new(Message) + pmes := new(pb.Message) err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } - resp := &Message{ + resp := &pb.Message{ Type: pmes.Type, } m, err := msg.FromObject(mes.Peer(), resp) @@ -153,9 +154,9 @@ func TestGetFailures(t *testing.T) { fs.handlers = nil // Now we test this DHT's handleGetValue failure - typ := Message_GET_VALUE + typ := pb.Message_GET_VALUE str := "hello" - req := Message{ + req := pb.Message{ Type: &typ, Key: &str, Value: []byte{0}, @@ -169,7 +170,7 @@ func TestGetFailures(t *testing.T) { mes = d.HandleMessage(ctx, mes) - pmes := new(Message) + pmes := new(pb.Message) err = proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) @@ -215,21 +216,21 @@ func TestNotFound(t *testing.T) { // Reply with random peers to every message fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { - pmes := new(Message) + pmes := new(pb.Message) err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } switch pmes.GetType() { - case Message_GET_VALUE: - resp := &Message{Type: pmes.Type} + case pb.Message_GET_VALUE: + resp := &pb.Message{Type: pmes.Type} peers := []peer.Peer{} for i := 0; i < 7; i++ { peers = append(peers, _randPeer()) } - resp.CloserPeers = peersToPBPeers(peers) + resp.CloserPeers = pb.PeersToPBPeers(peers) mes, err := msg.FromObject(mes.Peer(), resp) if err != nil { t.Error(err) @@ -282,17 +283,17 @@ func TestLessThanKResponses(t *testing.T) { // Reply with random peers to every message fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { - pmes := new(Message) + pmes := new(pb.Message) err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } switch pmes.GetType() { - case Message_GET_VALUE: - resp := &Message{ + case pb.Message_GET_VALUE: + resp := &pb.Message{ Type: pmes.Type, - CloserPeers: peersToPBPeers([]peer.Peer{other}), + CloserPeers: pb.PeersToPBPeers([]peer.Peer{other}), } mes, err := msg.FromObject(mes.Peer(), resp) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 8aeb4251b1..35355b32ff 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -6,6 +6,7 @@ import ( "time" peer "github.com/jbenet/go-ipfs/peer" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -14,32 +15,32 @@ import ( var CloserPeerCount = 4 // dhthandler specifies the signature of functions that handle DHT messages. -type dhtHandler func(peer.Peer, *Message) (*Message, error) +type dhtHandler func(peer.Peer, *pb.Message) (*pb.Message, error) -func (dht *IpfsDHT) handlerForMsgType(t Message_MessageType) dhtHandler { +func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { switch t { - case Message_GET_VALUE: + case pb.Message_GET_VALUE: return dht.handleGetValue - case Message_PUT_VALUE: + case pb.Message_PUT_VALUE: return dht.handlePutValue - case Message_FIND_NODE: + case pb.Message_FIND_NODE: return dht.handleFindPeer - case Message_ADD_PROVIDER: + case pb.Message_ADD_PROVIDER: return dht.handleAddProvider - case Message_GET_PROVIDERS: + case pb.Message_GET_PROVIDERS: return dht.handleGetProviders - case Message_PING: + case pb.Message_PING: return dht.handlePing default: return nil } } -func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) // setup response - resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) + resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // first, is the key even a key? key := pmes.GetKey() @@ -77,7 +78,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) if len(provs) > 0 { log.Debugf("handleGetValue returning %d provider[s]", len(provs)) - resp.ProviderPeers = peersToPBPeers(provs) + resp.ProviderPeers = pb.PeersToPBPeers(provs) } // Find closest peer on given cluster to desired key and reply with that info @@ -89,14 +90,14 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *Message) (*Message, error) log.Critical("no addresses on peer being sent!") } } - resp.CloserPeers = peersToPBPeers(closer) + resp.CloserPeers = pb.PeersToPBPeers(closer) } return resp, nil } // Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { dht.dslock.Lock() defer dht.dslock.Unlock() dskey := u.Key(pmes.GetKey()).DsKey() @@ -105,13 +106,13 @@ func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *Message) (*Message, error) return pmes, err } -func (dht *IpfsDHT) handlePing(p peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handlePing(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s Responding to ping from %s!\n", dht.self, p) return pmes, nil } -func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *Message) (*Message, error) { - resp := newMessage(pmes.GetType(), "", pmes.GetClusterLevel()) +func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { + resp := pb.NewMessage(pmes.GetType(), "", pmes.GetClusterLevel()) var closest []peer.Peer // if looking for self... special case where we send it on CloserPeers. @@ -136,12 +137,12 @@ func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *Message) (*Message, error) for _, p := range withAddresses { log.Debugf("handleFindPeer: sending back '%s'", p) } - resp.CloserPeers = peersToPBPeers(withAddresses) + resp.CloserPeers = pb.PeersToPBPeers(withAddresses) return resp, nil } -func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *Message) (*Message, error) { - resp := newMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) +func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { + resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. log.Debugf("handling GetProviders: '%s'", pmes.GetKey()) @@ -160,13 +161,13 @@ func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *Message) (*Message, er // if we've got providers, send thos those. if providers != nil && len(providers) > 0 { - resp.ProviderPeers = peersToPBPeers(providers) + resp.ProviderPeers = pb.PeersToPBPeers(providers) } // Also send closer peers. closer := dht.betterPeersToQuery(pmes, CloserPeerCount) if closer != nil { - resp.CloserPeers = peersToPBPeers(closer) + resp.CloserPeers = pb.PeersToPBPeers(closer) } return resp, nil @@ -177,7 +178,7 @@ type providerInfo struct { Value peer.Peer } -func (dht *IpfsDHT) handleAddProvider(p peer.Peer, pmes *Message) (*Message, error) { +func (dht *IpfsDHT) handleAddProvider(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { key := u.Key(pmes.GetKey()) log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) diff --git a/routing/dht/pb/Makefile b/routing/dht/pb/Makefile new file mode 100644 index 0000000000..08ac883d0d --- /dev/null +++ b/routing/dht/pb/Makefile @@ -0,0 +1,11 @@ +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< + +clean: + rm -f *.pb.go + rm -f *.go diff --git a/routing/dht/messages.pb.go b/routing/dht/pb/dht.pb.go similarity index 92% rename from routing/dht/messages.pb.go rename to routing/dht/pb/dht.pb.go index 2da77e7bc2..6c488c51a6 100644 --- a/routing/dht/messages.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -1,19 +1,19 @@ -// Code generated by protoc-gen-go. -// source: messages.proto +// Code generated by protoc-gen-gogo. +// source: dht.proto // DO NOT EDIT! /* -Package dht is a generated protocol buffer package. +Package dht_pb is a generated protocol buffer package. It is generated from these files: - messages.proto + dht.proto It has these top-level messages: Message */ -package dht +package dht_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -67,7 +67,7 @@ func (x *Message_MessageType) UnmarshalJSON(data []byte) error { type Message struct { // defines what type of message it is. - Type *Message_MessageType `protobuf:"varint,1,opt,name=type,enum=dht.Message_MessageType" json:"type,omitempty"` + Type *Message_MessageType `protobuf:"varint,1,opt,name=type,enum=dht.pb.Message_MessageType" json:"type,omitempty"` // defines what coral cluster level this query/response belongs to. ClusterLevelRaw *int32 `protobuf:"varint,10,opt,name=clusterLevelRaw" json:"clusterLevelRaw,omitempty"` // Used to specify the key associated with this message. @@ -156,5 +156,5 @@ func (m *Message_Peer) GetAddr() string { } func init() { - proto.RegisterEnum("dht.Message_MessageType", Message_MessageType_name, Message_MessageType_value) + proto.RegisterEnum("dht.pb.Message_MessageType", Message_MessageType_name, Message_MessageType_value) } diff --git a/routing/dht/messages.proto b/routing/dht/pb/dht.proto similarity index 98% rename from routing/dht/messages.proto rename to routing/dht/pb/dht.proto index 0676901504..e0696e6859 100644 --- a/routing/dht/messages.proto +++ b/routing/dht/pb/dht.proto @@ -1,4 +1,4 @@ -package dht; +package dht.pb; //run `protoc --go_out=. *.proto` to generate diff --git a/routing/dht/Message.go b/routing/dht/pb/message.go similarity index 87% rename from routing/dht/Message.go rename to routing/dht/pb/message.go index ae78d1f399..a77a5b9176 100644 --- a/routing/dht/Message.go +++ b/routing/dht/pb/message.go @@ -1,4 +1,4 @@ -package dht +package dht_pb import ( "errors" @@ -8,7 +8,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) -func newMessage(typ Message_MessageType, key string, level int) *Message { +func NewMessage(typ Message_MessageType, key string, level int) *Message { m := &Message{ Type: &typ, Key: &key, @@ -31,7 +31,7 @@ func peerToPBPeer(p peer.Peer) *Message_Peer { return pbp } -func peersToPBPeers(peers []peer.Peer) []*Message_Peer { +func PeersToPBPeers(peers []peer.Peer) []*Message_Peer { pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { pbpeers[i] = peerToPBPeer(p) @@ -53,8 +53,7 @@ func (m *Message_Peer) Address() (ma.Multiaddr, error) { func (m *Message) GetClusterLevel() int { level := m.GetClusterLevelRaw() - 1 if level < 0 { - log.Debug("GetClusterLevel: no routing level specified, assuming 0") - level = 0 + return 0 } return int(level) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 26d17cbc4c..64a7edbd65 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -6,6 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" peer "github.com/jbenet/go-ipfs/peer" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" ) @@ -152,10 +153,10 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int return peerOut } -func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*Message_Peer, ps *peerSet, count int, out chan peer.Peer) { +func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*pb.Message_Peer, ps *peerSet, count int, out chan peer.Peer) { done := make(chan struct{}) for _, pbp := range peers { - go func(mp *Message_Peer) { + go func(mp *pb.Message_Peer) { defer func() { done <- struct{}{} }() // construct new peer p, err := dht.ensureConnectedToPeer(mp) @@ -258,7 +259,7 @@ func (dht *IpfsDHT) Ping(ctx context.Context, p peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? log.Infof("ping %s start", p) - pmes := newMessage(Message_PING, "", 0) + pmes := pb.NewMessage(pb.Message_PING, "", 0) _, err := dht.sendRequest(ctx, p, pmes) log.Infof("ping %s end (err = %s)", p, err) return err From 99198bdb3423980ede03fb620acfc28f500e2372 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 25 Oct 2014 12:38:32 -0700 Subject: [PATCH 0272/3147] add context to blockservice Get This commit was moved from ipfs/go-blockservice@a236312107aff3440f3bff7c6f32040ef9aebbf8 --- blockservice/blocks_test.go | 6 +++++- blockservice/blockservice.go | 4 +--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 41eceaae62..69a62d3223 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -3,6 +3,9 @@ package blockservice import ( "bytes" "testing" + "time" + + "code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" blocks "github.com/jbenet/go-ipfs/blocks" @@ -37,7 +40,8 @@ func TestBlocks(t *testing.T) { t.Error("returned key is not equal to block key", err) } - b2, err := bs.GetBlock(b.Key()) + ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) + b2, err := bs.GetBlock(ctx, b.Key()) if err != nil { t.Error("failed to retrieve block from BlockService", err) return diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 9f914dc38b..51e9ad7d61 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -2,7 +2,6 @@ package blockservice import ( "fmt" - "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -52,7 +51,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). -func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { +func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, error) { log.Debug("BlockService GetBlock: '%s'", k) datai, err := s.Datastore.Get(k.DsKey()) if err == nil { @@ -67,7 +66,6 @@ func (s *BlockService) GetBlock(k u.Key) (*blocks.Block, error) { }, nil } else if err == ds.ErrNotFound && s.Remote != nil { log.Debug("Blockservice: Searching bitswap.") - ctx, _ := context.WithTimeout(context.TODO(), 5*time.Second) blk, err := s.Remote.Block(ctx, k) if err != nil { return nil, err From 9c3b52ac6f4b948d6e8fda78661dae28d6f3dc94 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 25 Oct 2014 03:36:00 -0700 Subject: [PATCH 0273/3147] add in dag removal This commit was moved from ipfs/go-ipfs-routing@900149aaaea40ff056b483f5015b7a24980d9b5a --- routing/dht/dht.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 52ae1f76c4..b3ca010b76 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -540,7 +540,11 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { func (dht *IpfsDHT) Bootstrap(ctx context.Context) { id := make([]byte, 16) rand.Read(id) - _, err := dht.FindPeer(ctx, peer.ID(id)) + p, err := dht.FindPeer(ctx, peer.ID(id)) + if err != nil { + log.Error("Bootstrap peer error: %s", err) + } + err = dht.dialer.DialPeer(p) if err != nil { log.Errorf("Bootstrap peer error: %s", err) } From bcbc0ca01e3e95787b2530a904550d1355778dbb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 25 Oct 2014 03:36:00 -0700 Subject: [PATCH 0274/3147] add in dag removal This commit was moved from ipfs/go-blockservice@ac4c5064be6fa9a0f776b0f22f02e9d9641ad8d0 --- blockservice/blockservice.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 51e9ad7d61..0ca533b196 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -76,3 +76,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er return nil, u.ErrNotFound } } + +func (s *BlockService) DeleteBlock(k u.Key) error { + return s.Datastore.Delete(k.DsKey()) +} From c73bfd454c7830b5779dd5b2476a5e42056112d4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 25 Oct 2014 14:50:22 -0700 Subject: [PATCH 0275/3147] logging, logging, and some minor logging This commit was moved from ipfs/go-ipfs-routing@5ec85163db4134fb2fe8a755026ef06fe27d39e7 --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b3ca010b76..fdb9f96f22 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -23,7 +23,7 @@ import ( var log = u.Logger("dht") -const doPinging = true +const doPinging = false // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js From 96c7d92809a67836747e21b2897ee612cc436adb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 26 Oct 2014 00:45:40 +0000 Subject: [PATCH 0276/3147] lots of logging This commit was moved from ipfs/go-ipfs-routing@cd9d80b305877e2d53fa1a8d9e7a46cf0241ca31 --- routing/dht/handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 35355b32ff..d5db8d1da9 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -145,7 +145,7 @@ func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *pb.Message) (*pb.Messa resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. - log.Debugf("handling GetProviders: '%s'", pmes.GetKey()) + log.Debugf("handling GetProviders: '%s'", u.Key(pmes.GetKey())) dsk := u.Key(pmes.GetKey()).DsKey() has, err := dht.datastore.Has(dsk) if err != nil && err != ds.ErrNotFound { From 637b069f0d61bb03f7270a95545566f217ea8dac Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 26 Oct 2014 00:45:40 +0000 Subject: [PATCH 0277/3147] lots of logging This commit was moved from ipfs/go-blockservice@e94f0b549b5bd5a9174d622575d80f2207d46658 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0ca533b196..acb6564ed6 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -52,7 +52,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, error) { - log.Debug("BlockService GetBlock: '%s'", k) + log.Debugf("BlockService GetBlock: '%s'", k) datai, err := s.Datastore.Get(k.DsKey()) if err == nil { log.Debug("Blockservice: Got data in datastore.") From f0bae5bed96d5385ec5708010021f147a016db45 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sat, 25 Oct 2014 22:15:19 -0400 Subject: [PATCH 0278/3147] convert DAGService to an interface This commit was moved from ipfs/go-unixfs@b73ce6e1ae3ebdada7d7d195f13b20e3b611d262 --- unixfs/io/dagmodifier.go | 4 +-- unixfs/io/dagmodifier_test.go | 14 ++++++---- unixfs/io/dagreader.go | 4 +-- unixfs/io/dagwriter.go | 4 +-- unixfs/io/dagwriter_test.go | 49 ++++++++++++++++++++++++++++++++--- 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go index 2d5fb77d92..ebec24cfce 100644 --- a/unixfs/io/dagmodifier.go +++ b/unixfs/io/dagmodifier.go @@ -17,14 +17,14 @@ import ( // perform surgery on a DAG 'file' // Dear god, please rename this to something more pleasant type DagModifier struct { - dagserv *mdag.DAGService + dagserv mdag.DAGService curNode *mdag.Node pbdata *ftpb.Data splitter chunk.BlockSplitter } -func NewDagModifier(from *mdag.Node, serv *mdag.DAGService, spl chunk.BlockSplitter) (*DagModifier, error) { +func NewDagModifier(from *mdag.Node, serv mdag.DAGService, spl chunk.BlockSplitter) (*DagModifier, error) { pbd, err := ft.FromBytes(from.Data) if err != nil { return nil, err diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 3686ff859a..d45559b3ad 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -16,17 +16,17 @@ import ( logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-logging" ) -func getMockDagServ(t *testing.T) *mdag.DAGService { +func getMockDagServ(t *testing.T) mdag.DAGService { dstore := ds.NewMapDatastore() bserv, err := bs.NewBlockService(dstore, nil) if err != nil { t.Fatal(err) } - return &mdag.DAGService{Blocks: bserv} + return mdag.NewDAGService(bserv) } -func getNode(t *testing.T, dserv *mdag.DAGService, size int64) ([]byte, *mdag.Node) { - dw := NewDagWriter(dserv, &chunk.SizeSplitter{Size: 500}) +func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { + dw := NewDagWriter(dserv, &chunk.SizeSplitter{500}) n, err := io.CopyN(dw, u.NewFastRand(), size) if err != nil { @@ -36,7 +36,11 @@ func getNode(t *testing.T, dserv *mdag.DAGService, size int64) ([]byte, *mdag.No t.Fatal("Incorrect copy amount!") } - dw.Close() + err = dw.Close() + if err != nil { + t.Fatal("DagWriter failed to close,", err) + } + node := dw.GetNode() dr, err := NewDagReader(node, dserv) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8469161037..17ad873719 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -16,7 +16,7 @@ var ErrIsDir = errors.New("this dag node is a directory") // DagReader provides a way to easily read the data contained in a dag. type DagReader struct { - serv *mdag.DAGService + serv mdag.DAGService node *mdag.Node position int buf *bytes.Buffer @@ -24,7 +24,7 @@ type DagReader struct { // NewDagReader creates a new reader object that reads the data represented by the given // node, using the passed in DAGService for data retreival -func NewDagReader(n *mdag.Node, serv *mdag.DAGService) (io.Reader, error) { +func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { pb := new(ftpb.Data) err := proto.Unmarshal(n.Data, pb) if err != nil { diff --git a/unixfs/io/dagwriter.go b/unixfs/io/dagwriter.go index 4abb1b36c7..c9b91cc589 100644 --- a/unixfs/io/dagwriter.go +++ b/unixfs/io/dagwriter.go @@ -10,7 +10,7 @@ import ( var log = util.Logger("dagwriter") type DagWriter struct { - dagserv *dag.DAGService + dagserv dag.DAGService node *dag.Node totalSize int64 splChan chan []byte @@ -19,7 +19,7 @@ type DagWriter struct { seterr error } -func NewDagWriter(ds *dag.DAGService, splitter chunk.BlockSplitter) *DagWriter { +func NewDagWriter(ds dag.DAGService, splitter chunk.BlockSplitter) *DagWriter { dw := new(DagWriter) dw.dagserv = ds dw.splChan = make(chan []byte, 8) diff --git a/unixfs/io/dagwriter_test.go b/unixfs/io/dagwriter_test.go index d0b8f45d16..08779e2c1f 100644 --- a/unixfs/io/dagwriter_test.go +++ b/unixfs/io/dagwriter_test.go @@ -7,6 +7,7 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" bs "github.com/jbenet/go-ipfs/blockservice" + "github.com/jbenet/go-ipfs/importer" chunk "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" ) @@ -53,7 +54,7 @@ func TestDagWriter(t *testing.T) { if err != nil { t.Fatal(err) } - dag := &mdag.DAGService{Blocks: bserv} + dag := mdag.NewDAGService(bserv) dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) nbytes := int64(1024 * 1024 * 2) @@ -87,7 +88,7 @@ func TestMassiveWrite(t *testing.T) { if err != nil { t.Fatal(err) } - dag := &mdag.DAGService{Blocks: bserv} + dag := mdag.NewDAGService(bserv) dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) nbytes := int64(1024 * 1024 * 1024 * 16) @@ -107,7 +108,7 @@ func BenchmarkDagWriter(b *testing.B) { if err != nil { b.Fatal(err) } - dag := &mdag.DAGService{Blocks: bserv} + dag := mdag.NewDAGService(bserv) b.ResetTimer() nbytes := int64(100000) @@ -125,3 +126,45 @@ func BenchmarkDagWriter(b *testing.B) { } } + +func TestAgainstImporter(t *testing.T) { + dstore := ds.NewMapDatastore() + bserv, err := bs.NewBlockService(dstore, nil) + if err != nil { + t.Fatal(err) + } + dag := mdag.NewDAGService(bserv) + + nbytes := int64(1024 * 1024 * 2) + + // DagWriter + dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + n, err := io.CopyN(dw, &datasource{}, nbytes) + if err != nil { + t.Fatal(err) + } + if n != nbytes { + t.Fatal("Copied incorrect amount of bytes!") + } + + dw.Close() + dwNode := dw.GetNode() + dwKey, err := dwNode.Key() + if err != nil { + t.Fatal(err) + } + + // DagFromFile + rl := &io.LimitedReader{&datasource{}, nbytes} + + dffNode, err := importer.NewDagFromReaderWithSplitter(rl, &chunk.SizeSplitter{4096}) + dffKey, err := dffNode.Key() + if err != nil { + t.Fatal(err) + } + if dwKey.String() != dffKey.String() { + t.Errorf("\nDagWriter produced %s\n"+ + "DagFromReader produced %s", + dwKey, dffKey) + } +} From 71a0e94a047bbca55acf8a576753040dfbeea5e6 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sat, 25 Oct 2014 22:15:19 -0400 Subject: [PATCH 0279/3147] convert DAGService to an interface This commit was moved from ipfs/go-ipfs-pinner@9ddd1b6f52856a121d9d17a55b83a528d3c76cc3 --- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index b9c509a034..a3f0e260b6 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -32,11 +32,11 @@ type pinner struct { recursePin set.BlockSet directPin set.BlockSet indirPin *indirectPin - dserv *mdag.DAGService + dserv mdag.DAGService dstore ds.Datastore } -func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { +func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner { // Load set from given datastore... rcds := nsds.Wrap(dstore, recursePinDatastoreKey) @@ -151,7 +151,7 @@ func (p *pinner) IsPinned(key util.Key) bool { p.indirPin.HasKey(key) } -func LoadPinner(d ds.Datastore, dserv *mdag.DAGService) (Pinner, error) { +func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) { // load recursive set diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 8f6f6c343b..7bf0756df5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -24,7 +24,7 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - dserv := &mdag.DAGService{Blocks: bserv} + dserv := mdag.NewDAGService(bserv) p := NewPinner(dstore, dserv) From faa98bc1f15b6a8eada3f84bd45c48b22ef12fd4 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sat, 25 Oct 2014 22:15:19 -0400 Subject: [PATCH 0280/3147] convert DAGService to an interface This commit was moved from ipfs/go-path@6b883e0689daa4c1ffb026db5dfe1db07a8c0d7f --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index 03c1a481e5..cb1061d118 100644 --- a/path/path.go +++ b/path/path.go @@ -15,7 +15,7 @@ var log = u.Logger("path") // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. type Resolver struct { - DAG *merkledag.DAGService + DAG merkledag.DAGService } // ResolvePath fetches the node for given path. It uses the first From 04101214bf1925a3cd9c1f36090e8b9ccb2b141d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 04:44:20 -0700 Subject: [PATCH 0281/3147] net/service now uses ctxcloser This commit was moved from ipfs/go-ipfs-routing@2956770389b90a53c2f4a76747893ca0a674087e --- routing/dht/dht_test.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 507db4eec5..ef13f03672 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -23,11 +23,7 @@ import ( func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { peerstore := peer.NewPeerstore() - dhts := netservice.NewService(nil) // nil handler for now, need to patch it - if err := dhts.Start(ctx); err != nil { - t.Fatal(err) - } - + dhts := netservice.NewService(ctx, nil) // nil handler for now, need to patch it net, err := inet.NewIpfsNetwork(ctx, p, peerstore, &mux.ProtocolMap{ mux.ProtocolID_Routing: dhts, }) From 6c651385e47d34fa2975d8292d847df8a47b30fa Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 07:12:01 -0700 Subject: [PATCH 0282/3147] dht ctxcloserify This commit was moved from ipfs/go-ipfs-routing@c2d23b197fef1e87f7309186bad3ae704874c633 --- routing/dht/dht.go | 15 ++++++++++----- routing/dht/dht_test.go | 20 ++++++++++---------- routing/dht/handlers.go | 6 ------ routing/dht/providers.go | 24 ++++++++++++++++-------- routing/dht/providers_test.go | 7 +++++-- 5 files changed, 41 insertions(+), 31 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index fdb9f96f22..76cde7fb54 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,6 +14,7 @@ import ( pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" + ctxc "github.com/jbenet/go-ipfs/util/ctxcloser" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -56,7 +57,7 @@ type IpfsDHT struct { //lock to make diagnostics work better diaglock sync.Mutex - ctx context.Context + ctxc.ContextCloser } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -67,9 +68,10 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia dht.datastore = dstore dht.self = p dht.peerstore = ps - dht.ctx = ctx + dht.ContextCloser = ctxc.NewContextCloser(ctx, nil) - dht.providers = NewProviderManager(p.ID()) + dht.providers = NewProviderManager(dht.Context(), p.ID()) + dht.AddCloserChild(dht.providers) dht.routingTables = make([]*kb.RoutingTable, 3) dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Millisecond*1000) @@ -78,6 +80,7 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia dht.birth = time.Now() if doPinging { + dht.Children().Add(1) go dht.PingRoutine(time.Second * 10) } return dht @@ -516,6 +519,8 @@ func (dht *IpfsDHT) loadProvidableKeys() error { // PingRoutine periodically pings nearest neighbors. func (dht *IpfsDHT) PingRoutine(t time.Duration) { + defer dht.Children().Done() + tick := time.Tick(t) for { select { @@ -524,13 +529,13 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { rand.Read(id) peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(u.Key(id)), 5) for _, p := range peers { - ctx, _ := context.WithTimeout(dht.ctx, time.Second*5) + ctx, _ := context.WithTimeout(dht.Context(), time.Second*5) err := dht.Ping(ctx, p) if err != nil { log.Errorf("Ping error: %s", err) } } - case <-dht.ctx.Done(): + case <-dht.Closing(): return } } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index ef13f03672..2b87323381 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -92,8 +92,8 @@ func TestPing(t *testing.T) { dhtA := setupDHT(ctx, t, peerA) dhtB := setupDHT(ctx, t, peerB) - defer dhtA.Halt() - defer dhtB.Halt() + defer dhtA.Close() + defer dhtB.Close() defer dhtA.dialer.(inet.Network).Close() defer dhtB.dialer.(inet.Network).Close() @@ -136,8 +136,8 @@ func TestValueGetSet(t *testing.T) { dhtA := setupDHT(ctx, t, peerA) dhtB := setupDHT(ctx, t, peerB) - defer dhtA.Halt() - defer dhtB.Halt() + defer dhtA.Close() + defer dhtB.Close() defer dhtA.dialer.(inet.Network).Close() defer dhtB.dialer.(inet.Network).Close() @@ -179,7 +179,7 @@ func TestProvides(t *testing.T) { _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { - dhts[i].Halt() + dhts[i].Close() defer dhts[i].dialer.(inet.Network).Close() } }() @@ -239,7 +239,7 @@ func TestProvidesAsync(t *testing.T) { _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { - dhts[i].Halt() + dhts[i].Close() defer dhts[i].dialer.(inet.Network).Close() } }() @@ -302,7 +302,7 @@ func TestLayeredGet(t *testing.T) { _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { - dhts[i].Halt() + dhts[i].Close() defer dhts[i].dialer.(inet.Network).Close() } }() @@ -355,7 +355,7 @@ func TestFindPeer(t *testing.T) { _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { - dhts[i].Halt() + dhts[i].Close() dhts[i].dialer.(inet.Network).Close() } }() @@ -443,8 +443,8 @@ func TestConnectCollision(t *testing.T) { t.Fatal("Timeout received!") } - dhtA.Halt() - dhtB.Halt() + dhtA.Close() + dhtB.Close() dhtA.dialer.(inet.Network).Close() dhtB.dialer.(inet.Network).Close() diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index d5db8d1da9..fe628eeef5 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -205,9 +205,3 @@ func (dht *IpfsDHT) handleAddProvider(p peer.Peer, pmes *pb.Message) (*pb.Messag return pmes, nil // send back same msg as confirmation. } - -// Halt stops all communications from this peer and shut down -// TODO -- remove this in favor of context -func (dht *IpfsDHT) Halt() { - dht.providers.Halt() -} diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 204fdf7d5d..f7d491d6a7 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -5,6 +5,9 @@ import ( peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" + ctxc "github.com/jbenet/go-ipfs/util/ctxcloser" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) type ProviderManager struct { @@ -14,8 +17,8 @@ type ProviderManager struct { getlocal chan chan []u.Key newprovs chan *addProv getprovs chan *getProv - halt chan struct{} period time.Duration + ctxc.ContextCloser } type addProv struct { @@ -28,19 +31,24 @@ type getProv struct { resp chan []peer.Peer } -func NewProviderManager(local peer.ID) *ProviderManager { +func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { pm := new(ProviderManager) pm.getprovs = make(chan *getProv) pm.newprovs = make(chan *addProv) pm.providers = make(map[u.Key][]*providerInfo) pm.getlocal = make(chan chan []u.Key) pm.local = make(map[u.Key]struct{}) - pm.halt = make(chan struct{}) + pm.ContextCloser = ctxc.NewContextCloser(ctx, nil) + + pm.Children().Add(1) go pm.run() + return pm } func (pm *ProviderManager) run() { + defer pm.Children().Done() + tick := time.NewTicker(time.Hour) for { select { @@ -53,6 +61,7 @@ func (pm *ProviderManager) run() { pi.Value = np.val arr := pm.providers[np.k] pm.providers[np.k] = append(arr, pi) + case gp := <-pm.getprovs: var parr []peer.Peer provs := pm.providers[gp.k] @@ -60,12 +69,14 @@ func (pm *ProviderManager) run() { parr = append(parr, p.Value) } gp.resp <- parr + case lc := <-pm.getlocal: var keys []u.Key for k, _ := range pm.local { keys = append(keys, k) } lc <- keys + case <-tick.C: for k, provs := range pm.providers { var filtered []*providerInfo @@ -76,7 +87,8 @@ func (pm *ProviderManager) run() { } pm.providers[k] = filtered } - case <-pm.halt: + + case <-pm.Closing(): return } } @@ -102,7 +114,3 @@ func (pm *ProviderManager) GetLocal() []u.Key { pm.getlocal <- resp return <-resp } - -func (pm *ProviderManager) Halt() { - pm.halt <- struct{}{} -} diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index b37327d2e7..c4ae53910a 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -5,16 +5,19 @@ import ( "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) func TestProviderManager(t *testing.T) { + ctx := context.Background() mid := peer.ID("testing") - p := NewProviderManager(mid) + p := NewProviderManager(ctx, mid) a := u.Key("test") p.AddProvider(a, peer.WithIDString("testingprovider")) resp := p.GetProviders(a) if len(resp) != 1 { t.Fatal("Could not retrieve provider.") } - p.Halt() + p.Close() } From 88d4980082556cba9950e85014137e616d05154a Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 28 Oct 2014 01:06:28 -0700 Subject: [PATCH 0283/3147] feat(routing) define routing.ErrNotFound This commit was moved from ipfs/go-ipfs-routing@a8e81896dece625084e057b479cdc43888ae0720 --- routing/routing.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/routing/routing.go b/routing/routing.go index cb60e5ee8a..7f0486c763 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -1,12 +1,17 @@ package routing import ( + "errors" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" ) +// ErrNotFound is returned when a search fails to find anything +var ErrNotFound = errors.New("routing: key not found") + // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { From 370fec30b5e90a90ed549fb0e9b120ff0ec3b68b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 28 Oct 2014 02:17:46 -0700 Subject: [PATCH 0284/3147] refactor(routing) use routing.ErrNotFound This commit was moved from ipfs/go-ipfs-routing@5d5a205f0fb9763857215d690324de507f657037 --- routing/dht/dht.go | 7 ++++--- routing/dht/ext_test.go | 7 ++++--- routing/dht/query.go | 3 ++- routing/dht/routing.go | 5 +++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 76cde7fb54..f1c4227215 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -11,6 +11,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" msg "github.com/jbenet/go-ipfs/net/message" peer "github.com/jbenet/go-ipfs/peer" + routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" @@ -288,8 +289,8 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, return nil, peers, nil } - log.Warning("getValueOrPeers: u.ErrNotFound") - return nil, nil, u.ErrNotFound + log.Warning("getValueOrPeers: routing.ErrNotFound") + return nil, nil, routing.ErrNotFound } // getValueSingle simply performs the get value RPC with the given parameters @@ -326,7 +327,7 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, return value, nil } } - return nil, u.ErrNotFound + return nil, routing.ErrNotFound } // getLocal attempts to retrieve the value from the datastore diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index be6f17d96e..77684db285 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -12,6 +12,7 @@ import ( msg "github.com/jbenet/go-ipfs/net/message" mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" @@ -145,7 +146,7 @@ func TestGetFailures(t *testing.T) { ctx2, _ := context.WithTimeout(context.Background(), time.Second) _, err = d.GetValue(ctx2, u.Key("test")) if err != nil { - if err != u.ErrNotFound { + if err != routing.ErrNotFound { t.Fatalf("Expected ErrNotFound, got: %s", err) } } else { @@ -247,7 +248,7 @@ func TestNotFound(t *testing.T) { log.Debug("get value got %v", v) if err != nil { switch err { - case u.ErrNotFound: + case routing.ErrNotFound: //Success! return case u.ErrTimeout: @@ -311,7 +312,7 @@ func TestLessThanKResponses(t *testing.T) { _, err := d.GetValue(ctx, u.Key("hello")) if err != nil { switch err { - case u.ErrNotFound: + case routing.ErrNotFound: //Success! return case u.ErrTimeout: diff --git a/routing/dht/query.go b/routing/dht/query.go index d15e939b7b..48974b8eb0 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -6,6 +6,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" queue "github.com/jbenet/go-ipfs/peer/queue" + "github.com/jbenet/go-ipfs/routing" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" todoctr "github.com/jbenet/go-ipfs/util/todocounter" @@ -128,7 +129,7 @@ func (r *dhtQueryRunner) Run(peers []peer.Peer) (*dhtQueryResult, error) { // so workers are working. // wait until they're done. - err := u.ErrNotFound + err := routing.ErrNotFound select { case <-r.peersRemaining.Done(): diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 64a7edbd65..44edd99a7a 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -6,6 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" peer "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" @@ -89,7 +90,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { log.Debugf("GetValue %v %v", key, result.value) if result.value == nil { - return nil, u.ErrNotFound + return nil, routing.ErrNotFound } return result.value, nil @@ -248,7 +249,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) log.Debug("FindPeer %v %v", id, result.success) if result.peer == nil { - return nil, u.ErrNotFound + return nil, routing.ErrNotFound } return result.peer, nil From e9731cf5841ae9fa1d3350323fdc18450c0fe419 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 28 Oct 2014 05:12:54 -0700 Subject: [PATCH 0285/3147] style(routing) message This commit was moved from ipfs/go-ipfs-routing@83c4c52375a3e8f367c29ec45a2c580b7b43705f --- routing/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/routing.go b/routing/routing.go index 7f0486c763..3ef3818563 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -10,7 +10,7 @@ import ( ) // ErrNotFound is returned when a search fails to find anything -var ErrNotFound = errors.New("routing: key not found") +var ErrNotFound = errors.New("routing: not found") // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. From 5f16d340e81da472fef127f46df57668114d2031 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 28 Oct 2014 02:22:32 -0700 Subject: [PATCH 0286/3147] refactor(namesys) use one-off error This commit was moved from ipfs/go-namesys@bb2d064a7d4a964e9332b6723d411ef5b72ca9cd --- namesys/dns.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 66448511f8..655e910b86 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -1,13 +1,12 @@ package namesys import ( + "fmt" "net" b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - - u "github.com/jbenet/go-ipfs/util" ) // DNSResolver implements a Resolver on DNS domains @@ -44,5 +43,5 @@ func (r *DNSResolver) Resolve(name string) (string, error) { return t, nil } - return "", u.ErrNotFound + return "", fmt.Errorf("namesys: %v not found", name) } From 432220b5718137eb148126a988a6a9bfd7d44ff6 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 28 Oct 2014 02:19:09 -0700 Subject: [PATCH 0287/3147] refactor(blockservice) export blockservice.ErrNotFound This commit was moved from ipfs/go-blockservice@cad00db618039b117a4291a066aedc019ad911ee --- blockservice/blockservice.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index acb6564ed6..54a992cdb6 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -1,6 +1,7 @@ package blockservice import ( + "errors" "fmt" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -13,6 +14,7 @@ import ( ) var log = u.Logger("blockservice") +var ErrNotFound = errors.New("blockservice: key not found") // BlockService is a block datastore. // It uses an internal `datastore.Datastore` instance to store values. @@ -73,7 +75,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er return blk, nil } else { log.Debug("Blockservice GetBlock: Not found.") - return nil, u.ErrNotFound + return nil, ErrNotFound } } From 1153a69c8a0cf3f5bf10a0ea28063834da331474 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 28 Oct 2014 15:40:26 -0700 Subject: [PATCH 0288/3147] fix(namesys, merkledag) use static error This commit was moved from ipfs/go-namesys@598418c73294f9e14da6760b13d589d821afd849 --- namesys/dns.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index 655e910b86..847ed06701 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -9,6 +9,8 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ) +var ErrNotFound = fmt.Errorf("namesys: name not found") + // DNSResolver implements a Resolver on DNS domains type DNSResolver struct { // TODO: maybe some sort of caching? @@ -43,5 +45,5 @@ func (r *DNSResolver) Resolve(name string) (string, error) { return t, nil } - return "", fmt.Errorf("namesys: %v not found", name) + return "", ErrNotFound } From 7d4465f6352b0dfff2230cf327b7bdaf2aa0646e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 28 Oct 2014 15:41:49 -0700 Subject: [PATCH 0289/3147] fix(namesys) use the error that already exists This commit was moved from ipfs/go-namesys@e9ca88894c799696d19712e94231b99154c36f98 --- namesys/dns.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 847ed06701..881979930a 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -1,7 +1,6 @@ package namesys import ( - "fmt" "net" b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" @@ -9,8 +8,6 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ) -var ErrNotFound = fmt.Errorf("namesys: name not found") - // DNSResolver implements a Resolver on DNS domains type DNSResolver struct { // TODO: maybe some sort of caching? @@ -45,5 +42,5 @@ func (r *DNSResolver) Resolve(name string) (string, error) { return t, nil } - return "", ErrNotFound + return "", ErrResolveFailed } From 66c5bdfca6220a50a06a1a30ae85bc5619833c58 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 30 Oct 2014 03:13:08 +0000 Subject: [PATCH 0290/3147] rewrite add command to use dagwriter, moved a pinner into the dagwriter for inline pinning This commit was moved from ipfs/go-unixfs@bdef3a1fb5e91875fdf4130907594b462caa9b08 --- unixfs/io/dagwriter.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dagwriter.go b/unixfs/io/dagwriter.go index c9b91cc589..6575b1edff 100644 --- a/unixfs/io/dagwriter.go +++ b/unixfs/io/dagwriter.go @@ -3,6 +3,7 @@ package io import ( "github.com/jbenet/go-ipfs/importer/chunk" dag "github.com/jbenet/go-ipfs/merkledag" + "github.com/jbenet/go-ipfs/pin" ft "github.com/jbenet/go-ipfs/unixfs" "github.com/jbenet/go-ipfs/util" ) @@ -17,6 +18,7 @@ type DagWriter struct { done chan struct{} splitter chunk.BlockSplitter seterr error + Pinner pin.ManualPinner } func NewDagWriter(ds dag.DAGService, splitter chunk.BlockSplitter) *DagWriter { @@ -48,7 +50,10 @@ func (dw *DagWriter) startSplitter() { // Store the block size in the root node mbf.AddBlockSize(uint64(len(blkData))) node := &dag.Node{Data: ft.WrapData(blkData)} - _, err := dw.dagserv.Add(node) + nk, err := dw.dagserv.Add(node) + if dw.Pinner != nil { + dw.Pinner.PinWithMode(nk, pin.Indirect) + } if err != nil { dw.seterr = err log.Critical("Got error adding created node to dagservice: %s", err) @@ -75,12 +80,15 @@ func (dw *DagWriter) startSplitter() { root.Data = data // Add root node to the dagservice - _, err = dw.dagserv.Add(root) + rootk, err := dw.dagserv.Add(root) if err != nil { dw.seterr = err log.Critical("Got error adding created node to dagservice: %s", err) return } + if dw.Pinner != nil { + dw.Pinner.PinWithMode(rootk, pin.Recursive) + } dw.node = root dw.done <- struct{}{} } From c90ceab717535c6abc3368f074235eebc0f858dd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 30 Oct 2014 03:13:08 +0000 Subject: [PATCH 0291/3147] rewrite add command to use dagwriter, moved a pinner into the dagwriter for inline pinning This commit was moved from ipfs/go-ipfs-pinner@e3ac58db178603cd642a06f61706b1ccd6606d7c --- pinning/pinner/pin.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index a3f0e260b6..dba14a9775 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -20,6 +20,14 @@ var recursePinDatastoreKey = ds.NewKey("/local/pins/recursive/keys") var directPinDatastoreKey = ds.NewKey("/local/pins/direct/keys") var indirectPinDatastoreKey = ds.NewKey("/local/pins/indirect/keys") +type PinMode int + +const ( + Recursive PinMode = iota + Direct + Indirect +) + type Pinner interface { IsPinned(util.Key) bool Pin(*mdag.Node, bool) error @@ -27,6 +35,13 @@ type Pinner interface { Flush() error } +// ManualPinner is for manually editing the pin structure +// Use with care +type ManualPinner interface { + PinWithMode(util.Key, PinMode) + Pinner +} + type pinner struct { lock sync.RWMutex recursePin set.BlockSet @@ -228,3 +243,14 @@ func loadSet(d ds.Datastore, k ds.Key, val interface{}) error { } return json.Unmarshal(bf, val) } + +func (p *pinner) PinWithMode(k util.Key, mode PinMode) { + switch mode { + case Recursive: + p.recursePin.AddBlock(k) + case Direct: + p.directPin.AddBlock(k) + case Indirect: + p.indirPin.Increment(k) + } +} From caf8cc647440da014413d43239cb17599ac5e30d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 30 Oct 2014 01:17:26 -0700 Subject: [PATCH 0292/3147] fix tests (circular import) This commit was moved from ipfs/go-unixfs@6c1301d7ddf0c565a2aefcff2fd5121c1ff36445 --- unixfs/io/dagwriter_test.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/unixfs/io/dagwriter_test.go b/unixfs/io/dagwriter_test.go index 08779e2c1f..edb4a0a70b 100644 --- a/unixfs/io/dagwriter_test.go +++ b/unixfs/io/dagwriter_test.go @@ -1,4 +1,4 @@ -package io +package io_test import ( "testing" @@ -7,9 +7,10 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" bs "github.com/jbenet/go-ipfs/blockservice" - "github.com/jbenet/go-ipfs/importer" + importer "github.com/jbenet/go-ipfs/importer" chunk "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" + dagio "github.com/jbenet/go-ipfs/unixfs/io" ) type datasource struct { @@ -55,7 +56,7 @@ func TestDagWriter(t *testing.T) { t.Fatal(err) } dag := mdag.NewDAGService(bserv) - dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) + dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) nbytes := int64(1024 * 1024 * 2) n, err := io.CopyN(dw, &datasource{}, nbytes) @@ -70,7 +71,7 @@ func TestDagWriter(t *testing.T) { dw.Close() node := dw.GetNode() - read, err := NewDagReader(node, dag) + read, err := dagio.NewDagReader(node, dag) if err != nil { t.Fatal(err) } @@ -89,7 +90,7 @@ func TestMassiveWrite(t *testing.T) { t.Fatal(err) } dag := mdag.NewDAGService(bserv) - dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) + dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) nbytes := int64(1024 * 1024 * 1024 * 16) n, err := io.CopyN(dw, &datasource{}, nbytes) @@ -114,7 +115,7 @@ func BenchmarkDagWriter(b *testing.B) { nbytes := int64(100000) for i := 0; i < b.N; i++ { b.SetBytes(nbytes) - dw := NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) + dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) n, err := io.CopyN(dw, &datasource{}, nbytes) if err != nil { b.Fatal(err) @@ -138,7 +139,7 @@ func TestAgainstImporter(t *testing.T) { nbytes := int64(1024 * 1024 * 2) // DagWriter - dw := NewDagWriter(dag, &chunk.SizeSplitter{4096}) + dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{4096}) n, err := io.CopyN(dw, &datasource{}, nbytes) if err != nil { t.Fatal(err) From 88c7308df4b47937807887cbbae20079ca2cb553 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 30 Oct 2014 01:54:50 -0700 Subject: [PATCH 0293/3147] blockservice: dont write blocks twice If the datastore has a value for the key, we already have the block. We should not write it again. This will make redundant writes much faster. At the moment, a datastore.Has on leveldb is a GetBackedHas. Track https://github.com/jbenet/go-datastore/issues/6 This commit was moved from ipfs/go-blockservice@3ba5be4871fbde34f4eb57d8c8993c44bb1c3d4a --- blockservice/blockservice.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 54a992cdb6..c3c3868f29 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -40,10 +40,21 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { log.Debug("blockservice: storing [%s] in datastore", k) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter - err := s.Datastore.Put(k.DsKey(), b.Data) + + // check if we have it before adding. this is an extra read, but large writes + // are more expensive. + // TODO(jbenet) cheaper has. https://github.com/jbenet/go-datastore/issues/6 + has, err := s.Datastore.Has(k.DsKey()) if err != nil { return k, err } + if !has { + err := s.Datastore.Put(k.DsKey(), b.Data) + if err != nil { + return k, err + } + } + if s.Remote != nil { ctx := context.TODO() err = s.Remote.HasBlock(ctx, *b) From 9e5b3d6ed0d4c18ad85ece3ae6ac5e9a71c51072 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 30 Oct 2014 02:01:27 -0700 Subject: [PATCH 0294/3147] blockservice: signal add optimization This commit was moved from ipfs/go-blockservice@4040913e75826f772d26ab836d247f238fc2a9a7 --- blockservice/blockservice.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index c3c3868f29..edfaa11faa 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -37,7 +37,6 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err // AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() - log.Debug("blockservice: storing [%s] in datastore", k) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter @@ -48,7 +47,10 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { if err != nil { return k, err } - if !has { + if has { + log.Debugf("blockservice: storing [%s] in datastore (already stored)", k) + } else { + log.Debugf("blockservice: storing [%s] in datastore", k) err := s.Datastore.Put(k.DsKey(), b.Data) if err != nil { return k, err From 7d302de27393119f2c3929d6a0acb8d115ef64b0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 30 Oct 2014 02:49:39 -0700 Subject: [PATCH 0295/3147] test splitting is deterministic. (it is) This commit was moved from ipfs/go-ipfs-chunker@f3c9cf6af38ecf4a9fad243cac7ca56e712cc774 --- chunker/splitting_test.go | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 chunker/splitting_test.go diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go new file mode 100644 index 0000000000..0ecb143cbd --- /dev/null +++ b/chunker/splitting_test.go @@ -0,0 +1,53 @@ +package chunk + +import ( + "bytes" + "crypto/rand" + "testing" +) + +func randBuf(t *testing.T, size int) []byte { + buf := make([]byte, size) + if _, err := rand.Read(buf); err != nil { + t.Fatal("failed to read enough randomness") + } + return buf +} + +func copyBuf(buf []byte) []byte { + cpy := make([]byte, len(buf)) + copy(cpy, buf) + return cpy +} + +func TestSizeSplitterIsDeterministic(t *testing.T) { + + test := func() { + bufR := randBuf(t, 10000000) // crank this up to satisfy yourself. + bufA := copyBuf(bufR) + bufB := copyBuf(bufR) + + chunksA := DefaultSplitter.Split(bytes.NewReader(bufA)) + chunksB := DefaultSplitter.Split(bytes.NewReader(bufB)) + + for n := 0; ; n++ { + a, moreA := <-chunksA + b, moreB := <-chunksB + + if !moreA { + if moreB { + t.Fatal("A ended, B didnt.") + } + return + } + + if !bytes.Equal(a, b) { + t.Fatalf("chunk %d not equal", n) + } + } + } + + for run := 0; run < 1; run++ { // crank this up to satisfy yourself. + test() + } +} From 42bafa0b2f76f3d4d1744000b4beb29cc8567b74 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 30 Oct 2014 04:14:05 -0700 Subject: [PATCH 0296/3147] util: remove broken rand This commit was moved from ipfs/go-ipfs-pinner@f0c4a2c1b6b937f3fd3df6841fa4516f4b1958cd --- pinning/pinner/pin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 7bf0756df5..1ea302823c 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -12,7 +12,7 @@ import ( func randNode() (*mdag.Node, util.Key) { nd := new(mdag.Node) nd.Data = make([]byte, 32) - util.NewFastRand().Read(nd.Data) + util.NewTimeSeededRand().Read(nd.Data) k, _ := nd.Key() return nd, k } From 448bc7c685da53e88a82e1faf8e82bd6a65cb3ed Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 30 Oct 2014 04:14:05 -0700 Subject: [PATCH 0297/3147] util: remove broken rand This commit was moved from ipfs/go-unixfs@1e82bae96701443075e1e15a1b346da51d6359d6 --- unixfs/io/dagmodifier_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index d45559b3ad..edb4d6f762 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -28,7 +28,7 @@ func getMockDagServ(t *testing.T) mdag.DAGService { func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { dw := NewDagWriter(dserv, &chunk.SizeSplitter{500}) - n, err := io.CopyN(dw, u.NewFastRand(), size) + n, err := io.CopyN(dw, u.NewTimeSeededRand(), size) if err != nil { t.Fatal(err) } @@ -58,7 +58,7 @@ func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Nod func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { newdata := make([]byte, size) - r := u.NewFastRand() + r := u.NewTimeSeededRand() r.Read(newdata) if size+beg > uint64(len(orig)) { @@ -160,7 +160,7 @@ func TestMultiWrite(t *testing.T) { } data := make([]byte, 4000) - u.NewFastRand().Read(data) + u.NewTimeSeededRand().Read(data) for i := 0; i < len(data); i++ { n, err := dagmod.WriteAt(data[i:i+1], uint64(i)) @@ -201,7 +201,7 @@ func TestMultiWriteCoal(t *testing.T) { } data := make([]byte, 4000) - u.NewFastRand().Read(data) + u.NewTimeSeededRand().Read(data) for i := 0; i < len(data); i++ { n, err := dagmod.WriteAt(data[:i+1], 0) From 893b01ff37f143b1ae682af0779d947a8d6c6c29 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 30 Oct 2014 05:42:18 -0700 Subject: [PATCH 0298/3147] make vendor cc @whyrusleeping This commit was moved from ipfs/go-blockservice@dfe4cc91d032c52a46001f274fb88368ddf9286f --- blockservice/blocks_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 69a62d3223..1e837eb5d2 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "code.google.com/p/go.net/context" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" blocks "github.com/jbenet/go-ipfs/blocks" From 12bef3d4fe0265192e8be0f2981262362ee99b25 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 30 Oct 2014 06:35:29 -0700 Subject: [PATCH 0299/3147] fix(all) log.Debug -> log.Debugf This commit was moved from ipfs/go-ipfs-routing@140c8948cc76084a2158a53008b954883290937c --- routing/dht/ext_test.go | 2 +- routing/dht/query.go | 20 ++++++++++---------- routing/dht/routing.go | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 77684db285..19275338da 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -245,7 +245,7 @@ func TestNotFound(t *testing.T) { ctx, _ = context.WithTimeout(ctx, time.Second*5) v, err := d.GetValue(ctx, u.Key("hello")) - log.Debug("get value got %v", v) + log.Debugf("get value got %v", v) if err != nil { switch err { case routing.ErrNotFound: diff --git a/routing/dht/query.go b/routing/dht/query.go index 48974b8eb0..cd9fae98c0 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -107,7 +107,7 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { } func (r *dhtQueryRunner) Run(peers []peer.Peer) (*dhtQueryResult, error) { - log.Debug("Run query with %d peers.", len(peers)) + log.Debugf("Run query with %d peers.", len(peers)) if len(peers) == 0 { log.Warning("Running query with no peers!") return nil, nil @@ -176,7 +176,7 @@ func (r *dhtQueryRunner) addPeerToQuery(next peer.Peer, benchmark peer.Peer) { r.peersSeen[next.Key()] = next r.Unlock() - log.Debug("adding peer to query: %v\n", next) + log.Debugf("adding peer to query: %v\n", next) // do this after unlocking to prevent possible deadlocks. r.peersRemaining.Increment(1) @@ -200,14 +200,14 @@ func (r *dhtQueryRunner) spawnWorkers() { if !more { return // channel closed. } - log.Debug("spawning worker for: %v\n", p) + log.Debugf("spawning worker for: %v\n", p) go r.queryPeer(p) } } } func (r *dhtQueryRunner) queryPeer(p peer.Peer) { - log.Debug("spawned worker for: %v\n", p) + log.Debugf("spawned worker for: %v\n", p) // make sure we rate limit concurrency. select { @@ -218,12 +218,12 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { } // ok let's do this! - log.Debug("running worker for: %v", p) + log.Debugf("running worker for: %v", p) // make sure we do this when we exit defer func() { // signal we're done proccessing peer p - log.Debug("completing worker for: %v", p) + log.Debugf("completing worker for: %v", p) r.peersRemaining.Decrement(1) r.rateLimit <- struct{}{} }() @@ -232,7 +232,7 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { // (Incidentally, this will add it to the peerstore too) err := r.query.dialer.DialPeer(p) if err != nil { - log.Debug("ERROR worker for: %v -- err connecting: %v", p, err) + log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) r.Lock() r.errs = append(r.errs, err) r.Unlock() @@ -243,20 +243,20 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { res, err := r.query.qfunc(r.ctx, p) if err != nil { - log.Debug("ERROR worker for: %v %v", p, err) + log.Debugf("ERROR worker for: %v %v", p, err) r.Lock() r.errs = append(r.errs, err) r.Unlock() } else if res.success { - log.Debug("SUCCESS worker for: %v", p, res) + log.Debugf("SUCCESS worker for: %v", p, res) r.Lock() r.result = res r.Unlock() r.cancel() // signal to everyone that we're done. } else if res.closerPeers != nil { - log.Debug("PEERS CLOSER -- worker for: %v\n", p) + log.Debugf("PEERS CLOSER -- worker for: %v\n", p) for _, next := range res.closerPeers { r.addPeerToQuery(next, p) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 44edd99a7a..da400fee28 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -247,7 +247,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) return nil, err } - log.Debug("FindPeer %v %v", id, result.success) + log.Debugf("FindPeer %v %v", id, result.success) if result.peer == nil { return nil, routing.ErrNotFound } From a5bbd9089f0258c80d6aa8beb8a163c1f0407489 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 30 Oct 2014 06:35:29 -0700 Subject: [PATCH 0300/3147] fix(all) log.Debug -> log.Debugf This commit was moved from ipfs/go-ipfs-pinner@9780fd9b9bf7c27335fae28b112d07ae6b1919b5 --- pinning/pinner/indirect.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 2eb303de2b..b15b720ee7 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -32,7 +32,7 @@ func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { keys = append(keys, k) refcnt[k] = v } - log.Debug("indirPin keys: %#v", keys) + log.Debugf("indirPin keys: %#v", keys) return &indirectPin{blockset: set.SimpleSetFromKeys(keys), refCounts: refcnt}, nil } From 1913d3bda0792e344c485b0dd0aeb9ed8b8a8eb7 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 30 Oct 2014 06:35:29 -0700 Subject: [PATCH 0301/3147] fix(all) log.Debug -> log.Debugf This commit was moved from ipfs/go-namesys@a36cbad76c634b1144c2eb5e4f8e5fc6378eb9e4 --- namesys/publisher.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 7203fb1d4a..d95f1cbbcf 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -27,7 +27,7 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { // Publish implements Publisher. Accepts a keypair and a value, func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { - log.Debug("namesys: Publish %s", value) + log.Debugf("namesys: Publish %s", value) // validate `value` is a ref (multihash) _, err := mh.FromB58String(value) diff --git a/namesys/routing.go b/namesys/routing.go index ce1755f692..6259705ec9 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -35,7 +35,7 @@ func (r *routingResolver) CanResolve(name string) bool { // Resolve implements Resolver. Uses the IPFS routing system to resolve SFS-like // names. func (r *routingResolver) Resolve(name string) (string, error) { - log.Debug("RoutingResolve: '%s'", name) + log.Debugf("RoutingResolve: '%s'", name) ctx := context.TODO() hash, err := mh.FromB58String(name) if err != nil { From f6a3cd9101d9dd35e7b28517768b33f99d742151 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 30 Oct 2014 06:35:29 -0700 Subject: [PATCH 0302/3147] fix(all) log.Debug -> log.Debugf This commit was moved from ipfs/go-path@2aaa8dc3612cca588b3c81bb55ceadf1999eac23 --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index cb1061d118..8d3070a0ee 100644 --- a/path/path.go +++ b/path/path.go @@ -22,7 +22,7 @@ type Resolver struct { // path component as a hash (key) of the first node, then resolves // all other components walking the links, with ResolveLinks. func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { - log.Debug("Resolve: '%s'", fpath) + log.Debugf("Resolve: '%s'", fpath) fpath = path.Clean(fpath) parts := strings.Split(fpath, "/") From d63817341be4f9b753a2acac90e98fc536be5d95 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 30 Oct 2014 16:34:52 +0000 Subject: [PATCH 0303/3147] fix bug where terminal would randomly become garbled binary crap This commit was moved from ipfs/go-ipfs-routing@5eff2297985049beb39f3a1ce5856777c78f0506 --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f1c4227215..e76ab571cf 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -240,7 +240,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) er return err } - log.Debugf("%s putProvider: %s for %s", dht.self, p, key) + log.Debugf("%s putProvider: %s for %s", dht.self, p, u.Key(key)) if rpmes.GetKey() != pmes.GetKey() { return errors.New("provider not added correctly") } From 3504fb8ee514730ee2c5dd95a7b134d13715f665 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 31 Oct 2014 03:20:26 +0000 Subject: [PATCH 0304/3147] remove dagwriter in favor of new importer function This commit was moved from ipfs/go-ipfs-routing@b3581e8f77fa4cf5f8e3f0356005e8690684c064 --- routing/dht/query.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index cd9fae98c0..557af095ca 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -207,7 +207,7 @@ func (r *dhtQueryRunner) spawnWorkers() { } func (r *dhtQueryRunner) queryPeer(p peer.Peer) { - log.Debugf("spawned worker for: %v\n", p) + log.Debugf("spawned worker for: %v", p) // make sure we rate limit concurrency. select { @@ -256,7 +256,7 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { r.cancel() // signal to everyone that we're done. } else if res.closerPeers != nil { - log.Debugf("PEERS CLOSER -- worker for: %v\n", p) + log.Debugf("PEERS CLOSER -- worker for: %v", p) for _, next := range res.closerPeers { r.addPeerToQuery(next, p) } From 41db609abf5eba8cb8b64730a54923e3cdada505 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 31 Oct 2014 03:20:26 +0000 Subject: [PATCH 0305/3147] remove dagwriter in favor of new importer function This commit was moved from ipfs/go-unixfs@31d9a0b3d3d60cee6c2da39255cf2b7b791777ad --- unixfs/io/dagmodifier.go | 2 + unixfs/io/dagmodifier_test.go | 16 +--- unixfs/io/dagwriter.go | 115 ----------------------- unixfs/io/dagwriter_test.go | 171 ---------------------------------- 4 files changed, 5 insertions(+), 299 deletions(-) delete mode 100644 unixfs/io/dagwriter.go delete mode 100644 unixfs/io/dagwriter_test.go diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go index ebec24cfce..a05b9d6edb 100644 --- a/unixfs/io/dagmodifier.go +++ b/unixfs/io/dagmodifier.go @@ -13,6 +13,8 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +var log = u.Logger("dagio") + // DagModifier is the only struct licensed and able to correctly // perform surgery on a DAG 'file' // Dear god, please rename this to something more pleasant diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index edb4d6f762..822c874714 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -7,6 +7,7 @@ import ( "testing" bs "github.com/jbenet/go-ipfs/blockservice" + imp "github.com/jbenet/go-ipfs/importer" "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" @@ -26,22 +27,11 @@ func getMockDagServ(t *testing.T) mdag.DAGService { } func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { - dw := NewDagWriter(dserv, &chunk.SizeSplitter{500}) - - n, err := io.CopyN(dw, u.NewTimeSeededRand(), size) + in := io.LimitReader(u.NewTimeSeededRand(), size) + node, err := imp.BuildDagFromReader(in, dserv, nil, &chunk.SizeSplitter{500}) if err != nil { t.Fatal(err) } - if n != size { - t.Fatal("Incorrect copy amount!") - } - - err = dw.Close() - if err != nil { - t.Fatal("DagWriter failed to close,", err) - } - - node := dw.GetNode() dr, err := NewDagReader(node, dserv) if err != nil { diff --git a/unixfs/io/dagwriter.go b/unixfs/io/dagwriter.go deleted file mode 100644 index 6575b1edff..0000000000 --- a/unixfs/io/dagwriter.go +++ /dev/null @@ -1,115 +0,0 @@ -package io - -import ( - "github.com/jbenet/go-ipfs/importer/chunk" - dag "github.com/jbenet/go-ipfs/merkledag" - "github.com/jbenet/go-ipfs/pin" - ft "github.com/jbenet/go-ipfs/unixfs" - "github.com/jbenet/go-ipfs/util" -) - -var log = util.Logger("dagwriter") - -type DagWriter struct { - dagserv dag.DAGService - node *dag.Node - totalSize int64 - splChan chan []byte - done chan struct{} - splitter chunk.BlockSplitter - seterr error - Pinner pin.ManualPinner -} - -func NewDagWriter(ds dag.DAGService, splitter chunk.BlockSplitter) *DagWriter { - dw := new(DagWriter) - dw.dagserv = ds - dw.splChan = make(chan []byte, 8) - dw.splitter = splitter - dw.done = make(chan struct{}) - go dw.startSplitter() - return dw -} - -// startSplitter manages splitting incoming bytes and -// creating dag nodes from them. Created nodes are stored -// in the DAGService and then released to the GC. -func (dw *DagWriter) startSplitter() { - - // Since the splitter functions take a reader (and should!) - // we wrap our byte chan input in a reader - r := util.NewByteChanReader(dw.splChan) - blkchan := dw.splitter.Split(r) - - // First data block is reserved for storage in the root node - first := <-blkchan - mbf := new(ft.MultiBlock) - root := new(dag.Node) - - for blkData := range blkchan { - // Store the block size in the root node - mbf.AddBlockSize(uint64(len(blkData))) - node := &dag.Node{Data: ft.WrapData(blkData)} - nk, err := dw.dagserv.Add(node) - if dw.Pinner != nil { - dw.Pinner.PinWithMode(nk, pin.Indirect) - } - if err != nil { - dw.seterr = err - log.Critical("Got error adding created node to dagservice: %s", err) - return - } - - // Add a link to this node without storing a reference to the memory - err = root.AddNodeLinkClean("", node) - if err != nil { - dw.seterr = err - log.Critical("Got error adding created node to root node: %s", err) - return - } - } - - // Generate the root node data - mbf.Data = first - data, err := mbf.GetBytes() - if err != nil { - dw.seterr = err - log.Critical("Failed generating bytes for multiblock file: %s", err) - return - } - root.Data = data - - // Add root node to the dagservice - rootk, err := dw.dagserv.Add(root) - if err != nil { - dw.seterr = err - log.Critical("Got error adding created node to dagservice: %s", err) - return - } - if dw.Pinner != nil { - dw.Pinner.PinWithMode(rootk, pin.Recursive) - } - dw.node = root - dw.done <- struct{}{} -} - -func (dw *DagWriter) Write(b []byte) (int, error) { - if dw.seterr != nil { - return 0, dw.seterr - } - dw.splChan <- b - return len(b), nil -} - -// Close the splitters input channel and wait for it to finish -// Must be called to finish up splitting, otherwise split method -// will never halt -func (dw *DagWriter) Close() error { - close(dw.splChan) - <-dw.done - return nil -} - -func (dw *DagWriter) GetNode() *dag.Node { - return dw.node -} diff --git a/unixfs/io/dagwriter_test.go b/unixfs/io/dagwriter_test.go deleted file mode 100644 index edb4a0a70b..0000000000 --- a/unixfs/io/dagwriter_test.go +++ /dev/null @@ -1,171 +0,0 @@ -package io_test - -import ( - "testing" - - "io" - - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - bs "github.com/jbenet/go-ipfs/blockservice" - importer "github.com/jbenet/go-ipfs/importer" - chunk "github.com/jbenet/go-ipfs/importer/chunk" - mdag "github.com/jbenet/go-ipfs/merkledag" - dagio "github.com/jbenet/go-ipfs/unixfs/io" -) - -type datasource struct { - i int -} - -func (d *datasource) Read(b []byte) (int, error) { - for i, _ := range b { - b[i] = byte(d.i % 256) - d.i++ - } - return len(b), nil -} - -func (d *datasource) Matches(t *testing.T, r io.Reader, length int) bool { - b := make([]byte, 100) - i := 0 - for { - n, err := r.Read(b) - if err != nil && err != io.EOF { - t.Fatal(err) - } - for _, v := range b[:n] { - if v != byte(i%256) { - t.Fatalf("Buffers differed at byte: %d (%d != %d)", i, v, (i % 256)) - } - i++ - } - if err == io.EOF { - break - } - } - if i != length { - t.Fatalf("Incorrect length. (%d != %d)", i, length) - } - return true -} - -func TestDagWriter(t *testing.T) { - dstore := ds.NewMapDatastore() - bserv, err := bs.NewBlockService(dstore, nil) - if err != nil { - t.Fatal(err) - } - dag := mdag.NewDAGService(bserv) - dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) - - nbytes := int64(1024 * 1024 * 2) - n, err := io.CopyN(dw, &datasource{}, nbytes) - if err != nil { - t.Fatal(err) - } - - if n != nbytes { - t.Fatal("Copied incorrect amount of bytes!") - } - - dw.Close() - - node := dw.GetNode() - read, err := dagio.NewDagReader(node, dag) - if err != nil { - t.Fatal(err) - } - - d := &datasource{} - if !d.Matches(t, read, int(nbytes)) { - t.Fatal("Failed to validate!") - } -} - -func TestMassiveWrite(t *testing.T) { - t.SkipNow() - dstore := ds.NewNullDatastore() - bserv, err := bs.NewBlockService(dstore, nil) - if err != nil { - t.Fatal(err) - } - dag := mdag.NewDAGService(bserv) - dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) - - nbytes := int64(1024 * 1024 * 1024 * 16) - n, err := io.CopyN(dw, &datasource{}, nbytes) - if err != nil { - t.Fatal(err) - } - if n != nbytes { - t.Fatal("Incorrect copy size.") - } - dw.Close() -} - -func BenchmarkDagWriter(b *testing.B) { - dstore := ds.NewNullDatastore() - bserv, err := bs.NewBlockService(dstore, nil) - if err != nil { - b.Fatal(err) - } - dag := mdag.NewDAGService(bserv) - - b.ResetTimer() - nbytes := int64(100000) - for i := 0; i < b.N; i++ { - b.SetBytes(nbytes) - dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{Size: 4096}) - n, err := io.CopyN(dw, &datasource{}, nbytes) - if err != nil { - b.Fatal(err) - } - if n != nbytes { - b.Fatal("Incorrect copy size.") - } - dw.Close() - } - -} - -func TestAgainstImporter(t *testing.T) { - dstore := ds.NewMapDatastore() - bserv, err := bs.NewBlockService(dstore, nil) - if err != nil { - t.Fatal(err) - } - dag := mdag.NewDAGService(bserv) - - nbytes := int64(1024 * 1024 * 2) - - // DagWriter - dw := dagio.NewDagWriter(dag, &chunk.SizeSplitter{4096}) - n, err := io.CopyN(dw, &datasource{}, nbytes) - if err != nil { - t.Fatal(err) - } - if n != nbytes { - t.Fatal("Copied incorrect amount of bytes!") - } - - dw.Close() - dwNode := dw.GetNode() - dwKey, err := dwNode.Key() - if err != nil { - t.Fatal(err) - } - - // DagFromFile - rl := &io.LimitedReader{&datasource{}, nbytes} - - dffNode, err := importer.NewDagFromReaderWithSplitter(rl, &chunk.SizeSplitter{4096}) - dffKey, err := dffNode.Key() - if err != nil { - t.Fatal(err) - } - if dwKey.String() != dffKey.String() { - t.Errorf("\nDagWriter produced %s\n"+ - "DagFromReader produced %s", - dwKey, dffKey) - } -} From 5eb949381cbd197c476d921353b71741ab36376b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 26 Oct 2014 08:01:33 +0000 Subject: [PATCH 0306/3147] benchmark secure channel This commit was moved from ipfs/go-ipfs-routing@59cbce37dcaa767614de6f8be043b0a4d2571454 --- routing/kbucket/table_test.go | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 2b45d15729..cda69064a4 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,16 +7,12 @@ import ( "testing" "time" + tu "github.com/jbenet/go-ipfs/util/testutil" + peer "github.com/jbenet/go-ipfs/peer" ) -func _randPeer() peer.Peer { - id := make(peer.ID, 16) - crand.Read(id) - return peer.WithID(id) -} - -func _randID() ID { +func RandID() ID { buf := make([]byte, 16) crand.Read(buf) @@ -30,11 +26,11 @@ func TestBucket(t *testing.T) { peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() b.pushFront(peers[i]) } - local := _randPeer() + local := tu.RandPeer() localID := ConvertPeerID(local.ID()) i := rand.Intn(len(peers)) @@ -65,12 +61,12 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { - local := _randPeer() + local := tu.RandPeer() rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() } // Testing Update @@ -82,7 +78,7 @@ func TestTableUpdate(t *testing.T) { } for i := 0; i < 100; i++ { - id := _randID() + id := RandID() ret := rt.NearestPeers(id, 5) if len(ret) == 0 { t.Fatal("Failed to find node near ID.") @@ -91,12 +87,12 @@ func TestTableUpdate(t *testing.T) { } func TestTableFind(t *testing.T) { - local := _randPeer() + local := tu.RandPeer() rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) peers := make([]peer.Peer, 100) for i := 0; i < 5; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() rt.Update(peers[i]) } @@ -108,12 +104,12 @@ func TestTableFind(t *testing.T) { } func TestTableFindMultiple(t *testing.T) { - local := _randPeer() + local := tu.RandPeer() rt := NewRoutingTable(20, ConvertPeerID(local.ID()), time.Hour) peers := make([]peer.Peer, 100) for i := 0; i < 18; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() rt.Update(peers[i]) } @@ -132,7 +128,7 @@ func TestTableMultithreaded(t *testing.T) { tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) var peers []peer.Peer for i := 0; i < 500; i++ { - peers = append(peers, _randPeer()) + peers = append(peers, tu.RandPeer()) } done := make(chan struct{}) @@ -171,7 +167,7 @@ func BenchmarkUpdates(b *testing.B) { var peers []peer.Peer for i := 0; i < b.N; i++ { - peers = append(peers, _randPeer()) + peers = append(peers, tu.RandPeer()) } b.StartTimer() @@ -187,7 +183,7 @@ func BenchmarkFinds(b *testing.B) { var peers []peer.Peer for i := 0; i < b.N; i++ { - peers = append(peers, _randPeer()) + peers = append(peers, tu.RandPeer()) tab.Update(peers[i]) } From 58013e21a797de46e2149a96c0fbd919db5cba4b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 27 Oct 2014 20:23:14 +0000 Subject: [PATCH 0307/3147] msgio pooling first hack This commit was moved from ipfs/go-unixfs@c6ff34db40e9b7e9ac44f9a6614d1d872ccc9a95 --- unixfs/io/dagreader.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 17ad873719..a2dbeb2f22 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -9,7 +9,6 @@ import ( mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" ftpb "github.com/jbenet/go-ipfs/unixfs/pb" - u "github.com/jbenet/go-ipfs/util" ) var ErrIsDir = errors.New("this dag node is a directory") @@ -36,11 +35,12 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File: - return &DagReader{ + dr := &DagReader{ node: n, serv: serv, buf: bytes.NewBuffer(pb.GetData()), - }, nil + } + return dr, nil case ftpb.Data_Raw: // Raw block will just be a single level, return a byte buffer return bytes.NewBuffer(pb.GetData()), nil @@ -55,17 +55,12 @@ func (dr *DagReader) precalcNextBuf() error { if dr.position >= len(dr.node.Links) { return io.EOF } - nxtLink := dr.node.Links[dr.position] - nxt := nxtLink.Node - if nxt == nil { - nxtNode, err := dr.serv.Get(u.Key(nxtLink.Hash)) - if err != nil { - return err - } - nxt = nxtNode + nxt, err := dr.node.Links[dr.position].GetNode(dr.serv) + if err != nil { + return err } pb := new(ftpb.Data) - err := proto.Unmarshal(nxt.Data, pb) + err = proto.Unmarshal(nxt.Data, pb) if err != nil { return err } From c4d64e3aa2ab61fb3a36d0fb70933d4f7d40f206 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 27 Oct 2014 20:23:14 +0000 Subject: [PATCH 0308/3147] msgio pooling first hack This commit was moved from ipfs/go-ipfs-routing@3289fcf0f2898de485ff0bff4f34953af8f07ab7 --- routing/dht/pb/dht.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 6c488c51a6..22c87bac9b 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package dht_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 2e4dcb9913f6167c6068af31e01e9107e37f330c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 30 Oct 2014 05:55:39 +0000 Subject: [PATCH 0309/3147] some small cleanup of logging This commit was moved from ipfs/go-unixfs@ab968b005bf0fa8e54f1a3d79fd9d272486805fd --- unixfs/io/dagreader.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index a2dbeb2f22..307f1d305a 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -18,7 +18,7 @@ type DagReader struct { serv mdag.DAGService node *mdag.Node position int - buf *bytes.Buffer + buf io.Reader } // NewDagReader creates a new reader object that reads the data represented by the given @@ -71,8 +71,13 @@ func (dr *DagReader) precalcNextBuf() error { return ft.ErrInvalidDirLocation case ftpb.Data_File: //TODO: this *should* work, needs testing first - //return NewDagReader(nxt, dr.serv) - panic("Not yet handling different layers of indirection!") + log.Warning("Running untested code for multilayered indirect FS reads.") + subr, err := NewDagReader(nxt, dr.serv) + if err != nil { + return err + } + dr.buf = subr + return nil case ftpb.Data_Raw: dr.buf = bytes.NewBuffer(pb.GetData()) return nil From 688f63623be2391e681465d89ec74344b61a0dc5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 31 Oct 2014 06:26:28 +0000 Subject: [PATCH 0310/3147] cleanup from CR This commit was moved from ipfs/go-ipfs-routing@5fb23b1e1d5acf72e3565b9455a95869824d3624 --- routing/dht/pb/dht.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 22c87bac9b..6c488c51a6 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package dht_pb -import proto "code.google.com/p/gogoprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 9492c619f7f1a3138a3120cf593df8dd733a342d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 30 Oct 2014 20:50:24 +0000 Subject: [PATCH 0311/3147] finish addressing PR concerns This commit was moved from ipfs/go-unixfs@e4475a7d95d367516ea20e6015d4088452345bc8 --- unixfs/io/dagreader.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 307f1d305a..804e03438d 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -35,12 +35,11 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File: - dr := &DagReader{ + return &DagReader{ node: n, serv: serv, buf: bytes.NewBuffer(pb.GetData()), - } - return dr, nil + }, nil case ftpb.Data_Raw: // Raw block will just be a single level, return a byte buffer return bytes.NewBuffer(pb.GetData()), nil From 31f84e1ff53e78776cec6b9bd86cc494fc8418d1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 26 Oct 2014 08:01:33 +0000 Subject: [PATCH 0312/3147] benchmark secure channel This commit was moved from ipfs/go-blockservice@a16833f9a6c71f1b83fdd97014894b106bc3612f --- blockservice/blockservice.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index edfaa11faa..3fe0465dfe 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -37,6 +37,7 @@ func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, err // AddBlock adds a particular block to the service, Putting it into the datastore. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() + log.Debugf("blockservice: storing [%s] in datastore", k) // TODO(brian): define a block datastore with a Put method which accepts a // block parameter From 3c86303dd9f55cd6a4990c2e47a6b83c5ae7d5e0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 28 Oct 2014 02:53:29 +0000 Subject: [PATCH 0313/3147] more memory tweaks This commit was moved from ipfs/go-ipfs-chunker@36ba109d3d2cb64a18dc15d258b2be237b016188 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index f5a6f735ce..8198999a88 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -8,7 +8,7 @@ import ( var log = util.Logger("chunk") -var DefaultSplitter = &SizeSplitter{Size: 1024 * 512} +var DefaultSplitter = &SizeSplitter{Size: 1024 * 256} type BlockSplitter interface { Split(r io.Reader) chan []byte From a91b8857313b00d7ff911364420cc08567969ff0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 3 Nov 2014 03:02:56 +0000 Subject: [PATCH 0314/3147] comment comment comment comment This commit was moved from ipfs/go-ipfs-routing@6eabeba85888a8b537ffcd98e7fd9f55500084f1 --- routing/dht/dht.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e76ab571cf..feff527064 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -228,6 +228,8 @@ func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, return nil } +// putProvider sends a message to peer 'p' saying that the local node +// can provide the value of 'key' func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) error { pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) @@ -384,6 +386,7 @@ func (dht *IpfsDHT) FindLocal(id peer.ID) (peer.Peer, *kb.RoutingTable) { return nil, nil } +// findPeerSingle asks peer 'p' if they know where the peer with id 'id' is func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID, level int) (*pb.Message, error) { pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), level) return dht.sendRequest(ctx, p, pmes) @@ -457,6 +460,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.Peer return filtered } +// getPeer searches the peerstore for a peer with the given peer ID func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { p, err := dht.peerstore.Get(id) if err != nil { @@ -467,6 +471,8 @@ func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { return p, nil } +// peerFromInfo returns a peer using info in the protobuf peer struct +// to lookup or create a peer func (dht *IpfsDHT) peerFromInfo(pbp *pb.Message_Peer) (peer.Peer, error) { id := peer.ID(pbp.GetId()) From 114f52ce4a8ca41a70206eb265fcc21059367d49 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 3 Nov 2014 03:02:56 +0000 Subject: [PATCH 0315/3147] comment comment comment comment This commit was moved from ipfs/go-unixfs@e4b1b49c22d0eaf7611823dc4c942f04b73c085d --- unixfs/io/dagreader.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 804e03438d..ea33c35407 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -48,7 +48,7 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { } } -// Follows the next link in line and loads it from the DAGService, +// precalcNextBuf follows the next link in line and loads it from the DAGService, // setting the next buffer to read from func (dr *DagReader) precalcNextBuf() error { if dr.position >= len(dr.node.Links) { @@ -67,6 +67,7 @@ func (dr *DagReader) precalcNextBuf() error { switch pb.GetType() { case ftpb.Data_Directory: + // A directory should not exist within a file return ft.ErrInvalidDirLocation case ftpb.Data_File: //TODO: this *should* work, needs testing first @@ -85,6 +86,7 @@ func (dr *DagReader) precalcNextBuf() error { } } +// Read reads data from the DAG structured file func (dr *DagReader) Read(b []byte) (int, error) { // If no cached buffer, load one if dr.buf == nil { From d8f430b955a8fb1c7fad7ec264988b182d030437 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 3 Nov 2014 03:02:56 +0000 Subject: [PATCH 0316/3147] comment comment comment comment This commit was moved from ipfs/go-blockservice@52576453352291d28d89db5dcbc7a0be49cf192e --- blockservice/blockservice.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3fe0465dfe..50dc43b64b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -93,6 +93,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er } } +// DeleteBlock deletes a block in the blockservice from the datastore func (s *BlockService) DeleteBlock(k u.Key) error { return s.Datastore.Delete(k.DsKey()) } From 6a1335d87817108cf6881310e7d8f82a7a77408f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 3 Nov 2014 03:53:16 +0000 Subject: [PATCH 0317/3147] a few more comments This commit was moved from ipfs/go-ipfs-pinner@136c7da2982e537b6cade0e942889d311d323ec4 --- pinning/pinner/pin.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index dba14a9775..cdd40c4502 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -1,9 +1,6 @@ package pin import ( - - //ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" - "encoding/json" "errors" "sync" @@ -36,12 +33,14 @@ type Pinner interface { } // ManualPinner is for manually editing the pin structure -// Use with care +// Use with care! If used improperly, garbage collection +// may not be successful type ManualPinner interface { PinWithMode(util.Key, PinMode) Pinner } +// pinner implements the Pinner interface type pinner struct { lock sync.RWMutex recursePin set.BlockSet @@ -51,6 +50,7 @@ type pinner struct { dstore ds.Datastore } +// NewPinner creates a new pinner using the given datastore as a backend func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner { // Load set from given datastore... @@ -70,6 +70,7 @@ func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner { } } +// Pin the given node, optionally recursive func (p *pinner) Pin(node *mdag.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() @@ -95,6 +96,7 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { return nil } +// Unpin a given key with optional recursive unpinning func (p *pinner) Unpin(k util.Key, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() @@ -158,6 +160,7 @@ func (p *pinner) pinLinks(node *mdag.Node) error { return nil } +// IsPinned returns whether or not the given key is pinned func (p *pinner) IsPinned(key util.Key) bool { p.lock.RLock() defer p.lock.RUnlock() @@ -166,6 +169,7 @@ func (p *pinner) IsPinned(key util.Key) bool { p.indirPin.HasKey(key) } +// LoadPinner loads a pinner and its keysets from the given datastore func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) @@ -200,6 +204,7 @@ func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { return p, nil } +// Flush encodes and writes pinner keysets to the datastore func (p *pinner) Flush() error { p.lock.RLock() defer p.lock.RUnlock() @@ -244,6 +249,8 @@ func loadSet(d ds.Datastore, k ds.Key, val interface{}) error { return json.Unmarshal(bf, val) } +// PinWithMode is a method on ManualPinners, allowing the user to have fine +// grained control over pin counts func (p *pinner) PinWithMode(k util.Key, mode PinMode) { switch mode { case Recursive: From 2b16571907445a62ba6c9c419858bdedd09d1f4f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 3 Nov 2014 03:53:16 +0000 Subject: [PATCH 0318/3147] a few more comments This commit was moved from ipfs/go-namesys@340d667b3eccdd5c329654a570e0a33e2ff007b1 --- namesys/publisher.go | 1 + 1 file changed, 1 insertion(+) diff --git a/namesys/publisher.go b/namesys/publisher.go index d95f1cbbcf..f7bf508b6b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -26,6 +26,7 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { } // Publish implements Publisher. Accepts a keypair and a value, +// and publishes it out to the routing system func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { log.Debugf("namesys: Publish %s", value) From 552b01da76ddab1b0bc5ce661e9dfc1f89f56db7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 5 Nov 2014 03:59:18 -0800 Subject: [PATCH 0319/3147] swarm + net: add explicit listen addresses This commit was moved from ipfs/go-ipfs-routing@5799dfcc9f1b98f16b6bf58f43b4d397fe223803 --- routing/dht/dht_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2b87323381..3748e65193 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -24,7 +24,7 @@ func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { peerstore := peer.NewPeerstore() dhts := netservice.NewService(ctx, nil) // nil handler for now, need to patch it - net, err := inet.NewIpfsNetwork(ctx, p, peerstore, &mux.ProtocolMap{ + net, err := inet.NewIpfsNetwork(ctx, p.Addresses(), p, peerstore, &mux.ProtocolMap{ mux.ProtocolID_Routing: dhts, }) if err != nil { From 3de97ce96fbc367ae2deabe1b4d4dc52891d6d83 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 5 Nov 2014 08:49:55 -0800 Subject: [PATCH 0320/3147] fixed dht race #270 This commit was moved from ipfs/go-ipfs-routing@de6bd0cc750fd9c5ff14911fb34c06af0f90f587 --- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3748e65193..ffbbef8198 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -417,14 +417,14 @@ func TestConnectCollision(t *testing.T) { done := make(chan struct{}) go func() { - _, err = dhtA.Connect(ctx, peerB) + _, err := dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } done <- struct{}{} }() go func() { - _, err = dhtB.Connect(ctx, peerA) + _, err := dhtB.Connect(ctx, peerA) if err != nil { t.Fatal(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 19275338da..a6d1d933d9 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,6 +16,7 @@ import ( pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" + "sync" "time" ) @@ -28,15 +29,24 @@ type mesHandleFunc func(msg.NetMessage) msg.NetMessage // fauxNet is a standin for a swarm.Network in order to more easily recreate // different testing scenarios type fauxSender struct { + sync.Mutex handlers []mesHandleFunc } func (f *fauxSender) AddHandler(fn func(msg.NetMessage) msg.NetMessage) { + f.Lock() + defer f.Unlock() + f.handlers = append(f.handlers, fn) } func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.NetMessage, error) { - for _, h := range f.handlers { + f.Lock() + handlers := make([]mesHandleFunc, len(f.handlers)) + copy(handlers, f.handlers) + f.Unlock() + + for _, h := range handlers { reply := h(m) if reply != nil { return reply, nil @@ -52,7 +62,12 @@ func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.Net } func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error { - for _, h := range f.handlers { + f.Lock() + handlers := make([]mesHandleFunc, len(f.handlers)) + copy(handlers, f.handlers) + f.Unlock() + + for _, h := range handlers { reply := h(m) if reply != nil { return nil From 18ad1dcbcf38da545734a88f1b3b318de992dc60 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 5 Nov 2014 04:26:30 -0800 Subject: [PATCH 0321/3147] fix(net) pass contexts to dial peer This commit was moved from ipfs/go-ipfs-routing@9253f2d03f7349a1a3359a92886b407250d009f6 --- routing/dht/dht.go | 10 +++++----- routing/dht/ext_test.go | 3 +-- routing/dht/query.go | 2 +- routing/dht/routing.go | 6 +++--- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index feff527064..11764faba8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -100,7 +100,7 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, er // // /ip4/10.20.30.40/tcp/1234/ipfs/Qxhxxchxzcncxnzcnxzcxzm // - err := dht.dialer.DialPeer(npeer) + err := dht.dialer.DialPeer(ctx, npeer) if err != nil { return nil, err } @@ -311,7 +311,7 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, peerlist []*pb.Message_Peer, level int) ([]byte, error) { for _, pinfo := range peerlist { - p, err := dht.ensureConnectedToPeer(pinfo) + p, err := dht.ensureConnectedToPeer(ctx, pinfo) if err != nil { log.Errorf("getFromPeers error: %s", err) continue @@ -496,14 +496,14 @@ func (dht *IpfsDHT) peerFromInfo(pbp *pb.Message_Peer) (peer.Peer, error) { return p, nil } -func (dht *IpfsDHT) ensureConnectedToPeer(pbp *pb.Message_Peer) (peer.Peer, error) { +func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, pbp *pb.Message_Peer) (peer.Peer, error) { p, err := dht.peerFromInfo(pbp) if err != nil { return nil, err } // dial connection - err = dht.dialer.DialPeer(p) + err = dht.dialer.DialPeer(ctx, p) return p, err } @@ -556,7 +556,7 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context) { if err != nil { log.Error("Bootstrap peer error: %s", err) } - err = dht.dialer.DialPeer(p) + err = dht.dialer.DialPeer(ctx, p) if err != nil { log.Errorf("Bootstrap peer error: %s", err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index a6d1d933d9..1dabb5b648 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -4,7 +4,6 @@ import ( "testing" crand "crypto/rand" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" @@ -82,7 +81,7 @@ type fauxNet struct { } // DialPeer attempts to establish a connection to a given peer -func (f *fauxNet) DialPeer(peer.Peer) error { +func (f *fauxNet) DialPeer(context.Context, peer.Peer) error { return nil } diff --git a/routing/dht/query.go b/routing/dht/query.go index 557af095ca..f0478ff299 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -230,7 +230,7 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { // make sure we're connected to the peer. // (Incidentally, this will add it to the peerstore too) - err := r.query.dialer.DialPeer(p) + err := r.query.dialer.DialPeer(r.ctx, p) if err != nil { log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) r.Lock() diff --git a/routing/dht/routing.go b/routing/dht/routing.go index da400fee28..c0d86e1d12 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -145,7 +145,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int log.Error(err) return } - dht.addPeerListAsync(key, pmes.GetProviderPeers(), ps, count, peerOut) + dht.addPeerListAsync(ctx, key, pmes.GetProviderPeers(), ps, count, peerOut) }(pp) } wg.Wait() @@ -154,13 +154,13 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int return peerOut } -func (dht *IpfsDHT) addPeerListAsync(k u.Key, peers []*pb.Message_Peer, ps *peerSet, count int, out chan peer.Peer) { +func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *peerSet, count int, out chan peer.Peer) { done := make(chan struct{}) for _, pbp := range peers { go func(mp *pb.Message_Peer) { defer func() { done <- struct{}{} }() // construct new peer - p, err := dht.ensureConnectedToPeer(mp) + p, err := dht.ensureConnectedToPeer(ctx, mp) if err != nil { log.Error("%s", err) return From 4bbdd5176e263a79cfc725aa6c04230c6d9d81da Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Nov 2014 11:35:50 -0800 Subject: [PATCH 0322/3147] probably fix OSX ipns bug This commit was moved from ipfs/go-unixfs@1424de80e85f792ffbea42b79e51203d7738bc47 --- unixfs/io/dagmodifier.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go index a05b9d6edb..4683a157ec 100644 --- a/unixfs/io/dagmodifier.go +++ b/unixfs/io/dagmodifier.go @@ -173,6 +173,13 @@ func (dm *DagModifier) WriteAt(b []byte, offset uint64) (int, error) { return origlen, nil } +func (dm *DagModifier) Size() uint64 { + if dm == nil { + return 0 + } + return dm.pbdata.GetFilesize() +} + // splitBytes uses a splitterFunc to turn a large array of bytes // into many smaller arrays of bytes func splitBytes(b []byte, spl chunk.BlockSplitter) [][]byte { From 98ccdcf345ecfcb744a4b85e76ad919e586c1da1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 13:43:43 -0800 Subject: [PATCH 0323/3147] write a few package doc strings to improve look of godoc This commit was moved from ipfs/go-ipfs-routing@d705f87a4c7f506dee9c6b3137bfc1f3dd29273a --- routing/dht/dht.go | 2 ++ routing/kbucket/bucket.go | 2 +- routing/kbucket/table.go | 3 ++- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/routing.go | 1 + 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 11764faba8..5f61840674 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -1,3 +1,5 @@ +// package dht implements a distributed hash table that satisfies the ipfs routing +// interface. This DHT is modeled after kademlia with Coral and S/Kademlia modifications. package dht import ( diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index b114f9e217..51f524971f 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -1,4 +1,4 @@ -package dht +package kbucket import ( "container/list" diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 491a06c685..c144c191ed 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -1,4 +1,5 @@ -package dht +// package kbucket implements a kademlia 'k-bucket' routing table. +package kbucket import ( "container/list" diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index cda69064a4..85fc387e2d 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -1,4 +1,4 @@ -package dht +package kbucket import ( crand "crypto/rand" diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 02994230a6..4adac04057 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -1,4 +1,4 @@ -package dht +package kbucket import ( "bytes" diff --git a/routing/routing.go b/routing/routing.go index 3ef3818563..09773f20b1 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -1,3 +1,4 @@ +// package routing defines the interface for a routing system used by ipfs. package routing import ( From 9f8c6c40454ec6de83d431e01099365e7099436b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 13:43:43 -0800 Subject: [PATCH 0324/3147] write a few package doc strings to improve look of godoc This commit was moved from ipfs/go-ipfs-chunker@a897f36c1187bcaa79e2f212c89d4d6a22f77b1a --- chunker/splitting.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chunker/splitting.go b/chunker/splitting.go index 8198999a88..2d92a9ead9 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -1,3 +1,4 @@ +// package chunk implements streaming block splitters package chunk import ( From d807cb4ae4802e9840af3cce32986b73a215dbc0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 16:02:03 -0800 Subject: [PATCH 0325/3147] some more docs This commit was moved from ipfs/go-ipfs-pinner@bc47bb096f037db55e54c4300ff9bb062b09d44f --- pinning/pinner/pin.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index cdd40c4502..c59574edad 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -1,3 +1,5 @@ +// package pin implemnts structures and methods to keep track of +// which objects a user wants to keep stored locally. package pin import ( From a5083ae33bd816ff5481411706195f74d3d1d749 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 13:43:43 -0800 Subject: [PATCH 0326/3147] write a few package doc strings to improve look of godoc This commit was moved from ipfs/go-blockservice@ad96295ee7206a3899a3e468b828f53635fbc742 --- blockservice/blockservice.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 50dc43b64b..82a1b03c1c 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -1,3 +1,6 @@ +// package blockservice implements a BlockService interface that provides +// a single GetBlock/AddBlock interface that seamlessly retrieves data either +// locally or from a remote peer through the exchange. package blockservice import ( From 6d8b89ba06b55c9a09bf4aff12d29a0b0123ae50 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 16:02:03 -0800 Subject: [PATCH 0327/3147] some more docs This commit was moved from ipfs/go-unixfs@eb2f560e4ee5f53c208d66803b1293d85570b8cb --- unixfs/io/doc.go | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 unixfs/io/doc.go diff --git a/unixfs/io/doc.go b/unixfs/io/doc.go new file mode 100644 index 0000000000..b28755fc6a --- /dev/null +++ b/unixfs/io/doc.go @@ -0,0 +1,3 @@ +// package unixfs/io implements convenience objects for working with the ipfs +// unixfs data format. +package io From a37ed62c48c8f2771d6af54758c31c0b006a0b79 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 13:43:43 -0800 Subject: [PATCH 0328/3147] write a few package doc strings to improve look of godoc This commit was moved from ipfs/go-path@7fd00e383c33a46dc2efc729ceb4968cf77ec166 --- path/path.go | 1 + 1 file changed, 1 insertion(+) diff --git a/path/path.go b/path/path.go index 8d3070a0ee..63d7186566 100644 --- a/path/path.go +++ b/path/path.go @@ -1,3 +1,4 @@ +// package path implements utilities for resolving paths within ipfs. package path import ( From b8915a253bed58f5cbd3cc956d7981cbe3be7e11 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 8 Nov 2014 21:37:56 -0800 Subject: [PATCH 0329/3147] docs(exchange) This commit was moved from ipfs/go-ipfs-exchange-interface@f327e9b199779ec5cf795a43159ce499f0a64235 --- exchange/interface.go | 1 + 1 file changed, 1 insertion(+) diff --git a/exchange/interface.go b/exchange/interface.go index 682c983486..82782a0469 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -1,3 +1,4 @@ +// package exchange defines the IPFS Exchange interface package exchange import ( From cb9466ef1fb3c837b05ea6a52ef377c4255e6f52 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 21:57:11 -0800 Subject: [PATCH 0330/3147] comments on vars in dht This commit was moved from ipfs/go-ipfs-routing@969f6af2660de98afe04731feb38d842be6bb5cc --- routing/dht/util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/util.go b/routing/dht/util.go index 3cc812638e..00ac38dbc7 100644 --- a/routing/dht/util.go +++ b/routing/dht/util.go @@ -9,10 +9,10 @@ import ( // Pool size is the number of nodes used for group find/set RPC calls var PoolSize = 6 -// We put the 'K' in kademlia! +// K is the maximum number of requests to perform before returning failure. var KValue = 10 -// Its in the paper, i swear +// Alpha is the concurrency factor for asynchronous requests. var AlphaValue = 3 // A counter for incrementing a variable across multiple threads From 97d217d388a0398da089ed8cbdedfbaeef8ad979 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 22:44:37 -0800 Subject: [PATCH 0331/3147] more doc comments This commit was moved from ipfs/go-ipfs-routing@588abf9228573adff1bb6c97e7e60dd8b3a1874a --- routing/dht/handlers.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index fe628eeef5..f7b074416a 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -12,6 +12,7 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ) +// The number of closer peers to send on requests. var CloserPeerCount = 4 // dhthandler specifies the signature of functions that handle DHT messages. From 8d2387e01794df22844b347c376e49ef9fff8775 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 22:44:37 -0800 Subject: [PATCH 0332/3147] more doc comments This commit was moved from ipfs/go-ipfs-exchange-offline@7715d6378cdb18e6355a16ac20c83fe8e884895a --- exchange/offline/offline.go | 4 +++- exchange/offline/offline_test.go | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 2a7527f56c..5f7ef88355 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -1,4 +1,6 @@ -package bitswap +// package offline implements an object that implements the exchange +// interface but returns nil values to every request. +package offline import ( "errors" diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index b759a61ca3..cc3f3ec82b 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -1,4 +1,4 @@ -package bitswap +package offline import ( "testing" From f7fa3c78404069a39e49e60f7cc34c6c094e2a16 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 12 Nov 2014 10:39:11 -0800 Subject: [PATCH 0333/3147] log -> logf This commit was moved from ipfs/go-ipfs-routing@35b6bce7e799a9b7cf9335aa024f6f838fd6ce08 --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index c0d86e1d12..e2e5d2f37e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -162,7 +162,7 @@ func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.M // construct new peer p, err := dht.ensureConnectedToPeer(ctx, mp) if err != nil { - log.Error("%s", err) + log.Errorf("%s", err) return } if p == nil { From 1b8329b4469b206a6221dca39d40349f773e49c4 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 15 Nov 2014 00:19:47 -0800 Subject: [PATCH 0334/3147] chore(tests) add Short() -> SkipNow() to slowest tests vanilla: 21.57 real 45.14 user 8.51 sys short: 14.40 real 31.13 user 5.56 sys License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@e873abb078c9e5957863bd9d2e252d64443d822c --- routing/dht/dht_test.go | 16 ++++++++++++---- routing/dht/ext_test.go | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index ffbbef8198..133e28b583 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -231,7 +231,9 @@ func TestProvides(t *testing.T) { } func TestProvidesAsync(t *testing.T) { - // t.Skip("skipping test to debug another") + if testing.Short() { + t.SkipNow() + } ctx := context.Background() u.Debug = false @@ -295,7 +297,9 @@ func TestProvidesAsync(t *testing.T) { } func TestLayeredGet(t *testing.T) { - // t.Skip("skipping test to debug another") + if testing.Short() { + t.SkipNow() + } ctx := context.Background() u.Debug = false @@ -347,7 +351,9 @@ func TestLayeredGet(t *testing.T) { } func TestFindPeer(t *testing.T) { - // t.Skip("skipping test to debug another") + if testing.Short() { + t.SkipNow() + } ctx := context.Background() u.Debug = false @@ -391,7 +397,9 @@ func TestFindPeer(t *testing.T) { } func TestConnectCollision(t *testing.T) { - // t.Skip("skipping test to debug another") + if testing.Short() { + t.SkipNow() + } runTimes := 10 diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 1dabb5b648..6be939bedd 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -115,7 +115,9 @@ func (f *fauxNet) GetBandwidthTotals() (uint64, uint64) { func (f *fauxNet) Close() error { return nil } func TestGetFailures(t *testing.T) { - // t.Skip("skipping test because it makes a lot of output") + if testing.Short() { + t.SkipNow() + } ctx := context.Background() fn := &fauxNet{} @@ -211,7 +213,9 @@ func _randPeer() peer.Peer { } func TestNotFound(t *testing.T) { - // t.Skip("skipping test because it makes a lot of output") + if testing.Short() { + t.SkipNow() + } ctx := context.Background() fn := &fauxNet{} From 54c04b17317677456b1f3e2e94ffce0087ffc81e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 15 Nov 2014 00:19:47 -0800 Subject: [PATCH 0335/3147] chore(tests) add Short() -> SkipNow() to slowest tests vanilla: 21.57 real 45.14 user 8.51 sys short: 14.40 real 31.13 user 5.56 sys License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-chunker@6f21c1f5f5ed9b5eb2b04906e42367a8786b0394 --- chunker/splitting_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 0ecb143cbd..612da4d097 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -21,6 +21,9 @@ func copyBuf(buf []byte) []byte { } func TestSizeSplitterIsDeterministic(t *testing.T) { + if testing.Short() { + t.SkipNow() + } test := func() { bufR := randBuf(t, 10000000) // crank this up to satisfy yourself. From 5d330d7ce0e6864454d600bdf030ba742ca566b2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 4 Nov 2014 10:55:51 -0800 Subject: [PATCH 0336/3147] add in a default file hash and cleaned up init functiona bit This commit was moved from ipfs/go-ipfs-pinner@c68e81cdf1f371ab7c7e029c004b4d51c5c9adf0 --- pinning/pinner/pin.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index c59574edad..60828b597a 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -32,6 +32,7 @@ type Pinner interface { Pin(*mdag.Node, bool) error Unpin(util.Key, bool) error Flush() error + GetManual() ManualPinner } // ManualPinner is for manually editing the pin structure @@ -263,3 +264,7 @@ func (p *pinner) PinWithMode(k util.Key, mode PinMode) { p.indirPin.Increment(k) } } + +func (p *pinner) GetManual() ManualPinner { + return p +} From 395e8023ee0437440955e6019e6b7a61e50e1da7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 9 Nov 2014 23:45:16 -0800 Subject: [PATCH 0337/3147] switch DHT entries over to be records, test currently fail This commit was moved from ipfs/go-ipfs-routing@60f1004327d352a79e40513ff30a71304be34770 --- routing/dht/dht.go | 57 +++++++++++++++++++++++++++------ routing/dht/ext_test.go | 22 +++++++------ routing/dht/handlers.go | 27 ++++++++++++++-- routing/dht/pb/dht.pb.go | 55 +++++++++++++++++++++++++++++--- routing/dht/pb/dht.proto | 18 ++++++++++- routing/dht/records.go | 69 ++++++++++++++++++++++++++++++++++++++++ routing/dht/routing.go | 8 ++++- 7 files changed, 228 insertions(+), 28 deletions(-) create mode 100644 routing/dht/records.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5f61840674..5d4caaa847 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -60,6 +60,9 @@ type IpfsDHT struct { //lock to make diagnostics work better diaglock sync.Mutex + // record validator funcs + Validators map[string]ValidatorFunc + ctxc.ContextCloser } @@ -81,6 +84,7 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Millisecond*1000) dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Hour) dht.birth = time.Now() + dht.Validators = make(map[string]ValidatorFunc) if doPinging { dht.Children().Add(1) @@ -215,16 +219,16 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Messa // putValueToNetwork stores the given key/value pair at the peer 'p' func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, - key string, value []byte) error { + key string, rec *pb.Record) error { pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) - pmes.Value = value + pmes.Record = rec rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { return err } - if !bytes.Equal(rpmes.Value, pmes.Value) { + if !bytes.Equal(rpmes.GetRecord().Value, pmes.GetRecord().Value) { return errors.New("value not put correctly") } return nil @@ -260,11 +264,16 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, return nil, nil, err } - log.Debugf("pmes.GetValue() %v", pmes.GetValue()) - if value := pmes.GetValue(); value != nil { + if record := pmes.GetRecord(); record != nil { // Success! We were given the value log.Debug("getValueOrPeers: got value") - return value, nil, nil + + // make sure record is still valid + err = dht.verifyRecord(record) + if err != nil { + return nil, nil, err + } + return record.GetValue(), nil, nil } // TODO decide on providers. This probably shouldn't be happening. @@ -325,10 +334,15 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, continue } - if value := pmes.GetValue(); value != nil { + if record := pmes.GetRecord(); record != nil { // Success! We were given the value + + err := dht.verifyRecord(record) + if err != nil { + return nil, err + } dht.providers.AddProvider(key, p) - return value, nil + return record.GetValue(), nil } } return nil, routing.ErrNotFound @@ -347,12 +361,35 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { if !ok { return nil, errors.New("value stored in datastore not []byte") } - return byt, nil + rec := new(pb.Record) + err = proto.Unmarshal(byt, rec) + if err != nil { + return nil, err + } + + // TODO: 'if paranoid' + if u.Debug { + err = dht.verifyRecord(rec) + if err != nil { + return nil, err + } + } + + return rec.GetValue(), nil } // putLocal stores the key value pair in the datastore func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { - return dht.datastore.Put(key.DsKey(), value) + rec, err := dht.makePutRecord(key, value) + if err != nil { + return err + } + data, err := proto.Marshal(rec) + if err != nil { + return err + } + + return dht.datastore.Put(key.DsKey(), data) } // Update signals to all routingTables to Update their last-seen status diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 6be939bedd..dcf80e4d0a 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -124,10 +124,10 @@ func TestGetFailures(t *testing.T) { fs := &fauxSender{} peerstore := peer.NewPeerstore() - local := peer.WithIDString("test_peer") + local := makePeer(nil) d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) - other := peer.WithIDString("other_peer") + other := makePeer(nil) d.Update(other) // This one should time out @@ -173,10 +173,14 @@ func TestGetFailures(t *testing.T) { // Now we test this DHT's handleGetValue failure typ := pb.Message_GET_VALUE str := "hello" + rec, err := d.makePutRecord(u.Key(str), []byte("blah")) + if err != nil { + t.Fatal(err) + } req := pb.Message{ - Type: &typ, - Key: &str, - Value: []byte{0}, + Type: &typ, + Key: &str, + Record: rec, } // u.POut("handleGetValue Test\n") @@ -192,10 +196,10 @@ func TestGetFailures(t *testing.T) { if err != nil { t.Fatal(err) } - if pmes.GetValue() != nil { + if pmes.GetRecord() != nil { t.Fatal("shouldnt have value") } - if pmes.GetCloserPeers() != nil { + if len(pmes.GetCloserPeers()) > 0 { t.Fatal("shouldnt have closer peers") } if pmes.GetProviderPeers() != nil { @@ -221,7 +225,7 @@ func TestNotFound(t *testing.T) { fn := &fauxNet{} fs := &fauxSender{} - local := peer.WithIDString("test_peer") + local := makePeer(nil) peerstore := peer.NewPeerstore() peerstore.Add(local) @@ -287,7 +291,7 @@ func TestLessThanKResponses(t *testing.T) { u.Debug = false fn := &fauxNet{} fs := &fauxSender{} - local := peer.WithIDString("test_peer") + local := makePeer(nil) peerstore := peer.NewPeerstore() peerstore.Add(local) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index f7b074416a..899f242927 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,6 +5,8 @@ import ( "fmt" "time" + "code.google.com/p/goprotobuf/proto" + peer "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" @@ -72,7 +74,14 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *pb.Message) (*pb.Message, return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) } - resp.Value = byts + rec := new(pb.Record) + err := proto.Unmarshal(byts, rec) + if err != nil { + log.Error("Failed to unmarshal dht record from datastore") + return nil, err + } + + resp.Record = rec } // if we know any providers for the requested value, return those. @@ -102,8 +111,20 @@ func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *pb.Message) (*pb.Message, dht.dslock.Lock() defer dht.dslock.Unlock() dskey := u.Key(pmes.GetKey()).DsKey() - err := dht.datastore.Put(dskey, pmes.GetValue()) - log.Debugf("%s handlePutValue %v %v\n", dht.self, dskey, pmes.GetValue()) + + err := dht.verifyRecord(pmes.GetRecord()) + if err != nil { + log.Error("Bad dht record in put request") + return nil, err + } + + data, err := proto.Marshal(pmes.GetRecord()) + if err != nil { + return nil, err + } + + err = dht.datastore.Put(dskey, data) + log.Debugf("%s handlePutValue %v\n", dht.self, dskey) return pmes, err } diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 6c488c51a6..fd76206272 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -10,10 +10,11 @@ It is generated from these files: It has these top-level messages: Message + Record */ package dht_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -75,7 +76,7 @@ type Message struct { Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` // Used to return a value // PUT_VALUE, GET_VALUE - Value []byte `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + Record *Record `protobuf:"bytes,3,opt,name=record" json:"record,omitempty"` // Used to return peers closer to a key in a query // GET_VALUE, GET_PROVIDERS, FIND_NODE CloserPeers []*Message_Peer `protobuf:"bytes,8,rep,name=closerPeers" json:"closerPeers,omitempty"` @@ -110,9 +111,9 @@ func (m *Message) GetKey() string { return "" } -func (m *Message) GetValue() []byte { +func (m *Message) GetRecord() *Record { if m != nil { - return m.Value + return m.Record } return nil } @@ -155,6 +156,52 @@ func (m *Message_Peer) GetAddr() string { return "" } +// Record represents a dht record that contains a value +// for a key value pair +type Record struct { + // The key that references this record + Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + // The actual value this record is storing + Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + // hash of the authors public key + Author *string `protobuf:"bytes,3,opt,name=author" json:"author,omitempty"` + // A PKI signature for the key+value+author + Signature []byte `protobuf:"bytes,4,opt,name=signature" json:"signature,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Record) Reset() { *m = Record{} } +func (m *Record) String() string { return proto.CompactTextString(m) } +func (*Record) ProtoMessage() {} + +func (m *Record) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +func (m *Record) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *Record) GetAuthor() string { + if m != nil && m.Author != nil { + return *m.Author + } + return "" +} + +func (m *Record) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + func init() { proto.RegisterEnum("dht.pb.Message_MessageType", Message_MessageType_name, Message_MessageType_value) } diff --git a/routing/dht/pb/dht.proto b/routing/dht/pb/dht.proto index e0696e6859..1b49a15522 100644 --- a/routing/dht/pb/dht.proto +++ b/routing/dht/pb/dht.proto @@ -29,7 +29,7 @@ message Message { // Used to return a value // PUT_VALUE, GET_VALUE - optional bytes value = 3; + optional Record record = 3; // Used to return peers closer to a key in a query // GET_VALUE, GET_PROVIDERS, FIND_NODE @@ -39,3 +39,19 @@ message Message { // GET_VALUE, ADD_PROVIDER, GET_PROVIDERS repeated Peer providerPeers = 9; } + +// Record represents a dht record that contains a value +// for a key value pair +message Record { + // The key that references this record + optional string key = 1; + + // The actual value this record is storing + optional bytes value = 2; + + // hash of the authors public key + optional string author = 3; + + // A PKI signature for the key+value+author + optional bytes signature = 4; +} diff --git a/routing/dht/records.go b/routing/dht/records.go new file mode 100644 index 0000000000..e88b18e7b1 --- /dev/null +++ b/routing/dht/records.go @@ -0,0 +1,69 @@ +package dht + +import ( + "bytes" + "errors" + "strings" + + "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/peer" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" + u "github.com/jbenet/go-ipfs/util" +) + +type ValidatorFunc func(u.Key, []byte) error + +var ErrBadRecord = errors.New("bad dht record") +var ErrInvalidRecordType = errors.New("invalid record keytype") + +// creates and signs a dht record for the given key/value pair +func (dht *IpfsDHT) makePutRecord(key u.Key, value []byte) (*pb.Record, error) { + record := new(pb.Record) + + record.Key = proto.String(key.String()) + record.Value = value + record.Author = proto.String(string(dht.self.ID())) + blob := bytes.Join([][]byte{[]byte(key), value, []byte(dht.self.ID())}, []byte{}) + sig, err := dht.self.PrivKey().Sign(blob) + if err != nil { + return nil, err + } + record.Signature = sig + return record, nil +} + +func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { + // First, validate the signature + p, err := dht.peerstore.Get(peer.ID(r.GetAuthor())) + if err != nil { + return err + } + + blob := bytes.Join([][]byte{[]byte(r.GetKey()), + r.GetValue(), + []byte(r.GetKey())}, []byte{}) + + ok, err := p.PubKey().Verify(blob, r.GetSignature()) + if err != nil { + return err + } + + if !ok { + return ErrBadRecord + } + + // Now, check validity func + parts := strings.Split(r.GetKey(), "/") + if len(parts) < 2 { + log.Error("Record had bad key: %s", r.GetKey()) + return ErrBadRecord + } + + fnc, ok := dht.Validators[parts[0]] + if !ok { + log.Errorf("Unrecognized key prefix: %s", parts[0]) + return ErrInvalidRecordType + } + + return fnc(u.Key(r.GetKey()), r.GetValue()) +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e2e5d2f37e..fedf281d3c 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -25,6 +25,12 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } + rec, err := dht.makePutRecord(key, value) + if err != nil { + log.Error("Creation of record failed!") + return err + } + var peers []peer.Peer for _, route := range dht.routingTables { npeers := route.NearestPeers(kb.ConvertKey(key), KValue) @@ -33,7 +39,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { log.Debugf("%s PutValue qry part %v", dht.self, p) - err := dht.putValueToNetwork(ctx, p, string(key), value) + err := dht.putValueToNetwork(ctx, p, string(key), rec) if err != nil { return nil, err } From 00a9753e6d592154de04cddd68735bb4c32312fc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 10 Nov 2014 14:22:56 -0800 Subject: [PATCH 0338/3147] fix validators and key prefix This commit was moved from ipfs/go-ipfs-routing@08fbaadb0fdef9d2492fd434e7e79692e8f85e23 --- routing/dht/dht_test.go | 21 +++++++++++++++------ routing/dht/ext_test.go | 4 +--- routing/dht/handlers.go | 1 + routing/dht/records.go | 16 +++++++++------- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 133e28b583..e62145d5b2 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -33,6 +33,9 @@ func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { d := NewDHT(ctx, p, peerstore, net, dhts, ds.NewMapDatastore()) dhts.SetHandler(d) + d.Validators["v"] = func(u.Key, []byte) error { + return nil + } return d } @@ -136,6 +139,12 @@ func TestValueGetSet(t *testing.T) { dhtA := setupDHT(ctx, t, peerA) dhtB := setupDHT(ctx, t, peerB) + vf := func(u.Key, []byte) error { + return nil + } + dhtA.Validators["v"] = vf + dhtB.Validators["v"] = vf + defer dhtA.Close() defer dhtB.Close() defer dhtA.dialer.(inet.Network).Close() @@ -147,10 +156,10 @@ func TestValueGetSet(t *testing.T) { } ctxT, _ := context.WithTimeout(ctx, time.Second) - dhtA.PutValue(ctxT, "hello", []byte("world")) + dhtA.PutValue(ctxT, "/v/hello", []byte("world")) ctxT, _ = context.WithTimeout(ctx, time.Second*2) - val, err := dhtA.GetValue(ctxT, "hello") + val, err := dhtA.GetValue(ctxT, "/v/hello") if err != nil { t.Fatal(err) } @@ -160,7 +169,7 @@ func TestValueGetSet(t *testing.T) { } ctxT, _ = context.WithTimeout(ctx, time.Second*2) - val, err = dhtB.GetValue(ctxT, "hello") + val, err = dhtB.GetValue(ctxT, "/v/hello") if err != nil { t.Fatal(err) } @@ -326,12 +335,12 @@ func TestLayeredGet(t *testing.T) { t.Fatal(err) } - err = dhts[3].putLocal(u.Key("hello"), []byte("world")) + err = dhts[3].putLocal(u.Key("/v/hello"), []byte("world")) if err != nil { t.Fatal(err) } - err = dhts[3].Provide(ctx, u.Key("hello")) + err = dhts[3].Provide(ctx, u.Key("/v/hello")) if err != nil { t.Fatal(err) } @@ -339,7 +348,7 @@ func TestLayeredGet(t *testing.T) { time.Sleep(time.Millisecond * 60) ctxT, _ := context.WithTimeout(ctx, time.Second) - val, err := dhts[0].GetValue(ctxT, u.Key("hello")) + val, err := dhts[0].GetValue(ctxT, u.Key("/v/hello")) if err != nil { t.Fatal(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index dcf80e4d0a..55a68ef9e6 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -4,6 +4,7 @@ import ( "testing" crand "crypto/rand" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" @@ -199,9 +200,6 @@ func TestGetFailures(t *testing.T) { if pmes.GetRecord() != nil { t.Fatal("shouldnt have value") } - if len(pmes.GetCloserPeers()) > 0 { - t.Fatal("shouldnt have closer peers") - } if pmes.GetProviderPeers() != nil { t.Fatal("shouldnt have provider peers") } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 899f242927..cdea759da2 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -114,6 +114,7 @@ func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *pb.Message) (*pb.Message, err := dht.verifyRecord(pmes.GetRecord()) if err != nil { + fmt.Println(u.Key(pmes.GetRecord().GetAuthor())) log.Error("Bad dht record in put request") return nil, err } diff --git a/routing/dht/records.go b/routing/dht/records.go index e88b18e7b1..692f04d4f2 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -20,7 +20,7 @@ var ErrInvalidRecordType = errors.New("invalid record keytype") func (dht *IpfsDHT) makePutRecord(key u.Key, value []byte) (*pb.Record, error) { record := new(pb.Record) - record.Key = proto.String(key.String()) + record.Key = proto.String(string(key)) record.Value = value record.Author = proto.String(string(dht.self.ID())) blob := bytes.Join([][]byte{[]byte(key), value, []byte(dht.self.ID())}, []byte{}) @@ -38,13 +38,15 @@ func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { if err != nil { return err } + k := u.Key(r.GetKey()) - blob := bytes.Join([][]byte{[]byte(r.GetKey()), + blob := bytes.Join([][]byte{[]byte(k), r.GetValue(), - []byte(r.GetKey())}, []byte{}) + []byte(r.GetAuthor())}, []byte{}) ok, err := p.PubKey().Verify(blob, r.GetSignature()) if err != nil { + log.Error("Signature verify failed.") return err } @@ -54,14 +56,14 @@ func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { // Now, check validity func parts := strings.Split(r.GetKey(), "/") - if len(parts) < 2 { - log.Error("Record had bad key: %s", r.GetKey()) + if len(parts) < 3 { + log.Errorf("Record had bad key: %s", u.Key(r.GetKey())) return ErrBadRecord } - fnc, ok := dht.Validators[parts[0]] + fnc, ok := dht.Validators[parts[1]] if !ok { - log.Errorf("Unrecognized key prefix: %s", parts[0]) + log.Errorf("Unrecognized key prefix: %s", parts[1]) return ErrInvalidRecordType } From 93cb5081e6371b1defd4ef357c83fa9fdef294fa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 9 Nov 2014 23:45:16 -0800 Subject: [PATCH 0339/3147] switch DHT entries over to be records, test currently fail This commit was moved from ipfs/go-namesys@32ab77ee7ca31e288344900d45d39408727f971a --- namesys/publisher.go | 4 ++-- namesys/routing.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index f7bf508b6b..636e3fb49e 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -49,7 +49,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { nameb := u.Hash(pkbytes) namekey := u.Key(nameb).Pretty() - ipnskey := u.Hash([]byte("/ipns/" + namekey)) + ipnskey := []byte("/ipns/" + namekey) // Store associated public key timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*4)) @@ -58,7 +58,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { return err } - // Store ipns entry at h("/ipns/"+b58(h(pubkey))) + // Store ipns entry at "/ipns/"+b58(h(pubkey)) timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*4)) err = p.routing.PutValue(timectx, u.Key(ipnskey), data) if err != nil { diff --git a/namesys/routing.go b/namesys/routing.go index 6259705ec9..5f877bdc3f 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -46,7 +46,7 @@ func (r *routingResolver) Resolve(name string) (string, error) { // use the routing system to get the name. // /ipns/ - h := u.Hash([]byte("/ipns/" + name)) + h := []byte("/ipns/" + name) ipnsKey := u.Key(h) val, err := r.routing.GetValue(ctx, ipnsKey) From 98eba0e2b3d42f206e24727908217e8be4d59360 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 10 Nov 2014 15:48:49 -0800 Subject: [PATCH 0340/3147] validator functions and ipns completion This commit was moved from ipfs/go-ipfs-routing@f90187507737016db59f67c510cd2e5337278289 --- routing/dht/dht.go | 3 +++ routing/dht/records.go | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5d4caaa847..6663871844 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -84,7 +84,10 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Millisecond*1000) dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Hour) dht.birth = time.Now() + dht.Validators = make(map[string]ValidatorFunc) + dht.Validators["ipns"] = ValidateIpnsRecord + dht.Validators["pk"] = ValidatePublicKeyRecord if doPinging { dht.Children().Add(1) diff --git a/routing/dht/records.go b/routing/dht/records.go index 692f04d4f2..763b48f685 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -69,3 +69,13 @@ func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { return fnc(u.Key(r.GetKey()), r.GetValue()) } + +func ValidateIpnsRecord(k u.Key, val []byte) error { + // TODO: + return nil +} + +func ValidatePublicKeyRecord(k u.Key, val []byte) error { + // TODO: + return nil +} From 2b1ba28dcc4d4e4062ef84a33d782d03ae30b93b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 10 Nov 2014 15:48:49 -0800 Subject: [PATCH 0341/3147] validator functions and ipns completion This commit was moved from ipfs/go-namesys@60a12596a7404d70404c511f057a4fcf2e3d484b --- namesys/publisher.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 636e3fb49e..365855b1bf 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -53,7 +53,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { // Store associated public key timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*4)) - err = p.routing.PutValue(timectx, u.Key(nameb), pkbytes) + err = p.routing.PutValue(timectx, u.Key("/pk/"+string(nameb)), pkbytes) if err != nil { return err } diff --git a/namesys/routing.go b/namesys/routing.go index 5f877bdc3f..85eca331af 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -63,7 +63,7 @@ func (r *routingResolver) Resolve(name string) (string, error) { // name should be a public key retrievable from ipfs // /ipfs/ - key := u.Key(hash) + key := u.Key("/pk/" + string(hash)) pkval, err := r.routing.GetValue(ctx, key) if err != nil { log.Warning("RoutingResolve PubKey Get failed.") From ff3e18cd7673de3b4446a44e1d2c4b5b5cefcada Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 16:28:20 -0800 Subject: [PATCH 0342/3147] fix routing resolver This commit was moved from ipfs/go-ipfs-routing@8f742c12bb19b3cbb934ee6a21b68b4bfb24e79d --- routing/dht/dht.go | 3 +++ routing/dht/records.go | 36 +++++++++++++++++++++++++++++++++++- routing/mock/routing.go | 5 +++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6663871844..6b2d3f5bd3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -355,10 +355,12 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { dht.dslock.Lock() defer dht.dslock.Unlock() + log.Debug("getLocal %s", key) v, err := dht.datastore.Get(key.DsKey()) if err != nil { return nil, err } + log.Debug("found in db") byt, ok := v.([]byte) if !ok { @@ -374,6 +376,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { if u.Debug { err = dht.verifyRecord(rec) if err != nil { + log.Errorf("local record verify failed: %s", err) return nil, err } } diff --git a/routing/dht/records.go b/routing/dht/records.go index 763b48f685..9f3b9bdad3 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -4,8 +4,11 @@ import ( "bytes" "errors" "strings" + "time" + "code.google.com/p/go.net/context" "code.google.com/p/goprotobuf/proto" + ci "github.com/jbenet/go-ipfs/crypto" "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" @@ -32,6 +35,29 @@ func (dht *IpfsDHT) makePutRecord(key u.Key, value []byte) (*pb.Record, error) { return record, nil } +func (dht *IpfsDHT) getPublicKey(pid peer.ID) (ci.PubKey, error) { + log.Debug("getPublicKey for: %s", pid) + p, err := dht.peerstore.Get(pid) + if err == nil { + return p.PubKey(), nil + } + + log.Debug("not in peerstore, searching dht.") + ctxT, _ := context.WithTimeout(dht.ContextCloser.Context(), time.Second*5) + val, err := dht.GetValue(ctxT, u.Key("/pk/"+string(pid))) + if err != nil { + log.Warning("Failed to find requested public key.") + return nil, err + } + + pubkey, err := ci.UnmarshalPublicKey(val) + if err != nil { + log.Errorf("Failed to unmarshal public key: %s", err) + return nil, err + } + return pubkey, nil +} + func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { // First, validate the signature p, err := dht.peerstore.Get(peer.ID(r.GetAuthor())) @@ -76,6 +102,14 @@ func ValidateIpnsRecord(k u.Key, val []byte) error { } func ValidatePublicKeyRecord(k u.Key, val []byte) error { - // TODO: + keyparts := bytes.Split([]byte(k), []byte("/")) + if len(keyparts) < 3 { + return errors.New("invalid key") + } + + pkh := u.Hash(val) + if !bytes.Equal(keyparts[2], pkh) { + return errors.New("public key does not match storage key") + } return nil } diff --git a/routing/mock/routing.go b/routing/mock/routing.go index 9c69195896..358d579019 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -12,6 +12,8 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +var log = u.Logger("mockrouter") + var _ routing.IpfsRouting = &MockRouter{} type MockRouter struct { @@ -33,10 +35,12 @@ func (mr *MockRouter) SetRoutingServer(rs RoutingServer) { } func (mr *MockRouter) PutValue(ctx context.Context, key u.Key, val []byte) error { + log.Debugf("PutValue: %s", key) return mr.datastore.Put(key.DsKey(), val) } func (mr *MockRouter) GetValue(ctx context.Context, key u.Key) ([]byte, error) { + log.Debugf("GetValue: %s", key) v, err := mr.datastore.Get(key.DsKey()) if err != nil { return nil, err @@ -55,6 +59,7 @@ func (mr *MockRouter) FindProviders(ctx context.Context, key u.Key) ([]peer.Peer } func (mr *MockRouter) FindPeer(ctx context.Context, pid peer.ID) (peer.Peer, error) { + log.Debug("FindPeer: %s", pid) return nil, nil } From 24452e92398428f91317251ed2f534111fe261df Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 16:28:20 -0800 Subject: [PATCH 0343/3147] fix routing resolver This commit was moved from ipfs/go-namesys@4361cbc77074d02d74d06a86f8dd35591f8f1fec --- namesys/publisher.go | 16 +++++++++++----- namesys/routing.go | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 365855b1bf..9aaaa1cc3c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -33,34 +33,40 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { // validate `value` is a ref (multihash) _, err := mh.FromB58String(value) if err != nil { + log.Errorf("hash cast failed: %s", value) return fmt.Errorf("publish value must be str multihash. %v", err) } ctx := context.TODO() data, err := createRoutingEntryData(k, value) if err != nil { + log.Error("entry creation failed.") return err } pubkey := k.GetPublic() pkbytes, err := pubkey.Bytes() if err != nil { - return nil + log.Error("pubkey getbytes failed.") + return err } nameb := u.Hash(pkbytes) - namekey := u.Key(nameb).Pretty() - ipnskey := []byte("/ipns/" + namekey) + namekey := u.Key("/pk/" + string(nameb)) + log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*4)) - err = p.routing.PutValue(timectx, u.Key("/pk/"+string(nameb)), pkbytes) + err = p.routing.PutValue(timectx, namekey, pkbytes) if err != nil { return err } + ipnskey := u.Key("/ipns/" + string(nameb)) + + log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*4)) - err = p.routing.PutValue(timectx, u.Key(ipnskey), data) + err = p.routing.PutValue(timectx, ipnskey, data) if err != nil { return err } diff --git a/namesys/routing.go b/namesys/routing.go index 85eca331af..c956f4c447 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -46,7 +46,7 @@ func (r *routingResolver) Resolve(name string) (string, error) { // use the routing system to get the name. // /ipns/ - h := []byte("/ipns/" + name) + h := []byte("/ipns/" + string(hash)) ipnsKey := u.Key(h) val, err := r.routing.GetValue(ctx, ipnsKey) From d99e0be98b05ae6e280a0c22c884acd852598917 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 16:42:37 -0800 Subject: [PATCH 0344/3147] make vendor This commit was moved from ipfs/go-ipfs-routing@5c3d9fb3d11d7bad5aa74539dee886a0452c3871 --- routing/dht/handlers.go | 2 +- routing/dht/pb/dht.pb.go | 2 +- routing/dht/records.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index cdea759da2..bd4b813eec 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" peer "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index fd76206272..3e52a94ed8 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package dht_pb -import proto "code.google.com/p/gogoprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/routing/dht/records.go b/routing/dht/records.go index 9f3b9bdad3..c8397c960e 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -6,8 +6,8 @@ import ( "strings" "time" - "code.google.com/p/go.net/context" - "code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" From 9786219362d38123f0192b8535ee9049662ac025 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 17:58:08 -0800 Subject: [PATCH 0345/3147] verify ipns records This commit was moved from ipfs/go-namesys@e0ce21a1ac953815de90f5fb023bfb221a7281ca --- namesys/internal/pb/namesys.pb.go | 56 ++++++++++++++++++++++++++++--- namesys/internal/pb/namesys.proto | 7 ++++ namesys/publisher.go | 49 +++++++++++++++++++++++++-- namesys/routing.go | 4 ++- 4 files changed, 109 insertions(+), 7 deletions(-) diff --git a/namesys/internal/pb/namesys.pb.go b/namesys/internal/pb/namesys.pb.go index b5d8885a26..81021b8180 100644 --- a/namesys/internal/pb/namesys.pb.go +++ b/namesys/internal/pb/namesys.pb.go @@ -13,17 +13,50 @@ It has these top-level messages: */ package namesys_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = math.Inf +type IpnsEntry_ValidityType int32 + +const ( + // setting an EOL says "this record is valid until..." + IpnsEntry_EOL IpnsEntry_ValidityType = 0 +) + +var IpnsEntry_ValidityType_name = map[int32]string{ + 0: "EOL", +} +var IpnsEntry_ValidityType_value = map[string]int32{ + "EOL": 0, +} + +func (x IpnsEntry_ValidityType) Enum() *IpnsEntry_ValidityType { + p := new(IpnsEntry_ValidityType) + *p = x + return p +} +func (x IpnsEntry_ValidityType) String() string { + return proto.EnumName(IpnsEntry_ValidityType_name, int32(x)) +} +func (x *IpnsEntry_ValidityType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(IpnsEntry_ValidityType_value, data, "IpnsEntry_ValidityType") + if err != nil { + return err + } + *x = IpnsEntry_ValidityType(value) + return nil +} + type IpnsEntry struct { - Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` - XXX_unrecognized []byte `json:"-"` + Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` + ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=namesys.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` + Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *IpnsEntry) Reset() { *m = IpnsEntry{} } @@ -44,5 +77,20 @@ func (m *IpnsEntry) GetSignature() []byte { return nil } +func (m *IpnsEntry) GetValidityType() IpnsEntry_ValidityType { + if m != nil && m.ValidityType != nil { + return *m.ValidityType + } + return IpnsEntry_EOL +} + +func (m *IpnsEntry) GetValidity() []byte { + if m != nil { + return m.Validity + } + return nil +} + func init() { + proto.RegisterEnum("namesys.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) } diff --git a/namesys/internal/pb/namesys.proto b/namesys/internal/pb/namesys.proto index ac8a78da3f..4219af6bba 100644 --- a/namesys/internal/pb/namesys.proto +++ b/namesys/internal/pb/namesys.proto @@ -1,6 +1,13 @@ package namesys.pb; message IpnsEntry { + enum ValidityType { + // setting an EOL says "this record is valid until..." + EOL = 0; + } required bytes value = 1; required bytes signature = 2; + + optional ValidityType validityType = 3; + optional bytes validity = 4; } diff --git a/namesys/publisher.go b/namesys/publisher.go index 9aaaa1cc3c..7123264dbf 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -1,6 +1,8 @@ package namesys import ( + "bytes" + "errors" "fmt" "time" @@ -14,6 +16,12 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +// ErrExpiredRecord should be returned when an ipns record is +// invalid due to being too old +var ErrExpiredRecord = errors.New("expired record") + +var ErrUnrecognizedValidity = errors.New("unrecognized validity type") + // ipnsPublisher is capable of publishing and resolving names to the IPFS // routing system. type ipnsPublisher struct { @@ -76,11 +84,48 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { func createRoutingEntryData(pk ci.PrivKey, val string) ([]byte, error) { entry := new(pb.IpnsEntry) - sig, err := pk.Sign([]byte(val)) + + entry.Value = []byte(val) + typ := pb.IpnsEntry_EOL + entry.ValidityType = &typ + entry.Validity = []byte(time.Now().Add(time.Hour * 24).String()) + + sig, err := pk.Sign(ipnsEntryDataForSig(entry)) if err != nil { return nil, err } entry.Signature = sig - entry.Value = []byte(val) return proto.Marshal(entry) } + +func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { + return bytes.Join([][]byte{ + e.Value, + e.Validity, + []byte(fmt.Sprint(e.GetValidityType())), + }, + []byte{}) +} + +func ValidateIpnsRecord(k u.Key, val []byte) error { + entry := new(pb.IpnsEntry) + err := proto.Unmarshal(val, entry) + if err != nil { + return err + } + switch entry.GetValidityType() { + case pb.IpnsEntry_EOL: + defaultTimeFormat := "2006-01-02 15:04:05.999999999 -0700 MST" + t, err := time.Parse(defaultTimeFormat, string(entry.GetValue())) + if err != nil { + log.Error("Failed parsing time for ipns record EOL") + return err + } + if time.Now().After(t) { + return ErrExpiredRecord + } + default: + return ErrUnrecognizedValidity + } + return nil +} diff --git a/namesys/routing.go b/namesys/routing.go index c956f4c447..c990b492b9 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -75,9 +75,11 @@ func (r *routingResolver) Resolve(name string) (string, error) { if err != nil { return "", err } + hsh, _ := pk.Hash() + log.Debugf("pk hash = %s", u.Key(hsh)) // check sig with pk - if ok, err := pk.Verify(entry.GetValue(), entry.GetSignature()); err != nil || !ok { + if ok, err := pk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pk) } From c055343405d24bd629b6243559c28cc93de9f12d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 17:58:08 -0800 Subject: [PATCH 0346/3147] verify ipns records This commit was moved from ipfs/go-ipfs-routing@8a2d50b57d53a370337662f94eafd8e3c4e58019 --- routing/dht/dht.go | 1 - routing/dht/records.go | 5 ----- 2 files changed, 6 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6b2d3f5bd3..db17f9e7eb 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -86,7 +86,6 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia dht.birth = time.Now() dht.Validators = make(map[string]ValidatorFunc) - dht.Validators["ipns"] = ValidateIpnsRecord dht.Validators["pk"] = ValidatePublicKeyRecord if doPinging { diff --git a/routing/dht/records.go b/routing/dht/records.go index c8397c960e..ee1257e24c 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -96,11 +96,6 @@ func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { return fnc(u.Key(r.GetKey()), r.GetValue()) } -func ValidateIpnsRecord(k u.Key, val []byte) error { - // TODO: - return nil -} - func ValidatePublicKeyRecord(k u.Key, val []byte) error { keyparts := bytes.Split([]byte(k), []byte("/")) if len(keyparts) < 3 { From 5fc2b91480ecf376015d56879eaf0319f2731b3e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 18:04:01 -0800 Subject: [PATCH 0347/3147] make vendor This commit was moved from ipfs/go-namesys@2084a38eb41ed240ba5e73dd7ccd29762f18e5ff --- namesys/internal/pb/namesys.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/internal/pb/namesys.pb.go b/namesys/internal/pb/namesys.pb.go index 81021b8180..68b93a2c42 100644 --- a/namesys/internal/pb/namesys.pb.go +++ b/namesys/internal/pb/namesys.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package namesys_pb -import proto "code.google.com/p/gogoprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 063417cef9f732e95e7aeb82cf17b81a76833cce Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 19:43:53 -0800 Subject: [PATCH 0348/3147] some comments This commit was moved from ipfs/go-ipfs-routing@c0164029beaadf16af4d0aed97c796289f21367d --- routing/dht/records.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/routing/dht/records.go b/routing/dht/records.go index ee1257e24c..0a3b4f4e0c 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -14,9 +14,16 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +// ValidatorFunc is a function that is called to validate a given +// type of DHTRecord. type ValidatorFunc func(u.Key, []byte) error +// ErrBadRecord is returned any time a dht record is found to be +// incorrectly formatted or signed. var ErrBadRecord = errors.New("bad dht record") + +// ErrInvalidRecordType is returned if a DHTRecord keys prefix +// is not found in the Validator map of the DHT. var ErrInvalidRecordType = errors.New("invalid record keytype") // creates and signs a dht record for the given key/value pair @@ -96,6 +103,9 @@ func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { return fnc(u.Key(r.GetKey()), r.GetValue()) } +// ValidatePublicKeyRecord implements ValidatorFunc and +// verifies that the passed in record value is the PublicKey +// that matches the passed in key. func ValidatePublicKeyRecord(k u.Key, val []byte) error { keyparts := bytes.Split([]byte(k), []byte("/")) if len(keyparts) < 3 { From 673552c600047cffba72c24863d1187296c4af14 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Nov 2014 19:43:53 -0800 Subject: [PATCH 0349/3147] some comments This commit was moved from ipfs/go-namesys@0a01f43a023e3662b0faf55516d8ca13575c9386 --- namesys/publisher.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/namesys/publisher.go b/namesys/publisher.go index 7123264dbf..5b2da0c17c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -20,6 +20,8 @@ import ( // invalid due to being too old var ErrExpiredRecord = errors.New("expired record") +// ErrUnrecognizedValidity is returned when an IpnsRecord has an +// unknown validity type. var ErrUnrecognizedValidity = errors.New("unrecognized validity type") // ipnsPublisher is capable of publishing and resolving names to the IPFS @@ -107,6 +109,8 @@ func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { []byte{}) } +// ValidateIpnsRecord implements ValidatorFunc and verifies that the +// given 'val' is an IpnsEntry and that that entry is valid. func ValidateIpnsRecord(k u.Key, val []byte) error { entry := new(pb.IpnsEntry) err := proto.Unmarshal(val, entry) From 4bb64a796e1212350ec3be81e54608c70eb638ed Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Nov 2014 11:00:45 -0800 Subject: [PATCH 0350/3147] address comments from PR This commit was moved from ipfs/go-ipfs-routing@9c553435978e0381007cf5bcdad7616997cc9c38 --- routing/dht/dht.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index db17f9e7eb..efe457c658 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -273,6 +273,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, // make sure record is still valid err = dht.verifyRecord(record) if err != nil { + log.Error("Received invalid record!") return nil, nil, err } return record.GetValue(), nil, nil From 9b084d3d5ccd57740cf3ab1bca815e54b5ad8d79 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Nov 2014 11:00:45 -0800 Subject: [PATCH 0351/3147] address comments from PR This commit was moved from ipfs/go-namesys@0c6b8f23465fa4932ae7df5f8143566b2ad1ca4b --- namesys/publisher.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 5b2da0c17c..a6be2a570b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -90,7 +90,7 @@ func createRoutingEntryData(pk ci.PrivKey, val string) ([]byte, error) { entry.Value = []byte(val) typ := pb.IpnsEntry_EOL entry.ValidityType = &typ - entry.Validity = []byte(time.Now().Add(time.Hour * 24).String()) + entry.Validity = []byte(u.FormatRFC3339(time.Now().Add(time.Hour * 24))) sig, err := pk.Sign(ipnsEntryDataForSig(entry)) if err != nil { @@ -119,8 +119,7 @@ func ValidateIpnsRecord(k u.Key, val []byte) error { } switch entry.GetValidityType() { case pb.IpnsEntry_EOL: - defaultTimeFormat := "2006-01-02 15:04:05.999999999 -0700 MST" - t, err := time.Parse(defaultTimeFormat, string(entry.GetValue())) + t, err := u.ParseRFC3339(string(entry.GetValue())) if err != nil { log.Error("Failed parsing time for ipns record EOL") return err From 280e19df3996730b3439e927bad55a9923876bfb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 15 Nov 2014 18:31:06 -0800 Subject: [PATCH 0352/3147] log(dht) log a couple events to demonstrate API License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@da21d99fcc6f95db088a34c338028917c5b00758 --- routing/dht/dht.go | 5 ++++- routing/dht/pb/message.go | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index efe457c658..1af4a29bd9 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,6 +18,7 @@ import ( kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" ctxc "github.com/jbenet/go-ipfs/util/ctxcloser" + "github.com/jbenet/go-ipfs/util/elog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -25,7 +26,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) -var log = u.Logger("dht") +var log = elog.Logger("dht") const doPinging = false @@ -152,6 +153,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N dht.Update(mPeer) // Print out diagnostic + log.Event(ctx, "foo", dht.self, mPeer, pmes) log.Debugf("%s got message type: '%s' from %s", dht.self, pb.Message_MessageType_name[int32(pmes.GetType())], mPeer) @@ -197,6 +199,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Messa start := time.Now() // Print out diagnostic + log.Event(ctx, "sentMessage", dht.self, p, pmes) log.Debugf("Sent message type: '%s' to %s", pb.Message_MessageType_name[int32(pmes.GetType())], p) diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index a77a5b9176..6ea98d4cdb 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -65,3 +65,11 @@ func (m *Message) SetClusterLevel(level int) { lvl := int32(level) m.ClusterLevelRaw = &lvl } + +func (m *Message) Loggable() map[string]interface{} { + return map[string]interface{}{ + "message": map[string]string{ + "type": m.Type.String(), + }, + } +} From 1aeb51f94b19aa3c6039ed73b362892c86e89e35 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 16 Nov 2014 04:01:02 -0800 Subject: [PATCH 0353/3147] refactor(eventlog) elog -> eventlog License: MIT Signed-off-by: Brian Tiger Chow # TYPES # feat # fix # docs # style (formatting, missing semi colons, etc; no code change): # refactor # test (adding missing tests, refactoring tests; no production code change) # chore (updating grunt tasks etc; no production code change) Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@bae86b669ee3e7360fd32b487ada7d62b1b7f273 --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1af4a29bd9..f042bbd4bc 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -26,7 +26,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) -var log = elog.Logger("dht") +var log = eventlog.Logger("dht") const doPinging = false From 80eb6d6d9c0576d490f623b309b1eec682dbd9fb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 16 Nov 2014 04:53:07 -0800 Subject: [PATCH 0354/3147] fix(imports) misc License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@310647fead1cda84c668e3f8aacced667eac8168 --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f042bbd4bc..7a61c75f05 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,7 +18,7 @@ import ( kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" ctxc "github.com/jbenet/go-ipfs/util/ctxcloser" - "github.com/jbenet/go-ipfs/util/elog" + "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" From c0a44ad37fbc6b6e51456db136c4bbcd31c82768 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 16 Nov 2014 07:40:05 -0800 Subject: [PATCH 0355/3147] fix(misc) address PR comments License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@ece27cae7ad9fee01c999105216d36ea2486286e --- routing/dht/dht.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 7a61c75f05..f4d2948bc0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -152,10 +152,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N // update the peer (on valid msgs only) dht.Update(mPeer) - // Print out diagnostic log.Event(ctx, "foo", dht.self, mPeer, pmes) - log.Debugf("%s got message type: '%s' from %s", - dht.self, pb.Message_MessageType_name[int32(pmes.GetType())], mPeer) // get handler for this msg type. handler := dht.handlerForMsgType(pmes.GetType()) @@ -198,10 +195,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Messa start := time.Now() - // Print out diagnostic log.Event(ctx, "sentMessage", dht.self, p, pmes) - log.Debugf("Sent message type: '%s' to %s", - pb.Message_MessageType_name[int32(pmes.GetType())], p) rmes, err := dht.sender.SendRequest(ctx, mes) if err != nil { From cdd158c69fbe0f150afcae1011cd227b664f6fa4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 18 Nov 2014 05:48:04 -0800 Subject: [PATCH 0356/3147] SizeSplitter fix: keep-reading until chunk full if the underlying reader is buffered with a smaller buffer it would force the chunk sizes to come out smaller than intended. cc @whyrusleeping @mappum This commit was moved from ipfs/go-ipfs-chunker@6ddb6d481c46d2def1a25884cd8f22dbf83291b1 --- chunker/splitting.go | 31 +++++++++++++++++-------- chunker/splitting_test.go | 49 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 2d92a9ead9..87d48be851 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -23,23 +23,34 @@ func (ss *SizeSplitter) Split(r io.Reader) chan []byte { out := make(chan []byte) go func() { defer close(out) + + // all-chunks loop (keep creating chunks) for { + // log.Infof("making chunk with size: %d", ss.Size) chunk := make([]byte, ss.Size) - nread, err := r.Read(chunk) - if err != nil { + sofar := 0 + + // this-chunk loop (keep reading until this chunk full) + for { + nread, err := r.Read(chunk[sofar:]) + sofar += nread if err == io.EOF { - if nread > 0 { - out <- chunk[:nread] + if sofar > 0 { + // log.Infof("sending out chunk with size: %d", sofar) + out <- chunk[:sofar] } return } - log.Errorf("Block split error: %s", err) - return - } - if nread < ss.Size { - chunk = chunk[:nread] + if err != nil { + log.Errorf("Block split error: %s", err) + return + } + if sofar == ss.Size { + // log.Infof("sending out chunk with size: %d", sofar) + out <- chunk[:sofar] + break // break out of this-chunk loop + } } - out <- chunk } }() return out diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 612da4d097..1385b9069a 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -3,6 +3,7 @@ package chunk import ( "bytes" "crypto/rand" + "io" "testing" ) @@ -54,3 +55,51 @@ func TestSizeSplitterIsDeterministic(t *testing.T) { test() } } + +func TestSizeSplitterFillsChunks(t *testing.T) { + if testing.Short() { + t.SkipNow() + } + + max := 10000000 + b := randBuf(t, max) + r := &clipReader{r: bytes.NewReader(b), size: 4000} + s := SizeSplitter{Size: 1024 * 256} + c := s.Split(r) + + sofar := 0 + whole := make([]byte, max) + for chunk := range c { + + bc := b[sofar : sofar+len(chunk)] + if !bytes.Equal(bc, chunk) { + t.Fatalf("chunk not correct: (sofar: %d) %d != %d, %v != %v", sofar, len(bc), len(chunk), bc[:100], chunk[:100]) + } + + copy(whole[sofar:], chunk) + + sofar += len(chunk) + if sofar != max && len(chunk) < s.Size { + t.Fatal("sizesplitter split at a smaller size") + } + } + + if !bytes.Equal(b, whole) { + t.Fatal("splitter did not split right") + } +} + +type clipReader struct { + size int + r io.Reader +} + +func (s *clipReader) Read(buf []byte) (int, error) { + + // clip the incoming buffer to produce smaller chunks + if len(buf) > s.size { + buf = buf[:s.size] + } + + return s.r.Read(buf) +} From 905713be8844039bad0a85f20104fcca68539e14 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Tue, 18 Nov 2014 23:02:22 -0800 Subject: [PATCH 0357/3147] pin: Added a Pinner#Set function to retrieve the set of pinned keys This commit was moved from ipfs/go-ipfs-pinner@d6fd1f2add1c10f69c43c442a77eed1d77364424 --- pinning/pinner/pin.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 60828b597a..1d840c6bca 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -33,6 +33,7 @@ type Pinner interface { Unpin(util.Key, bool) error Flush() error GetManual() ManualPinner + Set() set.BlockSet } // ManualPinner is for manually editing the pin structure @@ -207,6 +208,11 @@ func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { return p, nil } +// Set returns a blockset of directly pinned keys +func (p *pinner) Set() set.BlockSet { + return p.directPin +} + // Flush encodes and writes pinner keysets to the datastore func (p *pinner) Flush() error { p.lock.RLock() From 47b6bd49f82ed3712a476a2b79cf9e9e300d8a6a Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Wed, 19 Nov 2014 00:53:23 -0800 Subject: [PATCH 0358/3147] pin: Return copies of pinned keys, of each type (direct/indirect/recursive) This commit was moved from ipfs/go-ipfs-pinner@22ab7890cd6741d3663a286ba07eb1a7bc618308 --- pinning/pinner/indirect.go | 4 ++++ pinning/pinner/pin.go | 20 ++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index b15b720ee7..9e67bc2c9f 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -65,3 +65,7 @@ func (i *indirectPin) Decrement(k util.Key) { func (i *indirectPin) HasKey(k util.Key) bool { return i.blockset.HasKey(k) } + +func (i *indirectPin) Set() set.BlockSet { + return i.blockset +} diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 1d840c6bca..371497da69 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -33,7 +33,9 @@ type Pinner interface { Unpin(util.Key, bool) error Flush() error GetManual() ManualPinner - Set() set.BlockSet + DirectKeys() []util.Key + IndirectKeys() []util.Key + RecursiveKeys() []util.Key } // ManualPinner is for manually editing the pin structure @@ -208,9 +210,19 @@ func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { return p, nil } -// Set returns a blockset of directly pinned keys -func (p *pinner) Set() set.BlockSet { - return p.directPin +// DirectKeys returns a slice containing the directly pinned keys +func (p *pinner) DirectKeys() []util.Key { + return p.directPin.GetKeys() +} + +// IndirectKeys returns a slice containing the indirectly pinned keys +func (p *pinner) IndirectKeys() []util.Key { + return p.indirPin.Set().GetKeys() +} + +// RecursiveKeys returns a slice containing the recursively pinned keys +func (p *pinner) RecursiveKeys() []util.Key { + return p.recursePin.GetKeys() } // Flush encodes and writes pinner keysets to the datastore From df61fec6360470dcab7fdbc2abeceb7fc2fe0962 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 18 Nov 2014 23:03:58 -0800 Subject: [PATCH 0359/3147] importer: simplified splitter The splitter is simplified using io.ReadFull, as this function does exactly what we wanted. I believe io.ErrUnexpectedEOF should be handled as an EOF here, but please correct me if I'm wrong. This commit was moved from ipfs/go-ipfs-chunker@de56900e6d79a43be1d707c6ad3ab403b67553bd --- chunker/splitting.go | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 87d48be851..65a79d5adc 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -28,28 +28,17 @@ func (ss *SizeSplitter) Split(r io.Reader) chan []byte { for { // log.Infof("making chunk with size: %d", ss.Size) chunk := make([]byte, ss.Size) - sofar := 0 - - // this-chunk loop (keep reading until this chunk full) - for { - nread, err := r.Read(chunk[sofar:]) - sofar += nread - if err == io.EOF { - if sofar > 0 { - // log.Infof("sending out chunk with size: %d", sofar) - out <- chunk[:sofar] - } - return - } - if err != nil { - log.Errorf("Block split error: %s", err) - return - } - if sofar == ss.Size { - // log.Infof("sending out chunk with size: %d", sofar) - out <- chunk[:sofar] - break // break out of this-chunk loop - } + nread, err := io.ReadFull(r, chunk) + if nread > 0 { + // log.Infof("sending out chunk with size: %d", sofar) + out <- chunk[:nread] + } + if err == io.EOF || err == io.ErrUnexpectedEOF { + return + } + if err != nil { + log.Errorf("Block split error: %s", err) + return } } }() From 4329fae7c38f639c7fe3b2fc4109c8e2023f3bfb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 22 Nov 2014 20:02:45 -0800 Subject: [PATCH 0360/3147] log(dht) add eventlog.Update event License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@90f57a2425e2dc879d11abc47b326af63672f5eb --- routing/dht/dht.go | 8 ++++---- routing/dht/ext_test.go | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f4d2948bc0..30fe446304 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -121,7 +121,7 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, er return nil, fmt.Errorf("failed to ping newly connected peer: %s\n", err) } - dht.Update(npeer) + dht.Update(ctx, npeer) return npeer, nil } @@ -150,7 +150,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N } // update the peer (on valid msgs only) - dht.Update(mPeer) + dht.Update(ctx, mPeer) log.Event(ctx, "foo", dht.self, mPeer, pmes) @@ -397,8 +397,8 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals to all routingTables to Update their last-seen status // on the given peer. -func (dht *IpfsDHT) Update(p peer.Peer) { - log.Debugf("updating peer: %s latency = %f\n", p, p.GetLatency().Seconds()) +func (dht *IpfsDHT) Update(ctx context.Context, p peer.Peer) { + log.Event(ctx, "updatePeer", p) removedCount := 0 for _, route := range dht.routingTables { removed := route.Update(p) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 55a68ef9e6..791c1066c8 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -129,7 +129,7 @@ func TestGetFailures(t *testing.T) { d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) other := makePeer(nil) - d.Update(other) + d.Update(ctx, other) // This one should time out // u.POut("Timout Test\n") @@ -232,7 +232,7 @@ func TestNotFound(t *testing.T) { var ps []peer.Peer for i := 0; i < 5; i++ { ps = append(ps, _randPeer()) - d.Update(ps[i]) + d.Update(ctx, ps[i]) } // Reply with random peers to every message @@ -298,7 +298,7 @@ func TestLessThanKResponses(t *testing.T) { var ps []peer.Peer for i := 0; i < 5; i++ { ps = append(ps, _randPeer()) - d.Update(ps[i]) + d.Update(ctx, ps[i]) } other := _randPeer() From e0319c07b5aa67a7c85fc5e5d81cf2d982406d30 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 25 Nov 2014 04:17:37 -0800 Subject: [PATCH 0361/3147] log(dht) Event: connect License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@9f3591b60c8c518f1a9a9d0f02f6b42c73aca8c5 --- routing/dht/dht.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 30fe446304..f76ca8f593 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -98,8 +98,6 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, error) { - log.Debugf("Connect to new peer: %s", npeer) - // TODO(jbenet,whyrusleeping) // // Connect should take in a Peer (with ID). In a sense, we shouldn't be @@ -120,6 +118,7 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, er if err != nil { return nil, fmt.Errorf("failed to ping newly connected peer: %s\n", err) } + log.Event(ctx, "connect", dht.self, npeer) dht.Update(ctx, npeer) From ac8f278bb1304bb0577a9a92148e0f7b3e69a7ed Mon Sep 17 00:00:00 2001 From: Simon Kirkby Date: Thu, 4 Dec 2014 20:39:35 +0800 Subject: [PATCH 0362/3147] Validity time not checked properly name publishing was failing of bad format. This commit was moved from ipfs/go-namesys@5eb019b08064a21fddbdb8040f844fde56ac7128 --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index a6be2a570b..be838b2f07 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -119,7 +119,7 @@ func ValidateIpnsRecord(k u.Key, val []byte) error { } switch entry.GetValidityType() { case pb.IpnsEntry_EOL: - t, err := u.ParseRFC3339(string(entry.GetValue())) + t, err := u.ParseRFC3339(string(entry.GetValidity())) if err != nil { log.Error("Failed parsing time for ipns record EOL") return err From 6e4ad54b5c8f64c61ee843892695af5e90d7c8bc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 18 Nov 2014 21:31:00 -0800 Subject: [PATCH 0363/3147] beginnings of a bitswap refactor This commit was moved from ipfs/go-blockservice@59b4a639336cf4483b7d4f213f48319b43c50e1c --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 82a1b03c1c..2eb3d695d3 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -85,7 +85,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er }, nil } else if err == ds.ErrNotFound && s.Remote != nil { log.Debug("Blockservice: Searching bitswap.") - blk, err := s.Remote.Block(ctx, k) + blk, err := s.Remote.GetBlock(ctx, k) if err != nil { return nil, err } From 22d98a68c43da0b0f34d0618771b895a03127e85 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 18 Nov 2014 21:31:00 -0800 Subject: [PATCH 0364/3147] beginnings of a bitswap refactor This commit was moved from ipfs/go-ipfs-exchange-offline@abc92d594bbd262d583d064a13501bcb70894f17 --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 5f7ef88355..37d672f73d 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -23,10 +23,10 @@ func NewOfflineExchange() exchange.Interface { type offlineExchange struct { } -// Block returns nil to signal that a block could not be retrieved for the +// GetBlock returns nil to signal that a block could not be retrieved for the // given key. // NB: This function may return before the timeout expires. -func (_ *offlineExchange) Block(context.Context, u.Key) (*blocks.Block, error) { +func (_ *offlineExchange) GetBlock(context.Context, u.Key) (*blocks.Block, error) { return nil, OfflineMode } diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index cc3f3ec82b..ae3fdaa0a5 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -11,7 +11,7 @@ import ( func TestBlockReturnsErr(t *testing.T) { off := NewOfflineExchange() - _, err := off.Block(context.Background(), u.Key("foo")) + _, err := off.GetBlock(context.Background(), u.Key("foo")) if err != nil { return // as desired } From 633eab2003090c55635e4a4cc5986b9b50ed1ad8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 18 Nov 2014 21:31:00 -0800 Subject: [PATCH 0365/3147] beginnings of a bitswap refactor This commit was moved from ipfs/go-ipfs-exchange-interface@42d8c6a1798901ad705c4fc0a6380046305fe1f4 --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 82782a0469..b62a479576 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -12,8 +12,8 @@ import ( // exchange protocol. type Interface interface { - // Block returns the block associated with a given key. - Block(context.Context, u.Key) (*blocks.Block, error) + // GetBlock returns the block associated with a given key. + GetBlock(context.Context, u.Key) (*blocks.Block, error) // TODO Should callers be concerned with whether the block was made // available on the network? From 6f02b1af34fed3824d4fb870898a8e6a751667ae Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 19 Nov 2014 23:32:51 +0000 Subject: [PATCH 0366/3147] move some variables into strategy This commit was moved from ipfs/go-blockservice@88d8c40cfe2599cba1a7c8517e2ed3c5eb1f04b0 --- blockservice/blockservice.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 2eb3d695d3..4413eee16f 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -96,6 +96,11 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er } } +func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) (<-chan blocks.Block, error) { + // TODO: + return nil, nil +} + // DeleteBlock deletes a block in the blockservice from the datastore func (s *BlockService) DeleteBlock(k u.Key) error { return s.Datastore.Delete(k.DsKey()) From 81aa8a3687a463fc6840cb83457ac6980b26138c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 19 Nov 2014 23:34:40 +0000 Subject: [PATCH 0367/3147] fix tests halting This commit was moved from ipfs/go-ipfs-routing@0ce100ea6ae36644c09b7f5c955ba91c59ef60f4 --- routing/mock/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/mock/routing.go b/routing/mock/routing.go index 358d579019..ff83ddca31 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -59,7 +59,7 @@ func (mr *MockRouter) FindProviders(ctx context.Context, key u.Key) ([]peer.Peer } func (mr *MockRouter) FindPeer(ctx context.Context, pid peer.ID) (peer.Peer, error) { - log.Debug("FindPeer: %s", pid) + log.Debugf("FindPeer: %s", pid) return nil, nil } From b7be2ab81aa10b3ca6cd30d853fd0bdc2111ab74 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 01:15:32 +0000 Subject: [PATCH 0368/3147] start working getBlocks up the call chain This commit was moved from ipfs/go-blockservice@a13559473135505e49af67fdc6d8183f8bb40b67 --- blockservice/blockservice.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 4413eee16f..279e3ffd9a 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -96,9 +96,29 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er } } -func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) (<-chan blocks.Block, error) { - // TODO: - return nil, nil +func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { + out := make(chan *blocks.Block, 32) + go func() { + var toFetch []u.Key + for _, k := range ks { + datai, err := s.Datastore.Get(k.DsKey()) + if err == nil { + log.Debug("Blockservice: Got data in datastore.") + bdata, ok := datai.([]byte) + if !ok { + log.Criticalf("data associated with %s is not a []byte", k) + continue + } + out <- &blocks.Block{ + Multihash: mh.Multihash(k), + Data: bdata, + } + } else { + toFetch = append(toFetch, k) + } + } + }() + return out } // DeleteBlock deletes a block in the blockservice from the datastore From ab5153c734d9d3baf1525eec58413090aed928df Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 17:27:48 -0800 Subject: [PATCH 0369/3147] refactor(blockstore) mv under blocks/ @jbenet @whyrusleeping the pyramids were built one brick at a time addresses: https://github.com/jbenet/go-ipfs/issues/370 License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-blockstore@88779b419358a94460a54fe4d3ba2732f34ae855 --- blockstore/blockstore.go | 47 +++++++++++++++++++++++++++++ blockstore/blockstore_test.go | 56 +++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 blockstore/blockstore.go create mode 100644 blockstore/blockstore_test.go diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go new file mode 100644 index 0000000000..b4c0fd7fb3 --- /dev/null +++ b/blockstore/blockstore.go @@ -0,0 +1,47 @@ +// package blockstore implements a thin wrapper over a datastore, giving a +// clean interface for Getting and Putting block objects. +package blockstore + +import ( + "errors" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + blocks "github.com/jbenet/go-ipfs/blocks" + u "github.com/jbenet/go-ipfs/util" +) + +var ValueTypeMismatch = errors.New("The retrieved value is not a Block") + +type Blockstore interface { + Get(u.Key) (*blocks.Block, error) + Put(*blocks.Block) error +} + +func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { + return &blockstore{ + datastore: d, + } +} + +type blockstore struct { + datastore ds.ThreadSafeDatastore +} + +func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { + maybeData, err := bs.datastore.Get(k.DsKey()) + if err != nil { + return nil, err + } + bdata, ok := maybeData.([]byte) + if !ok { + return nil, ValueTypeMismatch + } + + return blocks.NewBlockWithHash(bdata, mh.Multihash(k)) +} + +func (bs *blockstore) Put(block *blocks.Block) error { + return bs.datastore.Put(block.Key().DsKey(), block.Data) +} diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go new file mode 100644 index 0000000000..00edf61abf --- /dev/null +++ b/blockstore/blockstore_test.go @@ -0,0 +1,56 @@ +package blockstore + +import ( + "bytes" + "testing" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + blocks "github.com/jbenet/go-ipfs/blocks" + u "github.com/jbenet/go-ipfs/util" +) + +// TODO(brian): TestGetReturnsNil + +func TestGetWhenKeyNotPresent(t *testing.T) { + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) + _, err := bs.Get(u.Key("not present")) + + if err != nil { + t.Log("As expected, block is not present") + return + } + t.Fail() +} + +func TestPutThenGetBlock(t *testing.T) { + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) + block := blocks.NewBlock([]byte("some data")) + + err := bs.Put(block) + if err != nil { + t.Fatal(err) + } + + blockFromBlockstore, err := bs.Get(block.Key()) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(block.Data, blockFromBlockstore.Data) { + t.Fail() + } +} + +func TestValueTypeMismatch(t *testing.T) { + block := blocks.NewBlock([]byte("some data")) + + datastore := ds.NewMapDatastore() + datastore.Put(block.Key().DsKey(), "data that isn't a block!") + + blockstore := NewBlockstore(ds_sync.MutexWrap(datastore)) + + _, err := blockstore.Get(block.Key()) + if err != ValueTypeMismatch { + t.Fatal(err) + } +} From 2fe1a78e2c03eeeecf908735da27e51e99e279b4 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 18:08:43 -0800 Subject: [PATCH 0370/3147] refactor(blockstore, blockservice) use Blockstore and offline.Exchange License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-unixfs@18627ac31f739b18f422f08072887663d4f4836d --- unixfs/io/dagmodifier_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 822c874714..d0aa837954 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -6,7 +6,10 @@ import ( "io/ioutil" "testing" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/jbenet/go-ipfs/blocks/blockstore" bs "github.com/jbenet/go-ipfs/blockservice" + "github.com/jbenet/go-ipfs/exchange/offline" imp "github.com/jbenet/go-ipfs/importer" "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" @@ -19,7 +22,9 @@ import ( func getMockDagServ(t *testing.T) mdag.DAGService { dstore := ds.NewMapDatastore() - bserv, err := bs.NewBlockService(dstore, nil) + tsds := sync.MutexWrap(dstore) + bstore := blockstore.NewBlockstore(tsds) + bserv, err := bs.New(bstore, offline.Exchange()) if err != nil { t.Fatal(err) } From 1411e76dbe62d56603bcb1e18c63f9f9f31d1a32 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 17:41:47 -0800 Subject: [PATCH 0371/3147] rename exchange License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-exchange-offline@391b626cd96a80322d625c357fdd4e1724d0cc23 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 37d672f73d..fbb3485c04 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -14,7 +14,7 @@ import ( var OfflineMode = errors.New("Block unavailable. Operating in offline mode") -func NewOfflineExchange() exchange.Interface { +func Exchange() exchange.Interface { return &offlineExchange{} } diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index ae3fdaa0a5..98b6e1a8c6 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -10,7 +10,7 @@ import ( ) func TestBlockReturnsErr(t *testing.T) { - off := NewOfflineExchange() + off := Exchange() _, err := off.GetBlock(context.Background(), u.Key("foo")) if err != nil { return // as desired @@ -19,7 +19,7 @@ func TestBlockReturnsErr(t *testing.T) { } func TestHasBlockReturnsNil(t *testing.T) { - off := NewOfflineExchange() + off := Exchange() block := blocks.NewBlock([]byte("data")) err := off.HasBlock(context.Background(), *block) if err != nil { From 56794d07ae11c601f53896df4c1b559199131196 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 18:08:43 -0800 Subject: [PATCH 0372/3147] refactor(blockstore, blockservice) use Blockstore and offline.Exchange License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@7c1c42663db22e45d55e1fdcea5284b50384f1ab --- blockservice/blocks_test.go | 7 +++-- blockservice/blockservice.go | 59 +++++++++++++++--------------------- 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 1e837eb5d2..9f579c5303 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -6,15 +6,18 @@ import ( "time" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" blocks "github.com/jbenet/go-ipfs/blocks" + blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" + offline "github.com/jbenet/go-ipfs/exchange/offline" u "github.com/jbenet/go-ipfs/util" ) func TestBlocks(t *testing.T) { d := ds.NewMapDatastore() - bs, err := NewBlockService(d, nil) + tsds := dssync.MutexWrap(d) + bs, err := New(blockstore.NewBlockstore(tsds), offline.Exchange()) if err != nil { t.Error("failed to construct block service", err) return diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 279e3ffd9a..86e0c776b1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -9,9 +9,9 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" blocks "github.com/jbenet/go-ipfs/blocks" + "github.com/jbenet/go-ipfs/blocks/blockstore" exchange "github.com/jbenet/go-ipfs/exchange" u "github.com/jbenet/go-ipfs/util" ) @@ -19,25 +19,28 @@ import ( var log = u.Logger("blockservice") var ErrNotFound = errors.New("blockservice: key not found") -// BlockService is a block datastore. +// BlockService is a hybrid block datastore. It stores data in a local +// datastore and may retrieve data from a remote Exchange. // It uses an internal `datastore.Datastore` instance to store values. type BlockService struct { - Datastore ds.Datastore - Remote exchange.Interface + // TODO don't expose underlying impl details + Blockstore blockstore.Blockstore + Remote exchange.Interface } // NewBlockService creates a BlockService with given datastore instance. -func NewBlockService(d ds.Datastore, rem exchange.Interface) (*BlockService, error) { - if d == nil { - return nil, fmt.Errorf("BlockService requires valid datastore") +func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error) { + if bs == nil { + return nil, fmt.Errorf("BlockService requires valid blockstore") } if rem == nil { log.Warning("blockservice running in local (offline) mode.") } - return &BlockService{Datastore: d, Remote: rem}, nil + return &BlockService{Blockstore: bs, Remote: rem}, nil } // AddBlock adds a particular block to the service, Putting it into the datastore. +// TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() log.Debugf("blockservice: storing [%s] in datastore", k) @@ -47,7 +50,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // check if we have it before adding. this is an extra read, but large writes // are more expensive. // TODO(jbenet) cheaper has. https://github.com/jbenet/go-datastore/issues/6 - has, err := s.Datastore.Has(k.DsKey()) + has, err := s.Blockstore.Has(k) if err != nil { return k, err } @@ -55,12 +58,14 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { log.Debugf("blockservice: storing [%s] in datastore (already stored)", k) } else { log.Debugf("blockservice: storing [%s] in datastore", k) - err := s.Datastore.Put(k.DsKey(), b.Data) + err := s.Blockstore.Put(b) if err != nil { return k, err } } + // TODO this operation rate-limits blockservice operations, we should + // consider moving this to an sync process. if s.Remote != nil { ctx := context.TODO() err = s.Remote.HasBlock(ctx, *b) @@ -72,17 +77,11 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", k) - datai, err := s.Datastore.Get(k.DsKey()) + block, err := s.Blockstore.Get(k) if err == nil { - log.Debug("Blockservice: Got data in datastore.") - bdata, ok := datai.([]byte) - if !ok { - return nil, fmt.Errorf("data associated with %s is not a []byte", k) - } - return &blocks.Block{ - Multihash: mh.Multihash(k), - Data: bdata, - }, nil + return block, nil + // TODO be careful checking ErrNotFound. If the underlying + // implementation changes, this will break. } else if err == ds.ErrNotFound && s.Remote != nil { log.Debug("Blockservice: Searching bitswap.") blk, err := s.Remote.GetBlock(ctx, k) @@ -101,21 +100,13 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks go func() { var toFetch []u.Key for _, k := range ks { - datai, err := s.Datastore.Get(k.DsKey()) - if err == nil { - log.Debug("Blockservice: Got data in datastore.") - bdata, ok := datai.([]byte) - if !ok { - log.Criticalf("data associated with %s is not a []byte", k) - continue - } - out <- &blocks.Block{ - Multihash: mh.Multihash(k), - Data: bdata, - } - } else { + block, err := s.Blockstore.Get(k) + if err != nil { toFetch = append(toFetch, k) + continue } + log.Debug("Blockservice: Got data in datastore.") + out <- block } }() return out @@ -123,5 +114,5 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks // DeleteBlock deletes a block in the blockservice from the datastore func (s *BlockService) DeleteBlock(k u.Key) error { - return s.Datastore.Delete(k.DsKey()) + return s.Blockstore.DeleteBlock(k) } From 2639d0aa45daa4cbf8f8ed9af9c16e5a2c9eba0f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 18:08:43 -0800 Subject: [PATCH 0373/3147] refactor(blockstore, blockservice) use Blockstore and offline.Exchange License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-blockstore@75f682bea3ce0ab416308e8526661a3bfbcacb6b --- blockstore/blockstore.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index b4c0fd7fb3..68ccc7c746 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -15,6 +15,8 @@ import ( var ValueTypeMismatch = errors.New("The retrieved value is not a Block") type Blockstore interface { + DeleteBlock(u.Key) error + Has(u.Key) (bool, error) Get(u.Key) (*blocks.Block, error) Put(*blocks.Block) error } @@ -45,3 +47,11 @@ func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { func (bs *blockstore) Put(block *blocks.Block) error { return bs.datastore.Put(block.Key().DsKey(), block.Data) } + +func (bs *blockstore) Has(k u.Key) (bool, error) { + return bs.datastore.Has(k.DsKey()) +} + +func (s *blockstore) DeleteBlock(k u.Key) error { + return s.datastore.Delete(k.DsKey()) +} From 7bb9f7517d296b003854cfbc6cf72b5c96179e67 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 18:08:43 -0800 Subject: [PATCH 0374/3147] refactor(blockstore, blockservice) use Blockstore and offline.Exchange License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-pinner@1a7d93a3332c8a458c1224fbb578e8eb616aac00 --- pinning/pinner/pin_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 1ea302823c..fc9dc215d4 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -4,7 +4,10 @@ import ( "testing" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/jbenet/go-ipfs/blocks/blockstore" bs "github.com/jbenet/go-ipfs/blockservice" + "github.com/jbenet/go-ipfs/exchange/offline" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/util" ) @@ -19,13 +22,15 @@ func randNode() (*mdag.Node, util.Key) { func TestPinnerBasic(t *testing.T) { dstore := ds.NewMapDatastore() - bserv, err := bs.NewBlockService(dstore, nil) + bstore := blockstore.NewBlockstore(dssync.MutexWrap(dstore)) + bserv, err := bs.New(bstore, offline.Exchange()) if err != nil { t.Fatal(err) } dserv := mdag.NewDAGService(bserv) + // TODO does pinner need to share datastore with blockservice? p := NewPinner(dstore, dserv) a, ak := randNode() From 39ff4d0b23ba47267e05dcbade3ce8dc3c64e5a7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 05:38:13 +0000 Subject: [PATCH 0375/3147] revamp BatchFetch a bit This commit was moved from ipfs/go-unixfs@b8fdc22653d55354b09b4287ec2db1944572a5a2 --- unixfs/io/dagreader.go | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index ea33c35407..ec1b21bfe2 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -5,6 +5,8 @@ import ( "errors" "io" + "code.google.com/p/go.net/context" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" @@ -15,10 +17,10 @@ var ErrIsDir = errors.New("this dag node is a directory") // DagReader provides a way to easily read the data contained in a dag. type DagReader struct { - serv mdag.DAGService - node *mdag.Node - position int - buf io.Reader + serv mdag.DAGService + node *mdag.Node + buf io.Reader + fetchChan <-chan *mdag.Node } // NewDagReader creates a new reader object that reads the data represented by the given @@ -36,9 +38,10 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { return nil, ErrIsDir case ftpb.Data_File: return &DagReader{ - node: n, - serv: serv, - buf: bytes.NewBuffer(pb.GetData()), + node: n, + serv: serv, + buf: bytes.NewBuffer(pb.GetData()), + fetchChan: serv.BatchFetch(context.TODO(), n), }, nil case ftpb.Data_Raw: // Raw block will just be a single level, return a byte buffer @@ -51,19 +54,20 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { // precalcNextBuf follows the next link in line and loads it from the DAGService, // setting the next buffer to read from func (dr *DagReader) precalcNextBuf() error { - if dr.position >= len(dr.node.Links) { - return io.EOF - } - nxt, err := dr.node.Links[dr.position].GetNode(dr.serv) - if err != nil { - return err + var nxt *mdag.Node + var ok bool + select { + case nxt, ok = <-dr.fetchChan: + if !ok { + return io.EOF + } } + pb := new(ftpb.Data) - err = proto.Unmarshal(nxt.Data, pb) + err := proto.Unmarshal(nxt.Data, pb) if err != nil { return err } - dr.position++ switch pb.GetType() { case ftpb.Data_Directory: From 136d53684679755c251408a5c3d6540237c18c35 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 18:34:42 -0800 Subject: [PATCH 0376/3147] fix(exchange) allow exchange to be closed License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-exchange-offline@373e19cd2194287f5c109b03c0636044751754ec --- exchange/offline/offline.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index fbb3485c04..893f546a92 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -20,8 +20,7 @@ func Exchange() exchange.Interface { // offlineExchange implements the Exchange interface but doesn't return blocks. // For use in offline mode. -type offlineExchange struct { -} +type offlineExchange struct{} // GetBlock returns nil to signal that a block could not be retrieved for the // given key. @@ -34,3 +33,8 @@ func (_ *offlineExchange) GetBlock(context.Context, u.Key) (*blocks.Block, error func (_ *offlineExchange) HasBlock(context.Context, blocks.Block) error { return nil } + +// Close always returns nil. +func (_ *offlineExchange) Close() error { + return nil +} From 617b8c27e0a6c4b0405e721b2bbf32f5e5b373c3 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 20 Nov 2014 18:34:42 -0800 Subject: [PATCH 0377/3147] fix(exchange) allow exchange to be closed License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-exchange-interface@c6503f1678c300401195be13299f35492217c453 --- exchange/interface.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index b62a479576..1f126eed36 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -2,6 +2,8 @@ package exchange import ( + "io" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" blocks "github.com/jbenet/go-ipfs/blocks" @@ -11,11 +13,12 @@ import ( // Any type that implements exchange.Interface may be used as an IPFS block // exchange protocol. type Interface interface { - // GetBlock returns the block associated with a given key. GetBlock(context.Context, u.Key) (*blocks.Block, error) // TODO Should callers be concerned with whether the block was made // available on the network? HasBlock(context.Context, blocks.Block) error + + io.Closer } From c7020914bb0aa41ec9b925cb72ddf25edd41d125 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 06:40:34 +0000 Subject: [PATCH 0378/3147] wire GetBlocks into blockservice This commit was moved from ipfs/go-blockservice@e5247b67fe126aef42f9fc90a7522e92f4b606c2 --- blockservice/blockservice.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 86e0c776b1..96234c12ae 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -68,7 +68,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // consider moving this to an sync process. if s.Remote != nil { ctx := context.TODO() - err = s.Remote.HasBlock(ctx, *b) + err = s.Remote.HasBlock(ctx, b) } return k, err } @@ -98,6 +98,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { out := make(chan *blocks.Block, 32) go func() { + defer close(out) var toFetch []u.Key for _, k := range ks { block, err := s.Blockstore.Get(k) @@ -108,6 +109,15 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks log.Debug("Blockservice: Got data in datastore.") out <- block } + + nblocks, err := s.Remote.GetBlocks(ctx, toFetch) + if err != nil { + log.Errorf("Error with GetBlocks: %s", err) + return + } + for blk := range nblocks { + out <- blk + } }() return out } From a48a65e61dac7b1a3137d399c967532d2689fe10 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 06:40:34 +0000 Subject: [PATCH 0379/3147] wire GetBlocks into blockservice This commit was moved from ipfs/go-unixfs@f62fd5b204f0818ce2ad43fdc0263adc28d66aba --- unixfs/io/dagreader.go | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index ec1b21bfe2..7f8720cf1b 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -17,10 +17,11 @@ var ErrIsDir = errors.New("this dag node is a directory") // DagReader provides a way to easily read the data contained in a dag. type DagReader struct { - serv mdag.DAGService - node *mdag.Node - buf io.Reader - fetchChan <-chan *mdag.Node + serv mdag.DAGService + node *mdag.Node + buf io.Reader + fetchChan <-chan *mdag.Node + linkPosition int } // NewDagReader creates a new reader object that reads the data represented by the given @@ -37,11 +38,15 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File: + var fetchChan <-chan *mdag.Node + if serv != nil { + fetchChan = serv.BatchFetch(context.TODO(), n) + } return &DagReader{ node: n, serv: serv, buf: bytes.NewBuffer(pb.GetData()), - fetchChan: serv.BatchFetch(context.TODO(), n), + fetchChan: fetchChan, }, nil case ftpb.Data_Raw: // Raw block will just be a single level, return a byte buffer @@ -61,6 +66,17 @@ func (dr *DagReader) precalcNextBuf() error { if !ok { return io.EOF } + default: + // Only used when fetchChan is nil, + // which only happens when passed in a nil dagservice + // TODO: this logic is hard to follow, do it better. + // NOTE: the only time this code is used, is during the + // importer tests, consider just changing those tests + if dr.linkPosition >= len(dr.node.Links) { + return io.EOF + } + nxt = dr.node.Links[dr.linkPosition].Node + dr.linkPosition++ } pb := new(ftpb.Data) From 9998cde2e607c775cc786b256a611349e01c6f95 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 08:01:34 +0000 Subject: [PATCH 0380/3147] some cleanup, and fix minor bug in dagreader from previous commit This commit was moved from ipfs/go-blockservice@0f4376e991c3dd02e36aa1d514c5a93e4faa769f --- blockservice/blockservice.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 96234c12ae..97c7dec90f 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -95,6 +95,9 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er } } +// GetBlocks gets a list of blocks asynchronously and returns through +// the returned channel. +// NB: No guarantees are made about order. func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { out := make(chan *blocks.Block, 32) go func() { From 5e280f1bbc9cd38780068aa6b223d858e1b674aa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 08:01:34 +0000 Subject: [PATCH 0381/3147] some cleanup, and fix minor bug in dagreader from previous commit This commit was moved from ipfs/go-unixfs@fd2b8faf76f49ea8955b2ed796b1cc830869bf37 --- unixfs/io/dagreader.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 7f8720cf1b..892752c91a 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -61,12 +61,8 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { func (dr *DagReader) precalcNextBuf() error { var nxt *mdag.Node var ok bool - select { - case nxt, ok = <-dr.fetchChan: - if !ok { - return io.EOF - } - default: + + if dr.serv == nil { // Only used when fetchChan is nil, // which only happens when passed in a nil dagservice // TODO: this logic is hard to follow, do it better. @@ -76,7 +72,18 @@ func (dr *DagReader) precalcNextBuf() error { return io.EOF } nxt = dr.node.Links[dr.linkPosition].Node + if nxt == nil { + return errors.New("Got nil node back from link! and no DAGService!") + } dr.linkPosition++ + + } else { + select { + case nxt, ok = <-dr.fetchChan: + if !ok { + return io.EOF + } + } } pb := new(ftpb.Data) From ac017be45605e4ac2a25498fd2df3ae6519fcd69 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 18:14:28 +0000 Subject: [PATCH 0382/3147] tracking down a bug dhthell found, added asserts and better logging. This commit was moved from ipfs/go-blockservice@acd2765e33922b823f3da287a62ac91042933b5c --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 97c7dec90f..c4c90c88b6 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -101,7 +101,6 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { out := make(chan *blocks.Block, 32) go func() { - defer close(out) var toFetch []u.Key for _, k := range ks { block, err := s.Blockstore.Get(k) @@ -121,6 +120,7 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks for blk := range nblocks { out <- blk } + close(out) }() return out } From 970d7cfd55b893e938bbb762d06182707ff198dd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 18:14:28 +0000 Subject: [PATCH 0383/3147] tracking down a bug dhthell found, added asserts and better logging. This commit was moved from ipfs/go-unixfs@35dc51426c070000264f89945eb81819af3dc105 --- unixfs/io/dagreader.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 892752c91a..7373b94aec 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -68,6 +68,7 @@ func (dr *DagReader) precalcNextBuf() error { // TODO: this logic is hard to follow, do it better. // NOTE: the only time this code is used, is during the // importer tests, consider just changing those tests + log.Warning("Running DAGReader with nil DAGService!") if dr.linkPosition >= len(dr.node.Links) { return io.EOF } @@ -78,6 +79,9 @@ func (dr *DagReader) precalcNextBuf() error { dr.linkPosition++ } else { + if dr.fetchChan == nil { + panic("this is wrong.") + } select { case nxt, ok = <-dr.fetchChan: if !ok { From 9c2a75faaabfa3a19bc14507699f874de201e147 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 06:40:34 +0000 Subject: [PATCH 0384/3147] wire GetBlocks into blockservice This commit was moved from ipfs/go-ipfs-exchange-offline@e466b9dd25312a727fa6c25bc22ae2ffd64c693e --- exchange/offline/offline.go | 6 +++++- exchange/offline/offline_test.go | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 893f546a92..24a89e038f 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -30,7 +30,7 @@ func (_ *offlineExchange) GetBlock(context.Context, u.Key) (*blocks.Block, error } // HasBlock always returns nil. -func (_ *offlineExchange) HasBlock(context.Context, blocks.Block) error { +func (_ *offlineExchange) HasBlock(context.Context, *blocks.Block) error { return nil } @@ -38,3 +38,7 @@ func (_ *offlineExchange) HasBlock(context.Context, blocks.Block) error { func (_ *offlineExchange) Close() error { return nil } + +func (_ *offlineExchange) GetBlocks(context.Context, []u.Key) (<-chan *blocks.Block, error) { + return nil, OfflineMode +} diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 98b6e1a8c6..ac02d2101e 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -21,7 +21,7 @@ func TestBlockReturnsErr(t *testing.T) { func TestHasBlockReturnsNil(t *testing.T) { off := Exchange() block := blocks.NewBlock([]byte("data")) - err := off.HasBlock(context.Background(), *block) + err := off.HasBlock(context.Background(), block) if err != nil { t.Fatal("") } From 09728fba212211187de5e2fb6ebe17e29b125bc4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 06:40:34 +0000 Subject: [PATCH 0385/3147] wire GetBlocks into blockservice This commit was moved from ipfs/go-ipfs-exchange-interface@35ac113f992ed6aacfe01955f0961037942945c1 --- exchange/interface.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 1f126eed36..aa2e2431ce 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -16,9 +16,11 @@ type Interface interface { // GetBlock returns the block associated with a given key. GetBlock(context.Context, u.Key) (*blocks.Block, error) + GetBlocks(context.Context, []u.Key) (<-chan *blocks.Block, error) + // TODO Should callers be concerned with whether the block was made // available on the network? - HasBlock(context.Context, blocks.Block) error + HasBlock(context.Context, *blocks.Block) error io.Closer } From 48026282d91135d5d96209b9c93d46ce959c2558 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 23:03:05 +0000 Subject: [PATCH 0386/3147] a little more correctness on the new bitswap impl This commit was moved from ipfs/go-blockservice@725e2d33baf37e49538c0c00626666df7fa281ad --- blockservice/blockservice.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index c4c90c88b6..214bd49fcc 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -98,7 +98,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er // GetBlocks gets a list of blocks asynchronously and returns through // the returned channel. // NB: No guarantees are made about order. -func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { +func (s *BlockService) GetBlocks(parent context.Context, ks []u.Key) <-chan *blocks.Block { out := make(chan *blocks.Block, 32) go func() { var toFetch []u.Key @@ -112,11 +112,13 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks out <- block } + ctx, cancel := context.WithCancel(parent) nblocks, err := s.Remote.GetBlocks(ctx, toFetch) if err != nil { log.Errorf("Error with GetBlocks: %s", err) return } + for blk := range nblocks { out <- blk } From 28250d85525b0a4dad3ee6ed8f45558ecd024f05 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 21 Nov 2014 23:33:33 +0000 Subject: [PATCH 0387/3147] use @maybebtc's ForwardBlocks function This commit was moved from ipfs/go-blockservice@dba69eb8be43784c7ce99c861882952f1841734a --- blockservice/blockservice.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 214bd49fcc..07e6d10923 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -98,7 +98,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er // GetBlocks gets a list of blocks asynchronously and returns through // the returned channel. // NB: No guarantees are made about order. -func (s *BlockService) GetBlocks(parent context.Context, ks []u.Key) <-chan *blocks.Block { +func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { out := make(chan *blocks.Block, 32) go func() { var toFetch []u.Key @@ -112,7 +112,6 @@ func (s *BlockService) GetBlocks(parent context.Context, ks []u.Key) <-chan *blo out <- block } - ctx, cancel := context.WithCancel(parent) nblocks, err := s.Remote.GetBlocks(ctx, toFetch) if err != nil { log.Errorf("Error with GetBlocks: %s", err) From 239829d7386a54bdf0c737007be3d273cb26f0bf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 22 Nov 2014 22:27:19 +0000 Subject: [PATCH 0388/3147] ensure sending of wantlist to friendly peers This commit was moved from ipfs/go-blockservice@ded8dd609c308c4d0308ea4f07e1f39e07f884bc --- blockservice/blocks_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 9f579c5303..1779c0c832 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -10,6 +10,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" blocks "github.com/jbenet/go-ipfs/blocks" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" + bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" offline "github.com/jbenet/go-ipfs/exchange/offline" u "github.com/jbenet/go-ipfs/util" ) @@ -58,3 +59,6 @@ func TestBlocks(t *testing.T) { t.Error("Block data is not equal.") } } + +func TestGetBlocks(t *testing.T) { +} From 58c557228f8d15d7a3fa094ea768c99fde8ad770 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 23 Nov 2014 19:14:06 +0000 Subject: [PATCH 0389/3147] add a test to blockservice to demonstate GetBlocks failure. This commit was moved from ipfs/go-blockservice@0f5ebd5c1cb38feca4739dfd420548cdfa88177d --- blockservice/blocks_test.go | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 1779c0c832..fd4ac34c35 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -11,7 +11,9 @@ import ( blocks "github.com/jbenet/go-ipfs/blocks" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" + tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" offline "github.com/jbenet/go-ipfs/exchange/offline" + "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" ) @@ -61,4 +63,42 @@ func TestBlocks(t *testing.T) { } func TestGetBlocks(t *testing.T) { + net := tn.VirtualNetwork() + rs := mock.VirtualRoutingServer() + sg := bitswap.NewSessionGenerator(net, rs) + bg := bitswap.NewBlockGenerator() + + instances := sg.Instances(4) + blks := bg.Blocks(50) + // TODO: verify no duplicates + + var servs []*BlockService + for _, i := range instances { + bserv, err := New(i.Blockstore, i.Exchange) + if err != nil { + t.Fatal(err) + } + servs = append(servs, bserv) + } + + var keys []u.Key + for _, blk := range blks { + keys = append(keys, blk.Key()) + servs[0].AddBlock(blk) + } + + for i := 1; i < 4; i++ { + ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) + out := servs[i].GetBlocks(ctx, keys) + gotten := make(map[u.Key]*blocks.Block) + for blk := range out { + if _, ok := gotten[blk.Key()]; ok { + t.Fatal("Got duplicate block!") + } + gotten[blk.Key()] = blk + } + if len(gotten) != len(blks) { + t.Fatalf("Didnt get enough blocks back: %d/%d", len(gotten), len(blks)) + } + } } From 896ba6e4baed8813abb13c27a8c3cb5d958fd16d Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 23 Nov 2014 18:27:02 -0800 Subject: [PATCH 0390/3147] fix(blockservice) test License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@10090dc756a3fe2755dc04d4dd4967de5bafe346 --- blockservice/blocks_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index fd4ac34c35..d9b2facb1a 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -87,9 +87,14 @@ func TestGetBlocks(t *testing.T) { servs[0].AddBlock(blk) } + var chans []<-chan *blocks.Block for i := 1; i < 4; i++ { ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) - out := servs[i].GetBlocks(ctx, keys) + ch := servs[i].GetBlocks(ctx, keys) + chans = append(chans, ch) + } + + for _, out := range chans { gotten := make(map[u.Key]*blocks.Block) for blk := range out { if _, ok := gotten[blk.Key()]; ok { From b93dcbd5a588afe0849031fbaea93762e893086f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 23 Nov 2014 22:47:53 -0800 Subject: [PATCH 0391/3147] fix(blockservice) respect context in GetBlocks License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@75d100016aab67e003ba034eea0c23e90f1f4eb9 --- blockservice/blockservice.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 07e6d10923..0ddec7955e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -99,29 +99,37 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er // the returned channel. // NB: No guarantees are made about order. func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { - out := make(chan *blocks.Block, 32) + out := make(chan *blocks.Block, 0) go func() { - var toFetch []u.Key + defer close(out) + var misses []u.Key for _, k := range ks { - block, err := s.Blockstore.Get(k) + hit, err := s.Blockstore.Get(k) if err != nil { - toFetch = append(toFetch, k) + misses = append(misses, k) continue } log.Debug("Blockservice: Got data in datastore.") - out <- block + select { + case out <- hit: + case <-ctx.Done(): + return + } } - nblocks, err := s.Remote.GetBlocks(ctx, toFetch) + rblocks, err := s.Remote.GetBlocks(ctx, misses) if err != nil { log.Errorf("Error with GetBlocks: %s", err) return } - for blk := range nblocks { - out <- blk + for b := range rblocks { + select { + case out <- b: + case <-ctx.Done(): + return + } } - close(out) }() return out } From b3447aa64e1109cef665723897c723737b3e43fd Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 23 Nov 2014 22:47:06 -0800 Subject: [PATCH 0392/3147] fix(bitswap/testutils) vendor License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-unixfs@aa935e76a1b86b58e92f5c57df5f63a416cc5342 --- unixfs/io/dagreader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 7373b94aec..55e677386c 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -5,7 +5,7 @@ import ( "errors" "io" - "code.google.com/p/go.net/context" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mdag "github.com/jbenet/go-ipfs/merkledag" From d3d5d3e938a237492a6a0346c33ae3c2baac97b8 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 23 Nov 2014 22:59:22 -0800 Subject: [PATCH 0393/3147] reset test to the way it ways before @whyrusleeping License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@0966ac421c315c6888bdb3afdca4888e96dcc70e --- blockservice/blocks_test.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index d9b2facb1a..9fd85725e8 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -62,7 +62,7 @@ func TestBlocks(t *testing.T) { } } -func TestGetBlocks(t *testing.T) { +func TestGetBlocksSequential(t *testing.T) { net := tn.VirtualNetwork() rs := mock.VirtualRoutingServer() sg := bitswap.NewSessionGenerator(net, rs) @@ -87,14 +87,11 @@ func TestGetBlocks(t *testing.T) { servs[0].AddBlock(blk) } - var chans []<-chan *blocks.Block - for i := 1; i < 4; i++ { - ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) - ch := servs[i].GetBlocks(ctx, keys) - chans = append(chans, ch) - } + t.Log("one instance at a time, get blocks concurrently") - for _, out := range chans { + for i := 1; i < len(instances); i++ { + ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) + out := servs[i].GetBlocks(ctx, keys) gotten := make(map[u.Key]*blocks.Block) for blk := range out { if _, ok := gotten[blk.Key()]; ok { From 434b23afd0adf44c5751a0c5a6e49e598690fa46 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 26 Nov 2014 12:08:40 -0800 Subject: [PATCH 0394/3147] refactor(util) move block generator @whyrusleeping @jbenet Putting the block generator in a util dir until blocks. Can't put it in util/testutil because the util/testutil/dag-generator imports blockservice and blockservice uses the generator. Tough problem. This'll do for now. License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@a7bfc2f2024fe3c130e415e35f89e480881473b6 --- blockservice/blocks_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 9fd85725e8..1a75723e2b 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -10,6 +10,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" blocks "github.com/jbenet/go-ipfs/blocks" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" + blocksutil "github.com/jbenet/go-ipfs/blocks/blocksutil" bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" offline "github.com/jbenet/go-ipfs/exchange/offline" @@ -66,7 +67,7 @@ func TestGetBlocksSequential(t *testing.T) { net := tn.VirtualNetwork() rs := mock.VirtualRoutingServer() sg := bitswap.NewSessionGenerator(net, rs) - bg := bitswap.NewBlockGenerator() + bg := blocksutil.NewBlockGenerator() instances := sg.Instances(4) blks := bg.Blocks(50) From 56e804e619b15cfb1ae5a2cd1cb851d923eb6c44 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 26 Nov 2014 22:50:41 +0000 Subject: [PATCH 0395/3147] some bitswap cleanup This commit was moved from ipfs/go-unixfs@1e14bec0fe4d31080d33a1d713f59fa791e4c09d --- unixfs/io/dagreader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 55e677386c..b41ac3daa3 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -40,7 +40,7 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { case ftpb.Data_File: var fetchChan <-chan *mdag.Node if serv != nil { - fetchChan = serv.BatchFetch(context.TODO(), n) + fetchChan = serv.GetKeysAsync(context.TODO(), n) } return &DagReader{ node: n, From 1aa63332c9fac39ddd960352472453ab4fcef069 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Dec 2014 21:38:16 +0000 Subject: [PATCH 0396/3147] switch over to using sendMessage vs sendRequest This commit was moved from ipfs/go-ipfs-routing@471e5f1f168cd3ef722f95508f9c22d32ab5d958 --- routing/dht/routing.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index fedf281d3c..b1644d1167 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -126,6 +126,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { } func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { + log.Debug("Find Providers: %s", key) peerOut := make(chan peer.Peer, count) go func() { ps := newPeerSet() From 4bfd707659835ee5412002ff9c806eafeeaf6f4a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Dec 2014 02:15:04 +0000 Subject: [PATCH 0397/3147] cleanup, use a workgroup over channels This commit was moved from ipfs/go-unixfs@e754f7a562316056069ac283199762e459b3e958 --- unixfs/io/dagreader.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index b41ac3daa3..f4290dd4b0 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -40,7 +40,7 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { case ftpb.Data_File: var fetchChan <-chan *mdag.Node if serv != nil { - fetchChan = serv.GetKeysAsync(context.TODO(), n) + fetchChan = serv.GetDAG(context.TODO(), n) } return &DagReader{ node: n, @@ -62,6 +62,7 @@ func (dr *DagReader) precalcNextBuf() error { var nxt *mdag.Node var ok bool + // TODO: require non-nil dagservice, use offline bitswap exchange if dr.serv == nil { // Only used when fetchChan is nil, // which only happens when passed in a nil dagservice From 76b39882005f7d542e18a869c9931cfbe843ced9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 2 Dec 2014 07:34:39 +0000 Subject: [PATCH 0398/3147] make bitswap sub-RPC's timeout (slowly for now) This commit was moved from ipfs/go-ipfs-routing@6d770c18706092342016dd611c2ec5be93893412 --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b1644d1167..f504b9bb41 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -126,7 +126,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { } func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { - log.Debug("Find Providers: %s", key) + log.Debugf("Find Providers: %s", key) peerOut := make(chan peer.Peer, count) go func() { ps := newPeerSet() From e190bd2efb81791060f38cce0383d56e3a9cf8f0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 3 Dec 2014 19:46:01 +0000 Subject: [PATCH 0399/3147] add readme for bitswap This commit was moved from ipfs/go-ipfs-routing@b7361bc8b406e35e70db9bd62242921e63fb2f3b --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index f504b9bb41..102acd5a4c 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -126,7 +126,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { } func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { - log.Debugf("Find Providers: %s", key) + log.Event(ctx, "findProviders", key) peerOut := make(chan peer.Peer, count) go func() { ps := newPeerSet() From a704ce153ab434540eb069ea64d72e34016839f4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 3 Dec 2014 19:51:17 +0000 Subject: [PATCH 0400/3147] util keys need to be pointers for loggable This commit was moved from ipfs/go-ipfs-routing@ba7bd235a2437cb62ea6b0ba9b5eeb779bb4a7c0 --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 102acd5a4c..f0bfbe4853 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -126,7 +126,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { } func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { - log.Event(ctx, "findProviders", key) + log.Event(ctx, "findProviders", &key) peerOut := make(chan peer.Peer, count) go func() { ps := newPeerSet() From a37a06d7caf905953ec9ca14e264c9cf8d0a1538 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 2 Dec 2014 00:19:22 -0800 Subject: [PATCH 0401/3147] fix(routing/dht) _always_ close chan on exit of FindProvidersAsync the important change here is that within FindProvidersAsync, the channel is closed using a `defer`. This ensures the channel is always closed, regardless of the path taken to exit. + misc cleanup cc @whyrusleeping @jbenet License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@6007d1dcf0400e6544f28c9230ef6ba48e59793b --- routing/dht/dht.go | 9 +++------ routing/dht/routing.go | 30 +++++++++++++++++++----------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f76ca8f593..127cfacc52 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -194,24 +194,21 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Messa start := time.Now() - log.Event(ctx, "sentMessage", dht.self, p, pmes) - - rmes, err := dht.sender.SendRequest(ctx, mes) + rmes, err := dht.sender.SendRequest(ctx, mes) // respect? if err != nil { return nil, err } if rmes == nil { return nil, errors.New("no response to request") } + log.Event(ctx, "sentMessage", dht.self, p, pmes) - rtt := time.Since(start) - rmes.Peer().SetLatency(rtt) + rmes.Peer().SetLatency(time.Since(start)) rpmes := new(pb.Message) if err := proto.Unmarshal(rmes.Data(), rpmes); err != nil { return nil, err } - return rpmes, nil } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index f0bfbe4853..b154b270ef 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -129,21 +129,27 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int log.Event(ctx, "findProviders", &key) peerOut := make(chan peer.Peer, count) go func() { + defer close(peerOut) + ps := newPeerSet() + // TODO may want to make this function async to hide latency provs := dht.providers.GetProviders(key) for _, p := range provs { count-- // NOTE: assuming that this list of peers is unique ps.Add(p) - peerOut <- p + select { + case peerOut <- p: + case <-ctx.Done(): + return + } if count <= 0 { return } } - wg := new(sync.WaitGroup) - peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) - for _, pp := range peers { + var wg sync.WaitGroup + for _, pp := range dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) { wg.Add(1) go func(p peer.Peer) { defer wg.Done() @@ -156,16 +162,16 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int }(pp) } wg.Wait() - close(peerOut) }() return peerOut } func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *peerSet, count int, out chan peer.Peer) { - done := make(chan struct{}) + var wg sync.WaitGroup for _, pbp := range peers { + wg.Add(1) go func(mp *pb.Message_Peer) { - defer func() { done <- struct{}{} }() + defer wg.Done() // construct new peer p, err := dht.ensureConnectedToPeer(ctx, mp) if err != nil { @@ -179,15 +185,17 @@ func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.M dht.providers.AddProvider(k, p) if ps.AddIfSmallerThan(p, count) { - out <- p + select { + case out <- p: + case <-ctx.Done(): + return + } } else if ps.Size() >= count { return } }(pbp) } - for _ = range peers { - <-done - } + wg.Wait() } // Find specific Peer From 0673c3a2e0c9b604df77e3ae85502ff50b7627ee Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 2 Dec 2014 00:40:50 -0800 Subject: [PATCH 0402/3147] fix(dht/routing) make GetProviders respect context This commit makes GetProviders (sync) respect the request context. It also amends all of GetProviders' callsites to pass a context in. This meant changing the signature of the dht's handlerfunc. I think I'll start referring to the request context as Vito Corleone. cc @whyrusleeping @jbenet License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@cf3a347b18491063d9ce0aaaafdf582ff9fd30d3 --- routing/dht/dht.go | 2 +- routing/dht/handlers.go | 25 ++++++++++++------------- routing/dht/providers.go | 10 +++++++--- routing/dht/providers_test.go | 2 +- routing/dht/routing.go | 2 +- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 127cfacc52..0277f644bc 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -161,7 +161,7 @@ func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.N } // dispatch handler. - rpmes, err := handler(mPeer, pmes) + rpmes, err := handler(ctx, mPeer, pmes) if err != nil { log.Errorf("handle message error: %s", err) return nil diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index bd4b813eec..07f21f18a9 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,20 +5,19 @@ import ( "fmt" "time" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" peer "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" - - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ) // The number of closer peers to send on requests. var CloserPeerCount = 4 // dhthandler specifies the signature of functions that handle DHT messages. -type dhtHandler func(peer.Peer, *pb.Message) (*pb.Message, error) +type dhtHandler func(context.Context, peer.Peer, *pb.Message) (*pb.Message, error) func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { switch t { @@ -39,7 +38,7 @@ func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { } } -func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) // setup response @@ -85,7 +84,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *pb.Message) (*pb.Message, } // if we know any providers for the requested value, return those. - provs := dht.providers.GetProviders(u.Key(pmes.GetKey())) + provs := dht.providers.GetProviders(ctx, u.Key(pmes.GetKey())) if len(provs) > 0 { log.Debugf("handleGetValue returning %d provider[s]", len(provs)) resp.ProviderPeers = pb.PeersToPBPeers(provs) @@ -107,7 +106,7 @@ func (dht *IpfsDHT) handleGetValue(p peer.Peer, pmes *pb.Message) (*pb.Message, } // Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { dht.dslock.Lock() defer dht.dslock.Unlock() dskey := u.Key(pmes.GetKey()).DsKey() @@ -129,12 +128,12 @@ func (dht *IpfsDHT) handlePutValue(p peer.Peer, pmes *pb.Message) (*pb.Message, return pmes, err } -func (dht *IpfsDHT) handlePing(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handlePing(_ context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s Responding to ping from %s!\n", dht.self, p) return pmes, nil } -func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { resp := pb.NewMessage(pmes.GetType(), "", pmes.GetClusterLevel()) var closest []peer.Peer @@ -164,7 +163,7 @@ func (dht *IpfsDHT) handleFindPeer(p peer.Peer, pmes *pb.Message) (*pb.Message, return resp, nil } -func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. @@ -177,7 +176,7 @@ func (dht *IpfsDHT) handleGetProviders(p peer.Peer, pmes *pb.Message) (*pb.Messa } // setup providers - providers := dht.providers.GetProviders(u.Key(pmes.GetKey())) + providers := dht.providers.GetProviders(ctx, u.Key(pmes.GetKey())) if has { providers = append(providers, dht.self) } @@ -201,7 +200,7 @@ type providerInfo struct { Value peer.Peer } -func (dht *IpfsDHT) handleAddProvider(p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { key := u.Key(pmes.GetKey()) log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index f7d491d6a7..2adc208607 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -101,12 +101,16 @@ func (pm *ProviderManager) AddProvider(k u.Key, val peer.Peer) { } } -func (pm *ProviderManager) GetProviders(k u.Key) []peer.Peer { +func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.Peer { gp := new(getProv) gp.k = k gp.resp = make(chan []peer.Peer) - pm.getprovs <- gp - return <-gp.resp + select { + case pm.getprovs <- gp: + return <-gp.resp + case <-ctx.Done(): + return nil + } } func (pm *ProviderManager) GetLocal() []u.Key { diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index c4ae53910a..1ae85fbc40 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -15,7 +15,7 @@ func TestProviderManager(t *testing.T) { p := NewProviderManager(ctx, mid) a := u.Key("test") p.AddProvider(a, peer.WithIDString("testingprovider")) - resp := p.GetProviders(a) + resp := p.GetProviders(ctx, a) if len(resp) != 1 { t.Fatal("Could not retrieve provider.") } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b154b270ef..5db218ff67 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -133,7 +133,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int ps := newPeerSet() // TODO may want to make this function async to hide latency - provs := dht.providers.GetProviders(key) + provs := dht.providers.GetProviders(ctx, key) for _, p := range provs { count-- // NOTE: assuming that this list of peers is unique From 9e3a9b46765b640aed4fb81216b490a025c19e88 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 2 Dec 2014 00:55:07 -0800 Subject: [PATCH 0403/3147] fix(dht/routing) buffer promise response to prevent resource leak When performing this "promise" pattern, it is important to provide a channel with space for one value. Otherwise the sender may block forever in the case of a receiver that decides to abandon the request. A subtle detail, but one that is important for avoiding leaked goroutines. cc @whyrusleeping @jbenet License: MIT Signed-off-by: Brian Tiger Chow License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@cbfe43713fd6b707b440aeb3aee6edf705c9d9d2 --- routing/dht/providers.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 2adc208607..7f70056d35 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -102,9 +102,10 @@ func (pm *ProviderManager) AddProvider(k u.Key, val peer.Peer) { } func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.Peer { - gp := new(getProv) - gp.k = k - gp.resp = make(chan []peer.Peer) + gp := &getProv{ + k: k, + resp: make(chan []peer.Peer, 1), // buffered to prevent sender from blocking + } select { case pm.getprovs <- gp: return <-gp.resp From fb585139d0e4abc584cce5dd71075bcf429961d3 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 5 Dec 2014 20:46:15 -0800 Subject: [PATCH 0404/3147] style: readability @jbenet License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@87de882875fc081c8d09776923ede826412ac1a9 --- routing/dht/routing.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 5db218ff67..134e54ccbf 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -149,7 +149,8 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int } var wg sync.WaitGroup - for _, pp := range dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) { + peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) + for _, pp := range peers { wg.Add(1) go func(p peer.Peer) { defer wg.Done() From c68c1cb9df860b8559a33ced54862a39575ff264 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 5 Dec 2014 22:54:16 -0800 Subject: [PATCH 0405/3147] fix: respect ctx on receive @jbenet License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@37bc902f6e5f18ae94a08f4c02875a7a4dc123aa --- routing/dht/providers.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 7f70056d35..0deea63245 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -107,10 +107,15 @@ func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.Pee resp: make(chan []peer.Peer, 1), // buffered to prevent sender from blocking } select { + case <-ctx.Done(): + return nil case pm.getprovs <- gp: - return <-gp.resp + } + select { case <-ctx.Done(): return nil + case peers := <-gp.resp: + return peers } } From 064f8cddd7960b1010ea53ee5fd1a3f5c14ee8b6 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 26 Nov 2014 17:01:40 -0800 Subject: [PATCH 0406/3147] style(blockservice) s/Remote/Exchange License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@ec4d644783c33bf4b038c9dd5644ca1a42d53751 --- blockservice/blockservice.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0ddec7955e..0ebe30a4da 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -25,7 +25,7 @@ var ErrNotFound = errors.New("blockservice: key not found") type BlockService struct { // TODO don't expose underlying impl details Blockstore blockstore.Blockstore - Remote exchange.Interface + Exchange exchange.Interface } // NewBlockService creates a BlockService with given datastore instance. @@ -36,7 +36,7 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error if rem == nil { log.Warning("blockservice running in local (offline) mode.") } - return &BlockService{Blockstore: bs, Remote: rem}, nil + return &BlockService{Blockstore: bs, Exchange: rem}, nil } // AddBlock adds a particular block to the service, Putting it into the datastore. @@ -66,9 +66,9 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // TODO this operation rate-limits blockservice operations, we should // consider moving this to an sync process. - if s.Remote != nil { + if s.Exchange != nil { ctx := context.TODO() - err = s.Remote.HasBlock(ctx, b) + err = s.Exchange.HasBlock(ctx, b) } return k, err } @@ -82,9 +82,9 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er return block, nil // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. - } else if err == ds.ErrNotFound && s.Remote != nil { + } else if err == ds.ErrNotFound && s.Exchange != nil { log.Debug("Blockservice: Searching bitswap.") - blk, err := s.Remote.GetBlock(ctx, k) + blk, err := s.Exchange.GetBlock(ctx, k) if err != nil { return nil, err } @@ -117,7 +117,7 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks } } - rblocks, err := s.Remote.GetBlocks(ctx, misses) + rblocks, err := s.Exchange.GetBlocks(ctx, misses) if err != nil { log.Errorf("Error with GetBlocks: %s", err) return From 521867d2e4d8729d4e70e705e44f27a197e786fc Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 30 Nov 2014 21:25:46 -0800 Subject: [PATCH 0407/3147] feat(blockstore) write cache vendors hashicorp/golang-lru dependency. (Mozilla Public License, version 2.0) License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-blockstore@68d0beb81163f415006c8b5e9e9a389e18558a73 --- blockstore/write_cache.go | 45 +++++++++++++++++ blockstore/write_cache_test.go | 88 ++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 blockstore/write_cache.go create mode 100644 blockstore/write_cache_test.go diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go new file mode 100644 index 0000000000..b46d058466 --- /dev/null +++ b/blockstore/write_cache.go @@ -0,0 +1,45 @@ +package blockstore + +import ( + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" + "github.com/jbenet/go-ipfs/blocks" + u "github.com/jbenet/go-ipfs/util" +) + +// WriteCached returns a blockstore that caches up to |size| unique writes (bs.Put). +func WriteCached(bs Blockstore, size int) (Blockstore, error) { + c, err := lru.New(size) + if err != nil { + return nil, err + } + return &writecache{blockstore: bs, cache: c}, nil +} + +type writecache struct { + cache *lru.Cache // pointer b/c Cache contains a Mutex as value (complicates copying) + blockstore Blockstore +} + +func (w *writecache) DeleteBlock(k u.Key) error { + w.cache.Remove(k) + return w.blockstore.DeleteBlock(k) +} + +func (w *writecache) Has(k u.Key) (bool, error) { + if _, ok := w.cache.Get(k); ok { + return true, nil + } + return w.blockstore.Has(k) +} + +func (w *writecache) Get(k u.Key) (*blocks.Block, error) { + return w.blockstore.Get(k) +} + +func (w *writecache) Put(b *blocks.Block) error { + if _, ok := w.cache.Get(b.Key()); ok { + return nil + } + w.cache.Add(b.Key(), struct{}{}) + return w.blockstore.Put(b) +} diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go new file mode 100644 index 0000000000..2be8659031 --- /dev/null +++ b/blockstore/write_cache_test.go @@ -0,0 +1,88 @@ +package blockstore + +import ( + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/jbenet/go-ipfs/blocks" + "testing" +) + +func TestReturnsErrorWhenSizeNegative(t *testing.T) { + bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) + _, err := WriteCached(bs, -1) + if err != nil { + return + } + t.Fail() +} + +func TestRemoveCacheEntryOnDelete(t *testing.T) { + b := blocks.NewBlock([]byte("foo")) + cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} + bs := NewBlockstore(syncds.MutexWrap(cd)) + cachedbs, err := WriteCached(bs, 1) + if err != nil { + t.Fatal(err) + } + cachedbs.Put(b) + + writeHitTheDatastore := false + cd.SetFunc(func() { + writeHitTheDatastore = true + }) + + cachedbs.DeleteBlock(b.Key()) + cachedbs.Put(b) + if !writeHitTheDatastore { + t.Fail() + } +} + +func TestElideDuplicateWrite(t *testing.T) { + cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} + bs := NewBlockstore(syncds.MutexWrap(cd)) + cachedbs, err := WriteCached(bs, 1) + if err != nil { + t.Fatal(err) + } + + b1 := blocks.NewBlock([]byte("foo")) + + cachedbs.Put(b1) + cd.SetFunc(func() { + t.Fatal("write hit the datastore") + }) + cachedbs.Put(b1) +} + +type callbackDatastore struct { + f func() + ds ds.Datastore +} + +func (c *callbackDatastore) SetFunc(f func()) { c.f = f } + +func (c *callbackDatastore) Put(key ds.Key, value interface{}) (err error) { + c.f() + return c.ds.Put(key, value) +} + +func (c *callbackDatastore) Get(key ds.Key) (value interface{}, err error) { + c.f() + return c.ds.Get(key) +} + +func (c *callbackDatastore) Has(key ds.Key) (exists bool, err error) { + c.f() + return c.ds.Has(key) +} + +func (c *callbackDatastore) Delete(key ds.Key) (err error) { + c.f() + return c.ds.Delete(key) +} + +func (c *callbackDatastore) KeyList() ([]ds.Key, error) { + c.f() + return c.ds.KeyList() +} From 7011a42aa8fb993af52511461c4f586e3cd6ac85 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 26 Nov 2014 16:55:28 -0800 Subject: [PATCH 0408/3147] feat(bitswap) make offline exchange query datastore License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@2f1cf9bf3317df11940d47ae32dd09441246016c --- blockservice/blocks_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 1a75723e2b..2645b20240 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -19,9 +19,8 @@ import ( ) func TestBlocks(t *testing.T) { - d := ds.NewMapDatastore() - tsds := dssync.MutexWrap(d) - bs, err := New(blockstore.NewBlockstore(tsds), offline.Exchange()) + bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + bs, err := New(bstore, offline.Exchange(bstore)) if err != nil { t.Error("failed to construct block service", err) return From f1379f4cbaa0d1324c93e39e2dfdfa0219cb1471 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 26 Nov 2014 16:55:28 -0800 Subject: [PATCH 0409/3147] feat(bitswap) make offline exchange query datastore License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-unixfs@b3ee4c0f87f2c32ed6236d70ca38dfb7c6989de1 --- unixfs/io/dagmodifier_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index d0aa837954..ed5b10d692 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -24,7 +24,7 @@ func getMockDagServ(t *testing.T) mdag.DAGService { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) - bserv, err := bs.New(bstore, offline.Exchange()) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) if err != nil { t.Fatal(err) } From bdf75bb5476ec337061148d65cec0c44d70de21f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 26 Nov 2014 16:55:28 -0800 Subject: [PATCH 0410/3147] feat(bitswap) make offline exchange query datastore License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-pinner@ab9ce81f6cabbe6dbc7b12faa42513774dc367b9 --- pinning/pinner/pin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index fc9dc215d4..dada99803d 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -23,7 +23,7 @@ func randNode() (*mdag.Node, util.Key) { func TestPinnerBasic(t *testing.T) { dstore := ds.NewMapDatastore() bstore := blockstore.NewBlockstore(dssync.MutexWrap(dstore)) - bserv, err := bs.New(bstore, offline.Exchange()) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) if err != nil { t.Fatal(err) } From 76c3cdd82cda9a50e626d87f17087a727569b803 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 26 Nov 2014 16:55:28 -0800 Subject: [PATCH 0411/3147] feat(bitswap) make offline exchange query datastore License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-exchange-offline@e7e4c6c5f249281a657f5c2f0db34a4a48b3f5fe --- exchange/offline/offline.go | 52 ++++++++++++++++++++-------- exchange/offline/offline_test.go | 59 +++++++++++++++++++++++++++++--- 2 files changed, 92 insertions(+), 19 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 24a89e038f..f1a6aaa61d 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -3,42 +3,66 @@ package offline import ( - "errors" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - blocks "github.com/jbenet/go-ipfs/blocks" + "github.com/jbenet/go-ipfs/blocks/blockstore" exchange "github.com/jbenet/go-ipfs/exchange" u "github.com/jbenet/go-ipfs/util" ) -var OfflineMode = errors.New("Block unavailable. Operating in offline mode") - -func Exchange() exchange.Interface { - return &offlineExchange{} +func Exchange(bs blockstore.Blockstore) exchange.Interface { + return &offlineExchange{bs: bs} } // offlineExchange implements the Exchange interface but doesn't return blocks. // For use in offline mode. -type offlineExchange struct{} +type offlineExchange struct { + bs blockstore.Blockstore +} // GetBlock returns nil to signal that a block could not be retrieved for the // given key. // NB: This function may return before the timeout expires. -func (_ *offlineExchange) GetBlock(context.Context, u.Key) (*blocks.Block, error) { - return nil, OfflineMode +func (e *offlineExchange) GetBlock(_ context.Context, k u.Key) (*blocks.Block, error) { + return e.bs.Get(k) } // HasBlock always returns nil. -func (_ *offlineExchange) HasBlock(context.Context, *blocks.Block) error { - return nil +func (e *offlineExchange) HasBlock(_ context.Context, b *blocks.Block) error { + return e.bs.Put(b) } // Close always returns nil. func (_ *offlineExchange) Close() error { + // NB: exchange doesn't own the blockstore's underlying datastore, so it is + // not responsible for closing it. return nil } -func (_ *offlineExchange) GetBlocks(context.Context, []u.Key) (<-chan *blocks.Block, error) { - return nil, OfflineMode +func (e *offlineExchange) GetBlocks(ctx context.Context, ks []u.Key) (<-chan *blocks.Block, error) { + out := make(chan *blocks.Block, 0) + go func() { + defer close(out) + var misses []u.Key + for _, k := range ks { + hit, err := e.bs.Get(k) + if err != nil { + misses = append(misses, k) + // a long line of misses should abort when context is cancelled. + select { + // TODO case send misses down channel + case <-ctx.Done(): + return + default: + continue + } + } + select { + case out <- hit: + case <-ctx.Done(): + return + } + } + }() + return out, nil } diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index ac02d2101e..d32f336d07 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -4,13 +4,16 @@ import ( "testing" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" blocks "github.com/jbenet/go-ipfs/blocks" + "github.com/jbenet/go-ipfs/blocks/blockstore" + "github.com/jbenet/go-ipfs/blocks/blocksutil" u "github.com/jbenet/go-ipfs/util" ) func TestBlockReturnsErr(t *testing.T) { - off := Exchange() + off := Exchange(bstore()) _, err := off.GetBlock(context.Background(), u.Key("foo")) if err != nil { return // as desired @@ -19,10 +22,56 @@ func TestBlockReturnsErr(t *testing.T) { } func TestHasBlockReturnsNil(t *testing.T) { - off := Exchange() + store := bstore() + ex := Exchange(store) block := blocks.NewBlock([]byte("data")) - err := off.HasBlock(context.Background(), block) + + err := ex.HasBlock(context.Background(), block) if err != nil { - t.Fatal("") + t.Fail() + } + + if _, err := store.Get(block.Key()); err != nil { + t.Fatal(err) + } +} + +func TestGetBlocks(t *testing.T) { + store := bstore() + ex := Exchange(store) + g := blocksutil.NewBlockGenerator() + + expected := g.Blocks(2) + + for _, b := range expected { + if err := ex.HasBlock(context.Background(), b); err != nil { + t.Fail() + } } + + request := func() []u.Key { + var ks []u.Key + + for _, b := range expected { + ks = append(ks, b.Key()) + } + return ks + }() + + received, err := ex.GetBlocks(context.Background(), request) + if err != nil { + t.Fatal(err) + } + + var count int + for _ = range received { + count++ + } + if len(expected) != count { + t.Fail() + } +} + +func bstore() blockstore.Blockstore { + return blockstore.NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) } From bd4dfd37f82f266282f5e28a53791de416e3999d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 6 Dec 2014 13:39:03 -0800 Subject: [PATCH 0412/3147] blockstore: Put checks Has first. This commit was moved from ipfs/go-ipfs-blockstore@cf153d24b2666016d4fea60f4545ca6705ab6030 --- blockstore/blockstore.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 68ccc7c746..3fe742ef8c 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -45,7 +45,13 @@ func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { } func (bs *blockstore) Put(block *blocks.Block) error { - return bs.datastore.Put(block.Key().DsKey(), block.Data) + // Has is cheaper than + k := block.Key().DsKey() + exists, err := bs.datastore.Has(k) + if err != nil && exists { + return nil // already stored. + } + return bs.datastore.Put(k, block.Data) } func (bs *blockstore) Has(k u.Key) (bool, error) { From 66ca90a118ed713ead703c3131648be9d13f6408 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 6 Dec 2014 15:18:16 -0800 Subject: [PATCH 0413/3147] rm redundant Has License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@de8b2c68f2ad628e52127c74e7cd4a066e2d599b --- blockservice/blockservice.go | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0ebe30a4da..f44eaa0f5a 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -44,25 +44,10 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() log.Debugf("blockservice: storing [%s] in datastore", k) - // TODO(brian): define a block datastore with a Put method which accepts a - // block parameter - - // check if we have it before adding. this is an extra read, but large writes - // are more expensive. - // TODO(jbenet) cheaper has. https://github.com/jbenet/go-datastore/issues/6 - has, err := s.Blockstore.Has(k) + err := s.Blockstore.Put(b) if err != nil { return k, err } - if has { - log.Debugf("blockservice: storing [%s] in datastore (already stored)", k) - } else { - log.Debugf("blockservice: storing [%s] in datastore", k) - err := s.Blockstore.Put(b) - if err != nil { - return k, err - } - } // TODO this operation rate-limits blockservice operations, we should // consider moving this to an sync process. From 29baf9325caa673e995494a1c9f7f0a8f71fe082 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 01:09:37 -0800 Subject: [PATCH 0414/3147] refactor(peerstore) s/Get/FindOrCreate License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@f6c0f472ab48929391840ad8aadcd8198e58dbf2 --- routing/dht/dht.go | 2 +- routing/dht/records.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0277f644bc..1d9c3a47a9 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -500,7 +500,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.Peer // getPeer searches the peerstore for a peer with the given peer ID func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { - p, err := dht.peerstore.Get(id) + p, err := dht.peerstore.FindOrCreate(id) if err != nil { err = fmt.Errorf("Failed to get peer from peerstore: %s", err) log.Error(err) diff --git a/routing/dht/records.go b/routing/dht/records.go index 0a3b4f4e0c..0ea455a17e 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -44,7 +44,7 @@ func (dht *IpfsDHT) makePutRecord(key u.Key, value []byte) (*pb.Record, error) { func (dht *IpfsDHT) getPublicKey(pid peer.ID) (ci.PubKey, error) { log.Debug("getPublicKey for: %s", pid) - p, err := dht.peerstore.Get(pid) + p, err := dht.peerstore.FindOrCreate(pid) if err == nil { return p.PubKey(), nil } @@ -67,7 +67,7 @@ func (dht *IpfsDHT) getPublicKey(pid peer.ID) (ci.PubKey, error) { func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { // First, validate the signature - p, err := dht.peerstore.Get(peer.ID(r.GetAuthor())) + p, err := dht.peerstore.FindOrCreate(peer.ID(r.GetAuthor())) if err != nil { return err } From 842fa71aa9f7baddba60de389a81448b53c42930 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 01:40:07 -0800 Subject: [PATCH 0415/3147] refactor(peer): create peer through peerstore for safety! use mockpeer.WithID methods to create peers in tests License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@3067a8a060696c4f9c33db916436274623324267 --- routing/dht/dht_test.go | 3 ++- routing/dht/ext_test.go | 3 ++- routing/dht/providers_test.go | 3 ++- routing/mock/routing_test.go | 13 +++++++------ 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index e62145d5b2..df16ea8787 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,6 +14,7 @@ import ( mux "github.com/jbenet/go-ipfs/net/mux" netservice "github.com/jbenet/go-ipfs/net/service" peer "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/peer/mock" u "github.com/jbenet/go-ipfs/util" "fmt" @@ -68,7 +69,7 @@ func makePeer(addr ma.Multiaddr) peer.Peer { if err != nil { panic(err) } - p, err := peer.WithKeyPair(sk, pk) + p, err := mockpeer.WithKeyPair(sk, pk) if err != nil { panic(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 791c1066c8..1f30ff4faa 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -12,6 +12,7 @@ import ( msg "github.com/jbenet/go-ipfs/net/message" mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/peer/mock" "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" @@ -210,7 +211,7 @@ func TestGetFailures(t *testing.T) { func _randPeer() peer.Peer { id := make(peer.ID, 16) crand.Read(id) - p := peer.WithID(id) + p := mockpeer.WithID(id) return p } diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 1ae85fbc40..f22c09a7bf 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/peer/mock" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -14,7 +15,7 @@ func TestProviderManager(t *testing.T) { mid := peer.ID("testing") p := NewProviderManager(ctx, mid) a := u.Key("test") - p.AddProvider(a, peer.WithIDString("testingprovider")) + p.AddProvider(a, mockpeer.WithIDString("testingprovider")) resp := p.GetProviders(ctx, a) if len(resp) != 1 { t.Fatal("Could not retrieve provider.") diff --git a/routing/mock/routing_test.go b/routing/mock/routing_test.go index 196e00b5e6..ca9c845d0a 100644 --- a/routing/mock/routing_test.go +++ b/routing/mock/routing_test.go @@ -6,6 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/peer/mock" u "github.com/jbenet/go-ipfs/util" ) @@ -20,7 +21,7 @@ func TestKeyNotFound(t *testing.T) { func TestSetAndGet(t *testing.T) { pid := peer.ID([]byte("the peer id")) - p := peer.WithID(pid) + p := mockpeer.WithID(pid) k := u.Key("42") rs := VirtualRoutingServer() err := rs.Announce(p, k) @@ -40,7 +41,7 @@ func TestSetAndGet(t *testing.T) { } func TestClientFindProviders(t *testing.T) { - peer := peer.WithIDString("42") + peer := mockpeer.WithIDString("42") rs := VirtualRoutingServer() client := rs.Client(peer) @@ -79,7 +80,7 @@ func TestClientOverMax(t *testing.T) { k := u.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { - peer := peer.WithIDString(string(i)) + peer := mockpeer.WithIDString(string(i)) err := rs.Announce(peer, k) if err != nil { t.Fatal(err) @@ -92,7 +93,7 @@ func TestClientOverMax(t *testing.T) { } max := 10 - peer := peer.WithIDString("TODO") + peer := mockpeer.WithIDString("TODO") client := rs.Client(peer) providersFromClient := client.FindProvidersAsync(context.Background(), k, max) @@ -114,7 +115,7 @@ func TestCanceledContext(t *testing.T) { i := 0 go func() { // infinite stream for { - peer := peer.WithIDString(string(i)) + peer := mockpeer.WithIDString(string(i)) err := rs.Announce(peer, k) if err != nil { t.Fatal(err) @@ -123,7 +124,7 @@ func TestCanceledContext(t *testing.T) { } }() - local := peer.WithIDString("peer id doesn't matter") + local := mockpeer.WithIDString("peer id doesn't matter") client := rs.Client(local) t.Log("warning: max is finite so this test is non-deterministic") From dd5e6fd27337cfd2c1ab1ab98e5a6622385f2d7f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 01:40:07 -0800 Subject: [PATCH 0416/3147] refactor(peer): create peer through peerstore for safety! use mockpeer.WithID methods to create peers in tests License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-namesys@c982a506c5e87b8ec0c0a819e4975c8abfadc359 --- namesys/resolve_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index d7d49c5a64..35fa492546 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -5,13 +5,13 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ci "github.com/jbenet/go-ipfs/crypto" - "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/peer/mock" mock "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" ) func TestRoutingResolve(t *testing.T) { - local := peer.WithIDString("testID") + local := mockpeer.WithIDString("testID") lds := ds.NewMapDatastore() d := mock.NewMockRouter(local, lds) From e5988b9776aef03d0fa5c7d2f155a0abbe57bd9b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 01:40:07 -0800 Subject: [PATCH 0417/3147] refactor(peer): create peer through peerstore for safety! use mockpeer.WithID methods to create peers in tests License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-blockstore@c5a445d762d44c47fd175c0364bc0235e73889c2 --- blockstore/write_cache_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index 2be8659031..c2175a1fc7 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -1,10 +1,11 @@ package blockstore import ( + "testing" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/jbenet/go-ipfs/blocks" - "testing" ) func TestReturnsErrorWhenSizeNegative(t *testing.T) { From 4ab1342d5822d5d297fd7460f95dba5c81e27070 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 14:32:52 -0800 Subject: [PATCH 0418/3147] fix(core, peer) helpers to testutil, err handling License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@776fe95d24ca0ee9fb1706e87f7cc499183430eb --- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 7 +++---- routing/dht/providers_test.go | 4 ++-- routing/mock/routing_test.go | 14 +++++++------- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index df16ea8787..30ef2d3aa2 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,8 +14,8 @@ import ( mux "github.com/jbenet/go-ipfs/net/mux" netservice "github.com/jbenet/go-ipfs/net/service" peer "github.com/jbenet/go-ipfs/peer" - "github.com/jbenet/go-ipfs/peer/mock" u "github.com/jbenet/go-ipfs/util" + testutil "github.com/jbenet/go-ipfs/util/testutil" "fmt" "time" @@ -69,7 +69,7 @@ func makePeer(addr ma.Multiaddr) peer.Peer { if err != nil { panic(err) } - p, err := mockpeer.WithKeyPair(sk, pk) + p, err := testutil.NewPeerWithKeyPair(sk, pk) if err != nil { panic(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 1f30ff4faa..fa536edd49 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,15 +7,14 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" msg "github.com/jbenet/go-ipfs/net/message" mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" - "github.com/jbenet/go-ipfs/peer/mock" - "github.com/jbenet/go-ipfs/routing" + routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" + testutil "github.com/jbenet/go-ipfs/util/testutil" "sync" "time" @@ -211,7 +210,7 @@ func TestGetFailures(t *testing.T) { func _randPeer() peer.Peer { id := make(peer.ID, 16) crand.Read(id) - p := mockpeer.WithID(id) + p := testutil.NewPeerWithID(id) return p } diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index f22c09a7bf..7d8aaa304b 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/jbenet/go-ipfs/peer" - "github.com/jbenet/go-ipfs/peer/mock" u "github.com/jbenet/go-ipfs/util" + testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) @@ -15,7 +15,7 @@ func TestProviderManager(t *testing.T) { mid := peer.ID("testing") p := NewProviderManager(ctx, mid) a := u.Key("test") - p.AddProvider(a, mockpeer.WithIDString("testingprovider")) + p.AddProvider(a, testutil.NewPeerWithIDString("testingprovider")) resp := p.GetProviders(ctx, a) if len(resp) != 1 { t.Fatal("Could not retrieve provider.") diff --git a/routing/mock/routing_test.go b/routing/mock/routing_test.go index ca9c845d0a..536d7b0189 100644 --- a/routing/mock/routing_test.go +++ b/routing/mock/routing_test.go @@ -6,8 +6,8 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/peer" - "github.com/jbenet/go-ipfs/peer/mock" u "github.com/jbenet/go-ipfs/util" + testutil "github.com/jbenet/go-ipfs/util/testutil" ) func TestKeyNotFound(t *testing.T) { @@ -21,7 +21,7 @@ func TestKeyNotFound(t *testing.T) { func TestSetAndGet(t *testing.T) { pid := peer.ID([]byte("the peer id")) - p := mockpeer.WithID(pid) + p := testutil.NewPeerWithID(pid) k := u.Key("42") rs := VirtualRoutingServer() err := rs.Announce(p, k) @@ -41,7 +41,7 @@ func TestSetAndGet(t *testing.T) { } func TestClientFindProviders(t *testing.T) { - peer := mockpeer.WithIDString("42") + peer := testutil.NewPeerWithIDString("42") rs := VirtualRoutingServer() client := rs.Client(peer) @@ -80,7 +80,7 @@ func TestClientOverMax(t *testing.T) { k := u.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { - peer := mockpeer.WithIDString(string(i)) + peer := testutil.NewPeerWithIDString(string(i)) err := rs.Announce(peer, k) if err != nil { t.Fatal(err) @@ -93,7 +93,7 @@ func TestClientOverMax(t *testing.T) { } max := 10 - peer := mockpeer.WithIDString("TODO") + peer := testutil.NewPeerWithIDString("TODO") client := rs.Client(peer) providersFromClient := client.FindProvidersAsync(context.Background(), k, max) @@ -115,7 +115,7 @@ func TestCanceledContext(t *testing.T) { i := 0 go func() { // infinite stream for { - peer := mockpeer.WithIDString(string(i)) + peer := testutil.NewPeerWithIDString(string(i)) err := rs.Announce(peer, k) if err != nil { t.Fatal(err) @@ -124,7 +124,7 @@ func TestCanceledContext(t *testing.T) { } }() - local := mockpeer.WithIDString("peer id doesn't matter") + local := testutil.NewPeerWithIDString("peer id doesn't matter") client := rs.Client(local) t.Log("warning: max is finite so this test is non-deterministic") From 317b72c0dc185b78908afa5d6e084bc6031ae103 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 14:32:52 -0800 Subject: [PATCH 0419/3147] fix(core, peer) helpers to testutil, err handling License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-namesys@fec652f8dcf1e3849c227c67ec908261090f0a92 --- namesys/resolve_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 35fa492546..eef5e68258 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -5,13 +5,13 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ci "github.com/jbenet/go-ipfs/crypto" - "github.com/jbenet/go-ipfs/peer/mock" mock "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" + testutil "github.com/jbenet/go-ipfs/util/testutil" ) func TestRoutingResolve(t *testing.T) { - local := mockpeer.WithIDString("testID") + local := testutil.NewPeerWithIDString("testID") lds := ds.NewMapDatastore() d := mock.NewMockRouter(local, lds) From 5d19ab18626ecc27bd4547b830229e2c57457284 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 02:55:33 -0800 Subject: [PATCH 0420/3147] silence verbose output for higher SnR at IPFS_LOGGING=info License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@d023ec2221e69d76110591a0132ea7f15d99b946 --- routing/dht/routing.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 134e54ccbf..47a64d3fd8 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -274,10 +274,10 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(ctx context.Context, p peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? - log.Infof("ping %s start", p) + log.Debugf("ping %s start", p) pmes := pb.NewMessage(pb.Message_PING, "", 0) _, err := dht.sendRequest(ctx, p, pmes) - log.Infof("ping %s end (err = %s)", p, err) + log.Debugf("ping %s end (err = %s)", p, err) return err } From 66d2f2d7d539b32895a7a2b53abbf9c1844fec41 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 04:07:52 -0800 Subject: [PATCH 0421/3147] refactor(dht) remove extraneous return value License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@4775502bac51f8563df1557ffb41599e2f6f1f95 --- routing/dht/dht.go | 17 ++++------------- routing/dht/dht_test.go | 32 ++++++++++++++++---------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1d9c3a47a9..5aa0e8d463 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -97,32 +97,23 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia } // Connect to a new peer at the given address, ping and add to the routing table -func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) (peer.Peer, error) { - // TODO(jbenet,whyrusleeping) - // - // Connect should take in a Peer (with ID). In a sense, we shouldn't be - // allowing connections to random multiaddrs without knowing who we're - // speaking to (i.e. peer.ID). In terms of moving around simple addresses - // -- instead of an (ID, Addr) pair -- we can use: - // - // /ip4/10.20.30.40/tcp/1234/ipfs/Qxhxxchxzcncxnzcnxzcxzm - // +func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) error { err := dht.dialer.DialPeer(ctx, npeer) if err != nil { - return nil, err + return err } // Ping new peer to register in their routing table // NOTE: this should be done better... err = dht.Ping(ctx, npeer) if err != nil { - return nil, fmt.Errorf("failed to ping newly connected peer: %s\n", err) + return fmt.Errorf("failed to ping newly connected peer: %s\n", err) } log.Event(ctx, "connect", dht.self, npeer) dht.Update(ctx, npeer) - return npeer, nil + return nil } // HandleMessage implements the inet.Handler interface. diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 30ef2d3aa2..e440964dcb 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -101,7 +101,7 @@ func TestPing(t *testing.T) { defer dhtA.dialer.(inet.Network).Close() defer dhtB.dialer.(inet.Network).Close() - _, err = dhtA.Connect(ctx, peerB) + err = dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } @@ -151,7 +151,7 @@ func TestValueGetSet(t *testing.T) { defer dhtA.dialer.(inet.Network).Close() defer dhtB.dialer.(inet.Network).Close() - _, err = dhtA.Connect(ctx, peerB) + err = dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } @@ -194,17 +194,17 @@ func TestProvides(t *testing.T) { } }() - _, err := dhts[0].Connect(ctx, peers[1]) + err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(ctx, peers[2]) + err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(ctx, peers[3]) + err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } @@ -256,17 +256,17 @@ func TestProvidesAsync(t *testing.T) { } }() - _, err := dhts[0].Connect(ctx, peers[1]) + err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(ctx, peers[2]) + err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(ctx, peers[3]) + err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } @@ -321,17 +321,17 @@ func TestLayeredGet(t *testing.T) { } }() - _, err := dhts[0].Connect(ctx, peers[1]) + err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatalf("Failed to connect: %s", err) } - _, err = dhts[1].Connect(ctx, peers[2]) + err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(ctx, peers[3]) + err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } @@ -376,17 +376,17 @@ func TestFindPeer(t *testing.T) { } }() - _, err := dhts[0].Connect(ctx, peers[1]) + err := dhts[0].Connect(ctx, peers[1]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(ctx, peers[2]) + err = dhts[1].Connect(ctx, peers[2]) if err != nil { t.Fatal(err) } - _, err = dhts[1].Connect(ctx, peers[3]) + err = dhts[1].Connect(ctx, peers[3]) if err != nil { t.Fatal(err) } @@ -435,14 +435,14 @@ func TestConnectCollision(t *testing.T) { done := make(chan struct{}) go func() { - _, err := dhtA.Connect(ctx, peerB) + err := dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } done <- struct{}{} }() go func() { - _, err := dhtB.Connect(ctx, peerA) + err := dhtB.Connect(ctx, peerA) if err != nil { t.Fatal(err) } From 9991b9c1ce10b6c020c21bdc1b3032be7c5b69dd Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 20 Nov 2014 10:46:19 -0800 Subject: [PATCH 0422/3147] dht: linting This commit was moved from ipfs/go-ipfs-routing@b51893055d5ab538170522f96927169163222c5a --- routing/dht/dht.go | 4 ++-- routing/dht/pb/message.go | 2 ++ routing/dht/routing.go | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5aa0e8d463..162f60c560 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -1,4 +1,4 @@ -// package dht implements a distributed hash table that satisfies the ipfs routing +// Package dht implements a distributed hash table that satisfies the ipfs routing // interface. This DHT is modeled after kademlia with Coral and S/Kademlia modifications. package dht @@ -583,7 +583,7 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context) { rand.Read(id) p, err := dht.FindPeer(ctx, peer.ID(id)) if err != nil { - log.Error("Bootstrap peer error: %s", err) + log.Errorf("Bootstrap peer error: %s", err) } err = dht.dialer.DialPeer(ctx, p) if err != nil { diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 6ea98d4cdb..f8001c5f7a 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -31,6 +31,8 @@ func peerToPBPeer(p peer.Peer) *Message_Peer { return pbp } +// PeersToPBPeers converts a slice of Peers into a slice of *Message_Peers, +// ready to go out on the wire. func PeersToPBPeers(peers []peer.Peer) []*Message_Peer { pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 47a64d3fd8..4e2dc3745e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -125,6 +125,9 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { return nil } +// FindProvidersAsync is the same thing as FindProviders, but returns a channel. +// Peers will be returned on the channel as soon as they are found, even before +// the search query completes. func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { log.Event(ctx, "findProviders", &key) peerOut := make(chan peer.Peer, count) @@ -199,7 +202,6 @@ func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.M wg.Wait() } -// Find specific Peer // FindPeer searches for a peer with given ID. func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) { From 08ad5f4f50682905fdb538e7ee6e4c5628d0459d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 20 Nov 2014 10:46:56 -0800 Subject: [PATCH 0423/3147] dht: changed msgs, include multiple addrs + conn type See https://github.com/jbenet/go-ipfs/issues/153#issuecomment-63350535 This commit was moved from ipfs/go-ipfs-routing@80effbe51cdcf8d29457bff0cc1a3e26adf4691b --- routing/dht/dht.go | 7 ++-- routing/dht/handlers.go | 10 +++--- routing/dht/pb/dht.pb.go | 74 ++++++++++++++++++++++++++++++++++----- routing/dht/pb/dht.proto | 23 +++++++++++- routing/dht/pb/message.go | 27 ++++++++------ routing/dht/routing.go | 11 ++++-- 6 files changed, 124 insertions(+), 28 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 162f60c560..d5aca0d7f0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -517,11 +517,14 @@ func (dht *IpfsDHT) peerFromInfo(pbp *pb.Message_Peer) (peer.Peer, error) { return nil, err } - maddr, err := pbp.Address() + // add addresses we've just discovered + maddrs, err := pbp.Addresses() if err != nil { return nil, err } - p.AddAddress(maddr) + for _, maddr := range maddrs { + p.AddAddress(maddr) + } return p, nil } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 07f21f18a9..41013a6336 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -210,14 +210,16 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.Peer, pmes *pb pid := peer.ID(pb.GetId()) if pid.Equal(p.ID()) { - addr, err := pb.Address() + maddrs, err := pb.Addresses() if err != nil { - log.Errorf("provider %s error with address %s", p, *pb.Addr) + log.Errorf("provider %s error with addresses %s", p, pb.Addrs) continue } - log.Infof("received provider %s %s for %s", p, addr, key) - p.AddAddress(addr) + log.Infof("received provider %s %s for %s", p, maddrs, key) + for _, maddr := range maddrs { + p.AddAddress(maddr) + } dht.providers.AddProvider(key, p) } else { diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 3e52a94ed8..e102ef7d3c 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -15,10 +15,12 @@ It has these top-level messages: package dht_pb import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import json "encoding/json" import math "math" -// Reference imports to suppress errors if they are not otherwise used. +// Reference proto, json, and math imports to suppress error if they are not otherwise used. var _ = proto.Marshal +var _ = &json.SyntaxError{} var _ = math.Inf type Message_MessageType int32 @@ -66,6 +68,50 @@ func (x *Message_MessageType) UnmarshalJSON(data []byte) error { return nil } +type Message_ConnectionType int32 + +const ( + // sender does not have a connection to peer, and no extra information (default) + Message_NOT_CONNECTED Message_ConnectionType = 0 + // sender has a live connection to peer + Message_CONNECTED Message_ConnectionType = 1 + // sender recently connected to peer + Message_CAN_CONNECT Message_ConnectionType = 2 + // sender recently tried to connect to peer repeatedly but failed to connect + // ("try" here is loose, but this should signal "made strong effort, failed") + Message_CANNOT_CONNECT Message_ConnectionType = 3 +) + +var Message_ConnectionType_name = map[int32]string{ + 0: "NOT_CONNECTED", + 1: "CONNECTED", + 2: "CAN_CONNECT", + 3: "CANNOT_CONNECT", +} +var Message_ConnectionType_value = map[string]int32{ + "NOT_CONNECTED": 0, + "CONNECTED": 1, + "CAN_CONNECT": 2, + "CANNOT_CONNECT": 3, +} + +func (x Message_ConnectionType) Enum() *Message_ConnectionType { + p := new(Message_ConnectionType) + *p = x + return p +} +func (x Message_ConnectionType) String() string { + return proto.EnumName(Message_ConnectionType_name, int32(x)) +} +func (x *Message_ConnectionType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Message_ConnectionType_value, data, "Message_ConnectionType") + if err != nil { + return err + } + *x = Message_ConnectionType(value) + return nil +} + type Message struct { // defines what type of message it is. Type *Message_MessageType `protobuf:"varint,1,opt,name=type,enum=dht.pb.Message_MessageType" json:"type,omitempty"` @@ -133,9 +179,13 @@ func (m *Message) GetProviderPeers() []*Message_Peer { } type Message_Peer struct { - Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` - Addr *string `protobuf:"bytes,2,opt,name=addr" json:"addr,omitempty"` - XXX_unrecognized []byte `json:"-"` + // ID of a given peer. + Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` + // multiaddrs for a given peer + Addrs []string `protobuf:"bytes,2,rep,name=addrs" json:"addrs,omitempty"` + // used to signal the sender's connection capabilities to the peer + Connection *Message_ConnectionType `protobuf:"varint,3,opt,name=connection,enum=dht.pb.Message_ConnectionType" json:"connection,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *Message_Peer) Reset() { *m = Message_Peer{} } @@ -149,11 +199,18 @@ func (m *Message_Peer) GetId() string { return "" } -func (m *Message_Peer) GetAddr() string { - if m != nil && m.Addr != nil { - return *m.Addr +func (m *Message_Peer) GetAddrs() []string { + if m != nil { + return m.Addrs } - return "" + return nil +} + +func (m *Message_Peer) GetConnection() Message_ConnectionType { + if m != nil && m.Connection != nil { + return *m.Connection + } + return Message_NOT_CONNECTED } // Record represents a dht record that contains a value @@ -204,4 +261,5 @@ func (m *Record) GetSignature() []byte { func init() { proto.RegisterEnum("dht.pb.Message_MessageType", Message_MessageType_name, Message_MessageType_value) + proto.RegisterEnum("dht.pb.Message_ConnectionType", Message_ConnectionType_name, Message_ConnectionType_value) } diff --git a/routing/dht/pb/dht.proto b/routing/dht/pb/dht.proto index 1b49a15522..6f31dd5e3a 100644 --- a/routing/dht/pb/dht.proto +++ b/routing/dht/pb/dht.proto @@ -12,9 +12,30 @@ message Message { PING = 5; } + enum ConnectionType { + // sender does not have a connection to peer, and no extra information (default) + NOT_CONNECTED = 0; + + // sender has a live connection to peer + CONNECTED = 1; + + // sender recently connected to peer + CAN_CONNECT = 2; + + // sender recently tried to connect to peer repeatedly but failed to connect + // ("try" here is loose, but this should signal "made strong effort, failed") + CANNOT_CONNECT = 3; + } + message Peer { + // ID of a given peer. optional string id = 1; - optional string addr = 2; + + // multiaddrs for a given peer + repeated string addrs = 2; + + // used to signal the sender's connection capabilities to the peer + optional ConnectionType connection = 3; } // defines what type of message it is. diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index f8001c5f7a..a7cc28b044 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -3,7 +3,6 @@ package dht_pb import ( "errors" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" peer "github.com/jbenet/go-ipfs/peer" ) @@ -19,12 +18,11 @@ func NewMessage(typ Message_MessageType, key string, level int) *Message { func peerToPBPeer(p peer.Peer) *Message_Peer { pbp := new(Message_Peer) - addrs := p.Addresses() - if len(addrs) == 0 || addrs[0] == nil { - pbp.Addr = proto.String("") - } else { - addr := addrs[0].String() - pbp.Addr = &addr + + maddrs := p.Addresses() + pbp.Addrs = make([]string, len(maddrs)) + for i, maddr := range maddrs { + pbp.Addrs[i] = maddr.String() } pid := string(p.ID()) pbp.Id = &pid @@ -41,12 +39,21 @@ func PeersToPBPeers(peers []peer.Peer) []*Message_Peer { return pbpeers } -// Address returns a multiaddr associated with the Message_Peer entry -func (m *Message_Peer) Address() (ma.Multiaddr, error) { +// Addresses returns a multiaddr associated with the Message_Peer entry +func (m *Message_Peer) Addresses() ([]ma.Multiaddr, error) { if m == nil { return nil, errors.New("MessagePeer is nil") } - return ma.NewMultiaddr(*m.Addr) + + var err error + maddrs := make([]ma.Multiaddr, len(m.Addrs)) + for i, addr := range m.Addrs { + maddrs[i], err = ma.NewMultiaddr(addr) + if err != nil { + return nil, err + } + } + return maddrs, nil } // GetClusterLevel gets and adjusts the cluster level on the message. diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4e2dc3745e..1074b23ec8 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -241,12 +241,17 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) log.Warningf("Received invalid peer from query: %v", err) continue } - ma, err := pbp.Address() + + // add addresses + maddrs, err := pbp.Addresses() if err != nil { - log.Warning("Received peer with bad or missing address.") + log.Warning("Received peer with bad or missing addresses: %s", pbp.Addrs) continue } - np.AddAddress(ma) + for _, maddr := range maddrs { + np.AddAddress(maddr) + } + if pbp.GetId() == string(id) { return &dhtQueryResult{ peer: np, From 7a17d6b7a0f4bc9cb8a0bc6e00252715f789c8ec Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 20 Nov 2014 11:02:13 -0800 Subject: [PATCH 0424/3147] dht tests: dont introduce nil multiaddr this is the type of assumption we shouldn't violate. This commit was moved from ipfs/go-ipfs-routing@32cb5e94b06176982e983829a84ca505f77cd258 --- routing/dht/dht_test.go | 8 ++++++++ routing/dht/ext_test.go | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index e440964dcb..524ebc7634 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -64,6 +64,14 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer return addrs, peers, dhts } +func makePeerString(t *testing.T, addr string) peer.Peer { + maddr, err := ma.NewMultiaddr(addr) + if err != nil { + t.Fatal(err) + } + return makePeer(maddr) +} + func makePeer(addr ma.Multiaddr) peer.Peer { sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) if err != nil { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index fa536edd49..e0cae2a88c 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -125,10 +125,10 @@ func TestGetFailures(t *testing.T) { fs := &fauxSender{} peerstore := peer.NewPeerstore() - local := makePeer(nil) + local := makePeerString(t, "") d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) - other := makePeer(nil) + other := makePeerString(t, "") d.Update(ctx, other) // This one should time out @@ -223,7 +223,7 @@ func TestNotFound(t *testing.T) { fn := &fauxNet{} fs := &fauxSender{} - local := makePeer(nil) + local := makePeerString(t, "") peerstore := peer.NewPeerstore() peerstore.Add(local) @@ -289,7 +289,7 @@ func TestLessThanKResponses(t *testing.T) { u.Debug = false fn := &fauxNet{} fs := &fauxSender{} - local := makePeer(nil) + local := makePeerString(t, "") peerstore := peer.NewPeerstore() peerstore.Add(local) From f30253a620e2b90982319dfbd7148933e31844d1 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 20 Nov 2014 18:45:05 -0800 Subject: [PATCH 0425/3147] net: add Connectedness var. This commit was moved from ipfs/go-ipfs-routing@edde08f4dae931c29dde6e6dd3aaf2efac5f95af --- routing/dht/ext_test.go | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index e0cae2a88c..3e5a842be9 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -8,6 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + inet "github.com/jbenet/go-ipfs/net" msg "github.com/jbenet/go-ipfs/net/message" mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" @@ -79,6 +80,7 @@ func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error { // fauxNet is a standin for a swarm.Network in order to more easily recreate // different testing scenarios type fauxNet struct { + local peer.Peer } // DialPeer attempts to establish a connection to a given peer @@ -86,6 +88,10 @@ func (f *fauxNet) DialPeer(context.Context, peer.Peer) error { return nil } +func (f *fauxNet) LocalPeer() peer.Peer { + return f.local +} + // ClosePeer connection to peer func (f *fauxNet) ClosePeer(peer.Peer) error { return nil @@ -96,6 +102,11 @@ func (f *fauxNet) IsConnected(peer.Peer) (bool, error) { return true, nil } +// Connectedness returns whether a connection to given peer exists. +func (f *fauxNet) Connectedness(peer.Peer) inet.Connectedness { + return inet.Connected +} + // GetProtocols returns the protocols registered in the network. func (f *fauxNet) GetProtocols() *mux.ProtocolMap { return nil } @@ -120,13 +131,13 @@ func TestGetFailures(t *testing.T) { t.SkipNow() } - ctx := context.Background() - fn := &fauxNet{} - fs := &fauxSender{} - peerstore := peer.NewPeerstore() local := makePeerString(t, "") + ctx := context.Background() + fn := &fauxNet{local} + fs := &fauxSender{} + d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) other := makePeerString(t, "") d.Update(ctx, other) @@ -219,14 +230,14 @@ func TestNotFound(t *testing.T) { t.SkipNow() } - ctx := context.Background() - fn := &fauxNet{} - fs := &fauxSender{} - local := makePeerString(t, "") peerstore := peer.NewPeerstore() peerstore.Add(local) + ctx := context.Background() + fn := &fauxNet{local} + fs := &fauxSender{} + d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) var ps []peer.Peer @@ -285,14 +296,15 @@ func TestNotFound(t *testing.T) { func TestLessThanKResponses(t *testing.T) { // t.Skip("skipping test because it makes a lot of output") - ctx := context.Background() - u.Debug = false - fn := &fauxNet{} - fs := &fauxSender{} local := makePeerString(t, "") peerstore := peer.NewPeerstore() peerstore.Add(local) + ctx := context.Background() + u.Debug = false + fn := &fauxNet{local} + fs := &fauxSender{} + d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) var ps []peer.Peer From e09a00993b66bc9c3dc7fcc9a1e3131c3923d9ee Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 21 Nov 2014 03:45:03 -0800 Subject: [PATCH 0426/3147] dht/pb: changed PeersToPBPeers to set ConnectionType Uses an inet.Dialer This commit was moved from ipfs/go-ipfs-routing@cbb356959d142607ab3d6eee07349d813a432af9 --- routing/dht/dht.go | 2 +- routing/dht/ext_test.go | 4 +-- routing/dht/handlers.go | 10 +++---- routing/dht/pb/message.go | 55 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 61 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d5aca0d7f0..fff833e583 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -227,7 +227,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) er pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) // add self as the provider - pmes.ProviderPeers = pb.PeersToPBPeers([]peer.Peer{dht.self}) + pmes.ProviderPeers = pb.PeersToPBPeers(dht.dialer, []peer.Peer{dht.self}) rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 3e5a842be9..b2d72043d6 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -262,7 +262,7 @@ func TestNotFound(t *testing.T) { for i := 0; i < 7; i++ { peers = append(peers, _randPeer()) } - resp.CloserPeers = pb.PeersToPBPeers(peers) + resp.CloserPeers = pb.PeersToPBPeers(d.dialer, peers) mes, err := msg.FromObject(mes.Peer(), resp) if err != nil { t.Error(err) @@ -326,7 +326,7 @@ func TestLessThanKResponses(t *testing.T) { case pb.Message_GET_VALUE: resp := &pb.Message{ Type: pmes.Type, - CloserPeers: pb.PeersToPBPeers([]peer.Peer{other}), + CloserPeers: pb.PeersToPBPeers(d.dialer, []peer.Peer{other}), } mes, err := msg.FromObject(mes.Peer(), resp) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 41013a6336..a370913498 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -87,7 +87,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.Peer, pmes *pb.Me provs := dht.providers.GetProviders(ctx, u.Key(pmes.GetKey())) if len(provs) > 0 { log.Debugf("handleGetValue returning %d provider[s]", len(provs)) - resp.ProviderPeers = pb.PeersToPBPeers(provs) + resp.ProviderPeers = pb.PeersToPBPeers(dht.dialer, provs) } // Find closest peer on given cluster to desired key and reply with that info @@ -99,7 +99,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.Peer, pmes *pb.Me log.Critical("no addresses on peer being sent!") } } - resp.CloserPeers = pb.PeersToPBPeers(closer) + resp.CloserPeers = pb.PeersToPBPeers(dht.dialer, closer) } return resp, nil @@ -159,7 +159,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.Peer, pmes *pb.Me for _, p := range withAddresses { log.Debugf("handleFindPeer: sending back '%s'", p) } - resp.CloserPeers = pb.PeersToPBPeers(withAddresses) + resp.CloserPeers = pb.PeersToPBPeers(dht.dialer, withAddresses) return resp, nil } @@ -183,13 +183,13 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.Peer, pmes *p // if we've got providers, send thos those. if providers != nil && len(providers) > 0 { - resp.ProviderPeers = pb.PeersToPBPeers(providers) + resp.ProviderPeers = pb.PeersToPBPeers(dht.dialer, providers) } // Also send closer peers. closer := dht.betterPeersToQuery(pmes, CloserPeerCount) if closer != nil { - resp.CloserPeers = pb.PeersToPBPeers(closer) + resp.CloserPeers = pb.PeersToPBPeers(dht.dialer, closer) } return resp, nil diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index a7cc28b044..8f3b06c01e 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,9 +4,12 @@ import ( "errors" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + + inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" ) +// NewMessage constructs a new dht message with given type, key, and level func NewMessage(typ Message_MessageType, key string, level int) *Message { m := &Message{ Type: &typ, @@ -29,9 +32,9 @@ func peerToPBPeer(p peer.Peer) *Message_Peer { return pbp } -// PeersToPBPeers converts a slice of Peers into a slice of *Message_Peers, +// RawPeersToPBPeers converts a slice of Peers into a slice of *Message_Peers, // ready to go out on the wire. -func PeersToPBPeers(peers []peer.Peer) []*Message_Peer { +func RawPeersToPBPeers(peers []peer.Peer) []*Message_Peer { pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { pbpeers[i] = peerToPBPeer(p) @@ -39,6 +42,19 @@ func PeersToPBPeers(peers []peer.Peer) []*Message_Peer { return pbpeers } +// PeersToPBPeers converts given []peer.Peer into a set of []*Message_Peer, +// which can be written to a message and sent out. the key thing this function +// does (in addition to PeersToPBPeers) is set the ConnectionType with +// information from the given inet.Dialer. +func PeersToPBPeers(d inet.Dialer, peers []peer.Peer) []*Message_Peer { + pbps := RawPeersToPBPeers(peers) + for i, pbp := range pbps { + c := ConnectionType(d.Connectedness(peers[i])) + pbp.Connection = &c + } + return pbps +} + // Addresses returns a multiaddr associated with the Message_Peer entry func (m *Message_Peer) Addresses() ([]ma.Multiaddr, error) { if m == nil { @@ -75,6 +91,7 @@ func (m *Message) SetClusterLevel(level int) { m.ClusterLevelRaw = &lvl } +// Loggable turns a Message into machine-readable log output func (m *Message) Loggable() map[string]interface{} { return map[string]interface{}{ "message": map[string]string{ @@ -82,3 +99,37 @@ func (m *Message) Loggable() map[string]interface{} { }, } } + +// ConnectionType returns a Message_ConnectionType associated with the +// inet.Connectedness. +func ConnectionType(c inet.Connectedness) Message_ConnectionType { + switch c { + default: + return Message_NOT_CONNECTED + case inet.NotConnected: + return Message_NOT_CONNECTED + case inet.Connected: + return Message_CONNECTED + case inet.CanConnect: + return Message_CAN_CONNECT + case inet.CannotConnect: + return Message_CANNOT_CONNECT + } +} + +// Connectedness returns an inet.Connectedness associated with the +// Message_ConnectionType. +func Connectedness(c Message_ConnectionType) inet.Connectedness { + switch c { + default: + return inet.NotConnected + case Message_NOT_CONNECTED: + return inet.NotConnected + case Message_CONNECTED: + return inet.Connected + case Message_CAN_CONNECT: + return inet.CanConnect + case Message_CANNOT_CONNECT: + return inet.CannotConnect + } +} From beaad76970514a2c653f598cae205cde7498c213 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 21 Nov 2014 08:03:11 -0800 Subject: [PATCH 0427/3147] dht: update to use net.LocalPeer This commit was moved from ipfs/go-ipfs-routing@e2c0f9f68669da25901d37db77a1c033b9000cc3 --- routing/dht/dht.go | 57 ++++++++++----------------------------- routing/dht/pb/message.go | 37 +++++++++++++++++++++++++ routing/dht/query.go | 7 ++++- routing/dht/routing.go | 24 +++++------------ 4 files changed, 64 insertions(+), 61 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index fff833e583..6f3a846d37 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -274,14 +274,11 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, } // Perhaps we were given closer peers - var peers []peer.Peer - for _, pb := range pmes.GetCloserPeers() { - pr, err := dht.peerFromInfo(pb) + peers, errs := pb.PBPeersToPeers(dht.peerstore, pmes.GetCloserPeers()) + for _, err := range errs { if err != nil { log.Error(err) - continue } - peers = append(peers, pr) } if len(peers) > 0 { @@ -426,22 +423,20 @@ func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u. return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) addProviders(key u.Key, peers []*pb.Message_Peer) []peer.Peer { - var provArr []peer.Peer - for _, prov := range peers { - p, err := dht.peerFromInfo(prov) - if err != nil { - log.Errorf("error getting peer from info: %v", err) - continue - } - - log.Debugf("%s adding provider: %s for %s", dht.self, p, key) +func (dht *IpfsDHT) addProviders(key u.Key, pbps []*pb.Message_Peer) []peer.Peer { + peers, errs := pb.PBPeersToPeers(dht.peerstore, pbps) + for _, err := range errs { + log.Errorf("error converting peer: %v", err) + } + var provArr []peer.Peer + for _, p := range peers { // Dont add outselves to the list if p.ID().Equal(dht.self.ID()) { continue } + log.Debugf("%s adding provider: %s for %s", dht.self, p, key) // TODO(jbenet) ensure providers is idempotent dht.providers.AddProvider(key, p) provArr = append(provArr, p) @@ -500,38 +495,14 @@ func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { return p, nil } -// peerFromInfo returns a peer using info in the protobuf peer struct -// to lookup or create a peer -func (dht *IpfsDHT) peerFromInfo(pbp *pb.Message_Peer) (peer.Peer, error) { - - id := peer.ID(pbp.GetId()) - - // bail out if it's ourselves - //TODO(jbenet) not sure this should be an error _here_ - if id.Equal(dht.self.ID()) { - return nil, errors.New("found self") - } - - p, err := dht.getPeer(id) - if err != nil { - return nil, err - } - - // add addresses we've just discovered - maddrs, err := pbp.Addresses() +func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, pbp *pb.Message_Peer) (peer.Peer, error) { + p, err := pb.PBPeerToPeer(dht.peerstore, pbp) if err != nil { return nil, err } - for _, maddr := range maddrs { - p.AddAddress(maddr) - } - return p, nil -} -func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, pbp *pb.Message_Peer) (peer.Peer, error) { - p, err := dht.peerFromInfo(pbp) - if err != nil { - return nil, err + if dht.dialer.LocalPeer().ID().Equal(p.ID()) { + return nil, errors.New("attempting to ensure connection to self") } // dial connection diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 8f3b06c01e..82230422a5 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -2,6 +2,7 @@ package dht_pb import ( "errors" + "fmt" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" @@ -32,6 +33,24 @@ func peerToPBPeer(p peer.Peer) *Message_Peer { return pbp } +// PBPeerToPeer turns a *Message_Peer into its peer.Peer counterpart +func PBPeerToPeer(ps peer.Peerstore, pbp *Message_Peer) (peer.Peer, error) { + p, err := ps.FindOrCreate(peer.ID(pbp.GetId())) + if err != nil { + return nil, fmt.Errorf("Failed to get peer from peerstore: %s", err) + } + + // add addresses + maddrs, err := pbp.Addresses() + if err != nil { + return nil, fmt.Errorf("Received peer with bad or missing addresses: %s", pbp.Addrs) + } + for _, maddr := range maddrs { + p.AddAddress(maddr) + } + return p, nil +} + // RawPeersToPBPeers converts a slice of Peers into a slice of *Message_Peers, // ready to go out on the wire. func RawPeersToPBPeers(peers []peer.Peer) []*Message_Peer { @@ -55,6 +74,24 @@ func PeersToPBPeers(d inet.Dialer, peers []peer.Peer) []*Message_Peer { return pbps } +// PBPeersToPeers converts given []*Message_Peer into a set of []peer.Peer +// Returns two slices, one of peers, and one of errors. The slice of peers +// will ONLY contain successfully converted peers. The slice of errors contains +// whether each input Message_Peer was successfully converted. +func PBPeersToPeers(ps peer.Peerstore, pbps []*Message_Peer) ([]peer.Peer, []error) { + errs := make([]error, len(pbps)) + peers := make([]peer.Peer, 0, len(pbps)) + for i, pbp := range pbps { + p, err := PBPeerToPeer(ps, pbp) + if err != nil { + errs[i] = err + } else { + peers = append(peers, p) + } + } + return peers, errs +} + // Addresses returns a multiaddr associated with the Message_Peer entry func (m *Message_Peer) Addresses() ([]ma.Multiaddr, error) { if m == nil { diff --git a/routing/dht/query.go b/routing/dht/query.go index f0478ff299..f4e43132da 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -161,7 +161,12 @@ func (r *dhtQueryRunner) addPeerToQuery(next peer.Peer, benchmark peer.Peer) { return } - // if new peer further away than whom we got it from, bother (loops) + // if new peer is ourselves... + if next.ID().Equal(r.query.dialer.LocalPeer().ID()) { + return + } + + // if new peer further away than whom we got it from, don't bother (loops) if benchmark != nil && kb.Closer(benchmark.ID(), next.ID(), r.query.key) { return } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 1074b23ec8..7de0e1140e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -234,31 +234,21 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) } closer := pmes.GetCloserPeers() - var clpeers []peer.Peer - for _, pbp := range closer { - np, err := dht.getPeer(peer.ID(pbp.GetId())) + clpeers, errs := pb.PBPeersToPeers(dht.peerstore, closer) + for _, err := range errs { if err != nil { - log.Warningf("Received invalid peer from query: %v", err) - continue - } - - // add addresses - maddrs, err := pbp.Addresses() - if err != nil { - log.Warning("Received peer with bad or missing addresses: %s", pbp.Addrs) - continue - } - for _, maddr := range maddrs { - np.AddAddress(maddr) + log.Warning(err) } + } - if pbp.GetId() == string(id) { + // see it we got the peer here + for _, np := range clpeers { + if string(np.ID()) == string(id) { return &dhtQueryResult{ peer: np, success: true, }, nil } - clpeers = append(clpeers, np) } return &dhtQueryResult{closerPeers: clpeers}, nil From a1a31cfb29189b68b7ba83559fd5017eb2c31d21 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 24 Nov 2014 14:58:51 -0500 Subject: [PATCH 0428/3147] dht: FindPeersConnectedToPeer This commit was moved from ipfs/go-ipfs-routing@656a1b263ce3fad41222d56c2ba73c56391c44d4 --- routing/dht/dht_test.go | 95 +++++++++++++++++++++++++++++++++++++++++ routing/dht/handlers.go | 1 + routing/dht/routing.go | 70 ++++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 524ebc7634..71d5525b04 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -2,6 +2,7 @@ package dht import ( "bytes" + "sort" "testing" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -414,6 +415,100 @@ func TestFindPeer(t *testing.T) { } } +func TestFindPeersConnectedToPeer(t *testing.T) { + if testing.Short() { + t.SkipNow() + } + + ctx := context.Background() + u.Debug = false + + _, peers, dhts := setupDHTS(ctx, 4, t) + defer func() { + for i := 0; i < 4; i++ { + dhts[i].Close() + dhts[i].dialer.(inet.Network).Close() + } + }() + + // topology: + // 0-1, 1-2, 1-3, 2-3 + err := dhts[0].Connect(ctx, peers[1]) + if err != nil { + t.Fatal(err) + } + + err = dhts[1].Connect(ctx, peers[2]) + if err != nil { + t.Fatal(err) + } + + err = dhts[1].Connect(ctx, peers[3]) + if err != nil { + t.Fatal(err) + } + + err = dhts[2].Connect(ctx, peers[3]) + if err != nil { + t.Fatal(err) + } + + // fmt.Println("0 is", peers[0]) + // fmt.Println("1 is", peers[1]) + // fmt.Println("2 is", peers[2]) + // fmt.Println("3 is", peers[3]) + + ctxT, _ := context.WithTimeout(ctx, time.Second) + pchan, err := dhts[0].FindPeersConnectedToPeer(ctxT, peers[2].ID()) + if err != nil { + t.Fatal(err) + } + + // shouldFind := []peer.Peer{peers[1], peers[3]} + found := []peer.Peer{} + for nextp := range pchan { + found = append(found, nextp) + } + + // fmt.Printf("querying 0 (%s) FindPeersConnectedToPeer 2 (%s)\n", peers[0], peers[2]) + // fmt.Println("should find 1, 3", shouldFind) + // fmt.Println("found", found) + + // testPeerListsMatch(t, shouldFind, found) + + log.Warning("TestFindPeersConnectedToPeer is not quite correct") + if len(found) == 0 { + t.Fatal("didn't find any peers.") + } +} + +func testPeerListsMatch(t *testing.T, p1, p2 []peer.Peer) { + + if len(p1) != len(p2) { + t.Fatal("did not find as many peers as should have", p1, p2) + } + + ids1 := make([]string, len(p1)) + ids2 := make([]string, len(p2)) + + for i, p := range p1 { + ids1[i] = p.ID().Pretty() + } + + for i, p := range p2 { + ids2[i] = p.ID().Pretty() + } + + sort.Sort(sort.StringSlice(ids1)) + sort.Sort(sort.StringSlice(ids2)) + + for i := range ids1 { + if ids1[i] != ids2[i] { + t.Fatal("Didnt find expected peer", ids1[i], ids2) + } + } +} + func TestConnectCollision(t *testing.T) { if testing.Short() { t.SkipNow() diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index a370913498..f7e8073da7 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -159,6 +159,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.Peer, pmes *pb.Me for _, p := range withAddresses { log.Debugf("handleFindPeer: sending back '%s'", p) } + resp.CloserPeers = pb.PeersToPBPeers(dht.dialer, withAddresses) return resp, nil } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 7de0e1140e..f6442b1f10 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -5,6 +5,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" @@ -268,6 +269,75 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) return result.peer, nil } +// FindPeersConnectedToPeer searches for peers directly connected to a given peer. +func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan peer.Peer, error) { + + peerchan := make(chan peer.Peer, 10) + peersSeen := map[string]peer.Peer{} + + routeLevel := 0 + closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) + if closest == nil || len(closest) == 0 { + return nil, kb.ErrLookupFailure + } + + // setup the Query + query := newQuery(u.Key(id), dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + + pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) + if err != nil { + return nil, err + } + + var clpeers []peer.Peer + closer := pmes.GetCloserPeers() + for _, pbp := range closer { + // skip peers already seen + if _, found := peersSeen[string(pbp.GetId())]; found { + continue + } + + // skip peers that fail to unmarshal + p, err := pb.PBPeerToPeer(dht.peerstore, pbp) + if err != nil { + log.Warning(err) + continue + } + + // if peer is connected, send it to our client. + if pb.Connectedness(*pbp.Connection) == inet.Connected { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case peerchan <- p: + } + } + + peersSeen[string(p.ID())] = p + + // if peer is the peer we're looking for, don't bother querying it. + if pb.Connectedness(*pbp.Connection) != inet.Connected { + clpeers = append(clpeers, p) + } + } + + return &dhtQueryResult{closerPeers: clpeers}, nil + }) + + // run it! run it asynchronously to gen peers as results are found. + // this does no error checking + go func() { + if _, err := query.Run(ctx, closest); err != nil { + log.Error(err) + } + + // close the peerchan channel when done. + close(peerchan) + }() + + return peerchan, nil +} + // Ping a peer, log the time it took func (dht *IpfsDHT) Ping(ctx context.Context, p peer.Peer) error { // Thoughts: maybe this should accept an ID and do a peer lookup? From e4f54aaf9158f8cdbd09f32e46f2cde90286c812 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 8 Dec 2014 21:55:51 -0800 Subject: [PATCH 0429/3147] dht: comment for asyncQueryBuffer This commit was moved from ipfs/go-ipfs-routing@3363963b76ef6b8bdefe7c9d2940df9b203db7c3 --- routing/dht/routing.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index f6442b1f10..aeced86b1f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -13,6 +13,12 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +// asyncQueryBuffer is the size of buffered channels in async queries. This +// buffer allows multiple queries to execute simultaneously, return their +// results and continue querying closer peers. Note that different query +// results will wait for the channel to drain. +var asyncQueryBuffer = 10 + // This file implements the Routing interface for the IpfsDHT struct. // Basic Put/Get @@ -272,7 +278,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) // FindPeersConnectedToPeer searches for peers directly connected to a given peer. func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan peer.Peer, error) { - peerchan := make(chan peer.Peer, 10) + peerchan := make(chan peer.Peer, asyncQueryBuffer) peersSeen := map[string]peer.Peer{} routeLevel := 0 From ef738955d1cf9b9c20b4ff45e299f6daec31825e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 11 Dec 2014 05:08:39 +0000 Subject: [PATCH 0430/3147] rewrite FindProvidersAsync This commit was moved from ipfs/go-ipfs-routing@8ce74b81af0b4a21ff2688340bd760c165085c96 --- routing/dht/handlers.go | 1 - routing/dht/routing.go | 95 ++++++++++++++++++++++++++++------------- 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index f7e8073da7..5045a421e6 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -182,7 +182,6 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.Peer, pmes *p providers = append(providers, dht.self) } - // if we've got providers, send thos those. if providers != nil && len(providers) > 0 { resp.ProviderPeers = pb.PeersToPBPeers(dht.dialer, providers) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index aeced86b1f..6b6b547f56 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -138,43 +138,78 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { log.Event(ctx, "findProviders", &key) peerOut := make(chan peer.Peer, count) - go func() { - defer close(peerOut) - - ps := newPeerSet() - // TODO may want to make this function async to hide latency - provs := dht.providers.GetProviders(ctx, key) - for _, p := range provs { - count-- - // NOTE: assuming that this list of peers is unique - ps.Add(p) + go dht.findProvidersAsyncRoutine(ctx, key, count, peerOut) + return peerOut +} + +func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.Peer) { + defer close(peerOut) + + ps := newPeerSet() + provs := dht.providers.GetProviders(ctx, key) + for _, p := range provs { + count-- + // NOTE: assuming that this list of peers is unique + ps.Add(p) + select { + case peerOut <- p: + case <-ctx.Done(): + return + } + if count <= 0 { + return + } + } + + // setup the Query + query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + + pmes, err := dht.findProvidersSingle(ctx, p, key, 0) + if err != nil { + return nil, err + } + + provs, errs := pb.PBPeersToPeers(dht.peerstore, pmes.GetProviderPeers()) + for _, err := range errs { + if err != nil { + log.Warning(err) + } + } + + // Add unique providers from request, up to 'count' + for _, prov := range provs { + if ps.Contains(prov) { + continue + } select { - case peerOut <- p: + case peerOut <- prov: case <-ctx.Done(): - return + log.Error("Context timed out sending more providers") + return nil, ctx.Err() } - if count <= 0 { - return + ps.Add(prov) + if ps.Size() >= count { + return &dhtQueryResult{success: true}, nil } } - var wg sync.WaitGroup - peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) - for _, pp := range peers { - wg.Add(1) - go func(p peer.Peer) { - defer wg.Done() - pmes, err := dht.findProvidersSingle(ctx, p, key, 0) - if err != nil { - log.Error(err) - return - } - dht.addPeerListAsync(ctx, key, pmes.GetProviderPeers(), ps, count, peerOut) - }(pp) + // Give closer peers back to the query to be queried + closer := pmes.GetCloserPeers() + clpeers, errs := pb.PBPeersToPeers(dht.peerstore, closer) + for _, err := range errs { + if err != nil { + log.Warning(err) + } } - wg.Wait() - }() - return peerOut + + return &dhtQueryResult{closerPeers: clpeers}, nil + }) + + peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) + _, err := query.Run(ctx, peers) + if err != nil { + log.Errorf("FindProviders Query error: %s", err) + } } func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *peerSet, count int, out chan peer.Peer) { From e8599b7bb084e23b930ce4992cdad8b3a1ad985f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 11 Dec 2014 05:42:05 +0000 Subject: [PATCH 0431/3147] changes from PR This commit was moved from ipfs/go-ipfs-routing@d49387f3fd822b9b2d545fd693a52668902416f8 --- routing/dht/routing.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 6b6b547f56..fbdc7293a3 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -148,15 +148,17 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co ps := newPeerSet() provs := dht.providers.GetProviders(ctx, key) for _, p := range provs { - count-- // NOTE: assuming that this list of peers is unique - ps.Add(p) - select { - case peerOut <- p: - case <-ctx.Done(): - return + if ps.AddIfSmallerThan(p, count) { + select { + case peerOut <- p: + case <-ctx.Done(): + return + } } - if count <= 0 { + + // If we have enough peers locally, dont bother with remote RPC + if ps.Size() >= count { return } } @@ -178,16 +180,14 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // Add unique providers from request, up to 'count' for _, prov := range provs { - if ps.Contains(prov) { - continue - } - select { - case peerOut <- prov: - case <-ctx.Done(): - log.Error("Context timed out sending more providers") - return nil, ctx.Err() + if ps.AddIfSmallerThan(prov, count) { + select { + case peerOut <- prov: + case <-ctx.Done(): + log.Error("Context timed out sending more providers") + return nil, ctx.Err() + } } - ps.Add(prov) if ps.Size() >= count { return &dhtQueryResult{success: true}, nil } From 7a691f1cf5c457805bd5fe8a8d392378eb29781c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 11 Dec 2014 06:08:53 +0000 Subject: [PATCH 0432/3147] remove multilayered routing table from the DHT (for now) This commit was moved from ipfs/go-ipfs-routing@25824cf54ed1c6e23abc0d71bed492ce13cb2610 --- routing/dht/dht.go | 63 ++++++++++++++---------------------------- routing/dht/diag.go | 2 +- routing/dht/routing.go | 29 ++++++++----------- 3 files changed, 32 insertions(+), 62 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6f3a846d37..caf6d8c9d3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -37,7 +37,7 @@ const doPinging = false type IpfsDHT struct { // Array of routing tables for differently distanced nodes // NOTE: (currently, only a single table is used) - routingTables []*kb.RoutingTable + routingTable *kb.RoutingTable // the network services we need dialer inet.Dialer @@ -80,10 +80,7 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia dht.providers = NewProviderManager(dht.Context(), p.ID()) dht.AddCloserChild(dht.providers) - dht.routingTables = make([]*kb.RoutingTable, 3) - dht.routingTables[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Millisecond*1000) - dht.routingTables[1] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Millisecond*1000) - dht.routingTables[2] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Hour) + dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Minute) dht.birth = time.Now() dht.Validators = make(map[string]ValidatorFunc) @@ -243,9 +240,9 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) er } func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, - key u.Key, level int) ([]byte, []peer.Peer, error) { + key u.Key) ([]byte, []peer.Peer, error) { - pmes, err := dht.getValueSingle(ctx, p, key, level) + pmes, err := dht.getValueSingle(ctx, p, key) if err != nil { return nil, nil, err } @@ -265,7 +262,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, // TODO decide on providers. This probably shouldn't be happening. if prv := pmes.GetProviderPeers(); prv != nil && len(prv) > 0 { - val, err := dht.getFromPeerList(ctx, key, prv, level) + val, err := dht.getFromPeerList(ctx, key, prv) if err != nil { return nil, nil, err } @@ -292,9 +289,9 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.Peer, - key u.Key, level int) (*pb.Message, error) { + key u.Key) (*pb.Message, error) { - pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), level) + pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), 0) return dht.sendRequest(ctx, p, pmes) } @@ -303,7 +300,7 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.Peer, // one to get the value from? Or just connect to one at a time until we get a // successful connection and request the value from it? func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, - peerlist []*pb.Message_Peer, level int) ([]byte, error) { + peerlist []*pb.Message_Peer) ([]byte, error) { for _, pinfo := range peerlist { p, err := dht.ensureConnectedToPeer(ctx, pinfo) @@ -312,7 +309,7 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, continue } - pmes, err := dht.getValueSingle(ctx, p, key, level) + pmes, err := dht.getValueSingle(ctx, p, key) if err != nil { log.Errorf("getFromPeers error: %s\n", err) continue @@ -379,47 +376,30 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { return dht.datastore.Put(key.DsKey(), data) } -// Update signals to all routingTables to Update their last-seen status +// Update signals the routingTable to Update its last-seen status // on the given peer. func (dht *IpfsDHT) Update(ctx context.Context, p peer.Peer) { log.Event(ctx, "updatePeer", p) - removedCount := 0 - for _, route := range dht.routingTables { - removed := route.Update(p) - // Only close the connection if no tables refer to this peer - if removed != nil { - removedCount++ - } - } - - // Only close the connection if no tables refer to this peer - // if removedCount == len(dht.routingTables) { - // dht.network.ClosePeer(p) - // } - // ACTUALLY, no, let's not just close the connection. it may be connected - // due to other things. it seems that we just need connection timeouts - // after some deadline of inactivity. + dht.routingTable.Update(p) } // FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. func (dht *IpfsDHT) FindLocal(id peer.ID) (peer.Peer, *kb.RoutingTable) { - for _, table := range dht.routingTables { - p := table.Find(id) - if p != nil { - return p, table - } + p := dht.routingTable.Find(id) + if p != nil { + return p, dht.routingTable } return nil, nil } // findPeerSingle asks peer 'p' if they know where the peer with id 'id' is -func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID, level int) (*pb.Message, error) { - pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), level) +func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID) (*pb.Message, error) { + pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u.Key, level int) (*pb.Message, error) { - pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), level) +func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u.Key) (*pb.Message, error) { + pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), 0) return dht.sendRequest(ctx, p, pmes) } @@ -446,11 +426,8 @@ func (dht *IpfsDHT) addProviders(key u.Key, pbps []*pb.Message_Peer) []peer.Peer // nearestPeersToQuery returns the routing tables closest peers. func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.Peer { - level := pmes.GetClusterLevel() - cluster := dht.routingTables[level] - key := u.Key(pmes.GetKey()) - closer := cluster.NearestPeers(kb.ConvertKey(key), count) + closer := dht.routingTable.NearestPeers(kb.ConvertKey(key), count) return closer } @@ -537,7 +514,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { case <-tick: id := make([]byte, 16) rand.Read(id) - peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(u.Key(id)), 5) + peers := dht.routingTable.NearestPeers(kb.ConvertKey(u.Key(id)), 5) for _, p := range peers { ctx, _ := context.WithTimeout(dht.Context(), time.Second*5) err := dht.Ping(ctx, p) diff --git a/routing/dht/diag.go b/routing/dht/diag.go index e91ba9bee1..82316e2e36 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -36,7 +36,7 @@ func (dht *IpfsDHT) getDiagInfo() *diagInfo { di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore - for _, p := range dht.routingTables[0].ListPeers() { + for _, p := range dht.routingTable.ListPeers() { d := connDiagInfo{p.GetLatency(), p.ID()} di.Connections = append(di.Connections, d) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index fbdc7293a3..3148e1589a 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -38,11 +38,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - var peers []peer.Peer - for _, route := range dht.routingTables { - npeers := route.NearestPeers(kb.ConvertKey(key), KValue) - peers = append(peers, npeers...) - } + peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { log.Debugf("%s PutValue qry part %v", dht.self, p) @@ -71,9 +67,8 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { return val, nil } - // get closest peers in the routing tables - routeLevel := 0 - closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertKey(key), PoolSize) + // get closest peers in the routing table + closest := dht.routingTable.NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { log.Warning("Got no peers back from routing table!") return nil, kb.ErrLookupFailure @@ -82,7 +77,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // setup the Query query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { - val, peers, err := dht.getValueOrPeers(ctx, p, key, routeLevel) + val, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { return nil, err } @@ -116,7 +111,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { dht.providers.AddProvider(key, dht.self) - peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), PoolSize) + peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), PoolSize) if len(peers) == 0 { return nil } @@ -166,7 +161,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // setup the Query query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { - pmes, err := dht.findProvidersSingle(ctx, p, key, 0) + pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { return nil, err } @@ -205,7 +200,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co return &dhtQueryResult{closerPeers: clpeers}, nil }) - peers := dht.routingTables[0].NearestPeers(kb.ConvertKey(key), AlphaValue) + peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) _, err := query.Run(ctx, peers) if err != nil { log.Errorf("FindProviders Query error: %s", err) @@ -253,8 +248,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) return p, nil } - routeLevel := 0 - closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) + closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if closest == nil || len(closest) == 0 { return nil, kb.ErrLookupFailure } @@ -270,7 +264,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) // setup the Query query := newQuery(u.Key(id), dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { - pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) + pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { return nil, err } @@ -316,8 +310,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< peerchan := make(chan peer.Peer, asyncQueryBuffer) peersSeen := map[string]peer.Peer{} - routeLevel := 0 - closest := dht.routingTables[routeLevel].NearestPeers(kb.ConvertPeerID(id), AlphaValue) + closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if closest == nil || len(closest) == 0 { return nil, kb.ErrLookupFailure } @@ -325,7 +318,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< // setup the Query query := newQuery(u.Key(id), dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { - pmes, err := dht.findPeerSingle(ctx, p, id, routeLevel) + pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { return nil, err } From 168dad0d2bfd06b53a9f79365fb8656ac5164aba Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 12 Dec 2014 20:05:54 -0800 Subject: [PATCH 0433/3147] refactor(mdag, bserv, bs) mocks, etc. License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@0c7694cb42bb42118fbcce58f292d2c04a6a13dd --- blockservice/blocks_test.go | 21 ++------------------- blockservice/mock.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 blockservice/mock.go diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 2645b20240..e7966729f5 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -11,10 +11,7 @@ import ( blocks "github.com/jbenet/go-ipfs/blocks" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" blocksutil "github.com/jbenet/go-ipfs/blocks/blocksutil" - bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" - tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" offline "github.com/jbenet/go-ipfs/exchange/offline" - "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" ) @@ -63,23 +60,9 @@ func TestBlocks(t *testing.T) { } func TestGetBlocksSequential(t *testing.T) { - net := tn.VirtualNetwork() - rs := mock.VirtualRoutingServer() - sg := bitswap.NewSessionGenerator(net, rs) + var servs = Mocks(t, 4) bg := blocksutil.NewBlockGenerator() - - instances := sg.Instances(4) blks := bg.Blocks(50) - // TODO: verify no duplicates - - var servs []*BlockService - for _, i := range instances { - bserv, err := New(i.Blockstore, i.Exchange) - if err != nil { - t.Fatal(err) - } - servs = append(servs, bserv) - } var keys []u.Key for _, blk := range blks { @@ -89,7 +72,7 @@ func TestGetBlocksSequential(t *testing.T) { t.Log("one instance at a time, get blocks concurrently") - for i := 1; i < len(instances); i++ { + for i := 1; i < len(servs); i++ { ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) out := servs[i].GetBlocks(ctx, keys) gotten := make(map[u.Key]*blocks.Block) diff --git a/blockservice/mock.go b/blockservice/mock.go new file mode 100644 index 0000000000..0305c92fb9 --- /dev/null +++ b/blockservice/mock.go @@ -0,0 +1,28 @@ +package blockservice + +import ( + "testing" + + bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" + tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" + "github.com/jbenet/go-ipfs/routing/mock" +) + +// Mocks returns |n| connected mock Blockservices +func Mocks(t *testing.T, n int) []*BlockService { + net := tn.VirtualNetwork() + rs := mock.VirtualRoutingServer() + sg := bitswap.NewSessionGenerator(net, rs) + + instances := sg.Instances(n) + + var servs []*BlockService + for _, i := range instances { + bserv, err := New(i.Blockstore(), i.Exchange) + if err != nil { + t.Fatal(err) + } + servs = append(servs, bserv) + } + return servs +} From 913a39ec0134585122d1572d6fa3dc7a4adff3bd Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 12 Dec 2014 20:05:54 -0800 Subject: [PATCH 0434/3147] refactor(mdag, bserv, bs) mocks, etc. License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@3aaf646376076bbff69726333703c566a5ebbb9d --- routing/mock/routing.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/routing/mock/routing.go b/routing/mock/routing.go index ff83ddca31..23fe36644c 100644 --- a/routing/mock/routing.go +++ b/routing/mock/routing.go @@ -30,10 +30,6 @@ func NewMockRouter(local peer.Peer, dstore ds.Datastore) routing.IpfsRouting { } } -func (mr *MockRouter) SetRoutingServer(rs RoutingServer) { - mr.hashTable = rs -} - func (mr *MockRouter) PutValue(ctx context.Context, key u.Key, val []byte) error { log.Debugf("PutValue: %s", key) return mr.datastore.Put(key.DsKey(), val) @@ -119,7 +115,8 @@ func (rs *hashTable) Announce(p peer.Peer, k u.Key) error { func (rs *hashTable) Providers(k u.Key) []peer.Peer { rs.lock.RLock() defer rs.lock.RUnlock() - ret := make([]peer.Peer, 0) + + var ret []peer.Peer peerset, ok := rs.providers[k] if !ok { return ret From b6e86a0841a2db06940f2fbebc912e7d04490337 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 12 Dec 2014 22:28:24 -0800 Subject: [PATCH 0435/3147] feat(bs/testnet) use delay in virtual network License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@5cf1ea2db081e9b63f04f8616c61d8a94094c22e --- blockservice/mock.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blockservice/mock.go b/blockservice/mock.go index 0305c92fb9..2b646386c1 100644 --- a/blockservice/mock.go +++ b/blockservice/mock.go @@ -5,12 +5,13 @@ import ( bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" - "github.com/jbenet/go-ipfs/routing/mock" + mock "github.com/jbenet/go-ipfs/routing/mock" + delay "github.com/jbenet/go-ipfs/util/delay" ) // Mocks returns |n| connected mock Blockservices func Mocks(t *testing.T, n int) []*BlockService { - net := tn.VirtualNetwork() + net := tn.VirtualNetwork(delay.Fixed(0)) rs := mock.VirtualRoutingServer() sg := bitswap.NewSessionGenerator(net, rs) From 0dc5e6e178a7722be3d40504886a618145cc8596 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 12 Dec 2014 20:00:23 -0800 Subject: [PATCH 0436/3147] misc(blockstore) comment License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-blockstore@9a4a84b76a97b6dac3b0f010f21a030257b9d71f --- blockstore/blockstore.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 3fe742ef8c..d4849cb43b 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -14,6 +14,7 @@ import ( var ValueTypeMismatch = errors.New("The retrieved value is not a Block") +// Blockstore wraps a ThreadSafeDatastore type Blockstore interface { DeleteBlock(u.Key) error Has(u.Key) (bool, error) From a994d53d3d26321fc938994137ec480fd9d8b292 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 12 Dec 2014 22:56:36 -0800 Subject: [PATCH 0437/3147] refactor(mockrouting) misc License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@07e7f9a2aa3a91b38dcb31daf50e765d45597dc6 --- routing/mock/client.go | 74 +++++++++ routing/mock/interface.go | 40 +++++ .../{routing_test.go => mockrouting_test.go} | 54 +++---- routing/mock/routing.go | 141 ------------------ routing/mock/server.go | 76 ++++++++++ 5 files changed, 208 insertions(+), 177 deletions(-) create mode 100644 routing/mock/client.go create mode 100644 routing/mock/interface.go rename routing/mock/{routing_test.go => mockrouting_test.go} (74%) delete mode 100644 routing/mock/routing.go create mode 100644 routing/mock/server.go diff --git a/routing/mock/client.go b/routing/mock/client.go new file mode 100644 index 0000000000..f4702aae66 --- /dev/null +++ b/routing/mock/client.go @@ -0,0 +1,74 @@ +package mockrouting + +import ( + "errors" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + peer "github.com/jbenet/go-ipfs/peer" + routing "github.com/jbenet/go-ipfs/routing" + u "github.com/jbenet/go-ipfs/util" +) + +var log = u.Logger("mockrouter") + +type client struct { + datastore ds.Datastore + server server + peer peer.Peer +} + +// FIXME(brian): is this method meant to simulate putting a value into the network? +func (c *client) PutValue(ctx context.Context, key u.Key, val []byte) error { + log.Debugf("PutValue: %s", key) + return c.datastore.Put(key.DsKey(), val) +} + +// FIXME(brian): is this method meant to simulate getting a value from the network? +func (c *client) GetValue(ctx context.Context, key u.Key) ([]byte, error) { + log.Debugf("GetValue: %s", key) + v, err := c.datastore.Get(key.DsKey()) + if err != nil { + return nil, err + } + + data, ok := v.([]byte) + if !ok { + return nil, errors.New("could not cast value from datastore") + } + + return data, nil +} + +func (c *client) FindProviders(ctx context.Context, key u.Key) ([]peer.Peer, error) { + return c.server.Providers(key), nil +} + +func (c *client) FindPeer(ctx context.Context, pid peer.ID) (peer.Peer, error) { + log.Debugf("FindPeer: %s", pid) + return nil, nil +} + +func (c *client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.Peer { + out := make(chan peer.Peer) + go func() { + defer close(out) + for i, p := range c.server.Providers(k) { + if max <= i { + return + } + select { + case out <- p: + case <-ctx.Done(): + return + } + } + }() + return out +} + +func (c *client) Provide(_ context.Context, key u.Key) error { + return c.server.Announce(c.peer, key) +} + +var _ routing.IpfsRouting = &client{} diff --git a/routing/mock/interface.go b/routing/mock/interface.go new file mode 100644 index 0000000000..e84a9ba5a1 --- /dev/null +++ b/routing/mock/interface.go @@ -0,0 +1,40 @@ +// Package mock provides a virtual routing server. To use it, create a virtual +// routing server and use the Client() method to get a routing client +// (IpfsRouting). The server quacks like a DHT but is really a local in-memory +// hash table. +package mockrouting + +import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + peer "github.com/jbenet/go-ipfs/peer" + routing "github.com/jbenet/go-ipfs/routing" + u "github.com/jbenet/go-ipfs/util" + delay "github.com/jbenet/go-ipfs/util/delay" +) + +// Server provides mockrouting Clients +type Server interface { + Client(p peer.Peer) Client + ClientWithDatastore(peer.Peer, ds.Datastore) Client +} + +// Client implements IpfsRouting +type Client interface { + FindProviders(context.Context, u.Key) ([]peer.Peer, error) + + routing.IpfsRouting +} + +// NewServer returns a mockrouting Server +func NewServer() Server { + return NewServerWithDelay(delay.Fixed(0)) +} + +// NewServerWithDelay returns a mockrouting Server with a delay! +func NewServerWithDelay(d delay.D) Server { + return &s{ + providers: make(map[u.Key]peer.Map), + delay: d, + } +} diff --git a/routing/mock/routing_test.go b/routing/mock/mockrouting_test.go similarity index 74% rename from routing/mock/routing_test.go rename to routing/mock/mockrouting_test.go index 536d7b0189..3f9bfab6c1 100644 --- a/routing/mock/routing_test.go +++ b/routing/mock/mockrouting_test.go @@ -1,4 +1,4 @@ -package mock +package mockrouting import ( "bytes" @@ -12,37 +12,21 @@ import ( func TestKeyNotFound(t *testing.T) { - vrs := VirtualRoutingServer() - empty := vrs.Providers(u.Key("not there")) - if len(empty) != 0 { - t.Fatal("should be empty") - } -} + var peer = testutil.NewPeerWithID(peer.ID([]byte("the peer id"))) + var key = u.Key("mock key") + var ctx = context.Background() -func TestSetAndGet(t *testing.T) { - pid := peer.ID([]byte("the peer id")) - p := testutil.NewPeerWithID(pid) - k := u.Key("42") - rs := VirtualRoutingServer() - err := rs.Announce(p, k) - if err != nil { - t.Fatal(err) - } - providers := rs.Providers(k) - if len(providers) != 1 { - t.Fatal("should be one") + rs := NewServer() + providers := rs.Client(peer).FindProvidersAsync(ctx, key, 10) + _, ok := <-providers + if ok { + t.Fatal("should be closed") } - for _, elem := range providers { - if bytes.Equal(elem.ID(), pid) { - return - } - } - t.Fatal("ID should have matched") } func TestClientFindProviders(t *testing.T) { peer := testutil.NewPeerWithIDString("42") - rs := VirtualRoutingServer() + rs := NewServer() client := rs.Client(peer) k := u.Key("hello") @@ -52,7 +36,10 @@ func TestClientFindProviders(t *testing.T) { } max := 100 - providersFromHashTable := rs.Providers(k) + providersFromHashTable, err := rs.Client(peer).FindProviders(context.Background(), k) + if err != nil { + t.Fatal(err) + } isInHT := false for _, p := range providersFromHashTable { @@ -76,21 +63,16 @@ func TestClientFindProviders(t *testing.T) { } func TestClientOverMax(t *testing.T) { - rs := VirtualRoutingServer() + rs := NewServer() k := u.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { peer := testutil.NewPeerWithIDString(string(i)) - err := rs.Announce(peer, k) + err := rs.Client(peer).Provide(context.Background(), k) if err != nil { t.Fatal(err) } } - providersFromHashTable := rs.Providers(k) - if len(providersFromHashTable) != numProvidersForHelloKey { - t.Log(1 == len(providersFromHashTable)) - t.Fatal("not all providers were returned") - } max := 10 peer := testutil.NewPeerWithIDString("TODO") @@ -108,7 +90,7 @@ func TestClientOverMax(t *testing.T) { // TODO does dht ensure won't receive self as a provider? probably not. func TestCanceledContext(t *testing.T) { - rs := VirtualRoutingServer() + rs := NewServer() k := u.Key("hello") t.Log("async'ly announce infinite stream of providers for key") @@ -116,7 +98,7 @@ func TestCanceledContext(t *testing.T) { go func() { // infinite stream for { peer := testutil.NewPeerWithIDString(string(i)) - err := rs.Announce(peer, k) + err := rs.Client(peer).Provide(context.Background(), k) if err != nil { t.Fatal(err) } diff --git a/routing/mock/routing.go b/routing/mock/routing.go deleted file mode 100644 index 23fe36644c..0000000000 --- a/routing/mock/routing.go +++ /dev/null @@ -1,141 +0,0 @@ -package mock - -import ( - "errors" - "math/rand" - "sync" - - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - peer "github.com/jbenet/go-ipfs/peer" - routing "github.com/jbenet/go-ipfs/routing" - u "github.com/jbenet/go-ipfs/util" -) - -var log = u.Logger("mockrouter") - -var _ routing.IpfsRouting = &MockRouter{} - -type MockRouter struct { - datastore ds.Datastore - hashTable RoutingServer - peer peer.Peer -} - -func NewMockRouter(local peer.Peer, dstore ds.Datastore) routing.IpfsRouting { - return &MockRouter{ - datastore: dstore, - peer: local, - hashTable: VirtualRoutingServer(), - } -} - -func (mr *MockRouter) PutValue(ctx context.Context, key u.Key, val []byte) error { - log.Debugf("PutValue: %s", key) - return mr.datastore.Put(key.DsKey(), val) -} - -func (mr *MockRouter) GetValue(ctx context.Context, key u.Key) ([]byte, error) { - log.Debugf("GetValue: %s", key) - v, err := mr.datastore.Get(key.DsKey()) - if err != nil { - return nil, err - } - - data, ok := v.([]byte) - if !ok { - return nil, errors.New("could not cast value from datastore") - } - - return data, nil -} - -func (mr *MockRouter) FindProviders(ctx context.Context, key u.Key) ([]peer.Peer, error) { - return nil, nil -} - -func (mr *MockRouter) FindPeer(ctx context.Context, pid peer.ID) (peer.Peer, error) { - log.Debugf("FindPeer: %s", pid) - return nil, nil -} - -func (mr *MockRouter) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.Peer { - out := make(chan peer.Peer) - go func() { - defer close(out) - for i, p := range mr.hashTable.Providers(k) { - if max <= i { - return - } - select { - case out <- p: - case <-ctx.Done(): - return - } - } - }() - return out -} - -func (mr *MockRouter) Provide(_ context.Context, key u.Key) error { - return mr.hashTable.Announce(mr.peer, key) -} - -type RoutingServer interface { - Announce(peer.Peer, u.Key) error - - Providers(u.Key) []peer.Peer - - Client(p peer.Peer) routing.IpfsRouting -} - -func VirtualRoutingServer() RoutingServer { - return &hashTable{ - providers: make(map[u.Key]peer.Map), - } -} - -type hashTable struct { - lock sync.RWMutex - providers map[u.Key]peer.Map -} - -func (rs *hashTable) Announce(p peer.Peer, k u.Key) error { - rs.lock.Lock() - defer rs.lock.Unlock() - - _, ok := rs.providers[k] - if !ok { - rs.providers[k] = make(peer.Map) - } - rs.providers[k][p.Key()] = p - return nil -} - -func (rs *hashTable) Providers(k u.Key) []peer.Peer { - rs.lock.RLock() - defer rs.lock.RUnlock() - - var ret []peer.Peer - peerset, ok := rs.providers[k] - if !ok { - return ret - } - for _, peer := range peerset { - ret = append(ret, peer) - } - - for i := range ret { - j := rand.Intn(i + 1) - ret[i], ret[j] = ret[j], ret[i] - } - - return ret -} - -func (rs *hashTable) Client(p peer.Peer) routing.IpfsRouting { - return &MockRouter{ - peer: p, - hashTable: rs, - } -} diff --git a/routing/mock/server.go b/routing/mock/server.go new file mode 100644 index 0000000000..3e189d9544 --- /dev/null +++ b/routing/mock/server.go @@ -0,0 +1,76 @@ +package mockrouting + +import ( + "math/rand" + "sync" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" + delay "github.com/jbenet/go-ipfs/util/delay" +) + +// server is the mockrouting.Client's private interface to the routing server +type server interface { + Announce(peer.Peer, u.Key) error + Providers(u.Key) []peer.Peer + + Server +} + +// s is an implementation of the private server interface +type s struct { + delay delay.D + + lock sync.RWMutex + providers map[u.Key]peer.Map +} + +func (rs *s) Announce(p peer.Peer, k u.Key) error { + rs.delay.Wait() // before locking + + rs.lock.Lock() + defer rs.lock.Unlock() + + _, ok := rs.providers[k] + if !ok { + rs.providers[k] = make(peer.Map) + } + rs.providers[k][p.Key()] = p + return nil +} + +func (rs *s) Providers(k u.Key) []peer.Peer { + rs.delay.Wait() // before locking + + rs.lock.RLock() + defer rs.lock.RUnlock() + + var ret []peer.Peer + peerset, ok := rs.providers[k] + if !ok { + return ret + } + for _, peer := range peerset { + ret = append(ret, peer) + } + + for i := range ret { + j := rand.Intn(i + 1) + ret[i], ret[j] = ret[j], ret[i] + } + + return ret +} + +func (rs *s) Client(p peer.Peer) Client { + return rs.ClientWithDatastore(p, ds.NewMapDatastore()) +} + +func (rs *s) ClientWithDatastore(p peer.Peer, datastore ds.Datastore) Client { + return &client{ + peer: p, + datastore: ds.NewMapDatastore(), + server: rs, + } +} From 096171199f25b964d2c416eb0e3d2ec309fa34a9 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 12 Dec 2014 22:56:36 -0800 Subject: [PATCH 0438/3147] refactor(mockrouting) misc License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@cb2398d0e5e017d827b7d9aa724d3f271b3b6839 --- blockservice/mock.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/mock.go b/blockservice/mock.go index 2b646386c1..2775197462 100644 --- a/blockservice/mock.go +++ b/blockservice/mock.go @@ -5,14 +5,14 @@ import ( bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" - mock "github.com/jbenet/go-ipfs/routing/mock" + mockrouting "github.com/jbenet/go-ipfs/routing/mock" delay "github.com/jbenet/go-ipfs/util/delay" ) // Mocks returns |n| connected mock Blockservices func Mocks(t *testing.T, n int) []*BlockService { net := tn.VirtualNetwork(delay.Fixed(0)) - rs := mock.VirtualRoutingServer() + rs := mockrouting.NewServer() sg := bitswap.NewSessionGenerator(net, rs) instances := sg.Instances(n) From 6b328ff05b2e9a4bbe446f2914f18fab3d172e74 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 12 Dec 2014 22:56:36 -0800 Subject: [PATCH 0439/3147] refactor(mockrouting) misc License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-namesys@ff4233077e87ad23126c3a6d9ac1f6d7180296c1 --- namesys/resolve_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index eef5e68258..1d487f9a77 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -3,17 +3,15 @@ package namesys import ( "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ci "github.com/jbenet/go-ipfs/crypto" - mock "github.com/jbenet/go-ipfs/routing/mock" + mockrouting "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" ) func TestRoutingResolve(t *testing.T) { local := testutil.NewPeerWithIDString("testID") - lds := ds.NewMapDatastore() - d := mock.NewMockRouter(local, lds) + d := mockrouting.NewServer().Client(local) resolver := NewRoutingResolver(d) publisher := NewRoutingPublisher(d) From 8ef550d77fb19a60b60d05b94f21b9eb25741e59 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 15 Dec 2014 20:30:18 -0800 Subject: [PATCH 0440/3147] fix: routing mock accuracy routing interface doesn't wait for value to appear in network, but value doesn't appear in network until time as passed License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@88a9bf04fd822f27aba685c0a34c3afae8579ae1 --- routing/mock/client.go | 2 ++ routing/mock/interface.go | 20 +++++++++++++---- routing/mock/mockrouting_test.go | 37 +++++++++++++++++++++++++++++++- routing/mock/server.go | 30 ++++++++++++++++---------- 4 files changed, 73 insertions(+), 16 deletions(-) diff --git a/routing/mock/client.go b/routing/mock/client.go index f4702aae66..444a4b960d 100644 --- a/routing/mock/client.go +++ b/routing/mock/client.go @@ -67,6 +67,8 @@ func (c *client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha return out } +// Provide returns once the message is on the network. Value is not necessarily +// visible yet. func (c *client) Provide(_ context.Context, key u.Key) error { return c.server.Announce(c.peer, key) } diff --git a/routing/mock/interface.go b/routing/mock/interface.go index e84a9ba5a1..6397362920 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -28,13 +28,25 @@ type Client interface { // NewServer returns a mockrouting Server func NewServer() Server { - return NewServerWithDelay(delay.Fixed(0)) + return NewServerWithDelay(DelayConfig{ + ValueVisibility: delay.Fixed(0), + Query: delay.Fixed(0), + }) } // NewServerWithDelay returns a mockrouting Server with a delay! -func NewServerWithDelay(d delay.D) Server { +func NewServerWithDelay(conf DelayConfig) Server { return &s{ - providers: make(map[u.Key]peer.Map), - delay: d, + providers: make(map[u.Key]map[u.Key]providerRecord), + delayConf: conf, } } + +type DelayConfig struct { + // ValueVisibility is the time it takes for a value to be visible in the network + // FIXME there _must_ be a better term for this + ValueVisibility delay.D + + // Query is the time it takes to receive a response from a routing query + Query delay.D +} diff --git a/routing/mock/mockrouting_test.go b/routing/mock/mockrouting_test.go index 3f9bfab6c1..6700cd8ede 100644 --- a/routing/mock/mockrouting_test.go +++ b/routing/mock/mockrouting_test.go @@ -3,10 +3,12 @@ package mockrouting import ( "bytes" "testing" + "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" + delay "github.com/jbenet/go-ipfs/util/delay" testutil "github.com/jbenet/go-ipfs/util/testutil" ) @@ -129,3 +131,36 @@ func TestCanceledContext(t *testing.T) { t.Fatal("Context cancel had no effect") } } + +func TestValidAfter(t *testing.T) { + + var p = testutil.NewPeerWithID(peer.ID([]byte("the peer id"))) + var key = u.Key("mock key") + var ctx = context.Background() + conf := DelayConfig{ + ValueVisibility: delay.Fixed(1 * time.Hour), + Query: delay.Fixed(0), + } + + rs := NewServerWithDelay(conf) + + rs.Client(p).Provide(ctx, key) + + var providers []peer.Peer + providers, err := rs.Client(p).FindProviders(ctx, key) + if err != nil { + t.Fatal(err) + } + if len(providers) > 0 { + t.Fail() + } + + conf.ValueVisibility.Set(0) + providers, err = rs.Client(p).FindProviders(ctx, key) + if err != nil { + t.Fatal(err) + } + if len(providers) != 1 { + t.Fail() + } +} diff --git a/routing/mock/server.go b/routing/mock/server.go index 3e189d9544..e176c7aeb1 100644 --- a/routing/mock/server.go +++ b/routing/mock/server.go @@ -3,11 +3,11 @@ package mockrouting import ( "math/rand" "sync" + "time" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" - delay "github.com/jbenet/go-ipfs/util/delay" ) // server is the mockrouting.Client's private interface to the routing server @@ -20,39 +20,47 @@ type server interface { // s is an implementation of the private server interface type s struct { - delay delay.D + delayConf DelayConfig lock sync.RWMutex - providers map[u.Key]peer.Map + providers map[u.Key]map[u.Key]providerRecord } -func (rs *s) Announce(p peer.Peer, k u.Key) error { - rs.delay.Wait() // before locking +type providerRecord struct { + Peer peer.Peer + Created time.Time +} +func (rs *s) Announce(p peer.Peer, k u.Key) error { rs.lock.Lock() defer rs.lock.Unlock() _, ok := rs.providers[k] if !ok { - rs.providers[k] = make(peer.Map) + rs.providers[k] = make(map[u.Key]providerRecord) + } + rs.providers[k][p.Key()] = providerRecord{ + Created: time.Now(), + Peer: p, } - rs.providers[k][p.Key()] = p return nil } func (rs *s) Providers(k u.Key) []peer.Peer { - rs.delay.Wait() // before locking + rs.delayConf.Query.Wait() // before locking rs.lock.RLock() defer rs.lock.RUnlock() var ret []peer.Peer - peerset, ok := rs.providers[k] + records, ok := rs.providers[k] if !ok { return ret } - for _, peer := range peerset { - ret = append(ret, peer) + for _, r := range records { + if time.Now().Sub(r.Created) > rs.delayConf.ValueVisibility.Get() { + ret = append(ret, r.Peer) + } } for i := range ret { From f7aa21e6a9ab1680f3d86c9d9ab84ec67bede0a5 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Dec 2014 08:55:46 -0800 Subject: [PATCH 0441/3147] Integrated new network into ipfs This commit was moved from ipfs/go-ipfs-routing@05158e5b41dd04def8f4cfbb7a6c8980442f5a56 --- routing/dht/dht.go | 144 ++++++-------------------------------- routing/dht/dht_test.go | 34 ++++----- routing/dht/ext_test.go | 2 - routing/dht/handlers.go | 10 +-- routing/dht/pb/message.go | 2 +- routing/dht/providers.go | 6 +- routing/dht/records.go | 2 +- routing/dht/routing.go | 10 +-- 8 files changed, 51 insertions(+), 159 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index caf6d8c9d3..f85889afd2 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -11,19 +11,17 @@ import ( "time" inet "github.com/jbenet/go-ipfs/net" - msg "github.com/jbenet/go-ipfs/net/message" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" - ctxc "github.com/jbenet/go-ipfs/util/ctxcloser" "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ) var log = eventlog.Logger("dht") @@ -35,50 +33,37 @@ const doPinging = false // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { - // Array of routing tables for differently distanced nodes - // NOTE: (currently, only a single table is used) - routingTable *kb.RoutingTable - - // the network services we need - dialer inet.Dialer - sender inet.Sender + network inet.Network // the network services we need + self peer.Peer // Local peer (yourself) + peerstore peer.Peerstore // Other peers - // Local peer (yourself) - self peer.Peer - - // Other peers - peerstore peer.Peerstore - - // Local data - datastore ds.Datastore + datastore ds.Datastore // Local data dslock sync.Mutex - providers *ProviderManager - - // When this peer started up - birth time.Time + routingTable *kb.RoutingTable // Array of routing tables for differently distanced nodes + providers *ProviderManager - //lock to make diagnostics work better - diaglock sync.Mutex + birth time.Time // When this peer started up + diaglock sync.Mutex // lock to make diagnostics work better // record validator funcs Validators map[string]ValidatorFunc - ctxc.ContextCloser + ctxgroup.ContextGroup } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dialer, sender inet.Sender, dstore ds.Datastore) *IpfsDHT { +func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, n inet.Network, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) - dht.dialer = dialer - dht.sender = sender dht.datastore = dstore dht.self = p dht.peerstore = ps - dht.ContextCloser = ctxc.NewContextCloser(ctx, nil) + dht.ContextGroup = ctxgroup.WithContext(ctx) + dht.network = n + n.SetHandler(inet.ProtocolDHT, dht.handleNewStream) dht.providers = NewProviderManager(dht.Context(), p.ID()) - dht.AddCloserChild(dht.providers) + dht.AddChildGroup(dht.providers) dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Minute) dht.birth = time.Now() @@ -95,7 +80,7 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, dialer inet.Dia // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) error { - err := dht.dialer.DialPeer(ctx, npeer) + err := dht.network.DialPeer(ctx, npeer) if err != nil { return err } @@ -113,93 +98,6 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) error { return nil } -// HandleMessage implements the inet.Handler interface. -func (dht *IpfsDHT) HandleMessage(ctx context.Context, mes msg.NetMessage) msg.NetMessage { - - mData := mes.Data() - if mData == nil { - log.Error("Message contained nil data.") - return nil - } - - mPeer := mes.Peer() - if mPeer == nil { - log.Error("Message contained nil peer.") - return nil - } - - // deserialize msg - pmes := new(pb.Message) - err := proto.Unmarshal(mData, pmes) - if err != nil { - log.Error("Error unmarshaling data") - return nil - } - - // update the peer (on valid msgs only) - dht.Update(ctx, mPeer) - - log.Event(ctx, "foo", dht.self, mPeer, pmes) - - // get handler for this msg type. - handler := dht.handlerForMsgType(pmes.GetType()) - if handler == nil { - log.Error("got back nil handler from handlerForMsgType") - return nil - } - - // dispatch handler. - rpmes, err := handler(ctx, mPeer, pmes) - if err != nil { - log.Errorf("handle message error: %s", err) - return nil - } - - // if nil response, return it before serializing - if rpmes == nil { - log.Warning("Got back nil response from request.") - return nil - } - - // serialize response msg - rmes, err := msg.FromObject(mPeer, rpmes) - if err != nil { - log.Errorf("serialze response error: %s", err) - return nil - } - - return rmes -} - -// sendRequest sends out a request using dht.sender, but also makes sure to -// measure the RTT for latency measurements. -func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { - - mes, err := msg.FromObject(p, pmes) - if err != nil { - return nil, err - } - - start := time.Now() - - rmes, err := dht.sender.SendRequest(ctx, mes) // respect? - if err != nil { - return nil, err - } - if rmes == nil { - return nil, errors.New("no response to request") - } - log.Event(ctx, "sentMessage", dht.self, p, pmes) - - rmes.Peer().SetLatency(time.Since(start)) - - rpmes := new(pb.Message) - if err := proto.Unmarshal(rmes.Data(), rpmes); err != nil { - return nil, err - } - return rpmes, nil -} - // putValueToNetwork stores the given key/value pair at the peer 'p' func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, key string, rec *pb.Record) error { @@ -224,7 +122,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) er pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) // add self as the provider - pmes.ProviderPeers = pb.PeersToPBPeers(dht.dialer, []peer.Peer{dht.self}) + pmes.ProviderPeers = pb.PeersToPBPeers(dht.network, []peer.Peer{dht.self}) rpmes, err := dht.sendRequest(ctx, p, pmes) if err != nil { @@ -478,12 +376,12 @@ func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, pbp *pb.Message_P return nil, err } - if dht.dialer.LocalPeer().ID().Equal(p.ID()) { + if dht.self.ID().Equal(p.ID()) { return nil, errors.New("attempting to ensure connection to self") } // dial connection - err = dht.dialer.DialPeer(ctx, p) + err = dht.network.DialPeer(ctx, p) return p, err } @@ -536,7 +434,7 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context) { if err != nil { log.Errorf("Bootstrap peer error: %s", err) } - err = dht.dialer.DialPeer(ctx, p) + err = dht.network.DialPeer(ctx, p) if err != nil { log.Errorf("Bootstrap peer error: %s", err) } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 71d5525b04..a955290f93 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -12,8 +12,6 @@ import ( ci "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" - mux "github.com/jbenet/go-ipfs/net/mux" - netservice "github.com/jbenet/go-ipfs/net/service" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" @@ -25,16 +23,14 @@ import ( func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { peerstore := peer.NewPeerstore() - dhts := netservice.NewService(ctx, nil) // nil handler for now, need to patch it - net, err := inet.NewIpfsNetwork(ctx, p.Addresses(), p, peerstore, &mux.ProtocolMap{ - mux.ProtocolID_Routing: dhts, - }) + n, err := inet.NewNetwork(ctx, p.Addresses(), p, peerstore) if err != nil { t.Fatal(err) } - d := NewDHT(ctx, p, peerstore, net, dhts, ds.NewMapDatastore()) - dhts.SetHandler(d) + d := NewDHT(ctx, p, peerstore, n, ds.NewMapDatastore()) + d.network.SetHandler(inet.ProtocolDHT, d.handleNewStream) + d.Validators["v"] = func(u.Key, []byte) error { return nil } @@ -107,8 +103,8 @@ func TestPing(t *testing.T) { defer dhtA.Close() defer dhtB.Close() - defer dhtA.dialer.(inet.Network).Close() - defer dhtB.dialer.(inet.Network).Close() + defer dhtA.network.Close() + defer dhtB.network.Close() err = dhtA.Connect(ctx, peerB) if err != nil { @@ -157,8 +153,8 @@ func TestValueGetSet(t *testing.T) { defer dhtA.Close() defer dhtB.Close() - defer dhtA.dialer.(inet.Network).Close() - defer dhtB.dialer.(inet.Network).Close() + defer dhtA.network.Close() + defer dhtB.network.Close() err = dhtA.Connect(ctx, peerB) if err != nil { @@ -199,7 +195,7 @@ func TestProvides(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].dialer.(inet.Network).Close() + defer dhts[i].network.Close() } }() @@ -261,7 +257,7 @@ func TestProvidesAsync(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].dialer.(inet.Network).Close() + defer dhts[i].network.Close() } }() @@ -326,7 +322,7 @@ func TestLayeredGet(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].dialer.(inet.Network).Close() + defer dhts[i].network.Close() } }() @@ -381,7 +377,7 @@ func TestFindPeer(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - dhts[i].dialer.(inet.Network).Close() + dhts[i].network.Close() } }() @@ -427,7 +423,7 @@ func TestFindPeersConnectedToPeer(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - dhts[i].dialer.(inet.Network).Close() + dhts[i].network.Close() } }() @@ -566,8 +562,8 @@ func TestConnectCollision(t *testing.T) { dhtA.Close() dhtB.Close() - dhtA.dialer.(inet.Network).Close() - dhtB.dialer.(inet.Network).Close() + dhtA.network.Close() + dhtB.network.Close() <-time.After(200 * time.Millisecond) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index b2d72043d6..f69d4d0189 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -9,8 +9,6 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" inet "github.com/jbenet/go-ipfs/net" - msg "github.com/jbenet/go-ipfs/net/message" - mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 5045a421e6..4319ef0194 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -87,7 +87,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.Peer, pmes *pb.Me provs := dht.providers.GetProviders(ctx, u.Key(pmes.GetKey())) if len(provs) > 0 { log.Debugf("handleGetValue returning %d provider[s]", len(provs)) - resp.ProviderPeers = pb.PeersToPBPeers(dht.dialer, provs) + resp.ProviderPeers = pb.PeersToPBPeers(dht.network, provs) } // Find closest peer on given cluster to desired key and reply with that info @@ -99,7 +99,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.Peer, pmes *pb.Me log.Critical("no addresses on peer being sent!") } } - resp.CloserPeers = pb.PeersToPBPeers(dht.dialer, closer) + resp.CloserPeers = pb.PeersToPBPeers(dht.network, closer) } return resp, nil @@ -160,7 +160,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.Peer, pmes *pb.Me log.Debugf("handleFindPeer: sending back '%s'", p) } - resp.CloserPeers = pb.PeersToPBPeers(dht.dialer, withAddresses) + resp.CloserPeers = pb.PeersToPBPeers(dht.network, withAddresses) return resp, nil } @@ -183,13 +183,13 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.Peer, pmes *p } if providers != nil && len(providers) > 0 { - resp.ProviderPeers = pb.PeersToPBPeers(dht.dialer, providers) + resp.ProviderPeers = pb.PeersToPBPeers(dht.network, providers) } // Also send closer peers. closer := dht.betterPeersToQuery(pmes, CloserPeerCount) if closer != nil { - resp.CloserPeers = pb.PeersToPBPeers(dht.dialer, closer) + resp.CloserPeers = pb.PeersToPBPeers(dht.network, closer) } return resp, nil diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 82230422a5..c5c4afea7a 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -65,7 +65,7 @@ func RawPeersToPBPeers(peers []peer.Peer) []*Message_Peer { // which can be written to a message and sent out. the key thing this function // does (in addition to PeersToPBPeers) is set the ConnectionType with // information from the given inet.Dialer. -func PeersToPBPeers(d inet.Dialer, peers []peer.Peer) []*Message_Peer { +func PeersToPBPeers(d inet.Network, peers []peer.Peer) []*Message_Peer { pbps := RawPeersToPBPeers(peers) for i, pbp := range pbps { c := ConnectionType(d.Connectedness(peers[i])) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 0deea63245..928b3fa329 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -3,9 +3,9 @@ package dht import ( "time" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" - ctxc "github.com/jbenet/go-ipfs/util/ctxcloser" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) @@ -18,7 +18,7 @@ type ProviderManager struct { newprovs chan *addProv getprovs chan *getProv period time.Duration - ctxc.ContextCloser + ctxgroup.ContextGroup } type addProv struct { @@ -38,7 +38,7 @@ func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { pm.providers = make(map[u.Key][]*providerInfo) pm.getlocal = make(chan chan []u.Key) pm.local = make(map[u.Key]struct{}) - pm.ContextCloser = ctxc.NewContextCloser(ctx, nil) + pm.ContextGroup = ctxgroup.WithContext(ctx) pm.Children().Add(1) go pm.run() diff --git a/routing/dht/records.go b/routing/dht/records.go index 0ea455a17e..1f284ed990 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -50,7 +50,7 @@ func (dht *IpfsDHT) getPublicKey(pid peer.ID) (ci.PubKey, error) { } log.Debug("not in peerstore, searching dht.") - ctxT, _ := context.WithTimeout(dht.ContextCloser.Context(), time.Second*5) + ctxT, _ := context.WithTimeout(dht.ContextGroup.Context(), time.Second*5) val, err := dht.GetValue(ctxT, u.Key("/pk/"+string(pid))) if err != nil { log.Warning("Failed to find requested public key.") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3148e1589a..76260e7108 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -40,7 +40,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) - query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { log.Debugf("%s PutValue qry part %v", dht.self, p) err := dht.putValueToNetwork(ctx, p, string(key), rec) if err != nil { @@ -75,7 +75,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // setup the Query - query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { val, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { @@ -159,7 +159,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } // setup the Query - query := newQuery(key, dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { @@ -262,7 +262,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) } // setup the Query - query := newQuery(u.Key(id), dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { @@ -316,7 +316,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< } // setup the Query - query := newQuery(u.Key(id), dht.dialer, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { From bef2c622e502dd86db475d140e7f2b3e9ac64ecc Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Dec 2014 14:35:52 -0800 Subject: [PATCH 0442/3147] Lots of fixes. DHT tests pass This commit was moved from ipfs/go-ipfs-routing@153774b603f3eb4c12333854b76fb704aae326d7 --- routing/dht/dht.go | 8 +- routing/dht/dht_net.go | 104 ++++++++++++ routing/dht/dht_test.go | 75 ++++----- routing/dht/ext_test.go | 358 ++++++++++++++++------------------------ 4 files changed, 280 insertions(+), 265 deletions(-) create mode 100644 routing/dht/dht_net.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f85889afd2..5a68bd7592 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -80,21 +80,17 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, n inet.Network, // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) error { - err := dht.network.DialPeer(ctx, npeer) - if err != nil { + if err := dht.network.DialPeer(ctx, npeer); err != nil { return err } // Ping new peer to register in their routing table // NOTE: this should be done better... - err = dht.Ping(ctx, npeer) - if err != nil { + if err := dht.Ping(ctx, npeer); err != nil { return fmt.Errorf("failed to ping newly connected peer: %s\n", err) } log.Event(ctx, "connect", dht.self, npeer) - dht.Update(ctx, npeer) - return nil } diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go new file mode 100644 index 0000000000..e31a52da7a --- /dev/null +++ b/routing/dht/dht_net.go @@ -0,0 +1,104 @@ +package dht + +import ( + "errors" + "time" + + inet "github.com/jbenet/go-ipfs/net" + peer "github.com/jbenet/go-ipfs/peer" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" + + ggio "code.google.com/p/gogoprotobuf/io" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +// handleNewStream implements the inet.StreamHandler +func (dht *IpfsDHT) handleNewStream(s inet.Stream) { + go dht.handleNewMessage(s) +} + +func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { + defer s.Close() + + ctx := dht.Context() + r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + w := ggio.NewDelimitedWriter(s) + mPeer := s.Conn().RemotePeer() + + // receive msg + pmes := new(pb.Message) + if err := r.ReadMsg(pmes); err != nil { + log.Error("Error unmarshaling data") + return + } + // update the peer (on valid msgs only) + dht.Update(ctx, mPeer) + + log.Event(ctx, "foo", dht.self, mPeer, pmes) + + // get handler for this msg type. + handler := dht.handlerForMsgType(pmes.GetType()) + if handler == nil { + log.Error("got back nil handler from handlerForMsgType") + return + } + + // dispatch handler. + rpmes, err := handler(ctx, mPeer, pmes) + if err != nil { + log.Errorf("handle message error: %s", err) + return + } + + // if nil response, return it before serializing + if rpmes == nil { + log.Warning("Got back nil response from request.") + return + } + + // send out response msg + if err := w.WriteMsg(rpmes); err != nil { + log.Errorf("send response error: %s", err) + return + } + + return +} + +// sendRequest sends out a request, but also makes sure to +// measure the RTT for latency measurements. +func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { + + log.Debugf("%s dht starting stream", dht.self) + s, err := dht.network.NewStream(inet.ProtocolDHT, p) + if err != nil { + return nil, err + } + defer s.Close() + + r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + w := ggio.NewDelimitedWriter(s) + + start := time.Now() + + log.Debugf("%s writing", dht.self) + if err := w.WriteMsg(pmes); err != nil { + return nil, err + } + log.Event(ctx, "dhtSentMessage", dht.self, p, pmes) + + log.Debugf("%s reading", dht.self) + defer log.Debugf("%s done", dht.self) + + rpmes := new(pb.Message) + if err := r.ReadMsg(rpmes); err != nil { + return nil, err + } + if rpmes == nil { + return nil, errors.New("no response to request") + } + + p.SetLatency(time.Since(start)) + log.Event(ctx, "dhtReceivedMessage", dht.self, p, rpmes) + return rpmes, nil +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index a955290f93..50ec767929 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -2,6 +2,7 @@ package dht import ( "bytes" + "math/rand" "sort" "testing" @@ -20,6 +21,16 @@ import ( "time" ) +func randMultiaddr(t *testing.T) ma.Multiaddr { + + s := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 10000+rand.Intn(40000)) + a, err := ma.NewMultiaddr(s) + if err != nil { + t.Fatal(err) + } + return a +} + func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { peerstore := peer.NewPeerstore() @@ -29,7 +40,6 @@ func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { } d := NewDHT(ctx, p, peerstore, n, ds.NewMapDatastore()) - d.network.SetHandler(inet.ProtocolDHT, d.handleNewStream) d.Validators["v"] = func(u.Key, []byte) error { return nil @@ -40,7 +50,8 @@ func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.Peer, []*IpfsDHT) { var addrs []ma.Multiaddr for i := 0; i < n; i++ { - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i)) + r := rand.Intn(40000) + a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 10000+r)) if err != nil { t.Fatal(err) } @@ -85,15 +96,9 @@ func makePeer(addr ma.Multiaddr) peer.Peer { func TestPing(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() - u.Debug = false - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/2222") - if err != nil { - t.Fatal(err) - } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/5678") - if err != nil { - t.Fatal(err) - } + + addrA := randMultiaddr(t) + addrB := randMultiaddr(t) peerA := makePeer(addrA) peerB := makePeer(addrB) @@ -106,21 +111,22 @@ func TestPing(t *testing.T) { defer dhtA.network.Close() defer dhtB.network.Close() - err = dhtA.Connect(ctx, peerB) - if err != nil { + if err := dhtA.Connect(ctx, peerB); err != nil { t.Fatal(err) } + // if err := dhtB.Connect(ctx, peerA); err != nil { + // t.Fatal(err) + // } + //Test that we can ping the node ctxT, _ := context.WithTimeout(ctx, 100*time.Millisecond) - err = dhtA.Ping(ctxT, peerB) - if err != nil { + if err := dhtA.Ping(ctxT, peerB); err != nil { t.Fatal(err) } ctxT, _ = context.WithTimeout(ctx, 100*time.Millisecond) - err = dhtB.Ping(ctxT, peerA) - if err != nil { + if err := dhtB.Ping(ctxT, peerA); err != nil { t.Fatal(err) } } @@ -129,15 +135,9 @@ func TestValueGetSet(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() - u.Debug = false - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/11235") - if err != nil { - t.Fatal(err) - } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/15679") - if err != nil { - t.Fatal(err) - } + + addrA := randMultiaddr(t) + addrB := randMultiaddr(t) peerA := makePeer(addrA) peerB := makePeer(addrB) @@ -156,7 +156,7 @@ func TestValueGetSet(t *testing.T) { defer dhtA.network.Close() defer dhtB.network.Close() - err = dhtA.Connect(ctx, peerB) + err := dhtA.Connect(ctx, peerB) if err != nil { t.Fatal(err) } @@ -189,8 +189,6 @@ func TestProvides(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() - u.Debug = false - _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { @@ -251,7 +249,6 @@ func TestProvidesAsync(t *testing.T) { } ctx := context.Background() - u.Debug = false _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { @@ -317,7 +314,7 @@ func TestLayeredGet(t *testing.T) { } ctx := context.Background() - u.Debug = false + _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { @@ -371,7 +368,6 @@ func TestFindPeer(t *testing.T) { } ctx := context.Background() - u.Debug = false _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { @@ -412,12 +408,13 @@ func TestFindPeer(t *testing.T) { } func TestFindPeersConnectedToPeer(t *testing.T) { + t.Skip("not quite correct (see note)") + if testing.Short() { t.SkipNow() } ctx := context.Background() - u.Debug = false _, peers, dhts := setupDHTS(ctx, 4, t) defer func() { @@ -516,15 +513,9 @@ func TestConnectCollision(t *testing.T) { log.Notice("Running Time: ", rtime) ctx := context.Background() - u.Debug = false - addrA, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/11235") - if err != nil { - t.Fatal(err) - } - addrB, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/15679") - if err != nil { - t.Fatal(err) - } + + addrA := randMultiaddr(t) + addrB := randMultiaddr(t) peerA := makePeer(addrA) peerB := makePeer(addrB) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index f69d4d0189..1fb46b5216 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -1,150 +1,48 @@ package dht import ( + "math/rand" "testing" crand "crypto/rand" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" inet "github.com/jbenet/go-ipfs/net" + mocknet "github.com/jbenet/go-ipfs/net/mock" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" - "sync" + ggio "code.google.com/p/gogoprotobuf/io" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + "time" ) -// mesHandleFunc is a function that takes in outgoing messages -// and can respond to them, simulating other peers on the network. -// returning nil will chose not to respond and pass the message onto the -// next registered handler -type mesHandleFunc func(msg.NetMessage) msg.NetMessage - -// fauxNet is a standin for a swarm.Network in order to more easily recreate -// different testing scenarios -type fauxSender struct { - sync.Mutex - handlers []mesHandleFunc -} - -func (f *fauxSender) AddHandler(fn func(msg.NetMessage) msg.NetMessage) { - f.Lock() - defer f.Unlock() - - f.handlers = append(f.handlers, fn) -} - -func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.NetMessage, error) { - f.Lock() - handlers := make([]mesHandleFunc, len(f.handlers)) - copy(handlers, f.handlers) - f.Unlock() - - for _, h := range handlers { - reply := h(m) - if reply != nil { - return reply, nil - } - } - - // no reply? ok force a timeout - select { - case <-ctx.Done(): - } - - return nil, ctx.Err() -} - -func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error { - f.Lock() - handlers := make([]mesHandleFunc, len(f.handlers)) - copy(handlers, f.handlers) - f.Unlock() - - for _, h := range handlers { - reply := h(m) - if reply != nil { - return nil - } - } - return nil -} - -// fauxNet is a standin for a swarm.Network in order to more easily recreate -// different testing scenarios -type fauxNet struct { - local peer.Peer -} - -// DialPeer attempts to establish a connection to a given peer -func (f *fauxNet) DialPeer(context.Context, peer.Peer) error { - return nil -} - -func (f *fauxNet) LocalPeer() peer.Peer { - return f.local -} - -// ClosePeer connection to peer -func (f *fauxNet) ClosePeer(peer.Peer) error { - return nil -} - -// IsConnected returns whether a connection to given peer exists. -func (f *fauxNet) IsConnected(peer.Peer) (bool, error) { - return true, nil -} - -// Connectedness returns whether a connection to given peer exists. -func (f *fauxNet) Connectedness(peer.Peer) inet.Connectedness { - return inet.Connected -} - -// GetProtocols returns the protocols registered in the network. -func (f *fauxNet) GetProtocols() *mux.ProtocolMap { return nil } - -// SendMessage sends given Message out -func (f *fauxNet) SendMessage(msg.NetMessage) error { - return nil -} - -func (f *fauxNet) GetPeerList() []peer.Peer { - return nil -} - -func (f *fauxNet) GetBandwidthTotals() (uint64, uint64) { - return 0, 0 -} - -// Close terminates all network operation -func (f *fauxNet) Close() error { return nil } - func TestGetFailures(t *testing.T) { if testing.Short() { t.SkipNow() } + ctx := context.Background() peerstore := peer.NewPeerstore() local := makePeerString(t, "") + peers := []peer.Peer{local, testutil.RandPeer()} - ctx := context.Background() - fn := &fauxNet{local} - fs := &fauxSender{} + nets, err := mocknet.MakeNetworks(ctx, peers) + if err != nil { + t.Fatal(err) + } - d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) - other := makePeerString(t, "") - d.Update(ctx, other) + d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) + d.Update(ctx, peers[1]) // This one should time out // u.POut("Timout Test\n") ctx1, _ := context.WithTimeout(context.Background(), time.Second) - _, err := d.GetValue(ctx1, u.Key("test")) - if err != nil { + if _, err := d.GetValue(ctx1, u.Key("test")); err != nil { if err != context.DeadlineExceeded { t.Fatal("Got different error than we expected", err) } @@ -152,20 +50,29 @@ func TestGetFailures(t *testing.T) { t.Fatal("Did not get expected error!") } + msgs := make(chan *pb.Message, 100) + // u.POut("NotFound Test\n") // Reply with failures to every message - fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + nets[1].SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + defer s.Close() + + pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + pbw := ggio.NewDelimitedWriter(s) + pmes := new(pb.Message) - err := proto.Unmarshal(mes.Data(), pmes) - if err != nil { - t.Fatal(err) + if err := pbr.ReadMsg(pmes); err != nil { + panic(err) } resp := &pb.Message{ Type: pmes.Type, } - m, err := msg.FromObject(mes.Peer(), resp) - return m + if err := pbw.WriteMsg(resp); err != nil { + panic(err) + } + + msgs <- resp }) // This one should fail with NotFound @@ -179,40 +86,45 @@ func TestGetFailures(t *testing.T) { t.Fatal("expected error, got none.") } - fs.handlers = nil // Now we test this DHT's handleGetValue failure - typ := pb.Message_GET_VALUE - str := "hello" - rec, err := d.makePutRecord(u.Key(str), []byte("blah")) - if err != nil { - t.Fatal(err) - } - req := pb.Message{ - Type: &typ, - Key: &str, - Record: rec, - } + { + typ := pb.Message_GET_VALUE + str := "hello" + rec, err := d.makePutRecord(u.Key(str), []byte("blah")) + if err != nil { + t.Fatal(err) + } + req := pb.Message{ + Type: &typ, + Key: &str, + Record: rec, + } - // u.POut("handleGetValue Test\n") - mes, err := msg.FromObject(other, &req) - if err != nil { - t.Error(err) - } + // u.POut("handleGetValue Test\n") + s, err := nets[1].NewStream(inet.ProtocolDHT, peers[0]) + if err != nil { + t.Fatal(err) + } + defer s.Close() - mes = d.HandleMessage(ctx, mes) + pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + pbw := ggio.NewDelimitedWriter(s) - pmes := new(pb.Message) - err = proto.Unmarshal(mes.Data(), pmes) - if err != nil { - t.Fatal(err) - } - if pmes.GetRecord() != nil { - t.Fatal("shouldnt have value") - } - if pmes.GetProviderPeers() != nil { - t.Fatal("shouldnt have provider peers") - } + if err := pbw.WriteMsg(&req); err != nil { + t.Fatal(err) + } + pmes := new(pb.Message) + if err := pbr.ReadMsg(pmes); err != nil { + t.Fatal(err) + } + if pmes.GetRecord() != nil { + t.Fatal("shouldnt have value") + } + if pmes.GetProviderPeers() != nil { + t.Fatal("shouldnt have provider peers") + } + } } // TODO: Maybe put these in some sort of "ipfs_testutil" package @@ -228,49 +140,57 @@ func TestNotFound(t *testing.T) { t.SkipNow() } - local := makePeerString(t, "") + ctx := context.Background() peerstore := peer.NewPeerstore() - peerstore.Add(local) - ctx := context.Background() - fn := &fauxNet{local} - fs := &fauxSender{} + var peers []peer.Peer + for i := 0; i < 16; i++ { + peers = append(peers, testutil.RandPeer()) + } - d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) + nets, err := mocknet.MakeNetworks(ctx, peers) + if err != nil { + t.Fatal(err) + } + + d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) - var ps []peer.Peer - for i := 0; i < 5; i++ { - ps = append(ps, _randPeer()) - d.Update(ctx, ps[i]) + for _, p := range peers { + d.Update(ctx, p) } // Reply with random peers to every message - fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { - pmes := new(pb.Message) - err := proto.Unmarshal(mes.Data(), pmes) - if err != nil { - t.Fatal(err) - } + for _, neti := range nets { + neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + defer s.Close() - switch pmes.GetType() { - case pb.Message_GET_VALUE: - resp := &pb.Message{Type: pmes.Type} + pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + pbw := ggio.NewDelimitedWriter(s) - peers := []peer.Peer{} - for i := 0; i < 7; i++ { - peers = append(peers, _randPeer()) - } - resp.CloserPeers = pb.PeersToPBPeers(d.dialer, peers) - mes, err := msg.FromObject(mes.Peer(), resp) - if err != nil { - t.Error(err) + pmes := new(pb.Message) + if err := pbr.ReadMsg(pmes); err != nil { + panic(err) } - return mes - default: - panic("Shouldnt recieve this.") - } - }) + switch pmes.GetType() { + case pb.Message_GET_VALUE: + resp := &pb.Message{Type: pmes.Type} + + ps := []peer.Peer{} + for i := 0; i < 7; i++ { + ps = append(ps, peers[rand.Intn(len(peers))]) + } + + resp.CloserPeers = pb.PeersToPBPeers(d.network, peers) + if err := pbw.WriteMsg(resp); err != nil { + panic(err) + } + + default: + panic("Shouldnt recieve this.") + } + }) + } ctx, _ = context.WithTimeout(ctx, time.Second*5) v, err := d.GetValue(ctx, u.Key("hello")) @@ -294,53 +214,57 @@ func TestNotFound(t *testing.T) { func TestLessThanKResponses(t *testing.T) { // t.Skip("skipping test because it makes a lot of output") - local := makePeerString(t, "") + ctx := context.Background() peerstore := peer.NewPeerstore() - peerstore.Add(local) - ctx := context.Background() - u.Debug = false - fn := &fauxNet{local} - fs := &fauxSender{} + var peers []peer.Peer + for i := 0; i < 6; i++ { + peers = append(peers, testutil.RandPeer()) + } + + nets, err := mocknet.MakeNetworks(ctx, peers) + if err != nil { + t.Fatal(err) + } - d := NewDHT(ctx, local, peerstore, fn, fs, ds.NewMapDatastore()) + d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) - var ps []peer.Peer - for i := 0; i < 5; i++ { - ps = append(ps, _randPeer()) - d.Update(ctx, ps[i]) + for i := 1; i < 5; i++ { + d.Update(ctx, peers[i]) } - other := _randPeer() // Reply with random peers to every message - fs.AddHandler(func(mes msg.NetMessage) msg.NetMessage { - pmes := new(pb.Message) - err := proto.Unmarshal(mes.Data(), pmes) - if err != nil { - t.Fatal(err) - } + for _, neti := range nets { + neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + defer s.Close() + + pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + pbw := ggio.NewDelimitedWriter(s) - switch pmes.GetType() { - case pb.Message_GET_VALUE: - resp := &pb.Message{ - Type: pmes.Type, - CloserPeers: pb.PeersToPBPeers(d.dialer, []peer.Peer{other}), + pmes := new(pb.Message) + if err := pbr.ReadMsg(pmes); err != nil { + panic(err) } - mes, err := msg.FromObject(mes.Peer(), resp) - if err != nil { - t.Error(err) + switch pmes.GetType() { + case pb.Message_GET_VALUE: + resp := &pb.Message{ + Type: pmes.Type, + CloserPeers: pb.PeersToPBPeers(d.network, []peer.Peer{peers[1]}), + } + + if err := pbw.WriteMsg(resp); err != nil { + panic(err) + } + default: + panic("Shouldnt recieve this.") } - return mes - default: - panic("Shouldnt recieve this.") - } - }) + }) + } ctx, _ = context.WithTimeout(ctx, time.Second*30) - _, err := d.GetValue(ctx, u.Key("hello")) - if err != nil { + if _, err := d.GetValue(ctx, u.Key("hello")); err != nil { switch err { case routing.ErrNotFound: //Success! From d1dd4f8ec01fa1a714563cd1dfcc746a9e6a97ae Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 16 Dec 2014 14:53:02 -0800 Subject: [PATCH 0443/3147] make vendor This commit was moved from ipfs/go-ipfs-routing@15c6bc15b1bd45fd2dc2b2adfb7b108c8bd2f1c8 --- routing/dht/dht_net.go | 2 +- routing/dht/ext_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index e31a52da7a..d1898f15c3 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -8,7 +8,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" - ggio "code.google.com/p/gogoprotobuf/io" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 1fb46b5216..0186696087 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -14,7 +14,7 @@ import ( u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" - ggio "code.google.com/p/gogoprotobuf/io" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" From 0a9007ddb2ac44219c1c759a5aa28f9cd3eef72f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Dec 2014 08:02:59 -0800 Subject: [PATCH 0444/3147] transition dht to mock2 This commit was moved from ipfs/go-ipfs-routing@6bb28d6ad2b819afc720daedab1368afda9d2b9b --- routing/dht/ext_test.go | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 0186696087..ace195c290 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,15 +7,15 @@ import ( crand "crypto/rand" inet "github.com/jbenet/go-ipfs/net" - mocknet "github.com/jbenet/go-ipfs/net/mock" + mocknet "github.com/jbenet/go-ipfs/net/mock2" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" "time" @@ -27,16 +27,15 @@ func TestGetFailures(t *testing.T) { } ctx := context.Background() - peerstore := peer.NewPeerstore() - local := makePeerString(t, "") - peers := []peer.Peer{local, testutil.RandPeer()} - - nets, err := mocknet.MakeNetworks(ctx, peers) + mn, err := mocknet.FullMeshConnected(ctx, 2) if err != nil { t.Fatal(err) } + nets := mn.Nets() + peers := mn.Peers() - d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) + ps := peer.NewPeerstore() + d := NewDHT(ctx, peers[0], ps, nets[0], ds.NewMapDatastore()) d.Update(ctx, peers[1]) // This one should time out @@ -141,17 +140,13 @@ func TestNotFound(t *testing.T) { } ctx := context.Background() - peerstore := peer.NewPeerstore() - - var peers []peer.Peer - for i := 0; i < 16; i++ { - peers = append(peers, testutil.RandPeer()) - } - - nets, err := mocknet.MakeNetworks(ctx, peers) + mn, err := mocknet.FullMeshConnected(ctx, 16) if err != nil { t.Fatal(err) } + nets := mn.Nets() + peers := mn.Peers() + peerstore := peer.NewPeerstore() d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) @@ -215,17 +210,13 @@ func TestLessThanKResponses(t *testing.T) { // t.Skip("skipping test because it makes a lot of output") ctx := context.Background() - peerstore := peer.NewPeerstore() - - var peers []peer.Peer - for i := 0; i < 6; i++ { - peers = append(peers, testutil.RandPeer()) - } - - nets, err := mocknet.MakeNetworks(ctx, peers) + mn, err := mocknet.FullMeshConnected(ctx, 6) if err != nil { t.Fatal(err) } + nets := mn.Nets() + peers := mn.Peers() + peerstore := peer.NewPeerstore() d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) From 9c6725ae3be682bd21a0a9e5e2c4ae7c9c4474bf Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Dec 2014 08:04:02 -0800 Subject: [PATCH 0445/3147] mv net/mock2 -> net/mock This commit was moved from ipfs/go-ipfs-routing@50926368e886602a2507c5cf42951fa51be9c6dc --- routing/dht/ext_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index ace195c290..c7315d5387 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,7 +7,7 @@ import ( crand "crypto/rand" inet "github.com/jbenet/go-ipfs/net" - mocknet "github.com/jbenet/go-ipfs/net/mock2" + mocknet "github.com/jbenet/go-ipfs/net/mock" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" From 95b694458b3c333a1bad37192e15a5267d3f4d3f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 15 Dec 2014 01:33:04 +0000 Subject: [PATCH 0446/3147] rewrite sendWantlistToProviders This commit was moved from ipfs/go-ipfs-routing@7cb304d457940363e22361e055cebcde03a8c2a7 --- routing/dht/routing.go | 5 +++-- routing/dht/util.go | 44 ------------------------------------------ 2 files changed, 3 insertions(+), 46 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 76260e7108..f8036ca381 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -11,6 +11,7 @@ import ( pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" + pset "github.com/jbenet/go-ipfs/util/peerset" ) // asyncQueryBuffer is the size of buffered channels in async queries. This @@ -140,7 +141,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.Peer) { defer close(peerOut) - ps := newPeerSet() + ps := pset.NewPeerSet() provs := dht.providers.GetProviders(ctx, key) for _, p := range provs { // NOTE: assuming that this list of peers is unique @@ -207,7 +208,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } } -func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *peerSet, count int, out chan peer.Peer) { +func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *pset.PeerSet, count int, out chan peer.Peer) { var wg sync.WaitGroup for _, pbp := range peers { wg.Add(1) diff --git a/routing/dht/util.go b/routing/dht/util.go index 00ac38dbc7..2b0c1e2a2a 100644 --- a/routing/dht/util.go +++ b/routing/dht/util.go @@ -2,8 +2,6 @@ package dht import ( "sync" - - peer "github.com/jbenet/go-ipfs/peer" ) // Pool size is the number of nodes used for group find/set RPC calls @@ -39,45 +37,3 @@ func (c *counter) Size() (s int) { c.mut.Unlock() return } - -// peerSet is a threadsafe set of peers -type peerSet struct { - ps map[string]bool - lk sync.RWMutex -} - -func newPeerSet() *peerSet { - ps := new(peerSet) - ps.ps = make(map[string]bool) - return ps -} - -func (ps *peerSet) Add(p peer.Peer) { - ps.lk.Lock() - ps.ps[string(p.ID())] = true - ps.lk.Unlock() -} - -func (ps *peerSet) Contains(p peer.Peer) bool { - ps.lk.RLock() - _, ok := ps.ps[string(p.ID())] - ps.lk.RUnlock() - return ok -} - -func (ps *peerSet) Size() int { - ps.lk.RLock() - defer ps.lk.RUnlock() - return len(ps.ps) -} - -func (ps *peerSet) AddIfSmallerThan(p peer.Peer, maxsize int) bool { - var success bool - ps.lk.Lock() - if _, ok := ps.ps[string(p.ID())]; !ok && len(ps.ps) < maxsize { - success = true - ps.ps[string(p.ID())] = true - } - ps.lk.Unlock() - return success -} From cc88460d295b5bc23d5e3569a400c23291388c28 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 10 Dec 2014 23:01:56 +0000 Subject: [PATCH 0447/3147] blockstore.ErrNotFound, and proper wantlist sorting This commit was moved from ipfs/go-blockservice@d63258a4c3d5f7fed2a93a615caa182570ab6d61 --- blockservice/blockservice.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index f44eaa0f5a..9014cab461 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -8,8 +8,6 @@ import ( "fmt" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - blocks "github.com/jbenet/go-ipfs/blocks" "github.com/jbenet/go-ipfs/blocks/blockstore" exchange "github.com/jbenet/go-ipfs/exchange" @@ -67,7 +65,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er return block, nil // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. - } else if err == ds.ErrNotFound && s.Exchange != nil { + } else if err == blockstore.ErrNotFound && s.Exchange != nil { log.Debug("Blockservice: Searching bitswap.") blk, err := s.Exchange.GetBlock(ctx, k) if err != nil { From 95cea3009bdf8d4f4381062bebfef46072138faf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 10 Dec 2014 23:01:56 +0000 Subject: [PATCH 0448/3147] blockstore.ErrNotFound, and proper wantlist sorting This commit was moved from ipfs/go-ipfs-blockstore@bc4a13fd3309c14318e86e7ad5e973bb5e66633e --- blockstore/blockstore.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index d4849cb43b..e203ffc502 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -6,14 +6,16 @@ import ( "errors" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) var ValueTypeMismatch = errors.New("The retrieved value is not a Block") +var ErrNotFound = errors.New("blockstore: block not found") + // Blockstore wraps a ThreadSafeDatastore type Blockstore interface { DeleteBlock(u.Key) error @@ -34,6 +36,9 @@ type blockstore struct { func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { maybeData, err := bs.datastore.Get(k.DsKey()) + if err == ds.ErrNotFound { + return nil, ErrNotFound + } if err != nil { return nil, err } From b2343c744294c66c048660ebb7e4d411c2cc88b6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 16 Dec 2014 04:01:15 +0000 Subject: [PATCH 0449/3147] change Provide RPC to not wait for an ACK, improves performance of 'Add' operations This commit was moved from ipfs/go-ipfs-routing@e838fd78f494692b9f8001bbd694b56e4c36eaad --- routing/dht/dht.go | 5 +---- routing/dht/dht_net.go | 23 ++++++++++++++++++++++- routing/mock/mockrouting_test.go | 4 ++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5a68bd7592..6e49c84cfd 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -120,15 +120,12 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) er // add self as the provider pmes.ProviderPeers = pb.PeersToPBPeers(dht.network, []peer.Peer{dht.self}) - rpmes, err := dht.sendRequest(ctx, p, pmes) + err := dht.sendMessage(ctx, p, pmes) if err != nil { return err } log.Debugf("%s putProvider: %s for %s", dht.self, p, u.Key(key)) - if rpmes.GetKey() != pmes.GetKey() { - return errors.New("provider not added correctly") - } return nil } diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index d1898f15c3..6e46b4de63 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -8,8 +8,8 @@ import ( peer "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" ) // handleNewStream implements the inet.StreamHandler @@ -102,3 +102,24 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Messa log.Event(ctx, "dhtReceivedMessage", dht.self, p, rpmes) return rpmes, nil } + +// sendMessage sends out a message +func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.Peer, pmes *pb.Message) error { + + log.Debugf("%s dht starting stream", dht.self) + s, err := dht.network.NewStream(inet.ProtocolDHT, p) + if err != nil { + return err + } + defer s.Close() + + w := ggio.NewDelimitedWriter(s) + + log.Debugf("%s writing", dht.self) + if err := w.WriteMsg(pmes); err != nil { + return err + } + log.Event(ctx, "dhtSentMessage", dht.self, p, pmes) + log.Debugf("%s done", dht.self) + return nil +} diff --git a/routing/mock/mockrouting_test.go b/routing/mock/mockrouting_test.go index 6700cd8ede..44b1b52bd6 100644 --- a/routing/mock/mockrouting_test.go +++ b/routing/mock/mockrouting_test.go @@ -36,6 +36,9 @@ func TestClientFindProviders(t *testing.T) { if err != nil { t.Fatal(err) } + + // This is bad... but simulating networks is hard + time.Sleep(time.Millisecond * 300) max := 100 providersFromHashTable, err := rs.Client(peer).FindProviders(context.Background(), k) @@ -160,6 +163,7 @@ func TestValidAfter(t *testing.T) { if err != nil { t.Fatal(err) } + t.Log("providers", providers) if len(providers) != 1 { t.Fail() } From 6965d9606f17d860b16eba7fad61b2f653e1006b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 16 Dec 2014 18:33:36 +0000 Subject: [PATCH 0450/3147] refactor peerSet This commit was moved from ipfs/go-ipfs-routing@352eec315e9f6d0c0171fa10edbe101ed7c1fda6 --- routing/dht/routing.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index f8036ca381..bfe38e200e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -141,11 +141,11 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.Peer) { defer close(peerOut) - ps := pset.NewPeerSet() + ps := pset.NewLimitedPeerSet(count) provs := dht.providers.GetProviders(ctx, key) for _, p := range provs { // NOTE: assuming that this list of peers is unique - if ps.AddIfSmallerThan(p, count) { + if ps.TryAdd(p) { select { case peerOut <- p: case <-ctx.Done(): @@ -176,7 +176,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // Add unique providers from request, up to 'count' for _, prov := range provs { - if ps.AddIfSmallerThan(prov, count) { + if ps.TryAdd(prov) { select { case peerOut <- prov: case <-ctx.Done(): @@ -226,7 +226,7 @@ func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.M } dht.providers.AddProvider(k, p) - if ps.AddIfSmallerThan(p, count) { + if ps.TryAdd(p) { select { case out <- p: case <-ctx.Done(): From 258ad30cf86d429542fa9f9f7bf0552b04d923f7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 17 Dec 2014 19:27:41 +0000 Subject: [PATCH 0451/3147] clean peerset constructor names This commit was moved from ipfs/go-ipfs-routing@54d693e1da3034ba510a56de912d5c6cf4173d5b --- routing/dht/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index bfe38e200e..51f15ff21b 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -141,7 +141,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.Peer) { defer close(peerOut) - ps := pset.NewLimitedPeerSet(count) + ps := pset.NewLimited(count) provs := dht.providers.GetProviders(ctx, key) for _, p := range provs { // NOTE: assuming that this list of peers is unique From 8ddd3b49aee5c2ec6911544fcf89e232cb41c3ea Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Dec 2014 12:19:56 -0800 Subject: [PATCH 0452/3147] peer change: peer.Peer -> peer.ID this is a major refactor of the entire codebase it changes the monolithic peer.Peer into using a peer.ID and a peer.Peerstore. Other changes: - removed handshake3. - testutil vastly simplified peer - secio bugfix + debugging logs - testutil: RandKeyPair - backpressure bugfix: w.o.w. - peer: added hex enc/dec - peer: added a PeerInfo struct PeerInfo is a small struct used to pass around a peer with a set of addresses and keys. This is not meant to be a complete view of the system, but rather to model updates to the peerstore. It is used by things like the routing system. - updated peer/queue + peerset - latency metrics - testutil: use crand for PeerID gen RandPeerID generates random "valid" peer IDs. it does not NEED to generate keys because it is as if we lost the key right away. fine to read some randomness and hash it. to generate proper keys and an ID, use: sk, pk, _ := testutil.RandKeyPair() id, _ := peer.IDFromPublicKey(pk) Also added RandPeerIDFatal helper - removed old spipe - updated seccat - core: cleanup initIdentity - removed old getFromPeerList This commit was moved from ipfs/go-ipfs-routing@59fe3ced9e2b4ec1da1fe1f2d45f96458a2b3ace --- routing/dht/dht.go | 188 +++++++------------ routing/dht/dht_net.go | 6 +- routing/dht/dht_test.go | 297 +++++++++++-------------------- routing/dht/diag.go | 4 +- routing/dht/ext_test.go | 38 ++-- routing/dht/handlers.go | 106 +++++------ routing/dht/pb/dht.pb.go | 4 +- routing/dht/pb/dht.proto | 2 +- routing/dht/pb/message.go | 86 ++++----- routing/dht/providers.go | 14 +- routing/dht/providers_test.go | 5 +- routing/dht/query.go | 48 ++--- routing/dht/records.go | 145 ++++++++++++--- routing/dht/routing.go | 120 +++++-------- routing/kbucket/bucket.go | 10 +- routing/kbucket/table.go | 52 +++--- routing/kbucket/table_test.go | 88 +++++---- routing/kbucket/util.go | 2 +- routing/mock/client.go | 12 +- routing/mock/interface.go | 8 +- routing/mock/mockrouting_test.go | 46 +++-- routing/mock/server.go | 22 +-- routing/routing.go | 7 +- 23 files changed, 613 insertions(+), 697 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6e49c84cfd..2cb6801401 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -34,11 +34,10 @@ const doPinging = false // It is used to implement the base IpfsRouting module. type IpfsDHT struct { network inet.Network // the network services we need - self peer.Peer // Local peer (yourself) - peerstore peer.Peerstore // Other peers + self peer.ID // Local peer (yourself) + peerstore peer.Peerstore // Peer Registry - datastore ds.Datastore // Local data - dslock sync.Mutex + datastore ds.ThreadSafeDatastore // Local data routingTable *kb.RoutingTable // Array of routing tables for differently distanced nodes providers *ProviderManager @@ -53,19 +52,19 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, n inet.Network, dstore ds.Datastore) *IpfsDHT { +func NewDHT(ctx context.Context, p peer.ID, n inet.Network, dstore ds.ThreadSafeDatastore) *IpfsDHT { dht := new(IpfsDHT) dht.datastore = dstore dht.self = p - dht.peerstore = ps + dht.peerstore = n.Peerstore() dht.ContextGroup = ctxgroup.WithContext(ctx) dht.network = n n.SetHandler(inet.ProtocolDHT, dht.handleNewStream) - dht.providers = NewProviderManager(dht.Context(), p.ID()) + dht.providers = NewProviderManager(dht.Context(), p) dht.AddChildGroup(dht.providers) - dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID()), time.Minute) + dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(p), time.Minute, dht.peerstore) dht.birth = time.Now() dht.Validators = make(map[string]ValidatorFunc) @@ -79,7 +78,7 @@ func NewDHT(ctx context.Context, p peer.Peer, ps peer.Peerstore, n inet.Network, } // Connect to a new peer at the given address, ping and add to the routing table -func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) error { +func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { if err := dht.network.DialPeer(ctx, npeer); err != nil { return err } @@ -95,7 +94,8 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.Peer) error { } // putValueToNetwork stores the given key/value pair at the peer 'p' -func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, +// meaning: it sends a PUT_VALUE message to p +func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.ID, key string, rec *pb.Record) error { pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) @@ -113,12 +113,13 @@ func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.Peer, // putProvider sends a message to peer 'p' saying that the local node // can provide the value of 'key' -func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) error { +func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) error { pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) // add self as the provider - pmes.ProviderPeers = pb.PeersToPBPeers(dht.network, []peer.Peer{dht.self}) + pi := dht.peerstore.PeerInfo(dht.self) + pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, []peer.PeerInfo{pi}) err := dht.sendMessage(ctx, p, pmes) if err != nil { @@ -130,8 +131,12 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.Peer, key string) er return nil } -func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, - key u.Key) ([]byte, []peer.Peer, error) { +// getValueOrPeers queries a particular peer p for the value for +// key. It returns either the value or a list of closer peers. +// NOTE: it will update the dht's peerstore with any new addresses +// it finds for the given peer. +func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, + key u.Key) ([]byte, []peer.PeerInfo, error) { pmes, err := dht.getValueSingle(ctx, p, key) if err != nil { @@ -142,8 +147,8 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, // Success! We were given the value log.Debug("getValueOrPeers: got value") - // make sure record is still valid - err = dht.verifyRecord(record) + // make sure record is valid. + err = dht.verifyRecordOnline(ctx, record) if err != nil { log.Error("Received invalid record!") return nil, nil, err @@ -151,24 +156,8 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, return record.GetValue(), nil, nil } - // TODO decide on providers. This probably shouldn't be happening. - if prv := pmes.GetProviderPeers(); prv != nil && len(prv) > 0 { - val, err := dht.getFromPeerList(ctx, key, prv) - if err != nil { - return nil, nil, err - } - log.Debug("getValueOrPeers: get from providers") - return val, nil, nil - } - // Perhaps we were given closer peers - peers, errs := pb.PBPeersToPeers(dht.peerstore, pmes.GetCloserPeers()) - for _, err := range errs { - if err != nil { - log.Error(err) - } - } - + peers := pb.PBPeersToPeerInfos(pmes.GetCloserPeers()) if len(peers) > 0 { log.Debug("getValueOrPeers: peers") return nil, peers, nil @@ -179,51 +168,16 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.Peer, } // getValueSingle simply performs the get value RPC with the given parameters -func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.Peer, +func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, key u.Key) (*pb.Message, error) { pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), 0) return dht.sendRequest(ctx, p, pmes) } -// TODO: Im not certain on this implementation, we get a list of peers/providers -// from someone what do we do with it? Connect to each of them? randomly pick -// one to get the value from? Or just connect to one at a time until we get a -// successful connection and request the value from it? -func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key, - peerlist []*pb.Message_Peer) ([]byte, error) { - - for _, pinfo := range peerlist { - p, err := dht.ensureConnectedToPeer(ctx, pinfo) - if err != nil { - log.Errorf("getFromPeers error: %s", err) - continue - } - - pmes, err := dht.getValueSingle(ctx, p, key) - if err != nil { - log.Errorf("getFromPeers error: %s\n", err) - continue - } - - if record := pmes.GetRecord(); record != nil { - // Success! We were given the value - - err := dht.verifyRecord(record) - if err != nil { - return nil, err - } - dht.providers.AddProvider(key, p) - return record.GetValue(), nil - } - } - return nil, routing.ErrNotFound -} - // getLocal attempts to retrieve the value from the datastore func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { - dht.dslock.Lock() - defer dht.dslock.Unlock() + log.Debug("getLocal %s", key) v, err := dht.datastore.Get(key.DsKey()) if err != nil { @@ -243,7 +197,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { // TODO: 'if paranoid' if u.Debug { - err = dht.verifyRecord(rec) + err = dht.verifyRecordLocally(rec) if err != nil { log.Errorf("local record verify failed: %s", err) return nil, err @@ -269,41 +223,40 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { // Update signals the routingTable to Update its last-seen status // on the given peer. -func (dht *IpfsDHT) Update(ctx context.Context, p peer.Peer) { +func (dht *IpfsDHT) Update(ctx context.Context, p peer.ID) { log.Event(ctx, "updatePeer", p) dht.routingTable.Update(p) } // FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. -func (dht *IpfsDHT) FindLocal(id peer.ID) (peer.Peer, *kb.RoutingTable) { +func (dht *IpfsDHT) FindLocal(id peer.ID) (peer.PeerInfo, *kb.RoutingTable) { p := dht.routingTable.Find(id) - if p != nil { - return p, dht.routingTable + if p != "" { + return dht.peerstore.PeerInfo(p), dht.routingTable } - return nil, nil + return peer.PeerInfo{}, nil } // findPeerSingle asks peer 'p' if they know where the peer with id 'id' is -func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.Peer, id peer.ID) (*pb.Message, error) { +func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.ID, id peer.ID) (*pb.Message, error) { pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.Peer, key u.Key) (*pb.Message, error) { +func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key u.Key) (*pb.Message, error) { pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), 0) return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) addProviders(key u.Key, pbps []*pb.Message_Peer) []peer.Peer { - peers, errs := pb.PBPeersToPeers(dht.peerstore, pbps) - for _, err := range errs { - log.Errorf("error converting peer: %v", err) - } +func (dht *IpfsDHT) addProviders(key u.Key, pbps []*pb.Message_Peer) []peer.ID { + peers := pb.PBPeersToPeerInfos(pbps) + + var provArr []peer.ID + for _, pi := range peers { + p := pi.ID - var provArr []peer.Peer - for _, p := range peers { // Dont add outselves to the list - if p.ID().Equal(dht.self.ID()) { + if p == dht.self { continue } @@ -316,14 +269,14 @@ func (dht *IpfsDHT) addProviders(key u.Key, pbps []*pb.Message_Peer) []peer.Peer } // nearestPeersToQuery returns the routing tables closest peers. -func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.Peer { +func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.ID { key := u.Key(pmes.GetKey()) closer := dht.routingTable.NearestPeers(kb.ConvertKey(key), count) return closer } // betterPeerToQuery returns nearestPeersToQuery, but iff closer than self. -func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.Peer { +func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.ID { closer := dht.nearestPeersToQuery(pmes, count) // no node? nil @@ -333,17 +286,17 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.Peer // == to self? thats bad for _, p := range closer { - if p.ID().Equal(dht.self.ID()) { + if p == dht.self { log.Error("Attempted to return self! this shouldnt happen...") return nil } } - var filtered []peer.Peer + var filtered []peer.ID for _, p := range closer { // must all be closer than self key := u.Key(pmes.GetKey()) - if !kb.Closer(dht.self.ID(), p.ID(), key) { + if !kb.Closer(dht.self, p, key) { filtered = append(filtered, p) } } @@ -352,30 +305,13 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.Peer return filtered } -// getPeer searches the peerstore for a peer with the given peer ID -func (dht *IpfsDHT) getPeer(id peer.ID) (peer.Peer, error) { - p, err := dht.peerstore.FindOrCreate(id) - if err != nil { - err = fmt.Errorf("Failed to get peer from peerstore: %s", err) - log.Error(err) - return nil, err - } - return p, nil -} - -func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, pbp *pb.Message_Peer) (peer.Peer, error) { - p, err := pb.PBPeerToPeer(dht.peerstore, pbp) - if err != nil { - return nil, err - } - - if dht.self.ID().Equal(p.ID()) { - return nil, errors.New("attempting to ensure connection to self") +func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, p peer.ID) error { + if p == dht.self { + return errors.New("attempting to ensure connection to self") } // dial connection - err = dht.network.DialPeer(ctx, p) - return p, err + return dht.network.DialPeer(ctx, p) } //TODO: this should be smarter about which keys it selects. @@ -421,14 +357,24 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { // Bootstrap builds up list of peers by requesting random peer IDs func (dht *IpfsDHT) Bootstrap(ctx context.Context) { - id := make([]byte, 16) - rand.Read(id) - p, err := dht.FindPeer(ctx, peer.ID(id)) - if err != nil { - log.Errorf("Bootstrap peer error: %s", err) - } - err = dht.network.DialPeer(ctx, p) - if err != nil { - log.Errorf("Bootstrap peer error: %s", err) + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + id := make([]byte, 16) + rand.Read(id) + pi, err := dht.FindPeer(ctx, peer.ID(id)) + if err != nil { + // NOTE: this is not an error. this is expected! + log.Errorf("Bootstrap peer error: %s", err) + } + + // woah, we got a peer under a random id? it _cannot_ be valid. + log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", pi) + }() } + wg.Wait() } diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 6e46b4de63..a91e0f53c0 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -67,7 +67,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // sendRequest sends out a request, but also makes sure to // measure the RTT for latency measurements. -func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s dht starting stream", dht.self) s, err := dht.network.NewStream(inet.ProtocolDHT, p) @@ -98,13 +98,13 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.Peer, pmes *pb.Messa return nil, errors.New("no response to request") } - p.SetLatency(time.Since(start)) + dht.peerstore.RecordLatency(p, time.Since(start)) log.Event(ctx, "dhtReceivedMessage", dht.self, p, rpmes) return rpmes, nil } // sendMessage sends out a message -func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.Peer, pmes *pb.Message) error { +func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message) error { log.Debugf("%s dht starting stream", dht.self) s, err := dht.network.NewStream(inet.ProtocolDHT, p) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 50ec767929..b378675c6a 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -2,44 +2,47 @@ package dht import ( "bytes" - "math/rand" "sort" "testing" + "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ci "github.com/jbenet/go-ipfs/crypto" + // ci "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" - - "fmt" - "time" ) -func randMultiaddr(t *testing.T) ma.Multiaddr { +func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { - s := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 10000+rand.Intn(40000)) - a, err := ma.NewMultiaddr(s) + sk, pk, err := testutil.RandKeyPair(512) + if err != nil { + t.Fatal(err) + } + + p, err := peer.IDFromPublicKey(pk) if err != nil { t.Fatal(err) } - return a -} -func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { peerstore := peer.NewPeerstore() + peerstore.AddPrivKey(p, sk) + peerstore.AddPubKey(p, pk) + peerstore.AddAddress(p, addr) - n, err := inet.NewNetwork(ctx, p.Addresses(), p, peerstore) + n, err := inet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) if err != nil { t.Fatal(err) } - d := NewDHT(ctx, p, peerstore, n, ds.NewMapDatastore()) + dss := dssync.MutexWrap(ds.NewMapDatastore()) + d := NewDHT(ctx, p, n, dss) d.Validators["v"] = func(u.Key, []byte) error { return nil @@ -47,77 +50,53 @@ func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT { return d } -func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.Peer, []*IpfsDHT) { - var addrs []ma.Multiaddr - for i := 0; i < n; i++ { - r := rand.Intn(40000) - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 10000+r)) - if err != nil { - t.Fatal(err) - } - addrs = append(addrs, a) - } - - var peers []peer.Peer - for i := 0; i < n; i++ { - p := makePeer(addrs[i]) - peers = append(peers, p) - } - +func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.ID, []*IpfsDHT) { + addrs := make([]ma.Multiaddr, n) dhts := make([]*IpfsDHT, n) + peers := make([]peer.ID, n) + for i := 0; i < n; i++ { - dhts[i] = setupDHT(ctx, t, peers[i]) + addrs[i] = testutil.RandLocalTCPAddress() + dhts[i] = setupDHT(ctx, t, addrs[i]) + peers[i] = dhts[i].self } return addrs, peers, dhts } -func makePeerString(t *testing.T, addr string) peer.Peer { - maddr, err := ma.NewMultiaddr(addr) - if err != nil { - t.Fatal(err) - } - return makePeer(maddr) -} +func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { -func makePeer(addr ma.Multiaddr) peer.Peer { - sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) - if err != nil { - panic(err) + idB := b.self + addrB := b.peerstore.Addresses(idB) + if len(addrB) == 0 { + t.Fatal("peers setup incorrectly: no local address") } - p, err := testutil.NewPeerWithKeyPair(sk, pk) - if err != nil { - panic(err) + + a.peerstore.AddAddresses(idB, addrB) + if err := a.Connect(ctx, idB); err != nil { + t.Fatal(err) } - p.AddAddress(addr) - return p } func TestPing(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() - addrA := randMultiaddr(t) - addrB := randMultiaddr(t) + addrA := testutil.RandLocalTCPAddress() + addrB := testutil.RandLocalTCPAddress() - peerA := makePeer(addrA) - peerB := makePeer(addrB) + dhtA := setupDHT(ctx, t, addrA) + dhtB := setupDHT(ctx, t, addrB) - dhtA := setupDHT(ctx, t, peerA) - dhtB := setupDHT(ctx, t, peerB) + peerA := dhtA.self + peerB := dhtB.self defer dhtA.Close() defer dhtB.Close() defer dhtA.network.Close() defer dhtB.network.Close() - if err := dhtA.Connect(ctx, peerB); err != nil { - t.Fatal(err) - } - - // if err := dhtB.Connect(ctx, peerA); err != nil { - // t.Fatal(err) - // } + connect(t, ctx, dhtA, dhtB) //Test that we can ping the node ctxT, _ := context.WithTimeout(ctx, 100*time.Millisecond) @@ -136,14 +115,16 @@ func TestValueGetSet(t *testing.T) { ctx := context.Background() - addrA := randMultiaddr(t) - addrB := randMultiaddr(t) + addrA := testutil.RandLocalTCPAddress() + addrB := testutil.RandLocalTCPAddress() - peerA := makePeer(addrA) - peerB := makePeer(addrB) + dhtA := setupDHT(ctx, t, addrA) + dhtB := setupDHT(ctx, t, addrB) - dhtA := setupDHT(ctx, t, peerA) - dhtB := setupDHT(ctx, t, peerB) + defer dhtA.Close() + defer dhtB.Close() + defer dhtA.network.Close() + defer dhtB.network.Close() vf := func(u.Key, []byte) error { return nil @@ -151,15 +132,7 @@ func TestValueGetSet(t *testing.T) { dhtA.Validators["v"] = vf dhtB.Validators["v"] = vf - defer dhtA.Close() - defer dhtB.Close() - defer dhtA.network.Close() - defer dhtB.network.Close() - - err := dhtA.Connect(ctx, peerB) - if err != nil { - t.Fatal(err) - } + connect(t, ctx, dhtA, dhtB) ctxT, _ := context.WithTimeout(ctx, time.Second) dhtA.PutValue(ctxT, "/v/hello", []byte("world")) @@ -189,7 +162,7 @@ func TestProvides(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() - _, peers, dhts := setupDHTS(ctx, 4, t) + _, _, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { dhts[i].Close() @@ -197,22 +170,11 @@ func TestProvides(t *testing.T) { } }() - err := dhts[0].Connect(ctx, peers[1]) - if err != nil { - t.Fatal(err) - } + connect(t, ctx, dhts[0], dhts[1]) + connect(t, ctx, dhts[1], dhts[2]) + connect(t, ctx, dhts[1], dhts[3]) - err = dhts[1].Connect(ctx, peers[2]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[3]) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].putLocal(u.Key("hello"), []byte("world")) + err := dhts[3].putLocal(u.Key("hello"), []byte("world")) if err != nil { t.Fatal(err) } @@ -227,18 +189,21 @@ func TestProvides(t *testing.T) { t.Fatal(err) } - time.Sleep(time.Millisecond * 60) + // what is this timeout for? was 60ms before. + time.Sleep(time.Millisecond * 6) ctxT, _ := context.WithTimeout(ctx, time.Second) provchan := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 1) - after := time.After(time.Second) select { case prov := <-provchan: - if prov == nil { + if prov.ID == "" { t.Fatal("Got back nil provider") } - case <-after: + if prov.ID != dhts[3].self { + t.Fatal("Got back nil provider") + } + case <-ctxT.Done(): t.Fatal("Did not get a provider back.") } } @@ -250,7 +215,7 @@ func TestProvidesAsync(t *testing.T) { ctx := context.Background() - _, peers, dhts := setupDHTS(ctx, 4, t) + _, _, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { dhts[i].Close() @@ -258,22 +223,11 @@ func TestProvidesAsync(t *testing.T) { } }() - err := dhts[0].Connect(ctx, peers[1]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[2]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[3]) - if err != nil { - t.Fatal(err) - } + connect(t, ctx, dhts[0], dhts[1]) + connect(t, ctx, dhts[1], dhts[2]) + connect(t, ctx, dhts[1], dhts[3]) - err = dhts[3].putLocal(u.Key("hello"), []byte("world")) + err := dhts[3].putLocal(u.Key("hello"), []byte("world")) if err != nil { t.Fatal(err) } @@ -297,10 +251,10 @@ func TestProvidesAsync(t *testing.T) { if !ok { t.Fatal("Provider channel was closed...") } - if p == nil { + if p.ID == "" { t.Fatal("Got back nil provider!") } - if !p.ID().Equal(dhts[3].self.ID()) { + if p.ID != dhts[3].self { t.Fatalf("got a provider, but not the right one. %s", p) } case <-ctxT.Done(): @@ -315,7 +269,7 @@ func TestLayeredGet(t *testing.T) { ctx := context.Background() - _, peers, dhts := setupDHTS(ctx, 4, t) + _, _, dhts := setupDHTS(ctx, 4, t) defer func() { for i := 0; i < 4; i++ { dhts[i].Close() @@ -323,22 +277,11 @@ func TestLayeredGet(t *testing.T) { } }() - err := dhts[0].Connect(ctx, peers[1]) - if err != nil { - t.Fatalf("Failed to connect: %s", err) - } + connect(t, ctx, dhts[0], dhts[1]) + connect(t, ctx, dhts[1], dhts[2]) + connect(t, ctx, dhts[1], dhts[3]) - err = dhts[1].Connect(ctx, peers[2]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[3]) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].putLocal(u.Key("/v/hello"), []byte("world")) + err := dhts[3].putLocal(u.Key("/v/hello"), []byte("world")) if err != nil { t.Fatal(err) } @@ -377,32 +320,21 @@ func TestFindPeer(t *testing.T) { } }() - err := dhts[0].Connect(ctx, peers[1]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[2]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[3]) - if err != nil { - t.Fatal(err) - } + connect(t, ctx, dhts[0], dhts[1]) + connect(t, ctx, dhts[1], dhts[2]) + connect(t, ctx, dhts[1], dhts[3]) ctxT, _ := context.WithTimeout(ctx, time.Second) - p, err := dhts[0].FindPeer(ctxT, peers[2].ID()) + p, err := dhts[0].FindPeer(ctxT, peers[2]) if err != nil { t.Fatal(err) } - if p == nil { + if p.ID == "" { t.Fatal("Failed to find peer.") } - if !p.ID().Equal(peers[2].ID()) { + if p.ID != peers[2] { t.Fatal("Didnt find expected peer.") } } @@ -426,25 +358,10 @@ func TestFindPeersConnectedToPeer(t *testing.T) { // topology: // 0-1, 1-2, 1-3, 2-3 - err := dhts[0].Connect(ctx, peers[1]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[2]) - if err != nil { - t.Fatal(err) - } - - err = dhts[1].Connect(ctx, peers[3]) - if err != nil { - t.Fatal(err) - } - - err = dhts[2].Connect(ctx, peers[3]) - if err != nil { - t.Fatal(err) - } + connect(t, ctx, dhts[0], dhts[1]) + connect(t, ctx, dhts[1], dhts[2]) + connect(t, ctx, dhts[1], dhts[3]) + connect(t, ctx, dhts[2], dhts[3]) // fmt.Println("0 is", peers[0]) // fmt.Println("1 is", peers[1]) @@ -452,13 +369,13 @@ func TestFindPeersConnectedToPeer(t *testing.T) { // fmt.Println("3 is", peers[3]) ctxT, _ := context.WithTimeout(ctx, time.Second) - pchan, err := dhts[0].FindPeersConnectedToPeer(ctxT, peers[2].ID()) + pchan, err := dhts[0].FindPeersConnectedToPeer(ctxT, peers[2]) if err != nil { t.Fatal(err) } - // shouldFind := []peer.Peer{peers[1], peers[3]} - found := []peer.Peer{} + // shouldFind := []peer.ID{peers[1], peers[3]} + found := []peer.PeerInfo{} for nextp := range pchan { found = append(found, nextp) } @@ -475,7 +392,7 @@ func TestFindPeersConnectedToPeer(t *testing.T) { } } -func testPeerListsMatch(t *testing.T, p1, p2 []peer.Peer) { +func testPeerListsMatch(t *testing.T, p1, p2 []peer.ID) { if len(p1) != len(p2) { t.Fatal("did not find as many peers as should have", p1, p2) @@ -485,11 +402,11 @@ func testPeerListsMatch(t *testing.T, p1, p2 []peer.Peer) { ids2 := make([]string, len(p2)) for i, p := range p1 { - ids1[i] = p.ID().Pretty() + ids1[i] = string(p) } for i, p := range p2 { - ids2[i] = p.ID().Pretty() + ids2[i] = string(p) } sort.Sort(sort.StringSlice(ids1)) @@ -514,39 +431,41 @@ func TestConnectCollision(t *testing.T) { ctx := context.Background() - addrA := randMultiaddr(t) - addrB := randMultiaddr(t) + addrA := testutil.RandLocalTCPAddress() + addrB := testutil.RandLocalTCPAddress() - peerA := makePeer(addrA) - peerB := makePeer(addrB) + dhtA := setupDHT(ctx, t, addrA) + dhtB := setupDHT(ctx, t, addrB) - dhtA := setupDHT(ctx, t, peerA) - dhtB := setupDHT(ctx, t, peerB) + peerA := dhtA.self + peerB := dhtB.self - done := make(chan struct{}) + errs := make(chan error) go func() { + dhtA.peerstore.AddAddress(peerB, addrB) err := dhtA.Connect(ctx, peerB) - if err != nil { - t.Fatal(err) - } - done <- struct{}{} + errs <- err }() go func() { + dhtB.peerstore.AddAddress(peerA, addrA) err := dhtB.Connect(ctx, peerA) - if err != nil { - t.Fatal(err) - } - done <- struct{}{} + errs <- err }() timeout := time.After(time.Second) select { - case <-done: + case e := <-errs: + if e != nil { + t.Fatal(e) + } case <-timeout: t.Fatal("Timeout received!") } select { - case <-done: + case e := <-errs: + if e != nil { + t.Fatal(e) + } case <-timeout: t.Fatal("Timeout received!") } @@ -555,7 +474,5 @@ func TestConnectCollision(t *testing.T) { dhtB.Close() dhtA.network.Close() dhtB.network.Close() - - <-time.After(200 * time.Millisecond) } } diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 82316e2e36..96d2b1a01b 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -32,12 +32,12 @@ func (di *diagInfo) Marshal() []byte { func (dht *IpfsDHT) getDiagInfo() *diagInfo { di := new(diagInfo) di.CodeVersion = "github.com/jbenet/go-ipfs" - di.ID = dht.self.ID() + di.ID = dht.self di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore for _, p := range dht.routingTable.ListPeers() { - d := connDiagInfo{p.GetLatency(), p.ID()} + d := connDiagInfo{dht.peerstore.LatencyEWMA(p), p} di.Connections = append(di.Connections, d) } return di diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index c7315d5387..04f5111a9c 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -4,19 +4,17 @@ import ( "math/rand" "testing" - crand "crypto/rand" - inet "github.com/jbenet/go-ipfs/net" mocknet "github.com/jbenet/go-ipfs/net/mock" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" - testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "time" ) @@ -34,8 +32,8 @@ func TestGetFailures(t *testing.T) { nets := mn.Nets() peers := mn.Peers() - ps := peer.NewPeerstore() - d := NewDHT(ctx, peers[0], ps, nets[0], ds.NewMapDatastore()) + tsds := dssync.MutexWrap(ds.NewMapDatastore()) + d := NewDHT(ctx, peers[0], nets[0], tsds) d.Update(ctx, peers[1]) // This one should time out @@ -126,14 +124,6 @@ func TestGetFailures(t *testing.T) { } } -// TODO: Maybe put these in some sort of "ipfs_testutil" package -func _randPeer() peer.Peer { - id := make(peer.ID, 16) - crand.Read(id) - p := testutil.NewPeerWithID(id) - return p -} - func TestNotFound(t *testing.T) { if testing.Short() { t.SkipNow() @@ -146,9 +136,8 @@ func TestNotFound(t *testing.T) { } nets := mn.Nets() peers := mn.Peers() - peerstore := peer.NewPeerstore() - - d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) + tsds := dssync.MutexWrap(ds.NewMapDatastore()) + d := NewDHT(ctx, peers[0], nets[0], tsds) for _, p := range peers { d.Update(ctx, p) @@ -156,6 +145,7 @@ func TestNotFound(t *testing.T) { // Reply with random peers to every message for _, neti := range nets { + neti := neti // shadow loop var neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { defer s.Close() @@ -171,12 +161,14 @@ func TestNotFound(t *testing.T) { case pb.Message_GET_VALUE: resp := &pb.Message{Type: pmes.Type} - ps := []peer.Peer{} + ps := []peer.PeerInfo{} for i := 0; i < 7; i++ { - ps = append(ps, peers[rand.Intn(len(peers))]) + p := peers[rand.Intn(len(peers))] + pi := neti.Peerstore().PeerInfo(p) + ps = append(ps, pi) } - resp.CloserPeers = pb.PeersToPBPeers(d.network, peers) + resp.CloserPeers = pb.PeerInfosToPBPeers(d.network, ps) if err := pbw.WriteMsg(resp); err != nil { panic(err) } @@ -216,9 +208,9 @@ func TestLessThanKResponses(t *testing.T) { } nets := mn.Nets() peers := mn.Peers() - peerstore := peer.NewPeerstore() - d := NewDHT(ctx, peers[0], peerstore, nets[0], ds.NewMapDatastore()) + tsds := dssync.MutexWrap(ds.NewMapDatastore()) + d := NewDHT(ctx, peers[0], nets[0], tsds) for i := 1; i < 5; i++ { d.Update(ctx, peers[i]) @@ -226,6 +218,7 @@ func TestLessThanKResponses(t *testing.T) { // Reply with random peers to every message for _, neti := range nets { + neti := neti // shadow loop var neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { defer s.Close() @@ -239,9 +232,10 @@ func TestLessThanKResponses(t *testing.T) { switch pmes.GetType() { case pb.Message_GET_VALUE: + pi := neti.Peerstore().PeerInfo(peers[1]) resp := &pb.Message{ Type: pmes.Type, - CloserPeers: pb.PeersToPBPeers(d.network, []peer.Peer{peers[1]}), + CloserPeers: pb.PeerInfosToPBPeers(d.network, []peer.PeerInfo{pi}), } if err := pbw.WriteMsg(resp); err != nil { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 4319ef0194..e9ffd7d7ff 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -17,7 +17,7 @@ import ( var CloserPeerCount = 4 // dhthandler specifies the signature of functions that handle DHT messages. -type dhtHandler func(context.Context, peer.Peer, *pb.Message) (*pb.Message, error) +type dhtHandler func(context.Context, peer.ID, *pb.Message) (*pb.Message, error) func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { switch t { @@ -38,16 +38,17 @@ func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { } } -func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) // setup response resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) - // first, is the key even a key? + // first, is there even a key? key := pmes.GetKey() if key == "" { return nil, errors.New("handleGetValue but no key was provided") + // TODO: send back an error response? could be bad, but the other node's hanging. } // let's first check if we have the value locally. @@ -85,36 +86,38 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.Peer, pmes *pb.Me // if we know any providers for the requested value, return those. provs := dht.providers.GetProviders(ctx, u.Key(pmes.GetKey())) + provinfos := peer.PeerInfos(dht.peerstore, provs) if len(provs) > 0 { log.Debugf("handleGetValue returning %d provider[s]", len(provs)) - resp.ProviderPeers = pb.PeersToPBPeers(dht.network, provs) + resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, provinfos) } // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeersToQuery(pmes, CloserPeerCount) + closerinfos := peer.PeerInfos(dht.peerstore, closer) if closer != nil { - for _, p := range closer { - log.Debugf("handleGetValue returning closer peer: '%s'", p) - if len(p.Addresses()) < 1 { - log.Critical("no addresses on peer being sent!") + for _, pi := range closerinfos { + log.Debugf("handleGetValue returning closer peer: '%s'", pi.ID) + if len(pi.Addrs) < 1 { + log.Criticalf(`no addresses on peer being sent! + [local:%s] + [sending:%s] + [remote:%s]`, dht.self, pi.ID, p) } } - resp.CloserPeers = pb.PeersToPBPeers(dht.network, closer) + + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, closerinfos) } return resp, nil } // Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { - dht.dslock.Lock() - defer dht.dslock.Unlock() +func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { dskey := u.Key(pmes.GetKey()).DsKey() - err := dht.verifyRecord(pmes.GetRecord()) - if err != nil { - fmt.Println(u.Key(pmes.GetRecord().GetAuthor())) - log.Error("Bad dht record in put request") + if err := dht.verifyRecordLocally(pmes.GetRecord()); err != nil { + log.Errorf("Bad dht record in PUT from: %s. %s", u.Key(pmes.GetRecord().GetAuthor()), err) return nil, err } @@ -128,18 +131,18 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.Peer, pmes *pb.Me return pmes, err } -func (dht *IpfsDHT) handlePing(_ context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handlePing(_ context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s Responding to ping from %s!\n", dht.self, p) return pmes, nil } -func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { resp := pb.NewMessage(pmes.GetType(), "", pmes.GetClusterLevel()) - var closest []peer.Peer + var closest []peer.ID // if looking for self... special case where we send it on CloserPeers. - if peer.ID(pmes.GetKey()).Equal(dht.self.ID()) { - closest = []peer.Peer{dht.self} + if peer.ID(pmes.GetKey()) == dht.self { + closest = []peer.ID{dht.self} } else { closest = dht.betterPeersToQuery(pmes, CloserPeerCount) } @@ -149,22 +152,20 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.Peer, pmes *pb.Me return resp, nil } - var withAddresses []peer.Peer - for _, p := range closest { - if len(p.Addresses()) > 0 { - withAddresses = append(withAddresses, p) + var withAddresses []peer.PeerInfo + closestinfos := peer.PeerInfos(dht.peerstore, closest) + for _, pi := range closestinfos { + if len(pi.Addrs) > 0 { + withAddresses = append(withAddresses, pi) + log.Debugf("handleFindPeer: sending back '%s'", pi.ID) } } - for _, p := range withAddresses { - log.Debugf("handleFindPeer: sending back '%s'", p) - } - - resp.CloserPeers = pb.PeersToPBPeers(dht.network, withAddresses) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, withAddresses) return resp, nil } -func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // check if we have this value, to add ourselves as provider. @@ -183,13 +184,15 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.Peer, pmes *p } if providers != nil && len(providers) > 0 { - resp.ProviderPeers = pb.PeersToPBPeers(dht.network, providers) + infos := peer.PeerInfos(dht.peerstore, providers) + resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, infos) } // Also send closer peers. closer := dht.betterPeersToQuery(pmes, CloserPeerCount) if closer != nil { - resp.CloserPeers = pb.PeersToPBPeers(dht.network, closer) + infos := peer.PeerInfos(dht.peerstore, providers) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, infos) } return resp, nil @@ -197,34 +200,35 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.Peer, pmes *p type providerInfo struct { Creation time.Time - Value peer.Peer + Value peer.ID } -func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.Peer, pmes *pb.Message) (*pb.Message, error) { +func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { key := u.Key(pmes.GetKey()) log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) // add provider should use the address given in the message - for _, pb := range pmes.GetProviderPeers() { - pid := peer.ID(pb.GetId()) - if pid.Equal(p.ID()) { - - maddrs, err := pb.Addresses() - if err != nil { - log.Errorf("provider %s error with addresses %s", p, pb.Addrs) - continue - } + pinfos := pb.PBPeersToPeerInfos(pmes.GetProviderPeers()) + for _, pi := range pinfos { + if pi.ID != p { + // we should ignore this provider reccord! not from originator. + // (we chould sign them and check signature later...) + log.Errorf("handleAddProvider received provider %s from %s. Ignore.", pi.ID, p) + continue + } - log.Infof("received provider %s %s for %s", p, maddrs, key) - for _, maddr := range maddrs { - p.AddAddress(maddr) - } - dht.providers.AddProvider(key, p) + if len(pi.Addrs) < 1 { + log.Errorf("got no valid addresses for provider %s. Ignore.", p) + continue + } - } else { - log.Errorf("handleAddProvider received provider %s from %s", pid, p) + log.Infof("received provider %s for %s (addrs: %s)", p, key, pi.Addrs) + for _, maddr := range pi.Addrs { + // add the received addresses to our peerstore. + dht.peerstore.AddAddress(p, maddr) } + dht.providers.AddProvider(key, p) } return pmes, nil // send back same msg as confirmation. diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index e102ef7d3c..09db3d5f91 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -182,7 +182,7 @@ type Message_Peer struct { // ID of a given peer. Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` // multiaddrs for a given peer - Addrs []string `protobuf:"bytes,2,rep,name=addrs" json:"addrs,omitempty"` + Addrs [][]byte `protobuf:"bytes,2,rep,name=addrs" json:"addrs,omitempty"` // used to signal the sender's connection capabilities to the peer Connection *Message_ConnectionType `protobuf:"varint,3,opt,name=connection,enum=dht.pb.Message_ConnectionType" json:"connection,omitempty"` XXX_unrecognized []byte `json:"-"` @@ -199,7 +199,7 @@ func (m *Message_Peer) GetId() string { return "" } -func (m *Message_Peer) GetAddrs() []string { +func (m *Message_Peer) GetAddrs() [][]byte { if m != nil { return m.Addrs } diff --git a/routing/dht/pb/dht.proto b/routing/dht/pb/dht.proto index 6f31dd5e3a..91c8d8e043 100644 --- a/routing/dht/pb/dht.proto +++ b/routing/dht/pb/dht.proto @@ -32,7 +32,7 @@ message Message { optional string id = 1; // multiaddrs for a given peer - repeated string addrs = 2; + repeated bytes addrs = 2; // used to signal the sender's connection capabilities to the peer optional ConnectionType connection = 3; diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index c5c4afea7a..570c7cf189 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -1,15 +1,15 @@ package dht_pb import ( - "errors" - "fmt" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) +var log = eventlog.Logger("dht.pb") + // NewMessage constructs a new dht message with given type, key, and level func NewMessage(typ Message_MessageType, key string, level int) *Message { m := &Message{ @@ -20,43 +20,32 @@ func NewMessage(typ Message_MessageType, key string, level int) *Message { return m } -func peerToPBPeer(p peer.Peer) *Message_Peer { +func peerInfoToPBPeer(p peer.PeerInfo) *Message_Peer { pbp := new(Message_Peer) - maddrs := p.Addresses() - pbp.Addrs = make([]string, len(maddrs)) - for i, maddr := range maddrs { - pbp.Addrs[i] = maddr.String() + pbp.Addrs = make([][]byte, len(p.Addrs)) + for i, maddr := range p.Addrs { + pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed. } - pid := string(p.ID()) - pbp.Id = &pid + s := string(p.ID) + pbp.Id = &s return pbp } -// PBPeerToPeer turns a *Message_Peer into its peer.Peer counterpart -func PBPeerToPeer(ps peer.Peerstore, pbp *Message_Peer) (peer.Peer, error) { - p, err := ps.FindOrCreate(peer.ID(pbp.GetId())) - if err != nil { - return nil, fmt.Errorf("Failed to get peer from peerstore: %s", err) - } - - // add addresses - maddrs, err := pbp.Addresses() - if err != nil { - return nil, fmt.Errorf("Received peer with bad or missing addresses: %s", pbp.Addrs) +// PBPeerToPeer turns a *Message_Peer into its peer.PeerInfo counterpart +func PBPeerToPeerInfo(pbp *Message_Peer) peer.PeerInfo { + return peer.PeerInfo{ + ID: peer.ID(pbp.GetId()), + Addrs: pbp.Addresses(), } - for _, maddr := range maddrs { - p.AddAddress(maddr) - } - return p, nil } -// RawPeersToPBPeers converts a slice of Peers into a slice of *Message_Peers, +// RawPeerInfosToPBPeers converts a slice of Peers into a slice of *Message_Peers, // ready to go out on the wire. -func RawPeersToPBPeers(peers []peer.Peer) []*Message_Peer { +func RawPeerInfosToPBPeers(peers []peer.PeerInfo) []*Message_Peer { pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { - pbpeers[i] = peerToPBPeer(p) + pbpeers[i] = peerInfoToPBPeer(p) } return pbpeers } @@ -64,49 +53,42 @@ func RawPeersToPBPeers(peers []peer.Peer) []*Message_Peer { // PeersToPBPeers converts given []peer.Peer into a set of []*Message_Peer, // which can be written to a message and sent out. the key thing this function // does (in addition to PeersToPBPeers) is set the ConnectionType with -// information from the given inet.Dialer. -func PeersToPBPeers(d inet.Network, peers []peer.Peer) []*Message_Peer { - pbps := RawPeersToPBPeers(peers) +// information from the given inet.Network. +func PeerInfosToPBPeers(n inet.Network, peers []peer.PeerInfo) []*Message_Peer { + pbps := RawPeerInfosToPBPeers(peers) for i, pbp := range pbps { - c := ConnectionType(d.Connectedness(peers[i])) + c := ConnectionType(n.Connectedness(peers[i].ID)) pbp.Connection = &c } return pbps } -// PBPeersToPeers converts given []*Message_Peer into a set of []peer.Peer -// Returns two slices, one of peers, and one of errors. The slice of peers -// will ONLY contain successfully converted peers. The slice of errors contains -// whether each input Message_Peer was successfully converted. -func PBPeersToPeers(ps peer.Peerstore, pbps []*Message_Peer) ([]peer.Peer, []error) { - errs := make([]error, len(pbps)) - peers := make([]peer.Peer, 0, len(pbps)) - for i, pbp := range pbps { - p, err := PBPeerToPeer(ps, pbp) - if err != nil { - errs[i] = err - } else { - peers = append(peers, p) - } +// PBPeersToPeerInfos converts given []*Message_Peer into []peer.PeerInfo +// Invalid addresses will be silently omitted. +func PBPeersToPeerInfos(pbps []*Message_Peer) []peer.PeerInfo { + peers := make([]peer.PeerInfo, 0, len(pbps)) + for _, pbp := range pbps { + peers = append(peers, PBPeerToPeerInfo(pbp)) } - return peers, errs + return peers } // Addresses returns a multiaddr associated with the Message_Peer entry -func (m *Message_Peer) Addresses() ([]ma.Multiaddr, error) { +func (m *Message_Peer) Addresses() []ma.Multiaddr { if m == nil { - return nil, errors.New("MessagePeer is nil") + return nil } var err error maddrs := make([]ma.Multiaddr, len(m.Addrs)) for i, addr := range m.Addrs { - maddrs[i], err = ma.NewMultiaddr(addr) + maddrs[i], err = ma.NewMultiaddrBytes(addr) if err != nil { - return nil, err + log.Error("error decoding Multiaddr for peer: %s", m.GetId()) + continue } } - return maddrs, nil + return maddrs } // GetClusterLevel gets and adjusts the cluster level on the message. diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 928b3fa329..861c25f0c3 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -23,12 +23,12 @@ type ProviderManager struct { type addProv struct { k u.Key - val peer.Peer + val peer.ID } type getProv struct { k u.Key - resp chan []peer.Peer + resp chan []peer.ID } func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { @@ -53,7 +53,7 @@ func (pm *ProviderManager) run() { for { select { case np := <-pm.newprovs: - if np.val.ID().Equal(pm.lpeer) { + if np.val == pm.lpeer { pm.local[np.k] = struct{}{} } pi := new(providerInfo) @@ -63,7 +63,7 @@ func (pm *ProviderManager) run() { pm.providers[np.k] = append(arr, pi) case gp := <-pm.getprovs: - var parr []peer.Peer + var parr []peer.ID provs := pm.providers[gp.k] for _, p := range provs { parr = append(parr, p.Value) @@ -94,17 +94,17 @@ func (pm *ProviderManager) run() { } } -func (pm *ProviderManager) AddProvider(k u.Key, val peer.Peer) { +func (pm *ProviderManager) AddProvider(k u.Key, val peer.ID) { pm.newprovs <- &addProv{ k: k, val: val, } } -func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.Peer { +func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.ID { gp := &getProv{ k: k, - resp: make(chan []peer.Peer, 1), // buffered to prevent sender from blocking + resp: make(chan []peer.ID, 1), // buffered to prevent sender from blocking } select { case <-ctx.Done(): diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 7d8aaa304b..35ff92dfe6 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -3,9 +3,8 @@ package dht import ( "testing" - "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" - testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) @@ -15,7 +14,7 @@ func TestProviderManager(t *testing.T) { mid := peer.ID("testing") p := NewProviderManager(ctx, mid) a := u.Key("test") - p.AddProvider(a, testutil.NewPeerWithIDString("testingprovider")) + p.AddProvider(a, peer.ID("testingprovider")) resp := p.GetProviders(ctx, a) if len(resp) != 1 { t.Fatal("Could not retrieve provider.") diff --git a/routing/dht/query.go b/routing/dht/query.go index f4e43132da..1321b51930 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -31,10 +31,10 @@ type dhtQuery struct { } type dhtQueryResult struct { - value []byte // GetValue - peer peer.Peer // FindPeer - providerPeers []peer.Peer // GetProviders - closerPeers []peer.Peer // * + value []byte // GetValue + peer peer.PeerInfo // FindPeer + providerPeers []peer.PeerInfo // GetProviders + closerPeers []peer.PeerInfo // * success bool } @@ -53,10 +53,10 @@ func newQuery(k u.Key, d inet.Dialer, f queryFunc) *dhtQuery { // - the value // - a list of peers potentially better able to serve the query // - an error -type queryFunc func(context.Context, peer.Peer) (*dhtQueryResult, error) +type queryFunc func(context.Context, peer.ID) (*dhtQueryResult, error) // Run runs the query at hand. pass in a list of peers to use first. -func (q *dhtQuery) Run(ctx context.Context, peers []peer.Peer) (*dhtQueryResult, error) { +func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { runner := newQueryRunner(ctx, q) return runner.Run(peers) } @@ -70,7 +70,7 @@ type dhtQueryRunner struct { peersToQuery *queue.ChanQueue // peersSeen are all the peers queried. used to prevent querying same peer 2x - peersSeen peer.Map + peersSeen peer.Set // rateLimit is a channel used to rate limit our processing (semaphore) rateLimit chan struct{} @@ -101,12 +101,12 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { query: q, peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(q.key)), peersRemaining: todoctr.NewSyncCounter(), - peersSeen: peer.Map{}, + peersSeen: peer.Set{}, rateLimit: make(chan struct{}, q.concurrency), } } -func (r *dhtQueryRunner) Run(peers []peer.Peer) (*dhtQueryResult, error) { +func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { log.Debugf("Run query with %d peers.", len(peers)) if len(peers) == 0 { log.Warning("Running query with no peers!") @@ -120,7 +120,7 @@ func (r *dhtQueryRunner) Run(peers []peer.Peer) (*dhtQueryResult, error) { // add all the peers we got first. for _, p := range peers { - r.addPeerToQuery(p, nil) // don't have access to self here... + r.addPeerToQuery(p, "") // don't have access to self here... } // go do this thing. @@ -154,31 +154,30 @@ func (r *dhtQueryRunner) Run(peers []peer.Peer) (*dhtQueryResult, error) { return nil, err } -func (r *dhtQueryRunner) addPeerToQuery(next peer.Peer, benchmark peer.Peer) { - if next == nil { - // wtf why are peers nil?!? - log.Error("Query getting nil peers!!!\n") - return - } - +func (r *dhtQueryRunner) addPeerToQuery(next peer.ID, benchmark peer.ID) { // if new peer is ourselves... - if next.ID().Equal(r.query.dialer.LocalPeer().ID()) { + if next == r.query.dialer.LocalPeer() { return } // if new peer further away than whom we got it from, don't bother (loops) - if benchmark != nil && kb.Closer(benchmark.ID(), next.ID(), r.query.key) { + // TODO----------- this benchmark should be replaced by a heap: + // we should be doing the s/kademlia "continue to search" + // (i.e. put all of them in a heap sorted by dht distance and then just + // pull from the the top until a) you exhaust all peers you get, + // b) you succeed, c) your context expires. + if benchmark != "" && kb.Closer(benchmark, next, r.query.key) { return } // if already seen, no need. r.Lock() - _, found := r.peersSeen[next.Key()] + _, found := r.peersSeen[next] if found { r.Unlock() return } - r.peersSeen[next.Key()] = next + r.peersSeen[next] = struct{}{} r.Unlock() log.Debugf("adding peer to query: %v\n", next) @@ -211,7 +210,7 @@ func (r *dhtQueryRunner) spawnWorkers() { } } -func (r *dhtQueryRunner) queryPeer(p peer.Peer) { +func (r *dhtQueryRunner) queryPeer(p peer.ID) { log.Debugf("spawned worker for: %v", p) // make sure we rate limit concurrency. @@ -234,7 +233,6 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { }() // make sure we're connected to the peer. - // (Incidentally, this will add it to the peerstore too) err := r.query.dialer.DialPeer(r.ctx, p) if err != nil { log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) @@ -263,7 +261,9 @@ func (r *dhtQueryRunner) queryPeer(p peer.Peer) { } else if res.closerPeers != nil { log.Debugf("PEERS CLOSER -- worker for: %v", p) for _, next := range res.closerPeers { - r.addPeerToQuery(next, p) + // add their addresses to the dialer's peerstore + r.query.dialer.Peerstore().AddAddresses(next.ID, next.Addrs) + r.addPeerToQuery(next.ID, p) } } } diff --git a/routing/dht/records.go b/routing/dht/records.go index 1f284ed990..cf383916b1 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -3,15 +3,17 @@ package dht import ( "bytes" "errors" + "fmt" "strings" - "time" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ci "github.com/jbenet/go-ipfs/crypto" "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" + ctxutil "github.com/jbenet/go-ipfs/util/ctx" ) // ValidatorFunc is a function that is called to validate a given @@ -26,64 +28,163 @@ var ErrBadRecord = errors.New("bad dht record") // is not found in the Validator map of the DHT. var ErrInvalidRecordType = errors.New("invalid record keytype") +// KeyForPublicKey returns the key used to retrieve public keys +// from the dht. +func KeyForPublicKey(id peer.ID) u.Key { + return u.Key("/pk/" + string(id)) +} + +// RecordBlobForSig returns the blob protected by the record signature +func RecordBlobForSig(r *pb.Record) []byte { + k := []byte(r.GetKey()) + v := []byte(r.GetValue()) + a := []byte(r.GetAuthor()) + return bytes.Join([][]byte{k, v, a}, []byte{}) +} + // creates and signs a dht record for the given key/value pair func (dht *IpfsDHT) makePutRecord(key u.Key, value []byte) (*pb.Record, error) { record := new(pb.Record) record.Key = proto.String(string(key)) record.Value = value - record.Author = proto.String(string(dht.self.ID())) - blob := bytes.Join([][]byte{[]byte(key), value, []byte(dht.self.ID())}, []byte{}) - sig, err := dht.self.PrivKey().Sign(blob) + record.Author = proto.String(string(dht.self)) + blob := RecordBlobForSig(record) + + sk := dht.peerstore.PrivKey(dht.self) + if sk == nil { + log.Errorf("%s dht cannot get own private key!", dht.self) + return nil, fmt.Errorf("cannot get private key to sign record!") + } + + sig, err := sk.Sign(blob) if err != nil { return nil, err } + record.Signature = sig return record, nil } -func (dht *IpfsDHT) getPublicKey(pid peer.ID) (ci.PubKey, error) { - log.Debug("getPublicKey for: %s", pid) - p, err := dht.peerstore.FindOrCreate(pid) - if err == nil { - return p.PubKey(), nil +func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKey, error) { + log.Debugf("getPublicKey for: %s", p) + + // check locally. + pk := dht.peerstore.PubKey(p) + if pk != nil { + return pk, nil + } + + // ok, try the node itself. if they're overwhelmed or slow we can move on. + ctxT, _ := ctxutil.WithDeadlineFraction(ctx, 0.3) + if pk, err := dht.getPublicKeyFromNode(ctx, p); err == nil { + return pk, nil } - log.Debug("not in peerstore, searching dht.") - ctxT, _ := context.WithTimeout(dht.ContextGroup.Context(), time.Second*5) - val, err := dht.GetValue(ctxT, u.Key("/pk/"+string(pid))) + // last ditch effort: let's try the dht. + log.Debugf("pk for %s not in peerstore, and peer failed. trying dht.", p) + pkkey := KeyForPublicKey(p) + + // ok, try the node itself. if they're overwhelmed or slow we can move on. + val, err := dht.GetValue(ctxT, pkkey) if err != nil { log.Warning("Failed to find requested public key.") return nil, err } - pubkey, err := ci.UnmarshalPublicKey(val) + pk, err = ci.UnmarshalPublicKey(val) if err != nil { log.Errorf("Failed to unmarshal public key: %s", err) return nil, err } - return pubkey, nil + return pk, nil } -func (dht *IpfsDHT) verifyRecord(r *pb.Record) error { +func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.PubKey, error) { + + // check locally, just in case... + pk := dht.peerstore.PubKey(p) + if pk != nil { + return pk, nil + } + + pkkey := KeyForPublicKey(p) + pmes, err := dht.getValueSingle(ctx, p, pkkey) + if err != nil { + return nil, err + } + + // node doesn't have key :( + record := pmes.GetRecord() + if record == nil { + return nil, fmt.Errorf("node not responding with its public key: %s", p) + } + + // Success! We were given the value. we don't need to check + // validity because a) we can't. b) we know the hash of the + // key we're looking for. + val := record.GetValue() + log.Debug("dht got a value from other peer.") + + pk, err = ci.UnmarshalPublicKey(val) + if err != nil { + return nil, err + } + + id, err := peer.IDFromPublicKey(pk) + if err != nil { + return nil, err + } + if id != p { + return nil, fmt.Errorf("public key does not match id: %s", p) + } + + // ok! it's valid. we got it! + log.Debugf("dht got public key from node itself.") + return pk, nil +} + +// verifyRecordLocally attempts to verify a record. if we do not have the public +// key, we fail. we do not search the dht. +func (dht *IpfsDHT) verifyRecordLocally(r *pb.Record) error { + // First, validate the signature - p, err := dht.peerstore.FindOrCreate(peer.ID(r.GetAuthor())) + p := peer.ID(r.GetAuthor()) + pk := dht.peerstore.PubKey(p) + if pk == nil { + return fmt.Errorf("do not have public key for %s", p) + } + + return dht.verifyRecord(r, pk) +} + +// verifyRecordOnline verifies a record, searching the DHT for the public key +// if necessary. The reason there is a distinction in the functions is that +// retrieving arbitrary public keys from the DHT as a result of passively +// receiving records (e.g. through a PUT_VALUE or ADD_PROVIDER) can cause a +// massive amplification attack on the dht. Use with care. +func (dht *IpfsDHT) verifyRecordOnline(ctx context.Context, r *pb.Record) error { + + // get the public key, search for it if necessary. + p := peer.ID(r.GetAuthor()) + pk, err := dht.getPublicKeyOnline(ctx, p) if err != nil { return err } - k := u.Key(r.GetKey()) - blob := bytes.Join([][]byte{[]byte(k), - r.GetValue(), - []byte(r.GetAuthor())}, []byte{}) + return dht.verifyRecord(r, pk) +} - ok, err := p.PubKey().Verify(blob, r.GetSignature()) +func (dht *IpfsDHT) verifyRecord(r *pb.Record, pk ci.PubKey) error { + // First, validate the signature + blob := RecordBlobForSig(r) + ok, err := pk.Verify(blob, r.GetSignature()) if err != nil { log.Error("Signature verify failed.") return err } - if !ok { + log.Error("dht found a forged record! (ignored)") return ErrBadRecord } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 51f15ff21b..9a0620581c 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -41,7 +41,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) - query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { log.Debugf("%s PutValue qry part %v", dht.self, p) err := dht.putValueToNetwork(ctx, p, string(key), rec) if err != nil { @@ -61,7 +61,6 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { log.Debugf("Get Value [%s]", key) // If we have it local, dont bother doing an RPC! - // NOTE: this might not be what we want to do... val, err := dht.getLocal(key) if err == nil { log.Debug("Got value locally!") @@ -76,7 +75,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // setup the Query - query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { val, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { @@ -131,14 +130,14 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { // FindProvidersAsync is the same thing as FindProviders, but returns a channel. // Peers will be returned on the channel as soon as they are found, even before // the search query completes. -func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.Peer { +func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.PeerInfo { log.Event(ctx, "findProviders", &key) - peerOut := make(chan peer.Peer, count) + peerOut := make(chan peer.PeerInfo, count) go dht.findProvidersAsyncRoutine(ctx, key, count, peerOut) return peerOut } -func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.Peer) { +func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { defer close(peerOut) ps := pset.NewLimited(count) @@ -147,7 +146,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // NOTE: assuming that this list of peers is unique if ps.TryAdd(p) { select { - case peerOut <- p: + case peerOut <- dht.peerstore.PeerInfo(p): case <-ctx.Done(): return } @@ -160,23 +159,18 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } // setup the Query - query := newQuery(key, dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { return nil, err } - provs, errs := pb.PBPeersToPeers(dht.peerstore, pmes.GetProviderPeers()) - for _, err := range errs { - if err != nil { - log.Warning(err) - } - } + provs := pb.PBPeersToPeerInfos(pmes.GetProviderPeers()) // Add unique providers from request, up to 'count' for _, prov := range provs { - if ps.TryAdd(prov) { + if ps.TryAdd(prov.ID) { select { case peerOut <- prov: case <-ctx.Done(): @@ -191,13 +185,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // Give closer peers back to the query to be queried closer := pmes.GetCloserPeers() - clpeers, errs := pb.PBPeersToPeers(dht.peerstore, closer) - for _, err := range errs { - if err != nil { - log.Warning(err) - } - } - + clpeers := pb.PBPeersToPeerInfos(closer) return &dhtQueryResult{closerPeers: clpeers}, nil }) @@ -208,62 +196,58 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } } -func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *pset.PeerSet, count int, out chan peer.Peer) { +func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *pset.PeerSet, count int, out chan peer.PeerInfo) { var wg sync.WaitGroup - for _, pbp := range peers { + peerInfos := pb.PBPeersToPeerInfos(peers) + for _, pi := range peerInfos { wg.Add(1) - go func(mp *pb.Message_Peer) { + go func(pi peer.PeerInfo) { defer wg.Done() - // construct new peer - p, err := dht.ensureConnectedToPeer(ctx, mp) - if err != nil { + + p := pi.ID + if err := dht.ensureConnectedToPeer(ctx, p); err != nil { log.Errorf("%s", err) return } - if p == nil { - log.Error("Got nil peer from ensureConnectedToPeer") - return - } dht.providers.AddProvider(k, p) if ps.TryAdd(p) { select { - case out <- p: + case out <- pi: case <-ctx.Done(): return } } else if ps.Size() >= count { return } - }(pbp) + }(pi) } wg.Wait() } // FindPeer searches for a peer with given ID. -func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) { +func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { // Check if were already connected to them - p, _ := dht.FindLocal(id) - if p != nil { - return p, nil + if pi, _ := dht.FindLocal(id); pi.ID != "" { + return pi, nil } closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if closest == nil || len(closest) == 0 { - return nil, kb.ErrLookupFailure + return peer.PeerInfo{}, kb.ErrLookupFailure } // Sanity... for _, p := range closest { - if p.ID().Equal(id) { + if p == id { log.Error("Found target peer in list of closest peers...") - return p, nil + return dht.peerstore.PeerInfo(p), nil } } // setup the Query - query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { @@ -271,45 +255,40 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.Peer, error) } closer := pmes.GetCloserPeers() - clpeers, errs := pb.PBPeersToPeers(dht.peerstore, closer) - for _, err := range errs { - if err != nil { - log.Warning(err) - } - } + clpeerInfos := pb.PBPeersToPeerInfos(closer) // see it we got the peer here - for _, np := range clpeers { - if string(np.ID()) == string(id) { + for _, npi := range clpeerInfos { + if npi.ID == id { return &dhtQueryResult{ - peer: np, + peer: npi, success: true, }, nil } } - return &dhtQueryResult{closerPeers: clpeers}, nil + return &dhtQueryResult{closerPeers: clpeerInfos}, nil }) // run it! result, err := query.Run(ctx, closest) if err != nil { - return nil, err + return peer.PeerInfo{}, err } log.Debugf("FindPeer %v %v", id, result.success) - if result.peer == nil { - return nil, routing.ErrNotFound + if result.peer.ID == "" { + return peer.PeerInfo{}, routing.ErrNotFound } return result.peer, nil } // FindPeersConnectedToPeer searches for peers directly connected to a given peer. -func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan peer.Peer, error) { +func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan peer.PeerInfo, error) { - peerchan := make(chan peer.Peer, asyncQueryBuffer) - peersSeen := map[string]peer.Peer{} + peerchan := make(chan peer.PeerInfo, asyncQueryBuffer) + peersSeen := peer.Set{} closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if closest == nil || len(closest) == 0 { @@ -317,42 +296,37 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< } // setup the Query - query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.Peer) (*dhtQueryResult, error) { + query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { return nil, err } - var clpeers []peer.Peer + var clpeers []peer.PeerInfo closer := pmes.GetCloserPeers() for _, pbp := range closer { - // skip peers already seen - if _, found := peersSeen[string(pbp.GetId())]; found { - continue - } + pi := pb.PBPeerToPeerInfo(pbp) - // skip peers that fail to unmarshal - p, err := pb.PBPeerToPeer(dht.peerstore, pbp) - if err != nil { - log.Warning(err) + // skip peers already seen + if _, found := peersSeen[pi.ID]; found { continue } + peersSeen[pi.ID] = struct{}{} // if peer is connected, send it to our client. if pb.Connectedness(*pbp.Connection) == inet.Connected { select { case <-ctx.Done(): return nil, ctx.Err() - case peerchan <- p: + case peerchan <- pi: } } - peersSeen[string(p.ID())] = p - // if peer is the peer we're looking for, don't bother querying it. + // TODO maybe query it? if pb.Connectedness(*pbp.Connection) != inet.Connected { - clpeers = append(clpeers, p) + clpeers = append(clpeers, pi) } } @@ -374,7 +348,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< } // Ping a peer, log the time it took -func (dht *IpfsDHT) Ping(ctx context.Context, p peer.Peer) error { +func (dht *IpfsDHT) Ping(ctx context.Context, p peer.ID) error { // Thoughts: maybe this should accept an ID and do a peer lookup? log.Debugf("ping %s start", p) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 51f524971f..2fa5586db0 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -23,7 +23,7 @@ func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { - if e.Value.(peer.Peer).ID().Equal(id) { + if e.Value.(peer.ID) == id { return e } } @@ -36,18 +36,18 @@ func (b *Bucket) moveToFront(e *list.Element) { b.lk.Unlock() } -func (b *Bucket) pushFront(p peer.Peer) { +func (b *Bucket) pushFront(p peer.ID) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) popBack() peer.Peer { +func (b *Bucket) popBack() peer.ID { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() b.list.Remove(last) - return last.Value.(peer.Peer) + return last.Value.(peer.ID) } func (b *Bucket) len() int { @@ -68,7 +68,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { newbuck.list = out e := b.list.Front() for e != nil { - peerID := ConvertPeerID(e.Value.(peer.Peer).ID()) + peerID := ConvertPeerID(e.Value.(peer.ID)) peerCPL := commonPrefixLen(peerID, target) if peerCPL > cpl { cur := e diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index c144c191ed..da4c6e720e 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -23,6 +23,9 @@ type RoutingTable struct { // Blanket lock, refine later for better performance tabLock sync.RWMutex + // latency metrics + metrics peer.Metrics + // Maximum acceptable latency for peers in this cluster maxLatency time.Duration @@ -32,21 +35,22 @@ type RoutingTable struct { } // NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. -func NewRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { +func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peer.Metrics) *RoutingTable { rt := new(RoutingTable) rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize rt.local = localID rt.maxLatency = latency + rt.metrics = m return rt } // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned -func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { +func (rt *RoutingTable) Update(p peer.ID) peer.ID { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peerID := ConvertPeerID(p.ID()) + peerID := ConvertPeerID(p) cpl := commonPrefixLen(peerID, rt.local) bucketID := cpl @@ -55,12 +59,12 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { } bucket := rt.Buckets[bucketID] - e := bucket.find(p.ID()) + e := bucket.find(p) if e == nil { // New peer, add to bucket - if p.GetLatency() > rt.maxLatency { + if rt.metrics.LatencyEWMA(p) > rt.maxLatency { // Connection doesnt meet requirements, skip! - return nil + return "" } bucket.pushFront(p) @@ -75,16 +79,16 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { return bucket.popBack() } } - return nil + return "" } // If the peer is already in the table, move it to the front. // This signifies that it it "more active" and the less active nodes // Will as a result tend towards the back of the list bucket.moveToFront(e) - return nil + return "" } -func (rt *RoutingTable) nextBucket() peer.Peer { +func (rt *RoutingTable) nextBucket() peer.ID { bucket := rt.Buckets[len(rt.Buckets)-1] newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) rt.Buckets = append(rt.Buckets, newBucket) @@ -96,12 +100,12 @@ func (rt *RoutingTable) nextBucket() peer.Peer { if bucket.len() > rt.bucketsize { return bucket.popBack() } - return nil + return "" } // A helper struct to sort peers by their distance to the local node type peerDistance struct { - p peer.Peer + p peer.ID distance ID } @@ -118,8 +122,8 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(peer.Peer) - pID := ConvertPeerID(p.ID()) + p := e.Value.(peer.ID) + pID := ConvertPeerID(p) pd := peerDistance{ p: p, distance: xor(target, pID), @@ -134,27 +138,27 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } // Find a specific peer by ID or return nil -func (rt *RoutingTable) Find(id peer.ID) peer.Peer { +func (rt *RoutingTable) Find(id peer.ID) peer.ID { srch := rt.NearestPeers(ConvertPeerID(id), 1) - if len(srch) == 0 || !srch[0].ID().Equal(id) { - return nil + if len(srch) == 0 || srch[0] != id { + return "" } return srch[0] } // NearestPeer returns a single peer that is nearest to the given ID -func (rt *RoutingTable) NearestPeer(id ID) peer.Peer { +func (rt *RoutingTable) NearestPeer(id ID) peer.ID { peers := rt.NearestPeers(id, 1) if len(peers) > 0 { return peers[0] } log.Errorf("NearestPeer: Returning nil, table size = %d", rt.Size()) - return nil + return "" } // NearestPeers returns a list of the 'count' closest peers to the given ID -func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.Peer { +func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { rt.tabLock.RLock() defer rt.tabLock.RUnlock() cpl := commonPrefixLen(id, rt.local) @@ -186,7 +190,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.Peer { // Sort by distance to local peer sort.Sort(peerArr) - var out []peer.Peer + var out []peer.ID for i := 0; i < count && i < peerArr.Len(); i++ { out = append(out, peerArr[i].p) } @@ -205,11 +209,11 @@ func (rt *RoutingTable) Size() int { // ListPeers takes a RoutingTable and returns a list of all peers from all buckets in the table. // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) ListPeers() []peer.Peer { - var peers []peer.Peer +func (rt *RoutingTable) ListPeers() []peer.ID { + var peers []peer.ID for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { - peers = append(peers, e.Value.(peer.Peer)) + peers = append(peers, e.Value.(peer.ID)) } } return peers @@ -221,6 +225,6 @@ func (rt *RoutingTable) Print() { rt.tabLock.RLock() peers := rt.ListPeers() for i, p := range peers { - fmt.Printf("%d) %s %s\n", i, p.ID().Pretty(), p.GetLatency().String()) + fmt.Printf("%d) %s %s\n", i, p.Pretty(), rt.metrics.LatencyEWMA(p).String()) } } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 85fc387e2d..db93ddf860 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -1,8 +1,6 @@ package kbucket import ( - crand "crypto/rand" - "crypto/sha256" "math/rand" "testing" "time" @@ -12,37 +10,29 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) -func RandID() ID { - buf := make([]byte, 16) - crand.Read(buf) - - hash := sha256.Sum256(buf) - return ID(hash[:]) -} - // Test basic features of the bucket struct func TestBucket(t *testing.T) { b := newBucket() - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 100; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) b.pushFront(peers[i]) } - local := tu.RandPeer() - localID := ConvertPeerID(local.ID()) + local := tu.RandPeerIDFatal(t) + localID := ConvertPeerID(local) i := rand.Intn(len(peers)) - e := b.find(peers[i].ID()) + e := b.find(peers[i]) if e == nil { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, ConvertPeerID(local.ID())) + spl := b.Split(0, ConvertPeerID(local)) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(peer.Peer).ID()) + p := ConvertPeerID(e.Value.(peer.ID)) cpl := commonPrefixLen(p, localID) if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") @@ -51,7 +41,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(peer.Peer).ID()) + p := ConvertPeerID(e.Value.(peer.ID)) cpl := commonPrefixLen(p, localID) if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") @@ -61,24 +51,25 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { - local := tu.RandPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) + local := tu.RandPeerIDFatal(t) + m := peer.NewMetrics() + rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 100; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) } // Testing Update for i := 0; i < 10000; i++ { p := rt.Update(peers[rand.Intn(len(peers))]) - if p != nil { + if p != "" { //t.Log("evicted peer.") } } for i := 0; i < 100; i++ { - id := RandID() + id := ConvertPeerID(tu.RandPeerIDFatal(t)) ret := rt.NearestPeers(id, 5) if len(ret) == 0 { t.Fatal("Failed to find node near ID.") @@ -87,34 +78,36 @@ func TestTableUpdate(t *testing.T) { } func TestTableFind(t *testing.T) { - local := tu.RandPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) + local := tu.RandPeerIDFatal(t) + m := peer.NewMetrics() + rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 5; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeer(ConvertPeerID(peers[2].ID())) - if !found.ID().Equal(peers[2].ID()) { + found := rt.NearestPeer(ConvertPeerID(peers[2])) + if !(found == peers[2]) { t.Fatalf("Failed to lookup known node...") } } func TestTableFindMultiple(t *testing.T) { - local := tu.RandPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID()), time.Hour) + local := tu.RandPeerIDFatal(t) + m := peer.NewMetrics() + rt := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 18; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeers(ConvertPeerID(peers[2].ID()), 15) + found := rt.NearestPeers(ConvertPeerID(peers[2]), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -125,10 +118,11 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) - var peers []peer.Peer + m := peer.NewMetrics() + tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) + var peers []peer.ID for i := 0; i < 500; i++ { - peers = append(peers, tu.RandPeer()) + peers = append(peers, tu.RandPeerIDFatal(t)) } done := make(chan struct{}) @@ -151,7 +145,7 @@ func TestTableMultithreaded(t *testing.T) { go func() { for i := 0; i < 1000; i++ { n := rand.Intn(len(peers)) - tab.Find(peers[n].ID()) + tab.Find(peers[n]) } done <- struct{}{} }() @@ -163,11 +157,12 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + m := peer.NewMetrics() + tab := NewRoutingTable(20, local, time.Hour, m) - var peers []peer.Peer + var peers []peer.ID for i := 0; i < b.N; i++ { - peers = append(peers, tu.RandPeer()) + peers = append(peers, tu.RandPeerIDFatal(b)) } b.StartTimer() @@ -179,16 +174,17 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + m := peer.NewMetrics() + tab := NewRoutingTable(20, local, time.Hour, m) - var peers []peer.Peer + var peers []peer.ID for i := 0; i < b.N; i++ { - peers = append(peers, tu.RandPeer()) + peers = append(peers, tu.RandPeerIDFatal(b)) tab.Update(peers[i]) } b.StartTimer() for i := 0; i < b.N; i++ { - tab.Find(peers[i].ID()) + tab.Find(peers[i]) } } diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 4adac04057..2d06b5f081 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -40,7 +40,7 @@ func commonPrefixLen(a, b ID) int { // ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) func ConvertPeerID(id peer.ID) ID { - hash := sha256.Sum256(id) + hash := sha256.Sum256([]byte(id)) return hash[:] } diff --git a/routing/mock/client.go b/routing/mock/client.go index 444a4b960d..9be43b6530 100644 --- a/routing/mock/client.go +++ b/routing/mock/client.go @@ -15,7 +15,7 @@ var log = u.Logger("mockrouter") type client struct { datastore ds.Datastore server server - peer peer.Peer + peer peer.PeerInfo } // FIXME(brian): is this method meant to simulate putting a value into the network? @@ -40,17 +40,17 @@ func (c *client) GetValue(ctx context.Context, key u.Key) ([]byte, error) { return data, nil } -func (c *client) FindProviders(ctx context.Context, key u.Key) ([]peer.Peer, error) { +func (c *client) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerInfo, error) { return c.server.Providers(key), nil } -func (c *client) FindPeer(ctx context.Context, pid peer.ID) (peer.Peer, error) { +func (c *client) FindPeer(ctx context.Context, pid peer.ID) (peer.PeerInfo, error) { log.Debugf("FindPeer: %s", pid) - return nil, nil + return peer.PeerInfo{}, nil } -func (c *client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.Peer { - out := make(chan peer.Peer) +func (c *client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { + out := make(chan peer.PeerInfo) go func() { defer close(out) for i, p := range c.server.Providers(k) { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 6397362920..abb869eb48 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -15,13 +15,13 @@ import ( // Server provides mockrouting Clients type Server interface { - Client(p peer.Peer) Client - ClientWithDatastore(peer.Peer, ds.Datastore) Client + Client(p peer.PeerInfo) Client + ClientWithDatastore(peer.PeerInfo, ds.Datastore) Client } // Client implements IpfsRouting type Client interface { - FindProviders(context.Context, u.Key) ([]peer.Peer, error) + FindProviders(context.Context, u.Key) ([]peer.PeerInfo, error) routing.IpfsRouting } @@ -37,7 +37,7 @@ func NewServer() Server { // NewServerWithDelay returns a mockrouting Server with a delay! func NewServerWithDelay(conf DelayConfig) Server { return &s{ - providers: make(map[u.Key]map[u.Key]providerRecord), + providers: make(map[u.Key]map[peer.ID]providerRecord), delayConf: conf, } } diff --git a/routing/mock/mockrouting_test.go b/routing/mock/mockrouting_test.go index 44b1b52bd6..64540a3bcc 100644 --- a/routing/mock/mockrouting_test.go +++ b/routing/mock/mockrouting_test.go @@ -1,7 +1,6 @@ package mockrouting import ( - "bytes" "testing" "time" @@ -9,17 +8,16 @@ import ( peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" delay "github.com/jbenet/go-ipfs/util/delay" - testutil "github.com/jbenet/go-ipfs/util/testutil" ) func TestKeyNotFound(t *testing.T) { - var peer = testutil.NewPeerWithID(peer.ID([]byte("the peer id"))) + var pi = peer.PeerInfo{ID: peer.ID("the peer id")} var key = u.Key("mock key") var ctx = context.Background() rs := NewServer() - providers := rs.Client(peer).FindProvidersAsync(ctx, key, 10) + providers := rs.Client(pi).FindProvidersAsync(ctx, key, 10) _, ok := <-providers if ok { t.Fatal("should be closed") @@ -27,9 +25,9 @@ func TestKeyNotFound(t *testing.T) { } func TestClientFindProviders(t *testing.T) { - peer := testutil.NewPeerWithIDString("42") + pi := peer.PeerInfo{ID: peer.ID("42")} rs := NewServer() - client := rs.Client(peer) + client := rs.Client(pi) k := u.Key("hello") err := client.Provide(context.Background(), k) @@ -41,14 +39,14 @@ func TestClientFindProviders(t *testing.T) { time.Sleep(time.Millisecond * 300) max := 100 - providersFromHashTable, err := rs.Client(peer).FindProviders(context.Background(), k) + providersFromHashTable, err := rs.Client(pi).FindProviders(context.Background(), k) if err != nil { t.Fatal(err) } isInHT := false - for _, p := range providersFromHashTable { - if bytes.Equal(p.ID(), peer.ID()) { + for _, pi := range providersFromHashTable { + if pi.ID == pi.ID { isInHT = true } } @@ -57,8 +55,8 @@ func TestClientFindProviders(t *testing.T) { } providersFromClient := client.FindProvidersAsync(context.Background(), u.Key("hello"), max) isInClient := false - for p := range providersFromClient { - if bytes.Equal(p.ID(), peer.ID()) { + for pi := range providersFromClient { + if pi.ID == pi.ID { isInClient = true } } @@ -72,16 +70,16 @@ func TestClientOverMax(t *testing.T) { k := u.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { - peer := testutil.NewPeerWithIDString(string(i)) - err := rs.Client(peer).Provide(context.Background(), k) + pi := peer.PeerInfo{ID: peer.ID(i)} + err := rs.Client(pi).Provide(context.Background(), k) if err != nil { t.Fatal(err) } } max := 10 - peer := testutil.NewPeerWithIDString("TODO") - client := rs.Client(peer) + pi := peer.PeerInfo{ID: peer.ID("TODO")} + client := rs.Client(pi) providersFromClient := client.FindProvidersAsync(context.Background(), k, max) i := 0 @@ -102,16 +100,16 @@ func TestCanceledContext(t *testing.T) { i := 0 go func() { // infinite stream for { - peer := testutil.NewPeerWithIDString(string(i)) - err := rs.Client(peer).Provide(context.Background(), k) + pi := peer.PeerInfo{ID: peer.ID(i)} + err := rs.Client(pi).Provide(context.Background(), k) if err != nil { - t.Fatal(err) + t.Error(err) } i++ } }() - local := testutil.NewPeerWithIDString("peer id doesn't matter") + local := peer.PeerInfo{ID: peer.ID("peer id doesn't matter")} client := rs.Client(local) t.Log("warning: max is finite so this test is non-deterministic") @@ -137,7 +135,7 @@ func TestCanceledContext(t *testing.T) { func TestValidAfter(t *testing.T) { - var p = testutil.NewPeerWithID(peer.ID([]byte("the peer id"))) + var pi = peer.PeerInfo{ID: peer.ID("the peer id")} var key = u.Key("mock key") var ctx = context.Background() conf := DelayConfig{ @@ -147,10 +145,10 @@ func TestValidAfter(t *testing.T) { rs := NewServerWithDelay(conf) - rs.Client(p).Provide(ctx, key) + rs.Client(pi).Provide(ctx, key) - var providers []peer.Peer - providers, err := rs.Client(p).FindProviders(ctx, key) + var providers []peer.PeerInfo + providers, err := rs.Client(pi).FindProviders(ctx, key) if err != nil { t.Fatal(err) } @@ -159,7 +157,7 @@ func TestValidAfter(t *testing.T) { } conf.ValueVisibility.Set(0) - providers, err = rs.Client(p).FindProviders(ctx, key) + providers, err = rs.Client(pi).FindProviders(ctx, key) if err != nil { t.Fatal(err) } diff --git a/routing/mock/server.go b/routing/mock/server.go index e176c7aeb1..31ae4b730a 100644 --- a/routing/mock/server.go +++ b/routing/mock/server.go @@ -12,8 +12,8 @@ import ( // server is the mockrouting.Client's private interface to the routing server type server interface { - Announce(peer.Peer, u.Key) error - Providers(u.Key) []peer.Peer + Announce(peer.PeerInfo, u.Key) error + Providers(u.Key) []peer.PeerInfo Server } @@ -23,36 +23,36 @@ type s struct { delayConf DelayConfig lock sync.RWMutex - providers map[u.Key]map[u.Key]providerRecord + providers map[u.Key]map[peer.ID]providerRecord } type providerRecord struct { - Peer peer.Peer + Peer peer.PeerInfo Created time.Time } -func (rs *s) Announce(p peer.Peer, k u.Key) error { +func (rs *s) Announce(p peer.PeerInfo, k u.Key) error { rs.lock.Lock() defer rs.lock.Unlock() _, ok := rs.providers[k] if !ok { - rs.providers[k] = make(map[u.Key]providerRecord) + rs.providers[k] = make(map[peer.ID]providerRecord) } - rs.providers[k][p.Key()] = providerRecord{ + rs.providers[k][p.ID] = providerRecord{ Created: time.Now(), Peer: p, } return nil } -func (rs *s) Providers(k u.Key) []peer.Peer { +func (rs *s) Providers(k u.Key) []peer.PeerInfo { rs.delayConf.Query.Wait() // before locking rs.lock.RLock() defer rs.lock.RUnlock() - var ret []peer.Peer + var ret []peer.PeerInfo records, ok := rs.providers[k] if !ok { return ret @@ -71,11 +71,11 @@ func (rs *s) Providers(k u.Key) []peer.Peer { return ret } -func (rs *s) Client(p peer.Peer) Client { +func (rs *s) Client(p peer.PeerInfo) Client { return rs.ClientWithDatastore(p, ds.NewMapDatastore()) } -func (rs *s) ClientWithDatastore(p peer.Peer, datastore ds.Datastore) Client { +func (rs *s) ClientWithDatastore(p peer.PeerInfo, datastore ds.Datastore) Client { return &client{ peer: p, datastore: ds.NewMapDatastore(), diff --git a/routing/routing.go b/routing/routing.go index 09773f20b1..ae9acad44c 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -16,7 +16,7 @@ var ErrNotFound = errors.New("routing: not found") // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { - FindProvidersAsync(context.Context, u.Key, int) <-chan peer.Peer + FindProvidersAsync(context.Context, u.Key, int) <-chan peer.PeerInfo // Basic Put/Get @@ -33,6 +33,7 @@ type IpfsRouting interface { Provide(context.Context, u.Key) error // Find specific Peer - // FindPeer searches for a peer with given ID. - FindPeer(context.Context, peer.ID) (peer.Peer, error) + // FindPeer searches for a peer with given ID, returns a peer.PeerInfo + // with relevant addresses. + FindPeer(context.Context, peer.ID) (peer.PeerInfo, error) } From 979cfecd448373696d0475f1a3b3e05c424d2a28 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Dec 2014 12:19:56 -0800 Subject: [PATCH 0453/3147] peer change: peer.Peer -> peer.ID this is a major refactor of the entire codebase it changes the monolithic peer.Peer into using a peer.ID and a peer.Peerstore. Other changes: - removed handshake3. - testutil vastly simplified peer - secio bugfix + debugging logs - testutil: RandKeyPair - backpressure bugfix: w.o.w. - peer: added hex enc/dec - peer: added a PeerInfo struct PeerInfo is a small struct used to pass around a peer with a set of addresses and keys. This is not meant to be a complete view of the system, but rather to model updates to the peerstore. It is used by things like the routing system. - updated peer/queue + peerset - latency metrics - testutil: use crand for PeerID gen RandPeerID generates random "valid" peer IDs. it does not NEED to generate keys because it is as if we lost the key right away. fine to read some randomness and hash it. to generate proper keys and an ID, use: sk, pk, _ := testutil.RandKeyPair() id, _ := peer.IDFromPublicKey(pk) Also added RandPeerIDFatal helper - removed old spipe - updated seccat - core: cleanup initIdentity - removed old getFromPeerList This commit was moved from ipfs/go-namesys@3a3248e68708568c5d6f61c2b8b98c0ba948205c --- namesys/resolve_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 1d487f9a77..fb29490f39 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -4,14 +4,18 @@ import ( "testing" ci "github.com/jbenet/go-ipfs/crypto" + peer "github.com/jbenet/go-ipfs/peer" mockrouting "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" ) func TestRoutingResolve(t *testing.T) { - local := testutil.NewPeerWithIDString("testID") - d := mockrouting.NewServer().Client(local) + local, err := testutil.RandPeerID() + if err != nil { + t.Fatal(err) + } + d := mockrouting.NewServer().Client(peer.PeerInfo{ID: local}) resolver := NewRoutingResolver(d) publisher := NewRoutingPublisher(d) From 6123cdca614dff0d02d8ec0871b67985c6721760 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 22 Dec 2014 15:11:17 -0800 Subject: [PATCH 0454/3147] routing/mock test: kill leaked goroutine This commit was moved from ipfs/go-ipfs-routing@67ea1c81195361fed3bff7b458c8df6ecbd5e8a2 --- routing/mock/mockrouting_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/routing/mock/mockrouting_test.go b/routing/mock/mockrouting_test.go index 64540a3bcc..739edbc639 100644 --- a/routing/mock/mockrouting_test.go +++ b/routing/mock/mockrouting_test.go @@ -96,10 +96,23 @@ func TestCanceledContext(t *testing.T) { rs := NewServer() k := u.Key("hello") + // avoid leaking goroutine, without using the context to signal + // (we want the goroutine to keep trying to publish on a + // cancelled context until we've tested it doesnt do anything.) + done := make(chan struct{}) + defer func() { done <- struct{}{} }() + t.Log("async'ly announce infinite stream of providers for key") i := 0 go func() { // infinite stream for { + select { + case <-done: + t.Log("exiting async worker") + return + default: + } + pi := peer.PeerInfo{ID: peer.ID(i)} err := rs.Client(pi).Provide(context.Background(), k) if err != nil { From e07aa39cb7ccd4335760bcdf79cb068fdb535dfd Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 22 Dec 2014 23:52:21 -0800 Subject: [PATCH 0455/3147] dht: bit nicer logging This commit was moved from ipfs/go-ipfs-routing@59856daf57f9a809481c056046216eda7d9ff7de --- routing/dht/dht.go | 2 +- routing/dht/handlers.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 2cb6801401..fcc0f3bf08 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -126,7 +126,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) erro return err } - log.Debugf("%s putProvider: %s for %s", dht.self, p, u.Key(key)) + log.Debugf("%s putProvider: %s for %s (%s)", dht.self, p, u.Key(key), pi.Addrs) return nil } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index e9ffd7d7ff..070f320a9a 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -219,7 +219,7 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M } if len(pi.Addrs) < 1 { - log.Errorf("got no valid addresses for provider %s. Ignore.", p) + log.Errorf("%s got no valid addresses for provider %s. Ignore.", dht.self, p) continue } From e82d58dc6bdb1ac2eb6e09ed71631ddf0a00bd7b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 18 Dec 2014 12:23:09 -0800 Subject: [PATCH 0456/3147] added bootstrap logging This commit was moved from ipfs/go-ipfs-routing@aba3dab59925db98333c6b723e005782391db046 --- routing/dht/dht.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index fcc0f3bf08..a893e62b8f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -77,6 +77,11 @@ func NewDHT(ctx context.Context, p peer.ID, n inet.Network, dstore ds.ThreadSafe return dht } +// LocalPeer returns the peer.Peer of the dht. +func (dht *IpfsDHT) LocalPeer() peer.ID { + return dht.self +} + // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { if err := dht.network.DialPeer(ctx, npeer); err != nil { From 51c142378bdc1fb8bfd440d46945825807431248 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 18 Dec 2014 18:51:29 -0500 Subject: [PATCH 0457/3147] rm low SnR debug statement "Get" is still fairly useful. Leaving it there. License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-blockservice@da268f18d7c917c9363435e653ceb0f0ac8da67d --- blockservice/blockservice.go | 1 - 1 file changed, 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 9014cab461..1a7ea6b7ad 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -41,7 +41,6 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { k := b.Key() - log.Debugf("blockservice: storing [%s] in datastore", k) err := s.Blockstore.Put(b) if err != nil { return k, err From 334c6d8e1531e1eac94adf5a68d6235dc8826eb9 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 03:14:30 -0800 Subject: [PATCH 0458/3147] dht: helpful debugging for no closer peers This commit was moved from ipfs/go-ipfs-routing@280c31591d11a36d2b7ec4a9dde0f04e4217805d --- routing/dht/query.go | 7 +++++-- routing/dht/routing.go | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index 1321b51930..c45fa239fe 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -258,12 +258,15 @@ func (r *dhtQueryRunner) queryPeer(p peer.ID) { r.Unlock() r.cancel() // signal to everyone that we're done. - } else if res.closerPeers != nil { - log.Debugf("PEERS CLOSER -- worker for: %v", p) + } else if len(res.closerPeers) > 0 { + log.Debugf("PEERS CLOSER -- worker for: %v (%d closer peers)", p, len(res.closerPeers)) for _, next := range res.closerPeers { // add their addresses to the dialer's peerstore r.query.dialer.Peerstore().AddAddresses(next.ID, next.Addrs) r.addPeerToQuery(next.ID, p) + log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } + } else { + log.Debugf("QUERY worker for: %v - not found, and no closer peers.", p) } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9a0620581c..c515324c58 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -139,6 +139,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { defer close(peerOut) + log.Debugf("%s FindProviders %s", dht.self, key) ps := pset.NewLimited(count) provs := dht.providers.GetProviders(ctx, key) From 44517471217b198cbe5f9a93fecbad451cb183a5 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 23 Dec 2014 08:16:05 -0500 Subject: [PATCH 0459/3147] refactor(bitswap) bitswap.Network now abstracts ipfs.Network + ipfs.Routing @jbenet @whyrusleeping the next commit will change bitswap.Network.FindProviders to only deal with IDs This commit was moved from ipfs/go-blockservice@805558624e70a265c90d9db16334e70fe393d7a9 --- blockservice/mock.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/blockservice/mock.go b/blockservice/mock.go index 2775197462..57432178ee 100644 --- a/blockservice/mock.go +++ b/blockservice/mock.go @@ -11,9 +11,8 @@ import ( // Mocks returns |n| connected mock Blockservices func Mocks(t *testing.T, n int) []*BlockService { - net := tn.VirtualNetwork(delay.Fixed(0)) - rs := mockrouting.NewServer() - sg := bitswap.NewSessionGenerator(net, rs) + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) + sg := bitswap.NewSessionGenerator(net) instances := sg.Instances(n) From 05653e2366c3991bc1f09adc7b3238601b1464a0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 18:40:19 -0800 Subject: [PATCH 0460/3147] dht_test large providers test This commit was moved from ipfs/go-ipfs-routing@0a4b46927f414517533698484ac0e5f394405f9e --- routing/dht/dht_test.go | 158 +++++++++++++++++++++++++++++++++++----- 1 file changed, 139 insertions(+), 19 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b378675c6a..3e17c71cdd 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -2,7 +2,9 @@ package dht import ( "bytes" + "fmt" "sort" + "sync" "testing" "time" @@ -19,6 +21,17 @@ import ( testutil "github.com/jbenet/go-ipfs/util/testutil" ) +var testCaseValues = map[u.Key][]byte{} + +func init() { + testCaseValues["hello"] = []byte("world") + for i := 0; i < 100; i++ { + k := fmt.Sprintf("%d -- key", i) + v := fmt.Sprintf("%d -- value", i) + testCaseValues[u.Key(k)] = []byte(v) + } +} + func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { sk, pk, err := testutil.RandKeyPair(512) @@ -174,37 +187,144 @@ func TestProvides(t *testing.T) { connect(t, ctx, dhts[1], dhts[2]) connect(t, ctx, dhts[1], dhts[3]) - err := dhts[3].putLocal(u.Key("hello"), []byte("world")) - if err != nil { - t.Fatal(err) + for k, v := range testCaseValues { + t.Logf("adding local values for %s = %s", k, v) + err := dhts[3].putLocal(k, v) + if err != nil { + t.Fatal(err) + } + + bits, err := dhts[3].getLocal(k) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(bits, v) { + t.Fatal("didn't store the right bits (%s, %s)", k, v) + } } - bits, err := dhts[3].getLocal(u.Key("hello")) - if err != nil && bytes.Equal(bits, []byte("world")) { - t.Fatal(err) + for k, _ := range testCaseValues { + t.Logf("announcing provider for %s", k) + if err := dhts[3].Provide(ctx, k); err != nil { + t.Fatal(err) + } } - err = dhts[3].Provide(ctx, u.Key("hello")) - if err != nil { - t.Fatal(err) + // what is this timeout for? was 60ms before. + time.Sleep(time.Millisecond * 6) + + n := 0 + for k, _ := range testCaseValues { + n = (n + 1) % 3 + + t.Logf("getting providers for %s from %d", k, n) + ctxT, _ := context.WithTimeout(ctx, time.Second) + provchan := dhts[n].FindProvidersAsync(ctxT, k, 1) + + select { + case prov := <-provchan: + if prov.ID == "" { + t.Fatal("Got back nil provider") + } + if prov.ID != dhts[3].self { + t.Fatal("Got back wrong provider") + } + case <-ctxT.Done(): + t.Fatal("Did not get a provider back.") + } + } +} + +func TestProvidesMany(t *testing.T) { + t.Skip("this test doesn't work") + ctx := context.Background() + + nDHTs := 40 + _, _, dhts := setupDHTS(ctx, nDHTs, t) + defer func() { + for i := 0; i < nDHTs; i++ { + dhts[i].Close() + defer dhts[i].network.Close() + } + }() + + t.Logf("connecting %d dhts in a ring", nDHTs) + for i := 0; i < nDHTs; i++ { + connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) + } + + // t.Logf("bootstrapping them so they find each other", nDHTs) + // for _, dht := range dhts { + // bootstrap(t, ctx, dht) + // } + + d := 0 + for k, v := range testCaseValues { + d = (d + 1) % len(dhts) + dht := dhts[d] + + t.Logf("adding local values for %s = %s (on %s)", k, v, dht.self) + err := dht.putLocal(k, v) + if err != nil { + t.Fatal(err) + } + + bits, err := dht.getLocal(k) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(bits, v) { + t.Fatal("didn't store the right bits (%s, %s)", k, v) + } + + t.Logf("announcing provider for %s", k) + if err := dht.Provide(ctx, k); err != nil { + t.Fatal(err) + } } // what is this timeout for? was 60ms before. time.Sleep(time.Millisecond * 6) - ctxT, _ := context.WithTimeout(ctx, time.Second) - provchan := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 1) + errchan := make(chan error) - select { - case prov := <-provchan: - if prov.ID == "" { - t.Fatal("Got back nil provider") + ctxT, _ := context.WithTimeout(ctx, 5*time.Second) + + var wg sync.WaitGroup + getProvider := func(dht *IpfsDHT, k u.Key) { + defer wg.Done() + + provchan := dht.FindProvidersAsync(ctxT, k, 1) + select { + case prov := <-provchan: + if prov.ID == "" { + errchan <- fmt.Errorf("Got back nil provider (%s at %s)", k, dht.self) + } else if prov.ID != dhts[3].self { + errchan <- fmt.Errorf("Got back wrong provider (%s at %s)", k, dht.self) + } + case <-ctxT.Done(): + errchan <- fmt.Errorf("Did not get a provider back (%s at %s)", k, dht.self) } - if prov.ID != dhts[3].self { - t.Fatal("Got back nil provider") + } + + for k, _ := range testCaseValues { + // everyone should be able to find it... + for _, dht := range dhts { + t.Logf("getting providers for %s at %s", k, dht.self) + wg.Add(1) + go getProvider(dht, k) } - case <-ctxT.Done(): - t.Fatal("Did not get a provider back.") + } + + // we need this because of printing errors + go func() { + wg.Wait() + close(errchan) + }() + + t.Logf("looking through errors") + for err := range errchan { + t.Error(err) } } From cf8b35aa616ebfe7e8d7b517cbb74617861caa97 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 18:54:23 -0800 Subject: [PATCH 0461/3147] dht bugfix: unlock on print This commit was moved from ipfs/go-ipfs-routing@22e9835052225f4171182740354a4a914659d338 --- routing/kbucket/table.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index da4c6e720e..aaaa573724 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -227,4 +227,5 @@ func (rt *RoutingTable) Print() { for i, p := range peers { fmt.Printf("%d) %s %s\n", i, p.Pretty(), rt.metrics.LatencyEWMA(p).String()) } + rt.tabLock.RUnlock() } From 3805290ca95f72794447c28be37abe7df5708215 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 22:05:55 -0800 Subject: [PATCH 0462/3147] routing table: better printing (see bkts) This commit was moved from ipfs/go-ipfs-routing@6509dc170508aae656bec27795f9c130a5bc462c --- routing/kbucket/table.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index aaaa573724..bed7447a54 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -223,9 +223,16 @@ func (rt *RoutingTable) ListPeers() []peer.ID { func (rt *RoutingTable) Print() { fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) rt.tabLock.RLock() - peers := rt.ListPeers() - for i, p := range peers { - fmt.Printf("%d) %s %s\n", i, p.Pretty(), rt.metrics.LatencyEWMA(p).String()) + + for i, b := range rt.Buckets { + fmt.Printf("\tbucket: %d\n", i) + + b.lk.RLock() + for e := b.list.Front(); e != nil; e = e.Next() { + p := e.Value.(peer.ID) + fmt.Printf("\t\t- %s %s\n", p.Pretty(), rt.metrics.LatencyEWMA(p).String()) + } + b.lk.RUnlock() } rt.tabLock.RUnlock() } From b63d63c8b2e9144256169546302109bd034cba48 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 19:02:03 -0800 Subject: [PATCH 0463/3147] dht bootstrap err check fix + logging This commit was moved from ipfs/go-ipfs-routing@4d81d5b2452f92c01cd2ca9f8894ac9cb8fbb89a --- routing/dht/dht.go | 11 ++++++----- routing/dht/handlers.go | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index a893e62b8f..0898fb3d3a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -372,13 +372,14 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context) { id := make([]byte, 16) rand.Read(id) pi, err := dht.FindPeer(ctx, peer.ID(id)) - if err != nil { - // NOTE: this is not an error. this is expected! + if err == routing.ErrNotFound { + // this isn't an error. this is precisely what we expect. + } else if err != nil { log.Errorf("Bootstrap peer error: %s", err) + } else { + // woah, we got a peer under a random id? it _cannot_ be valid. + log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", pi) } - - // woah, we got a peer under a random id? it _cannot_ be valid. - log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", pi) }() } wg.Wait() diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 070f320a9a..5aec6c2fff 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -148,7 +148,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess } if closest == nil { - log.Errorf("handleFindPeer: could not find anything.") + log.Debugf("handleFindPeer: could not find anything.") return resp, nil } From 39854f319b7a588d4bd16681d50863899434346b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 02:13:38 -0800 Subject: [PATCH 0464/3147] dht/query: fix important panic Withe queries (particularly providers), it was possible to exit the query runner's Run BEFORE all its children were done, because the runner itself only listened to the context. This introduced the possibility of a panic (you can go check it out by running the TestProvidersMany test on dht_test in commits before this one). Thankfully, ctxgroup saved the day with almost _zero_ changes to the sync flow, and now we have the guarantee that the query runner will only exit if all its children are done. :heart: Conflicts: routing/dht/query.go This commit was moved from ipfs/go-ipfs-routing@a19b41b2e168311a294a374bf36e576be143a444 --- routing/dht/dht_net.go | 16 ++++++++---- routing/dht/query.go | 58 +++++++++++++++++++++++++----------------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index a91e0f53c0..cfbc812a3d 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -7,6 +7,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" + ctxutil "github.com/jbenet/go-ipfs/util/ctx" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" @@ -21,8 +22,10 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { defer s.Close() ctx := dht.Context() - r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - w := ggio.NewDelimitedWriter(s) + cr := ctxutil.NewReader(ctx, s) // ok to use. we defer close stream in this func + cw := ctxutil.NewWriter(ctx, s) // ok to use. we defer close stream in this func + r := ggio.NewDelimitedReader(cr, inet.MessageSizeMax) + w := ggio.NewDelimitedWriter(cw) mPeer := s.Conn().RemotePeer() // receive msg @@ -76,8 +79,10 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message } defer s.Close() - r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - w := ggio.NewDelimitedWriter(s) + cr := ctxutil.NewReader(ctx, s) // ok to use. we defer close stream in this func + cw := ctxutil.NewWriter(ctx, s) // ok to use. we defer close stream in this func + r := ggio.NewDelimitedReader(cr, inet.MessageSizeMax) + w := ggio.NewDelimitedWriter(cw) start := time.Now() @@ -113,7 +118,8 @@ func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message } defer s.Close() - w := ggio.NewDelimitedWriter(s) + cw := ctxutil.NewWriter(ctx, s) // ok to use. we defer close stream in this func + w := ggio.NewDelimitedWriter(cw) log.Debugf("%s writing", dht.self) if err := w.WriteMsg(pmes); err != nil { diff --git a/routing/dht/query.go b/routing/dht/query.go index c45fa239fe..3d3f94091f 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -12,6 +12,7 @@ import ( todoctr "github.com/jbenet/go-ipfs/util/todocounter" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" ) var maxQueryConcurrency = AlphaValue @@ -78,9 +79,8 @@ type dhtQueryRunner struct { // peersRemaining is a counter of peers remaining (toQuery + processing) peersRemaining todoctr.Counter - // context - ctx context.Context - cancel context.CancelFunc + // context group + cg ctxgroup.ContextGroup // result result *dhtQueryResult @@ -93,16 +93,13 @@ type dhtQueryRunner struct { } func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { - ctx, cancel := context.WithCancel(ctx) - return &dhtQueryRunner{ - ctx: ctx, - cancel: cancel, query: q, peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(q.key)), peersRemaining: todoctr.NewSyncCounter(), peersSeen: peer.Set{}, rateLimit: make(chan struct{}, q.concurrency), + cg: ctxgroup.WithContext(ctx), } } @@ -120,11 +117,13 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { // add all the peers we got first. for _, p := range peers { - r.addPeerToQuery(p, "") // don't have access to self here... + r.addPeerToQuery(r.cg.Context(), p, "") // don't have access to self here... } // go do this thing. - go r.spawnWorkers() + // do it as a child func to make sure Run exits + // ONLY AFTER spawn workers has exited. + r.cg.AddChildFunc(r.spawnWorkers) // so workers are working. @@ -133,7 +132,7 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { select { case <-r.peersRemaining.Done(): - r.cancel() // ran all and nothing. cancel all outstanding workers. + r.cg.Close() r.RLock() defer r.RUnlock() @@ -141,10 +140,10 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { err = r.errs[0] } - case <-r.ctx.Done(): + case <-r.cg.Closed(): r.RLock() defer r.RUnlock() - err = r.ctx.Err() + err = r.cg.Context().Err() // collect the error. } if r.result != nil && r.result.success { @@ -154,7 +153,7 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { return nil, err } -func (r *dhtQueryRunner) addPeerToQuery(next peer.ID, benchmark peer.ID) { +func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID, benchmark peer.ID) { // if new peer is ourselves... if next == r.query.dialer.LocalPeer() { return @@ -186,37 +185,42 @@ func (r *dhtQueryRunner) addPeerToQuery(next peer.ID, benchmark peer.ID) { r.peersRemaining.Increment(1) select { case r.peersToQuery.EnqChan <- next: - case <-r.ctx.Done(): + case <-ctx.Done(): } } -func (r *dhtQueryRunner) spawnWorkers() { +func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { for { select { case <-r.peersRemaining.Done(): return - case <-r.ctx.Done(): + case <-r.cg.Closing(): return case p, more := <-r.peersToQuery.DeqChan: if !more { return // channel closed. } - log.Debugf("spawning worker for: %v\n", p) - go r.queryPeer(p) + log.Debugf("spawning worker for: %v", p) + + // do it as a child func to make sure Run exits + // ONLY AFTER spawn workers has exited. + parent.AddChildFunc(func(cg ctxgroup.ContextGroup) { + r.queryPeer(cg, p) + }) } } } -func (r *dhtQueryRunner) queryPeer(p peer.ID) { +func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { log.Debugf("spawned worker for: %v", p) // make sure we rate limit concurrency. select { case <-r.rateLimit: - case <-r.ctx.Done(): + case <-cg.Closing(): r.peersRemaining.Decrement(1) return } @@ -233,7 +237,7 @@ func (r *dhtQueryRunner) queryPeer(p peer.ID) { }() // make sure we're connected to the peer. - err := r.query.dialer.DialPeer(r.ctx, p) + err := r.query.dialer.DialPeer(cg.Context(), p) if err != nil { log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) r.Lock() @@ -243,7 +247,7 @@ func (r *dhtQueryRunner) queryPeer(p peer.ID) { } // finally, run the query against this peer - res, err := r.query.qfunc(r.ctx, p) + res, err := r.query.qfunc(cg.Context(), p) if err != nil { log.Debugf("ERROR worker for: %v %v", p, err) @@ -256,14 +260,20 @@ func (r *dhtQueryRunner) queryPeer(p peer.ID) { r.Lock() r.result = res r.Unlock() - r.cancel() // signal to everyone that we're done. + go r.cg.Close() // signal to everyone that we're done. + // must be async, as we're one of the children, and Close blocks. } else if len(res.closerPeers) > 0 { log.Debugf("PEERS CLOSER -- worker for: %v (%d closer peers)", p, len(res.closerPeers)) for _, next := range res.closerPeers { // add their addresses to the dialer's peerstore + conns := r.query.dialer.ConnsToPeer(next.ID) + if len(conns) == 0 { + log.Infof("PEERS CLOSER -- worker for %v FOUND NEW PEER: %s %s", p, next.ID, next.Addrs) + } + r.query.dialer.Peerstore().AddAddresses(next.ID, next.Addrs) - r.addPeerToQuery(next.ID, p) + r.addPeerToQuery(cg.Context(), next.ID, p) log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } } else { From bbf759b80a68d438a218a7fa07be51d7b8b91d15 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 19:20:42 -0800 Subject: [PATCH 0465/3147] dht: update on every received message i made a separate function because we may want to update our routing table based on "closer peers". maybe not-- these could all be lies. This commit was moved from ipfs/go-ipfs-routing@d62fdf5fddea0fcaf0f805edcc98e1279ba15739 --- routing/dht/dht_net.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index cfbc812a3d..caf0518c2a 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -34,8 +34,9 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { log.Error("Error unmarshaling data") return } + // update the peer (on valid msgs only) - dht.Update(ctx, mPeer) + dht.updateFromMessage(ctx, mPeer, pmes) log.Event(ctx, "foo", dht.self, mPeer, pmes) @@ -103,6 +104,9 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message return nil, errors.New("no response to request") } + // update the peer (on valid msgs only) + dht.updateFromMessage(ctx, p, rpmes) + dht.peerstore.RecordLatency(p, time.Since(start)) log.Event(ctx, "dhtReceivedMessage", dht.self, p, rpmes) return rpmes, nil @@ -129,3 +133,8 @@ func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message log.Debugf("%s done", dht.self) return nil } + +func (dht *IpfsDHT) updateFromMessage(ctx context.Context, p peer.ID, mes *pb.Message) error { + dht.Update(ctx, p) + return nil +} From 22281e147eb14d030a5f5e4ada987478fd66fd5d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 19:05:41 -0800 Subject: [PATCH 0466/3147] bootstrap test This commit was moved from ipfs/go-ipfs-routing@4296ca59ab5838511e7b07bba29610133d352efb --- routing/dht/dht_test.go | 48 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3e17c71cdd..02950e0844 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -91,6 +91,18 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { } } +func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { + var wg sync.WaitGroup + for _, dht := range dhts { + wg.Add(1) + go func() { + defer wg.Done() + dht.Bootstrap(ctx) + }() + } + wg.Wait() +} + func TestPing(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() @@ -235,8 +247,38 @@ func TestProvides(t *testing.T) { } } +func TestBootstrap(t *testing.T) { + ctx := context.Background() + + nDHTs := 40 + _, _, dhts := setupDHTS(ctx, nDHTs, t) + defer func() { + for i := 0; i < nDHTs; i++ { + dhts[i].Close() + defer dhts[i].network.Close() + } + }() + + t.Logf("connecting %d dhts in a ring", nDHTs) + for i := 0; i < nDHTs; i++ { + connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) + } + + t.Logf("bootstrapping them so they find each other", nDHTs) + bootstrap(t, ctx, dhts) + + // the routing tables should be full now. let's inspect them. + t.Logf("checking routing table of %d", nDHTs) + for _, dht := range dhts { + fmt.Printf("checking routing table of %s\n", dht.self) + dht.routingTable.Print() + fmt.Println("") + } +} + func TestProvidesMany(t *testing.T) { t.Skip("this test doesn't work") + // t.Skip("skipping test to debug another") ctx := context.Background() nDHTs := 40 @@ -253,10 +295,8 @@ func TestProvidesMany(t *testing.T) { connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) } - // t.Logf("bootstrapping them so they find each other", nDHTs) - // for _, dht := range dhts { - // bootstrap(t, ctx, dht) - // } + t.Logf("bootstrapping them so they find each other", nDHTs) + bootstrap(t, ctx, dhts) d := 0 for k, v := range testCaseValues { From 31eb5af868972177227a6b46b612ebd629373fc6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 03:24:28 -0800 Subject: [PATCH 0467/3147] respect don contexteone This commit was moved from ipfs/go-ipfs-routing@1a344cc5bd97deb1395d923c5f6f18281ad8eb0d --- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 3 ++- routing/dht/ext_test.go | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index caf0518c2a..d247cf3afb 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -31,7 +31,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // receive msg pmes := new(pb.Message) if err := r.ReadMsg(pmes); err != nil { - log.Error("Error unmarshaling data") + log.Errorf("Error unmarshaling data: %s", err) return } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 02950e0844..f2ff099dfa 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -265,7 +265,8 @@ func TestBootstrap(t *testing.T) { } t.Logf("bootstrapping them so they find each other", nDHTs) - bootstrap(t, ctx, dhts) + ctxT, _ := context.WithTimeout(ctx, 5*time.Second) + bootstrap(t, ctxT, dhts) // the routing tables should be full now. let's inspect them. t.Logf("checking routing table of %d", nDHTs) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 04f5111a9c..b4b1158d7e 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -73,7 +73,7 @@ func TestGetFailures(t *testing.T) { }) // This one should fail with NotFound - ctx2, _ := context.WithTimeout(context.Background(), time.Second) + ctx2, _ := context.WithTimeout(context.Background(), 3*time.Second) _, err = d.GetValue(ctx2, u.Key("test")) if err != nil { if err != routing.ErrNotFound { From d4a24062aba5828bb6fc4b2320f014f4ff5765b4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 19:21:35 -0800 Subject: [PATCH 0468/3147] dht bootstrap test: rounds. do nothing odd behavior: only one dht (the last one) is seeing changes to its routing table. This commit was moved from ipfs/go-ipfs-routing@76efc958ff6b819c550bd6dbc400547cc883d34f --- routing/dht/dht_test.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f2ff099dfa..3c3ce99543 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -92,15 +92,23 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { } func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { - var wg sync.WaitGroup - for _, dht := range dhts { - wg.Add(1) - go func() { - defer wg.Done() - dht.Bootstrap(ctx) - }() + + // try multiple rounds... + rounds := 5 + for i := 0; i < rounds; i++ { + fmt.Printf("bootstrapping round %d/%d\n", i, rounds) + + var wg sync.WaitGroup + for _, dht := range dhts { + wg.Add(1) + go func() { + defer wg.Done() + dht.Bootstrap(ctx) + }() + } + wg.Wait() + } - wg.Wait() } func TestPing(t *testing.T) { @@ -264,6 +272,8 @@ func TestBootstrap(t *testing.T) { connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) } + <-time.After(100 * time.Millisecond) + t.Logf("bootstrapping them so they find each other", nDHTs) ctxT, _ := context.WithTimeout(ctx, 5*time.Second) bootstrap(t, ctxT, dhts) From 4d622b307554c6312c9a67cad336e2c18c5a1865 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 22:05:29 -0800 Subject: [PATCH 0469/3147] dht_test: better bootstrapping logging This commit was moved from ipfs/go-ipfs-routing@fb8a936f44418ed360852dd8c9a7def95fd544f3 --- routing/dht/dht_test.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3c3ce99543..d3041f364f 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -94,17 +94,19 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { // try multiple rounds... - rounds := 5 + rounds := 1 for i := 0; i < rounds; i++ { fmt.Printf("bootstrapping round %d/%d\n", i, rounds) var wg sync.WaitGroup for _, dht := range dhts { wg.Add(1) - go func() { + go func(i int) { defer wg.Done() + <-time.After(time.Duration(i) * time.Millisecond) // stagger them to avoid overwhelming + fmt.Printf("bootstrapping round %d/%d -- %s\n", i, rounds, dht.self) dht.Bootstrap(ctx) - }() + }(i) } wg.Wait() From 8d3b524e8bc67f611fc497c4ed62022c3ba25c4c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 22:01:57 -0800 Subject: [PATCH 0470/3147] dht: removing extra newlines This commit was moved from ipfs/go-ipfs-routing@c3eaf2dda8241490fb2aa9fb79f8004497c20d7e --- routing/dht/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index 3d3f94091f..aff724bc9e 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -179,7 +179,7 @@ func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID, bench r.peersSeen[next] = struct{}{} r.Unlock() - log.Debugf("adding peer to query: %v\n", next) + log.Debugf("adding peer to query: %v", next) // do this after unlocking to prevent possible deadlocks. r.peersRemaining.Increment(1) From e9caf488d172d45145ca3fb3bb95878689bd9944 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 22:04:21 -0800 Subject: [PATCH 0471/3147] dht: bootstrap query constants This commit was moved from ipfs/go-ipfs-routing@bc828f753bb6389dc169822647de822ac7325503 --- routing/dht/dht.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0898fb3d3a..fdb5170f7b 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -28,6 +28,10 @@ var log = eventlog.Logger("dht") const doPinging = false +// NumBootstrapQueries defines the number of random dht queries to do to +// collect members of the routing table. +const NumBootstrapQueries = 5 + // TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. @@ -364,7 +368,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { func (dht *IpfsDHT) Bootstrap(ctx context.Context) { var wg sync.WaitGroup - for i := 0; i < 10; i++ { + for i := 0; i < NumBootstrapQueries; i++ { wg.Add(1) go func() { defer wg.Done() From c1017863f9d5ffb0baa32cd3b338c0959c9b5e76 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 22:06:45 -0800 Subject: [PATCH 0472/3147] dht/query: log when dialing a closerpeer This commit was moved from ipfs/go-ipfs-routing@8b4b0b8456434f5b327f052b1af244cab35df361 --- routing/dht/query.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index aff724bc9e..6a7bb687d3 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -237,13 +237,18 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { }() // make sure we're connected to the peer. - err := r.query.dialer.DialPeer(cg.Context(), p) - if err != nil { - log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) - r.Lock() - r.errs = append(r.errs, err) - r.Unlock() - return + if conns := r.query.dialer.ConnsToPeer(p); len(conns) == 0 { + log.Infof("worker for: %v -- not connected. dial start", p) + + if err := r.query.dialer.DialPeer(cg.Context(), p); err != nil { + log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) + r.Lock() + r.errs = append(r.errs, err) + r.Unlock() + return + } + + log.Infof("worker for: %v -- not connected. dial success!", p) } // finally, run the query against this peer From ca7af7bcbbd18d5150587d4654eeca185c23d576 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 23:12:22 -0800 Subject: [PATCH 0473/3147] dht/dht_test: bootstrap synchronously. fares better. This commit was moved from ipfs/go-ipfs-routing@4a051a54d3a6ab5ca9a33c6de44e22ba2254b27a --- routing/dht/dht.go | 32 +++++++++++++------------------- routing/dht/dht_test.go | 39 ++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index fdb5170f7b..4cbf68e43b 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -365,26 +365,20 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { } // Bootstrap builds up list of peers by requesting random peer IDs -func (dht *IpfsDHT) Bootstrap(ctx context.Context) { +func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) { - var wg sync.WaitGroup + // bootstrap sequentially, as results will compound for i := 0; i < NumBootstrapQueries; i++ { - wg.Add(1) - go func() { - defer wg.Done() - - id := make([]byte, 16) - rand.Read(id) - pi, err := dht.FindPeer(ctx, peer.ID(id)) - if err == routing.ErrNotFound { - // this isn't an error. this is precisely what we expect. - } else if err != nil { - log.Errorf("Bootstrap peer error: %s", err) - } else { - // woah, we got a peer under a random id? it _cannot_ be valid. - log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", pi) - } - }() + id := make([]byte, 16) + rand.Read(id) + pi, err := dht.FindPeer(ctx, peer.ID(id)) + if err == routing.ErrNotFound { + // this isn't an error. this is precisely what we expect. + } else if err != nil { + log.Errorf("Bootstrap peer error: %s", err) + } else { + // woah, we got a peer under a random id? it _cannot_ be valid. + log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", pi) + } } - wg.Wait() } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index d3041f364f..f37656c2e9 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -93,24 +93,23 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { - // try multiple rounds... + ctx, cancel := context.WithCancel(ctx) + rounds := 1 for i := 0; i < rounds; i++ { fmt.Printf("bootstrapping round %d/%d\n", i, rounds) - var wg sync.WaitGroup + // tried async. sequential fares much better. compare: + // 100 async https://gist.github.com/jbenet/56d12f0578d5f34810b2 + // 100 sync https://gist.github.com/jbenet/6c59e7c15426e48aaedd + // probably because results compound for _, dht := range dhts { - wg.Add(1) - go func(i int) { - defer wg.Done() - <-time.After(time.Duration(i) * time.Millisecond) // stagger them to avoid overwhelming - fmt.Printf("bootstrapping round %d/%d -- %s\n", i, rounds, dht.self) - dht.Bootstrap(ctx) - }(i) + fmt.Printf("bootstrapping round %d/%d -- %s\n", i, rounds, dht.self) + dht.Bootstrap(ctx, 3) } - wg.Wait() - } + + cancel() } func TestPing(t *testing.T) { @@ -260,7 +259,7 @@ func TestProvides(t *testing.T) { func TestBootstrap(t *testing.T) { ctx := context.Background() - nDHTs := 40 + nDHTs := 10 _, _, dhts := setupDHTS(ctx, nDHTs, t) defer func() { for i := 0; i < nDHTs; i++ { @@ -275,7 +274,6 @@ func TestBootstrap(t *testing.T) { } <-time.After(100 * time.Millisecond) - t.Logf("bootstrapping them so they find each other", nDHTs) ctxT, _ := context.WithTimeout(ctx, 5*time.Second) bootstrap(t, ctxT, dhts) @@ -308,8 +306,19 @@ func TestProvidesMany(t *testing.T) { connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) } + <-time.After(100 * time.Millisecond) t.Logf("bootstrapping them so they find each other", nDHTs) - bootstrap(t, ctx, dhts) + ctxT, _ := context.WithTimeout(ctx, 5*time.Second) + bootstrap(t, ctxT, dhts) + + <-time.After(5 * time.Second) + // the routing tables should be full now. let's inspect them. + t.Logf("checking routing table of %d", nDHTs) + for _, dht := range dhts { + fmt.Printf("checking routing table of %s\n", dht.self) + dht.routingTable.Print() + fmt.Println("") + } d := 0 for k, v := range testCaseValues { @@ -341,7 +350,7 @@ func TestProvidesMany(t *testing.T) { errchan := make(chan error) - ctxT, _ := context.WithTimeout(ctx, 5*time.Second) + ctxT, _ = context.WithTimeout(ctx, 5*time.Second) var wg sync.WaitGroup getProvider := func(dht *IpfsDHT, k u.Key) { From cc014723f576a0275237a362a99d675608bd02ed Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 01:33:52 -0800 Subject: [PATCH 0474/3147] dht: cleaned up dht_test. TestProversMany still fails This commit was moved from ipfs/go-ipfs-routing@c29267e03c3e9711a19646a87f86fb24ee361d82 --- routing/dht/dht_test.go | 69 +++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f37656c2e9..438791fe20 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,6 +17,7 @@ import ( // ci "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" + routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" ) @@ -97,14 +98,14 @@ func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { rounds := 1 for i := 0; i < rounds; i++ { - fmt.Printf("bootstrapping round %d/%d\n", i, rounds) + log.Debugf("bootstrapping round %d/%d\n", i, rounds) // tried async. sequential fares much better. compare: // 100 async https://gist.github.com/jbenet/56d12f0578d5f34810b2 // 100 sync https://gist.github.com/jbenet/6c59e7c15426e48aaedd // probably because results compound for _, dht := range dhts { - fmt.Printf("bootstrapping round %d/%d -- %s\n", i, rounds, dht.self) + log.Debugf("bootstrapping round %d/%d -- %s\n", i, rounds, dht.self) dht.Bootstrap(ctx, 3) } } @@ -209,7 +210,7 @@ func TestProvides(t *testing.T) { connect(t, ctx, dhts[1], dhts[3]) for k, v := range testCaseValues { - t.Logf("adding local values for %s = %s", k, v) + log.Debugf("adding local values for %s = %s", k, v) err := dhts[3].putLocal(k, v) if err != nil { t.Fatal(err) @@ -225,7 +226,7 @@ func TestProvides(t *testing.T) { } for k, _ := range testCaseValues { - t.Logf("announcing provider for %s", k) + log.Debugf("announcing provider for %s", k) if err := dhts[3].Provide(ctx, k); err != nil { t.Fatal(err) } @@ -238,7 +239,7 @@ func TestProvides(t *testing.T) { for k, _ := range testCaseValues { n = (n + 1) % 3 - t.Logf("getting providers for %s from %d", k, n) + log.Debugf("getting providers for %s from %d", k, n) ctxT, _ := context.WithTimeout(ctx, time.Second) provchan := dhts[n].FindProvidersAsync(ctxT, k, 1) @@ -259,7 +260,7 @@ func TestProvides(t *testing.T) { func TestBootstrap(t *testing.T) { ctx := context.Background() - nDHTs := 10 + nDHTs := 15 _, _, dhts := setupDHTS(ctx, nDHTs, t) defer func() { for i := 0; i < nDHTs; i++ { @@ -278,12 +279,23 @@ func TestBootstrap(t *testing.T) { ctxT, _ := context.WithTimeout(ctx, 5*time.Second) bootstrap(t, ctxT, dhts) - // the routing tables should be full now. let's inspect them. - t.Logf("checking routing table of %d", nDHTs) + if u.Debug { + // the routing tables should be full now. let's inspect them. + <-time.After(5 * time.Second) + t.Logf("checking routing table of %d", nDHTs) + for _, dht := range dhts { + fmt.Printf("checking routing table of %s\n", dht.self) + dht.routingTable.Print() + fmt.Println("") + } + } + + // test "well-formed-ness" (>= 3 peers in every routing table) for _, dht := range dhts { - fmt.Printf("checking routing table of %s\n", dht.self) - dht.routingTable.Print() - fmt.Println("") + rtlen := dht.routingTable.Size() + if rtlen < 4 { + t.Errorf("routing table for %s only has %d peers", dht.self, rtlen) + } } } @@ -311,13 +323,15 @@ func TestProvidesMany(t *testing.T) { ctxT, _ := context.WithTimeout(ctx, 5*time.Second) bootstrap(t, ctxT, dhts) - <-time.After(5 * time.Second) - // the routing tables should be full now. let's inspect them. - t.Logf("checking routing table of %d", nDHTs) - for _, dht := range dhts { - fmt.Printf("checking routing table of %s\n", dht.self) - dht.routingTable.Print() - fmt.Println("") + if u.Debug { + // the routing tables should be full now. let's inspect them. + <-time.After(5 * time.Second) + t.Logf("checking routing table of %d", nDHTs) + for _, dht := range dhts { + fmt.Printf("checking routing table of %s\n", dht.self) + dht.routingTable.Print() + fmt.Println("") + } } d := 0 @@ -372,7 +386,7 @@ func TestProvidesMany(t *testing.T) { for k, _ := range testCaseValues { // everyone should be able to find it... for _, dht := range dhts { - t.Logf("getting providers for %s at %s", k, dht.self) + log.Debugf("getting providers for %s at %s", k, dht.self) wg.Add(1) go getProvider(dht, k) } @@ -384,7 +398,6 @@ func TestProvidesMany(t *testing.T) { close(errchan) }() - t.Logf("looking through errors") for err := range errchan { t.Error(err) } @@ -473,18 +486,20 @@ func TestLayeredGet(t *testing.T) { t.Fatal(err) } - time.Sleep(time.Millisecond * 60) + time.Sleep(time.Millisecond * 6) + t.Log("interface was changed. GetValue should not use providers.") ctxT, _ := context.WithTimeout(ctx, time.Second) val, err := dhts[0].GetValue(ctxT, u.Key("/v/hello")) - if err != nil { - t.Fatal(err) + if err != routing.ErrNotFound { + t.Error(err) } - - if string(val) != "world" { - t.Fatal("Got incorrect value.") + if string(val) == "world" { + t.Error("should not get value.") + } + if len(val) > 0 && string(val) != "world" { + t.Error("worse, there's a value and its not even the right one.") } - } func TestFindPeer(t *testing.T) { From c8fa6330e5ffbb1685c7396435f5e6cac726ad13 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 04:23:15 -0800 Subject: [PATCH 0475/3147] dht/test: providers test id compare This commit was moved from ipfs/go-ipfs-routing@14ca849f95645b75ba56cf6454338164fde93305 --- routing/dht/dht_test.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 438791fe20..ddf3909c8a 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -334,10 +334,13 @@ func TestProvidesMany(t *testing.T) { } } + var providers = map[u.Key]peer.ID{} + d := 0 for k, v := range testCaseValues { d = (d + 1) % len(dhts) dht := dhts[d] + providers[k] = dht.self t.Logf("adding local values for %s = %s (on %s)", k, v, dht.self) err := dht.putLocal(k, v) @@ -370,13 +373,17 @@ func TestProvidesMany(t *testing.T) { getProvider := func(dht *IpfsDHT, k u.Key) { defer wg.Done() + expected := providers[k] + provchan := dht.FindProvidersAsync(ctxT, k, 1) select { case prov := <-provchan: - if prov.ID == "" { + actual := prov.ID + if actual == "" { errchan <- fmt.Errorf("Got back nil provider (%s at %s)", k, dht.self) - } else if prov.ID != dhts[3].self { - errchan <- fmt.Errorf("Got back wrong provider (%s at %s)", k, dht.self) + } else if actual != expected { + errchan <- fmt.Errorf("Got back wrong provider (%s != %s) (%s at %s)", + expected, actual, k, dht.self) } case <-ctxT.Done(): errchan <- fmt.Errorf("Did not get a provider back (%s at %s)", k, dht.self) From bf609052a3d6b2fc4082af6a0a40b706a7b2b00c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 05:39:48 -0800 Subject: [PATCH 0476/3147] dht/test skip bootstrap test when short This commit was moved from ipfs/go-ipfs-routing@37d2cf1d49ce6a2a9452bdad2c94baeeac685467 --- routing/dht/dht_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index ddf3909c8a..5603c4d5c1 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -258,6 +258,10 @@ func TestProvides(t *testing.T) { } func TestBootstrap(t *testing.T) { + if testing.Short() { + t.SkipNow() + } + ctx := context.Background() nDHTs := 15 From c6e5ddae65dff582ccc0c619c98a40761ca483bc Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 23 Dec 2014 21:25:29 -0500 Subject: [PATCH 0477/3147] refactor(routing/mock) move files This commit was moved from ipfs/go-ipfs-routing@ea3d2cf60ce24bf731f014f730e9b0485d1907fd --- routing/mock/{client.go => centralized_client.go} | 0 routing/mock/{server.go => centralized_server.go} | 0 routing/mock/{mockrouting_test.go => centralized_test.go} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename routing/mock/{client.go => centralized_client.go} (100%) rename routing/mock/{server.go => centralized_server.go} (100%) rename routing/mock/{mockrouting_test.go => centralized_test.go} (100%) diff --git a/routing/mock/client.go b/routing/mock/centralized_client.go similarity index 100% rename from routing/mock/client.go rename to routing/mock/centralized_client.go diff --git a/routing/mock/server.go b/routing/mock/centralized_server.go similarity index 100% rename from routing/mock/server.go rename to routing/mock/centralized_server.go diff --git a/routing/mock/mockrouting_test.go b/routing/mock/centralized_test.go similarity index 100% rename from routing/mock/mockrouting_test.go rename to routing/mock/centralized_test.go From 6e44106d9ce7ad4a3f3faa2e28a0f02d5f0919cf Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 17 Dec 2014 10:02:19 -0800 Subject: [PATCH 0478/3147] wip with DHT @whyrusleeping @jbenet this is a WIP with the DHT. wip License: MIT Signed-off-by: Brian Tiger Chow Conflicts: epictest/addcat_test.go exchange/bitswap/testnet/peernet.go exchange/bitswap/testutils.go routing/mock/centralized_server.go routing/mock/centralized_test.go routing/mock/interface.go fix(routing/mock) fill in function definition This commit was moved from ipfs/go-ipfs-routing@544e4796ce46f0c821357d89c5bb34026c00cbaf --- routing/dht/routing.go | 10 ++++++++ routing/mock/centralized_client.go | 10 ++++++-- routing/mock/centralized_server.go | 8 ++++--- routing/mock/centralized_test.go | 34 ++++++++++---------------- routing/mock/interface.go | 6 ++--- routing/mock/server2.go | 38 ++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 30 deletions(-) create mode 100644 routing/mock/server2.go diff --git a/routing/dht/routing.go b/routing/dht/routing.go index c515324c58..34108f076a 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,6 +1,7 @@ package dht import ( + "math" "sync" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -127,6 +128,15 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { return nil } +// FindProviders searches until the context expires. +func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerInfo, error) { + var providers []peer.PeerInfo + for p := range dht.FindProvidersAsync(ctx, key, math.MaxInt32) { + providers = append(providers, p) + } + return providers, nil +} + // FindProvidersAsync is the same thing as FindProviders, but returns a channel. // Peers will be returned on the channel as soon as they are found, even before // the search query completes. diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 9be43b6530..0ba4be5385 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -5,9 +5,11 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" + "github.com/jbenet/go-ipfs/util/testutil" ) var log = u.Logger("mockrouter") @@ -15,7 +17,7 @@ var log = u.Logger("mockrouter") type client struct { datastore ds.Datastore server server - peer peer.PeerInfo + peer testutil.Peer } // FIXME(brian): is this method meant to simulate putting a value into the network? @@ -70,7 +72,11 @@ func (c *client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha // Provide returns once the message is on the network. Value is not necessarily // visible yet. func (c *client) Provide(_ context.Context, key u.Key) error { - return c.server.Announce(c.peer, key) + info := peer.PeerInfo{ + ID: c.peer.ID(), + Addrs: []ma.Multiaddr{c.peer.Address()}, + } + return c.server.Announce(info, key) } var _ routing.IpfsRouting = &client{} diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 31ae4b730a..10f81eb2c6 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -5,9 +5,11 @@ import ( "sync" "time" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" + "github.com/jbenet/go-ipfs/util/testutil" ) // server is the mockrouting.Client's private interface to the routing server @@ -71,11 +73,11 @@ func (rs *s) Providers(k u.Key) []peer.PeerInfo { return ret } -func (rs *s) Client(p peer.PeerInfo) Client { - return rs.ClientWithDatastore(p, ds.NewMapDatastore()) +func (rs *s) Client(p testutil.Peer) Client { + return rs.ClientWithDatastore(context.Background(), p, ds.NewMapDatastore()) } -func (rs *s) ClientWithDatastore(p peer.PeerInfo, datastore ds.Datastore) Client { +func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Peer, datastore ds.Datastore) Client { return &client{ peer: p, datastore: ds.NewMapDatastore(), diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 739edbc639..bda7ac0044 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,11 +8,12 @@ import ( peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" delay "github.com/jbenet/go-ipfs/util/delay" + "github.com/jbenet/go-ipfs/util/testutil" ) func TestKeyNotFound(t *testing.T) { - var pi = peer.PeerInfo{ID: peer.ID("the peer id")} + var pi = testutil.RandPeerOrFatal(t) var key = u.Key("mock key") var ctx = context.Background() @@ -25,7 +26,7 @@ func TestKeyNotFound(t *testing.T) { } func TestClientFindProviders(t *testing.T) { - pi := peer.PeerInfo{ID: peer.ID("42")} + pi := testutil.RandPeerOrFatal(t) rs := NewServer() client := rs.Client(pi) @@ -39,20 +40,6 @@ func TestClientFindProviders(t *testing.T) { time.Sleep(time.Millisecond * 300) max := 100 - providersFromHashTable, err := rs.Client(pi).FindProviders(context.Background(), k) - if err != nil { - t.Fatal(err) - } - - isInHT := false - for _, pi := range providersFromHashTable { - if pi.ID == pi.ID { - isInHT = true - } - } - if !isInHT { - t.Fatal("Despite client providing key, peer wasn't in hash table as a provider") - } providersFromClient := client.FindProvidersAsync(context.Background(), u.Key("hello"), max) isInClient := false for pi := range providersFromClient { @@ -70,7 +57,7 @@ func TestClientOverMax(t *testing.T) { k := u.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { - pi := peer.PeerInfo{ID: peer.ID(i)} + pi := testutil.RandPeerOrFatal(t) err := rs.Client(pi).Provide(context.Background(), k) if err != nil { t.Fatal(err) @@ -78,7 +65,7 @@ func TestClientOverMax(t *testing.T) { } max := 10 - pi := peer.PeerInfo{ID: peer.ID("TODO")} + pi := testutil.RandPeerOrFatal(t) client := rs.Client(pi) providersFromClient := client.FindProvidersAsync(context.Background(), k, max) @@ -113,8 +100,11 @@ func TestCanceledContext(t *testing.T) { default: } - pi := peer.PeerInfo{ID: peer.ID(i)} - err := rs.Client(pi).Provide(context.Background(), k) + pi, err := testutil.RandPeer() + if err != nil { + t.Error(err) + } + err = rs.Client(pi).Provide(context.Background(), k) if err != nil { t.Error(err) } @@ -122,7 +112,7 @@ func TestCanceledContext(t *testing.T) { } }() - local := peer.PeerInfo{ID: peer.ID("peer id doesn't matter")} + local := testutil.RandPeerOrFatal(t) client := rs.Client(local) t.Log("warning: max is finite so this test is non-deterministic") @@ -148,7 +138,7 @@ func TestCanceledContext(t *testing.T) { func TestValidAfter(t *testing.T) { - var pi = peer.PeerInfo{ID: peer.ID("the peer id")} + pi := testutil.RandPeerOrFatal(t) var key = u.Key("mock key") var ctx = context.Background() conf := DelayConfig{ diff --git a/routing/mock/interface.go b/routing/mock/interface.go index abb869eb48..3ff1ca059e 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,18 +11,18 @@ import ( routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" delay "github.com/jbenet/go-ipfs/util/delay" + "github.com/jbenet/go-ipfs/util/testutil" ) // Server provides mockrouting Clients type Server interface { - Client(p peer.PeerInfo) Client - ClientWithDatastore(peer.PeerInfo, ds.Datastore) Client + Client(p testutil.Peer) Client + ClientWithDatastore(context.Context, testutil.Peer, ds.Datastore) Client } // Client implements IpfsRouting type Client interface { FindProviders(context.Context, u.Key) ([]peer.PeerInfo, error) - routing.IpfsRouting } diff --git a/routing/mock/server2.go b/routing/mock/server2.go new file mode 100644 index 0000000000..dc3dccdfa3 --- /dev/null +++ b/routing/mock/server2.go @@ -0,0 +1,38 @@ +package mockrouting + +import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + mocknet "github.com/jbenet/go-ipfs/net/mock" + dht "github.com/jbenet/go-ipfs/routing/dht" + "github.com/jbenet/go-ipfs/util/testutil" +) + +type mocknetserver struct { + mn mocknet.Mocknet +} + +func NewDHTNetwork(mn mocknet.Mocknet) Server { + return &mocknetserver{ + mn: mn, + } +} + +func (rs *mocknetserver) Client(p testutil.Peer) Client { + return rs.ClientWithDatastore(context.TODO(), p, ds.NewMapDatastore()) +} + +func (rs *mocknetserver) ClientWithDatastore(ctx context.Context, p testutil.Peer, ds ds.Datastore) Client { + + // FIXME AddPeer doesn't appear to be idempotent + + net, err := rs.mn.AddPeer(p.PrivateKey(), p.Address()) + if err != nil { + panic("FIXME") + // return nil, debugerror.Wrap(err) + } + return dht.NewDHT(ctx, p.ID(), net, sync.MutexWrap(ds)) +} + +var _ Server = &mocknetserver{} From a329f346cbc55a4356f295a36ee8b78e596ee796 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 17 Dec 2014 10:02:19 -0800 Subject: [PATCH 0479/3147] wip with DHT @whyrusleeping @jbenet this is a WIP with the DHT. wip License: MIT Signed-off-by: Brian Tiger Chow Conflicts: epictest/addcat_test.go exchange/bitswap/testnet/peernet.go exchange/bitswap/testutils.go routing/mock/centralized_server.go routing/mock/centralized_test.go routing/mock/interface.go fix(routing/mock) fill in function definition This commit was moved from ipfs/go-namesys@78638f20dbf5eb3ab660e7ec5f34b0db97cc2574 --- namesys/resolve_test.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index fb29490f39..74fb08982b 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -4,18 +4,13 @@ import ( "testing" ci "github.com/jbenet/go-ipfs/crypto" - peer "github.com/jbenet/go-ipfs/peer" mockrouting "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" ) func TestRoutingResolve(t *testing.T) { - local, err := testutil.RandPeerID() - if err != nil { - t.Fatal(err) - } - d := mockrouting.NewServer().Client(peer.PeerInfo{ID: local}) + d := mockrouting.NewServer().Client(testutil.RandPeerOrFatal(t)) resolver := NewRoutingResolver(d) publisher := NewRoutingPublisher(d) From 8dc1bee3df4f1cf95c54275a2e14688f86d1e31d Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 24 Dec 2014 09:38:51 -0500 Subject: [PATCH 0480/3147] rename to dht This commit was moved from ipfs/go-ipfs-routing@536262cae3d1e00325591b3a167a56415ddf1f91 --- routing/mock/{server2.go => dht.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename routing/mock/{server2.go => dht.go} (100%) diff --git a/routing/mock/server2.go b/routing/mock/dht.go similarity index 100% rename from routing/mock/server2.go rename to routing/mock/dht.go From fdd8003e78ef390538b84a2e455cbe752d6524ff Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 24 Dec 2014 09:53:18 -0500 Subject: [PATCH 0481/3147] style(testutil) rename testutil.Peer -> testutil.Identity cc @jbenet This commit was moved from ipfs/go-ipfs-routing@9b3a1679f8b9d0423062ede291375c4965ccd8d9 --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 ++-- routing/mock/centralized_test.go | 14 +++++++------- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 0ba4be5385..6b5a455a7c 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -17,7 +17,7 @@ var log = u.Logger("mockrouter") type client struct { datastore ds.Datastore server server - peer testutil.Peer + peer testutil.Identity } // FIXME(brian): is this method meant to simulate putting a value into the network? diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 10f81eb2c6..030227b1b6 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -73,11 +73,11 @@ func (rs *s) Providers(k u.Key) []peer.PeerInfo { return ret } -func (rs *s) Client(p testutil.Peer) Client { +func (rs *s) Client(p testutil.Identity) Client { return rs.ClientWithDatastore(context.Background(), p, ds.NewMapDatastore()) } -func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Peer, datastore ds.Datastore) Client { +func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Identity, datastore ds.Datastore) Client { return &client{ peer: p, datastore: ds.NewMapDatastore(), diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index bda7ac0044..dcaf165b15 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -13,7 +13,7 @@ import ( func TestKeyNotFound(t *testing.T) { - var pi = testutil.RandPeerOrFatal(t) + var pi = testutil.RandIdentityOrFatal(t) var key = u.Key("mock key") var ctx = context.Background() @@ -26,7 +26,7 @@ func TestKeyNotFound(t *testing.T) { } func TestClientFindProviders(t *testing.T) { - pi := testutil.RandPeerOrFatal(t) + pi := testutil.RandIdentityOrFatal(t) rs := NewServer() client := rs.Client(pi) @@ -57,7 +57,7 @@ func TestClientOverMax(t *testing.T) { k := u.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { - pi := testutil.RandPeerOrFatal(t) + pi := testutil.RandIdentityOrFatal(t) err := rs.Client(pi).Provide(context.Background(), k) if err != nil { t.Fatal(err) @@ -65,7 +65,7 @@ func TestClientOverMax(t *testing.T) { } max := 10 - pi := testutil.RandPeerOrFatal(t) + pi := testutil.RandIdentityOrFatal(t) client := rs.Client(pi) providersFromClient := client.FindProvidersAsync(context.Background(), k, max) @@ -100,7 +100,7 @@ func TestCanceledContext(t *testing.T) { default: } - pi, err := testutil.RandPeer() + pi, err := testutil.RandIdentity() if err != nil { t.Error(err) } @@ -112,7 +112,7 @@ func TestCanceledContext(t *testing.T) { } }() - local := testutil.RandPeerOrFatal(t) + local := testutil.RandIdentityOrFatal(t) client := rs.Client(local) t.Log("warning: max is finite so this test is non-deterministic") @@ -138,7 +138,7 @@ func TestCanceledContext(t *testing.T) { func TestValidAfter(t *testing.T) { - pi := testutil.RandPeerOrFatal(t) + pi := testutil.RandIdentityOrFatal(t) var key = u.Key("mock key") var ctx = context.Background() conf := DelayConfig{ diff --git a/routing/mock/dht.go b/routing/mock/dht.go index dc3dccdfa3..1dfa415e03 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -19,11 +19,11 @@ func NewDHTNetwork(mn mocknet.Mocknet) Server { } } -func (rs *mocknetserver) Client(p testutil.Peer) Client { +func (rs *mocknetserver) Client(p testutil.Identity) Client { return rs.ClientWithDatastore(context.TODO(), p, ds.NewMapDatastore()) } -func (rs *mocknetserver) ClientWithDatastore(ctx context.Context, p testutil.Peer, ds ds.Datastore) Client { +func (rs *mocknetserver) ClientWithDatastore(ctx context.Context, p testutil.Identity, ds ds.Datastore) Client { // FIXME AddPeer doesn't appear to be idempotent diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 3ff1ca059e..0bb54f365f 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -16,8 +16,8 @@ import ( // Server provides mockrouting Clients type Server interface { - Client(p testutil.Peer) Client - ClientWithDatastore(context.Context, testutil.Peer, ds.Datastore) Client + Client(p testutil.Identity) Client + ClientWithDatastore(context.Context, testutil.Identity, ds.Datastore) Client } // Client implements IpfsRouting From 3d3d978bb9890f9da3ac6110842d13a4b65263f6 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 24 Dec 2014 09:53:18 -0500 Subject: [PATCH 0482/3147] style(testutil) rename testutil.Peer -> testutil.Identity cc @jbenet This commit was moved from ipfs/go-namesys@2c0dec26f4e0bff6a1c1579ccff0dde5a599f705 --- namesys/resolve_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 74fb08982b..84e4f1cb62 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,7 +10,7 @@ import ( ) func TestRoutingResolve(t *testing.T) { - d := mockrouting.NewServer().Client(testutil.RandPeerOrFatal(t)) + d := mockrouting.NewServer().Client(testutil.RandIdentityOrFatal(t)) resolver := NewRoutingResolver(d) publisher := NewRoutingPublisher(d) From 8d2411f03af2b33347b353f4571e7650510b8a67 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 14 Dec 2014 00:50:49 +0000 Subject: [PATCH 0483/3147] rewrite of provides to better select peers to send RPCs to refactor test peer creation to be deterministic and reliable a bit of cleanup trying to figure out TestGetFailure add test to verify deterministic peer creation switch put RPC over to use getClosestPeers rm 0xDEADC0DE fix queries not searching peer if its not actually closer This commit was moved from ipfs/go-ipfs-routing@04e9ae3375837ed683cadba30ca47cabff5fa932 --- routing/dht/dht.go | 33 +++------- routing/dht/dht_test.go | 19 +++--- routing/dht/ext_test.go | 7 +-- routing/dht/handlers.go | 11 ++-- routing/dht/query.go | 31 +++------ routing/dht/routing.go | 126 +++++++++++++++++++++++++++++++------ routing/kbucket/sorting.go | 59 +++++++++++++++++ routing/kbucket/table.go | 35 ----------- 8 files changed, 203 insertions(+), 118 deletions(-) create mode 100644 routing/kbucket/sorting.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4cbf68e43b..1573f3477c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -103,9 +103,8 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { } // putValueToNetwork stores the given key/value pair at the peer 'p' -// meaning: it sends a PUT_VALUE message to p func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.ID, - key string, rec *pb.Record) error { + key u.Key, rec *pb.Record) error { pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) pmes.Record = rec @@ -285,7 +284,7 @@ func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.ID { } // betterPeerToQuery returns nearestPeersToQuery, but iff closer than self. -func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.ID { +func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) []peer.ID { closer := dht.nearestPeersToQuery(pmes, count) // no node? nil @@ -302,11 +301,16 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, count int) []peer.ID { } var filtered []peer.ID - for _, p := range closer { + for _, clp := range closer { + // Dont send a peer back themselves + if p == clp { + continue + } + // must all be closer than self key := u.Key(pmes.GetKey()) - if !kb.Closer(dht.self, p, key) { - filtered = append(filtered, p) + if !kb.Closer(dht.self, clp, key) { + filtered = append(filtered, clp) } } @@ -323,23 +327,6 @@ func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, p peer.ID) error return dht.network.DialPeer(ctx, p) } -//TODO: this should be smarter about which keys it selects. -func (dht *IpfsDHT) loadProvidableKeys() error { - kl, err := dht.datastore.KeyList() - if err != nil { - return err - } - for _, dsk := range kl { - k := u.KeyFromDsKey(dsk) - if len(k) == 0 { - log.Errorf("loadProvidableKeys error: %v", dsk) - } - - dht.providers.AddProvider(k, dht.self) - } - return nil -} - // PingRoutine periodically pings nearest neighbors. func (dht *IpfsDHT) PingRoutine(t time.Duration) { defer dht.Children().Done() diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 5603c4d5c1..bbc7b9692f 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,7 +14,6 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - // ci "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" @@ -33,9 +32,9 @@ func init() { } } -func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { +func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr, seed int64) *IpfsDHT { - sk, pk, err := testutil.RandKeyPair(512) + sk, pk, err := testutil.SeededKeyPair(512, seed) if err != nil { t.Fatal(err) } @@ -71,7 +70,7 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer for i := 0; i < n; i++ { addrs[i] = testutil.RandLocalTCPAddress() - dhts[i] = setupDHT(ctx, t, addrs[i]) + dhts[i] = setupDHT(ctx, t, addrs[i], int64(i)) peers[i] = dhts[i].self } @@ -120,8 +119,8 @@ func TestPing(t *testing.T) { addrA := testutil.RandLocalTCPAddress() addrB := testutil.RandLocalTCPAddress() - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + dhtA := setupDHT(ctx, t, addrA, 1) + dhtB := setupDHT(ctx, t, addrB, 2) peerA := dhtA.self peerB := dhtB.self @@ -153,8 +152,8 @@ func TestValueGetSet(t *testing.T) { addrA := testutil.RandLocalTCPAddress() addrB := testutil.RandLocalTCPAddress() - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + dhtA := setupDHT(ctx, t, addrA, 1) + dhtB := setupDHT(ctx, t, addrB, 2) defer dhtA.Close() defer dhtB.Close() @@ -642,8 +641,8 @@ func TestConnectCollision(t *testing.T) { addrA := testutil.RandLocalTCPAddress() addrB := testutil.RandLocalTCPAddress() - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + dhtA := setupDHT(ctx, t, addrA, int64((rtime*2)+1)) + dhtB := setupDHT(ctx, t, addrB, int64((rtime*2)+2)) peerA := dhtA.self peerB := dhtB.self diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index b4b1158d7e..8441c1f726 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -47,9 +47,8 @@ func TestGetFailures(t *testing.T) { t.Fatal("Did not get expected error!") } - msgs := make(chan *pb.Message, 100) + t.Log("Timeout test passed.") - // u.POut("NotFound Test\n") // Reply with failures to every message nets[1].SetHandler(inet.ProtocolDHT, func(s inet.Stream) { defer s.Close() @@ -68,8 +67,6 @@ func TestGetFailures(t *testing.T) { if err := pbw.WriteMsg(resp); err != nil { panic(err) } - - msgs <- resp }) // This one should fail with NotFound @@ -83,6 +80,8 @@ func TestGetFailures(t *testing.T) { t.Fatal("expected error, got none.") } + t.Log("ErrNotFound check passed!") + // Now we test this DHT's handleGetValue failure { typ := pb.Message_GET_VALUE diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 5aec6c2fff..e8edaa5eb0 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -93,7 +93,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess } // Find closest peer on given cluster to desired key and reply with that info - closer := dht.betterPeersToQuery(pmes, CloserPeerCount) + closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) closerinfos := peer.PeerInfos(dht.peerstore, closer) if closer != nil { for _, pi := range closerinfos { @@ -137,6 +137,9 @@ func (dht *IpfsDHT) handlePing(_ context.Context, p peer.ID, pmes *pb.Message) ( } func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { + log.Errorf("handle find peer %s start", p) + defer log.Errorf("handle find peer %s end", p) + resp := pb.NewMessage(pmes.GetType(), "", pmes.GetClusterLevel()) var closest []peer.ID @@ -144,11 +147,11 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess if peer.ID(pmes.GetKey()) == dht.self { closest = []peer.ID{dht.self} } else { - closest = dht.betterPeersToQuery(pmes, CloserPeerCount) + closest = dht.betterPeersToQuery(pmes, p, CloserPeerCount) } if closest == nil { - log.Debugf("handleFindPeer: could not find anything.") + log.Warningf("handleFindPeer: could not find anything.") return resp, nil } @@ -189,7 +192,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. } // Also send closer peers. - closer := dht.betterPeersToQuery(pmes, CloserPeerCount) + closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if closer != nil { infos := peer.PeerInfos(dht.peerstore, providers) resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, infos) diff --git a/routing/dht/query.go b/routing/dht/query.go index 6a7bb687d3..4790e814c3 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -7,8 +7,8 @@ import ( peer "github.com/jbenet/go-ipfs/peer" queue "github.com/jbenet/go-ipfs/peer/queue" "github.com/jbenet/go-ipfs/routing" - kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" + pset "github.com/jbenet/go-ipfs/util/peerset" todoctr "github.com/jbenet/go-ipfs/util/todocounter" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -71,7 +71,7 @@ type dhtQueryRunner struct { peersToQuery *queue.ChanQueue // peersSeen are all the peers queried. used to prevent querying same peer 2x - peersSeen peer.Set + peersSeen *pset.PeerSet // rateLimit is a channel used to rate limit our processing (semaphore) rateLimit chan struct{} @@ -97,7 +97,7 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { query: q, peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(q.key)), peersRemaining: todoctr.NewSyncCounter(), - peersSeen: peer.Set{}, + peersSeen: pset.New(), rateLimit: make(chan struct{}, q.concurrency), cg: ctxgroup.WithContext(ctx), } @@ -117,7 +117,7 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { // add all the peers we got first. for _, p := range peers { - r.addPeerToQuery(r.cg.Context(), p, "") // don't have access to self here... + r.addPeerToQuery(r.cg.Context(), p) } // go do this thing. @@ -153,32 +153,17 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { return nil, err } -func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID, benchmark peer.ID) { +func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { // if new peer is ourselves... if next == r.query.dialer.LocalPeer() { return } - // if new peer further away than whom we got it from, don't bother (loops) - // TODO----------- this benchmark should be replaced by a heap: - // we should be doing the s/kademlia "continue to search" - // (i.e. put all of them in a heap sorted by dht distance and then just - // pull from the the top until a) you exhaust all peers you get, - // b) you succeed, c) your context expires. - if benchmark != "" && kb.Closer(benchmark, next, r.query.key) { + if !r.peersSeen.TryAdd(next) { + log.Debug("query peer was already seen") return } - // if already seen, no need. - r.Lock() - _, found := r.peersSeen[next] - if found { - r.Unlock() - return - } - r.peersSeen[next] = struct{}{} - r.Unlock() - log.Debugf("adding peer to query: %v", next) // do this after unlocking to prevent possible deadlocks. @@ -278,7 +263,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { } r.query.dialer.Peerstore().AddAddresses(next.ID, next.Addrs) - r.addPeerToQuery(cg.Context(), next.ID, p) + r.addPeerToQuery(cg.Context(), next.ID) log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } } else { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 34108f076a..0cd5751a12 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -40,19 +40,24 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) - - query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - log.Debugf("%s PutValue qry part %v", dht.self, p) - err := dht.putValueToNetwork(ctx, p, string(key), rec) - if err != nil { - return nil, err - } - return &dhtQueryResult{success: true}, nil - }) + pchan, err := dht.getClosestPeers(ctx, key, KValue) + if err != nil { + return err + } - _, err = query.Run(ctx, peers) - return err + wg := sync.WaitGroup{} + for p := range pchan { + wg.Add(1) + go func(p peer.ID) { + defer wg.Done() + err := dht.putValueToNetwork(ctx, p, key, rec) + if err != nil { + log.Errorf("failed putting value to peer: %s", err) + } + }(p) + } + wg.Wait() + return nil } // GetValue searches for the value corresponding to given Key. @@ -111,18 +116,19 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // Provide makes this node announce that it can provide a value for the given key func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { + log.Event(ctx, "Provide Value start", &key) + defer log.Event(ctx, "Provide Value end", &key) dht.providers.AddProvider(key, dht.self) - peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), PoolSize) - if len(peers) == 0 { - return nil + + peers, err := dht.getClosestPeers(ctx, key, KValue) + if err != nil { + return err } - //TODO FIX: this doesn't work! it needs to be sent to the actual nearest peers. - // `peers` are the closest peers we have, not the ones that should get the value. - for _, p := range peers { + for p := range peers { err := dht.putProvider(ctx, p, string(key)) if err != nil { - return err + log.Error(err) } } return nil @@ -137,6 +143,87 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn return providers, nil } +func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key, count int) (<-chan peer.ID, error) { + log.Error("Get Closest Peers") + tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) + if len(tablepeers) == 0 { + return nil, kb.ErrLookupFailure + } + + out := make(chan peer.ID, count) + peerset := pset.NewLimited(count) + + for _, p := range tablepeers { + out <- p + peerset.Add(p) + } + + wg := sync.WaitGroup{} + for _, p := range tablepeers { + wg.Add(1) + go func(p peer.ID) { + dht.getClosestPeersRecurse(ctx, key, p, peerset, out) + wg.Done() + }(p) + } + + go func() { + wg.Wait() + close(out) + log.Error("Closing closest peer chan") + }() + + return out, nil +} + +func (dht *IpfsDHT) getClosestPeersRecurse(ctx context.Context, key u.Key, p peer.ID, peers *pset.PeerSet, peerOut chan<- peer.ID) { + log.Error("closest peers recurse") + defer log.Error("closest peers recurse end") + closer, err := dht.closerPeersSingle(ctx, key, p) + if err != nil { + log.Errorf("error getting closer peers: %s", err) + return + } + + wg := sync.WaitGroup{} + for _, p := range closer { + if kb.Closer(p, dht.self, key) && peers.TryAdd(p) { + select { + case peerOut <- p: + case <-ctx.Done(): + return + } + wg.Add(1) + go func(p peer.ID) { + dht.getClosestPeersRecurse(ctx, key, p, peers, peerOut) + wg.Done() + }(p) + } + } + wg.Wait() +} + +func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) ([]peer.ID, error) { + log.Errorf("closest peers single %s %s", p, key) + defer log.Errorf("closest peers single end %s %s", p, key) + pmes, err := dht.findPeerSingle(ctx, p, peer.ID(key)) + if err != nil { + return nil, err + } + + var out []peer.ID + for _, pbp := range pmes.GetCloserPeers() { + pid := peer.ID(pbp.GetId()) + dht.peerstore.AddAddresses(pid, pbp.Addresses()) + err := dht.ensureConnectedToPeer(ctx, pid) + if err != nil { + return nil, err + } + out = append(out, pid) + } + return out, nil +} + // FindProvidersAsync is the same thing as FindProviders, but returns a channel. // Peers will be returned on the channel as soon as they are found, even before // the search query completes. @@ -182,6 +269,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // Add unique providers from request, up to 'count' for _, prov := range provs { if ps.TryAdd(prov.ID) { + dht.peerstore.AddAddresses(prov.ID, prov.Addrs) select { case peerOut <- prov: case <-ctx.Done(): diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go new file mode 100644 index 0000000000..a3a68767b7 --- /dev/null +++ b/routing/kbucket/sorting.go @@ -0,0 +1,59 @@ +package kbucket + +import ( + "container/list" + peer "github.com/jbenet/go-ipfs/peer" + "sort" +) + +// A helper struct to sort peers by their distance to the local node +type peerDistance struct { + p peer.ID + distance ID +} + +// peerSorterArr implements sort.Interface to sort peers by xor distance +type peerSorterArr []*peerDistance + +func (p peerSorterArr) Len() int { return len(p) } +func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } +func (p peerSorterArr) Less(a, b int) bool { + return p[a].distance.less(p[b].distance) +} + +// + +func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { + for e := peerList.Front(); e != nil; e = e.Next() { + p := e.Value.(peer.ID) + pID := ConvertPeerID(p) + pd := peerDistance{ + p: p, + distance: xor(target, pID), + } + peerArr = append(peerArr, &pd) + if e == nil { + log.Debug("list element was nil") + return peerArr + } + } + return peerArr +} + +func SortClosestPeers(peers []peer.ID, target ID) []peer.ID { + var psarr peerSorterArr + for _, p := range peers { + pID := ConvertPeerID(p) + pd := &peerDistance{ + p: p, + distance: xor(target, pID), + } + psarr = append(psarr, pd) + } + sort.Sort(psarr) + var out []peer.ID + for _, p := range psarr { + out = append(out, p.p) + } + return out +} diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index bed7447a54..90ba655303 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -2,7 +2,6 @@ package kbucket import ( - "container/list" "fmt" "sort" "sync" @@ -103,40 +102,6 @@ func (rt *RoutingTable) nextBucket() peer.ID { return "" } -// A helper struct to sort peers by their distance to the local node -type peerDistance struct { - p peer.ID - distance ID -} - -// peerSorterArr implements sort.Interface to sort peers by xor distance -type peerSorterArr []*peerDistance - -func (p peerSorterArr) Len() int { return len(p) } -func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } -func (p peerSorterArr) Less(a, b int) bool { - return p[a].distance.less(p[b].distance) -} - -// - -func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(peer.ID) - pID := ConvertPeerID(p) - pd := peerDistance{ - p: p, - distance: xor(target, pID), - } - peerArr = append(peerArr, &pd) - if e == nil { - log.Debug("list element was nil") - return peerArr - } - } - return peerArr -} - // Find a specific peer by ID or return nil func (rt *RoutingTable) Find(id peer.ID) peer.ID { srch := rt.NearestPeers(ConvertPeerID(id), 1) From ae786f92e7e17f7fdb5d9131ca3f01398248f972 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 14 Dec 2014 00:50:49 +0000 Subject: [PATCH 0484/3147] rewrite of provides to better select peers to send RPCs to refactor test peer creation to be deterministic and reliable a bit of cleanup trying to figure out TestGetFailure add test to verify deterministic peer creation switch put RPC over to use getClosestPeers rm 0xDEADC0DE fix queries not searching peer if its not actually closer This commit was moved from ipfs/go-namesys@6693d80a2d2d6dc58260f5fc16160c8ee2218e38 --- namesys/resolve_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 84e4f1cb62..592c344d73 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -15,7 +15,7 @@ func TestRoutingResolve(t *testing.T) { resolver := NewRoutingResolver(d) publisher := NewRoutingPublisher(d) - privk, pubk, err := ci.GenerateKeyPair(ci.RSA, 512) + privk, pubk, err := ci.GenerateKeyPair(ci.RSA, 512, u.NewTimeSeededRand()) if err != nil { t.Fatal(err) } From 06477b48cf05f9118137551666e8bf3a6460d439 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 24 Dec 2014 19:42:37 +0000 Subject: [PATCH 0485/3147] a couple small fixes This commit was moved from ipfs/go-ipfs-routing@a8ef90cf86d26f23c2de3763867a93d224075f1b --- routing/dht/routing.go | 1 - 1 file changed, 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 0cd5751a12..a0334451f5 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -269,7 +269,6 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // Add unique providers from request, up to 'count' for _, prov := range provs { if ps.TryAdd(prov.ID) { - dht.peerstore.AddAddresses(prov.ID, prov.Addrs) select { case peerOut <- prov: case <-ctx.Done(): From 89393c586d53d071e029ce861c8d2c1853664176 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 28 Dec 2014 15:46:41 -0800 Subject: [PATCH 0486/3147] dht: fix TestLayeredGet The test was occasionally passing because: - it called `putLocal(key, val)` - GetValue calls `getLocal(key)` optimistically. cc @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@cda86e983924bee75e0ce73e4f94813ab8112a40 --- routing/dht/dht_test.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index bbc7b9692f..547e88a9ce 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -486,12 +486,7 @@ func TestLayeredGet(t *testing.T) { connect(t, ctx, dhts[1], dhts[2]) connect(t, ctx, dhts[1], dhts[3]) - err := dhts[3].putLocal(u.Key("/v/hello"), []byte("world")) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].Provide(ctx, u.Key("/v/hello")) + err := dhts[3].Provide(ctx, u.Key("/v/hello")) if err != nil { t.Fatal(err) } From d6c0095914fbb19bfc94b83b8dcfab2b2965d021 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 28 Dec 2014 23:46:25 +0000 Subject: [PATCH 0487/3147] some better logging and cleanup This commit was moved from ipfs/go-ipfs-routing@903a3095d03f0c6ae8ae97392a2b08cd76760716 --- routing/dht/dht.go | 30 ++++------------------- routing/dht/handlers.go | 7 ++---- routing/dht/routing.go | 54 ++++++++++------------------------------- 3 files changed, 20 insertions(+), 71 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1573f3477c..fb7c5a49b5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -102,8 +102,8 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { return nil } -// putValueToNetwork stores the given key/value pair at the peer 'p' -func (dht *IpfsDHT) putValueToNetwork(ctx context.Context, p peer.ID, +// putValueToPeer stores the given key/value pair at the peer 'p' +func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, key u.Key, rec *pb.Record) error { pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) @@ -237,12 +237,12 @@ func (dht *IpfsDHT) Update(ctx context.Context, p peer.ID) { } // FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. -func (dht *IpfsDHT) FindLocal(id peer.ID) (peer.PeerInfo, *kb.RoutingTable) { +func (dht *IpfsDHT) FindLocal(id peer.ID) peer.PeerInfo { p := dht.routingTable.Find(id) if p != "" { - return dht.peerstore.PeerInfo(p), dht.routingTable + return dht.peerstore.PeerInfo(p) } - return peer.PeerInfo{}, nil + return peer.PeerInfo{} } // findPeerSingle asks peer 'p' if they know where the peer with id 'id' is @@ -256,26 +256,6 @@ func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key u.Ke return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) addProviders(key u.Key, pbps []*pb.Message_Peer) []peer.ID { - peers := pb.PBPeersToPeerInfos(pbps) - - var provArr []peer.ID - for _, pi := range peers { - p := pi.ID - - // Dont add outselves to the list - if p == dht.self { - continue - } - - log.Debugf("%s adding provider: %s for %s", dht.self, p, key) - // TODO(jbenet) ensure providers is idempotent - dht.providers.AddProvider(key, p) - provArr = append(provArr, p) - } - return provArr -} - // nearestPeersToQuery returns the routing tables closest peers. func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.ID { key := u.Key(pmes.GetKey()) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index e8edaa5eb0..acb052248f 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -39,7 +39,7 @@ func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { } func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - log.Debugf("%s handleGetValue for key: %s\n", dht.self, pmes.GetKey()) + log.Debugf("%s handleGetValue for key: %s", dht.self, pmes.GetKey()) // setup response resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) @@ -127,7 +127,7 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess } err = dht.datastore.Put(dskey, data) - log.Debugf("%s handlePutValue %v\n", dht.self, dskey) + log.Debugf("%s handlePutValue %v", dht.self, dskey) return pmes, err } @@ -137,9 +137,6 @@ func (dht *IpfsDHT) handlePing(_ context.Context, p peer.ID, pmes *pb.Message) ( } func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - log.Errorf("handle find peer %s start", p) - defer log.Errorf("handle find peer %s end", p) - resp := pb.NewMessage(pmes.GetType(), "", pmes.GetClusterLevel()) var closest []peer.ID diff --git a/routing/dht/routing.go b/routing/dht/routing.go index a0334451f5..8b0bb16700 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -50,7 +50,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error wg.Add(1) go func(p peer.ID) { defer wg.Done() - err := dht.putValueToNetwork(ctx, p, key, rec) + err := dht.putValueToPeer(ctx, p, key, rec) if err != nil { log.Errorf("failed putting value to peer: %s", err) } @@ -125,12 +125,18 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { return err } + wg := sync.WaitGroup{} for p := range peers { - err := dht.putProvider(ctx, p, string(key)) - if err != nil { - log.Error(err) - } + wg.Add(1) + go func(p peer.ID) { + defer wg.Done() + err := dht.putProvider(ctx, p, string(key)) + if err != nil { + log.Error(err) + } + }(p) } + wg.Wait() return nil } @@ -144,7 +150,6 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn } func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key, count int) (<-chan peer.ID, error) { - log.Error("Get Closest Peers") tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) if len(tablepeers) == 0 { return nil, kb.ErrLookupFailure @@ -170,15 +175,12 @@ func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key, count int) ( go func() { wg.Wait() close(out) - log.Error("Closing closest peer chan") }() return out, nil } func (dht *IpfsDHT) getClosestPeersRecurse(ctx context.Context, key u.Key, p peer.ID, peers *pset.PeerSet, peerOut chan<- peer.ID) { - log.Error("closest peers recurse") - defer log.Error("closest peers recurse end") closer, err := dht.closerPeersSingle(ctx, key, p) if err != nil { log.Errorf("error getting closer peers: %s", err) @@ -204,8 +206,6 @@ func (dht *IpfsDHT) getClosestPeersRecurse(ctx context.Context, key u.Key, p pee } func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) ([]peer.ID, error) { - log.Errorf("closest peers single %s %s", p, key) - defer log.Errorf("closest peers single end %s %s", p, key) pmes, err := dht.findPeerSingle(ctx, p, peer.ID(key)) if err != nil { return nil, err @@ -236,6 +236,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { defer close(peerOut) + defer log.Event(ctx, "findProviders end", &key) log.Debugf("%s FindProviders %s", dht.self, key) ps := pset.NewLimited(count) @@ -294,40 +295,11 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } } -func (dht *IpfsDHT) addPeerListAsync(ctx context.Context, k u.Key, peers []*pb.Message_Peer, ps *pset.PeerSet, count int, out chan peer.PeerInfo) { - var wg sync.WaitGroup - peerInfos := pb.PBPeersToPeerInfos(peers) - for _, pi := range peerInfos { - wg.Add(1) - go func(pi peer.PeerInfo) { - defer wg.Done() - - p := pi.ID - if err := dht.ensureConnectedToPeer(ctx, p); err != nil { - log.Errorf("%s", err) - return - } - - dht.providers.AddProvider(k, p) - if ps.TryAdd(p) { - select { - case out <- pi: - case <-ctx.Done(): - return - } - } else if ps.Size() >= count { - return - } - }(pi) - } - wg.Wait() -} - // FindPeer searches for a peer with given ID. func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { // Check if were already connected to them - if pi, _ := dht.FindLocal(id); pi.ID != "" { + if pi := dht.FindLocal(id); pi.ID != "" { return pi, nil } From f51ebae060d486ab1dd8915b1ac3a13f46b3e3aa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 29 Dec 2014 06:32:27 +0000 Subject: [PATCH 0488/3147] use query for getClosestPeers This commit was moved from ipfs/go-ipfs-routing@a55bf913544d4976c87fcfc0130b6a077272be6a --- routing/dht/routing.go | 68 ++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 8b0bb16700..98c4ce3d43 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -159,52 +159,48 @@ func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key, count int) ( peerset := pset.NewLimited(count) for _, p := range tablepeers { - out <- p + select { + case out <- p: + case <-ctx.Done(): + return nil, ctx.Err() + } peerset.Add(p) } - wg := sync.WaitGroup{} - for _, p := range tablepeers { - wg.Add(1) - go func(p peer.ID) { - dht.getClosestPeersRecurse(ctx, key, p, peerset, out) - wg.Done() - }(p) - } + query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + closer, err := dht.closerPeersSingle(ctx, key, p) + if err != nil { + log.Errorf("error getting closer peers: %s", err) + return nil, err + } + + var filtered []peer.PeerInfo + for _, p := range closer { + if kb.Closer(p, dht.self, key) && peerset.TryAdd(p) { + select { + case out <- p: + case <-ctx.Done(): + return nil, ctx.Err() + } + filtered = append(filtered, dht.peerstore.PeerInfo(p)) + } + } + + return &dhtQueryResult{closerPeers: filtered}, nil + }) go func() { - wg.Wait() - close(out) + defer close(out) + // run it! + _, err := query.Run(ctx, tablepeers) + if err != nil { + log.Errorf("closestPeers query run error: %s", err) + } }() return out, nil } -func (dht *IpfsDHT) getClosestPeersRecurse(ctx context.Context, key u.Key, p peer.ID, peers *pset.PeerSet, peerOut chan<- peer.ID) { - closer, err := dht.closerPeersSingle(ctx, key, p) - if err != nil { - log.Errorf("error getting closer peers: %s", err) - return - } - - wg := sync.WaitGroup{} - for _, p := range closer { - if kb.Closer(p, dht.self, key) && peers.TryAdd(p) { - select { - case peerOut <- p: - case <-ctx.Done(): - return - } - wg.Add(1) - go func(p peer.ID) { - dht.getClosestPeersRecurse(ctx, key, p, peers, peerOut) - wg.Done() - }(p) - } - } - wg.Wait() -} - func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) ([]peer.ID, error) { pmes, err := dht.findPeerSingle(ctx, p, peer.ID(key)) if err != nil { From 398e3f81aed4c765d2bc55f1d15ba300eeee5881 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 29 Dec 2014 02:29:55 +0000 Subject: [PATCH 0489/3147] address comments from PR This commit was moved from ipfs/go-namesys@4baa9877a58d7e215a3c8e5f5e76e9278ef3daa5 --- namesys/resolve_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 592c344d73..35851fc328 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -3,7 +3,6 @@ package namesys import ( "testing" - ci "github.com/jbenet/go-ipfs/crypto" mockrouting "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" @@ -15,7 +14,7 @@ func TestRoutingResolve(t *testing.T) { resolver := NewRoutingResolver(d) publisher := NewRoutingPublisher(d) - privk, pubk, err := ci.GenerateKeyPair(ci.RSA, 512, u.NewTimeSeededRand()) + privk, pubk, err := testutil.RandKeyPair(512) if err != nil { t.Fatal(err) } From b79faa434305ba81c37521797a81522df174e903 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 29 Dec 2014 18:22:16 +0000 Subject: [PATCH 0490/3147] Improve readability of getClosestPeers method. Also remove older useless code. This commit was moved from ipfs/go-ipfs-routing@ec5d9c78ec9808d4ffd1fd20925eb7fe4b6bdd48 --- routing/dht/routing.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 98c4ce3d43..36e281cc97 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -40,7 +40,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - pchan, err := dht.getClosestPeers(ctx, key, KValue) + pchan, err := dht.getClosestPeers(ctx, key) if err != nil { return err } @@ -116,11 +116,11 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // Provide makes this node announce that it can provide a value for the given key func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { - log.Event(ctx, "Provide Value start", &key) - defer log.Event(ctx, "Provide Value end", &key) + log.Event(ctx, "provideBegin", &key) + defer log.Event(ctx, "provideEnd", &key) dht.providers.AddProvider(key, dht.self) - peers, err := dht.getClosestPeers(ctx, key, KValue) + peers, err := dht.getClosestPeers(ctx, key) if err != nil { return err } @@ -149,14 +149,16 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn return providers, nil } -func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key, count int) (<-chan peer.ID, error) { +// Kademlia 'node lookup' operation. Returns a channel of the K closest peers +// to the given key +func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer.ID, error) { tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) if len(tablepeers) == 0 { return nil, kb.ErrLookupFailure } - out := make(chan peer.ID, count) - peerset := pset.NewLimited(count) + out := make(chan peer.ID, KValue) + peerset := pset.NewLimited(KValue) for _, p := range tablepeers { select { @@ -211,10 +213,6 @@ func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) for _, pbp := range pmes.GetCloserPeers() { pid := peer.ID(pbp.GetId()) dht.peerstore.AddAddresses(pid, pbp.Addresses()) - err := dht.ensureConnectedToPeer(ctx, pid) - if err != nil { - return nil, err - } out = append(out, pid) } return out, nil From bde8466a5a521474582fdbcfa611bc7ae2955085 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 2 Jan 2015 08:33:42 +0000 Subject: [PATCH 0491/3147] clean up test setup interface This commit was moved from ipfs/go-ipfs-routing@a0ccd2d992853eb16f4e01f0d50c3ebfea849338 --- routing/dht/dht_test.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 547e88a9ce..5eeb3a2bc3 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -32,9 +32,9 @@ func init() { } } -func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr, seed int64) *IpfsDHT { +func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { - sk, pk, err := testutil.SeededKeyPair(512, seed) + sk, pk, err := testutil.SeededKeyPair(time.Now().UnixNano()) if err != nil { t.Fatal(err) } @@ -70,7 +70,7 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer for i := 0; i < n; i++ { addrs[i] = testutil.RandLocalTCPAddress() - dhts[i] = setupDHT(ctx, t, addrs[i], int64(i)) + dhts[i] = setupDHT(ctx, t, addrs[i]) peers[i] = dhts[i].self } @@ -119,8 +119,8 @@ func TestPing(t *testing.T) { addrA := testutil.RandLocalTCPAddress() addrB := testutil.RandLocalTCPAddress() - dhtA := setupDHT(ctx, t, addrA, 1) - dhtB := setupDHT(ctx, t, addrB, 2) + dhtA := setupDHT(ctx, t, addrA) + dhtB := setupDHT(ctx, t, addrB) peerA := dhtA.self peerB := dhtB.self @@ -152,8 +152,8 @@ func TestValueGetSet(t *testing.T) { addrA := testutil.RandLocalTCPAddress() addrB := testutil.RandLocalTCPAddress() - dhtA := setupDHT(ctx, t, addrA, 1) - dhtB := setupDHT(ctx, t, addrB, 2) + dhtA := setupDHT(ctx, t, addrA) + dhtB := setupDHT(ctx, t, addrB) defer dhtA.Close() defer dhtB.Close() @@ -636,8 +636,8 @@ func TestConnectCollision(t *testing.T) { addrA := testutil.RandLocalTCPAddress() addrB := testutil.RandLocalTCPAddress() - dhtA := setupDHT(ctx, t, addrA, int64((rtime*2)+1)) - dhtB := setupDHT(ctx, t, addrB, int64((rtime*2)+2)) + dhtA := setupDHT(ctx, t, addrA) + dhtB := setupDHT(ctx, t, addrB) peerA := dhtA.self peerB := dhtB.self From 1fbb90d39f6700f45126747f5c495a923f4bab43 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 2 Jan 2015 08:36:32 -0800 Subject: [PATCH 0492/3147] routing: use debugerror This commit was moved from ipfs/go-ipfs-routing@f72cf145534e417be5d8048b5136795e63c19c55 --- routing/dht/routing.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 36e281cc97..2a948f4bee 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,6 +12,7 @@ import ( pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" + errors "github.com/jbenet/go-ipfs/util/debugerror" pset "github.com/jbenet/go-ipfs/util/peerset" ) @@ -77,7 +78,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { closest := dht.routingTable.NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { log.Warning("Got no peers back from routing table!") - return nil, kb.ErrLookupFailure + return nil, errors.Wrap(kb.ErrLookupFailure) } // setup the Query @@ -154,7 +155,7 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer.ID, error) { tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) if len(tablepeers) == 0 { - return nil, kb.ErrLookupFailure + return nil, errors.Wrap(kb.ErrLookupFailure) } out := make(chan peer.ID, KValue) @@ -299,7 +300,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if closest == nil || len(closest) == 0 { - return peer.PeerInfo{}, kb.ErrLookupFailure + return peer.PeerInfo{}, errors.Wrap(kb.ErrLookupFailure) } // Sanity... @@ -356,7 +357,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if closest == nil || len(closest) == 0 { - return nil, kb.ErrLookupFailure + return nil, errors.Wrap(kb.ErrLookupFailure) } // setup the Query From e8fbf1483909f772a437281307bf7946506f0b07 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 2 Jan 2015 08:36:36 -0800 Subject: [PATCH 0493/3147] blockstore: suppress exchange error This commit was moved from ipfs/go-blockservice@dfa7749ee22dde7fcdf2d582e6aece63060a63c7 --- blockservice/blockservice.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 1a7ea6b7ad..db126f344a 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -50,9 +50,13 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // consider moving this to an sync process. if s.Exchange != nil { ctx := context.TODO() - err = s.Exchange.HasBlock(ctx, b) + if err := s.Exchange.HasBlock(ctx, b); err != nil { + // suppress error, as the client shouldn't care about bitswap. + // the client only cares about the blockstore.Put. + log.Errorf("Exchange.HasBlock error: %s", err) + } } - return k, err + return k, nil } // GetBlock retrieves a particular block from the service, From 9fb71b284d1bdf1fc7dc1a9d5d189078c36c2966 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 10:17:26 -0800 Subject: [PATCH 0494/3147] net: move Network implementation to own pkg I needed the network implementation in its own package, because I'll be writing several services that will plug into _it_ that shouldn't be part of the core net package. and then there were dependency conflicts. yay. mux + identify are good examples of what i mean. This commit was moved from ipfs/go-ipfs-routing@b39f91ee89dbed2444b72dbc1d205270b972b3d0 --- routing/dht/dht_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 5eeb3a2bc3..4e49b8f966 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,7 +14,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - inet "github.com/jbenet/go-ipfs/net" + ipfsnet "github.com/jbenet/go-ipfs/net/ipfsnet" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" @@ -49,7 +49,7 @@ func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { peerstore.AddPubKey(p, pk) peerstore.AddAddress(p, addr) - n, err := inet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) + n, err := ipfsnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) if err != nil { t.Fatal(err) } From e1c8556a39ace32c368abca31c3dbc4a9f46004f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 28 Dec 2014 06:25:45 -0800 Subject: [PATCH 0495/3147] ipfsnet -> swarmnet swarmnet is a better name for the package, because it's just a Network implemented with a Swarm. (ipfsnet will be something slightly different). This commit was moved from ipfs/go-ipfs-routing@49257c52f07c360e6fa7a9bf6e277398af035037 --- routing/dht/dht_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 4e49b8f966..088dff217c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,7 +14,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ipfsnet "github.com/jbenet/go-ipfs/net/ipfsnet" + swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" @@ -49,7 +49,7 @@ func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { peerstore.AddPubKey(p, pk) peerstore.AddAddress(p, addr) - n, err := ipfsnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) + n, err := swarmnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) if err != nil { t.Fatal(err) } From 74a43c62a5eecc0170e1dd666934510dfec31563 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:43:56 -0800 Subject: [PATCH 0496/3147] introducing p2p pkg I think it's time to move a lot of the peer-to-peer networking but-not-ipfs-specific things into its own package: p2p. This could in the future be split off into its own library. The first thing to go is the peer. This commit was moved from ipfs/go-ipfs-routing@888ed12fbc61fcc99e49620d6074f38b99b3ed7e --- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 2 +- routing/dht/routing.go | 2 +- routing/kbucket/bucket.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 2 +- routing/routing.go | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index fb7c5a49b5..ed9858c7ad 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -11,7 +11,7 @@ import ( "time" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index d247cf3afb..3eea25d9e0 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -5,7 +5,7 @@ import ( "time" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" ctxutil "github.com/jbenet/go-ipfs/util/ctx" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 088dff217c..f4f2a5414c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -15,7 +15,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 96d2b1a01b..79b4709e9c 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 8441c1f726..168a2d8ede 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -6,7 +6,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" mocknet "github.com/jbenet/go-ipfs/net/mock" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index acb052248f..a02eb024d6 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -8,7 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" ) diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 570c7cf189..87b0b1f4cf 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,7 +4,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 861c25f0c3..9e96eff361 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -4,7 +4,7 @@ import ( "time" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 35ff92dfe6..2781a3c59d 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -3,7 +3,7 @@ package dht import ( "testing" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/routing/dht/query.go b/routing/dht/query.go index 4790e814c3..95e3c3c90f 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -4,8 +4,8 @@ import ( "sync" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" - queue "github.com/jbenet/go-ipfs/peer/queue" + peer "github.com/jbenet/go-ipfs/p2p/peer" + queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" pset "github.com/jbenet/go-ipfs/util/peerset" diff --git a/routing/dht/records.go b/routing/dht/records.go index cf383916b1..0d7e91c6fd 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -10,7 +10,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" - "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" ctxutil "github.com/jbenet/go-ipfs/util/ctx" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2a948f4bee..ee71f7156a 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 2fa5586db0..e158f70f9e 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 90ba655303..62bfa0646b 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index db93ddf860..3e44cf66ab 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/jbenet/go-ipfs/util/testutil" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 2d06b5f081..80c08de9eb 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "errors" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ks "github.com/jbenet/go-ipfs/routing/keyspace" u "github.com/jbenet/go-ipfs/util" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 6b5a455a7c..2aeafe0266 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,7 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 030227b1b6..dc462797ab 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" "github.com/jbenet/go-ipfs/util/testutil" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index dcaf165b15..526d63c686 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -5,7 +5,7 @@ import ( "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" delay "github.com/jbenet/go-ipfs/util/delay" "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 0bb54f365f..d7dca8348c 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -7,7 +7,7 @@ package mockrouting import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" delay "github.com/jbenet/go-ipfs/util/delay" diff --git a/routing/routing.go b/routing/routing.go index ae9acad44c..1fbd79d255 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -6,7 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) From f22a08626f7e78f6867d1670b4b2fa46f503a6b0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:45:55 -0800 Subject: [PATCH 0497/3147] crypto -> p2p/crypto The crypto package moves into p2p. Nothing in it so far is ipfs specific; everything is p2p-general. This commit was moved from ipfs/go-ipfs-routing@77884ea075efd40f7fb22bbe67abd3a5f23b5cb7 --- routing/dht/records.go | 2 +- routing/kbucket/sorting.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/records.go b/routing/dht/records.go index 0d7e91c6fd..0791f80a3d 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -9,7 +9,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index a3a68767b7..7995b39ede 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" "sort" ) From 37c003b961c1ccbfc209ae32a8f60ca36d08aaf6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:48:21 -0800 Subject: [PATCH 0498/3147] net -> p2p/net The net package is the next to move. It will be massaged a bit still to fix the Network / "NetworkBackend" conflict. This commit was moved from ipfs/go-ipfs-routing@bf57b51b6c58ca12b93ebb42d6db6611966a4d49 --- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ed9858c7ad..4e9e670d83 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,7 +10,7 @@ import ( "sync" "time" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 3eea25d9e0..3d9bbd93f7 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,7 +4,7 @@ import ( "errors" "time" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" ctxutil "github.com/jbenet/go-ipfs/util/ctx" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f4f2a5414c..18fd742740 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,7 +14,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" + swarmnet "github.com/jbenet/go-ipfs/p2p/net/swarmnet" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 168a2d8ede..f76f5bddca 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -4,8 +4,8 @@ import ( "math/rand" "testing" - inet "github.com/jbenet/go-ipfs/net" - mocknet "github.com/jbenet/go-ipfs/net/mock" + inet "github.com/jbenet/go-ipfs/p2p/net" + mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 87b0b1f4cf..61bf41ebb9 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -3,7 +3,7 @@ package dht_pb import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 95e3c3c90f..5b62a8f4cf 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,7 +3,7 @@ package dht import ( "sync" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index ee71f7156a..4c3cf160ba 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -6,7 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 1dfa415e03..1f0340ebb6 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -4,7 +4,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - mocknet "github.com/jbenet/go-ipfs/net/mock" + mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" dht "github.com/jbenet/go-ipfs/routing/dht" "github.com/jbenet/go-ipfs/util/testutil" ) From 967b1e3cd5c7e8d6595d3b26dcb5fdf8cc734315 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:45:55 -0800 Subject: [PATCH 0499/3147] crypto -> p2p/crypto The crypto package moves into p2p. Nothing in it so far is ipfs specific; everything is p2p-general. This commit was moved from ipfs/go-namesys@7d4d71075156bf923395e335212dc09bbcd4a4d5 --- namesys/interface.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/routing.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index eef1fc32b2..c2e39afec0 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -3,7 +3,7 @@ package namesys import ( "errors" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/namesys.go b/namesys/namesys.go index 2ea9a30bdf..cc11d9ddc7 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,7 +1,7 @@ package namesys import ( - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index be838b2f07..75cccf9e45 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -10,8 +10,8 @@ import ( proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - ci "github.com/jbenet/go-ipfs/crypto" pb "github.com/jbenet/go-ipfs/namesys/internal/pb" + ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) diff --git a/namesys/routing.go b/namesys/routing.go index c990b492b9..709f9424c7 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,8 +7,8 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - ci "github.com/jbenet/go-ipfs/crypto" pb "github.com/jbenet/go-ipfs/namesys/internal/pb" + ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) From 370aa61e14cee1c3cf3c86067eec341859e10f23 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 1 Jan 2015 12:45:39 -0800 Subject: [PATCH 0500/3147] swap net2 -> net This commit was moved from ipfs/go-ipfs-routing@0c8144f5ff3033c80e98ec7d5f7fd34e4f937d1e --- routing/dht/dht.go | 28 ++++++++------- routing/dht/dht_net.go | 4 +-- routing/dht/dht_test.go | 80 ++++++++++++++--------------------------- routing/dht/ext_test.go | 45 +++++++++++++---------- routing/dht/handlers.go | 10 +++--- routing/dht/query.go | 34 ++++++------------ routing/dht/routing.go | 10 +++--- routing/mock/dht.go | 4 +-- 8 files changed, 95 insertions(+), 120 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4e9e670d83..2a576629a8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,8 +10,9 @@ import ( "sync" "time" - inet "github.com/jbenet/go-ipfs/p2p/net" + host "github.com/jbenet/go-ipfs/p2p/host" peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" @@ -26,6 +27,8 @@ import ( var log = eventlog.Logger("dht") +var ProtocolDHT protocol.ID = "/ipfs/dht" + const doPinging = false // NumBootstrapQueries defines the number of random dht queries to do to @@ -37,7 +40,7 @@ const NumBootstrapQueries = 5 // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { - network inet.Network // the network services we need + host host.Host // the network services we need self peer.ID // Local peer (yourself) peerstore peer.Peerstore // Peer Registry @@ -56,19 +59,19 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, p peer.ID, n inet.Network, dstore ds.ThreadSafeDatastore) *IpfsDHT { +func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *IpfsDHT { dht := new(IpfsDHT) dht.datastore = dstore - dht.self = p - dht.peerstore = n.Peerstore() + dht.self = h.ID() + dht.peerstore = h.Peerstore() dht.ContextGroup = ctxgroup.WithContext(ctx) - dht.network = n - n.SetHandler(inet.ProtocolDHT, dht.handleNewStream) + dht.host = h + h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) - dht.providers = NewProviderManager(dht.Context(), p) + dht.providers = NewProviderManager(dht.Context(), dht.self) dht.AddChildGroup(dht.providers) - dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(p), time.Minute, dht.peerstore) + dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) dht.birth = time.Now() dht.Validators = make(map[string]ValidatorFunc) @@ -88,7 +91,8 @@ func (dht *IpfsDHT) LocalPeer() peer.ID { // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { - if err := dht.network.DialPeer(ctx, npeer); err != nil { + // TODO: change interface to accept a PeerInfo as well. + if err := dht.host.Connect(ctx, peer.PeerInfo{ID: npeer}); err != nil { return err } @@ -127,7 +131,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) erro // add self as the provider pi := dht.peerstore.PeerInfo(dht.self) - pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, []peer.PeerInfo{pi}) + pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), []peer.PeerInfo{pi}) err := dht.sendMessage(ctx, p, pmes) if err != nil { @@ -304,7 +308,7 @@ func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, p peer.ID) error } // dial connection - return dht.network.DialPeer(ctx, p) + return dht.host.Connect(ctx, peer.PeerInfo{ID: p}) } // PingRoutine periodically pings nearest neighbors. diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 3d9bbd93f7..fd088e02cb 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -74,7 +74,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s dht starting stream", dht.self) - s, err := dht.network.NewStream(inet.ProtocolDHT, p) + s, err := dht.host.NewStream(ProtocolDHT, p) if err != nil { return nil, err } @@ -116,7 +116,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message) error { log.Debugf("%s dht starting stream", dht.self) - s, err := dht.network.NewStream(inet.ProtocolDHT, p) + s, err := dht.host.NewStream(ProtocolDHT, p) if err != nil { return err } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 18fd742740..133f7a27c8 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,11 +14,10 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - swarmnet "github.com/jbenet/go-ipfs/p2p/net/swarmnet" peer "github.com/jbenet/go-ipfs/p2p/peer" + netutil "github.com/jbenet/go-ipfs/p2p/test/util" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" - testutil "github.com/jbenet/go-ipfs/util/testutil" ) var testCaseValues = map[u.Key][]byte{} @@ -32,30 +31,11 @@ func init() { } } -func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { - - sk, pk, err := testutil.SeededKeyPair(time.Now().UnixNano()) - if err != nil { - t.Fatal(err) - } - - p, err := peer.IDFromPublicKey(pk) - if err != nil { - t.Fatal(err) - } - - peerstore := peer.NewPeerstore() - peerstore.AddPrivKey(p, sk) - peerstore.AddPubKey(p, pk) - peerstore.AddAddress(p, addr) - - n, err := swarmnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) - if err != nil { - t.Fatal(err) - } +func setupDHT(ctx context.Context, t *testing.T) *IpfsDHT { + h := netutil.GenHostSwarm(t, ctx) dss := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, p, n, dss) + d := NewDHT(ctx, h, dss) d.Validators["v"] = func(u.Key, []byte) error { return nil @@ -69,9 +49,9 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer peers := make([]peer.ID, n) for i := 0; i < n; i++ { - addrs[i] = testutil.RandLocalTCPAddress() - dhts[i] = setupDHT(ctx, t, addrs[i]) + dhts[i] = setupDHT(ctx, t) peers[i] = dhts[i].self + addrs[i] = dhts[i].peerstore.Addresses(dhts[i].self)[0] } return addrs, peers, dhts @@ -116,19 +96,16 @@ func TestPing(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() - addrA := testutil.RandLocalTCPAddress() - addrB := testutil.RandLocalTCPAddress() - - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + dhtA := setupDHT(ctx, t) + dhtB := setupDHT(ctx, t) peerA := dhtA.self peerB := dhtB.self defer dhtA.Close() defer dhtB.Close() - defer dhtA.network.Close() - defer dhtB.network.Close() + defer dhtA.host.Close() + defer dhtB.host.Close() connect(t, ctx, dhtA, dhtB) @@ -149,16 +126,13 @@ func TestValueGetSet(t *testing.T) { ctx := context.Background() - addrA := testutil.RandLocalTCPAddress() - addrB := testutil.RandLocalTCPAddress() - - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + dhtA := setupDHT(ctx, t) + dhtB := setupDHT(ctx, t) defer dhtA.Close() defer dhtB.Close() - defer dhtA.network.Close() - defer dhtB.network.Close() + defer dhtA.host.Close() + defer dhtB.host.Close() vf := func(u.Key, []byte) error { return nil @@ -200,7 +174,7 @@ func TestProvides(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -268,7 +242,7 @@ func TestBootstrap(t *testing.T) { defer func() { for i := 0; i < nDHTs; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -312,7 +286,7 @@ func TestProvidesMany(t *testing.T) { defer func() { for i := 0; i < nDHTs; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -424,7 +398,7 @@ func TestProvidesAsync(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -478,7 +452,7 @@ func TestLayeredGet(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -518,7 +492,7 @@ func TestFindPeer(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - dhts[i].network.Close() + dhts[i].host.Close() } }() @@ -554,7 +528,7 @@ func TestFindPeersConnectedToPeer(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - dhts[i].network.Close() + dhts[i].host.Close() } }() @@ -633,11 +607,11 @@ func TestConnectCollision(t *testing.T) { ctx := context.Background() - addrA := testutil.RandLocalTCPAddress() - addrB := testutil.RandLocalTCPAddress() + dhtA := setupDHT(ctx, t) + dhtB := setupDHT(ctx, t) - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + addrA := dhtA.peerstore.Addresses(dhtA.self)[0] + addrB := dhtB.peerstore.Addresses(dhtB.self)[0] peerA := dhtA.self peerB := dhtB.self @@ -674,7 +648,7 @@ func TestConnectCollision(t *testing.T) { dhtA.Close() dhtB.Close() - dhtA.network.Close() - dhtB.network.Close() + dhtA.host.Close() + dhtB.host.Close() } } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index f76f5bddca..2be8127c71 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -1,6 +1,8 @@ package dht import ( + "io" + "io/ioutil" "math/rand" "testing" @@ -29,13 +31,20 @@ func TestGetFailures(t *testing.T) { if err != nil { t.Fatal(err) } - nets := mn.Nets() + hosts := mn.Hosts() peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, peers[0], nets[0], tsds) + d := NewDHT(ctx, hosts[0], tsds) d.Update(ctx, peers[1]) + // u.POut("NotFound Test\n") + // Reply with failures to every message + hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { + defer s.Close() + io.Copy(ioutil.Discard, s) + }) + // This one should time out // u.POut("Timout Test\n") ctx1, _ := context.WithTimeout(context.Background(), time.Second) @@ -50,7 +59,7 @@ func TestGetFailures(t *testing.T) { t.Log("Timeout test passed.") // Reply with failures to every message - nets[1].SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { defer s.Close() pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) @@ -97,7 +106,7 @@ func TestGetFailures(t *testing.T) { } // u.POut("handleGetValue Test\n") - s, err := nets[1].NewStream(inet.ProtocolDHT, peers[0]) + s, err := hosts[1].NewStream(ProtocolDHT, hosts[0].ID()) if err != nil { t.Fatal(err) } @@ -133,19 +142,19 @@ func TestNotFound(t *testing.T) { if err != nil { t.Fatal(err) } - nets := mn.Nets() + hosts := mn.Hosts() peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, peers[0], nets[0], tsds) + d := NewDHT(ctx, hosts[0], tsds) for _, p := range peers { d.Update(ctx, p) } // Reply with random peers to every message - for _, neti := range nets { - neti := neti // shadow loop var - neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + for _, host := range hosts { + host := host // shadow loop var + host.SetStreamHandler(ProtocolDHT, func(s inet.Stream) { defer s.Close() pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) @@ -163,11 +172,11 @@ func TestNotFound(t *testing.T) { ps := []peer.PeerInfo{} for i := 0; i < 7; i++ { p := peers[rand.Intn(len(peers))] - pi := neti.Peerstore().PeerInfo(p) + pi := host.Peerstore().PeerInfo(p) ps = append(ps, pi) } - resp.CloserPeers = pb.PeerInfosToPBPeers(d.network, ps) + resp.CloserPeers = pb.PeerInfosToPBPeers(d.host.Network(), ps) if err := pbw.WriteMsg(resp); err != nil { panic(err) } @@ -205,20 +214,20 @@ func TestLessThanKResponses(t *testing.T) { if err != nil { t.Fatal(err) } - nets := mn.Nets() + hosts := mn.Hosts() peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, peers[0], nets[0], tsds) + d := NewDHT(ctx, hosts[0], tsds) for i := 1; i < 5; i++ { d.Update(ctx, peers[i]) } // Reply with random peers to every message - for _, neti := range nets { - neti := neti // shadow loop var - neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + for _, host := range hosts { + host := host // shadow loop var + host.SetStreamHandler(ProtocolDHT, func(s inet.Stream) { defer s.Close() pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) @@ -231,10 +240,10 @@ func TestLessThanKResponses(t *testing.T) { switch pmes.GetType() { case pb.Message_GET_VALUE: - pi := neti.Peerstore().PeerInfo(peers[1]) + pi := host.Peerstore().PeerInfo(peers[1]) resp := &pb.Message{ Type: pmes.Type, - CloserPeers: pb.PeerInfosToPBPeers(d.network, []peer.PeerInfo{pi}), + CloserPeers: pb.PeerInfosToPBPeers(d.host.Network(), []peer.PeerInfo{pi}), } if err := pbw.WriteMsg(resp); err != nil { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index a02eb024d6..3670c570da 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -89,7 +89,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess provinfos := peer.PeerInfos(dht.peerstore, provs) if len(provs) > 0 { log.Debugf("handleGetValue returning %d provider[s]", len(provs)) - resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, provinfos) + resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), provinfos) } // Find closest peer on given cluster to desired key and reply with that info @@ -106,7 +106,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess } } - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, closerinfos) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), closerinfos) } return resp, nil @@ -161,7 +161,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess } } - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, withAddresses) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), withAddresses) return resp, nil } @@ -185,14 +185,14 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. if providers != nil && len(providers) > 0 { infos := peer.PeerInfos(dht.peerstore, providers) - resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, infos) + resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) } // Also send closer peers. closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if closer != nil { infos := peer.PeerInfos(dht.peerstore, providers) - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, infos) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) } return resp, nil diff --git a/routing/dht/query.go b/routing/dht/query.go index 5b62a8f4cf..0056bee1d1 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,7 +3,6 @@ package dht import ( "sync" - inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" @@ -18,17 +17,10 @@ import ( var maxQueryConcurrency = AlphaValue type dhtQuery struct { - // the key we're querying for - key u.Key - - // dialer used to ensure we're connected to peers - dialer inet.Dialer - - // the function to execute per peer - qfunc queryFunc - - // the concurrency parameter - concurrency int + dht *IpfsDHT + key u.Key // the key we're querying for + qfunc queryFunc // the function to execute per peer + concurrency int // the concurrency parameter } type dhtQueryResult struct { @@ -40,10 +32,10 @@ type dhtQueryResult struct { } // constructs query -func newQuery(k u.Key, d inet.Dialer, f queryFunc) *dhtQuery { +func (dht *IpfsDHT) newQuery(k u.Key, f queryFunc) *dhtQuery { return &dhtQuery{ key: k, - dialer: d, + dht: dht, qfunc: f, concurrency: maxQueryConcurrency, } @@ -155,7 +147,7 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { // if new peer is ourselves... - if next == r.query.dialer.LocalPeer() { + if next == r.query.dht.self { return } @@ -222,10 +214,11 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { }() // make sure we're connected to the peer. - if conns := r.query.dialer.ConnsToPeer(p); len(conns) == 0 { + if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { log.Infof("worker for: %v -- not connected. dial start", p) - if err := r.query.dialer.DialPeer(cg.Context(), p); err != nil { + pi := peer.PeerInfo{ID: p} + if err := r.query.dht.host.Connect(cg.Context(), pi); err != nil { log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) r.Lock() r.errs = append(r.errs, err) @@ -257,12 +250,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { log.Debugf("PEERS CLOSER -- worker for: %v (%d closer peers)", p, len(res.closerPeers)) for _, next := range res.closerPeers { // add their addresses to the dialer's peerstore - conns := r.query.dialer.ConnsToPeer(next.ID) - if len(conns) == 0 { - log.Infof("PEERS CLOSER -- worker for %v FOUND NEW PEER: %s %s", p, next.ID, next.Addrs) - } - - r.query.dialer.Peerstore().AddAddresses(next.ID, next.Addrs) + r.query.dht.peerstore.AddPeerInfo(next) r.addPeerToQuery(cg.Context(), next.ID) log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4c3cf160ba..2f00929b68 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -82,7 +82,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // setup the Query - query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { val, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { @@ -170,7 +170,7 @@ func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer peerset.Add(p) } - query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { closer, err := dht.closerPeersSingle(ctx, key, p) if err != nil { log.Errorf("error getting closer peers: %s", err) @@ -253,7 +253,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } // setup the Query - query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { @@ -312,7 +312,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er } // setup the Query - query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(u.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { @@ -361,7 +361,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< } // setup the Query - query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(u.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 1f0340ebb6..2235970f58 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -27,12 +27,12 @@ func (rs *mocknetserver) ClientWithDatastore(ctx context.Context, p testutil.Ide // FIXME AddPeer doesn't appear to be idempotent - net, err := rs.mn.AddPeer(p.PrivateKey(), p.Address()) + host, err := rs.mn.AddPeer(p.PrivateKey(), p.Address()) if err != nil { panic("FIXME") // return nil, debugerror.Wrap(err) } - return dht.NewDHT(ctx, p.ID(), net, sync.MutexWrap(ds)) + return dht.NewDHT(ctx, host, sync.MutexWrap(ds)) } var _ Server = &mocknetserver{} From 7dc49e50e4294b5f8c8ed3f944e99044a46743f7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 2 Jan 2015 05:40:38 -0800 Subject: [PATCH 0501/3147] core: rearranged initialization a bit This commit was moved from ipfs/go-namesys@066e93c490f47971584dfebb2ef85ff5366d9e9f --- namesys/routing.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/namesys/routing.go b/namesys/routing.go index 709f9424c7..b57d2c6015 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -23,6 +23,10 @@ type routingResolver struct { // NewRoutingResolver constructs a name resolver using the IPFS Routing system // to implement SFS-like naming on top. func NewRoutingResolver(route routing.IpfsRouting) Resolver { + if route == nil { + panic("attempt to create resolver with nil routing system") + } + return &routingResolver{routing: route} } From cccc64d90ae3a4c3a547c39d7ac591555070cff2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 3 Jan 2015 00:29:49 -0800 Subject: [PATCH 0502/3147] dht: debug dont cast Key as peer.ID This commit was moved from ipfs/go-ipfs-routing@5e76c5327fd995c211d167249808b7e1b6cc54d5 --- routing/dht/handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 3670c570da..546939ca0a 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -206,7 +206,7 @@ type providerInfo struct { func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { key := u.Key(pmes.GetKey()) - log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, peer.ID(key)) + log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, key) // add provider should use the address given in the message pinfos := pb.PBPeersToPeerInfos(pmes.GetProviderPeers()) From 6ca81f657c96b6221e5867f760ddc74b9f67b93b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 3 Jan 2015 00:56:27 -0800 Subject: [PATCH 0503/3147] dht: some provider debug logging This commit was moved from ipfs/go-ipfs-routing@c4b467a71b11b94f2090566c01960d12cc267ccc --- routing/dht/handlers.go | 15 +++++++++++---- routing/dht/routing.go | 11 +++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 546939ca0a..4911765508 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -167,25 +167,31 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) + key := u.Key(pmes.GetKey()) + + // debug logging niceness. + reqDesc := fmt.Sprintf("%s handleGetProviders(%s, %s): ", dht.self, p, key) + log.Debugf("%s begin", reqDesc) + defer log.Debugf("%s end", reqDesc) // check if we have this value, to add ourselves as provider. - log.Debugf("handling GetProviders: '%s'", u.Key(pmes.GetKey())) - dsk := u.Key(pmes.GetKey()).DsKey() - has, err := dht.datastore.Has(dsk) + has, err := dht.datastore.Has(key.DsKey()) if err != nil && err != ds.ErrNotFound { log.Errorf("unexpected datastore error: %v\n", err) has = false } // setup providers - providers := dht.providers.GetProviders(ctx, u.Key(pmes.GetKey())) + providers := dht.providers.GetProviders(ctx, key) if has { providers = append(providers, dht.self) + log.Debugf("%s have the value. added self as provider", reqDesc) } if providers != nil && len(providers) > 0 { infos := peer.PeerInfos(dht.peerstore, providers) resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) + log.Debugf("%s have %d providers: %s", reqDesc, len(providers), infos) } // Also send closer peers. @@ -193,6 +199,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. if closer != nil { infos := peer.PeerInfos(dht.peerstore, providers) resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) + log.Debugf("%s have %d closer peers: %s", reqDesc, len(closer), infos) } return resp, nil diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2f00929b68..ec414de13d 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,6 +1,7 @@ package dht import ( + "fmt" "math" "sync" @@ -255,16 +256,24 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // setup the Query query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + reqDesc := fmt.Sprintf("%s findProviders(%s).Query(%s): ", dht.self, key, p) + log.Debugf("%s begin", reqDesc) + defer log.Debugf("%s end", reqDesc) + pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { return nil, err } + log.Debugf("%s got %d provider entries", reqDesc, len(pmes.GetProviderPeers())) provs := pb.PBPeersToPeerInfos(pmes.GetProviderPeers()) + log.Debugf("%s got %d provider entries decoded", reqDesc, len(provs)) // Add unique providers from request, up to 'count' for _, prov := range provs { + log.Debugf("%s got provider: %s", reqDesc, prov) if ps.TryAdd(prov.ID) { + log.Debugf("%s using provider: %s", reqDesc, prov) select { case peerOut <- prov: case <-ctx.Done(): @@ -273,6 +282,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } } if ps.Size() >= count { + log.Debugf("%s got enough providers (%d/%d)", reqDesc, ps.Size(), count) return &dhtQueryResult{success: true}, nil } } @@ -280,6 +290,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // Give closer peers back to the query to be queried closer := pmes.GetCloserPeers() clpeers := pb.PBPeersToPeerInfos(closer) + log.Debugf("%s got closer peers: %s", reqDesc, clpeers) return &dhtQueryResult{closerPeers: clpeers}, nil }) From 8931276762fd4ab29e450816188ce588a14079c5 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 3 Jan 2015 06:15:50 -0800 Subject: [PATCH 0504/3147] bitswap debug logging This commit was moved from ipfs/go-ipfs-routing@872485c82ecbe1eeb2092b60cfb5d007fa9a328d --- routing/dht/dht_net.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index fd088e02cb..2b857ce2b3 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -87,15 +87,11 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message start := time.Now() - log.Debugf("%s writing", dht.self) if err := w.WriteMsg(pmes); err != nil { return nil, err } log.Event(ctx, "dhtSentMessage", dht.self, p, pmes) - log.Debugf("%s reading", dht.self) - defer log.Debugf("%s done", dht.self) - rpmes := new(pb.Message) if err := r.ReadMsg(rpmes); err != nil { return nil, err @@ -125,12 +121,10 @@ func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message cw := ctxutil.NewWriter(ctx, s) // ok to use. we defer close stream in this func w := ggio.NewDelimitedWriter(cw) - log.Debugf("%s writing", dht.self) if err := w.WriteMsg(pmes); err != nil { return err } log.Event(ctx, "dhtSentMessage", dht.self, p, pmes) - log.Debugf("%s done", dht.self) return nil } From dc4bc8e849e61115cb44f5e4ad8afa2bc7db31ac Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 3 Jan 2015 08:54:36 -0800 Subject: [PATCH 0505/3147] bitswap and dht: lots of debugging logs This commit was moved from ipfs/go-ipfs-routing@06d45460b5d06453d56e4d0ff9e4f2f172cc597c --- routing/dht/handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 4911765508..8f66afbf62 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -148,7 +148,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess } if closest == nil { - log.Warningf("handleFindPeer: could not find anything.") + log.Warningf("%s handleFindPeer %s: could not find anything.", dht.self, p) return resp, nil } From ee25dde6dfcbef941d40d0bd179787a984d3332e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 4 Jan 2015 18:18:16 -0800 Subject: [PATCH 0506/3147] dht: extend duration of TestGetFailures TestGetFailures may just be operating very slowly, instead of completely failing. Right now it gets caught on travis often. not sure if its actually wrong. This commit was moved from ipfs/go-ipfs-routing@8087d59bfe31e0cdcd69f8e4595cf29ee90e6e06 --- routing/dht/ext_test.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 2be8127c71..3da0dfa3a9 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -47,7 +47,7 @@ func TestGetFailures(t *testing.T) { // This one should time out // u.POut("Timout Test\n") - ctx1, _ := context.WithTimeout(context.Background(), time.Second) + ctx1, _ := context.WithTimeout(context.Background(), 200*time.Millisecond) if _, err := d.GetValue(ctx1, u.Key("test")); err != nil { if err != context.DeadlineExceeded { t.Fatal("Got different error than we expected", err) @@ -78,8 +78,12 @@ func TestGetFailures(t *testing.T) { } }) - // This one should fail with NotFound - ctx2, _ := context.WithTimeout(context.Background(), 3*time.Second) + // This one should fail with NotFound. + // long context timeout to ensure we dont end too early. + // the dht should be exhausting its query and returning not found. + // (was 3 seconds before which should be _plenty_ of time, but maybe + // travis machines really have a hard time...) + ctx2, _ := context.WithTimeout(context.Background(), 20*time.Second) _, err = d.GetValue(ctx2, u.Key("test")) if err != nil { if err != routing.ErrNotFound { @@ -187,7 +191,8 @@ func TestNotFound(t *testing.T) { }) } - ctx, _ = context.WithTimeout(ctx, time.Second*5) + // long timeout to ensure timing is not at play. + ctx, _ = context.WithTimeout(ctx, time.Second*20) v, err := d.GetValue(ctx, u.Key("hello")) log.Debugf("get value got %v", v) if err != nil { From 6650d59f8968ddd1a57d3136c54e248e0fcf8a8f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 5 Jan 2015 04:36:27 -0800 Subject: [PATCH 0507/3147] ext_test: bitten by mocknet ordering mocknet indeterminism screwed this test up. that's twice it's bitten us. let's not let it do it a third time. cc @briantigerchow omg. This commit was moved from ipfs/go-ipfs-routing@e9d3734a97b023dfbc2b1973379f4424db34952a --- routing/dht/ext_test.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 3da0dfa3a9..77ea54c963 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -32,11 +32,10 @@ func TestGetFailures(t *testing.T) { t.Fatal(err) } hosts := mn.Hosts() - peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) d := NewDHT(ctx, hosts[0], tsds) - d.Update(ctx, peers[1]) + d.Update(ctx, hosts[1].ID()) // u.POut("NotFound Test\n") // Reply with failures to every message @@ -147,12 +146,11 @@ func TestNotFound(t *testing.T) { t.Fatal(err) } hosts := mn.Hosts() - peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) d := NewDHT(ctx, hosts[0], tsds) - for _, p := range peers { - d.Update(ctx, p) + for _, p := range hosts { + d.Update(ctx, p.ID()) } // Reply with random peers to every message @@ -175,7 +173,7 @@ func TestNotFound(t *testing.T) { ps := []peer.PeerInfo{} for i := 0; i < 7; i++ { - p := peers[rand.Intn(len(peers))] + p := hosts[rand.Intn(len(hosts))].ID() pi := host.Peerstore().PeerInfo(p) ps = append(ps, pi) } @@ -220,13 +218,12 @@ func TestLessThanKResponses(t *testing.T) { t.Fatal(err) } hosts := mn.Hosts() - peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) d := NewDHT(ctx, hosts[0], tsds) for i := 1; i < 5; i++ { - d.Update(ctx, peers[i]) + d.Update(ctx, hosts[i].ID()) } // Reply with random peers to every message @@ -245,7 +242,7 @@ func TestLessThanKResponses(t *testing.T) { switch pmes.GetType() { case pb.Message_GET_VALUE: - pi := host.Peerstore().PeerInfo(peers[1]) + pi := host.Peerstore().PeerInfo(hosts[1].ID()) resp := &pb.Message{ Type: pmes.Type, CloserPeers: pb.PeerInfosToPBPeers(d.host.Network(), []peer.PeerInfo{pi}), From 184ad5a8bcfd7d205c602d7354ffb8953a15e8a0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 5 Jan 2015 04:48:50 -0800 Subject: [PATCH 0508/3147] dht: key without record validator func This is causing test failures because tests don't usually have "/-/-" format. we can decide whether or not to allow keys without validators, but for now removing. cc @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@58aaa6a60d202a0b1e30f7abf0b0960baf395890 --- routing/dht/records.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/records.go b/routing/dht/records.go index 0791f80a3d..083eeb26ee 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -191,8 +191,8 @@ func (dht *IpfsDHT) verifyRecord(r *pb.Record, pk ci.PubKey) error { // Now, check validity func parts := strings.Split(r.GetKey(), "/") if len(parts) < 3 { - log.Errorf("Record had bad key: %s", u.Key(r.GetKey())) - return ErrBadRecord + log.Infof("Record key does not have validator: %s", u.Key(r.GetKey())) + return nil } fnc, ok := dht.Validators[parts[1]] From a855bf709a87a652caa4f50ba1a9f4cdc784481e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 5 Jan 2015 04:35:54 -0800 Subject: [PATCH 0509/3147] dht: even more logging. This commit was moved from ipfs/go-ipfs-routing@577fc6fae10fe60dd93da392ff7064743c346296 --- routing/dht/dht.go | 5 +++ routing/dht/query.go | 73 ++++++++++++++++++++++-------------------- routing/dht/routing.go | 46 +++++++++++++++----------- 3 files changed, 72 insertions(+), 52 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 2a576629a8..17d300d877 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -89,6 +89,11 @@ func (dht *IpfsDHT) LocalPeer() peer.ID { return dht.self } +// log returns the dht's logger +func (dht *IpfsDHT) log() eventlog.EventLogger { + return log.Prefix("dht(%s)", dht.self) +} + // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { // TODO: change interface to accept a PeerInfo as well. diff --git a/routing/dht/query.go b/routing/dht/query.go index 0056bee1d1..44dc499263 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -7,6 +7,7 @@ import ( queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" pset "github.com/jbenet/go-ipfs/util/peerset" todoctr "github.com/jbenet/go-ipfs/util/todocounter" @@ -55,32 +56,18 @@ func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, e } type dhtQueryRunner struct { + query *dhtQuery // query to run + peersSeen *pset.PeerSet // all peers queried. prevent querying same peer 2x + peersToQuery *queue.ChanQueue // peers remaining to be queried + peersRemaining todoctr.Counter // peersToQuery + currently processing - // the query to run - query *dhtQuery + result *dhtQueryResult // query result + errs []error // result errors. maybe should be a map[peer.ID]error - // peersToQuery is a list of peers remaining to query - peersToQuery *queue.ChanQueue + rateLimit chan struct{} // processing semaphore + log eventlog.EventLogger - // peersSeen are all the peers queried. used to prevent querying same peer 2x - peersSeen *pset.PeerSet - - // rateLimit is a channel used to rate limit our processing (semaphore) - rateLimit chan struct{} - - // peersRemaining is a counter of peers remaining (toQuery + processing) - peersRemaining todoctr.Counter - - // context group cg ctxgroup.ContextGroup - - // result - result *dhtQueryResult - - // result errors - errs []error - - // lock for concurrent access to fields sync.RWMutex } @@ -96,6 +83,11 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { } func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { + log := log.Prefix("dht(%s).Query(%s).Run(%d)", r.query.dht.self, r.query.key, len(peers)) + r.log = log + log.Debug("enter") + defer log.Debug("end") + log.Debugf("Run query with %d peers.", len(peers)) if len(peers) == 0 { log.Warning("Running query with no peers!") @@ -115,6 +107,7 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { // go do this thing. // do it as a child func to make sure Run exits // ONLY AFTER spawn workers has exited. + log.Debugf("go spawn workers") r.cg.AddChildFunc(r.spawnWorkers) // so workers are working. @@ -124,41 +117,45 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { select { case <-r.peersRemaining.Done(): + log.Debug("all peers ended") r.cg.Close() r.RLock() defer r.RUnlock() if len(r.errs) > 0 { - err = r.errs[0] + err = r.errs[0] // take the first? } case <-r.cg.Closed(): + log.Debug("r.cg.Closed()") + r.RLock() defer r.RUnlock() err = r.cg.Context().Err() // collect the error. } if r.result != nil && r.result.success { + log.Debug("success: %s", r.result) return r.result, nil } + log.Debug("failure: %s", err) return nil, err } func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { // if new peer is ourselves... if next == r.query.dht.self { + r.log.Debug("addPeerToQuery skip self") return } if !r.peersSeen.TryAdd(next) { - log.Debug("query peer was already seen") + r.log.Debugf("addPeerToQuery skip seen %s", next) return } - log.Debugf("adding peer to query: %v", next) - - // do this after unlocking to prevent possible deadlocks. + r.log.Debugf("addPeerToQuery adding %s", next) r.peersRemaining.Increment(1) select { case r.peersToQuery.EnqChan <- next: @@ -167,6 +164,10 @@ func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { } func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { + log := r.log.Prefix("spawnWorkers") + log.Debugf("begin") + defer log.Debugf("end") + for { select { @@ -192,7 +193,9 @@ func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { } func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { - log.Debugf("spawned worker for: %v", p) + log := r.log.Prefix("queryPeer(%s)", p) + log.Debugf("spawned") + defer log.Debugf("finished") // make sure we rate limit concurrency. select { @@ -203,34 +206,36 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { } // ok let's do this! - log.Debugf("running worker for: %v", p) + log.Debugf("running") // make sure we do this when we exit defer func() { // signal we're done proccessing peer p - log.Debugf("completing worker for: %v", p) + log.Debugf("completed") r.peersRemaining.Decrement(1) r.rateLimit <- struct{}{} }() // make sure we're connected to the peer. if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { - log.Infof("worker for: %v -- not connected. dial start", p) + log.Infof("not connected. dialing.") pi := peer.PeerInfo{ID: p} if err := r.query.dht.host.Connect(cg.Context(), pi); err != nil { - log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) + log.Debugf("Error connecting: %s", err) r.Lock() r.errs = append(r.errs, err) r.Unlock() return } - log.Infof("worker for: %v -- not connected. dial success!", p) + log.Debugf("connected. dial success.") } // finally, run the query against this peer + log.Debugf("query running") res, err := r.query.qfunc(cg.Context(), p) + log.Debugf("query finished") if err != nil { log.Debugf("ERROR worker for: %v %v", p, err) @@ -239,7 +244,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { r.Unlock() } else if res.success { - log.Debugf("SUCCESS worker for: %v", p, res) + log.Debugf("SUCCESS worker for: %v %s", p, res) r.Lock() r.result = res r.Unlock() diff --git a/routing/dht/routing.go b/routing/dht/routing.go index ec414de13d..5978a9a80e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,7 +1,6 @@ package dht import ( - "fmt" "math" "sync" @@ -66,25 +65,29 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { - log.Debugf("Get Value [%s]", key) + log := dht.log().Prefix("GetValue(%s)", key) + log.Debugf("start") + defer log.Debugf("end") // If we have it local, dont bother doing an RPC! val, err := dht.getLocal(key) if err == nil { - log.Debug("Got value locally!") + log.Debug("have it locally") return val, nil } // get closest peers in the routing table + rtp := dht.routingTable.ListPeers() + log.Debugf("peers in rt: %s", len(rtp), rtp) + closest := dht.routingTable.NearestPeers(kb.ConvertKey(key), PoolSize) if closest == nil || len(closest) == 0 { - log.Warning("Got no peers back from routing table!") + log.Warning("No peers from routing table!") return nil, errors.Wrap(kb.ErrLookupFailure) } // setup the Query query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - val, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { return nil, err @@ -117,9 +120,13 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // Provide makes this node announce that it can provide a value for the given key func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { - + log := dht.log().Prefix("Provide(%s)", key) + log.Debugf("start", key) log.Event(ctx, "provideBegin", &key) + defer log.Debugf("end", key) defer log.Event(ctx, "provideEnd", &key) + + // add self locally dht.providers.AddProvider(key, dht.self) peers, err := dht.getClosestPeers(ctx, key) @@ -132,6 +139,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { wg.Add(1) go func(p peer.ID) { defer wg.Done() + log.Debugf("putProvider(%s, %s)", key, p) err := dht.putProvider(ctx, p, string(key)) if err != nil { log.Error(err) @@ -231,9 +239,12 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int } func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { + log := dht.log().Prefix("FindProviders(%s)", key) + defer close(peerOut) defer log.Event(ctx, "findProviders end", &key) - log.Debugf("%s FindProviders %s", dht.self, key) + log.Debug("begin") + defer log.Debug("begin") ps := pset.NewLimited(count) provs := dht.providers.GetProviders(ctx, key) @@ -255,25 +266,24 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // setup the Query query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - - reqDesc := fmt.Sprintf("%s findProviders(%s).Query(%s): ", dht.self, key, p) - log.Debugf("%s begin", reqDesc) - defer log.Debugf("%s end", reqDesc) + log := log.Prefix("Query(%s)", p) + log.Debugf("begin") + defer log.Debugf("end") pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { return nil, err } - log.Debugf("%s got %d provider entries", reqDesc, len(pmes.GetProviderPeers())) + log.Debugf("%d provider entries", len(pmes.GetProviderPeers())) provs := pb.PBPeersToPeerInfos(pmes.GetProviderPeers()) - log.Debugf("%s got %d provider entries decoded", reqDesc, len(provs)) + log.Debugf("%d provider entries decoded", len(provs)) // Add unique providers from request, up to 'count' for _, prov := range provs { - log.Debugf("%s got provider: %s", reqDesc, prov) + log.Debugf("got provider: %s", prov) if ps.TryAdd(prov.ID) { - log.Debugf("%s using provider: %s", reqDesc, prov) + log.Debugf("using provider: %s", prov) select { case peerOut <- prov: case <-ctx.Done(): @@ -282,7 +292,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } } if ps.Size() >= count { - log.Debugf("%s got enough providers (%d/%d)", reqDesc, ps.Size(), count) + log.Debugf("got enough providers (%d/%d)", ps.Size(), count) return &dhtQueryResult{success: true}, nil } } @@ -290,14 +300,14 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // Give closer peers back to the query to be queried closer := pmes.GetCloserPeers() clpeers := pb.PBPeersToPeerInfos(closer) - log.Debugf("%s got closer peers: %s", reqDesc, clpeers) + log.Debugf("got closer peers: %d %s", len(clpeers), clpeers) return &dhtQueryResult{closerPeers: clpeers}, nil }) peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) _, err := query.Run(ctx, peers) if err != nil { - log.Errorf("FindProviders Query error: %s", err) + log.Errorf("Query error: %s", err) } } From 76ca1a513def5442d56d55538a230e2a857a9fc2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 5 Jan 2015 04:48:37 -0800 Subject: [PATCH 0510/3147] dht test skips This commit was moved from ipfs/go-ipfs-routing@9fbf3ebd32d33151bb320e7b1c90d3554764755b --- routing/dht/dht_test.go | 5 +++++ routing/dht/ext_test.go | 2 ++ 2 files changed, 7 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 133f7a27c8..147970695e 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -231,6 +231,7 @@ func TestProvides(t *testing.T) { } func TestBootstrap(t *testing.T) { + // t.Skip("skipping test to debug another") if testing.Short() { t.SkipNow() } @@ -388,6 +389,7 @@ func TestProvidesMany(t *testing.T) { } func TestProvidesAsync(t *testing.T) { + // t.Skip("skipping test to debug another") if testing.Short() { t.SkipNow() } @@ -442,6 +444,7 @@ func TestProvidesAsync(t *testing.T) { } func TestLayeredGet(t *testing.T) { + // t.Skip("skipping test to debug another") if testing.Short() { t.SkipNow() } @@ -482,6 +485,7 @@ func TestLayeredGet(t *testing.T) { } func TestFindPeer(t *testing.T) { + // t.Skip("skipping test to debug another") if testing.Short() { t.SkipNow() } @@ -596,6 +600,7 @@ func testPeerListsMatch(t *testing.T, p1, p2 []peer.ID) { } func TestConnectCollision(t *testing.T) { + // t.Skip("skipping test to debug another") if testing.Short() { t.SkipNow() } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 77ea54c963..6f12c31139 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -136,6 +136,7 @@ func TestGetFailures(t *testing.T) { } func TestNotFound(t *testing.T) { + // t.Skip("skipping test to debug another") if testing.Short() { t.SkipNow() } @@ -210,6 +211,7 @@ func TestNotFound(t *testing.T) { // If less than K nodes are in the entire network, it should fail when we make // a GET rpc and nobody has the value func TestLessThanKResponses(t *testing.T) { + // t.Skip("skipping test to debug another") // t.Skip("skipping test because it makes a lot of output") ctx := context.Background() From c5cd0f1e26097686d5d8211eb367e4faa34cd7d7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 4 Jan 2015 14:06:53 -0800 Subject: [PATCH 0511/3147] testutil: obvious names for seeded key pairs This commit was moved from ipfs/go-namesys@ea639d5d9d50f7cbfa9e9bc13a1170ccbc050790 --- namesys/resolve_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 35851fc328..8e3214dfe5 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -14,7 +14,7 @@ func TestRoutingResolve(t *testing.T) { resolver := NewRoutingResolver(d) publisher := NewRoutingPublisher(d) - privk, pubk, err := testutil.RandKeyPair(512) + privk, pubk, err := testutil.RandTestKeyPair(512) if err != nil { t.Fatal(err) } From cff2f3ebdb0607cc567776de406befe753e2e04b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 5 Jan 2015 05:21:05 -0800 Subject: [PATCH 0512/3147] p2p/test: bogus key pair for faster tests This commit was moved from ipfs/go-blockservice@c356c710a6c4c79f45315a3ddd136c90769af594 --- blockservice/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/mock.go b/blockservice/mock.go index 57432178ee..73fcdf2fca 100644 --- a/blockservice/mock.go +++ b/blockservice/mock.go @@ -12,7 +12,7 @@ import ( // Mocks returns |n| connected mock Blockservices func Mocks(t *testing.T, n int) []*BlockService { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) - sg := bitswap.NewSessionGenerator(net) + sg := bitswap.NewTestSessionGenerator(net) instances := sg.Instances(n) From f013aec51c7ff39ff02cca805fd2d3cdf436fb14 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 8 Dec 2014 18:21:57 -0800 Subject: [PATCH 0513/3147] feat(core) dht.Bootstrap License: MIT Signed-off-by: Brian Tiger Chow This commit was moved from ipfs/go-ipfs-routing@b715725d85b210514d302176af588b4fc61b58f9 --- routing/dht/dht.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 17d300d877..3fdd327f9b 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -341,7 +341,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { } // Bootstrap builds up list of peers by requesting random peer IDs -func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) { +func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) error { // bootstrap sequentially, as results will compound for i := 0; i < NumBootstrapQueries; i++ { @@ -357,4 +357,5 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) { log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", pi) } } + return nil } From cde36c392052cf1e6775afaaf293a36ec91567d8 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 9 Dec 2014 11:22:00 -0800 Subject: [PATCH 0514/3147] dht: bootstrap query logging This commit was moved from ipfs/go-ipfs-routing@8c83c2431484be4e58e14074998cd10895b7ba5e --- routing/dht/dht.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 3fdd327f9b..4d87ebbd85 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -343,18 +343,26 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { // Bootstrap builds up list of peers by requesting random peer IDs func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) error { - // bootstrap sequentially, as results will compound - for i := 0; i < NumBootstrapQueries; i++ { + randomID := func() peer.ID { + // 16 random bytes is not a valid peer id. it may be fine becuase + // the dht will rehash to its own keyspace anyway. id := make([]byte, 16) rand.Read(id) - pi, err := dht.FindPeer(ctx, peer.ID(id)) + return peer.ID(id) + } + + // bootstrap sequentially, as results will compound + for i := 0; i < queries; i++ { + id := randomID() + log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i, queries, id) + p, err := dht.FindPeer(ctx, id) if err == routing.ErrNotFound { // this isn't an error. this is precisely what we expect. } else if err != nil { log.Errorf("Bootstrap peer error: %s", err) } else { // woah, we got a peer under a random id? it _cannot_ be valid. - log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", pi) + log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", p) } } return nil From 94bdaf6d9d2463cfcce5df4c027e7dbe60ee6d6d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 9 Dec 2014 12:04:25 -0800 Subject: [PATCH 0515/3147] dht/bootstrap: (optional) parallelism + error on peer This also makes it an Error to find a peer. This commit was moved from ipfs/go-ipfs-routing@da1c77f841ff30282788d6ed5cd7ff749f78d3c2 --- routing/dht/dht.go | 47 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4d87ebbd85..d6a6d8770b 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -342,6 +342,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { // Bootstrap builds up list of peers by requesting random peer IDs func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) error { + var merr u.MultiErr randomID := func() peer.ID { // 16 random bytes is not a valid peer id. it may be fine becuase @@ -352,18 +353,52 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) error { } // bootstrap sequentially, as results will compound - for i := 0; i < queries; i++ { - id := randomID() - log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i, queries, id) + runQuery := func(ctx context.Context, id peer.ID) { p, err := dht.FindPeer(ctx, id) if err == routing.ErrNotFound { // this isn't an error. this is precisely what we expect. } else if err != nil { - log.Errorf("Bootstrap peer error: %s", err) + merr = append(merr, err) } else { - // woah, we got a peer under a random id? it _cannot_ be valid. - log.Errorf("dht seemingly found a peer at a random bootstrap id (%s)...", p) + // woah, actually found a peer with that ID? this shouldn't happen normally + // (as the ID we use is not a real ID). this is an odd error worth logging. + err := fmt.Errorf("Bootstrap peer error: Actually FOUND peer. (%s, %s)", id, p) + log.Errorf("%s", err) + merr = append(merr, err) } } + + sequential := true + if sequential { + // these should be parallel normally. but can make them sequential for debugging. + // note that the core/bootstrap context deadline should be extended too for that. + for i := 0; i < queries; i++ { + id := randomID() + log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) + runQuery(ctx, id) + } + + } else { + // note on parallelism here: the context is passed in to the queries, so they + // **should** exit when it exceeds, making this function exit on ctx cancel. + // normally, we should be selecting on ctx.Done() here too, but this gets + // complicated to do with WaitGroup, and doesnt wait for the children to exit. + var wg sync.WaitGroup + for i := 0; i < queries; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + id := randomID() + log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) + runQuery(ctx, id) + }() + } + wg.Wait() + } + + if len(merr) > 0 { + return merr + } return nil } From 6ceb717573dacf9db8b719d9f284b88e8fa05221 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 5 Jan 2015 07:00:49 -0800 Subject: [PATCH 0516/3147] bootstrap: not error to not have enough bootstrap peers use dht bootstrap. there is an edge case where the dht is tiny (1?) and we have 0 bootstrap peers. we should probably _inform_ the user, but this may be more a webui or command thing. This commit was moved from ipfs/go-ipfs-routing@0d0cf4e52947950d42c2369456d987eee38dacd0 --- routing/dht/dht_test.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 147970695e..d2341a1bd1 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -238,7 +238,7 @@ func TestBootstrap(t *testing.T) { ctx := context.Background() - nDHTs := 15 + nDHTs := 30 _, _, dhts := setupDHTS(ctx, nDHTs, t) defer func() { for i := 0; i < nDHTs; i++ { @@ -269,12 +269,23 @@ func TestBootstrap(t *testing.T) { } // test "well-formed-ness" (>= 3 peers in every routing table) + avgsize := 0 for _, dht := range dhts { rtlen := dht.routingTable.Size() + avgsize += rtlen + t.Logf("routing table for %s has %d peers", dht.self, rtlen) if rtlen < 4 { - t.Errorf("routing table for %s only has %d peers", dht.self, rtlen) + // currently, we dont have good bootstrapping guarantees. + // t.Errorf("routing table for %s only has %d peers", dht.self, rtlen) } } + avgsize = avgsize / len(dhts) + avgsizeExpected := 6 + + t.Logf("avg rt size: %d", avgsize) + if avgsize < avgsizeExpected { + t.Errorf("avg rt size: %d < %d", avgsize, avgsizeExpected) + } } func TestProvidesMany(t *testing.T) { From 1e9e302d2442ebc27af6181b9dbad318e5f7ab87 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 5 Jan 2015 07:19:07 -0800 Subject: [PATCH 0517/3147] dht/bootstrap/test: longer timeout, less bias This commit was moved from ipfs/go-ipfs-routing@74e55ed63caa421431baec55533a8f923fe57b2f --- routing/dht/dht_test.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index d2341a1bd1..4d63c0e44f 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -3,6 +3,7 @@ package dht import ( "bytes" "fmt" + "math/rand" "sort" "sync" "testing" @@ -76,6 +77,7 @@ func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { ctx, cancel := context.WithCancel(ctx) rounds := 1 + for i := 0; i < rounds; i++ { log.Debugf("bootstrapping round %d/%d\n", i, rounds) @@ -83,7 +85,10 @@ func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { // 100 async https://gist.github.com/jbenet/56d12f0578d5f34810b2 // 100 sync https://gist.github.com/jbenet/6c59e7c15426e48aaedd // probably because results compound - for _, dht := range dhts { + + start := rand.Intn(len(dhts)) // randomize to decrease bias. + for i := range dhts { + dht := dhts[(start+i)%len(dhts)] log.Debugf("bootstrapping round %d/%d -- %s\n", i, rounds, dht.self) dht.Bootstrap(ctx, 3) } @@ -309,7 +314,7 @@ func TestProvidesMany(t *testing.T) { <-time.After(100 * time.Millisecond) t.Logf("bootstrapping them so they find each other", nDHTs) - ctxT, _ := context.WithTimeout(ctx, 5*time.Second) + ctxT, _ := context.WithTimeout(ctx, 20*time.Second) bootstrap(t, ctxT, dhts) if u.Debug { From a66000c9295fa112a178eb7bf4de9300343a3471 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 6 Jan 2015 08:45:17 -0800 Subject: [PATCH 0518/3147] blockservice: async HasBlock with ratelimit This commit was moved from ipfs/go-blockservice@face34bdbd98706398f774203e6ec18227fb39b0 --- blockservice/blockservice.go | 42 ++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index db126f344a..a2a0014185 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -8,6 +8,8 @@ import ( "fmt" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + procrl "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" blocks "github.com/jbenet/go-ipfs/blocks" "github.com/jbenet/go-ipfs/blocks/blockstore" exchange "github.com/jbenet/go-ipfs/exchange" @@ -17,6 +19,9 @@ import ( var log = u.Logger("blockservice") var ErrNotFound = errors.New("blockservice: key not found") +// MaxExchangeAddWorkers rate limits the number of exchange workers +var MaxExchangeAddWorkers = 100 + // BlockService is a hybrid block datastore. It stores data in a local // datastore and may retrieve data from a remote Exchange. // It uses an internal `datastore.Datastore` instance to store values. @@ -24,6 +29,9 @@ type BlockService struct { // TODO don't expose underlying impl details Blockstore blockstore.Blockstore Exchange exchange.Interface + + rateLimiter *procrl.RateLimiter + exchangeAdd chan blocks.Block } // NewBlockService creates a BlockService with given datastore instance. @@ -34,7 +42,17 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error if rem == nil { log.Warning("blockservice running in local (offline) mode.") } - return &BlockService{Blockstore: bs, Exchange: rem}, nil + + // exchangeAdd is a channel for async workers to add to the exchange. + // 100 blocks buffer. not clear what this number should be + exchangeAdd := make(chan blocks.Block, 100) + + return &BlockService{ + Blockstore: bs, + Exchange: rem, + exchangeAdd: exchangeAdd, + rateLimiter: procrl.NewRateLimiter(process.Background(), MaxExchangeAddWorkers), + }, nil } // AddBlock adds a particular block to the service, Putting it into the datastore. @@ -46,15 +64,21 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { return k, err } - // TODO this operation rate-limits blockservice operations, we should - // consider moving this to an sync process. + // this operation rate-limits blockservice operations, so it is + // now an async process. if s.Exchange != nil { - ctx := context.TODO() - if err := s.Exchange.HasBlock(ctx, b); err != nil { - // suppress error, as the client shouldn't care about bitswap. - // the client only cares about the blockstore.Put. - log.Errorf("Exchange.HasBlock error: %s", err) - } + + // LimitedGo will spawn a goroutine but provide proper backpressure. + // it will not spawn the goroutine until the ratelimiter's work load + // is under the threshold. + s.rateLimiter.LimitedGo(func(worker process.Process) { + ctx := context.TODO() + if err := s.Exchange.HasBlock(ctx, b); err != nil { + // suppress error, as the client shouldn't care about bitswap. + // the client only cares about the blockstore.Put. + log.Errorf("Exchange.HasBlock error: %s", err) + } + }) } return k, nil } From 60bb0ed3d79ad2f21f51fb19ccfaf8f59d35f6c9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 17 Dec 2014 19:07:54 +0000 Subject: [PATCH 0519/3147] implement recursive indirect blocks improve efficiency of multilayered indirect blocks clean up tests panic cleanup clean up logic, improve readability add final root node to the dagservice upon creation importer: simplified dag generation test: updated hashes using latest code @whyrusleeping this is why the sharness tests were failing: the hashes are added manually to make sure our generation doesn't change. cleanup after CR fix merkledag tests fix small block generation (no subblocks!) This commit was moved from ipfs/go-unixfs@39d1685993e8a4def4d2cd37f2f9bdb8be2d5dca --- unixfs/format.go | 8 +++++++ unixfs/io/dagmodifier_test.go | 1 + unixfs/io/dagreader.go | 39 +++++++++-------------------------- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index 0fd29d358e..845f1da30e 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -118,3 +118,11 @@ func (mb *MultiBlock) GetBytes() ([]byte, error) { pbn.Data = mb.Data return proto.Marshal(pbn) } + +func (mb *MultiBlock) FileSize() uint64 { + return uint64(len(mb.Data)) + mb.subtotal +} + +func (mb *MultiBlock) NumChildren() int { + return len(mb.blocksizes) +} diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index ed5b10d692..e4020c64a9 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -187,6 +187,7 @@ func TestMultiWrite(t *testing.T) { } func TestMultiWriteCoal(t *testing.T) { + t.Skip("Skipping test until DagModifier is fixed") dserv := getMockDagServ(t) _, n := getNode(t, dserv, 0) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index f4290dd4b0..ab28dc8aea 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -38,10 +38,7 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File: - var fetchChan <-chan *mdag.Node - if serv != nil { - fetchChan = serv.GetDAG(context.TODO(), n) - } + fetchChan := serv.GetDAG(context.TODO(), n) return &DagReader{ node: n, serv: serv, @@ -62,33 +59,17 @@ func (dr *DagReader) precalcNextBuf() error { var nxt *mdag.Node var ok bool - // TODO: require non-nil dagservice, use offline bitswap exchange - if dr.serv == nil { - // Only used when fetchChan is nil, - // which only happens when passed in a nil dagservice - // TODO: this logic is hard to follow, do it better. - // NOTE: the only time this code is used, is during the - // importer tests, consider just changing those tests - log.Warning("Running DAGReader with nil DAGService!") - if dr.linkPosition >= len(dr.node.Links) { + if dr.fetchChan == nil { + // This panic is appropriate because the select statement + // will not panic if you try and read from a nil channel + // it will simply hang. + panic("fetchChan should NOT be nil") + } + select { + case nxt, ok = <-dr.fetchChan: + if !ok { return io.EOF } - nxt = dr.node.Links[dr.linkPosition].Node - if nxt == nil { - return errors.New("Got nil node back from link! and no DAGService!") - } - dr.linkPosition++ - - } else { - if dr.fetchChan == nil { - panic("this is wrong.") - } - select { - case nxt, ok = <-dr.fetchChan: - if !ok { - return io.EOF - } - } } pb := new(ftpb.Data) From 71967c59559f4b9c4d154b2c8e8a880e7f4db1d2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 17 Dec 2014 19:07:54 +0000 Subject: [PATCH 0520/3147] implement recursive indirect blocks improve efficiency of multilayered indirect blocks clean up tests panic cleanup clean up logic, improve readability add final root node to the dagservice upon creation importer: simplified dag generation test: updated hashes using latest code @whyrusleeping this is why the sharness tests were failing: the hashes are added manually to make sure our generation doesn't change. cleanup after CR fix merkledag tests fix small block generation (no subblocks!) This commit was moved from ipfs/go-ipfs-chunker@31b5f255bf9b5432ebdbe6759e621de1be733601 --- chunker/splitting.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 65a79d5adc..40597a0641 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -9,7 +9,8 @@ import ( var log = util.Logger("chunk") -var DefaultSplitter = &SizeSplitter{Size: 1024 * 256} +var DefaultBlockSize = 1024 * 256 +var DefaultSplitter = &SizeSplitter{Size: DefaultBlockSize} type BlockSplitter interface { Split(r io.Reader) chan []byte From f5a76acd6323cd472daac0ba210af1ae16496c07 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 8 Jan 2015 16:52:23 -0800 Subject: [PATCH 0521/3147] path: ignore prefix /ipfs/ This commit was moved from ipfs/go-path@b70a21e5faf7714c04a487d731befd1d818dbbd1 --- path/path.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/path.go b/path/path.go index 63d7186566..35ea367054 100644 --- a/path/path.go +++ b/path/path.go @@ -26,6 +26,10 @@ func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { log.Debugf("Resolve: '%s'", fpath) fpath = path.Clean(fpath) + if strings.HasPrefix(fpath, "/ipfs/") { + fpath = fpath[6:] + } + parts := strings.Split(fpath, "/") // skip over empty first elem From e04825e86536198ef5d27d7c51d1daacdc4634d6 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 4 Dec 2014 21:31:38 -0800 Subject: [PATCH 0522/3147] ping WIP License: MIT Signed-off-by: Brian Tiger Chow Conflicts: core/commands/root.go begin ping command, WIP finish initial ping implementation This commit was moved from ipfs/go-ipfs-routing@6ba5352373cbb3823a0d142f6103fc22e1498835 --- routing/mock/centralized_client.go | 4 ++++ routing/routing.go | 3 +++ 2 files changed, 7 insertions(+) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 2aeafe0266..da8e396924 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -79,4 +79,8 @@ func (c *client) Provide(_ context.Context, key u.Key) error { return c.server.Announce(info, key) } +func (c *client) Ping(ctx context.Context, p peer.ID) error { + return nil +} + var _ routing.IpfsRouting = &client{} diff --git a/routing/routing.go b/routing/routing.go index 1fbd79d255..934a00c41e 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -36,4 +36,7 @@ type IpfsRouting interface { // FindPeer searches for a peer with given ID, returns a peer.PeerInfo // with relevant addresses. FindPeer(context.Context, peer.ID) (peer.PeerInfo, error) + + // Ping a peer, log the time it took + Ping(context.Context, peer.ID) error } From 82bdc4a1ba52267e7001342992c3645e24a70ddf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 9 Jan 2015 19:04:13 +0000 Subject: [PATCH 0523/3147] Address PR comments and add in more user feedback This commit was moved from ipfs/go-ipfs-routing@025a8f9daef47de30c662ade37321929b9204c86 --- routing/dht/dht.go | 6 +++--- routing/dht/routing.go | 7 +++++-- routing/mock/centralized_client.go | 5 +++-- routing/routing.go | 3 ++- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d6a6d8770b..78fef653be 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -103,8 +103,8 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { // Ping new peer to register in their routing table // NOTE: this should be done better... - if err := dht.Ping(ctx, npeer); err != nil { - return fmt.Errorf("failed to ping newly connected peer: %s\n", err) + if _, err := dht.Ping(ctx, npeer); err != nil { + return fmt.Errorf("failed to ping newly connected peer: %s", err) } log.Event(ctx, "connect", dht.self, npeer) dht.Update(ctx, npeer) @@ -329,7 +329,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { peers := dht.routingTable.NearestPeers(kb.ConvertKey(u.Key(id)), 5) for _, p := range peers { ctx, _ := context.WithTimeout(dht.Context(), time.Second*5) - err := dht.Ping(ctx, p) + _, err := dht.Ping(ctx, p) if err != nil { log.Errorf("Ping error: %s", err) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 5978a9a80e..cd929c2558 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,6 +3,7 @@ package dht import ( "math" "sync" + "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -434,12 +435,14 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< } // Ping a peer, log the time it took -func (dht *IpfsDHT) Ping(ctx context.Context, p peer.ID) error { +func (dht *IpfsDHT) Ping(ctx context.Context, p peer.ID) (time.Duration, error) { // Thoughts: maybe this should accept an ID and do a peer lookup? log.Debugf("ping %s start", p) + before := time.Now() pmes := pb.NewMessage(pb.Message_PING, "", 0) _, err := dht.sendRequest(ctx, p, pmes) log.Debugf("ping %s end (err = %s)", p, err) - return err + + return time.Now().Sub(before), err } diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index da8e396924..4a9b63b01d 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -2,6 +2,7 @@ package mockrouting import ( "errors" + "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -79,8 +80,8 @@ func (c *client) Provide(_ context.Context, key u.Key) error { return c.server.Announce(info, key) } -func (c *client) Ping(ctx context.Context, p peer.ID) error { - return nil +func (c *client) Ping(ctx context.Context, p peer.ID) (time.Duration, error) { + return 0, nil } var _ routing.IpfsRouting = &client{} diff --git a/routing/routing.go b/routing/routing.go index 934a00c41e..8238aa45c4 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -3,6 +3,7 @@ package routing import ( "errors" + "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -38,5 +39,5 @@ type IpfsRouting interface { FindPeer(context.Context, peer.ID) (peer.PeerInfo, error) // Ping a peer, log the time it took - Ping(context.Context, peer.ID) error + Ping(context.Context, peer.ID) (time.Duration, error) } From 9febcc7fb2d0370edd8257602fbb13e575455075 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 9 Jan 2015 22:37:13 +0000 Subject: [PATCH 0524/3147] add peer info after FindPeer RPC fix ping test This commit was moved from ipfs/go-ipfs-routing@deb6748fe26819edf1490f1933118756bb7ed572 --- routing/dht/dht_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 4d63c0e44f..818fd5911c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -116,12 +116,12 @@ func TestPing(t *testing.T) { //Test that we can ping the node ctxT, _ := context.WithTimeout(ctx, 100*time.Millisecond) - if err := dhtA.Ping(ctxT, peerB); err != nil { + if _, err := dhtA.Ping(ctxT, peerB); err != nil { t.Fatal(err) } ctxT, _ = context.WithTimeout(ctx, 100*time.Millisecond) - if err := dhtB.Ping(ctxT, peerA); err != nil { + if _, err := dhtB.Ping(ctxT, peerA); err != nil { t.Fatal(err) } } From 78497d220f7dace51cfa965c91793a107dc9616a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 10 Jan 2015 08:00:03 +0000 Subject: [PATCH 0525/3147] mark ipns as readonly This commit was moved from ipfs/go-unixfs@22252f25d663f5bb4da4a79efc0e72f405ae8eb4 --- unixfs/io/dagmodifier_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index e4020c64a9..43e7fcb084 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -93,6 +93,7 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) } func TestDagModifierBasic(t *testing.T) { + t.Skip("DAGModifier needs to be fixed to work with indirect blocks.") logging.SetLevel(logging.CRITICAL, "blockservice") logging.SetLevel(logging.CRITICAL, "merkledag") dserv := getMockDagServ(t) @@ -146,6 +147,7 @@ func TestDagModifierBasic(t *testing.T) { } func TestMultiWrite(t *testing.T) { + t.Skip("DAGModifier needs to be fixed to work with indirect blocks.") dserv := getMockDagServ(t) _, n := getNode(t, dserv, 0) From 25c4c807a8bf95e92a6c29c847ff1e4efb66f414 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 9 Jan 2015 16:37:20 -0800 Subject: [PATCH 0526/3147] updated datastore (Query) This commit was moved from ipfs/go-ipfs-blockstore@0907fa92f739473174677e08104b04c0404f5f1f --- blockstore/write_cache_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index c2175a1fc7..1e072e95eb 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -4,6 +4,7 @@ import ( "testing" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/jbenet/go-ipfs/blocks" ) @@ -83,7 +84,7 @@ func (c *callbackDatastore) Delete(key ds.Key) (err error) { return c.ds.Delete(key) } -func (c *callbackDatastore) KeyList() ([]ds.Key, error) { +func (c *callbackDatastore) Query(q dsq.Query) (*dsq.Results, error) { c.f() - return c.ds.KeyList() + return c.ds.Query(q) } From 8a37c349094800c1bf91aa10db2b14467c551b53 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 9 Jan 2015 17:39:56 -0800 Subject: [PATCH 0527/3147] blocks: AllKeys + tests This commit was moved from ipfs/go-ipfs-blockstore@8ecb97e32932546fde655a91c6deb4edca7b25ff --- blockstore/blockstore.go | 35 +++++++++++++++++++-- blockstore/blockstore_test.go | 59 ++++++++++++++++++++++++++++++++++- blockstore/write_cache.go | 4 +++ 3 files changed, 95 insertions(+), 3 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index e203ffc502..6132d155e9 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -6,12 +6,17 @@ import ( "errors" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dsns "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" + dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) +// BlockPrefix namespaces blockstore datastores +var BlockPrefix = ds.NewKey("blocks") + var ValueTypeMismatch = errors.New("The retrieved value is not a Block") var ErrNotFound = errors.New("blockstore: block not found") @@ -22,16 +27,20 @@ type Blockstore interface { Has(u.Key) (bool, error) Get(u.Key) (*blocks.Block, error) Put(*blocks.Block) error + AllKeys(offset int, limit int) ([]u.Key, error) } func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { + dd := dsns.Wrap(d, BlockPrefix) return &blockstore{ - datastore: d, + datastore: dd, } } type blockstore struct { - datastore ds.ThreadSafeDatastore + datastore ds.Datastore + // cant be ThreadSafeDatastore cause namespace.Datastore doesnt support it. + // we do check it on `NewBlockstore` though. } func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { @@ -67,3 +76,25 @@ func (bs *blockstore) Has(k u.Key) (bool, error) { func (s *blockstore) DeleteBlock(k u.Key) error { return s.datastore.Delete(k.DsKey()) } + +// AllKeys runs a query for keys from the blockstore. +// this is very simplistic, in the future, take dsq.Query as a param? +// if offset and limit are 0, they are ignored. +func (bs *blockstore) AllKeys(offset int, limit int) ([]u.Key, error) { + var keys []u.Key + + // TODO make async inside ds/leveldb.Query + // KeysOnly, because that would be _a lot_ of data. + q := dsq.Query{KeysOnly: true, Offset: offset, Limit: limit} + res, err := bs.datastore.Query(q) + if err != nil { + return nil, err + } + + for e := range res.Entries() { + // need to convert to u.Key using u.KeyFromDsKey. + k := u.KeyFromDsKey(ds.NewKey(e.Key)) + keys = append(keys, k) + } + return keys, nil +} diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 00edf61abf..a80ce8337c 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -2,6 +2,7 @@ package blockstore import ( "bytes" + "fmt" "testing" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -41,11 +42,49 @@ func TestPutThenGetBlock(t *testing.T) { } } +func TestAllKeys(t *testing.T) { + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) + N := 100 + + keys := make([]u.Key, N) + for i := 0; i < N; i++ { + block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) + err := bs.Put(block) + if err != nil { + t.Fatal(err) + } + keys[i] = block.Key() + } + + keys2, err := bs.AllKeys(0, 0) + if err != nil { + t.Fatal(err) + } + // for _, k2 := range keys2 { + // t.Log("found ", k2.Pretty()) + // } + + expectMatches(t, keys, keys2) + + keys3, err := bs.AllKeys(N/3, N/3) + if err != nil { + t.Fatal(err) + } + for _, k3 := range keys3 { + t.Log("found ", k3.Pretty()) + } + if len(keys3) != N/3 { + t.Errorf("keys3 should be: %d != %d", N/3, len(keys3)) + } + +} + func TestValueTypeMismatch(t *testing.T) { block := blocks.NewBlock([]byte("some data")) datastore := ds.NewMapDatastore() - datastore.Put(block.Key().DsKey(), "data that isn't a block!") + k := BlockPrefix.Child(block.Key().DsKey()) + datastore.Put(k, "data that isn't a block!") blockstore := NewBlockstore(ds_sync.MutexWrap(datastore)) @@ -54,3 +93,21 @@ func TestValueTypeMismatch(t *testing.T) { t.Fatal(err) } } + +func expectMatches(t *testing.T, expect, actual []u.Key) { + + if len(expect) != len(actual) { + t.Errorf("expect and actual differ: %d != %d", len(expect), len(actual)) + } + for _, ek := range expect { + found := false + for _, ak := range actual { + if ek == ak { + found = true + } + } + if !found { + t.Error("expected key not found: ", ek) + } + } +} diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index b46d058466..da9a0a01d7 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -43,3 +43,7 @@ func (w *writecache) Put(b *blocks.Block) error { w.cache.Add(b.Key(), struct{}{}) return w.blockstore.Put(b) } + +func (w *writecache) AllKeys(offset int, limit int) ([]u.Key, error) { + return w.blockstore.AllKeys(offset, limit) +} From ca46205133c919c29becb62539bd39dcac3ff607 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 10 Jan 2015 14:31:40 -0800 Subject: [PATCH 0528/3147] updated datastore for proper query handling Queries now can be cancelled and the resources collected This commit was moved from ipfs/go-ipfs-blockstore@083e0167a740d2f42f2efec3351a132d2df40b5f --- blockstore/blockstore.go | 77 +++++++++++++-- blockstore/blockstore_test.go | 165 ++++++++++++++++++++++++++++++++- blockstore/write_cache.go | 10 +- blockstore/write_cache_test.go | 2 +- 4 files changed, 238 insertions(+), 16 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 6132d155e9..63d5df54bc 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -5,6 +5,7 @@ package blockstore import ( "errors" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dsns "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" @@ -12,8 +13,11 @@ import ( blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) +var log = eventlog.Logger("blockstore") + // BlockPrefix namespaces blockstore datastores var BlockPrefix = ds.NewKey("blocks") @@ -27,7 +31,9 @@ type Blockstore interface { Has(u.Key) (bool, error) Get(u.Key) (*blocks.Block, error) Put(*blocks.Block) error - AllKeys(offset int, limit int) ([]u.Key, error) + + AllKeys(ctx context.Context, offset int, limit int) ([]u.Key, error) + AllKeysChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) } func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { @@ -80,10 +86,29 @@ func (s *blockstore) DeleteBlock(k u.Key) error { // AllKeys runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? // if offset and limit are 0, they are ignored. -func (bs *blockstore) AllKeys(offset int, limit int) ([]u.Key, error) { +// +// AllKeys respects context +func (bs *blockstore) AllKeys(ctx context.Context, offset int, limit int) ([]u.Key, error) { + + ch, err := bs.AllKeysChan(ctx, offset, limit) + if err != nil { + return nil, err + } + var keys []u.Key + for k := range ch { + keys = append(keys, k) + } + return keys, nil +} + +// AllKeys runs a query for keys from the blockstore. +// this is very simplistic, in the future, take dsq.Query as a param? +// if offset and limit are 0, they are ignored. +// +// AllKeys respects context +func (bs *blockstore) AllKeysChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { - // TODO make async inside ds/leveldb.Query // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true, Offset: offset, Limit: limit} res, err := bs.datastore.Query(q) @@ -91,10 +116,46 @@ func (bs *blockstore) AllKeys(offset int, limit int) ([]u.Key, error) { return nil, err } - for e := range res.Entries() { - // need to convert to u.Key using u.KeyFromDsKey. - k := u.KeyFromDsKey(ds.NewKey(e.Key)) - keys = append(keys, k) + // this function is here to compartmentalize + get := func() (k u.Key, ok bool) { + select { + case <-ctx.Done(): + return k, false + case e, more := <-res.Next(): + if !more { + return k, false + } + if e.Error != nil { + log.Debug("blockstore.AllKeysChan got err:", e.Error) + return k, false + } + + // need to convert to u.Key using u.KeyFromDsKey. + k = u.KeyFromDsKey(ds.NewKey(e.Key)) + return k, true + } } - return keys, nil + + output := make(chan u.Key) + go func() { + defer func() { + res.Process().Close() // ensure exit (signals early exit, too) + close(output) + }() + + for { + k, ok := get() + if !ok { + return + } + + select { + case <-ctx.Done(): + return + case output <- k: + } + } + }() + + return output, nil } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index a80ce8337c..de74d6d836 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,8 +5,11 @@ import ( "fmt" "testing" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) @@ -42,9 +45,11 @@ func TestPutThenGetBlock(t *testing.T) { } } -func TestAllKeys(t *testing.T) { - bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) - N := 100 +func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []u.Key) { + if d == nil { + d = ds.NewMapDatastore() + } + bs := NewBlockstore(ds_sync.MutexWrap(d)) keys := make([]u.Key, N) for i := 0; i < N; i++ { @@ -55,8 +60,14 @@ func TestAllKeys(t *testing.T) { } keys[i] = block.Key() } + return bs, keys +} + +func TestAllKeysSimple(t *testing.T) { + bs, keys := newBlockStoreWithKeys(t, nil, 100) - keys2, err := bs.AllKeys(0, 0) + ctx := context.Background() + keys2, err := bs.AllKeys(ctx, 0, 0) if err != nil { t.Fatal(err) } @@ -65,8 +76,14 @@ func TestAllKeys(t *testing.T) { // } expectMatches(t, keys, keys2) +} - keys3, err := bs.AllKeys(N/3, N/3) +func TestAllKeysOffsetAndLimit(t *testing.T) { + N := 30 + bs, _ := newBlockStoreWithKeys(t, nil, N) + + ctx := context.Background() + keys3, err := bs.AllKeys(ctx, N/3, N/3) if err != nil { t.Fatal(err) } @@ -76,6 +93,114 @@ func TestAllKeys(t *testing.T) { if len(keys3) != N/3 { t.Errorf("keys3 should be: %d != %d", N/3, len(keys3)) } +} + +func TestAllKeysRespectsContext(t *testing.T) { + N := 100 + + d := &queryTestDS{ds: ds.NewMapDatastore()} + bs, _ := newBlockStoreWithKeys(t, d, N) + + started := make(chan struct{}, 1) + done := make(chan struct{}, 1) + errors := make(chan error, 100) + + getKeys := func(ctx context.Context) { + started <- struct{}{} + _, err := bs.AllKeys(ctx, 0, 0) // once without cancelling + if err != nil { + errors <- err + } + done <- struct{}{} + errors <- nil // a nil one to signal break + } + + // Once without context, to make sure it all works + { + var results dsq.Results + resultChan := make(chan dsq.Result) + d.SetFunc(func(q dsq.Query) (dsq.Results, error) { + results = dsq.ResultsWithChan(q, resultChan) + return results, nil + }) + + go getKeys(context.Background()) + + // make sure it's waiting. + <-started + select { + case <-done: + t.Fatal("sync is wrong") + case <-results.Process().Closing(): + t.Fatal("should not be closing") + case <-results.Process().Closed(): + t.Fatal("should not be closed") + default: + } + + e := dsq.Entry{Key: BlockPrefix.ChildString("foo").String()} + resultChan <- dsq.Result{Entry: e} // let it go. + close(resultChan) + <-done // should be done now. + <-results.Process().Closed() // should be closed now + + // print any errors + for err := range errors { + if err == nil { + break + } + t.Error(err) + } + } + + // Once with + { + var results dsq.Results + resultChan := make(chan dsq.Result) + d.SetFunc(func(q dsq.Query) (dsq.Results, error) { + results = dsq.ResultsWithChan(q, resultChan) + return results, nil + }) + + ctx, cancel := context.WithCancel(context.Background()) + go getKeys(ctx) + + // make sure it's waiting. + <-started + select { + case <-done: + t.Fatal("sync is wrong") + case <-results.Process().Closing(): + t.Fatal("should not be closing") + case <-results.Process().Closed(): + t.Fatal("should not be closed") + default: + } + + cancel() // let it go. + + select { + case <-done: + t.Fatal("sync is wrong") + case <-results.Process().Closed(): + t.Fatal("should not be closed") // should not be closed yet. + case <-results.Process().Closing(): + // should be closing now! + t.Log("closing correctly at this point.") + } + + close(resultChan) + <-done // should be done now. + <-results.Process().Closed() // should be closed now + + // print any errors + for err := range errors { + if err == nil { + break + } + t.Error(err) + } + } } @@ -111,3 +236,33 @@ func expectMatches(t *testing.T, expect, actual []u.Key) { } } } + +type queryTestDS struct { + cb func(q dsq.Query) (dsq.Results, error) + ds ds.Datastore +} + +func (c *queryTestDS) SetFunc(f func(dsq.Query) (dsq.Results, error)) { c.cb = f } + +func (c *queryTestDS) Put(key ds.Key, value interface{}) (err error) { + return c.ds.Put(key, value) +} + +func (c *queryTestDS) Get(key ds.Key) (value interface{}, err error) { + return c.ds.Get(key) +} + +func (c *queryTestDS) Has(key ds.Key) (exists bool, err error) { + return c.ds.Has(key) +} + +func (c *queryTestDS) Delete(key ds.Key) (err error) { + return c.ds.Delete(key) +} + +func (c *queryTestDS) Query(q dsq.Query) (dsq.Results, error) { + if c.cb != nil { + return c.cb(q) + } + return c.ds.Query(q) +} diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index da9a0a01d7..377ce629d2 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -1,7 +1,9 @@ package blockstore import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" + "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) @@ -44,6 +46,10 @@ func (w *writecache) Put(b *blocks.Block) error { return w.blockstore.Put(b) } -func (w *writecache) AllKeys(offset int, limit int) ([]u.Key, error) { - return w.blockstore.AllKeys(offset, limit) +func (w *writecache) AllKeys(ctx context.Context, offset int, limit int) ([]u.Key, error) { + return w.blockstore.AllKeys(ctx, offset, limit) +} + +func (w *writecache) AllKeysChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { + return w.blockstore.AllKeysChan(ctx, offset, limit) } diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index 1e072e95eb..b20188e299 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -84,7 +84,7 @@ func (c *callbackDatastore) Delete(key ds.Key) (err error) { return c.ds.Delete(key) } -func (c *callbackDatastore) Query(q dsq.Query) (*dsq.Results, error) { +func (c *callbackDatastore) Query(q dsq.Query) (dsq.Results, error) { c.f() return c.ds.Query(q) } From e0ab059e0036507d8ea291e8645ead819ae02f7e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 10 Jan 2015 20:44:51 -0800 Subject: [PATCH 0529/3147] refs: tie the contexts together This commit was moved from ipfs/go-ipfs-blockstore@b92267ea7eb938c1354698be06572feb36dc96c7 --- blockstore/blockstore.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 63d5df54bc..484e151544 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -132,6 +132,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context, offset int, limit int) (< // need to convert to u.Key using u.KeyFromDsKey. k = u.KeyFromDsKey(ds.NewKey(e.Key)) + log.Debug("blockstore: query got key", k) return k, true } } From 164413edffee322418502e3ec079cbb0fc558341 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 11 Jan 2015 19:33:37 -0800 Subject: [PATCH 0530/3147] change block datastore prefix to "/b" the prefix should be as short as possible, as this is a per-block overhead. This commit was moved from ipfs/go-ipfs-blockstore@50d8212ea993dae0357cca689ba9de2f6f8960e0 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 484e151544..ed24326c9f 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -19,7 +19,7 @@ import ( var log = eventlog.Logger("blockstore") // BlockPrefix namespaces blockstore datastores -var BlockPrefix = ds.NewKey("blocks") +var BlockPrefix = ds.NewKey("b") var ValueTypeMismatch = errors.New("The retrieved value is not a Block") From badbfae9fa44a96e04b48ac578fa72f9c7e0a395 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 11 Jan 2015 21:19:42 -0800 Subject: [PATCH 0531/3147] blockstore Allkeys: ignore non multihash keys This commit was moved from ipfs/go-ipfs-blockstore@145c531c16ea52f5abd175bef5066df57a89ca5f --- blockstore/blockstore.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index ed24326c9f..e4a9f7745e 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -133,6 +133,13 @@ func (bs *blockstore) AllKeysChan(ctx context.Context, offset int, limit int) (< // need to convert to u.Key using u.KeyFromDsKey. k = u.KeyFromDsKey(ds.NewKey(e.Key)) log.Debug("blockstore: query got key", k) + + // key must be a multihash. else ignore it. + _, err := mh.Cast([]byte(k)) + if err != nil { + return "", true + } + return k, true } } @@ -149,6 +156,9 @@ func (bs *blockstore) AllKeysChan(ctx context.Context, offset int, limit int) (< if !ok { return } + if k == "" { + continue + } select { case <-ctx.Done(): From 4bf3d23fd2d367915e6a5eb18330f9915114aff4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 12 Jan 2015 12:21:04 -0800 Subject: [PATCH 0532/3147] p2p/net/swarm: do not usre link local addrs This commit was moved from ipfs/go-ipfs-routing@831115dff5747d31d22b088ef083b2ceffe869b6 --- routing/dht/dht.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 78fef653be..9b1279f100 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -66,8 +66,13 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.peerstore = h.Peerstore() dht.ContextGroup = ctxgroup.WithContext(ctx) dht.host = h - h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) + // sanity check. this should **never** happen + if len(dht.peerstore.Addresses(dht.self)) < 1 { + panic("attempt to initialize dht without addresses for self") + } + + h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) dht.providers = NewProviderManager(dht.Context(), dht.self) dht.AddChildGroup(dht.providers) @@ -132,19 +137,23 @@ func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, // can provide the value of 'key' func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) error { - pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) - // add self as the provider pi := dht.peerstore.PeerInfo(dht.self) - pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), []peer.PeerInfo{pi}) + // // only share WAN-friendly addresses ?? + // pi.Addrs = addrutil.WANShareableAddrs(pi.Addrs) + if len(pi.Addrs) < 1 { + log.Errorf("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, u.Key(key), pi.Addrs) + return fmt.Errorf("no known addresses for self. cannot put provider.") + } + pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) + pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), []peer.PeerInfo{pi}) err := dht.sendMessage(ctx, p, pmes) if err != nil { return err } log.Debugf("%s putProvider: %s for %s (%s)", dht.self, p, u.Key(key), pi.Addrs) - return nil } From e9a918ac6f9e63e81c877545412f7de4d9b49ce0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 11 Jan 2015 21:31:19 -0800 Subject: [PATCH 0533/3147] race fix: pinner loads with a threadsafe datastore All the datastores used by pinners and so on should be mutex wrapped. One issue with changing all of them from ds.Datastore -> ds.ThreadSafeDatastore is that we wrap the incoming ds.ThreadSafeDatastore with other datastores, which do not implement the interface. Re-wrapping again causes double locking. (which may be ok..., but...) any ideas? This commit was moved from ipfs/go-ipfs-pinner@5c2d22bc2705bd88dc02ba1d688704da478d29f4 --- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 371497da69..32b85a9d78 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -53,11 +53,11 @@ type pinner struct { directPin set.BlockSet indirPin *indirectPin dserv mdag.DAGService - dstore ds.Datastore + dstore ds.ThreadSafeDatastore } // NewPinner creates a new pinner using the given datastore as a backend -func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner { +func NewPinner(dstore ds.ThreadSafeDatastore, serv mdag.DAGService) Pinner { // Load set from given datastore... rcds := nsds.Wrap(dstore, recursePinDatastoreKey) @@ -176,7 +176,7 @@ func (p *pinner) IsPinned(key util.Key) bool { } // LoadPinner loads a pinner and its keysets from the given datastore -func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { +func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) { // load recursive set diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index dada99803d..623983a341 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -21,8 +21,8 @@ func randNode() (*mdag.Node, util.Key) { } func TestPinnerBasic(t *testing.T) { - dstore := ds.NewMapDatastore() - bstore := blockstore.NewBlockstore(dssync.MutexWrap(dstore)) + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) bserv, err := bs.New(bstore, offline.Exchange(bstore)) if err != nil { t.Fatal(err) From e2e0f31119cec08c285df47b81f07fca14eaa072 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 15 Jan 2015 04:17:17 +0000 Subject: [PATCH 0534/3147] starting to move important events over to EventBegin/Done This commit was moved from ipfs/go-ipfs-routing@2dfdf35070e9845ab53654561346cf04c836f150 --- routing/dht/dht.go | 8 ++++++++ routing/dht/routing.go | 15 ++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 9b1279f100..c0b27ea90e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -196,6 +196,8 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, key u.Key) (*pb.Message, error) { + e := log.EventBegin(ctx, "getValueSingle", p, &key) + defer e.Done() pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), 0) return dht.sendRequest(ctx, p, pmes) @@ -265,11 +267,17 @@ func (dht *IpfsDHT) FindLocal(id peer.ID) peer.PeerInfo { // findPeerSingle asks peer 'p' if they know where the peer with id 'id' is func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.ID, id peer.ID) (*pb.Message, error) { + e := log.EventBegin(ctx, "findPeerSingle", p, id) + defer e.Done() + pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) return dht.sendRequest(ctx, p, pmes) } func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key u.Key) (*pb.Message, error) { + e := log.EventBegin(ctx, "findProvidersSingle", p, &key) + defer e.Done() + pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), 0) return dht.sendRequest(ctx, p, pmes) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index cd929c2558..3ce5d5ec60 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -122,10 +122,12 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // Provide makes this node announce that it can provide a value for the given key func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { log := dht.log().Prefix("Provide(%s)", key) + log.Debugf("start", key) - log.Event(ctx, "provideBegin", &key) defer log.Debugf("end", key) - defer log.Event(ctx, "provideEnd", &key) + + e := log.EventBegin(ctx, "provide", &key) + defer e.Done() // add self locally dht.providers.AddProvider(key, dht.self) @@ -163,6 +165,7 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn // Kademlia 'node lookup' operation. Returns a channel of the K closest peers // to the given key func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer.ID, error) { + e := log.EventBegin(ctx, "getClosestPeers", &key) tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) if len(tablepeers) == 0 { return nil, errors.Wrap(kb.ErrLookupFailure) @@ -204,6 +207,7 @@ func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer go func() { defer close(out) + defer e.Done() // run it! _, err := query.Run(ctx, tablepeers) if err != nil { @@ -242,10 +246,9 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { log := dht.log().Prefix("FindProviders(%s)", key) + e := log.EventBegin(ctx, "findProvidersAsync", &key) + defer e.Done() defer close(peerOut) - defer log.Event(ctx, "findProviders end", &key) - log.Debug("begin") - defer log.Debug("begin") ps := pset.NewLimited(count) provs := dht.providers.GetProviders(ctx, key) @@ -314,6 +317,8 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // FindPeer searches for a peer with given ID. func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { + e := log.EventBegin(ctx, "FindPeer", id) + defer e.Done() // Check if were already connected to them if pi := dht.FindLocal(id); pi.ID != "" { From d045cc40dc84548bfbe14ade74fe38207896e94c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 15 Jan 2015 04:45:34 +0000 Subject: [PATCH 0535/3147] rewrite as single line defer logs This commit was moved from ipfs/go-ipfs-routing@90fae2b441b2495014e6e670b311d41e35d2ded5 --- routing/dht/dht.go | 9 +++------ routing/dht/routing.go | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c0b27ea90e..7befb6597d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -196,8 +196,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, key u.Key) (*pb.Message, error) { - e := log.EventBegin(ctx, "getValueSingle", p, &key) - defer e.Done() + defer log.EventBegin(ctx, "getValueSingle", p, &key).Done() pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), 0) return dht.sendRequest(ctx, p, pmes) @@ -267,16 +266,14 @@ func (dht *IpfsDHT) FindLocal(id peer.ID) peer.PeerInfo { // findPeerSingle asks peer 'p' if they know where the peer with id 'id' is func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.ID, id peer.ID) (*pb.Message, error) { - e := log.EventBegin(ctx, "findPeerSingle", p, id) - defer e.Done() + defer log.EventBegin(ctx, "findPeerSingle", p, id).Done() pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) return dht.sendRequest(ctx, p, pmes) } func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key u.Key) (*pb.Message, error) { - e := log.EventBegin(ctx, "findProvidersSingle", p, &key) - defer e.Done() + defer log.EventBegin(ctx, "findProvidersSingle", p, &key).Done() pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), 0) return dht.sendRequest(ctx, p, pmes) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3ce5d5ec60..05fa028a87 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -126,8 +126,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { log.Debugf("start", key) defer log.Debugf("end", key) - e := log.EventBegin(ctx, "provide", &key) - defer e.Done() + defer log.EventBegin(ctx, "provide", &key).Done() // add self locally dht.providers.AddProvider(key, dht.self) @@ -246,8 +245,7 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { log := dht.log().Prefix("FindProviders(%s)", key) - e := log.EventBegin(ctx, "findProvidersAsync", &key) - defer e.Done() + defer log.EventBegin(ctx, "findProvidersAsync", &key).Done() defer close(peerOut) ps := pset.NewLimited(count) @@ -317,8 +315,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // FindPeer searches for a peer with given ID. func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { - e := log.EventBegin(ctx, "FindPeer", id) - defer e.Done() + defer log.EventBegin(ctx, "FindPeer", id).Done() // Check if were already connected to them if pi := dht.FindLocal(id); pi.ID != "" { From 532e32af34a7bcd62d0f828fa38e48d869edaabc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 15 Jan 2015 17:47:36 +0000 Subject: [PATCH 0536/3147] add events for handlers This commit was moved from ipfs/go-ipfs-routing@d63da196b330a5978a50dd66a27de99aeb4eed7a --- routing/dht/handlers.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 8f66afbf62..59e30d3984 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -39,6 +39,7 @@ func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { } func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { + defer log.EventBegin(ctx, "handleGetValue", p).Done() log.Debugf("%s handleGetValue for key: %s", dht.self, pmes.GetKey()) // setup response @@ -114,6 +115,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess // Store a value in this peer local storage func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { + defer log.EventBegin(ctx, "handlePutValue", p).Done() dskey := u.Key(pmes.GetKey()).DsKey() if err := dht.verifyRecordLocally(pmes.GetRecord()); err != nil { @@ -137,6 +139,7 @@ func (dht *IpfsDHT) handlePing(_ context.Context, p peer.ID, pmes *pb.Message) ( } func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { + defer log.EventBegin(ctx, "handleFindPeer", p).Done() resp := pb.NewMessage(pmes.GetType(), "", pmes.GetClusterLevel()) var closest []peer.ID @@ -166,6 +169,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess } func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { + defer log.EventBegin(ctx, "handleGetProviders", p).Done() resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) key := u.Key(pmes.GetKey()) @@ -211,6 +215,7 @@ type providerInfo struct { } func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { + defer log.EventBegin(ctx, "handleAddProvider", p).Done() key := u.Key(pmes.GetKey()) log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, key) From fd36a6fc2158af6d25cd48bca703ebdeb2be8f49 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 15 Jan 2015 22:01:33 +0000 Subject: [PATCH 0537/3147] remove low signal log messages This commit was moved from ipfs/go-ipfs-routing@0c77275472ac09d008153b8c0e9e804a94708d02 --- routing/dht/routing.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 05fa028a87..4a2cc35186 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -123,9 +123,6 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { log := dht.log().Prefix("Provide(%s)", key) - log.Debugf("start", key) - defer log.Debugf("end", key) - defer log.EventBegin(ctx, "provide", &key).Done() // add self locally From faf353f61e8ebaa61f1b2c37c6d4574643ca45a6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 16 Jan 2015 02:13:00 -0800 Subject: [PATCH 0538/3147] addr-explosion mitigated adding mitigated adding our own addresses where received from peers see #573 This commit was moved from ipfs/go-ipfs-routing@ee38367c198fab08025b3dd811163cd6571389fd --- routing/dht/handlers.go | 4 ++-- routing/dht/query.go | 5 +++++ routing/dht/routing.go | 6 ++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 59e30d3984..28df3aea6b 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -236,9 +236,9 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M } log.Infof("received provider %s for %s (addrs: %s)", p, key, pi.Addrs) - for _, maddr := range pi.Addrs { + if pi.ID != dht.self { // dont add own addrs. // add the received addresses to our peerstore. - dht.peerstore.AddAddress(p, maddr) + dht.peerstore.AddPeerInfo(pi) } dht.providers.AddProvider(key, p) } diff --git a/routing/dht/query.go b/routing/dht/query.go index 44dc499263..6ac8fefe89 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -254,6 +254,11 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { } else if len(res.closerPeers) > 0 { log.Debugf("PEERS CLOSER -- worker for: %v (%d closer peers)", p, len(res.closerPeers)) for _, next := range res.closerPeers { + if next.ID == r.query.dht.self { // dont add self. + log.Debugf("PEERS CLOSER -- worker for: %v found self", p) + continue + } + // add their addresses to the dialer's peerstore r.query.dht.peerstore.AddPeerInfo(next) r.addPeerToQuery(cg.Context(), next.ID) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4a2cc35186..3c72da4949 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -223,8 +223,10 @@ func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) var out []peer.ID for _, pbp := range pmes.GetCloserPeers() { pid := peer.ID(pbp.GetId()) - dht.peerstore.AddAddresses(pid, pbp.Addresses()) - out = append(out, pid) + if pid != dht.self { // dont add self + dht.peerstore.AddAddresses(pid, pbp.Addresses()) + out = append(out, pid) + } } return out, nil } From 72fa79418c0aba45c5c6e565c9c7f9efed4fb9bf Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 18 Jan 2015 12:31:12 -0800 Subject: [PATCH 0539/3147] move generic packages to thirdparty (see thirdparty/README.md) This commit was moved from ipfs/go-ipfs-routing@70af83b45e473b84aef6edc2c741a981f92615d1 --- routing/dht/dht.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 7befb6597d..9f48608800 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -16,8 +16,8 @@ import ( routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" + "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" - "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 61bf41ebb9..6802341027 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -5,7 +5,7 @@ import ( inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" + eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" ) var log = eventlog.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index 6ac8fefe89..53c232323c 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -6,8 +6,8 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" + eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" pset "github.com/jbenet/go-ipfs/util/peerset" todoctr "github.com/jbenet/go-ipfs/util/todocounter" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 526d63c686..56f61c0761 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,8 +6,8 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" + delay "github.com/jbenet/go-ipfs/thirdparty/delay" u "github.com/jbenet/go-ipfs/util" - delay "github.com/jbenet/go-ipfs/util/delay" "github.com/jbenet/go-ipfs/util/testutil" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index d7dca8348c..f8b0340988 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -9,8 +9,8 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" + delay "github.com/jbenet/go-ipfs/thirdparty/delay" u "github.com/jbenet/go-ipfs/util" - delay "github.com/jbenet/go-ipfs/util/delay" "github.com/jbenet/go-ipfs/util/testutil" ) From c5db930f038c8c039c4ce76d0bd32bb2516da05a Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 18 Jan 2015 12:31:12 -0800 Subject: [PATCH 0540/3147] move generic packages to thirdparty (see thirdparty/README.md) This commit was moved from ipfs/go-ipfs-blockstore@c637d7339b5cab26e37e8999ca07b021ffcc881f --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index e4a9f7745e..3c98b0735b 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,8 +12,8 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" blocks "github.com/jbenet/go-ipfs/blocks" + eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) var log = eventlog.Logger("blockstore") From 40c75ce173de2bd99dc5d7a1a36d61a6477c32bb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 18 Jan 2015 12:31:12 -0800 Subject: [PATCH 0541/3147] move generic packages to thirdparty (see thirdparty/README.md) This commit was moved from ipfs/go-blockservice@4e4f388e59fe6ed323f58d24c1287ae4c25a2175 --- blockservice/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/mock.go b/blockservice/mock.go index 73fcdf2fca..541efe6964 100644 --- a/blockservice/mock.go +++ b/blockservice/mock.go @@ -6,7 +6,7 @@ import ( bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" mockrouting "github.com/jbenet/go-ipfs/routing/mock" - delay "github.com/jbenet/go-ipfs/util/delay" + delay "github.com/jbenet/go-ipfs/thirdparty/delay" ) // Mocks returns |n| connected mock Blockservices From 89589a3c18cc70ba09475f6368eb0837004c5d10 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 16 Jan 2015 22:46:44 +0000 Subject: [PATCH 0542/3147] fix fuse mounting issues this time, without loading the private key on every startup This commit was moved from ipfs/go-ipfs-routing@1241f4f11da894779464af81b2945fa226c4cd6e --- routing/dht/dht.go | 17 +++++++- routing/dht/ext_test.go | 8 +++- routing/dht/records.go | 14 +++--- routing/dht/routing.go | 9 +++- routing/offline/offline.go | 89 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 127 insertions(+), 10 deletions(-) create mode 100644 routing/offline/offline.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 9f48608800..e4a2855287 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,6 +10,7 @@ import ( "sync" "time" + ci "github.com/jbenet/go-ipfs/p2p/crypto" host "github.com/jbenet/go-ipfs/p2p/host" peer "github.com/jbenet/go-ipfs/p2p/peer" protocol "github.com/jbenet/go-ipfs/p2p/protocol" @@ -234,9 +235,23 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { return rec.GetValue(), nil } +func (dht *IpfsDHT) getOwnPrivateKey() (ci.PrivKey, error) { + sk := dht.peerstore.PrivKey(dht.self) + if sk == nil { + log.Errorf("%s dht cannot get own private key!", dht.self) + return nil, fmt.Errorf("cannot get private key to sign record!") + } + return sk, nil +} + // putLocal stores the key value pair in the datastore func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { - rec, err := dht.makePutRecord(key, value) + sk, err := dht.getOwnPrivateKey() + if err != nil { + return err + } + + rec, err := MakePutRecord(sk, key, value) if err != nil { return err } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 6f12c31139..808e27b10e 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -98,7 +98,13 @@ func TestGetFailures(t *testing.T) { { typ := pb.Message_GET_VALUE str := "hello" - rec, err := d.makePutRecord(u.Key(str), []byte("blah")) + + sk, err := d.getOwnPrivateKey() + if err != nil { + t.Fatal(err) + } + + rec, err := MakePutRecord(sk, u.Key(str), []byte("blah")) if err != nil { t.Fatal(err) } diff --git a/routing/dht/records.go b/routing/dht/records.go index 083eeb26ee..5dbcccaaae 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -43,20 +43,20 @@ func RecordBlobForSig(r *pb.Record) []byte { } // creates and signs a dht record for the given key/value pair -func (dht *IpfsDHT) makePutRecord(key u.Key, value []byte) (*pb.Record, error) { +func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte) (*pb.Record, error) { record := new(pb.Record) record.Key = proto.String(string(key)) record.Value = value - record.Author = proto.String(string(dht.self)) - blob := RecordBlobForSig(record) - sk := dht.peerstore.PrivKey(dht.self) - if sk == nil { - log.Errorf("%s dht cannot get own private key!", dht.self) - return nil, fmt.Errorf("cannot get private key to sign record!") + pkh, err := sk.GetPublic().Hash() + if err != nil { + return nil, err } + record.Author = proto.String(string(pkh)) + blob := RecordBlobForSig(record) + sig, err := sk.Sign(blob) if err != nil { return nil, err diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3c72da4949..aea4406f12 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -36,7 +36,12 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - rec, err := dht.makePutRecord(key, value) + sk, err := dht.getOwnPrivateKey() + if err != nil { + return err + } + + rec, err := MakePutRecord(sk, key, value) if err != nil { log.Error("Creation of record failed!") return err @@ -75,6 +80,8 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { if err == nil { log.Debug("have it locally") return val, nil + } else { + log.Debug("failed to get value locally: %s", err) } // get closest peers in the routing table diff --git a/routing/offline/offline.go b/routing/offline/offline.go new file mode 100644 index 0000000000..7109c6abe5 --- /dev/null +++ b/routing/offline/offline.go @@ -0,0 +1,89 @@ +package offline + +import ( + "errors" + "time" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ci "github.com/jbenet/go-ipfs/p2p/crypto" + "github.com/jbenet/go-ipfs/p2p/peer" + routing "github.com/jbenet/go-ipfs/routing" + dht "github.com/jbenet/go-ipfs/routing/dht" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" + eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" + u "github.com/jbenet/go-ipfs/util" +) + +var log = eventlog.Logger("offlinerouting") + +var ErrOffline = errors.New("routing system in offline mode") + +func NewOfflineRouter(dstore ds.Datastore, privkey ci.PrivKey) routing.IpfsRouting { + return &offlineRouting{ + datastore: dstore, + sk: privkey, + } +} + +type offlineRouting struct { + datastore ds.Datastore + sk ci.PrivKey +} + +func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte) error { + rec, err := dht.MakePutRecord(c.sk, key, val) + if err != nil { + return err + } + data, err := proto.Marshal(rec) + if err != nil { + return err + } + + return c.datastore.Put(key.DsKey(), data) +} + +func (c *offlineRouting) GetValue(ctx context.Context, key u.Key) ([]byte, error) { + v, err := c.datastore.Get(key.DsKey()) + if err != nil { + return nil, err + } + + byt, ok := v.([]byte) + if !ok { + return nil, errors.New("value stored in datastore not []byte") + } + rec := new(pb.Record) + err = proto.Unmarshal(byt, rec) + if err != nil { + return nil, err + } + + return rec.GetValue(), nil +} + +func (c *offlineRouting) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerInfo, error) { + return nil, ErrOffline +} + +func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (peer.PeerInfo, error) { + return peer.PeerInfo{}, ErrOffline +} + +func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { + out := make(chan peer.PeerInfo) + close(out) + return out +} + +func (c *offlineRouting) Provide(_ context.Context, key u.Key) error { + return ErrOffline +} + +func (c *offlineRouting) Ping(ctx context.Context, p peer.ID) (time.Duration, error) { + return 0, ErrOffline +} + +var _ routing.IpfsRouting = &offlineRouting{} From 2e3e4cf52a745202bafe68b82c06c519f7939d1a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 16 Jan 2015 23:53:56 +0000 Subject: [PATCH 0543/3147] some comments This commit was moved from ipfs/go-ipfs-routing@2327b3c05493e7d453fcf610b31eb330bc9acb8e --- routing/dht/dht.go | 2 ++ routing/dht/records.go | 4 +++- routing/offline/offline.go | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e4a2855287..344092057e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -235,6 +235,8 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { return rec.GetValue(), nil } +// getOwnPrivateKey attempts to load the local peers private +// key from the peerstore. func (dht *IpfsDHT) getOwnPrivateKey() (ci.PrivKey, error) { sk := dht.peerstore.PrivKey(dht.self) if sk == nil { diff --git a/routing/dht/records.go b/routing/dht/records.go index 5dbcccaaae..2dc9644cfd 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -42,7 +42,7 @@ func RecordBlobForSig(r *pb.Record) []byte { return bytes.Join([][]byte{k, v, a}, []byte{}) } -// creates and signs a dht record for the given key/value pair +// MakePutRecord creates and signs a dht record for the given key/value pair func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte) (*pb.Record, error) { record := new(pb.Record) @@ -175,6 +175,8 @@ func (dht *IpfsDHT) verifyRecordOnline(ctx context.Context, r *pb.Record) error return dht.verifyRecord(r, pk) } +// TODO: make this an independent exported function. +// it might be useful for users to have access to. func (dht *IpfsDHT) verifyRecord(r *pb.Record, pk ci.PubKey) error { // First, validate the signature blob := RecordBlobForSig(r) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7109c6abe5..41baf50d27 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -27,6 +27,9 @@ func NewOfflineRouter(dstore ds.Datastore, privkey ci.PrivKey) routing.IpfsRouti } } +// offlineRouting implements the IpfsRouting interface, +// but only provides the capability to Put and Get signed dht +// records to and from the local datastore. type offlineRouting struct { datastore ds.Datastore sk ci.PrivKey @@ -86,4 +89,5 @@ func (c *offlineRouting) Ping(ctx context.Context, p peer.ID) (time.Duration, er return 0, ErrOffline } +// ensure offlineRouting matches the IpfsRouting interface var _ routing.IpfsRouting = &offlineRouting{} From 91eab6319421f7f035677082bc557306d572cdf8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 17 Jan 2015 02:50:10 +0000 Subject: [PATCH 0544/3147] move dht record code into new package This commit was moved from ipfs/go-ipfs-routing@eb96dbd7e438b8e5d5b94a1260638a9abdf74f16 --- routing/dht/dht.go | 3 ++- routing/dht/ext_test.go | 3 ++- routing/dht/records.go | 36 ++------------------------------ routing/dht/routing.go | 3 ++- routing/offline/offline.go | 4 ++-- routing/record/record.go | 42 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 routing/record/record.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 344092057e..25be47fac5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -17,6 +17,7 @@ import ( routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" + record "github.com/jbenet/go-ipfs/routing/record" "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" @@ -253,7 +254,7 @@ func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { return err } - rec, err := MakePutRecord(sk, key, value) + rec, err := record.MakePutRecord(sk, key, value) if err != nil { return err } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 808e27b10e..e151af5d24 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -11,6 +11,7 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" + record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -104,7 +105,7 @@ func TestGetFailures(t *testing.T) { t.Fatal(err) } - rec, err := MakePutRecord(sk, u.Key(str), []byte("blah")) + rec, err := record.MakePutRecord(sk, u.Key(str), []byte("blah")) if err != nil { t.Fatal(err) } diff --git a/routing/dht/records.go b/routing/dht/records.go index 2dc9644cfd..71511b978d 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -7,11 +7,11 @@ import ( "strings" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/p2p/crypto" "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" + record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" ctxutil "github.com/jbenet/go-ipfs/util/ctx" ) @@ -34,38 +34,6 @@ func KeyForPublicKey(id peer.ID) u.Key { return u.Key("/pk/" + string(id)) } -// RecordBlobForSig returns the blob protected by the record signature -func RecordBlobForSig(r *pb.Record) []byte { - k := []byte(r.GetKey()) - v := []byte(r.GetValue()) - a := []byte(r.GetAuthor()) - return bytes.Join([][]byte{k, v, a}, []byte{}) -} - -// MakePutRecord creates and signs a dht record for the given key/value pair -func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte) (*pb.Record, error) { - record := new(pb.Record) - - record.Key = proto.String(string(key)) - record.Value = value - - pkh, err := sk.GetPublic().Hash() - if err != nil { - return nil, err - } - - record.Author = proto.String(string(pkh)) - blob := RecordBlobForSig(record) - - sig, err := sk.Sign(blob) - if err != nil { - return nil, err - } - - record.Signature = sig - return record, nil -} - func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKey, error) { log.Debugf("getPublicKey for: %s", p) @@ -179,7 +147,7 @@ func (dht *IpfsDHT) verifyRecordOnline(ctx context.Context, r *pb.Record) error // it might be useful for users to have access to. func (dht *IpfsDHT) verifyRecord(r *pb.Record, pk ci.PubKey) error { // First, validate the signature - blob := RecordBlobForSig(r) + blob := record.RecordBlobForSig(r) ok, err := pk.Verify(blob, r.GetSignature()) if err != nil { log.Error("Signature verify failed.") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index aea4406f12..35d8046509 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,6 +12,7 @@ import ( "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" + record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" errors "github.com/jbenet/go-ipfs/util/debugerror" pset "github.com/jbenet/go-ipfs/util/peerset" @@ -41,7 +42,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - rec, err := MakePutRecord(sk, key, value) + rec, err := record.MakePutRecord(sk, key, value) if err != nil { log.Error("Creation of record failed!") return err diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 41baf50d27..63fb144410 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,8 +10,8 @@ import ( ci "github.com/jbenet/go-ipfs/p2p/crypto" "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" - dht "github.com/jbenet/go-ipfs/routing/dht" pb "github.com/jbenet/go-ipfs/routing/dht/pb" + record "github.com/jbenet/go-ipfs/routing/record" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" ) @@ -36,7 +36,7 @@ type offlineRouting struct { } func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte) error { - rec, err := dht.MakePutRecord(c.sk, key, val) + rec, err := record.MakePutRecord(c.sk, key, val) if err != nil { return err } diff --git a/routing/record/record.go b/routing/record/record.go new file mode 100644 index 0000000000..602159694c --- /dev/null +++ b/routing/record/record.go @@ -0,0 +1,42 @@ +package record + +import ( + "bytes" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + + ci "github.com/jbenet/go-ipfs/p2p/crypto" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" + u "github.com/jbenet/go-ipfs/util" +) + +// MakePutRecord creates and signs a dht record for the given key/value pair +func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte) (*pb.Record, error) { + record := new(pb.Record) + + record.Key = proto.String(string(key)) + record.Value = value + + pkh, err := sk.GetPublic().Hash() + if err != nil { + return nil, err + } + + record.Author = proto.String(string(pkh)) + blob := RecordBlobForSig(record) + + sig, err := sk.Sign(blob) + if err != nil { + return nil, err + } + + record.Signature = sig + return record, nil +} + +// RecordBlobForSig returns the blob protected by the record signature +func RecordBlobForSig(r *pb.Record) []byte { + k := []byte(r.GetKey()) + v := []byte(r.GetValue()) + a := []byte(r.GetAuthor()) + return bytes.Join([][]byte{k, v, a}, []byte{}) +} From bcff55d6dfa65c418a87d497578cb079b5e13ec8 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 17 Jan 2015 03:52:40 -0800 Subject: [PATCH 0545/3147] routing: record validation into record/ This commit moves the record validation/verification from dht/ into the new record/ packaage. Validator object -- which is merely a map of ValidatorFuncs -- with a VerifyRecord cc @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@2218364fbaedc8a45b8d95e277bd3c893b305957 --- routing/dht/dht.go | 7 ++-- routing/dht/dht_test.go | 6 +-- routing/dht/records.go | 69 ++------------------------------- routing/record/record.go | 4 ++ routing/record/validation.go | 75 ++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 73 deletions(-) create mode 100644 routing/record/validation.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 25be47fac5..923c8c69b7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -54,8 +54,7 @@ type IpfsDHT struct { birth time.Time // When this peer started up diaglock sync.Mutex // lock to make diagnostics work better - // record validator funcs - Validators map[string]ValidatorFunc + Validator record.Validator // record validator funcs ctxgroup.ContextGroup } @@ -81,8 +80,8 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) dht.birth = time.Now() - dht.Validators = make(map[string]ValidatorFunc) - dht.Validators["pk"] = ValidatePublicKeyRecord + dht.Validator = make(record.Validator) + dht.Validator["pk"] = record.ValidatePublicKeyRecord if doPinging { dht.Children().Add(1) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 818fd5911c..07211f5fea 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -38,7 +38,7 @@ func setupDHT(ctx context.Context, t *testing.T) *IpfsDHT { dss := dssync.MutexWrap(ds.NewMapDatastore()) d := NewDHT(ctx, h, dss) - d.Validators["v"] = func(u.Key, []byte) error { + d.Validator["v"] = func(u.Key, []byte) error { return nil } return d @@ -142,8 +142,8 @@ func TestValueGetSet(t *testing.T) { vf := func(u.Key, []byte) error { return nil } - dhtA.Validators["v"] = vf - dhtB.Validators["v"] = vf + dhtA.Validator["v"] = vf + dhtB.Validator["v"] = vf connect(t, ctx, dhtA, dhtB) diff --git a/routing/dht/records.go b/routing/dht/records.go index 71511b978d..14d73b6c6d 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -1,33 +1,17 @@ package dht import ( - "bytes" - "errors" "fmt" - "strings" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ci "github.com/jbenet/go-ipfs/p2p/crypto" - "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" - record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" ctxutil "github.com/jbenet/go-ipfs/util/ctx" ) -// ValidatorFunc is a function that is called to validate a given -// type of DHTRecord. -type ValidatorFunc func(u.Key, []byte) error - -// ErrBadRecord is returned any time a dht record is found to be -// incorrectly formatted or signed. -var ErrBadRecord = errors.New("bad dht record") - -// ErrInvalidRecordType is returned if a DHTRecord keys prefix -// is not found in the Validator map of the DHT. -var ErrInvalidRecordType = errors.New("invalid record keytype") - // KeyForPublicKey returns the key used to retrieve public keys // from the dht. func KeyForPublicKey(id peer.ID) u.Key { @@ -123,7 +107,7 @@ func (dht *IpfsDHT) verifyRecordLocally(r *pb.Record) error { return fmt.Errorf("do not have public key for %s", p) } - return dht.verifyRecord(r, pk) + return dht.Validator.VerifyRecord(r, pk) } // verifyRecordOnline verifies a record, searching the DHT for the public key @@ -140,52 +124,5 @@ func (dht *IpfsDHT) verifyRecordOnline(ctx context.Context, r *pb.Record) error return err } - return dht.verifyRecord(r, pk) -} - -// TODO: make this an independent exported function. -// it might be useful for users to have access to. -func (dht *IpfsDHT) verifyRecord(r *pb.Record, pk ci.PubKey) error { - // First, validate the signature - blob := record.RecordBlobForSig(r) - ok, err := pk.Verify(blob, r.GetSignature()) - if err != nil { - log.Error("Signature verify failed.") - return err - } - if !ok { - log.Error("dht found a forged record! (ignored)") - return ErrBadRecord - } - - // Now, check validity func - parts := strings.Split(r.GetKey(), "/") - if len(parts) < 3 { - log.Infof("Record key does not have validator: %s", u.Key(r.GetKey())) - return nil - } - - fnc, ok := dht.Validators[parts[1]] - if !ok { - log.Errorf("Unrecognized key prefix: %s", parts[1]) - return ErrInvalidRecordType - } - - return fnc(u.Key(r.GetKey()), r.GetValue()) -} - -// ValidatePublicKeyRecord implements ValidatorFunc and -// verifies that the passed in record value is the PublicKey -// that matches the passed in key. -func ValidatePublicKeyRecord(k u.Key, val []byte) error { - keyparts := bytes.Split([]byte(k), []byte("/")) - if len(keyparts) < 3 { - return errors.New("invalid key") - } - - pkh := u.Hash(val) - if !bytes.Equal(keyparts[2], pkh) { - return errors.New("public key does not match storage key") - } - return nil + return dht.Validator.VerifyRecord(r, pk) } diff --git a/routing/record/record.go b/routing/record/record.go index 602159694c..e41de94aee 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -2,13 +2,17 @@ package record import ( "bytes" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/p2p/crypto" pb "github.com/jbenet/go-ipfs/routing/dht/pb" + eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" ) +var log = eventlog.Logger("routing/record") + // MakePutRecord creates and signs a dht record for the given key/value pair func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte) (*pb.Record, error) { record := new(pb.Record) diff --git a/routing/record/validation.go b/routing/record/validation.go new file mode 100644 index 0000000000..bd09135258 --- /dev/null +++ b/routing/record/validation.go @@ -0,0 +1,75 @@ +package record + +import ( + "bytes" + "errors" + "strings" + + ci "github.com/jbenet/go-ipfs/p2p/crypto" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" + u "github.com/jbenet/go-ipfs/util" +) + +// ValidatorFunc is a function that is called to validate a given +// type of DHTRecord. +type ValidatorFunc func(u.Key, []byte) error + +// ErrBadRecord is returned any time a dht record is found to be +// incorrectly formatted or signed. +var ErrBadRecord = errors.New("bad dht record") + +// ErrInvalidRecordType is returned if a DHTRecord keys prefix +// is not found in the Validator map of the DHT. +var ErrInvalidRecordType = errors.New("invalid record keytype") + +// Validator is an object that helps ensure routing records are valid. +// It is a collection of validator functions, each of which implements +// its own notion of validity. +type Validator map[string]ValidatorFunc + +// VerifyRecord checks a record and ensures it is still valid. +// It runs needed validators +func (v Validator) VerifyRecord(r *pb.Record, pk ci.PubKey) error { + // First, validate the signature + blob := RecordBlobForSig(r) + ok, err := pk.Verify(blob, r.GetSignature()) + if err != nil { + log.Error("Signature verify failed.") + return err + } + if !ok { + log.Error("dht found a forged record! (ignored)") + return ErrBadRecord + } + + // Now, check validity func + parts := strings.Split(r.GetKey(), "/") + if len(parts) < 3 { + log.Infof("Record key does not have validator: %s", u.Key(r.GetKey())) + return nil + } + + fnc, ok := v[parts[1]] + if !ok { + log.Errorf("Unrecognized key prefix: %s", parts[1]) + return ErrInvalidRecordType + } + + return fnc(u.Key(r.GetKey()), r.GetValue()) +} + +// ValidatePublicKeyRecord implements ValidatorFunc and +// verifies that the passed in record value is the PublicKey +// that matches the passed in key. +func ValidatePublicKeyRecord(k u.Key, val []byte) error { + keyparts := bytes.Split([]byte(k), []byte("/")) + if len(keyparts) < 3 { + return errors.New("invalid key") + } + + pkh := u.Hash(val) + if !bytes.Equal(keyparts[2], pkh) { + return errors.New("public key does not match storage key") + } + return nil +} From 603b00182f54ee7b8b3358dd0003c39a03d8de53 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 20 Jan 2015 09:27:47 -0800 Subject: [PATCH 0546/3147] blockstore: fixed data race This commit was moved from ipfs/go-ipfs-blockstore@64d89ae7fee700459b2bc79c3c41fe8609e3c5fb --- blockstore/blockstore_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index de74d6d836..44f5964e8b 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -118,9 +118,11 @@ func TestAllKeysRespectsContext(t *testing.T) { // Once without context, to make sure it all works { var results dsq.Results + var resultsmu = make(chan struct{}) resultChan := make(chan dsq.Result) d.SetFunc(func(q dsq.Query) (dsq.Results, error) { results = dsq.ResultsWithChan(q, resultChan) + resultsmu <- struct{}{} return results, nil }) @@ -128,6 +130,7 @@ func TestAllKeysRespectsContext(t *testing.T) { // make sure it's waiting. <-started + <-resultsmu select { case <-done: t.Fatal("sync is wrong") @@ -156,9 +159,11 @@ func TestAllKeysRespectsContext(t *testing.T) { // Once with { var results dsq.Results + var resultsmu = make(chan struct{}) resultChan := make(chan dsq.Result) d.SetFunc(func(q dsq.Query) (dsq.Results, error) { results = dsq.ResultsWithChan(q, resultChan) + resultsmu <- struct{}{} return results, nil }) @@ -167,6 +172,7 @@ func TestAllKeysRespectsContext(t *testing.T) { // make sure it's waiting. <-started + <-resultsmu select { case <-done: t.Fatal("sync is wrong") From 1caff9faf2d1fca40d60f7aeaa7fc962b27263e6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 19 Jan 2015 00:26:11 +0000 Subject: [PATCH 0547/3147] update pinning to new semantics, and fix a couple bugs This commit was moved from ipfs/go-ipfs-pinner@8d22c94831f7e7e994caca4e8adb173f366bc0e6 --- pinning/pinner/pin.go | 25 +++++++++++++++++++------ pinning/pinner/pin_test.go | 4 ++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 32b85a9d78..0ce7541035 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -25,12 +25,13 @@ const ( Recursive PinMode = iota Direct Indirect + NotPinned ) type Pinner interface { IsPinned(util.Key) bool Pin(*mdag.Node, bool) error - Unpin(util.Key, bool) error + Unpin(util.Key) error Flush() error GetManual() ManualPinner DirectKeys() []util.Key @@ -90,6 +91,10 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { return nil } + if p.directPin.HasKey(k) { + p.directPin.RemoveBlock(k) + } + p.recursePin.AddBlock(k) err := p.pinLinks(node) @@ -97,16 +102,19 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { return err } } else { + if p.recursePin.HasKey(k) { + return errors.New("Key already pinned recursively.") + } p.directPin.AddBlock(k) } return nil } -// Unpin a given key with optional recursive unpinning -func (p *pinner) Unpin(k util.Key, recurse bool) error { +// Unpin a given key +func (p *pinner) Unpin(k util.Key) error { p.lock.Lock() defer p.lock.Unlock() - if recurse { + if p.recursePin.HasKey(k) { p.recursePin.RemoveBlock(k) node, err := p.dserv.Get(k) if err != nil { @@ -114,9 +122,14 @@ func (p *pinner) Unpin(k util.Key, recurse bool) error { } return p.unpinLinks(node) + } else if p.directPin.HasKey(k) { + p.directPin.RemoveBlock(k) + return nil + } else if p.indirPin.HasKey(k) { + return errors.New("Cannot unpin indirectly pinned block.") + } else { + return errors.New("Given key was not pinned.") } - p.directPin.RemoveBlock(k) - return nil } func (p *pinner) unpinLinks(node *mdag.Node) error { diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 623983a341..3a93bdf74e 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -100,8 +100,8 @@ func TestPinnerBasic(t *testing.T) { t.Fatal("pinned node not found.") } - // Test recursive unpin - err = p.Unpin(dk, true) + // Test unpin + err = p.Unpin(dk) if err != nil { t.Fatal(err) } From a35e45dc920bdd85c91c63cadeac4d9bf5d97bf9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 20 Jan 2015 03:47:37 +0000 Subject: [PATCH 0548/3147] fix pinning UX, and add tests to match This commit was moved from ipfs/go-ipfs-pinner@27e8b51e6f38e2e5d1713635cf8a9171210dc31b --- pinning/pinner/pin.go | 20 ++++++++++++-------- pinning/pinner/pin_test.go | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 0ce7541035..ed3598e4d1 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -31,7 +31,7 @@ const ( type Pinner interface { IsPinned(util.Key) bool Pin(*mdag.Node, bool) error - Unpin(util.Key) error + Unpin(util.Key, bool) error Flush() error GetManual() ManualPinner DirectKeys() []util.Key @@ -111,17 +111,21 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { } // Unpin a given key -func (p *pinner) Unpin(k util.Key) error { +func (p *pinner) Unpin(k util.Key, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() if p.recursePin.HasKey(k) { - p.recursePin.RemoveBlock(k) - node, err := p.dserv.Get(k) - if err != nil { - return err + if recursive { + p.recursePin.RemoveBlock(k) + node, err := p.dserv.Get(k) + if err != nil { + return err + } + + return p.unpinLinks(node) + } else { + return errors.New("Key pinned recursively.") } - - return p.unpinLinks(node) } else if p.directPin.HasKey(k) { p.directPin.RemoveBlock(k) return nil diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 3a93bdf74e..623983a341 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -100,8 +100,8 @@ func TestPinnerBasic(t *testing.T) { t.Fatal("pinned node not found.") } - // Test unpin - err = p.Unpin(dk) + // Test recursive unpin + err = p.Unpin(dk, true) if err != nil { t.Fatal(err) } From d1d9d6143b4b1ceb8462264df73b9fe8a54d65bf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 20 Jan 2015 04:52:27 +0000 Subject: [PATCH 0549/3147] address concerns from PR This commit was moved from ipfs/go-ipfs-pinner@be994ddf361b5498c12ff1844b25c75d3f240c4d --- pinning/pinner/pin.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ed3598e4d1..466dfba413 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -5,6 +5,7 @@ package pin import ( "encoding/json" "errors" + "fmt" "sync" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -103,7 +104,7 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { } } else { if p.recursePin.HasKey(k) { - return errors.New("Key already pinned recursively.") + return fmt.Errorf("%s already pinned recursively", k.B58String()) } p.directPin.AddBlock(k) } @@ -124,15 +125,15 @@ func (p *pinner) Unpin(k util.Key, recursive bool) error { return p.unpinLinks(node) } else { - return errors.New("Key pinned recursively.") + return fmt.Errorf("%s is pinned recursively", k) } } else if p.directPin.HasKey(k) { p.directPin.RemoveBlock(k) return nil } else if p.indirPin.HasKey(k) { - return errors.New("Cannot unpin indirectly pinned block.") + return fmt.Errorf("%s is pinned indirectly. indirect pins cannot be removed directly", k) } else { - return errors.New("Given key was not pinned.") + return fmt.Errorf("%s is not pinned", k) } } From b6d54aec717f24e575d0170c1e08166352f579b9 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 19 Jan 2015 21:27:06 -0800 Subject: [PATCH 0550/3147] fix(blockservice) fully async exchange.HasBlock This commit was moved from ipfs/go-blockservice@c68129e9b6be50215ea8224c98d71b7a2bbe345d --- blockservice/blocks_test.go | 6 +- blockservice/blockservice.go | 60 ++++---- blockservice/worker/bench/main.go | 82 +++++++++++ blockservice/worker/bench_worker_test.go | 42 ++++++ blockservice/worker/worker.go | 169 +++++++++++++++++++++++ blockservice/worker/worker_test.go | 14 ++ 6 files changed, 341 insertions(+), 32 deletions(-) create mode 100644 blockservice/worker/bench/main.go create mode 100644 blockservice/worker/bench_worker_test.go create mode 100644 blockservice/worker/worker.go create mode 100644 blockservice/worker/worker_test.go diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index e7966729f5..8f3d89c7b6 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -22,6 +22,7 @@ func TestBlocks(t *testing.T) { t.Error("failed to construct block service", err) return } + defer bs.Close() b := blocks.NewBlock([]byte("beep boop")) h := u.Hash([]byte("beep boop")) @@ -61,6 +62,9 @@ func TestBlocks(t *testing.T) { func TestGetBlocksSequential(t *testing.T) { var servs = Mocks(t, 4) + for _, s := range servs { + defer s.Close() + } bg := blocksutil.NewBlockGenerator() blks := bg.Blocks(50) @@ -73,7 +77,7 @@ func TestGetBlocksSequential(t *testing.T) { t.Log("one instance at a time, get blocks concurrently") for i := 1; i < len(servs); i++ { - ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) + ctx, _ := context.WithTimeout(context.TODO(), time.Second*50) out := servs[i].GetBlocks(ctx, keys) gotten := make(map[u.Key]*blocks.Block) for blk := range out { diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index a2a0014185..2ce230452b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -8,20 +8,33 @@ import ( "fmt" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - procrl "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" blocks "github.com/jbenet/go-ipfs/blocks" "github.com/jbenet/go-ipfs/blocks/blockstore" + worker "github.com/jbenet/go-ipfs/blockservice/worker" exchange "github.com/jbenet/go-ipfs/exchange" u "github.com/jbenet/go-ipfs/util" ) +var wc = worker.Config{ + // When running on a single core, NumWorkers has a harsh negative effect on + // throughput. (-80% when < 25) + // Running a lot more workers appears to have very little effect on both + // single and multicore configurations. + NumWorkers: 25, + + // These have no effect on when running on multiple cores, but harsh + // negative effect on throughput when running on a single core + // On multicore configurations these buffers have little effect on + // throughput. + // On single core configurations, larger buffers have severe adverse + // effects on throughput. + ClientBufferSize: 0, + WorkerBufferSize: 0, +} + var log = u.Logger("blockservice") var ErrNotFound = errors.New("blockservice: key not found") -// MaxExchangeAddWorkers rate limits the number of exchange workers -var MaxExchangeAddWorkers = 100 - // BlockService is a hybrid block datastore. It stores data in a local // datastore and may retrieve data from a remote Exchange. // It uses an internal `datastore.Datastore` instance to store values. @@ -30,8 +43,7 @@ type BlockService struct { Blockstore blockstore.Blockstore Exchange exchange.Interface - rateLimiter *procrl.RateLimiter - exchangeAdd chan blocks.Block + worker *worker.Worker } // NewBlockService creates a BlockService with given datastore instance. @@ -43,15 +55,10 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error log.Warning("blockservice running in local (offline) mode.") } - // exchangeAdd is a channel for async workers to add to the exchange. - // 100 blocks buffer. not clear what this number should be - exchangeAdd := make(chan blocks.Block, 100) - return &BlockService{ - Blockstore: bs, - Exchange: rem, - exchangeAdd: exchangeAdd, - rateLimiter: procrl.NewRateLimiter(process.Background(), MaxExchangeAddWorkers), + Blockstore: bs, + Exchange: rem, + worker: worker.NewWorker(rem, wc), }, nil } @@ -63,22 +70,8 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { if err != nil { return k, err } - - // this operation rate-limits blockservice operations, so it is - // now an async process. - if s.Exchange != nil { - - // LimitedGo will spawn a goroutine but provide proper backpressure. - // it will not spawn the goroutine until the ratelimiter's work load - // is under the threshold. - s.rateLimiter.LimitedGo(func(worker process.Process) { - ctx := context.TODO() - if err := s.Exchange.HasBlock(ctx, b); err != nil { - // suppress error, as the client shouldn't care about bitswap. - // the client only cares about the blockstore.Put. - log.Errorf("Exchange.HasBlock error: %s", err) - } - }) + if err := s.worker.HasBlock(b); err != nil { + return "", errors.New("blockservice is closed") } return k, nil } @@ -148,3 +141,8 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks func (s *BlockService) DeleteBlock(k u.Key) error { return s.Blockstore.DeleteBlock(k) } + +func (s *BlockService) Close() error { + log.Debug("blockservice is shutting down...") + return s.worker.Close() +} diff --git a/blockservice/worker/bench/main.go b/blockservice/worker/bench/main.go new file mode 100644 index 0000000000..5d85de27f7 --- /dev/null +++ b/blockservice/worker/bench/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "log" + "math" + "testing" + "time" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + blocks "github.com/jbenet/go-ipfs/blocks" + blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" + worker "github.com/jbenet/go-ipfs/blockservice/worker" + "github.com/jbenet/go-ipfs/exchange/offline" + "github.com/jbenet/go-ipfs/thirdparty/delay" + "github.com/jbenet/go-ipfs/util/datastore2" +) + +const kEstRoutingDelay = time.Second + +const kBlocksPerOp = 100 + +func main() { + var bestConfig worker.Config + var quickestNsPerOp int64 = math.MaxInt64 + for NumWorkers := 1; NumWorkers < 10; NumWorkers++ { + for ClientBufferSize := 0; ClientBufferSize < 10; ClientBufferSize++ { + for WorkerBufferSize := 0; WorkerBufferSize < 10; WorkerBufferSize++ { + c := worker.Config{ + NumWorkers: NumWorkers, + ClientBufferSize: ClientBufferSize, + WorkerBufferSize: WorkerBufferSize, + } + result := testing.Benchmark(BenchmarkWithConfig(c)) + if result.NsPerOp() < quickestNsPerOp { + bestConfig = c + quickestNsPerOp = result.NsPerOp() + } + log.Printf("benched %+v \t result: %+v", c, result) + } + } + } + log.Println(bestConfig) +} + +func BenchmarkWithConfig(c worker.Config) func(b *testing.B) { + return func(b *testing.B) { + + routingDelay := delay.Fixed(0) // during setup + + dstore := ds_sync.MutexWrap(datastore2.WithDelay(ds.NewMapDatastore(), routingDelay)) + bstore := blockstore.NewBlockstore(dstore) + var testdata []*blocks.Block + var i int64 + for i = 0; i < kBlocksPerOp; i++ { + testdata = append(testdata, blocks.NewBlock([]byte(string(i)))) + } + b.ResetTimer() + b.SetBytes(kBlocksPerOp) + for i := 0; i < b.N; i++ { + + b.StopTimer() + w := worker.NewWorker(offline.Exchange(bstore), c) + b.StartTimer() + + prev := routingDelay.Set(kEstRoutingDelay) // during measured section + + for _, block := range testdata { + if err := w.HasBlock(block); err != nil { + b.Fatal(err) + } + } + + routingDelay.Set(prev) // to hasten the unmeasured close period + + b.StopTimer() + w.Close() + b.StartTimer() + + } + } +} diff --git a/blockservice/worker/bench_worker_test.go b/blockservice/worker/bench_worker_test.go new file mode 100644 index 0000000000..aab910b64a --- /dev/null +++ b/blockservice/worker/bench_worker_test.go @@ -0,0 +1,42 @@ +package worker + +import ( + "testing" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + blocks "github.com/jbenet/go-ipfs/blocks" + blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" + "github.com/jbenet/go-ipfs/exchange/offline" +) + +func BenchmarkHandle10KBlocks(b *testing.B) { + bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + var testdata []*blocks.Block + for i := 0; i < 10000; i++ { + testdata = append(testdata, blocks.NewBlock([]byte(string(i)))) + } + b.ResetTimer() + b.SetBytes(10000) + for i := 0; i < b.N; i++ { + + b.StopTimer() + w := NewWorker(offline.Exchange(bstore), Config{ + NumWorkers: 1, + ClientBufferSize: 0, + WorkerBufferSize: 0, + }) + b.StartTimer() + + for _, block := range testdata { + if err := w.HasBlock(block); err != nil { + b.Fatal(err) + } + } + + b.StopTimer() + w.Close() + b.StartTimer() + + } +} diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go new file mode 100644 index 0000000000..0da7927195 --- /dev/null +++ b/blockservice/worker/worker.go @@ -0,0 +1,169 @@ +// TODO FIXME name me +package worker + +import ( + "container/list" + "errors" + "time" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + blocks "github.com/jbenet/go-ipfs/blocks" + exchange "github.com/jbenet/go-ipfs/exchange" + util "github.com/jbenet/go-ipfs/util" +) + +var log = util.Logger("blockservice") + +var DefaultConfig = Config{ + NumWorkers: 1, + ClientBufferSize: 0, + WorkerBufferSize: 0, +} + +type Config struct { + // NumWorkers sets the number of background workers that provide blocks to + // the exchange. + NumWorkers int + + // ClientBufferSize allows clients of HasBlock to send up to + // |ClientBufferSize| blocks without blocking. + ClientBufferSize int + + // WorkerBufferSize can be used in conjunction with NumWorkers to reduce + // communication-coordination within the worker. + WorkerBufferSize int +} + +// TODO FIXME name me +type Worker struct { + // added accepts blocks from client + added chan *blocks.Block + exchange exchange.Interface + + // workQueue is owned by the client worker + // process manages life-cycle + process process.Process +} + +func NewWorker(e exchange.Interface, c Config) *Worker { + if c.NumWorkers < 1 { + c.NumWorkers = 1 // provide a sane default + } + w := &Worker{ + exchange: e, + added: make(chan *blocks.Block, c.ClientBufferSize), + process: process.WithParent(process.Background()), // internal management + } + w.start(c) + return w +} + +func (w *Worker) HasBlock(b *blocks.Block) error { + select { + case <-w.process.Closed(): + return errors.New("blockservice worker is closed") + case w.added <- b: + return nil + } +} + +func (w *Worker) Close() error { + log.Debug("blockservice provide worker is shutting down...") + return w.process.Close() +} + +func (w *Worker) start(c Config) { + + workerChan := make(chan *blocks.Block, c.WorkerBufferSize) + + // clientWorker handles incoming blocks from |w.added| and sends to + // |workerChan|. This will never block the client. + w.process.Go(func(proc process.Process) { + defer close(workerChan) + + var workQueue BlockList + for { + + // take advantage of the fact that sending on nil channel always + // blocks so that a message is only sent if a block exists + sendToWorker := workerChan + nextBlock := workQueue.Pop() + if nextBlock == nil { + sendToWorker = nil + } + + select { + + // if worker is ready and there's a block to process, send the + // block + case sendToWorker <- nextBlock: + case <-time.Tick(5 * time.Second): + if workQueue.Len() > 0 { + log.Debugf("%d blocks in blockservice provide queue...", workQueue.Len()) + } + case block := <-w.added: + if nextBlock != nil { + workQueue.Push(nextBlock) // missed the chance to send it + } + // if the client sends another block, add it to the queue. + workQueue.Push(block) + case <-proc.Closing(): + return + } + } + }) + + for i := 0; i < c.NumWorkers; i++ { + // reads from |workerChan| until process closes + w.process.Go(func(proc process.Process) { + ctx, cancel := context.WithCancel(context.Background()) + + // shuts down an in-progress HasBlock operation + proc.Go(func(proc process.Process) { + <-proc.Closing() + cancel() + }) + + for { + select { + case <-proc.Closing(): + return + case block, ok := <-workerChan: + if !ok { + return + } + if err := w.exchange.HasBlock(ctx, block); err != nil { + // TODO log event? + } + } + } + }) + } +} + +type BlockList struct { + list list.List +} + +func (s *BlockList) PushFront(b *blocks.Block) { + // FIXME find figures + s.list.PushFront(b) +} + +func (s *BlockList) Push(b *blocks.Block) { + s.list.PushBack(b) +} + +func (s *BlockList) Pop() *blocks.Block { + if s.list.Len() == 0 { + return nil + } + e := s.list.Front() + s.list.Remove(e) + return e.Value.(*blocks.Block) +} + +func (s *BlockList) Len() int { + return s.list.Len() +} diff --git a/blockservice/worker/worker_test.go b/blockservice/worker/worker_test.go new file mode 100644 index 0000000000..9c1158df77 --- /dev/null +++ b/blockservice/worker/worker_test.go @@ -0,0 +1,14 @@ +package worker + +import "testing" + +func TestStartClose(t *testing.T) { + numRuns := 50 + if testing.Short() { + numRuns = 5 + } + for i := 0; i < numRuns; i++ { + w := NewWorker(nil, DefaultConfig) + w.Close() + } +} From 106a2eb0be3a8f73dd8f5baa18a1cea93f65ee01 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 20 Jan 2015 16:51:45 -0800 Subject: [PATCH 0551/3147] one worker This commit was moved from ipfs/go-blockservice@d630e9834e02fd92b957b647b24ef19de539c08f --- blockservice/worker/worker.go | 44 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index 0da7927195..a3d55a1552 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -114,32 +114,30 @@ func (w *Worker) start(c Config) { } }) - for i := 0; i < c.NumWorkers; i++ { - // reads from |workerChan| until process closes - w.process.Go(func(proc process.Process) { - ctx, cancel := context.WithCancel(context.Background()) - - // shuts down an in-progress HasBlock operation - proc.Go(func(proc process.Process) { - <-proc.Closing() - cancel() - }) - - for { - select { - case <-proc.Closing(): + // reads from |workerChan| until process closes + w.process.Go(func(proc process.Process) { + ctx, cancel := context.WithCancel(context.Background()) + + // shuts down an in-progress HasBlock operation + proc.Go(func(proc process.Process) { + <-proc.Closing() + cancel() + }) + + for { + select { + case <-proc.Closing(): + return + case block, ok := <-workerChan: + if !ok { return - case block, ok := <-workerChan: - if !ok { - return - } - if err := w.exchange.HasBlock(ctx, block); err != nil { - // TODO log event? - } + } + if err := w.exchange.HasBlock(ctx, block); err != nil { + // TODO log event? } } - }) - } + } + }) } type BlockList struct { From 923626a19c45bfb21e721afe0758b2754e3011b6 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 20 Jan 2015 16:54:58 -0800 Subject: [PATCH 0552/3147] use rate-limiter @jbenet This commit was moved from ipfs/go-blockservice@4332ac4c14d385f70ee61686e0f4449a7f8004d8 --- blockservice/worker/worker.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index a3d55a1552..a52c3d7088 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -8,6 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + ratelimit "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" blocks "github.com/jbenet/go-ipfs/blocks" exchange "github.com/jbenet/go-ipfs/exchange" util "github.com/jbenet/go-ipfs/util" @@ -124,6 +125,7 @@ func (w *Worker) start(c Config) { cancel() }) + limiter := ratelimit.NewRateLimiter(proc, c.NumWorkers) for { select { case <-proc.Closing(): @@ -132,9 +134,11 @@ func (w *Worker) start(c Config) { if !ok { return } - if err := w.exchange.HasBlock(ctx, block); err != nil { - // TODO log event? - } + limiter.LimitedGo(func(proc process.Process) { + if err := w.exchange.HasBlock(ctx, block); err != nil { + // TODO log event? + } + }) } } }) From 2054465c7089768171f05ccf3e8c987a62cf7745 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 20 Jan 2015 23:22:43 -0800 Subject: [PATCH 0553/3147] extract context func @jbenet would like it to work this way This commit was moved from ipfs/go-blockservice@686220bf7cf4212d0c4188c0eef55916d8ff0154 --- blockservice/worker/worker.go | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index a52c3d7088..dc570f3ee0 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -117,14 +117,7 @@ func (w *Worker) start(c Config) { // reads from |workerChan| until process closes w.process.Go(func(proc process.Process) { - ctx, cancel := context.WithCancel(context.Background()) - - // shuts down an in-progress HasBlock operation - proc.Go(func(proc process.Process) { - <-proc.Closing() - cancel() - }) - + ctx := childContext(proc) // shut down in-progress HasBlock when time to die limiter := ratelimit.NewRateLimiter(proc, c.NumWorkers) for { select { @@ -169,3 +162,18 @@ func (s *BlockList) Pop() *blocks.Block { func (s *BlockList) Len() int { return s.list.Len() } + +// TODO extract +type waitable interface { + Closing() <-chan struct{} +} + +// TODO extract +func childContext(w waitable) context.Context { + ctx, cancel := context.WithCancel(context.Background()) + go func() { + <-w.Closing() + cancel() + }() + return ctx +} From d0ca4221411ad33347dfaaf5e47bde4705472d82 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 20 Jan 2015 23:31:48 -0800 Subject: [PATCH 0554/3147] fix(blockservice/worker) replace time.Tick with a timer we can stop This commit was moved from ipfs/go-blockservice@90d665fb74f7b5977b9303f995b1707b6c996675 --- blockservice/worker/worker.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index dc570f3ee0..077f366e76 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -84,6 +84,8 @@ func (w *Worker) start(c Config) { defer close(workerChan) var workQueue BlockList + debugInfo := time.NewTicker(5 * time.Second) + defer debugInfo.Stop() for { // take advantage of the fact that sending on nil channel always @@ -99,7 +101,7 @@ func (w *Worker) start(c Config) { // if worker is ready and there's a block to process, send the // block case sendToWorker <- nextBlock: - case <-time.Tick(5 * time.Second): + case <-debugInfo.C: if workQueue.Len() > 0 { log.Debugf("%d blocks in blockservice provide queue...", workQueue.Len()) } From acd0fe3095001d49ea52581e5e032b0590787d6f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 20 Jan 2015 00:04:52 -0800 Subject: [PATCH 0555/3147] demote dht logs This commit was moved from ipfs/go-ipfs-routing@2be84c9b0a79e25a271c84621c29eb82d2feffce --- routing/dht/dht_net.go | 2 -- routing/dht/routing.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 2b857ce2b3..c8b6b66ebc 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -38,8 +38,6 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // update the peer (on valid msgs only) dht.updateFromMessage(ctx, mPeer, pmes) - log.Event(ctx, "foo", dht.self, mPeer, pmes) - // get handler for this msg type. handler := dht.handlerForMsgType(pmes.GetType()) if handler == nil { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 35d8046509..07d9ddc431 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -215,7 +215,7 @@ func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer // run it! _, err := query.Run(ctx, tablepeers) if err != nil { - log.Errorf("closestPeers query run error: %s", err) + log.Debugf("closestPeers query run error: %s", err) } }() From 6d1b8180c67c93488b8f2c9bebfdabec921dbc3e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 20 Jan 2015 23:44:07 -0800 Subject: [PATCH 0556/3147] log err This commit was moved from ipfs/go-blockservice@81b761d56ced09e576573277aadc509b2f2dae1c --- blockservice/worker/worker.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index 077f366e76..429f679820 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -131,7 +131,7 @@ func (w *Worker) start(c Config) { } limiter.LimitedGo(func(proc process.Process) { if err := w.exchange.HasBlock(ctx, block); err != nil { - // TODO log event? + log.Infof("blockservice worker error: %s", err) } }) } @@ -144,7 +144,6 @@ type BlockList struct { } func (s *BlockList) PushFront(b *blocks.Block) { - // FIXME find figures s.list.PushFront(b) } From 163f13b84544b16b22121fee0ac2441a89e7f06b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 21 Jan 2015 14:58:33 -0800 Subject: [PATCH 0557/3147] deduplicate blocks in queue This commit was moved from ipfs/go-blockservice@7da1938df4910e312ec724f8432b60c57f602e7c --- blockservice/worker/worker.go | 25 ++++++++++++--- blockservice/worker/worker_test.go | 51 +++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index 429f679820..be46c45c8a 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -140,15 +140,30 @@ func (w *Worker) start(c Config) { } type BlockList struct { - list list.List + list list.List + uniques map[util.Key]*list.Element } func (s *BlockList) PushFront(b *blocks.Block) { - s.list.PushFront(b) + if s.uniques == nil { + s.uniques = make(map[util.Key]*list.Element) + } + _, ok := s.uniques[b.Key()] + if !ok { + e := s.list.PushFront(b) + s.uniques[b.Key()] = e + } } func (s *BlockList) Push(b *blocks.Block) { - s.list.PushBack(b) + if s.uniques == nil { + s.uniques = make(map[util.Key]*list.Element) + } + _, ok := s.uniques[b.Key()] + if !ok { + e := s.list.PushBack(b) + s.uniques[b.Key()] = e + } } func (s *BlockList) Pop() *blocks.Block { @@ -157,7 +172,9 @@ func (s *BlockList) Pop() *blocks.Block { } e := s.list.Front() s.list.Remove(e) - return e.Value.(*blocks.Block) + b := e.Value.(*blocks.Block) + delete(s.uniques, b.Key()) + return b } func (s *BlockList) Len() int { diff --git a/blockservice/worker/worker_test.go b/blockservice/worker/worker_test.go index 9c1158df77..4cbc9b2ccf 100644 --- a/blockservice/worker/worker_test.go +++ b/blockservice/worker/worker_test.go @@ -1,6 +1,9 @@ package worker -import "testing" +import ( + blocks "github.com/jbenet/go-ipfs/blocks" + "testing" +) func TestStartClose(t *testing.T) { numRuns := 50 @@ -12,3 +15,49 @@ func TestStartClose(t *testing.T) { w.Close() } } + +func TestQueueDeduplication(t *testing.T) { + numUniqBlocks := 5 // arbitrary + + var firstBatch []*blocks.Block + for i := 0; i < numUniqBlocks; i++ { + firstBatch = append(firstBatch, blockFromInt(i)) + } + + // to get different pointer values and prevent the implementation from + // cheating. The impl must check equality using Key. + var secondBatch []*blocks.Block + for i := 0; i < numUniqBlocks; i++ { + secondBatch = append(secondBatch, blockFromInt(i)) + } + var workQueue BlockList + + for _, b := range append(firstBatch, secondBatch...) { + workQueue.Push(b) + } + for i := 0; i < numUniqBlocks; i++ { + b := workQueue.Pop() + if b.Key() != firstBatch[i].Key() { + t.Fatal("list is not FIFO") + } + } + if b := workQueue.Pop(); b != nil { + t.Fatal("the workQueue did not de-duplicate the blocks") + } +} + +func TestPushPopPushPop(t *testing.T) { + var workQueue BlockList + orig := blockFromInt(1) + dup := blockFromInt(1) + workQueue.PushFront(orig) + workQueue.Pop() + workQueue.Push(dup) + if workQueue.Len() != 1 { + t.Fatal("the block list's internal state is corrupt") + } +} + +func blockFromInt(i int) *blocks.Block { + return blocks.NewBlock([]byte(string(i))) +} From 8f154feb7dde0de3b0acdec0fbadb6796c37920e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 16 Jan 2015 12:52:12 -0800 Subject: [PATCH 0558/3147] routing/dht: periodic bootstrapping #572 This commit was moved from ipfs/go-ipfs-routing@656354eeba62fb2d03925c598de6dd6d14b734d4 --- routing/dht/dht.go | 63 ------------ routing/dht/dht_bootstrap.go | 181 ++++++++++++++++++++++++++++++++++ routing/dht/dht_test.go | 184 +++++++++++++++++++++++++++-------- 3 files changed, 327 insertions(+), 101 deletions(-) create mode 100644 routing/dht/dht_bootstrap.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 923c8c69b7..0fd5177a2c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -370,66 +370,3 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { } } } - -// Bootstrap builds up list of peers by requesting random peer IDs -func (dht *IpfsDHT) Bootstrap(ctx context.Context, queries int) error { - var merr u.MultiErr - - randomID := func() peer.ID { - // 16 random bytes is not a valid peer id. it may be fine becuase - // the dht will rehash to its own keyspace anyway. - id := make([]byte, 16) - rand.Read(id) - return peer.ID(id) - } - - // bootstrap sequentially, as results will compound - runQuery := func(ctx context.Context, id peer.ID) { - p, err := dht.FindPeer(ctx, id) - if err == routing.ErrNotFound { - // this isn't an error. this is precisely what we expect. - } else if err != nil { - merr = append(merr, err) - } else { - // woah, actually found a peer with that ID? this shouldn't happen normally - // (as the ID we use is not a real ID). this is an odd error worth logging. - err := fmt.Errorf("Bootstrap peer error: Actually FOUND peer. (%s, %s)", id, p) - log.Errorf("%s", err) - merr = append(merr, err) - } - } - - sequential := true - if sequential { - // these should be parallel normally. but can make them sequential for debugging. - // note that the core/bootstrap context deadline should be extended too for that. - for i := 0; i < queries; i++ { - id := randomID() - log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) - runQuery(ctx, id) - } - - } else { - // note on parallelism here: the context is passed in to the queries, so they - // **should** exit when it exceeds, making this function exit on ctx cancel. - // normally, we should be selecting on ctx.Done() here too, but this gets - // complicated to do with WaitGroup, and doesnt wait for the children to exit. - var wg sync.WaitGroup - for i := 0; i < queries; i++ { - wg.Add(1) - go func() { - defer wg.Done() - - id := randomID() - log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) - runQuery(ctx, id) - }() - } - wg.Wait() - } - - if len(merr) > 0 { - return merr - } - return nil -} diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go new file mode 100644 index 0000000000..271fa74749 --- /dev/null +++ b/routing/dht/dht_bootstrap.go @@ -0,0 +1,181 @@ +// Package dht implements a distributed hash table that satisfies the ipfs routing +// interface. This DHT is modeled after kademlia with Coral and S/Kademlia modifications. +package dht + +import ( + "crypto/rand" + "fmt" + "sync" + "time" + + peer "github.com/jbenet/go-ipfs/p2p/peer" + routing "github.com/jbenet/go-ipfs/routing" + u "github.com/jbenet/go-ipfs/util" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + goprocess "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" +) + +// DefaultBootstrapQueries specifies how many queries to run, +// if the user does not specify a different number as an option. +// +// For now, this is set to 16 queries, which is an aggressive number. +// We are currently more interested in ensuring we have a properly formed +// DHT than making sure our dht minimizes traffic. Once we are more certain +// of our implementation's robustness, we should lower this down to 8 or 4. +// +// Note there is also a tradeoff between the bootstrap period and the number +// of queries. We could support a higher period with a smaller number of +// queries +const DefaultBootstrapQueries = 16 + +// DefaultBootstrapPeriod specifies how often to periodically run bootstrap, +// if the user does not specify a different number as an option. +// +// For now, this is set to 10 seconds, which is an aggressive period. We are +// We are currently more interested in ensuring we have a properly formed +// DHT than making sure our dht minimizes traffic. Once we are more certain +// implementation's robustness, we should lower this down to 30s or 1m. +// +// Note there is also a tradeoff between the bootstrap period and the number +// of queries. We could support a higher period with a smaller number of +// queries +const DefaultBootstrapPeriod = time.Duration(10 * time.Second) + +// Bootstrap runs bootstrapping once, then calls SignalBootstrap with default +// parameters: DefaultBootstrapQueries and DefaultBootstrapPeriod. This allows +// the user to catch an error off the bat if the connections are faulty. It also +// allows BootstrapOnSignal not to run bootstrap at the beginning, which is useful +// for instrumenting it on tests, or delaying bootstrap until the network is online +// and connected to at least a few nodes. +// +// Like PeriodicBootstrap, Bootstrap returns a process, so the user can stop it. +func (dht *IpfsDHT) Bootstrap() (goprocess.Process, error) { + + if err := dht.runBootstrap(dht.Context(), DefaultBootstrapQueries); err != nil { + return nil, err + } + + sig := time.Tick(DefaultBootstrapPeriod) + return dht.BootstrapOnSignal(DefaultBootstrapQueries, sig) +} + +// SignalBootstrap ensures the dht routing table remains healthy as peers come and go. +// it builds up a list of peers by requesting random peer IDs. The Bootstrap +// process will run a number of queries each time, and run every time signal fires. +// These parameters are configurable. +// +// SignalBootstrap returns a process, so the user can stop it. +func (dht *IpfsDHT) BootstrapOnSignal(queries int, signal <-chan time.Time) (goprocess.Process, error) { + if queries <= 0 { + return nil, fmt.Errorf("invalid number of queries: %d", queries) + } + + if signal == nil { + return nil, fmt.Errorf("invalid signal: %v", signal) + } + + proc := goprocess.Go(func(worker goprocess.Process) { + for { + select { + case <-worker.Closing(): + log.Debug("dht bootstrapper shutting down") + return + + case <-signal: + // it would be useful to be able to send out signals of when we bootstrap, too... + // maybe this is a good case for whole module event pub/sub? + + ctx := dht.Context() + if err := dht.runBootstrap(ctx, queries); err != nil { + log.Error(err) + // A bootstrapping error is important to notice but not fatal. + // maybe the client should be able to consume these errors, + // though I dont have a clear use case in mind-- what **could** + // the client do if one of the bootstrap calls fails? + // + // This is also related to the core's bootstrap failures. + // superviseConnections should perhaps allow clients to detect + // bootstrapping problems. + // + // Anyway, passing errors could be done with a bootstrapper object. + // this would imply the client should be able to consume a lot of + // other non-fatal dht errors too. providing this functionality + // should be done correctly DHT-wide. + // NB: whatever the design, clients must ensure they drain errors! + // This pattern is common to many things, perhaps long-running services + // should have something like an ErrStream that allows clients to consume + // periodic errors and take action. It should allow the user to also + // ignore all errors with something like an ErrStreamDiscard. We should + // study what other systems do for ideas. + } + } + } + }) + + return proc, nil +} + +// runBootstrap builds up list of peers by requesting random peer IDs +func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { + + var merr u.MultiErr + + randomID := func() peer.ID { + // 16 random bytes is not a valid peer id. it may be fine becuase + // the dht will rehash to its own keyspace anyway. + id := make([]byte, 16) + rand.Read(id) + return peer.ID(id) + } + + // bootstrap sequentially, as results will compound + runQuery := func(ctx context.Context, id peer.ID) { + p, err := dht.FindPeer(ctx, id) + if err == routing.ErrNotFound { + // this isn't an error. this is precisely what we expect. + } else if err != nil { + merr = append(merr, err) + } else { + // woah, actually found a peer with that ID? this shouldn't happen normally + // (as the ID we use is not a real ID). this is an odd error worth logging. + err := fmt.Errorf("Bootstrap peer error: Actually FOUND peer. (%s, %s)", id, p) + log.Errorf("%s", err) + merr = append(merr, err) + } + } + + sequential := true + if sequential { + // these should be parallel normally. but can make them sequential for debugging. + // note that the core/bootstrap context deadline should be extended too for that. + for i := 0; i < queries; i++ { + id := randomID() + log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) + runQuery(ctx, id) + } + + } else { + // note on parallelism here: the context is passed in to the queries, so they + // **should** exit when it exceeds, making this function exit on ctx cancel. + // normally, we should be selecting on ctx.Done() here too, but this gets + // complicated to do with WaitGroup, and doesnt wait for the children to exit. + var wg sync.WaitGroup + for i := 0; i < queries; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + id := randomID() + log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) + runQuery(ctx, id) + }() + } + wg.Wait() + } + + if len(merr) > 0 { + return merr + } + return nil +} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 07211f5fea..afc5756e82 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -75,25 +75,20 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { ctx, cancel := context.WithCancel(ctx) + log.Error("hmm") + defer log.Error("hmm end") + log.Debugf("bootstrapping dhts...") - rounds := 1 + // tried async. sequential fares much better. compare: + // 100 async https://gist.github.com/jbenet/56d12f0578d5f34810b2 + // 100 sync https://gist.github.com/jbenet/6c59e7c15426e48aaedd + // probably because results compound - for i := 0; i < rounds; i++ { - log.Debugf("bootstrapping round %d/%d\n", i, rounds) - - // tried async. sequential fares much better. compare: - // 100 async https://gist.github.com/jbenet/56d12f0578d5f34810b2 - // 100 sync https://gist.github.com/jbenet/6c59e7c15426e48aaedd - // probably because results compound - - start := rand.Intn(len(dhts)) // randomize to decrease bias. - for i := range dhts { - dht := dhts[(start+i)%len(dhts)] - log.Debugf("bootstrapping round %d/%d -- %s\n", i, rounds, dht.self) - dht.Bootstrap(ctx, 3) - } + start := rand.Intn(len(dhts)) // randomize to decrease bias. + for i := range dhts { + dht := dhts[(start+i)%len(dhts)] + dht.runBootstrap(ctx, 3) } - cancel() } @@ -235,6 +230,53 @@ func TestProvides(t *testing.T) { } } +// if minPeers or avgPeers is 0, dont test for it. +func waitForWellFormedTables(t *testing.T, dhts []*IpfsDHT, minPeers, avgPeers int, timeout time.Duration) bool { + // test "well-formed-ness" (>= minPeers peers in every routing table) + + checkTables := func() bool { + totalPeers := 0 + for _, dht := range dhts { + rtlen := dht.routingTable.Size() + totalPeers += rtlen + if minPeers > 0 && rtlen < minPeers { + t.Logf("routing table for %s only has %d peers (should have >%d)", dht.self, rtlen, minPeers) + return false + } + } + actualAvgPeers := totalPeers / len(dhts) + t.Logf("avg rt size: %d", actualAvgPeers) + if avgPeers > 0 && actualAvgPeers < avgPeers { + t.Logf("avg rt size: %d < %d", actualAvgPeers, avgPeers) + return false + } + return true + } + + timeoutA := time.After(timeout) + for { + select { + case <-timeoutA: + log.Error("did not reach well-formed routing tables by %s", timeout) + return false // failed + case <-time.After(5 * time.Millisecond): + if checkTables() { + return true // succeeded + } + } + } +} + +func printRoutingTables(dhts []*IpfsDHT) { + // the routing tables should be full now. let's inspect them. + fmt.Println("checking routing table of %d", len(dhts)) + for _, dht := range dhts { + fmt.Printf("checking routing table of %s\n", dht.self) + dht.routingTable.Print() + fmt.Println("") + } +} + func TestBootstrap(t *testing.T) { // t.Skip("skipping test to debug another") if testing.Short() { @@ -258,38 +300,105 @@ func TestBootstrap(t *testing.T) { } <-time.After(100 * time.Millisecond) - t.Logf("bootstrapping them so they find each other", nDHTs) - ctxT, _ := context.WithTimeout(ctx, 5*time.Second) - bootstrap(t, ctxT, dhts) + // bootstrap a few times until we get good tables. + stop := make(chan struct{}) + go func() { + for { + t.Logf("bootstrapping them so they find each other", nDHTs) + ctxT, _ := context.WithTimeout(ctx, 5*time.Second) + bootstrap(t, ctxT, dhts) + + select { + case <-time.After(50 * time.Millisecond): + continue // being explicit + case <-stop: + return + } + } + }() + + waitForWellFormedTables(t, dhts, 7, 10, 5*time.Second) + close(stop) if u.Debug { // the routing tables should be full now. let's inspect them. - <-time.After(5 * time.Second) - t.Logf("checking routing table of %d", nDHTs) - for _, dht := range dhts { - fmt.Printf("checking routing table of %s\n", dht.self) - dht.routingTable.Print() - fmt.Println("") + printRoutingTables(dhts) + } +} + +func TestPeriodicBootstrap(t *testing.T) { + // t.Skip("skipping test to debug another") + if testing.Short() { + t.SkipNow() + } + + ctx := context.Background() + + nDHTs := 30 + _, _, dhts := setupDHTS(ctx, nDHTs, t) + defer func() { + for i := 0; i < nDHTs; i++ { + dhts[i].Close() + defer dhts[i].host.Close() + } + }() + + // signal amplifier + amplify := func(signal chan time.Time, other []chan time.Time) { + for t := range signal { + for _, s := range other { + s <- t + } + } + for _, s := range other { + close(s) } } - // test "well-formed-ness" (>= 3 peers in every routing table) - avgsize := 0 + signal := make(chan time.Time) + allSignals := []chan time.Time{} + + // kick off periodic bootstrappers with instrumented signals. + for _, dht := range dhts { + s := make(chan time.Time) + allSignals = append(allSignals, s) + dht.BootstrapOnSignal(5, s) + } + go amplify(signal, allSignals) + + t.Logf("dhts are not connected.", nDHTs) + for _, dht := range dhts { + rtlen := dht.routingTable.Size() + if rtlen > 0 { + t.Errorf("routing table for %s should have 0 peers. has %d", dht.self, rtlen) + } + } + + for i := 0; i < nDHTs; i++ { + connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) + } + + t.Logf("dhts are now connected to 1-2 others.", nDHTs) for _, dht := range dhts { rtlen := dht.routingTable.Size() - avgsize += rtlen - t.Logf("routing table for %s has %d peers", dht.self, rtlen) - if rtlen < 4 { - // currently, we dont have good bootstrapping guarantees. - // t.Errorf("routing table for %s only has %d peers", dht.self, rtlen) + if rtlen > 2 { + t.Errorf("routing table for %s should have at most 2 peers. has %d", dht.self, rtlen) } } - avgsize = avgsize / len(dhts) - avgsizeExpected := 6 - t.Logf("avg rt size: %d", avgsize) - if avgsize < avgsizeExpected { - t.Errorf("avg rt size: %d < %d", avgsize, avgsizeExpected) + if u.Debug { + printRoutingTables(dhts) + } + + t.Logf("bootstrapping them so they find each other", nDHTs) + signal <- time.Now() + + // this is async, and we dont know when it's finished with one cycle, so keep checking + // until the routing tables look better, or some long timeout for the failure case. + waitForWellFormedTables(t, dhts, 7, 10, 5*time.Second) + + if u.Debug { + printRoutingTables(dhts) } } @@ -319,7 +428,6 @@ func TestProvidesMany(t *testing.T) { if u.Debug { // the routing tables should be full now. let's inspect them. - <-time.After(5 * time.Second) t.Logf("checking routing table of %d", nDHTs) for _, dht := range dhts { fmt.Printf("checking routing table of %s\n", dht.self) From b8f594646e5abb25949a14e7dde9d99c8a53eb62 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 17 Jan 2015 20:02:58 -0800 Subject: [PATCH 0559/3147] try less aggressive bootstrap This commit was moved from ipfs/go-ipfs-routing@3088cdac9095cb908a4c1dd4847120083bff88ad --- routing/dht/dht_bootstrap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 271fa74749..6efd53d3ae 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -27,7 +27,7 @@ import ( // Note there is also a tradeoff between the bootstrap period and the number // of queries. We could support a higher period with a smaller number of // queries -const DefaultBootstrapQueries = 16 +const DefaultBootstrapQueries = 1 // DefaultBootstrapPeriod specifies how often to periodically run bootstrap, // if the user does not specify a different number as an option. From bf898d76e9161e7b298837b0c4ff5372c7c5221b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 18 Jan 2015 00:58:34 -0800 Subject: [PATCH 0560/3147] dht/bootstrap: logging This commit was moved from ipfs/go-ipfs-routing@f005c35b39851e3a51df351accbf672f3d7a33b2 --- routing/dht/dht_bootstrap.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 6efd53d3ae..7ee82fbefc 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -42,6 +42,10 @@ const DefaultBootstrapQueries = 1 // queries const DefaultBootstrapPeriod = time.Duration(10 * time.Second) +// DefaultBootstrapTimeout specifies how long to wait for a bootstrap query +// to run. +const DefaultBootstrapTimeout = time.Duration(10 * time.Second) + // Bootstrap runs bootstrapping once, then calls SignalBootstrap with default // parameters: DefaultBootstrapQueries and DefaultBootstrapPeriod. This allows // the user to catch an error off the bat if the connections are faulty. It also @@ -76,10 +80,10 @@ func (dht *IpfsDHT) BootstrapOnSignal(queries int, signal <-chan time.Time) (gop } proc := goprocess.Go(func(worker goprocess.Process) { + defer log.Debug("dht bootstrapper shutting down") for { select { case <-worker.Closing(): - log.Debug("dht bootstrapper shutting down") return case <-signal: @@ -118,6 +122,12 @@ func (dht *IpfsDHT) BootstrapOnSignal(queries int, signal <-chan time.Time) (gop // runBootstrap builds up list of peers by requesting random peer IDs func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { + bslog := func(msg string) { + log.Debugf("DHT %s dhtRunBootstrap %s -- routing table size: %d", dht.self, msg, dht.routingTable.Size()) + } + bslog("start") + defer bslog("end") + defer log.EventBegin(ctx, "dhtRunBootstrap").Done() var merr u.MultiErr From 46c8ca3c51a1391d816dfa4b069dcf2ced0966c8 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 18 Jan 2015 00:58:56 -0800 Subject: [PATCH 0561/3147] dht/bootstrap: timeout queries This commit was moved from ipfs/go-ipfs-routing@ac8c43512a2f1a481ce3f8531214ed2f50afb31f --- routing/dht/dht_bootstrap.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 7ee82fbefc..095c194d67 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -140,6 +140,8 @@ func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { } // bootstrap sequentially, as results will compound + ctx, cancel := context.WithTimeout(ctx, DefaultBootstrapTimeout) + defer cancel() runQuery := func(ctx context.Context, id peer.ID) { p, err := dht.FindPeer(ctx, id) if err == routing.ErrNotFound { From cf504c64f20a9e8a6e370067327b3d69d1b3bca3 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 18 Jan 2015 00:59:22 -0800 Subject: [PATCH 0562/3147] dht/query: err return NotFound case When some queries finished, but we got no result, it should be a simple NotFoundError. Only when every single query ended in error do we externalize those to the client, in case something major is going wrong This commit was moved from ipfs/go-ipfs-routing@f69b922e4b7a2ab6113dbee14be404521179fd44 --- routing/dht/ext_test.go | 10 ++++++++++ routing/dht/query.go | 10 +++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index e151af5d24..ab756b5e4d 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -49,6 +49,10 @@ func TestGetFailures(t *testing.T) { // u.POut("Timout Test\n") ctx1, _ := context.WithTimeout(context.Background(), 200*time.Millisecond) if _, err := d.GetValue(ctx1, u.Key("test")); err != nil { + if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { + err = merr[0] + } + if err != context.DeadlineExceeded { t.Fatal("Got different error than we expected", err) } @@ -86,6 +90,9 @@ func TestGetFailures(t *testing.T) { ctx2, _ := context.WithTimeout(context.Background(), 20*time.Second) _, err = d.GetValue(ctx2, u.Key("test")) if err != nil { + if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { + err = merr[0] + } if err != routing.ErrNotFound { t.Fatalf("Expected ErrNotFound, got: %s", err) } @@ -202,6 +209,9 @@ func TestNotFound(t *testing.T) { v, err := d.GetValue(ctx, u.Key("hello")) log.Debugf("get value got %v", v) if err != nil { + if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { + err = merr[0] + } switch err { case routing.ErrNotFound: //Success! diff --git a/routing/dht/query.go b/routing/dht/query.go index 53c232323c..687d2621fd 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -62,7 +62,7 @@ type dhtQueryRunner struct { peersRemaining todoctr.Counter // peersToQuery + currently processing result *dhtQueryResult // query result - errs []error // result errors. maybe should be a map[peer.ID]error + errs u.MultiErr // result errors. maybe should be a map[peer.ID]error rateLimit chan struct{} // processing semaphore log eventlog.EventLogger @@ -122,8 +122,12 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { r.RLock() defer r.RUnlock() - if len(r.errs) > 0 { - err = r.errs[0] // take the first? + err = routing.ErrNotFound + + // if every query to every peer failed, something must be very wrong. + if len(r.errs) > 0 && len(r.errs) == r.peersSeen.Size() { + log.Debugf("query errs: %s", r.errs) + err = r.errs[0] } case <-r.cg.Closed(): From 3c9da35a43a59fbd600c1769f80f9110e7df2929 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 18 Jan 2015 01:00:25 -0800 Subject: [PATCH 0563/3147] dht: kick off all the queries wit every node in our rt s/kademlia calls for makign sure to query all peers we have in our routing table, not just those closest. this helps ensure most queries resolve properly. This commit was moved from ipfs/go-ipfs-routing@05322a80aecf0db6085695e2ce86d7100a928b23 --- routing/dht/routing.go | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 07d9ddc431..2054e03fd0 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -88,9 +88,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // get closest peers in the routing table rtp := dht.routingTable.ListPeers() log.Debugf("peers in rt: %s", len(rtp), rtp) - - closest := dht.routingTable.NearestPeers(kb.ConvertKey(key), PoolSize) - if closest == nil || len(closest) == 0 { + if len(rtp) == 0 { log.Warning("No peers from routing table!") return nil, errors.Wrap(kb.ErrLookupFailure) } @@ -111,7 +109,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { }) // run it! - result, err := query.Run(ctx, closest) + result, err := query.Run(ctx, rtp) if err != nil { return nil, err } @@ -170,7 +168,7 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn // to the given key func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer.ID, error) { e := log.EventBegin(ctx, "getClosestPeers", &key) - tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) + tablepeers := dht.routingTable.ListPeers() if len(tablepeers) == 0 { return nil, errors.Wrap(kb.ErrLookupFailure) } @@ -313,7 +311,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co return &dhtQueryResult{closerPeers: clpeers}, nil }) - peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) + peers := dht.routingTable.ListPeers() _, err := query.Run(ctx, peers) if err != nil { log.Errorf("Query error: %s", err) @@ -329,13 +327,13 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er return pi, nil } - closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) - if closest == nil || len(closest) == 0 { + peers := dht.routingTable.ListPeers() + if len(peers) == 0 { return peer.PeerInfo{}, errors.Wrap(kb.ErrLookupFailure) } // Sanity... - for _, p := range closest { + for _, p := range peers { if p == id { log.Error("Found target peer in list of closest peers...") return dht.peerstore.PeerInfo(p), nil @@ -367,7 +365,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er }) // run it! - result, err := query.Run(ctx, closest) + result, err := query.Run(ctx, peers) if err != nil { return peer.PeerInfo{}, err } @@ -386,8 +384,8 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< peerchan := make(chan peer.PeerInfo, asyncQueryBuffer) peersSeen := peer.Set{} - closest := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) - if closest == nil || len(closest) == 0 { + peers := dht.routingTable.ListPeers() + if len(peers) == 0 { return nil, errors.Wrap(kb.ErrLookupFailure) } @@ -432,7 +430,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< // run it! run it asynchronously to gen peers as results are found. // this does no error checking go func() { - if _, err := query.Run(ctx, closest); err != nil { + if _, err := query.Run(ctx, peers); err != nil { log.Error(err) } From b01579e09aec2fba742cc4d8459b130ffa7f2ad8 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 20 Jan 2015 07:38:20 -0800 Subject: [PATCH 0564/3147] core/bootstrap: cleaned up bootstrapping Moved it to its own package to isolate scope. This commit was moved from ipfs/go-ipfs-routing@f634db0929f93ba1a4241951663290805903a728 --- routing/dht/dht_bootstrap.go | 66 ++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 095c194d67..c3991972ce 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -14,6 +14,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" goprocess "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + periodicproc "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" ) // DefaultBootstrapQueries specifies how many queries to run, @@ -54,9 +55,9 @@ const DefaultBootstrapTimeout = time.Duration(10 * time.Second) // and connected to at least a few nodes. // // Like PeriodicBootstrap, Bootstrap returns a process, so the user can stop it. -func (dht *IpfsDHT) Bootstrap() (goprocess.Process, error) { +func (dht *IpfsDHT) Bootstrap(ctx context.Context) (goprocess.Process, error) { - if err := dht.runBootstrap(dht.Context(), DefaultBootstrapQueries); err != nil { + if err := dht.runBootstrap(ctx, DefaultBootstrapQueries); err != nil { return nil, err } @@ -79,41 +80,32 @@ func (dht *IpfsDHT) BootstrapOnSignal(queries int, signal <-chan time.Time) (gop return nil, fmt.Errorf("invalid signal: %v", signal) } - proc := goprocess.Go(func(worker goprocess.Process) { - defer log.Debug("dht bootstrapper shutting down") - for { - select { - case <-worker.Closing(): - return - - case <-signal: - // it would be useful to be able to send out signals of when we bootstrap, too... - // maybe this is a good case for whole module event pub/sub? - - ctx := dht.Context() - if err := dht.runBootstrap(ctx, queries); err != nil { - log.Error(err) - // A bootstrapping error is important to notice but not fatal. - // maybe the client should be able to consume these errors, - // though I dont have a clear use case in mind-- what **could** - // the client do if one of the bootstrap calls fails? - // - // This is also related to the core's bootstrap failures. - // superviseConnections should perhaps allow clients to detect - // bootstrapping problems. - // - // Anyway, passing errors could be done with a bootstrapper object. - // this would imply the client should be able to consume a lot of - // other non-fatal dht errors too. providing this functionality - // should be done correctly DHT-wide. - // NB: whatever the design, clients must ensure they drain errors! - // This pattern is common to many things, perhaps long-running services - // should have something like an ErrStream that allows clients to consume - // periodic errors and take action. It should allow the user to also - // ignore all errors with something like an ErrStreamDiscard. We should - // study what other systems do for ideas. - } - } + proc := periodicproc.Ticker(signal, func(worker goprocess.Process) { + // it would be useful to be able to send out signals of when we bootstrap, too... + // maybe this is a good case for whole module event pub/sub? + + ctx := dht.Context() + if err := dht.runBootstrap(ctx, queries); err != nil { + log.Error(err) + // A bootstrapping error is important to notice but not fatal. + // maybe the client should be able to consume these errors, + // though I dont have a clear use case in mind-- what **could** + // the client do if one of the bootstrap calls fails? + // + // This is also related to the core's bootstrap failures. + // superviseConnections should perhaps allow clients to detect + // bootstrapping problems. + // + // Anyway, passing errors could be done with a bootstrapper object. + // this would imply the client should be able to consume a lot of + // other non-fatal dht errors too. providing this functionality + // should be done correctly DHT-wide. + // NB: whatever the design, clients must ensure they drain errors! + // This pattern is common to many things, perhaps long-running services + // should have something like an ErrStream that allows clients to consume + // periodic errors and take action. It should allow the user to also + // ignore all errors with something like an ErrStreamDiscard. We should + // study what other systems do for ideas. } }) From 9f181a8b796fbee1f0b6accb91119e5374e79fd0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 20 Jan 2015 17:22:14 -0800 Subject: [PATCH 0565/3147] core/bootstrap: CR comments This commit was moved from ipfs/go-ipfs-routing@d771d4b8214b98b99d897d2b7ea6181ee1c17423 --- routing/dht/dht_bootstrap.go | 1 + routing/dht/dht_test.go | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index c3991972ce..588bcfd754 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -128,6 +128,7 @@ func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { // the dht will rehash to its own keyspace anyway. id := make([]byte, 16) rand.Read(id) + id = u.Hash(id) return peer.ID(id) } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index afc5756e82..2e1e1129fa 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -75,8 +75,6 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { ctx, cancel := context.WithCancel(ctx) - log.Error("hmm") - defer log.Error("hmm end") log.Debugf("bootstrapping dhts...") // tried async. sequential fares much better. compare: From f52295b2e9dfeab4ec8e0873b947d49071df27cc Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 23 Jan 2015 04:36:18 -0800 Subject: [PATCH 0566/3147] core: cleaned up bootstrap process This commit was moved from ipfs/go-ipfs-routing@6423b2e4227f3200f944727baa8aad1a20bfb70d --- routing/dht/dht_bootstrap.go | 112 +++++++++++++---------------------- 1 file changed, 42 insertions(+), 70 deletions(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 588bcfd754..c91df05e5f 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -17,52 +17,42 @@ import ( periodicproc "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" ) -// DefaultBootstrapQueries specifies how many queries to run, -// if the user does not specify a different number as an option. +// BootstrapConfig specifies parameters used bootstrapping the DHT. // -// For now, this is set to 16 queries, which is an aggressive number. -// We are currently more interested in ensuring we have a properly formed -// DHT than making sure our dht minimizes traffic. Once we are more certain -// of our implementation's robustness, we should lower this down to 8 or 4. -// -// Note there is also a tradeoff between the bootstrap period and the number -// of queries. We could support a higher period with a smaller number of -// queries -const DefaultBootstrapQueries = 1 +// Note there is a tradeoff between the bootstrap period and the +// number of queries. We could support a higher period with less +// queries. +type BootstrapConfig struct { + Queries int // how many queries to run per period + Period time.Duration // how often to run periodi cbootstrap. + Timeout time.Duration // how long to wait for a bootstrao query to run +} -// DefaultBootstrapPeriod specifies how often to periodically run bootstrap, -// if the user does not specify a different number as an option. -// -// For now, this is set to 10 seconds, which is an aggressive period. We are -// We are currently more interested in ensuring we have a properly formed -// DHT than making sure our dht minimizes traffic. Once we are more certain -// implementation's robustness, we should lower this down to 30s or 1m. -// -// Note there is also a tradeoff between the bootstrap period and the number -// of queries. We could support a higher period with a smaller number of -// queries -const DefaultBootstrapPeriod = time.Duration(10 * time.Second) - -// DefaultBootstrapTimeout specifies how long to wait for a bootstrap query -// to run. -const DefaultBootstrapTimeout = time.Duration(10 * time.Second) - -// Bootstrap runs bootstrapping once, then calls SignalBootstrap with default -// parameters: DefaultBootstrapQueries and DefaultBootstrapPeriod. This allows -// the user to catch an error off the bat if the connections are faulty. It also -// allows BootstrapOnSignal not to run bootstrap at the beginning, which is useful -// for instrumenting it on tests, or delaying bootstrap until the network is online -// and connected to at least a few nodes. -// -// Like PeriodicBootstrap, Bootstrap returns a process, so the user can stop it. -func (dht *IpfsDHT) Bootstrap(ctx context.Context) (goprocess.Process, error) { +var DefaultBootstrapConfig = BootstrapConfig{ + // For now, this is set to 1 query. + // We are currently more interested in ensuring we have a properly formed + // DHT than making sure our dht minimizes traffic. Once we are more certain + // of our implementation's robustness, we should lower this down to 8 or 4. + Queries: 1, - if err := dht.runBootstrap(ctx, DefaultBootstrapQueries); err != nil { - return nil, err - } + // For now, this is set to 10 seconds, which is an aggressive period. We are + // We are currently more interested in ensuring we have a properly formed + // DHT than making sure our dht minimizes traffic. Once we are more certain + // implementation's robustness, we should lower this down to 30s or 1m. + Period: time.Duration(20 * time.Second), - sig := time.Tick(DefaultBootstrapPeriod) - return dht.BootstrapOnSignal(DefaultBootstrapQueries, sig) + Timeout: time.Duration(20 * time.Second), +} + +// Bootstrap ensures the dht routing table remains healthy as peers come and go. +// it builds up a list of peers by requesting random peer IDs. The Bootstrap +// process will run a number of queries each time, and run every time signal fires. +// These parameters are configurable. +// +// Bootstrap returns a process, so the user can stop it. +func (dht *IpfsDHT) Bootstrap(config BootstrapConfig) (goprocess.Process, error) { + sig := time.Tick(config.Period) + return dht.BootstrapOnSignal(config, sig) } // SignalBootstrap ensures the dht routing table remains healthy as peers come and go. @@ -71,9 +61,9 @@ func (dht *IpfsDHT) Bootstrap(ctx context.Context) (goprocess.Process, error) { // These parameters are configurable. // // SignalBootstrap returns a process, so the user can stop it. -func (dht *IpfsDHT) BootstrapOnSignal(queries int, signal <-chan time.Time) (goprocess.Process, error) { - if queries <= 0 { - return nil, fmt.Errorf("invalid number of queries: %d", queries) +func (dht *IpfsDHT) BootstrapOnSignal(cfg BootstrapConfig, signal <-chan time.Time) (goprocess.Process, error) { + if cfg.Queries <= 0 { + return nil, fmt.Errorf("invalid number of queries: %d", cfg.Queries) } if signal == nil { @@ -85,27 +75,9 @@ func (dht *IpfsDHT) BootstrapOnSignal(queries int, signal <-chan time.Time) (gop // maybe this is a good case for whole module event pub/sub? ctx := dht.Context() - if err := dht.runBootstrap(ctx, queries); err != nil { + if err := dht.runBootstrap(ctx, cfg); err != nil { log.Error(err) // A bootstrapping error is important to notice but not fatal. - // maybe the client should be able to consume these errors, - // though I dont have a clear use case in mind-- what **could** - // the client do if one of the bootstrap calls fails? - // - // This is also related to the core's bootstrap failures. - // superviseConnections should perhaps allow clients to detect - // bootstrapping problems. - // - // Anyway, passing errors could be done with a bootstrapper object. - // this would imply the client should be able to consume a lot of - // other non-fatal dht errors too. providing this functionality - // should be done correctly DHT-wide. - // NB: whatever the design, clients must ensure they drain errors! - // This pattern is common to many things, perhaps long-running services - // should have something like an ErrStream that allows clients to consume - // periodic errors and take action. It should allow the user to also - // ignore all errors with something like an ErrStreamDiscard. We should - // study what other systems do for ideas. } }) @@ -113,7 +85,7 @@ func (dht *IpfsDHT) BootstrapOnSignal(queries int, signal <-chan time.Time) (gop } // runBootstrap builds up list of peers by requesting random peer IDs -func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { +func (dht *IpfsDHT) runBootstrap(ctx context.Context, cfg BootstrapConfig) error { bslog := func(msg string) { log.Debugf("DHT %s dhtRunBootstrap %s -- routing table size: %d", dht.self, msg, dht.routingTable.Size()) } @@ -133,7 +105,7 @@ func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { } // bootstrap sequentially, as results will compound - ctx, cancel := context.WithTimeout(ctx, DefaultBootstrapTimeout) + ctx, cancel := context.WithTimeout(ctx, cfg.Timeout) defer cancel() runQuery := func(ctx context.Context, id peer.ID) { p, err := dht.FindPeer(ctx, id) @@ -154,9 +126,9 @@ func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { if sequential { // these should be parallel normally. but can make them sequential for debugging. // note that the core/bootstrap context deadline should be extended too for that. - for i := 0; i < queries; i++ { + for i := 0; i < cfg.Queries; i++ { id := randomID() - log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) + log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, cfg.Queries, id) runQuery(ctx, id) } @@ -166,13 +138,13 @@ func (dht *IpfsDHT) runBootstrap(ctx context.Context, queries int) error { // normally, we should be selecting on ctx.Done() here too, but this gets // complicated to do with WaitGroup, and doesnt wait for the children to exit. var wg sync.WaitGroup - for i := 0; i < queries; i++ { + for i := 0; i < cfg.Queries; i++ { wg.Add(1) go func() { defer wg.Done() id := randomID() - log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, queries, id) + log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, cfg.Queries, id) runQuery(ctx, id) }() } From b9bc6f98876e83714b6ee4305cb279eef05a9616 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 23 Jan 2015 04:36:32 -0800 Subject: [PATCH 0567/3147] reprovide: wait a minute before reproviding Many times, a node will start up only to shut down immediately. In these cases, reproviding is costly to both the node, and the rest of the network. Also note: the probability of a node being up another minute increases with uptime. TODO: maybe this should be 5 * time.Minute This commit was moved from ipfs/go-ipfs-routing@e07559b808ad344d426b348cd9c2b0d4057f3ce6 --- routing/dht/dht_test.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2e1e1129fa..b7b9faf71d 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -82,10 +82,14 @@ func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { // 100 sync https://gist.github.com/jbenet/6c59e7c15426e48aaedd // probably because results compound + var cfg BootstrapConfig + cfg = DefaultBootstrapConfig + cfg.Queries = 3 + start := rand.Intn(len(dhts)) // randomize to decrease bias. for i := range dhts { dht := dhts[(start+i)%len(dhts)] - dht.runBootstrap(ctx, 3) + dht.runBootstrap(ctx, cfg) } cancel() } @@ -356,11 +360,15 @@ func TestPeriodicBootstrap(t *testing.T) { signal := make(chan time.Time) allSignals := []chan time.Time{} + var cfg BootstrapConfig + cfg = DefaultBootstrapConfig + cfg.Queries = 5 + // kick off periodic bootstrappers with instrumented signals. for _, dht := range dhts { s := make(chan time.Time) allSignals = append(allSignals, s) - dht.BootstrapOnSignal(5, s) + dht.BootstrapOnSignal(cfg, s) } go amplify(signal, allSignals) From 23b66777f659adcd55643f4c095ee488ac4b0cf5 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 23 Jan 2015 04:36:32 -0800 Subject: [PATCH 0568/3147] reprovide: wait a minute before reproviding Many times, a node will start up only to shut down immediately. In these cases, reproviding is costly to both the node, and the rest of the network. Also note: the probability of a node being up another minute increases with uptime. TODO: maybe this should be 5 * time.Minute This commit was moved from ipfs/go-ipfs-pinner@8a3c8f7530932d1d3081c254f51a1498fa28a769 --- pinning/pinner/indirect.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 9e67bc2c9f..09decbb254 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -32,7 +32,7 @@ func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { keys = append(keys, k) refcnt[k] = v } - log.Debugf("indirPin keys: %#v", keys) + // log.Debugf("indirPin keys: %#v", keys) return &indirectPin{blockset: set.SimpleSetFromKeys(keys), refCounts: refcnt}, nil } From a6b25bfe493808efe3b1743a0f1a48a1c79b5d1d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 22 Jan 2015 07:59:57 +0000 Subject: [PATCH 0569/3147] really ugly impl of 'ipfs dht query' command This commit was moved from ipfs/go-ipfs-routing@5eb4c50fcee38cc331cff7dd04ea397df6db2a3e --- routing/dht/lookup.go | 156 +++++++++++++++++++++++++++++++++++++++++ routing/dht/routing.go | 77 +------------------- 2 files changed, 158 insertions(+), 75 deletions(-) create mode 100644 routing/dht/lookup.go diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go new file mode 100644 index 0000000000..fe746498af --- /dev/null +++ b/routing/dht/lookup.go @@ -0,0 +1,156 @@ +package dht + +import ( + "encoding/json" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + peer "github.com/jbenet/go-ipfs/p2p/peer" + kb "github.com/jbenet/go-ipfs/routing/kbucket" + u "github.com/jbenet/go-ipfs/util" + errors "github.com/jbenet/go-ipfs/util/debugerror" + pset "github.com/jbenet/go-ipfs/util/peerset" +) + +type QueryEventType int + +const ( + SendingQuery QueryEventType = iota + PeerResponse + FinalPeer +) + +type QueryEvent struct { + ID peer.ID + Type QueryEventType + Responses []*peer.PeerInfo +} + +func pointerizePeerInfos(pis []peer.PeerInfo) []*peer.PeerInfo { + out := make([]*peer.PeerInfo, len(pis)) + for i, p := range pis { + np := p + out[i] = &np + } + return out +} + +// Kademlia 'node lookup' operation. Returns a channel of the K closest peers +// to the given key +func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key, events chan<- *QueryEvent) (<-chan peer.ID, error) { + e := log.EventBegin(ctx, "getClosestPeers", &key) + tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) + if len(tablepeers) == 0 { + return nil, errors.Wrap(kb.ErrLookupFailure) + } + + out := make(chan peer.ID, KValue) + peerset := pset.NewLimited(KValue) + + for _, p := range tablepeers { + select { + case out <- p: + case <-ctx.Done(): + return nil, ctx.Err() + } + peerset.Add(p) + } + + query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + // For DHT query command + select { + case events <- &QueryEvent{ + Type: SendingQuery, + ID: p, + }: + } + + closer, err := dht.closerPeersSingle(ctx, key, p) + if err != nil { + log.Errorf("error getting closer peers: %s", err) + return nil, err + } + + var filtered []peer.PeerInfo + for _, clp := range closer { + if kb.Closer(clp, dht.self, key) && peerset.TryAdd(clp) { + select { + case out <- clp: + log.Error("Sending out peer: %s", clp.Pretty()) + case <-ctx.Done(): + return nil, ctx.Err() + } + filtered = append(filtered, dht.peerstore.PeerInfo(clp)) + } + } + log.Errorf("filtered: %v", filtered) + + // For DHT query command + select { + case events <- &QueryEvent{ + Type: PeerResponse, + ID: p, + Responses: pointerizePeerInfos(filtered), + }: + } + + return &dhtQueryResult{closerPeers: filtered}, nil + }) + + go func() { + defer close(out) + defer e.Done() + // run it! + _, err := query.Run(ctx, tablepeers) + if err != nil { + log.Debugf("closestPeers query run error: %s", err) + } + }() + + return out, nil +} + +func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) ([]peer.ID, error) { + pmes, err := dht.findPeerSingle(ctx, p, peer.ID(key)) + if err != nil { + return nil, err + } + + var out []peer.ID + for _, pbp := range pmes.GetCloserPeers() { + pid := peer.ID(pbp.GetId()) + if pid != dht.self { // dont add self + dht.peerstore.AddAddresses(pid, pbp.Addresses()) + out = append(out, pid) + } + } + return out, nil +} + +func (qe *QueryEvent) MarshalJSON() ([]byte, error) { + out := make(map[string]interface{}) + out["ID"] = peer.IDB58Encode(qe.ID) + out["Type"] = int(qe.Type) + out["Responses"] = qe.Responses + return json.Marshal(out) +} + +func (qe *QueryEvent) UnmarshalJSON(b []byte) error { + temp := struct { + ID string + Type int + Responses []*peer.PeerInfo + }{} + err := json.Unmarshal(b, &temp) + if err != nil { + return err + } + pid, err := peer.IDB58Decode(temp.ID) + if err != nil { + return err + } + qe.ID = pid + qe.Type = QueryEventType(temp.Type) + qe.Responses = temp.Responses + return nil +} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2054e03fd0..3eaedc6192 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -48,7 +48,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - pchan, err := dht.getClosestPeers(ctx, key) + pchan, err := dht.GetClosestPeers(ctx, key, nil) if err != nil { return err } @@ -134,7 +134,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { // add self locally dht.providers.AddProvider(key, dht.self) - peers, err := dht.getClosestPeers(ctx, key) + peers, err := dht.GetClosestPeers(ctx, key, nil) if err != nil { return err } @@ -164,79 +164,6 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn return providers, nil } -// Kademlia 'node lookup' operation. Returns a channel of the K closest peers -// to the given key -func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer.ID, error) { - e := log.EventBegin(ctx, "getClosestPeers", &key) - tablepeers := dht.routingTable.ListPeers() - if len(tablepeers) == 0 { - return nil, errors.Wrap(kb.ErrLookupFailure) - } - - out := make(chan peer.ID, KValue) - peerset := pset.NewLimited(KValue) - - for _, p := range tablepeers { - select { - case out <- p: - case <-ctx.Done(): - return nil, ctx.Err() - } - peerset.Add(p) - } - - query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - closer, err := dht.closerPeersSingle(ctx, key, p) - if err != nil { - log.Errorf("error getting closer peers: %s", err) - return nil, err - } - - var filtered []peer.PeerInfo - for _, p := range closer { - if kb.Closer(p, dht.self, key) && peerset.TryAdd(p) { - select { - case out <- p: - case <-ctx.Done(): - return nil, ctx.Err() - } - filtered = append(filtered, dht.peerstore.PeerInfo(p)) - } - } - - return &dhtQueryResult{closerPeers: filtered}, nil - }) - - go func() { - defer close(out) - defer e.Done() - // run it! - _, err := query.Run(ctx, tablepeers) - if err != nil { - log.Debugf("closestPeers query run error: %s", err) - } - }() - - return out, nil -} - -func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) ([]peer.ID, error) { - pmes, err := dht.findPeerSingle(ctx, p, peer.ID(key)) - if err != nil { - return nil, err - } - - var out []peer.ID - for _, pbp := range pmes.GetCloserPeers() { - pid := peer.ID(pbp.GetId()) - if pid != dht.self { // dont add self - dht.peerstore.AddAddresses(pid, pbp.Addresses()) - out = append(out, pid) - } - } - return out, nil -} - // FindProvidersAsync is the same thing as FindProviders, but returns a channel. // Peers will be returned on the channel as soon as they are found, even before // the search query completes. From d965d81d62477a93f39d4c0e9c2659f8b466c19a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 22 Jan 2015 18:18:41 +0000 Subject: [PATCH 0570/3147] use a notification type strategy for the query events This commit was moved from ipfs/go-ipfs-routing@f985252841743a55b48e622042d51f0d79ef7a17 --- routing/dht/lookup.go | 64 ++++++------------------------------------ routing/dht/routing.go | 4 +-- 2 files changed, 11 insertions(+), 57 deletions(-) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index fe746498af..c0be519b2a 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -1,10 +1,9 @@ package dht import ( - "encoding/json" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + notif "github.com/jbenet/go-ipfs/notifications" peer "github.com/jbenet/go-ipfs/p2p/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" @@ -12,20 +11,7 @@ import ( pset "github.com/jbenet/go-ipfs/util/peerset" ) -type QueryEventType int - -const ( - SendingQuery QueryEventType = iota - PeerResponse - FinalPeer -) - -type QueryEvent struct { - ID peer.ID - Type QueryEventType - Responses []*peer.PeerInfo -} - +// Required in order for proper JSON marshaling func pointerizePeerInfos(pis []peer.PeerInfo) []*peer.PeerInfo { out := make([]*peer.PeerInfo, len(pis)) for i, p := range pis { @@ -37,7 +23,7 @@ func pointerizePeerInfos(pis []peer.PeerInfo) []*peer.PeerInfo { // Kademlia 'node lookup' operation. Returns a channel of the K closest peers // to the given key -func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key, events chan<- *QueryEvent) (<-chan peer.ID, error) { +func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key) (<-chan peer.ID, error) { e := log.EventBegin(ctx, "getClosestPeers", &key) tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) if len(tablepeers) == 0 { @@ -58,12 +44,10 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key, events chan< query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { // For DHT query command - select { - case events <- &QueryEvent{ - Type: SendingQuery, + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.SendingQuery, ID: p, - }: - } + }) closer, err := dht.closerPeersSingle(ctx, key, p) if err != nil { @@ -86,13 +70,11 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key, events chan< log.Errorf("filtered: %v", filtered) // For DHT query command - select { - case events <- &QueryEvent{ - Type: PeerResponse, + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.PeerResponse, ID: p, Responses: pointerizePeerInfos(filtered), - }: - } + }) return &dhtQueryResult{closerPeers: filtered}, nil }) @@ -126,31 +108,3 @@ func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) } return out, nil } - -func (qe *QueryEvent) MarshalJSON() ([]byte, error) { - out := make(map[string]interface{}) - out["ID"] = peer.IDB58Encode(qe.ID) - out["Type"] = int(qe.Type) - out["Responses"] = qe.Responses - return json.Marshal(out) -} - -func (qe *QueryEvent) UnmarshalJSON(b []byte) error { - temp := struct { - ID string - Type int - Responses []*peer.PeerInfo - }{} - err := json.Unmarshal(b, &temp) - if err != nil { - return err - } - pid, err := peer.IDB58Decode(temp.ID) - if err != nil { - return err - } - qe.ID = pid - qe.Type = QueryEventType(temp.Type) - qe.Responses = temp.Responses - return nil -} diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3eaedc6192..c1911ccdaf 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -48,7 +48,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error return err } - pchan, err := dht.GetClosestPeers(ctx, key, nil) + pchan, err := dht.GetClosestPeers(ctx, key) if err != nil { return err } @@ -134,7 +134,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { // add self locally dht.providers.AddProvider(key, dht.self) - peers, err := dht.GetClosestPeers(ctx, key, nil) + peers, err := dht.GetClosestPeers(ctx, key) if err != nil { return err } From efb14cc8ff1a9513daed02efed2c9544311b6c9b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 22 Jan 2015 07:34:26 -0800 Subject: [PATCH 0571/3147] dont rate limit query during dials This commit was moved from ipfs/go-ipfs-routing@1233183ef266dd9cea88eea3ddf0dbe5c35b15f1 --- routing/dht/query.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index 687d2621fd..f4150d82ee 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -223,6 +223,9 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { // make sure we're connected to the peer. if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { log.Infof("not connected. dialing.") + // while we dial, we do not take up a rate limit. this is to allow + // forward progress during potentially very high latency dials. + r.rateLimit <- struct{}{} pi := peer.PeerInfo{ID: p} if err := r.query.dht.host.Connect(cg.Context(), pi); err != nil { @@ -230,9 +233,10 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { r.Lock() r.errs = append(r.errs, err) r.Unlock() + <-r.rateLimit // need to grab it again, as we deferred. return } - + <-r.rateLimit // need to grab it again, as we deferred. log.Debugf("connected. dial success.") } From 0f4cf52453dc62ced46d74e767b315e18d793a79 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 22 Jan 2015 22:18:36 +0000 Subject: [PATCH 0572/3147] implement dht findprovs and add error output to dht query This commit was moved from ipfs/go-ipfs-routing@1dd19b84016af3bf8a4ce70c2e79e2746dfbeca7 --- routing/dht/lookup.go | 1 - routing/dht/query.go | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index c0be519b2a..c97e70fb15 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -67,7 +67,6 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key) (<-chan peer filtered = append(filtered, dht.peerstore.PeerInfo(clp)) } } - log.Errorf("filtered: %v", filtered) // For DHT query command notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ diff --git a/routing/dht/query.go b/routing/dht/query.go index f4150d82ee..dfaecef98a 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,6 +3,7 @@ package dht import ( "sync" + notif "github.com/jbenet/go-ipfs/notifications" peer "github.com/jbenet/go-ipfs/p2p/peer" queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" @@ -230,6 +231,12 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { pi := peer.PeerInfo{ID: p} if err := r.query.dht.host.Connect(cg.Context(), pi); err != nil { log.Debugf("Error connecting: %s", err) + + notif.PublishQueryEvent(cg.Context(), ¬if.QueryEvent{ + Type: notif.QueryError, + Extra: err.Error(), + }) + r.Lock() r.errs = append(r.errs, err) r.Unlock() From 4fa9ba043005742653e958b5c718aaa337efdc2d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 24 Jan 2015 00:59:47 +0000 Subject: [PATCH 0573/3147] respect verbose option a bit, and show query events for other commands This commit was moved from ipfs/go-ipfs-routing@b13eb0c3151e867aaff89a94791a46e5502477a4 --- routing/dht/lookup.go | 1 - routing/dht/routing.go | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index c97e70fb15..ea1552ba7b 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -60,7 +60,6 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key) (<-chan peer if kb.Closer(clp, dht.self, key) && peerset.TryAdd(clp) { select { case out <- clp: - log.Error("Sending out peer: %s", clp.Pretty()) case <-ctx.Done(): return nil, ctx.Err() } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index c1911ccdaf..39002fe643 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -7,6 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + notif "github.com/jbenet/go-ipfs/notifications" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" "github.com/jbenet/go-ipfs/routing" @@ -242,6 +243,10 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co _, err := query.Run(ctx, peers) if err != nil { log.Errorf("Query error: %s", err) + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.QueryError, + Extra: err.Error(), + }) } } @@ -269,6 +274,10 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er // setup the Query query := dht.newQuery(u.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.SendingQuery, + ID: p, + }) pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { @@ -288,6 +297,11 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er } } + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.PeerResponse, + Responses: pointerizePeerInfos(clpeerInfos), + }) + return &dhtQueryResult{closerPeers: clpeerInfos}, nil }) From a1c5b912feaa0d5d65ee2921ee3df29aad234f1e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 24 Jan 2015 00:24:44 -0800 Subject: [PATCH 0574/3147] remove prefix logger This commit was moved from ipfs/go-ipfs-routing@fbb5c35bf7420560d99604c63e710990fd613261 --- routing/dht/dht.go | 2 +- routing/dht/query.go | 9 --------- routing/dht/routing.go | 12 ------------ 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0fd5177a2c..5f75123939 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -97,7 +97,7 @@ func (dht *IpfsDHT) LocalPeer() peer.ID { // log returns the dht's logger func (dht *IpfsDHT) log() eventlog.EventLogger { - return log.Prefix("dht(%s)", dht.self) + return log // TODO rm } // Connect to a new peer at the given address, ping and add to the routing table diff --git a/routing/dht/query.go b/routing/dht/query.go index dfaecef98a..14a23de6f7 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -84,7 +84,6 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { } func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { - log := log.Prefix("dht(%s).Query(%s).Run(%d)", r.query.dht.self, r.query.key, len(peers)) r.log = log log.Debug("enter") defer log.Debug("end") @@ -169,10 +168,6 @@ func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { } func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { - log := r.log.Prefix("spawnWorkers") - log.Debugf("begin") - defer log.Debugf("end") - for { select { @@ -198,10 +193,6 @@ func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { } func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { - log := r.log.Prefix("queryPeer(%s)", p) - log.Debugf("spawned") - defer log.Debugf("finished") - // make sure we rate limit concurrency. select { case <-r.rateLimit: diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 39002fe643..0de059eecc 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -73,10 +73,6 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { - log := dht.log().Prefix("GetValue(%s)", key) - log.Debugf("start") - defer log.Debugf("end") - // If we have it local, dont bother doing an RPC! val, err := dht.getLocal(key) if err == nil { @@ -128,8 +124,6 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // Provide makes this node announce that it can provide a value for the given key func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { - log := dht.log().Prefix("Provide(%s)", key) - defer log.EventBegin(ctx, "provide", &key).Done() // add self locally @@ -176,8 +170,6 @@ func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int } func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { - log := dht.log().Prefix("FindProviders(%s)", key) - defer log.EventBegin(ctx, "findProvidersAsync", &key).Done() defer close(peerOut) @@ -201,10 +193,6 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // setup the Query query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - log := log.Prefix("Query(%s)", p) - log.Debugf("begin") - defer log.Debugf("end") - pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { return nil, err From 162326e45e1a32cc587b0f2a1da844fab310735c Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 23 Jan 2015 22:03:05 -0800 Subject: [PATCH 0575/3147] provide simple wrapper methods for AllKeysRange @jbenet @whyrusleeping was the 1<<16 intentional? replaced the raw methods with wrappers. This commit was moved from ipfs/go-ipfs-blockstore@0a26e549358ce74b68a0ecdd4da12563d5274ec8 --- blockstore/blockstore.go | 29 ++++++++++++++++++++--------- blockstore/blockstore_test.go | 6 +++--- blockstore/write_cache.go | 16 ++++++++++++---- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 3c98b0735b..70a705884c 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -32,8 +32,11 @@ type Blockstore interface { Get(u.Key) (*blocks.Block, error) Put(*blocks.Block) error - AllKeys(ctx context.Context, offset int, limit int) ([]u.Key, error) - AllKeysChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) + AllKeys(ctx context.Context) ([]u.Key, error) + AllKeysChan(ctx context.Context) (<-chan u.Key, error) + + AllKeysRange(ctx context.Context, offset int, limit int) ([]u.Key, error) + AllKeysRangeChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) } func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { @@ -83,14 +86,22 @@ func (s *blockstore) DeleteBlock(k u.Key) error { return s.datastore.Delete(k.DsKey()) } -// AllKeys runs a query for keys from the blockstore. +func (bs *blockstore) AllKeys(ctx context.Context) ([]u.Key, error) { + return bs.AllKeysRange(ctx, 0, 0) +} + +func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { + return bs.AllKeysRangeChan(ctx, 0, 0) +} + +// AllKeysRange runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? // if offset and limit are 0, they are ignored. // -// AllKeys respects context -func (bs *blockstore) AllKeys(ctx context.Context, offset int, limit int) ([]u.Key, error) { +// AllKeysRange respects context +func (bs *blockstore) AllKeysRange(ctx context.Context, offset int, limit int) ([]u.Key, error) { - ch, err := bs.AllKeysChan(ctx, offset, limit) + ch, err := bs.AllKeysRangeChan(ctx, offset, limit) if err != nil { return nil, err } @@ -102,12 +113,12 @@ func (bs *blockstore) AllKeys(ctx context.Context, offset int, limit int) ([]u.K return keys, nil } -// AllKeys runs a query for keys from the blockstore. +// AllKeysRangeChan runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? // if offset and limit are 0, they are ignored. // -// AllKeys respects context -func (bs *blockstore) AllKeysChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { +// AllKeysRangeChan respects context +func (bs *blockstore) AllKeysRangeChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true, Offset: offset, Limit: limit} diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 44f5964e8b..2280f78f87 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -67,7 +67,7 @@ func TestAllKeysSimple(t *testing.T) { bs, keys := newBlockStoreWithKeys(t, nil, 100) ctx := context.Background() - keys2, err := bs.AllKeys(ctx, 0, 0) + keys2, err := bs.AllKeys(ctx) if err != nil { t.Fatal(err) } @@ -83,7 +83,7 @@ func TestAllKeysOffsetAndLimit(t *testing.T) { bs, _ := newBlockStoreWithKeys(t, nil, N) ctx := context.Background() - keys3, err := bs.AllKeys(ctx, N/3, N/3) + keys3, err := bs.AllKeysRange(ctx, N/3, N/3) if err != nil { t.Fatal(err) } @@ -107,7 +107,7 @@ func TestAllKeysRespectsContext(t *testing.T) { getKeys := func(ctx context.Context) { started <- struct{}{} - _, err := bs.AllKeys(ctx, 0, 0) // once without cancelling + _, err := bs.AllKeys(ctx) // once without cancelling if err != nil { errors <- err } diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 377ce629d2..487899597c 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -46,10 +46,18 @@ func (w *writecache) Put(b *blocks.Block) error { return w.blockstore.Put(b) } -func (w *writecache) AllKeys(ctx context.Context, offset int, limit int) ([]u.Key, error) { - return w.blockstore.AllKeys(ctx, offset, limit) +func (w *writecache) AllKeys(ctx context.Context) ([]u.Key, error) { + return w.blockstore.AllKeysRange(ctx, 0, 0) } -func (w *writecache) AllKeysChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { - return w.blockstore.AllKeysChan(ctx, offset, limit) +func (w *writecache) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { + return w.blockstore.AllKeysRangeChan(ctx, 0, 0) +} + +func (w *writecache) AllKeysRange(ctx context.Context, offset int, limit int) ([]u.Key, error) { + return w.blockstore.AllKeysRange(ctx, offset, limit) +} + +func (w *writecache) AllKeysRangeChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { + return w.blockstore.AllKeysRangeChan(ctx, offset, limit) } From ec2df3f5e0c108f6adb0736a9a45533ccf509d95 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sat, 24 Jan 2015 00:26:42 -0800 Subject: [PATCH 0576/3147] Extracted TAR archive building/reading code out of 'ipfs get' This commit was moved from ipfs/go-unixfs@d38b695ea75af3316df4fb226cffa29b941bbbce --- unixfs/tar/reader.go | 200 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 unixfs/tar/reader.go diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go new file mode 100644 index 0000000000..725e6867fa --- /dev/null +++ b/unixfs/tar/reader.go @@ -0,0 +1,200 @@ +package tar + +import ( + "archive/tar" + "bytes" + "compress/gzip" + "io" + p "path" + + mdag "github.com/jbenet/go-ipfs/merkledag" + path "github.com/jbenet/go-ipfs/path" + uio "github.com/jbenet/go-ipfs/unixfs/io" + upb "github.com/jbenet/go-ipfs/unixfs/pb" + + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" +) + +type Reader struct { + buf bytes.Buffer + closed bool + signalChan chan struct{} + dag mdag.DAGService + resolver *path.Resolver + writer *tar.Writer + gzipWriter *gzip.Writer + err error +} + +func NewReader(path string, dag mdag.DAGService, resolver *path.Resolver, compression int) (*Reader, error) { + reader := &Reader{ + signalChan: make(chan struct{}), + dag: dag, + resolver: resolver, + } + + var err error + if compression != gzip.NoCompression { + reader.gzipWriter, err = gzip.NewWriterLevel(&reader.buf, compression) + if err != nil { + return nil, err + } + reader.writer = tar.NewWriter(reader.gzipWriter) + } else { + reader.writer = tar.NewWriter(&reader.buf) + } + + dagnode, err := resolver.ResolvePath(path) + if err != nil { + return nil, err + } + + // writeToBuf will write the data to the buffer, and will signal when there + // is new data to read + go reader.writeToBuf(dagnode, path, 0) + + return reader, nil +} + +func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { + pb := new(upb.Data) + err := proto.Unmarshal(dagnode.Data, pb) + if err != nil { + i.emitError(err) + return + } + + if depth == 0 { + defer i.close() + } + + if pb.GetType() == upb.Data_Directory { + err = i.writer.WriteHeader(&tar.Header{ + Name: path, + Typeflag: tar.TypeDir, + Mode: 0777, + // TODO: set mode, dates, etc. when added to unixFS + }) + if err != nil { + i.emitError(err) + return + } + + for _, link := range dagnode.Links { + childNode, err := link.GetNode(i.dag) + if err != nil { + i.emitError(err) + return + } + i.writeToBuf(childNode, p.Join(path, link.Name), depth+1) + } + return + } + + err = i.writer.WriteHeader(&tar.Header{ + Name: path, + Size: int64(pb.GetFilesize()), + Typeflag: tar.TypeReg, + Mode: 0644, + // TODO: set mode, dates, etc. when added to unixFS + }) + if err != nil { + i.emitError(err) + return + } + + reader, err := uio.NewDagReader(dagnode, i.dag) + if err != nil { + i.emitError(err) + return + } + + err = i.syncCopy(reader) + if err != nil { + i.emitError(err) + return + } +} + +func (i *Reader) Read(p []byte) (int, error) { + // wait for the goroutine that is writing data to the buffer to tell us + // there is something to read + if !i.closed { + <-i.signalChan + } + + if i.err != nil { + return 0, i.err + } + + if !i.closed { + defer i.signal() + } + + if i.buf.Len() == 0 { + if i.closed { + return 0, io.EOF + } + return 0, nil + } + + n, err := i.buf.Read(p) + if err == io.EOF && !i.closed || i.buf.Len() > 0 { + return n, nil + } + + return n, err +} + +func (i *Reader) signal() { + i.signalChan <- struct{}{} +} + +func (i *Reader) emitError(err error) { + i.err = err + i.signal() +} + +func (i *Reader) close() { + i.closed = true + i.flush() +} + +func (i *Reader) flush() { + defer i.signal() + err := i.writer.Close() + if err != nil { + i.emitError(err) + return + } + if i.gzipWriter != nil { + err = i.gzipWriter.Close() + if err != nil { + i.emitError(err) + return + } + } +} + +func (i *Reader) syncCopy(reader io.Reader) error { + buf := make([]byte, 32*1024) + for { + nr, err := reader.Read(buf) + if nr > 0 { + _, err := i.writer.Write(buf[:nr]) + if err != nil { + return err + } + i.signal() + // wait for Read to finish reading + <-i.signalChan + } + if err == io.EOF { + break + } + if err != nil { + return err + } + } + return nil +} From 4550b3a9cb3d007a1af3f13adefaa68fb2ecc7a5 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sat, 24 Jan 2015 05:35:05 -0800 Subject: [PATCH 0577/3147] unixfs/tar: Fixed reader not properly buffering headers This commit was moved from ipfs/go-unixfs@04f921181b9a7045ef15185711b852a4cba4371c --- unixfs/tar/reader.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 725e6867fa..081d816a2d 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -79,6 +79,7 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { i.emitError(err) return } + i.flush() for _, link := range dagnode.Links { childNode, err := link.GetNode(i.dag) @@ -102,6 +103,7 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { i.emitError(err) return } + i.flush() reader, err := uio.NewDagReader(dagnode, i.dag) if err != nil { @@ -150,6 +152,11 @@ func (i *Reader) signal() { i.signalChan <- struct{}{} } +func (i *Reader) flush() { + i.signal() + <-i.signalChan +} + func (i *Reader) emitError(err error) { i.err = err i.signal() @@ -157,10 +164,6 @@ func (i *Reader) emitError(err error) { func (i *Reader) close() { i.closed = true - i.flush() -} - -func (i *Reader) flush() { defer i.signal() err := i.writer.Close() if err != nil { @@ -185,9 +188,7 @@ func (i *Reader) syncCopy(reader io.Reader) error { if err != nil { return err } - i.signal() - // wait for Read to finish reading - <-i.signalChan + i.flush() } if err == io.EOF { break From 76f0073b7d91379c873ae97a3c172c648d340b39 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 24 Jan 2015 08:52:01 -0800 Subject: [PATCH 0578/3147] routing/dht: adjust routing table on peer conn/disc This commit was moved from ipfs/go-ipfs-routing@261de3076ef7d3f1f066183241840168732450e2 --- routing/dht/dht.go | 10 +++++++++- routing/dht/notif.go | 33 +++++++++++++++++++++++++++++++++ routing/kbucket/bucket.go | 10 ++++++++++ routing/kbucket/table.go | 17 +++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 routing/dht/notif.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5f75123939..e66517072c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -65,9 +65,17 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.datastore = dstore dht.self = h.ID() dht.peerstore = h.Peerstore() - dht.ContextGroup = ctxgroup.WithContext(ctx) dht.host = h + // register for network notifs. + dht.host.Network().Notify((*netNotifiee)(dht)) + + dht.ContextGroup = ctxgroup.WithContextAndTeardown(ctx, func() error { + // remove ourselves from network notifs. + dht.host.Network().StopNotify((*netNotifiee)(dht)) + return nil + }) + // sanity check. this should **never** happen if len(dht.peerstore.Addresses(dht.self)) < 1 { panic("attempt to initialize dht without addresses for self") diff --git a/routing/dht/notif.go b/routing/dht/notif.go new file mode 100644 index 0000000000..318db12ea9 --- /dev/null +++ b/routing/dht/notif.go @@ -0,0 +1,33 @@ +package dht + +import ( + inet "github.com/jbenet/go-ipfs/p2p/net" +) + +// netNotifiee defines methods to be used with the IpfsDHT +type netNotifiee IpfsDHT + +func (nn *netNotifiee) DHT() *IpfsDHT { + return (*IpfsDHT)(nn) +} + +func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { + dht := nn.DHT() + select { + case <-dht.Closing(): + return + } + dht.Update(dht.Context(), v.RemotePeer()) +} + +func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { + dht := nn.DHT() + select { + case <-dht.Closing(): + return + } + dht.routingTable.Remove(v.RemotePeer()) +} + +func (nn *netNotifiee) OpenedStream(n inet.Network, v inet.Stream) {} +func (nn *netNotifiee) ClosedStream(n inet.Network, v inet.Stream) {} diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index e158f70f9e..7d4f87c2ec 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -30,6 +30,16 @@ func (b *Bucket) find(id peer.ID) *list.Element { return nil } +func (b *Bucket) remove(id peer.ID) { + b.lk.RLock() + defer b.lk.RUnlock() + for e := b.list.Front(); e != nil; e = e.Next() { + if e.Value.(peer.ID) == id { + b.list.Remove(e) + } + } +} + func (b *Bucket) moveToFront(e *list.Element) { b.lk.Lock() b.list.MoveToFront(e) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 62bfa0646b..59b81282d2 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -87,6 +87,23 @@ func (rt *RoutingTable) Update(p peer.ID) peer.ID { return "" } +// Remove deletes a peer from the routing table. This is to be used +// when we are sure a node has disconnected completely. +func (rt *RoutingTable) Remove(p peer.ID) { + rt.tabLock.Lock() + defer rt.tabLock.Unlock() + peerID := ConvertPeerID(p) + cpl := commonPrefixLen(peerID, rt.local) + + bucketID := cpl + if bucketID >= len(rt.Buckets) { + bucketID = len(rt.Buckets) - 1 + } + + bucket := rt.Buckets[bucketID] + bucket.remove(p) +} + func (rt *RoutingTable) nextBucket() peer.ID { bucket := rt.Buckets[len(rt.Buckets)-1] newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) From 1fe66d6d6344496d1488c1878d2e4bf911911c31 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 24 Jan 2015 09:45:07 -0800 Subject: [PATCH 0579/3147] dht/kbucket: race condition fix This commit was moved from ipfs/go-ipfs-routing@a4bf6b56c6ac2424c3b9716690176a222b8aa083 --- routing/kbucket/bucket.go | 15 +++++++++++---- routing/kbucket/table.go | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index e158f70f9e..32bc8631e3 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -19,6 +19,17 @@ func newBucket() *Bucket { return b } +func (b *Bucket) Peers() []peer.ID { + b.lk.RLock() + defer b.lk.RUnlock() + ps := make([]peer.ID, 0, b.list.Len()) + for e := b.list.Front(); e != nil; e = e.Next() { + id := e.Value.(peer.ID) + ps = append(ps, id) + } + return ps +} + func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() @@ -81,7 +92,3 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { } return newbuck } - -func (b *Bucket) getIter() *list.Element { - return b.list.Front() -} diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 62bfa0646b..4ec35b5d3c 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -176,11 +176,11 @@ func (rt *RoutingTable) Size() int { // NOTE: This is potentially unsafe... use at your own risk func (rt *RoutingTable) ListPeers() []peer.ID { var peers []peer.ID + rt.tabLock.RLock() for _, buck := range rt.Buckets { - for e := buck.getIter(); e != nil; e = e.Next() { - peers = append(peers, e.Value.(peer.ID)) - } + peers = append(peers, buck.Peers()...) } + rt.tabLock.RUnlock() return peers } From 760d294dabc192c712d73c0f937bf25e6868421b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 24 Jan 2015 10:30:15 -0800 Subject: [PATCH 0580/3147] disable dht TestPeriodicBootstrap on CI This commit was moved from ipfs/go-ipfs-routing@94c4656bc1314fdce6e1474a522a7453d0703aea --- routing/dht/dht_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b7b9faf71d..1b274395a0 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -19,6 +19,7 @@ import ( netutil "github.com/jbenet/go-ipfs/p2p/test/util" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" + ci "github.com/jbenet/go-ipfs/util/testutil/ci" ) var testCaseValues = map[u.Key][]byte{} @@ -330,6 +331,9 @@ func TestBootstrap(t *testing.T) { func TestPeriodicBootstrap(t *testing.T) { // t.Skip("skipping test to debug another") + if ci.IsRunning() { + t.Skip("skipping on CI. highly timing dependent") + } if testing.Short() { t.SkipNow() } From 5180925494e33abc6545f7d1a5084c6918766465 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 24 Jan 2015 10:34:26 -0800 Subject: [PATCH 0581/3147] dht: TestConnectCollision skip in Travis + longer timeout This commit was moved from ipfs/go-ipfs-routing@65224292879e73f104df66b498402d06c93fa842 --- routing/dht/dht_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1b274395a0..2d8494b65c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -19,7 +19,9 @@ import ( netutil "github.com/jbenet/go-ipfs/p2p/test/util" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" + ci "github.com/jbenet/go-ipfs/util/testutil/ci" + travisci "github.com/jbenet/go-ipfs/util/testutil/ci/travis" ) var testCaseValues = map[u.Key][]byte{} @@ -738,6 +740,9 @@ func TestConnectCollision(t *testing.T) { if testing.Short() { t.SkipNow() } + if travisci.IsRunning() { + t.Skip("Skipping on Travis-CI.") + } runTimes := 10 @@ -767,7 +772,7 @@ func TestConnectCollision(t *testing.T) { errs <- err }() - timeout := time.After(time.Second) + timeout := time.After(5 * time.Second) select { case e := <-errs: if e != nil { From fae004b522a345cc596f8856155ff607a1850e46 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 25 Jan 2015 01:41:06 +0000 Subject: [PATCH 0582/3147] correct notifications for findProviders This commit was moved from ipfs/go-ipfs-routing@f3b051ffd90772d28310472fc3e8730155b70b0c --- routing/dht/routing.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 0de059eecc..e04803ed2e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -193,6 +193,10 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co // setup the Query query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.SendingQuery, + ID: p, + }) pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { return nil, err @@ -224,6 +228,12 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co closer := pmes.GetCloserPeers() clpeers := pb.PBPeersToPeerInfos(closer) log.Debugf("got closer peers: %d %s", len(clpeers), clpeers) + + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.PeerResponse, + ID: p, + Responses: pointerizePeerInfos(clpeers), + }) return &dhtQueryResult{closerPeers: clpeers}, nil }) From b22819d3434a8fbf43f55a10de97ef93ec21ab72 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sat, 24 Jan 2015 13:46:08 -0800 Subject: [PATCH 0583/3147] core/commands: get: Place files at root of TAR when using a multi-element ipfs path This commit was moved from ipfs/go-unixfs@165f19fa4337815405452798e3d7f9de1eff6e65 --- unixfs/tar/reader.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 081d816a2d..6ec3339282 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -51,7 +51,8 @@ func NewReader(path string, dag mdag.DAGService, resolver *path.Resolver, compre // writeToBuf will write the data to the buffer, and will signal when there // is new data to read - go reader.writeToBuf(dagnode, path, 0) + _, filename := p.Split(path) + go reader.writeToBuf(dagnode, filename, 0) return reader, nil } From ba46e7e591d1e4a9a0ff139077423a5859a69dae Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Sat, 24 Jan 2015 15:04:54 -0800 Subject: [PATCH 0584/3147] unixfs/tar: Ignore /ipfs/ in path This commit was moved from ipfs/go-unixfs@c9ea7960d95f7e0fb08cf6f229fb4063ad0f285b --- unixfs/tar/reader.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 6ec3339282..a64a963ebd 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -6,6 +6,7 @@ import ( "compress/gzip" "io" p "path" + "strings" mdag "github.com/jbenet/go-ipfs/merkledag" path "github.com/jbenet/go-ipfs/path" @@ -27,6 +28,10 @@ type Reader struct { } func NewReader(path string, dag mdag.DAGService, resolver *path.Resolver, compression int) (*Reader, error) { + if strings.HasPrefix(path, "/ipfs/") { + path = path[6:] + } + reader := &Reader{ signalChan: make(chan struct{}), dag: dag, From b32b99d62edc8ca40ab6f1f2387f8f9493bfc12e Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 26 Jan 2015 16:57:55 -0800 Subject: [PATCH 0585/3147] unixfs/tar: Use current date for file timestamps This commit was moved from ipfs/go-unixfs@5478c3c47c14c8f094a1cd28d9c9ef3d00230389 --- unixfs/tar/reader.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index a64a963ebd..193f503332 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -7,6 +7,7 @@ import ( "io" p "path" "strings" + "time" mdag "github.com/jbenet/go-ipfs/merkledag" path "github.com/jbenet/go-ipfs/path" @@ -79,6 +80,7 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { Name: path, Typeflag: tar.TypeDir, Mode: 0777, + ModTime: time.Now(), // TODO: set mode, dates, etc. when added to unixFS }) if err != nil { @@ -103,6 +105,7 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { Size: int64(pb.GetFilesize()), Typeflag: tar.TypeReg, Mode: 0644, + ModTime: time.Now(), // TODO: set mode, dates, etc. when added to unixFS }) if err != nil { From 65be7279dcbdd4f2130e0b2b11d4503249d35e96 Mon Sep 17 00:00:00 2001 From: Matt Bell Date: Mon, 26 Jan 2015 17:02:48 -0800 Subject: [PATCH 0586/3147] unixfs/tar: Rename p to gopath This commit was moved from ipfs/go-unixfs@4cfcdc644f2c3dd6eaa97a90e8143e121c0540a0 --- unixfs/tar/reader.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 193f503332..de4589f94a 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -5,7 +5,7 @@ import ( "bytes" "compress/gzip" "io" - p "path" + gopath "path" "strings" "time" @@ -57,7 +57,7 @@ func NewReader(path string, dag mdag.DAGService, resolver *path.Resolver, compre // writeToBuf will write the data to the buffer, and will signal when there // is new data to read - _, filename := p.Split(path) + _, filename := gopath.Split(path) go reader.writeToBuf(dagnode, filename, 0) return reader, nil @@ -95,7 +95,7 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { i.emitError(err) return } - i.writeToBuf(childNode, p.Join(path, link.Name), depth+1) + i.writeToBuf(childNode, gopath.Join(path, link.Name), depth+1) } return } From bc425f7124ca58240f650e166200e762c7065ddf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 25 Jan 2015 08:54:33 +0000 Subject: [PATCH 0587/3147] implement seeking in the dagreader This commit was moved from ipfs/go-unixfs@5b4f82f25ca34c910ffe2a5cd23533c4fbfb245f --- unixfs/io/dagmodifier_test.go | 9 ++- unixfs/io/dagreader.go | 136 ++++++++++++++++++++++++++++++---- unixfs/tar/reader.go | 3 +- 3 files changed, 127 insertions(+), 21 deletions(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 43e7fcb084..52ff5853b0 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "testing" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/jbenet/go-ipfs/blocks/blockstore" bs "github.com/jbenet/go-ipfs/blockservice" @@ -38,7 +39,7 @@ func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Nod t.Fatal(err) } - dr, err := NewDagReader(node, dserv) + dr, err := NewDagReader(context.TODO(), node, dserv) if err != nil { t.Fatal(err) } @@ -75,7 +76,7 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) t.Fatal(err) } - rd, err := NewDagReader(nd, dm.dagserv) + rd, err := NewDagReader(context.TODO(), nd, dm.dagserv) if err != nil { t.Fatal(err) } @@ -173,7 +174,7 @@ func TestMultiWrite(t *testing.T) { t.Fatal(err) } - read, err := NewDagReader(nd, dserv) + read, err := NewDagReader(context.TODO(), nd, dserv) if err != nil { t.Fatal(err) } @@ -215,7 +216,7 @@ func TestMultiWriteCoal(t *testing.T) { t.Fatal(err) } - read, err := NewDagReader(nd, dserv) + read, err := NewDagReader(context.TODO(), nd, dserv) if err != nil { t.Fatal(err) } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index ab28dc8aea..17dbfb41be 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -3,7 +3,10 @@ package io import ( "bytes" "errors" + "fmt" "io" + "io/ioutil" + "os" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -11,6 +14,7 @@ import ( mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" ftpb "github.com/jbenet/go-ipfs/unixfs/pb" + u "github.com/jbenet/go-ipfs/util" ) var ErrIsDir = errors.New("this dag node is a directory") @@ -19,14 +23,28 @@ var ErrIsDir = errors.New("this dag node is a directory") type DagReader struct { serv mdag.DAGService node *mdag.Node - buf io.Reader + buf ReadSeekCloser fetchChan <-chan *mdag.Node linkPosition int + offset int64 + + // Our context + ctx context.Context + + // Context for children + fctx context.Context + cancel func() +} + +type ReadSeekCloser interface { + io.Reader + io.Seeker + io.Closer } // NewDagReader creates a new reader object that reads the data represented by the given // node, using the passed in DAGService for data retreival -func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { +func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (ReadSeekCloser, error) { pb := new(ftpb.Data) err := proto.Unmarshal(n.Data, pb) if err != nil { @@ -38,16 +56,20 @@ func NewDagReader(n *mdag.Node, serv mdag.DAGService) (io.Reader, error) { // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File: - fetchChan := serv.GetDAG(context.TODO(), n) + fctx, cancel := context.WithCancel(ctx) + fetchChan := serv.GetDAG(fctx, n) return &DagReader{ node: n, serv: serv, - buf: bytes.NewBuffer(pb.GetData()), + buf: NewRSNCFromBytes(pb.GetData()), fetchChan: fetchChan, + ctx: ctx, + fctx: fctx, + cancel: cancel, }, nil case ftpb.Data_Raw: // Raw block will just be a single level, return a byte buffer - return bytes.NewBuffer(pb.GetData()), nil + return NewRSNCFromBytes(pb.GetData()), nil default: return nil, ft.ErrUnrecognizedType } @@ -70,6 +92,8 @@ func (dr *DagReader) precalcNextBuf() error { if !ok { return io.EOF } + case <-dr.ctx.Done(): + return dr.ctx.Err() } pb := new(ftpb.Data) @@ -85,20 +109,37 @@ func (dr *DagReader) precalcNextBuf() error { case ftpb.Data_File: //TODO: this *should* work, needs testing first log.Warning("Running untested code for multilayered indirect FS reads.") - subr, err := NewDagReader(nxt, dr.serv) + subr, err := NewDagReader(dr.fctx, nxt, dr.serv) if err != nil { return err } dr.buf = subr return nil case ftpb.Data_Raw: - dr.buf = bytes.NewBuffer(pb.GetData()) + dr.buf = NewRSNCFromBytes(pb.GetData()) return nil default: return ft.ErrUnrecognizedType } } +func (dr *DagReader) resetBlockFetch(nlinkpos int) { + dr.cancel() + dr.fetchChan = nil + dr.linkPosition = nlinkpos + + var keys []u.Key + for _, lnk := range dr.node.Links[dr.linkPosition:] { + keys = append(keys, u.Key(lnk.Hash)) + } + + fctx, cancel := context.WithCancel(dr.ctx) + dr.cancel = cancel + dr.fctx = fctx + fch := dr.serv.GetNodes(fctx, keys) + dr.fetchChan = fch +} + // Read reads data from the DAG structured file func (dr *DagReader) Read(b []byte) (int, error) { // If no cached buffer, load one @@ -113,6 +154,7 @@ func (dr *DagReader) Read(b []byte) (int, error) { // Attempt to fill bytes from cached buffer n, err := dr.buf.Read(b[total:]) total += n + dr.offset += int64(n) if err != nil { // EOF is expected if err != io.EOF { @@ -133,28 +175,90 @@ func (dr *DagReader) Read(b []byte) (int, error) { } } -/* +func (dr *DagReader) Close() error { + if dr.fctx != nil { + dr.cancel() + } + return nil +} + func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { switch whence { case os.SEEK_SET: - for i := 0; i < len(dr.node.Links); i++ { - nsize := dr.node.Links[i].Size - 8 - if offset > nsize { - offset -= nsize - } else { + if offset < 0 { + return -1, errors.New("Invalid offset") + } + //TODO: this pb should be cached + pb := new(ftpb.Data) + err := proto.Unmarshal(dr.node.Data, pb) + if err != nil { + return -1, err + } + + if offset == 0 { + dr.resetBlockFetch(0) + dr.buf = NewRSNCFromBytes(pb.GetData()) + return 0, nil + } + + left := offset + if int64(len(pb.Data)) > offset { + dr.buf = NewRSNCFromBytes(pb.GetData()[offset:]) + dr.linkPosition = 0 + dr.offset = offset + return offset, nil + } else { + left -= int64(len(pb.Data)) + } + + i := 0 + for ; i < len(pb.Blocksizes); i++ { + if pb.Blocksizes[i] > uint64(left) { break + } else { + left -= int64(pb.Blocksizes[i]) } } - dr.position = i - err := dr.precalcNextBuf() + dr.resetBlockFetch(i) + err = dr.precalcNextBuf() if err != nil { return 0, err } + + n, err := io.CopyN(ioutil.Discard, dr.buf, left) + if err != nil { + fmt.Printf("the copy failed: %s - [%d]\n", err, n) + return -1, err + } + left -= n + if left != 0 { + return -1, errors.New("failed to seek properly") + } + dr.offset = offset + return offset, nil case os.SEEK_CUR: + noffset := dr.offset + offset + return dr.Seek(noffset, os.SEEK_SET) case os.SEEK_END: + pb := new(ftpb.Data) + err := proto.Unmarshal(dr.node.Data, pb) + if err != nil { + return -1, err + } + noffset := int64(pb.GetFilesize()) - offset + return dr.Seek(noffset, os.SEEK_SET) default: return 0, errors.New("invalid whence") } return 0, nil } -*/ + +type readSeekNopCloser struct { + *bytes.Reader +} + +func NewRSNCFromBytes(b []byte) ReadSeekCloser { + return &readSeekNopCloser{bytes.NewReader(b)} +} + +func (r *readSeekNopCloser) Close() error { return nil } diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index de4589f94a..65493f11f9 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -4,6 +4,7 @@ import ( "archive/tar" "bytes" "compress/gzip" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "io" gopath "path" "strings" @@ -114,7 +115,7 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { } i.flush() - reader, err := uio.NewDagReader(dagnode, i.dag) + reader, err := uio.NewDagReader(context.TODO(), dagnode, i.dag) if err != nil { i.emitError(err) return From d8c9389fc8e0136cdf0a786c47376fff290dcb3b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 26 Jan 2015 01:32:26 +0000 Subject: [PATCH 0588/3147] refactor and clean up dagreader This commit was moved from ipfs/go-unixfs@6f736b95241da7e450d4522ecd95a719c2246fc3 --- unixfs/io/dagreader.go | 110 +++++++++++------------------------------ 1 file changed, 29 insertions(+), 81 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 17dbfb41be..300eb7016e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -3,9 +3,7 @@ package io import ( "bytes" "errors" - "fmt" "io" - "io/ioutil" "os" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -14,7 +12,6 @@ import ( mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" ftpb "github.com/jbenet/go-ipfs/unixfs/pb" - u "github.com/jbenet/go-ipfs/util" ) var ErrIsDir = errors.New("this dag node is a directory") @@ -23,8 +20,9 @@ var ErrIsDir = errors.New("this dag node is a directory") type DagReader struct { serv mdag.DAGService node *mdag.Node + pbdata *ftpb.Data buf ReadSeekCloser - fetchChan <-chan *mdag.Node + promises []mdag.NodeGetter linkPosition int offset int64 @@ -57,15 +55,15 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (Read return nil, ErrIsDir case ftpb.Data_File: fctx, cancel := context.WithCancel(ctx) - fetchChan := serv.GetDAG(fctx, n) + promises := serv.GetDAG(fctx, n) return &DagReader{ - node: n, - serv: serv, - buf: NewRSNCFromBytes(pb.GetData()), - fetchChan: fetchChan, - ctx: ctx, - fctx: fctx, - cancel: cancel, + node: n, + serv: serv, + buf: NewRSNCFromBytes(pb.GetData()), + promises: promises, + ctx: fctx, + cancel: cancel, + pbdata: pb, }, nil case ftpb.Data_Raw: // Raw block will just be a single level, return a byte buffer @@ -78,26 +76,18 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (Read // precalcNextBuf follows the next link in line and loads it from the DAGService, // setting the next buffer to read from func (dr *DagReader) precalcNextBuf() error { - var nxt *mdag.Node - var ok bool - - if dr.fetchChan == nil { - // This panic is appropriate because the select statement - // will not panic if you try and read from a nil channel - // it will simply hang. - panic("fetchChan should NOT be nil") + dr.buf.Close() // Just to make sure + if dr.linkPosition >= len(dr.promises) { + return io.EOF } - select { - case nxt, ok = <-dr.fetchChan: - if !ok { - return io.EOF - } - case <-dr.ctx.Done(): - return dr.ctx.Err() + nxt, err := dr.promises[dr.linkPosition].Get() + if err != nil { + return err } + dr.linkPosition++ pb := new(ftpb.Data) - err := proto.Unmarshal(nxt.Data, pb) + err = proto.Unmarshal(nxt.Data, pb) if err != nil { return err } @@ -107,9 +97,7 @@ func (dr *DagReader) precalcNextBuf() error { // A directory should not exist within a file return ft.ErrInvalidDirLocation case ftpb.Data_File: - //TODO: this *should* work, needs testing first - log.Warning("Running untested code for multilayered indirect FS reads.") - subr, err := NewDagReader(dr.fctx, nxt, dr.serv) + subr, err := NewDagReader(dr.ctx, nxt, dr.serv) if err != nil { return err } @@ -123,32 +111,9 @@ func (dr *DagReader) precalcNextBuf() error { } } -func (dr *DagReader) resetBlockFetch(nlinkpos int) { - dr.cancel() - dr.fetchChan = nil - dr.linkPosition = nlinkpos - - var keys []u.Key - for _, lnk := range dr.node.Links[dr.linkPosition:] { - keys = append(keys, u.Key(lnk.Hash)) - } - - fctx, cancel := context.WithCancel(dr.ctx) - dr.cancel = cancel - dr.fctx = fctx - fch := dr.serv.GetNodes(fctx, keys) - dr.fetchChan = fch -} - // Read reads data from the DAG structured file func (dr *DagReader) Read(b []byte) (int, error) { // If no cached buffer, load one - if dr.buf == nil { - err := dr.precalcNextBuf() - if err != nil { - return 0, err - } - } total := 0 for { // Attempt to fill bytes from cached buffer @@ -176,9 +141,7 @@ func (dr *DagReader) Read(b []byte) (int, error) { } func (dr *DagReader) Close() error { - if dr.fctx != nil { - dr.cancel() - } + dr.cancel() return nil } @@ -188,21 +151,11 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { if offset < 0 { return -1, errors.New("Invalid offset") } - //TODO: this pb should be cached - pb := new(ftpb.Data) - err := proto.Unmarshal(dr.node.Data, pb) - if err != nil { - return -1, err - } - - if offset == 0 { - dr.resetBlockFetch(0) - dr.buf = NewRSNCFromBytes(pb.GetData()) - return 0, nil - } + pb := dr.pbdata left := offset if int64(len(pb.Data)) > offset { + dr.buf.Close() dr.buf = NewRSNCFromBytes(pb.GetData()[offset:]) dr.linkPosition = 0 dr.offset = offset @@ -211,23 +164,22 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { left -= int64(len(pb.Data)) } - i := 0 - for ; i < len(pb.Blocksizes); i++ { + for i := 0; i < len(pb.Blocksizes); i++ { if pb.Blocksizes[i] > uint64(left) { + dr.linkPosition = i break } else { left -= int64(pb.Blocksizes[i]) } } - dr.resetBlockFetch(i) - err = dr.precalcNextBuf() + + err := dr.precalcNextBuf() if err != nil { return 0, err } - n, err := io.CopyN(ioutil.Discard, dr.buf, left) + n, err := dr.buf.Seek(left, os.SEEK_SET) if err != nil { - fmt.Printf("the copy failed: %s - [%d]\n", err, n) return -1, err } left -= n @@ -237,15 +189,11 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { dr.offset = offset return offset, nil case os.SEEK_CUR: + // TODO: be smarter here noffset := dr.offset + offset return dr.Seek(noffset, os.SEEK_SET) case os.SEEK_END: - pb := new(ftpb.Data) - err := proto.Unmarshal(dr.node.Data, pb) - if err != nil { - return -1, err - } - noffset := int64(pb.GetFilesize()) - offset + noffset := int64(dr.pbdata.GetFilesize()) - offset return dr.Seek(noffset, os.SEEK_SET) default: return 0, errors.New("invalid whence") From d1b32ff30b99f13fcb133bfad340b29fe803dcf5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Jan 2015 01:28:41 +0000 Subject: [PATCH 0589/3147] address concerns from PR This commit was moved from ipfs/go-unixfs@7c05bd61c2b26075e7ee351e4ca2328d32d221b6 --- unixfs/io/dagmodifier_test.go | 8 +++---- unixfs/io/dagreader.go | 43 ++++++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 52ff5853b0..23f2a0afa3 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -39,7 +39,7 @@ func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Nod t.Fatal(err) } - dr, err := NewDagReader(context.TODO(), node, dserv) + dr, err := NewDagReader(context.Background(), node, dserv) if err != nil { t.Fatal(err) } @@ -76,7 +76,7 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) t.Fatal(err) } - rd, err := NewDagReader(context.TODO(), nd, dm.dagserv) + rd, err := NewDagReader(context.Background(), nd, dm.dagserv) if err != nil { t.Fatal(err) } @@ -174,7 +174,7 @@ func TestMultiWrite(t *testing.T) { t.Fatal(err) } - read, err := NewDagReader(context.TODO(), nd, dserv) + read, err := NewDagReader(context.Background(), nd, dserv) if err != nil { t.Fatal(err) } @@ -216,7 +216,7 @@ func TestMultiWriteCoal(t *testing.T) { t.Fatal(err) } - read, err := NewDagReader(context.TODO(), nd, dserv) + read, err := NewDagReader(context.Background(), nd, dserv) if err != nil { t.Fatal(err) } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 300eb7016e..8d1c875070 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -18,19 +18,31 @@ var ErrIsDir = errors.New("this dag node is a directory") // DagReader provides a way to easily read the data contained in a dag. type DagReader struct { - serv mdag.DAGService - node *mdag.Node - pbdata *ftpb.Data - buf ReadSeekCloser - promises []mdag.NodeGetter + serv mdag.DAGService + + // the node being read + node *mdag.Node + + // cached protobuf structure from node.Data + pbdata *ftpb.Data + + // the current data buffer to be read from + // will either be a bytes.Reader or a child DagReader + buf ReadSeekCloser + + // NodeGetters for each of 'nodes' child links + promises []mdag.NodeGetter + + // the index of the child link currently being read from linkPosition int - offset int64 + + // current offset for the read head within the 'file' + offset int64 // Our context ctx context.Context - // Context for children - fctx context.Context + // context cancel for children cancel func() } @@ -145,6 +157,8 @@ func (dr *DagReader) Close() error { return nil } +// Seek implements io.Seeker, and will seek to a given offset in the file +// interface matches standard unix seek func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { switch whence { case os.SEEK_SET: @@ -152,18 +166,26 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { return -1, errors.New("Invalid offset") } + // Grab cached protobuf object (solely to make code look cleaner) pb := dr.pbdata + + // left represents the number of bytes remaining to seek to (from beginning) left := offset if int64(len(pb.Data)) > offset { + // Close current buf to close potential child dagreader dr.buf.Close() dr.buf = NewRSNCFromBytes(pb.GetData()[offset:]) + + // start reading links from the beginning dr.linkPosition = 0 dr.offset = offset return offset, nil } else { + // skip past root block data left -= int64(len(pb.Data)) } + // iterate through links and find where we need to be for i := 0; i < len(pb.Blocksizes); i++ { if pb.Blocksizes[i] > uint64(left) { dr.linkPosition = i @@ -173,15 +195,19 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { } } + // start sub-block request err := dr.precalcNextBuf() if err != nil { return 0, err } + // set proper offset within child readseeker n, err := dr.buf.Seek(left, os.SEEK_SET) if err != nil { return -1, err } + + // sanity left -= n if left != 0 { return -1, errors.New("failed to seek properly") @@ -201,6 +227,7 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { return 0, nil } +// readSeekNopCloser wraps a bytes.Reader to implement ReadSeekCloser type readSeekNopCloser struct { *bytes.Reader } From fabb9a99e0ffe4f03a5d0a9cf6c54419fdded45f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 26 Jan 2015 19:12:12 -0800 Subject: [PATCH 0590/3147] dropped down log.Errors This commit was moved from ipfs/go-unixfs@6e12a49162f6bae7dabd39b0640aa5e2a730f569 --- unixfs/io/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go index 4683a157ec..e155d8b385 100644 --- a/unixfs/io/dagmodifier.go +++ b/unixfs/io/dagmodifier.go @@ -147,7 +147,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset uint64) (int, error) { n := &mdag.Node{Data: ft.WrapData(sb)} _, err := dm.dagserv.Add(n) if err != nil { - log.Errorf("Failed adding node to DAG service: %s", err) + log.Warningf("Failed adding node to DAG service: %s", err) return 0, err } lnk, err := mdag.MakeLink(n) From 68cf821460d524f846122c7e5fb0644bc4bdad60 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 26 Jan 2015 19:12:12 -0800 Subject: [PATCH 0591/3147] dropped down log.Errors This commit was moved from ipfs/go-ipfs-routing@de9e2da32d77d2b3c8ff5aedae4493954582a572 --- routing/dht/dht.go | 12 ++++++------ routing/dht/dht_bootstrap.go | 4 ++-- routing/dht/dht_net.go | 8 ++++---- routing/dht/dht_test.go | 2 +- routing/dht/handlers.go | 10 +++++----- routing/dht/lookup.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/records.go | 2 +- routing/dht/routing.go | 14 +++++++------- routing/kbucket/table.go | 2 +- routing/record/validation.go | 6 +++--- 11 files changed, 32 insertions(+), 32 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e66517072c..42e0cd7b7a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -151,7 +151,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) erro // // only share WAN-friendly addresses ?? // pi.Addrs = addrutil.WANShareableAddrs(pi.Addrs) if len(pi.Addrs) < 1 { - log.Errorf("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, u.Key(key), pi.Addrs) + log.Infof("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, u.Key(key), pi.Addrs) return fmt.Errorf("no known addresses for self. cannot put provider.") } @@ -185,7 +185,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, // make sure record is valid. err = dht.verifyRecordOnline(ctx, record) if err != nil { - log.Error("Received invalid record!") + log.Info("Received invalid record! (discarded)") return nil, nil, err } return record.GetValue(), nil, nil @@ -235,7 +235,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { if u.Debug { err = dht.verifyRecordLocally(rec) if err != nil { - log.Errorf("local record verify failed: %s", err) + log.Debugf("local record verify failed: %s (discarded)", err) return nil, err } } @@ -248,7 +248,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { func (dht *IpfsDHT) getOwnPrivateKey() (ci.PrivKey, error) { sk := dht.peerstore.PrivKey(dht.self) if sk == nil { - log.Errorf("%s dht cannot get own private key!", dht.self) + log.Warningf("%s dht cannot get own private key!", dht.self) return nil, fmt.Errorf("cannot get private key to sign record!") } return sk, nil @@ -323,7 +323,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ // == to self? thats bad for _, p := range closer { if p == dht.self { - log.Error("Attempted to return self! this shouldnt happen...") + log.Debug("Attempted to return self! this shouldnt happen...") return nil } } @@ -370,7 +370,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { ctx, _ := context.WithTimeout(dht.Context(), time.Second*5) _, err := dht.Ping(ctx, p) if err != nil { - log.Errorf("Ping error: %s", err) + log.Debugf("Ping error: %s", err) } } case <-dht.Closing(): diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index c91df05e5f..f2cc50f9a7 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -76,7 +76,7 @@ func (dht *IpfsDHT) BootstrapOnSignal(cfg BootstrapConfig, signal <-chan time.Ti ctx := dht.Context() if err := dht.runBootstrap(ctx, cfg); err != nil { - log.Error(err) + log.Warning(err) // A bootstrapping error is important to notice but not fatal. } }) @@ -117,7 +117,7 @@ func (dht *IpfsDHT) runBootstrap(ctx context.Context, cfg BootstrapConfig) error // woah, actually found a peer with that ID? this shouldn't happen normally // (as the ID we use is not a real ID). this is an odd error worth logging. err := fmt.Errorf("Bootstrap peer error: Actually FOUND peer. (%s, %s)", id, p) - log.Errorf("%s", err) + log.Warningf("%s", err) merr = append(merr, err) } } diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index c8b6b66ebc..15b0b63d82 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -31,7 +31,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // receive msg pmes := new(pb.Message) if err := r.ReadMsg(pmes); err != nil { - log.Errorf("Error unmarshaling data: %s", err) + log.Debugf("Error unmarshaling data: %s", err) return } @@ -41,14 +41,14 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // get handler for this msg type. handler := dht.handlerForMsgType(pmes.GetType()) if handler == nil { - log.Error("got back nil handler from handlerForMsgType") + log.Debug("got back nil handler from handlerForMsgType") return } // dispatch handler. rpmes, err := handler(ctx, mPeer, pmes) if err != nil { - log.Errorf("handle message error: %s", err) + log.Debugf("handle message error: %s", err) return } @@ -60,7 +60,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // send out response msg if err := w.WriteMsg(rpmes); err != nil { - log.Errorf("send response error: %s", err) + log.Debugf("send response error: %s", err) return } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2d8494b65c..00597b016e 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -262,7 +262,7 @@ func waitForWellFormedTables(t *testing.T, dhts []*IpfsDHT, minPeers, avgPeers i for { select { case <-timeoutA: - log.Error("did not reach well-formed routing tables by %s", timeout) + log.Errorf("did not reach well-formed routing tables by %s", timeout) return false // failed case <-time.After(5 * time.Millisecond): if checkTables() { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 28df3aea6b..6376dbcbad 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -78,7 +78,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess rec := new(pb.Record) err := proto.Unmarshal(byts, rec) if err != nil { - log.Error("Failed to unmarshal dht record from datastore") + log.Debug("Failed to unmarshal dht record from datastore") return nil, err } @@ -119,7 +119,7 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess dskey := u.Key(pmes.GetKey()).DsKey() if err := dht.verifyRecordLocally(pmes.GetRecord()); err != nil { - log.Errorf("Bad dht record in PUT from: %s. %s", u.Key(pmes.GetRecord().GetAuthor()), err) + log.Debugf("Bad dht record in PUT from: %s. %s", u.Key(pmes.GetRecord().GetAuthor()), err) return nil, err } @@ -181,7 +181,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. // check if we have this value, to add ourselves as provider. has, err := dht.datastore.Has(key.DsKey()) if err != nil && err != ds.ErrNotFound { - log.Errorf("unexpected datastore error: %v\n", err) + log.Debugf("unexpected datastore error: %v\n", err) has = false } @@ -226,12 +226,12 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M if pi.ID != p { // we should ignore this provider reccord! not from originator. // (we chould sign them and check signature later...) - log.Errorf("handleAddProvider received provider %s from %s. Ignore.", pi.ID, p) + log.Debugf("handleAddProvider received provider %s from %s. Ignore.", pi.ID, p) continue } if len(pi.Addrs) < 1 { - log.Errorf("%s got no valid addresses for provider %s. Ignore.", dht.self, p) + log.Debugf("%s got no valid addresses for provider %s. Ignore.", dht.self, p) continue } diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index ea1552ba7b..6e0acd9fa7 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -51,7 +51,7 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key) (<-chan peer closer, err := dht.closerPeersSingle(ctx, key, p) if err != nil { - log.Errorf("error getting closer peers: %s", err) + log.Debugf("error getting closer peers: %s", err) return nil, err } diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 6802341027..efa72f6ee2 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -84,7 +84,7 @@ func (m *Message_Peer) Addresses() []ma.Multiaddr { for i, addr := range m.Addrs { maddrs[i], err = ma.NewMultiaddrBytes(addr) if err != nil { - log.Error("error decoding Multiaddr for peer: %s", m.GetId()) + log.Debugf("error decoding Multiaddr for peer: %s", m.GetId()) continue } } diff --git a/routing/dht/records.go b/routing/dht/records.go index 14d73b6c6d..0bc7011530 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -46,7 +46,7 @@ func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKe pk, err = ci.UnmarshalPublicKey(val) if err != nil { - log.Errorf("Failed to unmarshal public key: %s", err) + log.Debugf("Failed to unmarshal public key: %s", err) return nil, err } return pk, nil diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e04803ed2e..ade41b82e5 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -45,7 +45,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error rec, err := record.MakePutRecord(sk, key, value) if err != nil { - log.Error("Creation of record failed!") + log.Debug("Creation of record failed!") return err } @@ -61,7 +61,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error defer wg.Done() err := dht.putValueToPeer(ctx, p, key, rec) if err != nil { - log.Errorf("failed putting value to peer: %s", err) + log.Debugf("failed putting value to peer: %s", err) } }(p) } @@ -142,7 +142,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { log.Debugf("putProvider(%s, %s)", key, p) err := dht.putProvider(ctx, p, string(key)) if err != nil { - log.Error(err) + log.Debug(err) } }(p) } @@ -214,7 +214,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co select { case peerOut <- prov: case <-ctx.Done(): - log.Error("Context timed out sending more providers") + log.Debug("Context timed out sending more providers") return nil, ctx.Err() } } @@ -240,7 +240,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co peers := dht.routingTable.ListPeers() _, err := query.Run(ctx, peers) if err != nil { - log.Errorf("Query error: %s", err) + log.Debugf("Query error: %s", err) notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ Type: notif.QueryError, Extra: err.Error(), @@ -265,7 +265,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er // Sanity... for _, p := range peers { if p == id { - log.Error("Found target peer in list of closest peers...") + log.Debug("Found target peer in list of closest peers...") return dht.peerstore.PeerInfo(p), nil } } @@ -370,7 +370,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< // this does no error checking go func() { if _, err := query.Run(ctx, peers); err != nil { - log.Error(err) + log.Debug(err) } // close the peerchan channel when done. diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 8bc825f954..dc5fb3d6fd 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -135,7 +135,7 @@ func (rt *RoutingTable) NearestPeer(id ID) peer.ID { return peers[0] } - log.Errorf("NearestPeer: Returning nil, table size = %d", rt.Size()) + log.Debugf("NearestPeer: Returning nil, table size = %d", rt.Size()) return "" } diff --git a/routing/record/validation.go b/routing/record/validation.go index bd09135258..9519ebd3f2 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -34,11 +34,11 @@ func (v Validator) VerifyRecord(r *pb.Record, pk ci.PubKey) error { blob := RecordBlobForSig(r) ok, err := pk.Verify(blob, r.GetSignature()) if err != nil { - log.Error("Signature verify failed.") + log.Info("Signature verify failed. (ignored)") return err } if !ok { - log.Error("dht found a forged record! (ignored)") + log.Info("dht found a forged record! (ignored)") return ErrBadRecord } @@ -51,7 +51,7 @@ func (v Validator) VerifyRecord(r *pb.Record, pk ci.PubKey) error { fnc, ok := v[parts[1]] if !ok { - log.Errorf("Unrecognized key prefix: %s", parts[1]) + log.Infof("Unrecognized key prefix: %s", parts[1]) return ErrInvalidRecordType } From f99b907949b0019b221c1496aed50e80d3000017 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Jan 2015 07:41:51 +0000 Subject: [PATCH 0592/3147] off by one error seeking to end of single block file This commit was moved from ipfs/go-unixfs@f0f00316759829fd97a3f5a8a7e7a8bea79471d4 --- unixfs/io/dagreader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8d1c875070..15e1b6f6e8 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -171,7 +171,7 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { // left represents the number of bytes remaining to seek to (from beginning) left := offset - if int64(len(pb.Data)) > offset { + if int64(len(pb.Data)) >= offset { // Close current buf to close potential child dagreader dr.buf.Close() dr.buf = NewRSNCFromBytes(pb.GetData()[offset:]) From a71018f40d38747f1fe0ad6c1eac38827cb1b5eb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 26 Jan 2015 20:48:00 -0500 Subject: [PATCH 0593/3147] feat(routing.grandcentral): skeleton fixes breakages: - peer.Peer -> peer.ID - peer.X -> peer.PeerInfo - netmsg -> p2p streams This commit was moved from ipfs/go-ipfs-routing@c46e89cc2fffc619758573809ab07b9a18cc59ef --- routing/grandcentral/client.go | 121 +++++++++++++++++++++ routing/grandcentral/proxy/loopback.go | 53 ++++++++++ routing/grandcentral/proxy/standard.go | 73 +++++++++++++ routing/grandcentral/server.go | 140 +++++++++++++++++++++++++ 4 files changed, 387 insertions(+) create mode 100644 routing/grandcentral/client.go create mode 100644 routing/grandcentral/proxy/loopback.go create mode 100644 routing/grandcentral/proxy/standard.go create mode 100644 routing/grandcentral/server.go diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go new file mode 100644 index 0000000000..ccf0bd199a --- /dev/null +++ b/routing/grandcentral/client.go @@ -0,0 +1,121 @@ +package grandcentral + +import ( + "bytes" + "time" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + inet "github.com/jbenet/go-ipfs/p2p/net" + peer "github.com/jbenet/go-ipfs/p2p/peer" + routing "github.com/jbenet/go-ipfs/routing" + pb "github.com/jbenet/go-ipfs/routing/dht/pb" + proxy "github.com/jbenet/go-ipfs/routing/grandcentral/proxy" + eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" + u "github.com/jbenet/go-ipfs/util" + errors "github.com/jbenet/go-ipfs/util/debugerror" +) + +var log = eventlog.Logger("grandcentral") + +var ErrTODO = errors.New("TODO") + +type Client struct { + peerstore peer.Peerstore + proxy proxy.Proxy + dialer inet.Network + local peer.ID +} + +// TODO take in datastore/cache +func NewClient(d inet.Network, px proxy.Proxy, ps peer.Peerstore, local peer.ID) (*Client, error) { + return &Client{ + dialer: d, + proxy: px, + local: local, + peerstore: ps, + }, nil +} + +func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { + ch := make(chan peer.PeerInfo) + go func() { + defer close(ch) + request := pb.NewMessage(pb.Message_GET_PROVIDERS, string(k), 0) + response, err := c.proxy.SendRequest(ctx, request) + if err != nil { + log.Error(errors.Wrap(err)) + return + } + for _, p := range pb.PBPeersToPeerInfos(response.GetProviderPeers()) { + select { + case <-ctx.Done(): + log.Error(errors.Wrap(ctx.Err())) + return + case ch <- p: + } + } + }() + return ch +} + +func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte) error { + r, err := makeRecord(c.peerstore, c.local, k, v) + if err != nil { + return err + } + pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(k), 0) + pmes.Record = r + return c.proxy.SendMessage(ctx, pmes) // wrap to hide the remote +} + +func (c *Client) GetValue(ctx context.Context, k u.Key) ([]byte, error) { + msg := pb.NewMessage(pb.Message_GET_VALUE, string(k), 0) + response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote + if err != nil { + return nil, errors.Wrap(err) + } + return response.Record.GetValue(), nil +} + +func (c *Client) Provide(ctx context.Context, k u.Key) error { + msg := pb.NewMessage(pb.Message_ADD_PROVIDER, string(k), 0) + // TODO wrap this to hide the dialer and the local/remote peers + msg.ProviderPeers = pb.PeerInfosToPBPeers(c.dialer, []peer.PeerInfo{peer.PeerInfo{ID: c.local}}) // FIXME how is connectedness defined for the local node + return c.proxy.SendMessage(ctx, msg) // TODO wrap to hide remote +} + +func (c *Client) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { + request := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) + response, err := c.proxy.SendRequest(ctx, request) // hide remote + if err != nil { + return peer.PeerInfo{}, errors.Wrap(err) + } + for _, p := range pb.PBPeersToPeerInfos(response.GetCloserPeers()) { + if p.ID == id { + return p, nil + } + } + return peer.PeerInfo{}, errors.New("could not find peer") +} + +// creates and signs a record for the given key/value pair +func makeRecord(ps peer.Peerstore, p peer.ID, k u.Key, v []byte) (*pb.Record, error) { + blob := bytes.Join([][]byte{[]byte(k), v, []byte(p)}, []byte{}) + sig, err := ps.PrivKey(p).Sign(blob) + if err != nil { + return nil, err + } + return &pb.Record{ + Key: proto.String(string(k)), + Value: v, + Author: proto.String(string(p)), + Signature: sig, + }, nil +} + +func (c *Client) Ping(ctx context.Context, id peer.ID) (time.Duration, error) { + return time.Nanosecond, errors.New("grandcentral routing does not support the ping method") +} + +var _ routing.IpfsRouting = &Client{} diff --git a/routing/grandcentral/proxy/loopback.go b/routing/grandcentral/proxy/loopback.go new file mode 100644 index 0000000000..59a414df0c --- /dev/null +++ b/routing/grandcentral/proxy/loopback.go @@ -0,0 +1,53 @@ +package proxy + +import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + inet "github.com/jbenet/go-ipfs/p2p/net" + peer "github.com/jbenet/go-ipfs/p2p/peer" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" + errors "github.com/jbenet/go-ipfs/util/debugerror" +) + +// RequestHandler handles routing requests locally +type RequestHandler interface { + HandleRequest(ctx context.Context, p peer.ID, m *dhtpb.Message) *dhtpb.Message +} + +// Loopback forwards requests to a local handler +type Loopback struct { + Handler RequestHandler + Local peer.ID +} + +// SendMessage intercepts local requests, forwarding them to a local handler +func (lb *Loopback) SendMessage(ctx context.Context, m *dhtpb.Message) error { + response := lb.Handler.HandleRequest(ctx, lb.Local, m) + if response != nil { + log.Warning("loopback handler returned unexpected message") + } + return nil +} + +// SendRequest intercepts local requests, forwarding them to a local handler +func (lb *Loopback) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { + return lb.Handler.HandleRequest(ctx, lb.Local, m), nil +} + +func (lb *Loopback) handleNewStream(s inet.Stream) { + defer s.Close() + pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + var incoming dhtpb.Message + if err := pbr.ReadMsg(&incoming); err != nil { + log.Error(errors.Wrap(err)) + return + } + ctx := context.TODO() + outgoing := lb.Handler.HandleRequest(ctx, s.Conn().RemotePeer(), &incoming) + + pbw := ggio.NewDelimitedWriter(s) + + if err := pbw.WriteMsg(outgoing); err != nil { + return // TODO logerr + } +} diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go new file mode 100644 index 0000000000..629f619164 --- /dev/null +++ b/routing/grandcentral/proxy/standard.go @@ -0,0 +1,73 @@ +package proxy + +import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + host "github.com/jbenet/go-ipfs/p2p/host" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + inet "github.com/jbenet/go-ipfs/p2p/net" + peer "github.com/jbenet/go-ipfs/p2p/peer" + dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" + errors "github.com/jbenet/go-ipfs/util/debugerror" + eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" +) + +var log = eventlog.Logger("proxy") + +type Proxy interface { + SendMessage(ctx context.Context, m *dhtpb.Message) error + SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) +} + +type standard struct { + Host host.Host + Remote peer.ID +} + +func Standard(h host.Host, remote peer.ID) Proxy { + return &standard{h, remote} +} + +const ProtocolGCR = "/ipfs/grandcentral" + +func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { + if err := px.Host.Connect(ctx, peer.PeerInfo{ID: px.Remote}); err != nil { + return err + } + s, err := px.Host.NewStream(ProtocolGCR, px.Remote) + if err != nil { + return err + } + defer s.Close() + pbw := ggio.NewDelimitedWriter(s) + if err := pbw.WriteMsg(m); err != nil { + return errors.Wrap(err) + } + return nil +} + +func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { + if err := px.Host.Connect(ctx, peer.PeerInfo{ID: px.Remote}); err != nil { + return nil, err + } + s, err := px.Host.NewStream(ProtocolGCR, px.Remote) + if err != nil { + return nil, err + } + defer s.Close() + r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) + w := ggio.NewDelimitedWriter(s) + if err := w.WriteMsg(m); err != nil { + return nil, err + } + + var reply dhtpb.Message + if err := r.ReadMsg(&reply); err != nil { + return nil, err + } + // need ctx expiration? + if &reply == nil { + return nil, errors.New("no response to request") + } + return &reply, nil +} + diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go new file mode 100644 index 0000000000..f51b719171 --- /dev/null +++ b/routing/grandcentral/server.go @@ -0,0 +1,140 @@ +package grandcentral + +import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + inet "github.com/jbenet/go-ipfs/p2p/net" + peer "github.com/jbenet/go-ipfs/p2p/peer" + dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" + proxy "github.com/jbenet/go-ipfs/routing/grandcentral/proxy" + util "github.com/jbenet/go-ipfs/util" + errors "github.com/jbenet/go-ipfs/util/debugerror" +) + +// Server handles routing queries using a database backend +type Server struct { + local peer.ID + datastore datastore.ThreadSafeDatastore + dialer inet.Network + peerstore peer.Peerstore + *proxy.Loopback // so server can be injected into client +} + +// NewServer creates a new GrandCentral routing Server +func NewServer(ds datastore.ThreadSafeDatastore, d inet.Network, ps peer.Peerstore, local peer.ID) (*Server, error) { + s := &Server{local, ds, d, ps, nil} + s.Loopback = &proxy.Loopback{ + Handler: s, + Local: local, + } + return s, nil +} + +// HandleLocalRequest implements the proxy.RequestHandler interface. This is +// where requests are received from the outside world. +func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Message) *dhtpb.Message { + _, response := s.handleMessage(ctx, p, req) // ignore response peer. it's local. + return response +} + +// TODO extract backend. backend can be implemented with whatever database we desire +func (s *Server) handleMessage( + ctx context.Context, p peer.ID, req *dhtpb.Message) (peer.ID, *dhtpb.Message) { + + // FIXME threw everything into this switch statement to get things going. + // Once each operation is well-defined, extract pluggable backend so any + // database may be used. + + var response = dhtpb.NewMessage(req.GetType(), req.GetKey(), req.GetClusterLevel()) + switch req.GetType() { + + case dhtpb.Message_GET_VALUE: + dskey := util.Key(req.GetKey()).DsKey() + val, err := s.datastore.Get(dskey) + if err != nil { + log.Error(errors.Wrap(err)) + return "", nil + } + rawRecord, ok := val.([]byte) + if !ok { + log.Errorf("datastore had non byte-slice value for %v", dskey) + return "", nil + } + if err := proto.Unmarshal(rawRecord, response.Record); err != nil { + log.Error("failed to unmarshal dht record from datastore") + return "", nil + } + // TODO before merging: if we know any providers for the requested value, return those. + return p, response + + case dhtpb.Message_PUT_VALUE: + // TODO before merging: verifyRecord(req.GetRecord()) + data, err := proto.Marshal(req.GetRecord()) + if err != nil { + log.Error(err) + return "", nil + } + dskey := util.Key(req.GetKey()).DsKey() + if err := s.datastore.Put(dskey, data); err != nil { + log.Error(err) + return "", nil + } + return p, req // TODO before merging: verify that we should return record + + case dhtpb.Message_FIND_NODE: + p := s.peerstore.PeerInfo(peer.ID(req.GetKey())) + response.CloserPeers = dhtpb.PeerInfosToPBPeers(s.dialer, []peer.PeerInfo{p}) + return p.ID, response + + case dhtpb.Message_ADD_PROVIDER: + for _, provider := range req.GetProviderPeers() { + providerID := peer.ID(provider.GetId()) + if providerID != p { + log.Errorf("provider message came from third-party %s", p) + continue + } + for _, maddr := range provider.Addresses() { + // FIXME do we actually want to store to peerstore + s.peerstore.AddAddress(p, maddr) + } + } + var providers []dhtpb.Message_Peer + pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", req.GetKey()}) + if v, err := s.datastore.Get(pkey); err == nil { + if protopeers, ok := v.([]dhtpb.Message_Peer); ok { + providers = append(providers, protopeers...) + } + } + if err := s.datastore.Put(pkey, providers); err != nil { + log.Error(err) + return "", nil + } + return "", nil + + case dhtpb.Message_GET_PROVIDERS: + dskey := util.Key(req.GetKey()).DsKey() + exists, err := s.datastore.Has(dskey) + if err == nil && exists { + response.ProviderPeers = append(response.ProviderPeers, dhtpb.PeerInfosToPBPeers(s.dialer, []peer.PeerInfo{peer.PeerInfo{ID: s.local}})...) + } + // FIXME(btc) is this how we want to persist this data? + pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", req.GetKey()}) + if v, err := s.datastore.Get(pkey); err == nil { + if protopeers, ok := v.([]dhtpb.Message_Peer); ok { + for _, p := range protopeers { + response.ProviderPeers = append(response.ProviderPeers, &p) + } + } + } + return p, response + + case dhtpb.Message_PING: + return p, req + default: + } + return "", nil +} + +var _ proxy.RequestHandler = &Server{} +var _ proxy.Proxy = &Server{} From 141e8034753159f34fc04e7f032eb4eb443411a0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 26 Jan 2015 20:13:11 +0000 Subject: [PATCH 0594/3147] change ipns resolve/publish to store raw keys, not b58 encoded This commit was moved from ipfs/go-namesys@3173118e99cb0332d57ddd3df403e3632284916f --- namesys/dns.go | 7 +++++-- namesys/interface.go | 6 ++++-- namesys/namesys.go | 10 ++++++---- namesys/proquint.go | 6 ++++-- namesys/publisher.go | 11 +++++------ namesys/resolve_test.go | 9 +++++---- namesys/routing.go | 5 ++--- 7 files changed, 31 insertions(+), 23 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 881979930a..2fb477930e 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -3,9 +3,12 @@ package namesys import ( "net" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + + u "github.com/jbenet/go-ipfs/util" ) // DNSResolver implements a Resolver on DNS domains @@ -22,7 +25,7 @@ func (r *DNSResolver) CanResolve(name string) bool { // Resolve implements Resolver // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) Resolve(name string) (string, error) { +func (r *DNSResolver) Resolve(ctx context.Context, name string) (u.Key, error) { log.Info("DNSResolver resolving %v", name) txt, err := net.LookupTXT(name) if err != nil { @@ -39,7 +42,7 @@ func (r *DNSResolver) Resolve(name string) (string, error) { if err != nil { continue } - return t, nil + return u.Key(chk), nil } return "", ErrResolveFailed diff --git a/namesys/interface.go b/namesys/interface.go index c2e39afec0..f2e4f104df 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -3,7 +3,9 @@ package namesys import ( "errors" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ci "github.com/jbenet/go-ipfs/p2p/crypto" + u "github.com/jbenet/go-ipfs/util" ) // ErrResolveFailed signals an error when attempting to resolve. @@ -28,7 +30,7 @@ type NameSystem interface { type Resolver interface { // Resolve looks up a name, and returns the value previously published. - Resolve(name string) (value string, err error) + Resolve(ctx context.Context, name string) (value u.Key, err error) // CanResolve checks whether this Resolver can resolve a name CanResolve(name string) bool @@ -39,5 +41,5 @@ type Publisher interface { // Publish establishes a name-value mapping. // TODO make this not PrivKey specific. - Publish(name ci.PrivKey, value string) error + Publish(ctx context.Context, name ci.PrivKey, value u.Key) error } diff --git a/namesys/namesys.go b/namesys/namesys.go index cc11d9ddc7..eddae747d1 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,8 +1,10 @@ package namesys import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" + u "github.com/jbenet/go-ipfs/util" ) // ipnsNameSystem implements IPNS naming. @@ -32,10 +34,10 @@ func NewNameSystem(r routing.IpfsRouting) NameSystem { } // Resolve implements Resolver -func (ns *ipns) Resolve(name string) (string, error) { +func (ns *ipns) Resolve(ctx context.Context, name string) (u.Key, error) { for _, r := range ns.resolvers { if r.CanResolve(name) { - return r.Resolve(name) + return r.Resolve(ctx, name) } } return "", ErrResolveFailed @@ -52,6 +54,6 @@ func (ns *ipns) CanResolve(name string) bool { } // Publish implements Publisher -func (ns *ipns) Publish(name ci.PrivKey, value string) error { - return ns.publisher.Publish(name, value) +func (ns *ipns) Publish(ctx context.Context, name ci.PrivKey, value u.Key) error { + return ns.publisher.Publish(ctx, name, value) } diff --git a/namesys/proquint.go b/namesys/proquint.go index 89bbc4a44c..24e97529d9 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -3,7 +3,9 @@ package namesys import ( "errors" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proquint "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" + u "github.com/jbenet/go-ipfs/util" ) type ProquintResolver struct{} @@ -15,10 +17,10 @@ func (r *ProquintResolver) CanResolve(name string) bool { } // Resolve implements Resolver. Decodes the proquint string. -func (r *ProquintResolver) Resolve(name string) (string, error) { +func (r *ProquintResolver) Resolve(ctx context.Context, name string) (u.Key, error) { ok := r.CanResolve(name) if !ok { return "", errors.New("not a valid proquint string") } - return string(proquint.Decode(name)), nil + return u.Key(proquint.Decode(name)), nil } diff --git a/namesys/publisher.go b/namesys/publisher.go index 75cccf9e45..8a82c7947c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -37,17 +37,16 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { // Publish implements Publisher. Accepts a keypair and a value, // and publishes it out to the routing system -func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { +func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) error { log.Debugf("namesys: Publish %s", value) // validate `value` is a ref (multihash) - _, err := mh.FromB58String(value) + _, err := mh.FromB58String(value.Pretty()) if err != nil { log.Errorf("hash cast failed: %s", value) return fmt.Errorf("publish value must be str multihash. %v", err) } - ctx := context.TODO() data, err := createRoutingEntryData(k, value) if err != nil { log.Error("entry creation failed.") @@ -65,7 +64,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key - timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*4)) + timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) err = p.routing.PutValue(timectx, namekey, pkbytes) if err != nil { return err @@ -75,7 +74,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) - timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*4)) + timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*10)) err = p.routing.PutValue(timectx, ipnskey, data) if err != nil { return err @@ -84,7 +83,7 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error { return nil } -func createRoutingEntryData(pk ci.PrivKey, val string) ([]byte, error) { +func createRoutingEntryData(pk ci.PrivKey, val u.Key) ([]byte, error) { entry := new(pb.IpnsEntry) entry.Value = []byte(val) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 8e3214dfe5..e349a0aa9f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -1,6 +1,7 @@ package namesys import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "testing" mockrouting "github.com/jbenet/go-ipfs/routing/mock" @@ -19,13 +20,13 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - err = publisher.Publish(privk, "Hello") + err = publisher.Publish(context.Background(), privk, "Hello") if err == nil { t.Fatal("should have errored out when publishing a non-multihash val") } - h := u.Key(u.Hash([]byte("Hello"))).Pretty() - err = publisher.Publish(privk, h) + h := u.Key(u.Hash([]byte("Hello"))) + err = publisher.Publish(context.Background(), privk, h) if err != nil { t.Fatal(err) } @@ -36,7 +37,7 @@ func TestRoutingResolve(t *testing.T) { } pkhash := u.Hash(pubkb) - res, err := resolver.Resolve(u.Key(pkhash).Pretty()) + res, err := resolver.Resolve(context.Background(), u.Key(pkhash).Pretty()) if err != nil { t.Fatal(err) } diff --git a/namesys/routing.go b/namesys/routing.go index b57d2c6015..a66565db69 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -38,9 +38,8 @@ func (r *routingResolver) CanResolve(name string) bool { // Resolve implements Resolver. Uses the IPFS routing system to resolve SFS-like // names. -func (r *routingResolver) Resolve(name string) (string, error) { +func (r *routingResolver) Resolve(ctx context.Context, name string) (u.Key, error) { log.Debugf("RoutingResolve: '%s'", name) - ctx := context.TODO() hash, err := mh.FromB58String(name) if err != nil { log.Warning("RoutingResolve: bad input hash: [%s]\n", name) @@ -88,5 +87,5 @@ func (r *routingResolver) Resolve(name string) (string, error) { } // ok sig checks out. this is a valid name. - return string(entry.GetValue()), nil + return u.Key(entry.GetValue()), nil } From 181f1c21fccfb7957ceb54dca2c192d82ecf347d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 28 Jan 2015 05:18:39 +0000 Subject: [PATCH 0595/3147] implement path type This commit was moved from ipfs/go-path@06d427101bccc0ebf66ecbb11495dfa24034cdba --- path/path.go | 102 ++++++----------------------------------------- path/resolver.go | 95 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 90 deletions(-) create mode 100644 path/resolver.go diff --git a/path/path.go b/path/path.go index 35ea367054..bfbef72348 100644 --- a/path/path.go +++ b/path/path.go @@ -1,104 +1,26 @@ -// package path implements utilities for resolving paths within ipfs. package path import ( - "fmt" "path" "strings" - - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - merkledag "github.com/jbenet/go-ipfs/merkledag" - u "github.com/jbenet/go-ipfs/util" ) -var log = u.Logger("path") - -// Resolver provides path resolution to IPFS -// It has a pointer to a DAGService, which is uses to resolve nodes. -type Resolver struct { - DAG merkledag.DAGService -} - -// ResolvePath fetches the node for given path. It uses the first -// path component as a hash (key) of the first node, then resolves -// all other components walking the links, with ResolveLinks. -func (s *Resolver) ResolvePath(fpath string) (*merkledag.Node, error) { - log.Debugf("Resolve: '%s'", fpath) - fpath = path.Clean(fpath) - - if strings.HasPrefix(fpath, "/ipfs/") { - fpath = fpath[6:] - } - - parts := strings.Split(fpath, "/") - - // skip over empty first elem - if len(parts[0]) == 0 { - parts = parts[1:] - } - - // if nothing, bail. - if len(parts) == 0 { - return nil, fmt.Errorf("ipfs path must contain at least one component") - } +// TODO: debate making this a private struct wrapped in a public interface +// would allow us to control creation, and cache segments. +type Path string - // first element in the path is a b58 hash (for now) - h, err := mh.FromB58String(parts[0]) - if err != nil { - log.Debug("given path element is not a base58 string.\n") - return nil, err - } +func (p Path) Segments() []string { + cleaned := path.Clean(string(p)) + segments := strings.Split(cleaned, "/") - log.Debug("Resolve dag get.\n") - nd, err := s.DAG.Get(u.Key(h)) - if err != nil { - return nil, err + // Ignore leading slash + if len(segments[0]) == 0 { + segments = segments[1:] } - return s.ResolveLinks(nd, parts[1:]) + return segments } -// ResolveLinks iteratively resolves names by walking the link hierarchy. -// Every node is fetched from the DAGService, resolving the next name. -// Returns the last node found. -// -// ResolveLinks(nd, []string{"foo", "bar", "baz"}) -// would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links -func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( - nd *merkledag.Node, err error) { - - nd = ndd // dup arg workaround - - // for each of the path components - for _, name := range names { - - var next u.Key - var nlink *merkledag.Link - // for each of the links in nd, the current object - for _, link := range nd.Links { - if link.Name == name { - next = u.Key(link.Hash) - nlink = link - break - } - } - - if next == "" { - h1, _ := nd.Multihash() - h2 := h1.B58String() - return nil, fmt.Errorf("no link named %q under %s", name, h2) - } - - if nlink.Node == nil { - // fetch object for link and assign to nd - nd, err = s.DAG.Get(next) - if err != nil { - return nd, err - } - nlink.Node = nd - } else { - nd = nlink.Node - } - } - return +func (p Path) String() string { + return string(p) } diff --git a/path/resolver.go b/path/resolver.go new file mode 100644 index 0000000000..6c9366124a --- /dev/null +++ b/path/resolver.go @@ -0,0 +1,95 @@ +// package path implements utilities for resolving paths within ipfs. +package path + +import ( + "fmt" + + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + merkledag "github.com/jbenet/go-ipfs/merkledag" + u "github.com/jbenet/go-ipfs/util" +) + +var log = u.Logger("path") + +// Resolver provides path resolution to IPFS +// It has a pointer to a DAGService, which is uses to resolve nodes. +type Resolver struct { + DAG merkledag.DAGService +} + +// ResolvePath fetches the node for given path. It uses the first +// path component as a hash (key) of the first node, then resolves +// all other components walking the links, with ResolveLinks. +func (s *Resolver) ResolvePath(fpath Path) (*merkledag.Node, error) { + log.Debugf("Resolve: '%s'", fpath) + + parts := fpath.Segments() + if parts[0] == "ipfs" { + parts = parts[1:] + } + + // if nothing, bail. + if len(parts) == 0 { + return nil, fmt.Errorf("ipfs path must contain at least one component") + } + + // first element in the path is a b58 hash (for now) + h, err := mh.FromB58String(parts[0]) + if err != nil { + log.Debug("given path element is not a base58 string.\n") + return nil, err + } + + log.Debug("Resolve dag get.\n") + nd, err := s.DAG.Get(u.Key(h)) + if err != nil { + return nil, err + } + + return s.ResolveLinks(nd, parts[1:]) +} + +// ResolveLinks iteratively resolves names by walking the link hierarchy. +// Every node is fetched from the DAGService, resolving the next name. +// Returns the last node found. +// +// ResolveLinks(nd, []string{"foo", "bar", "baz"}) +// would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links +func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( + nd *merkledag.Node, err error) { + + nd = ndd // dup arg workaround + + // for each of the path components + for _, name := range names { + + var next u.Key + var nlink *merkledag.Link + // for each of the links in nd, the current object + for _, link := range nd.Links { + if link.Name == name { + next = u.Key(link.Hash) + nlink = link + break + } + } + + if next == "" { + h1, _ := nd.Multihash() + h2 := h1.B58String() + return nil, fmt.Errorf("no link named %q under %s", name, h2) + } + + if nlink.Node == nil { + // fetch object for link and assign to nd + nd, err = s.DAG.Get(next) + if err != nil { + return nd, err + } + nlink.Node = nd + } else { + nd = nlink.Node + } + } + return +} From bbf3011febff04c6dc5fcebc95466d6fa42d7926 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 28 Jan 2015 05:18:39 +0000 Subject: [PATCH 0596/3147] implement path type This commit was moved from ipfs/go-unixfs@72525912eb70aaba00668b01010c69935746c2c0 --- unixfs/tar/reader.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 65493f11f9..e27f6af413 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -7,7 +7,6 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "io" gopath "path" - "strings" "time" mdag "github.com/jbenet/go-ipfs/merkledag" @@ -29,10 +28,7 @@ type Reader struct { err error } -func NewReader(path string, dag mdag.DAGService, resolver *path.Resolver, compression int) (*Reader, error) { - if strings.HasPrefix(path, "/ipfs/") { - path = path[6:] - } +func NewReader(path path.Path, dag mdag.DAGService, resolver *path.Resolver, compression int) (*Reader, error) { reader := &Reader{ signalChan: make(chan struct{}), @@ -58,7 +54,7 @@ func NewReader(path string, dag mdag.DAGService, resolver *path.Resolver, compre // writeToBuf will write the data to the buffer, and will signal when there // is new data to read - _, filename := gopath.Split(path) + _, filename := gopath.Split(path.String()) go reader.writeToBuf(dagnode, filename, 0) return reader, nil From 1be52783179679fd38376f273fb1a70cbca2d414 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 20 Jan 2015 03:05:30 -0800 Subject: [PATCH 0597/3147] log(dht): remove lots of query debug logs the debug log is flooded with pages upon pages of... we've gotta be more judicious with our use of console logs. i'm sure there's interesting actionable information in here. let's use the console logging more like a sniper rifle and less like birdshot. feel free to revert if there are specific critical statements in this changeset 03:05:24.096 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) queryPeer() QUERY worker for: - not found, and no closer peers. prefixlog.go:107 03:05:24.096 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) queryPeer() completed prefixlog.go:107 03:05:24.096 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) queryPeer() finished prefixlog.go:107 03:05:24.096 DEBUG dht: dht() FindProviders(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK) Query() 0 provider entries prefixlog.go:107 03:05:24.096 DEBUG dht: dht() FindProviders(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK) Query() 0 provider entries decoded prefixlog.go:107 03:05:24.096 DEBUG dht: dht() FindProviders(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK) Query() got closer peers: 0 [] prefixlog.go:107 03:05:24.097 DEBUG dht: dht() FindProviders(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK) Query() end prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) queryPeer() query finished prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) queryPeer() QUERY worker for: - not found, and no closer peers. prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) queryPeer() completed prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) queryPeer() finished prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) all peers ended prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) spawnWorkers end prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) failure: %s routing: not found prefixlog.go:107 03:05:24.097 DEBUG dht: dht().Query(QmXvrpUZXCYaCkf1jfaQTJASS91xd47Yih2rnVC5YbFAAK).Run(3) end prefixlog.go:107 This commit was moved from ipfs/go-ipfs-routing@d24f129d5d655326ad6d0c1f80f8e8d2ef55174a --- routing/dht/query.go | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index 14a23de6f7..8d6505b88e 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -85,10 +85,7 @@ func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { r.log = log - log.Debug("enter") - defer log.Debug("end") - log.Debugf("Run query with %d peers.", len(peers)) if len(peers) == 0 { log.Warning("Running query with no peers!") return nil, nil @@ -107,7 +104,6 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { // go do this thing. // do it as a child func to make sure Run exits // ONLY AFTER spawn workers has exited. - log.Debugf("go spawn workers") r.cg.AddChildFunc(r.spawnWorkers) // so workers are working. @@ -117,7 +113,6 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { select { case <-r.peersRemaining.Done(): - log.Debug("all peers ended") r.cg.Close() r.RLock() defer r.RUnlock() @@ -139,11 +134,9 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { } if r.result != nil && r.result.success { - log.Debug("success: %s", r.result) return r.result, nil } - log.Debug("failure: %s", err) return nil, err } @@ -155,11 +148,9 @@ func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { } if !r.peersSeen.TryAdd(next) { - r.log.Debugf("addPeerToQuery skip seen %s", next) return } - r.log.Debugf("addPeerToQuery adding %s", next) r.peersRemaining.Increment(1) select { case r.peersToQuery.EnqChan <- next: @@ -181,7 +172,6 @@ func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { if !more { return // channel closed. } - log.Debugf("spawning worker for: %v", p) // do it as a child func to make sure Run exits // ONLY AFTER spawn workers has exited. @@ -202,17 +192,16 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { } // ok let's do this! - log.Debugf("running") // make sure we do this when we exit defer func() { // signal we're done proccessing peer p - log.Debugf("completed") r.peersRemaining.Decrement(1) r.rateLimit <- struct{}{} }() // make sure we're connected to the peer. + // FIXME abstract away into the network layer if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { log.Infof("not connected. dialing.") // while we dial, we do not take up a rate limit. this is to allow @@ -239,9 +228,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { } // finally, run the query against this peer - log.Debugf("query running") res, err := r.query.qfunc(cg.Context(), p) - log.Debugf("query finished") if err != nil { log.Debugf("ERROR worker for: %v %v", p, err) From 4e5fead489c4f2378a17b952f0130dff7d123d90 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 30 Jan 2015 19:55:38 +0000 Subject: [PATCH 0598/3147] address concerns about user interface with new Path type This commit was moved from ipfs/go-path@00e226d9d4bf206d0c273ac59588d9d846095a67 --- path/path.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/path/path.go b/path/path.go index bfbef72348..c76844b1e2 100644 --- a/path/path.go +++ b/path/path.go @@ -3,12 +3,24 @@ package path import ( "path" "strings" + + u "github.com/jbenet/go-ipfs/util" ) // TODO: debate making this a private struct wrapped in a public interface // would allow us to control creation, and cache segments. type Path string +// FromString safely converts a string type to a Path type +func FromString(s string) Path { + return Path(s) +} + +// FromKey safely converts a Key type to a Path type +func FromKey(k u.Key) Path { + return Path(k.String()) +} + func (p Path) Segments() []string { cleaned := path.Clean(string(p)) segments := strings.Split(cleaned, "/") From 5b062f3cd9dc222d49c43eb0d42346952c9d91b9 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 30 Jan 2015 20:17:55 -0800 Subject: [PATCH 0599/3147] p2p/net: notify on listens Network now signals when it successfully listens on some address or when an address shuts down. This will be used to establish and close nat port mappings. It could also be used to notify peers of address changes. This commit was moved from ipfs/go-ipfs-routing@fa1378dae370b5c3ac9d7f359a0cdbef9cf899b9 --- routing/dht/notif.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 318db12ea9..82e097753b 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -1,6 +1,8 @@ package dht import ( + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + inet "github.com/jbenet/go-ipfs/p2p/net" ) @@ -31,3 +33,5 @@ func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { func (nn *netNotifiee) OpenedStream(n inet.Network, v inet.Stream) {} func (nn *netNotifiee) ClosedStream(n inet.Network, v inet.Stream) {} +func (nn *netNotifiee) Listen(n inet.Network, a ma.Multiaddr) {} +func (nn *netNotifiee) ListenClose(n inet.Network, a ma.Multiaddr) {} From 27e3ed4f09f707cc1a5f1d643e62e224c1b2c1fe Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 30 Jan 2015 20:19:48 -0800 Subject: [PATCH 0600/3147] dht: removing addrs sanity check About to allow dht to start without local addresses. this is so that we can initialize the dht and sign it up to listen on the muxer, before our node starts accepting incoming connections. otherwise, we lose some (we're observing this happening already). I looked through the dht's use of the peerstore, and the check here doesnt seem to be as important as the panic implies. I believe the panic was used for debugging weird "dont have any address" conditions we had earlier. This commit was moved from ipfs/go-ipfs-routing@199d5b62191e8821666dd8e21c571fef3f102409 --- routing/dht/dht.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 42e0cd7b7a..d34ac720b0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -76,11 +76,6 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip return nil }) - // sanity check. this should **never** happen - if len(dht.peerstore.Addresses(dht.self)) < 1 { - panic("attempt to initialize dht without addresses for self") - } - h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) dht.providers = NewProviderManager(dht.Context(), dht.self) dht.AddChildGroup(dht.providers) From 742a25b99d84ec53bb237751894933fe3b97db67 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 19 Jan 2015 17:26:58 -0800 Subject: [PATCH 0601/3147] init docs: go generated welcome dir + files updated sharness hashes This commit was moved from ipfs/go-unixfs@767e9462d6b6ef7a555f96cf352f694a9ac0fcb9 --- unixfs/io/dirbuilder.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 unixfs/io/dirbuilder.go diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go new file mode 100644 index 0000000000..9597db3d16 --- /dev/null +++ b/unixfs/io/dirbuilder.go @@ -0,0 +1,38 @@ +package io + +import ( + mdag "github.com/jbenet/go-ipfs/merkledag" + format "github.com/jbenet/go-ipfs/unixfs" + u "github.com/jbenet/go-ipfs/util" +) + +type directoryBuilder struct { + dserv mdag.DAGService + dirnode *mdag.Node +} + +func NewDirectory(dserv mdag.DAGService) *directoryBuilder { + db := new(directoryBuilder) + db.dserv = dserv + db.dirnode = new(mdag.Node) + db.dirnode.Data = format.FolderPBData() + return db +} + +func (d *directoryBuilder) AddChild(name string, k u.Key) error { + cnode, err := d.dserv.Get(k) + if err != nil { + return err + } + + err = d.dirnode.AddNodeLinkClean(name, cnode) + if err != nil { + return err + } + + return nil +} + +func (d *directoryBuilder) GetNode() *mdag.Node { + return d.dirnode +} From 5c4b68c68b2c3c257675a8b0498be4d3ebaf806f Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Wed, 21 Jan 2015 15:51:28 +0100 Subject: [PATCH 0602/3147] HTTP: add handlers to allow object creation and modification This commit was moved from ipfs/go-path@a84f11bd6dd7c35a221fa48830ff18c789002bd5 --- path/resolver.go | 63 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 6c9366124a..863ae9d3cf 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,16 +11,26 @@ import ( var log = u.Logger("path") +// ErrNoLink is returned when a link is not found in a path +type ErrNoLink struct { + name string + node mh.Multihash +} + +func (e ErrNoLink) Error() string { + return fmt.Sprintf("no link named %q under %s", e.name, e.node.B58String()) +} + // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. type Resolver struct { DAG merkledag.DAGService } -// ResolvePath fetches the node for given path. It uses the first -// path component as a hash (key) of the first node, then resolves -// all other components walking the links, with ResolveLinks. -func (s *Resolver) ResolvePath(fpath Path) (*merkledag.Node, error) { +// SplitAbsPath clean up and split fpath. It extracts the first component (which +// must be a Multihash) and return it separately. +func SplitAbsPath(fpath Path) (mh.Multihash, []string, error) { + log.Debugf("Resolve: '%s'", fpath) parts := fpath.Segments() @@ -30,13 +40,36 @@ func (s *Resolver) ResolvePath(fpath Path) (*merkledag.Node, error) { // if nothing, bail. if len(parts) == 0 { - return nil, fmt.Errorf("ipfs path must contain at least one component") + return nil, nil, fmt.Errorf("ipfs path must contain at least one component") } // first element in the path is a b58 hash (for now) h, err := mh.FromB58String(parts[0]) if err != nil { log.Debug("given path element is not a base58 string.\n") + return nil, nil, err + } + + return h, parts[1:], nil +} + +// ResolvePath fetches the node for given path. It returns the last item +// returned by ResolvePathComponents. +func (s *Resolver) ResolvePath(fpath Path) (*merkledag.Node, error) { + nodes, err := s.ResolvePathComponents(fpath) + if err != nil || nodes == nil { + return nil, err + } else { + return nodes[len(nodes)-1], err + } +} + +// ResolvePathComponents fetches the nodes for each segment of the given path. +// It uses the first path component as a hash (key) of the first node, then +// resolves all other components walking the links, with ResolveLinks. +func (s *Resolver) ResolvePathComponents(fpath Path) ([]*merkledag.Node, error) { + h, parts, err := SplitAbsPath(fpath) + if err != nil { return nil, err } @@ -46,19 +79,22 @@ func (s *Resolver) ResolvePath(fpath Path) (*merkledag.Node, error) { return nil, err } - return s.ResolveLinks(nd, parts[1:]) + return s.ResolveLinks(nd, parts) } // ResolveLinks iteratively resolves names by walking the link hierarchy. // Every node is fetched from the DAGService, resolving the next name. -// Returns the last node found. +// Returns the list of nodes forming the path, starting with ndd. This list is +// guaranteed never to be empty. // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( - nd *merkledag.Node, err error) { + result []*merkledag.Node, err error) { - nd = ndd // dup arg workaround + result = make([]*merkledag.Node, 0, len(names)+1) + result = append(result, ndd) + nd := ndd // dup arg workaround // for each of the path components for _, name := range names { @@ -75,21 +111,22 @@ func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( } if next == "" { - h1, _ := nd.Multihash() - h2 := h1.B58String() - return nil, fmt.Errorf("no link named %q under %s", name, h2) + n, _ := nd.Multihash() + return result, ErrNoLink{name: name, node: n} } if nlink.Node == nil { // fetch object for link and assign to nd nd, err = s.DAG.Get(next) if err != nil { - return nd, err + return append(result, nd), err } nlink.Node = nd } else { nd = nlink.Node } + + result = append(result, nlink.Node) } return } From a285a2c2453b2edbb2e3a877fdf4275e1f4dd8b6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 31 Jan 2015 17:08:47 -0800 Subject: [PATCH 0603/3147] blockservice/worker: fix proc/limiter sync see: https://gist.github.com/jbenet/6b8b45bde9d9fce17d57 I want to make the goprocess API nicer so it doesnt lead users into this problem. any ideas? This commit was moved from ipfs/go-blockservice@f4fbf264e11e0e40b2e29464687c894ea57102f0 --- blockservice/worker/worker.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index be46c45c8a..eb5b1fc17e 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -120,7 +120,8 @@ func (w *Worker) start(c Config) { // reads from |workerChan| until process closes w.process.Go(func(proc process.Process) { ctx := childContext(proc) // shut down in-progress HasBlock when time to die - limiter := ratelimit.NewRateLimiter(proc, c.NumWorkers) + limiter := ratelimit.NewRateLimiter(process.Background(), c.NumWorkers) + defer limiter.Close() for { select { case <-proc.Closing(): From 451f407be4e38d8afecc87beeb92d3e5cc83931f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 1 Feb 2015 01:43:58 -0800 Subject: [PATCH 0604/3147] dht/notif: bugfix in hanging connects http://gifs.gifbin.com/012011/1295375531_cat-jump-fail.gif This commit was moved from ipfs/go-ipfs-routing@4f0abd70c35c34c4f01fcfdee3ecf61923c6de3d --- routing/dht/notif.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 82e097753b..4af2fc9787 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -18,6 +18,7 @@ func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { select { case <-dht.Closing(): return + default: } dht.Update(dht.Context(), v.RemotePeer()) } @@ -27,6 +28,7 @@ func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { select { case <-dht.Closing(): return + default: } dht.routingTable.Remove(v.RemotePeer()) } From de9c153726b21b7b9633b86167c039f6a48c69dd Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 1 Feb 2015 07:20:09 -0800 Subject: [PATCH 0605/3147] NewDagReader: return DagReader for more functions Since the DagReader has lots of useful information (like sizes etc) it's good to be able to use it. This commit was moved from ipfs/go-unixfs@030291dc740c92947f3e40b7037c2030875d45bb --- unixfs/io/dagreader.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 15e1b6f6e8..7262daf684 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -54,7 +54,7 @@ type ReadSeekCloser interface { // NewDagReader creates a new reader object that reads the data represented by the given // node, using the passed in DAGService for data retreival -func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (ReadSeekCloser, error) { +func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*DagReader, error) { pb := new(ftpb.Data) err := proto.Unmarshal(n.Data, pb) if err != nil { @@ -65,6 +65,8 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (Read case ftpb.Data_Directory: // Dont allow reading directories return nil, ErrIsDir + case ftpb.Data_Raw: + fallthrough case ftpb.Data_File: fctx, cancel := context.WithCancel(ctx) promises := serv.GetDAG(fctx, n) @@ -77,9 +79,6 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (Read cancel: cancel, pbdata: pb, }, nil - case ftpb.Data_Raw: - // Raw block will just be a single level, return a byte buffer - return NewRSNCFromBytes(pb.GetData()), nil default: return nil, ft.ErrUnrecognizedType } @@ -123,6 +122,11 @@ func (dr *DagReader) precalcNextBuf() error { } } +// Size return the total length of the data from the DAG structured file. +func (dr *DagReader) Size() int64 { + return int64(dr.pbdata.GetFilesize()) +} + // Read reads data from the DAG structured file func (dr *DagReader) Read(b []byte) (int, error) { // If no cached buffer, load one From e725d341553d985e9b0dae82e9dbaa5c1e697dea Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 27 Jan 2015 22:57:39 -0800 Subject: [PATCH 0606/3147] feat(dht/message) add PeerRoutingInfo This commit was moved from ipfs/go-ipfs-routing@bb60979719f917678d951a4f922b2e25b6cc841c --- routing/dht/pb/message.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index efa72f6ee2..676038d2d3 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -10,6 +10,11 @@ import ( var log = eventlog.Logger("dht.pb") +type PeerRoutingInfo struct { + peer.PeerInfo + inet.Connectedness +} + // NewMessage constructs a new dht message with given type, key, and level func NewMessage(typ Message_MessageType, key string, level int) *Message { m := &Message{ @@ -20,6 +25,20 @@ func NewMessage(typ Message_MessageType, key string, level int) *Message { return m } +func peerRoutingInfoToPBPeer(p PeerRoutingInfo) *Message_Peer { + pbp := new(Message_Peer) + + pbp.Addrs = make([][]byte, len(p.Addrs)) + for i, maddr := range p.Addrs { + pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed. + } + s := string(p.ID) + pbp.Id = &s + c := ConnectionType(p.Connectedness) + pbp.Connection = &c + return pbp +} + func peerInfoToPBPeer(p peer.PeerInfo) *Message_Peer { pbp := new(Message_Peer) @@ -63,6 +82,14 @@ func PeerInfosToPBPeers(n inet.Network, peers []peer.PeerInfo) []*Message_Peer { return pbps } +func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []*Message_Peer { + pbpeers := make([]*Message_Peer, len(peers)) + for i, p := range peers { + pbpeers[i] = peerRoutingInfoToPBPeer(p) + } + return pbpeers +} + // PBPeersToPeerInfos converts given []*Message_Peer into []peer.PeerInfo // Invalid addresses will be silently omitted. func PBPeersToPeerInfos(pbps []*Message_Peer) []peer.PeerInfo { From ae43b9c561801cddbc6028bd6e86f1f0814767cf Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 30 Jan 2015 00:08:46 -0800 Subject: [PATCH 0607/3147] refac(blockservice) extract waitable This commit was moved from ipfs/go-blockservice@6d19450b27f0c28c52b01e6ef7c14a138c52cf86 --- blockservice/worker/worker.go | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index eb5b1fc17e..77097bef65 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -6,11 +6,11 @@ import ( "errors" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ratelimit "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" blocks "github.com/jbenet/go-ipfs/blocks" exchange "github.com/jbenet/go-ipfs/exchange" + waitable "github.com/jbenet/go-ipfs/thirdparty/waitable" util "github.com/jbenet/go-ipfs/util" ) @@ -119,7 +119,7 @@ func (w *Worker) start(c Config) { // reads from |workerChan| until process closes w.process.Go(func(proc process.Process) { - ctx := childContext(proc) // shut down in-progress HasBlock when time to die + ctx := waitable.Context(proc) // shut down in-progress HasBlock when time to die limiter := ratelimit.NewRateLimiter(process.Background(), c.NumWorkers) defer limiter.Close() for { @@ -181,18 +181,3 @@ func (s *BlockList) Pop() *blocks.Block { func (s *BlockList) Len() int { return s.list.Len() } - -// TODO extract -type waitable interface { - Closing() <-chan struct{} -} - -// TODO extract -func childContext(w waitable) context.Context { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - <-w.Closing() - cancel() - }() - return ctx -} From bbfbcb2b1457b3e6d88625a2716ed854cfcff239 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 30 Jan 2015 23:15:20 -0800 Subject: [PATCH 0608/3147] log(dht/pb) include key in dht message loggable This commit was moved from ipfs/go-ipfs-routing@2caaf12e6438d11eb0f313ab9805a4fb4ad737b9 --- routing/dht/pb/message.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 676038d2d3..ce6af1459b 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,6 +6,7 @@ import ( inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" + util "github.com/jbenet/go-ipfs/util" ) var log = eventlog.Logger("dht.pb") @@ -142,6 +143,7 @@ func (m *Message) Loggable() map[string]interface{} { return map[string]interface{}{ "message": map[string]string{ "type": m.Type.String(), + "key": util.Key(m.GetKey()).Pretty(), }, } } From b33e5d1defa388ebeb4a8c97a5b80f998b2ccb2a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 2 Feb 2015 08:21:45 -0800 Subject: [PATCH 0609/3147] dht: use our most recent Addrs This commit was moved from ipfs/go-ipfs-routing@ef1817f8001c9648186847d776d6ada71b677d3c --- routing/dht/dht.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d34ac720b0..edd18ff11f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -142,16 +142,20 @@ func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) error { // add self as the provider - pi := dht.peerstore.PeerInfo(dht.self) + pi := peer.PeerInfo{ + ID: dht.self, + Addrs: dht.host.Addrs(), + } + // // only share WAN-friendly addresses ?? // pi.Addrs = addrutil.WANShareableAddrs(pi.Addrs) if len(pi.Addrs) < 1 { - log.Infof("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, u.Key(key), pi.Addrs) + // log.Infof("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, u.Key(key), pi.Addrs) return fmt.Errorf("no known addresses for self. cannot put provider.") } pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) - pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), []peer.PeerInfo{pi}) + pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]peer.PeerInfo{pi}) err := dht.sendMessage(ctx, p, pmes) if err != nil { return err From 1e109278d65fb47fb684d2bee3f836af0dd710b9 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 2 Feb 2015 11:30:00 -0800 Subject: [PATCH 0610/3147] AddrManager: use addr manager with smarter TTLs This addr manager should seriously help with the addrsplosion problem. This commit was moved from ipfs/go-ipfs-routing@c96b9c189203f5c6f7337ef1165a3b4ed146ea05 --- routing/dht/dht_test.go | 14 +++++++------- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/query.go | 2 +- routing/grandcentral/server.go | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 00597b016e..9d65a6facf 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -55,7 +55,7 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer for i := 0; i < n; i++ { dhts[i] = setupDHT(ctx, t) peers[i] = dhts[i].self - addrs[i] = dhts[i].peerstore.Addresses(dhts[i].self)[0] + addrs[i] = dhts[i].peerstore.Addrs(dhts[i].self)[0] } return addrs, peers, dhts @@ -64,12 +64,12 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { idB := b.self - addrB := b.peerstore.Addresses(idB) + addrB := b.peerstore.Addrs(idB) if len(addrB) == 0 { t.Fatal("peers setup incorrectly: no local address") } - a.peerstore.AddAddresses(idB, addrB) + a.peerstore.AddAddrs(idB, addrB, peer.TempAddrTTL) if err := a.Connect(ctx, idB); err != nil { t.Fatal(err) } @@ -754,20 +754,20 @@ func TestConnectCollision(t *testing.T) { dhtA := setupDHT(ctx, t) dhtB := setupDHT(ctx, t) - addrA := dhtA.peerstore.Addresses(dhtA.self)[0] - addrB := dhtB.peerstore.Addresses(dhtB.self)[0] + addrA := dhtA.peerstore.Addrs(dhtA.self)[0] + addrB := dhtB.peerstore.Addrs(dhtB.self)[0] peerA := dhtA.self peerB := dhtB.self errs := make(chan error) go func() { - dhtA.peerstore.AddAddress(peerB, addrB) + dhtA.peerstore.AddAddr(peerB, addrB, peer.TempAddrTTL) err := dhtA.Connect(ctx, peerB) errs <- err }() go func() { - dhtB.peerstore.AddAddress(peerA, addrA) + dhtB.peerstore.AddAddr(peerA, addrA, peer.TempAddrTTL) err := dhtB.Connect(ctx, peerA) errs <- err }() diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 6376dbcbad..6974ad08d3 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -238,7 +238,7 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M log.Infof("received provider %s for %s (addrs: %s)", p, key, pi.Addrs) if pi.ID != dht.self { // dont add own addrs. // add the received addresses to our peerstore. - dht.peerstore.AddPeerInfo(pi) + dht.peerstore.AddAddrs(pi.ID, pi.Addrs, peer.ProviderAddrTTL) } dht.providers.AddProvider(key, p) } diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 6e0acd9fa7..a713e553de 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -100,7 +100,7 @@ func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) for _, pbp := range pmes.GetCloserPeers() { pid := peer.ID(pbp.GetId()) if pid != dht.self { // dont add self - dht.peerstore.AddAddresses(pid, pbp.Addresses()) + dht.peerstore.AddAddrs(pid, pbp.Addresses(), peer.TempAddrTTL) out = append(out, pid) } } diff --git a/routing/dht/query.go b/routing/dht/query.go index 8d6505b88e..293c0ddd9e 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -253,7 +253,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { } // add their addresses to the dialer's peerstore - r.query.dht.peerstore.AddPeerInfo(next) + r.query.dht.peerstore.AddAddrs(next.ID, next.Addrs, peer.TempAddrTTL) r.addPeerToQuery(cg.Context(), next.ID) log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index f51b719171..179b15b3e9 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -96,7 +96,7 @@ func (s *Server) handleMessage( } for _, maddr := range provider.Addresses() { // FIXME do we actually want to store to peerstore - s.peerstore.AddAddress(p, maddr) + s.peerstore.AddAddr(p, maddr, peer.TempAddrTTL) } } var providers []dhtpb.Message_Peer From 911caaa934aa31f8d04d458d98831cbea261b4d2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 3 Feb 2015 01:06:07 -0800 Subject: [PATCH 0611/3147] logs: removed all log.Errors unhelpful to users Let's save log.Error for things the user can take action on. Moved all our diagnostics to log.Debug. We can ideally reduce them even further. This commit was moved from ipfs/go-ipfs-routing@7c546db422f8fb030cffe18f3ee0d4fafc2f8e72 --- routing/dht/dht_test.go | 6 +++--- routing/grandcentral/client.go | 4 ++-- routing/grandcentral/proxy/loopback.go | 4 ++-- routing/grandcentral/server.go | 14 +++++++------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 9d65a6facf..b57caacccb 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -262,7 +262,7 @@ func waitForWellFormedTables(t *testing.T, dhts []*IpfsDHT, minPeers, avgPeers i for { select { case <-timeoutA: - log.Errorf("did not reach well-formed routing tables by %s", timeout) + log.Debugf("did not reach well-formed routing tables by %s", timeout) return false // failed case <-time.After(5 * time.Millisecond): if checkTables() { @@ -322,7 +322,7 @@ func TestBootstrap(t *testing.T) { } }() - waitForWellFormedTables(t, dhts, 7, 10, 5*time.Second) + waitForWellFormedTables(t, dhts, 7, 10, 20*time.Second) close(stop) if u.Debug { @@ -407,7 +407,7 @@ func TestPeriodicBootstrap(t *testing.T) { // this is async, and we dont know when it's finished with one cycle, so keep checking // until the routing tables look better, or some long timeout for the failure case. - waitForWellFormedTables(t, dhts, 7, 10, 5*time.Second) + waitForWellFormedTables(t, dhts, 7, 10, 20*time.Second) if u.Debug { printRoutingTables(dhts) diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go index ccf0bd199a..bc783af76f 100644 --- a/routing/grandcentral/client.go +++ b/routing/grandcentral/client.go @@ -44,13 +44,13 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha request := pb.NewMessage(pb.Message_GET_PROVIDERS, string(k), 0) response, err := c.proxy.SendRequest(ctx, request) if err != nil { - log.Error(errors.Wrap(err)) + log.Debug(errors.Wrap(err)) return } for _, p := range pb.PBPeersToPeerInfos(response.GetProviderPeers()) { select { case <-ctx.Done(): - log.Error(errors.Wrap(ctx.Err())) + log.Debug(errors.Wrap(ctx.Err())) return case ch <- p: } diff --git a/routing/grandcentral/proxy/loopback.go b/routing/grandcentral/proxy/loopback.go index 59a414df0c..ba598c3ea3 100644 --- a/routing/grandcentral/proxy/loopback.go +++ b/routing/grandcentral/proxy/loopback.go @@ -2,9 +2,9 @@ package proxy import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" errors "github.com/jbenet/go-ipfs/util/debugerror" ) @@ -39,7 +39,7 @@ func (lb *Loopback) handleNewStream(s inet.Stream) { pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) var incoming dhtpb.Message if err := pbr.ReadMsg(&incoming); err != nil { - log.Error(errors.Wrap(err)) + log.Debug(errors.Wrap(err)) return } ctx := context.TODO() diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 179b15b3e9..767d7e760a 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -53,16 +53,16 @@ func (s *Server) handleMessage( dskey := util.Key(req.GetKey()).DsKey() val, err := s.datastore.Get(dskey) if err != nil { - log.Error(errors.Wrap(err)) + log.Debug(errors.Wrap(err)) return "", nil } rawRecord, ok := val.([]byte) if !ok { - log.Errorf("datastore had non byte-slice value for %v", dskey) + log.Debugf("datastore had non byte-slice value for %v", dskey) return "", nil } if err := proto.Unmarshal(rawRecord, response.Record); err != nil { - log.Error("failed to unmarshal dht record from datastore") + log.Debug("failed to unmarshal dht record from datastore") return "", nil } // TODO before merging: if we know any providers for the requested value, return those. @@ -72,12 +72,12 @@ func (s *Server) handleMessage( // TODO before merging: verifyRecord(req.GetRecord()) data, err := proto.Marshal(req.GetRecord()) if err != nil { - log.Error(err) + log.Debug(err) return "", nil } dskey := util.Key(req.GetKey()).DsKey() if err := s.datastore.Put(dskey, data); err != nil { - log.Error(err) + log.Debug(err) return "", nil } return p, req // TODO before merging: verify that we should return record @@ -91,7 +91,7 @@ func (s *Server) handleMessage( for _, provider := range req.GetProviderPeers() { providerID := peer.ID(provider.GetId()) if providerID != p { - log.Errorf("provider message came from third-party %s", p) + log.Debugf("provider message came from third-party %s", p) continue } for _, maddr := range provider.Addresses() { @@ -107,7 +107,7 @@ func (s *Server) handleMessage( } } if err := s.datastore.Put(pkey, providers); err != nil { - log.Error(err) + log.Debug(err) return "", nil } return "", nil From 7d8a5650eded5977b0a948bc0d09dc42ea1366e8 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 3 Feb 2015 01:06:07 -0800 Subject: [PATCH 0612/3147] logs: removed all log.Errors unhelpful to users Let's save log.Error for things the user can take action on. Moved all our diagnostics to log.Debug. We can ideally reduce them even further. This commit was moved from ipfs/go-blockservice@5846e989855e0fc1090ce4ab21f5c2a28e9ca1f4 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 2ce230452b..0d4dcfa057 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -122,7 +122,7 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks rblocks, err := s.Exchange.GetBlocks(ctx, misses) if err != nil { - log.Errorf("Error with GetBlocks: %s", err) + log.Debugf("Error with GetBlocks: %s", err) return } From 0e6b2e6a393bb23cc211f41203128f2dde42b45c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 3 Feb 2015 01:06:07 -0800 Subject: [PATCH 0613/3147] logs: removed all log.Errors unhelpful to users Let's save log.Error for things the user can take action on. Moved all our diagnostics to log.Debug. We can ideally reduce them even further. This commit was moved from ipfs/go-namesys@5f659f8bdcc6700ba42cc1b498c344759bba9016 --- namesys/publisher.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 8a82c7947c..3b209cd265 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -43,19 +43,16 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) // validate `value` is a ref (multihash) _, err := mh.FromB58String(value.Pretty()) if err != nil { - log.Errorf("hash cast failed: %s", value) return fmt.Errorf("publish value must be str multihash. %v", err) } data, err := createRoutingEntryData(k, value) if err != nil { - log.Error("entry creation failed.") return err } pubkey := k.GetPublic() pkbytes, err := pubkey.Bytes() if err != nil { - log.Error("pubkey getbytes failed.") return err } @@ -120,7 +117,7 @@ func ValidateIpnsRecord(k u.Key, val []byte) error { case pb.IpnsEntry_EOL: t, err := u.ParseRFC3339(string(entry.GetValidity())) if err != nil { - log.Error("Failed parsing time for ipns record EOL") + log.Debug("Failed parsing time for ipns record EOL") return err } if time.Now().After(t) { From b33ff400ea547a59eaf50ace02118e3eb390ad4f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 3 Feb 2015 01:06:07 -0800 Subject: [PATCH 0614/3147] logs: removed all log.Errors unhelpful to users Let's save log.Error for things the user can take action on. Moved all our diagnostics to log.Debug. We can ideally reduce them even further. This commit was moved from ipfs/go-ipfs-chunker@e4011410906ffd153b6b12cb4b5aaa4e9d6ebe62 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 40597a0641..73fe49db1d 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -38,7 +38,7 @@ func (ss *SizeSplitter) Split(r io.Reader) chan []byte { return } if err != nil { - log.Errorf("Block split error: %s", err) + log.Debugf("Block split error: %s", err) return } } From 1a7112e7db6a4266563a4d904ddbeaa7d2fbd08c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 3 Feb 2015 12:18:30 -0800 Subject: [PATCH 0615/3147] dht/query: make sure to cancel all contexts. We are leaking peer queues: http://gateway.ipfs.io/ipfs/QmQxVA48CzVwwNYExUiFe56VrUBn8u368ZfchnCLoc7fSC/moriarty This commit was moved from ipfs/go-ipfs-routing@3f7679c8a79e4679ae691dcdd69b7a5f8c867be9 --- routing/dht/query.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/routing/dht/query.go b/routing/dht/query.go index 293c0ddd9e..7a32b45bb9 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -52,6 +52,9 @@ type queryFunc func(context.Context, peer.ID) (*dhtQueryResult, error) // Run runs the query at hand. pass in a list of peers to use first. func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + runner := newQueryRunner(ctx, q) return runner.Run(peers) } From 8e06571a2ae45381d2248c3433624dccb2f97b73 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 4 Feb 2015 19:43:49 +0000 Subject: [PATCH 0616/3147] clean up benchmarks, implement WriterTo on DAGReader, and optimize DagReader This commit was moved from ipfs/go-unixfs@72795d7feb3d4f81b2910219c5dcca7c7f1c04f5 --- unixfs/io/dagreader.go | 60 +++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 7262daf684..4d3f37b7e9 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -50,6 +50,7 @@ type ReadSeekCloser interface { io.Reader io.Seeker io.Closer + io.WriterTo } // NewDagReader creates a new reader object that reads the data represented by the given @@ -68,22 +69,26 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag case ftpb.Data_Raw: fallthrough case ftpb.Data_File: - fctx, cancel := context.WithCancel(ctx) - promises := serv.GetDAG(fctx, n) - return &DagReader{ - node: n, - serv: serv, - buf: NewRSNCFromBytes(pb.GetData()), - promises: promises, - ctx: fctx, - cancel: cancel, - pbdata: pb, - }, nil + return newDataFileReader(ctx, n, pb, serv), nil default: return nil, ft.ErrUnrecognizedType } } +func newDataFileReader(ctx context.Context, n *mdag.Node, pb *ftpb.Data, serv mdag.DAGService) *DagReader { + fctx, cancel := context.WithCancel(ctx) + promises := serv.GetDAG(fctx, n) + return &DagReader{ + node: n, + serv: serv, + buf: NewRSNCFromBytes(pb.GetData()), + promises: promises, + ctx: fctx, + cancel: cancel, + pbdata: pb, + } +} + // precalcNextBuf follows the next link in line and loads it from the DAGService, // setting the next buffer to read from func (dr *DagReader) precalcNextBuf() error { @@ -108,11 +113,7 @@ func (dr *DagReader) precalcNextBuf() error { // A directory should not exist within a file return ft.ErrInvalidDirLocation case ftpb.Data_File: - subr, err := NewDagReader(dr.ctx, nxt, dr.serv) - if err != nil { - return err - } - dr.buf = subr + dr.buf = newDataFileReader(dr.ctx, nxt, pb, dr.serv) return nil case ftpb.Data_Raw: dr.buf = NewRSNCFromBytes(pb.GetData()) @@ -156,6 +157,31 @@ func (dr *DagReader) Read(b []byte) (int, error) { } } +func (dr *DagReader) WriteTo(w io.Writer) (int64, error) { + // If no cached buffer, load one + total := int64(0) + for { + // Attempt to write bytes from cached buffer + n, err := dr.buf.WriteTo(w) + total += n + dr.offset += n + if err != nil { + if err != io.EOF { + return total, err + } + } + + // Otherwise, load up the next block + err = dr.precalcNextBuf() + if err != nil { + if err == io.EOF { + return total, nil + } + return total, err + } + } +} + func (dr *DagReader) Close() error { dr.cancel() return nil @@ -163,6 +189,8 @@ func (dr *DagReader) Close() error { // Seek implements io.Seeker, and will seek to a given offset in the file // interface matches standard unix seek +// TODO: check if we can do relative seeks, to reduce the amount of dagreader +// recreations that need to happen. func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { switch whence { case os.SEEK_SET: From e6699bbc8b4bc83ad274b569ee4592568d7b039c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 2 Feb 2015 22:46:59 +0000 Subject: [PATCH 0617/3147] implement metadata node for unixfs and other This commit was moved from ipfs/go-unixfs@737609a09782d9a2f893140b64db6523826f4f36 --- unixfs/format.go | 45 ++++++++++++++++++++++++++++++++++++++++++ unixfs/io/dagreader.go | 11 +++++++++++ unixfs/pb/unixfs.pb.go | 22 ++++++++++++++++++++- unixfs/pb/unixfs.proto | 5 +++++ 4 files changed, 82 insertions(+), 1 deletion(-) diff --git a/unixfs/format.go b/unixfs/format.go index 845f1da30e..5e12d52aca 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -126,3 +126,48 @@ func (mb *MultiBlock) FileSize() uint64 { func (mb *MultiBlock) NumChildren() int { return len(mb.blocksizes) } + +type Metadata struct { + MimeType string + Size uint64 +} + +func MetadataFromBytes(b []byte) (*Metadata, error) { + pbd := new(pb.Data) + err := proto.Unmarshal(b, pbd) + if err != nil { + return nil, err + } + if pbd.GetType() != pb.Data_Metadata { + return nil, errors.New("incorrect node type") + } + + pbm := new(pb.Metadata) + err = proto.Unmarshal(pbd.Data, pbm) + if err != nil { + return nil, err + } + md := new(Metadata) + md.MimeType = pbm.GetMimeType() + return md, nil +} + +func (m *Metadata) Bytes() ([]byte, error) { + pbm := new(pb.Metadata) + pbm.MimeType = &m.MimeType + return proto.Marshal(pbm) +} + +func BytesForMetadata(m *Metadata) ([]byte, error) { + pbd := new(pb.Data) + pbd.Filesize = proto.Uint64(m.Size) + typ := pb.Data_Metadata + pbd.Type = &typ + mdd, err := m.Bytes() + if err != nil { + return nil, err + } + + pbd.Data = mdd + return proto.Marshal(pbd) +} diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 4d3f37b7e9..d363d22d1e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -70,6 +70,15 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag fallthrough case ftpb.Data_File: return newDataFileReader(ctx, n, pb, serv), nil + case ftpb.Data_Metadata: + if len(n.Links) == 0 { + return nil, errors.New("incorrectly formatted metadata object") + } + child, err := n.Links[0].GetNode(serv) + if err != nil { + return nil, err + } + return NewDagReader(ctx, child, serv) default: return nil, ft.ErrUnrecognizedType } @@ -118,6 +127,8 @@ func (dr *DagReader) precalcNextBuf() error { case ftpb.Data_Raw: dr.buf = NewRSNCFromBytes(pb.GetData()) return nil + case ftpb.Data_Metadata: + return errors.New("Shouldnt have had metadata object inside file") default: return ft.ErrUnrecognizedType } diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 999aa6d929..6e442456f8 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -10,10 +10,11 @@ It is generated from these files: It has these top-level messages: Data + Metadata */ package unixfs_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -26,17 +27,20 @@ const ( Data_Raw Data_DataType = 0 Data_Directory Data_DataType = 1 Data_File Data_DataType = 2 + Data_Metadata Data_DataType = 3 ) var Data_DataType_name = map[int32]string{ 0: "Raw", 1: "Directory", 2: "File", + 3: "Metadata", } var Data_DataType_value = map[string]int32{ "Raw": 0, "Directory": 1, "File": 2, + "Metadata": 3, } func (x Data_DataType) Enum() *Data_DataType { @@ -96,6 +100,22 @@ func (m *Data) GetBlocksizes() []uint64 { return nil } +type Metadata struct { + MimeType *string `protobuf:"bytes,1,req" json:"MimeType,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} + +func (m *Metadata) GetMimeType() string { + if m != nil && m.MimeType != nil { + return *m.MimeType + } + return "" +} + func init() { proto.RegisterEnum("unixfs.pb.Data_DataType", Data_DataType_name, Data_DataType_value) } diff --git a/unixfs/pb/unixfs.proto b/unixfs/pb/unixfs.proto index 618fb61594..1450809e46 100644 --- a/unixfs/pb/unixfs.proto +++ b/unixfs/pb/unixfs.proto @@ -5,6 +5,7 @@ message Data { Raw = 0; Directory = 1; File = 2; + Metadata = 3; } required DataType Type = 1; @@ -12,3 +13,7 @@ message Data { optional uint64 filesize = 3; repeated uint64 blocksizes = 4; } + +message Metadata { + required string MimeType = 1; +} From 0270c4fdb98b120104ebedcb5350aef2d79f3b8e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 4 Feb 2015 15:32:21 -0800 Subject: [PATCH 0618/3147] fix: vendor This commit was moved from ipfs/go-unixfs@7e7fb827388562fd2b0088740ee28305984846e8 --- unixfs/pb/unixfs.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 6e442456f8..19eb9d8ee0 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "code.google.com/p/gogoprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 1728ba26000adc35beedd469c4acedc12145affa Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 5 Feb 2015 04:53:23 -0800 Subject: [PATCH 0619/3147] kbucket: fix data race This commit was moved from ipfs/go-ipfs-routing@f082e3d35b502059b8263d1a3fc08a30bac7aa3a --- routing/kbucket/bucket.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index f6fcc0b94f..a8c6a07bc7 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -42,8 +42,8 @@ func (b *Bucket) find(id peer.ID) *list.Element { } func (b *Bucket) remove(id peer.ID) { - b.lk.RLock() - defer b.lk.RUnlock() + b.lk.Lock() + defer b.lk.Unlock() for e := b.list.Front(); e != nil; e = e.Next() { if e.Value.(peer.ID) == id { b.list.Remove(e) From 24dc5a8d58ea5c3a9e405dfdae9dc9916377077f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 5 Feb 2015 06:22:44 -0800 Subject: [PATCH 0620/3147] routing/kbucket: cleaner "public" interface for bucket This commit was moved from ipfs/go-ipfs-routing@f47f09d0d5893ca914c4f10e4efc7acaa57f969e --- routing/kbucket/bucket.go | 24 +++++++------ routing/kbucket/table.go | 66 ++++++++++++++++++----------------- routing/kbucket/table_test.go | 10 ++---- 3 files changed, 51 insertions(+), 49 deletions(-) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index a8c6a07bc7..d551cf8195 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -30,18 +30,18 @@ func (b *Bucket) Peers() []peer.ID { return ps } -func (b *Bucket) find(id peer.ID) *list.Element { +func (b *Bucket) Has(id peer.ID) bool { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { if e.Value.(peer.ID) == id { - return e + return true } } - return nil + return false } -func (b *Bucket) remove(id peer.ID) { +func (b *Bucket) Remove(id peer.ID) { b.lk.Lock() defer b.lk.Unlock() for e := b.list.Front(); e != nil; e = e.Next() { @@ -51,19 +51,23 @@ func (b *Bucket) remove(id peer.ID) { } } -func (b *Bucket) moveToFront(e *list.Element) { +func (b *Bucket) MoveToFront(id peer.ID) { b.lk.Lock() - b.list.MoveToFront(e) - b.lk.Unlock() + defer b.lk.Unlock() + for e := b.list.Front(); e != nil; e = e.Next() { + if e.Value.(peer.ID) == id { + b.list.MoveToFront(e) + } + } } -func (b *Bucket) pushFront(p peer.ID) { +func (b *Bucket) PushFront(p peer.ID) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) popBack() peer.ID { +func (b *Bucket) PopBack() peer.ID { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() @@ -71,7 +75,7 @@ func (b *Bucket) popBack() peer.ID { return last.Value.(peer.ID) } -func (b *Bucket) len() int { +func (b *Bucket) Len() int { b.lk.RLock() defer b.lk.RUnlock() return b.list.Len() diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index dc5fb3d6fd..a785bf8b58 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -46,7 +46,7 @@ func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peer.M // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned -func (rt *RoutingTable) Update(p peer.ID) peer.ID { +func (rt *RoutingTable) Update(p peer.ID) { rt.tabLock.Lock() defer rt.tabLock.Unlock() peerID := ConvertPeerID(p) @@ -58,33 +58,35 @@ func (rt *RoutingTable) Update(p peer.ID) peer.ID { } bucket := rt.Buckets[bucketID] - e := bucket.find(p) - if e == nil { - // New peer, add to bucket - if rt.metrics.LatencyEWMA(p) > rt.maxLatency { - // Connection doesnt meet requirements, skip! - return "" - } - bucket.pushFront(p) - - // Are we past the max bucket size? - if bucket.len() > rt.bucketsize { - // If this bucket is the rightmost bucket, and its full - // we need to split it and create a new bucket - if bucketID == len(rt.Buckets)-1 { - return rt.nextBucket() - } else { - // If the bucket cant split kick out least active node - return bucket.popBack() - } + if bucket.Has(p) { + // If the peer is already in the table, move it to the front. + // This signifies that it it "more active" and the less active nodes + // Will as a result tend towards the back of the list + bucket.MoveToFront(p) + return + } + + if rt.metrics.LatencyEWMA(p) > rt.maxLatency { + // Connection doesnt meet requirements, skip! + return + } + + // New peer, add to bucket + bucket.PushFront(p) + + // Are we past the max bucket size? + if bucket.Len() > rt.bucketsize { + // If this bucket is the rightmost bucket, and its full + // we need to split it and create a new bucket + if bucketID == len(rt.Buckets)-1 { + rt.nextBucket() + return + } else { + // If the bucket cant split kick out least active node + bucket.PopBack() + return } - return "" } - // If the peer is already in the table, move it to the front. - // This signifies that it it "more active" and the less active nodes - // Will as a result tend towards the back of the list - bucket.moveToFront(e) - return "" } // Remove deletes a peer from the routing table. This is to be used @@ -101,20 +103,20 @@ func (rt *RoutingTable) Remove(p peer.ID) { } bucket := rt.Buckets[bucketID] - bucket.remove(p) + bucket.Remove(p) } func (rt *RoutingTable) nextBucket() peer.ID { bucket := rt.Buckets[len(rt.Buckets)-1] newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) rt.Buckets = append(rt.Buckets, newBucket) - if newBucket.len() > rt.bucketsize { + if newBucket.Len() > rt.bucketsize { return rt.nextBucket() } // If all elements were on left side of split... - if bucket.len() > rt.bucketsize { - return bucket.popBack() + if bucket.Len() > rt.bucketsize { + return bucket.PopBack() } return "" } @@ -153,7 +155,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { bucket = rt.Buckets[cpl] var peerArr peerSorterArr - if bucket.len() == 0 { + if bucket.Len() == 0 { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { @@ -184,7 +186,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { func (rt *RoutingTable) Size() int { var tot int for _, buck := range rt.Buckets { - tot += buck.len() + tot += buck.Len() } return tot } diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 3e44cf66ab..670342b670 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -17,15 +17,14 @@ func TestBucket(t *testing.T) { peers := make([]peer.ID, 100) for i := 0; i < 100; i++ { peers[i] = tu.RandPeerIDFatal(t) - b.pushFront(peers[i]) + b.PushFront(peers[i]) } local := tu.RandPeerIDFatal(t) localID := ConvertPeerID(local) i := rand.Intn(len(peers)) - e := b.find(peers[i]) - if e == nil { + if !b.Has(peers[i]) { t.Errorf("Failed to find peer: %v", peers[i]) } @@ -62,10 +61,7 @@ func TestTableUpdate(t *testing.T) { // Testing Update for i := 0; i < 10000; i++ { - p := rt.Update(peers[rand.Intn(len(peers))]) - if p != "" { - //t.Log("evicted peer.") - } + rt.Update(peers[rand.Intn(len(peers))]) } for i := 0; i < 100; i++ { From 3eb8766bacbd22491cd94c7b6129c755ba876ea2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 6 Feb 2015 10:59:03 -0800 Subject: [PATCH 0621/3147] ratelimiter: fixing rate limiter use Use of the ratelimiter should be conscious of the ratelimiter's potential closing. any loops that add work to ratelimiter should (a) only do so if the rate limiter is not closed, or (b) prevent limiter while work is added (i.e. use limiter.Go(addWorkHere)) This commit was moved from ipfs/go-blockservice@8a93edef9e4ed83e373f84adb2fc1735e699a163 --- blockservice/worker/worker.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index 77097bef65..ee45d32ad5 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -117,11 +117,10 @@ func (w *Worker) start(c Config) { } }) - // reads from |workerChan| until process closes - w.process.Go(func(proc process.Process) { + // reads from |workerChan| until w.process closes + limiter := ratelimit.NewRateLimiter(w.process, c.NumWorkers) + limiter.Go(func(proc process.Process) { ctx := waitable.Context(proc) // shut down in-progress HasBlock when time to die - limiter := ratelimit.NewRateLimiter(process.Background(), c.NumWorkers) - defer limiter.Close() for { select { case <-proc.Closing(): From dfaaee946c37f82ad567f02517a673843ca35202 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 Feb 2015 22:59:10 +0000 Subject: [PATCH 0622/3147] document some packages This commit was moved from ipfs/go-namesys@96bdf67e6183202083ef0fb524e0b28cca7b0af1 --- namesys/interface.go | 1 + 1 file changed, 1 insertion(+) diff --git a/namesys/interface.go b/namesys/interface.go index f2e4f104df..6faaeaf6a0 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -1,3 +1,4 @@ +// package namesys implements various functionality for the ipns naming system. package namesys import ( From 032104f16579183d162a0c97984ee6ab3796d260 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 13 Feb 2015 08:08:30 +0000 Subject: [PATCH 0623/3147] this might solve all our problems This commit was moved from ipfs/go-ipfs-routing@70e025ed2065eebda4353728314d70c66cae803e --- routing/dht/handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 6974ad08d3..9f11eb6d18 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -201,7 +201,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. // Also send closer peers. closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if closer != nil { - infos := peer.PeerInfos(dht.peerstore, providers) + infos := peer.PeerInfos(dht.peerstore, closer) resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) log.Debugf("%s have %d closer peers: %s", reqDesc, len(closer), infos) } From 9bc6186c0ea0aff13c730663f6117f5ede0774b6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 13 Feb 2015 08:29:10 +0000 Subject: [PATCH 0624/3147] a few more cleanup changes to handlers This commit was moved from ipfs/go-ipfs-routing@5a2c0293b18b07a4af89061056c9eb7992f772f9 --- routing/dht/handlers.go | 19 +------------------ routing/dht/providers.go | 5 +++++ 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 9f11eb6d18..03c3eda3ca 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -3,7 +3,6 @@ package dht import ( "errors" "fmt" - "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" @@ -63,9 +62,6 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess return nil, err } - // Note: changed the behavior here to return _as much_ info as possible - // (potentially all of {value, closer peers, provider}) - // if we have the value, send it back if err == nil { log.Debugf("%s handleGetValue success!", dht.self) @@ -85,18 +81,10 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess resp.Record = rec } - // if we know any providers for the requested value, return those. - provs := dht.providers.GetProviders(ctx, u.Key(pmes.GetKey())) - provinfos := peer.PeerInfos(dht.peerstore, provs) - if len(provs) > 0 { - log.Debugf("handleGetValue returning %d provider[s]", len(provs)) - resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), provinfos) - } - // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) - closerinfos := peer.PeerInfos(dht.peerstore, closer) if closer != nil { + closerinfos := peer.PeerInfos(dht.peerstore, closer) for _, pi := range closerinfos { log.Debugf("handleGetValue returning closer peer: '%s'", pi.ID) if len(pi.Addrs) < 1 { @@ -209,11 +197,6 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. return resp, nil } -type providerInfo struct { - Creation time.Time - Value peer.ID -} - func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { defer log.EventBegin(ctx, "handleAddProvider", p).Done() key := u.Key(pmes.GetKey()) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 9e96eff361..f4f7514fbb 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -10,6 +10,11 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) +type providerInfo struct { + Creation time.Time + Value peer.ID +} + type ProviderManager struct { providers map[u.Key][]*providerInfo local map[u.Key]struct{} From f5fa9813442a4a30c19cda6389158263433a3442 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 30 Jan 2015 08:19:33 -0800 Subject: [PATCH 0625/3147] refac(gcr/s,c) use PeerRoutingInfo This commit was moved from ipfs/go-ipfs-routing@26109c0ea55cbb4287cd29d9f563712698cabc0e --- routing/grandcentral/client.go | 13 ++++++++++--- routing/grandcentral/server.go | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go index bc783af76f..828653eca7 100644 --- a/routing/grandcentral/client.go +++ b/routing/grandcentral/client.go @@ -80,9 +80,16 @@ func (c *Client) GetValue(ctx context.Context, k u.Key) ([]byte, error) { func (c *Client) Provide(ctx context.Context, k u.Key) error { msg := pb.NewMessage(pb.Message_ADD_PROVIDER, string(k), 0) - // TODO wrap this to hide the dialer and the local/remote peers - msg.ProviderPeers = pb.PeerInfosToPBPeers(c.dialer, []peer.PeerInfo{peer.PeerInfo{ID: c.local}}) // FIXME how is connectedness defined for the local node - return c.proxy.SendMessage(ctx, msg) // TODO wrap to hide remote + // FIXME how is connectedness defined for the local node + pri := []pb.PeerRoutingInfo{ + pb.PeerRoutingInfo{ + PeerInfo: peer.PeerInfo{ + ID: c.local, + }, + }, + } + msg.ProviderPeers = pb.PeerRoutingInfosToPBPeers(pri) + return c.proxy.SendMessage(ctx, msg) // TODO wrap to hide remote } func (c *Client) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 767d7e760a..8bb8e0d036 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -84,7 +84,13 @@ func (s *Server) handleMessage( case dhtpb.Message_FIND_NODE: p := s.peerstore.PeerInfo(peer.ID(req.GetKey())) - response.CloserPeers = dhtpb.PeerInfosToPBPeers(s.dialer, []peer.PeerInfo{p}) + pri := []dhtpb.PeerRoutingInfo{ + dhtpb.PeerRoutingInfo{ + PeerInfo: p, + // Connectedness: TODO + }, + } + response.CloserPeers = dhtpb.PeerRoutingInfosToPBPeers(pri) return p.ID, response case dhtpb.Message_ADD_PROVIDER: @@ -116,7 +122,13 @@ func (s *Server) handleMessage( dskey := util.Key(req.GetKey()).DsKey() exists, err := s.datastore.Has(dskey) if err == nil && exists { - response.ProviderPeers = append(response.ProviderPeers, dhtpb.PeerInfosToPBPeers(s.dialer, []peer.PeerInfo{peer.PeerInfo{ID: s.local}})...) + pri := []dhtpb.PeerRoutingInfo{ + dhtpb.PeerRoutingInfo{ + // Connectedness: TODO how is connectedness defined for the local node + PeerInfo: peer.PeerInfo{ID: s.local}, + }, + } + response.ProviderPeers = append(response.ProviderPeers, dhtpb.PeerRoutingInfosToPBPeers(pri)...) } // FIXME(btc) is this how we want to persist this data? pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", req.GetKey()}) From ef1281466e07f51802b52b40b814096fd813ced0 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 27 Jan 2015 23:51:15 -0800 Subject: [PATCH 0626/3147] refac(gcr/s,c) remove network/dialer remove dialer from GCR client This commit was moved from ipfs/go-ipfs-routing@e57a9ba4fee56a3b0b1fc3a55c40afcfe4ed57b5 --- routing/grandcentral/client.go | 5 +---- routing/grandcentral/server.go | 6 ++---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go index 828653eca7..c9acf61a8d 100644 --- a/routing/grandcentral/client.go +++ b/routing/grandcentral/client.go @@ -6,7 +6,6 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" @@ -23,14 +22,12 @@ var ErrTODO = errors.New("TODO") type Client struct { peerstore peer.Peerstore proxy proxy.Proxy - dialer inet.Network local peer.ID } // TODO take in datastore/cache -func NewClient(d inet.Network, px proxy.Proxy, ps peer.Peerstore, local peer.ID) (*Client, error) { +func NewClient(px proxy.Proxy, ps peer.Peerstore, local peer.ID) (*Client, error) { return &Client{ - dialer: d, proxy: px, local: local, peerstore: ps, diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 8bb8e0d036..a855ca6618 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -4,7 +4,6 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" proxy "github.com/jbenet/go-ipfs/routing/grandcentral/proxy" @@ -16,14 +15,13 @@ import ( type Server struct { local peer.ID datastore datastore.ThreadSafeDatastore - dialer inet.Network peerstore peer.Peerstore *proxy.Loopback // so server can be injected into client } // NewServer creates a new GrandCentral routing Server -func NewServer(ds datastore.ThreadSafeDatastore, d inet.Network, ps peer.Peerstore, local peer.ID) (*Server, error) { - s := &Server{local, ds, d, ps, nil} +func NewServer(ds datastore.ThreadSafeDatastore, ps peer.Peerstore, local peer.ID) (*Server, error) { + s := &Server{local, ds, ps, nil} s.Loopback = &proxy.Loopback{ Handler: s, Local: local, From 07d781b54808ce48178f993754a6785aa0e45b82 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 30 Jan 2015 08:22:32 -0800 Subject: [PATCH 0627/3147] fix(gcr/s) proto marshaling bugs This commit was moved from ipfs/go-ipfs-routing@d0ff30bae18a1c48fd84639912d4201aca4815a9 --- routing/grandcentral/server.go | 164 +++++++++++++++++++++------------ 1 file changed, 103 insertions(+), 61 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index a855ca6618..309433eff2 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -1,6 +1,8 @@ package grandcentral import ( + "fmt" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -48,36 +50,17 @@ func (s *Server) handleMessage( switch req.GetType() { case dhtpb.Message_GET_VALUE: - dskey := util.Key(req.GetKey()).DsKey() - val, err := s.datastore.Get(dskey) + rawRecord, err := getRoutingRecord(s.datastore, util.Key(req.GetKey())) if err != nil { - log.Debug(errors.Wrap(err)) - return "", nil - } - rawRecord, ok := val.([]byte) - if !ok { - log.Debugf("datastore had non byte-slice value for %v", dskey) - return "", nil - } - if err := proto.Unmarshal(rawRecord, response.Record); err != nil { - log.Debug("failed to unmarshal dht record from datastore") return "", nil } + response.Record = rawRecord // TODO before merging: if we know any providers for the requested value, return those. return p, response case dhtpb.Message_PUT_VALUE: // TODO before merging: verifyRecord(req.GetRecord()) - data, err := proto.Marshal(req.GetRecord()) - if err != nil { - log.Debug(err) - return "", nil - } - dskey := util.Key(req.GetKey()).DsKey() - if err := s.datastore.Put(dskey, data); err != nil { - log.Debug(err) - return "", nil - } + putRoutingRecord(s.datastore, util.Key(req.GetKey()), req.GetRecord()) return p, req // TODO before merging: verify that we should return record case dhtpb.Message_FIND_NODE: @@ -92,51 +75,19 @@ func (s *Server) handleMessage( return p.ID, response case dhtpb.Message_ADD_PROVIDER: - for _, provider := range req.GetProviderPeers() { - providerID := peer.ID(provider.GetId()) - if providerID != p { - log.Debugf("provider message came from third-party %s", p) - continue - } - for _, maddr := range provider.Addresses() { - // FIXME do we actually want to store to peerstore - s.peerstore.AddAddr(p, maddr, peer.TempAddrTTL) - } - } - var providers []dhtpb.Message_Peer - pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", req.GetKey()}) - if v, err := s.datastore.Get(pkey); err == nil { - if protopeers, ok := v.([]dhtpb.Message_Peer); ok { - providers = append(providers, protopeers...) - } - } - if err := s.datastore.Put(pkey, providers); err != nil { - log.Debug(err) + storeProvidersToPeerstore(s.peerstore, p, req.GetProviderPeers()) + + if err := putRoutingProviders(s.datastore, util.Key(req.GetKey()), req.GetProviderPeers()); err != nil { return "", nil } return "", nil case dhtpb.Message_GET_PROVIDERS: - dskey := util.Key(req.GetKey()).DsKey() - exists, err := s.datastore.Has(dskey) - if err == nil && exists { - pri := []dhtpb.PeerRoutingInfo{ - dhtpb.PeerRoutingInfo{ - // Connectedness: TODO how is connectedness defined for the local node - PeerInfo: peer.PeerInfo{ID: s.local}, - }, - } - response.ProviderPeers = append(response.ProviderPeers, dhtpb.PeerRoutingInfosToPBPeers(pri)...) - } - // FIXME(btc) is this how we want to persist this data? - pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", req.GetKey()}) - if v, err := s.datastore.Get(pkey); err == nil { - if protopeers, ok := v.([]dhtpb.Message_Peer); ok { - for _, p := range protopeers { - response.ProviderPeers = append(response.ProviderPeers, &p) - } - } + providers, err := getRoutingProviders(s.local, s.datastore, util.Key(req.GetKey())) + if err != nil { + return "", nil } + response.ProviderPeers = providers return p, response case dhtpb.Message_PING: @@ -148,3 +99,94 @@ func (s *Server) handleMessage( var _ proxy.RequestHandler = &Server{} var _ proxy.Proxy = &Server{} + +func getRoutingRecord(ds datastore.Datastore, k util.Key) (*dhtpb.Record, error) { + dskey := k.DsKey() + val, err := ds.Get(dskey) + if err != nil { + return nil, errors.Wrap(err) + } + recordBytes, ok := val.([]byte) + if !ok { + return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) + } + var record dhtpb.Record + if err := proto.Unmarshal(recordBytes, &record); err != nil { + return nil, errors.New("failed to unmarshal dht record from datastore") + } + return &record, nil +} + +func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) error { + data, err := proto.Marshal(value) + if err != nil { + return err + } + dskey := k.DsKey() + // TODO namespace + if err := ds.Put(dskey, data); err != nil { + return err + } + return nil +} + +func putRoutingProviders(ds datastore.Datastore, k util.Key, providers []*dhtpb.Message_Peer) error { + pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) + if v, err := ds.Get(pkey); err == nil { + if msg, ok := v.([]byte); ok { + var protomsg dhtpb.Message + if err := proto.Unmarshal(msg, &protomsg); err != nil { + log.Error("failed to unmarshal routing provider record. programmer error") + } else { + providers = append(providers, protomsg.ProviderPeers...) + } + } + } + var protomsg dhtpb.Message + protomsg.ProviderPeers = providers + data, err := proto.Marshal(&protomsg) + if err != nil { + return err + } + return ds.Put(pkey, data) +} + +func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb.Message_Peer) { + for _, provider := range providers { + providerID := peer.ID(provider.GetId()) + if providerID != p { + log.Errorf("provider message came from third-party %s", p) + continue + } + for _, maddr := range provider.Addresses() { + // as a router, we want to store addresses for peers who have provided + ps.AddAddr(p, maddr, peer.AddressTTL) + } + } +} + +func getRoutingProviders(local peer.ID, ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_Peer, error) { + var providers []*dhtpb.Message_Peer + exists, err := ds.Has(k.DsKey()) // TODO store values in a local datastore? + if err == nil && exists { + pri := []dhtpb.PeerRoutingInfo{ + dhtpb.PeerRoutingInfo{ + // Connectedness: TODO how is connectedness defined for the local node + PeerInfo: peer.PeerInfo{ID: local}, + }, + } + providers = append(providers, dhtpb.PeerRoutingInfosToPBPeers(pri)...) + } + + pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) // TODO key fmt + if v, err := ds.Get(pkey); err == nil { + if data, ok := v.([]byte); ok { + var msg dhtpb.Message + if err := proto.Unmarshal(data, &msg); err != nil { + return nil, err + } + providers = append(providers, msg.GetProviderPeers()...) + } + } + return providers, nil +} From c3f7439b937b3f464dd0c51e2664724cc02600c1 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 30 Jan 2015 08:21:08 -0800 Subject: [PATCH 0628/3147] misc(gcr/c) rm TODO This commit was moved from ipfs/go-ipfs-routing@8e7501da9f110bbd46c85afe1ebf4a2a58d21e83 --- routing/grandcentral/client.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go index c9acf61a8d..b7caa27951 100644 --- a/routing/grandcentral/client.go +++ b/routing/grandcentral/client.go @@ -17,8 +17,6 @@ import ( var log = eventlog.Logger("grandcentral") -var ErrTODO = errors.New("TODO") - type Client struct { peerstore peer.Peerstore proxy proxy.Proxy From 855a79721102f861e17023b4ba1b5c3eb94ed3d5 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 28 Jan 2015 05:20:20 -0800 Subject: [PATCH 0629/3147] feat(gcr/c) add support for multiple servers This commit was moved from ipfs/go-ipfs-routing@cb2e956fbcd65dd4db4cc9003e1ce2ba17d6d3e9 --- routing/grandcentral/proxy/standard.go | 45 +++++++++++++++++++------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go index 629f619164..b3d1fc5d82 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/grandcentral/proxy/standard.go @@ -2,13 +2,13 @@ package proxy import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - host "github.com/jbenet/go-ipfs/p2p/host" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + host "github.com/jbenet/go-ipfs/p2p/host" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" - errors "github.com/jbenet/go-ipfs/util/debugerror" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" + errors "github.com/jbenet/go-ipfs/util/debugerror" ) var log = eventlog.Logger("proxy") @@ -19,21 +19,32 @@ type Proxy interface { } type standard struct { - Host host.Host - Remote peer.ID + Host host.Host + Remotes []peer.ID } -func Standard(h host.Host, remote peer.ID) Proxy { - return &standard{h, remote} +func Standard(h host.Host, remotes []peer.ID) Proxy { + return &standard{h, remotes} } const ProtocolGCR = "/ipfs/grandcentral" func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { - if err := px.Host.Connect(ctx, peer.PeerInfo{ID: px.Remote}); err != nil { + var err error + for _, remote := range px.Remotes { + if err = px.sendMessage(ctx, m, remote); err != nil { // careful don't re-declare err! + continue + } + return nil // success + } + return err // NB: returns the last error +} + +func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote peer.ID) error { + if err := px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { return err } - s, err := px.Host.NewStream(ProtocolGCR, px.Remote) + s, err := px.Host.NewStream(ProtocolGCR, remote) if err != nil { return err } @@ -46,10 +57,23 @@ func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { } func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { - if err := px.Host.Connect(ctx, peer.PeerInfo{ID: px.Remote}); err != nil { + var err error + for _, remote := range px.Remotes { + var reply *dhtpb.Message + reply, err = px.sendRequest(ctx, m, remote) // careful don't redeclare err! + if err != nil { + continue + } + return reply, nil // success + } + return nil, err // NB: returns the last error +} + +func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (*dhtpb.Message, error) { + if err := px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { return nil, err } - s, err := px.Host.NewStream(ProtocolGCR, px.Remote) + s, err := px.Host.NewStream(ProtocolGCR, remote) if err != nil { return nil, err } @@ -70,4 +94,3 @@ func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.M } return &reply, nil } - From 717a86209b5d4d57d8621794488bf76ddb8a5e92 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 30 Jan 2015 08:02:43 -0800 Subject: [PATCH 0630/3147] fix(gcr/s,c) register stream handlers This commit was moved from ipfs/go-ipfs-routing@22d8d5c77e18151f2ce6e78f5a83e7a7f2620a56 --- routing/grandcentral/proxy/loopback.go | 2 +- routing/grandcentral/proxy/standard.go | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/routing/grandcentral/proxy/loopback.go b/routing/grandcentral/proxy/loopback.go index ba598c3ea3..e5fa39deb8 100644 --- a/routing/grandcentral/proxy/loopback.go +++ b/routing/grandcentral/proxy/loopback.go @@ -34,7 +34,7 @@ func (lb *Loopback) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.M return lb.Handler.HandleRequest(ctx, lb.Local, m), nil } -func (lb *Loopback) handleNewStream(s inet.Stream) { +func (lb *Loopback) HandleStream(s inet.Stream) { defer s.Close() pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) var incoming dhtpb.Message diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go index b3d1fc5d82..996f2f5e76 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/grandcentral/proxy/standard.go @@ -13,7 +13,10 @@ import ( var log = eventlog.Logger("proxy") +const ProtocolGCR = "/ipfs/grandcentral" + type Proxy interface { + HandleStream(inet.Stream) SendMessage(ctx context.Context, m *dhtpb.Message) error SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) } @@ -27,7 +30,9 @@ func Standard(h host.Host, remotes []peer.ID) Proxy { return &standard{h, remotes} } -const ProtocolGCR = "/ipfs/grandcentral" +func (p *standard) HandleStream(s inet.Stream) { + panic("client received a GCR message") +} func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { var err error From 26e90774416b564b210a9434305647727db004eb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 28 Jan 2015 20:41:12 -0800 Subject: [PATCH 0631/3147] feat(gcr/c) randomize order of remotes This commit was moved from ipfs/go-ipfs-routing@2f0a7ef8fcda721f4c8abb4500934d455e30855b --- routing/grandcentral/proxy/standard.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go index 996f2f5e76..373501ea1e 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/grandcentral/proxy/standard.go @@ -1,6 +1,8 @@ package proxy import ( + "math/rand" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" host "github.com/jbenet/go-ipfs/p2p/host" @@ -36,7 +38,8 @@ func (p *standard) HandleStream(s inet.Stream) { func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { var err error - for _, remote := range px.Remotes { + for _, i := range rand.Perm(len(px.Remotes)) { + remote := px.Remotes[i] if err = px.sendMessage(ctx, m, remote); err != nil { // careful don't re-declare err! continue } @@ -63,7 +66,8 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { var err error - for _, remote := range px.Remotes { + for _, i := range rand.Perm(len(px.Remotes)) { + remote := px.Remotes[i] var reply *dhtpb.Message reply, err = px.sendRequest(ctx, m, remote) // careful don't redeclare err! if err != nil { From 6a97328c761a30b23147a6a86845eca621847fb0 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 30 Jan 2015 08:05:01 -0800 Subject: [PATCH 0632/3147] refactor(gcr/c) pass host.Host into GCR client This commit was moved from ipfs/go-ipfs-routing@63164978f35332c18beb272676de1cce3d7b68a4 --- routing/grandcentral/client.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go index b7caa27951..8b67276b72 100644 --- a/routing/grandcentral/client.go +++ b/routing/grandcentral/client.go @@ -6,6 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/p2p/host" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" @@ -18,17 +19,19 @@ import ( var log = eventlog.Logger("grandcentral") type Client struct { + peerhost host.Host peerstore peer.Peerstore proxy proxy.Proxy local peer.ID } // TODO take in datastore/cache -func NewClient(px proxy.Proxy, ps peer.Peerstore, local peer.ID) (*Client, error) { +func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (*Client, error) { return &Client{ proxy: px, local: local, peerstore: ps, + peerhost: h, }, nil } @@ -79,7 +82,8 @@ func (c *Client) Provide(ctx context.Context, k u.Key) error { pri := []pb.PeerRoutingInfo{ pb.PeerRoutingInfo{ PeerInfo: peer.PeerInfo{ - ID: c.local, + ID: c.local, + Addrs: c.peerhost.Addrs(), }, }, } From 12c76fa3238f669dca74fb5c2f9f754346f637ba Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 28 Jan 2015 08:06:53 -0800 Subject: [PATCH 0633/3147] feat(gcr/s) add eventlogs This commit was moved from ipfs/go-ipfs-routing@f7dad1aaa9bc0e8ce0c51dc720a508b254ddf466 --- routing/grandcentral/client.go | 6 ++++++ routing/grandcentral/proxy/standard.go | 30 +++++++++++++++++++------- routing/grandcentral/server.go | 4 ++++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go index 8b67276b72..405a7750d7 100644 --- a/routing/grandcentral/client.go +++ b/routing/grandcentral/client.go @@ -36,6 +36,7 @@ func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (* } func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { + defer log.EventBegin(ctx, "findProviders", &k).Done() ch := make(chan peer.PeerInfo) go func() { defer close(ch) @@ -58,6 +59,7 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha } func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte) error { + defer log.EventBegin(ctx, "putValue", &k).Done() r, err := makeRecord(c.peerstore, c.local, k, v) if err != nil { return err @@ -68,6 +70,7 @@ func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte) error { } func (c *Client) GetValue(ctx context.Context, k u.Key) ([]byte, error) { + defer log.EventBegin(ctx, "getValue", &k).Done() msg := pb.NewMessage(pb.Message_GET_VALUE, string(k), 0) response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote if err != nil { @@ -77,6 +80,7 @@ func (c *Client) GetValue(ctx context.Context, k u.Key) ([]byte, error) { } func (c *Client) Provide(ctx context.Context, k u.Key) error { + defer log.EventBegin(ctx, "provide", &k).Done() msg := pb.NewMessage(pb.Message_ADD_PROVIDER, string(k), 0) // FIXME how is connectedness defined for the local node pri := []pb.PeerRoutingInfo{ @@ -92,6 +96,7 @@ func (c *Client) Provide(ctx context.Context, k u.Key) error { } func (c *Client) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { + defer log.EventBegin(ctx, "findPeer", id).Done() request := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) response, err := c.proxy.SendRequest(ctx, request) // hide remote if err != nil { @@ -121,6 +126,7 @@ func makeRecord(ps peer.Peerstore, p peer.ID, k u.Key, v []byte) (*pb.Record, er } func (c *Client) Ping(ctx context.Context, id peer.ID) (time.Duration, error) { + defer log.EventBegin(ctx, "ping", id).Done() return time.Nanosecond, errors.New("grandcentral routing does not support the ping method") } diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go index 373501ea1e..36da88cbfe 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/grandcentral/proxy/standard.go @@ -13,10 +13,10 @@ import ( errors "github.com/jbenet/go-ipfs/util/debugerror" ) -var log = eventlog.Logger("proxy") - const ProtocolGCR = "/ipfs/grandcentral" +var log = eventlog.Logger("grandcentral/proxy") + type Proxy interface { HandleStream(inet.Stream) SendMessage(ctx context.Context, m *dhtpb.Message) error @@ -48,8 +48,15 @@ func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { return err // NB: returns the last error } -func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote peer.ID) error { - if err := px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { +func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote peer.ID) (err error) { + e := log.EventBegin(ctx, "sendRoutingMessage", px.Host.ID(), remote, m) + defer func() { + if err != nil { + e.SetError(err) + } + e.Done() + }() + if err = px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { return err } s, err := px.Host.NewStream(ProtocolGCR, remote) @@ -78,8 +85,15 @@ func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.M return nil, err // NB: returns the last error } -func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (*dhtpb.Message, error) { - if err := px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { +func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (_ *dhtpb.Message, err error) { + e := log.EventBegin(ctx, "sendRoutingRequest", px.Host.ID(), remote, m) + defer func() { + if err != nil { + e.SetError(err) + } + e.Done() + }() + if err = px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { return nil, err } s, err := px.Host.NewStream(ProtocolGCR, remote) @@ -89,12 +103,12 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe defer s.Close() r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) w := ggio.NewDelimitedWriter(s) - if err := w.WriteMsg(m); err != nil { + if err = w.WriteMsg(m); err != nil { return nil, err } var reply dhtpb.Message - if err := r.ReadMsg(&reply); err != nil { + if err = r.ReadMsg(&reply); err != nil { return nil, err } // need ctx expiration? diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 309433eff2..62198f8cbc 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -42,6 +42,8 @@ func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Messag func (s *Server) handleMessage( ctx context.Context, p peer.ID, req *dhtpb.Message) (peer.ID, *dhtpb.Message) { + log.EventBegin(ctx, "routingMessageReceived", req, p, s.local).Done() // TODO may need to differentiate between local and remote + // FIXME threw everything into this switch statement to get things going. // Once each operation is well-defined, extract pluggable backend so any // database may be used. @@ -131,6 +133,7 @@ func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) e } func putRoutingProviders(ds datastore.Datastore, k util.Key, providers []*dhtpb.Message_Peer) error { + log.Event(context.Background(), "putRoutingProviders", &k) pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) if v, err := ds.Get(pkey); err == nil { if msg, ok := v.([]byte); ok { @@ -166,6 +169,7 @@ func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb. } func getRoutingProviders(local peer.ID, ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_Peer, error) { + log.Event(context.Background(), "getProviders", local, &k) var providers []*dhtpb.Message_Peer exists, err := ds.Has(k.DsKey()) // TODO store values in a local datastore? if err == nil && exists { From 19948119b9f34228718773655075ba4cbb97b9c7 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 29 Jan 2015 23:47:12 -0800 Subject: [PATCH 0634/3147] fix(gcr/c) print a loud error when clients receive routing messages, but don't panic This is an unhandled case. Right now, we close the stream without reading. Should clients be able to satisfy routing requests? @jbenet @whyrusleeping This commit was moved from ipfs/go-ipfs-routing@8dd6c4f7b2ad8e9086965352f4c056c4ef36efe0 --- routing/grandcentral/proxy/standard.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go index 36da88cbfe..393f9d303b 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/grandcentral/proxy/standard.go @@ -33,7 +33,9 @@ func Standard(h host.Host, remotes []peer.ID) Proxy { } func (p *standard) HandleStream(s inet.Stream) { - panic("client received a GCR message") + // TODO(brian): Should clients be able to satisfy requests? + log.Error("grandcentral client received (dropped) a routing message from", s.Conn().RemotePeer()) + s.Close() } func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { From 10c0244f017395d0bfeb6a151675d80f37c44d79 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 1 Feb 2015 22:49:14 -0800 Subject: [PATCH 0635/3147] log(gcr/s,c) add addtional eventlogs This commit was moved from ipfs/go-ipfs-routing@7fdd65ab0ff278b647b1e6dd49aca0f26fa2b042 --- routing/grandcentral/client.go | 1 + routing/grandcentral/proxy/standard.go | 31 ++++++++++++++------------ routing/grandcentral/server.go | 3 ++- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/routing/grandcentral/client.go b/routing/grandcentral/client.go index 405a7750d7..99a507983a 100644 --- a/routing/grandcentral/client.go +++ b/routing/grandcentral/client.go @@ -36,6 +36,7 @@ func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (* } func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { + ctx = eventlog.ContextWithLoggable(ctx, eventlog.Uuid("findProviders")) defer log.EventBegin(ctx, "findProviders", &k).Done() ch := make(chan peer.PeerInfo) go func() { diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go index 393f9d303b..3fe33616f9 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/grandcentral/proxy/standard.go @@ -87,35 +87,38 @@ func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.M return nil, err // NB: returns the last error } -func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (_ *dhtpb.Message, err error) { - e := log.EventBegin(ctx, "sendRoutingRequest", px.Host.ID(), remote, m) - defer func() { - if err != nil { - e.SetError(err) - } - e.Done() - }() - if err = px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { +func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (*dhtpb.Message, error) { + e := log.EventBegin(ctx, "sendRoutingRequest", px.Host.ID(), remote, eventlog.Pair("request", m)) + defer e.Done() + if err := px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { + e.SetError(err) return nil, err } s, err := px.Host.NewStream(ProtocolGCR, remote) if err != nil { + e.SetError(err) return nil, err } defer s.Close() r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) w := ggio.NewDelimitedWriter(s) if err = w.WriteMsg(m); err != nil { + e.SetError(err) return nil, err } - var reply dhtpb.Message - if err = r.ReadMsg(&reply); err != nil { + response := &dhtpb.Message{} + if err = r.ReadMsg(response); err != nil { + e.SetError(err) return nil, err } // need ctx expiration? - if &reply == nil { - return nil, errors.New("no response to request") + if response == nil { + err := errors.New("no response to request") + e.SetError(err) + return nil, err } - return &reply, nil + e.Append(eventlog.Pair("response", response)) + e.Append(eventlog.Pair("uuid", eventlog.Uuid("foo"))) + return response, nil } diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 62198f8cbc..d35ad97bd3 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -169,7 +169,8 @@ func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb. } func getRoutingProviders(local peer.ID, ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_Peer, error) { - log.Event(context.Background(), "getProviders", local, &k) + e := log.EventBegin(context.Background(), "getProviders", &k) + defer e.Done() var providers []*dhtpb.Message_Peer exists, err := ds.Has(k.DsKey()) // TODO store values in a local datastore? if err == nil && exists { From c5f29457c66869aea7cf758f871177784ba3321b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 01:49:55 -0800 Subject: [PATCH 0636/3147] fix(gcr/s) rename datastore to routing backend This commit was moved from ipfs/go-ipfs-routing@b9e3535741bc11842fb19df50a9266b0a1bb6a7f --- routing/grandcentral/server.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index d35ad97bd3..fdeef62d0d 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -16,7 +16,7 @@ import ( // Server handles routing queries using a database backend type Server struct { local peer.ID - datastore datastore.ThreadSafeDatastore + routingBackend datastore.ThreadSafeDatastore peerstore peer.Peerstore *proxy.Loopback // so server can be injected into client } @@ -52,7 +52,7 @@ func (s *Server) handleMessage( switch req.GetType() { case dhtpb.Message_GET_VALUE: - rawRecord, err := getRoutingRecord(s.datastore, util.Key(req.GetKey())) + rawRecord, err := getRoutingRecord(s.routingBackend, util.Key(req.GetKey())) if err != nil { return "", nil } @@ -62,7 +62,7 @@ func (s *Server) handleMessage( case dhtpb.Message_PUT_VALUE: // TODO before merging: verifyRecord(req.GetRecord()) - putRoutingRecord(s.datastore, util.Key(req.GetKey()), req.GetRecord()) + putRoutingRecord(s.routingBackend, util.Key(req.GetKey()), req.GetRecord()) return p, req // TODO before merging: verify that we should return record case dhtpb.Message_FIND_NODE: @@ -79,13 +79,13 @@ func (s *Server) handleMessage( case dhtpb.Message_ADD_PROVIDER: storeProvidersToPeerstore(s.peerstore, p, req.GetProviderPeers()) - if err := putRoutingProviders(s.datastore, util.Key(req.GetKey()), req.GetProviderPeers()); err != nil { + if err := putRoutingProviders(s.routingBackend, util.Key(req.GetKey()), req.GetProviderPeers()); err != nil { return "", nil } return "", nil case dhtpb.Message_GET_PROVIDERS: - providers, err := getRoutingProviders(s.local, s.datastore, util.Key(req.GetKey())) + providers, err := getRoutingProviders(s.local, s.routingBackend, util.Key(req.GetKey())) if err != nil { return "", nil } From c041a05bef4bf10870387707f6ef20097b0bc4ee Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 01:52:53 -0800 Subject: [PATCH 0637/3147] misc(gcr/s) rm TODO This commit was moved from ipfs/go-ipfs-routing@0785ef75a1910f376907cf4832bf3c813f29ba1c --- routing/grandcentral/server.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index fdeef62d0d..663f2562a9 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -44,10 +44,6 @@ func (s *Server) handleMessage( log.EventBegin(ctx, "routingMessageReceived", req, p, s.local).Done() // TODO may need to differentiate between local and remote - // FIXME threw everything into this switch statement to get things going. - // Once each operation is well-defined, extract pluggable backend so any - // database may be used. - var response = dhtpb.NewMessage(req.GetType(), req.GetKey(), req.GetClusterLevel()) switch req.GetType() { From 4733b4a4bcf28b0659e578cab9e18333897b99b5 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 02:05:40 -0800 Subject: [PATCH 0638/3147] fix: don't check routingbackend for value This commit was moved from ipfs/go-ipfs-routing@082ebd2a0ef8e7cfc6b839eb57098cfef9eb3990 --- routing/grandcentral/server.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 663f2562a9..19facfaa24 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -168,17 +168,6 @@ func getRoutingProviders(local peer.ID, ds datastore.Datastore, k util.Key) ([]* e := log.EventBegin(context.Background(), "getProviders", &k) defer e.Done() var providers []*dhtpb.Message_Peer - exists, err := ds.Has(k.DsKey()) // TODO store values in a local datastore? - if err == nil && exists { - pri := []dhtpb.PeerRoutingInfo{ - dhtpb.PeerRoutingInfo{ - // Connectedness: TODO how is connectedness defined for the local node - PeerInfo: peer.PeerInfo{ID: local}, - }, - } - providers = append(providers, dhtpb.PeerRoutingInfosToPBPeers(pri)...) - } - pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) // TODO key fmt if v, err := ds.Get(pkey); err == nil { if data, ok := v.([]byte); ok { From 41abe43e99c4873ea6568e3b10dfc8503f389ff7 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 02:08:14 -0800 Subject: [PATCH 0639/3147] misc(gcr/s) add doc This commit was moved from ipfs/go-ipfs-routing@32f3101360e996752452c5739c38adaf78db5871 --- routing/grandcentral/server.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 19facfaa24..5af3b431d9 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -73,6 +73,9 @@ func (s *Server) handleMessage( return p.ID, response case dhtpb.Message_ADD_PROVIDER: + // FIXME(btc): do we want to store these locally? I think the + // storeProvidersToPeerstore behavior is straight from the DHT message + // handler. storeProvidersToPeerstore(s.peerstore, p, req.GetProviderPeers()) if err := putRoutingProviders(s.routingBackend, util.Key(req.GetKey()), req.GetProviderPeers()); err != nil { From d7ab668a53a7d02306c59fc0eee1ab5eeaa95b2b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 02:10:50 -0800 Subject: [PATCH 0640/3147] misc(gcr/s) rm unused param This commit was moved from ipfs/go-ipfs-routing@9eddd786dfd7104767cf1fbf1778f16c1ef8f37e --- routing/grandcentral/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 5af3b431d9..6d0a0b0f22 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -84,7 +84,7 @@ func (s *Server) handleMessage( return "", nil case dhtpb.Message_GET_PROVIDERS: - providers, err := getRoutingProviders(s.local, s.routingBackend, util.Key(req.GetKey())) + providers, err := getRoutingProviders(s.routingBackend, util.Key(req.GetKey())) if err != nil { return "", nil } @@ -167,7 +167,7 @@ func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb. } } -func getRoutingProviders(local peer.ID, ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_Peer, error) { +func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_Peer, error) { e := log.EventBegin(context.Background(), "getProviders", &k) defer e.Done() var providers []*dhtpb.Message_Peer From e1a8e413316d004091b1b07c8c47934af09ecd30 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 02:24:38 -0800 Subject: [PATCH 0641/3147] refactor(gcr/s) re-use code from get This commit was moved from ipfs/go-ipfs-routing@be74d28b4cb2c2833ca559e4a469b8575ec0e04f --- routing/grandcentral/server.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 6d0a0b0f22..f1c8f8d417 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -134,16 +134,11 @@ func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) e func putRoutingProviders(ds datastore.Datastore, k util.Key, providers []*dhtpb.Message_Peer) error { log.Event(context.Background(), "putRoutingProviders", &k) pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) - if v, err := ds.Get(pkey); err == nil { - if msg, ok := v.([]byte); ok { - var protomsg dhtpb.Message - if err := proto.Unmarshal(msg, &protomsg); err != nil { - log.Error("failed to unmarshal routing provider record. programmer error") - } else { - providers = append(providers, protomsg.ProviderPeers...) - } - } + old, err := getRoutingProviders(ds, k) + if err != nil { + return err } + providers = append(providers, old...) var protomsg dhtpb.Message protomsg.ProviderPeers = providers data, err := proto.Marshal(&protomsg) From 33bd2724e5ae4ea24486379ef31ecda2494f0b3e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 02:44:45 -0800 Subject: [PATCH 0642/3147] fix(gcr/s) de-duplicate routing records This commit was moved from ipfs/go-ipfs-routing@1a8177b50e8f211423065473a1bb567a127852db --- routing/grandcentral/server.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index f1c8f8d417..4dbe79feb8 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -131,16 +131,25 @@ func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) e return nil } -func putRoutingProviders(ds datastore.Datastore, k util.Key, providers []*dhtpb.Message_Peer) error { +func putRoutingProviders(ds datastore.Datastore, k util.Key, newRecords []*dhtpb.Message_Peer) error { log.Event(context.Background(), "putRoutingProviders", &k) pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) - old, err := getRoutingProviders(ds, k) + oldRecords, err := getRoutingProviders(ds, k) if err != nil { return err } - providers = append(providers, old...) + mergedRecords := make(map[string]*dhtpb.Message_Peer) + for _, provider := range oldRecords { + mergedRecords[provider.GetId()] = provider // add original records + } + for _, provider := range newRecords { + mergedRecords[provider.GetId()] = provider // overwrite old record if new exists + } var protomsg dhtpb.Message - protomsg.ProviderPeers = providers + protomsg.ProviderPeers = make([]*dhtpb.Message_Peer, 0, len(mergedRecords)) + for _, provider := range mergedRecords { + protomsg.ProviderPeers = append(protomsg.ProviderPeers, provider) + } data, err := proto.Marshal(&protomsg) if err != nil { return err From 471d082b2a2db4e69986f25995874f15ca4eee59 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 02:45:28 -0800 Subject: [PATCH 0643/3147] refactor(gcr/s) move declaration This commit was moved from ipfs/go-ipfs-routing@d9e4555231d784209ad2eb3a02f58974d43d88e6 --- routing/grandcentral/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 4dbe79feb8..d8ad538ed2 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -133,7 +133,6 @@ func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) e func putRoutingProviders(ds datastore.Datastore, k util.Key, newRecords []*dhtpb.Message_Peer) error { log.Event(context.Background(), "putRoutingProviders", &k) - pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) oldRecords, err := getRoutingProviders(ds, k) if err != nil { return err @@ -154,6 +153,7 @@ func putRoutingProviders(ds datastore.Datastore, k util.Key, newRecords []*dhtpb if err != nil { return err } + pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) return ds.Put(pkey, data) } From 47dd319538c3997ca2b1720fdf8c1389a7b501da Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 02:48:01 -0800 Subject: [PATCH 0644/3147] refactor(gcr/s) extract provider key This commit was moved from ipfs/go-ipfs-routing@2ea9449484045bab0408e4062473914005e6a609 --- routing/grandcentral/server.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index d8ad538ed2..55eb703ea1 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -153,8 +153,7 @@ func putRoutingProviders(ds datastore.Datastore, k util.Key, newRecords []*dhtpb if err != nil { return err } - pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) - return ds.Put(pkey, data) + return ds.Put(providerKey(k), data) } func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb.Message_Peer) { @@ -175,8 +174,7 @@ func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_P e := log.EventBegin(context.Background(), "getProviders", &k) defer e.Done() var providers []*dhtpb.Message_Peer - pkey := datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) // TODO key fmt - if v, err := ds.Get(pkey); err == nil { + if v, err := ds.Get(providerKey(k)); err == nil { if data, ok := v.([]byte); ok { var msg dhtpb.Message if err := proto.Unmarshal(data, &msg); err != nil { @@ -187,3 +185,7 @@ func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_P } return providers, nil } + +func providerKey(k util.Key) datastore.Key { + return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) +} From 3930d690461ab61a1d184f1afc09d36491bd7e06 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 06:08:20 -0800 Subject: [PATCH 0645/3147] doc(gcr/c) comment methods This commit was moved from ipfs/go-ipfs-routing@cb6b1d41da7ab38f62a00b08114b1707e49a37c9 --- routing/grandcentral/proxy/standard.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/routing/grandcentral/proxy/standard.go b/routing/grandcentral/proxy/standard.go index 3fe33616f9..f32b58800f 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/grandcentral/proxy/standard.go @@ -38,6 +38,9 @@ func (p *standard) HandleStream(s inet.Stream) { s.Close() } +// 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 for _, i := range rand.Perm(len(px.Remotes)) { @@ -73,6 +76,9 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe return nil } +// SendRequest sends the request to each remote sequentially (randomized order), +// stopping after the first successful response. If all fail, returns the last +// error. func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { var err error for _, i := range rand.Perm(len(px.Remotes)) { From 71918965441c372a931d246ed9810fe66972acbc Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 06:09:21 -0800 Subject: [PATCH 0646/3147] fix(gcr/s) defer log event This commit was moved from ipfs/go-ipfs-routing@a5ba41507016fb190ca41409e5809b480c282198 --- routing/grandcentral/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 55eb703ea1..ebec06203f 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -42,7 +42,7 @@ func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Messag func (s *Server) handleMessage( ctx context.Context, p peer.ID, req *dhtpb.Message) (peer.ID, *dhtpb.Message) { - log.EventBegin(ctx, "routingMessageReceived", req, p, s.local).Done() // TODO may need to differentiate between local and remote + defer log.EventBegin(ctx, "routingMessageReceived", req, p, s.local).Done() // TODO may need to differentiate between local and remote var response = dhtpb.NewMessage(req.GetType(), req.GetKey(), req.GetClusterLevel()) switch req.GetType() { From f35f17be55a8af86550ade12a071400b7bae7a57 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 3 Feb 2015 14:25:22 -0800 Subject: [PATCH 0647/3147] misc(gcr/s) rm TODO This commit was moved from ipfs/go-ipfs-routing@53d41d96eba5072a5b73b78b6e264124fc3a1a1e --- routing/grandcentral/server.go | 1 - 1 file changed, 1 deletion(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index ebec06203f..8e11a667d5 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -38,7 +38,6 @@ func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Messag return response } -// TODO extract backend. backend can be implemented with whatever database we desire func (s *Server) handleMessage( ctx context.Context, p peer.ID, req *dhtpb.Message) (peer.ID, *dhtpb.Message) { From 0178377af9e7ea490e929b0ecca393721e939ccb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 3 Feb 2015 14:25:52 -0800 Subject: [PATCH 0648/3147] log(gcr/s) remove local peer in message-received event This commit was moved from ipfs/go-ipfs-routing@10b4313b8e7348a8c63d649cc6b4cbece5c52567 --- routing/grandcentral/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index 8e11a667d5..fafa5014a7 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -41,7 +41,7 @@ func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Messag func (s *Server) handleMessage( ctx context.Context, p peer.ID, req *dhtpb.Message) (peer.ID, *dhtpb.Message) { - defer log.EventBegin(ctx, "routingMessageReceived", req, p, s.local).Done() // TODO may need to differentiate between local and remote + defer log.EventBegin(ctx, "routingMessageReceived", req, p).Done() var response = dhtpb.NewMessage(req.GetType(), req.GetKey(), req.GetClusterLevel()) switch req.GetType() { From 4e4ab8e7de8188bd2d0299d1996cf2a7b18ea8ec Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 3 Feb 2015 14:29:28 -0800 Subject: [PATCH 0649/3147] remove TODO @jbenet when returning values for records, when would it make sense to also return providers for the records? This commit was moved from ipfs/go-ipfs-routing@f1f8d4c75d077b6391615af018e37ba32619a655 --- routing/grandcentral/server.go | 1 - 1 file changed, 1 deletion(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index fafa5014a7..c8a9707b47 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -52,7 +52,6 @@ func (s *Server) handleMessage( return "", nil } response.Record = rawRecord - // TODO before merging: if we know any providers for the requested value, return those. return p, response case dhtpb.Message_PUT_VALUE: From 5acfd7321e71ed8c2dc5a7d3cba3e2111ab48e77 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 3 Feb 2015 14:30:58 -0800 Subject: [PATCH 0650/3147] rm TODO (there's still one for verifying records) This commit was moved from ipfs/go-ipfs-routing@da8ed1c73adb6541d670efcaedeb2118282480a3 --- routing/grandcentral/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/grandcentral/server.go b/routing/grandcentral/server.go index c8a9707b47..6d18968d4e 100644 --- a/routing/grandcentral/server.go +++ b/routing/grandcentral/server.go @@ -57,7 +57,7 @@ func (s *Server) handleMessage( case dhtpb.Message_PUT_VALUE: // TODO before merging: verifyRecord(req.GetRecord()) putRoutingRecord(s.routingBackend, util.Key(req.GetKey()), req.GetRecord()) - return p, req // TODO before merging: verify that we should return record + return p, req case dhtpb.Message_FIND_NODE: p := s.peerstore.PeerInfo(peer.ID(req.GetKey())) From c9151f0f17240e0b9c439e5020d5414f023f1269 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 4 Feb 2015 04:07:30 -0800 Subject: [PATCH 0651/3147] refactor(routing) rename grandcentral to supernode thanks @mappum remove .go-ipfs This commit was moved from ipfs/go-ipfs-routing@bb047389741c40e6d9ce4687cffcd0f2732ebcaa --- routing/{grandcentral => supernode}/client.go | 8 ++++---- routing/{grandcentral => supernode}/proxy/loopback.go | 0 routing/{grandcentral => supernode}/proxy/standard.go | 10 +++++----- routing/{grandcentral => supernode}/server.go | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) rename routing/{grandcentral => supernode}/client.go (94%) rename routing/{grandcentral => supernode}/proxy/loopback.go (100%) rename routing/{grandcentral => supernode}/proxy/standard.go (92%) rename routing/{grandcentral => supernode}/server.go (97%) diff --git a/routing/grandcentral/client.go b/routing/supernode/client.go similarity index 94% rename from routing/grandcentral/client.go rename to routing/supernode/client.go index 99a507983a..96b58681e9 100644 --- a/routing/grandcentral/client.go +++ b/routing/supernode/client.go @@ -1,4 +1,4 @@ -package grandcentral +package supernode import ( "bytes" @@ -10,13 +10,13 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" - proxy "github.com/jbenet/go-ipfs/routing/grandcentral/proxy" + proxy "github.com/jbenet/go-ipfs/routing/supernode/proxy" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" errors "github.com/jbenet/go-ipfs/util/debugerror" ) -var log = eventlog.Logger("grandcentral") +var log = eventlog.Logger("supernode") type Client struct { peerhost host.Host @@ -128,7 +128,7 @@ func makeRecord(ps peer.Peerstore, p peer.ID, k u.Key, v []byte) (*pb.Record, er func (c *Client) Ping(ctx context.Context, id peer.ID) (time.Duration, error) { defer log.EventBegin(ctx, "ping", id).Done() - return time.Nanosecond, errors.New("grandcentral routing does not support the ping method") + return time.Nanosecond, errors.New("supernode routing does not support the ping method") } var _ routing.IpfsRouting = &Client{} diff --git a/routing/grandcentral/proxy/loopback.go b/routing/supernode/proxy/loopback.go similarity index 100% rename from routing/grandcentral/proxy/loopback.go rename to routing/supernode/proxy/loopback.go diff --git a/routing/grandcentral/proxy/standard.go b/routing/supernode/proxy/standard.go similarity index 92% rename from routing/grandcentral/proxy/standard.go rename to routing/supernode/proxy/standard.go index f32b58800f..1918e344ac 100644 --- a/routing/grandcentral/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -13,9 +13,9 @@ import ( errors "github.com/jbenet/go-ipfs/util/debugerror" ) -const ProtocolGCR = "/ipfs/grandcentral" +const ProtocolSNR = "/ipfs/supernoderouting" -var log = eventlog.Logger("grandcentral/proxy") +var log = eventlog.Logger("supernode/proxy") type Proxy interface { HandleStream(inet.Stream) @@ -34,7 +34,7 @@ func Standard(h host.Host, remotes []peer.ID) Proxy { func (p *standard) HandleStream(s inet.Stream) { // TODO(brian): Should clients be able to satisfy requests? - log.Error("grandcentral client received (dropped) a routing message from", s.Conn().RemotePeer()) + log.Error("supernode client received (dropped) a routing message from", s.Conn().RemotePeer()) s.Close() } @@ -64,7 +64,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe if err = px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { return err } - s, err := px.Host.NewStream(ProtocolGCR, remote) + s, err := px.Host.NewStream(ProtocolSNR, remote) if err != nil { return err } @@ -100,7 +100,7 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe e.SetError(err) return nil, err } - s, err := px.Host.NewStream(ProtocolGCR, remote) + s, err := px.Host.NewStream(ProtocolSNR, remote) if err != nil { e.SetError(err) return nil, err diff --git a/routing/grandcentral/server.go b/routing/supernode/server.go similarity index 97% rename from routing/grandcentral/server.go rename to routing/supernode/server.go index 6d18968d4e..f5efb77eff 100644 --- a/routing/grandcentral/server.go +++ b/routing/supernode/server.go @@ -1,4 +1,4 @@ -package grandcentral +package supernode import ( "fmt" @@ -8,7 +8,7 @@ import ( datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" peer "github.com/jbenet/go-ipfs/p2p/peer" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" - proxy "github.com/jbenet/go-ipfs/routing/grandcentral/proxy" + proxy "github.com/jbenet/go-ipfs/routing/supernode/proxy" util "github.com/jbenet/go-ipfs/util" errors "github.com/jbenet/go-ipfs/util/debugerror" ) @@ -21,7 +21,7 @@ type Server struct { *proxy.Loopback // so server can be injected into client } -// NewServer creates a new GrandCentral routing Server +// NewServer creates a new Supernode routing Server func NewServer(ds datastore.ThreadSafeDatastore, ps peer.Peerstore, local peer.ID) (*Server, error) { s := &Server{local, ds, ps, nil} s.Loopback = &proxy.Loopback{ From ccbbbfc894afd0015ae95f909faf0e15c8a8e622 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 4 Feb 2015 04:20:33 -0800 Subject: [PATCH 0652/3147] remove todo this functionality is here as an optimization This commit was moved from ipfs/go-ipfs-routing@f55e55078318e99f8427f840e81153916dafd09e --- routing/supernode/server.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index f5efb77eff..ee6ae678f9 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -71,9 +71,6 @@ func (s *Server) handleMessage( return p.ID, response case dhtpb.Message_ADD_PROVIDER: - // FIXME(btc): do we want to store these locally? I think the - // storeProvidersToPeerstore behavior is straight from the DHT message - // handler. storeProvidersToPeerstore(s.peerstore, p, req.GetProviderPeers()) if err := putRoutingProviders(s.routingBackend, util.Key(req.GetKey()), req.GetProviderPeers()); err != nil { From 00904ed13362994db8d55ba83aa1f5447dbb4bd6 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 4 Feb 2015 04:27:14 -0800 Subject: [PATCH 0653/3147] ensure we only accept AddProvider records if the peer is the sender This commit was moved from ipfs/go-ipfs-routing@835438e88223e4768631c90946042e05f88615b0 --- routing/supernode/server.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index ee6ae678f9..cbf240a193 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -71,10 +71,17 @@ func (s *Server) handleMessage( return p.ID, response case dhtpb.Message_ADD_PROVIDER: - storeProvidersToPeerstore(s.peerstore, p, req.GetProviderPeers()) - - if err := putRoutingProviders(s.routingBackend, util.Key(req.GetKey()), req.GetProviderPeers()); err != nil { - return "", nil + for _, provider := range req.GetProviderPeers() { + providerID := peer.ID(provider.GetId()) + if providerID == p { + store := []*dhtpb.Message_Peer{provider} + storeProvidersToPeerstore(s.peerstore, p, store) + if err := putRoutingProviders(s.routingBackend, util.Key(req.GetKey()), store); err != nil { + return "", nil + } + } else { + log.Event(ctx, "addProviderBadRequest", p, req) + } } return "", nil From a568030f81d39e9ef0b744ce4957eec978b23b12 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 4 Feb 2015 15:17:42 -0800 Subject: [PATCH 0654/3147] test GetPutRecord validate doesn't work. the peer's public key is not present in the peerstore. This commit was moved from ipfs/go-ipfs-routing@1396c1ab9ea1db1dc182e897599c572ec6b9c6df --- routing/supernode/server.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index cbf240a193..78a686ebe4 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,6 +8,7 @@ import ( datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" peer "github.com/jbenet/go-ipfs/p2p/peer" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" + record "github.com/jbenet/go-ipfs/routing/record" proxy "github.com/jbenet/go-ipfs/routing/supernode/proxy" util "github.com/jbenet/go-ipfs/util" errors "github.com/jbenet/go-ipfs/util/debugerror" @@ -55,7 +56,12 @@ func (s *Server) handleMessage( return p, response case dhtpb.Message_PUT_VALUE: - // TODO before merging: verifyRecord(req.GetRecord()) + // FIXME: verify complains that the peer's ID is not present in the + // peerstore. Mocknet problem? + // if err := verify(s.peerstore, req.GetRecord()); err != nil { + // log.Event(ctx, "validationFailed", req, p) + // return "", nil + // } putRoutingRecord(s.routingBackend, util.Key(req.GetKey()), req.GetRecord()) return p, req @@ -191,3 +197,17 @@ func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_P func providerKey(k util.Key) datastore.Key { return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) } + +func verify(ps peer.Peerstore, r *dhtpb.Record) error { + v := make(record.Validator) + v["pk"] = record.ValidatePublicKeyRecord + p := peer.ID(r.GetAuthor()) + pk := ps.PubKey(p) + if pk == nil { + return fmt.Errorf("do not have public key for %s", p) + } + if err := v.VerifyRecord(r, pk); err != nil { + return err + } + return nil +} From 1081c7c2837cd8c6b12fc37d220411decf3f1078 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 07:31:53 -0800 Subject: [PATCH 0655/3147] fix(grc) move Bootstrap method onto routing interface This commit was moved from ipfs/go-ipfs-routing@d4c2e06461d8c63984ea781fa124c88f513996f0 --- routing/supernode/client.go | 4 ++++ routing/supernode/proxy/loopback.go | 5 +++++ routing/supernode/proxy/standard.go | 18 ++++++++++++++---- routing/supernode/server.go | 4 ++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 96b58681e9..14a264524b 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -131,4 +131,8 @@ func (c *Client) Ping(ctx context.Context, id peer.ID) (time.Duration, error) { return time.Nanosecond, errors.New("supernode routing does not support the ping method") } +func (c *Client) Bootstrap(ctx context.Context) error { + return c.proxy.Bootstrap(ctx) +} + var _ routing.IpfsRouting = &Client{} diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index e5fa39deb8..01aeeac3c5 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -20,6 +20,11 @@ type Loopback struct { Local peer.ID } +func (_ *Loopback) Bootstrap(ctx context.Context) error { + return nil +} + + // SendMessage intercepts local requests, forwarding them to a local handler func (lb *Loopback) SendMessage(ctx context.Context, m *dhtpb.Message) error { response := lb.Handler.HandleRequest(ctx, lb.Local, m) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 1918e344ac..1a095cd640 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -18,6 +18,7 @@ const ProtocolSNR = "/ipfs/supernoderouting" var log = eventlog.Logger("supernode/proxy") type Proxy interface { + Bootstrap(context.Context) error HandleStream(inet.Stream) SendMessage(ctx context.Context, m *dhtpb.Message) error SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) @@ -25,13 +26,22 @@ type Proxy interface { type standard struct { Host host.Host - Remotes []peer.ID + Remotes []peer.PeerInfo } -func Standard(h host.Host, remotes []peer.ID) Proxy { +func Standard(h host.Host, remotes []peer.PeerInfo) Proxy { return &standard{h, remotes} } +func (px *standard) Bootstrap(ctx context.Context) error { + for _, info := range px.Remotes { + if err := px.Host.Connect(ctx, info); err != nil { + return err // TODO + } + } + return nil +} + func (p *standard) HandleStream(s inet.Stream) { // TODO(brian): Should clients be able to satisfy requests? log.Error("supernode client received (dropped) a routing message from", s.Conn().RemotePeer()) @@ -44,7 +54,7 @@ func (p *standard) HandleStream(s inet.Stream) { func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { var err error for _, i := range rand.Perm(len(px.Remotes)) { - remote := px.Remotes[i] + remote := px.Remotes[i].ID if err = px.sendMessage(ctx, m, remote); err != nil { // careful don't re-declare err! continue } @@ -82,7 +92,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { var err error for _, i := range rand.Perm(len(px.Remotes)) { - remote := px.Remotes[i] + remote := px.Remotes[i].ID var reply *dhtpb.Message reply, err = px.sendRequest(ctx, m, remote) // careful don't redeclare err! if err != nil { diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 78a686ebe4..5aca4c4d09 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -32,6 +32,10 @@ func NewServer(ds datastore.ThreadSafeDatastore, ps peer.Peerstore, local peer.I return s, nil } +func (_ *Server) Bootstrap(ctx context.Context) error { + return nil +} + // HandleLocalRequest implements the proxy.RequestHandler interface. This is // where requests are received from the outside world. func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Message) *dhtpb.Message { From a0fcbdc7a7d455e69104a5039e9a09d2f273758e Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 3 Feb 2015 13:50:49 -0800 Subject: [PATCH 0656/3147] refactor(routing) expose Bootstrap() error on routing interface This commit was moved from ipfs/go-ipfs-routing@acff69286e5b4da6b4da3369e892743d9855b058 --- routing/dht/dht_bootstrap.go | 8 +++++++- routing/mock/centralized_client.go | 4 ++++ routing/offline/offline.go | 4 ++++ routing/routing.go | 6 ++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index f2cc50f9a7..18451f1c3a 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -4,6 +4,7 @@ package dht import ( "crypto/rand" + "errors" "fmt" "sync" "time" @@ -44,13 +45,18 @@ var DefaultBootstrapConfig = BootstrapConfig{ Timeout: time.Duration(20 * time.Second), } +func (dht *IpfsDHT) Bootstrap(context.Context) error { + // Bootstrap satisfies the routing interface + return errors.New("TODO: perform DHT bootstrap") +} + // Bootstrap ensures the dht routing table remains healthy as peers come and go. // it builds up a list of peers by requesting random peer IDs. The Bootstrap // process will run a number of queries each time, and run every time signal fires. // These parameters are configurable. // // Bootstrap returns a process, so the user can stop it. -func (dht *IpfsDHT) Bootstrap(config BootstrapConfig) (goprocess.Process, error) { +func (dht *IpfsDHT) BootstrapWithConfig(config BootstrapConfig) (goprocess.Process, error) { sig := time.Tick(config.Period) return dht.BootstrapOnSignal(config, sig) } diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 4a9b63b01d..6d358f52b7 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -84,4 +84,8 @@ func (c *client) Ping(ctx context.Context, p peer.ID) (time.Duration, error) { return 0, nil } +func (c *client) Bootstrap(context.Context) error { + return nil +} + var _ routing.IpfsRouting = &client{} diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 63fb144410..c73d733918 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -89,5 +89,9 @@ func (c *offlineRouting) Ping(ctx context.Context, p peer.ID) (time.Duration, er return 0, ErrOffline } +func (c *offlineRouting) Bootstrap(context.Context) (error) { + return nil +} + // ensure offlineRouting matches the IpfsRouting interface var _ routing.IpfsRouting = &offlineRouting{} diff --git a/routing/routing.go b/routing/routing.go index 8238aa45c4..3dea2feb61 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -40,4 +40,10 @@ type IpfsRouting interface { // Ping a peer, log the time it took Ping(context.Context, peer.ID) (time.Duration, error) + + // Bootstrap allows callers to hint to the routing system to get into a + // Boostrapped state + Bootstrap(context.Context) error + + // TODO expose io.Closer or plain-old Close error } From 208533fad96a34f8eab8ea64a193eb8ada60191a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 5 Feb 2015 07:53:53 -0800 Subject: [PATCH 0657/3147] bootstrap: update bootstrapping process. Note: the dht-specific part of the bootstrap function was only there to make sure to call `dht.Update(ctx, npeer)`. This already happens on all new connections made by the network, as the dht is signed up for notifications. This commit was moved from ipfs/go-ipfs-routing@b078ad2a000e879ef3fad89c5b3e60c5a97b0500 --- routing/dht/dht_bootstrap.go | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 18451f1c3a..7eedb48212 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -4,7 +4,6 @@ package dht import ( "crypto/rand" - "errors" "fmt" "sync" "time" @@ -45,17 +44,37 @@ var DefaultBootstrapConfig = BootstrapConfig{ Timeout: time.Duration(20 * time.Second), } -func (dht *IpfsDHT) Bootstrap(context.Context) error { - // Bootstrap satisfies the routing interface - return errors.New("TODO: perform DHT bootstrap") +// Bootstrap ensures the dht routing table remains healthy as peers come and go. +// it builds up a list of peers by requesting random peer IDs. The Bootstrap +// process will run a number of queries each time, and run every time signal fires. +// These parameters are configurable. +// +// As opposed to BootstrapWithConfig, Bootstrap satisfies the routing interface +func (dht *IpfsDHT) Bootstrap(ctx context.Context) error { + proc, err := dht.BootstrapWithConfig(DefaultBootstrapConfig) + if err != nil { + return err + } + + // wait till ctx or dht.Context exits. + // we have to do it this way to satisfy the Routing interface (contexts) + go func() { + defer proc.Close() + select { + case <-ctx.Done(): + case <-dht.Context().Done(): + } + }() + + return nil } -// Bootstrap ensures the dht routing table remains healthy as peers come and go. +// BootstrapWithConfig ensures the dht routing table remains healthy as peers come and go. // it builds up a list of peers by requesting random peer IDs. The Bootstrap // process will run a number of queries each time, and run every time signal fires. // These parameters are configurable. // -// Bootstrap returns a process, so the user can stop it. +// BootstrapWithConfig returns a process, so the user can stop it. func (dht *IpfsDHT) BootstrapWithConfig(config BootstrapConfig) (goprocess.Process, error) { sig := time.Tick(config.Period) return dht.BootstrapOnSignal(config, sig) From a72ce773cdff7044b2714305bd40e2e2f170d3a6 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Mon, 2 Feb 2015 04:31:48 -0800 Subject: [PATCH 0658/3147] test(snr/s) put fix This commit was moved from ipfs/go-ipfs-routing@4d33dce3b758134da1badd0db1aaa4369a2878de --- routing/supernode/server_test.go | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 routing/supernode/server_test.go diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go new file mode 100644 index 0000000000..0d2d00318e --- /dev/null +++ b/routing/supernode/server_test.go @@ -0,0 +1,40 @@ +package supernode + +import ( + "testing" + + datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" + "github.com/jbenet/go-ipfs/util" +) + +func TestPutProviderDoesntResultInDuplicates(t *testing.T) { + routingBackend := datastore.NewMapDatastore() + k := util.Key("foo") + put := []*dhtpb.Message_Peer{ + convPeer("bob", "127.0.0.1/tcp/4001"), + convPeer("alice", "10.0.0.10/tcp/4001"), + } + if err := putRoutingProviders(routingBackend, k, put); err != nil { + t.Fatal(err) + } + if err := putRoutingProviders(routingBackend, k, put); err != nil { + t.Fatal(err) + } + + got, err := getRoutingProviders(routingBackend, k) + if err != nil { + t.Fatal(err) + } + if len(got) != 2 { + t.Fatal("should be 2 values, but there are", len(got)) + } +} + +func convPeer(name string, addrs ...string) *dhtpb.Message_Peer { + var rawAddrs [][]byte + for _, addr := range addrs { + rawAddrs = append(rawAddrs, []byte(addr)) + } + return &dhtpb.Message_Peer{Id: &name, Addrs: rawAddrs} +} From 50457ef5886a8aac97836bef19105dfd492d7f1f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 6 Feb 2015 10:49:52 -0700 Subject: [PATCH 0659/3147] style(routing/supernode/client) fix indent This commit was moved from ipfs/go-ipfs-routing@3fe1c7072eeb75bc2a27393b939e5b7c2a383d64 --- routing/supernode/proxy/standard.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 1a095cd640..999029e9f5 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -34,11 +34,11 @@ func Standard(h host.Host, remotes []peer.PeerInfo) Proxy { } func (px *standard) Bootstrap(ctx context.Context) error { - for _, info := range px.Remotes { - if err := px.Host.Connect(ctx, info); err != nil { - return err // TODO - } + for _, info := range px.Remotes { + if err := px.Host.Connect(ctx, info); err != nil { + return err // TODO } + } return nil } From 4869f7fc136917acbba5d0a5bbe455bc42c2f3ab Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 6 Feb 2015 11:24:49 -0700 Subject: [PATCH 0660/3147] log(routing) report boostrap result to user This commit was moved from ipfs/go-ipfs-routing@fed010e39a2b34341316369d22cf4a28ced86beb --- routing/supernode/proxy/standard.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 999029e9f5..039997a6fe 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -34,10 +34,17 @@ func Standard(h host.Host, remotes []peer.PeerInfo) Proxy { } func (px *standard) Bootstrap(ctx context.Context) error { + var cxns []peer.PeerInfo for _, info := range px.Remotes { if err := px.Host.Connect(ctx, info); err != nil { - return err // TODO + continue } + cxns = append(cxns, info) + } + if len(cxns) == 0 { + log.Critical("unable to bootstrap to any supernode routers") + } else { + log.Info("bootstrapped to %d supernode routers: %s", len(cxns), cxns) } return nil } From c24be77811a314c7d71d2a0f477e0e0c2272b9f4 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 6 Feb 2015 14:03:33 -0700 Subject: [PATCH 0661/3147] fix log This commit was moved from ipfs/go-ipfs-routing@e84a97079599d9a1c59e4fce14382a1b20e5d550 --- routing/supernode/proxy/standard.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 039997a6fe..cb458acc2d 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -44,7 +44,7 @@ func (px *standard) Bootstrap(ctx context.Context) error { if len(cxns) == 0 { log.Critical("unable to bootstrap to any supernode routers") } else { - log.Info("bootstrapped to %d supernode routers: %s", len(cxns), cxns) + log.Infof("bootstrapped to %d supernode routers: %s", len(cxns), cxns) } return nil } From fb0f350fc0b8bc0bb23ad5379555ceab7b381105 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 12 Feb 2015 09:51:56 -0800 Subject: [PATCH 0662/3147] feat(snrouting): pick remote based on XOR distance metric This commit was moved from ipfs/go-ipfs-routing@4487bfd5c13e216ce19c7a344adc08e6f6d7cc8c --- routing/supernode/proxy/standard.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index cb458acc2d..3e4e2291c7 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -1,15 +1,15 @@ package proxy import ( - "math/rand" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" host "github.com/jbenet/go-ipfs/p2p/host" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" + kbucket "github.com/jbenet/go-ipfs/routing/kbucket" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" + "github.com/jbenet/go-ipfs/util" errors "github.com/jbenet/go-ipfs/util/debugerror" ) @@ -25,17 +25,23 @@ type Proxy interface { } type standard struct { - Host host.Host - Remotes []peer.PeerInfo + Host host.Host + + remoteInfos []peer.PeerInfo // addr required for bootstrapping + remoteIDs []peer.ID // []ID is required for each req. here, cached for performance. } func Standard(h host.Host, remotes []peer.PeerInfo) Proxy { - return &standard{h, remotes} + var ids []peer.ID + for _, remote := range remotes { + ids = append(ids, remote.ID) + } + return &standard{h, remotes, ids} } func (px *standard) Bootstrap(ctx context.Context) error { var cxns []peer.PeerInfo - for _, info := range px.Remotes { + for _, info := range px.remoteInfos { if err := px.Host.Connect(ctx, info); err != nil { continue } @@ -60,8 +66,7 @@ func (p *standard) HandleStream(s inet.Stream) { // error. func (px *standard) SendMessage(ctx context.Context, m *dhtpb.Message) error { var err error - for _, i := range rand.Perm(len(px.Remotes)) { - remote := px.Remotes[i].ID + for _, remote := range sortedByKey(px.remoteIDs, m.GetKey()) { if err = px.sendMessage(ctx, m, remote); err != nil { // careful don't re-declare err! continue } @@ -98,8 +103,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe // error. func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { var err error - for _, i := range rand.Perm(len(px.Remotes)) { - remote := px.Remotes[i].ID + for _, remote := range sortedByKey(px.remoteIDs, m.GetKey()) { var reply *dhtpb.Message reply, err = px.sendRequest(ctx, m, remote) // careful don't redeclare err! if err != nil { @@ -145,3 +149,8 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe e.Append(eventlog.Pair("uuid", eventlog.Uuid("foo"))) return response, nil } + +func sortedByKey(peers []peer.ID, key string) []peer.ID { + target := kbucket.ConvertKey(util.Key(key)) + return kbucket.SortClosestPeers(peers, target) +} From 63c1ddb6064a519163836107f21b7ee5d3a8eef9 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 12 Feb 2015 13:56:27 -0800 Subject: [PATCH 0663/3147] feat(snrouting) replicate Provider, PutValue to multiple remotes This commit was moved from ipfs/go-ipfs-routing@2af3b166685b397c5278d53d23cf462226707b82 --- routing/supernode/proxy/standard.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 3e4e2291c7..e45bfb72b8 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 From 0cfd591d63ccc518a6a5de7acfc35f30be85ae50 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 18 Feb 2015 08:33:26 +0000 Subject: [PATCH 0664/3147] teach pinning how to use GetBlocks This commit was moved from ipfs/go-ipfs-pinner@3bd4a4b0416a7ac03ed6b2310e60a4ea659ee561 --- pinning/pinner/pin.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 466dfba413..666e87b6f1 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -7,7 +7,9 @@ import ( "errors" "fmt" "sync" + "time" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" "github.com/jbenet/go-ipfs/blocks/set" @@ -170,8 +172,10 @@ func (p *pinner) pinIndirectRecurse(node *mdag.Node) error { } func (p *pinner) pinLinks(node *mdag.Node) error { - for _, l := range node.Links { - subnode, err := l.GetNode(p.dserv) + ctx, _ := context.WithTimeout(context.Background(), time.Second*60) + for _, ng := range p.dserv.GetDAG(ctx, node) { + subnode, err := ng.Get() + //subnode, err := l.GetNode(p.dserv) if err != nil { // TODO: Maybe just log and continue? return err From 359c35e62e697c3a530df0bce6e39fe372d9d0bd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 18 Feb 2015 08:44:44 +0000 Subject: [PATCH 0665/3147] teach unixfs/tar (aka ipfs get) how to use GetBlocks This commit was moved from ipfs/go-unixfs@dcb7a5312f02d6924bd3ef51dc3325eb0eeb8174 --- unixfs/tar/reader.go | 96 ++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index e27f6af413..4d4f20c884 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -60,20 +60,20 @@ func NewReader(path path.Path, dag mdag.DAGService, resolver *path.Resolver, com return reader, nil } -func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { +func (r *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { pb := new(upb.Data) err := proto.Unmarshal(dagnode.Data, pb) if err != nil { - i.emitError(err) + r.emitError(err) return } if depth == 0 { - defer i.close() + defer r.close() } if pb.GetType() == upb.Data_Directory { - err = i.writer.WriteHeader(&tar.Header{ + err = r.writer.WriteHeader(&tar.Header{ Name: path, Typeflag: tar.TypeDir, Mode: 0777, @@ -81,23 +81,25 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { // TODO: set mode, dates, etc. when added to unixFS }) if err != nil { - i.emitError(err) + r.emitError(err) return } - i.flush() + r.flush() - for _, link := range dagnode.Links { - childNode, err := link.GetNode(i.dag) + ctx, _ := context.WithTimeout(context.TODO(), time.Second*60) + + for i, ng := range r.dag.GetDAG(ctx, dagnode) { + childNode, err := ng.Get() if err != nil { - i.emitError(err) + r.emitError(err) return } - i.writeToBuf(childNode, gopath.Join(path, link.Name), depth+1) + r.writeToBuf(childNode, gopath.Join(path, dagnode.Links[i].Name), depth+1) } return } - err = i.writer.WriteHeader(&tar.Header{ + err = r.writer.WriteHeader(&tar.Header{ Name: path, Size: int64(pb.GetFilesize()), Typeflag: tar.TypeReg, @@ -106,95 +108,95 @@ func (i *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { // TODO: set mode, dates, etc. when added to unixFS }) if err != nil { - i.emitError(err) + r.emitError(err) return } - i.flush() + r.flush() - reader, err := uio.NewDagReader(context.TODO(), dagnode, i.dag) + reader, err := uio.NewDagReader(context.TODO(), dagnode, r.dag) if err != nil { - i.emitError(err) + r.emitError(err) return } - err = i.syncCopy(reader) + err = r.syncCopy(reader) if err != nil { - i.emitError(err) + r.emitError(err) return } } -func (i *Reader) Read(p []byte) (int, error) { +func (r *Reader) Read(p []byte) (int, error) { // wait for the goroutine that is writing data to the buffer to tell us // there is something to read - if !i.closed { - <-i.signalChan + if !r.closed { + <-r.signalChan } - if i.err != nil { - return 0, i.err + if r.err != nil { + return 0, r.err } - if !i.closed { - defer i.signal() + if !r.closed { + defer r.signal() } - if i.buf.Len() == 0 { - if i.closed { + if r.buf.Len() == 0 { + if r.closed { return 0, io.EOF } return 0, nil } - n, err := i.buf.Read(p) - if err == io.EOF && !i.closed || i.buf.Len() > 0 { + n, err := r.buf.Read(p) + if err == io.EOF && !r.closed || r.buf.Len() > 0 { return n, nil } return n, err } -func (i *Reader) signal() { - i.signalChan <- struct{}{} +func (r *Reader) signal() { + r.signalChan <- struct{}{} } -func (i *Reader) flush() { - i.signal() - <-i.signalChan +func (r *Reader) flush() { + r.signal() + <-r.signalChan } -func (i *Reader) emitError(err error) { - i.err = err - i.signal() +func (r *Reader) emitError(err error) { + r.err = err + r.signal() } -func (i *Reader) close() { - i.closed = true - defer i.signal() - err := i.writer.Close() +func (r *Reader) close() { + r.closed = true + defer r.signal() + err := r.writer.Close() if err != nil { - i.emitError(err) + r.emitError(err) return } - if i.gzipWriter != nil { - err = i.gzipWriter.Close() + if r.gzipWriter != nil { + err = r.gzipWriter.Close() if err != nil { - i.emitError(err) + r.emitError(err) return } } } -func (i *Reader) syncCopy(reader io.Reader) error { +func (r *Reader) syncCopy(reader io.Reader) error { buf := make([]byte, 32*1024) for { nr, err := reader.Read(buf) if nr > 0 { - _, err := i.writer.Write(buf[:nr]) + _, err := r.writer.Write(buf[:nr]) if err != nil { return err } - i.flush() + r.flush() } if err == io.EOF { break From 0488a69e1867738a80611fa94501a134d3d0bca0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 18 Feb 2015 09:29:29 +0000 Subject: [PATCH 0666/3147] pinner now requires all nodes exist in blockstore This commit was moved from ipfs/go-ipfs-pinner@a12db134a717a1d416db2de3d08e308c3966d600 --- pinning/pinner/pin.go | 1 - pinning/pinner/pin_test.go | 18 +++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 666e87b6f1..25edd58323 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -175,7 +175,6 @@ func (p *pinner) pinLinks(node *mdag.Node) error { ctx, _ := context.WithTimeout(context.Background(), time.Second*60) for _, ng := range p.dserv.GetDAG(ctx, node) { subnode, err := ng.Get() - //subnode, err := l.GetNode(p.dserv) if err != nil { // TODO: Maybe just log and continue? return err diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 623983a341..c8d18f0277 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -34,6 +34,10 @@ func TestPinnerBasic(t *testing.T) { p := NewPinner(dstore, dserv) a, ak := randNode() + _, err = dserv.Add(a) + if err != nil { + t.Fatal(err) + } // Pin A{} err = p.Pin(a, false) @@ -45,18 +49,30 @@ func TestPinnerBasic(t *testing.T) { t.Fatal("Failed to find key") } + // create new node c, to be indirectly pinned through b + c, ck := randNode() + _, err = dserv.Add(c) + if err != nil { + t.Fatal(err) + } + + // Create new node b, to be parent to a and c b, _ := randNode() err = b.AddNodeLink("child", a) if err != nil { t.Fatal(err) } - c, ck := randNode() err = b.AddNodeLink("otherchild", c) if err != nil { t.Fatal(err) } + _, err = dserv.Add(b) + if err != nil { + t.Fatal(err) + } + // recursively pin B{A,C} err = p.Pin(b, true) if err != nil { From a15d1229f7922ed232a65ec2a3337edaf8b9a9c8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 21 Feb 2015 16:20:28 -0800 Subject: [PATCH 0667/3147] add put and get dht commands to cli This commit was moved from ipfs/go-ipfs-routing@f7a86f2f0285aa11f1c2c1c4e076b6df4cd76c13 --- routing/dht/dht.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/routing.go | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index edd18ff11f..e3d0549251 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -322,7 +322,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ // == to self? thats bad for _, p := range closer { if p == dht.self { - log.Debug("Attempted to return self! this shouldnt happen...") + log.Error("Attempted to return self! this shouldnt happen...") return nil } } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 03c3eda3ca..defb7e4886 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -83,7 +83,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) - if closer != nil { + if len(closer) > 0 { closerinfos := peer.PeerInfos(dht.peerstore, closer) for _, pi := range closerinfos { log.Debugf("handleGetValue returning closer peer: '%s'", pi.ID) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index ade41b82e5..49449eda7c 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -59,6 +59,11 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error wg.Add(1) go func(p peer.ID) { defer wg.Done() + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.Value, + ID: p, + }) + err := dht.putValueToPeer(ctx, p, key, rec) if err != nil { log.Debugf("failed putting value to peer: %s", err) @@ -92,6 +97,11 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // setup the Query query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.SendingQuery, + ID: p, + }) + val, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { return nil, err @@ -102,6 +112,12 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { res.success = true } + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.PeerResponse, + ID: p, + Responses: pointerizePeerInfos(peers), + }) + return res, nil }) From 9fd3e1aec07e87a474a5dfe9349a82d4b37e496f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 21 Feb 2015 19:26:58 -0800 Subject: [PATCH 0668/3147] dont potentially kill our memory This commit was moved from ipfs/go-ipfs-routing@066fdbcfe269888c3213885e4c23c99123bbc77b --- routing/dht/routing.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 49449eda7c..99df4423c4 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,7 +1,6 @@ package dht import ( - "math" "sync" "time" @@ -89,7 +88,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // get closest peers in the routing table rtp := dht.routingTable.ListPeers() - log.Debugf("peers in rt: %s", len(rtp), rtp) + log.Errorf("peers in rt: %s", len(rtp), rtp) if len(rtp) == 0 { log.Warning("No peers from routing table!") return nil, errors.Wrap(kb.ErrLookupFailure) @@ -169,7 +168,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { // FindProviders searches until the context expires. func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerInfo, error) { var providers []peer.PeerInfo - for p := range dht.FindProvidersAsync(ctx, key, math.MaxInt32) { + for p := range dht.FindProvidersAsync(ctx, key, KValue) { providers = append(providers, p) } return providers, nil From e83778d12e0ff252c20d2b008fedb5d06d5b65db Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Feb 2015 11:22:45 -0800 Subject: [PATCH 0669/3147] error -> debug This commit was moved from ipfs/go-ipfs-routing@a062e1f2707d840befab0da22d4ef1ca2ad8410f --- routing/dht/dht.go | 2 +- routing/dht/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e3d0549251..1c5c921f36 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -322,7 +322,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ // == to self? thats bad for _, p := range closer { if p == dht.self { - log.Error("Attempted to return self! this shouldnt happen...") + log.Info("Attempted to return self! this shouldnt happen...") return nil } } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 99df4423c4..e5652dc8de 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -88,7 +88,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // get closest peers in the routing table rtp := dht.routingTable.ListPeers() - log.Errorf("peers in rt: %s", len(rtp), rtp) + log.Debugf("peers in rt: %s", len(rtp), rtp) if len(rtp) == 0 { log.Warning("No peers from routing table!") return nil, errors.Wrap(kb.ErrLookupFailure) From b3e47532af5bdf7ffa1e514943cc225c084435d7 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0670/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-ipfs-routing@0c4de74b408c1bf1c6b2984e63baed28b08f9c32 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 3 +-- routing/dht/ext_test.go | 5 ++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 3 +-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 2 +- routing/dht/records.go | 3 +-- routing/dht/routing.go | 3 +-- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/routing.go | 3 +-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 3 +-- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- 23 files changed, 25 insertions(+), 32 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index edd18ff11f..1294d9c4ae 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -21,10 +21,10 @@ import ( "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) var log = eventlog.Logger("dht") @@ -78,7 +78,7 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) dht.providers = NewProviderManager(dht.Context(), dht.self) - dht.AddChildGroup(dht.providers) + dht.AddChild(dht.providers) dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) dht.birth = time.Now() diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 7eedb48212..79dcb4d646 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -12,9 +12,9 @@ import ( routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" goprocess "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" periodicproc "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) // BootstrapConfig specifies parameters used bootstrapping the DHT. diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 15b0b63d82..d84e8e008d 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -9,8 +9,8 @@ import ( pb "github.com/jbenet/go-ipfs/routing/dht/pb" ctxutil "github.com/jbenet/go-ipfs/util/ctx" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b57caacccb..54a6448778 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -9,11 +9,10 @@ import ( "testing" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" netutil "github.com/jbenet/go-ipfs/p2p/test/util" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index ab756b5e4d..ec5fffac32 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "math/rand" "testing" + "time" inet "github.com/jbenet/go-ipfs/p2p/net" mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" @@ -14,12 +15,10 @@ import ( record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - - "time" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 03c3eda3ca..c1e96e402f 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index a713e553de..59ef3911fd 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -1,8 +1,7 @@ package dht import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" notif "github.com/jbenet/go-ipfs/notifications" peer "github.com/jbenet/go-ipfs/p2p/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" diff --git a/routing/dht/providers.go b/routing/dht/providers.go index f4f7514fbb..1f95bdf82e 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -7,7 +7,7 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) type providerInfo struct { diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 2781a3c59d..22990d5804 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -6,7 +6,7 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) func TestProviderManager(t *testing.T) { diff --git a/routing/dht/query.go b/routing/dht/query.go index 7a32b45bb9..aacab106f1 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -12,8 +12,8 @@ import ( pset "github.com/jbenet/go-ipfs/util/peerset" todoctr "github.com/jbenet/go-ipfs/util/todocounter" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) var maxQueryConcurrency = AlphaValue diff --git a/routing/dht/records.go b/routing/dht/records.go index 0bc7011530..c6baf49999 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -3,8 +3,7 @@ package dht import ( "fmt" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index ade41b82e5..7aa423285f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -5,8 +5,7 @@ import ( "sync" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" notif "github.com/jbenet/go-ipfs/notifications" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 6d358f52b7..6a550bfaa8 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,9 +4,9 @@ import ( "errors" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index dc462797ab..a0ee67e6d1 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -5,8 +5,8 @@ import ( "sync" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 56f61c0761..d77144a73e 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" delay "github.com/jbenet/go-ipfs/thirdparty/delay" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 2235970f58..0fe30b119e 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -1,9 +1,9 @@ package mockrouting import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" dht "github.com/jbenet/go-ipfs/routing/dht" "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index f8b0340988..34092dfda8 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,8 +5,8 @@ package mockrouting import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" delay "github.com/jbenet/go-ipfs/thirdparty/delay" diff --git a/routing/offline/offline.go b/routing/offline/offline.go index c73d733918..324e438be5 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,9 +4,9 @@ import ( "errors" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/jbenet/go-ipfs/p2p/crypto" "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" diff --git a/routing/routing.go b/routing/routing.go index 3dea2feb61..be400a5205 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,7 @@ import ( "errors" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 14a264524b..09fa90ef6d 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -4,8 +4,8 @@ import ( "bytes" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" "github.com/jbenet/go-ipfs/p2p/host" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 01aeeac3c5..df9dc1d729 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,8 +1,8 @@ package proxy import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" @@ -24,7 +24,6 @@ func (_ *Loopback) Bootstrap(ctx context.Context) error { return nil } - // SendMessage intercepts local requests, forwarding them to a local handler func (lb *Loopback) SendMessage(ctx context.Context, m *dhtpb.Message) error { response := lb.Handler.HandleRequest(ctx, lb.Local, m) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index e45bfb72b8..92a6d9f01b 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -1,8 +1,8 @@ package proxy import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" host "github.com/jbenet/go-ipfs/p2p/host" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 5aca4c4d09..be587f7492 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -3,9 +3,9 @@ package supernode import ( "fmt" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/jbenet/go-ipfs/p2p/peer" dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" record "github.com/jbenet/go-ipfs/routing/record" From 1c70848c78a4af649af77dad06ae08e6833baef8 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0671/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-namesys@543c7420ead4d6a099ec40f96c4a87c21ae871ce --- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/namesys.go | 2 +- namesys/proquint.go | 2 +- namesys/publisher.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 3 +-- 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 2fb477930e..9efc723480 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -3,10 +3,10 @@ package namesys import ( "net" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" u "github.com/jbenet/go-ipfs/util" ) diff --git a/namesys/interface.go b/namesys/interface.go index 6faaeaf6a0..10e4fb89f0 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -4,7 +4,7 @@ package namesys import ( "errors" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/jbenet/go-ipfs/p2p/crypto" u "github.com/jbenet/go-ipfs/util" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index eddae747d1..d4cc03964b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,7 +1,7 @@ package namesys import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" diff --git a/namesys/proquint.go b/namesys/proquint.go index 24e97529d9..b43f7a2a69 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -3,8 +3,8 @@ package namesys import ( "errors" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proquint "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" u "github.com/jbenet/go-ipfs/util" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 3b209cd265..656730b40c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,9 +6,9 @@ import ( "fmt" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" pb "github.com/jbenet/go-ipfs/namesys/internal/pb" ci "github.com/jbenet/go-ipfs/p2p/crypto" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index e349a0aa9f..3b8bb70724 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -1,9 +1,9 @@ package namesys import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "testing" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" mockrouting "github.com/jbenet/go-ipfs/routing/mock" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/namesys/routing.go b/namesys/routing.go index a66565db69..ed86900793 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -3,10 +3,9 @@ package namesys import ( "fmt" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" pb "github.com/jbenet/go-ipfs/namesys/internal/pb" ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" From b066986818c1237c4f04a6850cdda85b66a5fa5e Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0672/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-ipfs-exchange-offline@87ee004fff66ff18385a3ece4ef8173f54ed806f --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index f1a6aaa61d..fe8fa723c3 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -3,7 +3,7 @@ package offline import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/jbenet/go-ipfs/blocks" "github.com/jbenet/go-ipfs/blocks/blockstore" exchange "github.com/jbenet/go-ipfs/exchange" diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index d32f336d07..20588bde84 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -3,9 +3,9 @@ package offline import ( "testing" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/jbenet/go-ipfs/blocks" "github.com/jbenet/go-ipfs/blocks/blockstore" "github.com/jbenet/go-ipfs/blocks/blocksutil" From bbf3dd84e9951a7e2538b6a07a92252515655b21 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0673/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-unixfs@a6f72a5360dd437ad07b73c7b42102f4fb956a11 --- unixfs/io/dagmodifier_test.go | 2 +- unixfs/io/dagreader.go | 3 +-- unixfs/tar/reader.go | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 23f2a0afa3..8443939502 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "testing" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/jbenet/go-ipfs/blocks/blockstore" bs "github.com/jbenet/go-ipfs/blockservice" @@ -19,6 +18,7 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-logging" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) func getMockDagServ(t *testing.T) mdag.DAGService { diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index d363d22d1e..0af49e9ee1 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -6,9 +6,8 @@ import ( "io" "os" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" mdag "github.com/jbenet/go-ipfs/merkledag" ft "github.com/jbenet/go-ipfs/unixfs" ftpb "github.com/jbenet/go-ipfs/unixfs/pb" diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 4d4f20c884..73f3ea8cf7 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -4,11 +4,11 @@ import ( "archive/tar" "bytes" "compress/gzip" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "io" gopath "path" "time" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" mdag "github.com/jbenet/go-ipfs/merkledag" path "github.com/jbenet/go-ipfs/path" uio "github.com/jbenet/go-ipfs/unixfs/io" From d68c24b8f95951b74caa67824a39c442cee740bc Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0674/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-ipfs-pinner@89fcdcda57429cdf932f51faf8b432a59e1e00d8 --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 25edd58323..c53e17f1cf 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -9,9 +9,9 @@ import ( "sync" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" "github.com/jbenet/go-ipfs/blocks/set" mdag "github.com/jbenet/go-ipfs/merkledag" "github.com/jbenet/go-ipfs/util" From b81b0cb94ea9460cacd83af595e60aba5ad749ec Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0675/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-ipfs-blockstore@e878e5c92fe2b68b0f32fcee4dae7c60cce778bb --- blockstore/blockstore.go | 3 +-- blockstore/blockstore_test.go | 2 +- blockstore/write_cache.go | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 70a705884c..7c7e7ed2dc 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -5,12 +5,11 @@ package blockstore import ( "errors" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dsns "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/jbenet/go-ipfs/blocks" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" u "github.com/jbenet/go-ipfs/util" diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 2280f78f87..0601773a00 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 487899597c..d082e0cdc8 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -1,9 +1,8 @@ package blockstore import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) From 1dbe6e7ccf99071b120c066409635ee40736f6d4 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0676/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-blockservice@c5d1cdd43b17c099066f0121b87d46c7d0310133 --- blockservice/blocks_test.go | 2 +- blockservice/blockservice.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index 8f3d89c7b6..be1ca6059d 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -5,9 +5,9 @@ import ( "testing" "time" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/jbenet/go-ipfs/blocks" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" blocksutil "github.com/jbenet/go-ipfs/blocks/blocksutil" diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0d4dcfa057..ee84d79d61 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -7,7 +7,7 @@ import ( "errors" "fmt" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/jbenet/go-ipfs/blocks" "github.com/jbenet/go-ipfs/blocks/blockstore" worker "github.com/jbenet/go-ipfs/blockservice/worker" From b566cc30c28c3a3693bece32dc3ebc68e8db0f1f Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 23 Feb 2015 16:51:09 +0100 Subject: [PATCH 0677/3147] rewrote import paths of go.net/context to use golang.org/x/context - updated go-ctxgroup and goprocess ctxgroup: AddChildGroup was changed to AddChild. Used in two files: - p2p/net/mock/mock_net.go - routing/dht/dht.go - updated context from hg repo to git prev. commit in hg was ad01a6fcc8a19d3a4478c836895ffe883bd2ceab. (context: make parentCancelCtx iterative) represents commit 84f8955a887232b6308d79c68b8db44f64df455c in git repo - updated context to master (b6fdb7d8a4ccefede406f8fe0f017fb58265054c) Aaron Jacobs (2): net/context: Don't accept a context in the DoSomethingSlow example. context: Be clear that users must cancel the result of WithCancel. Andrew Gerrand (1): go.net: use golang.org/x/... import paths Bryan C. Mills (1): net/context: Don't leak goroutines in Done example. Damien Neil (1): context: fix removal of cancelled timer contexts from parent David Symonds (2): context: Fix WithValue example code. net: add import comments. Sameer Ajmani (1): context: fix TestAllocs to account for ints in interfaces This commit was moved from ipfs/go-ipfs-exchange-interface@5982c5b1cea284bf3db7cbd85e4bcab3a908d78b --- exchange/interface.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index aa2e2431ce..c07d2a4712 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -4,8 +4,7 @@ package exchange import ( "io" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) From c2081c1f32876b64be1ea1214fde42b647fedf91 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 26 Feb 2015 16:44:36 -0800 Subject: [PATCH 0678/3147] make the providers manager respect contexts This commit was moved from ipfs/go-ipfs-routing@55a1b13df004373a42febbce200b2936382dcaf7 --- routing/dht/handlers.go | 2 +- routing/dht/providers.go | 8 ++++++-- routing/dht/providers_test.go | 2 +- routing/dht/routing.go | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index c46c711a11..62b22c5ca5 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -223,7 +223,7 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M // add the received addresses to our peerstore. dht.peerstore.AddAddrs(pi.ID, pi.Addrs, peer.ProviderAddrTTL) } - dht.providers.AddProvider(key, p) + dht.providers.AddProvider(ctx, key, p) } return pmes, nil // send back same msg as confirmation. diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 1f95bdf82e..d8e0d910d1 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -99,11 +99,15 @@ func (pm *ProviderManager) run() { } } -func (pm *ProviderManager) AddProvider(k u.Key, val peer.ID) { - pm.newprovs <- &addProv{ +func (pm *ProviderManager) AddProvider(ctx context.Context, k u.Key, val peer.ID) { + prov := &addProv{ k: k, val: val, } + select { + case pm.newprovs <- prov: + case <-ctx.Done(): + } } func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.ID { diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 22990d5804..121992eded 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -14,7 +14,7 @@ func TestProviderManager(t *testing.T) { mid := peer.ID("testing") p := NewProviderManager(ctx, mid) a := u.Key("test") - p.AddProvider(a, peer.ID("testingprovider")) + p.AddProvider(ctx, a, peer.ID("testingprovider")) resp := p.GetProviders(ctx, a) if len(resp) != 1 { t.Fatal("Could not retrieve provider.") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b52fa0059c..8cf4870634 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -141,7 +141,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { defer log.EventBegin(ctx, "provide", &key).Done() // add self locally - dht.providers.AddProvider(key, dht.self) + dht.providers.AddProvider(ctx, key, dht.self) peers, err := dht.GetClosestPeers(ctx, key) if err != nil { From 0bab0a7117e91e13e93da9b0466fcbedab8aa706 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Feb 2015 00:25:20 -0800 Subject: [PATCH 0679/3147] make signing dht put records optional This commit was moved from ipfs/go-ipfs-routing@05c71b819ef150942c4d837f0d5a7cde635960df --- routing/dht/dht.go | 11 +-------- routing/dht/dht_test.go | 32 ++++++++++++++++++++----- routing/dht/ext_test.go | 2 +- routing/dht/records.go | 38 ++++++++++++++++++++---------- routing/dht/routing.go | 10 ++++---- routing/mock/centralized_client.go | 2 +- routing/offline/offline.go | 6 ++--- routing/record/record.go | 16 +++++++------ routing/record/validation.go | 26 ++++++++++---------- routing/routing.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/server.go | 5 +++- 12 files changed, 91 insertions(+), 61 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1b318e4ee8..6e5e6456ea 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -254,16 +254,7 @@ func (dht *IpfsDHT) getOwnPrivateKey() (ci.PrivKey, error) { } // putLocal stores the key value pair in the datastore -func (dht *IpfsDHT) putLocal(key u.Key, value []byte) error { - sk, err := dht.getOwnPrivateKey() - if err != nil { - return err - } - - rec, err := record.MakePutRecord(sk, key, value) - if err != nil { - return err - } +func (dht *IpfsDHT) putLocal(key u.Key, rec *pb.Record) error { data, err := proto.Marshal(rec) if err != nil { return err diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 54a6448778..8626934183 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,6 +17,7 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" netutil "github.com/jbenet/go-ipfs/p2p/test/util" routing "github.com/jbenet/go-ipfs/routing" + record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" ci "github.com/jbenet/go-ipfs/util/testutil/ci" @@ -147,7 +148,7 @@ func TestValueGetSet(t *testing.T) { connect(t, ctx, dhtA, dhtB) ctxT, _ := context.WithTimeout(ctx, time.Second) - dhtA.PutValue(ctxT, "/v/hello", []byte("world")) + dhtA.PutValue(ctxT, "/v/hello", []byte("world"), false) ctxT, _ = context.WithTimeout(ctx, time.Second*2) val, err := dhtA.GetValue(ctxT, "/v/hello") @@ -188,7 +189,13 @@ func TestProvides(t *testing.T) { for k, v := range testCaseValues { log.Debugf("adding local values for %s = %s", k, v) - err := dhts[3].putLocal(k, v) + sk := dhts[3].peerstore.PrivKey(dhts[3].self) + rec, err := record.MakePutRecord(sk, k, v, false) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].putLocal(k, rec) if err != nil { t.Fatal(err) } @@ -456,7 +463,12 @@ func TestProvidesMany(t *testing.T) { providers[k] = dht.self t.Logf("adding local values for %s = %s (on %s)", k, v, dht.self) - err := dht.putLocal(k, v) + rec, err := record.MakePutRecord(nil, k, v, false) + if err != nil { + t.Fatal(err) + } + + err = dht.putLocal(k, rec) if err != nil { t.Fatal(err) } @@ -543,13 +555,21 @@ func TestProvidesAsync(t *testing.T) { connect(t, ctx, dhts[1], dhts[2]) connect(t, ctx, dhts[1], dhts[3]) - err := dhts[3].putLocal(u.Key("hello"), []byte("world")) + k := u.Key("hello") + val := []byte("world") + sk := dhts[3].peerstore.PrivKey(dhts[3].self) + rec, err := record.MakePutRecord(sk, k, val, false) + if err != nil { + t.Fatal(err) + } + + err = dhts[3].putLocal(k, rec) if err != nil { t.Fatal(err) } - bits, err := dhts[3].getLocal(u.Key("hello")) - if err != nil && bytes.Equal(bits, []byte("world")) { + bits, err := dhts[3].getLocal(k) + if err != nil && bytes.Equal(bits, val) { t.Fatal(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index ec5fffac32..772724956b 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -111,7 +111,7 @@ func TestGetFailures(t *testing.T) { t.Fatal(err) } - rec, err := record.MakePutRecord(sk, u.Key(str), []byte("blah")) + rec, err := record.MakePutRecord(sk, u.Key(str), []byte("blah"), true) if err != nil { t.Fatal(err) } diff --git a/routing/dht/records.go b/routing/dht/records.go index c6baf49999..e575c33adc 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -7,6 +7,7 @@ import ( ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" + record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" ctxutil "github.com/jbenet/go-ipfs/util/ctx" ) @@ -99,14 +100,20 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub // key, we fail. we do not search the dht. func (dht *IpfsDHT) verifyRecordLocally(r *pb.Record) error { - // First, validate the signature - p := peer.ID(r.GetAuthor()) - pk := dht.peerstore.PubKey(p) - if pk == nil { - return fmt.Errorf("do not have public key for %s", p) + if len(r.Signature) > 0 { + // First, validate the signature + p := peer.ID(r.GetAuthor()) + pk := dht.peerstore.PubKey(p) + if pk == nil { + return fmt.Errorf("do not have public key for %s", p) + } + + if err := record.CheckRecordSig(r, pk); err != nil { + return err + } } - return dht.Validator.VerifyRecord(r, pk) + return dht.Validator.VerifyRecord(r) } // verifyRecordOnline verifies a record, searching the DHT for the public key @@ -116,12 +123,19 @@ func (dht *IpfsDHT) verifyRecordLocally(r *pb.Record) error { // massive amplification attack on the dht. Use with care. func (dht *IpfsDHT) verifyRecordOnline(ctx context.Context, r *pb.Record) error { - // get the public key, search for it if necessary. - p := peer.ID(r.GetAuthor()) - pk, err := dht.getPublicKeyOnline(ctx, p) - if err != nil { - return err + if len(r.Signature) > 0 { + // get the public key, search for it if necessary. + p := peer.ID(r.GetAuthor()) + pk, err := dht.getPublicKeyOnline(ctx, p) + if err != nil { + return err + } + + err = record.CheckRecordSig(r, pk) + if err != nil { + return err + } } - return dht.Validator.VerifyRecord(r, pk) + return dht.Validator.VerifyRecord(r) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 8cf4870634..3f548e21db 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -29,21 +29,21 @@ var asyncQueryBuffer = 10 // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { +func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte, sign bool) error { log.Debugf("PutValue %s", key) - err := dht.putLocal(key, value) + sk, err := dht.getOwnPrivateKey() if err != nil { return err } - sk, err := dht.getOwnPrivateKey() + rec, err := record.MakePutRecord(sk, key, value, sign) if err != nil { + log.Debug("Creation of record failed!") return err } - rec, err := record.MakePutRecord(sk, key, value) + err = dht.putLocal(key, rec) if err != nil { - log.Debug("Creation of record failed!") return err } diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 6a550bfaa8..cbcff3ab0d 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -22,7 +22,7 @@ type client struct { } // FIXME(brian): is this method meant to simulate putting a value into the network? -func (c *client) PutValue(ctx context.Context, key u.Key, val []byte) error { +func (c *client) PutValue(ctx context.Context, key u.Key, val []byte, sign bool) error { log.Debugf("PutValue: %s", key) return c.datastore.Put(key.DsKey(), val) } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 324e438be5..33c57d336e 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -35,8 +35,8 @@ type offlineRouting struct { sk ci.PrivKey } -func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte) error { - rec, err := record.MakePutRecord(c.sk, key, val) +func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte, sign bool) error { + rec, err := record.MakePutRecord(c.sk, key, val, sign) if err != nil { return err } @@ -89,7 +89,7 @@ func (c *offlineRouting) Ping(ctx context.Context, p peer.ID) (time.Duration, er return 0, ErrOffline } -func (c *offlineRouting) Bootstrap(context.Context) (error) { +func (c *offlineRouting) Bootstrap(context.Context) error { return nil } diff --git a/routing/record/record.go b/routing/record/record.go index e41de94aee..c5575a86f4 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -14,7 +14,7 @@ import ( var log = eventlog.Logger("routing/record") // MakePutRecord creates and signs a dht record for the given key/value pair -func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte) (*pb.Record, error) { +func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte, sign bool) (*pb.Record, error) { record := new(pb.Record) record.Key = proto.String(string(key)) @@ -26,14 +26,16 @@ func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte) (*pb.Record, error) { } record.Author = proto.String(string(pkh)) - blob := RecordBlobForSig(record) + if sign { + blob := RecordBlobForSig(record) - sig, err := sk.Sign(blob) - if err != nil { - return nil, err - } + sig, err := sk.Sign(blob) + if err != nil { + return nil, err + } - record.Signature = sig + record.Signature = sig + } return record, nil } diff --git a/routing/record/validation.go b/routing/record/validation.go index 9519ebd3f2..4c6db584f6 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -29,19 +29,7 @@ type Validator map[string]ValidatorFunc // VerifyRecord checks a record and ensures it is still valid. // It runs needed validators -func (v Validator) VerifyRecord(r *pb.Record, pk ci.PubKey) error { - // First, validate the signature - blob := RecordBlobForSig(r) - ok, err := pk.Verify(blob, r.GetSignature()) - if err != nil { - log.Info("Signature verify failed. (ignored)") - return err - } - if !ok { - log.Info("dht found a forged record! (ignored)") - return ErrBadRecord - } - +func (v Validator) VerifyRecord(r *pb.Record) error { // Now, check validity func parts := strings.Split(r.GetKey(), "/") if len(parts) < 3 { @@ -73,3 +61,15 @@ func ValidatePublicKeyRecord(k u.Key, val []byte) error { } return nil } + +func CheckRecordSig(r *pb.Record, pk ci.PubKey) error { + blob := RecordBlobForSig(r) + good, err := pk.Verify(blob, r.Signature) + if err != nil { + return nil + } + if !good { + return errors.New("invalid record signature") + } + return nil +} diff --git a/routing/routing.go b/routing/routing.go index be400a5205..d0acbb077f 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -21,7 +21,7 @@ type IpfsRouting interface { // Basic Put/Get // PutValue adds value corresponding to given Key. - PutValue(context.Context, u.Key, []byte) error + PutValue(context.Context, u.Key, []byte, bool) error // GetValue searches for the value corresponding to given Key. GetValue(context.Context, u.Key) ([]byte, error) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 09fa90ef6d..fbba8dfeef 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -59,7 +59,7 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha return ch } -func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte) error { +func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte, sign bool) error { defer log.EventBegin(ctx, "putValue", &k).Done() r, err := makeRecord(c.peerstore, c.local, k, v) if err != nil { diff --git a/routing/supernode/server.go b/routing/supernode/server.go index be587f7492..315730858b 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -210,7 +210,10 @@ func verify(ps peer.Peerstore, r *dhtpb.Record) error { if pk == nil { return fmt.Errorf("do not have public key for %s", p) } - if err := v.VerifyRecord(r, pk); err != nil { + if err := record.CheckRecordSig(r, pk); err != nil { + return err + } + if err := v.VerifyRecord(r); err != nil { return err } return nil From 97a15304d5986b67196ff794d244ac1a8629f534 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Feb 2015 00:25:20 -0800 Subject: [PATCH 0680/3147] make signing dht put records optional This commit was moved from ipfs/go-namesys@2de3180d5d0c6dc2727dc8011c7cb16112568b0e --- namesys/publisher.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 656730b40c..126069d960 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -62,7 +62,7 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) - err = p.routing.PutValue(timectx, namekey, pkbytes) + err = p.routing.PutValue(timectx, namekey, pkbytes, false) if err != nil { return err } @@ -72,7 +72,7 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*10)) - err = p.routing.PutValue(timectx, ipnskey, data) + err = p.routing.PutValue(timectx, ipnskey, data, true) if err != nil { return err } From b88c409743b7ed718f53552a27df535eae407cf7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 25 Feb 2015 14:56:26 -0800 Subject: [PATCH 0681/3147] move signing options into a validation checker struct This commit was moved from ipfs/go-ipfs-routing@9e75edaf7d19594df304d3536cc6615f480c13c1 --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 16 ++++++++++----- routing/dht/routing.go | 7 ++++++- routing/mock/centralized_client.go | 2 +- routing/offline/offline.go | 4 ++-- routing/record/validation.go | 33 +++++++++++++++++++++++++++--- routing/routing.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/server.go | 2 +- 9 files changed, 54 insertions(+), 16 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6e5e6456ea..324b80fb68 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -84,7 +84,7 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.birth = time.Now() dht.Validator = make(record.Validator) - dht.Validator["pk"] = record.ValidatePublicKeyRecord + dht.Validator["pk"] = record.PublicKeyValidator if doPinging { dht.Children().Add(1) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 8626934183..4b48ccc654 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -41,8 +41,11 @@ func setupDHT(ctx context.Context, t *testing.T) *IpfsDHT { dss := dssync.MutexWrap(ds.NewMapDatastore()) d := NewDHT(ctx, h, dss) - d.Validator["v"] = func(u.Key, []byte) error { - return nil + d.Validator["v"] = &record.ValidChecker{ + Func: func(u.Key, []byte) error { + return nil + }, + Sign: false, } return d } @@ -139,8 +142,11 @@ func TestValueGetSet(t *testing.T) { defer dhtA.host.Close() defer dhtB.host.Close() - vf := func(u.Key, []byte) error { - return nil + vf := &record.ValidChecker{ + Func: func(u.Key, []byte) error { + return nil + }, + Sign: false, } dhtA.Validator["v"] = vf dhtB.Validator["v"] = vf @@ -148,7 +154,7 @@ func TestValueGetSet(t *testing.T) { connect(t, ctx, dhtA, dhtB) ctxT, _ := context.WithTimeout(ctx, time.Second) - dhtA.PutValue(ctxT, "/v/hello", []byte("world"), false) + dhtA.PutValue(ctxT, "/v/hello", []byte("world")) ctxT, _ = context.WithTimeout(ctx, time.Second*2) val, err := dhtA.GetValue(ctxT, "/v/hello") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3f548e21db..28ee8f03a8 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -29,13 +29,18 @@ var asyncQueryBuffer = 10 // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte, sign bool) error { +func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { log.Debugf("PutValue %s", key) sk, err := dht.getOwnPrivateKey() if err != nil { return err } + sign, err := dht.Validator.IsSigned(key) + if err != nil { + return err + } + rec, err := record.MakePutRecord(sk, key, value, sign) if err != nil { log.Debug("Creation of record failed!") diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index cbcff3ab0d..6a550bfaa8 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -22,7 +22,7 @@ type client struct { } // FIXME(brian): is this method meant to simulate putting a value into the network? -func (c *client) PutValue(ctx context.Context, key u.Key, val []byte, sign bool) error { +func (c *client) PutValue(ctx context.Context, key u.Key, val []byte) error { log.Debugf("PutValue: %s", key) return c.datastore.Put(key.DsKey(), val) } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 33c57d336e..15049f16d4 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -35,8 +35,8 @@ type offlineRouting struct { sk ci.PrivKey } -func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte, sign bool) error { - rec, err := record.MakePutRecord(c.sk, key, val, sign) +func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte) error { + rec, err := record.MakePutRecord(c.sk, key, val, false) if err != nil { return err } diff --git a/routing/record/validation.go b/routing/record/validation.go index 4c6db584f6..380bdea4c3 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -25,7 +25,12 @@ var ErrInvalidRecordType = errors.New("invalid record keytype") // Validator is an object that helps ensure routing records are valid. // It is a collection of validator functions, each of which implements // its own notion of validity. -type Validator map[string]ValidatorFunc +type Validator map[string]*ValidChecker + +type ValidChecker struct { + Func ValidatorFunc + Sign bool +} // VerifyRecord checks a record and ensures it is still valid. // It runs needed validators @@ -37,13 +42,30 @@ func (v Validator) VerifyRecord(r *pb.Record) error { return nil } - fnc, ok := v[parts[1]] + val, ok := v[parts[1]] if !ok { log.Infof("Unrecognized key prefix: %s", parts[1]) return ErrInvalidRecordType } - return fnc(u.Key(r.GetKey()), r.GetValue()) + return val.Func(u.Key(r.GetKey()), r.GetValue()) +} + +func (v Validator) IsSigned(k u.Key) (bool, error) { + // Now, check validity func + parts := strings.Split(string(k), "/") + if len(parts) < 3 { + log.Infof("Record key does not have validator: %s", k) + return false, nil + } + + val, ok := v[parts[1]] + if !ok { + log.Infof("Unrecognized key prefix: %s", parts[1]) + return false, ErrInvalidRecordType + } + + return val.Sign, nil } // ValidatePublicKeyRecord implements ValidatorFunc and @@ -62,6 +84,11 @@ func ValidatePublicKeyRecord(k u.Key, val []byte) error { return nil } +var PublicKeyValidator = &ValidChecker{ + Func: ValidatePublicKeyRecord, + Sign: false, +} + func CheckRecordSig(r *pb.Record, pk ci.PubKey) error { blob := RecordBlobForSig(r) good, err := pk.Verify(blob, r.Signature) diff --git a/routing/routing.go b/routing/routing.go index d0acbb077f..be400a5205 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -21,7 +21,7 @@ type IpfsRouting interface { // Basic Put/Get // PutValue adds value corresponding to given Key. - PutValue(context.Context, u.Key, []byte, bool) error + PutValue(context.Context, u.Key, []byte) error // GetValue searches for the value corresponding to given Key. GetValue(context.Context, u.Key) ([]byte, error) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index fbba8dfeef..09fa90ef6d 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -59,7 +59,7 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha return ch } -func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte, sign bool) error { +func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte) error { defer log.EventBegin(ctx, "putValue", &k).Done() r, err := makeRecord(c.peerstore, c.local, k, v) if err != nil { diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 315730858b..1132039a1b 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -204,7 +204,7 @@ func providerKey(k util.Key) datastore.Key { func verify(ps peer.Peerstore, r *dhtpb.Record) error { v := make(record.Validator) - v["pk"] = record.ValidatePublicKeyRecord + v["pk"] = record.PublicKeyValidator p := peer.ID(r.GetAuthor()) pk := ps.PubKey(p) if pk == nil { From 62d3b0b2634fa0fe66e772767eb082f5a439524a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 25 Feb 2015 14:56:26 -0800 Subject: [PATCH 0682/3147] move signing options into a validation checker struct This commit was moved from ipfs/go-namesys@d56e307ea149c453aac7b6f2c651678b836cd1d8 --- namesys/publisher.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 126069d960..cb7456cb9e 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -13,6 +13,7 @@ import ( pb "github.com/jbenet/go-ipfs/namesys/internal/pb" ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" + record "github.com/jbenet/go-ipfs/routing/record" u "github.com/jbenet/go-ipfs/util" ) @@ -62,7 +63,7 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) - err = p.routing.PutValue(timectx, namekey, pkbytes, false) + err = p.routing.PutValue(timectx, namekey, pkbytes) if err != nil { return err } @@ -72,7 +73,7 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*10)) - err = p.routing.PutValue(timectx, ipnskey, data, true) + err = p.routing.PutValue(timectx, ipnskey, data) if err != nil { return err } @@ -105,6 +106,11 @@ func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { []byte{}) } +var IpnsRecordValidator = &record.ValidChecker{ + Func: ValidateIpnsRecord, + Sign: true, +} + // ValidateIpnsRecord implements ValidatorFunc and verifies that the // given 'val' is an IpnsEntry and that that entry is valid. func ValidateIpnsRecord(k u.Key, val []byte) error { From f99a04a24e7da8c5cc286ecd67000ed4d32177d1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 26 Feb 2015 16:13:33 -0800 Subject: [PATCH 0683/3147] error -> debug This commit was moved from ipfs/go-ipfs-routing@7f2386b9a806829c8453182c397e1a525b8053bf --- routing/dht/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 324b80fb68..14211cc812 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -313,7 +313,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ // == to self? thats bad for _, p := range closer { if p == dht.self { - log.Info("Attempted to return self! this shouldnt happen...") + log.Debug("Attempted to return self! this shouldnt happen...") return nil } } From 7d04c746ac1eeafb22bde26aae88e5c4cec55532 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 2 Feb 2015 02:48:12 +0000 Subject: [PATCH 0684/3147] implement a simple wantlist command to allow the user to view their wantlist This commit was moved from ipfs/go-ipfs-exchange-offline@cc7ab064d4968d6497eb6c380aa2707025653da3 --- exchange/offline/offline.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index fe8fa723c3..e3e50bbf47 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -66,3 +66,8 @@ func (e *offlineExchange) GetBlocks(ctx context.Context, ks []u.Key) (<-chan *bl }() return out, nil } + +// implement Exchange +func (e *offlineExchange) GetWantlist() []u.Key { + return nil +} From f22be215d2f0008ce6377795a66f10ec3ba360cf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Feb 2015 11:47:49 -0800 Subject: [PATCH 0685/3147] dont put wantlist getter in exchange interface This commit was moved from ipfs/go-ipfs-exchange-offline@85b2f60fe8ea627fcdcc5830277ab74317a904f4 --- exchange/offline/offline.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index e3e50bbf47..fe8fa723c3 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -66,8 +66,3 @@ func (e *offlineExchange) GetBlocks(ctx context.Context, ks []u.Key) (<-chan *bl }() return out, nil } - -// implement Exchange -func (e *offlineExchange) GetWantlist() []u.Key { - return nil -} From 6780d1fcb41a90e6dda8f804c9622a1fc469adc7 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 27 Feb 2015 14:19:08 +0100 Subject: [PATCH 0686/3147] don't depend on go-logging - use it through util instead. This commit was moved from ipfs/go-unixfs@a3c28a1a3d563e9ab17f0ad561edc92c69e653cf --- unixfs/io/dagmodifier_test.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go index 8443939502..ca9c420042 100644 --- a/unixfs/io/dagmodifier_test.go +++ b/unixfs/io/dagmodifier_test.go @@ -17,7 +17,6 @@ import ( u "github.com/jbenet/go-ipfs/util" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - logging "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-logging" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) @@ -95,8 +94,12 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) func TestDagModifierBasic(t *testing.T) { t.Skip("DAGModifier needs to be fixed to work with indirect blocks.") - logging.SetLevel(logging.CRITICAL, "blockservice") - logging.SetLevel(logging.CRITICAL, "merkledag") + if err := u.SetLogLevel("blockservice", "critical"); err != nil { + t.Fatalf("testlog prepare failed: %s", err) + } + if err := u.SetLogLevel("merkledag", "critical"); err != nil { + t.Fatalf("testlog prepare failed: %s", err) + } dserv := getMockDagServ(t) b, n := getNode(t, dserv, 50000) From 2f312b000cd2d5976ebeff78417b64fc4d527b88 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 4 Mar 2015 08:28:46 -0800 Subject: [PATCH 0687/3147] fixed dht kbucket race closes #836 This commit was moved from ipfs/go-ipfs-routing@5f313283847fb2bdb624b890e81785d369caf9cf --- routing/kbucket/table.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index a785bf8b58..7b10d8dafb 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -185,9 +185,11 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { // Size returns the total number of peers in the routing table func (rt *RoutingTable) Size() int { var tot int + rt.tabLock.RLock() for _, buck := range rt.Buckets { tot += buck.Len() } + rt.tabLock.RUnlock() return tot } From 6c5ed6bc3e70db7f933ee390d1893a6792c2ee44 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 6 Mar 2015 11:20:11 -0800 Subject: [PATCH 0688/3147] refactoring unixfs node and importer/helpers to match This commit was moved from ipfs/go-unixfs@3831428ed524c01258cfee2449d6a9bca92caa46 --- unixfs/format.go | 66 ++++++++++++++++++++++++++++++++----------- unixfs/format_test.go | 11 ++++---- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index 5e12d52aca..61bb2ec9e8 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -9,6 +9,13 @@ import ( pb "github.com/jbenet/go-ipfs/unixfs/pb" ) +const ( + TRaw = pb.Data_Raw + TFile = pb.Data_File + TDirectory = pb.Data_Directory + TMetadata = pb.Data_Metadata +) + var ErrMalformedFileFormat = errors.New("malformed data in file format") var ErrInvalidDirLocation = errors.New("found directory node in unexpected place") var ErrUnrecognizedType = errors.New("unrecognized node type") @@ -98,33 +105,60 @@ func DataSize(data []byte) (uint64, error) { } } -type MultiBlock struct { - Data []byte +type FSNode struct { + Data []byte + + // total data size for each child blocksizes []uint64 - subtotal uint64 + + // running sum of blocksizes + subtotal uint64 + + // node type of this node + Type pb.Data_DataType +} + +func FSNodeFromBytes(b []byte) (*FSNode, error) { + pbn := new(pb.Data) + err := proto.Unmarshal(b, pbn) + if err != nil { + return nil, err + } + + n := new(FSNode) + n.Data = pbn.Data + n.blocksizes = pbn.Blocksizes + n.subtotal = pbn.GetFilesize() - uint64(len(n.Data)) + n.Type = pbn.GetType() + return n, nil +} + +// AddBlockSize adds the size of the next child block of this node +func (n *FSNode) AddBlockSize(s uint64) { + n.subtotal += s + n.blocksizes = append(n.blocksizes, s) } -func (mb *MultiBlock) AddBlockSize(s uint64) { - mb.subtotal += s - mb.blocksizes = append(mb.blocksizes, s) +func (n *FSNode) RemoveBlockSize(i int) { + n.subtotal -= n.blocksizes[i] + n.blocksizes = append(n.blocksizes[:i], n.blocksizes[i+1:]...) } -func (mb *MultiBlock) GetBytes() ([]byte, error) { +func (n *FSNode) GetBytes() ([]byte, error) { pbn := new(pb.Data) - t := pb.Data_File - pbn.Type = &t - pbn.Filesize = proto.Uint64(uint64(len(mb.Data)) + mb.subtotal) - pbn.Blocksizes = mb.blocksizes - pbn.Data = mb.Data + pbn.Type = &n.Type + pbn.Filesize = proto.Uint64(uint64(len(n.Data)) + n.subtotal) + pbn.Blocksizes = n.blocksizes + pbn.Data = n.Data return proto.Marshal(pbn) } -func (mb *MultiBlock) FileSize() uint64 { - return uint64(len(mb.Data)) + mb.subtotal +func (n *FSNode) FileSize() uint64 { + return uint64(len(n.Data)) + n.subtotal } -func (mb *MultiBlock) NumChildren() int { - return len(mb.blocksizes) +func (n *FSNode) NumChildren() int { + return len(n.blocksizes) } type Metadata struct { diff --git a/unixfs/format_test.go b/unixfs/format_test.go index 5065c7bc5e..b15ed07891 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -7,15 +7,16 @@ import ( pb "github.com/jbenet/go-ipfs/unixfs/pb" ) -func TestMultiBlock(t *testing.T) { - mbf := new(MultiBlock) +func TestFSNode(t *testing.T) { + fsn := new(FSNode) + fsn.Type = TFile for i := 0; i < 15; i++ { - mbf.AddBlockSize(100) + fsn.AddBlockSize(100) } - mbf.Data = make([]byte, 128) + fsn.Data = make([]byte, 128) - b, err := mbf.GetBytes() + b, err := fsn.GetBytes() if err != nil { t.Fatal(err) } From c2dfd658553dfd4c23c205b385dfec31642e8e8b Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 7 Mar 2015 02:44:20 -0800 Subject: [PATCH 0689/3147] query: fixed race condition This commit was moved from ipfs/go-ipfs-routing@159785fb1d5d4ed59a470bdbb5307cfa2e5bc1da --- routing/dht/query.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/routing/dht/query.go b/routing/dht/query.go index aacab106f1..888fdd65d6 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -52,6 +52,12 @@ type queryFunc func(context.Context, peer.ID) (*dhtQueryResult, error) // Run runs the query at hand. pass in a list of peers to use first. func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { + select { + case <-ctx.Done(): + return nil, ctx.Err() + default: + } + ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -104,6 +110,15 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { r.addPeerToQuery(r.cg.Context(), p) } + // may be closed already. this caused an odd race (where we attempt to + // add a child to an already closed ctxgroup). this is a temp workaround + // as we'll switch to using a proc here soon. + select { + case <-r.cg.Closed(): + return nil, r.cg.Context().Err() + default: + } + // go do this thing. // do it as a child func to make sure Run exits // ONLY AFTER spawn workers has exited. From 2d919f0f4784d9c749098f88ca4bed561ec0ccaa Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 7 Mar 2015 03:20:29 -0800 Subject: [PATCH 0690/3147] query: fix race condition: redux this time just move to goprocess This commit was moved from ipfs/go-ipfs-routing@39421d0f2be633f7cb395fbb2e7fe95de9751dd2 --- routing/dht/ext_test.go | 2 +- routing/dht/query.go | 78 ++++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 772724956b..539d55ccaf 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -52,7 +52,7 @@ func TestGetFailures(t *testing.T) { err = merr[0] } - if err != context.DeadlineExceeded { + if err != context.DeadlineExceeded && err != context.Canceled { t.Fatal("Got different error than we expected", err) } } else { diff --git a/routing/dht/query.go b/routing/dht/query.go index 888fdd65d6..3687bc8598 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -12,7 +12,8 @@ import ( pset "github.com/jbenet/go-ipfs/util/peerset" todoctr "github.com/jbenet/go-ipfs/util/todocounter" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + ctxproc "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) @@ -61,8 +62,8 @@ func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, e ctx, cancel := context.WithCancel(ctx) defer cancel() - runner := newQueryRunner(ctx, q) - return runner.Run(peers) + runner := newQueryRunner(q) + return runner.Run(ctx, peers) } type dhtQueryRunner struct { @@ -77,22 +78,24 @@ type dhtQueryRunner struct { rateLimit chan struct{} // processing semaphore log eventlog.EventLogger - cg ctxgroup.ContextGroup + proc process.Process sync.RWMutex } -func newQueryRunner(ctx context.Context, q *dhtQuery) *dhtQueryRunner { +func newQueryRunner(q *dhtQuery) *dhtQueryRunner { + proc := process.WithParent(process.Background()) + ctx := ctxproc.WithProcessClosing(context.Background(), proc) return &dhtQueryRunner{ query: q, peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(q.key)), peersRemaining: todoctr.NewSyncCounter(), peersSeen: pset.New(), rateLimit: make(chan struct{}, q.concurrency), - cg: ctxgroup.WithContext(ctx), + proc: proc, } } -func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { +func (r *dhtQueryRunner) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { r.log = log if len(peers) == 0 { @@ -107,31 +110,30 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { // add all the peers we got first. for _, p := range peers { - r.addPeerToQuery(r.cg.Context(), p) - } - - // may be closed already. this caused an odd race (where we attempt to - // add a child to an already closed ctxgroup). this is a temp workaround - // as we'll switch to using a proc here soon. - select { - case <-r.cg.Closed(): - return nil, r.cg.Context().Err() - default: + r.addPeerToQuery(p) } // go do this thing. - // do it as a child func to make sure Run exits + // do it as a child proc to make sure Run exits // ONLY AFTER spawn workers has exited. - r.cg.AddChildFunc(r.spawnWorkers) + r.proc.Go(r.spawnWorkers) // so workers are working. // wait until they're done. err := routing.ErrNotFound + // now, if the context finishes, close the proc. + // we have to do it here because the logic before is setup, which + // should run without closing the proc. + go func() { + <-ctx.Done() + r.proc.Close() + }() + select { case <-r.peersRemaining.Done(): - r.cg.Close() + r.proc.Close() r.RLock() defer r.RUnlock() @@ -143,12 +145,10 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { err = r.errs[0] } - case <-r.cg.Closed(): - log.Debug("r.cg.Closed()") - + case <-r.proc.Closed(): r.RLock() defer r.RUnlock() - err = r.cg.Context().Err() // collect the error. + err = context.DeadlineExceeded } if r.result != nil && r.result.success { @@ -158,7 +158,7 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { return nil, err } -func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { +func (r *dhtQueryRunner) addPeerToQuery(next peer.ID) { // if new peer is ourselves... if next == r.query.dht.self { r.log.Debug("addPeerToQuery skip self") @@ -172,18 +172,18 @@ func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { r.peersRemaining.Increment(1) select { case r.peersToQuery.EnqChan <- next: - case <-ctx.Done(): + case <-r.proc.Closing(): } } -func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { +func (r *dhtQueryRunner) spawnWorkers(proc process.Process) { for { select { case <-r.peersRemaining.Done(): return - case <-r.cg.Closing(): + case <-r.proc.Closing(): return case p, more := <-r.peersToQuery.DeqChan: @@ -193,24 +193,27 @@ func (r *dhtQueryRunner) spawnWorkers(parent ctxgroup.ContextGroup) { // do it as a child func to make sure Run exits // ONLY AFTER spawn workers has exited. - parent.AddChildFunc(func(cg ctxgroup.ContextGroup) { - r.queryPeer(cg, p) + proc.Go(func(proc process.Process) { + r.queryPeer(proc, p) }) } } } -func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { +func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { // make sure we rate limit concurrency. select { case <-r.rateLimit: - case <-cg.Closing(): + case <-proc.Closing(): r.peersRemaining.Decrement(1) return } // ok let's do this! + // create a context from our proc. + ctx := ctxproc.WithProcessClosing(context.Background(), proc) + // make sure we do this when we exit defer func() { // signal we're done proccessing peer p @@ -227,10 +230,11 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { r.rateLimit <- struct{}{} pi := peer.PeerInfo{ID: p} - if err := r.query.dht.host.Connect(cg.Context(), pi); err != nil { + + if err := r.query.dht.host.Connect(ctx, pi); err != nil { log.Debugf("Error connecting: %s", err) - notif.PublishQueryEvent(cg.Context(), ¬if.QueryEvent{ + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ Type: notif.QueryError, Extra: err.Error(), }) @@ -246,7 +250,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { } // finally, run the query against this peer - res, err := r.query.qfunc(cg.Context(), p) + res, err := r.query.qfunc(ctx, p) if err != nil { log.Debugf("ERROR worker for: %v %v", p, err) @@ -259,7 +263,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { r.Lock() r.result = res r.Unlock() - go r.cg.Close() // signal to everyone that we're done. + go r.proc.Close() // signal to everyone that we're done. // must be async, as we're one of the children, and Close blocks. } else if len(res.closerPeers) > 0 { @@ -272,7 +276,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { // add their addresses to the dialer's peerstore r.query.dht.peerstore.AddAddrs(next.ID, next.Addrs, peer.TempAddrTTL) - r.addPeerToQuery(cg.Context(), next.ID) + r.addPeerToQuery(next.ID) log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } } else { From dbbb7ff1a843f36a657ee33518f0462f08605d76 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 25 Feb 2015 14:39:56 +0100 Subject: [PATCH 0691/3147] don't ignore returned cancelFunc() This commit was moved from ipfs/go-ipfs-routing@9a913bbf8a57bf8edc028f0448b16810e19ebdcf --- routing/dht/records.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routing/dht/records.go b/routing/dht/records.go index e575c33adc..e327ed1717 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -28,7 +28,8 @@ func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKe } // ok, try the node itself. if they're overwhelmed or slow we can move on. - ctxT, _ := ctxutil.WithDeadlineFraction(ctx, 0.3) + ctxT, cancelFunc := ctxutil.WithDeadlineFraction(ctx, 0.3) + defer cancelFunc() if pk, err := dht.getPublicKeyFromNode(ctx, p); err == nil { return pk, nil } From daed88d8413822cea56502c6368df68706bfa383 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 7 Mar 2015 09:31:46 -0800 Subject: [PATCH 0692/3147] added cancel func calls previously ignored This commit was moved from ipfs/go-unixfs@5ac81bcd70fab0a720650bd948c525c6f82ddb9f --- unixfs/tar/reader.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 73f3ea8cf7..aa15c823a2 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -86,7 +86,8 @@ func (r *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { } r.flush() - ctx, _ := context.WithTimeout(context.TODO(), time.Second*60) + ctx, cancel := context.WithTimeout(context.TODO(), time.Second*60) + defer cancel() for i, ng := range r.dag.GetDAG(ctx, dagnode) { childNode, err := ng.Get() From 1b1d6bf1d751f38b24c71f3973e88056612734fa Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 7 Mar 2015 09:31:46 -0800 Subject: [PATCH 0693/3147] added cancel func calls previously ignored This commit was moved from ipfs/go-ipfs-pinner@437724c9145284c9f513060c05617127917059cc --- pinning/pinner/pin.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index c53e17f1cf..68e627c1ea 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -172,7 +172,9 @@ func (p *pinner) pinIndirectRecurse(node *mdag.Node) error { } func (p *pinner) pinLinks(node *mdag.Node) error { - ctx, _ := context.WithTimeout(context.Background(), time.Second*60) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) + defer cancel() + for _, ng := range p.dserv.GetDAG(ctx, node) { subnode, err := ng.Get() if err != nil { From e23c43d4ff7487b40fdde2771b37044d9e4b6b3e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 7 Mar 2015 09:31:46 -0800 Subject: [PATCH 0694/3147] added cancel func calls previously ignored This commit was moved from ipfs/go-namesys@19cf7a4c6a79a6b1a9308c376aa7754731f5ecdf --- namesys/publisher.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index cb7456cb9e..d786c210be 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -60,9 +60,11 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) nameb := u.Hash(pkbytes) namekey := u.Key("/pk/" + string(nameb)) + timectx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) + defer cancel() + log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key - timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) err = p.routing.PutValue(timectx, namekey, pkbytes) if err != nil { return err From 54529e6301b008ca47118cb04b3c4e7ae928d941 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 7 Mar 2015 09:31:46 -0800 Subject: [PATCH 0695/3147] added cancel func calls previously ignored This commit was moved from ipfs/go-ipfs-routing@cf7c31b410a3d371703f144c99207478f1d0fe1b --- routing/dht/dht.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 14211cc812..974d87b588 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -357,11 +357,12 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { rand.Read(id) peers := dht.routingTable.NearestPeers(kb.ConvertKey(u.Key(id)), 5) for _, p := range peers { - ctx, _ := context.WithTimeout(dht.Context(), time.Second*5) + ctx, cancel := context.WithTimeout(dht.Context(), time.Second*5) _, err := dht.Ping(ctx, p) if err != nil { log.Debugf("Ping error: %s", err) } + cancel() } case <-dht.Closing(): return From 9378c49b288db9cc622fc5ccccf373257b08299b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 7 Mar 2015 00:58:04 -0800 Subject: [PATCH 0696/3147] refactor dagmodifier to work with trickledag format This commit was moved from ipfs/go-unixfs@01c574f2f092f0ca4283c3896311457b3531d078 --- unixfs/io/dagmodifier.go | 202 -------------- unixfs/io/dagmodifier_test.go | 247 ------------------ unixfs/mod/dagmodifier.go | 450 ++++++++++++++++++++++++++++++++ unixfs/mod/dagmodifier_test.go | 464 +++++++++++++++++++++++++++++++++ 4 files changed, 914 insertions(+), 449 deletions(-) delete mode 100644 unixfs/io/dagmodifier.go delete mode 100644 unixfs/io/dagmodifier_test.go create mode 100644 unixfs/mod/dagmodifier.go create mode 100644 unixfs/mod/dagmodifier_test.go diff --git a/unixfs/io/dagmodifier.go b/unixfs/io/dagmodifier.go deleted file mode 100644 index e155d8b385..0000000000 --- a/unixfs/io/dagmodifier.go +++ /dev/null @@ -1,202 +0,0 @@ -package io - -import ( - "bytes" - "errors" - - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - - chunk "github.com/jbenet/go-ipfs/importer/chunk" - mdag "github.com/jbenet/go-ipfs/merkledag" - ft "github.com/jbenet/go-ipfs/unixfs" - ftpb "github.com/jbenet/go-ipfs/unixfs/pb" - u "github.com/jbenet/go-ipfs/util" -) - -var log = u.Logger("dagio") - -// DagModifier is the only struct licensed and able to correctly -// perform surgery on a DAG 'file' -// Dear god, please rename this to something more pleasant -type DagModifier struct { - dagserv mdag.DAGService - curNode *mdag.Node - - pbdata *ftpb.Data - splitter chunk.BlockSplitter -} - -func NewDagModifier(from *mdag.Node, serv mdag.DAGService, spl chunk.BlockSplitter) (*DagModifier, error) { - pbd, err := ft.FromBytes(from.Data) - if err != nil { - return nil, err - } - - return &DagModifier{ - curNode: from.Copy(), - dagserv: serv, - pbdata: pbd, - splitter: spl, - }, nil -} - -// WriteAt will modify a dag file in place -// NOTE: it currently assumes only a single level of indirection -func (dm *DagModifier) WriteAt(b []byte, offset uint64) (int, error) { - - // Check bounds - if dm.pbdata.GetFilesize() < offset { - return 0, errors.New("Attempted to perform write starting past end of file") - } - - // First need to find where we are writing at - end := uint64(len(b)) + offset - - // This shouldnt be necessary if we do subblocks sizes properly - newsize := dm.pbdata.GetFilesize() - if end > dm.pbdata.GetFilesize() { - newsize = end - } - zeroblocklen := uint64(len(dm.pbdata.Data)) - origlen := len(b) - - if end <= zeroblocklen { - log.Debug("Writing into zero block") - // Replacing zeroeth data block (embedded in the root node) - //TODO: check chunking here - copy(dm.pbdata.Data[offset:], b) - return len(b), nil - } - - // Find where write should start - var traversed uint64 - startsubblk := len(dm.pbdata.Blocksizes) - if offset < zeroblocklen { - dm.pbdata.Data = dm.pbdata.Data[:offset] - startsubblk = 0 - } else { - traversed = uint64(zeroblocklen) - for i, size := range dm.pbdata.Blocksizes { - if uint64(offset) < traversed+size { - log.Debugf("Starting mod at block %d. [%d < %d + %d]", i, offset, traversed, size) - // Here is where we start - startsubblk = i - lnk := dm.curNode.Links[i] - node, err := dm.dagserv.Get(u.Key(lnk.Hash)) - if err != nil { - return 0, err - } - data, err := ft.UnwrapData(node.Data) - if err != nil { - return 0, err - } - - // We have to rewrite the data before our write in this block. - b = append(data[:offset-traversed], b...) - break - } - traversed += size - } - if startsubblk == len(dm.pbdata.Blocksizes) { - // TODO: Im not sure if theres any case that isnt being handled here. - // leaving this note here as a future reference in case something breaks - } - } - - // Find blocks that need to be overwritten - var changed []int - mid := -1 - var midoff uint64 - for i, size := range dm.pbdata.Blocksizes[startsubblk:] { - if end > traversed { - changed = append(changed, i+startsubblk) - } else { - break - } - traversed += size - if end < traversed { - mid = i + startsubblk - midoff = end - (traversed - size) - break - } - } - - // If our write starts in the middle of a block... - var midlnk *mdag.Link - if mid >= 0 { - midlnk = dm.curNode.Links[mid] - midnode, err := dm.dagserv.Get(u.Key(midlnk.Hash)) - if err != nil { - return 0, err - } - - // NOTE: this may have to be changed later when we have multiple - // layers of indirection - data, err := ft.UnwrapData(midnode.Data) - if err != nil { - return 0, err - } - b = append(b, data[midoff:]...) - } - - // Generate new sub-blocks, and sizes - subblocks := splitBytes(b, dm.splitter) - var links []*mdag.Link - var sizes []uint64 - for _, sb := range subblocks { - n := &mdag.Node{Data: ft.WrapData(sb)} - _, err := dm.dagserv.Add(n) - if err != nil { - log.Warningf("Failed adding node to DAG service: %s", err) - return 0, err - } - lnk, err := mdag.MakeLink(n) - if err != nil { - return 0, err - } - links = append(links, lnk) - sizes = append(sizes, uint64(len(sb))) - } - - // This is disgusting (and can be rewritten if performance demands) - if len(changed) > 0 { - sechalflink := append(links, dm.curNode.Links[changed[len(changed)-1]+1:]...) - dm.curNode.Links = append(dm.curNode.Links[:changed[0]], sechalflink...) - sechalfblks := append(sizes, dm.pbdata.Blocksizes[changed[len(changed)-1]+1:]...) - dm.pbdata.Blocksizes = append(dm.pbdata.Blocksizes[:changed[0]], sechalfblks...) - } else { - dm.curNode.Links = append(dm.curNode.Links, links...) - dm.pbdata.Blocksizes = append(dm.pbdata.Blocksizes, sizes...) - } - dm.pbdata.Filesize = proto.Uint64(newsize) - - return origlen, nil -} - -func (dm *DagModifier) Size() uint64 { - if dm == nil { - return 0 - } - return dm.pbdata.GetFilesize() -} - -// splitBytes uses a splitterFunc to turn a large array of bytes -// into many smaller arrays of bytes -func splitBytes(b []byte, spl chunk.BlockSplitter) [][]byte { - out := spl.Split(bytes.NewReader(b)) - var arr [][]byte - for blk := range out { - arr = append(arr, blk) - } - return arr -} - -// GetNode gets the modified DAG Node -func (dm *DagModifier) GetNode() (*mdag.Node, error) { - b, err := proto.Marshal(dm.pbdata) - if err != nil { - return nil, err - } - dm.curNode.Data = b - return dm.curNode.Copy(), nil -} diff --git a/unixfs/io/dagmodifier_test.go b/unixfs/io/dagmodifier_test.go deleted file mode 100644 index ca9c420042..0000000000 --- a/unixfs/io/dagmodifier_test.go +++ /dev/null @@ -1,247 +0,0 @@ -package io - -import ( - "fmt" - "io" - "io/ioutil" - "testing" - - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - "github.com/jbenet/go-ipfs/blocks/blockstore" - bs "github.com/jbenet/go-ipfs/blockservice" - "github.com/jbenet/go-ipfs/exchange/offline" - imp "github.com/jbenet/go-ipfs/importer" - "github.com/jbenet/go-ipfs/importer/chunk" - mdag "github.com/jbenet/go-ipfs/merkledag" - ft "github.com/jbenet/go-ipfs/unixfs" - u "github.com/jbenet/go-ipfs/util" - - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" -) - -func getMockDagServ(t *testing.T) mdag.DAGService { - dstore := ds.NewMapDatastore() - tsds := sync.MutexWrap(dstore) - bstore := blockstore.NewBlockstore(tsds) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } - return mdag.NewDAGService(bserv) -} - -func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { - in := io.LimitReader(u.NewTimeSeededRand(), size) - node, err := imp.BuildDagFromReader(in, dserv, nil, &chunk.SizeSplitter{500}) - if err != nil { - t.Fatal(err) - } - - dr, err := NewDagReader(context.Background(), node, dserv) - if err != nil { - t.Fatal(err) - } - - b, err := ioutil.ReadAll(dr) - if err != nil { - t.Fatal(err) - } - - return b, node -} - -func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { - newdata := make([]byte, size) - r := u.NewTimeSeededRand() - r.Read(newdata) - - if size+beg > uint64(len(orig)) { - orig = append(orig, make([]byte, (size+beg)-uint64(len(orig)))...) - } - copy(orig[beg:], newdata) - - nmod, err := dm.WriteAt(newdata, uint64(beg)) - if err != nil { - t.Fatal(err) - } - - if nmod != int(size) { - t.Fatalf("Mod length not correct! %d != %d", nmod, size) - } - - nd, err := dm.GetNode() - if err != nil { - t.Fatal(err) - } - - rd, err := NewDagReader(context.Background(), nd, dm.dagserv) - if err != nil { - t.Fatal(err) - } - - after, err := ioutil.ReadAll(rd) - if err != nil { - t.Fatal(err) - } - - err = arrComp(after, orig) - if err != nil { - t.Fatal(err) - } - return orig -} - -func TestDagModifierBasic(t *testing.T) { - t.Skip("DAGModifier needs to be fixed to work with indirect blocks.") - if err := u.SetLogLevel("blockservice", "critical"); err != nil { - t.Fatalf("testlog prepare failed: %s", err) - } - if err := u.SetLogLevel("merkledag", "critical"); err != nil { - t.Fatalf("testlog prepare failed: %s", err) - } - dserv := getMockDagServ(t) - b, n := getNode(t, dserv, 50000) - - dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{Size: 512}) - if err != nil { - t.Fatal(err) - } - - // Within zero block - beg := uint64(15) - length := uint64(60) - - t.Log("Testing mod within zero block") - b = testModWrite(t, beg, length, b, dagmod) - - // Within bounds of existing file - beg = 1000 - length = 4000 - t.Log("Testing mod within bounds of existing file.") - b = testModWrite(t, beg, length, b, dagmod) - - // Extend bounds - beg = 49500 - length = 4000 - - t.Log("Testing mod that extends file.") - b = testModWrite(t, beg, length, b, dagmod) - - // "Append" - beg = uint64(len(b)) - length = 3000 - b = testModWrite(t, beg, length, b, dagmod) - - // Verify reported length - node, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - - size, err := ft.DataSize(node.Data) - if err != nil { - t.Fatal(err) - } - - expected := uint64(50000 + 3500 + 3000) - if size != expected { - t.Fatalf("Final reported size is incorrect [%d != %d]", size, expected) - } -} - -func TestMultiWrite(t *testing.T) { - t.Skip("DAGModifier needs to be fixed to work with indirect blocks.") - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) - - dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{Size: 512}) - if err != nil { - t.Fatal(err) - } - - data := make([]byte, 4000) - u.NewTimeSeededRand().Read(data) - - for i := 0; i < len(data); i++ { - n, err := dagmod.WriteAt(data[i:i+1], uint64(i)) - if err != nil { - t.Fatal(err) - } - if n != 1 { - t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") - } - } - nd, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - - read, err := NewDagReader(context.Background(), nd, dserv) - if err != nil { - t.Fatal(err) - } - rbuf, err := ioutil.ReadAll(read) - if err != nil { - t.Fatal(err) - } - - err = arrComp(rbuf, data) - if err != nil { - t.Fatal(err) - } -} - -func TestMultiWriteCoal(t *testing.T) { - t.Skip("Skipping test until DagModifier is fixed") - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) - - dagmod, err := NewDagModifier(n, dserv, &chunk.SizeSplitter{Size: 512}) - if err != nil { - t.Fatal(err) - } - - data := make([]byte, 4000) - u.NewTimeSeededRand().Read(data) - - for i := 0; i < len(data); i++ { - n, err := dagmod.WriteAt(data[:i+1], 0) - if err != nil { - t.Fatal(err) - } - if n != i+1 { - t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") - } - } - nd, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - - read, err := NewDagReader(context.Background(), nd, dserv) - if err != nil { - t.Fatal(err) - } - rbuf, err := ioutil.ReadAll(read) - if err != nil { - t.Fatal(err) - } - - err = arrComp(rbuf, data) - if err != nil { - t.Fatal(err) - } -} - -func arrComp(a, b []byte) error { - if len(a) != len(b) { - return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) - } - for i, v := range a { - if v != b[i] { - return fmt.Errorf("Arrays differ at index: %d", i) - } - } - return nil -} diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go new file mode 100644 index 0000000000..4e5b31088e --- /dev/null +++ b/unixfs/mod/dagmodifier.go @@ -0,0 +1,450 @@ +package mod + +import ( + "bytes" + "errors" + "io" + "os" + + proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + chunk "github.com/jbenet/go-ipfs/importer/chunk" + help "github.com/jbenet/go-ipfs/importer/helpers" + trickle "github.com/jbenet/go-ipfs/importer/trickle" + mdag "github.com/jbenet/go-ipfs/merkledag" + pin "github.com/jbenet/go-ipfs/pin" + ft "github.com/jbenet/go-ipfs/unixfs" + uio "github.com/jbenet/go-ipfs/unixfs/io" + ftpb "github.com/jbenet/go-ipfs/unixfs/pb" + u "github.com/jbenet/go-ipfs/util" +) + +// 2MB +var writebufferSize = 1 << 21 + +var log = u.Logger("dagio") + +// DagModifier is the only struct licensed and able to correctly +// perform surgery on a DAG 'file' +// Dear god, please rename this to something more pleasant +type DagModifier struct { + dagserv mdag.DAGService + curNode *mdag.Node + mp pin.ManualPinner + + splitter chunk.BlockSplitter + ctx context.Context + readCancel func() + + writeStart uint64 + curWrOff uint64 + wrBuf *bytes.Buffer + + read *uio.DagReader +} + +func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.ManualPinner, spl chunk.BlockSplitter) (*DagModifier, error) { + return &DagModifier{ + curNode: from.Copy(), + dagserv: serv, + splitter: spl, + ctx: ctx, + mp: mp, + }, nil +} + +// WriteAt will modify a dag file in place +// NOTE: it currently assumes only a single level of indirection +func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) { + // TODO: this is currently VERY inneficient + if uint64(offset) != dm.curWrOff { + size, err := dm.Size() + if err != nil { + return 0, err + } + if offset > size { + err := dm.expandSparse(offset - size) + if err != nil { + return 0, err + } + } + + err = dm.Flush() + if err != nil { + return 0, err + } + dm.writeStart = uint64(offset) + } + + return dm.Write(b) +} + +// A reader that just returns zeros +type zeroReader struct{} + +func (zr zeroReader) Read(b []byte) (int, error) { + for i, _ := range b { + b[i] = 0 + } + return len(b), nil +} + +func (dm *DagModifier) expandSparse(size int64) error { + spl := chunk.SizeSplitter{4096} + r := io.LimitReader(zeroReader{}, size) + blks := spl.Split(r) + nnode, err := dm.appendData(dm.curNode, blks) + if err != nil { + return err + } + _, err = dm.dagserv.Add(nnode) + if err != nil { + return err + } + dm.curNode = nnode + return nil +} + +func (dm *DagModifier) Write(b []byte) (int, error) { + if dm.read != nil { + dm.read = nil + } + if dm.wrBuf == nil { + dm.wrBuf = new(bytes.Buffer) + } + n, err := dm.wrBuf.Write(b) + if err != nil { + return n, err + } + dm.curWrOff += uint64(n) + if dm.wrBuf.Len() > writebufferSize { + err := dm.Flush() + if err != nil { + return n, err + } + } + return n, nil +} + +func (dm *DagModifier) Size() (int64, error) { + // TODO: compute size without flushing, should be easy + err := dm.Flush() + if err != nil { + return 0, err + } + + pbn, err := ft.FromBytes(dm.curNode.Data) + if err != nil { + return 0, err + } + + return int64(pbn.GetFilesize()), nil +} + +func (dm *DagModifier) Flush() error { + if dm.wrBuf == nil { + return nil + } + + // If we have an active reader, kill it + if dm.read != nil { + dm.read = nil + dm.readCancel() + } + + buflen := dm.wrBuf.Len() + + k, _, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) + if err != nil { + return err + } + + nd, err := dm.dagserv.Get(k) + if err != nil { + return err + } + + dm.curNode = nd + + if !done { + blks := dm.splitter.Split(dm.wrBuf) + nd, err = dm.appendData(dm.curNode, blks) + if err != nil { + return err + } + + _, err := dm.dagserv.Add(nd) + if err != nil { + return err + } + + dm.curNode = nd + } + + dm.writeStart += uint64(buflen) + + dm.wrBuf = nil + return nil +} + +func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (u.Key, int, bool, error) { + f, err := ft.FromBytes(node.Data) + if err != nil { + return "", 0, false, err + } + + if len(node.Links) == 0 && (f.GetType() == ftpb.Data_Raw || f.GetType() == ftpb.Data_File) { + n, err := data.Read(f.Data[offset:]) + if err != nil && err != io.EOF { + return "", 0, false, err + } + + // Update newly written node.. + b, err := proto.Marshal(f) + if err != nil { + return "", 0, false, err + } + + nd := &mdag.Node{Data: b} + k, err := dm.dagserv.Add(nd) + if err != nil { + return "", 0, false, err + } + + // Hey look! we're done! + var done bool + if n < len(f.Data) { + done = true + } + + return k, n, done, nil + } + + var cur uint64 + var done bool + var totread int + for i, bs := range f.GetBlocksizes() { + if cur+bs > offset { + child, err := node.Links[i].GetNode(dm.dagserv) + if err != nil { + return "", 0, false, err + } + k, nread, sdone, err := dm.modifyDag(child, offset-cur, data) + if err != nil { + return "", 0, false, err + } + totread += nread + + offset += bs + node.Links[i].Hash = mh.Multihash(k) + + if sdone { + done = true + break + } + } + cur += bs + } + + k, err := dm.dagserv.Add(node) + return k, totread, done, err +} + +func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.Node, error) { + dbp := &help.DagBuilderParams{ + Dagserv: dm.dagserv, + Maxlinks: help.DefaultLinksPerBlock, + Pinner: dm.mp, + } + + return trickle.TrickleAppend(node, dbp.New(blks)) +} + +func (dm *DagModifier) Read(b []byte) (int, error) { + err := dm.Flush() + if err != nil { + return 0, err + } + + if dm.read == nil { + dr, err := uio.NewDagReader(dm.ctx, dm.curNode, dm.dagserv) + if err != nil { + return 0, err + } + + i, err := dr.Seek(int64(dm.curWrOff), os.SEEK_SET) + if err != nil { + return 0, err + } + + if i != int64(dm.curWrOff) { + return 0, errors.New("failed to seek properly") + } + + dm.read = dr + } + + n, err := dm.read.Read(b) + dm.curWrOff += uint64(n) + return n, err +} + +// splitBytes uses a splitterFunc to turn a large array of bytes +// into many smaller arrays of bytes +func (dm *DagModifier) splitBytes(in io.Reader) ([]u.Key, error) { + var out []u.Key + blks := dm.splitter.Split(in) + for blk := range blks { + nd := help.NewUnixfsNode() + nd.SetData(blk) + dagnd, err := nd.GetDagNode() + if err != nil { + return nil, err + } + + k, err := dm.dagserv.Add(dagnd) + if err != nil { + return nil, err + } + out = append(out, k) + } + return out, nil +} + +// GetNode gets the modified DAG Node +func (dm *DagModifier) GetNode() (*mdag.Node, error) { + err := dm.Flush() + if err != nil { + return nil, err + } + return dm.curNode.Copy(), nil +} + +func (dm *DagModifier) HasChanges() bool { + return dm.wrBuf != nil +} + +func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { + err := dm.Flush() + if err != nil { + return 0, err + } + + switch whence { + case os.SEEK_CUR: + dm.curWrOff += uint64(offset) + dm.writeStart = dm.curWrOff + case os.SEEK_SET: + dm.curWrOff = uint64(offset) + dm.writeStart = uint64(offset) + case os.SEEK_END: + return 0, errors.New("SEEK_END currently not implemented") + default: + return 0, errors.New("unrecognized whence") + } + + if dm.read != nil { + _, err = dm.read.Seek(offset, whence) + if err != nil { + return 0, err + } + } + + return int64(dm.curWrOff), nil +} + +func (dm *DagModifier) Truncate(size int64) error { + err := dm.Flush() + if err != nil { + return err + } + + realSize, err := dm.Size() + if err != nil { + return err + } + + if size > int64(realSize) { + return errors.New("Cannot extend file through truncate") + } + + nnode, err := dagTruncate(dm.curNode, uint64(size), dm.dagserv) + if err != nil { + return err + } + + _, err = dm.dagserv.Add(nnode) + if err != nil { + return err + } + + dm.curNode = nnode + return nil +} + +func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, error) { + if len(nd.Links) == 0 { + // TODO: this can likely be done without marshaling and remarshaling + pbn, err := ft.FromBytes(nd.Data) + if err != nil { + return nil, err + } + + nd.Data = ft.WrapData(pbn.Data[:size]) + return nd, nil + } + + var cur uint64 + end := 0 + var modified *mdag.Node + ndata := new(ft.FSNode) + for i, lnk := range nd.Links { + child, err := lnk.GetNode(ds) + if err != nil { + return nil, err + } + + childsize, err := ft.DataSize(child.Data) + if err != nil { + return nil, err + } + + if size < cur+childsize { + nchild, err := dagTruncate(child, size-cur, ds) + if err != nil { + return nil, err + } + + // TODO: sanity check size of truncated block + ndata.AddBlockSize(size - cur) + + modified = nchild + end = i + break + } + cur += childsize + ndata.AddBlockSize(childsize) + } + + _, err := ds.Add(modified) + if err != nil { + return nil, err + } + + nd.Links = nd.Links[:end] + err = nd.AddNodeLinkClean("", modified) + if err != nil { + return nil, err + } + + d, err := ndata.GetBytes() + if err != nil { + return nil, err + } + + nd.Data = d + + return nd, nil +} diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go new file mode 100644 index 0000000000..ac4e6f5079 --- /dev/null +++ b/unixfs/mod/dagmodifier_test.go @@ -0,0 +1,464 @@ +package mod + +import ( + "fmt" + "io" + "io/ioutil" + "testing" + + "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/jbenet/go-ipfs/blocks/blockstore" + bs "github.com/jbenet/go-ipfs/blockservice" + "github.com/jbenet/go-ipfs/exchange/offline" + imp "github.com/jbenet/go-ipfs/importer" + "github.com/jbenet/go-ipfs/importer/chunk" + h "github.com/jbenet/go-ipfs/importer/helpers" + trickle "github.com/jbenet/go-ipfs/importer/trickle" + mdag "github.com/jbenet/go-ipfs/merkledag" + ft "github.com/jbenet/go-ipfs/unixfs" + uio "github.com/jbenet/go-ipfs/unixfs/io" + u "github.com/jbenet/go-ipfs/util" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" +) + +func getMockDagServ(t *testing.T) mdag.DAGService { + dstore := ds.NewMapDatastore() + tsds := sync.MutexWrap(dstore) + bstore := blockstore.NewBlockstore(tsds) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + return mdag.NewDAGService(bserv) +} + +func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { + in := io.LimitReader(u.NewTimeSeededRand(), size) + node, err := imp.BuildTrickleDagFromReader(in, dserv, nil, &chunk.SizeSplitter{500}) + if err != nil { + t.Fatal(err) + } + + dr, err := uio.NewDagReader(context.Background(), node, dserv) + if err != nil { + t.Fatal(err) + } + + b, err := ioutil.ReadAll(dr) + if err != nil { + t.Fatal(err) + } + + return b, node +} + +func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { + newdata := make([]byte, size) + r := u.NewTimeSeededRand() + r.Read(newdata) + + if size+beg > uint64(len(orig)) { + orig = append(orig, make([]byte, (size+beg)-uint64(len(orig)))...) + } + copy(orig[beg:], newdata) + + nmod, err := dm.WriteAt(newdata, int64(beg)) + if err != nil { + t.Fatal(err) + } + + if nmod != int(size) { + t.Fatalf("Mod length not correct! %d != %d", nmod, size) + } + + nd, err := dm.GetNode() + if err != nil { + t.Fatal(err) + } + + err = trickle.VerifyTrickleDagStructure(nd, dm.dagserv, h.DefaultLinksPerBlock, 4) + if err != nil { + t.Fatal(err) + } + + rd, err := uio.NewDagReader(context.Background(), nd, dm.dagserv) + if err != nil { + t.Fatal(err) + } + + after, err := ioutil.ReadAll(rd) + if err != nil { + t.Fatal(err) + } + + err = arrComp(after, orig) + if err != nil { + t.Fatal(err) + } + return orig +} + +func TestDagModifierBasic(t *testing.T) { + dserv := getMockDagServ(t) + b, n := getNode(t, dserv, 50000) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + // Within zero block + beg := uint64(15) + length := uint64(60) + + t.Log("Testing mod within zero block") + b = testModWrite(t, beg, length, b, dagmod) + + // Within bounds of existing file + beg = 1000 + length = 4000 + t.Log("Testing mod within bounds of existing multiblock file.") + b = testModWrite(t, beg, length, b, dagmod) + + // Extend bounds + beg = 49500 + length = 4000 + + t.Log("Testing mod that extends file.") + b = testModWrite(t, beg, length, b, dagmod) + + // "Append" + beg = uint64(len(b)) + length = 3000 + t.Log("Testing pure append") + b = testModWrite(t, beg, length, b, dagmod) + + // Verify reported length + node, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + size, err := ft.DataSize(node.Data) + if err != nil { + t.Fatal(err) + } + + expected := uint64(50000 + 3500 + 3000) + if size != expected { + t.Fatalf("Final reported size is incorrect [%d != %d]", size, expected) + } +} + +func TestMultiWrite(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + data := make([]byte, 4000) + u.NewTimeSeededRand().Read(data) + + for i := 0; i < len(data); i++ { + n, err := dagmod.WriteAt(data[i:i+1], int64(i)) + if err != nil { + t.Fatal(err) + } + if n != 1 { + t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") + } + } + nd, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + read, err := uio.NewDagReader(context.Background(), nd, dserv) + if err != nil { + t.Fatal(err) + } + rbuf, err := ioutil.ReadAll(read) + if err != nil { + t.Fatal(err) + } + + err = arrComp(rbuf, data) + if err != nil { + t.Fatal(err) + } +} + +func TestMultiWriteAndFlush(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + data := make([]byte, 20) + u.NewTimeSeededRand().Read(data) + + for i := 0; i < len(data); i++ { + n, err := dagmod.WriteAt(data[i:i+1], int64(i)) + if err != nil { + t.Fatal(err) + } + if n != 1 { + t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") + } + err = dagmod.Flush() + if err != nil { + t.Fatal(err) + } + } + nd, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + read, err := uio.NewDagReader(context.Background(), nd, dserv) + if err != nil { + t.Fatal(err) + } + rbuf, err := ioutil.ReadAll(read) + if err != nil { + t.Fatal(err) + } + + err = arrComp(rbuf, data) + if err != nil { + t.Fatal(err) + } +} + +func TestWriteNewFile(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + towrite := make([]byte, 2000) + u.NewTimeSeededRand().Read(towrite) + + nw, err := dagmod.Write(towrite) + if err != nil { + t.Fatal(err) + } + if nw != len(towrite) { + t.Fatal("Wrote wrong amount") + } + + nd, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + read, err := uio.NewDagReader(ctx, nd, dserv) + if err != nil { + t.Fatal(err) + } + + data, err := ioutil.ReadAll(read) + if err != nil { + t.Fatal(err) + } + + if err := arrComp(data, towrite); err != nil { + t.Fatal(err) + } +} + +func TestMultiWriteCoal(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + data := make([]byte, 1000) + u.NewTimeSeededRand().Read(data) + + for i := 0; i < len(data); i++ { + n, err := dagmod.WriteAt(data[:i+1], 0) + if err != nil { + fmt.Println("FAIL AT ", i) + t.Fatal(err) + } + if n != i+1 { + t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") + } + + // TEMP + nn, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + r, err := uio.NewDagReader(ctx, nn, dserv) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(r) + if err != nil { + t.Fatal(err) + } + + if err := arrComp(out, data[:i+1]); err != nil { + fmt.Println("A ", len(out)) + fmt.Println(out) + fmt.Println(data[:i+1]) + t.Fatal(err) + } + // + } + nd, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + read, err := uio.NewDagReader(context.Background(), nd, dserv) + if err != nil { + t.Fatal(err) + } + rbuf, err := ioutil.ReadAll(read) + if err != nil { + t.Fatal(err) + } + + err = arrComp(rbuf, data) + if err != nil { + t.Fatal(err) + } +} + +func TestLargeWriteChunks(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + wrsize := 1000 + datasize := 10000000 + data := make([]byte, datasize) + + u.NewTimeSeededRand().Read(data) + + for i := 0; i < datasize/wrsize; i++ { + n, err := dagmod.WriteAt(data[i*wrsize:(i+1)*wrsize], int64(i*wrsize)) + if err != nil { + t.Fatal(err) + } + if n != wrsize { + t.Fatal("failed to write buffer") + } + } + + out, err := ioutil.ReadAll(dagmod) + if err != nil { + t.Fatal(err) + } + + if err = arrComp(out, data); err != nil { + t.Fatal(err) + } + +} + +func TestDagTruncate(t *testing.T) { + dserv := getMockDagServ(t) + b, n := getNode(t, dserv, 50000) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + err = dagmod.Truncate(12345) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(dagmod) + if err != nil { + t.Fatal(err) + } + + if err = arrComp(out, b[:12345]); err != nil { + t.Fatal(err) + } +} + +func arrComp(a, b []byte) error { + if len(a) != len(b) { + return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) + } + for i, v := range a { + if v != b[i] { + return fmt.Errorf("Arrays differ at index: %d", i) + } + } + return nil +} + +func printDag(nd *mdag.Node, ds mdag.DAGService, indent int) { + pbd, err := ft.FromBytes(nd.Data) + if err != nil { + panic(err) + } + + for i := 0; i < indent; i++ { + fmt.Print(" ") + } + fmt.Printf("{size = %d, type = %s, children = %d", pbd.GetFilesize(), pbd.GetType().String(), len(pbd.GetBlocksizes())) + if len(nd.Links) > 0 { + fmt.Println() + } + for _, lnk := range nd.Links { + child, err := lnk.GetNode(ds) + if err != nil { + panic(err) + } + printDag(child, ds, indent+1) + } + if len(nd.Links) > 0 { + for i := 0; i < indent; i++ { + fmt.Print(" ") + } + } + fmt.Println("}") +} From fd4600bd16259ec65ea37ed28bcdbdadd2b1d21c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 7 Mar 2015 19:08:39 -0800 Subject: [PATCH 0697/3147] better error message from dagreader with bad protofbuf This commit was moved from ipfs/go-unixfs@e6119c6495268fbb4c566d226750b819120cce0b --- unixfs/io/dagreader.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 0af49e9ee1..64dfff1272 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -3,6 +3,7 @@ package io import ( "bytes" "errors" + "fmt" "io" "os" @@ -113,7 +114,7 @@ func (dr *DagReader) precalcNextBuf() error { pb := new(ftpb.Data) err = proto.Unmarshal(nxt.Data, pb) if err != nil { - return err + return fmt.Errorf("incorrectly formatted protobuf: %s", err) } switch pb.GetType() { From 43499b008ed89c6f8054f49b2cc5addfa81f4b4a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 9 Mar 2015 14:53:21 -0700 Subject: [PATCH 0698/3147] Code cleanup This commit was moved from ipfs/go-unixfs@d7f1750f7a95d82bb3974458f5075e35c0ddcd81 --- unixfs/mod/dagmodifier.go | 48 +++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 4e5b31088e..1c234945e6 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -17,7 +17,6 @@ import ( pin "github.com/jbenet/go-ipfs/pin" ft "github.com/jbenet/go-ipfs/unixfs" uio "github.com/jbenet/go-ipfs/unixfs/io" - ftpb "github.com/jbenet/go-ipfs/unixfs/pb" u "github.com/jbenet/go-ipfs/util" ) @@ -56,9 +55,10 @@ func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, } // WriteAt will modify a dag file in place -// NOTE: it currently assumes only a single level of indirection func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) { // TODO: this is currently VERY inneficient + // each write that happens at an offset other than the current one causes a + // flush to disk, and dag rewrite if uint64(offset) != dm.curWrOff { size, err := dm.Size() if err != nil { @@ -91,6 +91,8 @@ func (zr zeroReader) Read(b []byte) (int, error) { return len(b), nil } +// expandSparse grows the file with zero blocks of 4096 +// A small blocksize is chosen to aid in deduplication func (dm *DagModifier) expandSparse(size int64) error { spl := chunk.SizeSplitter{4096} r := io.LimitReader(zeroReader{}, size) @@ -107,6 +109,7 @@ func (dm *DagModifier) expandSparse(size int64) error { return nil } +// Write continues writing to the dag at the current offset func (dm *DagModifier) Write(b []byte) (int, error) { if dm.read != nil { dm.read = nil @@ -114,6 +117,7 @@ func (dm *DagModifier) Write(b []byte) (int, error) { if dm.wrBuf == nil { dm.wrBuf = new(bytes.Buffer) } + n, err := dm.wrBuf.Write(b) if err != nil { return n, err @@ -143,7 +147,9 @@ func (dm *DagModifier) Size() (int64, error) { return int64(pbn.GetFilesize()), nil } +// Flush writes changes to this dag to disk func (dm *DagModifier) Flush() error { + // No buffer? Nothing to do if dm.wrBuf == nil { return nil } @@ -154,9 +160,11 @@ func (dm *DagModifier) Flush() error { dm.readCancel() } + // Number of bytes we're going to write buflen := dm.wrBuf.Len() - k, _, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) + // overwrite existing dag nodes + k, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) if err != nil { return err } @@ -168,6 +176,7 @@ func (dm *DagModifier) Flush() error { dm.curNode = nd + // need to write past end of current dag if !done { blks := dm.splitter.Split(dm.wrBuf) nd, err = dm.appendData(dm.curNode, blks) @@ -189,28 +198,30 @@ func (dm *DagModifier) Flush() error { return nil } -func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (u.Key, int, bool, error) { +// modifyDag writes the data in 'data' over the data in 'node' starting at 'offset' +func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (u.Key, bool, error) { f, err := ft.FromBytes(node.Data) if err != nil { - return "", 0, false, err + return "", false, err } - if len(node.Links) == 0 && (f.GetType() == ftpb.Data_Raw || f.GetType() == ftpb.Data_File) { + // If we've reached a leaf node. + if len(node.Links) == 0 { n, err := data.Read(f.Data[offset:]) if err != nil && err != io.EOF { - return "", 0, false, err + return "", false, err } // Update newly written node.. b, err := proto.Marshal(f) if err != nil { - return "", 0, false, err + return "", false, err } nd := &mdag.Node{Data: b} k, err := dm.dagserv.Add(nd) if err != nil { - return "", 0, false, err + return "", false, err } // Hey look! we're done! @@ -219,23 +230,21 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) done = true } - return k, n, done, nil + return k, done, nil } var cur uint64 var done bool - var totread int for i, bs := range f.GetBlocksizes() { if cur+bs > offset { child, err := node.Links[i].GetNode(dm.dagserv) if err != nil { - return "", 0, false, err + return "", false, err } - k, nread, sdone, err := dm.modifyDag(child, offset-cur, data) + k, sdone, err := dm.modifyDag(child, offset-cur, data) if err != nil { - return "", 0, false, err + return "", false, err } - totread += nread offset += bs node.Links[i].Hash = mh.Multihash(k) @@ -249,9 +258,10 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) } k, err := dm.dagserv.Add(node) - return k, totread, done, err + return k, done, err } +// appendData appends the blocks from the given chan to the end of this dag func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.Node, error) { dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, @@ -262,6 +272,7 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.No return trickle.TrickleAppend(node, dbp.New(blks)) } +// Read data from this dag starting at the current offset func (dm *DagModifier) Read(b []byte) (int, error) { err := dm.Flush() if err != nil { @@ -322,6 +333,7 @@ func (dm *DagModifier) GetNode() (*mdag.Node, error) { return dm.curNode.Copy(), nil } +// HasChanges returned whether or not there are unflushed changes to this dag func (dm *DagModifier) HasChanges() bool { return dm.wrBuf != nil } @@ -366,8 +378,9 @@ func (dm *DagModifier) Truncate(size int64) error { return err } + // Truncate can also be used to expand the file if size > int64(realSize) { - return errors.New("Cannot extend file through truncate") + return dm.expandSparse(int64(size) - realSize) } nnode, err := dagTruncate(dm.curNode, uint64(size), dm.dagserv) @@ -384,6 +397,7 @@ func (dm *DagModifier) Truncate(size int64) error { return nil } +// dagTruncate truncates the given node to 'size' and returns the modified Node func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, error) { if len(nd.Links) == 0 { // TODO: this can likely be done without marshaling and remarshaling From 906905b6b8d35c33f3ccfce2d3e1892ba55b4cea Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 9 Mar 2015 16:37:28 -0700 Subject: [PATCH 0699/3147] add benchmark This commit was moved from ipfs/go-unixfs@00efa963cc355e1182be6c691c171bc607450984 --- unixfs/mod/dagmodifier_test.go | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index ac4e6f5079..d384c5ccc4 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -23,7 +23,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) -func getMockDagServ(t *testing.T) mdag.DAGService { +func getMockDagServ(t testing.TB) mdag.DAGService { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) @@ -34,7 +34,7 @@ func getMockDagServ(t *testing.T) mdag.DAGService { return mdag.NewDAGService(bserv) } -func getNode(t *testing.T, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { +func getNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) node, err := imp.BuildTrickleDagFromReader(in, dserv, nil, &chunk.SizeSplitter{500}) if err != nil { @@ -423,6 +423,35 @@ func TestDagTruncate(t *testing.T) { } } +func BenchmarkDagmodWrite(b *testing.B) { + b.StopTimer() + dserv := getMockDagServ(b) + _, n := getNode(b, dserv, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + wrsize := 4096 + + dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + if err != nil { + b.Fatal(err) + } + + buf := make([]byte, b.N*wrsize) + u.NewTimeSeededRand().Read(buf) + b.StartTimer() + b.SetBytes(int64(wrsize)) + for i := 0; i < b.N; i++ { + n, err := dagmod.Write(buf[i*wrsize : (i+1)*wrsize]) + if err != nil { + b.Fatal(err) + } + if n != wrsize { + b.Fatal("Wrote bad size") + } + } +} + func arrComp(a, b []byte) error { if len(a) != len(b) { return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) From 8075c534419ba4d5217245d143eaedc5aa703ad5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 9 Mar 2015 16:51:58 -0700 Subject: [PATCH 0700/3147] address comments from @cryptix in PR This commit was moved from ipfs/go-unixfs@f68d79f51ed01bf5777849ca34efb21ecfaa4089 --- unixfs/mod/dagmodifier.go | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 1c234945e6..c9bb17d355 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -20,6 +20,10 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +var ErrSeekFail = errors.New("failed to seek properly") +var ErrSeekEndNotImpl = errors.New("SEEK_END currently not implemented") +var ErrUnrecognizedWhence = errors.New("unrecognized whence") + // 2MB var writebufferSize = 1 << 21 @@ -199,6 +203,8 @@ func (dm *DagModifier) Flush() error { } // modifyDag writes the data in 'data' over the data in 'node' starting at 'offset' +// returns the new key of the passed in node and whether or not all the data in the reader +// has been consumed. func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (u.Key, bool, error) { f, err := ft.FromBytes(node.Data) if err != nil { @@ -291,7 +297,7 @@ func (dm *DagModifier) Read(b []byte) (int, error) { } if i != int64(dm.curWrOff) { - return 0, errors.New("failed to seek properly") + return 0, ErrSeekFail } dm.read = dr @@ -302,28 +308,6 @@ func (dm *DagModifier) Read(b []byte) (int, error) { return n, err } -// splitBytes uses a splitterFunc to turn a large array of bytes -// into many smaller arrays of bytes -func (dm *DagModifier) splitBytes(in io.Reader) ([]u.Key, error) { - var out []u.Key - blks := dm.splitter.Split(in) - for blk := range blks { - nd := help.NewUnixfsNode() - nd.SetData(blk) - dagnd, err := nd.GetDagNode() - if err != nil { - return nil, err - } - - k, err := dm.dagserv.Add(dagnd) - if err != nil { - return nil, err - } - out = append(out, k) - } - return out, nil -} - // GetNode gets the modified DAG Node func (dm *DagModifier) GetNode() (*mdag.Node, error) { err := dm.Flush() @@ -352,9 +336,9 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { dm.curWrOff = uint64(offset) dm.writeStart = uint64(offset) case os.SEEK_END: - return 0, errors.New("SEEK_END currently not implemented") + return 0, ErrSeekEndNotImpl default: - return 0, errors.New("unrecognized whence") + return 0, ErrUnrecognizedWhence } if dm.read != nil { @@ -425,6 +409,7 @@ func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, er return nil, err } + // found the child we want to cut if size < cur+childsize { nchild, err := dagTruncate(child, size-cur, ds) if err != nil { From fff62d89646c3f94d9828e1c24e16dcb4bc54113 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 9 Mar 2015 18:21:10 -0700 Subject: [PATCH 0701/3147] remove pointless TODO This commit was moved from ipfs/go-unixfs@7201c98adcb71115da325793f3145cab63044453 --- unixfs/mod/dagmodifier.go | 1 - 1 file changed, 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index c9bb17d355..ee6e3d9c94 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -416,7 +416,6 @@ func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, er return nil, err } - // TODO: sanity check size of truncated block ndata.AddBlockSize(size - cur) modified = nchild From fd44da575159166101ca2a103beb3f78bbf71fcb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 Mar 2015 00:27:08 -0700 Subject: [PATCH 0702/3147] remove temp code in Coal test, and make Size not have to flush This commit was moved from ipfs/go-unixfs@0d88fa496b0294b170d0d6690feb3459586a6ad7 --- unixfs/mod/dagmodifier.go | 10 +++++----- unixfs/mod/dagmodifier_test.go | 33 ++++++++++----------------------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index ee6e3d9c94..eddf221f4d 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -137,15 +137,15 @@ func (dm *DagModifier) Write(b []byte) (int, error) { } func (dm *DagModifier) Size() (int64, error) { - // TODO: compute size without flushing, should be easy - err := dm.Flush() + pbn, err := ft.FromBytes(dm.curNode.Data) if err != nil { return 0, err } - pbn, err := ft.FromBytes(dm.curNode.Data) - if err != nil { - return 0, err + if dm.wrBuf != nil { + if uint64(dm.wrBuf.Len())+dm.writeStart > pbn.GetFilesize() { + return int64(dm.wrBuf.Len()) + int64(dm.writeStart), nil + } } return int64(pbn.GetFilesize()), nil diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index d384c5ccc4..e6b51315fd 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -177,6 +177,15 @@ func TestMultiWrite(t *testing.T) { if n != 1 { t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") } + + size, err := dagmod.Size() + if err != nil { + t.Fatal(err) + } + + if size != int64(i+1) { + t.Fatal("Size was reported incorrectly") + } } nd, err := dagmod.GetNode() if err != nil { @@ -305,6 +314,7 @@ func TestMultiWriteCoal(t *testing.T) { u.NewTimeSeededRand().Read(data) for i := 0; i < len(data); i++ { + log.Error(i) n, err := dagmod.WriteAt(data[:i+1], 0) if err != nil { fmt.Println("FAIL AT ", i) @@ -314,29 +324,6 @@ func TestMultiWriteCoal(t *testing.T) { t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") } - // TEMP - nn, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - - r, err := uio.NewDagReader(ctx, nn, dserv) - if err != nil { - t.Fatal(err) - } - - out, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err) - } - - if err := arrComp(out, data[:i+1]); err != nil { - fmt.Println("A ", len(out)) - fmt.Println(out) - fmt.Println(data[:i+1]) - t.Fatal(err) - } - // } nd, err := dagmod.GetNode() if err != nil { From 8fafb1c96c03c628a373eda36b7f08e8869dc094 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 Mar 2015 00:31:06 -0700 Subject: [PATCH 0703/3147] overwrite optimization for dagmodifier This commit was moved from ipfs/go-unixfs@5fc12a98404020062a2bf4166160c9c8ffbc3550 --- unixfs/mod/dagmodifier.go | 9 ++++++++- unixfs/mod/dagmodifier_test.go | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index eddf221f4d..61f480e9e1 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -63,7 +63,12 @@ func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) { // TODO: this is currently VERY inneficient // each write that happens at an offset other than the current one causes a // flush to disk, and dag rewrite - if uint64(offset) != dm.curWrOff { + if offset == int64(dm.writeStart) && dm.wrBuf != nil { + // If we would overwrite the previous write + if len(b) >= dm.wrBuf.Len() { + dm.wrBuf.Reset() + } + } else if uint64(offset) != dm.curWrOff { size, err := dm.Size() if err != nil { return 0, err @@ -242,6 +247,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) var cur uint64 var done bool for i, bs := range f.GetBlocksizes() { + // We found the correct child to write into if cur+bs > offset { child, err := node.Links[i].GetNode(dm.dagserv) if err != nil { @@ -256,6 +262,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) node.Links[i].Hash = mh.Multihash(k) if sdone { + // No more bytes to write! done = true break } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index e6b51315fd..90c6d99e50 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -314,7 +314,6 @@ func TestMultiWriteCoal(t *testing.T) { u.NewTimeSeededRand().Read(data) for i := 0; i < len(data); i++ { - log.Error(i) n, err := dagmod.WriteAt(data[:i+1], 0) if err != nil { fmt.Println("FAIL AT ", i) From 6c56ec8814b93965fabc1abd9df50c99fd54b7da Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 Mar 2015 12:57:29 -0700 Subject: [PATCH 0704/3147] Correct pinning for dagmodifier, and a bunch more tests This commit was moved from ipfs/go-ipfs-pinner@d19f2effe2ce49872b5f938cbefa93996979d7f6 --- pinning/pinner/pin.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 68e627c1ea..7ae36f607e 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -47,6 +47,7 @@ type Pinner interface { // may not be successful type ManualPinner interface { PinWithMode(util.Key, PinMode) + RemovePinWithMode(util.Key, PinMode) Pinner } @@ -198,6 +199,20 @@ func (p *pinner) IsPinned(key util.Key) bool { p.indirPin.HasKey(key) } +func (p *pinner) RemovePinWithMode(key util.Key, mode PinMode) { + switch mode { + case Direct: + p.directPin.RemoveBlock(key) + case Indirect: + p.indirPin.Decrement(key) + case Recursive: + p.recursePin.RemoveBlock(key) + default: + // programmer error, panic OK + panic("unrecognized pin type") + } +} + // LoadPinner loads a pinner and its keysets from the given datastore func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) From 20301074593bb0baaa2f4ab2ab73dc19e7a9a1eb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 Mar 2015 12:57:29 -0700 Subject: [PATCH 0705/3147] Correct pinning for dagmodifier, and a bunch more tests This commit was moved from ipfs/go-unixfs@7147a88ffb00c714f99322fbd2753c188ff5eb2e --- unixfs/mod/dagmodifier.go | 46 ++++++- unixfs/mod/dagmodifier_test.go | 235 +++++++++++++++++++++++++++++---- 2 files changed, 248 insertions(+), 33 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 61f480e9e1..e08c3bf862 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -172,13 +172,19 @@ func (dm *DagModifier) Flush() error { // Number of bytes we're going to write buflen := dm.wrBuf.Len() + // Grab key for unpinning after mod operation + curk, err := dm.curNode.Key() + if err != nil { + return err + } + // overwrite existing dag nodes - k, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) + thisk, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) if err != nil { return err } - nd, err := dm.dagserv.Get(k) + nd, err := dm.dagserv.Get(thisk) if err != nil { return err } @@ -193,7 +199,7 @@ func (dm *DagModifier) Flush() error { return err } - _, err := dm.dagserv.Add(nd) + thisk, err = dm.dagserv.Add(nd) if err != nil { return err } @@ -201,6 +207,14 @@ func (dm *DagModifier) Flush() error { dm.curNode = nd } + // Finalize correct pinning, and flush pinner + dm.mp.PinWithMode(thisk, pin.Recursive) + dm.mp.RemovePinWithMode(curk, pin.Recursive) + err = dm.mp.Flush() + if err != nil { + return err + } + dm.writeStart += uint64(buflen) dm.wrBuf = nil @@ -237,7 +251,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) // Hey look! we're done! var done bool - if n < len(f.Data) { + if n < len(f.Data[offset:]) { done = true } @@ -249,6 +263,10 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) for i, bs := range f.GetBlocksizes() { // We found the correct child to write into if cur+bs > offset { + // Unpin block + ckey := u.Key(node.Links[i].Hash) + dm.mp.RemovePinWithMode(ckey, pin.Indirect) + child, err := node.Links[i].GetNode(dm.dagserv) if err != nil { return "", false, err @@ -258,14 +276,24 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) return "", false, err } + // pin the new node + dm.mp.PinWithMode(k, pin.Indirect) + offset += bs node.Links[i].Hash = mh.Multihash(k) + // Recache serialized node + _, err = node.Encoded(true) + if err != nil { + return "", false, err + } + if sdone { // No more bytes to write! done = true break } + offset = cur + bs } cur += bs } @@ -293,7 +321,8 @@ func (dm *DagModifier) Read(b []byte) (int, error) { } if dm.read == nil { - dr, err := uio.NewDagReader(dm.ctx, dm.curNode, dm.dagserv) + ctx, cancel := context.WithCancel(dm.ctx) + dr, err := uio.NewDagReader(ctx, dm.curNode, dm.dagserv) if err != nil { return 0, err } @@ -307,6 +336,7 @@ func (dm *DagModifier) Read(b []byte) (int, error) { return 0, ErrSeekFail } + dm.readCancel = cancel dm.read = dr } @@ -451,5 +481,11 @@ func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, er nd.Data = d + // invalidate cache and recompute serialized data + _, err = nd.Encoded(true) + if err != nil { + return nil, err + } + return nd, nil } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 90c6d99e50..d5ae29d7d8 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -4,6 +4,8 @@ import ( "fmt" "io" "io/ioutil" + "math/rand" + "os" "testing" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" @@ -15,6 +17,7 @@ import ( h "github.com/jbenet/go-ipfs/importer/helpers" trickle "github.com/jbenet/go-ipfs/importer/trickle" mdag "github.com/jbenet/go-ipfs/merkledag" + pin "github.com/jbenet/go-ipfs/pin" ft "github.com/jbenet/go-ipfs/unixfs" uio "github.com/jbenet/go-ipfs/unixfs/io" u "github.com/jbenet/go-ipfs/util" @@ -23,7 +26,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) -func getMockDagServ(t testing.TB) mdag.DAGService { +func getMockDagServ(t testing.TB) (mdag.DAGService, pin.ManualPinner) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) @@ -31,12 +34,25 @@ func getMockDagServ(t testing.TB) mdag.DAGService { if err != nil { t.Fatal(err) } - return mdag.NewDAGService(bserv) + dserv := mdag.NewDAGService(bserv) + return dserv, pin.NewPinner(tsds, dserv).GetManual() } -func getNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { +func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore, pin.ManualPinner) { + dstore := ds.NewMapDatastore() + tsds := sync.MutexWrap(dstore) + bstore := blockstore.NewBlockstore(tsds) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + dserv := mdag.NewDAGService(bserv) + return dserv, bstore, pin.NewPinner(tsds, dserv).GetManual() +} + +func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.ManualPinner) ([]byte, *mdag.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) - node, err := imp.BuildTrickleDagFromReader(in, dserv, nil, &chunk.SizeSplitter{500}) + node, err := imp.BuildTrickleDagFromReader(in, dserv, pinner, &chunk.SizeSplitter{500}) if err != nil { t.Fatal(err) } @@ -101,12 +117,12 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) } func TestDagModifierBasic(t *testing.T) { - dserv := getMockDagServ(t) - b, n := getNode(t, dserv, 50000) + dserv, pin := getMockDagServ(t) + b, n := getNode(t, dserv, 50000, pin) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pin, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -155,13 +171,13 @@ func TestDagModifierBasic(t *testing.T) { } func TestMultiWrite(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv, pins := getMockDagServ(t) + _, n := getNode(t, dserv, 0, pins) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -208,13 +224,13 @@ func TestMultiWrite(t *testing.T) { } func TestMultiWriteAndFlush(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv, pins := getMockDagServ(t) + _, n := getNode(t, dserv, 0, pins) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -256,13 +272,13 @@ func TestMultiWriteAndFlush(t *testing.T) { } func TestWriteNewFile(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv, pins := getMockDagServ(t) + _, n := getNode(t, dserv, 0, pins) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -299,13 +315,13 @@ func TestWriteNewFile(t *testing.T) { } func TestMultiWriteCoal(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv, pins := getMockDagServ(t) + _, n := getNode(t, dserv, 0, pins) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -345,13 +361,13 @@ func TestMultiWriteCoal(t *testing.T) { } func TestLargeWriteChunks(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv, pins := getMockDagServ(t) + _, n := getNode(t, dserv, 0, pins) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -384,12 +400,12 @@ func TestLargeWriteChunks(t *testing.T) { } func TestDagTruncate(t *testing.T) { - dserv := getMockDagServ(t) - b, n := getNode(t, dserv, 50000) + dserv, pins := getMockDagServ(t) + b, n := getNode(t, dserv, 50000, pins) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) if err != nil { t.Fatal(err) } @@ -399,6 +415,11 @@ func TestDagTruncate(t *testing.T) { t.Fatal(err) } + _, err = dagmod.Seek(0, os.SEEK_SET) + if err != nil { + t.Fatal(err) + } + out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) @@ -409,16 +430,174 @@ func TestDagTruncate(t *testing.T) { } } +func TestSparseWrite(t *testing.T) { + dserv, pins := getMockDagServ(t) + _, n := getNode(t, dserv, 0, pins) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + buf := make([]byte, 5000) + u.NewTimeSeededRand().Read(buf[2500:]) + + wrote, err := dagmod.WriteAt(buf[2500:], 2500) + if err != nil { + t.Fatal(err) + } + + if wrote != 2500 { + t.Fatal("incorrect write amount") + } + + _, err = dagmod.Seek(0, os.SEEK_SET) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(dagmod) + if err != nil { + t.Fatal(err) + } + + if err = arrComp(out, buf); err != nil { + t.Fatal(err) + } +} + +func basicGC(t *testing.T, bs blockstore.Blockstore, pins pin.ManualPinner) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() // in case error occurs during operation + keychan, err := bs.AllKeysChan(ctx) + if err != nil { + t.Fatal(err) + } + for k := range keychan { // rely on AllKeysChan to close chan + if !pins.IsPinned(k) { + err := bs.DeleteBlock(k) + if err != nil { + t.Fatal(err) + } + } + } +} +func TestCorrectPinning(t *testing.T) { + dserv, bstore, pins := getMockDagServAndBstore(t) + b, n := getNode(t, dserv, 50000, pins) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + if err != nil { + t.Fatal(err) + } + + buf := make([]byte, 1024) + for i := 0; i < 100; i++ { + size, err := dagmod.Size() + if err != nil { + t.Fatal(err) + } + offset := rand.Intn(int(size)) + u.NewTimeSeededRand().Read(buf) + + if offset+len(buf) > int(size) { + b = append(b[:offset], buf...) + } else { + copy(b[offset:], buf) + } + + n, err := dagmod.WriteAt(buf, int64(offset)) + if err != nil { + t.Fatal(err) + } + if n != len(buf) { + t.Fatal("wrote incorrect number of bytes") + } + } + + fisize, err := dagmod.Size() + if err != nil { + t.Fatal(err) + } + + if int(fisize) != len(b) { + t.Fatal("reported filesize incorrect", fisize, len(b)) + } + + // Run a GC, then ensure we can still read the file correctly + basicGC(t, bstore, pins) + + nd, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + read, err := uio.NewDagReader(context.Background(), nd, dserv) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(read) + if err != nil { + t.Fatal(err) + } + + if err = arrComp(out, b); err != nil { + t.Fatal(err) + } + + rootk, err := nd.Key() + if err != nil { + t.Fatal(err) + } + + // Verify only one recursive pin + recpins := pins.RecursiveKeys() + if len(recpins) != 1 { + t.Fatal("Incorrect number of pinned entries") + } + + // verify the correct node is pinned + if recpins[0] != rootk { + t.Fatal("Incorrect node recursively pinned") + } + + indirpins := pins.IndirectKeys() + children := enumerateChildren(t, nd, dserv) + if len(indirpins) != len(children) { + t.Log(len(indirpins), len(children)) + t.Fatal("Incorrect number of indirectly pinned blocks") + } + +} + +func enumerateChildren(t *testing.T, nd *mdag.Node, ds mdag.DAGService) []u.Key { + var out []u.Key + for _, lnk := range nd.Links { + out = append(out, u.Key(lnk.Hash)) + child, err := lnk.GetNode(ds) + if err != nil { + t.Fatal(err) + } + children := enumerateChildren(t, child, ds) + out = append(out, children...) + } + return out +} + func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() - dserv := getMockDagServ(b) - _, n := getNode(b, dserv, 0) + dserv, pins := getMockDagServ(b) + _, n := getNode(b, dserv, 0, pins) ctx, cancel := context.WithCancel(context.Background()) defer cancel() wrsize := 4096 - dagmod, err := NewDagModifier(ctx, n, dserv, nil, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) if err != nil { b.Fatal(err) } From 9c98b11f2f28b16488d957c6af3c051fc41221a1 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 11 Mar 2015 17:24:04 -0700 Subject: [PATCH 0706/3147] Dead code cleanup: remove Range support from blockstore Nothing uses it, and offset+limit is a bad query mechanism for mutating data. This commit was moved from ipfs/go-ipfs-blockstore@0ef353be8b1f84a2d68e1bbd686e71bf37f0960a --- blockstore/blockstore.go | 29 ++++++++--------------------- blockstore/blockstore_test.go | 17 ----------------- blockstore/write_cache.go | 12 ++---------- 3 files changed, 10 insertions(+), 48 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 7c7e7ed2dc..dc94dbc6fc 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -33,9 +33,6 @@ type Blockstore interface { AllKeys(ctx context.Context) ([]u.Key, error) AllKeysChan(ctx context.Context) (<-chan u.Key, error) - - AllKeysRange(ctx context.Context, offset int, limit int) ([]u.Key, error) - AllKeysRangeChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) } func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { @@ -85,22 +82,13 @@ func (s *blockstore) DeleteBlock(k u.Key) error { return s.datastore.Delete(k.DsKey()) } -func (bs *blockstore) AllKeys(ctx context.Context) ([]u.Key, error) { - return bs.AllKeysRange(ctx, 0, 0) -} - -func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { - return bs.AllKeysRangeChan(ctx, 0, 0) -} - -// AllKeysRange runs a query for keys from the blockstore. +// AllKeys runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? -// if offset and limit are 0, they are ignored. // -// AllKeysRange respects context -func (bs *blockstore) AllKeysRange(ctx context.Context, offset int, limit int) ([]u.Key, error) { +// AllKeys respects context +func (bs *blockstore) AllKeys(ctx context.Context) ([]u.Key, error) { - ch, err := bs.AllKeysRangeChan(ctx, offset, limit) + ch, err := bs.AllKeysChan(ctx) if err != nil { return nil, err } @@ -112,15 +100,14 @@ func (bs *blockstore) AllKeysRange(ctx context.Context, offset int, limit int) ( return keys, nil } -// AllKeysRangeChan runs a query for keys from the blockstore. +// AllKeysChan runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? -// if offset and limit are 0, they are ignored. // -// AllKeysRangeChan respects context -func (bs *blockstore) AllKeysRangeChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { +// AllKeysChan respects context +func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { // KeysOnly, because that would be _a lot_ of data. - q := dsq.Query{KeysOnly: true, Offset: offset, Limit: limit} + q := dsq.Query{KeysOnly: true} res, err := bs.datastore.Query(q) if err != nil { return nil, err diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 0601773a00..4daed126d8 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -78,23 +78,6 @@ func TestAllKeysSimple(t *testing.T) { expectMatches(t, keys, keys2) } -func TestAllKeysOffsetAndLimit(t *testing.T) { - N := 30 - bs, _ := newBlockStoreWithKeys(t, nil, N) - - ctx := context.Background() - keys3, err := bs.AllKeysRange(ctx, N/3, N/3) - if err != nil { - t.Fatal(err) - } - for _, k3 := range keys3 { - t.Log("found ", k3.Pretty()) - } - if len(keys3) != N/3 { - t.Errorf("keys3 should be: %d != %d", N/3, len(keys3)) - } -} - func TestAllKeysRespectsContext(t *testing.T) { N := 100 diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index d082e0cdc8..b60a4d2c22 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -46,17 +46,9 @@ func (w *writecache) Put(b *blocks.Block) error { } func (w *writecache) AllKeys(ctx context.Context) ([]u.Key, error) { - return w.blockstore.AllKeysRange(ctx, 0, 0) + return w.blockstore.AllKeys(ctx) } func (w *writecache) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { - return w.blockstore.AllKeysRangeChan(ctx, 0, 0) -} - -func (w *writecache) AllKeysRange(ctx context.Context, offset int, limit int) ([]u.Key, error) { - return w.blockstore.AllKeysRange(ctx, offset, limit) -} - -func (w *writecache) AllKeysRangeChan(ctx context.Context, offset int, limit int) (<-chan u.Key, error) { - return w.blockstore.AllKeysRangeChan(ctx, offset, limit) + return w.blockstore.AllKeysChan(ctx) } From 005dfe5729904b81fb3239764b513e0d0fbaa0bf Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 11 Mar 2015 17:29:20 -0700 Subject: [PATCH 0707/3147] Dead code cleanup: remove AllKeys from blockstore Nothing uses it. This commit was moved from ipfs/go-ipfs-blockstore@4f7282235f8fad65fcf1fd88653fb670b6b77504 --- blockstore/blockstore.go | 19 ------------------- blockstore/blockstore_test.go | 15 +++++++++++++-- blockstore/write_cache.go | 4 ---- 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index dc94dbc6fc..7e929af103 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -31,7 +31,6 @@ type Blockstore interface { Get(u.Key) (*blocks.Block, error) Put(*blocks.Block) error - AllKeys(ctx context.Context) ([]u.Key, error) AllKeysChan(ctx context.Context) (<-chan u.Key, error) } @@ -82,24 +81,6 @@ func (s *blockstore) DeleteBlock(k u.Key) error { return s.datastore.Delete(k.DsKey()) } -// AllKeys runs a query for keys from the blockstore. -// this is very simplistic, in the future, take dsq.Query as a param? -// -// AllKeys respects context -func (bs *blockstore) AllKeys(ctx context.Context) ([]u.Key, error) { - - ch, err := bs.AllKeysChan(ctx) - if err != nil { - return nil, err - } - - var keys []u.Key - for k := range ch { - keys = append(keys, k) - } - return keys, nil -} - // AllKeysChan runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? // diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 4daed126d8..51f5aad11a 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -63,14 +63,24 @@ func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []u return bs, keys } +func collect(ch <-chan u.Key) []u.Key { + var keys []u.Key + for k := range ch { + keys = append(keys, k) + } + return keys +} + func TestAllKeysSimple(t *testing.T) { bs, keys := newBlockStoreWithKeys(t, nil, 100) ctx := context.Background() - keys2, err := bs.AllKeys(ctx) + ch, err := bs.AllKeysChan(ctx) if err != nil { t.Fatal(err) } + keys2 := collect(ch) + // for _, k2 := range keys2 { // t.Log("found ", k2.Pretty()) // } @@ -90,10 +100,11 @@ func TestAllKeysRespectsContext(t *testing.T) { getKeys := func(ctx context.Context) { started <- struct{}{} - _, err := bs.AllKeys(ctx) // once without cancelling + ch, err := bs.AllKeysChan(ctx) // once without cancelling if err != nil { errors <- err } + _ = collect(ch) done <- struct{}{} errors <- nil // a nil one to signal break } diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index b60a4d2c22..a1399fcc68 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -45,10 +45,6 @@ func (w *writecache) Put(b *blocks.Block) error { return w.blockstore.Put(b) } -func (w *writecache) AllKeys(ctx context.Context) ([]u.Key, error) { - return w.blockstore.AllKeys(ctx) -} - func (w *writecache) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { return w.blockstore.AllKeysChan(ctx) } From 9d6b4900c0533a3e6301fdf51d18b5091848e1ae Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 17 Mar 2015 14:51:26 -0700 Subject: [PATCH 0708/3147] fix locking in the pinner This commit was moved from ipfs/go-ipfs-pinner@ae27f8ad7e5a8dae4206bd80f06a1144d90d7d80 --- pinning/pinner/pin.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 7ae36f607e..5f726a4572 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -200,6 +200,8 @@ func (p *pinner) IsPinned(key util.Key) bool { } func (p *pinner) RemovePinWithMode(key util.Key, mode PinMode) { + p.lock.Lock() + defer p.lock.Unlock() switch mode { case Direct: p.directPin.RemoveBlock(key) @@ -265,8 +267,8 @@ func (p *pinner) RecursiveKeys() []util.Key { // Flush encodes and writes pinner keysets to the datastore func (p *pinner) Flush() error { - p.lock.RLock() - defer p.lock.RUnlock() + p.lock.Lock() + defer p.lock.Unlock() err := storeSet(p.dstore, directPinDatastoreKey, p.directPin.GetKeys()) if err != nil { @@ -311,6 +313,8 @@ func loadSet(d ds.Datastore, k ds.Key, val interface{}) error { // PinWithMode is a method on ManualPinners, allowing the user to have fine // grained control over pin counts func (p *pinner) PinWithMode(k util.Key, mode PinMode) { + p.lock.Lock() + defer p.lock.Unlock() switch mode { case Recursive: p.recursePin.AddBlock(k) From ded939ff67dafc841a8f4f070da57ea791698ae2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 17 Mar 2015 15:39:00 -0700 Subject: [PATCH 0709/3147] move keyspace init function into namesys This commit was moved from ipfs/go-namesys@a4feb39f6b378c6a2bcee5c32935b9ba37b98650 --- namesys/publisher.go | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index d786c210be..5d763f490f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -10,10 +10,13 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + dag "github.com/jbenet/go-ipfs/merkledag" pb "github.com/jbenet/go-ipfs/namesys/internal/pb" ci "github.com/jbenet/go-ipfs/p2p/crypto" + pin "github.com/jbenet/go-ipfs/pin" routing "github.com/jbenet/go-ipfs/routing" record "github.com/jbenet/go-ipfs/routing/record" + ft "github.com/jbenet/go-ipfs/unixfs" u "github.com/jbenet/go-ipfs/util" ) @@ -60,11 +63,9 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) nameb := u.Hash(pkbytes) namekey := u.Key("/pk/" + string(nameb)) - timectx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) - defer cancel() - log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key + timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) err = p.routing.PutValue(timectx, namekey, pkbytes) if err != nil { return err @@ -136,3 +137,31 @@ func ValidateIpnsRecord(k u.Key, val []byte) error { } return nil } + +// InitializeKeyspace sets the ipns record for the given key to +// point to an empty directory. +// TODO: this doesnt feel like it belongs here +func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, pins pin.Pinner, key ci.PrivKey) error { + emptyDir := &dag.Node{Data: ft.FolderPBData()} + nodek, err := ds.Add(emptyDir) + if err != nil { + return err + } + + err = pins.Pin(emptyDir, false) + if err != nil { + return err + } + + err = pins.Flush() + if err != nil { + return err + } + + err = pub.Publish(ctx, key, nodek) + if err != nil { + return err + } + + return nil +} From cba06a49f0e3ff372af4f5b7ab6e5613f4d2933f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 17 Mar 2015 21:03:37 -0700 Subject: [PATCH 0710/3147] ignore bootstrap failures in namesys initialization This commit was moved from ipfs/go-ipfs-routing@a10aa37778f73512284c89e6b284d80be5af2616 --- routing/dht/lookup.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 59ef3911fd..1f01a082a7 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -6,7 +6,6 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" - errors "github.com/jbenet/go-ipfs/util/debugerror" pset "github.com/jbenet/go-ipfs/util/peerset" ) @@ -26,7 +25,7 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key) (<-chan peer e := log.EventBegin(ctx, "getClosestPeers", &key) tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) if len(tablepeers) == 0 { - return nil, errors.Wrap(kb.ErrLookupFailure) + return nil, kb.ErrLookupFailure } out := make(chan peer.ID, KValue) From 745e36eef654aea5dc4f68e68e5c86e7039447ff Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 18 Mar 2015 15:52:09 -0700 Subject: [PATCH 0711/3147] fix for weird repo init issue This commit was moved from ipfs/go-namesys@2ba44b0b5a05c4da935aa2118964f18a60495d77 --- namesys/publisher.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 5d763f490f..c969153072 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -148,7 +148,9 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p return err } - err = pins.Pin(emptyDir, false) + // pin recursively because this might already be pinned + // and doing a direct pin would throw an error in that case + err = pins.Pin(emptyDir, true) if err != nil { return err } From ba4ca232ce989f27a4e127bff4577955b0f1f273 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 18 Mar 2015 16:48:06 -0700 Subject: [PATCH 0712/3147] test for pinning semantics This commit was moved from ipfs/go-ipfs-pinner@1b4817eaca49c51c37b8301de56f90710d363cb7 --- pinning/pinner/pin_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index c8d18f0277..12db39b293 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -152,3 +152,41 @@ func TestPinnerBasic(t *testing.T) { t.Fatal("could not find recursively pinned node") } } + +func TestDuplicateSemantics(t *testing.T) { + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + + dserv := mdag.NewDAGService(bserv) + + // TODO does pinner need to share datastore with blockservice? + p := NewPinner(dstore, dserv) + + a, _ := randNode() + _, err = dserv.Add(a) + if err != nil { + t.Fatal(err) + } + + // pin is recursively + err = p.Pin(a, true) + if err != nil { + t.Fatal(err) + } + + // pinning directly should fail + err = p.Pin(a, false) + if err == nil { + t.Fatal("expected direct pin to fail") + } + + // pinning recursively again should succeed + err = p.Pin(a, true) + if err != nil { + t.Fatal(err) + } +} From 474e3df37e61b412107f632a3fd75cd7bd28a5b1 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 19 Mar 2015 04:01:15 -0700 Subject: [PATCH 0713/3147] dht: tone down dht bootstrap move to a less aggressive period. 5m instead of 20s This commit was moved from ipfs/go-ipfs-routing@809b09ef8be91dd67809fbe0ae53cfebf82fb4e1 --- routing/dht/dht_bootstrap.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 79dcb4d646..d5bbfa860c 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -35,13 +35,12 @@ var DefaultBootstrapConfig = BootstrapConfig{ // of our implementation's robustness, we should lower this down to 8 or 4. Queries: 1, - // For now, this is set to 10 seconds, which is an aggressive period. We are + // For now, this is set to 1 minute, which is a medium period. We are // We are currently more interested in ensuring we have a properly formed - // DHT than making sure our dht minimizes traffic. Once we are more certain - // implementation's robustness, we should lower this down to 30s or 1m. - Period: time.Duration(20 * time.Second), + // DHT than making sure our dht minimizes traffic. + Period: time.Duration(5 * time.Minute), - Timeout: time.Duration(20 * time.Second), + Timeout: time.Duration(10 * time.Second), } // Bootstrap ensures the dht routing table remains healthy as peers come and go. From c9d0407ea4efe72f2b9d92c2fc7bdbc01ac7274b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 18 Mar 2015 21:48:52 -0700 Subject: [PATCH 0714/3147] code cleanup and better naming of methods This commit was moved from ipfs/go-unixfs@554e71fda8618a54326f04c7715cdb3bc47fc96f --- unixfs/mod/dagmodifier.go | 16 ++++++++-------- unixfs/mod/dagmodifier_test.go | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index e08c3bf862..cd207ed91c 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -80,7 +80,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) { } } - err = dm.Flush() + err = dm.Sync() if err != nil { return 0, err } @@ -133,7 +133,7 @@ func (dm *DagModifier) Write(b []byte) (int, error) { } dm.curWrOff += uint64(n) if dm.wrBuf.Len() > writebufferSize { - err := dm.Flush() + err := dm.Sync() if err != nil { return n, err } @@ -156,8 +156,8 @@ func (dm *DagModifier) Size() (int64, error) { return int64(pbn.GetFilesize()), nil } -// Flush writes changes to this dag to disk -func (dm *DagModifier) Flush() error { +// Sync writes changes to this dag to disk +func (dm *DagModifier) Sync() error { // No buffer? Nothing to do if dm.wrBuf == nil { return nil @@ -315,7 +315,7 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.No // Read data from this dag starting at the current offset func (dm *DagModifier) Read(b []byte) (int, error) { - err := dm.Flush() + err := dm.Sync() if err != nil { return 0, err } @@ -347,7 +347,7 @@ func (dm *DagModifier) Read(b []byte) (int, error) { // GetNode gets the modified DAG Node func (dm *DagModifier) GetNode() (*mdag.Node, error) { - err := dm.Flush() + err := dm.Sync() if err != nil { return nil, err } @@ -360,7 +360,7 @@ func (dm *DagModifier) HasChanges() bool { } func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { - err := dm.Flush() + err := dm.Sync() if err != nil { return 0, err } @@ -389,7 +389,7 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { } func (dm *DagModifier) Truncate(size int64) error { - err := dm.Flush() + err := dm.Sync() if err != nil { return err } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index d5ae29d7d8..9f80509726 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -246,7 +246,7 @@ func TestMultiWriteAndFlush(t *testing.T) { if n != 1 { t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") } - err = dagmod.Flush() + err = dagmod.Sync() if err != nil { t.Fatal(err) } From 0a9440d3e581ee06d77c42de4099d1a9c7313d9f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Mar 2015 14:01:42 -0700 Subject: [PATCH 0715/3147] fix context respect through fuse reading This commit was moved from ipfs/go-unixfs@c10d3ecb851ce30e3745b1cf0fd030eafbc64d01 --- unixfs/io/dagreader.go | 16 +++++++++++----- unixfs/mod/dagmodifier.go | 31 ++++++++++++++++++++++++++----- unixfs/tar/reader.go | 2 +- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 64dfff1272..6bb9eb4064 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -100,12 +100,13 @@ func newDataFileReader(ctx context.Context, n *mdag.Node, pb *ftpb.Data, serv md // precalcNextBuf follows the next link in line and loads it from the DAGService, // setting the next buffer to read from -func (dr *DagReader) precalcNextBuf() error { +func (dr *DagReader) precalcNextBuf(ctx context.Context) error { dr.buf.Close() // Just to make sure if dr.linkPosition >= len(dr.promises) { return io.EOF } - nxt, err := dr.promises[dr.linkPosition].Get() + + nxt, err := dr.promises[dr.linkPosition].Get(ctx) if err != nil { return err } @@ -141,6 +142,11 @@ func (dr *DagReader) Size() int64 { // Read reads data from the DAG structured file func (dr *DagReader) Read(b []byte) (int, error) { + return dr.CtxReadFull(dr.ctx, b) +} + +// CtxReadFull reads data from the DAG structured file +func (dr *DagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { // If no cached buffer, load one total := 0 for { @@ -161,7 +167,7 @@ func (dr *DagReader) Read(b []byte) (int, error) { } // Otherwise, load up the next block - err = dr.precalcNextBuf() + err = dr.precalcNextBuf(ctx) if err != nil { return total, err } @@ -183,7 +189,7 @@ func (dr *DagReader) WriteTo(w io.Writer) (int64, error) { } // Otherwise, load up the next block - err = dr.precalcNextBuf() + err = dr.precalcNextBuf(dr.ctx) if err != nil { if err == io.EOF { return total, nil @@ -239,7 +245,7 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { } // start sub-block request - err := dr.precalcNextBuf() + err := dr.precalcNextBuf(dr.ctx) if err != nil { return 0, err } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index cd207ed91c..133af22277 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -315,32 +315,53 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.No // Read data from this dag starting at the current offset func (dm *DagModifier) Read(b []byte) (int, error) { - err := dm.Sync() + err := dm.readPrep() if err != nil { return 0, err } + n, err := dm.read.Read(b) + dm.curWrOff += uint64(n) + return n, err +} + +func (dm *DagModifier) readPrep() error { + err := dm.Sync() + if err != nil { + return err + } + if dm.read == nil { ctx, cancel := context.WithCancel(dm.ctx) dr, err := uio.NewDagReader(ctx, dm.curNode, dm.dagserv) if err != nil { - return 0, err + return err } i, err := dr.Seek(int64(dm.curWrOff), os.SEEK_SET) if err != nil { - return 0, err + return err } if i != int64(dm.curWrOff) { - return 0, ErrSeekFail + return ErrSeekFail } dm.readCancel = cancel dm.read = dr } - n, err := dm.read.Read(b) + return nil +} + +// Read data from this dag starting at the current offset +func (dm *DagModifier) CtxReadFull(ctx context.Context, b []byte) (int, error) { + err := dm.readPrep() + if err != nil { + return 0, err + } + + n, err := dm.read.CtxReadFull(ctx, b) dm.curWrOff += uint64(n) return n, err } diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index aa15c823a2..26aa772ce4 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -90,7 +90,7 @@ func (r *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { defer cancel() for i, ng := range r.dag.GetDAG(ctx, dagnode) { - childNode, err := ng.Get() + childNode, err := ng.Get(ctx) if err != nil { r.emitError(err) return From 2fd43020760efcd53ebf7280efae7b4344ac9ec9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 23 Mar 2015 14:01:42 -0700 Subject: [PATCH 0716/3147] fix context respect through fuse reading This commit was moved from ipfs/go-ipfs-pinner@9a408897768570663f8239392aa1e1fcae3b000d --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 5f726a4572..6ec2993881 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -177,7 +177,7 @@ func (p *pinner) pinLinks(node *mdag.Node) error { defer cancel() for _, ng := range p.dserv.GetDAG(ctx, node) { - subnode, err := ng.Get() + subnode, err := ng.Get(ctx) if err != nil { // TODO: Maybe just log and continue? return err From 98f0b71ac64f2ef5539425f0d779e6d6ee484e98 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Mar 2015 07:53:14 -0700 Subject: [PATCH 0717/3147] reduce dht bandwidth consumption Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@5617e89d16e2a32c3c852df4520bb5236953c6a3 --- routing/dht/handlers.go | 2 +- routing/dht/records.go | 9 +++++++-- routing/dht/routing.go | 8 ++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 62b22c5ca5..5508252459 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -226,5 +226,5 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M dht.providers.AddProvider(ctx, key, p) } - return pmes, nil // send back same msg as confirmation. + return nil, nil } diff --git a/routing/dht/records.go b/routing/dht/records.go index e327ed1717..9c90b9b7da 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -31,6 +31,10 @@ func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKe ctxT, cancelFunc := ctxutil.WithDeadlineFraction(ctx, 0.3) defer cancelFunc() if pk, err := dht.getPublicKeyFromNode(ctx, p); err == nil { + err := dht.peerstore.AddPubKey(p, pk) + if err != nil { + return pk, err + } return pk, nil } @@ -38,7 +42,7 @@ func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKe log.Debugf("pk for %s not in peerstore, and peer failed. trying dht.", p) pkkey := KeyForPublicKey(p) - // ok, try the node itself. if they're overwhelmed or slow we can move on. + // ok, now try the dht. Anyone who has previously fetched the key should have it val, err := dht.GetValue(ctxT, pkkey) if err != nil { log.Warning("Failed to find requested public key.") @@ -50,7 +54,8 @@ func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKe log.Debugf("Failed to unmarshal public key: %s", err) return nil, err } - return pk, nil + + return pk, dht.peerstore.AddPubKey(p, pk) } func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.PubKey, error) { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 28ee8f03a8..5ff2791045 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -91,7 +91,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // get closest peers in the routing table - rtp := dht.routingTable.ListPeers() + rtp := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) log.Debugf("peers in rt: %s", len(rtp), rtp) if len(rtp) == 0 { log.Warning("No peers from routing table!") @@ -256,7 +256,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co return &dhtQueryResult{closerPeers: clpeers}, nil }) - peers := dht.routingTable.ListPeers() + peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) _, err := query.Run(ctx, peers) if err != nil { log.Debugf("Query error: %s", err) @@ -276,7 +276,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er return pi, nil } - peers := dht.routingTable.ListPeers() + peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { return peer.PeerInfo{}, errors.Wrap(kb.ErrLookupFailure) } @@ -342,7 +342,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< peerchan := make(chan peer.PeerInfo, asyncQueryBuffer) peersSeen := peer.Set{} - peers := dht.routingTable.ListPeers() + peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { return nil, errors.Wrap(kb.ErrLookupFailure) } From 9d4619d0b0ebe4b53b4755fc33d6ddf1b18eb667 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0718/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-ipfs-routing@a1c3b44afad271d35e7c27687a7b7a7f36bd7d89 --- routing/dht/dht.go | 30 ++++++++++++++--------------- routing/dht/dht_bootstrap.go | 12 ++++++------ routing/dht/dht_net.go | 12 ++++++------ routing/dht/dht_test.go | 26 ++++++++++++------------- routing/dht/diag.go | 4 ++-- routing/dht/ext_test.go | 24 +++++++++++------------ routing/dht/handlers.go | 12 ++++++------ routing/dht/lookup.go | 12 ++++++------ routing/dht/notif.go | 4 ++-- routing/dht/pb/dht.pb.go | 2 +- routing/dht/pb/message.go | 10 +++++----- routing/dht/providers.go | 8 ++++---- routing/dht/providers_test.go | 6 +++--- routing/dht/query.go | 24 +++++++++++------------ routing/dht/records.go | 14 +++++++------- routing/dht/routing.go | 22 ++++++++++----------- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 4 ++-- routing/kbucket/table_test.go | 4 ++-- routing/kbucket/util.go | 6 +++--- routing/keyspace/xor.go | 2 +- routing/keyspace/xor_test.go | 2 +- routing/mock/centralized_client.go | 14 +++++++------- routing/mock/centralized_server.go | 10 +++++----- routing/mock/centralized_test.go | 10 +++++----- routing/mock/dht.go | 12 ++++++------ routing/mock/interface.go | 14 +++++++------- routing/offline/offline.go | 20 +++++++++---------- routing/record/record.go | 10 +++++----- routing/record/validation.go | 6 +++--- routing/routing.go | 6 +++--- routing/supernode/client.go | 20 +++++++++---------- routing/supernode/proxy/loopback.go | 12 ++++++------ routing/supernode/proxy/standard.go | 20 +++++++++---------- routing/supernode/server.go | 18 ++++++++--------- routing/supernode/server_test.go | 6 +++--- 37 files changed, 211 insertions(+), 211 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 974d87b588..d34f37a565 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,21 +10,21 @@ import ( "sync" "time" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - host "github.com/jbenet/go-ipfs/p2p/host" - peer "github.com/jbenet/go-ipfs/p2p/peer" - protocol "github.com/jbenet/go-ipfs/p2p/protocol" - routing "github.com/jbenet/go-ipfs/routing" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - kb "github.com/jbenet/go-ipfs/routing/kbucket" - record "github.com/jbenet/go-ipfs/routing/record" - "github.com/jbenet/go-ipfs/thirdparty/eventlog" - u "github.com/jbenet/go-ipfs/util" - - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + host "github.com/ipfs/go-ipfs/p2p/host" + peer "github.com/ipfs/go-ipfs/p2p/peer" + protocol "github.com/ipfs/go-ipfs/p2p/protocol" + routing "github.com/ipfs/go-ipfs/routing" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + kb "github.com/ipfs/go-ipfs/routing/kbucket" + record "github.com/ipfs/go-ipfs/routing/record" + "github.com/ipfs/go-ipfs/thirdparty/eventlog" + u "github.com/ipfs/go-ipfs/util" + + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ctxgroup "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) var log = eventlog.Logger("dht") diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index d5bbfa860c..4a07d9f0ba 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -8,13 +8,13 @@ import ( "sync" "time" - peer "github.com/jbenet/go-ipfs/p2p/peer" - routing "github.com/jbenet/go-ipfs/routing" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" + u "github.com/ipfs/go-ipfs/util" - goprocess "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - periodicproc "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) // BootstrapConfig specifies parameters used bootstrapping the DHT. diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index d84e8e008d..8bba4c41d8 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,13 +4,13 @@ import ( "errors" "time" - inet "github.com/jbenet/go-ipfs/p2p/net" - peer "github.com/jbenet/go-ipfs/p2p/peer" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - ctxutil "github.com/jbenet/go-ipfs/util/ctx" + inet "github.com/ipfs/go-ipfs/p2p/net" + peer "github.com/ipfs/go-ipfs/p2p/peer" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + ctxutil "github.com/ipfs/go-ipfs/util/ctx" - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 4b48ccc654..fdd334d593 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -9,19 +9,19 @@ import ( "testing" "time" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - - peer "github.com/jbenet/go-ipfs/p2p/peer" - netutil "github.com/jbenet/go-ipfs/p2p/test/util" - routing "github.com/jbenet/go-ipfs/routing" - record "github.com/jbenet/go-ipfs/routing/record" - u "github.com/jbenet/go-ipfs/util" - - ci "github.com/jbenet/go-ipfs/util/testutil/ci" - travisci "github.com/jbenet/go-ipfs/util/testutil/ci/travis" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + peer "github.com/ipfs/go-ipfs/p2p/peer" + netutil "github.com/ipfs/go-ipfs/p2p/test/util" + routing "github.com/ipfs/go-ipfs/routing" + record "github.com/ipfs/go-ipfs/routing/record" + u "github.com/ipfs/go-ipfs/util" + + ci "github.com/ipfs/go-ipfs/util/testutil/ci" + travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" ) var testCaseValues = map[u.Key][]byte{} diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 79b4709e9c..a7a632c3e8 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/ipfs/go-ipfs/p2p/peer" ) type connDiagInfo struct { @@ -31,7 +31,7 @@ func (di *diagInfo) Marshal() []byte { func (dht *IpfsDHT) getDiagInfo() *diagInfo { di := new(diagInfo) - di.CodeVersion = "github.com/jbenet/go-ipfs" + di.CodeVersion = "github.com/ipfs/go-ipfs" di.ID = dht.self di.LifeSpan = time.Since(dht.birth) di.Keys = nil // Currently no way to query datastore diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 539d55ccaf..efe62cd7c6 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,18 +7,18 @@ import ( "testing" "time" - inet "github.com/jbenet/go-ipfs/p2p/net" - mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" - peer "github.com/jbenet/go-ipfs/p2p/peer" - routing "github.com/jbenet/go-ipfs/routing" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - record "github.com/jbenet/go-ipfs/routing/record" - u "github.com/jbenet/go-ipfs/util" - - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + inet "github.com/ipfs/go-ipfs/p2p/net" + mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" + peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + record "github.com/ipfs/go-ipfs/routing/record" + u "github.com/ipfs/go-ipfs/util" + + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 62b22c5ca5..ca81552aff 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -4,12 +4,12 @@ import ( "errors" "fmt" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - peer "github.com/jbenet/go-ipfs/p2p/peer" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - u "github.com/jbenet/go-ipfs/util" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + u "github.com/ipfs/go-ipfs/util" ) // The number of closer peers to send on requests. diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 1f01a082a7..76671657a7 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -1,12 +1,12 @@ package dht import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - notif "github.com/jbenet/go-ipfs/notifications" - peer "github.com/jbenet/go-ipfs/p2p/peer" - kb "github.com/jbenet/go-ipfs/routing/kbucket" - u "github.com/jbenet/go-ipfs/util" - pset "github.com/jbenet/go-ipfs/util/peerset" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + notif "github.com/ipfs/go-ipfs/notifications" + peer "github.com/ipfs/go-ipfs/p2p/peer" + kb "github.com/ipfs/go-ipfs/routing/kbucket" + u "github.com/ipfs/go-ipfs/util" + pset "github.com/ipfs/go-ipfs/util/peerset" ) // Required in order for proper JSON marshaling diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 4af2fc9787..70144481a3 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -1,9 +1,9 @@ package dht import ( - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - inet "github.com/jbenet/go-ipfs/p2p/net" + inet "github.com/ipfs/go-ipfs/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 09db3d5f91..78532e95b8 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package dht_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import json "encoding/json" import math "math" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index ce6af1459b..10279abd23 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -1,12 +1,12 @@ package dht_pb import ( - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - inet "github.com/jbenet/go-ipfs/p2p/net" - peer "github.com/jbenet/go-ipfs/p2p/peer" - eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" - util "github.com/jbenet/go-ipfs/util" + inet "github.com/ipfs/go-ipfs/p2p/net" + peer "github.com/ipfs/go-ipfs/p2p/peer" + eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + util "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index d8e0d910d1..c62aee97c4 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -3,11 +3,11 @@ package dht import ( "time" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" + ctxgroup "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + peer "github.com/ipfs/go-ipfs/p2p/peer" + u "github.com/ipfs/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) type providerInfo struct { diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 121992eded..159634a806 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -3,10 +3,10 @@ package dht import ( "testing" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/ipfs/go-ipfs/p2p/peer" + u "github.com/ipfs/go-ipfs/util" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) func TestProviderManager(t *testing.T) { diff --git a/routing/dht/query.go b/routing/dht/query.go index 3687bc8598..d833b126cc 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,18 +3,18 @@ package dht import ( "sync" - notif "github.com/jbenet/go-ipfs/notifications" - peer "github.com/jbenet/go-ipfs/p2p/peer" - queue "github.com/jbenet/go-ipfs/p2p/peer/queue" - "github.com/jbenet/go-ipfs/routing" - eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" - u "github.com/jbenet/go-ipfs/util" - pset "github.com/jbenet/go-ipfs/util/peerset" - todoctr "github.com/jbenet/go-ipfs/util/todocounter" - - process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - ctxproc "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + notif "github.com/ipfs/go-ipfs/notifications" + peer "github.com/ipfs/go-ipfs/p2p/peer" + queue "github.com/ipfs/go-ipfs/p2p/peer/queue" + "github.com/ipfs/go-ipfs/routing" + eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + u "github.com/ipfs/go-ipfs/util" + pset "github.com/ipfs/go-ipfs/util/peerset" + todoctr "github.com/ipfs/go-ipfs/util/todocounter" + + process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) var maxQueryConcurrency = AlphaValue diff --git a/routing/dht/records.go b/routing/dht/records.go index e327ed1717..cbe8c58035 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -3,13 +3,13 @@ package dht import ( "fmt" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - peer "github.com/jbenet/go-ipfs/p2p/peer" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - record "github.com/jbenet/go-ipfs/routing/record" - u "github.com/jbenet/go-ipfs/util" - ctxutil "github.com/jbenet/go-ipfs/util/ctx" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + peer "github.com/ipfs/go-ipfs/p2p/peer" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + record "github.com/ipfs/go-ipfs/routing/record" + u "github.com/ipfs/go-ipfs/util" + ctxutil "github.com/ipfs/go-ipfs/util/ctx" ) // KeyForPublicKey returns the key used to retrieve public keys diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 28ee8f03a8..ab493696b8 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -4,17 +4,17 @@ import ( "sync" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - notif "github.com/jbenet/go-ipfs/notifications" - inet "github.com/jbenet/go-ipfs/p2p/net" - peer "github.com/jbenet/go-ipfs/p2p/peer" - "github.com/jbenet/go-ipfs/routing" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - kb "github.com/jbenet/go-ipfs/routing/kbucket" - record "github.com/jbenet/go-ipfs/routing/record" - u "github.com/jbenet/go-ipfs/util" - errors "github.com/jbenet/go-ipfs/util/debugerror" - pset "github.com/jbenet/go-ipfs/util/peerset" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + notif "github.com/ipfs/go-ipfs/notifications" + inet "github.com/ipfs/go-ipfs/p2p/net" + peer "github.com/ipfs/go-ipfs/p2p/peer" + "github.com/ipfs/go-ipfs/routing" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + kb "github.com/ipfs/go-ipfs/routing/kbucket" + record "github.com/ipfs/go-ipfs/routing/record" + u "github.com/ipfs/go-ipfs/util" + errors "github.com/ipfs/go-ipfs/util/debugerror" + pset "github.com/ipfs/go-ipfs/util/peerset" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index d551cf8195..35ceed385e 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/ipfs/go-ipfs/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 7995b39ede..31c64591a9 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/ipfs/go-ipfs/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 7b10d8dafb..87d9c9e3f1 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/ipfs/go-ipfs/p2p/peer" + u "github.com/ipfs/go-ipfs/util" ) var log = u.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 670342b670..e5b01cc721 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -5,9 +5,9 @@ import ( "testing" "time" - tu "github.com/jbenet/go-ipfs/util/testutil" + tu "github.com/ipfs/go-ipfs/util/testutil" - peer "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/ipfs/go-ipfs/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 80c08de9eb..e7c56f8681 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -5,9 +5,9 @@ import ( "crypto/sha256" "errors" - peer "github.com/jbenet/go-ipfs/p2p/peer" - ks "github.com/jbenet/go-ipfs/routing/keyspace" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/ipfs/go-ipfs/p2p/peer" + ks "github.com/ipfs/go-ipfs/routing/keyspace" + u "github.com/ipfs/go-ipfs/util" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/keyspace/xor.go b/routing/keyspace/xor.go index 7159f2cadd..8fae7744f2 100644 --- a/routing/keyspace/xor.go +++ b/routing/keyspace/xor.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "math/big" - u "github.com/jbenet/go-ipfs/util" + u "github.com/ipfs/go-ipfs/util" ) // XORKeySpace is a KeySpace which: diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go index 8db4b926cd..f90e8a5f9c 100644 --- a/routing/keyspace/xor_test.go +++ b/routing/keyspace/xor_test.go @@ -5,7 +5,7 @@ import ( "math/big" "testing" - u "github.com/jbenet/go-ipfs/util" + u "github.com/ipfs/go-ipfs/util" ) func TestPrefixLen(t *testing.T) { diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 6a550bfaa8..7b04c97627 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,13 +4,13 @@ import ( "errors" "time" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - peer "github.com/jbenet/go-ipfs/p2p/peer" - routing "github.com/jbenet/go-ipfs/routing" - u "github.com/jbenet/go-ipfs/util" - "github.com/jbenet/go-ipfs/util/testutil" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" + u "github.com/ipfs/go-ipfs/util" + "github.com/ipfs/go-ipfs/util/testutil" ) var log = u.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index a0ee67e6d1..da2cedf483 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -5,11 +5,11 @@ import ( "sync" "time" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" - "github.com/jbenet/go-ipfs/util/testutil" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" + u "github.com/ipfs/go-ipfs/util" + "github.com/ipfs/go-ipfs/util/testutil" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index d77144a73e..38b58cb644 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -4,11 +4,11 @@ import ( "testing" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - peer "github.com/jbenet/go-ipfs/p2p/peer" - delay "github.com/jbenet/go-ipfs/thirdparty/delay" - u "github.com/jbenet/go-ipfs/util" - "github.com/jbenet/go-ipfs/util/testutil" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" + delay "github.com/ipfs/go-ipfs/thirdparty/delay" + u "github.com/ipfs/go-ipfs/util" + "github.com/ipfs/go-ipfs/util/testutil" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 0fe30b119e..f4b2b49007 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -1,12 +1,12 @@ package mockrouting import ( - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" - dht "github.com/jbenet/go-ipfs/routing/dht" - "github.com/jbenet/go-ipfs/util/testutil" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" + dht "github.com/ipfs/go-ipfs/routing/dht" + "github.com/ipfs/go-ipfs/util/testutil" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 34092dfda8..df29fdbb92 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,13 +5,13 @@ package mockrouting import ( - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - peer "github.com/jbenet/go-ipfs/p2p/peer" - routing "github.com/jbenet/go-ipfs/routing" - delay "github.com/jbenet/go-ipfs/thirdparty/delay" - u "github.com/jbenet/go-ipfs/util" - "github.com/jbenet/go-ipfs/util/testutil" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" + delay "github.com/ipfs/go-ipfs/thirdparty/delay" + u "github.com/ipfs/go-ipfs/util" + "github.com/ipfs/go-ipfs/util/testutil" ) // Server provides mockrouting Clients diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 15049f16d4..0e5bed248a 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,16 +4,16 @@ import ( "errors" "time" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - "github.com/jbenet/go-ipfs/p2p/peer" - routing "github.com/jbenet/go-ipfs/routing" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - record "github.com/jbenet/go-ipfs/routing/record" - eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" - u "github.com/jbenet/go-ipfs/util" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + record "github.com/ipfs/go-ipfs/routing/record" + eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + u "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index c5575a86f4..2d9ab18e29 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -3,12 +3,12 @@ package record import ( "bytes" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" - u "github.com/jbenet/go-ipfs/util" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + u "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("routing/record") diff --git a/routing/record/validation.go b/routing/record/validation.go index 380bdea4c3..8d2657fe26 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -5,9 +5,9 @@ import ( "errors" "strings" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - u "github.com/jbenet/go-ipfs/util" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + u "github.com/ipfs/go-ipfs/util" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index be400a5205..bb11265e22 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,9 +5,9 @@ import ( "errors" "time" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" + u "github.com/ipfs/go-ipfs/util" ) // ErrNotFound is returned when a search fails to find anything diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 09fa90ef6d..fa47e2e805 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -4,16 +4,16 @@ import ( "bytes" "time" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - "github.com/jbenet/go-ipfs/p2p/host" - peer "github.com/jbenet/go-ipfs/p2p/peer" - routing "github.com/jbenet/go-ipfs/routing" - pb "github.com/jbenet/go-ipfs/routing/dht/pb" - proxy "github.com/jbenet/go-ipfs/routing/supernode/proxy" - eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" - u "github.com/jbenet/go-ipfs/util" - errors "github.com/jbenet/go-ipfs/util/debugerror" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/ipfs/go-ipfs/p2p/host" + peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + u "github.com/ipfs/go-ipfs/util" + errors "github.com/ipfs/go-ipfs/util/debugerror" ) var log = eventlog.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index df9dc1d729..5d46fb4e11 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,12 +1,12 @@ package proxy import ( - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - inet "github.com/jbenet/go-ipfs/p2p/net" - peer "github.com/jbenet/go-ipfs/p2p/peer" - dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" - errors "github.com/jbenet/go-ipfs/util/debugerror" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + inet "github.com/ipfs/go-ipfs/p2p/net" + peer "github.com/ipfs/go-ipfs/p2p/peer" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + errors "github.com/ipfs/go-ipfs/util/debugerror" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 92a6d9f01b..0a3d9e1b7b 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -1,16 +1,16 @@ package proxy import ( - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - host "github.com/jbenet/go-ipfs/p2p/host" - inet "github.com/jbenet/go-ipfs/p2p/net" - peer "github.com/jbenet/go-ipfs/p2p/peer" - dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" - kbucket "github.com/jbenet/go-ipfs/routing/kbucket" - eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" - "github.com/jbenet/go-ipfs/util" - errors "github.com/jbenet/go-ipfs/util/debugerror" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + host "github.com/ipfs/go-ipfs/p2p/host" + inet "github.com/ipfs/go-ipfs/p2p/net" + peer "github.com/ipfs/go-ipfs/p2p/peer" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + kbucket "github.com/ipfs/go-ipfs/routing/kbucket" + eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + "github.com/ipfs/go-ipfs/util" + errors "github.com/ipfs/go-ipfs/util/debugerror" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 1132039a1b..44ef349d4f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -3,15 +3,15 @@ package supernode import ( "fmt" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - peer "github.com/jbenet/go-ipfs/p2p/peer" - dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" - record "github.com/jbenet/go-ipfs/routing/record" - proxy "github.com/jbenet/go-ipfs/routing/supernode/proxy" - util "github.com/jbenet/go-ipfs/util" - errors "github.com/jbenet/go-ipfs/util/debugerror" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + record "github.com/ipfs/go-ipfs/routing/record" + proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + util "github.com/ipfs/go-ipfs/util" + errors "github.com/ipfs/go-ipfs/util/debugerror" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 0d2d00318e..2bd0fa15b3 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,9 +3,9 @@ package supernode import ( "testing" - datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb" - "github.com/jbenet/go-ipfs/util" + datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + "github.com/ipfs/go-ipfs/util" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From d700d615bc1de3e55614df6b050aa3b42a60acbf Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0719/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-namesys@8dceca380deb818da346cc61dca2a74e1f893085 --- namesys/dns.go | 10 +++++----- namesys/interface.go | 6 +++--- namesys/internal/pb/namesys.pb.go | 2 +- namesys/namesys.go | 8 ++++---- namesys/proquint.go | 6 +++--- namesys/publisher.go | 24 ++++++++++++------------ namesys/resolve_test.go | 8 ++++---- namesys/routing.go | 14 +++++++------- 8 files changed, 39 insertions(+), 39 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 9efc723480..003e6f0f03 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -3,12 +3,12 @@ package namesys import ( "net" - b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" - isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" + isd "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" + mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - u "github.com/jbenet/go-ipfs/util" + u "github.com/ipfs/go-ipfs/util" ) // DNSResolver implements a Resolver on DNS domains diff --git a/namesys/interface.go b/namesys/interface.go index 10e4fb89f0..39a5c6e734 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -4,9 +4,9 @@ package namesys import ( "errors" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - u "github.com/jbenet/go-ipfs/util" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + u "github.com/ipfs/go-ipfs/util" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/internal/pb/namesys.pb.go b/namesys/internal/pb/namesys.pb.go index 68b93a2c42..637d023062 100644 --- a/namesys/internal/pb/namesys.pb.go +++ b/namesys/internal/pb/namesys.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package namesys_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/namesys/namesys.go b/namesys/namesys.go index d4cc03964b..ed2ccb2559 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,10 +1,10 @@ package namesys import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - routing "github.com/jbenet/go-ipfs/routing" - u "github.com/jbenet/go-ipfs/util" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + routing "github.com/ipfs/go-ipfs/routing" + u "github.com/ipfs/go-ipfs/util" ) // ipnsNameSystem implements IPNS naming. diff --git a/namesys/proquint.go b/namesys/proquint.go index b43f7a2a69..e3e2cc2810 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -3,9 +3,9 @@ package namesys import ( "errors" - proquint "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - u "github.com/jbenet/go-ipfs/util" + proquint "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + u "github.com/ipfs/go-ipfs/util" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index c969153072..eb3838eefe 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,18 +6,18 @@ import ( "fmt" "time" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - - dag "github.com/jbenet/go-ipfs/merkledag" - pb "github.com/jbenet/go-ipfs/namesys/internal/pb" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - pin "github.com/jbenet/go-ipfs/pin" - routing "github.com/jbenet/go-ipfs/routing" - record "github.com/jbenet/go-ipfs/routing/record" - ft "github.com/jbenet/go-ipfs/unixfs" - u "github.com/jbenet/go-ipfs/util" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + dag "github.com/ipfs/go-ipfs/merkledag" + pb "github.com/ipfs/go-ipfs/namesys/internal/pb" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + pin "github.com/ipfs/go-ipfs/pin" + routing "github.com/ipfs/go-ipfs/routing" + record "github.com/ipfs/go-ipfs/routing/record" + ft "github.com/ipfs/go-ipfs/unixfs" + u "github.com/ipfs/go-ipfs/util" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 3b8bb70724..e9cd01760b 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -3,10 +3,10 @@ package namesys import ( "testing" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - mockrouting "github.com/jbenet/go-ipfs/routing/mock" - u "github.com/jbenet/go-ipfs/util" - testutil "github.com/jbenet/go-ipfs/util/testutil" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + mockrouting "github.com/ipfs/go-ipfs/routing/mock" + u "github.com/ipfs/go-ipfs/util" + testutil "github.com/ipfs/go-ipfs/util/testutil" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index ed86900793..476303cbfc 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -3,13 +3,13 @@ package namesys import ( "fmt" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - pb "github.com/jbenet/go-ipfs/namesys/internal/pb" - ci "github.com/jbenet/go-ipfs/p2p/crypto" - routing "github.com/jbenet/go-ipfs/routing" - u "github.com/jbenet/go-ipfs/util" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + pb "github.com/ipfs/go-ipfs/namesys/internal/pb" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + routing "github.com/ipfs/go-ipfs/routing" + u "github.com/ipfs/go-ipfs/util" ) var log = u.Logger("namesys") From b17de07f0fa7d1cae6a8090ff346fa56744d673e Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0720/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-path@3e65a45a48f2e12446261b65d0962496d1145b19 --- path/path.go | 2 +- path/resolver.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index c76844b1e2..ea83cd12ce 100644 --- a/path/path.go +++ b/path/path.go @@ -4,7 +4,7 @@ import ( "path" "strings" - u "github.com/jbenet/go-ipfs/util" + u "github.com/ipfs/go-ipfs/util" ) // TODO: debate making this a private struct wrapped in a public interface diff --git a/path/resolver.go b/path/resolver.go index 863ae9d3cf..f329ddebd9 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -4,9 +4,9 @@ package path import ( "fmt" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - merkledag "github.com/jbenet/go-ipfs/merkledag" - u "github.com/jbenet/go-ipfs/util" + mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + merkledag "github.com/ipfs/go-ipfs/merkledag" + u "github.com/ipfs/go-ipfs/util" ) var log = u.Logger("path") From ded381838a9ef0b21211bc81da2121109fca201c Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0721/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-unixfs@f95a76d681e4f93a558b5eccd66bc4f7f5c267e9 --- unixfs/format.go | 4 ++-- unixfs/format_test.go | 4 ++-- unixfs/io/dagreader.go | 10 +++++----- unixfs/io/dirbuilder.go | 6 +++--- unixfs/mod/dagmodifier.go | 24 ++++++++++++------------ unixfs/mod/dagmodifier_test.go | 32 ++++++++++++++++---------------- unixfs/pb/unixfs.pb.go | 2 +- unixfs/tar/reader.go | 12 ++++++------ 8 files changed, 47 insertions(+), 47 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index 61bb2ec9e8..21ba46f741 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -5,8 +5,8 @@ package unixfs import ( "errors" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - pb "github.com/jbenet/go-ipfs/unixfs/pb" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + pb "github.com/ipfs/go-ipfs/unixfs/pb" ) const ( diff --git a/unixfs/format_test.go b/unixfs/format_test.go index b15ed07891..4d41755454 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -3,8 +3,8 @@ package unixfs import ( "testing" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - pb "github.com/jbenet/go-ipfs/unixfs/pb" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + pb "github.com/ipfs/go-ipfs/unixfs/pb" ) func TestFSNode(t *testing.T) { diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 6bb9eb4064..da9b3ee244 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -7,11 +7,11 @@ import ( "io" "os" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - mdag "github.com/jbenet/go-ipfs/merkledag" - ft "github.com/jbenet/go-ipfs/unixfs" - ftpb "github.com/jbenet/go-ipfs/unixfs/pb" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + mdag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" + ftpb "github.com/ipfs/go-ipfs/unixfs/pb" ) var ErrIsDir = errors.New("this dag node is a directory") diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 9597db3d16..ecdbfc6236 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -1,9 +1,9 @@ package io import ( - mdag "github.com/jbenet/go-ipfs/merkledag" - format "github.com/jbenet/go-ipfs/unixfs" - u "github.com/jbenet/go-ipfs/util" + mdag "github.com/ipfs/go-ipfs/merkledag" + format "github.com/ipfs/go-ipfs/unixfs" + u "github.com/ipfs/go-ipfs/util" ) type directoryBuilder struct { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 133af22277..fe04ece20e 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -6,18 +6,18 @@ import ( "io" "os" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - - chunk "github.com/jbenet/go-ipfs/importer/chunk" - help "github.com/jbenet/go-ipfs/importer/helpers" - trickle "github.com/jbenet/go-ipfs/importer/trickle" - mdag "github.com/jbenet/go-ipfs/merkledag" - pin "github.com/jbenet/go-ipfs/pin" - ft "github.com/jbenet/go-ipfs/unixfs" - uio "github.com/jbenet/go-ipfs/unixfs/io" - u "github.com/jbenet/go-ipfs/util" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + chunk "github.com/ipfs/go-ipfs/importer/chunk" + help "github.com/ipfs/go-ipfs/importer/helpers" + trickle "github.com/ipfs/go-ipfs/importer/trickle" + mdag "github.com/ipfs/go-ipfs/merkledag" + pin "github.com/ipfs/go-ipfs/pin" + ft "github.com/ipfs/go-ipfs/unixfs" + uio "github.com/ipfs/go-ipfs/unixfs/io" + u "github.com/ipfs/go-ipfs/util" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 9f80509726..2eaa04265e 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -8,22 +8,22 @@ import ( "os" "testing" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - "github.com/jbenet/go-ipfs/blocks/blockstore" - bs "github.com/jbenet/go-ipfs/blockservice" - "github.com/jbenet/go-ipfs/exchange/offline" - imp "github.com/jbenet/go-ipfs/importer" - "github.com/jbenet/go-ipfs/importer/chunk" - h "github.com/jbenet/go-ipfs/importer/helpers" - trickle "github.com/jbenet/go-ipfs/importer/trickle" - mdag "github.com/jbenet/go-ipfs/merkledag" - pin "github.com/jbenet/go-ipfs/pin" - ft "github.com/jbenet/go-ipfs/unixfs" - uio "github.com/jbenet/go-ipfs/unixfs/io" - u "github.com/jbenet/go-ipfs/util" - - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/blocks/blockstore" + bs "github.com/ipfs/go-ipfs/blockservice" + "github.com/ipfs/go-ipfs/exchange/offline" + imp "github.com/ipfs/go-ipfs/importer" + "github.com/ipfs/go-ipfs/importer/chunk" + h "github.com/ipfs/go-ipfs/importer/helpers" + trickle "github.com/ipfs/go-ipfs/importer/trickle" + mdag "github.com/ipfs/go-ipfs/merkledag" + pin "github.com/ipfs/go-ipfs/pin" + ft "github.com/ipfs/go-ipfs/unixfs" + uio "github.com/ipfs/go-ipfs/unixfs/io" + u "github.com/ipfs/go-ipfs/util" + + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) func getMockDagServ(t testing.TB) (mdag.DAGService, pin.ManualPinner) { diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 19eb9d8ee0..aac37040e8 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 26aa772ce4..9509b2d6dc 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -8,13 +8,13 @@ import ( gopath "path" "time" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - mdag "github.com/jbenet/go-ipfs/merkledag" - path "github.com/jbenet/go-ipfs/path" - uio "github.com/jbenet/go-ipfs/unixfs/io" - upb "github.com/jbenet/go-ipfs/unixfs/pb" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + mdag "github.com/ipfs/go-ipfs/merkledag" + path "github.com/ipfs/go-ipfs/path" + uio "github.com/ipfs/go-ipfs/unixfs/io" + upb "github.com/ipfs/go-ipfs/unixfs/pb" - proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) type Reader struct { From ebbc4dffcb479727ab738e9a132ecc056ade5059 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0722/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-ipfs-pinner@5f805306f75bfee35634324c14935178921e3c36 --- pinning/pinner/indirect.go | 6 +++--- pinning/pinner/pin.go | 12 ++++++------ pinning/pinner/pin_test.go | 14 +++++++------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 09decbb254..46350a4e0d 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -1,9 +1,9 @@ package pin import ( - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - "github.com/jbenet/go-ipfs/blocks/set" - "github.com/jbenet/go-ipfs/util" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + "github.com/ipfs/go-ipfs/blocks/set" + "github.com/ipfs/go-ipfs/util" ) type indirectPin struct { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 6ec2993881..49a5871334 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -9,12 +9,12 @@ import ( "sync" "time" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - "github.com/jbenet/go-ipfs/blocks/set" - mdag "github.com/jbenet/go-ipfs/merkledag" - "github.com/jbenet/go-ipfs/util" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + nsds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/ipfs/go-ipfs/blocks/set" + mdag "github.com/ipfs/go-ipfs/merkledag" + "github.com/ipfs/go-ipfs/util" ) var log = util.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 12db39b293..f31e1fef93 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -3,13 +3,13 @@ package pin import ( "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - "github.com/jbenet/go-ipfs/blocks/blockstore" - bs "github.com/jbenet/go-ipfs/blockservice" - "github.com/jbenet/go-ipfs/exchange/offline" - mdag "github.com/jbenet/go-ipfs/merkledag" - "github.com/jbenet/go-ipfs/util" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/blocks/blockstore" + bs "github.com/ipfs/go-ipfs/blockservice" + "github.com/ipfs/go-ipfs/exchange/offline" + mdag "github.com/ipfs/go-ipfs/merkledag" + "github.com/ipfs/go-ipfs/util" ) func randNode() (*mdag.Node, util.Key) { From cc79c7904b7772f050c596eeb554f270d33ec0e7 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0723/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-ipfs-blockstore@f5caff3e9e5ee7a061693014f528891b60632284 --- blockstore/blockstore.go | 16 ++++++++-------- blockstore/blockstore_test.go | 12 ++++++------ blockstore/write_cache.go | 8 ++++---- blockstore/write_cache_test.go | 8 ++++---- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 7e929af103..7f3d4d7c84 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -5,14 +5,14 @@ package blockstore import ( "errors" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dsns "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" - dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blocks "github.com/jbenet/go-ipfs/blocks" - eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" - u "github.com/jbenet/go-ipfs/util" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" + dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" + mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + blocks "github.com/ipfs/go-ipfs/blocks" + eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + u "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 51f5aad11a..10844354ac 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,13 +5,13 @@ import ( "fmt" "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" - ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" + ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blocks "github.com/jbenet/go-ipfs/blocks" - u "github.com/jbenet/go-ipfs/util" + blocks "github.com/ipfs/go-ipfs/blocks" + u "github.com/ipfs/go-ipfs/util" ) // TODO(brian): TestGetReturnsNil diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index a1399fcc68..b0ea4abc5c 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -1,10 +1,10 @@ package blockstore import ( - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - "github.com/jbenet/go-ipfs/blocks" - u "github.com/jbenet/go-ipfs/util" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/ipfs/go-ipfs/blocks" + u "github.com/ipfs/go-ipfs/util" ) // WriteCached returns a blockstore that caches up to |size| unique writes (bs.Put). diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index b20188e299..cf8150ba68 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -3,10 +3,10 @@ package blockstore import ( "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dsq "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" - syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - "github.com/jbenet/go-ipfs/blocks" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" + syncds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/blocks" ) func TestReturnsErrorWhenSizeNegative(t *testing.T) { From 2b73cdd1ee9985126481877ead65c15d40da50f3 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0724/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-blockservice@3ae534c87da6d837832772212e5881c6a643d0b3 --- blockservice/blocks_test.go | 16 ++++++++-------- blockservice/blockservice.go | 12 ++++++------ blockservice/mock.go | 8 ++++---- blockservice/worker/bench/main.go | 16 ++++++++-------- blockservice/worker/bench_worker_test.go | 10 +++++----- blockservice/worker/worker.go | 12 ++++++------ blockservice/worker/worker_test.go | 2 +- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index be1ca6059d..b38d52af90 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -5,14 +5,14 @@ import ( "testing" "time" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blocks "github.com/jbenet/go-ipfs/blocks" - blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" - blocksutil "github.com/jbenet/go-ipfs/blocks/blocksutil" - offline "github.com/jbenet/go-ipfs/exchange/offline" - u "github.com/jbenet/go-ipfs/util" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + blocks "github.com/ipfs/go-ipfs/blocks" + blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" + blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" + offline "github.com/ipfs/go-ipfs/exchange/offline" + u "github.com/ipfs/go-ipfs/util" ) func TestBlocks(t *testing.T) { diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index ee84d79d61..46612be26c 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -7,12 +7,12 @@ import ( "errors" "fmt" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blocks "github.com/jbenet/go-ipfs/blocks" - "github.com/jbenet/go-ipfs/blocks/blockstore" - worker "github.com/jbenet/go-ipfs/blockservice/worker" - exchange "github.com/jbenet/go-ipfs/exchange" - u "github.com/jbenet/go-ipfs/util" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + blocks "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-ipfs/blocks/blockstore" + worker "github.com/ipfs/go-ipfs/blockservice/worker" + exchange "github.com/ipfs/go-ipfs/exchange" + u "github.com/ipfs/go-ipfs/util" ) var wc = worker.Config{ diff --git a/blockservice/mock.go b/blockservice/mock.go index 541efe6964..45b440b3ea 100644 --- a/blockservice/mock.go +++ b/blockservice/mock.go @@ -3,10 +3,10 @@ package blockservice import ( "testing" - bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" - tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" - mockrouting "github.com/jbenet/go-ipfs/routing/mock" - delay "github.com/jbenet/go-ipfs/thirdparty/delay" + bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" + tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" + mockrouting "github.com/ipfs/go-ipfs/routing/mock" + delay "github.com/ipfs/go-ipfs/thirdparty/delay" ) // Mocks returns |n| connected mock Blockservices diff --git a/blockservice/worker/bench/main.go b/blockservice/worker/bench/main.go index 5d85de27f7..82c3dee13a 100644 --- a/blockservice/worker/bench/main.go +++ b/blockservice/worker/bench/main.go @@ -6,14 +6,14 @@ import ( "testing" "time" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - blocks "github.com/jbenet/go-ipfs/blocks" - blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" - worker "github.com/jbenet/go-ipfs/blockservice/worker" - "github.com/jbenet/go-ipfs/exchange/offline" - "github.com/jbenet/go-ipfs/thirdparty/delay" - "github.com/jbenet/go-ipfs/util/datastore2" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + blocks "github.com/ipfs/go-ipfs/blocks" + blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" + worker "github.com/ipfs/go-ipfs/blockservice/worker" + "github.com/ipfs/go-ipfs/exchange/offline" + "github.com/ipfs/go-ipfs/thirdparty/delay" + "github.com/ipfs/go-ipfs/util/datastore2" ) const kEstRoutingDelay = time.Second diff --git a/blockservice/worker/bench_worker_test.go b/blockservice/worker/bench_worker_test.go index aab910b64a..a5e34a1073 100644 --- a/blockservice/worker/bench_worker_test.go +++ b/blockservice/worker/bench_worker_test.go @@ -3,11 +3,11 @@ package worker import ( "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - blocks "github.com/jbenet/go-ipfs/blocks" - blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" - "github.com/jbenet/go-ipfs/exchange/offline" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + blocks "github.com/ipfs/go-ipfs/blocks" + blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" + "github.com/ipfs/go-ipfs/exchange/offline" ) func BenchmarkHandle10KBlocks(b *testing.B) { diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index ee45d32ad5..5e57d8429d 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -6,12 +6,12 @@ import ( "errors" "time" - process "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - ratelimit "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" - blocks "github.com/jbenet/go-ipfs/blocks" - exchange "github.com/jbenet/go-ipfs/exchange" - waitable "github.com/jbenet/go-ipfs/thirdparty/waitable" - util "github.com/jbenet/go-ipfs/util" + process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + ratelimit "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" + blocks "github.com/ipfs/go-ipfs/blocks" + exchange "github.com/ipfs/go-ipfs/exchange" + waitable "github.com/ipfs/go-ipfs/thirdparty/waitable" + util "github.com/ipfs/go-ipfs/util" ) var log = util.Logger("blockservice") diff --git a/blockservice/worker/worker_test.go b/blockservice/worker/worker_test.go index 4cbc9b2ccf..2b6a2d16f1 100644 --- a/blockservice/worker/worker_test.go +++ b/blockservice/worker/worker_test.go @@ -1,7 +1,7 @@ package worker import ( - blocks "github.com/jbenet/go-ipfs/blocks" + blocks "github.com/ipfs/go-ipfs/blocks" "testing" ) From 510cb9910313855d06cdd1307c76cb77970a05c3 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0725/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-ipfs-exchange-offline@b1ec37fcd5148bc8f88a24665722e5a515dd100c --- exchange/offline/offline.go | 10 +++++----- exchange/offline/offline_test.go | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index fe8fa723c3..6b6ffc8383 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -3,11 +3,11 @@ package offline import ( - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blocks "github.com/jbenet/go-ipfs/blocks" - "github.com/jbenet/go-ipfs/blocks/blockstore" - exchange "github.com/jbenet/go-ipfs/exchange" - u "github.com/jbenet/go-ipfs/util" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + blocks "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-ipfs/blocks/blockstore" + exchange "github.com/ipfs/go-ipfs/exchange" + u "github.com/ipfs/go-ipfs/util" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 20588bde84..1bbbf3f104 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -3,13 +3,13 @@ package offline import ( "testing" - ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blocks "github.com/jbenet/go-ipfs/blocks" - "github.com/jbenet/go-ipfs/blocks/blockstore" - "github.com/jbenet/go-ipfs/blocks/blocksutil" - u "github.com/jbenet/go-ipfs/util" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + blocks "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-ipfs/blocks/blockstore" + "github.com/ipfs/go-ipfs/blocks/blocksutil" + u "github.com/ipfs/go-ipfs/util" ) func TestBlockReturnsErr(t *testing.T) { From 8369c0acec49767695ee0d12402131604fafa994 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0726/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-ipfs-exchange-interface@f190e6acb7c313eff6ac060b2b69b9bb639bfa22 --- exchange/interface.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index c07d2a4712..3ccda263ca 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -4,9 +4,9 @@ package exchange import ( "io" - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blocks "github.com/jbenet/go-ipfs/blocks" - u "github.com/jbenet/go-ipfs/util" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + blocks "github.com/ipfs/go-ipfs/blocks" + u "github.com/ipfs/go-ipfs/util" ) // Any type that implements exchange.Interface may be used as an IPFS block From 76d8561da5263e5f56108e15bee12f79c2d96315 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 0727/3147] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) This commit was moved from ipfs/go-ipfs-chunker@1cfd9abd7be865cf1bb84c46065d6d25ef0a0390 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 73fe49db1d..999ed367f4 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - "github.com/jbenet/go-ipfs/util" + "github.com/ipfs/go-ipfs/util" ) var log = util.Logger("chunk") From 8b4ab284f5ecc95073c84093c2baca554889b5e0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Mar 2015 10:48:29 -0700 Subject: [PATCH 0728/3147] cache public keys and use better method for fetching This commit was moved from ipfs/go-ipfs-routing@fdf7dbf691802a2781bfea4a263cde68aa210bbf --- routing/dht/records.go | 5 ++--- routing/routing.go | 5 +++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/routing/dht/records.go b/routing/dht/records.go index b1a66299a6..3d563ab572 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -18,7 +18,7 @@ func KeyForPublicKey(id peer.ID) u.Key { return u.Key("/pk/" + string(id)) } -func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKey, error) { +func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { log.Debugf("getPublicKey for: %s", p) // check locally. @@ -42,7 +42,6 @@ func (dht *IpfsDHT) getPublicKeyOnline(ctx context.Context, p peer.ID) (ci.PubKe log.Debugf("pk for %s not in peerstore, and peer failed. trying dht.", p) pkkey := KeyForPublicKey(p) - // ok, now try the dht. Anyone who has previously fetched the key should have it val, err := dht.GetValue(ctxT, pkkey) if err != nil { log.Warning("Failed to find requested public key.") @@ -132,7 +131,7 @@ func (dht *IpfsDHT) verifyRecordOnline(ctx context.Context, r *pb.Record) error if len(r.Signature) > 0 { // get the public key, search for it if necessary. p := peer.ID(r.GetAuthor()) - pk, err := dht.getPublicKeyOnline(ctx, p) + pk, err := dht.GetPublicKey(ctx, p) if err != nil { return err } diff --git a/routing/routing.go b/routing/routing.go index bb11265e22..b85b25e224 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -6,6 +6,7 @@ import ( "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + ci "github.com/ipfs/go-ipfs/p2p/crypto" peer "github.com/ipfs/go-ipfs/p2p/peer" u "github.com/ipfs/go-ipfs/util" ) @@ -46,3 +47,7 @@ type IpfsRouting interface { // TODO expose io.Closer or plain-old Close error } + +type PubKeyFetcher interface { + GetPublicKey(context.Context, peer.ID) (ci.PubKey, error) +} From 70c5898809dffd9407e25bd5d324510ff3ccf0a6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Mar 2015 10:48:29 -0700 Subject: [PATCH 0729/3147] cache public keys and use better method for fetching This commit was moved from ipfs/go-namesys@fe3edb2b000ab4e8ea2b90fba00f83e7f6fd5bd2 --- namesys/routing.go | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index 476303cbfc..67d96f1f63 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -8,6 +8,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" pb "github.com/ipfs/go-ipfs/namesys/internal/pb" ci "github.com/ipfs/go-ipfs/p2p/crypto" + peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" ) @@ -65,24 +66,38 @@ func (r *routingResolver) Resolve(ctx context.Context, name string) (u.Key, erro // name should be a public key retrievable from ipfs // /ipfs/ - key := u.Key("/pk/" + string(hash)) - pkval, err := r.routing.GetValue(ctx, key) - if err != nil { - log.Warning("RoutingResolve PubKey Get failed.") - return "", err - } + var pubkey ci.PubKey + if dht, ok := r.routing.(routing.PubKeyFetcher); ok { + // If we have a DHT as our routing system, use optimized fetcher + pk, err := dht.GetPublicKey(ctx, peer.ID(hash)) + if err != nil { + log.Warning("RoutingResolve PubKey Get failed.") + return "", err + } + pubkey = pk + } else { + key := u.Key("/pk/" + string(hash)) + pkval, err := r.routing.GetValue(ctx, key) + if err != nil { + log.Warning("RoutingResolve PubKey Get failed.") + return "", err + } - // get PublicKey from node.Data - pk, err := ci.UnmarshalPublicKey(pkval) - if err != nil { - return "", err + // get PublicKey from node.Data + pk, err := ci.UnmarshalPublicKey(pkval) + if err != nil { + return "", err + } + + pubkey = pk } - hsh, _ := pk.Hash() + + hsh, _ := pubkey.Hash() log.Debugf("pk hash = %s", u.Key(hsh)) // check sig with pk - if ok, err := pk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { - return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pk) + if ok, err := pubkey.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { + return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pubkey) } // ok sig checks out. this is a valid name. From b2e37220b21a91b757ce896c9046c8c398becf43 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 31 Mar 2015 14:41:53 -0700 Subject: [PATCH 0730/3147] Address comments from PR This commit was moved from ipfs/go-ipfs-routing@0bd6ae459ad7b3966928649ccc4ed48e6e3a5016 --- routing/dht/records.go | 12 +++--------- routing/routing.go | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/routing/dht/records.go b/routing/dht/records.go index 3d563ab572..973ceca96b 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -6,18 +6,12 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" ctxutil "github.com/ipfs/go-ipfs/util/ctx" ) -// KeyForPublicKey returns the key used to retrieve public keys -// from the dht. -func KeyForPublicKey(id peer.ID) u.Key { - return u.Key("/pk/" + string(id)) -} - func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { log.Debugf("getPublicKey for: %s", p) @@ -40,7 +34,7 @@ func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, err // last ditch effort: let's try the dht. log.Debugf("pk for %s not in peerstore, and peer failed. trying dht.", p) - pkkey := KeyForPublicKey(p) + pkkey := routing.KeyForPublicKey(p) val, err := dht.GetValue(ctxT, pkkey) if err != nil { @@ -65,7 +59,7 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub return pk, nil } - pkkey := KeyForPublicKey(p) + pkkey := routing.KeyForPublicKey(p) pmes, err := dht.getValueSingle(ctx, p, pkkey) if err != nil { return nil, err diff --git a/routing/routing.go b/routing/routing.go index b85b25e224..c94d813ae7 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -51,3 +51,25 @@ type IpfsRouting interface { type PubKeyFetcher interface { GetPublicKey(context.Context, peer.ID) (ci.PubKey, error) } + +// KeyForPublicKey returns the key used to retrieve public keys +// from the dht. +func KeyForPublicKey(id peer.ID) u.Key { + return u.Key("/pk/" + string(id)) +} + +func GetPublicKey(r IpfsRouting, ctx context.Context, pkhash []byte) (ci.PubKey, error) { + if dht, ok := r.(PubKeyFetcher); ok { + // If we have a DHT as our routing system, use optimized fetcher + return dht.GetPublicKey(ctx, peer.ID(pkhash)) + } else { + key := u.Key("/pk/" + string(pkhash)) + pkval, err := r.GetValue(ctx, key) + if err != nil { + return nil, err + } + + // get PublicKey from node.Data + return ci.UnmarshalPublicKey(pkval) + } +} From 61f08d3d8cfae53d303c383df454b0de491e507a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 31 Mar 2015 14:41:53 -0700 Subject: [PATCH 0731/3147] Address comments from PR This commit was moved from ipfs/go-namesys@3ec169a26cac0c5fedd8a0b0ac90ad1c07b1e8a6 --- namesys/routing.go | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index 67d96f1f63..4a9756d00e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,8 +7,6 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" pb "github.com/ipfs/go-ipfs/namesys/internal/pb" - ci "github.com/ipfs/go-ipfs/p2p/crypto" - peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" ) @@ -65,31 +63,9 @@ func (r *routingResolver) Resolve(ctx context.Context, name string) (u.Key, erro } // name should be a public key retrievable from ipfs - // /ipfs/ - var pubkey ci.PubKey - if dht, ok := r.routing.(routing.PubKeyFetcher); ok { - // If we have a DHT as our routing system, use optimized fetcher - pk, err := dht.GetPublicKey(ctx, peer.ID(hash)) - if err != nil { - log.Warning("RoutingResolve PubKey Get failed.") - return "", err - } - pubkey = pk - } else { - key := u.Key("/pk/" + string(hash)) - pkval, err := r.routing.GetValue(ctx, key) - if err != nil { - log.Warning("RoutingResolve PubKey Get failed.") - return "", err - } - - // get PublicKey from node.Data - pk, err := ci.UnmarshalPublicKey(pkval) - if err != nil { - return "", err - } - - pubkey = pk + pubkey, err := routing.GetPublicKey(r.routing, ctx, hash) + if err != nil { + return "", err } hsh, _ := pubkey.Hash() From ed7a93f2fe91685f1fef159174fadc03208a08fc Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 2 Apr 2015 03:02:12 -0700 Subject: [PATCH 0732/3147] dht-handlers-log-keys This commit was moved from ipfs/go-ipfs-routing@15854ee4ee12b5d3860b23a113cae38319d349a6 --- routing/dht/handlers.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 95404efb1f..926dc75f70 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -10,6 +10,7 @@ import ( peer "github.com/ipfs/go-ipfs/p2p/peer" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" + lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" ) // The number of closer peers to send on requests. @@ -157,9 +158,13 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess } func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - defer log.EventBegin(ctx, "handleGetProviders", p).Done() + lm := make(lgbl.DeferredMap) + lm["peer"] = func() interface{} { return p.Pretty() } + defer log.EventBegin(ctx, "handleGetProviders", lm).Done() + resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) key := u.Key(pmes.GetKey()) + lm["key"] = func() interface{} { return key.Pretty() } // debug logging niceness. reqDesc := fmt.Sprintf("%s handleGetProviders(%s, %s): ", dht.self, p, key) @@ -198,8 +203,12 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. } func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - defer log.EventBegin(ctx, "handleAddProvider", p).Done() + lm := make(lgbl.DeferredMap) + lm["peer"] = func() interface{} { return p.Pretty() } + + defer log.EventBegin(ctx, "handleAddProvider", lm).Done() key := u.Key(pmes.GetKey()) + lm["key"] = func() interface{} { return key.Pretty() } log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, key) From d4a41309f31521f015637929deb4ec07be08227c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 13 Apr 2015 19:48:55 -0700 Subject: [PATCH 0733/3147] move log messages out of warning level This commit was moved from ipfs/go-ipfs-routing@b29cf0c3806847d08d48b307ce0fbad06bf16ec8 --- routing/dht/dht_net.go | 2 +- routing/dht/handlers.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 8bba4c41d8..92fec8ec69 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -54,7 +54,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // if nil response, return it before serializing if rpmes == nil { - log.Warning("Got back nil response from request.") + log.Debug("Got back nil response from request.") return } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 926dc75f70..279ac82e4d 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -140,7 +140,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess } if closest == nil { - log.Warningf("%s handleFindPeer %s: could not find anything.", dht.self, p) + log.Infof("%s handleFindPeer %s: could not find anything.", dht.self, p) return resp, nil } From 9f3d713284ce745046df8b94a8152dc023dcd952 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 3 Apr 2015 17:40:03 -0700 Subject: [PATCH 0734/3147] fix for #1008 and other pinning fixes This commit adds a new set of sharness tests for pinning, and addresses bugs that were pointed out by said tests. test/sharness: added more pinning tests Pinning is currently broken. See issue #1051. This commit introduces a few more pinning tests. These are by no means exhaustive, but definitely surface the present problems going on. I believe these tests are correct, but not sure. Pushing them as failing so that pinning is fixed in this PR. make pinning and merkledag.Get take contexts improve 'add' commands usage of pinning FIXUP: fix 'pin lists look good' ipfs-pin-stat simple script to help check pinning This is a simple shell script to help check pinning. We ought to strive towards making adding commands this easy. The http api is great and powerful, but our setup right now gets in the way. Perhaps we can clean up that area. updated t0081-repo-pinning - fixed a couple bugs with the tests - made it a bit clearer (still a lot going on) - the remaining tests are correct and highlight a problem with pinning. Namely, that recursive pinning is buggy. At least: towards the end of the test, $HASH_DIR4 and $HASH_FILE4 should be pinned indirectly, but they're not. And thus get gc-ed out. There may be other problems too. cc @whyrusleeping fix grep params for context deadline check fix bugs in pin and pin tests check for block local before checking recursive pin This commit was moved from ipfs/go-path@63b4a056ef4c981c1487d3df80be1472c148a59d --- path/resolver.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index f329ddebd9..27aa2a0eb7 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -3,8 +3,10 @@ package path import ( "fmt" + "time" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" merkledag "github.com/ipfs/go-ipfs/merkledag" u "github.com/ipfs/go-ipfs/util" ) @@ -74,7 +76,9 @@ func (s *Resolver) ResolvePathComponents(fpath Path) ([]*merkledag.Node, error) } log.Debug("Resolve dag get.\n") - nd, err := s.DAG.Get(u.Key(h)) + ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + defer cancel() + nd, err := s.DAG.Get(ctx, u.Key(h)) if err != nil { return nil, err } @@ -117,7 +121,9 @@ func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( if nlink.Node == nil { // fetch object for link and assign to nd - nd, err = s.DAG.Get(next) + ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + defer cancel() + nd, err = s.DAG.Get(ctx, next) if err != nil { return append(result, nd), err } From 644283f36f127a9e8458b65f210781121f502ea6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 3 Apr 2015 17:40:03 -0700 Subject: [PATCH 0735/3147] fix for #1008 and other pinning fixes This commit adds a new set of sharness tests for pinning, and addresses bugs that were pointed out by said tests. test/sharness: added more pinning tests Pinning is currently broken. See issue #1051. This commit introduces a few more pinning tests. These are by no means exhaustive, but definitely surface the present problems going on. I believe these tests are correct, but not sure. Pushing them as failing so that pinning is fixed in this PR. make pinning and merkledag.Get take contexts improve 'add' commands usage of pinning FIXUP: fix 'pin lists look good' ipfs-pin-stat simple script to help check pinning This is a simple shell script to help check pinning. We ought to strive towards making adding commands this easy. The http api is great and powerful, but our setup right now gets in the way. Perhaps we can clean up that area. updated t0081-repo-pinning - fixed a couple bugs with the tests - made it a bit clearer (still a lot going on) - the remaining tests are correct and highlight a problem with pinning. Namely, that recursive pinning is buggy. At least: towards the end of the test, $HASH_DIR4 and $HASH_FILE4 should be pinned indirectly, but they're not. And thus get gc-ed out. There may be other problems too. cc @whyrusleeping fix grep params for context deadline check fix bugs in pin and pin tests check for block local before checking recursive pin This commit was moved from ipfs/go-unixfs@fa99d7e3ab6d633c474bfa1d7099ebe70d2521fd --- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 9 ++++++++- unixfs/mod/dagmodifier.go | 10 +++++++--- unixfs/mod/dagmodifier_test.go | 4 ++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index da9b3ee244..2f33d337f0 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -74,7 +74,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag if len(n.Links) == 0 { return nil, errors.New("incorrectly formatted metadata object") } - child, err := n.Links[0].GetNode(serv) + child, err := n.Links[0].GetNode(ctx, serv) if err != nil { return nil, err } diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index ecdbfc6236..b30d9ea3ae 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -1,6 +1,10 @@ package io import ( + "time" + + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" u "github.com/ipfs/go-ipfs/util" @@ -20,7 +24,10 @@ func NewDirectory(dserv mdag.DAGService) *directoryBuilder { } func (d *directoryBuilder) AddChild(name string, k u.Key) error { - cnode, err := d.dserv.Get(k) + ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + defer cancel() + + cnode, err := d.dserv.Get(ctx, k) if err != nil { return err } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index fe04ece20e..90118559b7 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -5,6 +5,7 @@ import ( "errors" "io" "os" + "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" @@ -184,7 +185,7 @@ func (dm *DagModifier) Sync() error { return err } - nd, err := dm.dagserv.Get(thisk) + nd, err := dm.dagserv.Get(dm.ctx, thisk) if err != nil { return err } @@ -267,7 +268,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) ckey := u.Key(node.Links[i].Hash) dm.mp.RemovePinWithMode(ckey, pin.Indirect) - child, err := node.Links[i].GetNode(dm.dagserv) + child, err := node.Links[i].GetNode(dm.ctx, dm.dagserv) if err != nil { return "", false, err } @@ -457,7 +458,10 @@ func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, er var modified *mdag.Node ndata := new(ft.FSNode) for i, lnk := range nd.Links { - child, err := lnk.GetNode(ds) + ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + defer cancel() + + child, err := lnk.GetNode(ctx, ds) if err != nil { return nil, err } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 2eaa04265e..abc8268e36 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -578,7 +578,7 @@ func enumerateChildren(t *testing.T, nd *mdag.Node, ds mdag.DAGService) []u.Key var out []u.Key for _, lnk := range nd.Links { out = append(out, u.Key(lnk.Hash)) - child, err := lnk.GetNode(ds) + child, err := lnk.GetNode(context.Background(), ds) if err != nil { t.Fatal(err) } @@ -643,7 +643,7 @@ func printDag(nd *mdag.Node, ds mdag.DAGService, indent int) { fmt.Println() } for _, lnk := range nd.Links { - child, err := lnk.GetNode(ds) + child, err := lnk.GetNode(context.Background(), ds) if err != nil { panic(err) } From 41158c49081aec5bc5d940b59b007c0a538467d1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 3 Apr 2015 17:40:03 -0700 Subject: [PATCH 0736/3147] fix for #1008 and other pinning fixes This commit adds a new set of sharness tests for pinning, and addresses bugs that were pointed out by said tests. test/sharness: added more pinning tests Pinning is currently broken. See issue #1051. This commit introduces a few more pinning tests. These are by no means exhaustive, but definitely surface the present problems going on. I believe these tests are correct, but not sure. Pushing them as failing so that pinning is fixed in this PR. make pinning and merkledag.Get take contexts improve 'add' commands usage of pinning FIXUP: fix 'pin lists look good' ipfs-pin-stat simple script to help check pinning This is a simple shell script to help check pinning. We ought to strive towards making adding commands this easy. The http api is great and powerful, but our setup right now gets in the way. Perhaps we can clean up that area. updated t0081-repo-pinning - fixed a couple bugs with the tests - made it a bit clearer (still a lot going on) - the remaining tests are correct and highlight a problem with pinning. Namely, that recursive pinning is buggy. At least: towards the end of the test, $HASH_DIR4 and $HASH_FILE4 should be pinned indirectly, but they're not. And thus get gc-ed out. There may be other problems too. cc @whyrusleeping fix grep params for context deadline check fix bugs in pin and pin tests check for block local before checking recursive pin This commit was moved from ipfs/go-namesys@b355d6d8e784ac392042935bdfa9a7f0e638fd26 --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index eb3838eefe..9ffd726183 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -150,7 +150,7 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p // pin recursively because this might already be pinned // and doing a direct pin would throw an error in that case - err = pins.Pin(emptyDir, true) + err = pins.Pin(ctx, emptyDir, true) if err != nil { return err } From 03d2bb8261204b37ce2a57954a557369a24da1fc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 3 Apr 2015 17:40:03 -0700 Subject: [PATCH 0737/3147] fix for #1008 and other pinning fixes This commit adds a new set of sharness tests for pinning, and addresses bugs that were pointed out by said tests. test/sharness: added more pinning tests Pinning is currently broken. See issue #1051. This commit introduces a few more pinning tests. These are by no means exhaustive, but definitely surface the present problems going on. I believe these tests are correct, but not sure. Pushing them as failing so that pinning is fixed in this PR. make pinning and merkledag.Get take contexts improve 'add' commands usage of pinning FIXUP: fix 'pin lists look good' ipfs-pin-stat simple script to help check pinning This is a simple shell script to help check pinning. We ought to strive towards making adding commands this easy. The http api is great and powerful, but our setup right now gets in the way. Perhaps we can clean up that area. updated t0081-repo-pinning - fixed a couple bugs with the tests - made it a bit clearer (still a lot going on) - the remaining tests are correct and highlight a problem with pinning. Namely, that recursive pinning is buggy. At least: towards the end of the test, $HASH_DIR4 and $HASH_FILE4 should be pinned indirectly, but they're not. And thus get gc-ed out. There may be other problems too. cc @whyrusleeping fix grep params for context deadline check fix bugs in pin and pin tests check for block local before checking recursive pin This commit was moved from ipfs/go-ipfs-pinner@c177cd36c51882408d9e861077241c9ac694a259 --- pinning/pinner/indirect.go | 13 +++++++-- pinning/pinner/pin.go | 50 ++++++++++++++++--------------- pinning/pinner/pin_test.go | 60 +++++++++++++++++++++++++++++++++----- 3 files changed, 89 insertions(+), 34 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 46350a4e0d..deed1f5ff6 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -28,9 +28,11 @@ func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { refcnt := make(map[util.Key]int) var keys []util.Key for encK, v := range rcStore { - k := util.B58KeyDecode(encK) - keys = append(keys, k) - refcnt[k] = v + if v > 0 { + k := util.B58KeyDecode(encK) + keys = append(keys, k) + refcnt[k] = v + } } // log.Debugf("indirPin keys: %#v", keys) @@ -59,6 +61,7 @@ func (i *indirectPin) Decrement(k util.Key) { i.refCounts[k] = c if c <= 0 { i.blockset.RemoveBlock(k) + delete(i.refCounts, k) } } @@ -69,3 +72,7 @@ func (i *indirectPin) HasKey(k util.Key) bool { func (i *indirectPin) Set() set.BlockSet { return i.blockset } + +func (i *indirectPin) GetRefs() map[util.Key]int { + return i.refCounts +} diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 49a5871334..553593fc83 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "sync" - "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" nsds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" @@ -33,12 +32,12 @@ const ( type Pinner interface { IsPinned(util.Key) bool - Pin(*mdag.Node, bool) error - Unpin(util.Key, bool) error + Pin(context.Context, *mdag.Node, bool) error + Unpin(context.Context, util.Key, bool) error Flush() error GetManual() ManualPinner DirectKeys() []util.Key - IndirectKeys() []util.Key + IndirectKeys() map[util.Key]int RecursiveKeys() []util.Key } @@ -82,7 +81,7 @@ func NewPinner(dstore ds.ThreadSafeDatastore, serv mdag.DAGService) Pinner { } // Pin the given node, optionally recursive -func (p *pinner) Pin(node *mdag.Node, recurse bool) error { +func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() k, err := node.Key() @@ -99,34 +98,40 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { p.directPin.RemoveBlock(k) } - p.recursePin.AddBlock(k) - - err := p.pinLinks(node) + err := p.pinLinks(ctx, node) if err != nil { return err } + + p.recursePin.AddBlock(k) } else { + _, err := p.dserv.Get(ctx, k) + if err != nil { + return err + } + if p.recursePin.HasKey(k) { return fmt.Errorf("%s already pinned recursively", k.B58String()) } + p.directPin.AddBlock(k) } return nil } // Unpin a given key -func (p *pinner) Unpin(k util.Key, recursive bool) error { +func (p *pinner) Unpin(ctx context.Context, k util.Key, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() if p.recursePin.HasKey(k) { if recursive { p.recursePin.RemoveBlock(k) - node, err := p.dserv.Get(k) + node, err := p.dserv.Get(ctx, k) if err != nil { return err } - return p.unpinLinks(node) + return p.unpinLinks(ctx, node) } else { return fmt.Errorf("%s is pinned recursively", k) } @@ -140,9 +145,9 @@ func (p *pinner) Unpin(k util.Key, recursive bool) error { } } -func (p *pinner) unpinLinks(node *mdag.Node) error { +func (p *pinner) unpinLinks(ctx context.Context, node *mdag.Node) error { for _, l := range node.Links { - node, err := l.GetNode(p.dserv) + node, err := l.GetNode(ctx, p.dserv) if err != nil { return err } @@ -152,9 +157,9 @@ func (p *pinner) unpinLinks(node *mdag.Node) error { return err } - p.recursePin.RemoveBlock(k) + p.indirPin.Decrement(k) - err = p.unpinLinks(node) + err = p.unpinLinks(ctx, node) if err != nil { return err } @@ -162,27 +167,24 @@ func (p *pinner) unpinLinks(node *mdag.Node) error { return nil } -func (p *pinner) pinIndirectRecurse(node *mdag.Node) error { +func (p *pinner) pinIndirectRecurse(ctx context.Context, node *mdag.Node) error { k, err := node.Key() if err != nil { return err } p.indirPin.Increment(k) - return p.pinLinks(node) + return p.pinLinks(ctx, node) } -func (p *pinner) pinLinks(node *mdag.Node) error { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) - defer cancel() - +func (p *pinner) pinLinks(ctx context.Context, node *mdag.Node) error { for _, ng := range p.dserv.GetDAG(ctx, node) { subnode, err := ng.Get(ctx) if err != nil { // TODO: Maybe just log and continue? return err } - err = p.pinIndirectRecurse(subnode) + err = p.pinIndirectRecurse(ctx, subnode) if err != nil { return err } @@ -256,8 +258,8 @@ func (p *pinner) DirectKeys() []util.Key { } // IndirectKeys returns a slice containing the indirectly pinned keys -func (p *pinner) IndirectKeys() []util.Key { - return p.indirPin.Set().GetKeys() +func (p *pinner) IndirectKeys() map[util.Key]int { + return p.indirPin.GetRefs() } // RecursiveKeys returns a slice containing the recursively pinned keys diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index f31e1fef93..b79232570a 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -2,6 +2,9 @@ package pin import ( "testing" + "time" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" @@ -21,6 +24,8 @@ func randNode() (*mdag.Node, util.Key) { } func TestPinnerBasic(t *testing.T) { + ctx := context.Background() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) bserv, err := bs.New(bstore, offline.Exchange(bstore)) @@ -40,7 +45,7 @@ func TestPinnerBasic(t *testing.T) { } // Pin A{} - err = p.Pin(a, false) + err = p.Pin(ctx, a, false) if err != nil { t.Fatal(err) } @@ -74,7 +79,7 @@ func TestPinnerBasic(t *testing.T) { } // recursively pin B{A,C} - err = p.Pin(b, true) + err = p.Pin(ctx, b, true) if err != nil { t.Fatal(err) } @@ -102,7 +107,7 @@ func TestPinnerBasic(t *testing.T) { } // Add D{A,C,E} - err = p.Pin(d, true) + err = p.Pin(ctx, d, true) if err != nil { t.Fatal(err) } @@ -117,7 +122,7 @@ func TestPinnerBasic(t *testing.T) { } // Test recursive unpin - err = p.Unpin(dk, true) + err = p.Unpin(ctx, dk, true) if err != nil { t.Fatal(err) } @@ -154,6 +159,7 @@ func TestPinnerBasic(t *testing.T) { } func TestDuplicateSemantics(t *testing.T) { + ctx := context.Background() dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) bserv, err := bs.New(bstore, offline.Exchange(bstore)) @@ -173,19 +179,59 @@ func TestDuplicateSemantics(t *testing.T) { } // pin is recursively - err = p.Pin(a, true) + err = p.Pin(ctx, a, true) if err != nil { t.Fatal(err) } // pinning directly should fail - err = p.Pin(a, false) + err = p.Pin(ctx, a, false) if err == nil { t.Fatal("expected direct pin to fail") } // pinning recursively again should succeed - err = p.Pin(a, true) + err = p.Pin(ctx, a, true) + if err != nil { + t.Fatal(err) + } +} + +func TestPinRecursiveFail(t *testing.T) { + ctx := context.Background() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + + dserv := mdag.NewDAGService(bserv) + + p := NewPinner(dstore, dserv) + + a, _ := randNode() + b, _ := randNode() + err = a.AddNodeLinkClean("child", b) + if err != nil { + t.Fatal(err) + } + + // Note: this isnt a time based test, we expect the pin to fail + mctx, _ := context.WithTimeout(ctx, time.Millisecond) + err = p.Pin(mctx, a, true) + if err == nil { + t.Fatal("should have failed to pin here") + } + + _, err = dserv.Add(b) + if err != nil { + t.Fatal(err) + } + + // this one is time based... but shouldnt cause any issues + mctx, _ = context.WithTimeout(ctx, time.Second) + err = p.Pin(mctx, a, true) if err != nil { t.Fatal(err) } From 456ec1cee3f20c1f616cc4b0377dfe33af1828ff Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 20 Apr 2015 00:15:34 -0700 Subject: [PATCH 0738/3147] remove debugerrors We now consider debugerrors harmful: we've run into cases where debugerror.Wrap() hid valuable error information (err == io.EOF?). I've removed them from the main code, but left them in some tests. Go errors are lacking, but unfortunately, this isn't the solution. It is possible that debugerros.New or debugerrors.Errorf should remain still (i.e. only remove debugerrors.Wrap) but we don't use these errors often enough to keep. This commit was moved from ipfs/go-ipfs-routing@720c8b55d99ac0d741cfe64393b980db2def2466 --- routing/dht/routing.go | 7 +++---- routing/mock/dht.go | 1 - routing/supernode/client.go | 10 +++++----- routing/supernode/proxy/loopback.go | 3 +-- routing/supernode/proxy/standard.go | 5 +++-- routing/supernode/server.go | 4 ++-- 6 files changed, 14 insertions(+), 16 deletions(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 28967d2002..47e8924142 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -13,7 +13,6 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - errors "github.com/ipfs/go-ipfs/util/debugerror" pset "github.com/ipfs/go-ipfs/util/peerset" ) @@ -95,7 +94,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { log.Debugf("peers in rt: %s", len(rtp), rtp) if len(rtp) == 0 { log.Warning("No peers from routing table!") - return nil, errors.Wrap(kb.ErrLookupFailure) + return nil, kb.ErrLookupFailure } // setup the Query @@ -278,7 +277,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { - return peer.PeerInfo{}, errors.Wrap(kb.ErrLookupFailure) + return peer.PeerInfo{}, kb.ErrLookupFailure } // Sanity... @@ -344,7 +343,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) if len(peers) == 0 { - return nil, errors.Wrap(kb.ErrLookupFailure) + return nil, kb.ErrLookupFailure } // setup the Query diff --git a/routing/mock/dht.go b/routing/mock/dht.go index f4b2b49007..df8d7cdfc7 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -30,7 +30,6 @@ func (rs *mocknetserver) ClientWithDatastore(ctx context.Context, p testutil.Ide host, err := rs.mn.AddPeer(p.PrivateKey(), p.Address()) if err != nil { panic("FIXME") - // return nil, debugerror.Wrap(err) } return dht.NewDHT(ctx, host, sync.MutexWrap(ds)) } diff --git a/routing/supernode/client.go b/routing/supernode/client.go index fa47e2e805..13f845abe0 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -2,6 +2,7 @@ package supernode import ( "bytes" + "errors" "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" @@ -13,7 +14,6 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" u "github.com/ipfs/go-ipfs/util" - errors "github.com/ipfs/go-ipfs/util/debugerror" ) var log = eventlog.Logger("supernode") @@ -44,13 +44,13 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha request := pb.NewMessage(pb.Message_GET_PROVIDERS, string(k), 0) response, err := c.proxy.SendRequest(ctx, request) if err != nil { - log.Debug(errors.Wrap(err)) + log.Debug(err) return } for _, p := range pb.PBPeersToPeerInfos(response.GetProviderPeers()) { select { case <-ctx.Done(): - log.Debug(errors.Wrap(ctx.Err())) + log.Debug(ctx.Err()) return case ch <- p: } @@ -75,7 +75,7 @@ func (c *Client) GetValue(ctx context.Context, k u.Key) ([]byte, error) { msg := pb.NewMessage(pb.Message_GET_VALUE, string(k), 0) response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote if err != nil { - return nil, errors.Wrap(err) + return nil, err } return response.Record.GetValue(), nil } @@ -101,7 +101,7 @@ func (c *Client) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error request := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) response, err := c.proxy.SendRequest(ctx, request) // hide remote if err != nil { - return peer.PeerInfo{}, errors.Wrap(err) + return peer.PeerInfo{}, err } for _, p := range pb.PBPeersToPeerInfos(response.GetCloserPeers()) { if p.ID == id { diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 5d46fb4e11..06e91707ce 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,6 @@ import ( inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - errors "github.com/ipfs/go-ipfs/util/debugerror" ) // RequestHandler handles routing requests locally @@ -43,7 +42,7 @@ func (lb *Loopback) HandleStream(s inet.Stream) { pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) var incoming dhtpb.Message if err := pbr.ReadMsg(&incoming); err != nil { - log.Debug(errors.Wrap(err)) + log.Debug(err) return } ctx := context.TODO() diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 0a3d9e1b7b..7f4d38faa6 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -1,6 +1,8 @@ package proxy import ( + "errors" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" host "github.com/ipfs/go-ipfs/p2p/host" @@ -10,7 +12,6 @@ import ( kbucket "github.com/ipfs/go-ipfs/routing/kbucket" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" "github.com/ipfs/go-ipfs/util" - errors "github.com/ipfs/go-ipfs/util/debugerror" ) const ProtocolSNR = "/ipfs/supernoderouting" @@ -103,7 +104,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe defer s.Close() pbw := ggio.NewDelimitedWriter(s) if err := pbw.WriteMsg(m); err != nil { - return errors.Wrap(err) + return err } return nil } diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 44ef349d4f..fb077e882c 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -1,6 +1,7 @@ package supernode import ( + "errors" "fmt" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" @@ -11,7 +12,6 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" util "github.com/ipfs/go-ipfs/util" - errors "github.com/ipfs/go-ipfs/util/debugerror" ) // Server handles routing queries using a database backend @@ -117,7 +117,7 @@ func getRoutingRecord(ds datastore.Datastore, k util.Key) (*dhtpb.Record, error) dskey := k.DsKey() val, err := ds.Get(dskey) if err != nil { - return nil, errors.Wrap(err) + return nil, err } recordBytes, ok := val.([]byte) if !ok { From c4d46e1dbb6368c0c2dfb1eaac8c8becb9fc84f2 Mon Sep 17 00:00:00 2001 From: gatesvp Date: Mon, 20 Apr 2015 00:37:17 -0700 Subject: [PATCH 0739/3147] Move IPNS resolutions into the core library Move IPNS resolutions into the core library via the pathresolver.go file. Fix the CLI commands to leverage this core component. This commit was moved from ipfs/go-path@c880a2a1eed71f6916f6ca51207dbb87c97a50db --- path/path.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index ea83cd12ce..7820880c17 100644 --- a/path/path.go +++ b/path/path.go @@ -1,10 +1,9 @@ package path import ( + u "github.com/ipfs/go-ipfs/util" "path" "strings" - - u "github.com/ipfs/go-ipfs/util" ) // TODO: debate making this a private struct wrapped in a public interface @@ -36,3 +35,7 @@ func (p Path) Segments() []string { func (p Path) String() string { return string(p) } + +func FromSegments(seg ...string) Path { + return Path(strings.Join(seg, "/")) +} From 37ac594834c7bb9e66f7300034d860968fefc2af Mon Sep 17 00:00:00 2001 From: gatesvp Date: Mon, 20 Apr 2015 00:37:17 -0700 Subject: [PATCH 0740/3147] Move IPNS resolutions into the core library Move IPNS resolutions into the core library via the pathresolver.go file. Fix the CLI commands to leverage this core component. This commit was moved from ipfs/go-unixfs@671dfd042178615d85205190a7f6d306f0470ab7 --- unixfs/tar/reader.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 9509b2d6dc..405a0eb187 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -28,12 +28,11 @@ type Reader struct { err error } -func NewReader(path path.Path, dag mdag.DAGService, resolver *path.Resolver, compression int) (*Reader, error) { +func NewReader(path path.Path, dag mdag.DAGService, dagnode *mdag.Node, compression int) (*Reader, error) { reader := &Reader{ signalChan: make(chan struct{}), dag: dag, - resolver: resolver, } var err error @@ -47,11 +46,6 @@ func NewReader(path path.Path, dag mdag.DAGService, resolver *path.Resolver, com reader.writer = tar.NewWriter(&reader.buf) } - dagnode, err := resolver.ResolvePath(path) - if err != nil { - return nil, err - } - // writeToBuf will write the data to the buffer, and will signal when there // is new data to read _, filename := gopath.Split(path.String()) From a040804e61c1ecc8c503d3ce87afd86bcc6b8109 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Mon, 16 Mar 2015 14:03:28 -0700 Subject: [PATCH 0741/3147] Use flatfs to store objects under /blocks outside of LevelDB WARNING: No migration performed! That needs to come in a separate commit, perhaps amended into this one. Migration must move keyspace "/b" from leveldb to the flatfs subdir, while removing the "b" prefix (keys should start with just "/"). This commit was moved from ipfs/go-ipfs-blockstore@ed982777b038825394b05007e503a129c4d1716a --- blockstore/blockstore.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 7f3d4d7c84..ccc7e8fc5c 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -18,7 +18,7 @@ import ( var log = eventlog.Logger("blockstore") // BlockPrefix namespaces blockstore datastores -var BlockPrefix = ds.NewKey("b") +var BlockPrefix = ds.NewKey("blocks") var ValueTypeMismatch = errors.New("The retrieved value is not a Block") @@ -89,6 +89,8 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true} + // datastore/namespace does *NOT* fix up Query.Prefix + q.Prefix = BlockPrefix.String() res, err := bs.datastore.Query(q) if err != nil { return nil, err From 552e83c6088794a33759a83b2cd4f5983361b9cb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Apr 2015 21:14:25 -0700 Subject: [PATCH 0742/3147] refactored ipns records to point to paths Also changed the ipns dns resolution to use the "dnslink" format This commit was moved from ipfs/go-path@7058d559f87f9444650b0274c48d3ec4c2adce27 --- path/path.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 7820880c17..f7d4e43ff3 100644 --- a/path/path.go +++ b/path/path.go @@ -1,11 +1,19 @@ package path import ( - u "github.com/ipfs/go-ipfs/util" + "errors" "path" "strings" + + u "github.com/ipfs/go-ipfs/util" + + b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" + mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" ) +// ErrBadPath is returned when a given path is incorrectly formatted +var ErrBadPath = errors.New("invalid ipfs ref path") + // TODO: debate making this a private struct wrapped in a public interface // would allow us to control creation, and cache segments. type Path string @@ -17,7 +25,7 @@ func FromString(s string) Path { // FromKey safely converts a Key type to a Path type func FromKey(k u.Key) Path { - return Path(k.String()) + return Path("/ipfs/" + k.String()) } func (p Path) Segments() []string { @@ -39,3 +47,42 @@ func (p Path) String() string { func FromSegments(seg ...string) Path { return Path(strings.Join(seg, "/")) } + +func ParsePath(txt string) (Path, error) { + kp, err := ParseKeyToPath(txt) + if err == nil { + return kp, nil + } + parts := strings.Split(txt, "/") + if len(parts) < 3 { + return "", ErrBadPath + } + + if parts[0] != "" { + return "", ErrBadPath + } + + if parts[1] != "ipfs" && parts[1] != "ipns" { + return "", ErrBadPath + } + + _, err = ParseKeyToPath(parts[2]) + if err != nil { + return "", err + } + + return Path(txt), nil +} + +func ParseKeyToPath(txt string) (Path, error) { + chk := b58.Decode(txt) + if len(chk) == 0 { + return "", errors.New("not a key") + } + + _, err := mh.Cast(chk) + if err != nil { + return "", err + } + return FromKey(u.Key(chk)), nil +} From d86225ad4de999032eb018f485f9029709f54811 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 19 Apr 2015 11:17:06 -0700 Subject: [PATCH 0743/3147] address comments from CR This commit was moved from ipfs/go-path@f7108d98b59fec9b2e62f5c701dfaedbaf17ab01 --- path/path.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index f7d4e43ff3..e61a061930 100644 --- a/path/path.go +++ b/path/path.go @@ -49,11 +49,13 @@ func FromSegments(seg ...string) Path { } func ParsePath(txt string) (Path, error) { - kp, err := ParseKeyToPath(txt) - if err == nil { - return kp, nil - } parts := strings.Split(txt, "/") + if len(parts) == 1 { + kp, err := ParseKeyToPath(txt) + if err == nil { + return kp, nil + } + } if len(parts) < 3 { return "", ErrBadPath } @@ -66,7 +68,7 @@ func ParsePath(txt string) (Path, error) { return "", ErrBadPath } - _, err = ParseKeyToPath(parts[2]) + _, err := ParseKeyToPath(parts[2]) if err != nil { return "", err } @@ -86,3 +88,8 @@ func ParseKeyToPath(txt string) (Path, error) { } return FromKey(u.Key(chk)), nil } + +func (p *Path) IsValid() error { + _, err := ParsePath(p.String()) + return err +} From e62855b59292242e3777809149253233e83e3e13 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Apr 2015 23:20:22 -0700 Subject: [PATCH 0744/3147] fix up core.Resolve a bit This commit was moved from ipfs/go-path@a3af1211d2e2cf490f67017523075ec1fceaf313 --- path/path.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index e61a061930..15c1b45911 100644 --- a/path/path.go +++ b/path/path.go @@ -45,7 +45,11 @@ func (p Path) String() string { } func FromSegments(seg ...string) Path { - return Path(strings.Join(seg, "/")) + var pref string + if seg[0] == "ipfs" || seg[0] == "ipns" { + pref = "/" + } + return Path(pref + strings.Join(seg, "/")) } func ParsePath(txt string) (Path, error) { From 40a52e4c6b8c5f995b81febd0acc322cdf4ab1ce Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Apr 2015 21:14:25 -0700 Subject: [PATCH 0745/3147] refactored ipns records to point to paths Also changed the ipns dns resolution to use the "dnslink" format This commit was moved from ipfs/go-namesys@ef61b7d31108790d3d9c3ca80b8ea0bb0bc67dea --- namesys/dns.go | 38 ++++++++++++++++++++++++------------- namesys/dns_test.go | 42 +++++++++++++++++++++++++++++++++++++++++ namesys/interface.go | 6 +++--- namesys/namesys.go | 6 +++--- namesys/proquint.go | 6 +++--- namesys/publisher.go | 14 ++++---------- namesys/resolve_test.go | 8 ++------ namesys/routing.go | 15 +++++++++++++-- 8 files changed, 95 insertions(+), 40 deletions(-) create mode 100644 namesys/dns_test.go diff --git a/namesys/dns.go b/namesys/dns.go index 003e6f0f03..086adee9ee 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -1,14 +1,14 @@ package namesys import ( + "errors" "net" + "strings" - b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" isd "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - u "github.com/ipfs/go-ipfs/util" + path "github.com/ipfs/go-ipfs/path" ) // DNSResolver implements a Resolver on DNS domains @@ -25,7 +25,7 @@ func (r *DNSResolver) CanResolve(name string) bool { // Resolve implements Resolver // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) Resolve(ctx context.Context, name string) (u.Key, error) { +func (r *DNSResolver) Resolve(ctx context.Context, name string) (path.Path, error) { log.Info("DNSResolver resolving %v", name) txt, err := net.LookupTXT(name) if err != nil { @@ -33,17 +33,29 @@ func (r *DNSResolver) Resolve(ctx context.Context, name string) (u.Key, error) { } for _, t := range txt { - chk := b58.Decode(t) - if len(chk) == 0 { - continue + p, err := parseEntry(t) + if err == nil { + return p, nil } - - _, err := mh.Cast(chk) - if err != nil { - continue - } - return u.Key(chk), nil } return "", ErrResolveFailed } + +func parseEntry(txt string) (path.Path, error) { + p, err := path.ParseKeyToPath(txt) + if err == nil { + return p, nil + } + + return tryParseDnsLink(txt) +} + +func tryParseDnsLink(txt string) (path.Path, error) { + parts := strings.Split(txt, "=") + if len(parts) == 1 || parts[0] != "dnslink" { + return "", errors.New("not a valid dnslink entry") + } + + return path.ParsePath(parts[1]) +} diff --git a/namesys/dns_test.go b/namesys/dns_test.go new file mode 100644 index 0000000000..402156addc --- /dev/null +++ b/namesys/dns_test.go @@ -0,0 +1,42 @@ +package namesys + +import ( + "testing" +) + +func TestDnsEntryParsing(t *testing.T) { + goodEntries := []string{ + "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + "dnslink=/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo", + "dnslink=/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/bar", + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo/bar/baz", + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + } + + badEntries := []string{ + "QmYhE8xgFCjGcz6PHgnvJz5NOTCORRECT", + "quux=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + "dnslink=", + "dnslink=/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo", + "dnslink=ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/bar", + } + + for _, e := range goodEntries { + _, err := parseEntry(e) + if err != nil { + t.Log("expected entry to parse correctly!") + t.Log(e) + t.Fatal(err) + } + } + + for _, e := range badEntries { + _, err := parseEntry(e) + if err == nil { + t.Log("expected entry parse to fail!") + t.Fatal(err) + } + } +} diff --git a/namesys/interface.go b/namesys/interface.go index 39a5c6e734..4ceb3b9d96 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -6,7 +6,7 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" - u "github.com/ipfs/go-ipfs/util" + path "github.com/ipfs/go-ipfs/path" ) // ErrResolveFailed signals an error when attempting to resolve. @@ -31,7 +31,7 @@ type NameSystem interface { type Resolver interface { // Resolve looks up a name, and returns the value previously published. - Resolve(ctx context.Context, name string) (value u.Key, err error) + Resolve(ctx context.Context, name string) (value path.Path, err error) // CanResolve checks whether this Resolver can resolve a name CanResolve(name string) bool @@ -42,5 +42,5 @@ type Publisher interface { // Publish establishes a name-value mapping. // TODO make this not PrivKey specific. - Publish(ctx context.Context, name ci.PrivKey, value u.Key) error + Publish(ctx context.Context, name ci.PrivKey, value path.Path) error } diff --git a/namesys/namesys.go b/namesys/namesys.go index ed2ccb2559..6553077239 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -3,8 +3,8 @@ package namesys import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" + path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" ) // ipnsNameSystem implements IPNS naming. @@ -34,7 +34,7 @@ func NewNameSystem(r routing.IpfsRouting) NameSystem { } // Resolve implements Resolver -func (ns *ipns) Resolve(ctx context.Context, name string) (u.Key, error) { +func (ns *ipns) Resolve(ctx context.Context, name string) (path.Path, error) { for _, r := range ns.resolvers { if r.CanResolve(name) { return r.Resolve(ctx, name) @@ -54,6 +54,6 @@ func (ns *ipns) CanResolve(name string) bool { } // Publish implements Publisher -func (ns *ipns) Publish(ctx context.Context, name ci.PrivKey, value u.Key) error { +func (ns *ipns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { return ns.publisher.Publish(ctx, name, value) } diff --git a/namesys/proquint.go b/namesys/proquint.go index e3e2cc2810..66bd54e242 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -5,7 +5,7 @@ import ( proquint "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - u "github.com/ipfs/go-ipfs/util" + path "github.com/ipfs/go-ipfs/path" ) type ProquintResolver struct{} @@ -17,10 +17,10 @@ func (r *ProquintResolver) CanResolve(name string) bool { } // Resolve implements Resolver. Decodes the proquint string. -func (r *ProquintResolver) Resolve(ctx context.Context, name string) (u.Key, error) { +func (r *ProquintResolver) Resolve(ctx context.Context, name string) (path.Path, error) { ok := r.CanResolve(name) if !ok { return "", errors.New("not a valid proquint string") } - return u.Key(proquint.Decode(name)), nil + return path.FromString(string(proquint.Decode(name))), nil } diff --git a/namesys/publisher.go b/namesys/publisher.go index 9ffd726183..23e15ca715 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,12 +7,12 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/namesys/internal/pb" ci "github.com/ipfs/go-ipfs/p2p/crypto" + path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" @@ -41,15 +41,9 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { // Publish implements Publisher. Accepts a keypair and a value, // and publishes it out to the routing system -func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) error { +func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("namesys: Publish %s", value) - // validate `value` is a ref (multihash) - _, err := mh.FromB58String(value.Pretty()) - if err != nil { - return fmt.Errorf("publish value must be str multihash. %v", err) - } - data, err := createRoutingEntryData(k, value) if err != nil { return err @@ -84,7 +78,7 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value u.Key) return nil } -func createRoutingEntryData(pk ci.PrivKey, val u.Key) ([]byte, error) { +func createRoutingEntryData(pk ci.PrivKey, val path.Path) ([]byte, error) { entry := new(pb.IpnsEntry) entry.Value = []byte(val) @@ -160,7 +154,7 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p return err } - err = pub.Publish(ctx, key, nodek) + err = pub.Publish(ctx, key, path.FromKey(nodek)) if err != nil { return err } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index e9cd01760b..ce28b1d6b1 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -4,6 +4,7 @@ import ( "testing" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "github.com/ipfs/go-ipfs/util" testutil "github.com/ipfs/go-ipfs/util/testutil" @@ -20,12 +21,7 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - err = publisher.Publish(context.Background(), privk, "Hello") - if err == nil { - t.Fatal("should have errored out when publishing a non-multihash val") - } - - h := u.Key(u.Hash([]byte("Hello"))) + h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") err = publisher.Publish(context.Background(), privk, h) if err != nil { t.Fatal(err) diff --git a/namesys/routing.go b/namesys/routing.go index 4a9756d00e..5e0cf1a968 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,6 +7,7 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" pb "github.com/ipfs/go-ipfs/namesys/internal/pb" + path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" ) @@ -36,7 +37,7 @@ func (r *routingResolver) CanResolve(name string) bool { // Resolve implements Resolver. Uses the IPFS routing system to resolve SFS-like // names. -func (r *routingResolver) Resolve(ctx context.Context, name string) (u.Key, error) { +func (r *routingResolver) Resolve(ctx context.Context, name string) (path.Path, error) { log.Debugf("RoutingResolve: '%s'", name) hash, err := mh.FromB58String(name) if err != nil { @@ -77,5 +78,15 @@ func (r *routingResolver) Resolve(ctx context.Context, name string) (u.Key, erro } // ok sig checks out. this is a valid name. - return u.Key(entry.GetValue()), nil + + // check for old style record: + valh, err := mh.Cast(entry.GetValue()) + if err != nil { + // Not a multihash, probably a new record + return path.ParsePath(string(entry.GetValue())) + } else { + // Its an old style multihash record + log.Warning("Detected old style multihash record") + return path.FromKey(u.Key(valh)), nil + } } From 7ffec5aeddb572dd13e1ca3967fdb344e0ff4e56 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 23 Apr 2015 22:02:33 -0700 Subject: [PATCH 0746/3147] address comments from CR This commit was moved from ipfs/go-path@10ad47cafa603f87bb3032ecb94c41f6397384f1 --- path/path.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 15c1b45911..0ab15e5c96 100644 --- a/path/path.go +++ b/path/path.go @@ -44,12 +44,12 @@ func (p Path) String() string { return string(p) } -func FromSegments(seg ...string) Path { +func FromSegments(seg ...string) (Path, error) { var pref string if seg[0] == "ipfs" || seg[0] == "ipns" { pref = "/" } - return Path(pref + strings.Join(seg, "/")) + return ParsePath(pref + strings.Join(seg, "/")) } func ParsePath(txt string) (Path, error) { From 26b0be009e435d1d62f5ea1619a88fd6429e3f40 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 28 Apr 2015 12:33:02 +0200 Subject: [PATCH 0747/3147] godeps: move (go)goprotobuf to github location This commit was moved from ipfs/go-unixfs@0f1dc11a77774130c6be8b72da2a89817157e193 --- unixfs/format.go | 2 +- unixfs/format_test.go | 3 ++- unixfs/io/dagreader.go | 3 ++- unixfs/mod/dagmodifier.go | 2 +- unixfs/pb/unixfs.pb.go | 2 +- unixfs/tar/reader.go | 4 ++-- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index 21ba46f741..b8c0abeb18 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -5,7 +5,7 @@ package unixfs import ( "errors" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" pb "github.com/ipfs/go-ipfs/unixfs/pb" ) diff --git a/unixfs/format_test.go b/unixfs/format_test.go index 4d41755454..f178b5615e 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -3,7 +3,8 @@ package unixfs import ( "testing" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + pb "github.com/ipfs/go-ipfs/unixfs/pb" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 2f33d337f0..def8c15018 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -7,8 +7,9 @@ import ( "io" "os" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 90118559b7..6cca0c0079 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -7,7 +7,7 @@ import ( "os" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index aac37040e8..c11ffd4d03 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 405a0eb187..20e18fe114 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -8,13 +8,13 @@ import ( gopath "path" "time" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + mdag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ) type Reader struct { From a87156067cb9a31e34985ec87837d4f7fc9cefe7 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 28 Apr 2015 12:33:02 +0200 Subject: [PATCH 0748/3147] godeps: move (go)goprotobuf to github location This commit was moved from ipfs/go-ipfs-routing@ca42d82f2660f846bee3bd03c8774aa64120b3b3 --- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/ext_test.go | 10 +++++----- routing/dht/handlers.go | 2 +- routing/dht/pb/dht.pb.go | 6 ++---- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 3 ++- routing/supernode/proxy/loopback.go | 3 ++- routing/supernode/proxy/standard.go | 5 +++-- routing/supernode/server.go | 3 ++- 11 files changed, 21 insertions(+), 19 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d34f37a565..8c5ceaa612 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -21,7 +21,7 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/eventlog" u "github.com/ipfs/go-ipfs/util" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ctxgroup "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 92fec8ec69..44767fbe48 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -9,7 +9,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" ctxutil "github.com/ipfs/go-ipfs/util/ctx" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index efe62cd7c6..5ac342e3ac 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,6 +7,11 @@ import ( "testing" "time" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + inet "github.com/ipfs/go-ipfs/p2p/net" mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" peer "github.com/ipfs/go-ipfs/p2p/peer" @@ -14,11 +19,6 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 279ac82e4d..5449cad439 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" peer "github.com/ipfs/go-ipfs/p2p/peer" diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 78532e95b8..9a313a8974 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -14,13 +14,11 @@ It has these top-level messages: */ package dht_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" -import json "encoding/json" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" import math "math" -// Reference proto, json, and math imports to suppress error if they are not otherwise used. +// Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal -var _ = &json.SyntaxError{} var _ = math.Inf type Message_MessageType int32 diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 0e5bed248a..a94e0c3c71 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,7 +4,7 @@ import ( "errors" "time" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" diff --git a/routing/record/record.go b/routing/record/record.go index 2d9ab18e29..ae423a1720 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -3,7 +3,7 @@ package record import ( "bytes" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 13f845abe0..15c3a4086b 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -5,8 +5,9 @@ import ( "errors" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 06e91707ce..1437b574a2 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,8 +1,9 @@ package proxy import ( - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 7f4d38faa6..10625f1807 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -3,15 +3,16 @@ package proxy import ( "errors" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + host "github.com/ipfs/go-ipfs/p2p/host" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" - "github.com/ipfs/go-ipfs/util" + util "github.com/ipfs/go-ipfs/util" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index fb077e882c..46205d0e4f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,9 +4,10 @@ import ( "errors" "fmt" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" From 4bc752e36401d1d4c3776648a57590b55b2703a3 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 28 Apr 2015 12:33:02 +0200 Subject: [PATCH 0749/3147] godeps: move (go)goprotobuf to github location This commit was moved from ipfs/go-namesys@a5e860a79458dd35152027c62598d354ae5c7074 --- namesys/internal/pb/namesys.pb.go | 2 +- namesys/publisher.go | 2 +- namesys/routing.go | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/namesys/internal/pb/namesys.pb.go b/namesys/internal/pb/namesys.pb.go index 637d023062..97e25a855a 100644 --- a/namesys/internal/pb/namesys.pb.go +++ b/namesys/internal/pb/namesys.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package namesys_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/namesys/publisher.go b/namesys/publisher.go index 23e15ca715..38dd8d0827 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" dag "github.com/ipfs/go-ipfs/merkledag" diff --git a/namesys/routing.go b/namesys/routing.go index 5e0cf1a968..38cb250d0c 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -3,9 +3,10 @@ package namesys import ( "fmt" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + pb "github.com/ipfs/go-ipfs/namesys/internal/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" From 3defe1d67e3da282e85d76a977f5c4a5ebc04874 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Tue, 28 Apr 2015 16:05:52 -0700 Subject: [PATCH 0750/3147] blocks: Don't re-Put blocks we already have Commit 1192be196b3d0acca2e2dce5ffd5d12a924fdc5a tried to do this, but had a simple mistake. Functions returning `bool, error` pretty much never return `true, anError`, so that branch was never taken. Also fix the partial sentence in the This commit was moved from ipfs/go-ipfs-blockstore@eb50103bfcd9481e75d8452e1ee97ba47c0f0d50 --- blockstore/blockstore.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index ccc7e8fc5c..244d4578a2 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -64,10 +64,11 @@ func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { } func (bs *blockstore) Put(block *blocks.Block) error { - // Has is cheaper than k := block.Key().DsKey() + + // Has is cheaper than Put, so see if we already have it exists, err := bs.datastore.Has(k) - if err != nil && exists { + if err == nil && exists { return nil // already stored. } return bs.datastore.Put(k, block.Data) From 48fd4263b292eb71ea057553e2450e2c91b951ec Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 30 Apr 2015 21:33:43 -0700 Subject: [PATCH 0751/3147] blockservice/worker/bench/main: Add a package comment This commit was moved from ipfs/go-blockservice@7b2d310c2567433daa462c6d8f4e722a88dc4fb8 --- blockservice/worker/bench/main.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/blockservice/worker/bench/main.go b/blockservice/worker/bench/main.go index 82c3dee13a..c23770f788 100644 --- a/blockservice/worker/bench/main.go +++ b/blockservice/worker/bench/main.go @@ -1,3 +1,12 @@ +/* +Benchmark github.com/ipfs/go-ipfs/blockservice/worker. + +Loop over a range of workers and buffer sizes and measure the time it +per block-transfer operation for each value. Run with: + + $ go run "${GOPATH}/src/github.com/ipfs/go-ipfs/blockservice/worker/bench/main.go" +*/ + package main import ( From 6c02420d9e6b8ff06274220b1a8ff6c2bc01eba6 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 1 May 2015 17:33:24 +0200 Subject: [PATCH 0752/3147] core: add context.Context param to core.Resolve() commands/object: remove objectData() and objectLinks() helpers resolver: added context parameters sharness: $HASH carried the \r from the http protocol with sharness: write curl output to individual files http gw: break PUT handler until PR#1191 This commit was moved from ipfs/go-path@992c6a5e7251f2d2b44133ac6afed7c8bff19188 --- path/resolver.go | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 27aa2a0eb7..b24f45f214 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -1,4 +1,4 @@ -// package path implements utilities for resolving paths within ipfs. +// Package path implements utilities for resolving paths within ipfs. package path import ( @@ -7,6 +7,7 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + merkledag "github.com/ipfs/go-ipfs/merkledag" u "github.com/ipfs/go-ipfs/util" ) @@ -57,33 +58,32 @@ func SplitAbsPath(fpath Path) (mh.Multihash, []string, error) { // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. -func (s *Resolver) ResolvePath(fpath Path) (*merkledag.Node, error) { - nodes, err := s.ResolvePathComponents(fpath) +func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (*merkledag.Node, error) { + nodes, err := s.ResolvePathComponents(ctx, fpath) if err != nil || nodes == nil { return nil, err - } else { - return nodes[len(nodes)-1], err } + return nodes[len(nodes)-1], err } // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. -func (s *Resolver) ResolvePathComponents(fpath Path) ([]*merkledag.Node, error) { +func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*merkledag.Node, error) { h, parts, err := SplitAbsPath(fpath) if err != nil { return nil, err } - log.Debug("Resolve dag get.\n") - ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + log.Debug("Resolve dag get.") + ctx, cancel := context.WithTimeout(ctx, time.Minute) defer cancel() nd, err := s.DAG.Get(ctx, u.Key(h)) if err != nil { return nil, err } - return s.ResolveLinks(nd, parts) + return s.ResolveLinks(ctx, nd, parts) } // ResolveLinks iteratively resolves names by walking the link hierarchy. @@ -93,10 +93,9 @@ func (s *Resolver) ResolvePathComponents(fpath Path) ([]*merkledag.Node, error) // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links -func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( - result []*merkledag.Node, err error) { +func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names []string) ([]*merkledag.Node, error) { - result = make([]*merkledag.Node, 0, len(names)+1) + result := make([]*merkledag.Node, 0, len(names)+1) result = append(result, ndd) nd := ndd // dup arg workaround @@ -121,9 +120,9 @@ func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( if nlink.Node == nil { // fetch object for link and assign to nd - ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + ctx, cancel := context.WithTimeout(ctx, time.Minute) defer cancel() - nd, err = s.DAG.Get(ctx, next) + nd, err := s.DAG.Get(ctx, next) if err != nil { return append(result, nd), err } @@ -134,5 +133,5 @@ func (s *Resolver) ResolveLinks(ndd *merkledag.Node, names []string) ( result = append(result, nlink.Node) } - return + return result, nil } From b13a5f9e8c8076ed7eab0f22443ffc8839bde73e Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Fri, 8 May 2015 16:07:01 -0700 Subject: [PATCH 0753/3147] path/resolver: Fix recursive path resolution I'm not entirely clear on Go's scoping (there's some text I can't quite parse here [1]), but it seems like the := version (because this is the first time we use 'err') was masking the function-level 'nd' just for this if block. That means that after we get out of the if block and return to the start of the for-loop for the next pass, nd.Links would still be pointing at the original object's links. This commit drops the :=, which fixes the earlier: $ ipfs ls QmXX7YRpU7nNBKfw75VG7Y1c3GwpSAGHRev67XVPgZFv9R/static/css Error: no link named "css" under QmXX7YRpU7nNBKfw75VG7Y1c3GwpSAGHRev67XVPgZFv9R so we get the intended: $ ipfs ls QmXX7YRpU7nNBKfw75VG7Y1c3GwpSAGHRev67XVPgZFv9R/static/css Qme4r3eA4h1revFBgCEv1HF1U7sLL4vvAyzRLWJhCFhwg2 7051 style.css It also means we're probably missing (or are unreliably using) a multi-level-path-resolving test. [1]: https://golang.org/ref/spec#Declarations_and_scope This commit was moved from ipfs/go-path@05aceed0788e7fae65fd02c20bc0da58dd1376c4 --- path/resolver.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index b24f45f214..a08df87413 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -122,7 +122,8 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names // fetch object for link and assign to nd ctx, cancel := context.WithTimeout(ctx, time.Minute) defer cancel() - nd, err := s.DAG.Get(ctx, next) + var err error + nd, err = s.DAG.Get(ctx, next) if err != nil { return append(result, nd), err } From 4c095e5d63a3ef264aa9de0d34c8be8dd170f46d Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Fri, 8 May 2015 21:43:43 -0700 Subject: [PATCH 0754/3147] path/resolver_test: Test recursive Link resolution Setup a three-level graph: a -(child)-> b -(grandchild)-> c and then try and resolve: /ipfs//child/grandchild Before 10669e8b (path/resolver: Fix recursive path resolution, 2015-05-08) this failed with: resolver_test.go:71: no link named "grandchild" under QmSomeRandomHash The boilerplate for this test is from pin/pin_test.go, and I make no claims that it's the best way to setup the test graph ;). This commit was moved from ipfs/go-path@33a4dc08cc26702e87aba7d81bededa3585d54bb --- path/resolver_test.go | 83 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 path/resolver_test.go diff --git a/path/resolver_test.go b/path/resolver_test.go new file mode 100644 index 0000000000..3772f1b9b8 --- /dev/null +++ b/path/resolver_test.go @@ -0,0 +1,83 @@ +package path_test + +import ( + "fmt" + "testing" + + datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" + blockservice "github.com/ipfs/go-ipfs/blockservice" + offline "github.com/ipfs/go-ipfs/exchange/offline" + merkledag "github.com/ipfs/go-ipfs/merkledag" + path "github.com/ipfs/go-ipfs/path" + util "github.com/ipfs/go-ipfs/util" +) + +func randNode() (*merkledag.Node, util.Key) { + node := new(merkledag.Node) + node.Data = make([]byte, 32) + util.NewTimeSeededRand().Read(node.Data) + k, _ := node.Key() + return node, k +} + +func TestRecurivePathResolution(t *testing.T) { + ctx := context.Background() + dstore := sync.MutexWrap(datastore.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv, err := blockservice.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + + dagService := merkledag.NewDAGService(bserv) + + a, _ := randNode() + b, _ := randNode() + c, cKey := randNode() + + err = b.AddNodeLink("grandchild", c) + if err != nil { + t.Fatal(err) + } + + err = a.AddNodeLink("child", b) + if err != nil { + t.Fatal(err) + } + + err = dagService.AddRecursive(a) + if err != nil { + t.Fatal(err) + } + + aKey, err := a.Key() + if err != nil { + t.Fatal(err) + } + + segments := []string{"", "ipfs", aKey.String(), "child", "grandchild"} + p, err := path.FromSegments(segments...) + if err != nil { + t.Fatal(err) + } + + resolver := &path.Resolver{DAG: dagService} + node, err := resolver.ResolvePath(ctx, p) + if err != nil { + t.Fatal(err) + } + + key, err := node.Key() + if err != nil { + t.Fatal(err) + } + if key.String() != cKey.String() { + t.Fatal(fmt.Errorf( + "recursive path resolution failed for %s: %s != %s", + p.String(), key.String(), cKey.String())) + } +} From 8628c947b07f590c5034d4db3929120280cae8d7 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 9 May 2015 11:49:02 +0200 Subject: [PATCH 0755/3147] unixfs/io: added NewEmptyDirectory() some golinting along the way This commit was moved from ipfs/go-unixfs@ea030b67b3cce7d11ebdd95776c59a7d4d52ca3d --- unixfs/io/dirbuilder.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index b30d9ea3ae..ef74f3de03 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -15,15 +15,22 @@ type directoryBuilder struct { dirnode *mdag.Node } +// NewEmptyDirectory returns an empty merkledag Node with a folder Data chunk +func NewEmptyDirectory() *mdag.Node { + return &mdag.Node{Data: format.FolderPBData()} +} + +// NewDirectory returns a directoryBuilder. It needs a DAGService to add the Children func NewDirectory(dserv mdag.DAGService) *directoryBuilder { db := new(directoryBuilder) db.dserv = dserv - db.dirnode = new(mdag.Node) - db.dirnode.Data = format.FolderPBData() + db.dirnode = NewEmptyDirectory() return db } +// AddChild adds a (name, key)-pair to the root node. func (d *directoryBuilder) AddChild(name string, k u.Key) error { + // TODO(cryptix): consolidate context managment ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) defer cancel() @@ -40,6 +47,7 @@ func (d *directoryBuilder) AddChild(name string, k u.Key) error { return nil } +// GetNode returns the root of this directoryBuilder func (d *directoryBuilder) GetNode() *mdag.Node { return d.dirnode } From 2d48da1392b2a5851743f6e2ab6bc35ede1732d3 Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 19 May 2015 00:42:21 +0700 Subject: [PATCH 0756/3147] Run 'gofmt -s -w' on these files This commit was moved from ipfs/go-unixfs@36d50ca7f58037286a9a9c5f664f2f6b8a6aedb4 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 6cca0c0079..e0e09f7115 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -95,7 +95,7 @@ func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) { type zeroReader struct{} func (zr zeroReader) Read(b []byte) (int, error) { - for i, _ := range b { + for i := range b { b[i] = 0 } return len(b), nil From e8bd35c95f9f35b6af6e0a39c60081e6aa5ee53d Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 19 May 2015 00:42:21 +0700 Subject: [PATCH 0757/3147] Run 'gofmt -s -w' on these files This commit was moved from ipfs/go-ipfs-routing@c56a25e2dc4611d0b9bd4c9c8395dc5b01aee027 --- routing/dht/dht_test.go | 6 +++--- routing/dht/providers.go | 2 +- routing/keyspace/xor_test.go | 30 +++++++++++++++--------------- routing/supernode/client.go | 2 +- routing/supernode/server.go | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index fdd334d593..29b57816f9 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -215,7 +215,7 @@ func TestProvides(t *testing.T) { } } - for k, _ := range testCaseValues { + for k := range testCaseValues { log.Debugf("announcing provider for %s", k) if err := dhts[3].Provide(ctx, k); err != nil { t.Fatal(err) @@ -226,7 +226,7 @@ func TestProvides(t *testing.T) { time.Sleep(time.Millisecond * 6) n := 0 - for k, _ := range testCaseValues { + for k := range testCaseValues { n = (n + 1) % 3 log.Debugf("getting providers for %s from %d", k, n) @@ -521,7 +521,7 @@ func TestProvidesMany(t *testing.T) { } } - for k, _ := range testCaseValues { + for k := range testCaseValues { // everyone should be able to find it... for _, dht := range dhts { log.Debugf("getting providers for %s at %s", k, dht.self) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index c62aee97c4..e803398be8 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -77,7 +77,7 @@ func (pm *ProviderManager) run() { case lc := <-pm.getlocal: var keys []u.Key - for k, _ := range pm.local { + for k := range pm.local { keys = append(keys, k) } lc <- keys diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go index f90e8a5f9c..cac274278a 100644 --- a/routing/keyspace/xor_test.go +++ b/routing/keyspace/xor_test.go @@ -10,9 +10,9 @@ import ( func TestPrefixLen(t *testing.T) { cases := [][]byte{ - []byte{0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x58, 0xFF, 0x80, 0x00, 0x00, 0xF0}, + {0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x58, 0xFF, 0x80, 0x00, 0x00, 0xF0}, } lens := []int{24, 56, 9} @@ -28,15 +28,15 @@ func TestPrefixLen(t *testing.T) { func TestXorKeySpace(t *testing.T) { ids := [][]byte{ - []byte{0xFF, 0xFF, 0xFF, 0xFF}, - []byte{0x00, 0x00, 0x00, 0x00}, - []byte{0xFF, 0xFF, 0xFF, 0xF0}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0x00, 0x00, 0x00, 0x00}, + {0xFF, 0xFF, 0xFF, 0xF0}, } ks := [][2]Key{ - [2]Key{XORKeySpace.Key(ids[0]), XORKeySpace.Key(ids[0])}, - [2]Key{XORKeySpace.Key(ids[1]), XORKeySpace.Key(ids[1])}, - [2]Key{XORKeySpace.Key(ids[2]), XORKeySpace.Key(ids[2])}, + {XORKeySpace.Key(ids[0]), XORKeySpace.Key(ids[0])}, + {XORKeySpace.Key(ids[1]), XORKeySpace.Key(ids[1])}, + {XORKeySpace.Key(ids[2]), XORKeySpace.Key(ids[2])}, } for i, set := range ks { @@ -75,12 +75,12 @@ func TestXorKeySpace(t *testing.T) { func TestDistancesAndCenterSorting(t *testing.T) { adjs := [][]byte{ - []byte{173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, - []byte{223, 63, 97, 152, 4, 169, 47, 219, 64, 87, 25, 45, 196, 61, 215, 72, 234, 119, 138, 220, 82, 188, 73, 140, 232, 5, 36, 192, 20, 184, 17, 25}, - []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, - []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, - []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 126}, - []byte{73, 0, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + {173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, + {223, 63, 97, 152, 4, 169, 47, 219, 64, 87, 25, 45, 196, 61, 215, 72, 234, 119, 138, 220, 82, 188, 73, 140, 232, 5, 36, 192, 20, 184, 17, 25}, + {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 126}, + {73, 0, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, } keys := make([]Key, len(adjs)) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 15c3a4086b..14f6a4db58 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -86,7 +86,7 @@ func (c *Client) Provide(ctx context.Context, k u.Key) error { msg := pb.NewMessage(pb.Message_ADD_PROVIDER, string(k), 0) // FIXME how is connectedness defined for the local node pri := []pb.PeerRoutingInfo{ - pb.PeerRoutingInfo{ + { PeerInfo: peer.PeerInfo{ ID: c.local, Addrs: c.peerhost.Addrs(), diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 46205d0e4f..95d6a0def4 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -73,7 +73,7 @@ func (s *Server) handleMessage( case dhtpb.Message_FIND_NODE: p := s.peerstore.PeerInfo(peer.ID(req.GetKey())) pri := []dhtpb.PeerRoutingInfo{ - dhtpb.PeerRoutingInfo{ + { PeerInfo: p, // Connectedness: TODO }, From b59382894c68c37800c27e5b13108022d3a0d2b2 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 7 May 2015 15:08:09 -0700 Subject: [PATCH 0758/3147] namesys/publisher: Drop the 'namesys: ' prefix for the Publish log This is already handled by setup in namesys/routing.go: var log = u.Logger("namesys") This commit was moved from ipfs/go-namesys@76cbab47fcb3cbd5190a5995b40a2c141341da9b --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 38dd8d0827..b20a47bea5 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -42,7 +42,7 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { // Publish implements Publisher. Accepts a keypair and a value, // and publishes it out to the routing system func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { - log.Debugf("namesys: Publish %s", value) + log.Debugf("Publish %s", value) data, err := createRoutingEntryData(k, value) if err != nil { From ee29b9ba2c23007d498b666f622287156e406778 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sun, 17 May 2015 11:49:30 -0700 Subject: [PATCH 0759/3147] namesys/interface: Expand package docs to discuss mutable names What they are, why you'd use them, and which command-line tools you can use to access this functionality. This commit was moved from ipfs/go-namesys@01e04b16ce4975312cd999806a4e6ddb9590d013 --- namesys/interface.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/namesys/interface.go b/namesys/interface.go index 4ceb3b9d96..74f6861289 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -1,4 +1,32 @@ -// package namesys implements various functionality for the ipns naming system. +/* +Package namesys implements resolvers and publishers for the IPFS +naming system (IPNS). + +The core of IPFS is an immutable, content-addressable Merkle graph. +That works well for many use cases, but doesn't allow you to answer +questions like "what is Alice's current homepage?". The mutable name +system allows Alice to publish information like: + + The current homepage for alice.example.com is + /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj + +or: + + The current homepage for node + QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy + is + /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj + +The mutable name system also allows users to resolve those references +to find the immutable IPFS object currently referenced by a given +mutable name. + +For command-line bindings to this functionality, see: + + ipfs name + ipfs dns + ipfs resolve +*/ package namesys import ( From 0f7117854c9c92674c08277c25e59c56daad7ff6 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sat, 16 May 2015 09:34:08 -0700 Subject: [PATCH 0760/3147] namesys/dns: Use SplitN to find dnslink references RFC 6763 requires printable ASCII except '=' for the key [1], but allows any character including '=' in the value [2]. This patch adjusts our parsing to avoid splitting on '=' in the value, and then ignoring anything after that split. [1]: https://tools.ietf.org/html/rfc6763#section-6.4 [2]: https://tools.ietf.org/html/rfc6763#section-6.5 This commit was moved from ipfs/go-namesys@79909f40b3b7295b3a353f0f4a3f59e65a801dc4 --- namesys/dns.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 086adee9ee..3e703d4205 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -52,10 +52,10 @@ func parseEntry(txt string) (path.Path, error) { } func tryParseDnsLink(txt string) (path.Path, error) { - parts := strings.Split(txt, "=") - if len(parts) == 1 || parts[0] != "dnslink" { - return "", errors.New("not a valid dnslink entry") + parts := strings.SplitN(txt, "=", 2) + if len(parts) == 2 && parts[0] == "dnslink" { + return path.ParsePath(parts[1]) } - return path.ParsePath(parts[1]) + return "", errors.New("not a valid dnslink entry") } From a50c1dad42e2dab5f086ab359237d9c5c8ec0120 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 7 May 2015 14:31:14 -0700 Subject: [PATCH 0761/3147] namesys: Add recursive resolution This allows direct access to the earlier protocol-specific Resolve implementations. The guts of each protocol-specific resolver are in the internal resolveOnce method, and we've added a new: ResolveN(ctx, name, depth) method to the public interface. There's also: Resolve(ctx, name) which wraps ResolveN using DefaultDepthLimit. The extra API endpoint is intended to reduce the likelyhood of clients accidentally calling the more dangerous ResolveN with a nonsensically high or infinite depth. On IRC on 2015-05-17, Juan said: 15:34 If 90% of uses is the reduced API with no chance to screw it up, that's a huge win. 15:34 Why would those 90% not just set depth=0 or depth=1, depending on which they need? 15:34 Because people will start writing `r.Resolve(ctx, name, d)` where d is a variable. 15:35 And then accidentally set that variable to some huge number? 15:35 Grom experience, i've seen this happen _dozens_ of times. people screw trivial things up. 15:35 Why won't those same people be using ResolveN? 15:36 Because almost every example they see will tell them to use Resolve(), and they will mostly stay away from ResolveN. The per-prodocol versions also resolve recursively within their protocol. For example: DNSResolver.Resolve(ctx, "ipfs.io", 0) will recursively resolve DNS links until the referenced value is no longer a DNS link. I also renamed the multi-protocol ipfs NameSystem (defined in namesys/namesys.go) to 'mpns' (for Multi-Protocol Name System), because I wasn't clear on whether IPNS applied to the whole system or just to to the DHT-based system. The new name is unambiguously multi-protocol, which is good. It would be nice to have a distinct name for the DHT-based link system. Now that resolver output is always prefixed with a namespace and unprefixed mpns resolver input is interpreted as /ipfs/, core/corehttp/ipns_hostname.go can dispense with it's old manual /ipfs/ injection. Now that the Resolver interface handles recursion, we don't need the resolveRecurse helper in core/pathresolver.go. The pathresolver cleanup also called for an adjustment to FromSegments to more easily get slash-prefixed paths. Now that recursive resolution with the namesys/namesys.go composite resolver always gets you to an /ipfs/... path, there's no need for the /ipns/ special case in fuse/ipns/ipns_unix.go. Now that DNS links can be things other than /ipfs/ or DHT-link references (e.g. they could be /ipns/ references) I've also loosened the ParsePath logic to only attempt multihash validation on IPFS paths. It checks to ensure that other paths have a known-protocol prefix, but otherwise leaves them alone. I also changed some key-stringification from .Pretty() to .String() following the potential deprecation mentioned in util/key.go. This commit was moved from ipfs/go-namesys@41bdb138ff766cae2ef467c2c9743e420c279a79 --- namesys/base.go | 54 +++++++++++++++++++++++++++++++ namesys/dns.go | 23 ++++++++++---- namesys/interface.go | 40 +++++++++++++++++++++-- namesys/namesys.go | 76 +++++++++++++++++++++++++++++--------------- namesys/proquint.go | 20 +++++++----- namesys/routing.go | 25 +++++++++++---- 6 files changed, 188 insertions(+), 50 deletions(-) create mode 100644 namesys/base.go diff --git a/namesys/base.go b/namesys/base.go new file mode 100644 index 0000000000..e552fce464 --- /dev/null +++ b/namesys/base.go @@ -0,0 +1,54 @@ +package namesys + +import ( + "strings" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + path "github.com/ipfs/go-ipfs/path" +) + +type resolver interface { + // resolveOnce looks up a name once (without recursion). + resolveOnce(ctx context.Context, name string) (value path.Path, err error) +} + +// resolve is a helper for implementing Resolver.ResolveN using resolveOnce. +func resolve(ctx context.Context, r resolver, name string, depth int, prefixes ...string) (path.Path, error) { + for { + p, err := r.resolveOnce(ctx, name) + if err != nil { + log.Warningf("Could not resolve %s", name) + return "", err + } + log.Debugf("Resolved %s to %s", name, p.String()) + + if strings.HasPrefix(p.String(), "/ipfs/") { + // we've bottomed out with an IPFS path + return p, nil + } + + if depth == 1 { + return p, ErrResolveRecursion + } + + matched := false + for _, prefix := range prefixes { + if strings.HasPrefix(p.String(), prefix) { + matched = true + if len(prefixes) == 1 { + name = strings.TrimPrefix(p.String(), prefix) + } + break + } + } + + if !matched { + return p, nil + } + + if depth > 1 { + depth-- + } + } +} diff --git a/namesys/dns.go b/namesys/dns.go index 3e703d4205..f57ddce590 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -17,16 +17,25 @@ type DNSResolver struct { // cache would need a timeout } -// CanResolve implements Resolver -func (r *DNSResolver) CanResolve(name string) bool { - return isd.IsDomain(name) +// Resolve implements Resolver. +func (r *DNSResolver) Resolve(ctx context.Context, name string) (path.Path, error) { + return r.ResolveN(ctx, name, DefaultDepthLimit) +} + +// ResolveN implements Resolver. +func (r *DNSResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { + return resolve(ctx, r, name, depth, "/ipns/") } -// Resolve implements Resolver +// resolveOnce implements resolver. // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) Resolve(ctx context.Context, name string) (path.Path, error) { - log.Info("DNSResolver resolving %v", name) +func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { + if !isd.IsDomain(name) { + return "", errors.New("not a valid domain name") + } + + log.Infof("DNSResolver resolving %s", name) txt, err := net.LookupTXT(name) if err != nil { return "", err @@ -43,7 +52,7 @@ func (r *DNSResolver) Resolve(ctx context.Context, name string) (path.Path, erro } func parseEntry(txt string) (path.Path, error) { - p, err := path.ParseKeyToPath(txt) + p, err := path.ParseKeyToPath(txt) // bare IPFS multihashes if err == nil { return p, nil } diff --git a/namesys/interface.go b/namesys/interface.go index 74f6861289..5903c78a39 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -37,9 +37,24 @@ import ( path "github.com/ipfs/go-ipfs/path" ) +const ( + // DefaultDepthLimit is the default depth limit used by Resolve. + DefaultDepthLimit = 32 + + // UnlimitedDepth allows infinite recursion in ResolveN. You + // probably don't want to use this, but it's here if you absolutely + // trust resolution to eventually complete and can't put an upper + // limit on how many steps it will take. + UnlimitedDepth = 0 +) + // ErrResolveFailed signals an error when attempting to resolve. var ErrResolveFailed = errors.New("could not resolve name.") +// ErrResolveRecursion signals a recursion-depth limit. +var ErrResolveRecursion = errors.New( + "could not resolve name (recursion limit exceeded).") + // ErrPublishFailed signals an error when attempting to publish. var ErrPublishFailed = errors.New("could not publish name.") @@ -58,11 +73,30 @@ type NameSystem interface { // Resolver is an object capable of resolving names. type Resolver interface { - // Resolve looks up a name, and returns the value previously published. + // Resolve performs a recursive lookup, returning the dereferenced + // path. For example, if ipfs.io has a DNS TXT record pointing to + // /ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy + // and there is a DHT IPNS entry for + // QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy + // -> /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj + // then + // Resolve(ctx, "/ipns/ipfs.io") + // will resolve both names, returning + // /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj + // + // There is a default depth-limit to avoid infinite recursion. Most + // users will be fine with this default limit, but if you need to + // adjust the limit you can use ResolveN. Resolve(ctx context.Context, name string) (value path.Path, err error) - // CanResolve checks whether this Resolver can resolve a name - CanResolve(name string) bool + // ResolveN performs a recursive lookup, returning the dereferenced + // path. The only difference from Resolve is that the depth limit + // is configurable. You can use DefaultDepthLimit, UnlimitedDepth, + // or a depth limit of your own choosing. + // + // Most users should use Resolve, since the default limit works well + // in most real-world situations. + ResolveN(ctx context.Context, name string, depth int) (value path.Path, err error) } // Publisher is an object capable of publishing particular names. diff --git a/namesys/namesys.go b/namesys/namesys.go index 6553077239..0f5b853bea 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,59 +1,83 @@ package namesys import ( + "strings" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" ) -// ipnsNameSystem implements IPNS naming. +// mpns (a multi-protocol NameSystem) implements generic IPFS naming. // -// Uses three Resolvers: +// Uses several Resolvers: // (a) ipfs routing naming: SFS-like PKI names. // (b) dns domains: resolves using links in DNS TXT records // (c) proquints: interprets string as the raw byte data. // // It can only publish to: (a) ipfs routing naming. // -type ipns struct { - resolvers []Resolver - publisher Publisher +type mpns struct { + resolvers map[string]resolver + publishers map[string]Publisher } // NewNameSystem will construct the IPFS naming system based on Routing func NewNameSystem(r routing.IpfsRouting) NameSystem { - return &ipns{ - resolvers: []Resolver{ - new(DNSResolver), - new(ProquintResolver), - NewRoutingResolver(r), + return &mpns{ + resolvers: map[string]resolver{ + "dns": new(DNSResolver), + "proquint": new(ProquintResolver), + "dht": newRoutingResolver(r), + }, + publishers: map[string]Publisher{ + "/ipns/": NewRoutingPublisher(r), }, - publisher: NewRoutingPublisher(r), } } -// Resolve implements Resolver -func (ns *ipns) Resolve(ctx context.Context, name string) (path.Path, error) { - for _, r := range ns.resolvers { - if r.CanResolve(name) { - return r.Resolve(ctx, name) - } +// Resolve implements Resolver. +func (ns *mpns) Resolve(ctx context.Context, name string) (path.Path, error) { + return ns.ResolveN(ctx, name, DefaultDepthLimit) +} + +// ResolveN implements Resolver. +func (ns *mpns) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { + if strings.HasPrefix(name, "/ipfs/") { + return path.ParsePath(name) } - return "", ErrResolveFailed + + if !strings.HasPrefix(name, "/") { + return path.ParsePath("/ipfs/" + name) + } + + return resolve(ctx, ns, name, depth, "/ipns/") } -// CanResolve implements Resolver -func (ns *ipns) CanResolve(name string) bool { - for _, r := range ns.resolvers { - if r.CanResolve(name) { - return true +// resolveOnce implements resolver. +func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) { + if !strings.HasPrefix(name, "/ipns/") { + name = "/ipns/" + name + } + segments := strings.SplitN(name, "/", 3) + if len(segments) < 3 || segments[0] != "" { + log.Warningf("Invalid name syntax for %s", name) + return "", ErrResolveFailed + } + + for protocol, resolver := range ns.resolvers { + log.Debugf("Attempting to resolve %s with %s", name, protocol) + p, err := resolver.resolveOnce(ctx, segments[2]) + if err == nil { + return p, err } } - return false + log.Warningf("No resolver found for %s", name) + return "", ErrResolveFailed } // Publish implements Publisher -func (ns *ipns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { - return ns.publisher.Publish(ctx, name, value) +func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { + return ns.publishers["/ipns/"].Publish(ctx, name, value) } diff --git a/namesys/proquint.go b/namesys/proquint.go index 66bd54e242..2ad3275a4a 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -10,16 +10,20 @@ import ( type ProquintResolver struct{} -// CanResolve implements Resolver. Checks whether the name is a proquint string. -func (r *ProquintResolver) CanResolve(name string) bool { - ok, err := proquint.IsProquint(name) - return err == nil && ok +// Resolve implements Resolver. +func (r *ProquintResolver) Resolve(ctx context.Context, name string) (path.Path, error) { + return r.ResolveN(ctx, name, DefaultDepthLimit) } -// Resolve implements Resolver. Decodes the proquint string. -func (r *ProquintResolver) Resolve(ctx context.Context, name string) (path.Path, error) { - ok := r.CanResolve(name) - if !ok { +// ResolveN implements Resolver. +func (r *ProquintResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { + return resolve(ctx, r, name, depth, "/ipns/") +} + +// resolveOnce implements resolver. Decodes the proquint string. +func (r *ProquintResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { + ok, err := proquint.IsProquint(name) + if err != nil || !ok { return "", errors.New("not a valid proquint string") } return path.FromString(string(proquint.Decode(name))), nil diff --git a/namesys/routing.go b/namesys/routing.go index 38cb250d0c..290c06cb2f 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -30,15 +30,28 @@ func NewRoutingResolver(route routing.IpfsRouting) Resolver { return &routingResolver{routing: route} } -// CanResolve implements Resolver. Checks whether name is a b58 encoded string. -func (r *routingResolver) CanResolve(name string) bool { - _, err := mh.FromB58String(name) - return err == nil +// newRoutingResolver returns a resolver instead of a Resolver. +func newRoutingResolver(route routing.IpfsRouting) resolver { + if route == nil { + panic("attempt to create resolver with nil routing system") + } + + return &routingResolver{routing: route} } -// Resolve implements Resolver. Uses the IPFS routing system to resolve SFS-like -// names. +// Resolve implements Resolver. func (r *routingResolver) Resolve(ctx context.Context, name string) (path.Path, error) { + return r.ResolveN(ctx, name, DefaultDepthLimit) +} + +// ResolveN implements Resolver. +func (r *routingResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { + return resolve(ctx, r, name, depth, "/ipns/") +} + +// resolveOnce implements resolver. Uses the IPFS routing system to +// resolve SFS-like names. +func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { log.Debugf("RoutingResolve: '%s'", name) hash, err := mh.FromB58String(name) if err != nil { From e5694c4b5433824ed6b0da95bd8333f7fc05e464 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 7 May 2015 14:31:14 -0700 Subject: [PATCH 0762/3147] namesys: Add recursive resolution This allows direct access to the earlier protocol-specific Resolve implementations. The guts of each protocol-specific resolver are in the internal resolveOnce method, and we've added a new: ResolveN(ctx, name, depth) method to the public interface. There's also: Resolve(ctx, name) which wraps ResolveN using DefaultDepthLimit. The extra API endpoint is intended to reduce the likelyhood of clients accidentally calling the more dangerous ResolveN with a nonsensically high or infinite depth. On IRC on 2015-05-17, Juan said: 15:34 If 90% of uses is the reduced API with no chance to screw it up, that's a huge win. 15:34 Why would those 90% not just set depth=0 or depth=1, depending on which they need? 15:34 Because people will start writing `r.Resolve(ctx, name, d)` where d is a variable. 15:35 And then accidentally set that variable to some huge number? 15:35 Grom experience, i've seen this happen _dozens_ of times. people screw trivial things up. 15:35 Why won't those same people be using ResolveN? 15:36 Because almost every example they see will tell them to use Resolve(), and they will mostly stay away from ResolveN. The per-prodocol versions also resolve recursively within their protocol. For example: DNSResolver.Resolve(ctx, "ipfs.io", 0) will recursively resolve DNS links until the referenced value is no longer a DNS link. I also renamed the multi-protocol ipfs NameSystem (defined in namesys/namesys.go) to 'mpns' (for Multi-Protocol Name System), because I wasn't clear on whether IPNS applied to the whole system or just to to the DHT-based system. The new name is unambiguously multi-protocol, which is good. It would be nice to have a distinct name for the DHT-based link system. Now that resolver output is always prefixed with a namespace and unprefixed mpns resolver input is interpreted as /ipfs/, core/corehttp/ipns_hostname.go can dispense with it's old manual /ipfs/ injection. Now that the Resolver interface handles recursion, we don't need the resolveRecurse helper in core/pathresolver.go. The pathresolver cleanup also called for an adjustment to FromSegments to more easily get slash-prefixed paths. Now that recursive resolution with the namesys/namesys.go composite resolver always gets you to an /ipfs/... path, there's no need for the /ipns/ special case in fuse/ipns/ipns_unix.go. Now that DNS links can be things other than /ipfs/ or DHT-link references (e.g. they could be /ipns/ references) I've also loosened the ParsePath logic to only attempt multihash validation on IPFS paths. It checks to ensure that other paths have a known-protocol prefix, but otherwise leaves them alone. I also changed some key-stringification from .Pretty() to .String() following the potential deprecation mentioned in util/key.go. This commit was moved from ipfs/go-path@461b0414442036b3dd195e363edfd2937ad05476 --- path/path.go | 20 ++++++++------------ path/resolver_test.go | 4 ++-- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/path/path.go b/path/path.go index 0ab15e5c96..ba75810c86 100644 --- a/path/path.go +++ b/path/path.go @@ -44,12 +44,8 @@ func (p Path) String() string { return string(p) } -func FromSegments(seg ...string) (Path, error) { - var pref string - if seg[0] == "ipfs" || seg[0] == "ipns" { - pref = "/" - } - return ParsePath(pref + strings.Join(seg, "/")) +func FromSegments(prefix string, seg ...string) (Path, error) { + return ParsePath(prefix + strings.Join(seg, "/")) } func ParsePath(txt string) (Path, error) { @@ -68,15 +64,15 @@ func ParsePath(txt string) (Path, error) { return "", ErrBadPath } - if parts[1] != "ipfs" && parts[1] != "ipns" { + if parts[1] == "ipfs" { + _, err := ParseKeyToPath(parts[2]) + if err != nil { + return "", err + } + } else if parts[1] != "ipns" { return "", ErrBadPath } - _, err := ParseKeyToPath(parts[2]) - if err != nil { - return "", err - } - return Path(txt), nil } diff --git a/path/resolver_test.go b/path/resolver_test.go index 3772f1b9b8..88fcb74337 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -59,8 +59,8 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - segments := []string{"", "ipfs", aKey.String(), "child", "grandchild"} - p, err := path.FromSegments(segments...) + segments := []string{aKey.String(), "child", "grandchild"} + p, err := path.FromSegments("/ipfs/", segments...) if err != nil { t.Fatal(err) } From eba868f22897333cb1e634c57fe3e7707c7448f1 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sat, 16 May 2015 09:33:22 -0700 Subject: [PATCH 0763/3147] namesys/dns: Pluggable lookupTXT field So we can attach a mock lookup function for testing. This commit was moved from ipfs/go-namesys@3e0d4ad3e1e0960210a3010e6dfec93c40758269 --- namesys/dns.go | 16 +++++++++++++++- namesys/namesys.go | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index f57ddce590..3703bd8d01 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -11,12 +11,26 @@ import ( path "github.com/ipfs/go-ipfs/path" ) +type LookupTXTFunc func(name string) (txt []string, err error) + // DNSResolver implements a Resolver on DNS domains type DNSResolver struct { + lookupTXT LookupTXTFunc // TODO: maybe some sort of caching? // cache would need a timeout } +// NewDNSResolver constructs a name resolver using DNS TXT records. +func NewDNSResolver() Resolver { + return &DNSResolver{lookupTXT: net.LookupTXT} +} + +// newDNSResolver constructs a name resolver using DNS TXT records, +// returning a resolver instead of NewDNSResolver's Resolver. +func newDNSResolver() resolver { + return &DNSResolver{lookupTXT: net.LookupTXT} +} + // Resolve implements Resolver. func (r *DNSResolver) Resolve(ctx context.Context, name string) (path.Path, error) { return r.ResolveN(ctx, name, DefaultDepthLimit) @@ -36,7 +50,7 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, } log.Infof("DNSResolver resolving %s", name) - txt, err := net.LookupTXT(name) + txt, err := r.lookupTXT(name) if err != nil { return "", err } diff --git a/namesys/namesys.go b/namesys/namesys.go index 0f5b853bea..7fe317b669 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -27,7 +27,7 @@ type mpns struct { func NewNameSystem(r routing.IpfsRouting) NameSystem { return &mpns{ resolvers: map[string]resolver{ - "dns": new(DNSResolver), + "dns": newDNSResolver(), "proquint": new(ProquintResolver), "dht": newRoutingResolver(r), }, From ac419d2ac93fb5206f0aa6cf0b8984ee69bdceb1 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Sat, 16 May 2015 09:54:06 -0700 Subject: [PATCH 0764/3147] namesys/dns_test: Add DNS resolution tests with a mock resolver This commit was moved from ipfs/go-namesys@949935808ae36f987d61f021106802decab41a76 --- namesys/dns_test.go | 86 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 402156addc..6bb75ff9f5 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -1,9 +1,24 @@ package namesys import ( + "fmt" "testing" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) +type mockDNS struct { + entries map[string][]string +} + +func (m *mockDNS) lookupTXT(name string) (txt []string, err error) { + txt, ok := m.entries[name] + if !ok { + return nil, fmt.Errorf("No TXT entry for %s", name) + } + return txt, nil +} + func TestDnsEntryParsing(t *testing.T) { goodEntries := []string{ "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", @@ -40,3 +55,74 @@ func TestDnsEntryParsing(t *testing.T) { } } } + +func newMockDNS() *mockDNS { + return &mockDNS{ + entries: map[string][]string{ + "multihash.example.com": []string{ + "dnslink=QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + }, + "ipfs.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + }, + "dns1.example.com": []string{ + "dnslink=/ipns/ipfs.example.com", + }, + "dns2.example.com": []string{ + "dnslink=/ipns/dns1.example.com", + }, + "multi.example.com": []string{ + "some stuff", + "dnslink=/ipns/dns1.example.com", + "masked dnslink=/ipns/example.invalid", + }, + "equals.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", + }, + "loop1.example.com": []string{ + "dnslink=/ipns/loop2.example.com", + }, + "loop2.example.com": []string{ + "dnslink=/ipns/loop1.example.com", + }, + "bad.example.com": []string{ + "dnslink=", + }, + }, + } +} + +func testResolution(t *testing.T, resolver Resolver, name string, depth int, expected string, expError error) { + p, err := resolver.ResolveN(context.Background(), name, depth) + if err != expError { + t.Fatal(fmt.Errorf( + "Expected %s with a depth of %d to have a '%s' error, but got '%s'", + name, depth, expError, err)) + } + if p.String() != expected { + t.Fatal(fmt.Errorf( + "%s with depth %d resolved to %s != %s", + name, depth, p.String(), expected)) + } +} + +func TestDNSResolution(t *testing.T) { + mock := newMockDNS() + r := &DNSResolver{lookupTXT: mock.lookupTXT} + testResolution(t, r, "multihash.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "ipfs.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "dns1.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "dns1.example.com", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) + testResolution(t, r, "dns2.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "dns2.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion) + testResolution(t, r, "dns2.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion) + testResolution(t, r, "multi.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "multi.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion) + testResolution(t, r, "multi.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion) + testResolution(t, r, "equals.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", nil) + testResolution(t, r, "loop1.example.com", 1, "/ipns/loop2.example.com", ErrResolveRecursion) + testResolution(t, r, "loop1.example.com", 2, "/ipns/loop1.example.com", ErrResolveRecursion) + testResolution(t, r, "loop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion) + testResolution(t, r, "loop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) + testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed) +} From 5fa31613ca74402163530b126f2673875d505305 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Tue, 19 May 2015 12:48:32 -0700 Subject: [PATCH 0765/3147] namesys/namesys_test: Excercise mpns.ResolveN Shifting the generic testResolution helper from the protocol-specific dns_test.go to the generic namesys_test.go. This commit was moved from ipfs/go-namesys@58d3f58507989276b86cb888b332094a2791fdaf --- namesys/dns_test.go | 16 ---------- namesys/namesys_test.go | 71 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 namesys/namesys_test.go diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 6bb75ff9f5..40bf702c35 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -3,8 +3,6 @@ package namesys import ( "fmt" "testing" - - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) type mockDNS struct { @@ -92,20 +90,6 @@ func newMockDNS() *mockDNS { } } -func testResolution(t *testing.T, resolver Resolver, name string, depth int, expected string, expError error) { - p, err := resolver.ResolveN(context.Background(), name, depth) - if err != expError { - t.Fatal(fmt.Errorf( - "Expected %s with a depth of %d to have a '%s' error, but got '%s'", - name, depth, expError, err)) - } - if p.String() != expected { - t.Fatal(fmt.Errorf( - "%s with depth %d resolved to %s != %s", - name, depth, p.String(), expected)) - } -} - func TestDNSResolution(t *testing.T) { mock := newMockDNS() r := &DNSResolver{lookupTXT: mock.lookupTXT} diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go new file mode 100644 index 0000000000..256228c3e6 --- /dev/null +++ b/namesys/namesys_test.go @@ -0,0 +1,71 @@ +package namesys + +import ( + "fmt" + "testing" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + path "github.com/ipfs/go-ipfs/path" +) + +type mockResolver struct { + entries map[string]string +} + +func testResolution(t *testing.T, resolver Resolver, name string, depth int, expected string, expError error) { + p, err := resolver.ResolveN(context.Background(), name, depth) + if err != expError { + t.Fatal(fmt.Errorf( + "Expected %s with a depth of %d to have a '%s' error, but got '%s'", + name, depth, expError, err)) + } + if p.String() != expected { + t.Fatal(fmt.Errorf( + "%s with depth %d resolved to %s != %s", + name, depth, p.String(), expected)) + } +} + +func (r *mockResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { + return path.ParsePath(r.entries[name]) +} + +func mockResolverOne() *mockResolver { + return &mockResolver{ + entries: map[string]string{ + "QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy": "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", + "QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n": "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", + "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD": "/ipns/ipfs.io", + }, + } +} + +func mockResolverTwo() *mockResolver { + return &mockResolver{ + entries: map[string]string{ + "ipfs.io": "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", + }, + } +} + +func TestNamesysResolution(t *testing.T) { + r := &mpns{ + resolvers: map[string]resolver{ + "one": mockResolverOne(), + "two": mockResolverTwo(), + }, + } + + testResolution(t, r, "Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", 1, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) + testResolution(t, r, "/ipns/ipfs.io", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/ipfs.io", 1, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) + testResolution(t, r, "/ipns/ipfs.io", 2, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) + testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 1, "/ipns/ipfs.io", ErrResolveRecursion) + testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 2, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) + testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 3, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) +} From c175b946e5e9c831788644d281b13de0fffaabca Mon Sep 17 00:00:00 2001 From: Travis Person Date: Fri, 22 May 2015 09:18:49 -0700 Subject: [PATCH 0766/3147] Named error for `no components` Update the previous `invalid path` error to match the error returned from `SplitAbsPath`. This commit was moved from ipfs/go-path@032c997e06d465d2a5d08bab85b8266d88b6f282 --- path/resolver.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index a08df87413..b4d6239dd3 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -4,6 +4,7 @@ package path import ( "fmt" "time" + "errors" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" @@ -14,6 +15,10 @@ import ( var log = u.Logger("path") +// Paths after a protocol must contain at least one component +var ErrNoComponents = errors.New( + "path must contain at least one component") + // ErrNoLink is returned when a link is not found in a path type ErrNoLink struct { name string @@ -43,7 +48,7 @@ func SplitAbsPath(fpath Path) (mh.Multihash, []string, error) { // if nothing, bail. if len(parts) == 0 { - return nil, nil, fmt.Errorf("ipfs path must contain at least one component") + return nil, nil, ErrNoComponents } // first element in the path is a b58 hash (for now) From 687caccb7b6541804f0e81dbb317494e0749d465 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 19 May 2015 08:52:30 -0700 Subject: [PATCH 0767/3147] change pinning to happen in a callback This commit was moved from ipfs/go-unixfs@da1062c936ccbad850b9738e8e2319b2bec5c3c8 --- unixfs/mod/dagmodifier.go | 3 ++- unixfs/mod/dagmodifier_test.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index e0e09f7115..78f7282fbe 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -11,6 +11,7 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + imp "github.com/ipfs/go-ipfs/importer" chunk "github.com/ipfs/go-ipfs/importer/chunk" help "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" @@ -308,7 +309,7 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.No dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, - Pinner: dm.mp, + BlockCB: imp.BasicPinnerCB(dm.mp), } return trickle.TrickleAppend(node, dbp.New(blks)) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index abc8268e36..3e2bea6cbf 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -52,7 +52,7 @@ func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blocksto func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.ManualPinner) ([]byte, *mdag.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) - node, err := imp.BuildTrickleDagFromReader(in, dserv, pinner, &chunk.SizeSplitter{500}) + node, err := imp.BuildTrickleDagFromReader(in, dserv, &chunk.SizeSplitter{500}, imp.BasicPinnerCB(pinner)) if err != nil { t.Fatal(err) } From 72054f7a9c291fd33013aae2760f4c7cded3bb62 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 May 2015 08:28:59 -0700 Subject: [PATCH 0768/3147] make callback take a node instead of a key This commit was moved from ipfs/go-unixfs@0c7270ffb65c686f9b9116f303d808d3e487d70f --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 78f7282fbe..bba3139cb7 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -309,7 +309,7 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.No dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, - BlockCB: imp.BasicPinnerCB(dm.mp), + NodeCB: imp.BasicPinnerCB(dm.mp), } return trickle.TrickleAppend(node, dbp.New(blks)) From ef8a490e3b9a3dd8c4c431d26ae92c3c87750fa8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 20 May 2015 22:32:56 -0700 Subject: [PATCH 0769/3147] remove testing imports from non testing code rename bserv mock to mock_test swap out testing.T for an interface This commit was moved from ipfs/go-blockservice@bb4eca868ae1bea8c6752eacf18f40fd67d5a62b --- blockservice/mock.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/blockservice/mock.go b/blockservice/mock.go index 45b440b3ea..293d11f16c 100644 --- a/blockservice/mock.go +++ b/blockservice/mock.go @@ -1,16 +1,18 @@ package blockservice import ( - "testing" - bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" mockrouting "github.com/ipfs/go-ipfs/routing/mock" delay "github.com/ipfs/go-ipfs/thirdparty/delay" ) +type fataler interface { + Fatal(args ...interface{}) +} + // Mocks returns |n| connected mock Blockservices -func Mocks(t *testing.T, n int) []*BlockService { +func Mocks(t fataler, n int) []*BlockService { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) sg := bitswap.NewTestSessionGenerator(net) From ee36df77e8fcda8f32997286f265017205e7b74d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0770/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-ipfs-routing@274b8f77a3cab6d1df6a2d6f1271088f7b30ba43 --- routing/dht/dht.go | 27 ++++++++++++++------------- routing/dht/dht_test.go | 23 ++++++++++++----------- routing/dht/ext_test.go | 14 ++++++-------- routing/dht/handlers.go | 16 ++++++++-------- routing/dht/lookup.go | 6 +++--- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 28 ++++++++++++++-------------- routing/dht/providers_test.go | 4 ++-- routing/dht/query.go | 5 +++-- routing/dht/routing.go | 18 +++++++++--------- routing/kbucket/util.go | 5 +++-- routing/mock/centralized_client.go | 11 ++++++----- routing/mock/centralized_server.go | 12 ++++++------ routing/mock/centralized_test.go | 14 +++++++------- routing/mock/interface.go | 6 +++--- routing/offline/offline.go | 12 ++++++------ routing/record/record.go | 4 ++-- routing/record/validation.go | 11 ++++++----- routing/routing.go | 16 ++++++++-------- routing/supernode/client.go | 12 ++++++------ routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 20 ++++++++++---------- routing/supernode/server_test.go | 4 ++-- 23 files changed, 141 insertions(+), 137 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 8c5ceaa612..b1b13985bf 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,6 +10,7 @@ import ( "sync" "time" + key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" host "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" @@ -122,7 +123,7 @@ func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { // putValueToPeer stores the given key/value pair at the peer 'p' func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, - key u.Key, rec *pb.Record) error { + key key.Key, rec *pb.Record) error { pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) pmes.Record = rec @@ -139,7 +140,7 @@ func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, // putProvider sends a message to peer 'p' saying that the local node // can provide the value of 'key' -func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) error { +func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, skey string) error { // add self as the provider pi := peer.PeerInfo{ @@ -150,18 +151,18 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) erro // // only share WAN-friendly addresses ?? // pi.Addrs = addrutil.WANShareableAddrs(pi.Addrs) if len(pi.Addrs) < 1 { - // log.Infof("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, u.Key(key), pi.Addrs) + // log.Infof("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, key.Key(key), pi.Addrs) return fmt.Errorf("no known addresses for self. cannot put provider.") } - pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(key), 0) + pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, skey, 0) pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]peer.PeerInfo{pi}) err := dht.sendMessage(ctx, p, pmes) if err != nil { return err } - log.Debugf("%s putProvider: %s for %s (%s)", dht.self, p, u.Key(key), pi.Addrs) + log.Debugf("%s putProvider: %s for %s (%s)", dht.self, p, key.Key(skey), pi.Addrs) return nil } @@ -170,7 +171,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) erro // NOTE: it will update the dht's peerstore with any new addresses // it finds for the given peer. func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, - key u.Key) ([]byte, []peer.PeerInfo, error) { + key key.Key) ([]byte, []peer.PeerInfo, error) { pmes, err := dht.getValueSingle(ctx, p, key) if err != nil { @@ -203,7 +204,7 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, // getValueSingle simply performs the get value RPC with the given parameters func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, - key u.Key) (*pb.Message, error) { + key key.Key) (*pb.Message, error) { defer log.EventBegin(ctx, "getValueSingle", p, &key).Done() pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), 0) @@ -211,7 +212,7 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, } // getLocal attempts to retrieve the value from the datastore -func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) { +func (dht *IpfsDHT) getLocal(key key.Key) ([]byte, error) { log.Debug("getLocal %s", key) v, err := dht.datastore.Get(key.DsKey()) @@ -254,7 +255,7 @@ func (dht *IpfsDHT) getOwnPrivateKey() (ci.PrivKey, error) { } // putLocal stores the key value pair in the datastore -func (dht *IpfsDHT) putLocal(key u.Key, rec *pb.Record) error { +func (dht *IpfsDHT) putLocal(key key.Key, rec *pb.Record) error { data, err := proto.Marshal(rec) if err != nil { return err @@ -287,7 +288,7 @@ func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.ID, id peer.ID) ( return dht.sendRequest(ctx, p, pmes) } -func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key u.Key) (*pb.Message, error) { +func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key key.Key) (*pb.Message, error) { defer log.EventBegin(ctx, "findProvidersSingle", p, &key).Done() pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), 0) @@ -296,7 +297,7 @@ func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key u.Ke // nearestPeersToQuery returns the routing tables closest peers. func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.ID { - key := u.Key(pmes.GetKey()) + key := key.Key(pmes.GetKey()) closer := dht.routingTable.NearestPeers(kb.ConvertKey(key), count) return closer } @@ -326,7 +327,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ } // must all be closer than self - key := u.Key(pmes.GetKey()) + key := key.Key(pmes.GetKey()) if !kb.Closer(dht.self, clp, key) { filtered = append(filtered, clp) } @@ -355,7 +356,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { case <-tick: id := make([]byte, 16) rand.Read(id) - peers := dht.routingTable.NearestPeers(kb.ConvertKey(u.Key(id)), 5) + peers := dht.routingTable.NearestPeers(kb.ConvertKey(key.Key(id)), 5) for _, p := range peers { ctx, cancel := context.WithTimeout(dht.Context(), time.Second*5) _, err := dht.Ping(ctx, p) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 29b57816f9..a6eb41a778 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,6 +14,7 @@ import ( ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" netutil "github.com/ipfs/go-ipfs/p2p/test/util" routing "github.com/ipfs/go-ipfs/routing" @@ -24,14 +25,14 @@ import ( travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" ) -var testCaseValues = map[u.Key][]byte{} +var testCaseValues = map[key.Key][]byte{} func init() { testCaseValues["hello"] = []byte("world") for i := 0; i < 100; i++ { k := fmt.Sprintf("%d -- key", i) v := fmt.Sprintf("%d -- value", i) - testCaseValues[u.Key(k)] = []byte(v) + testCaseValues[key.Key(k)] = []byte(v) } } @@ -42,7 +43,7 @@ func setupDHT(ctx context.Context, t *testing.T) *IpfsDHT { d := NewDHT(ctx, h, dss) d.Validator["v"] = &record.ValidChecker{ - Func: func(u.Key, []byte) error { + Func: func(key.Key, []byte) error { return nil }, Sign: false, @@ -143,7 +144,7 @@ func TestValueGetSet(t *testing.T) { defer dhtB.host.Close() vf := &record.ValidChecker{ - Func: func(u.Key, []byte) error { + Func: func(key.Key, []byte) error { return nil }, Sign: false, @@ -460,7 +461,7 @@ func TestProvidesMany(t *testing.T) { } } - var providers = map[u.Key]peer.ID{} + var providers = map[key.Key]peer.ID{} d := 0 for k, v := range testCaseValues { @@ -501,7 +502,7 @@ func TestProvidesMany(t *testing.T) { ctxT, _ = context.WithTimeout(ctx, 5*time.Second) var wg sync.WaitGroup - getProvider := func(dht *IpfsDHT, k u.Key) { + getProvider := func(dht *IpfsDHT, k key.Key) { defer wg.Done() expected := providers[k] @@ -561,7 +562,7 @@ func TestProvidesAsync(t *testing.T) { connect(t, ctx, dhts[1], dhts[2]) connect(t, ctx, dhts[1], dhts[3]) - k := u.Key("hello") + k := key.Key("hello") val := []byte("world") sk := dhts[3].peerstore.PrivKey(dhts[3].self) rec, err := record.MakePutRecord(sk, k, val, false) @@ -579,7 +580,7 @@ func TestProvidesAsync(t *testing.T) { t.Fatal(err) } - err = dhts[3].Provide(ctx, u.Key("hello")) + err = dhts[3].Provide(ctx, key.Key("hello")) if err != nil { t.Fatal(err) } @@ -587,7 +588,7 @@ func TestProvidesAsync(t *testing.T) { time.Sleep(time.Millisecond * 60) ctxT, _ := context.WithTimeout(ctx, time.Millisecond*300) - provs := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 5) + provs := dhts[0].FindProvidersAsync(ctxT, key.Key("hello"), 5) select { case p, ok := <-provs: if !ok { @@ -624,7 +625,7 @@ func TestLayeredGet(t *testing.T) { connect(t, ctx, dhts[1], dhts[2]) connect(t, ctx, dhts[1], dhts[3]) - err := dhts[3].Provide(ctx, u.Key("/v/hello")) + err := dhts[3].Provide(ctx, key.Key("/v/hello")) if err != nil { t.Fatal(err) } @@ -633,7 +634,7 @@ func TestLayeredGet(t *testing.T) { t.Log("interface was changed. GetValue should not use providers.") ctxT, _ := context.WithTimeout(ctx, time.Second) - val, err := dhts[0].GetValue(ctxT, u.Key("/v/hello")) + val, err := dhts[0].GetValue(ctxT, key.Key("/v/hello")) if err != routing.ErrNotFound { t.Error(err) } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 5ac342e3ac..c771165782 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -12,6 +12,7 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" inet "github.com/ipfs/go-ipfs/p2p/net" mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" peer "github.com/ipfs/go-ipfs/p2p/peer" @@ -37,7 +38,6 @@ func TestGetFailures(t *testing.T) { d := NewDHT(ctx, hosts[0], tsds) d.Update(ctx, hosts[1].ID()) - // u.POut("NotFound Test\n") // Reply with failures to every message hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { defer s.Close() @@ -45,9 +45,8 @@ func TestGetFailures(t *testing.T) { }) // This one should time out - // u.POut("Timout Test\n") ctx1, _ := context.WithTimeout(context.Background(), 200*time.Millisecond) - if _, err := d.GetValue(ctx1, u.Key("test")); err != nil { + if _, err := d.GetValue(ctx1, key.Key("test")); err != nil { if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { err = merr[0] } @@ -87,7 +86,7 @@ func TestGetFailures(t *testing.T) { // (was 3 seconds before which should be _plenty_ of time, but maybe // travis machines really have a hard time...) ctx2, _ := context.WithTimeout(context.Background(), 20*time.Second) - _, err = d.GetValue(ctx2, u.Key("test")) + _, err = d.GetValue(ctx2, key.Key("test")) if err != nil { if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { err = merr[0] @@ -111,7 +110,7 @@ func TestGetFailures(t *testing.T) { t.Fatal(err) } - rec, err := record.MakePutRecord(sk, u.Key(str), []byte("blah"), true) + rec, err := record.MakePutRecord(sk, key.Key(str), []byte("blah"), true) if err != nil { t.Fatal(err) } @@ -121,7 +120,6 @@ func TestGetFailures(t *testing.T) { Record: rec, } - // u.POut("handleGetValue Test\n") s, err := hosts[1].NewStream(ProtocolDHT, hosts[0].ID()) if err != nil { t.Fatal(err) @@ -205,7 +203,7 @@ func TestNotFound(t *testing.T) { // long timeout to ensure timing is not at play. ctx, _ = context.WithTimeout(ctx, time.Second*20) - v, err := d.GetValue(ctx, u.Key("hello")) + v, err := d.GetValue(ctx, key.Key("hello")) log.Debugf("get value got %v", v) if err != nil { if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { @@ -277,7 +275,7 @@ func TestLessThanKResponses(t *testing.T) { } ctx, _ = context.WithTimeout(ctx, time.Second*30) - if _, err := d.GetValue(ctx, u.Key("hello")); err != nil { + if _, err := d.GetValue(ctx, key.Key("hello")); err != nil { switch err { case routing.ErrNotFound: //Success! diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 5449cad439..b3db5d87ef 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -7,9 +7,9 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - u "github.com/ipfs/go-ipfs/util" lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" ) @@ -46,15 +46,15 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // first, is there even a key? - key := pmes.GetKey() - if key == "" { + k := pmes.GetKey() + if k == "" { return nil, errors.New("handleGetValue but no key was provided") // TODO: send back an error response? could be bad, but the other node's hanging. } // let's first check if we have the value locally. log.Debugf("%s handleGetValue looking into ds", dht.self) - dskey := u.Key(pmes.GetKey()).DsKey() + dskey := key.Key(k).DsKey() iVal, err := dht.datastore.Get(dskey) log.Debugf("%s handleGetValue looking into ds GOT %v", dht.self, iVal) @@ -105,10 +105,10 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess // Store a value in this peer local storage func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { defer log.EventBegin(ctx, "handlePutValue", p).Done() - dskey := u.Key(pmes.GetKey()).DsKey() + dskey := key.Key(pmes.GetKey()).DsKey() if err := dht.verifyRecordLocally(pmes.GetRecord()); err != nil { - log.Debugf("Bad dht record in PUT from: %s. %s", u.Key(pmes.GetRecord().GetAuthor()), err) + log.Debugf("Bad dht record in PUT from: %s. %s", key.Key(pmes.GetRecord().GetAuthor()), err) return nil, err } @@ -163,7 +163,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. defer log.EventBegin(ctx, "handleGetProviders", lm).Done() resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) - key := u.Key(pmes.GetKey()) + key := key.Key(pmes.GetKey()) lm["key"] = func() interface{} { return key.Pretty() } // debug logging niceness. @@ -207,7 +207,7 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M lm["peer"] = func() interface{} { return p.Pretty() } defer log.EventBegin(ctx, "handleAddProvider", lm).Done() - key := u.Key(pmes.GetKey()) + key := key.Key(pmes.GetKey()) lm["key"] = func() interface{} { return key.Pretty() } log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, key) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 76671657a7..a100736401 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -2,10 +2,10 @@ package dht import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" peer "github.com/ipfs/go-ipfs/p2p/peer" kb "github.com/ipfs/go-ipfs/routing/kbucket" - u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" ) @@ -21,7 +21,7 @@ func pointerizePeerInfos(pis []peer.PeerInfo) []*peer.PeerInfo { // Kademlia 'node lookup' operation. Returns a channel of the K closest peers // to the given key -func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key) (<-chan peer.ID, error) { +func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key key.Key) (<-chan peer.ID, error) { e := log.EventBegin(ctx, "getClosestPeers", &key) tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) if len(tablepeers) == 0 { @@ -88,7 +88,7 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key u.Key) (<-chan peer return out, nil } -func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key u.Key, p peer.ID) ([]peer.ID, error) { +func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key key.Key, p peer.ID) ([]peer.ID, error) { pmes, err := dht.findPeerSingle(ctx, p, peer.ID(key)) if err != nil { return nil, err diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 10279abd23..24ad1d6f09 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -3,10 +3,10 @@ package dht_pb import ( ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + key "github.com/ipfs/go-ipfs/blocks/key" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" - util "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("dht.pb") @@ -143,7 +143,7 @@ func (m *Message) Loggable() map[string]interface{} { return map[string]interface{}{ "message": map[string]string{ "type": m.Type.String(), - "key": util.Key(m.GetKey()).Pretty(), + "key": key.Key(m.GetKey()).Pretty(), }, } } diff --git a/routing/dht/providers.go b/routing/dht/providers.go index e803398be8..2b7fa2cbd2 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -4,8 +4,8 @@ import ( "time" ctxgroup "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" - u "github.com/ipfs/go-ipfs/util" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) @@ -16,10 +16,10 @@ type providerInfo struct { } type ProviderManager struct { - providers map[u.Key][]*providerInfo - local map[u.Key]struct{} + providers map[key.Key][]*providerInfo + local map[key.Key]struct{} lpeer peer.ID - getlocal chan chan []u.Key + getlocal chan chan []key.Key newprovs chan *addProv getprovs chan *getProv period time.Duration @@ -27,12 +27,12 @@ type ProviderManager struct { } type addProv struct { - k u.Key + k key.Key val peer.ID } type getProv struct { - k u.Key + k key.Key resp chan []peer.ID } @@ -40,9 +40,9 @@ func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { pm := new(ProviderManager) pm.getprovs = make(chan *getProv) pm.newprovs = make(chan *addProv) - pm.providers = make(map[u.Key][]*providerInfo) - pm.getlocal = make(chan chan []u.Key) - pm.local = make(map[u.Key]struct{}) + pm.providers = make(map[key.Key][]*providerInfo) + pm.getlocal = make(chan chan []key.Key) + pm.local = make(map[key.Key]struct{}) pm.ContextGroup = ctxgroup.WithContext(ctx) pm.Children().Add(1) @@ -76,7 +76,7 @@ func (pm *ProviderManager) run() { gp.resp <- parr case lc := <-pm.getlocal: - var keys []u.Key + var keys []key.Key for k := range pm.local { keys = append(keys, k) } @@ -99,7 +99,7 @@ func (pm *ProviderManager) run() { } } -func (pm *ProviderManager) AddProvider(ctx context.Context, k u.Key, val peer.ID) { +func (pm *ProviderManager) AddProvider(ctx context.Context, k key.Key, val peer.ID) { prov := &addProv{ k: k, val: val, @@ -110,7 +110,7 @@ func (pm *ProviderManager) AddProvider(ctx context.Context, k u.Key, val peer.ID } } -func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.ID { +func (pm *ProviderManager) GetProviders(ctx context.Context, k key.Key) []peer.ID { gp := &getProv{ k: k, resp: make(chan []peer.ID, 1), // buffered to prevent sender from blocking @@ -128,8 +128,8 @@ func (pm *ProviderManager) GetProviders(ctx context.Context, k u.Key) []peer.ID } } -func (pm *ProviderManager) GetLocal() []u.Key { - resp := make(chan []u.Key) +func (pm *ProviderManager) GetLocal() []key.Key { + resp := make(chan []key.Key) pm.getlocal <- resp return <-resp } diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 159634a806..ecf937962f 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -3,8 +3,8 @@ package dht import ( "testing" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" - u "github.com/ipfs/go-ipfs/util" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) @@ -13,7 +13,7 @@ func TestProviderManager(t *testing.T) { ctx := context.Background() mid := peer.ID("testing") p := NewProviderManager(ctx, mid) - a := u.Key("test") + a := key.Key("test") p.AddProvider(ctx, a, peer.ID("testingprovider")) resp := p.GetProviders(ctx, a) if len(resp) != 1 { diff --git a/routing/dht/query.go b/routing/dht/query.go index d833b126cc..c69437f499 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,6 +3,7 @@ package dht import ( "sync" + key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" peer "github.com/ipfs/go-ipfs/p2p/peer" queue "github.com/ipfs/go-ipfs/p2p/peer/queue" @@ -21,7 +22,7 @@ var maxQueryConcurrency = AlphaValue type dhtQuery struct { dht *IpfsDHT - key u.Key // the key we're querying for + key key.Key // the key we're querying for qfunc queryFunc // the function to execute per peer concurrency int // the concurrency parameter } @@ -35,7 +36,7 @@ type dhtQueryResult struct { } // constructs query -func (dht *IpfsDHT) newQuery(k u.Key, f queryFunc) *dhtQuery { +func (dht *IpfsDHT) newQuery(k key.Key, f queryFunc) *dhtQuery { return &dhtQuery{ key: k, dht: dht, diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 47e8924142..c4dc76ac48 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -5,6 +5,7 @@ import ( "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" @@ -12,7 +13,6 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" ) @@ -28,7 +28,7 @@ var asyncQueryBuffer = 10 // PutValue adds value corresponding to given Key. // This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error { +func (dht *IpfsDHT) PutValue(ctx context.Context, key key.Key, value []byte) error { log.Debugf("PutValue %s", key) sk, err := dht.getOwnPrivateKey() if err != nil { @@ -79,7 +79,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error // GetValue searches for the value corresponding to given Key. // If the search does not succeed, a multiaddr string of a closer peer is // returned along with util.ErrSearchIncomplete -func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { +func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { // If we have it local, dont bother doing an RPC! val, err := dht.getLocal(key) if err == nil { @@ -141,7 +141,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. // Provide makes this node announce that it can provide a value for the given key -func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { +func (dht *IpfsDHT) Provide(ctx context.Context, key key.Key) error { defer log.EventBegin(ctx, "provide", &key).Done() // add self locally @@ -169,7 +169,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key u.Key) error { } // FindProviders searches until the context expires. -func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerInfo, error) { +func (dht *IpfsDHT) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { var providers []peer.PeerInfo for p := range dht.FindProvidersAsync(ctx, key, KValue) { providers = append(providers, p) @@ -180,14 +180,14 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerIn // FindProvidersAsync is the same thing as FindProviders, but returns a channel. // Peers will be returned on the channel as soon as they are found, even before // the search query completes. -func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key u.Key, count int) <-chan peer.PeerInfo { +func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key key.Key, count int) <-chan peer.PeerInfo { log.Event(ctx, "findProviders", &key) peerOut := make(chan peer.PeerInfo, count) go dht.findProvidersAsyncRoutine(ctx, key, count, peerOut) return peerOut } -func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, count int, peerOut chan peer.PeerInfo) { +func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, count int, peerOut chan peer.PeerInfo) { defer log.EventBegin(ctx, "findProvidersAsync", &key).Done() defer close(peerOut) @@ -289,7 +289,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er } // setup the Query - query := dht.newQuery(u.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ Type: notif.SendingQuery, ID: p, @@ -347,7 +347,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< } // setup the Query - query := dht.newQuery(u.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index e7c56f8681..e37a701830 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -5,6 +5,7 @@ import ( "crypto/sha256" "errors" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" @@ -45,13 +46,13 @@ func ConvertPeerID(id peer.ID) ID { } // ConvertKey creates a DHT ID by hashing a local key (String) -func ConvertKey(id u.Key) ID { +func ConvertKey(id key.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } // Closer returns true if a is closer to key than b is -func Closer(a, b peer.ID, key u.Key) bool { +func Closer(a, b peer.ID, key key.Key) bool { aid := ConvertPeerID(a) bid := ConvertPeerID(b) tgt := ConvertKey(key) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 7b04c97627..6085b69be4 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -7,6 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" @@ -22,13 +23,13 @@ type client struct { } // FIXME(brian): is this method meant to simulate putting a value into the network? -func (c *client) PutValue(ctx context.Context, key u.Key, val []byte) error { +func (c *client) PutValue(ctx context.Context, key key.Key, val []byte) error { log.Debugf("PutValue: %s", key) return c.datastore.Put(key.DsKey(), val) } // FIXME(brian): is this method meant to simulate getting a value from the network? -func (c *client) GetValue(ctx context.Context, key u.Key) ([]byte, error) { +func (c *client) GetValue(ctx context.Context, key key.Key) ([]byte, error) { log.Debugf("GetValue: %s", key) v, err := c.datastore.Get(key.DsKey()) if err != nil { @@ -43,7 +44,7 @@ func (c *client) GetValue(ctx context.Context, key u.Key) ([]byte, error) { return data, nil } -func (c *client) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerInfo, error) { +func (c *client) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { return c.server.Providers(key), nil } @@ -52,7 +53,7 @@ func (c *client) FindPeer(ctx context.Context, pid peer.ID) (peer.PeerInfo, erro return peer.PeerInfo{}, nil } -func (c *client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { +func (c *client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { out := make(chan peer.PeerInfo) go func() { defer close(out) @@ -72,7 +73,7 @@ func (c *client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha // Provide returns once the message is on the network. Value is not necessarily // visible yet. -func (c *client) Provide(_ context.Context, key u.Key) error { +func (c *client) Provide(_ context.Context, key key.Key) error { info := peer.PeerInfo{ ID: c.peer.ID(), Addrs: []ma.Multiaddr{c.peer.Address()}, diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index da2cedf483..c7bd239ed3 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -7,15 +7,15 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" - u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" ) // server is the mockrouting.Client's private interface to the routing server type server interface { - Announce(peer.PeerInfo, u.Key) error - Providers(u.Key) []peer.PeerInfo + Announce(peer.PeerInfo, key.Key) error + Providers(key.Key) []peer.PeerInfo Server } @@ -25,7 +25,7 @@ type s struct { delayConf DelayConfig lock sync.RWMutex - providers map[u.Key]map[peer.ID]providerRecord + providers map[key.Key]map[peer.ID]providerRecord } type providerRecord struct { @@ -33,7 +33,7 @@ type providerRecord struct { Created time.Time } -func (rs *s) Announce(p peer.PeerInfo, k u.Key) error { +func (rs *s) Announce(p peer.PeerInfo, k key.Key) error { rs.lock.Lock() defer rs.lock.Unlock() @@ -48,7 +48,7 @@ func (rs *s) Announce(p peer.PeerInfo, k u.Key) error { return nil } -func (rs *s) Providers(k u.Key) []peer.PeerInfo { +func (rs *s) Providers(k key.Key) []peer.PeerInfo { rs.delayConf.Query.Wait() // before locking rs.lock.RLock() diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 38b58cb644..a719570aa0 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -5,16 +5,16 @@ import ( "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" ) func TestKeyNotFound(t *testing.T) { var pi = testutil.RandIdentityOrFatal(t) - var key = u.Key("mock key") + var key = key.Key("mock key") var ctx = context.Background() rs := NewServer() @@ -30,7 +30,7 @@ func TestClientFindProviders(t *testing.T) { rs := NewServer() client := rs.Client(pi) - k := u.Key("hello") + k := key.Key("hello") err := client.Provide(context.Background(), k) if err != nil { t.Fatal(err) @@ -40,7 +40,7 @@ func TestClientFindProviders(t *testing.T) { time.Sleep(time.Millisecond * 300) max := 100 - providersFromClient := client.FindProvidersAsync(context.Background(), u.Key("hello"), max) + providersFromClient := client.FindProvidersAsync(context.Background(), key.Key("hello"), max) isInClient := false for pi := range providersFromClient { if pi.ID == pi.ID { @@ -54,7 +54,7 @@ func TestClientFindProviders(t *testing.T) { func TestClientOverMax(t *testing.T) { rs := NewServer() - k := u.Key("hello") + k := key.Key("hello") numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { pi := testutil.RandIdentityOrFatal(t) @@ -81,7 +81,7 @@ func TestClientOverMax(t *testing.T) { // TODO does dht ensure won't receive self as a provider? probably not. func TestCanceledContext(t *testing.T) { rs := NewServer() - k := u.Key("hello") + k := key.Key("hello") // avoid leaking goroutine, without using the context to signal // (we want the goroutine to keep trying to publish on a @@ -139,7 +139,7 @@ func TestCanceledContext(t *testing.T) { func TestValidAfter(t *testing.T) { pi := testutil.RandIdentityOrFatal(t) - var key = u.Key("mock key") + var key = key.Key("mock key") var ctx = context.Background() conf := DelayConfig{ ValueVisibility: delay.Fixed(1 * time.Hour), diff --git a/routing/mock/interface.go b/routing/mock/interface.go index df29fdbb92..f18e387d87 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -7,10 +7,10 @@ package mockrouting import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" ) @@ -22,7 +22,7 @@ type Server interface { // Client implements IpfsRouting type Client interface { - FindProviders(context.Context, u.Key) ([]peer.PeerInfo, error) + FindProviders(context.Context, key.Key) ([]peer.PeerInfo, error) routing.IpfsRouting } @@ -37,7 +37,7 @@ func NewServer() Server { // NewServerWithDelay returns a mockrouting Server with a delay! func NewServerWithDelay(conf DelayConfig) Server { return &s{ - providers: make(map[u.Key]map[peer.ID]providerRecord), + providers: make(map[key.Key]map[peer.ID]providerRecord), delayConf: conf, } } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index a94e0c3c71..2ef4e5633b 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,13 +7,13 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" - u "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("offlinerouting") @@ -35,7 +35,7 @@ type offlineRouting struct { sk ci.PrivKey } -func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte) error { +func (c *offlineRouting) PutValue(ctx context.Context, key key.Key, val []byte) error { rec, err := record.MakePutRecord(c.sk, key, val, false) if err != nil { return err @@ -48,7 +48,7 @@ func (c *offlineRouting) PutValue(ctx context.Context, key u.Key, val []byte) er return c.datastore.Put(key.DsKey(), data) } -func (c *offlineRouting) GetValue(ctx context.Context, key u.Key) ([]byte, error) { +func (c *offlineRouting) GetValue(ctx context.Context, key key.Key) ([]byte, error) { v, err := c.datastore.Get(key.DsKey()) if err != nil { return nil, err @@ -67,7 +67,7 @@ func (c *offlineRouting) GetValue(ctx context.Context, key u.Key) ([]byte, error return rec.GetValue(), nil } -func (c *offlineRouting) FindProviders(ctx context.Context, key u.Key) ([]peer.PeerInfo, error) { +func (c *offlineRouting) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { return nil, ErrOffline } @@ -75,13 +75,13 @@ func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (peer.PeerIn return peer.PeerInfo{}, ErrOffline } -func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { +func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { out := make(chan peer.PeerInfo) close(out) return out } -func (c *offlineRouting) Provide(_ context.Context, key u.Key) error { +func (c *offlineRouting) Provide(_ context.Context, key key.Key) error { return ErrOffline } diff --git a/routing/record/record.go b/routing/record/record.go index ae423a1720..4e1d54a4d0 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -5,16 +5,16 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" - u "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("routing/record") // MakePutRecord creates and signs a dht record for the given key/value pair -func MakePutRecord(sk ci.PrivKey, key u.Key, value []byte, sign bool) (*pb.Record, error) { +func MakePutRecord(sk ci.PrivKey, key key.Key, value []byte, sign bool) (*pb.Record, error) { record := new(pb.Record) record.Key = proto.String(string(key)) diff --git a/routing/record/validation.go b/routing/record/validation.go index 8d2657fe26..f186bea903 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -5,6 +5,7 @@ import ( "errors" "strings" + key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" @@ -12,7 +13,7 @@ import ( // ValidatorFunc is a function that is called to validate a given // type of DHTRecord. -type ValidatorFunc func(u.Key, []byte) error +type ValidatorFunc func(key.Key, []byte) error // ErrBadRecord is returned any time a dht record is found to be // incorrectly formatted or signed. @@ -38,7 +39,7 @@ func (v Validator) VerifyRecord(r *pb.Record) error { // Now, check validity func parts := strings.Split(r.GetKey(), "/") if len(parts) < 3 { - log.Infof("Record key does not have validator: %s", u.Key(r.GetKey())) + log.Infof("Record key does not have validator: %s", key.Key(r.GetKey())) return nil } @@ -48,10 +49,10 @@ func (v Validator) VerifyRecord(r *pb.Record) error { return ErrInvalidRecordType } - return val.Func(u.Key(r.GetKey()), r.GetValue()) + return val.Func(key.Key(r.GetKey()), r.GetValue()) } -func (v Validator) IsSigned(k u.Key) (bool, error) { +func (v Validator) IsSigned(k key.Key) (bool, error) { // Now, check validity func parts := strings.Split(string(k), "/") if len(parts) < 3 { @@ -71,7 +72,7 @@ func (v Validator) IsSigned(k u.Key) (bool, error) { // ValidatePublicKeyRecord implements ValidatorFunc and // verifies that the passed in record value is the PublicKey // that matches the passed in key. -func ValidatePublicKeyRecord(k u.Key, val []byte) error { +func ValidatePublicKeyRecord(k key.Key, val []byte) error { keyparts := bytes.Split([]byte(k), []byte("/")) if len(keyparts) < 3 { return errors.New("invalid key") diff --git a/routing/routing.go b/routing/routing.go index c94d813ae7..31be8f3f86 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -6,9 +6,9 @@ import ( "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" peer "github.com/ipfs/go-ipfs/p2p/peer" - u "github.com/ipfs/go-ipfs/util" ) // ErrNotFound is returned when a search fails to find anything @@ -17,21 +17,21 @@ var ErrNotFound = errors.New("routing: not found") // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { - FindProvidersAsync(context.Context, u.Key, int) <-chan peer.PeerInfo + FindProvidersAsync(context.Context, key.Key, int) <-chan peer.PeerInfo // Basic Put/Get // PutValue adds value corresponding to given Key. - PutValue(context.Context, u.Key, []byte) error + PutValue(context.Context, key.Key, []byte) error // GetValue searches for the value corresponding to given Key. - GetValue(context.Context, u.Key) ([]byte, error) + GetValue(context.Context, key.Key) ([]byte, error) // Value provider layer of indirection. // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. // Announce that this node can provide value for given key - Provide(context.Context, u.Key) error + Provide(context.Context, key.Key) error // Find specific Peer // FindPeer searches for a peer with given ID, returns a peer.PeerInfo @@ -54,8 +54,8 @@ type PubKeyFetcher interface { // KeyForPublicKey returns the key used to retrieve public keys // from the dht. -func KeyForPublicKey(id peer.ID) u.Key { - return u.Key("/pk/" + string(id)) +func KeyForPublicKey(id peer.ID) key.Key { + return key.Key("/pk/" + string(id)) } func GetPublicKey(r IpfsRouting, ctx context.Context, pkhash []byte) (ci.PubKey, error) { @@ -63,7 +63,7 @@ func GetPublicKey(r IpfsRouting, ctx context.Context, pkhash []byte) (ci.PubKey, // If we have a DHT as our routing system, use optimized fetcher return dht.GetPublicKey(ctx, peer.ID(pkhash)) } else { - key := u.Key("/pk/" + string(pkhash)) + key := key.Key("/pk/" + string(pkhash)) pkval, err := r.GetValue(ctx, key) if err != nil { return nil, err diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 14f6a4db58..5269be51bb 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,13 +8,13 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" - u "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("supernode") @@ -36,7 +36,7 @@ func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (* }, nil } -func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-chan peer.PeerInfo { +func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { ctx = eventlog.ContextWithLoggable(ctx, eventlog.Uuid("findProviders")) defer log.EventBegin(ctx, "findProviders", &k).Done() ch := make(chan peer.PeerInfo) @@ -60,7 +60,7 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k u.Key, max int) <-cha return ch } -func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte) error { +func (c *Client) PutValue(ctx context.Context, k key.Key, v []byte) error { defer log.EventBegin(ctx, "putValue", &k).Done() r, err := makeRecord(c.peerstore, c.local, k, v) if err != nil { @@ -71,7 +71,7 @@ func (c *Client) PutValue(ctx context.Context, k u.Key, v []byte) error { return c.proxy.SendMessage(ctx, pmes) // wrap to hide the remote } -func (c *Client) GetValue(ctx context.Context, k u.Key) ([]byte, error) { +func (c *Client) GetValue(ctx context.Context, k key.Key) ([]byte, error) { defer log.EventBegin(ctx, "getValue", &k).Done() msg := pb.NewMessage(pb.Message_GET_VALUE, string(k), 0) response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote @@ -81,7 +81,7 @@ func (c *Client) GetValue(ctx context.Context, k u.Key) ([]byte, error) { return response.Record.GetValue(), nil } -func (c *Client) Provide(ctx context.Context, k u.Key) error { +func (c *Client) Provide(ctx context.Context, k key.Key) error { defer log.EventBegin(ctx, "provide", &k).Done() msg := pb.NewMessage(pb.Message_ADD_PROVIDER, string(k), 0) // FIXME how is connectedness defined for the local node @@ -113,7 +113,7 @@ func (c *Client) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error } // creates and signs a record for the given key/value pair -func makeRecord(ps peer.Peerstore, p peer.ID, k u.Key, v []byte) (*pb.Record, error) { +func makeRecord(ps peer.Peerstore, p peer.ID, k key.Key, v []byte) (*pb.Record, error) { blob := bytes.Join([][]byte{[]byte(k), v, []byte(p)}, []byte{}) sig, err := ps.PrivKey(p).Sign(blob) if err != nil { diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 10625f1807..b85b053e55 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,13 +6,13 @@ import ( ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" host "github.com/ipfs/go-ipfs/p2p/host" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" - util "github.com/ipfs/go-ipfs/util" ) const ProtocolSNR = "/ipfs/supernoderouting" @@ -162,7 +162,7 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe return response, nil } -func sortedByKey(peers []peer.ID, key string) []peer.ID { - target := kbucket.ConvertKey(util.Key(key)) +func sortedByKey(peers []peer.ID, skey string) []peer.ID { + target := kbucket.ConvertKey(key.Key(skey)) return kbucket.SortClosestPeers(peers, target) } diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 95d6a0def4..97a5c832db 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,11 +8,11 @@ import ( datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - util "github.com/ipfs/go-ipfs/util" ) // Server handles routing queries using a database backend @@ -53,7 +53,7 @@ func (s *Server) handleMessage( switch req.GetType() { case dhtpb.Message_GET_VALUE: - rawRecord, err := getRoutingRecord(s.routingBackend, util.Key(req.GetKey())) + rawRecord, err := getRoutingRecord(s.routingBackend, key.Key(req.GetKey())) if err != nil { return "", nil } @@ -67,7 +67,7 @@ func (s *Server) handleMessage( // log.Event(ctx, "validationFailed", req, p) // return "", nil // } - putRoutingRecord(s.routingBackend, util.Key(req.GetKey()), req.GetRecord()) + putRoutingRecord(s.routingBackend, key.Key(req.GetKey()), req.GetRecord()) return p, req case dhtpb.Message_FIND_NODE: @@ -87,7 +87,7 @@ func (s *Server) handleMessage( if providerID == p { store := []*dhtpb.Message_Peer{provider} storeProvidersToPeerstore(s.peerstore, p, store) - if err := putRoutingProviders(s.routingBackend, util.Key(req.GetKey()), store); err != nil { + if err := putRoutingProviders(s.routingBackend, key.Key(req.GetKey()), store); err != nil { return "", nil } } else { @@ -97,7 +97,7 @@ func (s *Server) handleMessage( return "", nil case dhtpb.Message_GET_PROVIDERS: - providers, err := getRoutingProviders(s.routingBackend, util.Key(req.GetKey())) + providers, err := getRoutingProviders(s.routingBackend, key.Key(req.GetKey())) if err != nil { return "", nil } @@ -114,7 +114,7 @@ func (s *Server) handleMessage( var _ proxy.RequestHandler = &Server{} var _ proxy.Proxy = &Server{} -func getRoutingRecord(ds datastore.Datastore, k util.Key) (*dhtpb.Record, error) { +func getRoutingRecord(ds datastore.Datastore, k key.Key) (*dhtpb.Record, error) { dskey := k.DsKey() val, err := ds.Get(dskey) if err != nil { @@ -131,7 +131,7 @@ func getRoutingRecord(ds datastore.Datastore, k util.Key) (*dhtpb.Record, error) return &record, nil } -func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) error { +func putRoutingRecord(ds datastore.Datastore, k key.Key, value *dhtpb.Record) error { data, err := proto.Marshal(value) if err != nil { return err @@ -144,7 +144,7 @@ func putRoutingRecord(ds datastore.Datastore, k util.Key, value *dhtpb.Record) e return nil } -func putRoutingProviders(ds datastore.Datastore, k util.Key, newRecords []*dhtpb.Message_Peer) error { +func putRoutingProviders(ds datastore.Datastore, k key.Key, newRecords []*dhtpb.Message_Peer) error { log.Event(context.Background(), "putRoutingProviders", &k) oldRecords, err := getRoutingProviders(ds, k) if err != nil { @@ -183,7 +183,7 @@ func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb. } } -func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_Peer, error) { +func getRoutingProviders(ds datastore.Datastore, k key.Key) ([]*dhtpb.Message_Peer, error) { e := log.EventBegin(context.Background(), "getProviders", &k) defer e.Done() var providers []*dhtpb.Message_Peer @@ -199,7 +199,7 @@ func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_P return providers, nil } -func providerKey(k util.Key) datastore.Key { +func providerKey(k key.Key) datastore.Key { return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) } diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 2bd0fa15b3..d8ea8ea4ee 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,13 +4,13 @@ import ( "testing" datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - "github.com/ipfs/go-ipfs/util" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { routingBackend := datastore.NewMapDatastore() - k := util.Key("foo") + k := key.Key("foo") put := []*dhtpb.Message_Peer{ convPeer("bob", "127.0.0.1/tcp/4001"), convPeer("alice", "10.0.0.10/tcp/4001"), From a1aa3d06b74d0edf9fe3319f1228fe61170b712a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0771/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-blockservice@59e07036f96d6dddedfe95f01e53dbd50fe54f63 --- blockservice/blocks_test.go | 7 ++++--- blockservice/blockservice.go | 11 ++++++----- blockservice/worker/worker.go | 7 ++++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/blockservice/blocks_test.go b/blockservice/blocks_test.go index b38d52af90..a703cfc725 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/blocks_test.go @@ -11,6 +11,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" + key "github.com/ipfs/go-ipfs/blocks/key" offline "github.com/ipfs/go-ipfs/exchange/offline" u "github.com/ipfs/go-ipfs/util" ) @@ -30,7 +31,7 @@ func TestBlocks(t *testing.T) { t.Error("Block Multihash and data multihash not equal") } - if b.Key() != u.Key(h) { + if b.Key() != key.Key(h) { t.Error("Block key and data multihash key not equal") } @@ -68,7 +69,7 @@ func TestGetBlocksSequential(t *testing.T) { bg := blocksutil.NewBlockGenerator() blks := bg.Blocks(50) - var keys []u.Key + var keys []key.Key for _, blk := range blks { keys = append(keys, blk.Key()) servs[0].AddBlock(blk) @@ -79,7 +80,7 @@ func TestGetBlocksSequential(t *testing.T) { for i := 1; i < len(servs); i++ { ctx, _ := context.WithTimeout(context.TODO(), time.Second*50) out := servs[i].GetBlocks(ctx, keys) - gotten := make(map[u.Key]*blocks.Block) + gotten := make(map[key.Key]*blocks.Block) for blk := range out { if _, ok := gotten[blk.Key()]; ok { t.Fatal("Got duplicate block!") diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 46612be26c..bd7b447899 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,6 +10,7 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" + key "github.com/ipfs/go-ipfs/blocks/key" worker "github.com/ipfs/go-ipfs/blockservice/worker" exchange "github.com/ipfs/go-ipfs/exchange" u "github.com/ipfs/go-ipfs/util" @@ -64,7 +65,7 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. -func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { +func (s *BlockService) AddBlock(b *blocks.Block) (key.Key, error) { k := b.Key() err := s.Blockstore.Put(b) if err != nil { @@ -78,7 +79,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (u.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). -func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, error) { +func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (*blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", k) block, err := s.Blockstore.Get(k) if err == nil { @@ -101,11 +102,11 @@ func (s *BlockService) GetBlock(ctx context.Context, k u.Key) (*blocks.Block, er // GetBlocks gets a list of blocks asynchronously and returns through // the returned channel. // NB: No guarantees are made about order. -func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks.Block { +func (s *BlockService) GetBlocks(ctx context.Context, ks []key.Key) <-chan *blocks.Block { out := make(chan *blocks.Block, 0) go func() { defer close(out) - var misses []u.Key + var misses []key.Key for _, k := range ks { hit, err := s.Blockstore.Get(k) if err != nil { @@ -138,7 +139,7 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []u.Key) <-chan *blocks } // DeleteBlock deletes a block in the blockservice from the datastore -func (s *BlockService) DeleteBlock(k u.Key) error { +func (s *BlockService) DeleteBlock(k key.Key) error { return s.Blockstore.DeleteBlock(k) } diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index 5e57d8429d..88cf4c326b 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -9,6 +9,7 @@ import ( process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ratelimit "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" blocks "github.com/ipfs/go-ipfs/blocks" + key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" waitable "github.com/ipfs/go-ipfs/thirdparty/waitable" util "github.com/ipfs/go-ipfs/util" @@ -141,12 +142,12 @@ func (w *Worker) start(c Config) { type BlockList struct { list list.List - uniques map[util.Key]*list.Element + uniques map[key.Key]*list.Element } func (s *BlockList) PushFront(b *blocks.Block) { if s.uniques == nil { - s.uniques = make(map[util.Key]*list.Element) + s.uniques = make(map[key.Key]*list.Element) } _, ok := s.uniques[b.Key()] if !ok { @@ -157,7 +158,7 @@ func (s *BlockList) PushFront(b *blocks.Block) { func (s *BlockList) Push(b *blocks.Block) { if s.uniques == nil { - s.uniques = make(map[util.Key]*list.Element) + s.uniques = make(map[key.Key]*list.Element) } _, ok := s.uniques[b.Key()] if !ok { From 97232921f9044c203782ff0b491b72be5afc804a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0772/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-path@5c2276a9fedaea266d4fd1fb4bb33a0803854e7f --- path/path.go | 6 +++--- path/resolver.go | 9 +++++---- path/resolver_test.go | 3 ++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/path/path.go b/path/path.go index ba75810c86..f98f2cd13c 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - u "github.com/ipfs/go-ipfs/util" + key "github.com/ipfs/go-ipfs/blocks/key" b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" @@ -24,7 +24,7 @@ func FromString(s string) Path { } // FromKey safely converts a Key type to a Path type -func FromKey(k u.Key) Path { +func FromKey(k key.Key) Path { return Path("/ipfs/" + k.String()) } @@ -86,7 +86,7 @@ func ParseKeyToPath(txt string) (Path, error) { if err != nil { return "", err } - return FromKey(u.Key(chk)), nil + return FromKey(key.Key(chk)), nil } func (p *Path) IsValid() error { diff --git a/path/resolver.go b/path/resolver.go index b4d6239dd3..ce1f64a7ea 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -2,13 +2,14 @@ package path import ( + "errors" "fmt" "time" - "errors" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" u "github.com/ipfs/go-ipfs/util" ) @@ -83,7 +84,7 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*me log.Debug("Resolve dag get.") ctx, cancel := context.WithTimeout(ctx, time.Minute) defer cancel() - nd, err := s.DAG.Get(ctx, u.Key(h)) + nd, err := s.DAG.Get(ctx, key.Key(h)) if err != nil { return nil, err } @@ -107,12 +108,12 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names // for each of the path components for _, name := range names { - var next u.Key + var next key.Key var nlink *merkledag.Link // for each of the links in nd, the current object for _, link := range nd.Links { if link.Name == name { - next = u.Key(link.Hash) + next = key.Key(link.Hash) nlink = link break } diff --git a/path/resolver_test.go b/path/resolver_test.go index 88fcb74337..cb99703a0e 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,6 +9,7 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" + key "github.com/ipfs/go-ipfs/blocks/key" blockservice "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" merkledag "github.com/ipfs/go-ipfs/merkledag" @@ -16,7 +17,7 @@ import ( util "github.com/ipfs/go-ipfs/util" ) -func randNode() (*merkledag.Node, util.Key) { +func randNode() (*merkledag.Node, key.Key) { node := new(merkledag.Node) node.Data = make([]byte, 32) util.NewTimeSeededRand().Read(node.Data) From 446a74b8935a969ab914de3baed0f7231883348d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0773/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-ipfs-blockstore@67f1e9320d7b5d5a7cef6efe87bb580885034276 --- blockstore/blockstore.go | 26 +++++++++++++------------- blockstore/blockstore_test.go | 14 +++++++------- blockstore/write_cache.go | 10 +++++----- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 244d4578a2..8521fa1376 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -11,8 +11,8 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" + key "github.com/ipfs/go-ipfs/blocks/key" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" - u "github.com/ipfs/go-ipfs/util" ) var log = eventlog.Logger("blockstore") @@ -26,12 +26,12 @@ var ErrNotFound = errors.New("blockstore: block not found") // Blockstore wraps a ThreadSafeDatastore type Blockstore interface { - DeleteBlock(u.Key) error - Has(u.Key) (bool, error) - Get(u.Key) (*blocks.Block, error) + DeleteBlock(key.Key) error + Has(key.Key) (bool, error) + Get(key.Key) (*blocks.Block, error) Put(*blocks.Block) error - AllKeysChan(ctx context.Context) (<-chan u.Key, error) + AllKeysChan(ctx context.Context) (<-chan key.Key, error) } func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { @@ -47,7 +47,7 @@ type blockstore struct { // we do check it on `NewBlockstore` though. } -func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { +func (bs *blockstore) Get(k key.Key) (*blocks.Block, error) { maybeData, err := bs.datastore.Get(k.DsKey()) if err == ds.ErrNotFound { return nil, ErrNotFound @@ -74,11 +74,11 @@ func (bs *blockstore) Put(block *blocks.Block) error { return bs.datastore.Put(k, block.Data) } -func (bs *blockstore) Has(k u.Key) (bool, error) { +func (bs *blockstore) Has(k key.Key) (bool, error) { return bs.datastore.Has(k.DsKey()) } -func (s *blockstore) DeleteBlock(k u.Key) error { +func (s *blockstore) DeleteBlock(k key.Key) error { return s.datastore.Delete(k.DsKey()) } @@ -86,7 +86,7 @@ func (s *blockstore) DeleteBlock(k u.Key) error { // this is very simplistic, in the future, take dsq.Query as a param? // // AllKeysChan respects context -func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { +func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true} @@ -98,7 +98,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { } // this function is here to compartmentalize - get := func() (k u.Key, ok bool) { + get := func() (k key.Key, ok bool) { select { case <-ctx.Done(): return k, false @@ -111,8 +111,8 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { return k, false } - // need to convert to u.Key using u.KeyFromDsKey. - k = u.KeyFromDsKey(ds.NewKey(e.Key)) + // need to convert to key.Key using key.KeyFromDsKey. + k = key.KeyFromDsKey(ds.NewKey(e.Key)) log.Debug("blockstore: query got key", k) // key must be a multihash. else ignore it. @@ -125,7 +125,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { } } - output := make(chan u.Key) + output := make(chan key.Key) go func() { defer func() { res.Process().Close() // ensure exit (signals early exit, too) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 10844354ac..ee49b260ca 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -11,14 +11,14 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" - u "github.com/ipfs/go-ipfs/util" + key "github.com/ipfs/go-ipfs/blocks/key" ) // TODO(brian): TestGetReturnsNil func TestGetWhenKeyNotPresent(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) - _, err := bs.Get(u.Key("not present")) + _, err := bs.Get(key.Key("not present")) if err != nil { t.Log("As expected, block is not present") @@ -45,13 +45,13 @@ func TestPutThenGetBlock(t *testing.T) { } } -func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []u.Key) { +func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []key.Key) { if d == nil { d = ds.NewMapDatastore() } bs := NewBlockstore(ds_sync.MutexWrap(d)) - keys := make([]u.Key, N) + keys := make([]key.Key, N) for i := 0; i < N; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) err := bs.Put(block) @@ -63,8 +63,8 @@ func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []u return bs, keys } -func collect(ch <-chan u.Key) []u.Key { - var keys []u.Key +func collect(ch <-chan key.Key) []key.Key { + var keys []key.Key for k := range ch { keys = append(keys, k) } @@ -219,7 +219,7 @@ func TestValueTypeMismatch(t *testing.T) { } } -func expectMatches(t *testing.T, expect, actual []u.Key) { +func expectMatches(t *testing.T, expect, actual []key.Key) { if len(expect) != len(actual) { t.Errorf("expect and actual differ: %d != %d", len(expect), len(actual)) diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index b0ea4abc5c..fd7fd5d0ed 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -4,7 +4,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" "github.com/ipfs/go-ipfs/blocks" - u "github.com/ipfs/go-ipfs/util" + key "github.com/ipfs/go-ipfs/blocks/key" ) // WriteCached returns a blockstore that caches up to |size| unique writes (bs.Put). @@ -21,19 +21,19 @@ type writecache struct { blockstore Blockstore } -func (w *writecache) DeleteBlock(k u.Key) error { +func (w *writecache) DeleteBlock(k key.Key) error { w.cache.Remove(k) return w.blockstore.DeleteBlock(k) } -func (w *writecache) Has(k u.Key) (bool, error) { +func (w *writecache) Has(k key.Key) (bool, error) { if _, ok := w.cache.Get(k); ok { return true, nil } return w.blockstore.Has(k) } -func (w *writecache) Get(k u.Key) (*blocks.Block, error) { +func (w *writecache) Get(k key.Key) (*blocks.Block, error) { return w.blockstore.Get(k) } @@ -45,6 +45,6 @@ func (w *writecache) Put(b *blocks.Block) error { return w.blockstore.Put(b) } -func (w *writecache) AllKeysChan(ctx context.Context) (<-chan u.Key, error) { +func (w *writecache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return w.blockstore.AllKeysChan(ctx) } From aca0fb51f556f37b52e2f8b37d57db2827d970f3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0774/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-namesys@a95c01287dc0f31bc94b165501d6822cfb3a03b5 --- namesys/publisher.go | 7 ++++--- namesys/resolve_test.go | 3 ++- namesys/routing.go | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index b20a47bea5..f20009b7dc 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -9,6 +9,7 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/namesys/internal/pb" ci "github.com/ipfs/go-ipfs/p2p/crypto" @@ -55,7 +56,7 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa } nameb := u.Hash(pkbytes) - namekey := u.Key("/pk/" + string(nameb)) + namekey := key.Key("/pk/" + string(nameb)) log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key @@ -65,7 +66,7 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa return err } - ipnskey := u.Key("/ipns/" + string(nameb)) + ipnskey := key.Key("/ipns/" + string(nameb)) log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) @@ -110,7 +111,7 @@ var IpnsRecordValidator = &record.ValidChecker{ // ValidateIpnsRecord implements ValidatorFunc and verifies that the // given 'val' is an IpnsEntry and that that entry is valid. -func ValidateIpnsRecord(k u.Key, val []byte) error { +func ValidateIpnsRecord(k key.Key, val []byte) error { entry := new(pb.IpnsEntry) err := proto.Unmarshal(val, entry) if err != nil { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index ce28b1d6b1..3dde211ad4 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -4,6 +4,7 @@ import ( "testing" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "github.com/ipfs/go-ipfs/util" @@ -33,7 +34,7 @@ func TestRoutingResolve(t *testing.T) { } pkhash := u.Hash(pubkb) - res, err := resolver.Resolve(context.Background(), u.Key(pkhash).Pretty()) + res, err := resolver.Resolve(context.Background(), key.Key(pkhash).Pretty()) if err != nil { t.Fatal(err) } diff --git a/namesys/routing.go b/namesys/routing.go index 290c06cb2f..40acf38bd4 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,6 +7,7 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/internal/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" @@ -64,7 +65,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa // /ipns/ h := []byte("/ipns/" + string(hash)) - ipnsKey := u.Key(h) + ipnsKey := key.Key(h) val, err := r.routing.GetValue(ctx, ipnsKey) if err != nil { log.Warning("RoutingResolve get failed.") @@ -84,7 +85,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa } hsh, _ := pubkey.Hash() - log.Debugf("pk hash = %s", u.Key(hsh)) + log.Debugf("pk hash = %s", key.Key(hsh)) // check sig with pk if ok, err := pubkey.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { @@ -101,6 +102,6 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa } else { // Its an old style multihash record log.Warning("Detected old style multihash record") - return path.FromKey(u.Key(valh)), nil + return path.FromKey(key.Key(valh)), nil } } From 2ab9c6d66b0fd9126efd8a3bf0f656f25cbb8fcf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0775/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-unixfs@c5c7005633fcfb13d39408ffa35bc851899ced16 --- unixfs/io/dirbuilder.go | 4 ++-- unixfs/mod/dagmodifier.go | 5 +++-- unixfs/mod/dagmodifier_test.go | 7 ++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index ef74f3de03..d1b67c758e 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -5,9 +5,9 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - u "github.com/ipfs/go-ipfs/util" ) type directoryBuilder struct { @@ -29,7 +29,7 @@ func NewDirectory(dserv mdag.DAGService) *directoryBuilder { } // AddChild adds a (name, key)-pair to the root node. -func (d *directoryBuilder) AddChild(name string, k u.Key) error { +func (d *directoryBuilder) AddChild(name string, k key.Key) error { // TODO(cryptix): consolidate context managment ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) defer cancel() diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index bba3139cb7..48374c10bd 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -11,6 +11,7 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" imp "github.com/ipfs/go-ipfs/importer" chunk "github.com/ipfs/go-ipfs/importer/chunk" help "github.com/ipfs/go-ipfs/importer/helpers" @@ -226,7 +227,7 @@ func (dm *DagModifier) Sync() error { // modifyDag writes the data in 'data' over the data in 'node' starting at 'offset' // returns the new key of the passed in node and whether or not all the data in the reader // has been consumed. -func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (u.Key, bool, error) { +func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (key.Key, bool, error) { f, err := ft.FromBytes(node.Data) if err != nil { return "", false, err @@ -266,7 +267,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) // We found the correct child to write into if cur+bs > offset { // Unpin block - ckey := u.Key(node.Links[i].Hash) + ckey := key.Key(node.Links[i].Hash) dm.mp.RemovePinWithMode(ckey, pin.Indirect) child, err := node.Links[i].GetNode(dm.ctx, dm.dagserv) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 3e2bea6cbf..e7db0d97d4 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -10,6 +10,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" + key "github.com/ipfs/go-ipfs/blocks/key" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" imp "github.com/ipfs/go-ipfs/importer" @@ -574,10 +575,10 @@ func TestCorrectPinning(t *testing.T) { } -func enumerateChildren(t *testing.T, nd *mdag.Node, ds mdag.DAGService) []u.Key { - var out []u.Key +func enumerateChildren(t *testing.T, nd *mdag.Node, ds mdag.DAGService) []key.Key { + var out []key.Key for _, lnk := range nd.Links { - out = append(out, u.Key(lnk.Hash)) + out = append(out, key.Key(lnk.Hash)) child, err := lnk.GetNode(context.Background(), ds) if err != nil { t.Fatal(err) From 1354f22aeb7990808353e537a349bff020f9e7d5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0776/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-ipfs-pinner@cc2a44406a17b18925b1b2dd945bab28403f02d6 --- pinning/pinner/indirect.go | 22 +++++++++++----------- pinning/pinner/pin.go | 33 +++++++++++++++++---------------- pinning/pinner/pin_test.go | 3 ++- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index deed1f5ff6..dca99600fc 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -2,19 +2,19 @@ package pin import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" - "github.com/ipfs/go-ipfs/util" ) type indirectPin struct { blockset set.BlockSet - refCounts map[util.Key]int + refCounts map[key.Key]int } func NewIndirectPin(dstore ds.Datastore) *indirectPin { return &indirectPin{ blockset: set.NewDBWrapperSet(dstore, set.NewSimpleBlockSet()), - refCounts: make(map[util.Key]int), + refCounts: make(map[key.Key]int), } } @@ -25,11 +25,11 @@ func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { return nil, err } - refcnt := make(map[util.Key]int) - var keys []util.Key + refcnt := make(map[key.Key]int) + var keys []key.Key for encK, v := range rcStore { if v > 0 { - k := util.B58KeyDecode(encK) + k := key.B58KeyDecode(encK) keys = append(keys, k) refcnt[k] = v } @@ -43,12 +43,12 @@ func storeIndirPin(d ds.Datastore, k ds.Key, p *indirectPin) error { rcStore := map[string]int{} for k, v := range p.refCounts { - rcStore[util.B58KeyEncode(k)] = v + rcStore[key.B58KeyEncode(k)] = v } return storeSet(d, k, rcStore) } -func (i *indirectPin) Increment(k util.Key) { +func (i *indirectPin) Increment(k key.Key) { c := i.refCounts[k] i.refCounts[k] = c + 1 if c <= 0 { @@ -56,7 +56,7 @@ func (i *indirectPin) Increment(k util.Key) { } } -func (i *indirectPin) Decrement(k util.Key) { +func (i *indirectPin) Decrement(k key.Key) { c := i.refCounts[k] - 1 i.refCounts[k] = c if c <= 0 { @@ -65,7 +65,7 @@ func (i *indirectPin) Decrement(k util.Key) { } } -func (i *indirectPin) HasKey(k util.Key) bool { +func (i *indirectPin) HasKey(k key.Key) bool { return i.blockset.HasKey(k) } @@ -73,6 +73,6 @@ func (i *indirectPin) Set() set.BlockSet { return i.blockset } -func (i *indirectPin) GetRefs() map[util.Key]int { +func (i *indirectPin) GetRefs() map[key.Key]int { return i.refCounts } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 553593fc83..8f2d4b8209 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -11,6 +11,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" nsds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/util" @@ -31,22 +32,22 @@ const ( ) type Pinner interface { - IsPinned(util.Key) bool + IsPinned(key.Key) bool Pin(context.Context, *mdag.Node, bool) error - Unpin(context.Context, util.Key, bool) error + Unpin(context.Context, key.Key, bool) error Flush() error GetManual() ManualPinner - DirectKeys() []util.Key - IndirectKeys() map[util.Key]int - RecursiveKeys() []util.Key + DirectKeys() []key.Key + IndirectKeys() map[key.Key]int + RecursiveKeys() []key.Key } // ManualPinner is for manually editing the pin structure // Use with care! If used improperly, garbage collection // may not be successful type ManualPinner interface { - PinWithMode(util.Key, PinMode) - RemovePinWithMode(util.Key, PinMode) + PinWithMode(key.Key, PinMode) + RemovePinWithMode(key.Key, PinMode) Pinner } @@ -120,7 +121,7 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { } // Unpin a given key -func (p *pinner) Unpin(ctx context.Context, k util.Key, recursive bool) error { +func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() if p.recursePin.HasKey(k) { @@ -193,7 +194,7 @@ func (p *pinner) pinLinks(ctx context.Context, node *mdag.Node) error { } // IsPinned returns whether or not the given key is pinned -func (p *pinner) IsPinned(key util.Key) bool { +func (p *pinner) IsPinned(key key.Key) bool { p.lock.RLock() defer p.lock.RUnlock() return p.recursePin.HasKey(key) || @@ -201,7 +202,7 @@ func (p *pinner) IsPinned(key util.Key) bool { p.indirPin.HasKey(key) } -func (p *pinner) RemovePinWithMode(key util.Key, mode PinMode) { +func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { p.lock.Lock() defer p.lock.Unlock() switch mode { @@ -222,7 +223,7 @@ func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) p := new(pinner) { // load recursive set - var recurseKeys []util.Key + var recurseKeys []key.Key if err := loadSet(d, recursePinDatastoreKey, &recurseKeys); err != nil { return nil, err } @@ -230,7 +231,7 @@ func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) } { // load direct set - var directKeys []util.Key + var directKeys []key.Key if err := loadSet(d, directPinDatastoreKey, &directKeys); err != nil { return nil, err } @@ -253,17 +254,17 @@ func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) } // DirectKeys returns a slice containing the directly pinned keys -func (p *pinner) DirectKeys() []util.Key { +func (p *pinner) DirectKeys() []key.Key { return p.directPin.GetKeys() } // IndirectKeys returns a slice containing the indirectly pinned keys -func (p *pinner) IndirectKeys() map[util.Key]int { +func (p *pinner) IndirectKeys() map[key.Key]int { return p.indirPin.GetRefs() } // RecursiveKeys returns a slice containing the recursively pinned keys -func (p *pinner) RecursiveKeys() []util.Key { +func (p *pinner) RecursiveKeys() []key.Key { return p.recursePin.GetKeys() } @@ -314,7 +315,7 @@ func loadSet(d ds.Datastore, k ds.Key, val interface{}) error { // PinWithMode is a method on ManualPinners, allowing the user to have fine // grained control over pin counts -func (p *pinner) PinWithMode(k util.Key, mode PinMode) { +func (p *pinner) PinWithMode(k key.Key, mode PinMode) { p.lock.Lock() defer p.lock.Unlock() switch mode { diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index b79232570a..3f6c67b541 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -9,13 +9,14 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" + key "github.com/ipfs/go-ipfs/blocks/key" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/util" ) -func randNode() (*mdag.Node, util.Key) { +func randNode() (*mdag.Node, key.Key) { nd := new(mdag.Node) nd.Data = make([]byte, 32) util.NewTimeSeededRand().Read(nd.Data) From f1a875a9aeb1bb58bacadcb5597952a84624a0bd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0777/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-ipfs-exchange-offline@fe186f37a8146c718ba3be9e04a24cb1887f130f --- exchange/offline/offline.go | 8 ++++---- exchange/offline/offline_test.go | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 6b6ffc8383..9cf125ce0f 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -6,8 +6,8 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" + key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - u "github.com/ipfs/go-ipfs/util" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { @@ -23,7 +23,7 @@ type offlineExchange struct { // GetBlock returns nil to signal that a block could not be retrieved for the // given key. // NB: This function may return before the timeout expires. -func (e *offlineExchange) GetBlock(_ context.Context, k u.Key) (*blocks.Block, error) { +func (e *offlineExchange) GetBlock(_ context.Context, k key.Key) (*blocks.Block, error) { return e.bs.Get(k) } @@ -39,11 +39,11 @@ func (_ *offlineExchange) Close() error { return nil } -func (e *offlineExchange) GetBlocks(ctx context.Context, ks []u.Key) (<-chan *blocks.Block, error) { +func (e *offlineExchange) GetBlocks(ctx context.Context, ks []key.Key) (<-chan *blocks.Block, error) { out := make(chan *blocks.Block, 0) go func() { defer close(out) - var misses []u.Key + var misses []key.Key for _, k := range ks { hit, err := e.bs.Get(k) if err != nil { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 1bbbf3f104..41e8bb216a 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -9,12 +9,12 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - u "github.com/ipfs/go-ipfs/util" + key "github.com/ipfs/go-ipfs/blocks/key" ) func TestBlockReturnsErr(t *testing.T) { off := Exchange(bstore()) - _, err := off.GetBlock(context.Background(), u.Key("foo")) + _, err := off.GetBlock(context.Background(), key.Key("foo")) if err != nil { return // as desired } @@ -49,8 +49,8 @@ func TestGetBlocks(t *testing.T) { } } - request := func() []u.Key { - var ks []u.Key + request := func() []key.Key { + var ks []key.Key for _, b := range expected { ks = append(ks, b.Key()) From 9eb4f18bb043deeb6d9b29603b66ccef5004d16d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 0778/3147] move util.Key into its own package under blocks This commit was moved from ipfs/go-ipfs-exchange-interface@1729a4c601c00e4fd8ffce7774449bc970152d0f --- exchange/interface.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 3ccda263ca..81ae3483aa 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -6,16 +6,16 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" - u "github.com/ipfs/go-ipfs/util" + key "github.com/ipfs/go-ipfs/blocks/key" ) // Any type that implements exchange.Interface may be used as an IPFS block // exchange protocol. type Interface interface { // GetBlock returns the block associated with a given key. - GetBlock(context.Context, u.Key) (*blocks.Block, error) + GetBlock(context.Context, key.Key) (*blocks.Block, error) - GetBlocks(context.Context, []u.Key) (<-chan *blocks.Block, error) + GetBlocks(context.Context, []key.Key) (<-chan *blocks.Block, error) // TODO Should callers be concerned with whether the block was made // available on the network? From 7fd722e165b61fe532a6ed9582d0c1feeae0d5cc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 08:08:51 -0700 Subject: [PATCH 0779/3147] fix rampant memory leak in providers records storage address comments from CR use map and array combo for better perf This commit was moved from ipfs/go-ipfs-routing@bcb5803a90e3fa8bf73a15b3dd7c22d5e1b3acb0 --- routing/dht/providers.go | 70 ++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 2b7fa2cbd2..74c79b8e97 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -10,22 +10,25 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) -type providerInfo struct { - Creation time.Time - Value peer.ID -} - type ProviderManager struct { - providers map[key.Key][]*providerInfo + // all non channel fields are meant to be accessed only within + // the run method + providers map[key.Key]*providerSet local map[key.Key]struct{} lpeer peer.ID - getlocal chan chan []key.Key - newprovs chan *addProv - getprovs chan *getProv - period time.Duration + + getlocal chan chan []key.Key + newprovs chan *addProv + getprovs chan *getProv + period time.Duration ctxgroup.ContextGroup } +type providerSet struct { + providers []peer.ID + set map[peer.ID]time.Time +} + type addProv struct { k key.Key val peer.ID @@ -40,7 +43,7 @@ func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { pm := new(ProviderManager) pm.getprovs = make(chan *getProv) pm.newprovs = make(chan *addProv) - pm.providers = make(map[key.Key][]*providerInfo) + pm.providers = make(map[key.Key]*providerSet) pm.getlocal = make(chan chan []key.Key) pm.local = make(map[key.Key]struct{}) pm.ContextGroup = ctxgroup.WithContext(ctx) @@ -61,18 +64,20 @@ func (pm *ProviderManager) run() { if np.val == pm.lpeer { pm.local[np.k] = struct{}{} } - pi := new(providerInfo) - pi.Creation = time.Now() - pi.Value = np.val - arr := pm.providers[np.k] - pm.providers[np.k] = append(arr, pi) + provs, ok := pm.providers[np.k] + if !ok { + provs = newProviderSet() + pm.providers[np.k] = provs + } + provs.Add(np.val) case gp := <-pm.getprovs: var parr []peer.ID - provs := pm.providers[gp.k] - for _, p := range provs { - parr = append(parr, p.Value) + provs, ok := pm.providers[gp.k] + if ok { + parr = provs.providers } + gp.resp <- parr case lc := <-pm.getlocal: @@ -83,14 +88,16 @@ func (pm *ProviderManager) run() { lc <- keys case <-tick.C: - for k, provs := range pm.providers { - var filtered []*providerInfo - for _, p := range provs { - if time.Now().Sub(p.Creation) < time.Hour*24 { + for _, provs := range pm.providers { + var filtered []peer.ID + for p, t := range provs.set { + if time.Now().Sub(t) > time.Hour*24 { + delete(provs.set, p) + } else { filtered = append(filtered, p) } } - pm.providers[k] = filtered + provs.providers = filtered } case <-pm.Closing(): @@ -133,3 +140,18 @@ func (pm *ProviderManager) GetLocal() []key.Key { pm.getlocal <- resp return <-resp } + +func newProviderSet() *providerSet { + return &providerSet{ + set: make(map[peer.ID]time.Time), + } +} + +func (ps *providerSet) Add(p peer.ID) { + _, found := ps.set[p] + if !found { + ps.providers = append(ps.providers, p) + } + + ps.set[p] = time.Now() +} From 0d10db32517534746ee7c2f53b3ac6a423f177a6 Mon Sep 17 00:00:00 2001 From: rht Date: Wed, 3 Jun 2015 18:12:34 +0700 Subject: [PATCH 0780/3147] Swap all 'crypto/rand' rng in tests with 'math/rand' This commit was moved from ipfs/go-ipfs-chunker@620aaba51829a4cd8ba89014e18bab8cc6db2689 --- chunker/splitting_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 1385b9069a..232b4fde97 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -2,14 +2,15 @@ package chunk import ( "bytes" - "crypto/rand" "io" "testing" + + u "github.com/ipfs/go-ipfs/util" ) func randBuf(t *testing.T, size int) []byte { buf := make([]byte, size) - if _, err := rand.Read(buf); err != nil { + if _, err := u.NewTimeSeededRand().Read(buf); err != nil { t.Fatal("failed to read enough randomness") } return buf From dc352f76e8f4927ff885cffaa1b979b568fbfbe2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 3 Jun 2015 14:27:31 -0700 Subject: [PATCH 0781/3147] fix up some dependencies to avoid circular record deps This commit was moved from ipfs/go-blockservice@db38dad045710157d5e467dab2e638365e6c213a --- blockservice/{ => test}/blocks_test.go | 3 ++- blockservice/{ => test}/mock.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) rename blockservice/{ => test}/blocks_test.go (97%) rename blockservice/{ => test}/mock.go (92%) diff --git a/blockservice/blocks_test.go b/blockservice/test/blocks_test.go similarity index 97% rename from blockservice/blocks_test.go rename to blockservice/test/blocks_test.go index a703cfc725..cb7f665ace 100644 --- a/blockservice/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -1,4 +1,4 @@ -package blockservice +package bstest import ( "bytes" @@ -12,6 +12,7 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" + . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" u "github.com/ipfs/go-ipfs/util" ) diff --git a/blockservice/mock.go b/blockservice/test/mock.go similarity index 92% rename from blockservice/mock.go rename to blockservice/test/mock.go index 293d11f16c..4c4009de21 100644 --- a/blockservice/mock.go +++ b/blockservice/test/mock.go @@ -1,6 +1,7 @@ -package blockservice +package bstest import ( + . "github.com/ipfs/go-ipfs/blockservice" bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" mockrouting "github.com/ipfs/go-ipfs/routing/mock" From b9e325481085aaa7a38f5fabd9fff9a2de798503 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 May 2015 13:53:11 -0700 Subject: [PATCH 0782/3147] implement an ipfs patch command for modifying merkledag objects WIP: object creator command better docs move patch command into object namespace dont ignore cancel funcs addressing comment from CR add two new subcommands to object patch and clean up main Run func cancel contexts in early returns switch to util.Key This commit was moved from ipfs/go-ipfs-routing@57474f176cfba73a2ab86fa888dfc1271cf5f683 --- routing/record/record.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routing/record/record.go b/routing/record/record.go index 4e1d54a4d0..8db5758e0f 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -6,11 +6,13 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" key "github.com/ipfs/go-ipfs/blocks/key" + dag "github.com/ipfs/go-ipfs/merkledag" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" ) +var _ = dag.FetchGraph var log = eventlog.Logger("routing/record") // MakePutRecord creates and signs a dht record for the given key/value pair From 32513ce4e2d529f3ffdb96fc931e2e82445e8818 Mon Sep 17 00:00:00 2001 From: rht Date: Fri, 12 Jun 2015 04:36:25 +0700 Subject: [PATCH 0783/3147] Replace Critical{,f} with Error{,f} Except when there is an explicit os.Exit(1) after the Critical line, then replace with Fatal{,f}. golang's log and logrus already call os.Exit(1) by default with Fatal. License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@356d51c34f464d5bb1f01efc666d29555d4ce77b --- routing/dht/handlers.go | 2 +- routing/supernode/proxy/standard.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index b3db5d87ef..36a92a2513 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -89,7 +89,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess for _, pi := range closerinfos { log.Debugf("handleGetValue returning closer peer: '%s'", pi.ID) if len(pi.Addrs) < 1 { - log.Criticalf(`no addresses on peer being sent! + log.Errorf(`no addresses on peer being sent! [local:%s] [sending:%s] [remote:%s]`, dht.self, pi.ID, p) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index b85b053e55..fe723409eb 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -50,7 +50,7 @@ func (px *standard) Bootstrap(ctx context.Context) error { cxns = append(cxns, info) } if len(cxns) == 0 { - log.Critical("unable to bootstrap to any supernode routers") + log.Error("unable to bootstrap to any supernode routers") } else { log.Infof("bootstrapped to %d supernode routers: %s", len(cxns), cxns) } From 8794096716adb98c8c0f585c5a5f10c7c3780674 Mon Sep 17 00:00:00 2001 From: rht Date: Fri, 12 Jun 2015 04:48:27 +0700 Subject: [PATCH 0784/3147] Remove Notice{,f} logging interface And substitute the lines using Notice{,f} with Info{,f} License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@3305304c97624a7f0ac55f8065a48f6ae87cc3e3 --- routing/dht/dht_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index a6eb41a778..83c3b2b202 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -773,7 +773,7 @@ func TestConnectCollision(t *testing.T) { runTimes := 10 for rtime := 0; rtime < runTimes; rtime++ { - log.Notice("Running Time: ", rtime) + log.Info("Running Time: ", rtime) ctx := context.Background() From 3d183af45e3de3cd78517030d8987c51574dcf95 Mon Sep 17 00:00:00 2001 From: rht Date: Fri, 3 Jul 2015 17:31:46 +0700 Subject: [PATCH 0785/3147] Add path validation in Resolver.ResolvePath Add ErrNoComponents in ParsePath validation & remove redundant path validation. Any lines using core.Resolve & Resolver.ResolvePath will have their path validated. License: MIT Signed-off-by: rht This commit was moved from ipfs/go-path@2f07b0e127840688f68d93c7cd73582238d4f43e --- path/path.go | 16 +++++++++++----- path/resolver.go | 5 +++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index f98f2cd13c..6fe75adbed 100644 --- a/path/path.go +++ b/path/path.go @@ -61,12 +61,15 @@ func ParsePath(txt string) (Path, error) { } if parts[0] != "" { - return "", ErrBadPath + if _, err := ParseKeyToPath(parts[0]); err != nil { + return "", ErrBadPath + } + // The case when the path starts with hash without a protocol prefix + return Path("/ipfs/" + txt), nil } if parts[1] == "ipfs" { - _, err := ParseKeyToPath(parts[2]) - if err != nil { + if _, err := ParseKeyToPath(parts[2]); err != nil { return "", err } } else if parts[1] != "ipns" { @@ -77,13 +80,16 @@ func ParsePath(txt string) (Path, error) { } func ParseKeyToPath(txt string) (Path, error) { + if txt == "" { + return "", ErrNoComponents + } + chk := b58.Decode(txt) if len(chk) == 0 { return "", errors.New("not a key") } - _, err := mh.Cast(chk) - if err != nil { + if _, err := mh.Cast(chk); err != nil { return "", err } return FromKey(key.Key(chk)), nil diff --git a/path/resolver.go b/path/resolver.go index ce1f64a7ea..2880750004 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -65,6 +65,11 @@ func SplitAbsPath(fpath Path) (mh.Multihash, []string, error) { // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (*merkledag.Node, error) { + // validate path + if err := fpath.IsValid(); err != nil { + return nil, err + } + nodes, err := s.ResolvePathComponents(ctx, fpath) if err != nil || nodes == nil { return nil, err From 2fbecb774932a42d82fcf68658a05c96fa382b8b Mon Sep 17 00:00:00 2001 From: rht Date: Wed, 17 Jun 2015 19:18:52 +0700 Subject: [PATCH 0786/3147] Replace ctxgroup.ContextGroup -> goprocess.Process License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@fb7fd0365c77af9877a04c65708726fc2e85ac6f --- routing/dht/dht.go | 20 +++++++++++--------- routing/dht/providers.go | 13 +++++-------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b1b13985bf..fcc14273f8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -23,8 +23,9 @@ import ( u "github.com/ipfs/go-ipfs/util" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - ctxgroup "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) @@ -57,7 +58,8 @@ type IpfsDHT struct { Validator record.Validator // record validator funcs - ctxgroup.ContextGroup + Context context.Context + goprocess.Process } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -71,14 +73,17 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip // register for network notifs. dht.host.Network().Notify((*netNotifiee)(dht)) - dht.ContextGroup = ctxgroup.WithContextAndTeardown(ctx, func() error { + procctx = goprocessctx.WithContext(ctx) + procctx.SetTeardown(func() error { // remove ourselves from network notifs. dht.host.Network().StopNotify((*netNotifiee)(dht)) return nil }) + dht.Process = procctx + dht.Context = ctx h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) - dht.providers = NewProviderManager(dht.Context(), dht.self) + dht.providers = NewProviderManager(dht.Context, dht.self) dht.AddChild(dht.providers) dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) @@ -88,8 +93,7 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.Validator["pk"] = record.PublicKeyValidator if doPinging { - dht.Children().Add(1) - go dht.PingRoutine(time.Second * 10) + dht.Go(func() { dht.PingRoutine(time.Second * 10) }) } return dht } @@ -348,8 +352,6 @@ func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, p peer.ID) error // PingRoutine periodically pings nearest neighbors. func (dht *IpfsDHT) PingRoutine(t time.Duration) { - defer dht.Children().Done() - tick := time.Tick(t) for { select { @@ -358,7 +360,7 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { rand.Read(id) peers := dht.routingTable.NearestPeers(kb.ConvertKey(key.Key(id)), 5) for _, p := range peers { - ctx, cancel := context.WithTimeout(dht.Context(), time.Second*5) + ctx, cancel := context.WithTimeout(dht.Context, time.Second*5) _, err := dht.Ping(ctx, p) if err != nil { log.Debugf("Ping error: %s", err) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 74c79b8e97..46675604a0 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -3,7 +3,8 @@ package dht import ( "time" - ctxgroup "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" @@ -21,7 +22,7 @@ type ProviderManager struct { newprovs chan *addProv getprovs chan *getProv period time.Duration - ctxgroup.ContextGroup + goprocess.Process } type providerSet struct { @@ -46,17 +47,13 @@ func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { pm.providers = make(map[key.Key]*providerSet) pm.getlocal = make(chan chan []key.Key) pm.local = make(map[key.Key]struct{}) - pm.ContextGroup = ctxgroup.WithContext(ctx) - - pm.Children().Add(1) - go pm.run() + pm.Process = goprocessctx.WithContext(ctx) + pm.Go(pm.run) return pm } func (pm *ProviderManager) run() { - defer pm.Children().Done() - tick := time.NewTicker(time.Hour) for { select { From bf647de8e206f8f46706fe8ed31163eb0e7cba3a Mon Sep 17 00:00:00 2001 From: rht Date: Thu, 18 Jun 2015 17:17:38 +0700 Subject: [PATCH 0787/3147] Change Process interface into object variable License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@50d59a421aa2ddd8e7259dd9178febfc6457dd9c --- routing/dht/dht.go | 39 +++++++++++++++++++++++++---------- routing/dht/notif.go | 4 ++-- routing/dht/providers.go | 8 +++---- routing/dht/providers_test.go | 2 +- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index fcc14273f8..d6a07073e0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -58,8 +58,8 @@ type IpfsDHT struct { Validator record.Validator // record validator funcs - Context context.Context - goprocess.Process + ctx context.Context + proc goprocess.Process } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -73,18 +73,18 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip // register for network notifs. dht.host.Network().Notify((*netNotifiee)(dht)) - procctx = goprocessctx.WithContext(ctx) - procctx.SetTeardown(func() error { + proc := goprocessctx.WithContext(ctx) + proc.SetTeardown(func() error { // remove ourselves from network notifs. dht.host.Network().StopNotify((*netNotifiee)(dht)) return nil }) - dht.Process = procctx - dht.Context = ctx + dht.proc = proc + dht.ctx = ctx h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) - dht.providers = NewProviderManager(dht.Context, dht.self) - dht.AddChild(dht.providers) + dht.providers = NewProviderManager(dht.ctx, dht.self) + dht.proc.AddChild(dht.providers.proc) dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) dht.birth = time.Now() @@ -93,7 +93,9 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.Validator["pk"] = record.PublicKeyValidator if doPinging { - dht.Go(func() { dht.PingRoutine(time.Second * 10) }) + dht.proc.Go(func(p goprocess.Process) { + dht.PingRoutine(time.Second * 10) + }) } return dht } @@ -360,15 +362,30 @@ func (dht *IpfsDHT) PingRoutine(t time.Duration) { rand.Read(id) peers := dht.routingTable.NearestPeers(kb.ConvertKey(key.Key(id)), 5) for _, p := range peers { - ctx, cancel := context.WithTimeout(dht.Context, time.Second*5) + ctx, cancel := context.WithTimeout(dht.Context(), time.Second*5) _, err := dht.Ping(ctx, p) if err != nil { log.Debugf("Ping error: %s", err) } cancel() } - case <-dht.Closing(): + case <-dht.proc.Closing(): return } } } + +// Context return dht's context +func (dht *IpfsDHT) Context() context.Context { + return dht.ctx +} + +// Process return dht's process +func (dht *IpfsDHT) Process() goprocess.Process { + return dht.proc +} + +// Close calls Process Close +func (dht *IpfsDHT) Close() error { + return dht.proc.Close() +} diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 70144481a3..cfe411c38e 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -16,7 +16,7 @@ func (nn *netNotifiee) DHT() *IpfsDHT { func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { dht := nn.DHT() select { - case <-dht.Closing(): + case <-dht.Process().Closing(): return default: } @@ -26,7 +26,7 @@ func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { dht := nn.DHT() select { - case <-dht.Closing(): + case <-dht.Process().Closing(): return default: } diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 46675604a0..17455b3368 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -22,7 +22,7 @@ type ProviderManager struct { newprovs chan *addProv getprovs chan *getProv period time.Duration - goprocess.Process + proc goprocess.Process } type providerSet struct { @@ -47,8 +47,8 @@ func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { pm.providers = make(map[key.Key]*providerSet) pm.getlocal = make(chan chan []key.Key) pm.local = make(map[key.Key]struct{}) - pm.Process = goprocessctx.WithContext(ctx) - pm.Go(pm.run) + pm.proc = goprocessctx.WithContext(ctx) + pm.proc.Go(func(p goprocess.Process) { pm.run() }) return pm } @@ -97,7 +97,7 @@ func (pm *ProviderManager) run() { provs.providers = filtered } - case <-pm.Closing(): + case <-pm.proc.Closing(): return } } diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index ecf937962f..7e2e47d933 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -19,5 +19,5 @@ func TestProviderManager(t *testing.T) { if len(resp) != 1 { t.Fatal("Could not retrieve provider.") } - p.Close() + p.proc.Close() } From d641888bc159575f9f964064c321357b39befe02 Mon Sep 17 00:00:00 2001 From: rht Date: Mon, 22 Jun 2015 21:57:14 +0700 Subject: [PATCH 0788/3147] Use WithContextAndTeardown whenever possible License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@d3b46b8db72775d1346cc1d5628a7aed68528c9e --- routing/dht/dht.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d6a07073e0..205e6d980f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -73,13 +73,12 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip // register for network notifs. dht.host.Network().Notify((*netNotifiee)(dht)) - proc := goprocessctx.WithContext(ctx) - proc.SetTeardown(func() error { + dht.proc = goprocessctx.WithContextAndTeardown(ctx, func() error { // remove ourselves from network notifs. dht.host.Network().StopNotify((*netNotifiee)(dht)) return nil }) - dht.proc = proc + dht.ctx = ctx h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) From 8e1a03e112b3de36047b6900e1ec16d07babfea2 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 5 Jul 2015 09:35:06 +0700 Subject: [PATCH 0789/3147] Make sure process context is set last License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@b3235e16796636365e6995f647c34251d04e4bd9 --- routing/dht/dht.go | 3 ++- routing/dht/query.go | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 205e6d980f..9dc74daeb8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -73,7 +73,7 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip // register for network notifs. dht.host.Network().Notify((*netNotifiee)(dht)) - dht.proc = goprocessctx.WithContextAndTeardown(ctx, func() error { + dht.proc = goprocess.WithTeardown(func() error { // remove ourselves from network notifs. dht.host.Network().StopNotify((*netNotifiee)(dht)) return nil @@ -84,6 +84,7 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) dht.providers = NewProviderManager(dht.ctx, dht.self) dht.proc.AddChild(dht.providers.proc) + goprocessctx.CloseAfterContext(dht.proc, ctx) dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) dht.birth = time.Now() diff --git a/routing/dht/query.go b/routing/dht/query.go index c69437f499..a6c8a14b3e 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -127,10 +127,7 @@ func (r *dhtQueryRunner) Run(ctx context.Context, peers []peer.ID) (*dhtQueryRes // now, if the context finishes, close the proc. // we have to do it here because the logic before is setup, which // should run without closing the proc. - go func() { - <-ctx.Done() - r.proc.Close() - }() + ctxproc.CloseAfterContext(r.proc, ctx) select { case <-r.peersRemaining.Done(): From 5ed8375b160883c46976f773c67d7afe770f9599 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 26 Jun 2015 09:44:00 -0700 Subject: [PATCH 0790/3147] use batching transaction interface from datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@034441cfa5c3179ef8f52963810166060886dfb5 --- blockservice/blockservice.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index bd7b447899..eec292b21d 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -77,6 +77,22 @@ func (s *BlockService) AddBlock(b *blocks.Block) (key.Key, error) { return k, nil } +func (s *BlockService) AddBlocks(bs []*blocks.Block) ([]key.Key, error) { + err := s.Blockstore.PutMany(bs) + if err != nil { + return nil, err + } + + var ks []key.Key + for _, b := range bs { + if err := s.worker.HasBlock(b); err != nil { + return nil, errors.New("blockservice is closed") + } + ks = append(ks, b.Key()) + } + return ks, nil +} + // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (*blocks.Block, error) { From 67314abf5f541d2ad6c3b65232b6ddce23ed0393 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 26 Jun 2015 09:44:00 -0700 Subject: [PATCH 0791/3147] use batching transaction interface from datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@7e356be6b49c16778545013f80d97e18cfe7fd64 --- blockstore/blockstore.go | 23 ++++++++++++++++++++++- blockstore/blockstore_test.go | 4 ++++ blockstore/write_cache.go | 10 ++++++++++ blockstore/write_cache_test.go | 4 ++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 8521fa1376..63fa7f9eba 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -30,6 +30,7 @@ type Blockstore interface { Has(key.Key) (bool, error) Get(key.Key) (*blocks.Block, error) Put(*blocks.Block) error + PutMany([]*blocks.Block) error AllKeysChan(ctx context.Context) (<-chan key.Key, error) } @@ -42,7 +43,7 @@ func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { } type blockstore struct { - datastore ds.Datastore + datastore ds.BatchingDatastore // cant be ThreadSafeDatastore cause namespace.Datastore doesnt support it. // we do check it on `NewBlockstore` though. } @@ -74,6 +75,26 @@ func (bs *blockstore) Put(block *blocks.Block) error { return bs.datastore.Put(k, block.Data) } +func (bs *blockstore) PutMany(blocks []*blocks.Block) error { + t, err := bs.datastore.Batch() + if err != nil { + return err + } + for _, b := range blocks { + k := b.Key().DsKey() + exists, err := bs.datastore.Has(k) + if err == nil && exists { + continue + } + + err = t.Put(k, b.Data) + if err != nil { + return err + } + } + return t.Commit() +} + func (bs *blockstore) Has(k key.Key) (bool, error) { return bs.datastore.Has(k.DsKey()) } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index ee49b260ca..934c7933e7 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -266,3 +266,7 @@ func (c *queryTestDS) Query(q dsq.Query) (dsq.Results, error) { } return c.ds.Query(q) } + +func (c *queryTestDS) Batch() (ds.Batch, error) { + return ds.NewBasicBatch(c), nil +} diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index fd7fd5d0ed..5b2f55a2a2 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -45,6 +45,16 @@ func (w *writecache) Put(b *blocks.Block) error { return w.blockstore.Put(b) } +func (w *writecache) PutMany(bs []*blocks.Block) error { + var good []*blocks.Block + for _, b := range bs { + if _, ok := w.cache.Get(b.Key()); !ok { + good = append(good, b) + } + } + return w.blockstore.PutMany(good) +} + func (w *writecache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return w.blockstore.AllKeysChan(ctx) } diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index cf8150ba68..a51d2f7c66 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -88,3 +88,7 @@ func (c *callbackDatastore) Query(q dsq.Query) (dsq.Results, error) { c.f() return c.ds.Query(q) } + +func (c *callbackDatastore) Batch() (ds.Batch, error) { + return ds.NewBasicBatch(c), nil +} From e10316d09192d7b336024eb0e08c4337885ebda5 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Jul 2015 16:34:16 -0700 Subject: [PATCH 0792/3147] expose internal/pb packages. we shouldn't use internal packages. License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-namesys@0321fe902530db3ee024b3b56c7ef927dc941ef9 --- namesys/{internal => }/pb/Makefile | 0 namesys/{internal => }/pb/namesys.pb.go | 0 namesys/{internal => }/pb/namesys.proto | 0 namesys/publisher.go | 2 +- namesys/routing.go | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) rename namesys/{internal => }/pb/Makefile (100%) rename namesys/{internal => }/pb/namesys.pb.go (100%) rename namesys/{internal => }/pb/namesys.proto (100%) diff --git a/namesys/internal/pb/Makefile b/namesys/pb/Makefile similarity index 100% rename from namesys/internal/pb/Makefile rename to namesys/pb/Makefile diff --git a/namesys/internal/pb/namesys.pb.go b/namesys/pb/namesys.pb.go similarity index 100% rename from namesys/internal/pb/namesys.pb.go rename to namesys/pb/namesys.pb.go diff --git a/namesys/internal/pb/namesys.proto b/namesys/pb/namesys.proto similarity index 100% rename from namesys/internal/pb/namesys.proto rename to namesys/pb/namesys.proto diff --git a/namesys/publisher.go b/namesys/publisher.go index f20009b7dc..3f5e15ae5e 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" - pb "github.com/ipfs/go-ipfs/namesys/internal/pb" + pb "github.com/ipfs/go-ipfs/namesys/pb" ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" diff --git a/namesys/routing.go b/namesys/routing.go index 40acf38bd4..9ff2a62f68 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" - pb "github.com/ipfs/go-ipfs/namesys/internal/pb" + pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" From dc09b2f8eb0c40a70500376b15fd3d007b66645e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 10 Jul 2015 17:48:54 -0700 Subject: [PATCH 0793/3147] moved util/ctx to github.com/jbenet/go-context License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-ipfs-routing@d25524a4f36fab82a2870afc69e99e9e3f36d728 --- routing/dht/dht_net.go | 17 ++++++++--------- routing/dht/records.go | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 44767fbe48..722ece7ea2 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,13 +4,12 @@ import ( "errors" "time" + ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ctxutil "github.com/ipfs/go-ipfs/util/ctx" - - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) // handleNewStream implements the inet.StreamHandler @@ -22,8 +21,8 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { defer s.Close() ctx := dht.Context() - cr := ctxutil.NewReader(ctx, s) // ok to use. we defer close stream in this func - cw := ctxutil.NewWriter(ctx, s) // ok to use. we defer close stream in this func + cr := ctxio.NewReader(ctx, s) // ok to use. we defer close stream in this func + cw := ctxio.NewWriter(ctx, s) // ok to use. we defer close stream in this func r := ggio.NewDelimitedReader(cr, inet.MessageSizeMax) w := ggio.NewDelimitedWriter(cw) mPeer := s.Conn().RemotePeer() @@ -78,8 +77,8 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message } defer s.Close() - cr := ctxutil.NewReader(ctx, s) // ok to use. we defer close stream in this func - cw := ctxutil.NewWriter(ctx, s) // ok to use. we defer close stream in this func + cr := ctxio.NewReader(ctx, s) // ok to use. we defer close stream in this func + cw := ctxio.NewWriter(ctx, s) // ok to use. we defer close stream in this func r := ggio.NewDelimitedReader(cr, inet.MessageSizeMax) w := ggio.NewDelimitedWriter(cw) @@ -116,7 +115,7 @@ func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message } defer s.Close() - cw := ctxutil.NewWriter(ctx, s) // ok to use. we defer close stream in this func + cw := ctxio.NewWriter(ctx, s) // ok to use. we defer close stream in this func w := ggio.NewDelimitedWriter(cw) if err := w.WriteMsg(pmes); err != nil { diff --git a/routing/dht/records.go b/routing/dht/records.go index 973ceca96b..3c7d1d1764 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -3,13 +3,13 @@ package dht import ( "fmt" + ctxfrac "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/frac" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ctxutil "github.com/ipfs/go-ipfs/util/ctx" ) func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { @@ -22,7 +22,7 @@ func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, err } // ok, try the node itself. if they're overwhelmed or slow we can move on. - ctxT, cancelFunc := ctxutil.WithDeadlineFraction(ctx, 0.3) + ctxT, cancelFunc := ctxfrac.WithDeadlineFraction(ctx, 0.3) defer cancelFunc() if pk, err := dht.getPublicKeyFromNode(ctx, p); err == nil { err := dht.peerstore.AddPubKey(p, pk) From 8e301c93637cf3b2ae085b1279327a57fcbf7691 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 13 Jul 2015 15:53:58 -0700 Subject: [PATCH 0794/3147] clean up unused dht methods License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d1c04c9be239c8f549900c6b135f9d989db8975e --- routing/dht/dht.go | 57 ----------------------------------------- routing/dht/dht_test.go | 9 ++++--- 2 files changed, 6 insertions(+), 60 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 9dc74daeb8..50c4df14c1 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -4,7 +4,6 @@ package dht import ( "bytes" - "crypto/rand" "errors" "fmt" "sync" @@ -33,8 +32,6 @@ var log = eventlog.Logger("dht") var ProtocolDHT protocol.ID = "/ipfs/dht" -const doPinging = false - // NumBootstrapQueries defines the number of random dht queries to do to // collect members of the routing table. const NumBootstrapQueries = 5 @@ -92,11 +89,6 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.Validator = make(record.Validator) dht.Validator["pk"] = record.PublicKeyValidator - if doPinging { - dht.proc.Go(func(p goprocess.Process) { - dht.PingRoutine(time.Second * 10) - }) - } return dht } @@ -110,23 +102,6 @@ func (dht *IpfsDHT) log() eventlog.EventLogger { return log // TODO rm } -// Connect to a new peer at the given address, ping and add to the routing table -func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { - // TODO: change interface to accept a PeerInfo as well. - if err := dht.host.Connect(ctx, peer.PeerInfo{ID: npeer}); err != nil { - return err - } - - // Ping new peer to register in their routing table - // NOTE: this should be done better... - if _, err := dht.Ping(ctx, npeer); err != nil { - return fmt.Errorf("failed to ping newly connected peer: %s", err) - } - log.Event(ctx, "connect", dht.self, npeer) - dht.Update(ctx, npeer) - return nil -} - // putValueToPeer stores the given key/value pair at the peer 'p' func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, key key.Key, rec *pb.Record) error { @@ -343,38 +318,6 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ return filtered } -func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, p peer.ID) error { - if p == dht.self { - return errors.New("attempting to ensure connection to self") - } - - // dial connection - return dht.host.Connect(ctx, peer.PeerInfo{ID: p}) -} - -// PingRoutine periodically pings nearest neighbors. -func (dht *IpfsDHT) PingRoutine(t time.Duration) { - tick := time.Tick(t) - for { - select { - case <-tick: - id := make([]byte, 16) - rand.Read(id) - peers := dht.routingTable.NearestPeers(kb.ConvertKey(key.Key(id)), 5) - for _, p := range peers { - ctx, cancel := context.WithTimeout(dht.Context(), time.Second*5) - _, err := dht.Ping(ctx, p) - if err != nil { - log.Debugf("Ping error: %s", err) - } - cancel() - } - case <-dht.proc.Closing(): - return - } - } -} - // Context return dht's context func (dht *IpfsDHT) Context() context.Context { return dht.ctx diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 83c3b2b202..edfffcebf0 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -74,7 +74,8 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { } a.peerstore.AddAddrs(idB, addrB, peer.TempAddrTTL) - if err := a.Connect(ctx, idB); err != nil { + pi := peer.PeerInfo{ID: idB} + if err := a.host.Connect(ctx, pi); err != nil { t.Fatal(err) } } @@ -789,12 +790,14 @@ func TestConnectCollision(t *testing.T) { errs := make(chan error) go func() { dhtA.peerstore.AddAddr(peerB, addrB, peer.TempAddrTTL) - err := dhtA.Connect(ctx, peerB) + pi := peer.PeerInfo{ID: peerB} + err := dhtA.host.Connect(ctx, pi) errs <- err }() go func() { dhtB.peerstore.AddAddr(peerA, addrA, peer.TempAddrTTL) - err := dhtB.Connect(ctx, peerA) + pi := peer.PeerInfo{ID: peerA} + err := dhtB.host.Connect(ctx, pi) errs <- err }() From e8f572739c4348134ba9ac37c5d9dfced2a2db21 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 13 Jul 2015 17:29:55 -0700 Subject: [PATCH 0795/3147] make ping its own protocol License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d38793fc0d7c142a549c2be2cc60bbf18d18182f --- routing/dht/dht_test.go | 29 ----------------------------- routing/dht/routing.go | 14 -------------- routing/routing.go | 4 ---- 3 files changed, 47 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index edfffcebf0..1358903a94 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -102,35 +102,6 @@ func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { cancel() } -func TestPing(t *testing.T) { - // t.Skip("skipping test to debug another") - ctx := context.Background() - - dhtA := setupDHT(ctx, t) - dhtB := setupDHT(ctx, t) - - peerA := dhtA.self - peerB := dhtB.self - - defer dhtA.Close() - defer dhtB.Close() - defer dhtA.host.Close() - defer dhtB.host.Close() - - connect(t, ctx, dhtA, dhtB) - - //Test that we can ping the node - ctxT, _ := context.WithTimeout(ctx, 100*time.Millisecond) - if _, err := dhtA.Ping(ctxT, peerB); err != nil { - t.Fatal(err) - } - - ctxT, _ = context.WithTimeout(ctx, 100*time.Millisecond) - if _, err := dhtB.Ping(ctxT, peerA); err != nil { - t.Fatal(err) - } -} - func TestValueGetSet(t *testing.T) { // t.Skip("skipping test to debug another") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index c4dc76ac48..190e502850 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -2,7 +2,6 @@ package dht import ( "sync" - "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" @@ -397,16 +396,3 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< return peerchan, nil } - -// Ping a peer, log the time it took -func (dht *IpfsDHT) Ping(ctx context.Context, p peer.ID) (time.Duration, error) { - // Thoughts: maybe this should accept an ID and do a peer lookup? - log.Debugf("ping %s start", p) - before := time.Now() - - pmes := pb.NewMessage(pb.Message_PING, "", 0) - _, err := dht.sendRequest(ctx, p, pmes) - log.Debugf("ping %s end (err = %s)", p, err) - - return time.Now().Sub(before), err -} diff --git a/routing/routing.go b/routing/routing.go index 31be8f3f86..db9b49dcdf 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -3,7 +3,6 @@ package routing import ( "errors" - "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" @@ -38,9 +37,6 @@ type IpfsRouting interface { // with relevant addresses. FindPeer(context.Context, peer.ID) (peer.PeerInfo, error) - // Ping a peer, log the time it took - Ping(context.Context, peer.ID) (time.Duration, error) - // Bootstrap allows callers to hint to the routing system to get into a // Boostrapped state Bootstrap(context.Context) error From 209781856b6d24a2efeba362d3458628a34e787d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 14 Jul 2015 12:01:01 -0700 Subject: [PATCH 0796/3147] fix parsing for paths of format /path License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@21baa8a3489a0bf41608dd0a9d975ba07d3dde52 --- path/path.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/path/path.go b/path/path.go index 6fe75adbed..e865ba2875 100644 --- a/path/path.go +++ b/path/path.go @@ -56,10 +56,9 @@ func ParsePath(txt string) (Path, error) { return kp, nil } } - if len(parts) < 3 { - return "", ErrBadPath - } + // if the path doesnt being with a '/' + // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { if _, err := ParseKeyToPath(parts[0]); err != nil { return "", ErrBadPath @@ -68,6 +67,10 @@ func ParsePath(txt string) (Path, error) { return Path("/ipfs/" + txt), nil } + if len(parts) < 3 { + return "", ErrBadPath + } + if parts[1] == "ipfs" { if _, err := ParseKeyToPath(parts[2]); err != nil { return "", err From b706aeffd89ed47bdd022ee6443b4f681ec9b35f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 14 Jul 2015 12:16:10 -0700 Subject: [PATCH 0797/3147] add tests for path parsing License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@d04dbfaade853ff7c9c6e68f4ef517ef73ebba3d --- path/path_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 path/path_test.go diff --git a/path/path_test.go b/path/path_test.go new file mode 100644 index 0000000000..f800e19e71 --- /dev/null +++ b/path/path_test.go @@ -0,0 +1,30 @@ +package path + +import ( + "testing" +) + +func TestPathParsing(t *testing.T) { + cases := map[string]bool{ + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": true, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b/c/d/e/f": true, + "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b/c/d/e/f": true, + "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, + "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b/c/d/e/f": true, + "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, + "/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": false, + "/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": false, + "/ipfs/": false, + "ipfs/": false, + "ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": false, + } + + for p, expected := range cases { + _, err := ParsePath(p) + valid := (err == nil) + if valid != expected { + t.Fatalf("expected %s to have valid == %s", p, expected) + } + } +} From 69dcba83a336777cab77d057e031640835fd14dc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Jul 2015 17:28:44 -0700 Subject: [PATCH 0798/3147] mark other nodes in routing table on test-connect License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@9d3d61d3e9e383c30a491e76357015ca87259908 --- routing/dht/dht_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1358903a94..6baedfbd11 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -78,6 +78,14 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { if err := a.host.Connect(ctx, pi); err != nil { t.Fatal(err) } + + for a.routingTable.Find(b.self) == "" { + time.Sleep(time.Millisecond * 5) + } + + for b.routingTable.Find(a.self) == "" { + time.Sleep(time.Millisecond * 5) + } } func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { From 0b3a6169c64184106cee06a1e56d0ca0db5e49df Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 19 Jul 2015 16:32:50 -0700 Subject: [PATCH 0799/3147] comment for future @jbenet and @whyrusleeping's to understand reasoning License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@11649ed7e207f1e22c15588a28c2f9c2d4064153 --- routing/dht/dht_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 6baedfbd11..2e63e438e3 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -79,6 +79,8 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { t.Fatal(err) } + // loop until connection notification has been received. + // under high load, this may not happen as immediately as we would like. for a.routingTable.Find(b.self) == "" { time.Sleep(time.Millisecond * 5) } From 9e5e1e17915c96b527dd0cc009f06cd7c0cbab3a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 24 Jul 2015 14:43:17 -0700 Subject: [PATCH 0800/3147] cmds/get: fix context timeout problem Get had a random timeout of 60s. This commit fixes that, wiring up our contexts correctly. License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-unixfs@1abe7ad833b2d8a09cd309f97fa603167642f6b3 --- unixfs/tar/reader.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 20e18fe114..1fac419226 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -9,7 +9,7 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" mdag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" @@ -28,7 +28,7 @@ type Reader struct { err error } -func NewReader(path path.Path, dag mdag.DAGService, dagnode *mdag.Node, compression int) (*Reader, error) { +func NewReader(ctx cxt.Context, path path.Path, dag mdag.DAGService, dagnode *mdag.Node, compression int) (*Reader, error) { reader := &Reader{ signalChan: make(chan struct{}), @@ -49,12 +49,11 @@ func NewReader(path path.Path, dag mdag.DAGService, dagnode *mdag.Node, compress // writeToBuf will write the data to the buffer, and will signal when there // is new data to read _, filename := gopath.Split(path.String()) - go reader.writeToBuf(dagnode, filename, 0) - + go reader.writeToBuf(ctx, dagnode, filename, 0) return reader, nil } -func (r *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { +func (r *Reader) writeToBuf(ctx cxt.Context, dagnode *mdag.Node, path string, depth int) { pb := new(upb.Data) err := proto.Unmarshal(dagnode.Data, pb) if err != nil { @@ -80,16 +79,13 @@ func (r *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { } r.flush() - ctx, cancel := context.WithTimeout(context.TODO(), time.Second*60) - defer cancel() - for i, ng := range r.dag.GetDAG(ctx, dagnode) { childNode, err := ng.Get(ctx) if err != nil { r.emitError(err) return } - r.writeToBuf(childNode, gopath.Join(path, dagnode.Links[i].Name), depth+1) + r.writeToBuf(ctx, childNode, gopath.Join(path, dagnode.Links[i].Name), depth+1) } return } @@ -108,7 +104,7 @@ func (r *Reader) writeToBuf(dagnode *mdag.Node, path string, depth int) { } r.flush() - reader, err := uio.NewDagReader(context.TODO(), dagnode, r.dag) + reader, err := uio.NewDagReader(ctx, dagnode, r.dag) if err != nil { r.emitError(err) return From b00b6e51cde8dfff3d3a09bdf2468e3a8bb11090 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 3 Aug 2015 16:30:23 +0200 Subject: [PATCH 0801/3147] unixfs/tar: cleaned up reader code License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-unixfs@ff5195ac74392251af2c59847f8de19048697fd5 --- unixfs/tar/reader.go | 117 +++++++++++++++++++++++++------------------ 1 file changed, 69 insertions(+), 48 deletions(-) diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go index 1fac419226..2c55b1bbc0 100644 --- a/unixfs/tar/reader.go +++ b/unixfs/tar/reader.go @@ -4,6 +4,7 @@ import ( "archive/tar" "bytes" "compress/gzip" + "fmt" "io" gopath "path" "time" @@ -49,71 +50,70 @@ func NewReader(ctx cxt.Context, path path.Path, dag mdag.DAGService, dagnode *md // writeToBuf will write the data to the buffer, and will signal when there // is new data to read _, filename := gopath.Split(path.String()) - go reader.writeToBuf(ctx, dagnode, filename, 0) + go func() { + if err := reader.writeNodeToBuf(ctx, dagnode, filename, 0); err != nil { + reader.emitError(err) + } + }() return reader, nil } -func (r *Reader) writeToBuf(ctx cxt.Context, dagnode *mdag.Node, path string, depth int) { - pb := new(upb.Data) - err := proto.Unmarshal(dagnode.Data, pb) - if err != nil { - r.emitError(err) - return - } - - if depth == 0 { - defer r.close() +func (r *Reader) writeDirToBuf(ctx cxt.Context, nd *mdag.Node, path string, depth int) error { + if err := writeDirHeader(r.writer, path); err != nil { + return err } + r.flush() - if pb.GetType() == upb.Data_Directory { - err = r.writer.WriteHeader(&tar.Header{ - Name: path, - Typeflag: tar.TypeDir, - Mode: 0777, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) + for i, ng := range r.dag.GetDAG(ctx, nd) { + child, err := ng.Get(ctx) if err != nil { - r.emitError(err) - return + return err } - r.flush() - for i, ng := range r.dag.GetDAG(ctx, dagnode) { - childNode, err := ng.Get(ctx) - if err != nil { - r.emitError(err) - return - } - r.writeToBuf(ctx, childNode, gopath.Join(path, dagnode.Links[i].Name), depth+1) + npath := gopath.Join(path, nd.Links[i].Name) + if err := r.writeNodeToBuf(ctx, child, npath, depth+1); err != nil { + return err } - return } - err = r.writer.WriteHeader(&tar.Header{ - Name: path, - Size: int64(pb.GetFilesize()), - Typeflag: tar.TypeReg, - Mode: 0644, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) - if err != nil { - r.emitError(err) - return + return nil +} + +func (r *Reader) writeFileToBuf(ctx cxt.Context, nd *mdag.Node, pb *upb.Data, path string, depth int) error { + if err := writeFileHeader(r.writer, path, pb.GetFilesize()); err != nil { + return err } r.flush() - reader, err := uio.NewDagReader(ctx, dagnode, r.dag) + reader, err := uio.NewDagReader(ctx, nd, r.dag) if err != nil { - r.emitError(err) - return + return err } - err = r.syncCopy(reader) - if err != nil { - r.emitError(err) - return + if err := r.syncCopy(reader); err != nil { + return err + } + + return nil +} + +func (r *Reader) writeNodeToBuf(ctx cxt.Context, nd *mdag.Node, path string, depth int) error { + pb := new(upb.Data) + if err := proto.Unmarshal(nd.Data, pb); err != nil { + return err + } + + if depth == 0 { + defer r.close() + } + + switch pb.GetType() { + case upb.Data_Directory: + return r.writeDirToBuf(ctx, nd, path, depth) + case upb.Data_File: + return r.writeFileToBuf(ctx, nd, pb, path, depth) + default: + return fmt.Errorf("unixfs type not supported: %s", pb.GetType()) } } @@ -198,3 +198,24 @@ func (r *Reader) syncCopy(reader io.Reader) error { } return nil } + +func writeDirHeader(w *tar.Writer, path string) error { + return w.WriteHeader(&tar.Header{ + Name: path, + Typeflag: tar.TypeDir, + Mode: 0777, + ModTime: time.Now(), + // TODO: set mode, dates, etc. when added to unixFS + }) +} + +func writeFileHeader(w *tar.Writer, path string, size uint64) error { + return w.WriteHeader(&tar.Header{ + Name: path, + Size: int64(size), + Typeflag: tar.TypeReg, + Mode: 0644, + ModTime: time.Now(), + // TODO: set mode, dates, etc. when added to unixFS + }) +} From 07878391f3c8d6d7c46e03e5516d2b68fbb49784 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 4 Aug 2015 12:14:58 +0200 Subject: [PATCH 0802/3147] get: fix bug + improvements up until now there has been a very annoying bug with get, we would get halting behavior. I'm not 100% sure this commit fixes it, but it should. It certainly fixes others found in the process of digging into the get / tar extractor code. (wish we could repro the bug reliably enough to make a test case). This is a much cleaner tar writer. the ad-hoc, error-prone synch for the tar reader is gone (with i believe was incorrect). it is replaced with a simple pipe and bufio. The tar logic is now in tar.Writer, which writes unixfs dag nodes into a tar archive (no need for synch here). And get's reader is constructed with DagArchive which sets up the pipe + bufio. NOTE: this commit also changes this behavior of `get`: When retrieving a single file, if the file exists, get would fail. this emulated the behavior of wget by default, which (without opts) does not overwrite if the file is there. This change makes get fail if the file is available locally. This seems more intuitive to me as expected from a unix tool-- though perhaps it should be discussed more before adopting. Everything seems to work fine, and i have not been able to reproduce the get halt bug. License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-unixfs@3e90d66e463c7392ed80a75941d23ffe04e97b90 --- unixfs/tar/reader.go | 221 ------------------------------------------- unixfs/tar/writer.go | 170 +++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+), 221 deletions(-) delete mode 100644 unixfs/tar/reader.go create mode 100644 unixfs/tar/writer.go diff --git a/unixfs/tar/reader.go b/unixfs/tar/reader.go deleted file mode 100644 index 2c55b1bbc0..0000000000 --- a/unixfs/tar/reader.go +++ /dev/null @@ -1,221 +0,0 @@ -package tar - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "fmt" - "io" - gopath "path" - "time" - - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - - mdag "github.com/ipfs/go-ipfs/merkledag" - path "github.com/ipfs/go-ipfs/path" - uio "github.com/ipfs/go-ipfs/unixfs/io" - upb "github.com/ipfs/go-ipfs/unixfs/pb" -) - -type Reader struct { - buf bytes.Buffer - closed bool - signalChan chan struct{} - dag mdag.DAGService - resolver *path.Resolver - writer *tar.Writer - gzipWriter *gzip.Writer - err error -} - -func NewReader(ctx cxt.Context, path path.Path, dag mdag.DAGService, dagnode *mdag.Node, compression int) (*Reader, error) { - - reader := &Reader{ - signalChan: make(chan struct{}), - dag: dag, - } - - var err error - if compression != gzip.NoCompression { - reader.gzipWriter, err = gzip.NewWriterLevel(&reader.buf, compression) - if err != nil { - return nil, err - } - reader.writer = tar.NewWriter(reader.gzipWriter) - } else { - reader.writer = tar.NewWriter(&reader.buf) - } - - // writeToBuf will write the data to the buffer, and will signal when there - // is new data to read - _, filename := gopath.Split(path.String()) - go func() { - if err := reader.writeNodeToBuf(ctx, dagnode, filename, 0); err != nil { - reader.emitError(err) - } - }() - return reader, nil -} - -func (r *Reader) writeDirToBuf(ctx cxt.Context, nd *mdag.Node, path string, depth int) error { - if err := writeDirHeader(r.writer, path); err != nil { - return err - } - r.flush() - - for i, ng := range r.dag.GetDAG(ctx, nd) { - child, err := ng.Get(ctx) - if err != nil { - return err - } - - npath := gopath.Join(path, nd.Links[i].Name) - if err := r.writeNodeToBuf(ctx, child, npath, depth+1); err != nil { - return err - } - } - - return nil -} - -func (r *Reader) writeFileToBuf(ctx cxt.Context, nd *mdag.Node, pb *upb.Data, path string, depth int) error { - if err := writeFileHeader(r.writer, path, pb.GetFilesize()); err != nil { - return err - } - r.flush() - - reader, err := uio.NewDagReader(ctx, nd, r.dag) - if err != nil { - return err - } - - if err := r.syncCopy(reader); err != nil { - return err - } - - return nil -} - -func (r *Reader) writeNodeToBuf(ctx cxt.Context, nd *mdag.Node, path string, depth int) error { - pb := new(upb.Data) - if err := proto.Unmarshal(nd.Data, pb); err != nil { - return err - } - - if depth == 0 { - defer r.close() - } - - switch pb.GetType() { - case upb.Data_Directory: - return r.writeDirToBuf(ctx, nd, path, depth) - case upb.Data_File: - return r.writeFileToBuf(ctx, nd, pb, path, depth) - default: - return fmt.Errorf("unixfs type not supported: %s", pb.GetType()) - } -} - -func (r *Reader) Read(p []byte) (int, error) { - // wait for the goroutine that is writing data to the buffer to tell us - // there is something to read - if !r.closed { - <-r.signalChan - } - - if r.err != nil { - return 0, r.err - } - - if !r.closed { - defer r.signal() - } - - if r.buf.Len() == 0 { - if r.closed { - return 0, io.EOF - } - return 0, nil - } - - n, err := r.buf.Read(p) - if err == io.EOF && !r.closed || r.buf.Len() > 0 { - return n, nil - } - - return n, err -} - -func (r *Reader) signal() { - r.signalChan <- struct{}{} -} - -func (r *Reader) flush() { - r.signal() - <-r.signalChan -} - -func (r *Reader) emitError(err error) { - r.err = err - r.signal() -} - -func (r *Reader) close() { - r.closed = true - defer r.signal() - err := r.writer.Close() - if err != nil { - r.emitError(err) - return - } - if r.gzipWriter != nil { - err = r.gzipWriter.Close() - if err != nil { - r.emitError(err) - return - } - } -} - -func (r *Reader) syncCopy(reader io.Reader) error { - buf := make([]byte, 32*1024) - for { - nr, err := reader.Read(buf) - if nr > 0 { - _, err := r.writer.Write(buf[:nr]) - if err != nil { - return err - } - r.flush() - } - if err == io.EOF { - break - } - if err != nil { - return err - } - } - return nil -} - -func writeDirHeader(w *tar.Writer, path string) error { - return w.WriteHeader(&tar.Header{ - Name: path, - Typeflag: tar.TypeDir, - Mode: 0777, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) -} - -func writeFileHeader(w *tar.Writer, path string, size uint64) error { - return w.WriteHeader(&tar.Header{ - Name: path, - Size: int64(size), - Typeflag: tar.TypeReg, - Mode: 0644, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) -} diff --git a/unixfs/tar/writer.go b/unixfs/tar/writer.go new file mode 100644 index 0000000000..125beed96e --- /dev/null +++ b/unixfs/tar/writer.go @@ -0,0 +1,170 @@ +package tar + +import ( + "archive/tar" + "bufio" + "compress/gzip" + "fmt" + "io" + "path" + "time" + + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + mdag "github.com/ipfs/go-ipfs/merkledag" + uio "github.com/ipfs/go-ipfs/unixfs/io" + upb "github.com/ipfs/go-ipfs/unixfs/pb" +) + +// DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. +// TODO: does this need to be configurable? +var DefaultBufSize = 1048576 + +func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService, compression int) (io.Reader, error) { + + _, filename := path.Split(name) + + // need to connect a writer to a reader + piper, pipew := io.Pipe() + + // use a buffered writer to parallelize task + bufw := bufio.NewWriterSize(pipew, DefaultBufSize) + + // construct the tar writer + w, err := NewWriter(bufw, dag, compression) + if err != nil { + return nil, err + } + + // write all the nodes recursively + go func() { + if err := w.WriteNode(ctx, nd, filename); err != nil { + pipew.CloseWithError(err) + return + } + + if err := bufw.Flush(); err != nil { + pipew.CloseWithError(err) + return + } + + pipew.Close() // everything seems to be ok. + }() + + return piper, nil +} + +// Writer is a utility structure that helps to write +// unixfs merkledag nodes as a tar archive format. +// It wraps any io.Writer. +type Writer struct { + Dag mdag.DAGService + TarW *tar.Writer +} + +// NewWriter wraps given io.Writer. +// compression determines whether to use gzip compression. +func NewWriter(w io.Writer, dag mdag.DAGService, compression int) (*Writer, error) { + + if compression != gzip.NoCompression { + var err error + w, err = gzip.NewWriterLevel(w, compression) + if err != nil { + return nil, err + } + } + + return &Writer{ + Dag: dag, + TarW: tar.NewWriter(w), + }, nil +} + +func (w *Writer) WriteDir(ctx cxt.Context, nd *mdag.Node, fpath string) error { + if err := writeDirHeader(w.TarW, fpath); err != nil { + return err + } + + for i, ng := range w.Dag.GetDAG(ctx, nd) { + child, err := ng.Get(ctx) + if err != nil { + return err + } + + npath := path.Join(fpath, nd.Links[i].Name) + if err := w.WriteNode(ctx, child, npath); err != nil { + return err + } + } + + return nil +} + +func (w *Writer) WriteFile(ctx cxt.Context, nd *mdag.Node, fpath string) error { + pb := new(upb.Data) + if err := proto.Unmarshal(nd.Data, pb); err != nil { + return err + } + + return w.writeFile(ctx, nd, pb, fpath) +} + +func (w *Writer) writeFile(ctx cxt.Context, nd *mdag.Node, pb *upb.Data, fpath string) error { + if err := writeFileHeader(w.TarW, fpath, pb.GetFilesize()); err != nil { + return err + } + + dagr, err := uio.NewDagReader(ctx, nd, w.Dag) + if err != nil { + return err + } + + _, err = io.Copy(w.TarW, dagr) + if err != nil && err != io.EOF { + return err + } + + return nil +} + +func (w *Writer) WriteNode(ctx cxt.Context, nd *mdag.Node, fpath string) error { + pb := new(upb.Data) + if err := proto.Unmarshal(nd.Data, pb); err != nil { + return err + } + + switch pb.GetType() { + case upb.Data_Directory: + return w.WriteDir(ctx, nd, fpath) + case upb.Data_File: + return w.writeFile(ctx, nd, pb, fpath) + default: + return fmt.Errorf("unixfs type not supported: %s", pb.GetType()) + } +} + +func (w *Writer) Close() error { + return w.TarW.Close() +} + +func writeDirHeader(w *tar.Writer, fpath string) error { + return w.WriteHeader(&tar.Header{ + Name: fpath, + Typeflag: tar.TypeDir, + Mode: 0777, + ModTime: time.Now(), + // TODO: set mode, dates, etc. when added to unixFS + }) +} + +func writeFileHeader(w *tar.Writer, fpath string, size uint64) error { + return w.WriteHeader(&tar.Header{ + Name: fpath, + Size: int64(size), + Typeflag: tar.TypeReg, + Mode: 0644, + ModTime: time.Now(), + // TODO: set mode, dates, etc. when added to unixFS + }) +} From 27190f63b4e952eb7aa57561fc9c8f6ff65ddaf3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 29 Jul 2015 13:08:37 -0700 Subject: [PATCH 0803/3147] use rabin fingerprinting for a chunker License: MIT Signed-off-by: Jeromy implement rabin fingerprinting as a chunker for ipfs License: MIT Signed-off-by: Jeromy vendor correctly License: MIT Signed-off-by: Jeromy refactor chunking interface a little License: MIT Signed-off-by: Jeromy work chunking interface changes up into importer License: MIT Signed-off-by: Jeromy move chunker type parsing into its own file in chunk License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@1ff7a98492ada726d7693c6eb898732e61d19808 --- chunker/parse.go | 76 ++++++++++++++++++++++++++++ chunker/rabin.go | 103 +++++++++----------------------------- chunker/rabin_test.go | 84 +++++++++++++++++++++++++++++++ chunker/splitting.go | 70 +++++++++++++++++++------- chunker/splitting_test.go | 10 ++-- 5 files changed, 240 insertions(+), 103 deletions(-) create mode 100644 chunker/parse.go create mode 100644 chunker/rabin_test.go diff --git a/chunker/parse.go b/chunker/parse.go new file mode 100644 index 0000000000..55e96cc043 --- /dev/null +++ b/chunker/parse.go @@ -0,0 +1,76 @@ +package chunk + +import ( + "errors" + "fmt" + "io" + "strconv" + "strings" +) + +func FromString(r io.Reader, chunker string) (Splitter, error) { + switch { + case chunker == "" || chunker == "default": + return NewSizeSplitter(r, DefaultBlockSize), nil + + case strings.HasPrefix(chunker, "size-"): + sizeStr := strings.Split(chunker, "-")[1] + size, err := strconv.Atoi(sizeStr) + if err != nil { + return nil, err + } + return NewSizeSplitter(r, int64(size)), nil + + case strings.HasPrefix(chunker, "rabin"): + return parseRabinString(r, chunker) + + default: + return nil, fmt.Errorf("unrecognized chunker option: %s", chunker) + } +} + +func parseRabinString(r io.Reader, chunker string) (Splitter, error) { + parts := strings.Split(chunker, "-") + switch len(parts) { + case 1: + return NewRabin(r, uint64(DefaultBlockSize)), nil + case 2: + size, err := strconv.Atoi(parts[1]) + if err != nil { + return nil, err + } + return NewRabin(r, uint64(size)), nil + case 4: + sub := strings.Split(parts[1], ":") + if len(sub) > 1 && sub[0] != "min" { + return nil, errors.New("first label must be min") + } + min, err := strconv.Atoi(sub[len(sub)-1]) + if err != nil { + return nil, err + } + + sub = strings.Split(parts[2], ":") + if len(sub) > 1 && sub[0] != "avg" { + log.Error("sub == ", sub) + return nil, errors.New("second label must be avg") + } + avg, err := strconv.Atoi(sub[len(sub)-1]) + if err != nil { + return nil, err + } + + sub = strings.Split(parts[3], ":") + if len(sub) > 1 && sub[0] != "max" { + return nil, errors.New("final label must be max") + } + max, err := strconv.Atoi(sub[len(sub)-1]) + if err != nil { + return nil, err + } + + return NewRabinMinMax(r, uint64(min), uint64(avg), uint64(max)), nil + default: + return nil, errors.New("incorrect format (expected 'rabin' 'rabin-[avg]' or 'rabin-[min]-[avg]-[max]'") + } +} diff --git a/chunker/rabin.go b/chunker/rabin.go index fbfb4cec41..de68ae0796 100644 --- a/chunker/rabin.go +++ b/chunker/rabin.go @@ -1,94 +1,39 @@ package chunk import ( - "bufio" - "bytes" - "fmt" + "hash/fnv" "io" - "math" + + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/whyrusleeping/chunker" ) -type MaybeRabin struct { - mask int - windowSize int - MinBlockSize int - MaxBlockSize int -} +var IpfsRabinPoly = chunker.Pol(17437180132763653) -func NewMaybeRabin(avgBlkSize int) *MaybeRabin { - blkbits := uint(math.Log2(float64(avgBlkSize))) - rb := new(MaybeRabin) - rb.mask = (1 << blkbits) - 1 - rb.windowSize = 16 // probably a good number... - rb.MinBlockSize = avgBlkSize / 2 - rb.MaxBlockSize = (avgBlkSize / 2) * 3 - return rb +type Rabin struct { + r *chunker.Chunker } -func (mr *MaybeRabin) Split(r io.Reader) chan []byte { - out := make(chan []byte, 16) - go func() { - inbuf := bufio.NewReader(r) - blkbuf := new(bytes.Buffer) - - // some bullshit numbers i made up - a := 10 // honestly, no idea what this is - MOD := 33554383 // randomly chosen (seriously) - an := 1 - rollingHash := 0 +func NewRabin(r io.Reader, avgBlkSize uint64) *Rabin { + min := avgBlkSize / 3 + max := avgBlkSize + (avgBlkSize / 2) - // Window is a circular buffer - window := make([]byte, mr.windowSize) - push := func(i int, val byte) (outval int) { - outval = int(window[i%len(window)]) - window[i%len(window)] = val - return - } + return NewRabinMinMax(r, avgBlkSize, min, max) +} - // Duplicate byte slice - dup := func(b []byte) []byte { - d := make([]byte, len(b)) - copy(d, b) - return d - } +func NewRabinMinMax(r io.Reader, min, avg, max uint64) *Rabin { + h := fnv.New32a() + ch := chunker.New(r, IpfsRabinPoly, h, avg, min, max) - // Fill up the window - i := 0 - for ; i < mr.windowSize; i++ { - b, err := inbuf.ReadByte() - if err != nil { - fmt.Println(err) - return - } - blkbuf.WriteByte(b) - push(i, b) - rollingHash = (rollingHash*a + int(b)) % MOD - an = (an * a) % MOD - } + return &Rabin{ + r: ch, + } +} - for ; true; i++ { - b, err := inbuf.ReadByte() - if err != nil { - break - } - outval := push(i, b) - blkbuf.WriteByte(b) - rollingHash = (rollingHash*a + int(b) - an*outval) % MOD - if (rollingHash&mr.mask == mr.mask && blkbuf.Len() > mr.MinBlockSize) || - blkbuf.Len() >= mr.MaxBlockSize { - out <- dup(blkbuf.Bytes()) - blkbuf.Reset() - } +func (r *Rabin) NextBytes() ([]byte, error) { + ch, err := r.r.Next() + if err != nil { + return nil, err + } - // Check if there are enough remaining - peek, err := inbuf.Peek(mr.windowSize) - if err != nil || len(peek) != mr.windowSize { - break - } - } - io.Copy(blkbuf, inbuf) - out <- blkbuf.Bytes() - close(out) - }() - return out + return ch.Data, nil } diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go new file mode 100644 index 0000000000..596f2f63e6 --- /dev/null +++ b/chunker/rabin_test.go @@ -0,0 +1,84 @@ +package chunk + +import ( + "bytes" + "fmt" + "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-ipfs/blocks/key" + "github.com/ipfs/go-ipfs/util" + "io" + "testing" +) + +func TestRabinChunking(t *testing.T) { + data := make([]byte, 1024*1024*16) + util.NewTimeSeededRand().Read(data) + + r := NewRabin(bytes.NewReader(data), 1024*256) + + var chunks [][]byte + + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + t.Fatal(err) + } + + chunks = append(chunks, chunk) + } + + fmt.Printf("average block size: %d\n", len(data)/len(chunks)) + + unchunked := bytes.Join(chunks, nil) + if !bytes.Equal(unchunked, data) { + fmt.Printf("%d %d\n", len(unchunked), len(data)) + t.Fatal("data was chunked incorrectly") + } +} + +func chunkData(t *testing.T, data []byte) map[key.Key]*blocks.Block { + r := NewRabin(bytes.NewReader(data), 1024*256) + + blkmap := make(map[key.Key]*blocks.Block) + + for { + blk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + t.Fatal(err) + } + + b := blocks.NewBlock(blk) + blkmap[b.Key()] = b + } + + return blkmap +} + +func TestRabinChunkReuse(t *testing.T) { + data := make([]byte, 1024*1024*16) + util.NewTimeSeededRand().Read(data) + + ch1 := chunkData(t, data[1000:]) + ch2 := chunkData(t, data) + + var extra int + for k, _ := range ch2 { + _, ok := ch1[k] + if !ok { + extra++ + } + } + + if extra > 2 { + t.Fatal("too many spare chunks made") + } + if extra == 2 { + t.Log("why did we get two extra blocks?") + } +} diff --git a/chunker/splitting.go b/chunker/splitting.go index 999ed367f4..9609472452 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -9,39 +9,71 @@ import ( var log = util.Logger("chunk") -var DefaultBlockSize = 1024 * 256 -var DefaultSplitter = &SizeSplitter{Size: DefaultBlockSize} +var DefaultBlockSize int64 = 1024 * 256 -type BlockSplitter interface { - Split(r io.Reader) chan []byte +type Splitter interface { + NextBytes() ([]byte, error) } -type SizeSplitter struct { - Size int +type SplitterGen func(r io.Reader) Splitter + +func DefaultSplitter(r io.Reader) Splitter { + return NewSizeSplitter(r, DefaultBlockSize) +} + +func SizeSplitterGen(size int64) SplitterGen { + return func(r io.Reader) Splitter { + return NewSizeSplitter(r, size) + } } -func (ss *SizeSplitter) Split(r io.Reader) chan []byte { +func Chan(s Splitter) (<-chan []byte, <-chan error) { out := make(chan []byte) + errs := make(chan error, 1) go func() { defer close(out) + defer close(errs) // all-chunks loop (keep creating chunks) for { - // log.Infof("making chunk with size: %d", ss.Size) - chunk := make([]byte, ss.Size) - nread, err := io.ReadFull(r, chunk) - if nread > 0 { - // log.Infof("sending out chunk with size: %d", sofar) - out <- chunk[:nread] - } - if err == io.EOF || err == io.ErrUnexpectedEOF { - return - } + b, err := s.NextBytes() if err != nil { - log.Debugf("Block split error: %s", err) + errs <- err return } + + out <- b } }() - return out + return out, errs +} + +type sizeSplitterv2 struct { + r io.Reader + size int64 + err error +} + +func NewSizeSplitter(r io.Reader, size int64) Splitter { + return &sizeSplitterv2{ + r: r, + size: size, + } +} + +func (ss *sizeSplitterv2) NextBytes() ([]byte, error) { + if ss.err != nil { + return nil, ss.err + } + buf := make([]byte, ss.size) + n, err := io.ReadFull(ss.r, buf) + if err == io.ErrUnexpectedEOF { + ss.err = io.EOF + err = nil + } + if err != nil { + return nil, err + } + + return buf[:n], nil } diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 232b4fde97..27b2a7b7a6 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -32,8 +32,8 @@ func TestSizeSplitterIsDeterministic(t *testing.T) { bufA := copyBuf(bufR) bufB := copyBuf(bufR) - chunksA := DefaultSplitter.Split(bytes.NewReader(bufA)) - chunksB := DefaultSplitter.Split(bytes.NewReader(bufB)) + chunksA, _ := Chan(DefaultSplitter(bytes.NewReader(bufA))) + chunksB, _ := Chan(DefaultSplitter(bytes.NewReader(bufB))) for n := 0; ; n++ { a, moreA := <-chunksA @@ -65,8 +65,8 @@ func TestSizeSplitterFillsChunks(t *testing.T) { max := 10000000 b := randBuf(t, max) r := &clipReader{r: bytes.NewReader(b), size: 4000} - s := SizeSplitter{Size: 1024 * 256} - c := s.Split(r) + chunksize := int64(1024 * 256) + c, _ := Chan(NewSizeSplitter(r, chunksize)) sofar := 0 whole := make([]byte, max) @@ -80,7 +80,7 @@ func TestSizeSplitterFillsChunks(t *testing.T) { copy(whole[sofar:], chunk) sofar += len(chunk) - if sofar != max && len(chunk) < s.Size { + if sofar != max && len(chunk) < int(chunksize) { t.Fatal("sizesplitter split at a smaller size") } } From c5f82b9c71e99012a366618296f1caa7a57a39c0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 29 Jul 2015 13:08:37 -0700 Subject: [PATCH 0804/3147] use rabin fingerprinting for a chunker License: MIT Signed-off-by: Jeromy implement rabin fingerprinting as a chunker for ipfs License: MIT Signed-off-by: Jeromy vendor correctly License: MIT Signed-off-by: Jeromy refactor chunking interface a little License: MIT Signed-off-by: Jeromy work chunking interface changes up into importer License: MIT Signed-off-by: Jeromy move chunker type parsing into its own file in chunk License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@96b1fb1dfaa01bab57b0654e1026d78ed6368d23 --- unixfs/mod/dagmodifier.go | 18 +++++++++--------- unixfs/mod/dagmodifier_test.go | 28 +++++++++++++++++----------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 48374c10bd..be7d92248d 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -40,7 +40,7 @@ type DagModifier struct { curNode *mdag.Node mp pin.ManualPinner - splitter chunk.BlockSplitter + splitter chunk.SplitterGen ctx context.Context readCancel func() @@ -51,7 +51,7 @@ type DagModifier struct { read *uio.DagReader } -func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.ManualPinner, spl chunk.BlockSplitter) (*DagModifier, error) { +func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.ManualPinner, spl chunk.SplitterGen) (*DagModifier, error) { return &DagModifier{ curNode: from.Copy(), dagserv: serv, @@ -106,10 +106,10 @@ func (zr zeroReader) Read(b []byte) (int, error) { // expandSparse grows the file with zero blocks of 4096 // A small blocksize is chosen to aid in deduplication func (dm *DagModifier) expandSparse(size int64) error { - spl := chunk.SizeSplitter{4096} r := io.LimitReader(zeroReader{}, size) - blks := spl.Split(r) - nnode, err := dm.appendData(dm.curNode, blks) + spl := chunk.NewSizeSplitter(r, 4096) + blks, errs := chunk.Chan(spl) + nnode, err := dm.appendData(dm.curNode, blks, errs) if err != nil { return err } @@ -196,8 +196,8 @@ func (dm *DagModifier) Sync() error { // need to write past end of current dag if !done { - blks := dm.splitter.Split(dm.wrBuf) - nd, err = dm.appendData(dm.curNode, blks) + blks, errs := chunk.Chan(dm.splitter(dm.wrBuf)) + nd, err = dm.appendData(dm.curNode, blks, errs) if err != nil { return err } @@ -306,14 +306,14 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) } // appendData appends the blocks from the given chan to the end of this dag -func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte) (*mdag.Node, error) { +func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte, errs <-chan error) (*mdag.Node, error) { dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, NodeCB: imp.BasicPinnerCB(dm.mp), } - return trickle.TrickleAppend(node, dbp.New(blks)) + return trickle.TrickleAppend(node, dbp.New(blks, errs)) } // Read data from this dag starting at the current offset diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index e7db0d97d4..b4a501dd47 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -53,7 +53,7 @@ func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blocksto func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.ManualPinner) ([]byte, *mdag.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) - node, err := imp.BuildTrickleDagFromReader(in, dserv, &chunk.SizeSplitter{500}, imp.BasicPinnerCB(pinner)) + node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in), imp.BasicPinnerCB(pinner)) if err != nil { t.Fatal(err) } @@ -117,13 +117,19 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) return orig } +func sizeSplitterGen(size int64) chunk.SplitterGen { + return func(r io.Reader) chunk.Splitter { + return chunk.NewSizeSplitter(r, size) + } +} + func TestDagModifierBasic(t *testing.T) { dserv, pin := getMockDagServ(t) b, n := getNode(t, dserv, 50000, pin) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pin, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pin, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -178,7 +184,7 @@ func TestMultiWrite(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -231,7 +237,7 @@ func TestMultiWriteAndFlush(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -279,7 +285,7 @@ func TestWriteNewFile(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -322,7 +328,7 @@ func TestMultiWriteCoal(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -368,7 +374,7 @@ func TestLargeWriteChunks(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -406,7 +412,7 @@ func TestDagTruncate(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -437,7 +443,7 @@ func TestSparseWrite(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -491,7 +497,7 @@ func TestCorrectPinning(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -598,7 +604,7 @@ func BenchmarkDagmodWrite(b *testing.B) { wrsize := 4096 - dagmod, err := NewDagModifier(ctx, n, dserv, pins, &chunk.SizeSplitter{Size: 512}) + dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) if err != nil { b.Fatal(err) } From 1f3102fd4af219293690446403e3fbcc63cc572b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 10 Aug 2015 14:44:06 -0700 Subject: [PATCH 0805/3147] randomly getting a bad data layout shouldnt fail the tests License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@95d023a0b7649622ebddba289ea96b5c62fe00f1 --- chunker/rabin_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 596f2f63e6..b4e1b2dc4e 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -76,9 +76,6 @@ func TestRabinChunkReuse(t *testing.T) { } if extra > 2 { - t.Fatal("too many spare chunks made") - } - if extra == 2 { - t.Log("why did we get two extra blocks?") + t.Log("too many spare chunks made") } } From 0832da163ad118c32c566b571fb3aa90bd04711b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 12 Aug 2015 16:08:57 -0700 Subject: [PATCH 0806/3147] use correct context for dht notifs License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@8947f91a963cd8adeb6d3f3e69c02c164fe67a1d --- routing/dht/lookup.go | 7 +++++-- routing/dht/routing.go | 15 +++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index a100736401..76173a615c 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -40,9 +40,12 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key key.Key) (<-chan pe peerset.Add(p) } + // since the query doesnt actually pass our context down + // we have to hack this here. whyrusleeping isnt a huge fan of goprocess + parent := ctx query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { // For DHT query command - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.SendingQuery, ID: p, }) @@ -66,7 +69,7 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key key.Key) (<-chan pe } // For DHT query command - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.PeerResponse, ID: p, Responses: pointerizePeerInfos(filtered), diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 190e502850..80652f6ad0 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -97,8 +97,9 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { } // setup the Query + parent := ctx query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.SendingQuery, ID: p, }) @@ -113,7 +114,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { res.success = true } - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.PeerResponse, ID: p, Responses: pointerizePeerInfos(peers), @@ -209,8 +210,9 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, } // setup the Query + parent := ctx query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.SendingQuery, ID: p, }) @@ -246,7 +248,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, clpeers := pb.PBPeersToPeerInfos(closer) log.Debugf("got closer peers: %d %s", len(clpeers), clpeers) - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.PeerResponse, ID: p, Responses: pointerizePeerInfos(clpeers), @@ -288,8 +290,9 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er } // setup the Query + parent := ctx query := dht.newQuery(key.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.SendingQuery, ID: p, }) @@ -312,7 +315,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er } } - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ Type: notif.PeerResponse, Responses: pointerizePeerInfos(clpeerInfos), }) From 783c7aa523dee0b6395e0610a9bea131912f40f3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Aug 2015 16:25:51 -0700 Subject: [PATCH 0807/3147] blockservice.New doesnt need to return an error License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@8f44f5611f9dab8759401b1eebfaaa22ce1223c5 --- unixfs/mod/dagmodifier_test.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index b4a501dd47..475e7c6c41 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -31,10 +31,7 @@ func getMockDagServ(t testing.TB) (mdag.DAGService, pin.ManualPinner) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } + bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) return dserv, pin.NewPinner(tsds, dserv).GetManual() } @@ -43,10 +40,7 @@ func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blocksto dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } + bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) return dserv, bstore, pin.NewPinner(tsds, dserv).GetManual() } From 89f2a9a5e4f9430aec383be9ee3f02d9b754760d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Aug 2015 16:25:51 -0700 Subject: [PATCH 0808/3147] blockservice.New doesnt need to return an error License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@323a2d5474b40c98f4e282e6e8ca79611f332e30 --- blockservice/blockservice.go | 8 ++------ blockservice/test/blocks_test.go | 8 ++------ blockservice/test/mock.go | 12 ++---------- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index eec292b21d..bfc6394f1e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -5,7 +5,6 @@ package blockservice import ( "errors" - "fmt" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" @@ -48,10 +47,7 @@ type BlockService struct { } // NewBlockService creates a BlockService with given datastore instance. -func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error) { - if bs == nil { - return nil, fmt.Errorf("BlockService requires valid blockstore") - } +func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { if rem == nil { log.Warning("blockservice running in local (offline) mode.") } @@ -60,7 +56,7 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) (*BlockService, error Blockstore: bs, Exchange: rem, worker: worker.NewWorker(rem, wc), - }, nil + } } // AddBlock adds a particular block to the service, Putting it into the datastore. diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index cb7f665ace..dbbc515620 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -19,11 +19,7 @@ import ( func TestBlocks(t *testing.T) { bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) - bs, err := New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Error("failed to construct block service", err) - return - } + bs := New(bstore, offline.Exchange(bstore)) defer bs.Close() b := blocks.NewBlock([]byte("beep boop")) @@ -63,7 +59,7 @@ func TestBlocks(t *testing.T) { } func TestGetBlocksSequential(t *testing.T) { - var servs = Mocks(t, 4) + var servs = Mocks(4) for _, s := range servs { defer s.Close() } diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 4c4009de21..28e3a4e991 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -8,12 +8,8 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" ) -type fataler interface { - Fatal(args ...interface{}) -} - // Mocks returns |n| connected mock Blockservices -func Mocks(t fataler, n int) []*BlockService { +func Mocks(n int) []*BlockService { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) sg := bitswap.NewTestSessionGenerator(net) @@ -21,11 +17,7 @@ func Mocks(t fataler, n int) []*BlockService { var servs []*BlockService for _, i := range instances { - bserv, err := New(i.Blockstore(), i.Exchange) - if err != nil { - t.Fatal(err) - } - servs = append(servs, bserv) + servs = append(servs, New(i.Blockstore(), i.Exchange)) } return servs } From a6739712e3dc4f68a829b3f051031183112cf5f8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Aug 2015 16:25:51 -0700 Subject: [PATCH 0809/3147] blockservice.New doesnt need to return an error License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@5b224ae2c119daafc092824fc7c004f6a81fac61 --- pinning/pinner/pin_test.go | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 3f6c67b541..223beb03e5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -29,10 +29,7 @@ func TestPinnerBasic(t *testing.T) { dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } + bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) @@ -40,7 +37,7 @@ func TestPinnerBasic(t *testing.T) { p := NewPinner(dstore, dserv) a, ak := randNode() - _, err = dserv.Add(a) + _, err := dserv.Add(a) if err != nil { t.Fatal(err) } @@ -163,10 +160,7 @@ func TestDuplicateSemantics(t *testing.T) { ctx := context.Background() dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } + bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) @@ -174,7 +168,7 @@ func TestDuplicateSemantics(t *testing.T) { p := NewPinner(dstore, dserv) a, _ := randNode() - _, err = dserv.Add(a) + _, err := dserv.Add(a) if err != nil { t.Fatal(err) } @@ -202,10 +196,7 @@ func TestPinRecursiveFail(t *testing.T) { ctx := context.Background() dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } + bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) @@ -213,7 +204,7 @@ func TestPinRecursiveFail(t *testing.T) { a, _ := randNode() b, _ := randNode() - err = a.AddNodeLinkClean("child", b) + err := a.AddNodeLinkClean("child", b) if err != nil { t.Fatal(err) } From b1fee816a81183b1a15a0f9f77b47807af16d754 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Aug 2015 16:25:51 -0700 Subject: [PATCH 0810/3147] blockservice.New doesnt need to return an error License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@7f04ac922f4c55bd52b55ce7e1586d35834401e0 --- path/resolver_test.go | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/path/resolver_test.go b/path/resolver_test.go index cb99703a0e..c0342fd621 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -4,15 +4,11 @@ import ( "fmt" "testing" - datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" - blockservice "github.com/ipfs/go-ipfs/blockservice" - offline "github.com/ipfs/go-ipfs/exchange/offline" merkledag "github.com/ipfs/go-ipfs/merkledag" + dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" util "github.com/ipfs/go-ipfs/util" ) @@ -27,20 +23,13 @@ func randNode() (*merkledag.Node, key.Key) { func TestRecurivePathResolution(t *testing.T) { ctx := context.Background() - dstore := sync.MutexWrap(datastore.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv, err := blockservice.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } - - dagService := merkledag.NewDAGService(bserv) + dagService := dagmock.Mock() a, _ := randNode() b, _ := randNode() c, cKey := randNode() - err = b.AddNodeLink("grandchild", c) + err := b.AddNodeLink("grandchild", c) if err != nil { t.Fatal(err) } From 64a293d21cb04ac9cd66231371c711d03b3caeba Mon Sep 17 00:00:00 2001 From: Karthik Bala Date: Fri, 14 Aug 2015 20:02:16 -0700 Subject: [PATCH 0811/3147] Add router that does nothing for bitswap_wo_routing test License: MIT Signed-off-by: Karthik Bala This commit was moved from ipfs/go-ipfs-routing@da5ce28e5c67900d7a2d4b85e426b0f74c6d021f --- routing/none/none_client.go | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 routing/none/none_client.go diff --git a/routing/none/none_client.go b/routing/none/none_client.go new file mode 100644 index 0000000000..ce50d73575 --- /dev/null +++ b/routing/none/none_client.go @@ -0,0 +1,51 @@ +package nilrouting + +import ( + "errors" + + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + key "github.com/ipfs/go-ipfs/blocks/key" + p2phost "github.com/ipfs/go-ipfs/p2p/host" + peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" + u "github.com/ipfs/go-ipfs/util" +) + +var log = u.Logger("mockrouter") + +type nilclient struct { +} + +func (c *nilclient) PutValue(_ context.Context, _ key.Key, _ []byte) error { + return nil +} + +func (c *nilclient) GetValue(_ context.Context, _ key.Key) ([]byte, error) { + return nil, errors.New("Tried GetValue from nil routing.") +} + +func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (peer.PeerInfo, error) { + return peer.PeerInfo{}, nil +} + +func (c *nilclient) FindProvidersAsync(_ context.Context, _ key.Key, _ int) <-chan peer.PeerInfo { + out := make(chan peer.PeerInfo) + defer close(out) + return out +} + +func (c *nilclient) Provide(_ context.Context, _ key.Key) error { + return nil +} + +func (c *nilclient) Bootstrap(_ context.Context) error { + return nil +} + +func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.ThreadSafeDatastore) (routing.IpfsRouting, error) { + return &nilclient{}, nil +} + +// ensure nilclient satisfies interface +var _ routing.IpfsRouting = &nilclient{} From f3dfce5aa15f1e29ba8b35aa3b38e4839832528b Mon Sep 17 00:00:00 2001 From: rht Date: Mon, 10 Aug 2015 04:05:41 +0700 Subject: [PATCH 0812/3147] Refactor ipfs get License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@c0c8f9c3a5567564ef3e1284dc615a45e65b5437 --- unixfs/io/dagreader.go | 13 +++--- unixfs/tar/writer.go | 101 ++++++++++++++++++++++------------------- 2 files changed, 61 insertions(+), 53 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index def8c15018..1426f10cc7 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -58,8 +58,7 @@ type ReadSeekCloser interface { // node, using the passed in DAGService for data retreival func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*DagReader, error) { pb := new(ftpb.Data) - err := proto.Unmarshal(n.Data, pb) - if err != nil { + if err := proto.Unmarshal(n.Data, pb); err != nil { return nil, err } @@ -70,7 +69,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag case ftpb.Data_Raw: fallthrough case ftpb.Data_File: - return newDataFileReader(ctx, n, pb, serv), nil + return NewDataFileReader(ctx, n, pb, serv), nil case ftpb.Data_Metadata: if len(n.Links) == 0 { return nil, errors.New("incorrectly formatted metadata object") @@ -85,7 +84,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag } } -func newDataFileReader(ctx context.Context, n *mdag.Node, pb *ftpb.Data, serv mdag.DAGService) *DagReader { +func NewDataFileReader(ctx context.Context, n *mdag.Node, pb *ftpb.Data, serv mdag.DAGService) *DagReader { fctx, cancel := context.WithCancel(ctx) promises := serv.GetDAG(fctx, n) return &DagReader{ @@ -124,7 +123,7 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { // A directory should not exist within a file return ft.ErrInvalidDirLocation case ftpb.Data_File: - dr.buf = newDataFileReader(dr.ctx, nxt, pb, dr.serv) + dr.buf = NewDataFileReader(dr.ctx, nxt, pb, dr.serv) return nil case ftpb.Data_Raw: dr.buf = NewRSNCFromBytes(pb.GetData()) @@ -137,8 +136,8 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { } // Size return the total length of the data from the DAG structured file. -func (dr *DagReader) Size() int64 { - return int64(dr.pbdata.GetFilesize()) +func (dr *DagReader) Size() uint64 { + return dr.pbdata.GetFilesize() } // Read reads data from the DAG structured file diff --git a/unixfs/tar/writer.go b/unixfs/tar/writer.go index 125beed96e..9e519b3683 100644 --- a/unixfs/tar/writer.go +++ b/unixfs/tar/writer.go @@ -4,7 +4,6 @@ import ( "archive/tar" "bufio" "compress/gzip" - "fmt" "io" "path" "time" @@ -13,6 +12,7 @@ import ( cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" mdag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" ) @@ -21,7 +21,8 @@ import ( // TODO: does this need to be configurable? var DefaultBufSize = 1048576 -func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService, compression int) (io.Reader, error) { +// DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` +func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { _, filename := path.Split(name) @@ -31,17 +32,44 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService // use a buffered writer to parallelize task bufw := bufio.NewWriterSize(pipew, DefaultBufSize) + // compression determines whether to use gzip compression. + var maybeGzw io.Writer + if compression != gzip.NoCompression { + var err error + maybeGzw, err = gzip.NewWriterLevel(bufw, compression) + if err != nil { + return nil, err + } + } else { + maybeGzw = bufw + } + // construct the tar writer - w, err := NewWriter(bufw, dag, compression) + w, err := NewWriter(ctx, dag, archive, compression, maybeGzw) if err != nil { return nil, err } // write all the nodes recursively go func() { - if err := w.WriteNode(ctx, nd, filename); err != nil { - pipew.CloseWithError(err) - return + if !archive && compression != gzip.NoCompression { + // the case when the node is a file + dagr, err := uio.NewDagReader(w.ctx, nd, w.Dag) + if err != nil { + pipew.CloseWithError(err) + return + } + + if _, err := dagr.WriteTo(maybeGzw); err != nil { + pipew.CloseWithError(err) + return + } + } else { + // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format + if err := w.WriteNode(nd, filename); err != nil { + pipew.CloseWithError(err) + return + } } if err := bufw.Flush(); err != nil { @@ -49,6 +77,7 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService return } + w.Close() pipew.Close() // everything seems to be ok. }() @@ -61,39 +90,32 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService type Writer struct { Dag mdag.DAGService TarW *tar.Writer + + ctx cxt.Context } // NewWriter wraps given io.Writer. -// compression determines whether to use gzip compression. -func NewWriter(w io.Writer, dag mdag.DAGService, compression int) (*Writer, error) { - - if compression != gzip.NoCompression { - var err error - w, err = gzip.NewWriterLevel(w, compression) - if err != nil { - return nil, err - } - } - +func NewWriter(ctx cxt.Context, dag mdag.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { return &Writer{ Dag: dag, TarW: tar.NewWriter(w), + ctx: ctx, }, nil } -func (w *Writer) WriteDir(ctx cxt.Context, nd *mdag.Node, fpath string) error { +func (w *Writer) writeDir(nd *mdag.Node, fpath string) error { if err := writeDirHeader(w.TarW, fpath); err != nil { return err } - for i, ng := range w.Dag.GetDAG(ctx, nd) { - child, err := ng.Get(ctx) + for i, ng := range w.Dag.GetDAG(w.ctx, nd) { + child, err := ng.Get(w.ctx) if err != nil { return err } npath := path.Join(fpath, nd.Links[i].Name) - if err := w.WriteNode(ctx, child, npath); err != nil { + if err := w.WriteNode(child, npath); err != nil { return err } } @@ -101,46 +123,33 @@ func (w *Writer) WriteDir(ctx cxt.Context, nd *mdag.Node, fpath string) error { return nil } -func (w *Writer) WriteFile(ctx cxt.Context, nd *mdag.Node, fpath string) error { - pb := new(upb.Data) - if err := proto.Unmarshal(nd.Data, pb); err != nil { - return err - } - - return w.writeFile(ctx, nd, pb, fpath) -} - -func (w *Writer) writeFile(ctx cxt.Context, nd *mdag.Node, pb *upb.Data, fpath string) error { +func (w *Writer) writeFile(nd *mdag.Node, pb *upb.Data, fpath string) error { if err := writeFileHeader(w.TarW, fpath, pb.GetFilesize()); err != nil { return err } - dagr, err := uio.NewDagReader(ctx, nd, w.Dag) - if err != nil { - return err - } - - _, err = io.Copy(w.TarW, dagr) - if err != nil && err != io.EOF { - return err - } - - return nil + dagr := uio.NewDataFileReader(w.ctx, nd, pb, w.Dag) + _, err := dagr.WriteTo(w.TarW) + return err } -func (w *Writer) WriteNode(ctx cxt.Context, nd *mdag.Node, fpath string) error { +func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error { pb := new(upb.Data) if err := proto.Unmarshal(nd.Data, pb); err != nil { return err } switch pb.GetType() { + case upb.Data_Metadata: + fallthrough case upb.Data_Directory: - return w.WriteDir(ctx, nd, fpath) + return w.writeDir(nd, fpath) + case upb.Data_Raw: + fallthrough case upb.Data_File: - return w.writeFile(ctx, nd, pb, fpath) + return w.writeFile(nd, pb, fpath) default: - return fmt.Errorf("unixfs type not supported: %s", pb.GetType()) + return ft.ErrUnrecognizedType } } From e10d297e14c5afeb187d100d8db3ab7c4c040330 Mon Sep 17 00:00:00 2001 From: rht Date: Thu, 20 Aug 2015 14:53:50 +0700 Subject: [PATCH 0813/3147] Decompose DagArchive from unixfs tar License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@c3db1bdef60f0e5ee16253540e94dd3092c9c950 --- unixfs/archive/archive.go | 83 ++++++++++++++++++++++++++++++ unixfs/{ => archive}/tar/writer.go | 69 ------------------------- 2 files changed, 83 insertions(+), 69 deletions(-) create mode 100644 unixfs/archive/archive.go rename unixfs/{ => archive}/tar/writer.go (58%) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go new file mode 100644 index 0000000000..d530461e7a --- /dev/null +++ b/unixfs/archive/archive.go @@ -0,0 +1,83 @@ +package archive + +import ( + "bufio" + "compress/gzip" + "io" + "path" + + cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + mdag "github.com/ipfs/go-ipfs/merkledag" + tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" + uio "github.com/ipfs/go-ipfs/unixfs/io" +) + +// DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. +// TODO: does this need to be configurable? +var DefaultBufSize = 1048576 + +// DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` +func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { + + _, filename := path.Split(name) + + // need to connect a writer to a reader + piper, pipew := io.Pipe() + + // use a buffered writer to parallelize task + bufw := bufio.NewWriterSize(pipew, DefaultBufSize) + + // compression determines whether to use gzip compression. + var maybeGzw io.Writer + if compression != gzip.NoCompression { + var err error + maybeGzw, err = gzip.NewWriterLevel(bufw, compression) + if err != nil { + return nil, err + } + } else { + maybeGzw = bufw + } + + if !archive && compression != gzip.NoCompression { + // the case when the node is a file + dagr, err := uio.NewDagReader(ctx, nd, dag) + if err != nil { + pipew.CloseWithError(err) + return nil, err + } + + go func() { + if _, err := dagr.WriteTo(maybeGzw); err != nil { + pipew.CloseWithError(err) + return + } + pipew.Close() // everything seems to be ok. + }() + } else { + // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format + + // construct the tar writer + w, err := tar.NewWriter(ctx, dag, archive, compression, maybeGzw) + if err != nil { + return nil, err + } + + go func() { + // write all the nodes recursively + if err := w.WriteNode(nd, filename); err != nil { + pipew.CloseWithError(err) + return + } + if err := bufw.Flush(); err != nil { + pipew.CloseWithError(err) + return + } + w.Close() + pipew.Close() // everything seems to be ok. + }() + } + + return piper, nil +} diff --git a/unixfs/tar/writer.go b/unixfs/archive/tar/writer.go similarity index 58% rename from unixfs/tar/writer.go rename to unixfs/archive/tar/writer.go index 9e519b3683..73aeafa4b6 100644 --- a/unixfs/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -2,8 +2,6 @@ package tar import ( "archive/tar" - "bufio" - "compress/gzip" "io" "path" "time" @@ -17,73 +15,6 @@ import ( upb "github.com/ipfs/go-ipfs/unixfs/pb" ) -// DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. -// TODO: does this need to be configurable? -var DefaultBufSize = 1048576 - -// DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` -func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { - - _, filename := path.Split(name) - - // need to connect a writer to a reader - piper, pipew := io.Pipe() - - // use a buffered writer to parallelize task - bufw := bufio.NewWriterSize(pipew, DefaultBufSize) - - // compression determines whether to use gzip compression. - var maybeGzw io.Writer - if compression != gzip.NoCompression { - var err error - maybeGzw, err = gzip.NewWriterLevel(bufw, compression) - if err != nil { - return nil, err - } - } else { - maybeGzw = bufw - } - - // construct the tar writer - w, err := NewWriter(ctx, dag, archive, compression, maybeGzw) - if err != nil { - return nil, err - } - - // write all the nodes recursively - go func() { - if !archive && compression != gzip.NoCompression { - // the case when the node is a file - dagr, err := uio.NewDagReader(w.ctx, nd, w.Dag) - if err != nil { - pipew.CloseWithError(err) - return - } - - if _, err := dagr.WriteTo(maybeGzw); err != nil { - pipew.CloseWithError(err) - return - } - } else { - // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format - if err := w.WriteNode(nd, filename); err != nil { - pipew.CloseWithError(err) - return - } - } - - if err := bufw.Flush(); err != nil { - pipew.CloseWithError(err) - return - } - - w.Close() - pipew.Close() // everything seems to be ok. - }() - - return piper, nil -} - // Writer is a utility structure that helps to write // unixfs merkledag nodes as a tar archive format. // It wraps any io.Writer. From cff37d5ae90e3cc242e0b42a7eb0201618f6c999 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 16 Aug 2015 18:22:40 +0700 Subject: [PATCH 0814/3147] Make sure ctx in commands are derived from req.Context License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@cd2ac441342cf67a5c25146592affdf3f5f6e97b --- unixfs/io/dirbuilder.go | 15 ++------------- unixfs/mod/dagmodifier.go | 8 ++++---- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index d1b67c758e..6fdef9ffb0 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -1,8 +1,6 @@ package io import ( - "time" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" @@ -29,22 +27,13 @@ func NewDirectory(dserv mdag.DAGService) *directoryBuilder { } // AddChild adds a (name, key)-pair to the root node. -func (d *directoryBuilder) AddChild(name string, k key.Key) error { - // TODO(cryptix): consolidate context managment - ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) - defer cancel() - +func (d *directoryBuilder) AddChild(ctx context.Context, name string, k key.Key) error { cnode, err := d.dserv.Get(ctx, k) if err != nil { return err } - err = d.dirnode.AddNodeLinkClean(name, cnode) - if err != nil { - return err - } - - return nil + return d.dirnode.AddNodeLinkClean(name, cnode) } // GetNode returns the root of this directoryBuilder diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index be7d92248d..0d0ae7fbe4 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -428,7 +428,7 @@ func (dm *DagModifier) Truncate(size int64) error { return dm.expandSparse(int64(size) - realSize) } - nnode, err := dagTruncate(dm.curNode, uint64(size), dm.dagserv) + nnode, err := dagTruncate(dm.ctx, dm.curNode, uint64(size), dm.dagserv) if err != nil { return err } @@ -443,7 +443,7 @@ func (dm *DagModifier) Truncate(size int64) error { } // dagTruncate truncates the given node to 'size' and returns the modified Node -func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, error) { +func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, error) { if len(nd.Links) == 0 { // TODO: this can likely be done without marshaling and remarshaling pbn, err := ft.FromBytes(nd.Data) @@ -460,7 +460,7 @@ func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, er var modified *mdag.Node ndata := new(ft.FSNode) for i, lnk := range nd.Links { - ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + _ctx, cancel := context.WithTimeout(ctx, time.Minute) defer cancel() child, err := lnk.GetNode(ctx, ds) @@ -475,7 +475,7 @@ func dagTruncate(nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, er // found the child we want to cut if size < cur+childsize { - nchild, err := dagTruncate(child, size-cur, ds) + nchild, err := dagTruncate(_ctx, child, size-cur, ds) if err != nil { return nil, err } From f67fb97a10123890608d5fb6bfd1f41a009e795b Mon Sep 17 00:00:00 2001 From: rht Date: Mon, 17 Aug 2015 15:40:48 +0700 Subject: [PATCH 0815/3147] Replace WithTimeout with WithCancel whenever possible License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@4023331d8fd688cdb31020069112f9f6a031178d --- unixfs/mod/dagmodifier.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0d0ae7fbe4..2ed5f9d27e 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -5,7 +5,6 @@ import ( "errors" "io" "os" - "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" @@ -460,7 +459,7 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer var modified *mdag.Node ndata := new(ft.FSNode) for i, lnk := range nd.Links { - _ctx, cancel := context.WithTimeout(ctx, time.Minute) + _ctx, cancel := context.WithCancel(ctx) defer cancel() child, err := lnk.GetNode(ctx, ds) From 4fc790765097c445e2983d976fc7261650706a3d Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 19:33:53 +0700 Subject: [PATCH 0816/3147] Fix 'ctx, _' to have explicit cancel License: MIT Signed-off-by: rht This commit was moved from ipfs/go-blockservice@31d8527e2bd4f930800e0fbb93a0c4b1d040bb60 --- blockservice/test/blocks_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index dbbc515620..c94a2357e0 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -42,7 +42,8 @@ func TestBlocks(t *testing.T) { t.Error("returned key is not equal to block key", err) } - ctx, _ := context.WithTimeout(context.TODO(), time.Second*5) + ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5) + defer cancel() b2, err := bs.GetBlock(ctx, b.Key()) if err != nil { t.Error("failed to retrieve block from BlockService", err) @@ -75,7 +76,8 @@ func TestGetBlocksSequential(t *testing.T) { t.Log("one instance at a time, get blocks concurrently") for i := 1; i < len(servs); i++ { - ctx, _ := context.WithTimeout(context.TODO(), time.Second*50) + ctx, cancel := context.WithTimeout(context.TODO(), time.Second*50) + defer cancel() out := servs[i].GetBlocks(ctx, keys) gotten := make(map[key.Key]*blocks.Block) for blk := range out { From 07c94c89dfb4ceb2ed712a399af89e0d725d97ce Mon Sep 17 00:00:00 2001 From: rht Date: Thu, 20 Aug 2015 07:59:52 +0700 Subject: [PATCH 0817/3147] Wire a context down to (n *helpers.UnixfsNode) GetChild License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@8f176c05ca8478b45e6c00d4e0d29ce59cce9566 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 2ed5f9d27e..6ea761989d 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -312,7 +312,7 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte, errs <-ch NodeCB: imp.BasicPinnerCB(dm.mp), } - return trickle.TrickleAppend(node, dbp.New(blks, errs)) + return trickle.TrickleAppend(dm.ctx, node, dbp.New(blks, errs)) } // Read data from this dag starting at the current offset From 2fe3525158f71046578ca7f1925453ea90645d76 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 19:33:53 +0700 Subject: [PATCH 0818/3147] Fix 'ctx, _' to have explicit cancel License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-pinner@518bb43f8e21f46209fd415c5cf93a753e478f29 --- pinning/pinner/pin_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 223beb03e5..d3947254d5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -210,21 +210,21 @@ func TestPinRecursiveFail(t *testing.T) { } // Note: this isnt a time based test, we expect the pin to fail - mctx, _ := context.WithTimeout(ctx, time.Millisecond) + mctx, cancel := context.WithTimeout(ctx, time.Millisecond) + defer cancel() err = p.Pin(mctx, a, true) if err == nil { t.Fatal("should have failed to pin here") } - _, err = dserv.Add(b) - if err != nil { + if _, err := dserv.Add(b); err != nil { t.Fatal(err) } // this one is time based... but shouldnt cause any issues - mctx, _ = context.WithTimeout(ctx, time.Second) - err = p.Pin(mctx, a, true) - if err != nil { + mctx, cancel = context.WithTimeout(ctx, time.Second) + defer cancel() + if err := p.Pin(mctx, a, true); err != nil { t.Fatal(err) } } From 7fcd12ab610398a8b66dab4894930b0d2eff7bcb Mon Sep 17 00:00:00 2001 From: rht Date: Mon, 17 Aug 2015 15:40:48 +0700 Subject: [PATCH 0819/3147] Replace WithTimeout with WithCancel whenever possible License: MIT Signed-off-by: rht This commit was moved from ipfs/go-path@4e1d0aa2ab7fda8a54a7c02ea1e48c48e40afbf2 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index 2880750004..5740e829ef 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -87,7 +87,7 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*me } log.Debug("Resolve dag get.") - ctx, cancel := context.WithTimeout(ctx, time.Minute) + ctx, cancel := context.WithCancel(ctx) defer cancel() nd, err := s.DAG.Get(ctx, key.Key(h)) if err != nil { From 55a02fd14319653a2ccd26463bb2b42a6a2fd9f7 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 19:33:53 +0700 Subject: [PATCH 0820/3147] Fix 'ctx, _' to have explicit cancel License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@d21309d12b9aa34d7572277f856248c510d26b4a --- routing/dht/ext_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index c771165782..75219da5cc 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -202,7 +202,8 @@ func TestNotFound(t *testing.T) { } // long timeout to ensure timing is not at play. - ctx, _ = context.WithTimeout(ctx, time.Second*20) + ctx, cancel := context.WithTimeout(ctx, time.Second*20) + defer cancel() v, err := d.GetValue(ctx, key.Key("hello")) log.Debugf("get value got %v", v) if err != nil { @@ -274,7 +275,8 @@ func TestLessThanKResponses(t *testing.T) { }) } - ctx, _ = context.WithTimeout(ctx, time.Second*30) + ctx, cancel := context.WithTimeout(ctx, time.Second*30) + defer cancel() if _, err := d.GetValue(ctx, key.Key("hello")); err != nil { switch err { case routing.ErrNotFound: From 3a4059aae49e643679275cd3a7bf078f56022e98 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 19:33:53 +0700 Subject: [PATCH 0821/3147] Fix 'ctx, _' to have explicit cancel License: MIT Signed-off-by: rht This commit was moved from ipfs/go-namesys@1a54d24b1c0d639636b52272182d2bedc3ca4ab5 --- namesys/publisher.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 3f5e15ae5e..e3dd1d81bb 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -60,7 +60,8 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key - timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) + timectx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) + defer cancel() err = p.routing.PutValue(timectx, namekey, pkbytes) if err != nil { return err @@ -70,9 +71,9 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) - timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*10)) - err = p.routing.PutValue(timectx, ipnskey, data) - if err != nil { + timectx, cancel = context.WithDeadline(ctx, time.Now().Add(time.Second*10)) + defer cancel() + if err := p.routing.PutValue(timectx, ipnskey, data); err != nil { return err } From b891ed1fe8deeeead7264f8e50bee00a5a149608 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 19:55:45 +0700 Subject: [PATCH 0822/3147] Replace context.TODO in test files with context.Background License: MIT Signed-off-by: rht This commit was moved from ipfs/go-blockservice@75d6f9ce7aed1ae38a77b599a618aa57b29c6bd8 --- blockservice/test/blocks_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index c94a2357e0..6ba5eb40ff 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -42,7 +42,7 @@ func TestBlocks(t *testing.T) { t.Error("returned key is not equal to block key", err) } - ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() b2, err := bs.GetBlock(ctx, b.Key()) if err != nil { @@ -76,7 +76,7 @@ func TestGetBlocksSequential(t *testing.T) { t.Log("one instance at a time, get blocks concurrently") for i := 1; i < len(servs); i++ { - ctx, cancel := context.WithTimeout(context.TODO(), time.Second*50) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*50) defer cancel() out := servs[i].GetBlocks(ctx, keys) gotten := make(map[key.Key]*blocks.Block) From a8797639b0ed08de1277786c897351378eb22fca Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 22:12:23 +0700 Subject: [PATCH 0823/3147] Localize the scope of context.WithCancel for every DAG.Get Instead put it inside of DAG.Get. The fix is applied only in the case when the context.WithCancel before a DAG.Get is also used later on in the scope. License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@ac3a64d8f6f99e23e3041691c5883343bc8ba6ff --- unixfs/mod/dagmodifier.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 6ea761989d..8d97bddfc1 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -459,9 +459,6 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer var modified *mdag.Node ndata := new(ft.FSNode) for i, lnk := range nd.Links { - _ctx, cancel := context.WithCancel(ctx) - defer cancel() - child, err := lnk.GetNode(ctx, ds) if err != nil { return nil, err @@ -474,7 +471,7 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer // found the child we want to cut if size < cur+childsize { - nchild, err := dagTruncate(_ctx, child, size-cur, ds) + nchild, err := dagTruncate(ctx, child, size-cur, ds) if err != nil { return nil, err } From 951bf87090f828039e7dbc52b93c59ca95f39627 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 22:12:23 +0700 Subject: [PATCH 0824/3147] Localize the scope of context.WithCancel for every DAG.Get Instead put it inside of DAG.Get. The fix is applied only in the case when the context.WithCancel before a DAG.Get is also used later on in the scope. License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-pinner@b1e47218ea129e225f5473f9928e814e24112f01 --- pinning/pinner/pin.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 8f2d4b8209..3d51b7a066 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -106,8 +106,7 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { p.recursePin.AddBlock(k) } else { - _, err := p.dserv.Get(ctx, k) - if err != nil { + if _, err := p.dserv.Get(ctx, k); err != nil { return err } From e4a4624f0ebcb3990d6195f5bae412d109426909 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 23 Aug 2015 22:12:23 +0700 Subject: [PATCH 0825/3147] Localize the scope of context.WithCancel for every DAG.Get Instead put it inside of DAG.Get. The fix is applied only in the case when the context.WithCancel before a DAG.Get is also used later on in the scope. License: MIT Signed-off-by: rht This commit was moved from ipfs/go-path@30635a80a7c4888d9124e2d623c1b20d0d46f4d7 --- path/resolver.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 5740e829ef..275d2b7d40 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -87,8 +87,6 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*me } log.Debug("Resolve dag get.") - ctx, cancel := context.WithCancel(ctx) - defer cancel() nd, err := s.DAG.Get(ctx, key.Key(h)) if err != nil { return nil, err From b105ea43f5d42a6e9bade3b767d24a1347165e37 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 12 Aug 2015 12:17:52 -0700 Subject: [PATCH 0826/3147] implement symlinks in unixfs, first draft License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@7fd695066806137ea299a22d3cb02a42476924ad --- unixfs/format.go | 14 ++++++++++++++ unixfs/io/dagreader.go | 6 ++++++ unixfs/pb/unixfs.pb.go | 5 ++++- unixfs/pb/unixfs.proto | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/unixfs/format.go b/unixfs/format.go index b8c0abeb18..c1f82a4858 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -77,6 +77,20 @@ func WrapData(b []byte) []byte { return out } +func SymlinkData(path string) []byte { + pbdata := new(pb.Data) + typ := pb.Data_Symlink + pbdata.Data = []byte(path) + pbdata.Type = &typ + + out, err := proto.Marshal(pbdata) + if err != nil { + panic(err) + } + + return out +} + func UnwrapData(data []byte) ([]byte, error) { pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 1426f10cc7..646a69a40f 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -17,6 +17,8 @@ import ( var ErrIsDir = errors.New("this dag node is a directory") +var ErrCantReadSymlinks = errors.New("cannot currently read symlinks") + // DagReader provides a way to easily read the data contained in a dag. type DagReader struct { serv mdag.DAGService @@ -79,6 +81,8 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag return nil, err } return NewDagReader(ctx, child, serv) + case ftpb.Data_Symlink: + return nil, ErrCantReadSymlinks default: return nil, ft.ErrUnrecognizedType } @@ -130,6 +134,8 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { return nil case ftpb.Data_Metadata: return errors.New("Shouldnt have had metadata object inside file") + case ftpb.Data_Symlink: + return errors.New("shouldnt have had symlink inside file") default: return ft.ErrUnrecognizedType } diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index c11ffd4d03..074a329980 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "github.com/gogo/protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -28,6 +28,7 @@ const ( Data_Directory Data_DataType = 1 Data_File Data_DataType = 2 Data_Metadata Data_DataType = 3 + Data_Symlink Data_DataType = 4 ) var Data_DataType_name = map[int32]string{ @@ -35,12 +36,14 @@ var Data_DataType_name = map[int32]string{ 1: "Directory", 2: "File", 3: "Metadata", + 4: "Symlink", } var Data_DataType_value = map[string]int32{ "Raw": 0, "Directory": 1, "File": 2, "Metadata": 3, + "Symlink": 4, } func (x Data_DataType) Enum() *Data_DataType { diff --git a/unixfs/pb/unixfs.proto b/unixfs/pb/unixfs.proto index 1450809e46..4a52c3af57 100644 --- a/unixfs/pb/unixfs.proto +++ b/unixfs/pb/unixfs.proto @@ -6,6 +6,7 @@ message Data { Directory = 1; File = 2; Metadata = 3; + Symlink = 4; } required DataType Type = 1; From c4fb4e8f1c970197837a024076286e4214d0b4c1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 30 Aug 2015 22:14:31 -0700 Subject: [PATCH 0827/3147] give ipfs get symlink support License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@c40e6b586a92b9d2e72cbf33925a7378b24559c6 --- unixfs/archive/tar/writer.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 73aeafa4b6..4953be90e7 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -79,6 +79,8 @@ func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error { fallthrough case upb.Data_File: return w.writeFile(nd, pb, fpath) + case upb.Data_Symlink: + return writeSymlinkHeader(w.TarW, string(pb.GetData()), fpath) default: return ft.ErrUnrecognizedType } @@ -108,3 +110,12 @@ func writeFileHeader(w *tar.Writer, fpath string, size uint64) error { // TODO: set mode, dates, etc. when added to unixFS }) } + +func writeSymlinkHeader(w *tar.Writer, target, fpath string) error { + return w.WriteHeader(&tar.Header{ + Name: fpath, + Linkname: target, + Mode: 0777, + Typeflag: tar.TypeSymlink, + }) +} From 1e23a49bcb98c93709001bfa5be9f81a8726d31d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 2 Sep 2015 10:57:26 -0700 Subject: [PATCH 0828/3147] rm panic License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@c502cd7f99065ac9ad136e90a77de6608f67abe5 --- unixfs/format.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index c1f82a4858..9193ddede1 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -77,7 +77,7 @@ func WrapData(b []byte) []byte { return out } -func SymlinkData(path string) []byte { +func SymlinkData(path string) ([]byte, error) { pbdata := new(pb.Data) typ := pb.Data_Symlink pbdata.Data = []byte(path) @@ -85,10 +85,10 @@ func SymlinkData(path string) []byte { out, err := proto.Marshal(pbdata) if err != nil { - panic(err) + return nil, err } - return out + return out, nil } func UnwrapData(data []byte) ([]byte, error) { From 44af61eb2921e012053979096a209e6d41a797ec Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 3 Sep 2015 12:54:10 -0700 Subject: [PATCH 0829/3147] fix import path of generated proto files License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@a73473188af3c10a2f217ecf8d4814ee9734398e --- unixfs/pb/unixfs.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 074a329980..e89fca29a3 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "github.com/gogo/protobuf/proto" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 7469af0e832a8bb6ad2a55d0f7b2183cb6481761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Thu, 3 Sep 2015 22:01:01 +0200 Subject: [PATCH 0830/3147] fix swaped argument in rabin.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-ipfs-chunker@5c4dcacd1e5341fcd14bb228cfb67fe6215a6ca8 --- chunker/rabin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/rabin.go b/chunker/rabin.go index de68ae0796..ce9b5fc567 100644 --- a/chunker/rabin.go +++ b/chunker/rabin.go @@ -17,7 +17,7 @@ func NewRabin(r io.Reader, avgBlkSize uint64) *Rabin { min := avgBlkSize / 3 max := avgBlkSize + (avgBlkSize / 2) - return NewRabinMinMax(r, avgBlkSize, min, max) + return NewRabinMinMax(r, min, avgBlkSize, max) } func NewRabinMinMax(r io.Reader, min, avg, max uint64) *Rabin { From e5ba2b7d5db45ed26ba7c3074944bd08e3a0058e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 4 Sep 2015 15:41:15 -0700 Subject: [PATCH 0831/3147] fix blockservice error ignorance License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@f819c6c532d679968b67ac6562d95aa78ffb48eb --- blockservice/blockservice.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index bfc6394f1e..0b00b4e8c1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -96,19 +96,25 @@ func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (*blocks.Block, block, err := s.Blockstore.Get(k) if err == nil { return block, nil + } + + if err == blockstore.ErrNotFound && s.Exchange != nil { // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. - } else if err == blockstore.ErrNotFound && s.Exchange != nil { log.Debug("Blockservice: Searching bitswap.") blk, err := s.Exchange.GetBlock(ctx, k) if err != nil { return nil, err } return blk, nil - } else { - log.Debug("Blockservice GetBlock: Not found.") + } + + log.Debug("Blockservice GetBlock: Not found.") + if err == blockstore.ErrNotFound { return nil, ErrNotFound } + + return nil, err } // GetBlocks gets a list of blocks asynchronously and returns through From 4045a662b750e46f15200444cdb4efcabb8978cd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 17 Aug 2015 10:21:18 -0700 Subject: [PATCH 0832/3147] move mem-dag construction to its own function, and actually call WriteOutputTo License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@e2f87ba07426d6bbf829161558d3f60f41b5c2b1 --- blockservice/blockservice.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0b00b4e8c1..40197c5bad 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -104,6 +104,9 @@ func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (*blocks.Block, log.Debug("Blockservice: Searching bitswap.") blk, err := s.Exchange.GetBlock(ctx, k) if err != nil { + if err == blockstore.ErrNotFound { + return nil, ErrNotFound + } return nil, err } return blk, nil From d5a27b9ee887f52f2b543b76fc1b3c1264db536b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 8 Sep 2015 21:15:53 -0700 Subject: [PATCH 0833/3147] use new methods from goprocess/context, remove thirdparty/waitable License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@bfa72bb64bd592a9e0c5f2491a81b500e337faa9 --- blockservice/worker/worker.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index 88cf4c326b..88149add34 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -7,11 +7,11 @@ import ( "time" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + procctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" ratelimit "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - waitable "github.com/ipfs/go-ipfs/thirdparty/waitable" util "github.com/ipfs/go-ipfs/util" ) @@ -121,7 +121,7 @@ func (w *Worker) start(c Config) { // reads from |workerChan| until w.process closes limiter := ratelimit.NewRateLimiter(w.process, c.NumWorkers) limiter.Go(func(proc process.Process) { - ctx := waitable.Context(proc) // shut down in-progress HasBlock when time to die + ctx := procctx.OnClosingContext(proc) // shut down in-progress HasBlock when time to die for { select { case <-proc.Closing(): From b1f7dcf44c0c55395e07deee0d85b7fef1557403 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 8 Sep 2015 21:15:53 -0700 Subject: [PATCH 0834/3147] use new methods from goprocess/context, remove thirdparty/waitable License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@172cd15e815cdd6c48aea2f98bc3a4b91b1c6e58 --- routing/dht/ext_test.go | 2 +- routing/dht/query.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 75219da5cc..710a9afca1 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -51,7 +51,7 @@ func TestGetFailures(t *testing.T) { err = merr[0] } - if err != context.DeadlineExceeded && err != context.Canceled { + if err.Error() != "process closing" { t.Fatal("Got different error than we expected", err) } } else { diff --git a/routing/dht/query.go b/routing/dht/query.go index a6c8a14b3e..9906e5189a 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -85,7 +85,7 @@ type dhtQueryRunner struct { func newQueryRunner(q *dhtQuery) *dhtQueryRunner { proc := process.WithParent(process.Background()) - ctx := ctxproc.WithProcessClosing(context.Background(), proc) + ctx := ctxproc.OnClosingContext(proc) return &dhtQueryRunner{ query: q, peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(q.key)), @@ -210,7 +210,7 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { // ok let's do this! // create a context from our proc. - ctx := ctxproc.WithProcessClosing(context.Background(), proc) + ctx := ctxproc.OnClosingContext(proc) // make sure we do this when we exit defer func() { From f4dc1b43cd0ebec6262cae1fc0329c4901a64847 Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 13 Sep 2015 15:41:38 +0700 Subject: [PATCH 0835/3147] Fix t0090 tar&gz unexpected EOF error License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@b7016fd1d8ac44a19fe3e85d00e64f281525c920 --- unixfs/archive/archive.go | 27 +++++++++++++++++++++++---- unixfs/archive/tar/writer.go | 7 +++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index d530461e7a..e1faf5a33d 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -17,6 +17,18 @@ import ( // TODO: does this need to be configurable? var DefaultBufSize = 1048576 +type identityWriteCloser struct { + w io.Writer +} + +func (i *identityWriteCloser) Write(p []byte) (int, error) { + return i.w.Write(p) +} + +func (i *identityWriteCloser) Close() error { + return nil +} + // DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { @@ -29,15 +41,16 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService bufw := bufio.NewWriterSize(pipew, DefaultBufSize) // compression determines whether to use gzip compression. - var maybeGzw io.Writer + var maybeGzw io.WriteCloser + var err error if compression != gzip.NoCompression { - var err error maybeGzw, err = gzip.NewWriterLevel(bufw, compression) if err != nil { + pipew.CloseWithError(err) return nil, err } } else { - maybeGzw = bufw + maybeGzw = &identityWriteCloser{bufw} } if !archive && compression != gzip.NoCompression { @@ -53,6 +66,11 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService pipew.CloseWithError(err) return } + maybeGzw.Close() + if err := bufw.Flush(); err != nil { + pipew.CloseWithError(err) + return + } pipew.Close() // everything seems to be ok. }() } else { @@ -70,11 +88,12 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService pipew.CloseWithError(err) return } + w.Close() + maybeGzw.Close() if err := bufw.Flush(); err != nil { pipew.CloseWithError(err) return } - w.Close() pipew.Close() // everything seems to be ok. }() } diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 4953be90e7..6536e443e8 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -60,8 +60,11 @@ func (w *Writer) writeFile(nd *mdag.Node, pb *upb.Data, fpath string) error { } dagr := uio.NewDataFileReader(w.ctx, nd, pb, w.Dag) - _, err := dagr.WriteTo(w.TarW) - return err + if _, err := dagr.WriteTo(w.TarW); err != nil { + return err + } + w.TarW.Flush() + return nil } func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error { From 8061255874c914c1cd1ba3d5ca2906ecc72bc083 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0836/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@8d4960b199f66c42c36d3e055d565c1dc1019813 --- blockstore/blockstore.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 63fa7f9eba..90a3b92648 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,10 +12,10 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = eventlog.Logger("blockstore") +var log = logging.Logger("blockstore") // BlockPrefix namespaces blockstore datastores var BlockPrefix = ds.NewKey("blocks") From 48f73405a205a2b7e30208644ae2021e3d3ea232 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0837/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@99499a8ee424b7a154537bfd3ef42538db90dd52 --- blockservice/blockservice.go | 4 ++-- blockservice/worker/worker.go | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 40197c5bad..3ab6bc1dcf 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -12,7 +12,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" worker "github.com/ipfs/go-ipfs/blockservice/worker" exchange "github.com/ipfs/go-ipfs/exchange" - u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) var wc = worker.Config{ @@ -32,7 +32,7 @@ var wc = worker.Config{ WorkerBufferSize: 0, } -var log = u.Logger("blockservice") +var log = logging.Logger("blockservice") var ErrNotFound = errors.New("blockservice: key not found") // BlockService is a hybrid block datastore. It stores data in a local diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go index 88149add34..3b4df2d735 100644 --- a/blockservice/worker/worker.go +++ b/blockservice/worker/worker.go @@ -12,10 +12,11 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - util "github.com/ipfs/go-ipfs/util" + + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = util.Logger("blockservice") +var log = logging.Logger("blockservice") var DefaultConfig = Config{ NumWorkers: 1, From ec8b0fb5eb27322f9dc417c67b068be5ffbf2927 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0838/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d8d7cc75847d0aa45da91bad8559346343150cb5 --- routing/dht/dht.go | 6 +++--- routing/dht/pb/message.go | 4 ++-- routing/dht/query.go | 4 ++-- routing/kbucket/table.go | 4 ++-- routing/mock/centralized_client.go | 4 ++-- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/record/record.go | 4 ++-- routing/supernode/client.go | 6 +++--- routing/supernode/proxy/standard.go | 10 +++++----- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 50c4df14c1..b5d6d16111 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,8 +18,8 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - "github.com/ipfs/go-ipfs/thirdparty/eventlog" u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -28,7 +28,7 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) -var log = eventlog.Logger("dht") +var log = logging.Logger("dht") var ProtocolDHT protocol.ID = "/ipfs/dht" @@ -98,7 +98,7 @@ func (dht *IpfsDHT) LocalPeer() peer.ID { } // log returns the dht's logger -func (dht *IpfsDHT) log() eventlog.EventLogger { +func (dht *IpfsDHT) log() logging.EventLogger { return log // TODO rm } diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 24ad1d6f09..d9f6a20736 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,10 +6,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" - eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = eventlog.Logger("dht.pb") +var log = logging.Logger("dht.pb") type PeerRoutingInfo struct { peer.PeerInfo diff --git a/routing/dht/query.go b/routing/dht/query.go index 9906e5189a..ab4f28492c 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,10 +8,10 @@ import ( peer "github.com/ipfs/go-ipfs/p2p/peer" queue "github.com/ipfs/go-ipfs/p2p/peer/queue" "github.com/ipfs/go-ipfs/routing" - eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" @@ -77,7 +77,7 @@ type dhtQueryRunner struct { errs u.MultiErr // result errors. maybe should be a map[peer.ID]error rateLimit chan struct{} // processing semaphore - log eventlog.EventLogger + log logging.EventLogger proc process.Process sync.RWMutex diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 87d9c9e3f1..45e438635b 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,10 +8,10 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = u.Logger("table") +var log = logging.Logger("table") // RoutingTable defines the routing table. type RoutingTable struct { diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 6085b69be4..9d577c4a31 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -10,11 +10,11 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = u.Logger("mockrouter") +var log = logging.Logger("mockrouter") type client struct { datastore ds.Datastore diff --git a/routing/none/none_client.go b/routing/none/none_client.go index ce50d73575..8400e6a3b0 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,10 +9,10 @@ import ( p2phost "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = u.Logger("mockrouter") +var log = logging.Logger("mockrouter") type nilclient struct { } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 2ef4e5633b..7ead5d3054 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -13,10 +13,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = eventlog.Logger("offlinerouting") +var log = logging.Logger("offlinerouting") var ErrOffline = errors.New("routing system in offline mode") diff --git a/routing/record/record.go b/routing/record/record.go index 8db5758e0f..80da085814 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -9,11 +9,11 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) var _ = dag.FetchGraph -var log = eventlog.Logger("routing/record") +var log = logging.Logger("routing/record") // MakePutRecord creates and signs a dht record for the given key/value pair func MakePutRecord(sk ci.PrivKey, key key.Key, value []byte, sign bool) (*pb.Record, error) { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 5269be51bb..97d3d70c72 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -14,10 +14,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = eventlog.Logger("supernode") +var log = logging.Logger("supernode") type Client struct { peerhost host.Host @@ -37,7 +37,7 @@ func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (* } func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { - ctx = eventlog.ContextWithLoggable(ctx, eventlog.Uuid("findProviders")) + ctx = logging.ContextWithLoggable(ctx, logging.Uuid("findProviders")) defer log.EventBegin(ctx, "findProviders", &k).Done() ch := make(chan peer.PeerInfo) go func() { diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index fe723409eb..cba08c2ea7 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -12,12 +12,12 @@ import ( peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) const ProtocolSNR = "/ipfs/supernoderouting" -var log = eventlog.Logger("supernode/proxy") +var log = logging.Logger("supernode/proxy") type Proxy interface { Bootstrap(context.Context) error @@ -127,7 +127,7 @@ func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.M } func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (*dhtpb.Message, error) { - e := log.EventBegin(ctx, "sendRoutingRequest", px.Host.ID(), remote, eventlog.Pair("request", m)) + e := log.EventBegin(ctx, "sendRoutingRequest", px.Host.ID(), remote, logging.Pair("request", m)) defer e.Done() if err := px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { e.SetError(err) @@ -157,8 +157,8 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe e.SetError(err) return nil, err } - e.Append(eventlog.Pair("response", response)) - e.Append(eventlog.Pair("uuid", eventlog.Uuid("foo"))) + e.Append(logging.Pair("response", response)) + e.Append(logging.Pair("uuid", logging.Uuid("foo"))) return response, nil } From 435c3a8c207b9a0e608a404bdb329e236f175fdc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0839/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@d727813200d61a96db438ca77c3b714ba201a600 --- namesys/routing.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index 9ff2a62f68..9946ed560c 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -11,10 +11,10 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = u.Logger("namesys") +var log = logging.Logger("namesys") // routingResolver implements NSResolver for the main IPFS SFS-like naming type routingResolver struct { From 5929397fbc48e56a3c0ba00bb9cb2a2c05f4a09e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0840/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@533f3c94bd983cda8cbfe71baeb613ae7ce9eaae --- pinning/pinner/pin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 3d51b7a066..a82b93f82e 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -14,10 +14,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = util.Logger("pin") +var log = logging.Logger("pin") var recursePinDatastoreKey = ds.NewKey("/local/pins/recursive/keys") var directPinDatastoreKey = ds.NewKey("/local/pins/direct/keys") var indirectPinDatastoreKey = ds.NewKey("/local/pins/indirect/keys") From b08197413f1eabfb72569219fdd0c3d0682df915 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0841/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@0575a776ab025b83ae248b6b5b0bafbe4d715ca6 --- chunker/splitting.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 9609472452..31b5c03e53 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,10 +4,10 @@ package chunk import ( "io" - "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = util.Logger("chunk") +var log = logging.Logger("chunk") var DefaultBlockSize int64 = 1024 * 256 From 5809b1a6cd60273b2e9a2c4fc6cc105192d90284 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0842/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@7da593b685ad8247f66d4113fd1cdf06ece77bfd --- path/resolver.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 275d2b7d40..6c3ae8a974 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,10 +11,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = u.Logger("path") +var log = logging.Logger("path") // Paths after a protocol must contain at least one component var ErrNoComponents = errors.New( From ce001c13f0d235b607ed069fb254c17bc4a06fce Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 0843/3147] extract logging License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@78d19b2f8462c805d6e0d3d1b8d79e2d21b113fc --- unixfs/mod/dagmodifier.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 8d97bddfc1..c397143984 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -19,7 +19,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) var ErrSeekFail = errors.New("failed to seek properly") @@ -29,7 +29,7 @@ var ErrUnrecognizedWhence = errors.New("unrecognized whence") // 2MB var writebufferSize = 1 << 21 -var log = u.Logger("dagio") +var log = logging.Logger("dagio") // DagModifier is the only struct licensed and able to correctly // perform surgery on a DAG 'file' From 52c3ad958f36dc97dad84737c61448819c99d42b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Sep 2015 17:15:29 -0700 Subject: [PATCH 0844/3147] update go-datastore to latest License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@75385f222d2ee272285637d105ea55da893620d9 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 90a3b92648..5558bf3b2c 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -43,7 +43,7 @@ func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { } type blockstore struct { - datastore ds.BatchingDatastore + datastore ds.Batching // cant be ThreadSafeDatastore cause namespace.Datastore doesnt support it. // we do check it on `NewBlockstore` though. } From c3fec930813e94038a22f9eb786b6934a514ec8c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 28 Aug 2015 14:20:37 -0700 Subject: [PATCH 0845/3147] dont need blockservice workers anymore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@418787d00cfda152388894182f5abc7bf8186acf --- blockservice/blockservice.go | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3ab6bc1dcf..7cd8f28758 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,29 +10,12 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" - worker "github.com/ipfs/go-ipfs/blockservice/worker" exchange "github.com/ipfs/go-ipfs/exchange" logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var wc = worker.Config{ - // When running on a single core, NumWorkers has a harsh negative effect on - // throughput. (-80% when < 25) - // Running a lot more workers appears to have very little effect on both - // single and multicore configurations. - NumWorkers: 25, - - // These have no effect on when running on multiple cores, but harsh - // negative effect on throughput when running on a single core - // On multicore configurations these buffers have little effect on - // throughput. - // On single core configurations, larger buffers have severe adverse - // effects on throughput. - ClientBufferSize: 0, - WorkerBufferSize: 0, -} - var log = logging.Logger("blockservice") + var ErrNotFound = errors.New("blockservice: key not found") // BlockService is a hybrid block datastore. It stores data in a local @@ -42,8 +25,6 @@ type BlockService struct { // TODO don't expose underlying impl details Blockstore blockstore.Blockstore Exchange exchange.Interface - - worker *worker.Worker } // NewBlockService creates a BlockService with given datastore instance. @@ -55,7 +36,6 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { return &BlockService{ Blockstore: bs, Exchange: rem, - worker: worker.NewWorker(rem, wc), } } @@ -67,7 +47,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (key.Key, error) { if err != nil { return k, err } - if err := s.worker.HasBlock(b); err != nil { + if err := s.Exchange.HasBlock(context.TODO(), b); err != nil { return "", errors.New("blockservice is closed") } return k, nil @@ -81,7 +61,7 @@ func (s *BlockService) AddBlocks(bs []*blocks.Block) ([]key.Key, error) { var ks []key.Key for _, b := range bs { - if err := s.worker.HasBlock(b); err != nil { + if err := s.Exchange.HasBlock(context.TODO(), b); err != nil { return nil, errors.New("blockservice is closed") } ks = append(ks, b.Key()) @@ -166,5 +146,5 @@ func (s *BlockService) DeleteBlock(k key.Key) error { func (s *BlockService) Close() error { log.Debug("blockservice is shutting down...") - return s.worker.Close() + return s.Exchange.Close() } From d72ee3e6128dcc35fd0eb5bc98dac8ed333a6b7c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 2 Sep 2015 14:44:04 -0700 Subject: [PATCH 0846/3147] remove context from HasBlock, use bitswap process instead License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@63a223c1bb558f5302f4af7de695db4a5f51aad5 --- blockservice/blockservice.go | 4 +- blockservice/worker/bench/main.go | 91 ----------- blockservice/worker/bench_worker_test.go | 42 ------ blockservice/worker/worker.go | 184 ----------------------- blockservice/worker/worker_test.go | 63 -------- 5 files changed, 2 insertions(+), 382 deletions(-) delete mode 100644 blockservice/worker/bench/main.go delete mode 100644 blockservice/worker/bench_worker_test.go delete mode 100644 blockservice/worker/worker.go delete mode 100644 blockservice/worker/worker_test.go diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 7cd8f28758..f13c090e4f 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -47,7 +47,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (key.Key, error) { if err != nil { return k, err } - if err := s.Exchange.HasBlock(context.TODO(), b); err != nil { + if err := s.Exchange.HasBlock(b); err != nil { return "", errors.New("blockservice is closed") } return k, nil @@ -61,7 +61,7 @@ func (s *BlockService) AddBlocks(bs []*blocks.Block) ([]key.Key, error) { var ks []key.Key for _, b := range bs { - if err := s.Exchange.HasBlock(context.TODO(), b); err != nil { + if err := s.Exchange.HasBlock(b); err != nil { return nil, errors.New("blockservice is closed") } ks = append(ks, b.Key()) diff --git a/blockservice/worker/bench/main.go b/blockservice/worker/bench/main.go deleted file mode 100644 index c23770f788..0000000000 --- a/blockservice/worker/bench/main.go +++ /dev/null @@ -1,91 +0,0 @@ -/* -Benchmark github.com/ipfs/go-ipfs/blockservice/worker. - -Loop over a range of workers and buffer sizes and measure the time it -per block-transfer operation for each value. Run with: - - $ go run "${GOPATH}/src/github.com/ipfs/go-ipfs/blockservice/worker/bench/main.go" -*/ - -package main - -import ( - "log" - "math" - "testing" - "time" - - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - blocks "github.com/ipfs/go-ipfs/blocks" - blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" - worker "github.com/ipfs/go-ipfs/blockservice/worker" - "github.com/ipfs/go-ipfs/exchange/offline" - "github.com/ipfs/go-ipfs/thirdparty/delay" - "github.com/ipfs/go-ipfs/util/datastore2" -) - -const kEstRoutingDelay = time.Second - -const kBlocksPerOp = 100 - -func main() { - var bestConfig worker.Config - var quickestNsPerOp int64 = math.MaxInt64 - for NumWorkers := 1; NumWorkers < 10; NumWorkers++ { - for ClientBufferSize := 0; ClientBufferSize < 10; ClientBufferSize++ { - for WorkerBufferSize := 0; WorkerBufferSize < 10; WorkerBufferSize++ { - c := worker.Config{ - NumWorkers: NumWorkers, - ClientBufferSize: ClientBufferSize, - WorkerBufferSize: WorkerBufferSize, - } - result := testing.Benchmark(BenchmarkWithConfig(c)) - if result.NsPerOp() < quickestNsPerOp { - bestConfig = c - quickestNsPerOp = result.NsPerOp() - } - log.Printf("benched %+v \t result: %+v", c, result) - } - } - } - log.Println(bestConfig) -} - -func BenchmarkWithConfig(c worker.Config) func(b *testing.B) { - return func(b *testing.B) { - - routingDelay := delay.Fixed(0) // during setup - - dstore := ds_sync.MutexWrap(datastore2.WithDelay(ds.NewMapDatastore(), routingDelay)) - bstore := blockstore.NewBlockstore(dstore) - var testdata []*blocks.Block - var i int64 - for i = 0; i < kBlocksPerOp; i++ { - testdata = append(testdata, blocks.NewBlock([]byte(string(i)))) - } - b.ResetTimer() - b.SetBytes(kBlocksPerOp) - for i := 0; i < b.N; i++ { - - b.StopTimer() - w := worker.NewWorker(offline.Exchange(bstore), c) - b.StartTimer() - - prev := routingDelay.Set(kEstRoutingDelay) // during measured section - - for _, block := range testdata { - if err := w.HasBlock(block); err != nil { - b.Fatal(err) - } - } - - routingDelay.Set(prev) // to hasten the unmeasured close period - - b.StopTimer() - w.Close() - b.StartTimer() - - } - } -} diff --git a/blockservice/worker/bench_worker_test.go b/blockservice/worker/bench_worker_test.go deleted file mode 100644 index a5e34a1073..0000000000 --- a/blockservice/worker/bench_worker_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package worker - -import ( - "testing" - - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - blocks "github.com/ipfs/go-ipfs/blocks" - blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" - "github.com/ipfs/go-ipfs/exchange/offline" -) - -func BenchmarkHandle10KBlocks(b *testing.B) { - bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) - var testdata []*blocks.Block - for i := 0; i < 10000; i++ { - testdata = append(testdata, blocks.NewBlock([]byte(string(i)))) - } - b.ResetTimer() - b.SetBytes(10000) - for i := 0; i < b.N; i++ { - - b.StopTimer() - w := NewWorker(offline.Exchange(bstore), Config{ - NumWorkers: 1, - ClientBufferSize: 0, - WorkerBufferSize: 0, - }) - b.StartTimer() - - for _, block := range testdata { - if err := w.HasBlock(block); err != nil { - b.Fatal(err) - } - } - - b.StopTimer() - w.Close() - b.StartTimer() - - } -} diff --git a/blockservice/worker/worker.go b/blockservice/worker/worker.go deleted file mode 100644 index 3b4df2d735..0000000000 --- a/blockservice/worker/worker.go +++ /dev/null @@ -1,184 +0,0 @@ -// TODO FIXME name me -package worker - -import ( - "container/list" - "errors" - "time" - - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - procctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" - ratelimit "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/ratelimit" - blocks "github.com/ipfs/go-ipfs/blocks" - key "github.com/ipfs/go-ipfs/blocks/key" - exchange "github.com/ipfs/go-ipfs/exchange" - - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" -) - -var log = logging.Logger("blockservice") - -var DefaultConfig = Config{ - NumWorkers: 1, - ClientBufferSize: 0, - WorkerBufferSize: 0, -} - -type Config struct { - // NumWorkers sets the number of background workers that provide blocks to - // the exchange. - NumWorkers int - - // ClientBufferSize allows clients of HasBlock to send up to - // |ClientBufferSize| blocks without blocking. - ClientBufferSize int - - // WorkerBufferSize can be used in conjunction with NumWorkers to reduce - // communication-coordination within the worker. - WorkerBufferSize int -} - -// TODO FIXME name me -type Worker struct { - // added accepts blocks from client - added chan *blocks.Block - exchange exchange.Interface - - // workQueue is owned by the client worker - // process manages life-cycle - process process.Process -} - -func NewWorker(e exchange.Interface, c Config) *Worker { - if c.NumWorkers < 1 { - c.NumWorkers = 1 // provide a sane default - } - w := &Worker{ - exchange: e, - added: make(chan *blocks.Block, c.ClientBufferSize), - process: process.WithParent(process.Background()), // internal management - } - w.start(c) - return w -} - -func (w *Worker) HasBlock(b *blocks.Block) error { - select { - case <-w.process.Closed(): - return errors.New("blockservice worker is closed") - case w.added <- b: - return nil - } -} - -func (w *Worker) Close() error { - log.Debug("blockservice provide worker is shutting down...") - return w.process.Close() -} - -func (w *Worker) start(c Config) { - - workerChan := make(chan *blocks.Block, c.WorkerBufferSize) - - // clientWorker handles incoming blocks from |w.added| and sends to - // |workerChan|. This will never block the client. - w.process.Go(func(proc process.Process) { - defer close(workerChan) - - var workQueue BlockList - debugInfo := time.NewTicker(5 * time.Second) - defer debugInfo.Stop() - for { - - // take advantage of the fact that sending on nil channel always - // blocks so that a message is only sent if a block exists - sendToWorker := workerChan - nextBlock := workQueue.Pop() - if nextBlock == nil { - sendToWorker = nil - } - - select { - - // if worker is ready and there's a block to process, send the - // block - case sendToWorker <- nextBlock: - case <-debugInfo.C: - if workQueue.Len() > 0 { - log.Debugf("%d blocks in blockservice provide queue...", workQueue.Len()) - } - case block := <-w.added: - if nextBlock != nil { - workQueue.Push(nextBlock) // missed the chance to send it - } - // if the client sends another block, add it to the queue. - workQueue.Push(block) - case <-proc.Closing(): - return - } - } - }) - - // reads from |workerChan| until w.process closes - limiter := ratelimit.NewRateLimiter(w.process, c.NumWorkers) - limiter.Go(func(proc process.Process) { - ctx := procctx.OnClosingContext(proc) // shut down in-progress HasBlock when time to die - for { - select { - case <-proc.Closing(): - return - case block, ok := <-workerChan: - if !ok { - return - } - limiter.LimitedGo(func(proc process.Process) { - if err := w.exchange.HasBlock(ctx, block); err != nil { - log.Infof("blockservice worker error: %s", err) - } - }) - } - } - }) -} - -type BlockList struct { - list list.List - uniques map[key.Key]*list.Element -} - -func (s *BlockList) PushFront(b *blocks.Block) { - if s.uniques == nil { - s.uniques = make(map[key.Key]*list.Element) - } - _, ok := s.uniques[b.Key()] - if !ok { - e := s.list.PushFront(b) - s.uniques[b.Key()] = e - } -} - -func (s *BlockList) Push(b *blocks.Block) { - if s.uniques == nil { - s.uniques = make(map[key.Key]*list.Element) - } - _, ok := s.uniques[b.Key()] - if !ok { - e := s.list.PushBack(b) - s.uniques[b.Key()] = e - } -} - -func (s *BlockList) Pop() *blocks.Block { - if s.list.Len() == 0 { - return nil - } - e := s.list.Front() - s.list.Remove(e) - b := e.Value.(*blocks.Block) - delete(s.uniques, b.Key()) - return b -} - -func (s *BlockList) Len() int { - return s.list.Len() -} diff --git a/blockservice/worker/worker_test.go b/blockservice/worker/worker_test.go deleted file mode 100644 index 2b6a2d16f1..0000000000 --- a/blockservice/worker/worker_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package worker - -import ( - blocks "github.com/ipfs/go-ipfs/blocks" - "testing" -) - -func TestStartClose(t *testing.T) { - numRuns := 50 - if testing.Short() { - numRuns = 5 - } - for i := 0; i < numRuns; i++ { - w := NewWorker(nil, DefaultConfig) - w.Close() - } -} - -func TestQueueDeduplication(t *testing.T) { - numUniqBlocks := 5 // arbitrary - - var firstBatch []*blocks.Block - for i := 0; i < numUniqBlocks; i++ { - firstBatch = append(firstBatch, blockFromInt(i)) - } - - // to get different pointer values and prevent the implementation from - // cheating. The impl must check equality using Key. - var secondBatch []*blocks.Block - for i := 0; i < numUniqBlocks; i++ { - secondBatch = append(secondBatch, blockFromInt(i)) - } - var workQueue BlockList - - for _, b := range append(firstBatch, secondBatch...) { - workQueue.Push(b) - } - for i := 0; i < numUniqBlocks; i++ { - b := workQueue.Pop() - if b.Key() != firstBatch[i].Key() { - t.Fatal("list is not FIFO") - } - } - if b := workQueue.Pop(); b != nil { - t.Fatal("the workQueue did not de-duplicate the blocks") - } -} - -func TestPushPopPushPop(t *testing.T) { - var workQueue BlockList - orig := blockFromInt(1) - dup := blockFromInt(1) - workQueue.PushFront(orig) - workQueue.Pop() - workQueue.Push(dup) - if workQueue.Len() != 1 { - t.Fatal("the block list's internal state is corrupt") - } -} - -func blockFromInt(i int) *blocks.Block { - return blocks.NewBlock([]byte(string(i))) -} From 6afcf195ded403e383e3047be41cefb5404079b3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 2 Sep 2015 14:44:04 -0700 Subject: [PATCH 0847/3147] remove context from HasBlock, use bitswap process instead License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@91e4d27b8584e59ee551c541b32ac80bef321209 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 9cf125ce0f..9a448906e7 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -28,7 +28,7 @@ func (e *offlineExchange) GetBlock(_ context.Context, k key.Key) (*blocks.Block, } // HasBlock always returns nil. -func (e *offlineExchange) HasBlock(_ context.Context, b *blocks.Block) error { +func (e *offlineExchange) HasBlock(b *blocks.Block) error { return e.bs.Put(b) } diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 41e8bb216a..dc00716064 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -26,7 +26,7 @@ func TestHasBlockReturnsNil(t *testing.T) { ex := Exchange(store) block := blocks.NewBlock([]byte("data")) - err := ex.HasBlock(context.Background(), block) + err := ex.HasBlock(block) if err != nil { t.Fail() } @@ -44,7 +44,7 @@ func TestGetBlocks(t *testing.T) { expected := g.Blocks(2) for _, b := range expected { - if err := ex.HasBlock(context.Background(), b); err != nil { + if err := ex.HasBlock(b); err != nil { t.Fail() } } From 39fa1d2d02a7dbf73e8993070ca856c923983322 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 2 Sep 2015 14:44:04 -0700 Subject: [PATCH 0848/3147] remove context from HasBlock, use bitswap process instead License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@83459c0f9b4bae2f3c72b7201a2bf4f2006f22e6 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 81ae3483aa..1a149ed9d1 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -19,7 +19,7 @@ type Interface interface { // TODO Should callers be concerned with whether the block was made // available on the network? - HasBlock(context.Context, *blocks.Block) error + HasBlock(*blocks.Block) error io.Closer } From 16a6f04f7985597878a4f37d154b4a3e726450a9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 18 Sep 2015 10:27:55 -0700 Subject: [PATCH 0849/3147] ipns record selection via sequence numbers This commit adds a sequence number to the IpnsEntry protobuf that is used to determine which among a set of entries for the same key is the 'most correct'. GetValues has been added to the routing interface to retrieve a set of records from the dht, for the caller to select from. GetValue (singular) will call GetValues, select the 'best' record, and then update that record to peers we received outdated records from. This will help keep the dht consistent. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@b47ab797fa01ed79aaa0180afbfc8cec944fb8da --- routing/dht/dht.go | 17 +++-- routing/dht/dht_test.go | 12 +++- routing/dht/handlers.go | 2 +- routing/dht/routing.go | 102 ++++++++++++++++++++++++----- routing/mock/centralized_client.go | 15 +++++ routing/none/none_client.go | 4 ++ routing/offline/offline.go | 21 ++++++ routing/record/record.go | 2 - routing/record/selection.go | 40 +++++++++++ routing/routing.go | 19 ++++++ routing/supernode/client.go | 16 +++++ 11 files changed, 220 insertions(+), 30 deletions(-) create mode 100644 routing/record/selection.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b5d6d16111..64f28c74e3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -54,6 +54,7 @@ type IpfsDHT struct { diaglock sync.Mutex // lock to make diagnostics work better Validator record.Validator // record validator funcs + Selector record.Selector // record selection funcs ctx context.Context proc goprocess.Process @@ -89,6 +90,9 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *Ip dht.Validator = make(record.Validator) dht.Validator["pk"] = record.PublicKeyValidator + dht.Selector = make(record.Selector) + dht.Selector["pk"] = record.PublicKeySelector + return dht } @@ -152,13 +156,16 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, skey string) err // NOTE: it will update the dht's peerstore with any new addresses // it finds for the given peer. func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, - key key.Key) ([]byte, []peer.PeerInfo, error) { + key key.Key) (*pb.Record, []peer.PeerInfo, error) { pmes, err := dht.getValueSingle(ctx, p, key) if err != nil { return nil, nil, err } + // Perhaps we were given closer peers + peers := pb.PBPeersToPeerInfos(pmes.GetCloserPeers()) + if record := pmes.GetRecord(); record != nil { // Success! We were given the value log.Debug("getValueOrPeers: got value") @@ -169,11 +176,9 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, log.Info("Received invalid record! (discarded)") return nil, nil, err } - return record.GetValue(), nil, nil + return record, peers, nil } - // Perhaps we were given closer peers - peers := pb.PBPeersToPeerInfos(pmes.GetCloserPeers()) if len(peers) > 0 { log.Debug("getValueOrPeers: peers") return nil, peers, nil @@ -193,7 +198,7 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, } // getLocal attempts to retrieve the value from the datastore -func (dht *IpfsDHT) getLocal(key key.Key) ([]byte, error) { +func (dht *IpfsDHT) getLocal(key key.Key) (*pb.Record, error) { log.Debug("getLocal %s", key) v, err := dht.datastore.Get(key.DsKey()) @@ -221,7 +226,7 @@ func (dht *IpfsDHT) getLocal(key key.Key) ([]byte, error) { } } - return rec.GetValue(), nil + return rec, nil } // getOwnPrivateKey attempts to load the local peers private diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 2e63e438e3..c09871610f 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -131,8 +131,14 @@ func TestValueGetSet(t *testing.T) { }, Sign: false, } + nulsel := func(_ key.Key, bs [][]byte) (int, error) { + return 0, nil + } + dhtA.Validator["v"] = vf dhtB.Validator["v"] = vf + dhtA.Selector["v"] = nulsel + dhtB.Selector["v"] = nulsel connect(t, ctx, dhtA, dhtB) @@ -193,7 +199,7 @@ func TestProvides(t *testing.T) { if err != nil { t.Fatal(err) } - if !bytes.Equal(bits, v) { + if !bytes.Equal(bits.GetValue(), v) { t.Fatal("didn't store the right bits (%s, %s)", k, v) } } @@ -466,7 +472,7 @@ func TestProvidesMany(t *testing.T) { if err != nil { t.Fatal(err) } - if !bytes.Equal(bits, v) { + if !bytes.Equal(bits.GetValue(), v) { t.Fatal("didn't store the right bits (%s, %s)", k, v) } @@ -558,7 +564,7 @@ func TestProvidesAsync(t *testing.T) { } bits, err := dhts[3].getLocal(k) - if err != nil && bytes.Equal(bits, val) { + if err != nil && bytes.Equal(bits.GetValue(), val) { t.Fatal(err) } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 36a92a2513..1c5d2b1c19 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -108,7 +108,7 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess dskey := key.Key(pmes.GetKey()).DsKey() if err := dht.verifyRecordLocally(pmes.GetRecord()); err != nil { - log.Debugf("Bad dht record in PUT from: %s. %s", key.Key(pmes.GetRecord().GetAuthor()), err) + log.Warningf("Bad dht record in PUT from: %s. %s", key.Key(pmes.GetRecord().GetAuthor()), err) return nil, err } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 80652f6ad0..d5854155f4 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -1,6 +1,7 @@ package dht import ( + "bytes" "sync" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" @@ -76,16 +77,71 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key key.Key, value []byte) err } // GetValue searches for the value corresponding to given Key. -// If the search does not succeed, a multiaddr string of a closer peer is -// returned along with util.ErrSearchIncomplete func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { + vals, err := dht.GetValues(ctx, key, 3) + if err != nil { + return nil, err + } + + var recs [][]byte + for _, v := range vals { + recs = append(recs, v.Val) + } + + i, err := dht.Selector.BestRecord(key, recs) + if err != nil { + return nil, err + } + + best := recs[i] + log.Debugf("GetValue %v %v", key, best) + if best == nil { + log.Errorf("GetValue yielded correct record with nil value.") + return nil, routing.ErrNotFound + } + + fixupRec, err := record.MakePutRecord(dht.peerstore.PrivKey(dht.self), key, best, true) + if err != nil { + // probably shouldnt actually 'error' here as we have found a value we like, + // but this call failing probably isnt something we want to ignore + return nil, err + } + + for _, v := range vals { + // if someone sent us a different 'less-valid' record, lets correct them + if !bytes.Equal(v.Val, best) { + go func(v routing.RecvdVal) { + err := dht.putValueToPeer(ctx, v.From, key, fixupRec) + if err != nil { + log.Error("Error correcting DHT entry: ", err) + } + }(v) + } + } + + return best, nil +} + +func (dht *IpfsDHT) GetValues(ctx context.Context, key key.Key, nvals int) ([]routing.RecvdVal, error) { + var vals []routing.RecvdVal + var valslock sync.Mutex + // If we have it local, dont bother doing an RPC! - val, err := dht.getLocal(key) + lrec, err := dht.getLocal(key) if err == nil { + // TODO: this is tricky, we dont always want to trust our own value + // what if the authoritative source updated it? log.Debug("have it locally") - return val, nil - } else { - log.Debug("failed to get value locally: %s", err) + vals = append(vals, routing.RecvdVal{ + Val: lrec.GetValue(), + From: dht.self, + }) + + if nvals <= 1 { + return vals, nil + } + } else if nvals == 0 { + return nil, err } // get closest peers in the routing table @@ -104,14 +160,26 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { ID: p, }) - val, peers, err := dht.getValueOrPeers(ctx, p, key) + rec, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { return nil, err } - res := &dhtQueryResult{value: val, closerPeers: peers} - if val != nil { - res.success = true + res := &dhtQueryResult{closerPeers: peers} + + if rec.GetValue() != nil { + rv := routing.RecvdVal{ + Val: rec.GetValue(), + From: p, + } + valslock.Lock() + vals = append(vals, rv) + + // If weve collected enough records, we're done + if len(vals) >= nvals { + res.success = true + } + valslock.Unlock() } notif.PublishQueryEvent(parent, ¬if.QueryEvent{ @@ -124,17 +192,15 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { }) // run it! - result, err := query.Run(ctx, rtp) - if err != nil { - return nil, err + _, err = query.Run(ctx, rtp) + if len(vals) == 0 { + if err != nil { + return nil, err + } } - log.Debugf("GetValue %v %v", key, result.value) - if result.value == nil { - return nil, routing.ErrNotFound - } + return vals, nil - return result.value, nil } // Value provider layer of indirection. diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 9d577c4a31..09f17e61e2 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -44,6 +44,21 @@ func (c *client) GetValue(ctx context.Context, key key.Key) ([]byte, error) { return data, nil } +func (c *client) GetValues(ctx context.Context, key key.Key, count int) ([]routing.RecvdVal, error) { + log.Debugf("GetValue: %s", key) + v, err := c.datastore.Get(key.DsKey()) + if err != nil { + return nil, err + } + + data, ok := v.([]byte) + if !ok { + return nil, errors.New("could not cast value from datastore") + } + + return []routing.RecvdVal{{Val: data, From: c.peer.ID()}}, nil +} + func (c *client) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { return c.server.Providers(key), nil } diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 8400e6a3b0..49df5870a4 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -25,6 +25,10 @@ func (c *nilclient) GetValue(_ context.Context, _ key.Key) ([]byte, error) { return nil, errors.New("Tried GetValue from nil routing.") } +func (c *nilclient) GetValues(_ context.Context, _ key.Key, _ int) ([]routing.RecvdVal, error) { + return nil, errors.New("Tried GetValues from nil routing.") +} + func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (peer.PeerInfo, error) { return peer.PeerInfo{}, nil } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7ead5d3054..22aef75b3f 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -67,6 +67,27 @@ func (c *offlineRouting) GetValue(ctx context.Context, key key.Key) ([]byte, err return rec.GetValue(), nil } +func (c *offlineRouting) GetValues(ctx context.Context, key key.Key, _ int) ([]routing.RecvdVal, error) { + v, err := c.datastore.Get(key.DsKey()) + if err != nil { + return nil, err + } + + byt, ok := v.([]byte) + if !ok { + return nil, errors.New("value stored in datastore not []byte") + } + rec := new(pb.Record) + err = proto.Unmarshal(byt, rec) + if err != nil { + return nil, err + } + + return []routing.RecvdVal{ + {Val: rec.GetValue()}, + }, nil +} + func (c *offlineRouting) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { return nil, ErrOffline } diff --git a/routing/record/record.go b/routing/record/record.go index 80da085814..61dd995ac6 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -6,13 +6,11 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" key "github.com/ipfs/go-ipfs/blocks/key" - dag "github.com/ipfs/go-ipfs/merkledag" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var _ = dag.FetchGraph var log = logging.Logger("routing/record") // MakePutRecord creates and signs a dht record for the given key/value pair diff --git a/routing/record/selection.go b/routing/record/selection.go new file mode 100644 index 0000000000..e90ebcd399 --- /dev/null +++ b/routing/record/selection.go @@ -0,0 +1,40 @@ +package record + +import ( + "errors" + "strings" + + key "github.com/ipfs/go-ipfs/blocks/key" +) + +// A SelectorFunc selects the best value for the given key from +// a slice of possible values and returns the index of the chosen one +type SelectorFunc func(key.Key, [][]byte) (int, error) + +type Selector map[string]SelectorFunc + +func (s Selector) BestRecord(k key.Key, recs [][]byte) (int, error) { + if len(recs) == 0 { + return 0, errors.New("no records given!") + } + + parts := strings.Split(string(k), "/") + if len(parts) < 3 { + log.Infof("Record key does not have selectorfunc: %s", k) + return 0, errors.New("record key does not have selectorfunc") + } + + sel, ok := s[parts[1]] + if !ok { + log.Infof("Unrecognized key prefix: %s", parts[1]) + return 0, ErrInvalidRecordType + } + + return sel(k, recs) +} + +// PublicKeySelector just selects the first entry. +// All valid public key records will be equivalent. +func PublicKeySelector(k key.Key, vals [][]byte) (int, error) { + return 0, nil +} diff --git a/routing/routing.go b/routing/routing.go index db9b49dcdf..1c799b9843 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -26,6 +26,18 @@ type IpfsRouting interface { // GetValue searches for the value corresponding to given Key. GetValue(context.Context, key.Key) ([]byte, error) + // GetValues searches for values corresponding to given Key. + // + // Passing a value of '0' for the count argument will cause the + // routing interface to return values only from cached or local storage + // and return an error if no cached value is found. + // + // Passing a value of '1' will return a local value if found, and query + // the network for the first value it finds otherwise. + // As a result, a value of '1' is mostly useful for cases where the record + // in question has only one valid value (such as public keys) + GetValues(c context.Context, k key.Key, count int) ([]RecvdVal, error) + // Value provider layer of indirection. // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. @@ -44,6 +56,13 @@ type IpfsRouting interface { // TODO expose io.Closer or plain-old Close error } +// RecvdVal represents a dht value record that has been received from a given peer +// it is used to track peers with expired records in order to correct them. +type RecvdVal struct { + From peer.ID + Val []byte +} + type PubKeyFetcher interface { GetPublicKey(context.Context, peer.ID) (ci.PubKey, error) } diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 97d3d70c72..923d530eb8 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -81,6 +81,22 @@ func (c *Client) GetValue(ctx context.Context, k key.Key) ([]byte, error) { return response.Record.GetValue(), nil } +func (c *Client) GetValues(ctx context.Context, k key.Key, _ int) ([]routing.RecvdVal, error) { + defer log.EventBegin(ctx, "getValue", &k).Done() + msg := pb.NewMessage(pb.Message_GET_VALUE, string(k), 0) + response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote + if err != nil { + return nil, err + } + + return []routing.RecvdVal{ + { + Val: response.Record.GetValue(), + From: c.local, + }, + }, nil +} + func (c *Client) Provide(ctx context.Context, k key.Key) error { defer log.EventBegin(ctx, "provide", &k).Done() msg := pb.NewMessage(pb.Message_ADD_PROVIDER, string(k), 0) From 34b054f5e0de53fe2a2329c26f4861236870bd8b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 18 Sep 2015 10:27:55 -0700 Subject: [PATCH 0850/3147] ipns record selection via sequence numbers This commit adds a sequence number to the IpnsEntry protobuf that is used to determine which among a set of entries for the same key is the 'most correct'. GetValues has been added to the routing interface to retrieve a set of records from the dht, for the caller to select from. GetValue (singular) will call GetValues, select the 'best' record, and then update that record to peers we received outdated records from. This will help keep the dht consistent. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@38e95d2d4e58d0e6040678dcc26e0142246cf4f3 --- namesys/pb/namesys.pb.go | 8 +++++ namesys/pb/namesys.proto | 2 ++ namesys/publisher.go | 77 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 80 insertions(+), 7 deletions(-) diff --git a/namesys/pb/namesys.pb.go b/namesys/pb/namesys.pb.go index 97e25a855a..4d99a5e0a2 100644 --- a/namesys/pb/namesys.pb.go +++ b/namesys/pb/namesys.pb.go @@ -56,6 +56,7 @@ type IpnsEntry struct { Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=namesys.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` + Sequence *uint64 `protobuf:"varint,5,opt,name=sequence" json:"sequence,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -91,6 +92,13 @@ func (m *IpnsEntry) GetValidity() []byte { return nil } +func (m *IpnsEntry) GetSequence() uint64 { + if m != nil && m.Sequence != nil { + return *m.Sequence + } + return 0 +} + func init() { proto.RegisterEnum("namesys.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) } diff --git a/namesys/pb/namesys.proto b/namesys/pb/namesys.proto index 4219af6bba..242f77bf2a 100644 --- a/namesys/pb/namesys.proto +++ b/namesys/pb/namesys.proto @@ -10,4 +10,6 @@ message IpnsEntry { optional ValidityType validityType = 3; optional bytes validity = 4; + + optional uint64 sequence = 5; } diff --git a/namesys/publisher.go b/namesys/publisher.go index e3dd1d81bb..a37a39fbe6 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,6 +7,7 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" @@ -45,10 +46,6 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) - data, err := createRoutingEntryData(k, value) - if err != nil { - return err - } pubkey := k.GetPublic() pkbytes, err := pubkey.Bytes() if err != nil { @@ -57,6 +54,27 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa nameb := u.Hash(pkbytes) namekey := key.Key("/pk/" + string(nameb)) + ipnskey := key.Key("/ipns/" + string(nameb)) + + // get previous records sequence number, and add one to it + var seqnum uint64 + prevrec, err := p.routing.GetValues(ctx, ipnskey, 0) + if err == nil { + e := new(pb.IpnsEntry) + err := proto.Unmarshal(prevrec[0].Val, e) + if err != nil { + return err + } + + seqnum = e.GetSequence() + 1 + } else if err != ds.ErrNotFound { + return err + } + + data, err := createRoutingEntryData(k, value, seqnum) + if err != nil { + return err + } log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key @@ -67,8 +85,6 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa return err } - ipnskey := key.Key("/ipns/" + string(nameb)) - log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) timectx, cancel = context.WithDeadline(ctx, time.Now().Add(time.Second*10)) @@ -80,12 +96,13 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa return nil } -func createRoutingEntryData(pk ci.PrivKey, val path.Path) ([]byte, error) { +func createRoutingEntryData(pk ci.PrivKey, val path.Path, seq uint64) ([]byte, error) { entry := new(pb.IpnsEntry) entry.Value = []byte(val) typ := pb.IpnsEntry_EOL entry.ValidityType = &typ + entry.Sequence = proto.Uint64(seq) entry.Validity = []byte(u.FormatRFC3339(time.Now().Add(time.Hour * 24))) sig, err := pk.Sign(ipnsEntryDataForSig(entry)) @@ -110,6 +127,52 @@ var IpnsRecordValidator = &record.ValidChecker{ Sign: true, } +func IpnsSelectorFunc(k key.Key, vals [][]byte) (int, error) { + var recs []*pb.IpnsEntry + for _, v := range vals { + e := new(pb.IpnsEntry) + err := proto.Unmarshal(v, e) + if err == nil { + recs = append(recs, e) + } else { + recs = append(recs, nil) + } + } + + var best_seq uint64 + best_i := -1 + + for i, r := range recs { + if r == nil { + continue + } + if best_i == -1 || r.GetSequence() > best_seq { + best_seq = r.GetSequence() + best_i = i + } else if r.GetSequence() == best_seq { + rt, err := u.ParseRFC3339(string(r.GetValidity())) + if err != nil { + continue + } + + bestt, err := u.ParseRFC3339(string(recs[best_i].GetValidity())) + if err != nil { + continue + } + + if rt.After(bestt) { + best_seq = r.GetSequence() + best_i = i + } + } + } + if best_i == -1 { + return 0, errors.New("no usable records in given set") + } + + return best_i, nil +} + // ValidateIpnsRecord implements ValidatorFunc and verifies that the // given 'val' is an IpnsEntry and that that entry is valid. func ValidateIpnsRecord(k key.Key, val []byte) error { From 1593d020fd6566eff172847d93b4254bbc703e7a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 21 Sep 2015 09:55:25 -0700 Subject: [PATCH 0851/3147] Fix dht queries Queries previously would sometimes only query three (alpha value) peers before halting the operation. This PR changes the number of peers grabbed from the routing table to start a query to K. Dht nodes would also not respond with enough peers, as per the kademlia paper, this has been changed to from 4 to 'K'. The query mechanism itself also was flawed in that it would pull all the peers it had yet to query out of the queue and 'start' the query for them. The concurrency rate limiting was done inside the 'queryPeer' method after the goroutine was spawned. This did not allow for peers receiver from query replies to be properly queried in order of distance. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@e26360b596419c895f24be9ba8ec9ec7e2f2d2d6 --- routing/dht/dht.go | 6 +----- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/query.go | 33 ++++++++++++++++----------------- routing/dht/routing.go | 8 ++++---- 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 64f28c74e3..2f9a6ebe62 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -312,11 +312,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ continue } - // must all be closer than self - key := key.Key(pmes.GetKey()) - if !kb.Closer(dht.self, clp, key) { - filtered = append(filtered, clp) - } + filtered = append(filtered, clp) } // ok seems like closer nodes diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 1c5d2b1c19..137995bed0 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -14,7 +14,7 @@ import ( ) // The number of closer peers to send on requests. -var CloserPeerCount = 4 +var CloserPeerCount = KValue // dhthandler specifies the signature of functions that handle DHT messages. type dhtHandler func(context.Context, peer.ID, *pb.Message) (*pb.Message, error) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 76173a615c..dc377e8b7f 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -23,7 +23,7 @@ func pointerizePeerInfos(pis []peer.PeerInfo) []*peer.PeerInfo { // to the given key func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key key.Key) (<-chan peer.ID, error) { e := log.EventBegin(ctx, "getClosestPeers", &key) - tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) + tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) if len(tablepeers) == 0 { return nil, kb.ErrLookupFailure } diff --git a/routing/dht/query.go b/routing/dht/query.go index ab4f28492c..b1bec20bb7 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -184,29 +184,28 @@ func (r *dhtQueryRunner) spawnWorkers(proc process.Process) { case <-r.proc.Closing(): return - case p, more := <-r.peersToQuery.DeqChan: - if !more { - return // channel closed. + case <-r.rateLimit: + select { + case p, more := <-r.peersToQuery.DeqChan: + if !more { + return // channel closed. + } + + // do it as a child func to make sure Run exits + // ONLY AFTER spawn workers has exited. + proc.Go(func(proc process.Process) { + r.queryPeer(proc, p) + }) + case <-r.proc.Closing(): + return + case <-r.peersRemaining.Done(): + return } - - // do it as a child func to make sure Run exits - // ONLY AFTER spawn workers has exited. - proc.Go(func(proc process.Process) { - r.queryPeer(proc, p) - }) } } } func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { - // make sure we rate limit concurrency. - select { - case <-r.rateLimit: - case <-proc.Closing(): - r.peersRemaining.Decrement(1) - return - } - // ok let's do this! // create a context from our proc. diff --git a/routing/dht/routing.go b/routing/dht/routing.go index d5854155f4..57341e69c6 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -145,7 +145,7 @@ func (dht *IpfsDHT) GetValues(ctx context.Context, key key.Key, nvals int) ([]ro } // get closest peers in the routing table - rtp := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) + rtp := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) log.Debugf("peers in rt: %s", len(rtp), rtp) if len(rtp) == 0 { log.Warning("No peers from routing table!") @@ -322,7 +322,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, return &dhtQueryResult{closerPeers: clpeers}, nil }) - peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), AlphaValue) + peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) _, err := query.Run(ctx, peers) if err != nil { log.Debugf("Query error: %s", err) @@ -342,7 +342,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er return pi, nil } - peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) + peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), KValue) if len(peers) == 0 { return peer.PeerInfo{}, kb.ErrLookupFailure } @@ -409,7 +409,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< peerchan := make(chan peer.PeerInfo, asyncQueryBuffer) peersSeen := peer.Set{} - peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), AlphaValue) + peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), KValue) if len(peers) == 0 { return nil, kb.ErrLookupFailure } From bb07db083ca07b9ce14d51368b9e17593e2bb085 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 21 Sep 2015 16:35:33 -0700 Subject: [PATCH 0852/3147] Implement ipns republisher This commit adds a very basic process that will periodically go through a list of given ids and republish the values for their ipns entries. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@452d98fc93c78ae95a4c838d0641eae3a1702112 --- namesys/publisher.go | 74 ++++++++++++---- namesys/republisher/repub.go | 142 ++++++++++++++++++++++++++++++ namesys/republisher/repub_test.go | 120 +++++++++++++++++++++++++ 3 files changed, 320 insertions(+), 16 deletions(-) create mode 100644 namesys/republisher/repub.go create mode 100644 namesys/republisher/repub_test.go diff --git a/namesys/publisher.go b/namesys/publisher.go index a37a39fbe6..33c7a49ccb 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,6 +14,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/namesys/pb" ci "github.com/ipfs/go-ipfs/p2p/crypto" + peer "github.com/ipfs/go-ipfs/p2p/peer" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" routing "github.com/ipfs/go-ipfs/routing" @@ -30,6 +31,8 @@ var ErrExpiredRecord = errors.New("expired record") // unknown validity type. var ErrUnrecognizedValidity = errors.New("unrecognized validity type") +var PublishPutValTimeout = time.Minute + // ipnsPublisher is capable of publishing and resolving names to the IPFS // routing system. type ipnsPublisher struct { @@ -37,7 +40,7 @@ type ipnsPublisher struct { } // NewRoutingPublisher constructs a publisher for the IPFS Routing name system. -func NewRoutingPublisher(route routing.IpfsRouting) Publisher { +func NewRoutingPublisher(route routing.IpfsRouting) *ipnsPublisher { return &ipnsPublisher{routing: route} } @@ -45,16 +48,19 @@ func NewRoutingPublisher(route routing.IpfsRouting) Publisher { // and publishes it out to the routing system func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) + return p.PublishWithEOL(ctx, k, value, time.Now().Add(time.Hour*24)) +} - pubkey := k.GetPublic() - pkbytes, err := pubkey.Bytes() +// PublishWithEOL is a temporary stand in for the ipns records implementation +// see here for more details: https://github.com/ipfs/specs/tree/master/records +func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { + + id, err := peer.IDFromPrivateKey(k) if err != nil { return err } - nameb := u.Hash(pkbytes) - namekey := key.Key("/pk/" + string(nameb)) - ipnskey := key.Key("/ipns/" + string(nameb)) + namekey, ipnskey := IpnsKeysForID(id) // get previous records sequence number, and add one to it var seqnum uint64 @@ -71,46 +77,75 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa return err } - data, err := createRoutingEntryData(k, value, seqnum) + entry, err := CreateRoutingEntryData(k, value, seqnum, eol) + if err != nil { + return err + } + + err = PublishEntry(ctx, p.routing, ipnskey, entry) + if err != nil { + return err + } + + err = PublishPublicKey(ctx, p.routing, namekey, k.GetPublic()) + if err != nil { + return err + } + + return nil +} + +func PublishPublicKey(ctx context.Context, r routing.IpfsRouting, k key.Key, pubk ci.PubKey) error { + log.Debugf("Storing pubkey at: %s", k) + pkbytes, err := pubk.Bytes() if err != nil { return err } - log.Debugf("Storing pubkey at: %s", namekey) // Store associated public key - timectx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second*10)) + timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) defer cancel() - err = p.routing.PutValue(timectx, namekey, pkbytes) + err = r.PutValue(timectx, k, pkbytes) + if err != nil { + return err + } + + return nil +} + +func PublishEntry(ctx context.Context, r routing.IpfsRouting, ipnskey key.Key, rec *pb.IpnsEntry) error { + timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) + defer cancel() + + data, err := proto.Marshal(rec) if err != nil { return err } log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) - timectx, cancel = context.WithDeadline(ctx, time.Now().Add(time.Second*10)) - defer cancel() - if err := p.routing.PutValue(timectx, ipnskey, data); err != nil { + if err := r.PutValue(timectx, ipnskey, data); err != nil { return err } return nil } -func createRoutingEntryData(pk ci.PrivKey, val path.Path, seq uint64) ([]byte, error) { +func CreateRoutingEntryData(pk ci.PrivKey, val path.Path, seq uint64, eol time.Time) (*pb.IpnsEntry, error) { entry := new(pb.IpnsEntry) entry.Value = []byte(val) typ := pb.IpnsEntry_EOL entry.ValidityType = &typ entry.Sequence = proto.Uint64(seq) - entry.Validity = []byte(u.FormatRFC3339(time.Now().Add(time.Hour * 24))) + entry.Validity = []byte(u.FormatRFC3339(eol)) sig, err := pk.Sign(ipnsEntryDataForSig(entry)) if err != nil { return nil, err } entry.Signature = sig - return proto.Marshal(entry) + return entry, nil } func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { @@ -226,3 +261,10 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p return nil } + +func IpnsKeysForID(id peer.ID) (name, ipns key.Key) { + namekey := key.Key("/pk/" + id) + ipnskey := key.Key("/ipns/" + id) + + return namekey, ipnskey +} diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go new file mode 100644 index 0000000000..9dd95f563b --- /dev/null +++ b/namesys/republisher/repub.go @@ -0,0 +1,142 @@ +package republisher + +import ( + "errors" + "sync" + "time" + + key "github.com/ipfs/go-ipfs/blocks/key" + namesys "github.com/ipfs/go-ipfs/namesys" + pb "github.com/ipfs/go-ipfs/namesys/pb" + peer "github.com/ipfs/go-ipfs/p2p/peer" + path "github.com/ipfs/go-ipfs/path" + "github.com/ipfs/go-ipfs/routing" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" +) + +var errNoEntry = errors.New("no previous entry") + +var log = logging.Logger("ipns-repub") + +var DefaultRebroadcastInterval = time.Hour * 4 + +const DefaultRecordLifetime = time.Hour * 24 + +type Republisher struct { + r routing.IpfsRouting + ds ds.Datastore + ps peer.Peerstore + + Interval time.Duration + + // how long records that are republished should be valid for + RecordLifetime time.Duration + + entrylock sync.Mutex + entries map[peer.ID]struct{} +} + +func NewRepublisher(r routing.IpfsRouting, ds ds.Datastore, ps peer.Peerstore) *Republisher { + return &Republisher{ + r: r, + ps: ps, + ds: ds, + entries: make(map[peer.ID]struct{}), + Interval: DefaultRebroadcastInterval, + RecordLifetime: DefaultRecordLifetime, + } +} + +func (rp *Republisher) AddName(id peer.ID) { + rp.entrylock.Lock() + defer rp.entrylock.Unlock() + rp.entries[id] = struct{}{} +} + +func (rp *Republisher) Run(proc goprocess.Process) { + tick := time.NewTicker(rp.Interval) + defer tick.Stop() + + for { + select { + case <-tick.C: + err := rp.republishEntries(proc) + if err != nil { + log.Error(err) + } + case <-proc.Closing(): + return + } + } +} + +func (rp *Republisher) republishEntries(p goprocess.Process) error { + ctx, cancel := context.WithCancel(gpctx.OnClosingContext(p)) + defer cancel() + + for id, _ := range rp.entries { + log.Debugf("republishing ipns entry for %s", id) + priv := rp.ps.PrivKey(id) + + // Look for it locally only + namekey, ipnskey := namesys.IpnsKeysForID(id) + p, seq, err := rp.getLastVal(ipnskey) + if err != nil { + if err == errNoEntry { + continue + } + return err + } + + // update record with same sequence number + eol := time.Now().Add(rp.RecordLifetime) + entry, err := namesys.CreateRoutingEntryData(priv, p, seq, eol) + if err != nil { + return err + } + + // republish public key + err = namesys.PublishPublicKey(ctx, rp.r, namekey, priv.GetPublic()) + if err != nil { + return err + } + + // republish ipns entry + err = namesys.PublishEntry(ctx, rp.r, ipnskey, entry) + if err != nil { + return err + } + } + + return nil +} + +func (rp *Republisher) getLastVal(k key.Key) (path.Path, uint64, error) { + ival, err := rp.ds.Get(k.DsKey()) + if err != nil { + // not found means we dont have a previously published entry + return "", 0, errNoEntry + } + + val := ival.([]byte) + dhtrec := new(dhtpb.Record) + err = proto.Unmarshal(val, dhtrec) + if err != nil { + return "", 0, err + } + + // extract published data from record + e := new(pb.IpnsEntry) + err = proto.Unmarshal(dhtrec.GetValue(), e) + if err != nil { + return "", 0, err + } + return path.Path(e.Value), e.GetSequence(), nil +} diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go new file mode 100644 index 0000000000..66d137a70d --- /dev/null +++ b/namesys/republisher/repub_test.go @@ -0,0 +1,120 @@ +package republisher_test + +import ( + "errors" + "testing" + "time" + + goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + "github.com/ipfs/go-ipfs/core" + mock "github.com/ipfs/go-ipfs/core/mock" + namesys "github.com/ipfs/go-ipfs/namesys" + . "github.com/ipfs/go-ipfs/namesys/republisher" + mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" + peer "github.com/ipfs/go-ipfs/p2p/peer" + path "github.com/ipfs/go-ipfs/path" +) + +func TestRepublish(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // create network + mn := mocknet.New(ctx) + + var nodes []*core.IpfsNode + for i := 0; i < 10; i++ { + nd, err := core.NewNode(ctx, &core.BuildCfg{ + Online: true, + Host: mock.MockHostOption(mn), + }) + if err != nil { + t.Fatal(err) + } + + nodes = append(nodes, nd) + } + + mn.LinkAll() + + bsinf := core.BootstrapConfigWithPeers( + []peer.PeerInfo{ + nodes[0].Peerstore.PeerInfo(nodes[0].Identity), + }, + ) + + for _, n := range nodes[1:] { + if err := n.Bootstrap(bsinf); err != nil { + t.Fatal(err) + } + } + + // have one node publish a record that is valid for 1 second + publisher := nodes[3] + p := path.FromString("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") // does not need to be valid + rp := namesys.NewRoutingPublisher(publisher.Routing) + err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, time.Now().Add(time.Second)) + if err != nil { + t.Fatal(err) + } + + name := "/ipns/" + publisher.Identity.Pretty() + if err := verifyResolution(nodes, name, p); err != nil { + t.Fatal(err) + } + + // Now wait a second, the records will be invalid and we should fail to resolve + time.Sleep(time.Second) + if err := verifyResolutionFails(nodes, name); err != nil { + t.Fatal(err) + } + + // The republishers that are contained within the nodes have their timeout set + // to 12 hours. Instead of trying to tweak those, we're just going to pretend + // they dont exist and make our own. + repub := NewRepublisher(publisher.Routing, publisher.Repo.Datastore(), publisher.Peerstore) + repub.Interval = time.Second + repub.RecordLifetime = time.Second * 5 + repub.AddName(publisher.Identity) + + proc := goprocess.Go(repub.Run) + defer proc.Close() + + // now wait a couple seconds for it to fire + time.Sleep(time.Second * 2) + + // we should be able to resolve them now + if err := verifyResolution(nodes, name, p); err != nil { + t.Fatal(err) + } +} + +func verifyResolution(nodes []*core.IpfsNode, key string, exp path.Path) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + for _, n := range nodes { + val, err := n.Namesys.Resolve(ctx, key) + if err != nil { + return err + } + + if val != exp { + return errors.New("resolved wrong record") + } + } + return nil +} + +func verifyResolutionFails(nodes []*core.IpfsNode, key string) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + for _, n := range nodes { + _, err := n.Namesys.Resolve(ctx, key) + if err == nil { + return errors.New("expected resolution to fail") + } + } + return nil +} From 1b408c7d4f88fa279b0da6161f1f15ccab31d25f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 21 Sep 2015 16:35:33 -0700 Subject: [PATCH 0853/3147] Implement ipns republisher This commit adds a very basic process that will periodically go through a list of given ids and republish the values for their ipns entries. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@aea26285fdea79835535822136cd34ccdadb79ef --- routing/dht/dht.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 2f9a6ebe62..5de2d21da3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,7 +18,6 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" @@ -217,13 +216,10 @@ func (dht *IpfsDHT) getLocal(key key.Key) (*pb.Record, error) { return nil, err } - // TODO: 'if paranoid' - if u.Debug { - err = dht.verifyRecordLocally(rec) - if err != nil { - log.Debugf("local record verify failed: %s (discarded)", err) - return nil, err - } + err = dht.verifyRecordLocally(rec) + if err != nil { + log.Debugf("local record verify failed: %s (discarded)", err) + return nil, err } return rec, nil From 4fc02fd10583930d8f17d52e33638fc01e570fd9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 30 Sep 2015 11:03:44 -0700 Subject: [PATCH 0854/3147] make publish more configurable and add test for repub License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@af676f7be1e9ce6ae54435408d5e5b723d4d3a4e --- namesys/interface.go | 5 +++++ namesys/namesys.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/namesys/interface.go b/namesys/interface.go index 5903c78a39..09c296c23a 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -31,6 +31,7 @@ package namesys import ( "errors" + "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" @@ -105,4 +106,8 @@ type Publisher interface { // Publish establishes a name-value mapping. // TODO make this not PrivKey specific. Publish(ctx context.Context, name ci.PrivKey, value path.Path) error + + // TODO: to be replaced by a more generic 'PublishWithValidity' type + // call once the records spec is implemented + PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error } diff --git a/namesys/namesys.go b/namesys/namesys.go index 7fe317b669..ed03b4cc2e 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -2,6 +2,7 @@ package namesys import ( "strings" + "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" @@ -81,3 +82,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { return ns.publishers["/ipns/"].Publish(ctx, name, value) } + +func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, val path.Path, eol time.Time) error { + return ns.publishers["/ipns/"].PublishWithEOL(ctx, name, val, eol) +} From 7dd91b521c26479bdf8b006cf8c3ce837e9b5554 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 30 Sep 2015 10:59:12 -0700 Subject: [PATCH 0855/3147] Addressing comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@9fb7bdffd8a3289619db03a3c2ad498798bc17b5 --- routing/dht/routing.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 57341e69c6..df93396ce3 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,6 +3,7 @@ package dht import ( "bytes" "sync" + "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" @@ -60,6 +61,8 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key key.Key, value []byte) err for p := range pchan { wg.Add(1) go func(p peer.ID) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() defer wg.Done() notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ Type: notif.Value, @@ -78,7 +81,10 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key key.Key, value []byte) err // GetValue searches for the value corresponding to given Key. func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { - vals, err := dht.GetValues(ctx, key, 3) + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + + vals, err := dht.GetValues(ctx, key, 16) if err != nil { return nil, err } @@ -111,6 +117,8 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { // if someone sent us a different 'less-valid' record, lets correct them if !bytes.Equal(v.Val, best) { go func(v routing.RecvdVal) { + ctx, cancel := context.WithTimeout(dht.Context(), time.Second*30) + defer cancel() err := dht.putValueToPeer(ctx, v.From, key, fixupRec) if err != nil { log.Error("Error correcting DHT entry: ", err) From 52e070010aa2de055582d26d8401f2e6699e9618 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 30 Sep 2015 10:59:12 -0700 Subject: [PATCH 0856/3147] Addressing comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@38d88f11b818ad8d8766e3d5ccd5c75855b7549f --- namesys/ipns_select_test.go | 127 +++++++++++++++++++++++++++++++++++ namesys/publisher.go | 23 +++++-- namesys/republisher/repub.go | 18 +---- 3 files changed, 148 insertions(+), 20 deletions(-) create mode 100644 namesys/ipns_select_test.go diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go new file mode 100644 index 0000000000..ebd81e86d6 --- /dev/null +++ b/namesys/ipns_select_test.go @@ -0,0 +1,127 @@ +package namesys + +import ( + "fmt" + "math/rand" + "testing" + "time" + + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + + pb "github.com/ipfs/go-ipfs/namesys/pb" + ci "github.com/ipfs/go-ipfs/p2p/crypto" + path "github.com/ipfs/go-ipfs/path" + u "github.com/ipfs/go-ipfs/util" +) + +func shuffle(a []*pb.IpnsEntry) { + for n := 0; n < 5; n++ { + for i, _ := range a { + j := rand.Intn(len(a)) + a[i], a[j] = a[j], a[i] + } + } +} + +func AssertSelected(r *pb.IpnsEntry, from ...*pb.IpnsEntry) error { + shuffle(from) + var vals [][]byte + for _, r := range from { + data, err := proto.Marshal(r) + if err != nil { + return err + } + vals = append(vals, data) + } + + i, err := selectRecord(from, vals) + if err != nil { + return err + } + + if from[i] != r { + return fmt.Errorf("selected incorrect record %d", i) + } + + return nil +} + +func TestOrdering(t *testing.T) { + // select timestamp so selection is deterministic + ts := time.Unix(1000000, 0) + + // generate a key for signing the records + r := u.NewSeededRand(15) // generate deterministic keypair + priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + if err != nil { + t.Fatal(err) + } + + e1, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + + e2, err := CreateRoutingEntryData(priv, path.Path("bar"), 2, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + + e3, err := CreateRoutingEntryData(priv, path.Path("baz"), 3, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + + e4, err := CreateRoutingEntryData(priv, path.Path("cat"), 3, ts.Add(time.Hour*2)) + if err != nil { + t.Fatal(err) + } + + e5, err := CreateRoutingEntryData(priv, path.Path("dog"), 4, ts.Add(time.Hour*3)) + if err != nil { + t.Fatal(err) + } + + e6, err := CreateRoutingEntryData(priv, path.Path("fish"), 4, ts.Add(time.Hour*3)) + if err != nil { + t.Fatal(err) + } + + // e1 is the only record, i hope it gets this right + err = AssertSelected(e1, e1) + if err != nil { + t.Fatal(err) + } + + // e2 has the highest sequence number + err = AssertSelected(e2, e1, e2) + if err != nil { + t.Fatal(err) + } + + // e3 has the highest sequence number + err = AssertSelected(e3, e1, e2, e3) + if err != nil { + t.Fatal(err) + } + + // e4 has a higher timeout + err = AssertSelected(e4, e1, e2, e3, e4) + if err != nil { + t.Fatal(err) + } + + // e5 has the highest sequence number + err = AssertSelected(e5, e1, e2, e3, e4, e5) + if err != nil { + t.Fatal(err) + } + + // e6 should be selected as its signauture will win in the comparison + err = AssertSelected(e6, e1, e2, e3, e4, e5, e6) + if err != nil { + t.Fatal(err) + } + + _ = []interface{}{e1, e2, e3, e4, e5, e6} +} diff --git a/namesys/publisher.go b/namesys/publisher.go index 33c7a49ccb..521ce4cc8e 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -60,7 +60,7 @@ func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value return err } - namekey, ipnskey := IpnsKeysForID(id) + _, ipnskey := IpnsKeysForID(id) // get previous records sequence number, and add one to it var seqnum uint64 @@ -77,17 +77,22 @@ func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value return err } + return PutRecordToRouting(ctx, k, value, seqnum, eol, p.routing, id) +} + +func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqnum uint64, eol time.Time, r routing.IpfsRouting, id peer.ID) error { + namekey, ipnskey := IpnsKeysForID(id) entry, err := CreateRoutingEntryData(k, value, seqnum, eol) if err != nil { return err } - err = PublishEntry(ctx, p.routing, ipnskey, entry) + err = PublishEntry(ctx, r, ipnskey, entry) if err != nil { return err } - err = PublishPublicKey(ctx, p.routing, namekey, k.GetPublic()) + err = PublishPublicKey(ctx, r, namekey, k.GetPublic()) if err != nil { return err } @@ -174,13 +179,18 @@ func IpnsSelectorFunc(k key.Key, vals [][]byte) (int, error) { } } + return selectRecord(recs, vals) +} + +func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { var best_seq uint64 best_i := -1 for i, r := range recs { - if r == nil { + if r == nil || r.GetSequence() < best_seq { continue } + if best_i == -1 || r.GetSequence() > best_seq { best_seq = r.GetSequence() best_i = i @@ -196,8 +206,11 @@ func IpnsSelectorFunc(k key.Key, vals [][]byte) (int, error) { } if rt.After(bestt) { - best_seq = r.GetSequence() best_i = i + } else if rt == bestt { + if bytes.Compare(vals[i], vals[best_i]) > 0 { + best_i = i + } } } } diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 9dd95f563b..4fece57210 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -69,7 +69,7 @@ func (rp *Republisher) Run(proc goprocess.Process) { case <-tick.C: err := rp.republishEntries(proc) if err != nil { - log.Error(err) + log.Error("Republisher failed to republish: ", err) } case <-proc.Closing(): return @@ -86,7 +86,7 @@ func (rp *Republisher) republishEntries(p goprocess.Process) error { priv := rp.ps.PrivKey(id) // Look for it locally only - namekey, ipnskey := namesys.IpnsKeysForID(id) + _, ipnskey := namesys.IpnsKeysForID(id) p, seq, err := rp.getLastVal(ipnskey) if err != nil { if err == errNoEntry { @@ -97,19 +97,7 @@ func (rp *Republisher) republishEntries(p goprocess.Process) error { // update record with same sequence number eol := time.Now().Add(rp.RecordLifetime) - entry, err := namesys.CreateRoutingEntryData(priv, p, seq, eol) - if err != nil { - return err - } - - // republish public key - err = namesys.PublishPublicKey(ctx, rp.r, namekey, priv.GetPublic()) - if err != nil { - return err - } - - // republish ipns entry - err = namesys.PublishEntry(ctx, rp.r, ipnskey, entry) + err = namesys.PutRecordToRouting(ctx, priv, p, seq, eol, rp.r, id) if err != nil { return err } From 270a8bc4f49630dbd3fb6b0b5c52e441e9214457 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 15:02:22 -0700 Subject: [PATCH 0857/3147] fix publish fail on prexisting bad record dont error out if prexisting record is bad, just grab its sequence number and continue on with the publish. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@c6ef238a2ce839021a2afbfad7674d79d8d1ca45 --- routing/dht/handlers.go | 104 +++++++++++++++++++++-------- routing/dht/pb/dht.pb.go | 15 ++++- routing/dht/pb/dht.proto | 3 + routing/dht/records.go | 9 +++ routing/mock/centralized_client.go | 31 ++++++--- routing/mock/centralized_server.go | 2 +- 6 files changed, 122 insertions(+), 42 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 137995bed0..6fa4d3f9b3 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -3,6 +3,7 @@ package dht import ( "errors" "fmt" + "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" @@ -10,6 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + u "github.com/ipfs/go-ipfs/util" lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" ) @@ -46,41 +48,17 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) // first, is there even a key? - k := pmes.GetKey() + k := key.Key(pmes.GetKey()) if k == "" { return nil, errors.New("handleGetValue but no key was provided") // TODO: send back an error response? could be bad, but the other node's hanging. } - // let's first check if we have the value locally. - log.Debugf("%s handleGetValue looking into ds", dht.self) - dskey := key.Key(k).DsKey() - iVal, err := dht.datastore.Get(dskey) - log.Debugf("%s handleGetValue looking into ds GOT %v", dht.self, iVal) - - // if we got an unexpected error, bail. - if err != nil && err != ds.ErrNotFound { + rec, err := dht.checkLocalDatastore(k) + if err != nil { return nil, err } - - // if we have the value, send it back - if err == nil { - log.Debugf("%s handleGetValue success!", dht.self) - - byts, ok := iVal.([]byte) - if !ok { - return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) - } - - rec := new(pb.Record) - err := proto.Unmarshal(byts, rec) - if err != nil { - log.Debug("Failed to unmarshal dht record from datastore") - return nil, err - } - - resp.Record = rec - } + resp.Record = rec // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) @@ -102,6 +80,69 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess return resp, nil } +func (dht *IpfsDHT) checkLocalDatastore(k key.Key) (*pb.Record, error) { + log.Debugf("%s handleGetValue looking into ds", dht.self) + dskey := k.DsKey() + iVal, err := dht.datastore.Get(dskey) + log.Debugf("%s handleGetValue looking into ds GOT %v", dht.self, iVal) + + if err == ds.ErrNotFound { + return nil, nil + } + + // if we got an unexpected error, bail. + if err != nil { + return nil, err + } + + // if we have the value, send it back + log.Debugf("%s handleGetValue success!", dht.self) + + byts, ok := iVal.([]byte) + if !ok { + return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) + } + + rec := new(pb.Record) + err = proto.Unmarshal(byts, rec) + if err != nil { + log.Debug("Failed to unmarshal dht record from datastore") + return nil, err + } + + // if its our record, dont bother checking the times on it + if peer.ID(rec.GetAuthor()) == dht.self { + return rec, nil + } + + var recordIsBad bool + recvtime, err := u.ParseRFC3339(rec.GetTimeReceived()) + if err != nil { + log.Info("either no receive time set on record, or it was invalid: ", err) + recordIsBad = true + } + + if time.Now().Sub(recvtime) > MaxRecordAge { + log.Debug("old record found, tossing.") + recordIsBad = true + } + + // NOTE: we do not verify the record here beyond checking these timestamps. + // we put the burden of checking the records on the requester as checking a record + // may be computationally expensive + + if recordIsBad { + err := dht.datastore.Delete(dskey) + if err != nil { + log.Error("Failed to delete bad record from datastore: ", err) + } + + return nil, nil // can treat this as not having the record at all + } + + return rec, nil +} + // Store a value in this peer local storage func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { defer log.EventBegin(ctx, "handlePutValue", p).Done() @@ -112,7 +153,12 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess return nil, err } - data, err := proto.Marshal(pmes.GetRecord()) + rec := pmes.GetRecord() + + // record the time we receive every record + rec.TimeReceived = proto.String(u.FormatRFC3339(time.Now())) + + data, err := proto.Marshal(rec) if err != nil { return nil, err } diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 9a313a8974..4b8501180b 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package dht_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "github.com/gogo/protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. @@ -221,8 +221,10 @@ type Record struct { // hash of the authors public key Author *string `protobuf:"bytes,3,opt,name=author" json:"author,omitempty"` // A PKI signature for the key+value+author - Signature []byte `protobuf:"bytes,4,opt,name=signature" json:"signature,omitempty"` - XXX_unrecognized []byte `json:"-"` + Signature []byte `protobuf:"bytes,4,opt,name=signature" json:"signature,omitempty"` + // Time the record was received, set by receiver + TimeReceived *string `protobuf:"bytes,5,opt,name=timeReceived" json:"timeReceived,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *Record) Reset() { *m = Record{} } @@ -257,6 +259,13 @@ func (m *Record) GetSignature() []byte { return nil } +func (m *Record) GetTimeReceived() string { + if m != nil && m.TimeReceived != nil { + return *m.TimeReceived + } + return "" +} + func init() { proto.RegisterEnum("dht.pb.Message_MessageType", Message_MessageType_name, Message_MessageType_value) proto.RegisterEnum("dht.pb.Message_ConnectionType", Message_ConnectionType_name, Message_ConnectionType_value) diff --git a/routing/dht/pb/dht.proto b/routing/dht/pb/dht.proto index 91c8d8e043..de88c3451b 100644 --- a/routing/dht/pb/dht.proto +++ b/routing/dht/pb/dht.proto @@ -75,4 +75,7 @@ message Record { // A PKI signature for the key+value+author optional bytes signature = 4; + + // Time the record was received, set by receiver + optional string timeReceived = 5; } diff --git a/routing/dht/records.go b/routing/dht/records.go index 3c7d1d1764..49a06d5574 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -2,6 +2,7 @@ package dht import ( "fmt" + "time" ctxfrac "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/frac" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" @@ -12,6 +13,14 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ) +// MaxRecordAge specifies the maximum time that any node will hold onto a record +// from the time its received. This does not apply to any other forms of validity that +// the record may contain. +// For example, a record may contain an ipns entry with an EOL saying its valid +// until the year 2020 (a great time in the future). For that record to stick around +// it must be rebroadcasted more frequently than once every 'MaxRecordAge' +const MaxRecordAge = time.Hour * 36 + func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { log.Debugf("getPublicKey for: %s", p) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 09f17e61e2..9d9a1f6da2 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,12 +4,15 @@ import ( "errors" "time" + proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) @@ -25,7 +28,16 @@ type client struct { // FIXME(brian): is this method meant to simulate putting a value into the network? func (c *client) PutValue(ctx context.Context, key key.Key, val []byte) error { log.Debugf("PutValue: %s", key) - return c.datastore.Put(key.DsKey(), val) + rec := new(dhtpb.Record) + rec.Value = val + rec.Key = proto.String(string(key)) + rec.TimeReceived = proto.String(u.FormatRFC3339(time.Now())) + data, err := proto.Marshal(rec) + if err != nil { + return err + } + + return c.datastore.Put(key.DsKey(), data) } // FIXME(brian): is this method meant to simulate getting a value from the network? @@ -41,21 +53,22 @@ func (c *client) GetValue(ctx context.Context, key key.Key) ([]byte, error) { return nil, errors.New("could not cast value from datastore") } - return data, nil + rec := new(dhtpb.Record) + err = proto.Unmarshal(data, rec) + if err != nil { + return nil, err + } + + return rec.GetValue(), nil } func (c *client) GetValues(ctx context.Context, key key.Key, count int) ([]routing.RecvdVal, error) { - log.Debugf("GetValue: %s", key) - v, err := c.datastore.Get(key.DsKey()) + log.Debugf("GetValues: %s", key) + data, err := c.GetValue(ctx, key) if err != nil { return nil, err } - data, ok := v.([]byte) - if !ok { - return nil, errors.New("could not cast value from datastore") - } - return []routing.RecvdVal{{Val: data, From: c.peer.ID()}}, nil } diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index c7bd239ed3..a62f64f8d7 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -80,7 +80,7 @@ func (rs *s) Client(p testutil.Identity) Client { func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Identity, datastore ds.Datastore) Client { return &client{ peer: p, - datastore: ds.NewMapDatastore(), + datastore: datastore, server: rs, } } From 23111ccfb35548b87aac0db814578d562e11cb2f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 15:02:22 -0700 Subject: [PATCH 0858/3147] fix publish fail on prexisting bad record dont error out if prexisting record is bad, just grab its sequence number and continue on with the publish. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@7a56cf96849c1120a3ac6bdf6a34cb69f6a4d22d --- namesys/namesys.go | 5 +- namesys/publisher.go | 65 +++++++++++++++++---- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 94 ++++++++++++++++++++++++++++++- 4 files changed, 150 insertions(+), 16 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index ed03b4cc2e..12b73218ba 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -4,6 +4,7 @@ import ( "strings" "time" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" @@ -25,7 +26,7 @@ type mpns struct { } // NewNameSystem will construct the IPFS naming system based on Routing -func NewNameSystem(r routing.IpfsRouting) NameSystem { +func NewNameSystem(r routing.IpfsRouting, ds ds.Datastore) NameSystem { return &mpns{ resolvers: map[string]resolver{ "dns": newDNSResolver(), @@ -33,7 +34,7 @@ func NewNameSystem(r routing.IpfsRouting) NameSystem { "dht": newRoutingResolver(r), }, publishers: map[string]Publisher{ - "/ipns/": NewRoutingPublisher(r), + "/ipns/": NewRoutingPublisher(r, ds), }, } } diff --git a/namesys/publisher.go b/namesys/publisher.go index 521ce4cc8e..e31217dff3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -18,6 +18,7 @@ import ( path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" routing "github.com/ipfs/go-ipfs/routing" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" u "github.com/ipfs/go-ipfs/util" @@ -37,11 +38,15 @@ var PublishPutValTimeout = time.Minute // routing system. type ipnsPublisher struct { routing routing.IpfsRouting + ds ds.Datastore } // NewRoutingPublisher constructs a publisher for the IPFS Routing name system. -func NewRoutingPublisher(route routing.IpfsRouting) *ipnsPublisher { - return &ipnsPublisher{routing: route} +func NewRoutingPublisher(route routing.IpfsRouting, ds ds.Datastore) *ipnsPublisher { + if ds == nil { + panic("nil datastore") + } + return &ipnsPublisher{routing: route, ds: ds} } // Publish implements Publisher. Accepts a keypair and a value, @@ -62,22 +67,58 @@ func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value _, ipnskey := IpnsKeysForID(id) - // get previous records sequence number, and add one to it - var seqnum uint64 - prevrec, err := p.routing.GetValues(ctx, ipnskey, 0) + // get previous records sequence number + seqnum, err := p.getPreviousSeqNo(ctx, ipnskey) + if err != nil { + return err + } + + // increment it + seqnum++ + + return PutRecordToRouting(ctx, k, value, seqnum, eol, p.routing, id) +} + +func (p *ipnsPublisher) getPreviousSeqNo(ctx context.Context, ipnskey key.Key) (uint64, error) { + prevrec, err := p.ds.Get(ipnskey.DsKey()) + if err != nil && err != ds.ErrNotFound { + // None found, lets start at zero! + return 0, err + } + var val []byte if err == nil { - e := new(pb.IpnsEntry) - err := proto.Unmarshal(prevrec[0].Val, e) + prbytes, ok := prevrec.([]byte) + if !ok { + return 0, fmt.Errorf("unexpected type returned from datastore: %#v", prevrec) + } + dhtrec := new(dhtpb.Record) + err := proto.Unmarshal(prbytes, dhtrec) if err != nil { - return err + return 0, err } - seqnum = e.GetSequence() + 1 - } else if err != ds.ErrNotFound { - return err + val = dhtrec.GetValue() + } else { + // try and check the dht for a record + ctx, cancel := context.WithTimeout(ctx, time.Second*30) + defer cancel() + + rv, err := p.routing.GetValue(ctx, ipnskey) + if err != nil { + // no such record found, start at zero! + return 0, nil + } + + val = rv } - return PutRecordToRouting(ctx, k, value, seqnum, eol, p.routing, id) + e := new(pb.IpnsEntry) + err = proto.Unmarshal(val, e) + if err != nil { + return 0, err + } + + return e.GetSequence(), nil } func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqnum uint64, eol time.Time, r routing.IpfsRouting, id peer.ID) error { diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 66d137a70d..ef7fcf7e34 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -54,7 +54,7 @@ func TestRepublish(t *testing.T) { // have one node publish a record that is valid for 1 second publisher := nodes[3] p := path.FromString("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") // does not need to be valid - rp := namesys.NewRoutingPublisher(publisher.Routing) + rp := namesys.NewRoutingPublisher(publisher.Routing, publisher.Repo.Datastore()) err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, time.Now().Add(time.Second)) if err != nil { t.Fatal(err) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 3dde211ad4..4d81751f1b 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -1,10 +1,14 @@ package namesys import ( + "errors" "testing" + "time" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" + peer "github.com/ipfs/go-ipfs/p2p/peer" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "github.com/ipfs/go-ipfs/util" @@ -13,9 +17,10 @@ import ( func TestRoutingResolve(t *testing.T) { d := mockrouting.NewServer().Client(testutil.RandIdentityOrFatal(t)) + dstore := ds.NewMapDatastore() resolver := NewRoutingResolver(d) - publisher := NewRoutingPublisher(d) + publisher := NewRoutingPublisher(d, dstore) privk, pubk, err := testutil.RandTestKeyPair(512) if err != nil { @@ -43,3 +48,90 @@ func TestRoutingResolve(t *testing.T) { t.Fatal("Got back incorrect value.") } } + +func TestPrexistingExpiredRecord(t *testing.T) { + dstore := ds.NewMapDatastore() + d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) + + resolver := NewRoutingResolver(d) + publisher := NewRoutingPublisher(d, dstore) + + privk, pubk, err := testutil.RandTestKeyPair(512) + if err != nil { + t.Fatal(err) + } + + id, err := peer.IDFromPublicKey(pubk) + if err != nil { + t.Fatal(err) + } + + // Make an expired record and put it in the datastore + h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") + eol := time.Now().Add(time.Hour * -1) + err = PutRecordToRouting(context.Background(), privk, h, 0, eol, d, id) + if err != nil { + t.Fatal(err) + } + + // Now, with an old record in the system already, try and publish a new one + err = publisher.Publish(context.Background(), privk, h) + if err != nil { + t.Fatal(err) + } + + err = verifyCanResolve(resolver, id.Pretty(), h) + if err != nil { + t.Fatal(err) + } +} + +func TestPrexistingRecord(t *testing.T) { + dstore := ds.NewMapDatastore() + d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) + + resolver := NewRoutingResolver(d) + publisher := NewRoutingPublisher(d, dstore) + + privk, pubk, err := testutil.RandTestKeyPair(512) + if err != nil { + t.Fatal(err) + } + + id, err := peer.IDFromPublicKey(pubk) + if err != nil { + t.Fatal(err) + } + + // Make a good record and put it in the datastore + h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") + eol := time.Now().Add(time.Hour) + err = PutRecordToRouting(context.Background(), privk, h, 0, eol, d, id) + if err != nil { + t.Fatal(err) + } + + // Now, with an old record in the system already, try and publish a new one + err = publisher.Publish(context.Background(), privk, h) + if err != nil { + t.Fatal(err) + } + + err = verifyCanResolve(resolver, id.Pretty(), h) + if err != nil { + t.Fatal(err) + } +} + +func verifyCanResolve(r Resolver, name string, exp path.Path) error { + res, err := r.Resolve(context.Background(), name) + if err != nil { + return err + } + + if res != exp { + return errors.New("got back wrong record!") + } + + return nil +} From 088995057c82e8d78e7b69a4723f98e27d0928cd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0859/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@43380f1573ac394d7fb7e060cd4d150e117e4ff0 --- routing/dht/dht.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/kbucket/table.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/standard.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5de2d21da3..7b8b449aec 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,7 +18,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index d9f6a20736..3fd63902f5 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index b1bec20bb7..3c89b3fe2d 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -11,7 +11,7 @@ import ( u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 45e438635b..ed3b6d3505 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,7 +8,7 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("table") diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 9d9a1f6da2..61005aa9f6 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -14,7 +14,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 49df5870a4..ca2eafeecf 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,7 +9,7 @@ import ( p2phost "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 22aef75b3f..b2b636b778 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -13,7 +13,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 61dd995ac6..2de5f0856a 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("routing/record") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 923d530eb8..c22b55b168 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -14,7 +14,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index cba08c2ea7..7213ef4360 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -12,7 +12,7 @@ import ( peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) const ProtocolSNR = "/ipfs/supernoderouting" From 3a20deeabf872c37c7a3550a7a4391e49e12b5ef Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0860/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@40707144ea9add435acffb9bcd62e0afdeb3f8c0 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index c397143984..4b0ff47209 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -19,7 +19,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") From fc63ad9c93931bb6dc222f2fcdb1787359d0f810 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0861/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@0a3f52e5d2ae24a0204d213d83a6f52512f94412 --- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4fece57210..cf1d5a2187 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -18,7 +18,7 @@ import ( goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/routing.go b/namesys/routing.go index 9946ed560c..3d49c564cb 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("namesys") From 05c2d5fab3042d65c75be117ceb91dd0077ff428 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0862/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@79880d628448ac20ef0a9ea49d5600514a38add2 --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index a82b93f82e..5f6f466794 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -14,7 +14,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("pin") From ba2417b1adef0463db0a89d31b50757c757f86d8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0863/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@3a1ca24b72a12a0a1af28d982b5f465f0d0c604a --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 5558bf3b2c..cb910ff8cf 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,7 +12,7 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("blockstore") From e3eeec383770381de5572ec7fb67c340624dc4e7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0864/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@047a080b409214aa2508e8116290b3f2d3414226 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index f13c090e4f..ee2973f25e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("blockservice") From bbe3cbbe568eaf52ce2af6e608daf8fa1881ea9f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0865/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@1b4493df5078ab9e63bcab18acc5a1bd1787ac33 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 31b5c03e53..47cc679aa0 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("chunk") From 8f6a09bfea3700bbfb8f2b40311f1f01eec20a57 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 0866/3147] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@e4b7ad717295da6bcc960fdce8f37f252d7f8fb7 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index 6c3ae8a974..4f4db6dce5 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("path") From dfae38a81ec323f0823d2d8638f5830179761b37 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 4 Oct 2015 02:59:23 -0400 Subject: [PATCH 0867/3147] fix vendor path. We need to have a test case that fails when any dep path is not vendored. (until we use gx fully that is, and vendor everything with it) License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-ipfs-routing@da928b58df930ffcf54c68d04f0818d70ece8039 --- routing/dht/pb/dht.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 4b8501180b..2d7ad1d9db 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package dht_pb -import proto "github.com/gogo/protobuf/proto" +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 3a853d8902634822b9ab2bc6c874eb0616364c52 Mon Sep 17 00:00:00 2001 From: rht Date: Mon, 14 Sep 2015 06:52:47 +0700 Subject: [PATCH 0868/3147] Decompose maybeGzwriter License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@291d62bbce567ed4a85c00ac5afbe5631bc6c668 --- unixfs/archive/archive.go | 62 +++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index e1faf5a33d..1fbd5ccd97 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -36,67 +36,71 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService // need to connect a writer to a reader piper, pipew := io.Pipe() + checkErrAndClosePipe := func(err error) bool { + if err != nil { + pipew.CloseWithError(err) + return true + } + return false + } // use a buffered writer to parallelize task bufw := bufio.NewWriterSize(pipew, DefaultBufSize) // compression determines whether to use gzip compression. - var maybeGzw io.WriteCloser - var err error - if compression != gzip.NoCompression { - maybeGzw, err = gzip.NewWriterLevel(bufw, compression) - if err != nil { - pipew.CloseWithError(err) - return nil, err + maybeGzw, err := newMaybeGzWriter(bufw, compression) + if checkErrAndClosePipe(err) { + return nil, err + } + + closeGzwAndPipe := func() { + if err := maybeGzw.Close(); checkErrAndClosePipe(err) { + return } - } else { - maybeGzw = &identityWriteCloser{bufw} + if err := bufw.Flush(); checkErrAndClosePipe(err) { + return + } + pipew.Close() // everything seems to be ok. } if !archive && compression != gzip.NoCompression { // the case when the node is a file dagr, err := uio.NewDagReader(ctx, nd, dag) - if err != nil { - pipew.CloseWithError(err) + if checkErrAndClosePipe(err) { return nil, err } go func() { - if _, err := dagr.WriteTo(maybeGzw); err != nil { - pipew.CloseWithError(err) - return - } - maybeGzw.Close() - if err := bufw.Flush(); err != nil { - pipew.CloseWithError(err) + if _, err := dagr.WriteTo(maybeGzw); checkErrAndClosePipe(err) { return } - pipew.Close() // everything seems to be ok. + closeGzwAndPipe() // everything seems to be ok }() } else { // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format // construct the tar writer w, err := tar.NewWriter(ctx, dag, archive, compression, maybeGzw) - if err != nil { + if checkErrAndClosePipe(err) { return nil, err } go func() { // write all the nodes recursively - if err := w.WriteNode(nd, filename); err != nil { - pipew.CloseWithError(err) + if err := w.WriteNode(nd, filename); checkErrAndClosePipe(err) { return } - w.Close() - maybeGzw.Close() - if err := bufw.Flush(); err != nil { - pipew.CloseWithError(err) - return - } - pipew.Close() // everything seems to be ok. + w.Close() // close tar writer + closeGzwAndPipe() // everything seems to be ok }() } return piper, nil } + +func newMaybeGzWriter(w io.Writer, compression int) (io.WriteCloser, error) { + if compression != gzip.NoCompression { + return gzip.NewWriterLevel(w, compression) + } + return &identityWriteCloser{w}, nil +} From 923ea5208c6363aabea907b4817cf17758f8c6f5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0869/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@a8fe4e87c2889f35f1b0f558486bfb7e0cbdd0c9 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index 4f4db6dce5..e58749cfe4 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("path") From 7b15f8fdbcdf15489734485aab1894a8e6eaa426 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0870/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@1e2e6c27dfd2e902a202a2c92495961f4fe87073 --- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index cf1d5a2187..1dadd3731f 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -18,7 +18,7 @@ import ( goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/routing.go b/namesys/routing.go index 3d49c564cb..63a323cae9 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("namesys") From fc7089743d1a909023a74df536e6b44ff89deeeb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0871/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@bcaf4e73b078478163973099ae8fdf0e1fb071e9 --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 5f6f466794..89e617a455 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -14,7 +14,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("pin") From 82fc7d6c5683623e81572eadf2df21d86ac19f6e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0872/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@46bbbfc36fcdf1691df0da78ae7fddaac85029f8 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 4b0ff47209..a249a515a5 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -19,7 +19,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") From 8e619672595e9e8ae77d5b3a87a05f0b33352c31 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0873/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@8bf7981fa789773c4436c20566fa51a202dbcf35 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index cb910ff8cf..c747ce4c82 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,7 +12,7 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("blockstore") From 48e7905624d13ff8ba40b951f27b5fe6f6f5990d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0874/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@c20e26d47948275c2aaf47433ef0002145ca5b11 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index ee2973f25e..62efa14183 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("blockservice") From 96ad58e35a0c3d86d5bcf5118027fa21cbdb0d14 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0875/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@4e51253ee701b57e2f2fd2f3808f1a6da9c61eb2 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 47cc679aa0..c10d8d6ffe 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("chunk") From f5eb891968fbb0d7793a782bd70c790bae6d3a35 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 0876/3147] update code to use new logging changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@4e65f19582ffe35509f73e4245776d019f0590e0 --- routing/dht/dht.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/kbucket/table.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/standard.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 7b8b449aec..c085616bd4 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,7 +18,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 3fd63902f5..87896a4195 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index 3c89b3fe2d..5318897ee0 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -11,7 +11,7 @@ import ( u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index ed3b6d3505..cbfddcfb75 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,7 +8,7 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("table") diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 61005aa9f6..14202c03b1 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -14,7 +14,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/none/none_client.go b/routing/none/none_client.go index ca2eafeecf..3bccc58738 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,7 +9,7 @@ import ( p2phost "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index b2b636b778..24a7a1ec14 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -13,7 +13,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 2de5f0856a..055729df70 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("routing/record") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index c22b55b168..cc131ca648 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -14,7 +14,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 7213ef4360..81b42cc5a4 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -12,7 +12,7 @@ import ( peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) const ProtocolSNR = "/ipfs/supernoderouting" From 9d0b66c607244ba494e8d12d98e1a71150025c76 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 22 Oct 2015 23:32:57 +0200 Subject: [PATCH 0877/3147] fixing putHandler for --writable http gateway I disabled this a long time ago and never refactored it. About time. License: MIT Signed-off-by: Henry This commit was moved from ipfs/go-path@47ddd064a51ae60c309f29c94e9d750517865ffc --- path/resolver.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 4f4db6dce5..6390bdeca9 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -22,12 +22,12 @@ var ErrNoComponents = errors.New( // ErrNoLink is returned when a link is not found in a path type ErrNoLink struct { - name string - node mh.Multihash + Name string + Node mh.Multihash } func (e ErrNoLink) Error() string { - return fmt.Sprintf("no link named %q under %s", e.name, e.node.B58String()) + return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.B58String()) } // Resolver provides path resolution to IPFS @@ -124,7 +124,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names if next == "" { n, _ := nd.Multihash() - return result, ErrNoLink{name: name, node: n} + return result, ErrNoLink{Name: name, Node: n} } if nlink.Node == nil { From 6700847fac72b1ec4e66d1e0034826878f65889e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 22 Oct 2015 16:27:31 -0700 Subject: [PATCH 0878/3147] cache ipns entries to speed things up a little License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@c885d48fd05ef25ff1b463b557b1876fb635948c --- namesys/namesys.go | 6 +- namesys/pb/namesys.pb.go | 8 +++ namesys/pb/namesys.proto | 2 + namesys/publisher.go | 18 +++++ namesys/republisher/repub_test.go | 4 ++ namesys/resolve_test.go | 6 +- namesys/routing.go | 110 ++++++++++++++++++++++++++---- 7 files changed, 137 insertions(+), 17 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 12b73218ba..c61d3496bd 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -26,12 +26,12 @@ type mpns struct { } // NewNameSystem will construct the IPFS naming system based on Routing -func NewNameSystem(r routing.IpfsRouting, ds ds.Datastore) NameSystem { +func NewNameSystem(r routing.IpfsRouting, ds ds.Datastore, cachesize int) NameSystem { return &mpns{ resolvers: map[string]resolver{ "dns": newDNSResolver(), "proquint": new(ProquintResolver), - "dht": newRoutingResolver(r), + "dht": NewRoutingResolver(r, cachesize), }, publishers: map[string]Publisher{ "/ipns/": NewRoutingPublisher(r, ds), @@ -39,6 +39,8 @@ func NewNameSystem(r routing.IpfsRouting, ds ds.Datastore) NameSystem { } } +const DefaultResolverCacheTTL = time.Minute + // Resolve implements Resolver. func (ns *mpns) Resolve(ctx context.Context, name string) (path.Path, error) { return ns.ResolveN(ctx, name, DefaultDepthLimit) diff --git a/namesys/pb/namesys.pb.go b/namesys/pb/namesys.pb.go index 4d99a5e0a2..0508e772df 100644 --- a/namesys/pb/namesys.pb.go +++ b/namesys/pb/namesys.pb.go @@ -57,6 +57,7 @@ type IpnsEntry struct { ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=namesys.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` Sequence *uint64 `protobuf:"varint,5,opt,name=sequence" json:"sequence,omitempty"` + Ttl *uint64 `protobuf:"varint,6,opt,name=ttl" json:"ttl,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -99,6 +100,13 @@ func (m *IpnsEntry) GetSequence() uint64 { return 0 } +func (m *IpnsEntry) GetTtl() uint64 { + if m != nil && m.Ttl != nil { + return *m.Ttl + } + return 0 +} + func init() { proto.RegisterEnum("namesys.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) } diff --git a/namesys/pb/namesys.proto b/namesys/pb/namesys.proto index 242f77bf2a..d6eaf3243f 100644 --- a/namesys/pb/namesys.proto +++ b/namesys/pb/namesys.proto @@ -12,4 +12,6 @@ message IpnsEntry { optional bytes validity = 4; optional uint64 sequence = 5; + + optional uint64 ttl = 6; } diff --git a/namesys/publisher.go b/namesys/publisher.go index e31217dff3..78d7bb37cc 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -121,6 +121,19 @@ func (p *ipnsPublisher) getPreviousSeqNo(ctx context.Context, ipnskey key.Key) ( return e.GetSequence(), nil } +// setting the TTL on published records is an experimental feature. +// as such, i'm using the context to wire it through to avoid changing too +// much code along the way. +func checkCtxTTL(ctx context.Context) (time.Duration, bool) { + v := ctx.Value("ipns-publish-ttl") + if v == nil { + return 0, false + } + + d, ok := v.(time.Duration) + return d, ok +} + func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqnum uint64, eol time.Time, r routing.IpfsRouting, id peer.ID) error { namekey, ipnskey := IpnsKeysForID(id) entry, err := CreateRoutingEntryData(k, value, seqnum, eol) @@ -128,6 +141,11 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn return err } + ttl, ok := checkCtxTTL(ctx) + if ok { + entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) + } + err = PublishEntry(ctx, r, ipnskey, entry) if err != nil { return err diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index ef7fcf7e34..92c224a738 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -18,6 +18,8 @@ import ( ) func TestRepublish(t *testing.T) { + // set cache life to zero for testing low-period repubs + ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -34,6 +36,8 @@ func TestRepublish(t *testing.T) { t.Fatal(err) } + nd.Namesys = namesys.NewNameSystem(nd.Routing, nd.Repo.Datastore(), 0) + nodes = append(nodes, nd) } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 4d81751f1b..11145ff019 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -19,7 +19,7 @@ func TestRoutingResolve(t *testing.T) { d := mockrouting.NewServer().Client(testutil.RandIdentityOrFatal(t)) dstore := ds.NewMapDatastore() - resolver := NewRoutingResolver(d) + resolver := NewRoutingResolver(d, 0) publisher := NewRoutingPublisher(d, dstore) privk, pubk, err := testutil.RandTestKeyPair(512) @@ -53,7 +53,7 @@ func TestPrexistingExpiredRecord(t *testing.T) { dstore := ds.NewMapDatastore() d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) - resolver := NewRoutingResolver(d) + resolver := NewRoutingResolver(d, 0) publisher := NewRoutingPublisher(d, dstore) privk, pubk, err := testutil.RandTestKeyPair(512) @@ -90,7 +90,7 @@ func TestPrexistingRecord(t *testing.T) { dstore := ds.NewMapDatastore() d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) - resolver := NewRoutingResolver(d) + resolver := NewRoutingResolver(d, 0) publisher := NewRoutingPublisher(d, dstore) privk, pubk, err := testutil.RandTestKeyPair(512) diff --git a/namesys/routing.go b/namesys/routing.go index 63a323cae9..a25fa19f63 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -2,16 +2,19 @@ package namesys import ( "fmt" + "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + u "github.com/ipfs/go-ipfs/util" ) var log = logging.Logger("namesys") @@ -19,25 +22,84 @@ var log = logging.Logger("namesys") // routingResolver implements NSResolver for the main IPFS SFS-like naming type routingResolver struct { routing routing.IpfsRouting + + cache *lru.Cache } -// NewRoutingResolver constructs a name resolver using the IPFS Routing system -// to implement SFS-like naming on top. -func NewRoutingResolver(route routing.IpfsRouting) Resolver { - if route == nil { - panic("attempt to create resolver with nil routing system") +func (r *routingResolver) cacheGet(name string) (path.Path, bool) { + if r.cache == nil { + return "", false + } + + ientry, ok := r.cache.Get(name) + if !ok { + return "", false } - return &routingResolver{routing: route} + entry, ok := ientry.(cacheEntry) + if !ok { + // should never happen, purely for sanity + log.Panicf("unexpected type %T in cache for %q.", ientry, name) + } + + if time.Now().Before(entry.eol) { + return entry.val, true + } + + r.cache.Remove(name) + + return "", false } -// newRoutingResolver returns a resolver instead of a Resolver. -func newRoutingResolver(route routing.IpfsRouting) resolver { +func (r *routingResolver) cacheSet(name string, val path.Path, rec *pb.IpnsEntry) { + if r.cache == nil { + return + } + + // if completely unspecified, just use one minute + ttl := DefaultResolverCacheTTL + if rec.Ttl != nil { + recttl := time.Duration(rec.GetTtl()) + if recttl >= 0 { + ttl = recttl + } + } + + cacheTil := time.Now().Add(ttl) + eol, ok := checkEOL(rec) + if ok && eol.Before(cacheTil) { + cacheTil = eol + } + + r.cache.Add(name, cacheEntry{ + val: val, + eol: cacheTil, + }) +} + +type cacheEntry struct { + val path.Path + eol time.Time +} + +// NewRoutingResolver constructs a name resolver using the IPFS Routing system +// to implement SFS-like naming on top. +// cachesize is the limit of the number of entries in the lru cache. Setting it +// to '0' will disable caching. +func NewRoutingResolver(route routing.IpfsRouting, cachesize int) *routingResolver { if route == nil { panic("attempt to create resolver with nil routing system") } - return &routingResolver{routing: route} + var cache *lru.Cache + if cachesize > 0 { + cache, _ = lru.New(cachesize) + } + + return &routingResolver{ + routing: route, + cache: cache, + } } // Resolve implements Resolver. @@ -54,6 +116,11 @@ func (r *routingResolver) ResolveN(ctx context.Context, name string, depth int) // resolve SFS-like names. func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { log.Debugf("RoutingResolve: '%s'", name) + cached, ok := r.cacheGet(name) + if ok { + return cached, nil + } + hash, err := mh.FromB58String(name) if err != nil { log.Warning("RoutingResolve: bad input hash: [%s]\n", name) @@ -98,10 +165,29 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa valh, err := mh.Cast(entry.GetValue()) if err != nil { // Not a multihash, probably a new record - return path.ParsePath(string(entry.GetValue())) + p, err := path.ParsePath(string(entry.GetValue())) + if err != nil { + return "", err + } + + r.cacheSet(name, p, entry) + return p, nil } else { // Its an old style multihash record log.Warning("Detected old style multihash record") - return path.FromKey(key.Key(valh)), nil + p := path.FromKey(key.Key(valh)) + r.cacheSet(name, p, entry) + return p, nil + } +} + +func checkEOL(e *pb.IpnsEntry) (time.Time, bool) { + if e.GetValidityType() == pb.IpnsEntry_EOL { + eol, err := u.ParseRFC3339(string(e.GetValidity())) + if err != nil { + return time.Time{}, false + } + return eol, true } + return time.Time{}, false } From c50621ab73a836fa9d50636846368368c68322e3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0879/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@51d6f29fc88a4d9ec2ce5d2304f08b99d06791aa --- routing/dht/dht.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/kbucket/table.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/standard.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c085616bd4..3f50652fd9 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,7 +18,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 87896a4195..f780b1b057 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" inet "github.com/ipfs/go-ipfs/p2p/net" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index 5318897ee0..86b33a8dbc 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -11,7 +11,7 @@ import ( u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index cbfddcfb75..044d3a2c28 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,7 +8,7 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("table") diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 14202c03b1..e7aa44968f 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -14,7 +14,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 3bccc58738..efa0b8a996 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,7 +9,7 @@ import ( p2phost "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 24a7a1ec14..54f2bb87f2 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -13,7 +13,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 055729df70..944f615d0a 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("routing/record") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index cc131ca648..5b7c4a3063 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -14,7 +14,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 81b42cc5a4..279cbe7dec 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -12,7 +12,7 @@ import ( peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) const ProtocolSNR = "/ipfs/supernoderouting" From 768361581e61fb856669fedb2a7f56dd88b0ae68 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0880/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@d1c4983b31cbc99cad261879d15197ca42d6917f --- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 1dadd3731f..b633f454c3 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -18,7 +18,7 @@ import ( goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/routing.go b/namesys/routing.go index a25fa19f63..85ef498e74 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -8,13 +8,13 @@ import ( lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("namesys") From a08f1c93d21bd3b861049a5336dd5d3cb8a92b86 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0881/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@e6efb04837f48008fb9f807c05aaa7910b8496ed --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 89e617a455..53d965e9b6 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -14,7 +14,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("pin") From 0bd89e2ded50a47f62b5f0cc4750c7d47a1b85b0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0882/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@0282215421c030b204097d0e0728093fdbdbdf1c --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index a249a515a5..5f5eddc904 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -19,7 +19,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") From e1963bec267a05f8f9f03797df222db219955022 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0883/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@9ccb34d29697ef57aeb9e0e1a3c48c7659a7212b --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index c747ce4c82..c4eefaddf3 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,7 +12,7 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("blockstore") From 3021d17163d034d322c3b1e7f387f1e8119dcd58 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0884/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@7cc2792ee1c93b0e1b750cc3635f9ccbca611c83 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index 62ca5cac12..4ed7b67e94 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("path") From 6c285f51de6b1a9d4fcf49a273b416132e0e7340 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0885/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@07f41b86928d2c08e729dfa3a4b8f75a61212f7a --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 62efa14183..9c5cc00e52 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("blockservice") From cd358a5c0e759ed89311a7d37c1be760c2270cda Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 0886/3147] vendor logging lib update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@5dcffac54f543a30c3e536d766b2598ac25d6ece --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index c10d8d6ffe..a2f1dac4f4 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("chunk") From 53316c3ce2aa86de021bfc670860e755e7f74ca9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 4 Nov 2015 21:49:20 -0800 Subject: [PATCH 0887/3147] Add in some more notifications to help profile queries License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@30b4c9e6affcdeeb42cb3b25e7d9e270cc59a72d --- routing/dht/query.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index 5318897ee0..8afaaa7e50 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -79,6 +79,8 @@ type dhtQueryRunner struct { rateLimit chan struct{} // processing semaphore log logging.EventLogger + runCtx context.Context + proc process.Process sync.RWMutex } @@ -98,6 +100,7 @@ func newQueryRunner(q *dhtQuery) *dhtQueryRunner { func (r *dhtQueryRunner) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { r.log = log + r.runCtx = ctx if len(peers) == 0 { log.Warning("Running query with no peers!") @@ -167,6 +170,11 @@ func (r *dhtQueryRunner) addPeerToQuery(next peer.ID) { return } + notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ + Type: notif.AddingPeer, + ID: next, + }) + r.peersRemaining.Increment(1) select { case r.peersToQuery.EnqChan <- next: @@ -221,7 +229,12 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { // make sure we're connected to the peer. // FIXME abstract away into the network layer if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { - log.Infof("not connected. dialing.") + log.Error("not connected. dialing.") + + notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ + Type: notif.DialingPeer, + ID: p, + }) // while we dial, we do not take up a rate limit. this is to allow // forward progress during potentially very high latency dials. r.rateLimit <- struct{}{} @@ -231,9 +244,10 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { if err := r.query.dht.host.Connect(ctx, pi); err != nil { log.Debugf("Error connecting: %s", err) - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ Type: notif.QueryError, Extra: err.Error(), + ID: p, }) r.Lock() From ac71d825b6e907612873b6fd9e611bb51209df8b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 9 Nov 2015 23:18:38 -0800 Subject: [PATCH 0888/3147] drop error log down to debug License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@e045974814dab7a0506689fed37bf8b311ebef66 --- routing/dht/query.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/query.go b/routing/dht/query.go index 666a958786..d64e432ea5 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -229,7 +229,7 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { // make sure we're connected to the peer. // FIXME abstract away into the network layer if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { - log.Error("not connected. dialing.") + log.Debug("not connected. dialing.") notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ Type: notif.DialingPeer, From 30a17b08374e1d1bbabf89e980b74ce358d8d07d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 15 Nov 2015 20:20:54 -0800 Subject: [PATCH 0889/3147] import from go-ipfs This commit was moved from ipfs/go-ipfs-util@ee302b211dd9abdbca5de9f96aee10d502a5ad49 --- util/file.go | 11 ++++ util/file_test.go | 10 ++++ util/time.go | 17 ++++++ util/time_test.go | 16 +++++ util/util.go | 148 ++++++++++++++++++++++++++++++++++++++++++++++ util/util_test.go | 63 ++++++++++++++++++++ 6 files changed, 265 insertions(+) create mode 100644 util/file.go create mode 100644 util/file_test.go create mode 100644 util/time.go create mode 100644 util/time_test.go create mode 100644 util/util.go create mode 100644 util/util_test.go diff --git a/util/file.go b/util/file.go new file mode 100644 index 0000000000..e3bd49d717 --- /dev/null +++ b/util/file.go @@ -0,0 +1,11 @@ +package util + +import "os" + +func FileExists(filename string) bool { + fi, err := os.Lstat(filename) + if fi != nil || (err != nil && !os.IsNotExist(err)) { + return true + } + return false +} diff --git a/util/file_test.go b/util/file_test.go new file mode 100644 index 0000000000..040b229270 --- /dev/null +++ b/util/file_test.go @@ -0,0 +1,10 @@ +package util + +import "testing" + +func TestFileDoesNotExist(t *testing.T) { + t.Parallel() + if FileExists("i would be surprised to discover that this file exists") { + t.Fail() + } +} diff --git a/util/time.go b/util/time.go new file mode 100644 index 0000000000..5fc6ec66dc --- /dev/null +++ b/util/time.go @@ -0,0 +1,17 @@ +package util + +import "time" + +var TimeFormatIpfs = time.RFC3339Nano + +func ParseRFC3339(s string) (time.Time, error) { + t, err := time.Parse(TimeFormatIpfs, s) + if err != nil { + return time.Time{}, err + } + return t.UTC(), nil +} + +func FormatRFC3339(t time.Time) string { + return t.UTC().Format(TimeFormatIpfs) +} diff --git a/util/time_test.go b/util/time_test.go new file mode 100644 index 0000000000..b5a98caa62 --- /dev/null +++ b/util/time_test.go @@ -0,0 +1,16 @@ +package util + +import ( + "testing" + "time" +) + +func TestTimeFormatParseInversion(t *testing.T) { + v, err := ParseRFC3339(FormatRFC3339(time.Now())) + if err != nil { + t.Fatal(err) + } + if v.Location() != time.UTC { + t.Fatal("Time should be UTC") + } +} diff --git a/util/util.go b/util/util.go new file mode 100644 index 0000000000..1ce3a19b4e --- /dev/null +++ b/util/util.go @@ -0,0 +1,148 @@ +// Package util implements various utility functions used within ipfs +// that do not currently have a better place to live. +package util + +import ( + "errors" + "io" + "math/rand" + "os" + "path/filepath" + "runtime/debug" + "strings" + "time" + + b58 "github.com/jbenet/go-base58" + mh "github.com/jbenet/go-multihash" +) + +// Debug is a global flag for debugging. +var Debug bool + +// ErrNotImplemented signifies a function has not been implemented yet. +var ErrNotImplemented = errors.New("Error: not implemented yet.") + +// ErrTimeout implies that a timeout has been triggered +var ErrTimeout = errors.New("Error: Call timed out.") + +// ErrSeErrSearchIncomplete implies that a search type operation didnt +// find the expected node, but did find 'a' node. +var ErrSearchIncomplete = errors.New("Error: Search Incomplete.") + +// ErrCast is returned when a cast fails AND the program should not panic. +func ErrCast() error { + debug.PrintStack() + return errCast +} + +var errCast = errors.New("cast error") + +// ExpandPathnames takes a set of paths and turns them into absolute paths +func ExpandPathnames(paths []string) ([]string, error) { + var out []string + for _, p := range paths { + abspath, err := filepath.Abs(p) + if err != nil { + return nil, err + } + out = append(out, abspath) + } + return out, nil +} + +type randGen struct { + rand.Rand +} + +func NewTimeSeededRand() io.Reader { + src := rand.NewSource(time.Now().UnixNano()) + return &randGen{ + Rand: *rand.New(src), + } +} + +func NewSeededRand(seed int64) io.Reader { + src := rand.NewSource(seed) + return &randGen{ + Rand: *rand.New(src), + } +} + +func (r *randGen) Read(p []byte) (n int, err error) { + for i := 0; i < len(p); i++ { + p[i] = byte(r.Rand.Intn(255)) + } + return len(p), nil +} + +// GetenvBool is the way to check an env var as a boolean +func GetenvBool(name string) bool { + v := strings.ToLower(os.Getenv(name)) + return v == "true" || v == "t" || v == "1" +} + +// MultiErr is a util to return multiple errors +type MultiErr []error + +func (m MultiErr) Error() string { + if len(m) == 0 { + return "no errors" + } + + s := "Multiple errors: " + for i, e := range m { + if i != 0 { + s += ", " + } + s += e.Error() + } + return s +} + +func Partition(subject string, sep string) (string, string, string) { + if i := strings.Index(subject, sep); i != -1 { + return subject[:i], subject[i : i+len(sep)], subject[i+len(sep):] + } + return subject, "", "" +} + +func RPartition(subject string, sep string) (string, string, string) { + if i := strings.LastIndex(subject, sep); i != -1 { + return subject[:i], subject[i : i+len(sep)], subject[i+len(sep):] + } + return subject, "", "" +} + +// Hash is the global IPFS hash function. uses multihash SHA2_256, 256 bits +func Hash(data []byte) mh.Multihash { + h, err := mh.Sum(data, mh.SHA2_256, -1) + if err != nil { + // this error can be safely ignored (panic) because multihash only fails + // from the selection of hash function. If the fn + length are valid, it + // won't error. + panic("multihash failed to hash using SHA2_256.") + } + return h +} + +// IsValidHash checks whether a given hash is valid (b58 decodable, len > 0) +func IsValidHash(s string) bool { + out := b58.Decode(s) + if out == nil || len(out) == 0 { + return false + } + _, err := mh.Cast(out) + if err != nil { + return false + } + return true +} + +// XOR takes two byte slices, XORs them together, returns the resulting slice. +func XOR(a, b []byte) []byte { + c := make([]byte, len(a)) + for i := 0; i < len(a); i++ { + c[i] = a[i] ^ b[i] + } + return c +} diff --git a/util/util_test.go b/util/util_test.go new file mode 100644 index 0000000000..70747ad902 --- /dev/null +++ b/util/util_test.go @@ -0,0 +1,63 @@ +package util + +import ( + "bytes" + "testing" +) + +func TestXOR(t *testing.T) { + cases := [][3][]byte{ + { + {0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF}, + {0x00, 0x00, 0x00}, + }, + { + {0x00, 0xFF, 0x00}, + {0xFF, 0xFF, 0xFF}, + {0xFF, 0x00, 0xFF}, + }, + { + {0x55, 0x55, 0x55}, + {0x55, 0xFF, 0xAA}, + {0x00, 0xAA, 0xFF}, + }, + } + + for _, c := range cases { + r := XOR(c[0], c[1]) + if !bytes.Equal(r, c[2]) { + t.Error("XOR failed") + } + } +} + +func BenchmarkHash256K(b *testing.B) { + buf := make([]byte, 256*1024) + NewTimeSeededRand().Read(buf) + b.SetBytes(int64(256 * 1024)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Hash(buf) + } +} + +func BenchmarkHash512K(b *testing.B) { + buf := make([]byte, 512*1024) + NewTimeSeededRand().Read(buf) + b.SetBytes(int64(512 * 1024)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Hash(buf) + } +} + +func BenchmarkHash1M(b *testing.B) { + buf := make([]byte, 1024*1024) + NewTimeSeededRand().Read(buf) + b.SetBytes(int64(1024 * 1024)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Hash(buf) + } +} From 030c323664d2512f2f43c17c0420539621bf0d84 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 15 Nov 2015 21:05:44 -0800 Subject: [PATCH 0890/3147] gx-ify This commit was moved from ipfs/go-ipfs-util@8b6cc6f134aa799cc9b939c0707a31cd7fe3e533 --- util/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 util/.gitignore diff --git a/util/.gitignore b/util/.gitignore new file mode 100644 index 0000000000..1377554ebe --- /dev/null +++ b/util/.gitignore @@ -0,0 +1 @@ +*.swp From 537fa4afe943f9e51595b24c9db3126106f213a7 Mon Sep 17 00:00:00 2001 From: "Jakub (Kubuxu) Sztandera" Date: Sat, 2 Jan 2016 00:24:54 +0100 Subject: [PATCH 0891/3147] namesys: Make paths with multiple segemnts work. Fixes #2059 Also fixes non-recursive resolve erring instead showing one step. The patch of core/commands/resolve.go could be done better but I don't know how to get access to ErrResolveRecursion. It allows for dnslinks into sub-segments. So for example hosting multiple blogs on just domains from one pubkey. Fixes #2059 Add tests and fix case when dnslinks references dnslink License: MIT Signed-off-by: Jakub (Kubuxu) Sztandera This commit was moved from ipfs/go-namesys@3e2eb50f68f61cb9c695b4a6be8355798ce4318b --- namesys/dns.go | 11 ++++++++--- namesys/dns_test.go | 9 +++++++++ namesys/namesys.go | 10 +++++++--- namesys/routing.go | 2 +- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 3703bd8d01..d74213e935 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -45,12 +45,14 @@ func (r *DNSResolver) ResolveN(ctx context.Context, name string, depth int) (pat // TXT records for a given domain name should contain a b58 // encoded multihash. func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { - if !isd.IsDomain(name) { + segments := strings.SplitN(name, "/", 2) + + if !isd.IsDomain(segments[0]) { return "", errors.New("not a valid domain name") } - log.Infof("DNSResolver resolving %s", name) - txt, err := r.lookupTXT(name) + log.Infof("DNSResolver resolving %s", segments[0]) + txt, err := r.lookupTXT(segments[0]) if err != nil { return "", err } @@ -58,6 +60,9 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, for _, t := range txt { p, err := parseEntry(t) if err == nil { + if len(segments) > 1 { + return path.FromSegments(p.String() + "/", segments[1]) + } return p, nil } } diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 40bf702c35..a1e4ce4420 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -18,6 +18,7 @@ func (m *mockDNS) lookupTXT(name string) (txt []string, err error) { } func TestDnsEntryParsing(t *testing.T) { + goodEntries := []string{ "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", @@ -86,6 +87,12 @@ func newMockDNS() *mockDNS { "bad.example.com": []string{ "dnslink=", }, + "withsegment.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", + }, + "withrecsegment.example.com": []string{ + "dnslink=/ipns/withsegment.example.com/subsub", + }, }, } } @@ -109,4 +116,6 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "loop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion) testResolution(t, r, "loop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed) + testResolution(t, r, "withsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", nil) + testResolution(t, r, "withrecsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub", nil) } diff --git a/namesys/namesys.go b/namesys/namesys.go index c61d3496bd..b375a5c04e 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -64,17 +64,21 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) if !strings.HasPrefix(name, "/ipns/") { name = "/ipns/" + name } - segments := strings.SplitN(name, "/", 3) + segments := strings.SplitN(name, "/", 4) if len(segments) < 3 || segments[0] != "" { log.Warningf("Invalid name syntax for %s", name) return "", ErrResolveFailed } for protocol, resolver := range ns.resolvers { - log.Debugf("Attempting to resolve %s with %s", name, protocol) + log.Debugf("Attempting to resolve %s with %s", segments[2], protocol) p, err := resolver.resolveOnce(ctx, segments[2]) if err == nil { - return p, err + if len(segments) > 3 { + return path.FromSegments(p.String() + "/", segments[3]) + } else { + return p, err + } } } log.Warningf("No resolver found for %s", name) diff --git a/namesys/routing.go b/namesys/routing.go index 85ef498e74..5f9e3bc87e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -123,7 +123,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa hash, err := mh.FromB58String(name) if err != nil { - log.Warning("RoutingResolve: bad input hash: [%s]\n", name) + log.Warningf("RoutingResolve: bad input hash: [%s]\n", name) return "", err } // name should be a multihash. if it isn't, error out here. From d4df5d5ea702af86fb53b96aa51c9fbdb461a7c9 Mon Sep 17 00:00:00 2001 From: "Jakub (Kubuxu) Sztandera" Date: Tue, 5 Jan 2016 18:13:43 +0100 Subject: [PATCH 0892/3147] Included more namesys tests. Fixed some issues with trailing slashes. License: MIT Signed-off-by: Jakub (Kubuxu) Sztandera This commit was moved from ipfs/go-namesys@ecb67ec4c53a709495c84730cf8a28a50293109c --- namesys/dns.go | 2 +- namesys/dns_test.go | 11 +++++++++++ namesys/namesys.go | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index d74213e935..96147534a8 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -61,7 +61,7 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, p, err := parseEntry(t) if err == nil { if len(segments) > 1 { - return path.FromSegments(p.String() + "/", segments[1]) + return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[1]) } return p, nil } diff --git a/namesys/dns_test.go b/namesys/dns_test.go index a1e4ce4420..27b3883db7 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -26,6 +26,7 @@ func TestDnsEntryParsing(t *testing.T) { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo", "dnslink=/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/bar", "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo/bar/baz", + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/foo/bar/baz/", "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", } @@ -93,6 +94,12 @@ func newMockDNS() *mockDNS { "withrecsegment.example.com": []string{ "dnslink=/ipns/withsegment.example.com/subsub", }, + "withtrailing.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/", + }, + "withtrailingrec.example.com": []string{ + "dnslink=/ipns/withtrailing.example.com/segment/", + }, }, } } @@ -118,4 +125,8 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed) testResolution(t, r, "withsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", nil) testResolution(t, r, "withrecsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub", nil) + testResolution(t, r, "withsegment.example.com/test1", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/test1", nil) + testResolution(t, r, "withrecsegment.example.com/test2", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test2", nil) + testResolution(t, r, "withrecsegment.example.com/test3/", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test3/", nil) + testResolution(t, r, "withtrailingrec.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/", nil) } diff --git a/namesys/namesys.go b/namesys/namesys.go index b375a5c04e..4c9868b577 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -75,7 +75,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) p, err := resolver.resolveOnce(ctx, segments[2]) if err == nil { if len(segments) > 3 { - return path.FromSegments(p.String() + "/", segments[3]) + return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) } else { return p, err } From b52ba7f68861ace966c30fec268cf089d8a74eee Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Sun, 31 May 2015 15:47:36 -0700 Subject: [PATCH 0893/3147] pin: Guard against callers causing refcount underflow This used to lead to large refcount numbers, causing Flush to create a lot of IPFS objects, and merkledag to consume tens of gigabytes of RAM. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@2250faf505b099775030a2b95dfe0c5cf6b66e8b --- pinning/pinner/indirect.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index dca99600fc..e5ed5dcb6c 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -57,6 +57,10 @@ func (i *indirectPin) Increment(k key.Key) { } func (i *indirectPin) Decrement(k key.Key) { + if i.refCounts[k] == 0 { + log.Warningf("pinning: bad call: asked to unpin nonexistent indirect key: %v", k) + return + } c := i.refCounts[k] - 1 i.refCounts[k] = c if c <= 0 { From b5768935343f8322714cbc4be51739a5d52b9569 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 6 May 2015 16:17:13 -0700 Subject: [PATCH 0894/3147] pin: unexport NewIndirectPin, it's not useful and not used elsewhere License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@28647540e2b3483a1331b635dbe4222f04cfeaf0 --- pinning/pinner/indirect.go | 2 +- pinning/pinner/pin.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index e5ed5dcb6c..1ca8c4bedc 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -11,7 +11,7 @@ type indirectPin struct { refCounts map[key.Key]int } -func NewIndirectPin(dstore ds.Datastore) *indirectPin { +func newIndirectPin(dstore ds.Datastore) *indirectPin { return &indirectPin{ blockset: set.NewDBWrapperSet(dstore, set.NewSimpleBlockSet()), refCounts: make(map[key.Key]int), diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 53d965e9b6..31f2afe0fc 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -75,7 +75,7 @@ func NewPinner(dstore ds.ThreadSafeDatastore, serv mdag.DAGService) Pinner { return &pinner{ recursePin: rcset, directPin: dirset, - indirPin: NewIndirectPin(nsdstore), + indirPin: newIndirectPin(nsdstore), dserv: serv, dstore: dstore, } From e3cc8c322e4054c34350adefb6bb1f6c56acba14 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Fri, 8 May 2015 10:29:00 -0700 Subject: [PATCH 0895/3147] pin: Remove code shadowing pins as datastore keys These secondary copies were never actually queried, and didn't contain the indirect refcounts so they couldn't become the authoritative source anyway as is. New goal is to move pinning into IPFS objects. A migration will be needed to remove the old data from the datastore. This can happen at any time after this commit. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@c705cd501a43f050cee7e60eac3b4dd84398b0e8 --- pinning/pinner/indirect.go | 4 ++-- pinning/pinner/pin.go | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 1ca8c4bedc..1a1070ee2a 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -11,9 +11,9 @@ type indirectPin struct { refCounts map[key.Key]int } -func newIndirectPin(dstore ds.Datastore) *indirectPin { +func newIndirectPin() *indirectPin { return &indirectPin{ - blockset: set.NewDBWrapperSet(dstore, set.NewSimpleBlockSet()), + blockset: set.NewSimpleBlockSet(), refCounts: make(map[key.Key]int), } } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 31f2afe0fc..ee27252c31 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -9,7 +9,6 @@ import ( "sync" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - nsds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" @@ -65,17 +64,14 @@ type pinner struct { func NewPinner(dstore ds.ThreadSafeDatastore, serv mdag.DAGService) Pinner { // Load set from given datastore... - rcds := nsds.Wrap(dstore, recursePinDatastoreKey) - rcset := set.NewDBWrapperSet(rcds, set.NewSimpleBlockSet()) + rcset := set.NewSimpleBlockSet() - dirds := nsds.Wrap(dstore, directPinDatastoreKey) - dirset := set.NewDBWrapperSet(dirds, set.NewSimpleBlockSet()) + dirset := set.NewSimpleBlockSet() - nsdstore := nsds.Wrap(dstore, indirectPinDatastoreKey) return &pinner{ recursePin: rcset, directPin: dirset, - indirPin: newIndirectPin(nsdstore), + indirPin: newIndirectPin(), dserv: serv, dstore: dstore, } From 95226f03d9661cccc355154ef6075c37ab26e95e Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Fri, 8 May 2015 11:00:55 -0700 Subject: [PATCH 0896/3147] Simplify Pinner interface by folding ManualPinner into Pinner Pinner had method GetManual that returned a ManualPinner, so every Pinner had to implement ManualPinner anyway. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@2464e11491b4fae23ca0e822515c1fcf3cf0919e --- pinning/pinner/pin.go | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ee27252c31..2db6a9b819 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -34,22 +34,22 @@ type Pinner interface { IsPinned(key.Key) bool Pin(context.Context, *mdag.Node, bool) error Unpin(context.Context, key.Key, bool) error + + // PinWithMode is for manually editing the pin structure. Use with + // care! If used improperly, garbage collection may not be + // successful. + PinWithMode(key.Key, PinMode) + // RemovePinWithMode is for manually editing the pin structure. + // Use with care! If used improperly, garbage collection may not + // be successful. + RemovePinWithMode(key.Key, PinMode) + Flush() error - GetManual() ManualPinner DirectKeys() []key.Key IndirectKeys() map[key.Key]int RecursiveKeys() []key.Key } -// ManualPinner is for manually editing the pin structure -// Use with care! If used improperly, garbage collection -// may not be successful -type ManualPinner interface { - PinWithMode(key.Key, PinMode) - RemovePinWithMode(key.Key, PinMode) - Pinner -} - // pinner implements the Pinner interface type pinner struct { lock sync.RWMutex @@ -308,8 +308,8 @@ func loadSet(d ds.Datastore, k ds.Key, val interface{}) error { return json.Unmarshal(bf, val) } -// PinWithMode is a method on ManualPinners, allowing the user to have fine -// grained control over pin counts +// PinWithMode allows the user to have fine grained control over pin +// counts func (p *pinner) PinWithMode(k key.Key, mode PinMode) { p.lock.Lock() defer p.lock.Unlock() @@ -322,7 +322,3 @@ func (p *pinner) PinWithMode(k key.Key, mode PinMode) { p.indirPin.Increment(k) } } - -func (p *pinner) GetManual() ManualPinner { - return p -} From 045f1d534ee1539031ba171c7809b97b92c801aa Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Fri, 8 May 2015 17:00:20 -0700 Subject: [PATCH 0897/3147] pin: Remove dead code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@d1669f6939ae12c494ef6fe466c63e9880288521 --- pinning/pinner/indirect.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 1a1070ee2a..734387bd56 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -73,10 +73,6 @@ func (i *indirectPin) HasKey(k key.Key) bool { return i.blockset.HasKey(k) } -func (i *indirectPin) Set() set.BlockSet { - return i.blockset -} - func (i *indirectPin) GetRefs() map[key.Key]int { return i.refCounts } From 2940feafa19caec82190500ffd644902537b4eed Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Fri, 8 May 2015 17:10:46 -0700 Subject: [PATCH 0898/3147] pin: Remove double bookkeeping of refcount keys License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@0ea108445058f82b655683b675129e4c1a58ba50 --- pinning/pinner/indirect.go | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 734387bd56..6043a97f73 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -3,17 +3,14 @@ package pin import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/blocks/set" ) type indirectPin struct { - blockset set.BlockSet refCounts map[key.Key]int } func newIndirectPin() *indirectPin { return &indirectPin{ - blockset: set.NewSimpleBlockSet(), refCounts: make(map[key.Key]int), } } @@ -36,7 +33,7 @@ func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { } // log.Debugf("indirPin keys: %#v", keys) - return &indirectPin{blockset: set.SimpleSetFromKeys(keys), refCounts: refcnt}, nil + return &indirectPin{refCounts: refcnt}, nil } func storeIndirPin(d ds.Datastore, k ds.Key, p *indirectPin) error { @@ -49,11 +46,7 @@ func storeIndirPin(d ds.Datastore, k ds.Key, p *indirectPin) error { } func (i *indirectPin) Increment(k key.Key) { - c := i.refCounts[k] - i.refCounts[k] = c + 1 - if c <= 0 { - i.blockset.AddBlock(k) - } + i.refCounts[k]++ } func (i *indirectPin) Decrement(k key.Key) { @@ -61,16 +54,15 @@ func (i *indirectPin) Decrement(k key.Key) { log.Warningf("pinning: bad call: asked to unpin nonexistent indirect key: %v", k) return } - c := i.refCounts[k] - 1 - i.refCounts[k] = c - if c <= 0 { - i.blockset.RemoveBlock(k) + i.refCounts[k]-- + if i.refCounts[k] == 0 { delete(i.refCounts, k) } } func (i *indirectPin) HasKey(k key.Key) bool { - return i.blockset.HasKey(k) + _, found := i.refCounts[k] + return found } func (i *indirectPin) GetRefs() map[key.Key]int { From 55265e5c5a8c41c055e12b6d550121475e0f3f7a Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Fri, 8 May 2015 17:17:09 -0700 Subject: [PATCH 0899/3147] Use uint64 for indirect pin refcounts Platform-dependent behavior is not nice, and negative refcounts are not very useful. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@1f4ff89a606788b4f4abb35a915808da2baa7687 --- pinning/pinner/indirect.go | 12 ++++++------ pinning/pinner/pin.go | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 6043a97f73..a89c2caf0e 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -6,23 +6,23 @@ import ( ) type indirectPin struct { - refCounts map[key.Key]int + refCounts map[key.Key]uint64 } func newIndirectPin() *indirectPin { return &indirectPin{ - refCounts: make(map[key.Key]int), + refCounts: make(map[key.Key]uint64), } } func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { - var rcStore map[string]int + var rcStore map[string]uint64 err := loadSet(d, k, &rcStore) if err != nil { return nil, err } - refcnt := make(map[key.Key]int) + refcnt := make(map[key.Key]uint64) var keys []key.Key for encK, v := range rcStore { if v > 0 { @@ -38,7 +38,7 @@ func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { func storeIndirPin(d ds.Datastore, k ds.Key, p *indirectPin) error { - rcStore := map[string]int{} + rcStore := map[string]uint64{} for k, v := range p.refCounts { rcStore[key.B58KeyEncode(k)] = v } @@ -65,6 +65,6 @@ func (i *indirectPin) HasKey(k key.Key) bool { return found } -func (i *indirectPin) GetRefs() map[key.Key]int { +func (i *indirectPin) GetRefs() map[key.Key]uint64 { return i.refCounts } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 2db6a9b819..6740869d2e 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -46,7 +46,7 @@ type Pinner interface { Flush() error DirectKeys() []key.Key - IndirectKeys() map[key.Key]int + IndirectKeys() map[key.Key]uint64 RecursiveKeys() []key.Key } @@ -254,7 +254,7 @@ func (p *pinner) DirectKeys() []key.Key { } // IndirectKeys returns a slice containing the indirectly pinned keys -func (p *pinner) IndirectKeys() map[key.Key]int { +func (p *pinner) IndirectKeys() map[key.Key]uint64 { return p.indirPin.GetRefs() } From 3d2158a8783ea954187287cafe5a62ffc63e13bd Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Fri, 8 May 2015 20:13:30 -0700 Subject: [PATCH 0900/3147] Typo License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@226231164b34b249b7f8838b2bfbb0916249cc4e --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 6740869d2e..b719f188ee 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -1,4 +1,4 @@ -// package pin implemnts structures and methods to keep track of +// package pin implements structures and methods to keep track of // which objects a user wants to keep stored locally. package pin From 8c3d57e28540b965758f138fb0aa98b316968ff4 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Fri, 8 May 2015 11:00:55 -0700 Subject: [PATCH 0901/3147] Simplify Pinner interface by folding ManualPinner into Pinner Pinner had method GetManual that returned a ManualPinner, so every Pinner had to implement ManualPinner anyway. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@1497d51f7b578605195c3dfdc4c585217c9d0d4e --- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 5f5eddc904..bb22f289fb 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -37,7 +37,7 @@ var log = logging.Logger("dagio") type DagModifier struct { dagserv mdag.DAGService curNode *mdag.Node - mp pin.ManualPinner + mp pin.Pinner splitter chunk.SplitterGen ctx context.Context @@ -50,7 +50,7 @@ type DagModifier struct { read *uio.DagReader } -func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.ManualPinner, spl chunk.SplitterGen) (*DagModifier, error) { +func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.Pinner, spl chunk.SplitterGen) (*DagModifier, error) { return &DagModifier{ curNode: from.Copy(), dagserv: serv, diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 475e7c6c41..25caadfb00 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -27,25 +27,25 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) -func getMockDagServ(t testing.TB) (mdag.DAGService, pin.ManualPinner) { +func getMockDagServ(t testing.TB) (mdag.DAGService, pin.Pinner) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - return dserv, pin.NewPinner(tsds, dserv).GetManual() + return dserv, pin.NewPinner(tsds, dserv) } -func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore, pin.ManualPinner) { +func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore, pin.Pinner) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - return dserv, bstore, pin.NewPinner(tsds, dserv).GetManual() + return dserv, bstore, pin.NewPinner(tsds, dserv) } -func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.ManualPinner) ([]byte, *mdag.Node) { +func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.Pinner) ([]byte, *mdag.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in), imp.BasicPinnerCB(pinner)) if err != nil { @@ -469,7 +469,7 @@ func TestSparseWrite(t *testing.T) { } } -func basicGC(t *testing.T, bs blockstore.Blockstore, pins pin.ManualPinner) { +func basicGC(t *testing.T, bs blockstore.Blockstore, pins pin.Pinner) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // in case error occurs during operation keychan, err := bs.AllKeysChan(ctx) From 6923d18119adb26293a294396d0bf229ba85b7ae Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Mon, 11 May 2015 11:19:36 -0700 Subject: [PATCH 0902/3147] pin: Rewrite to store pins in IPFS objects WARNING: No migration performed! That needs to come in a separate commit, perhaps amended into this one. This is the minimal rewrite, only changing the storage from JSON(+extra keys) in Datastore to IPFS objects. All of the pinning state is still loaded in memory, and written from scratch on Flush. To do more would require API changes, e.g. adding error returns. Set/Multiset is not cleanly separated into a library, yet, as it's API is expected to change radically. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@8e0e03bebb62c8894ca5078784b566ecbe120db6 --- pinning/pinner/indirect.go | 31 --- pinning/pinner/internal/pb/doc.go | 6 + pinning/pinner/internal/pb/header.pb.go | 59 +++++ pinning/pinner/internal/pb/header.proto | 14 + pinning/pinner/pin.go | 136 +++++++--- pinning/pinner/set.go | 338 ++++++++++++++++++++++++ 6 files changed, 510 insertions(+), 74 deletions(-) create mode 100644 pinning/pinner/internal/pb/doc.go create mode 100644 pinning/pinner/internal/pb/header.pb.go create mode 100644 pinning/pinner/internal/pb/header.proto create mode 100644 pinning/pinner/set.go diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index a89c2caf0e..22e3a1fb47 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -1,7 +1,6 @@ package pin import ( - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" ) @@ -15,36 +14,6 @@ func newIndirectPin() *indirectPin { } } -func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { - var rcStore map[string]uint64 - err := loadSet(d, k, &rcStore) - if err != nil { - return nil, err - } - - refcnt := make(map[key.Key]uint64) - var keys []key.Key - for encK, v := range rcStore { - if v > 0 { - k := key.B58KeyDecode(encK) - keys = append(keys, k) - refcnt[k] = v - } - } - // log.Debugf("indirPin keys: %#v", keys) - - return &indirectPin{refCounts: refcnt}, nil -} - -func storeIndirPin(d ds.Datastore, k ds.Key, p *indirectPin) error { - - rcStore := map[string]uint64{} - for k, v := range p.refCounts { - rcStore[key.B58KeyEncode(k)] = v - } - return storeSet(d, k, rcStore) -} - func (i *indirectPin) Increment(k key.Key) { i.refCounts[k]++ } diff --git a/pinning/pinner/internal/pb/doc.go b/pinning/pinner/internal/pb/doc.go new file mode 100644 index 0000000000..1143a4d83f --- /dev/null +++ b/pinning/pinner/internal/pb/doc.go @@ -0,0 +1,6 @@ +package pb + +//go:generate protoc --gogo_out=. header.proto + +// kludge to get vendoring right in protobuf output +//go:generate sed -i s,github.com/,github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/,g header.pb.go diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go new file mode 100644 index 0000000000..eafb246e70 --- /dev/null +++ b/pinning/pinner/internal/pb/header.pb.go @@ -0,0 +1,59 @@ +// Code generated by protoc-gen-gogo. +// source: header.proto +// DO NOT EDIT! + +/* +Package pb is a generated protocol buffer package. + +It is generated from these files: + header.proto + +It has these top-level messages: + Set +*/ +package pb + +import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type Set struct { + // 1 for now, library will refuse to handle entries with an unrecognized version. + Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` + // how many of the links are subtrees + Fanout *uint32 `protobuf:"varint,2,opt,name=fanout" json:"fanout,omitempty"` + // hash seed for subtree selection, a random number + Seed *uint32 `protobuf:"fixed32,3,opt,name=seed" json:"seed,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Set) Reset() { *m = Set{} } +func (m *Set) String() string { return proto.CompactTextString(m) } +func (*Set) ProtoMessage() {} + +func (m *Set) GetVersion() uint32 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +func (m *Set) GetFanout() uint32 { + if m != nil && m.Fanout != nil { + return *m.Fanout + } + return 0 +} + +func (m *Set) GetSeed() uint32 { + if m != nil && m.Seed != nil { + return *m.Seed + } + return 0 +} + +func init() { +} diff --git a/pinning/pinner/internal/pb/header.proto b/pinning/pinner/internal/pb/header.proto new file mode 100644 index 0000000000..36b32b36dd --- /dev/null +++ b/pinning/pinner/internal/pb/header.proto @@ -0,0 +1,14 @@ +syntax = "proto2"; + +package ipfs.pin; + +option go_package = "pb"; + +message Set { + // 1 for now, library will refuse to handle entries with an unrecognized version. + optional uint32 version = 1; + // how many of the links are subtrees + optional uint32 fanout = 2; + // hash seed for subtree selection, a random number + optional fixed32 seed = 3; +} diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index b719f188ee..726c627294 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -3,8 +3,6 @@ package pin import ( - "encoding/json" - "errors" "fmt" "sync" @@ -17,9 +15,16 @@ import ( ) var log = logging.Logger("pin") -var recursePinDatastoreKey = ds.NewKey("/local/pins/recursive/keys") -var directPinDatastoreKey = ds.NewKey("/local/pins/direct/keys") -var indirectPinDatastoreKey = ds.NewKey("/local/pins/indirect/keys") + +var pinDatastoreKey = ds.NewKey("/local/pins") + +var emptyKey = key.B58KeyDecode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") + +const ( + linkDirect = "direct" + linkRecursive = "recursive" + linkIndirect = "indirect" +) type PinMode int @@ -56,8 +61,11 @@ type pinner struct { recursePin set.BlockSet directPin set.BlockSet indirPin *indirectPin - dserv mdag.DAGService - dstore ds.ThreadSafeDatastore + // Track the keys used for storing the pinning state, so gc does + // not delete them. + internalPin map[key.Key]struct{} + dserv mdag.DAGService + dstore ds.ThreadSafeDatastore } // NewPinner creates a new pinner using the given datastore as a backend @@ -188,13 +196,19 @@ func (p *pinner) pinLinks(ctx context.Context, node *mdag.Node) error { return nil } +func (p *pinner) isInternalPin(key key.Key) bool { + _, ok := p.internalPin[key] + return ok +} + // IsPinned returns whether or not the given key is pinned func (p *pinner) IsPinned(key key.Key) bool { p.lock.RLock() defer p.lock.RUnlock() return p.recursePin.HasKey(key) || p.directPin.HasKey(key) || - p.indirPin.HasKey(key) + p.indirPin.HasKey(key) || + p.isInternalPin(key) } func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { @@ -217,30 +231,56 @@ func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) + rootKeyI, err := d.Get(pinDatastoreKey) + if err != nil { + return nil, fmt.Errorf("cannot load pin state: %v", err) + } + rootKeyBytes, ok := rootKeyI.([]byte) + if !ok { + return nil, fmt.Errorf("cannot load pin state: %s was not bytes", pinDatastoreKey) + } + + rootKey := key.Key(rootKeyBytes) + + ctx := context.TODO() + root, err := dserv.Get(ctx, rootKey) + if err != nil { + return nil, fmt.Errorf("cannot find pinning root object: %v", err) + } + + internalPin := map[key.Key]struct{}{ + rootKey: struct{}{}, + } + recordInternal := func(k key.Key) { + internalPin[k] = struct{}{} + } + { // load recursive set - var recurseKeys []key.Key - if err := loadSet(d, recursePinDatastoreKey, &recurseKeys); err != nil { - return nil, err + recurseKeys, err := loadSet(ctx, dserv, root, linkRecursive, recordInternal) + if err != nil { + return nil, fmt.Errorf("cannot load recursive pins: %v", err) } p.recursePin = set.SimpleSetFromKeys(recurseKeys) } { // load direct set - var directKeys []key.Key - if err := loadSet(d, directPinDatastoreKey, &directKeys); err != nil { - return nil, err + directKeys, err := loadSet(ctx, dserv, root, linkDirect, recordInternal) + if err != nil { + return nil, fmt.Errorf("cannot load direct pins: %v", err) } p.directPin = set.SimpleSetFromKeys(directKeys) } { // load indirect set - var err error - p.indirPin, err = loadIndirPin(d, indirectPinDatastoreKey) + refcnt, err := loadMultiset(ctx, dserv, root, linkIndirect, recordInternal) if err != nil { - return nil, err + return nil, fmt.Errorf("cannot load indirect pins: %v", err) } + p.indirPin = &indirectPin{refCounts: refcnt} } + p.internalPin = internalPin + // assign services p.dserv = dserv p.dstore = d @@ -268,44 +308,54 @@ func (p *pinner) Flush() error { p.lock.Lock() defer p.lock.Unlock() - err := storeSet(p.dstore, directPinDatastoreKey, p.directPin.GetKeys()) - if err != nil { - return err - } + ctx := context.TODO() - err = storeSet(p.dstore, recursePinDatastoreKey, p.recursePin.GetKeys()) - if err != nil { - return err + internalPin := make(map[key.Key]struct{}) + recordInternal := func(k key.Key) { + internalPin[k] = struct{}{} } - err = storeIndirPin(p.dstore, indirectPinDatastoreKey, p.indirPin) - if err != nil { - return err + root := &mdag.Node{} + { + n, err := storeSet(ctx, p.dserv, p.directPin.GetKeys(), recordInternal) + if err != nil { + return err + } + if err := root.AddNodeLink(linkDirect, n); err != nil { + return err + } } - return nil -} -// helpers to marshal / unmarshal a pin set -func storeSet(d ds.Datastore, k ds.Key, val interface{}) error { - buf, err := json.Marshal(val) - if err != nil { - return err + { + n, err := storeSet(ctx, p.dserv, p.recursePin.GetKeys(), recordInternal) + if err != nil { + return err + } + if err := root.AddNodeLink(linkRecursive, n); err != nil { + return err + } } - return d.Put(k, buf) -} + { + n, err := storeMultiset(ctx, p.dserv, p.indirPin.GetRefs(), recordInternal) + if err != nil { + return err + } + if err := root.AddNodeLink(linkIndirect, n); err != nil { + return err + } + } -func loadSet(d ds.Datastore, k ds.Key, val interface{}) error { - buf, err := d.Get(k) + k, err := p.dserv.Add(root) if err != nil { return err } - - bf, ok := buf.([]byte) - if !ok { - return errors.New("invalid pin set value in datastore") + internalPin[k] = struct{}{} + if err := p.dstore.Put(pinDatastoreKey, []byte(k)); err != nil { + return fmt.Errorf("cannot store pin state: %v", err) } - return json.Unmarshal(bf, val) + p.internalPin = internalPin + return nil } // PinWithMode allows the user to have fine grained control over pin diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go new file mode 100644 index 0000000000..02619bf209 --- /dev/null +++ b/pinning/pinner/set.go @@ -0,0 +1,338 @@ +package pin + +import ( + "bytes" + "crypto/rand" + "encoding/binary" + "errors" + "fmt" + "hash/fnv" + "io" + "sort" + "unsafe" + + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/ipfs/go-ipfs/blocks/key" + "github.com/ipfs/go-ipfs/merkledag" + "github.com/ipfs/go-ipfs/pin/internal/pb" +) + +const ( + defaultFanout = 256 + maxItems = 8192 +) + +func randomSeed() (uint32, error) { + var buf [4]byte + if _, err := rand.Read(buf[:]); err != nil { + return 0, err + } + return binary.LittleEndian.Uint32(buf[:]), nil +} + +func hash(seed uint32, k key.Key) uint32 { + var buf [4]byte + binary.LittleEndian.PutUint32(buf[:], seed) + h := fnv.New32a() + _, _ = h.Write(buf[:]) + _, _ = io.WriteString(h, string(k)) + return h.Sum32() +} + +type itemIterator func() (k key.Key, data []byte, ok bool) + +type keyObserver func(key.Key) + +type refcount uint8 + +func (r refcount) Bytes() []byte { + // refcount size can change in later versions; this may need + // encoding/binary + return []byte{byte(r)} +} + +type sortByHash struct { + links []*merkledag.Link + data []byte +} + +func (s sortByHash) Len() int { + return len(s.links) +} + +func (s sortByHash) Less(a, b int) bool { + return bytes.Compare(s.links[a].Hash, s.links[b].Hash) == -1 +} + +func (s sortByHash) Swap(a, b int) { + s.links[a], s.links[b] = s.links[b], s.links[a] + if len(s.data) != 0 { + const n = int(unsafe.Sizeof(refcount(0))) + tmp := make([]byte, n) + copy(tmp, s.data[a:a+n]) + copy(s.data[a:a+n], s.data[b:b+n]) + copy(s.data[b:b+n], tmp) + } +} + +func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint64, iter itemIterator, internalKeys keyObserver) (*merkledag.Node, error) { + seed, err := randomSeed() + if err != nil { + return nil, err + } + n := &merkledag.Node{ + Links: make([]*merkledag.Link, 0, defaultFanout+maxItems), + } + for i := 0; i < defaultFanout; i++ { + n.Links = append(n.Links, &merkledag.Link{Hash: emptyKey.ToMultihash()}) + } + internalKeys(emptyKey) + hdr := &pb.Set{ + Version: proto.Uint32(1), + Fanout: proto.Uint32(defaultFanout), + Seed: proto.Uint32(seed), + } + if err := writeHdr(n, hdr); err != nil { + return nil, err + } + hdrLen := len(n.Data) + + if estimatedLen < maxItems { + // it'll probably fit + for i := 0; i < maxItems; i++ { + k, data, ok := iter() + if !ok { + // all done + break + } + n.Links = append(n.Links, &merkledag.Link{Hash: k.ToMultihash()}) + n.Data = append(n.Data, data...) + } + // sort by hash, also swap item Data + s := sortByHash{ + links: n.Links[defaultFanout:], + data: n.Data[hdrLen:], + } + sort.Stable(s) + } + + // wasteful but simple + type item struct { + k key.Key + data []byte + } + hashed := make(map[uint32][]item) + for { + k, data, ok := iter() + if !ok { + break + } + h := hash(seed, k) + hashed[h] = append(hashed[h], item{k, data}) + } + for h, items := range hashed { + childIter := func() (k key.Key, data []byte, ok bool) { + if len(items) == 0 { + return "", nil, false + } + first := items[0] + items = items[1:] + return first.k, first.data, true + } + child, err := storeItems(ctx, dag, uint64(len(items)), childIter, internalKeys) + if err != nil { + return nil, err + } + size, err := child.Size() + if err != nil { + return nil, err + } + childKey, err := dag.Add(child) + if err != nil { + return nil, err + } + internalKeys(childKey) + l := &merkledag.Link{ + Name: "", + Hash: childKey.ToMultihash(), + Size: size, + Node: child, + } + n.Links[int(h%defaultFanout)] = l + } + return n, nil +} + +func readHdr(n *merkledag.Node) (*pb.Set, []byte, error) { + hdrLenRaw, consumed := binary.Uvarint(n.Data) + if consumed <= 0 { + return nil, nil, errors.New("invalid Set header length") + } + buf := n.Data[consumed:] + if hdrLenRaw > uint64(len(buf)) { + return nil, nil, errors.New("impossibly large Set header length") + } + // as hdrLenRaw was <= an int, we now know it fits in an int + hdrLen := int(hdrLenRaw) + var hdr pb.Set + if err := proto.Unmarshal(buf[:hdrLen], &hdr); err != nil { + return nil, nil, err + } + buf = buf[hdrLen:] + + if v := hdr.GetVersion(); v != 1 { + return nil, nil, fmt.Errorf("unsupported Set version: %d", v) + } + if uint64(hdr.GetFanout()) > uint64(len(n.Links)) { + return nil, nil, errors.New("impossibly large Fanout") + } + return &hdr, buf, nil +} + +func writeHdr(n *merkledag.Node, hdr *pb.Set) error { + hdrData, err := proto.Marshal(hdr) + if err != nil { + return err + } + n.Data = make([]byte, binary.MaxVarintLen64, binary.MaxVarintLen64+len(hdrData)) + written := binary.PutUvarint(n.Data, uint64(len(hdrData))) + n.Data = n.Data[:written] + n.Data = append(n.Data, hdrData...) + return nil +} + +type walkerFunc func(buf []byte, idx int, link *merkledag.Link) error + +func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.Node, fn walkerFunc, children keyObserver) error { + hdr, buf, err := readHdr(n) + if err != nil { + return err + } + // readHdr guarantees fanout is a safe value + fanout := hdr.GetFanout() + for i, l := range n.Links[fanout:] { + if err := fn(buf, i, l); err != nil { + return err + } + } + for _, l := range n.Links[:fanout] { + children(key.Key(l.Hash)) + if key.Key(l.Hash) == emptyKey { + continue + } + subtree, err := l.GetNode(ctx, dag) + if err != nil { + return err + } + if err := walkItems(ctx, dag, subtree, fn, children); err != nil { + return err + } + } + return nil +} + +func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node, name string, internalKeys keyObserver) ([]key.Key, error) { + l, err := root.GetNodeLink(name) + if err != nil { + return nil, err + } + internalKeys(key.Key(l.Hash)) + n, err := l.GetNode(ctx, dag) + if err != nil { + return nil, err + } + + var res []key.Key + walk := func(buf []byte, idx int, link *merkledag.Link) error { + res = append(res, key.Key(link.Hash)) + return nil + } + if err := walkItems(ctx, dag, n, walk, internalKeys); err != nil { + return nil, err + } + return res, nil +} + +func loadMultiset(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node, name string, internalKeys keyObserver) (map[key.Key]uint64, error) { + l, err := root.GetNodeLink(name) + if err != nil { + return nil, err + } + internalKeys(key.Key(l.Hash)) + n, err := l.GetNode(ctx, dag) + if err != nil { + return nil, err + } + + refcounts := make(map[key.Key]uint64) + walk := func(buf []byte, idx int, link *merkledag.Link) error { + refcounts[key.Key(link.Hash)] += uint64(buf[idx]) + return nil + } + if err := walkItems(ctx, dag, n, walk, internalKeys); err != nil { + return nil, err + } + return refcounts, nil +} + +func storeSet(ctx context.Context, dag merkledag.DAGService, keys []key.Key, internalKeys keyObserver) (*merkledag.Node, error) { + iter := func() (k key.Key, data []byte, ok bool) { + if len(keys) == 0 { + return "", nil, false + } + first := keys[0] + keys = keys[1:] + return first, nil, true + } + n, err := storeItems(ctx, dag, uint64(len(keys)), iter, internalKeys) + if err != nil { + return nil, err + } + k, err := dag.Add(n) + if err != nil { + return nil, err + } + internalKeys(k) + return n, nil +} + +func storeMultiset(ctx context.Context, dag merkledag.DAGService, refcounts map[key.Key]uint64, internalKeys keyObserver) (*merkledag.Node, error) { + iter := func() (k key.Key, data []byte, ok bool) { + // Every call of this function returns the next refcount item. + // + // This function splits out the uint64 reference counts as + // smaller increments, as fits in type refcount. Most of the + // time the refcount will fit inside just one, so this saves + // space. + // + // We use range here to pick an arbitrary item in the map, but + // not really iterate the map. + for k, refs := range refcounts { + // Max value a single multiset item can store + num := ^refcount(0) + if refs <= uint64(num) { + // Remaining count fits in a single item; remove the + // key from the map. + num = refcount(refs) + delete(refcounts, k) + } else { + // Count is too large to fit in one item, the key will + // repeat in some later call. + refcounts[k] -= uint64(num) + } + return k, num.Bytes(), true + } + return "", nil, false + } + n, err := storeItems(ctx, dag, uint64(len(refcounts)), iter, internalKeys) + if err != nil { + return nil, err + } + k, err := dag.Add(n) + if err != nil { + return nil, err + } + internalKeys(k) + return n, nil +} From 8eebb2bdbe8caea5daf1626506630e1e7bba3788 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Mon, 18 May 2015 14:01:07 -0700 Subject: [PATCH 0903/3147] pin: Future-proof against refcount marshaled size changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@a61d377e5c036fb8b68a127d540e9af2f875947f --- pinning/pinner/set.go | 29 ++++++++++--- pinning/pinner/set_test.go | 85 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 pinning/pinner/set_test.go diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 02619bf209..4b6edc2ed6 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -44,14 +44,29 @@ type itemIterator func() (k key.Key, data []byte, ok bool) type keyObserver func(key.Key) +// refcount is the marshaled format of refcounts. It may change +// between versions; this is valid for version 1. Changing it may +// become desirable if there are many links with refcount > 255. +// +// There are two guarantees that need to be preserved, if this is +// changed: +// +// - the marshaled format is of fixed size, matching +// unsafe.Sizeof(refcount(0)) +// - methods of refcount handle endianness, and may +// in later versions need encoding/binary. type refcount uint8 func (r refcount) Bytes() []byte { - // refcount size can change in later versions; this may need - // encoding/binary return []byte{byte(r)} } +// readRefcount returns the idx'th refcount in []byte, which is +// assumed to be a sequence of refcount.Bytes results. +func (r *refcount) ReadFromIdx(buf []byte, idx int) { + *r = refcount(buf[idx]) +} + type sortByHash struct { links []*merkledag.Link data []byte @@ -70,9 +85,9 @@ func (s sortByHash) Swap(a, b int) { if len(s.data) != 0 { const n = int(unsafe.Sizeof(refcount(0))) tmp := make([]byte, n) - copy(tmp, s.data[a:a+n]) - copy(s.data[a:a+n], s.data[b:b+n]) - copy(s.data[b:b+n], tmp) + copy(tmp, s.data[a*n:a*n+n]) + copy(s.data[a*n:a*n+n], s.data[b*n:b*n+n]) + copy(s.data[b*n:b*n+n], tmp) } } @@ -267,7 +282,9 @@ func loadMultiset(ctx context.Context, dag merkledag.DAGService, root *merkledag refcounts := make(map[key.Key]uint64) walk := func(buf []byte, idx int, link *merkledag.Link) error { - refcounts[key.Key(link.Hash)] += uint64(buf[idx]) + var r refcount + r.ReadFromIdx(buf, idx) + refcounts[key.Key(link.Hash)] += uint64(r) return nil } if err := walkItems(ctx, dag, n, walk, internalKeys); err != nil { diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go new file mode 100644 index 0000000000..ce15df0f76 --- /dev/null +++ b/pinning/pinner/set_test.go @@ -0,0 +1,85 @@ +package pin + +import ( + "testing" + "testing/quick" + + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/blocks/blockstore" + "github.com/ipfs/go-ipfs/blocks/key" + "github.com/ipfs/go-ipfs/blockservice" + "github.com/ipfs/go-ipfs/exchange/offline" + "github.com/ipfs/go-ipfs/merkledag" + "golang.org/x/net/context" +) + +func ignoreKeys(key.Key) {} + +func copyMap(m map[key.Key]uint16) map[key.Key]uint64 { + c := make(map[key.Key]uint64, len(m)) + for k, v := range m { + c[k] = uint64(v) + } + return c +} + +func TestMultisetRoundtrip(t *testing.T) { + dstore := dssync.MutexWrap(datastore.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv, err := blockservice.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + dag := merkledag.NewDAGService(bserv) + + fn := func(m map[key.Key]uint16) bool { + // Generate a smaller range for refcounts than full uint64, as + // otherwise this just becomes overly cpu heavy, splitting it + // out into too many items. That means we need to convert to + // the right kind of map. As storeMultiset mutates the map as + // part of its bookkeeping, this is actually good. + refcounts := copyMap(m) + + ctx := context.Background() + n, err := storeMultiset(ctx, dag, refcounts, ignoreKeys) + if err != nil { + t.Fatalf("storing multiset: %v", err) + } + root := &merkledag.Node{} + const linkName = "dummylink" + if err := root.AddNodeLink(linkName, n); err != nil { + t.Fatalf("adding link to root node: %v", err) + } + + roundtrip, err := loadMultiset(ctx, dag, root, linkName, ignoreKeys) + if err != nil { + t.Fatalf("loading multiset: %v", err) + } + + orig := copyMap(m) + success := true + for k, want := range orig { + if got, ok := roundtrip[k]; ok { + if got != want { + success = false + t.Logf("refcount changed: %v -> %v for %q", want, got, k) + } + delete(orig, k) + delete(roundtrip, k) + } + } + for k, v := range orig { + success = false + t.Logf("refcount missing: %v for %q", v, k) + } + for k, v := range roundtrip { + success = false + t.Logf("refcount extra: %v for %q", v, k) + } + return success + } + if err := quick.Check(fn, nil); err != nil { + t.Fatal(err) + } +} From 5997913443bfd3673aad47e515914b343e480349 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Mon, 8 Jun 2015 21:42:04 -0700 Subject: [PATCH 0904/3147] pin: Do not accidentally delete indirect pins on Flush License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@49637f631ea0f06a815d3c0d3f7df77e6b9f9668 --- pinning/pinner/pin_test.go | 21 +++++++++++++++++++++ pinning/pinner/set.go | 11 +++++++++++ 2 files changed, 32 insertions(+) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index d3947254d5..e96adb292b 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -192,6 +192,27 @@ func TestDuplicateSemantics(t *testing.T) { } } +func TestFlush(t *testing.T) { + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + + dserv := mdag.NewDAGService(bserv) + p := NewPinner(dstore, dserv) + _, k := randNode() + + p.PinWithMode(k, Indirect) + if err := p.Flush(); err != nil { + t.Fatal(err) + } + if !p.IsPinned(k) { + t.Fatal("expected key to still be pinned") + } +} + func TestPinRecursiveFail(t *testing.T) { ctx := context.Background() dstore := dssync.MutexWrap(ds.NewMapDatastore()) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 4b6edc2ed6..71851af6ed 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -314,7 +314,18 @@ func storeSet(ctx context.Context, dag merkledag.DAGService, keys []key.Key, int return n, nil } +func copyRefcounts(orig map[key.Key]uint64) map[key.Key]uint64 { + r := make(map[key.Key]uint64, len(orig)) + for k, v := range orig { + r[k] = v + } + return r +} + func storeMultiset(ctx context.Context, dag merkledag.DAGService, refcounts map[key.Key]uint64, internalKeys keyObserver) (*merkledag.Node, error) { + // make a working copy of the refcounts + refcounts = copyRefcounts(refcounts) + iter := func() (k key.Key, data []byte, ok bool) { // Every call of this function returns the next refcount item. // From af1a89accb7e5c5fd51744a5c1f36e0e7f478fa3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 17 Jun 2015 09:19:05 -0700 Subject: [PATCH 0905/3147] using multistream muxer * ID service stream * make the relay service use msmux * fix nc tests Note from jbenet: Maybe we should remove the old protocol/muxer and see what breaks. It shouldn't be used by anything now. License: MIT Signed-off-by: Jeromy Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-ipfs-pinner@725c73e3f319589e434c508c001fed35bbb0aed5 --- pinning/pinner/pin.go | 5 ++++- pinning/pinner/set_test.go | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 726c627294..4d17138ab8 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -5,6 +5,7 @@ package pin import ( "fmt" "sync" + "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" @@ -242,7 +243,9 @@ func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) rootKey := key.Key(rootKeyBytes) - ctx := context.TODO() + ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5) + defer cancel() + root, err := dserv.Get(ctx, rootKey) if err != nil { return nil, fmt.Errorf("cannot find pinning root object: %v", err) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index ce15df0f76..83af077800 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" "github.com/ipfs/go-ipfs/merkledag" - "golang.org/x/net/context" ) func ignoreKeys(key.Key) {} From 095afb13d325df28ce3046edb50240cddd7a04bd Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Jul 2015 05:57:21 -0700 Subject: [PATCH 0906/3147] renamed {R,}Lock -> {Pin,GC}Lock License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-ipfs-pinner@370c62c1f2c65790566a65713e9fe5d55d39ded1 --- pinning/pinner/pin_test.go | 5 +---- pinning/pinner/set_test.go | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index e96adb292b..69f84f5319 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -195,10 +195,7 @@ func TestDuplicateSemantics(t *testing.T) { func TestFlush(t *testing.T) { dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } + bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) p := NewPinner(dstore, dserv) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 83af077800..a487449396 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -27,10 +27,7 @@ func copyMap(m map[key.Key]uint16) map[key.Key]uint64 { func TestMultisetRoundtrip(t *testing.T) { dstore := dssync.MutexWrap(datastore.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) - bserv, err := blockservice.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } + bserv := blockservice.New(bstore, offline.Exchange(bstore)) dag := merkledag.NewDAGService(bserv) fn := func(m map[key.Key]uint16) bool { From 93ebb47f23731159c8b2b36fb070f309ba536126 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 23 Jun 2015 16:01:32 -0700 Subject: [PATCH 0907/3147] implement mark and sweep GC License: MIT Signed-off-by: Jeromy dont GC blocks used by pinner License: MIT Signed-off-by: Jeromy comment GC algo License: MIT Signed-off-by: Jeromy add lock to blockstore to prevent GC from eating wanted blocks License: MIT Signed-off-by: Jeromy improve FetchGraph License: MIT Signed-off-by: Jeromy separate interfaces for blockstore and GCBlockstore License: MIT Signed-off-by: Jeromy reintroduce indirect pinning, add enumerateChildren dag method License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@1d2607cd168343cbe0568ccef8dd96199726e431 --- pinning/pinner/gc/gc.go | 99 ++++++++++++++++++++++++++++++++++ pinning/pinner/pin.go | 107 +++++++------------------------------ pinning/pinner/pin_test.go | 24 ++------- 3 files changed, 122 insertions(+), 108 deletions(-) create mode 100644 pinning/pinner/gc/gc.go diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go new file mode 100644 index 0000000000..3e2b850498 --- /dev/null +++ b/pinning/pinner/gc/gc.go @@ -0,0 +1,99 @@ +package gc + +import ( + bstore "github.com/ipfs/go-ipfs/blocks/blockstore" + key "github.com/ipfs/go-ipfs/blocks/key" + bserv "github.com/ipfs/go-ipfs/blockservice" + offline "github.com/ipfs/go-ipfs/exchange/offline" + dag "github.com/ipfs/go-ipfs/merkledag" + pin "github.com/ipfs/go-ipfs/pin" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" +) + +var log = logging.Logger("gc") + +// GC performs a mark and sweep garbage collection of the blocks in the blockstore +// first, it creates a 'marked' set and adds to it the following: +// - all recursively pinned blocks, plus all of their descendants (recursively) +// - all directly pinned blocks +// - all blocks utilized internally by the pinner +// +// The routine then iterates over every block in the blockstore and +// deletes any block that is not found in the marked set. +func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key.Key, error) { + unlock := bs.GCLock() + defer unlock() + + bsrv := bserv.New(bs, offline.Exchange(bs)) + ds := dag.NewDAGService(bsrv) + + // KeySet currently implemented in memory, in the future, may be bloom filter or + // disk backed to conserve memory. + gcs := key.NewKeySet() + for _, k := range pn.RecursiveKeys() { + gcs.Add(k) + nd, err := ds.Get(ctx, k) + if err != nil { + return nil, err + } + + // EnumerateChildren recursively walks the dag and adds the keys to the given set + err = dag.EnumerateChildren(ctx, ds, nd, gcs) + if err != nil { + return nil, err + } + } + for _, k := range pn.DirectKeys() { + gcs.Add(k) + } + for _, k := range pn.InternalPins() { + gcs.Add(k) + + nd, err := ds.Get(ctx, k) + if err != nil { + return nil, err + } + + // EnumerateChildren recursively walks the dag and adds the keys to the given set + err = dag.EnumerateChildren(ctx, ds, nd, gcs) + if err != nil { + return nil, err + } + } + + keychan, err := bs.AllKeysChan(ctx) + if err != nil { + return nil, err + } + + output := make(chan key.Key) + go func() { + defer close(output) + for { + select { + case k, ok := <-keychan: + if !ok { + return + } + if !gcs.Has(k) { + err := bs.DeleteBlock(k) + if err != nil { + log.Debugf("Error removing key from blockstore: %s", err) + return + } + select { + case output <- k: + case <-ctx.Done(): + return + } + } + case <-ctx.Done(): + return + } + } + }() + + return output, nil +} diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4d17138ab8..4221fae591 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -24,7 +24,6 @@ var emptyKey = key.B58KeyDecode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n" const ( linkDirect = "direct" linkRecursive = "recursive" - linkIndirect = "indirect" ) type PinMode int @@ -32,7 +31,6 @@ type PinMode int const ( Recursive PinMode = iota Direct - Indirect NotPinned ) @@ -52,8 +50,8 @@ type Pinner interface { Flush() error DirectKeys() []key.Key - IndirectKeys() map[key.Key]uint64 RecursiveKeys() []key.Key + InternalPins() []key.Key } // pinner implements the Pinner interface @@ -61,7 +59,7 @@ type pinner struct { lock sync.RWMutex recursePin set.BlockSet directPin set.BlockSet - indirPin *indirectPin + // Track the keys used for storing the pinning state, so gc does // not delete them. internalPin map[key.Key]struct{} @@ -80,7 +78,6 @@ func NewPinner(dstore ds.ThreadSafeDatastore, serv mdag.DAGService) Pinner { return &pinner{ recursePin: rcset, directPin: dirset, - indirPin: newIndirectPin(), dserv: serv, dstore: dstore, } @@ -104,7 +101,8 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { p.directPin.RemoveBlock(k) } - err := p.pinLinks(ctx, node) + // fetch entire graph + err := mdag.FetchGraph(ctx, node, p.dserv) if err != nil { return err } @@ -131,72 +129,18 @@ func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { if p.recursePin.HasKey(k) { if recursive { p.recursePin.RemoveBlock(k) - node, err := p.dserv.Get(ctx, k) - if err != nil { - return err - } - - return p.unpinLinks(ctx, node) + return nil } else { return fmt.Errorf("%s is pinned recursively", k) } } else if p.directPin.HasKey(k) { p.directPin.RemoveBlock(k) return nil - } else if p.indirPin.HasKey(k) { - return fmt.Errorf("%s is pinned indirectly. indirect pins cannot be removed directly", k) } else { return fmt.Errorf("%s is not pinned", k) } } -func (p *pinner) unpinLinks(ctx context.Context, node *mdag.Node) error { - for _, l := range node.Links { - node, err := l.GetNode(ctx, p.dserv) - if err != nil { - return err - } - - k, err := node.Key() - if err != nil { - return err - } - - p.indirPin.Decrement(k) - - err = p.unpinLinks(ctx, node) - if err != nil { - return err - } - } - return nil -} - -func (p *pinner) pinIndirectRecurse(ctx context.Context, node *mdag.Node) error { - k, err := node.Key() - if err != nil { - return err - } - - p.indirPin.Increment(k) - return p.pinLinks(ctx, node) -} - -func (p *pinner) pinLinks(ctx context.Context, node *mdag.Node) error { - for _, ng := range p.dserv.GetDAG(ctx, node) { - subnode, err := ng.Get(ctx) - if err != nil { - // TODO: Maybe just log and continue? - return err - } - err = p.pinIndirectRecurse(ctx, subnode) - if err != nil { - return err - } - } - return nil -} - func (p *pinner) isInternalPin(key key.Key) bool { _, ok := p.internalPin[key] return ok @@ -208,7 +152,6 @@ func (p *pinner) IsPinned(key key.Key) bool { defer p.lock.RUnlock() return p.recursePin.HasKey(key) || p.directPin.HasKey(key) || - p.indirPin.HasKey(key) || p.isInternalPin(key) } @@ -218,8 +161,6 @@ func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { switch mode { case Direct: p.directPin.RemoveBlock(key) - case Indirect: - p.indirPin.Decrement(key) case Recursive: p.recursePin.RemoveBlock(key) default: @@ -274,14 +215,6 @@ func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) p.directPin = set.SimpleSetFromKeys(directKeys) } - { // load indirect set - refcnt, err := loadMultiset(ctx, dserv, root, linkIndirect, recordInternal) - if err != nil { - return nil, fmt.Errorf("cannot load indirect pins: %v", err) - } - p.indirPin = &indirectPin{refCounts: refcnt} - } - p.internalPin = internalPin // assign services @@ -296,11 +229,6 @@ func (p *pinner) DirectKeys() []key.Key { return p.directPin.GetKeys() } -// IndirectKeys returns a slice containing the indirectly pinned keys -func (p *pinner) IndirectKeys() map[key.Key]uint64 { - return p.indirPin.GetRefs() -} - // RecursiveKeys returns a slice containing the recursively pinned keys func (p *pinner) RecursiveKeys() []key.Key { return p.recursePin.GetKeys() @@ -339,20 +267,17 @@ func (p *pinner) Flush() error { } } - { - n, err := storeMultiset(ctx, p.dserv, p.indirPin.GetRefs(), recordInternal) - if err != nil { - return err - } - if err := root.AddNodeLink(linkIndirect, n); err != nil { - return err - } + // add the empty node, its referenced by the pin sets but never created + _, err := p.dserv.Add(new(mdag.Node)) + if err != nil { + return err } k, err := p.dserv.Add(root) if err != nil { return err } + internalPin[k] = struct{}{} if err := p.dstore.Put(pinDatastoreKey, []byte(k)); err != nil { return fmt.Errorf("cannot store pin state: %v", err) @@ -361,6 +286,16 @@ func (p *pinner) Flush() error { return nil } +func (p *pinner) InternalPins() []key.Key { + p.lock.Lock() + defer p.lock.Unlock() + var out []key.Key + for k, _ := range p.internalPin { + out = append(out, k) + } + return out +} + // PinWithMode allows the user to have fine grained control over pin // counts func (p *pinner) PinWithMode(k key.Key, mode PinMode) { @@ -371,7 +306,5 @@ func (p *pinner) PinWithMode(k key.Key, mode PinMode) { p.recursePin.AddBlock(k) case Direct: p.directPin.AddBlock(k) - case Indirect: - p.indirPin.Increment(k) } } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 69f84f5319..15fd0a2f92 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -53,7 +53,7 @@ func TestPinnerBasic(t *testing.T) { } // create new node c, to be indirectly pinned through b - c, ck := randNode() + c, _ := randNode() _, err = dserv.Add(c) if err != nil { t.Fatal(err) @@ -82,10 +82,6 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - if !p.IsPinned(ck) { - t.Fatal("Child of recursively pinned node not found") - } - bk, _ := b.Key() if !p.IsPinned(bk) { t.Fatal("Recursively pinned node not found..") @@ -95,7 +91,7 @@ func TestPinnerBasic(t *testing.T) { d.AddNodeLink("a", a) d.AddNodeLink("c", c) - e, ek := randNode() + e, _ := randNode() d.AddNodeLink("e", e) // Must be in dagserv for unpin to work @@ -110,10 +106,6 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - if !p.IsPinned(ek) { - t.Fatal(err) - } - dk, _ := d.Key() if !p.IsPinned(dk) { t.Fatal("pinned node not found.") @@ -125,11 +117,6 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - // c should still be pinned under b - if !p.IsPinned(ck) { - t.Fatal("Recursive / indirect unpin fail.") - } - err = p.Flush() if err != nil { t.Fatal(err) @@ -145,11 +132,6 @@ func TestPinnerBasic(t *testing.T) { t.Fatal("Could not find pinned node!") } - // Test indirectly pinned - if !np.IsPinned(ck) { - t.Fatal("could not find indirectly pinned node") - } - // Test recursively pinned if !np.IsPinned(bk) { t.Fatal("could not find recursively pinned node") @@ -201,7 +183,7 @@ func TestFlush(t *testing.T) { p := NewPinner(dstore, dserv) _, k := randNode() - p.PinWithMode(k, Indirect) + p.PinWithMode(k, Recursive) if err := p.Flush(); err != nil { t.Fatal(err) } From 9a81202be305ca971c4be1cd35fea42caf1a0eb7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 9 Jul 2015 16:03:48 -0700 Subject: [PATCH 0908/3147] break up GC logic License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@ecda80aebc3d42d96a01eca768e6723bce38b4f9 --- pinning/pinner/gc/gc.go | 74 +++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 3e2b850498..f435959b9d 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -29,38 +29,9 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) - // KeySet currently implemented in memory, in the future, may be bloom filter or - // disk backed to conserve memory. - gcs := key.NewKeySet() - for _, k := range pn.RecursiveKeys() { - gcs.Add(k) - nd, err := ds.Get(ctx, k) - if err != nil { - return nil, err - } - - // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ds, nd, gcs) - if err != nil { - return nil, err - } - } - for _, k := range pn.DirectKeys() { - gcs.Add(k) - } - for _, k := range pn.InternalPins() { - gcs.Add(k) - - nd, err := ds.Get(ctx, k) - if err != nil { - return nil, err - } - - // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ds, nd, gcs) - if err != nil { - return nil, err - } + gcs, err := ColoredSet(pn, ds) + if err != nil { + return nil, err } keychan, err := bs.AllKeysChan(ctx) @@ -97,3 +68,42 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. return output, nil } + +func Descendants(ds dag.DAGService, set key.KeySet, roots []key.Key) error { + for _, k := range roots { + set.Add(k) + nd, err := ds.Get(context.Background(), k) + if err != nil { + return err + } + + // EnumerateChildren recursively walks the dag and adds the keys to the given set + err = dag.EnumerateChildren(context.Background(), ds, nd, set) + if err != nil { + return err + } + } + + return nil +} + +func ColoredSet(pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) { + // KeySet currently implemented in memory, in the future, may be bloom filter or + // disk backed to conserve memory. + gcs := key.NewKeySet() + err := Descendants(ds, gcs, pn.RecursiveKeys()) + if err != nil { + return nil, err + } + + for _, k := range pn.DirectKeys() { + gcs.Add(k) + } + + err = Color(ds, gcs, pn.InternalPins()) + if err != nil { + return nil, err + } + + return gcs, nil +} From 4c6495c1d72aca88a52e83c3ff9f8c60825ecc47 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Mon, 8 Jun 2015 21:43:11 -0700 Subject: [PATCH 0909/3147] dagmodifier: Don't lose pin if old and new key happen to be equal License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@96bed09b4f0d8ba002c0047510c75b8ba5658a2b --- unixfs/mod/dagmodifier.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index bb22f289fb..df1abe0b60 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -209,9 +209,10 @@ func (dm *DagModifier) Sync() error { dm.curNode = nd } - // Finalize correct pinning, and flush pinner - dm.mp.PinWithMode(thisk, pin.Recursive) + // Finalize correct pinning, and flush pinner. + // Be careful about the order, as curk might equal thisk. dm.mp.RemovePinWithMode(curk, pin.Recursive) + dm.mp.PinWithMode(thisk, pin.Recursive) err = dm.mp.Flush() if err != nil { return err From c879078b2bbe2ec1f6336d00f39ee95e6e789cdc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 10 Jul 2015 10:49:19 -0700 Subject: [PATCH 0910/3147] addressing comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@96547c99ef13e73283836741d548b23cb0837761 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 60 ++++++++++++++++++++++++++--- pinning/pinner/pin_test.go | 77 +++++++++++++++++++++++++++++--------- 3 files changed, 115 insertions(+), 24 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index f435959b9d..ec61f816a4 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -100,7 +100,7 @@ func ColoredSet(pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) { gcs.Add(k) } - err = Color(ds, gcs, pn.InternalPins()) + err = Descendants(ds, gcs, pn.InternalPins()) if err != nil { return nil, err } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4221fae591..8905293ed0 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -35,7 +35,7 @@ const ( ) type Pinner interface { - IsPinned(key.Key) bool + IsPinned(key.Key) (string, bool, error) Pin(context.Context, *mdag.Node, bool) error Unpin(context.Context, key.Key, bool) error @@ -147,12 +147,38 @@ func (p *pinner) isInternalPin(key key.Key) bool { } // IsPinned returns whether or not the given key is pinned -func (p *pinner) IsPinned(key key.Key) bool { +// and an explanation of why its pinned +func (p *pinner) IsPinned(k key.Key) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.recursePin.HasKey(key) || - p.directPin.HasKey(key) || - p.isInternalPin(key) + if p.recursePin.HasKey(k) { + return "recursive", true, nil + } + if p.directPin.HasKey(k) { + return "direct", true, nil + } + if p.isInternalPin(k) { + return "internal", true, nil + } + + for _, rk := range p.recursePin.GetKeys() { + ss := &searchSet{target: k} + + rnd, err := p.dserv.Get(context.Background(), rk) + if err != nil { + return "", false, err + } + + err = mdag.EnumerateChildren(context.Background(), p.dserv, rnd, ss) + if err != nil { + return "", false, err + } + + if ss.found { + return rk.B58String(), true, nil + } + } + return "", false, nil } func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { @@ -308,3 +334,27 @@ func (p *pinner) PinWithMode(k key.Key, mode PinMode) { p.directPin.AddBlock(k) } } + +// searchSet implements key.KeySet in +type searchSet struct { + target key.Key + found bool +} + +func (ss *searchSet) Add(k key.Key) { + if ss.target == k { + ss.found = true + } +} + +func (ss *searchSet) Has(k key.Key) bool { + // returning true to all Has queries will cause EnumerateChildren to return + // almost immediately + return ss.found +} + +func (ss *searchSet) Keys() []key.Key { + return nil +} + +func (ss *searchSet) Remove(key.Key) {} diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 15fd0a2f92..d681bb8df6 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -24,6 +24,17 @@ func randNode() (*mdag.Node, key.Key) { return nd, k } +func assertPinned(t *testing.T, p Pinner, k key.Key, failmsg string) { + _, pinned, err := p.IsPinned(k) + if err != nil { + t.Fatal(err) + } + + if !pinned { + t.Fatal(failmsg) + } +} + func TestPinnerBasic(t *testing.T) { ctx := context.Background() @@ -48,13 +59,11 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - if !p.IsPinned(ak) { - t.Fatal("Failed to find key") - } + assertPinned(t, p, ak, "Failed to find key") // create new node c, to be indirectly pinned through b c, _ := randNode() - _, err = dserv.Add(c) + ck, err := dserv.Add(c) if err != nil { t.Fatal(err) } @@ -82,10 +91,10 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } + assertPinned(t, p, ck, "child of recursively pinned node not found") + bk, _ := b.Key() - if !p.IsPinned(bk) { - t.Fatal("Recursively pinned node not found..") - } + assertPinned(t, p, bk, "Recursively pinned node not found..") d, _ := randNode() d.AddNodeLink("a", a) @@ -107,9 +116,7 @@ func TestPinnerBasic(t *testing.T) { } dk, _ := d.Key() - if !p.IsPinned(dk) { - t.Fatal("pinned node not found.") - } + assertPinned(t, p, dk, "pinned node not found.") // Test recursive unpin err = p.Unpin(ctx, dk, true) @@ -128,14 +135,10 @@ func TestPinnerBasic(t *testing.T) { } // Test directly pinned - if !np.IsPinned(ak) { - t.Fatal("Could not find pinned node!") - } + assertPinned(t, np, ak, "Could not find pinned node!") // Test recursively pinned - if !np.IsPinned(bk) { - t.Fatal("could not find recursively pinned node") - } + assertPinned(t, np, bk, "could not find recursively pinned node") } func TestDuplicateSemantics(t *testing.T) { @@ -187,8 +190,46 @@ func TestFlush(t *testing.T) { if err := p.Flush(); err != nil { t.Fatal(err) } - if !p.IsPinned(k) { - t.Fatal("expected key to still be pinned") + assertPinned(t, p, k, "expected key to still be pinned") +} + +func TestPinRecursiveFail(t *testing.T) { + ctx := context.Background() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + + dserv := mdag.NewDAGService(bserv) + + p := NewPinner(dstore, dserv) + + a, _ := randNode() + b, _ := randNode() + err = a.AddNodeLinkClean("child", b) + if err != nil { + t.Fatal(err) + } + + // Note: this isnt a time based test, we expect the pin to fail + mctx, _ := context.WithTimeout(ctx, time.Millisecond) + err = p.Pin(mctx, a, true) + if err == nil { + t.Fatal("should have failed to pin here") + } + + _, err = dserv.Add(b) + if err != nil { + t.Fatal(err) + } + + // this one is time based... but shouldnt cause any issues + mctx, _ = context.WithTimeout(ctx, time.Second) + err = p.Pin(mctx, a, true) + if err != nil { + t.Fatal(err) } } From 0a1fbf5c0bca78da66e779c01a005c924c1f35e2 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Mon, 8 Jun 2015 21:43:40 -0700 Subject: [PATCH 0911/3147] dagmodifier test: Add TODO note about how bad luck can cause test failure License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@bf9c085882a43ff5a8ff7e87bd479cc566a033ae --- unixfs/mod/dagmodifier_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 25caadfb00..98393b3772 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -568,6 +568,7 @@ func TestCorrectPinning(t *testing.T) { indirpins := pins.IndirectKeys() children := enumerateChildren(t, nd, dserv) + // TODO this is not true if the contents happen to be identical if len(indirpins) != len(children) { t.Log(len(indirpins), len(children)) t.Fatal("Incorrect number of indirectly pinned blocks") From 5abf9381edac5834d14ed9592c9db624b278df0c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 7 Jul 2015 08:56:05 -0700 Subject: [PATCH 0912/3147] Add locking interface to blockstore The addition of a locking interface to the blockstore allows us to perform atomic operations on the underlying datastore without having to worry about different operations happening in the background, such as garbage collection. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@96b2995d0ee979b1c9778bb8fbce160b37503674 --- blockstore/blockstore.go | 22 +++++++++++++++++++++- blockstore/write_cache.go | 10 +++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index c4eefaddf3..1a56313bef 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -4,6 +4,7 @@ package blockstore import ( "errors" + "sync" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" @@ -35,7 +36,14 @@ type Blockstore interface { AllKeysChan(ctx context.Context) (<-chan key.Key, error) } -func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { +type GCBlockstore interface { + Blockstore + + Lock() func() + RLock() func() +} + +func NewBlockstore(d ds.ThreadSafeDatastore) *blockstore { dd := dsns.Wrap(d, BlockPrefix) return &blockstore{ datastore: dd, @@ -46,6 +54,8 @@ type blockstore struct { datastore ds.Batching // cant be ThreadSafeDatastore cause namespace.Datastore doesnt support it. // we do check it on `NewBlockstore` though. + + lk sync.RWMutex } func (bs *blockstore) Get(k key.Key) (*blocks.Block, error) { @@ -172,3 +182,13 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return output, nil } + +func (bs *blockstore) Lock() func() { + bs.lk.Lock() + return bs.lk.Unlock +} + +func (bs *blockstore) RLock() func() { + bs.lk.RLock() + return bs.lk.RUnlock +} diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 5b2f55a2a2..54cdfd6ebb 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -8,7 +8,7 @@ import ( ) // WriteCached returns a blockstore that caches up to |size| unique writes (bs.Put). -func WriteCached(bs Blockstore, size int) (Blockstore, error) { +func WriteCached(bs Blockstore, size int) (*writecache, error) { c, err := lru.New(size) if err != nil { return nil, err @@ -58,3 +58,11 @@ func (w *writecache) PutMany(bs []*blocks.Block) error { func (w *writecache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return w.blockstore.AllKeysChan(ctx) } + +func (w *writecache) Lock() func() { + return w.blockstore.(GCBlockstore).Lock() +} + +func (w *writecache) RLock() func() { + return w.blockstore.(GCBlockstore).RLock() +} From 048b68435df0bd02e1e349150704779aa78b4178 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 10 Jul 2015 11:03:15 -0700 Subject: [PATCH 0913/3147] pin rm fails appropriately for indirect pins License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@484d981e7c8fd3c2c10a15742c51fd25a74c5e68 --- pinning/pinner/pin.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 8905293ed0..ffdb90a6c5 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -126,18 +126,26 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() - if p.recursePin.HasKey(k) { + reason, pinned, err := p.isPinned(k) + if err != nil { + return err + } + if !pinned { + return fmt.Errorf("%s is not pinned", k) + } + switch reason { + case "recursive": if recursive { p.recursePin.RemoveBlock(k) return nil } else { return fmt.Errorf("%s is pinned recursively", k) } - } else if p.directPin.HasKey(k) { + case "direct": p.directPin.RemoveBlock(k) return nil - } else { - return fmt.Errorf("%s is not pinned", k) + default: + return fmt.Errorf("%s is pinned indirectly under %s", k, reason) } } @@ -151,6 +159,12 @@ func (p *pinner) isInternalPin(key key.Key) bool { func (p *pinner) IsPinned(k key.Key) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() + return p.isPinned(k) +} + +// isPinned is the implementation of IsPinned that does not lock. +// intended for use by other pinned methods that already take locks +func (p *pinner) isPinned(k key.Key) (string, bool, error) { if p.recursePin.HasKey(k) { return "recursive", true, nil } From 30aedab933de4446723fb8af2e32102155b34070 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 23 Jun 2015 16:01:32 -0700 Subject: [PATCH 0914/3147] implement mark and sweep GC License: MIT Signed-off-by: Jeromy dont GC blocks used by pinner License: MIT Signed-off-by: Jeromy comment GC algo License: MIT Signed-off-by: Jeromy add lock to blockstore to prevent GC from eating wanted blocks License: MIT Signed-off-by: Jeromy improve FetchGraph License: MIT Signed-off-by: Jeromy separate interfaces for blockstore and GCBlockstore License: MIT Signed-off-by: Jeromy reintroduce indirect pinning, add enumerateChildren dag method License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@622095d132fef7bd95b0e9eabde482f2c1b92fdd --- unixfs/mod/dagmodifier.go | 9 --------- unixfs/mod/dagmodifier_test.go | 26 +++++++------------------- 2 files changed, 7 insertions(+), 28 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index df1abe0b60..481005c2f3 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -11,7 +11,6 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" - imp "github.com/ipfs/go-ipfs/importer" chunk "github.com/ipfs/go-ipfs/importer/chunk" help "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" @@ -266,10 +265,6 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) for i, bs := range f.GetBlocksizes() { // We found the correct child to write into if cur+bs > offset { - // Unpin block - ckey := key.Key(node.Links[i].Hash) - dm.mp.RemovePinWithMode(ckey, pin.Indirect) - child, err := node.Links[i].GetNode(dm.ctx, dm.dagserv) if err != nil { return "", false, err @@ -279,9 +274,6 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) return "", false, err } - // pin the new node - dm.mp.PinWithMode(k, pin.Indirect) - offset += bs node.Links[i].Hash = mh.Multihash(k) @@ -310,7 +302,6 @@ func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte, errs <-ch dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, - NodeCB: imp.BasicPinnerCB(dm.mp), } return trickle.TrickleAppend(dm.ctx, node, dbp.New(blks, errs)) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 98393b3772..75638a7bf0 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -19,6 +19,7 @@ import ( trickle "github.com/ipfs/go-ipfs/importer/trickle" mdag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + gc "github.com/ipfs/go-ipfs/pin/gc" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" u "github.com/ipfs/go-ipfs/util" @@ -36,7 +37,7 @@ func getMockDagServ(t testing.TB) (mdag.DAGService, pin.Pinner) { return dserv, pin.NewPinner(tsds, dserv) } -func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore, pin.Pinner) { +func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.GCBlockstore, pin.Pinner) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) @@ -47,7 +48,7 @@ func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blocksto func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.Pinner) ([]byte, *mdag.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) - node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in), imp.BasicPinnerCB(pinner)) + node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in)) if err != nil { t.Fatal(err) } @@ -469,22 +470,17 @@ func TestSparseWrite(t *testing.T) { } } -func basicGC(t *testing.T, bs blockstore.Blockstore, pins pin.Pinner) { +func basicGC(t *testing.T, bs blockstore.GCBlockstore, pins pin.Pinner) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // in case error occurs during operation - keychan, err := bs.AllKeysChan(ctx) + out, err := gc.GC(ctx, bs, pins) if err != nil { t.Fatal(err) } - for k := range keychan { // rely on AllKeysChan to close chan - if !pins.IsPinned(k) { - err := bs.DeleteBlock(k) - if err != nil { - t.Fatal(err) - } - } + for range out { } } + func TestCorrectPinning(t *testing.T) { dserv, bstore, pins := getMockDagServAndBstore(t) b, n := getNode(t, dserv, 50000, pins) @@ -566,14 +562,6 @@ func TestCorrectPinning(t *testing.T) { t.Fatal("Incorrect node recursively pinned") } - indirpins := pins.IndirectKeys() - children := enumerateChildren(t, nd, dserv) - // TODO this is not true if the contents happen to be identical - if len(indirpins) != len(children) { - t.Log(len(indirpins), len(children)) - t.Fatal("Incorrect number of indirectly pinned blocks") - } - } func enumerateChildren(t *testing.T, nd *mdag.Node, ds mdag.DAGService) []key.Key { From f963d82e93275f8a8a2f5241710e865aa9247779 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Jul 2015 05:57:21 -0700 Subject: [PATCH 0915/3147] renamed {R,}Lock -> {Pin,GC}Lock License: MIT Signed-off-by: Juan Batiz-Benet This commit was moved from ipfs/go-ipfs-blockstore@ef7f864c79e3cf8b1178279449ce6fde628808b4 --- blockstore/blockstore.go | 16 ++++++++++++---- blockstore/write_cache.go | 8 ++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 1a56313bef..f2eec8cfec 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -39,8 +39,16 @@ type Blockstore interface { type GCBlockstore interface { Blockstore - Lock() func() - RLock() func() + // GCLock locks the blockstore for garbage collection. No operations + // that expect to finish with a pin should ocurr simultaneously. + // Reading during GC is safe, and requires no lock. + GCLock() func() + + // PinLock locks the blockstore for sequences of puts expected to finish + // with a pin (before GC). Multiple put->pin sequences can write through + // at the same time, but no GC should not happen simulatenously. + // Reading during Pinning is safe, and requires no lock. + PinLock() func() } func NewBlockstore(d ds.ThreadSafeDatastore) *blockstore { @@ -183,12 +191,12 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return output, nil } -func (bs *blockstore) Lock() func() { +func (bs *blockstore) GCLock() func() { bs.lk.Lock() return bs.lk.Unlock } -func (bs *blockstore) RLock() func() { +func (bs *blockstore) PinLock() func() { bs.lk.RLock() return bs.lk.RUnlock } diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 54cdfd6ebb..52af696e4a 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -59,10 +59,10 @@ func (w *writecache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return w.blockstore.AllKeysChan(ctx) } -func (w *writecache) Lock() func() { - return w.blockstore.(GCBlockstore).Lock() +func (w *writecache) GCLock() func() { + return w.blockstore.(GCBlockstore).GCLock() } -func (w *writecache) RLock() func() { - return w.blockstore.(GCBlockstore).RLock() +func (w *writecache) PinLock() func() { + return w.blockstore.(GCBlockstore).PinLock() } From 8ea7de1a0217d9c85cea6fc9f8a9125f06b5128f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 10 Jul 2015 11:34:29 -0700 Subject: [PATCH 0916/3147] dont use searchset for indirect pin checking License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@9b7197d224e168afb5b33cfc1932b0bdebf7bc1b --- pinning/pinner/pin.go | 45 ++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ffdb90a6c5..80c11d6987 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -176,19 +176,16 @@ func (p *pinner) isPinned(k key.Key) (string, bool, error) { } for _, rk := range p.recursePin.GetKeys() { - ss := &searchSet{target: k} - rnd, err := p.dserv.Get(context.Background(), rk) if err != nil { return "", false, err } - err = mdag.EnumerateChildren(context.Background(), p.dserv, rnd, ss) + has, err := hasChild(p.dserv, rnd, k) if err != nil { return "", false, err } - - if ss.found { + if has { return rk.B58String(), true, nil } } @@ -349,26 +346,26 @@ func (p *pinner) PinWithMode(k key.Key, mode PinMode) { } } -// searchSet implements key.KeySet in -type searchSet struct { - target key.Key - found bool -} +func hasChild(ds mdag.DAGService, root *mdag.Node, child key.Key) (bool, error) { + for _, lnk := range root.Links { + k := key.Key(lnk.Hash) + if k == child { + return true, nil + } -func (ss *searchSet) Add(k key.Key) { - if ss.target == k { - ss.found = true - } -} + nd, err := ds.Get(context.Background(), k) + if err != nil { + return false, err + } -func (ss *searchSet) Has(k key.Key) bool { - // returning true to all Has queries will cause EnumerateChildren to return - // almost immediately - return ss.found -} + has, err := hasChild(ds, nd, child) + if err != nil { + return false, err + } -func (ss *searchSet) Keys() []key.Key { - return nil + if has { + return has, nil + } + } + return false, nil } - -func (ss *searchSet) Remove(key.Key) {} From 423728c30211fb24e09b62199d8fdf9942cecf8f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 10 Jul 2015 10:49:19 -0700 Subject: [PATCH 0917/3147] addressing comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@07b2cea0654d4d60fed4b20d50a2aafbee251573 --- unixfs/mod/dagmodifier_test.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 75638a7bf0..48be0545e8 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -10,7 +10,6 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" - key "github.com/ipfs/go-ipfs/blocks/key" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" imp "github.com/ipfs/go-ipfs/importer" @@ -564,20 +563,6 @@ func TestCorrectPinning(t *testing.T) { } -func enumerateChildren(t *testing.T, nd *mdag.Node, ds mdag.DAGService) []key.Key { - var out []key.Key - for _, lnk := range nd.Links { - out = append(out, key.Key(lnk.Hash)) - child, err := lnk.GetNode(context.Background(), ds) - if err != nil { - t.Fatal(err) - } - children := enumerateChildren(t, child, ds) - out = append(out, children...) - } - return out -} - func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv, pins := getMockDagServ(b) From 78e705c7f35002f3d2388147c290203799189a7b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 9 Sep 2015 15:02:46 -0700 Subject: [PATCH 0918/3147] Refactor ipnsfs into a more generic and well tested mfs License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@5a486a1714ab34f9a1747af8f145c23fa65c38b4 --- mfs/dir.go | 313 ++++++++++++++++++++++++++++++ mfs/file.go | 145 ++++++++++++++ mfs/mfs_test.go | 476 ++++++++++++++++++++++++++++++++++++++++++++++ mfs/ops.go | 43 +++++ mfs/repub_test.go | 78 ++++++++ mfs/system.go | 237 +++++++++++++++++++++++ 6 files changed, 1292 insertions(+) create mode 100644 mfs/dir.go create mode 100644 mfs/file.go create mode 100644 mfs/mfs_test.go create mode 100644 mfs/ops.go create mode 100644 mfs/repub_test.go create mode 100644 mfs/system.go diff --git a/mfs/dir.go b/mfs/dir.go new file mode 100644 index 0000000000..c33032bafa --- /dev/null +++ b/mfs/dir.go @@ -0,0 +1,313 @@ +package mfs + +import ( + "errors" + "fmt" + "os" + "sync" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + dag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" + ufspb "github.com/ipfs/go-ipfs/unixfs/pb" +) + +var ErrNotYetImplemented = errors.New("not yet implemented") +var ErrInvalidChild = errors.New("invalid child node") +var ErrDirExists = errors.New("directory already has entry by that name") + +type Directory struct { + dserv dag.DAGService + parent childCloser + + childDirs map[string]*Directory + files map[string]*File + + lock sync.Mutex + node *dag.Node + ctx context.Context + + name string +} + +func NewDirectory(ctx context.Context, name string, node *dag.Node, parent childCloser, dserv dag.DAGService) *Directory { + return &Directory{ + dserv: dserv, + ctx: ctx, + name: name, + node: node, + parent: parent, + childDirs: make(map[string]*Directory), + files: make(map[string]*File), + } +} + +// closeChild updates the child by the given name to the dag node 'nd' +// and changes its own dag node, then propogates the changes upward +func (d *Directory) closeChild(name string, nd *dag.Node) error { + _, err := d.dserv.Add(nd) + if err != nil { + return err + } + + d.lock.Lock() + defer d.lock.Unlock() + err = d.node.RemoveNodeLink(name) + if err != nil && err != dag.ErrNotFound { + return err + } + + err = d.node.AddNodeLinkClean(name, nd) + if err != nil { + return err + } + + return d.parent.closeChild(d.name, d.node) +} + +func (d *Directory) Type() NodeType { + return TDir +} + +// childFile returns a file under this directory by the given name if it exists +func (d *Directory) childFile(name string) (*File, error) { + fi, ok := d.files[name] + if ok { + return fi, nil + } + + nd, err := d.childFromDag(name) + if err != nil { + return nil, err + } + i, err := ft.FromBytes(nd.Data) + if err != nil { + return nil, err + } + + switch i.GetType() { + case ufspb.Data_Directory: + return nil, ErrIsDirectory + case ufspb.Data_File: + nfi, err := NewFile(name, nd, d, d.dserv) + if err != nil { + return nil, err + } + d.files[name] = nfi + return nfi, nil + case ufspb.Data_Metadata: + return nil, ErrNotYetImplemented + default: + return nil, ErrInvalidChild + } +} + +// childDir returns a directory under this directory by the given name if it +// exists. +func (d *Directory) childDir(name string) (*Directory, error) { + dir, ok := d.childDirs[name] + if ok { + return dir, nil + } + + nd, err := d.childFromDag(name) + if err != nil { + return nil, err + } + + i, err := ft.FromBytes(nd.Data) + if err != nil { + return nil, err + } + + switch i.GetType() { + case ufspb.Data_Directory: + ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) + d.childDirs[name] = ndir + return ndir, nil + case ufspb.Data_File: + return nil, fmt.Errorf("%s is not a directory", name) + case ufspb.Data_Metadata: + return nil, ErrNotYetImplemented + default: + return nil, ErrInvalidChild + } +} + +// childFromDag searches through this directories dag node for a child link +// with the given name +func (d *Directory) childFromDag(name string) (*dag.Node, error) { + for _, lnk := range d.node.Links { + if lnk.Name == name { + return lnk.GetNode(d.ctx, d.dserv) + } + } + + return nil, os.ErrNotExist +} + +// Child returns the child of this directory by the given name +func (d *Directory) Child(name string) (FSNode, error) { + d.lock.Lock() + defer d.lock.Unlock() + return d.childUnsync(name) +} + +// childUnsync returns the child under this directory by the given name +// without locking, useful for operations which already hold a lock +func (d *Directory) childUnsync(name string) (FSNode, error) { + + dir, err := d.childDir(name) + if err == nil { + return dir, nil + } + fi, err := d.childFile(name) + if err == nil { + return fi, nil + } + + return nil, os.ErrNotExist +} + +type NodeListing struct { + Name string + Type int + Size int64 + Hash string +} + +func (d *Directory) List() ([]NodeListing, error) { + d.lock.Lock() + defer d.lock.Unlock() + + var out []NodeListing + for _, l := range d.node.Links { + child := NodeListing{} + child.Name = l.Name + + c, err := d.childUnsync(l.Name) + if err != nil { + return nil, err + } + + child.Type = int(c.Type()) + if c, ok := c.(*File); ok { + size, err := c.Size() + if err != nil { + return nil, err + } + child.Size = size + } + nd, err := c.GetNode() + if err != nil { + return nil, err + } + + k, err := nd.Key() + if err != nil { + return nil, err + } + + child.Hash = k.B58String() + + out = append(out, child) + } + + return out, nil +} + +func (d *Directory) Mkdir(name string) (*Directory, error) { + d.lock.Lock() + defer d.lock.Unlock() + + _, err := d.childDir(name) + if err == nil { + return nil, os.ErrExist + } + _, err = d.childFile(name) + if err == nil { + return nil, os.ErrExist + } + + ndir := &dag.Node{Data: ft.FolderPBData()} + + _, err = d.dserv.Add(ndir) + if err != nil { + return nil, err + } + + err = d.node.AddNodeLinkClean(name, ndir) + if err != nil { + return nil, err + } + + err = d.parent.closeChild(d.name, d.node) + if err != nil { + return nil, err + } + + return d.childDir(name) +} + +func (d *Directory) Unlink(name string) error { + d.lock.Lock() + defer d.lock.Unlock() + + delete(d.childDirs, name) + delete(d.files, name) + + err := d.node.RemoveNodeLink(name) + if err != nil { + return err + } + + return d.parent.closeChild(d.name, d.node) +} + +// AddChild adds the node 'nd' under this directory giving it the name 'name' +func (d *Directory) AddChild(name string, nd *dag.Node) error { + d.Lock() + defer d.Unlock() + + pbn, err := ft.FromBytes(nd.Data) + if err != nil { + return err + } + + _, err = d.childUnsync(name) + if err == nil { + return ErrDirExists + } + + err = d.node.AddNodeLinkClean(name, nd) + if err != nil { + return err + } + + switch pbn.GetType() { + case ft.TDirectory: + d.childDirs[name] = NewDirectory(d.ctx, name, nd, d, d.dserv) + case ft.TFile, ft.TMetadata, ft.TRaw: + nfi, err := NewFile(name, nd, d, d.dserv) + if err != nil { + return err + } + d.files[name] = nfi + default: + return ErrInvalidChild + } + return d.parent.closeChild(d.name, d.node) +} + +func (d *Directory) GetNode() (*dag.Node, error) { + return d.node, nil +} + +func (d *Directory) Lock() { + d.lock.Lock() +} + +func (d *Directory) Unlock() { + d.lock.Unlock() +} diff --git a/mfs/file.go b/mfs/file.go new file mode 100644 index 0000000000..fea1112dc3 --- /dev/null +++ b/mfs/file.go @@ -0,0 +1,145 @@ +package mfs + +import ( + "sync" + + chunk "github.com/ipfs/go-ipfs/importer/chunk" + dag "github.com/ipfs/go-ipfs/merkledag" + mod "github.com/ipfs/go-ipfs/unixfs/mod" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" +) + +type File struct { + parent childCloser + + name string + hasChanges bool + + mod *mod.DagModifier + lock sync.Mutex +} + +// NewFile returns a NewFile object with the given parameters +func NewFile(name string, node *dag.Node, parent childCloser, dserv dag.DAGService) (*File, error) { + dmod, err := mod.NewDagModifier(context.Background(), node, dserv, chunk.DefaultSplitter) + if err != nil { + return nil, err + } + + return &File{ + parent: parent, + name: name, + mod: dmod, + }, nil +} + +// Write writes the given data to the file at its current offset +func (fi *File) Write(b []byte) (int, error) { + fi.Lock() + defer fi.Unlock() + fi.hasChanges = true + return fi.mod.Write(b) +} + +// Read reads into the given buffer from the current offset +func (fi *File) Read(b []byte) (int, error) { + fi.Lock() + defer fi.Unlock() + return fi.mod.Read(b) +} + +// Read reads into the given buffer from the current offset +func (fi *File) CtxReadFull(ctx context.Context, b []byte) (int, error) { + fi.Lock() + defer fi.Unlock() + return fi.mod.CtxReadFull(ctx, b) +} + +// Close flushes, then propogates the modified dag node up the directory structure +// and signals a republish to occur +func (fi *File) Close() error { + fi.Lock() + defer fi.Unlock() + if fi.hasChanges { + err := fi.mod.Sync() + if err != nil { + return err + } + + nd, err := fi.mod.GetNode() + if err != nil { + return err + } + + fi.Unlock() + err = fi.parent.closeChild(fi.name, nd) + fi.Lock() + if err != nil { + return err + } + + fi.hasChanges = false + } + + return nil +} + +// Sync flushes the changes in the file to disk +func (fi *File) Sync() error { + fi.Lock() + defer fi.Unlock() + return fi.mod.Sync() +} + +// Seek implements io.Seeker +func (fi *File) Seek(offset int64, whence int) (int64, error) { + fi.Lock() + defer fi.Unlock() + return fi.mod.Seek(offset, whence) +} + +// Write At writes the given bytes at the offset 'at' +func (fi *File) WriteAt(b []byte, at int64) (int, error) { + fi.Lock() + defer fi.Unlock() + fi.hasChanges = true + return fi.mod.WriteAt(b, at) +} + +// Size returns the size of this file +func (fi *File) Size() (int64, error) { + fi.Lock() + defer fi.Unlock() + return fi.mod.Size() +} + +// GetNode returns the dag node associated with this file +func (fi *File) GetNode() (*dag.Node, error) { + fi.Lock() + defer fi.Unlock() + return fi.mod.GetNode() +} + +// Truncate truncates the file to size +func (fi *File) Truncate(size int64) error { + fi.Lock() + defer fi.Unlock() + fi.hasChanges = true + return fi.mod.Truncate(size) +} + +// Type returns the type FSNode this is +func (fi *File) Type() NodeType { + return TFile +} + +// Lock the file +func (fi *File) Lock() { + fi.lock.Lock() +} + +// Unlock the file +func (fi *File) Unlock() { + fi.lock.Unlock() +} diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go new file mode 100644 index 0000000000..609d81a29c --- /dev/null +++ b/mfs/mfs_test.go @@ -0,0 +1,476 @@ +package mfs + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "sort" + "strings" + "testing" + + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + + bstore "github.com/ipfs/go-ipfs/blocks/blockstore" + key "github.com/ipfs/go-ipfs/blocks/key" + bserv "github.com/ipfs/go-ipfs/blockservice" + offline "github.com/ipfs/go-ipfs/exchange/offline" + importer "github.com/ipfs/go-ipfs/importer" + chunk "github.com/ipfs/go-ipfs/importer/chunk" + dag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" + uio "github.com/ipfs/go-ipfs/unixfs/io" + u "github.com/ipfs/go-ipfs/util" +) + +func getDagserv(t *testing.T) dag.DAGService { + db := dssync.MutexWrap(ds.NewMapDatastore()) + bs := bstore.NewBlockstore(db) + blockserv := bserv.New(bs, offline.Exchange(bs)) + return dag.NewDAGService(blockserv) +} + +func getRandFile(t *testing.T, ds dag.DAGService, size int64) *dag.Node { + r := io.LimitReader(u.NewTimeSeededRand(), size) + nd, err := importer.BuildDagFromReader(ds, chunk.DefaultSplitter(r)) + if err != nil { + t.Fatal(err) + } + return nd +} + +func mkdirP(t *testing.T, root *Directory, path string) *Directory { + dirs := strings.Split(path, "/") + cur := root + for _, d := range dirs { + n, err := cur.Mkdir(d) + if err != nil && err != os.ErrExist { + t.Fatal(err) + } + if err == os.ErrExist { + fsn, err := cur.Child(d) + if err != nil { + t.Fatal(err) + } + switch fsn := fsn.(type) { + case *Directory: + n = fsn + case *File: + t.Fatal("tried to make a directory where a file already exists") + } + } + + cur = n + } + return cur +} + +func assertDirAtPath(root *Directory, path string, children []string) error { + fsn, err := DirLookup(root, path) + if err != nil { + return err + } + + dir, ok := fsn.(*Directory) + if !ok { + return fmt.Errorf("%s was not a directory", path) + } + + listing, err := dir.List() + if err != nil { + return err + } + + var names []string + for _, d := range listing { + names = append(names, d.Name) + } + + sort.Strings(children) + sort.Strings(names) + if !compStrArrs(children, names) { + return errors.New("directories children did not match!") + } + + return nil +} + +func compStrArrs(a, b []string) bool { + if len(a) != len(b) { + return false + } + + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return false + } + } + + return true +} + +func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.Node, path string) error { + parts := strings.Split(path, "/") + cur := root + for i, d := range parts[:len(parts)-1] { + next, err := cur.Child(d) + if err != nil { + return fmt.Errorf("looking for %s failed: %s", path, err) + } + + nextDir, ok := next.(*Directory) + if !ok { + return fmt.Errorf("%s points to a non-directory", parts[:i+1]) + } + + cur = nextDir + } + + last := parts[len(parts)-1] + finaln, err := cur.Child(last) + if err != nil { + return err + } + + file, ok := finaln.(*File) + if !ok { + return fmt.Errorf("%s was not a file!", path) + } + + out, err := ioutil.ReadAll(file) + if err != nil { + return err + } + + expbytes, err := catNode(ds, exp) + if err != nil { + return err + } + + if !bytes.Equal(out, expbytes) { + return fmt.Errorf("Incorrect data at path!") + } + return nil +} + +func catNode(ds dag.DAGService, nd *dag.Node) ([]byte, error) { + r, err := uio.NewDagReader(context.TODO(), nd, ds) + if err != nil { + return nil, err + } + defer r.Close() + + return ioutil.ReadAll(r) +} + +func setupRoot(ctx context.Context, t *testing.T) (dag.DAGService, *Root) { + ds := getDagserv(t) + + root := &dag.Node{Data: ft.FolderPBData()} + rt, err := NewRoot(ctx, ds, root, func(ctx context.Context, k key.Key) error { + fmt.Println("PUBLISHED: ", k) + return nil + }) + + if err != nil { + t.Fatal(err) + } + + return ds, rt +} + +func TestBasic(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + rootdir := rt.GetValue().(*Directory) + + // test making a basic dir + _, err := rootdir.Mkdir("a") + if err != nil { + t.Fatal(err) + } + + path := "a/b/c/d/e/f/g" + d := mkdirP(t, rootdir, path) + + fi := getRandFile(t, ds, 1000) + + // test inserting that file + err = d.AddChild("afile", fi) + if err != nil { + t.Fatal(err) + } + + err = assertFileAtPath(ds, rootdir, fi, "a/b/c/d/e/f/g/afile") + if err != nil { + t.Fatal(err) + } +} + +func TestMkdir(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + _, rt := setupRoot(ctx, t) + + rootdir := rt.GetValue().(*Directory) + + dirsToMake := []string{"a", "B", "foo", "bar", "cats", "fish"} + sort.Strings(dirsToMake) // sort for easy comparing later + + for _, d := range dirsToMake { + _, err := rootdir.Mkdir(d) + if err != nil { + t.Fatal(err) + } + } + + err := assertDirAtPath(rootdir, "/", dirsToMake) + if err != nil { + t.Fatal(err) + } + + for _, d := range dirsToMake { + mkdirP(t, rootdir, "a/"+d) + } + + err = assertDirAtPath(rootdir, "/a", dirsToMake) + if err != nil { + t.Fatal(err) + } + + // mkdir over existing dir should fail + _, err = rootdir.Mkdir("a") + if err == nil { + t.Fatal("should have failed!") + } +} + +func TestDirectoryLoadFromDag(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + rootdir := rt.GetValue().(*Directory) + + nd := getRandFile(t, ds, 1000) + _, err := ds.Add(nd) + if err != nil { + t.Fatal(err) + } + + fihash, err := nd.Multihash() + if err != nil { + t.Fatal(err) + } + + dir := &dag.Node{Data: ft.FolderPBData()} + _, err = ds.Add(dir) + if err != nil { + t.Fatal(err) + } + + dirhash, err := dir.Multihash() + if err != nil { + t.Fatal(err) + } + + top := &dag.Node{ + Data: ft.FolderPBData(), + Links: []*dag.Link{ + &dag.Link{ + Name: "a", + Hash: fihash, + }, + &dag.Link{ + Name: "b", + Hash: dirhash, + }, + }, + } + + err = rootdir.AddChild("foo", top) + if err != nil { + t.Fatal(err) + } + + // get this dir + topi, err := rootdir.Child("foo") + if err != nil { + t.Fatal(err) + } + + topd := topi.(*Directory) + + // mkdir over existing but unloaded child file should fail + _, err = topd.Mkdir("a") + if err == nil { + t.Fatal("expected to fail!") + } + + // mkdir over existing but unloaded child dir should fail + _, err = topd.Mkdir("b") + if err == nil { + t.Fatal("expected to fail!") + } + + // adding a child over an existing path fails + err = topd.AddChild("b", nd) + if err == nil { + t.Fatal("expected to fail!") + } + + err = assertFileAtPath(ds, rootdir, nd, "foo/a") + if err != nil { + t.Fatal(err) + } + + err = assertDirAtPath(rootdir, "foo/b", nil) + if err != nil { + t.Fatal(err) + } + + err = rootdir.Unlink("foo") + if err != nil { + t.Fatal(err) + } + + err = assertDirAtPath(rootdir, "", nil) + if err != nil { + t.Fatal(err) + } +} + +func TestMfsFile(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + rootdir := rt.GetValue().(*Directory) + + fisize := 1000 + nd := getRandFile(t, ds, 1000) + + err := rootdir.AddChild("file", nd) + if err != nil { + t.Fatal(err) + } + + fsn, err := rootdir.Child("file") + if err != nil { + t.Fatal(err) + } + + fi := fsn.(*File) + + if fi.Type() != TFile { + t.Fatal("some is seriously wrong here") + } + + // assert size is as expected + size, err := fi.Size() + if size != int64(fisize) { + t.Fatal("size isnt correct") + } + + // write to beginning of file + b := []byte("THIS IS A TEST") + n, err := fi.Write(b) + if err != nil { + t.Fatal(err) + } + + if n != len(b) { + t.Fatal("didnt write correct number of bytes") + } + + // sync file + err = fi.Sync() + if err != nil { + t.Fatal(err) + } + + // make sure size hasnt changed + size, err = fi.Size() + if size != int64(fisize) { + t.Fatal("size isnt correct") + } + + // seek back to beginning + ns, err := fi.Seek(0, os.SEEK_SET) + if err != nil { + t.Fatal(err) + } + + if ns != 0 { + t.Fatal("didnt seek to beginning") + } + + // read back bytes we wrote + buf := make([]byte, len(b)) + n, err = fi.Read(buf) + if err != nil { + t.Fatal(err) + } + + if n != len(buf) { + t.Fatal("didnt read enough") + } + + if !bytes.Equal(buf, b) { + t.Fatal("data read was different than data written") + } + + // truncate file to ten bytes + err = fi.Truncate(10) + if err != nil { + t.Fatal(err) + } + + size, err = fi.Size() + if err != nil { + t.Fatal(err) + } + + if size != 10 { + t.Fatal("size was incorrect: ", size) + } + + // 'writeAt' to extend it + data := []byte("this is a test foo foo foo") + nwa, err := fi.WriteAt(data, 5) + if err != nil { + t.Fatal(err) + } + + if nwa != len(data) { + t.Fatal(err) + } + + // assert size once more + size, err = fi.Size() + if err != nil { + t.Fatal(err) + } + + if size != int64(5+len(data)) { + t.Fatal("size was incorrect") + } + + // make sure we can get node. TODO: verify it later + _, err = fi.GetNode() + if err != nil { + t.Fatal(err) + } + + // close it out! + err = fi.Close() + if err != nil { + t.Fatal(err) + } +} diff --git a/mfs/ops.go b/mfs/ops.go new file mode 100644 index 0000000000..75f187f528 --- /dev/null +++ b/mfs/ops.go @@ -0,0 +1,43 @@ +package mfs + +import ( + "errors" + "fmt" + "strings" +) + +func rootLookup(r *Root, path string) (FSNode, error) { + dir, ok := r.GetValue().(*Directory) + if !ok { + return nil, errors.New("root was not a directory") + } + + return DirLookup(dir, path) +} + +// DirLookup will look up a file or directory at the given path +// under the directory 'd' +func DirLookup(d *Directory, path string) (FSNode, error) { + path = strings.Trim(path, "/") + parts := strings.Split(path, "/") + if len(parts) == 1 && parts[0] == "" { + return d, nil + } + + var cur FSNode + cur = d + for i, p := range parts { + chdir, ok := cur.(*Directory) + if !ok { + return nil, fmt.Errorf("cannot access %s: Not a directory", strings.Join(parts[:i+1], "/")) + } + + child, err := chdir.Child(p) + if err != nil { + return nil, err + } + + cur = child + } + return cur, nil +} diff --git a/mfs/repub_test.go b/mfs/repub_test.go new file mode 100644 index 0000000000..36db90e805 --- /dev/null +++ b/mfs/repub_test.go @@ -0,0 +1,78 @@ +package mfs + +import ( + "testing" + "time" + + key "github.com/ipfs/go-ipfs/blocks/key" + ci "github.com/ipfs/go-ipfs/util/testutil/ci" + + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" +) + +func TestRepublisher(t *testing.T) { + if ci.IsRunning() { + t.Skip("dont run timing tests in CI") + } + + ctx := context.TODO() + + pub := make(chan struct{}) + + pf := func(ctx context.Context, k key.Key) error { + pub <- struct{}{} + return nil + } + + tshort := time.Millisecond * 50 + tlong := time.Second / 2 + + rp := NewRepublisher(ctx, pf, tshort, tlong) + go rp.Run() + + rp.Update("test") + + // should hit short timeout + select { + case <-time.After(tshort * 2): + t.Fatal("publish didnt happen in time") + case <-pub: + } + + cctx, cancel := context.WithCancel(context.Background()) + + go func() { + for { + rp.Update("a") + time.Sleep(time.Millisecond * 10) + select { + case <-cctx.Done(): + return + default: + } + } + }() + + select { + case <-pub: + t.Fatal("shouldnt have received publish yet!") + case <-time.After((tlong * 9) / 10): + } + select { + case <-pub: + case <-time.After(tlong / 2): + t.Fatal("waited too long for pub!") + } + + cancel() + + go func() { + err := rp.Close() + if err != nil { + t.Fatal(err) + } + }() + + // final pub from closing + <-pub +} diff --git a/mfs/system.go b/mfs/system.go new file mode 100644 index 0000000000..d2819479f9 --- /dev/null +++ b/mfs/system.go @@ -0,0 +1,237 @@ +// package mfs implements an in memory model of a mutable ipfs filesystem. +// +// It consists of four main structs: +// 1) The Filesystem +// The filesystem serves as a container and entry point for various mfs filesystems +// 2) Root +// Root represents an individual filesystem mounted within the mfs system as a whole +// 3) Directories +// 4) Files +package mfs + +import ( + "errors" + "sync" + "time" + + key "github.com/ipfs/go-ipfs/blocks/key" + dag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" + + context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" +) + +var ErrNotExist = errors.New("no such rootfs") + +var log = logging.Logger("mfs") + +var ErrIsDirectory = errors.New("error: is a directory") + +type childCloser interface { + closeChild(string, *dag.Node) error +} + +type NodeType int + +const ( + TFile NodeType = iota + TDir +) + +// FSNode represents any node (directory, root, or file) in the ipns filesystem +type FSNode interface { + GetNode() (*dag.Node, error) + Type() NodeType + Lock() + Unlock() +} + +// Root represents the root of a filesystem tree pointed to by a given keypair +type Root struct { + // node is the merkledag node pointed to by this keypair + node *dag.Node + + // val represents the node pointed to by this key. It can either be a File or a Directory + val FSNode + + repub *Republisher + + dserv dag.DAGService + + Type string +} + +type PubFunc func(context.Context, key.Key) error + +// newRoot creates a new Root for the given key, and starts up a republisher routine +// for it +func NewRoot(parent context.Context, ds dag.DAGService, node *dag.Node, pf PubFunc) (*Root, error) { + ndk, err := node.Key() + if err != nil { + return nil, err + } + + root := &Root{ + node: node, + repub: NewRepublisher(parent, pf, time.Millisecond*300, time.Second*3), + dserv: ds, + } + + root.repub.setVal(ndk) + go root.repub.Run() + + pbn, err := ft.FromBytes(node.Data) + if err != nil { + log.Error("IPNS pointer was not unixfs node") + return nil, err + } + + switch pbn.GetType() { + case ft.TDirectory: + root.val = NewDirectory(parent, ndk.String(), node, root, ds) + case ft.TFile, ft.TMetadata, ft.TRaw: + fi, err := NewFile(ndk.String(), node, root, ds) + if err != nil { + return nil, err + } + root.val = fi + default: + panic("unrecognized! (NYI)") + } + return root, nil +} + +func (kr *Root) GetValue() FSNode { + return kr.val +} + +// closeChild implements the childCloser interface, and signals to the publisher that +// there are changes ready to be published +func (kr *Root) closeChild(name string, nd *dag.Node) error { + k, err := kr.dserv.Add(nd) + if err != nil { + return err + } + + kr.repub.Update(k) + return nil +} + +func (kr *Root) Close() error { + return kr.repub.Close() +} + +// Republisher manages when to publish the ipns entry associated with a given key +type Republisher struct { + TimeoutLong time.Duration + TimeoutShort time.Duration + Publish chan struct{} + pubfunc PubFunc + pubnowch chan struct{} + + ctx context.Context + cancel func() + + lk sync.Mutex + val key.Key + lastpub key.Key +} + +func (rp *Republisher) getVal() key.Key { + rp.lk.Lock() + defer rp.lk.Unlock() + return rp.val +} + +// NewRepublisher creates a new Republisher object to republish the given keyroot +// using the given short and long time intervals +func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { + ctx, cancel := context.WithCancel(ctx) + return &Republisher{ + TimeoutShort: tshort, + TimeoutLong: tlong, + Publish: make(chan struct{}, 1), + pubfunc: pf, + pubnowch: make(chan struct{}), + ctx: ctx, + cancel: cancel, + } +} + +func (p *Republisher) setVal(k key.Key) { + p.lk.Lock() + defer p.lk.Unlock() + p.val = k +} + +func (p *Republisher) pubNow() { + select { + case p.pubnowch <- struct{}{}: + default: + } +} + +func (p *Republisher) Close() error { + err := p.publish(p.ctx) + p.cancel() + return err +} + +// Touch signals that an update has occurred since the last publish. +// Multiple consecutive touches may extend the time period before +// the next Publish occurs in order to more efficiently batch updates +func (np *Republisher) Update(k key.Key) { + np.setVal(k) + select { + case np.Publish <- struct{}{}: + default: + } +} + +// Run is the main republisher loop +func (np *Republisher) Run() { + for { + select { + case <-np.Publish: + quick := time.After(np.TimeoutShort) + longer := time.After(np.TimeoutLong) + + wait: + select { + case <-np.ctx.Done(): + return + case <-np.Publish: + quick = time.After(np.TimeoutShort) + goto wait + case <-quick: + case <-longer: + case <-np.pubnowch: + } + + err := np.publish(np.ctx) + if err != nil { + log.Error("republishRoot error: %s", err) + } + + case <-np.ctx.Done(): + return + } + } +} + +func (np *Republisher) publish(ctx context.Context) error { + np.lk.Lock() + topub := np.val + np.lk.Unlock() + + log.Info("Publishing Changes!") + err := np.pubfunc(ctx, topub) + if err != nil { + return err + } + np.lk.Lock() + np.lastpub = topub + np.lk.Unlock() + return nil +} From 0c3a47d60dcc1c201123970c9e5c22b9903edf78 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 21 Sep 2015 18:07:36 -0700 Subject: [PATCH 0919/3147] fixup comments License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@90014fc4728e3efaa35fc9bd23ecdd84be7f98ba --- mfs/system.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/mfs/system.go b/mfs/system.go index d2819479f9..22ef63cd4a 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -39,7 +39,7 @@ const ( TDir ) -// FSNode represents any node (directory, root, or file) in the ipns filesystem +// FSNode represents any node (directory, root, or file) in the mfs filesystem type FSNode interface { GetNode() (*dag.Node, error) Type() NodeType @@ -47,12 +47,12 @@ type FSNode interface { Unlock() } -// Root represents the root of a filesystem tree pointed to by a given keypair +// Root represents the root of a filesystem tree type Root struct { - // node is the merkledag node pointed to by this keypair + // node is the merkledag root node *dag.Node - // val represents the node pointed to by this key. It can either be a File or a Directory + // val represents the node. It can either be a File or a Directory val FSNode repub *Republisher @@ -64,8 +64,7 @@ type Root struct { type PubFunc func(context.Context, key.Key) error -// newRoot creates a new Root for the given key, and starts up a republisher routine -// for it +// newRoot creates a new Root and starts up a republisher routine for it func NewRoot(parent context.Context, ds dag.DAGService, node *dag.Node, pf PubFunc) (*Root, error) { ndk, err := node.Key() if err != nil { @@ -122,7 +121,7 @@ func (kr *Root) Close() error { return kr.repub.Close() } -// Republisher manages when to publish the ipns entry associated with a given key +// Republisher manages when to publish a given entry type Republisher struct { TimeoutLong time.Duration TimeoutShort time.Duration @@ -144,7 +143,7 @@ func (rp *Republisher) getVal() key.Key { return rp.val } -// NewRepublisher creates a new Republisher object to republish the given keyroot +// NewRepublisher creates a new Republisher object to republish the given root // using the given short and long time intervals func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { ctx, cancel := context.WithCancel(ctx) From d4e83e4a5d38267f537291dd056db7d3463bc847 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 29 Sep 2015 21:31:18 -0700 Subject: [PATCH 0920/3147] implement ipfs files command License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@191c539b888b3995085c655cec17cc2bd2c17bcc --- mfs/dir.go | 5 +++ mfs/ops.go | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/mfs/dir.go b/mfs/dir.go index c33032bafa..264dea4a0d 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -280,6 +280,11 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { return ErrDirExists } + _, err = d.dserv.Add(nd) + if err != nil { + return err + } + err = d.node.AddNodeLinkClean(name, nd) if err != nil { return err diff --git a/mfs/ops.go b/mfs/ops.go index 75f187f528..397aea65aa 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -3,10 +3,117 @@ package mfs import ( "errors" "fmt" + "os" + gopath "path" "strings" + + dag "github.com/ipfs/go-ipfs/merkledag" ) -func rootLookup(r *Root, path string) (FSNode, error) { +// Mv moves the file or directory at 'src' to 'dst' +func Mv(r *Root, src, dst string) error { + srcDir, srcFname := gopath.Split(src) + + srcObj, err := Lookup(r, src) + if err != nil { + return err + } + + var dstDirStr string + var filename string + if dst[len(dst)-1] == '/' { + dstDirStr = dst + filename = srcFname + } else { + dstDirStr, filename = gopath.Split(dst) + } + + dstDiri, err := Lookup(r, dstDirStr) + if err != nil { + return err + } + + dstDir := dstDiri.(*Directory) + nd, err := srcObj.GetNode() + if err != nil { + return err + } + + err = dstDir.AddChild(filename, nd) + if err != nil { + return err + } + + srcDirObji, err := Lookup(r, srcDir) + if err != nil { + return err + } + + srcDirObj := srcDirObji.(*Directory) + err = srcDirObj.Unlink(srcFname) + if err != nil { + return err + } + + return nil +} + +// PutNode inserts 'nd' at 'path' in the given mfs +func PutNode(r *Root, path string, nd *dag.Node) error { + dirp, filename := gopath.Split(path) + + parent, err := Lookup(r, dirp) + if err != nil { + return fmt.Errorf("lookup '%s' failed: %s", dirp, err) + } + + pdir, ok := parent.(*Directory) + if !ok { + return fmt.Errorf("%s did not point to directory", dirp) + } + + return pdir.AddChild(filename, nd) +} + +// Mkdir creates a directory at 'path' under the directory 'd', creating +// intermediary directories as needed if 'parents' is set to true +func Mkdir(r *Root, path string, parents bool) error { + parts := strings.Split(path, "/") + if parts[0] == "" { + parts = parts[1:] + } + + cur := r.GetValue().(*Directory) + for i, d := range parts[:len(parts)-1] { + fsn, err := cur.Child(d) + if err != nil { + if err == os.ErrNotExist && parents { + mkd, err := cur.Mkdir(d) + if err != nil { + return err + } + fsn = mkd + } + } + + next, ok := fsn.(*Directory) + if !ok { + return fmt.Errorf("%s was not a directory", strings.Join(parts[:i], "/")) + } + cur = next + } + + _, err := cur.Mkdir(parts[len(parts)-1]) + if err != nil { + if !parents || err != os.ErrExist { + return err + } + } + + return nil +} + +func Lookup(r *Root, path string) (FSNode, error) { dir, ok := r.GetValue().(*Directory) if !ok { return nil, errors.New("root was not a directory") From bfc91be56173c80f924b33284c22823d3aa3ce79 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 30 Sep 2015 17:12:51 -0700 Subject: [PATCH 0921/3147] address comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@0f90282fe6f737030f9ed82130eeb682acf43a7e --- mfs/ops.go | 82 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/mfs/ops.go b/mfs/ops.go index 397aea65aa..33514fc67a 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -14,11 +14,6 @@ import ( func Mv(r *Root, src, dst string) error { srcDir, srcFname := gopath.Split(src) - srcObj, err := Lookup(r, src) - if err != nil { - return err - } - var dstDirStr string var filename string if dst[len(dst)-1] == '/' { @@ -28,28 +23,46 @@ func Mv(r *Root, src, dst string) error { dstDirStr, filename = gopath.Split(dst) } - dstDiri, err := Lookup(r, dstDirStr) + // get parent directories of both src and dest first + dstDir, err := lookupDir(r, dstDirStr) if err != nil { return err } - dstDir := dstDiri.(*Directory) - nd, err := srcObj.GetNode() + srcDirObj, err := lookupDir(r, srcDir) if err != nil { return err } - err = dstDir.AddChild(filename, nd) + srcObj, err := srcDirObj.Child(srcFname) if err != nil { return err } - srcDirObji, err := Lookup(r, srcDir) + nd, err := srcObj.GetNode() + if err != nil { + return err + } + + fsn, err := dstDir.Child(filename) + if err == nil { + switch n := fsn.(type) { + case *File: + _ = dstDir.Unlink(filename) + case *Directory: + dstDir = n + default: + return fmt.Errorf("unexpected type at path: %s", dst) + } + } else if err != os.ErrNotExist { + return err + } + + err = dstDir.AddChild(filename, nd) if err != nil { return err } - srcDirObj := srcDirObji.(*Directory) err = srcDirObj.Unlink(srcFname) if err != nil { return err @@ -58,18 +71,27 @@ func Mv(r *Root, src, dst string) error { return nil } +func lookupDir(r *Root, path string) (*Directory, error) { + di, err := Lookup(r, path) + if err != nil { + return nil, err + } + + d, ok := di.(*Directory) + if !ok { + return nil, fmt.Errorf("%s is not a directory", path) + } + + return d, nil +} + // PutNode inserts 'nd' at 'path' in the given mfs func PutNode(r *Root, path string, nd *dag.Node) error { dirp, filename := gopath.Split(path) - parent, err := Lookup(r, dirp) + pdir, err := lookupDir(r, dirp) if err != nil { - return fmt.Errorf("lookup '%s' failed: %s", dirp, err) - } - - pdir, ok := parent.(*Directory) - if !ok { - return fmt.Errorf("%s did not point to directory", dirp) + return err } return pdir.AddChild(filename, nd) @@ -83,17 +105,27 @@ func Mkdir(r *Root, path string, parents bool) error { parts = parts[1:] } + // allow 'mkdir /a/b/c/' to create c + if parts[len(parts)-1] == "" { + parts = parts[:len(parts)-1] + } + + if len(parts) == 0 { + // this will only happen on 'mkdir /' + return fmt.Errorf("cannot mkdir '%s'", path) + } + cur := r.GetValue().(*Directory) for i, d := range parts[:len(parts)-1] { fsn, err := cur.Child(d) - if err != nil { - if err == os.ErrNotExist && parents { - mkd, err := cur.Mkdir(d) - if err != nil { - return err - } - fsn = mkd + if err == os.ErrNotExist && parents { + mkd, err := cur.Mkdir(d) + if err != nil { + return err } + fsn = mkd + } else if err != nil { + return err } next, ok := fsn.(*Directory) From 2d8f9a3f5c59ee2d3752e2ffd2f63c925e1ebc31 Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 17 Nov 2015 15:36:48 +0700 Subject: [PATCH 0922/3147] Replace strings.Join(elms, "/") with path.Join(elms) License: MIT Signed-off-by: rht This commit was moved from ipfs/go-mfs@4b035d7f87d659d0deded786b9db1a8d439039aa --- mfs/ops.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/mfs/ops.go b/mfs/ops.go index 33514fc67a..9e8ec1674a 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -8,6 +8,7 @@ import ( "strings" dag "github.com/ipfs/go-ipfs/merkledag" + path "github.com/ipfs/go-ipfs/path" ) // Mv moves the file or directory at 'src' to 'dst' @@ -99,8 +100,8 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // Mkdir creates a directory at 'path' under the directory 'd', creating // intermediary directories as needed if 'parents' is set to true -func Mkdir(r *Root, path string, parents bool) error { - parts := strings.Split(path, "/") +func Mkdir(r *Root, pth string, parents bool) error { + parts := strings.Split(pth, "/") if parts[0] == "" { parts = parts[1:] } @@ -112,7 +113,7 @@ func Mkdir(r *Root, path string, parents bool) error { if len(parts) == 0 { // this will only happen on 'mkdir /' - return fmt.Errorf("cannot mkdir '%s'", path) + return fmt.Errorf("cannot mkdir '%s'", pth) } cur := r.GetValue().(*Directory) @@ -130,7 +131,7 @@ func Mkdir(r *Root, path string, parents bool) error { next, ok := fsn.(*Directory) if !ok { - return fmt.Errorf("%s was not a directory", strings.Join(parts[:i], "/")) + return fmt.Errorf("%s was not a directory", path.Join(parts[:i])) } cur = next } @@ -156,9 +157,9 @@ func Lookup(r *Root, path string) (FSNode, error) { // DirLookup will look up a file or directory at the given path // under the directory 'd' -func DirLookup(d *Directory, path string) (FSNode, error) { - path = strings.Trim(path, "/") - parts := strings.Split(path, "/") +func DirLookup(d *Directory, pth string) (FSNode, error) { + pth = strings.Trim(pth, "/") + parts := strings.Split(pth, "/") if len(parts) == 1 && parts[0] == "" { return d, nil } @@ -168,7 +169,7 @@ func DirLookup(d *Directory, path string) (FSNode, error) { for i, p := range parts { chdir, ok := cur.(*Directory) if !ok { - return nil, fmt.Errorf("cannot access %s: Not a directory", strings.Join(parts[:i+1], "/")) + return nil, fmt.Errorf("cannot access %s: Not a directory", path.Join(parts[:i+1])) } child, err := chdir.Child(p) From 978769ba13cc487bab0a1ca9fcb76d2811d477d2 Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 24 Nov 2015 13:59:34 +0700 Subject: [PATCH 0923/3147] strings.Split -> path.SplitList License: MIT Signed-off-by: rht This commit was moved from ipfs/go-mfs@6bb4f0eebea862f465c66d1ada77e985aa7de1e4 --- mfs/mfs_test.go | 20 ++++++++++---------- mfs/ops.go | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 609d81a29c..13797c4609 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -8,12 +8,12 @@ import ( "io/ioutil" "os" "sort" - "strings" "testing" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/ipfs/go-ipfs/path" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" @@ -43,8 +43,8 @@ func getRandFile(t *testing.T, ds dag.DAGService, size int64) *dag.Node { return nd } -func mkdirP(t *testing.T, root *Directory, path string) *Directory { - dirs := strings.Split(path, "/") +func mkdirP(t *testing.T, root *Directory, pth string) *Directory { + dirs := path.SplitList(pth) cur := root for _, d := range dirs { n, err := cur.Mkdir(d) @@ -69,15 +69,15 @@ func mkdirP(t *testing.T, root *Directory, path string) *Directory { return cur } -func assertDirAtPath(root *Directory, path string, children []string) error { - fsn, err := DirLookup(root, path) +func assertDirAtPath(root *Directory, pth string, children []string) error { + fsn, err := DirLookup(root, pth) if err != nil { return err } dir, ok := fsn.(*Directory) if !ok { - return fmt.Errorf("%s was not a directory", path) + return fmt.Errorf("%s was not a directory", pth) } listing, err := dir.List() @@ -113,13 +113,13 @@ func compStrArrs(a, b []string) bool { return true } -func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.Node, path string) error { - parts := strings.Split(path, "/") +func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.Node, pth string) error { + parts := path.SplitList(pth) cur := root for i, d := range parts[:len(parts)-1] { next, err := cur.Child(d) if err != nil { - return fmt.Errorf("looking for %s failed: %s", path, err) + return fmt.Errorf("looking for %s failed: %s", pth, err) } nextDir, ok := next.(*Directory) @@ -138,7 +138,7 @@ func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.Node, path st file, ok := finaln.(*File) if !ok { - return fmt.Errorf("%s was not a file!", path) + return fmt.Errorf("%s was not a file!", pth) } out, err := ioutil.ReadAll(file) diff --git a/mfs/ops.go b/mfs/ops.go index 9e8ec1674a..c7309a31d9 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -101,7 +101,7 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // Mkdir creates a directory at 'path' under the directory 'd', creating // intermediary directories as needed if 'parents' is set to true func Mkdir(r *Root, pth string, parents bool) error { - parts := strings.Split(pth, "/") + parts := path.SplitList(pth) if parts[0] == "" { parts = parts[1:] } @@ -159,7 +159,7 @@ func Lookup(r *Root, path string) (FSNode, error) { // under the directory 'd' func DirLookup(d *Directory, pth string) (FSNode, error) { pth = strings.Trim(pth, "/") - parts := strings.Split(pth, "/") + parts := path.SplitList(pth) if len(parts) == 1 && parts[0] == "" { return d, nil } From 5c9747679f6e1e2224b1459e995716196d26b4cf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 2 Dec 2015 00:22:37 -0800 Subject: [PATCH 0924/3147] add option to disable flushing files structure on writes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@5683f81e4027ca6113a825387350b65f9895b7c9 --- mfs/dir.go | 121 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 91 insertions(+), 30 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 264dea4a0d..b86c98d77a 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -53,7 +53,16 @@ func (d *Directory) closeChild(name string, nd *dag.Node) error { d.lock.Lock() defer d.lock.Unlock() - err = d.node.RemoveNodeLink(name) + err = d.updateChild(name, nd) + if err != nil { + return err + } + + return d.parent.closeChild(d.name, d.node) +} + +func (d *Directory) updateChild(name string, nd *dag.Node) error { + err := d.node.RemoveNodeLink(name) if err != nil && err != dag.ErrNotFound { return err } @@ -63,7 +72,7 @@ func (d *Directory) closeChild(name string, nd *dag.Node) error { return err } - return d.parent.closeChild(d.name, d.node) + return nil } func (d *Directory) Type() NodeType { @@ -77,30 +86,16 @@ func (d *Directory) childFile(name string) (*File, error) { return fi, nil } - nd, err := d.childFromDag(name) - if err != nil { - return nil, err - } - i, err := ft.FromBytes(nd.Data) + fsn, err := d.childNode(name) if err != nil { return nil, err } - switch i.GetType() { - case ufspb.Data_Directory: - return nil, ErrIsDirectory - case ufspb.Data_File: - nfi, err := NewFile(name, nd, d, d.dserv) - if err != nil { - return nil, err - } - d.files[name] = nfi - return nfi, nil - case ufspb.Data_Metadata: - return nil, ErrNotYetImplemented - default: - return nil, ErrInvalidChild + if fi, ok := fsn.(*File); ok { + return fi, nil } + + return nil, fmt.Errorf("%s is not a file", name) } // childDir returns a directory under this directory by the given name if it @@ -111,6 +106,21 @@ func (d *Directory) childDir(name string) (*Directory, error) { return dir, nil } + fsn, err := d.childNode(name) + if err != nil { + return nil, err + } + + if dir, ok := fsn.(*Directory); ok { + return dir, nil + } + + return nil, fmt.Errorf("%s is not a directory", name) +} + +// childNode returns a FSNode under this directory by the given name if it exists. +// it does *not* check the cached dirs and files +func (d *Directory) childNode(name string) (FSNode, error) { nd, err := d.childFromDag(name) if err != nil { return nil, err @@ -127,7 +137,12 @@ func (d *Directory) childDir(name string) (*Directory, error) { d.childDirs[name] = ndir return ndir, nil case ufspb.Data_File: - return nil, fmt.Errorf("%s is not a directory", name) + nfi, err := NewFile(name, nd, d, d.dserv) + if err != nil { + return nil, err + } + d.files[name] = nfi + return nfi, nil case ufspb.Data_Metadata: return nil, ErrNotYetImplemented default: @@ -157,17 +172,17 @@ func (d *Directory) Child(name string) (FSNode, error) { // childUnsync returns the child under this directory by the given name // without locking, useful for operations which already hold a lock func (d *Directory) childUnsync(name string) (FSNode, error) { - - dir, err := d.childDir(name) - if err == nil { - return dir, nil + cdir, ok := d.childDirs[name] + if ok { + return cdir, nil } - fi, err := d.childFile(name) - if err == nil { - return fi, nil + + cfile, ok := d.files[name] + if ok { + return cfile, nil } - return nil, os.ErrNotExist + return d.childNode(name) } type NodeListing struct { @@ -305,7 +320,53 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { return d.parent.closeChild(d.name, d.node) } +func (d *Directory) sync() error { + for name, dir := range d.childDirs { + nd, err := dir.GetNode() + if err != nil { + return err + } + + _, err = d.dserv.Add(nd) + if err != nil { + return err + } + + err = d.updateChild(name, nd) + if err != nil { + return err + } + } + + for name, file := range d.files { + nd, err := file.GetNode() + if err != nil { + return err + } + + _, err = d.dserv.Add(nd) + if err != nil { + return err + } + + err = d.updateChild(name, nd) + if err != nil { + return err + } + } + + return nil +} + func (d *Directory) GetNode() (*dag.Node, error) { + d.Lock() + defer d.Unlock() + + err := d.sync() + if err != nil { + return nil, err + } + return d.node, nil } From 353512a42ecc6a3559ceb41a9d534f3ca9133ccf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 4 Dec 2015 14:25:13 -0800 Subject: [PATCH 0925/3147] use mfs for adds License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@9f9a8af3f559cbfc85abdd60b2a46cd80a7cb638 --- mfs/system.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/mfs/system.go b/mfs/system.go index 22ef63cd4a..a7aeb2b20f 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -71,15 +71,19 @@ func NewRoot(parent context.Context, ds dag.DAGService, node *dag.Node, pf PubFu return nil, err } + var repub *Republisher + if pf != nil { + repub = NewRepublisher(parent, pf, time.Millisecond*300, time.Second*3) + repub.setVal(ndk) + go repub.Run() + } + root := &Root{ node: node, - repub: NewRepublisher(parent, pf, time.Millisecond*300, time.Second*3), + repub: repub, dserv: ds, } - root.repub.setVal(ndk) - go root.repub.Run() - pbn, err := ft.FromBytes(node.Data) if err != nil { log.Error("IPNS pointer was not unixfs node") @@ -113,12 +117,17 @@ func (kr *Root) closeChild(name string, nd *dag.Node) error { return err } - kr.repub.Update(k) + if kr.repub != nil { + kr.repub.Update(k) + } return nil } func (kr *Root) Close() error { - return kr.repub.Close() + if kr.repub != nil { + return kr.repub.Close() + } + return nil } // Republisher manages when to publish a given entry From 48f5b210d332d8db6c734b862fc98d6ab637c523 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 4 Dec 2015 15:17:31 -0800 Subject: [PATCH 0926/3147] enfastify mfs License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@fb88ae2964f36027b0a8c8244fad8ba9a8e54ad5 --- mfs/dir.go | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index b86c98d77a..ece79adeb0 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "sync" + "time" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" @@ -28,6 +29,8 @@ type Directory struct { node *dag.Node ctx context.Context + modTime time.Time + name string } @@ -40,6 +43,7 @@ func NewDirectory(ctx context.Context, name string, node *dag.Node, parent child parent: parent, childDirs: make(map[string]*Directory), files: make(map[string]*File), + modTime: time.Now(), } } @@ -72,6 +76,8 @@ func (d *Directory) updateChild(name string, nd *dag.Node) error { return err } + d.modTime = time.Now() + return nil } @@ -285,12 +291,7 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { d.Lock() defer d.Unlock() - pbn, err := ft.FromBytes(nd.Data) - if err != nil { - return err - } - - _, err = d.childUnsync(name) + _, err := d.childUnsync(name) if err == nil { return ErrDirExists } @@ -305,18 +306,8 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { return err } - switch pbn.GetType() { - case ft.TDirectory: - d.childDirs[name] = NewDirectory(d.ctx, name, nd, d, d.dserv) - case ft.TFile, ft.TMetadata, ft.TRaw: - nfi, err := NewFile(name, nd, d, d.dserv) - if err != nil { - return err - } - d.files[name] = nfi - default: - return ErrInvalidChild - } + d.modTime = time.Now() + return d.parent.closeChild(d.name, d.node) } From 7b76562a2d1a27af7457b742096ebe3ec45a2770 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 4 Dec 2015 17:18:16 -0800 Subject: [PATCH 0927/3147] fix some tests License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@eab5476628f6c9307fce843a6ed4b944f96d2c45 --- mfs/dir.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mfs/dir.go b/mfs/dir.go index ece79adeb0..43271fe490 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -308,7 +308,8 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { d.modTime = time.Now() - return d.parent.closeChild(d.name, d.node) + //return d.parent.closeChild(d.name, d.node) + return nil } func (d *Directory) sync() error { From e1529ba3b605f3caf95e6fc9b8f13a6236f987a6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 4 Dec 2015 21:09:26 -0800 Subject: [PATCH 0928/3147] fixify tests License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@e752f895d908b8f2a15acfb7acc2e62f3e9d87a2 --- mfs/ops.go | 3 +++ mfs/system.go | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/mfs/ops.go b/mfs/ops.go index c7309a31d9..ebb1932ede 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -101,6 +101,9 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // Mkdir creates a directory at 'path' under the directory 'd', creating // intermediary directories as needed if 'parents' is set to true func Mkdir(r *Root, pth string, parents bool) error { + if pth == "" { + panic("empty path") + } parts := path.SplitList(pth) if parts[0] == "" { parts = parts[1:] diff --git a/mfs/system.go b/mfs/system.go index a7aeb2b20f..2cfc4e201f 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -124,9 +124,21 @@ func (kr *Root) closeChild(name string, nd *dag.Node) error { } func (kr *Root) Close() error { + nd, err := kr.GetValue().GetNode() + if err != nil { + return err + } + + k, err := kr.dserv.Add(nd) + if err != nil { + return err + } + if kr.repub != nil { + kr.repub.Update(k) return kr.repub.Close() } + return nil } From 7af94661e25ec380ca10f1bf36cc05bfacf2d9ac Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 20 May 2015 08:50:36 -0700 Subject: [PATCH 0929/3147] fsrepo: Refactor to extract datastore internals License: MIT Signed-off-by: Tommi Virtanen This commit was moved from ipfs/go-ipfs-routing@929e4cb9bd1d6631e0398eb50a73b93f6ea3d8f3 --- routing/dht/dht.go | 4 ++-- routing/none/none_client.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 3f50652fd9..42a68fa596 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -44,7 +44,7 @@ type IpfsDHT struct { self peer.ID // Local peer (yourself) peerstore peer.Peerstore // Peer Registry - datastore ds.ThreadSafeDatastore // Local data + datastore ds.Datastore // Local data routingTable *kb.RoutingTable // Array of routing tables for differently distanced nodes providers *ProviderManager @@ -60,7 +60,7 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *IpfsDHT { +func NewDHT(ctx context.Context, h host.Host, dstore ds.Datastore) *IpfsDHT { dht := new(IpfsDHT) dht.datastore = dstore dht.self = h.ID() diff --git a/routing/none/none_client.go b/routing/none/none_client.go index efa0b8a996..4326eb5cc3 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -47,7 +47,7 @@ func (c *nilclient) Bootstrap(_ context.Context) error { return nil } -func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.ThreadSafeDatastore) (routing.IpfsRouting, error) { +func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.Datastore) (routing.IpfsRouting, error) { return &nilclient{}, nil } From 5217a5f83817ae1045476ad2a50eb33265a6b699 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 5 Dec 2015 19:20:15 -0800 Subject: [PATCH 0930/3147] Flatten multipart file transfers License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@2768a1103ac87e5899ef71cb96be33042deb4dc5 --- mfs/ops.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/ops.go b/mfs/ops.go index ebb1932ede..fc36b2256d 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -102,7 +102,7 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // intermediary directories as needed if 'parents' is set to true func Mkdir(r *Root, pth string, parents bool) error { if pth == "" { - panic("empty path") + return nil } parts := path.SplitList(pth) if parts[0] == "" { From 6ec1eba06f0fa3072d1e30ea66b9ef746c1e130a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 16 Jul 2015 11:32:41 -0700 Subject: [PATCH 0931/3147] fixup datastore interfaces License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@7efab0d2ae34c2248dbf01260299bf9d89c9557d --- routing/none/none_client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 4326eb5cc3..6d16a88bf7 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -3,11 +3,11 @@ package nilrouting import ( "errors" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" p2phost "github.com/ipfs/go-ipfs/p2p/host" peer "github.com/ipfs/go-ipfs/p2p/peer" + repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) @@ -47,7 +47,7 @@ func (c *nilclient) Bootstrap(_ context.Context) error { return nil } -func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.Datastore) (routing.IpfsRouting, error) { +func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ repo.Datastore) (routing.IpfsRouting, error) { return &nilclient{}, nil } From f8f37e3742f3af9d5cd157ad52d67e8079ff901f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Dec 2015 07:56:19 -0800 Subject: [PATCH 0932/3147] PutNode creates intermediary nodes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@268978fe7f1a528f97b02e8f3f8f40314bed5253 --- mfs/dir.go | 4 +++- mfs/ops.go | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 43271fe490..946d9e9a4a 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -268,7 +268,9 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - return d.childDir(name) + dirobj := NewDirectory(d.ctx, name, ndir, d, d.dserv) + d.childDirs[name] = dirobj + return dirobj, nil } func (d *Directory) Unlink(name string) error { diff --git a/mfs/ops.go b/mfs/ops.go index fc36b2256d..59c6e239b1 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -116,7 +116,10 @@ func Mkdir(r *Root, pth string, parents bool) error { if len(parts) == 0 { // this will only happen on 'mkdir /' - return fmt.Errorf("cannot mkdir '%s'", pth) + if parents { + return nil + } + return fmt.Errorf("cannot create directory '/': Already exists") } cur := r.GetValue().(*Directory) From 83fe6a81b9b996d1cd7d9030dfb83cc2a80a029c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Jul 2015 10:12:27 -0700 Subject: [PATCH 0933/3147] comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@09254bf861abd403788eabaee266e5376809fa27 --- routing/supernode/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 97a5c832db..ab82ab5f15 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -18,13 +18,13 @@ import ( // Server handles routing queries using a database backend type Server struct { local peer.ID - routingBackend datastore.ThreadSafeDatastore + routingBackend datastore.Datastore peerstore peer.Peerstore *proxy.Loopback // so server can be injected into client } // NewServer creates a new Supernode routing Server -func NewServer(ds datastore.ThreadSafeDatastore, ps peer.Peerstore, local peer.ID) (*Server, error) { +func NewServer(ds datastore.Datastore, ps peer.Peerstore, local peer.ID) (*Server, error) { s := &Server{local, ds, ps, nil} s.Loopback = &proxy.Loopback{ Handler: s, From a0e02547a833fde8e43071778ebf095c8adbdfec Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0934/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@2d8f6d6e6af5cd14ca6b26f1ba904cc56364d67a --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 13797c4609..62f0d08360 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -10,8 +10,8 @@ import ( "sort" "testing" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" "github.com/ipfs/go-ipfs/path" From 0a5a624b6349823a383c4ec39c5e15ab8e582fb4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 13 Nov 2015 14:36:13 -0800 Subject: [PATCH 0935/3147] if bucket doesnt have enough peers, grab more elsewhere License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@65f87fd76a53a22391b91be03904311662871dda --- routing/kbucket/sorting.go | 4 ---- routing/kbucket/table.go | 9 ++++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 31c64591a9..875b822615 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -32,10 +32,6 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe distance: xor(target, pID), } peerArr = append(peerArr, &pd) - if e == nil { - log.Debug("list element was nil") - return peerArr - } } return peerArr } diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 044d3a2c28..d4cf051f33 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -155,9 +155,10 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { bucket = rt.Buckets[cpl] var peerArr peerSorterArr - if bucket.Len() == 0 { - // In the case of an unusual split, one bucket may be empty. - // if this happens, search both surrounding buckets for nearest peer + peerArr = copyPeersFromList(id, peerArr, bucket.list) + if len(peerArr) < count { + // In the case of an unusual split, one bucket may be short or empty. + // if this happens, search both surrounding buckets for nearby peers if cpl > 0 { plist := rt.Buckets[cpl-1].list peerArr = copyPeersFromList(id, peerArr, plist) @@ -167,8 +168,6 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { plist := rt.Buckets[cpl+1].list peerArr = copyPeersFromList(id, peerArr, plist) } - } else { - peerArr = copyPeersFromList(id, peerArr, bucket.list) } // Sort by distance to local peer From 72e8cb24c68108d0e5e068fa410b06323d1cc155 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 18 Dec 2015 21:59:21 -0800 Subject: [PATCH 0936/3147] do not hold locks for multiple filesystem nodes at the same time License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@e6bc6244063328e284e5aa92e061219b21e00a87 --- mfs/dir.go | 39 +++++++++++++++++++++++++++++---------- mfs/file.go | 44 ++++++++++++++++++++++++++++++-------------- mfs/system.go | 17 +++++++++++++++++ 3 files changed, 76 insertions(+), 24 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 946d9e9a4a..8ca79e74af 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -50,19 +50,34 @@ func NewDirectory(ctx context.Context, name string, node *dag.Node, parent child // closeChild updates the child by the given name to the dag node 'nd' // and changes its own dag node, then propogates the changes upward func (d *Directory) closeChild(name string, nd *dag.Node) error { - _, err := d.dserv.Add(nd) + mynd, err := d.closeChildUpdate(name, nd) if err != nil { return err } + return d.parent.closeChild(d.name, mynd) +} + +// closeChildUpdate is the portion of closeChild that needs to be locked around +func (d *Directory) closeChildUpdate(name string, nd *dag.Node) (*dag.Node, error) { d.lock.Lock() defer d.lock.Unlock() - err = d.updateChild(name, nd) + + err := d.updateChild(name, nd) if err != nil { - return err + return nil, err } - return d.parent.closeChild(d.name, d.node) + return d.flushCurrentNode() +} + +func (d *Directory) flushCurrentNode() (*dag.Node, error) { + _, err := d.dserv.Add(d.node) + if err != nil { + return nil, err + } + + return d.node.Copy(), nil } func (d *Directory) updateChild(name string, nd *dag.Node) error { @@ -263,7 +278,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - err = d.parent.closeChild(d.name, d.node) + err = d.flushUp() if err != nil { return nil, err } @@ -285,13 +300,18 @@ func (d *Directory) Unlink(name string) error { return err } + return d.flushUp() +} + +func (d *Directory) flushUp() error { + return d.parent.closeChild(d.name, d.node) } // AddChild adds the node 'nd' under this directory giving it the name 'name' func (d *Directory) AddChild(name string, nd *dag.Node) error { - d.Lock() - defer d.Unlock() + d.lock.Lock() + defer d.lock.Unlock() _, err := d.childUnsync(name) if err == nil { @@ -310,7 +330,6 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { d.modTime = time.Now() - //return d.parent.closeChild(d.name, d.node) return nil } @@ -353,8 +372,8 @@ func (d *Directory) sync() error { } func (d *Directory) GetNode() (*dag.Node, error) { - d.Lock() - defer d.Unlock() + d.lock.Lock() + defer d.lock.Unlock() err := d.sync() if err != nil { diff --git a/mfs/file.go b/mfs/file.go index fea1112dc3..8539a253f5 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -16,8 +16,9 @@ type File struct { name string hasChanges bool - mod *mod.DagModifier - lock sync.Mutex + dserv dag.DAGService + mod *mod.DagModifier + lock sync.Mutex } // NewFile returns a NewFile object with the given parameters @@ -28,6 +29,7 @@ func NewFile(name string, node *dag.Node, parent childCloser, dserv dag.DAGServi } return &File{ + dserv: dserv, parent: parent, name: name, mod: dmod, @@ -60,29 +62,43 @@ func (fi *File) CtxReadFull(ctx context.Context, b []byte) (int, error) { // and signals a republish to occur func (fi *File) Close() error { fi.Lock() - defer fi.Unlock() if fi.hasChanges { err := fi.mod.Sync() if err != nil { return err } - nd, err := fi.mod.GetNode() - if err != nil { - return err - } + fi.hasChanges = false + + // explicitly stay locked for flushUp call, + // it will manage the lock for us + return fi.flushUp() + } + + return nil +} +// flushUp syncs the file and adds it to the dagservice +// it *must* be called with the File's lock taken +func (fi *File) flushUp() error { + nd, err := fi.mod.GetNode() + if err != nil { fi.Unlock() - err = fi.parent.closeChild(fi.name, nd) - fi.Lock() - if err != nil { - return err - } + return err + } - fi.hasChanges = false + _, err = fi.dserv.Add(nd) + if err != nil { + fi.Unlock() + return err } - return nil + name := fi.name + parent := fi.parent + + // explicit unlock *only* before closeChild call + fi.Unlock() + return parent.closeChild(name, nd) } // Sync flushes the changes in the file to disk diff --git a/mfs/system.go b/mfs/system.go index 2cfc4e201f..d3e7052739 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -109,6 +109,23 @@ func (kr *Root) GetValue() FSNode { return kr.val } +func (kr *Root) Flush() error { + nd, err := kr.GetValue().GetNode() + if err != nil { + return err + } + + k, err := kr.dserv.Add(nd) + if err != nil { + return err + } + + if kr.repub != nil { + kr.repub.Update(k) + } + return nil +} + // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published func (kr *Root) closeChild(name string, nd *dag.Node) error { From 75201ab8397807e16ec9f1d80026f9b586f00323 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 20 May 2015 08:50:36 -0700 Subject: [PATCH 0937/3147] fsrepo: Refactor to extract datastore internals License: MIT Signed-off-by: Tommi Virtanen This commit was moved from ipfs/go-ipfs-blockstore@8aee0f54c8eb21c11872091dbf9f7076589a156e --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f2eec8cfec..4f6d89f701 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -51,7 +51,7 @@ type GCBlockstore interface { PinLock() func() } -func NewBlockstore(d ds.ThreadSafeDatastore) *blockstore { +func NewBlockstore(d ds.Datastore) *blockstore { dd := dsns.Wrap(d, BlockPrefix) return &blockstore{ datastore: dd, From 41413f005883579887ebdf9e3f7c2d5804c3dfe7 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 15 Jul 2015 08:36:48 -0700 Subject: [PATCH 0938/3147] gofmt generated assets The generated file went through some changes because of differing go-bindata versions. License: MIT Signed-off-by: Tommi Virtanen This commit was moved from ipfs/go-ipfs-pinner@930fa6c24d2b4d45cc4ff12c7b3bdd4cfc7196ee --- pinning/pinner/pin_test.go | 45 ++------------------------------------ 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index d681bb8df6..818a414ab9 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -197,18 +197,14 @@ func TestPinRecursiveFail(t *testing.T) { ctx := context.Background() dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) - bserv, err := bs.New(bstore, offline.Exchange(bstore)) - if err != nil { - t.Fatal(err) - } - + bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) p := NewPinner(dstore, dserv) a, _ := randNode() b, _ := randNode() - err = a.AddNodeLinkClean("child", b) + err := a.AddNodeLinkClean("child", b) if err != nil { t.Fatal(err) } @@ -232,40 +228,3 @@ func TestPinRecursiveFail(t *testing.T) { t.Fatal(err) } } - -func TestPinRecursiveFail(t *testing.T) { - ctx := context.Background() - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - - dserv := mdag.NewDAGService(bserv) - - p := NewPinner(dstore, dserv) - - a, _ := randNode() - b, _ := randNode() - err := a.AddNodeLinkClean("child", b) - if err != nil { - t.Fatal(err) - } - - // Note: this isnt a time based test, we expect the pin to fail - mctx, cancel := context.WithTimeout(ctx, time.Millisecond) - defer cancel() - err = p.Pin(mctx, a, true) - if err == nil { - t.Fatal("should have failed to pin here") - } - - if _, err := dserv.Add(b); err != nil { - t.Fatal(err) - } - - // this one is time based... but shouldnt cause any issues - mctx, cancel = context.WithTimeout(ctx, time.Second) - defer cancel() - if err := p.Pin(mctx, a, true); err != nil { - t.Fatal(err) - } -} From 8723b7f3df662599739e860260cb4a3bf74436dd Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 24 Nov 2015 13:59:34 +0700 Subject: [PATCH 0939/3147] strings.Split -> path.SplitList License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-routing@f1397e318370cb237bc35c5224ad8f2bee7e8cf3 --- routing/record/selection.go | 4 ++-- routing/record/validation.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/record/selection.go b/routing/record/selection.go index e90ebcd399..8e68006c17 100644 --- a/routing/record/selection.go +++ b/routing/record/selection.go @@ -2,9 +2,9 @@ package record import ( "errors" - "strings" key "github.com/ipfs/go-ipfs/blocks/key" + path "github.com/ipfs/go-ipfs/path" ) // A SelectorFunc selects the best value for the given key from @@ -18,7 +18,7 @@ func (s Selector) BestRecord(k key.Key, recs [][]byte) (int, error) { return 0, errors.New("no records given!") } - parts := strings.Split(string(k), "/") + parts := path.SplitList(string(k)) if len(parts) < 3 { log.Infof("Record key does not have selectorfunc: %s", k) return 0, errors.New("record key does not have selectorfunc") diff --git a/routing/record/validation.go b/routing/record/validation.go index f186bea903..a2afc0dfab 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -3,10 +3,10 @@ package record import ( "bytes" "errors" - "strings" key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" + path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" ) @@ -37,7 +37,7 @@ type ValidChecker struct { // It runs needed validators func (v Validator) VerifyRecord(r *pb.Record) error { // Now, check validity func - parts := strings.Split(r.GetKey(), "/") + parts := path.SplitList(r.GetKey()) if len(parts) < 3 { log.Infof("Record key does not have validator: %s", key.Key(r.GetKey())) return nil @@ -54,7 +54,7 @@ func (v Validator) VerifyRecord(r *pb.Record) error { func (v Validator) IsSigned(k key.Key) (bool, error) { // Now, check validity func - parts := strings.Split(string(k), "/") + parts := path.SplitList(string(k)) if len(parts) < 3 { log.Infof("Record key does not have validator: %s", k) return false, nil From 62683a2784525f5fe424a9ed758c5570f0ae7bc6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 18 Dec 2015 22:12:39 -0800 Subject: [PATCH 0940/3147] just flush dir in mkdir flush, not whole tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@846759c26cdc41ab262ab01199bda136bc2ccff4 --- mfs/dir.go | 20 ++++++++++++-------- mfs/ops.go | 11 +++++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 8ca79e74af..3ec39bf7d3 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -278,11 +278,6 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - err = d.flushUp() - if err != nil { - return nil, err - } - dirobj := NewDirectory(d.ctx, name, ndir, d, d.dserv) d.childDirs[name] = dirobj return dirobj, nil @@ -300,12 +295,21 @@ func (d *Directory) Unlink(name string) error { return err } - return d.flushUp() + _, err = d.dserv.Add(d.node) + if err != nil { + return err + } + + return d.parent.closeChild(d.name, d.node) } -func (d *Directory) flushUp() error { +func (d *Directory) Flush() error { + nd, err := d.flushCurrentNode() + if err != nil { + return err + } - return d.parent.closeChild(d.name, d.node) + return d.parent.closeChild(d.name, nd) } // AddChild adds the node 'nd' under this directory giving it the name 'name' diff --git a/mfs/ops.go b/mfs/ops.go index 59c6e239b1..d21f717708 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -100,7 +100,7 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // Mkdir creates a directory at 'path' under the directory 'd', creating // intermediary directories as needed if 'parents' is set to true -func Mkdir(r *Root, pth string, parents bool) error { +func Mkdir(r *Root, pth string, parents bool, flush bool) error { if pth == "" { return nil } @@ -142,13 +142,20 @@ func Mkdir(r *Root, pth string, parents bool) error { cur = next } - _, err := cur.Mkdir(parts[len(parts)-1]) + final, err := cur.Mkdir(parts[len(parts)-1]) if err != nil { if !parents || err != os.ErrExist { return err } } + if flush { + err := final.Flush() + if err != nil { + return err + } + } + return nil } From 77647e15f2c1a152d5b9b396df91b2122a362504 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 16 Jul 2015 11:32:41 -0700 Subject: [PATCH 0941/3147] fixup datastore interfaces License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@1c25f6a282b9c70e28d5f239fc1c15ea7aa1558f --- blockstore/blockstore.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 4f6d89f701..e6a13cda61 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -25,7 +25,7 @@ var ValueTypeMismatch = errors.New("The retrieved value is not a Block") var ErrNotFound = errors.New("blockstore: block not found") -// Blockstore wraps a ThreadSafeDatastore +// Blockstore wraps a Datastore type Blockstore interface { DeleteBlock(key.Key) error Has(key.Key) (bool, error) @@ -51,7 +51,7 @@ type GCBlockstore interface { PinLock() func() } -func NewBlockstore(d ds.Datastore) *blockstore { +func NewBlockstore(d ds.Batching) *blockstore { dd := dsns.Wrap(d, BlockPrefix) return &blockstore{ datastore: dd, @@ -60,8 +60,6 @@ func NewBlockstore(d ds.Datastore) *blockstore { type blockstore struct { datastore ds.Batching - // cant be ThreadSafeDatastore cause namespace.Datastore doesnt support it. - // we do check it on `NewBlockstore` though. lk sync.RWMutex } From 8d31d7556d57f5aa9ca388effca6db1c4d86f16c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 9 Sep 2015 15:02:46 -0700 Subject: [PATCH 0942/3147] Refactor ipnsfs into a more generic and well tested mfs License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@428e8f9d82305118bce843a39b31974f09e659a8 --- unixfs/format.go | 1 + unixfs/mod/dagmodifier.go | 16 +-- unixfs/mod/dagmodifier_test.go | 180 ++++++++++----------------------- 3 files changed, 55 insertions(+), 142 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index 9193ddede1..472a575e7c 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -67,6 +67,7 @@ func WrapData(b []byte) []byte { typ := pb.Data_Raw pbdata.Data = b pbdata.Type = &typ + pbdata.Filesize = proto.Uint64(uint64(len(b))) out, err := proto.Marshal(pbdata) if err != nil { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 481005c2f3..3c6a110f6f 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -15,7 +15,6 @@ import ( help "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" mdag "github.com/ipfs/go-ipfs/merkledag" - pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" @@ -36,7 +35,6 @@ var log = logging.Logger("dagio") type DagModifier struct { dagserv mdag.DAGService curNode *mdag.Node - mp pin.Pinner splitter chunk.SplitterGen ctx context.Context @@ -49,13 +47,12 @@ type DagModifier struct { read *uio.DagReader } -func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.Pinner, spl chunk.SplitterGen) (*DagModifier, error) { +func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { return &DagModifier{ curNode: from.Copy(), dagserv: serv, splitter: spl, ctx: ctx, - mp: mp, }, nil } @@ -174,7 +171,7 @@ func (dm *DagModifier) Sync() error { buflen := dm.wrBuf.Len() // Grab key for unpinning after mod operation - curk, err := dm.curNode.Key() + _, err := dm.curNode.Key() if err != nil { return err } @@ -208,15 +205,6 @@ func (dm *DagModifier) Sync() error { dm.curNode = nd } - // Finalize correct pinning, and flush pinner. - // Be careful about the order, as curk might equal thisk. - dm.mp.RemovePinWithMode(curk, pin.Recursive) - dm.mp.PinWithMode(thisk, pin.Recursive) - err = dm.mp.Flush() - if err != nil { - return err - } - dm.writeStart += uint64(buflen) dm.wrBuf = nil diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 48be0545e8..6f53a90d1e 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -4,7 +4,6 @@ import ( "fmt" "io" "io/ioutil" - "math/rand" "os" "testing" @@ -17,8 +16,6 @@ import ( h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" mdag "github.com/ipfs/go-ipfs/merkledag" - pin "github.com/ipfs/go-ipfs/pin" - gc "github.com/ipfs/go-ipfs/pin/gc" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" u "github.com/ipfs/go-ipfs/util" @@ -27,25 +24,24 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) -func getMockDagServ(t testing.TB) (mdag.DAGService, pin.Pinner) { +func getMockDagServ(t testing.TB) mdag.DAGService { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) bserv := bs.New(bstore, offline.Exchange(bstore)) - dserv := mdag.NewDAGService(bserv) - return dserv, pin.NewPinner(tsds, dserv) + return mdag.NewDAGService(bserv) } -func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.GCBlockstore, pin.Pinner) { +func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.GCBlockstore) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - return dserv, bstore, pin.NewPinner(tsds, dserv) + return dserv, bstore } -func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.Pinner) ([]byte, *mdag.Node) { +func getNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in)) if err != nil { @@ -118,12 +114,12 @@ func sizeSplitterGen(size int64) chunk.SplitterGen { } func TestDagModifierBasic(t *testing.T) { - dserv, pin := getMockDagServ(t) - b, n := getNode(t, dserv, 50000, pin) + dserv := getMockDagServ(t) + b, n := getNode(t, dserv, 50000) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pin, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -172,13 +168,13 @@ func TestDagModifierBasic(t *testing.T) { } func TestMultiWrite(t *testing.T) { - dserv, pins := getMockDagServ(t) - _, n := getNode(t, dserv, 0, pins) + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -225,13 +221,13 @@ func TestMultiWrite(t *testing.T) { } func TestMultiWriteAndFlush(t *testing.T) { - dserv, pins := getMockDagServ(t) - _, n := getNode(t, dserv, 0, pins) + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -273,13 +269,13 @@ func TestMultiWriteAndFlush(t *testing.T) { } func TestWriteNewFile(t *testing.T) { - dserv, pins := getMockDagServ(t) - _, n := getNode(t, dserv, 0, pins) + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -316,13 +312,13 @@ func TestWriteNewFile(t *testing.T) { } func TestMultiWriteCoal(t *testing.T) { - dserv, pins := getMockDagServ(t) - _, n := getNode(t, dserv, 0, pins) + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -362,13 +358,13 @@ func TestMultiWriteCoal(t *testing.T) { } func TestLargeWriteChunks(t *testing.T) { - dserv, pins := getMockDagServ(t) - _, n := getNode(t, dserv, 0, pins) + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -401,12 +397,12 @@ func TestLargeWriteChunks(t *testing.T) { } func TestDagTruncate(t *testing.T) { - dserv, pins := getMockDagServ(t) - b, n := getNode(t, dserv, 50000, pins) + dserv := getMockDagServ(t) + b, n := getNode(t, dserv, 50000) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -415,164 +411,92 @@ func TestDagTruncate(t *testing.T) { if err != nil { t.Fatal(err) } - - _, err = dagmod.Seek(0, os.SEEK_SET) + size, err := dagmod.Size() if err != nil { t.Fatal(err) } - out, err := ioutil.ReadAll(dagmod) - if err != nil { - t.Fatal(err) - } - - if err = arrComp(out, b[:12345]); err != nil { - t.Fatal(err) + if size != 12345 { + t.Fatal("size was incorrect!") } -} -func TestSparseWrite(t *testing.T) { - dserv, pins := getMockDagServ(t) - _, n := getNode(t, dserv, 0, pins) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + _, err = dagmod.Seek(0, os.SEEK_SET) if err != nil { t.Fatal(err) } - buf := make([]byte, 5000) - u.NewTimeSeededRand().Read(buf[2500:]) - - wrote, err := dagmod.WriteAt(buf[2500:], 2500) + out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) } - if wrote != 2500 { - t.Fatal("incorrect write amount") - } - - _, err = dagmod.Seek(0, os.SEEK_SET) - if err != nil { + if err = arrComp(out, b[:12345]); err != nil { t.Fatal(err) } - out, err := ioutil.ReadAll(dagmod) + err = dagmod.Truncate(10) if err != nil { t.Fatal(err) } - if err = arrComp(out, buf); err != nil { - t.Fatal(err) - } -} - -func basicGC(t *testing.T, bs blockstore.GCBlockstore, pins pin.Pinner) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() // in case error occurs during operation - out, err := gc.GC(ctx, bs, pins) + size, err = dagmod.Size() if err != nil { t.Fatal(err) } - for range out { + + if size != 10 { + t.Fatal("size was incorrect!") } } -func TestCorrectPinning(t *testing.T) { - dserv, bstore, pins := getMockDagServAndBstore(t) - b, n := getNode(t, dserv, 50000, pins) +func TestSparseWrite(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { t.Fatal(err) } - buf := make([]byte, 1024) - for i := 0; i < 100; i++ { - size, err := dagmod.Size() - if err != nil { - t.Fatal(err) - } - offset := rand.Intn(int(size)) - u.NewTimeSeededRand().Read(buf) - - if offset+len(buf) > int(size) { - b = append(b[:offset], buf...) - } else { - copy(b[offset:], buf) - } - - n, err := dagmod.WriteAt(buf, int64(offset)) - if err != nil { - t.Fatal(err) - } - if n != len(buf) { - t.Fatal("wrote incorrect number of bytes") - } - } + buf := make([]byte, 5000) + u.NewTimeSeededRand().Read(buf[2500:]) - fisize, err := dagmod.Size() + wrote, err := dagmod.WriteAt(buf[2500:], 2500) if err != nil { t.Fatal(err) } - if int(fisize) != len(b) { - t.Fatal("reported filesize incorrect", fisize, len(b)) + if wrote != 2500 { + t.Fatal("incorrect write amount") } - // Run a GC, then ensure we can still read the file correctly - basicGC(t, bstore, pins) - - nd, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - read, err := uio.NewDagReader(context.Background(), nd, dserv) + _, err = dagmod.Seek(0, os.SEEK_SET) if err != nil { t.Fatal(err) } - out, err := ioutil.ReadAll(read) + out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) } - if err = arrComp(out, b); err != nil { - t.Fatal(err) - } - - rootk, err := nd.Key() - if err != nil { + if err = arrComp(out, buf); err != nil { t.Fatal(err) } - - // Verify only one recursive pin - recpins := pins.RecursiveKeys() - if len(recpins) != 1 { - t.Fatal("Incorrect number of pinned entries") - } - - // verify the correct node is pinned - if recpins[0] != rootk { - t.Fatal("Incorrect node recursively pinned") - } - } func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() - dserv, pins := getMockDagServ(b) - _, n := getNode(b, dserv, 0, pins) + dserv := getMockDagServ(b) + _, n := getNode(b, dserv, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() wrsize := 4096 - dagmod, err := NewDagModifier(ctx, n, dserv, pins, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) if err != nil { b.Fatal(err) } From 30d6c12edd3deda5bf680d2f81c41ffa19558a74 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 20 May 2015 08:50:36 -0700 Subject: [PATCH 0943/3147] fsrepo: Refactor to extract datastore internals License: MIT Signed-off-by: Tommi Virtanen This commit was moved from ipfs/go-ipfs-pinner@59393aecc30d93681735f58c4b75145394925c36 --- pinning/pinner/pin.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 80c11d6987..41d97a1420 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -64,11 +64,11 @@ type pinner struct { // not delete them. internalPin map[key.Key]struct{} dserv mdag.DAGService - dstore ds.ThreadSafeDatastore + dstore ds.Datastore } // NewPinner creates a new pinner using the given datastore as a backend -func NewPinner(dstore ds.ThreadSafeDatastore, serv mdag.DAGService) Pinner { +func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner { // Load set from given datastore... rcset := set.NewSimpleBlockSet() @@ -207,7 +207,7 @@ func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { } // LoadPinner loads a pinner and its keysets from the given datastore -func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) { +func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) rootKeyI, err := d.Get(pinDatastoreKey) From dc45cea51aaf805d4c675d39cc19a3d946cc7ae5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 19 Nov 2015 11:24:59 -0800 Subject: [PATCH 0944/3147] send record fixes to peers who send outdated records License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@3cfc215b266d93a1142da36af395a8fcb7df869d --- routing/dht/dht.go | 4 +++- routing/dht/routing.go | 12 +++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 42a68fa596..c0b7970be5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -173,7 +173,9 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, err = dht.verifyRecordOnline(ctx, record) if err != nil { log.Info("Received invalid record! (discarded)") - return nil, nil, err + // still return a non-nil record to signify that we received + // a bad record from this peer + record = new(pb.Record) } return record, peers, nil } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index df93396ce3..0f6d50d1af 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -91,7 +91,9 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { var recs [][]byte for _, v := range vals { - recs = append(recs, v.Val) + if v.Val != nil { + recs = append(recs, v.Val) + } } i, err := dht.Selector.BestRecord(key, recs) @@ -170,6 +172,14 @@ func (dht *IpfsDHT) GetValues(ctx context.Context, key key.Key, nvals int) ([]ro rec, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { + if err == routing.ErrNotFound { + // in this case, they responded with nothing, + // still send a notification + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ + Type: notif.PeerResponse, + ID: p, + }) + } return nil, err } From b1f13b981ac61940b1e3a32db3cb304394f41ace Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 26 Dec 2015 17:24:31 -0800 Subject: [PATCH 0945/3147] add test and locking fix License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@6b725109f49241d3fb1b7ab7c7106772ccb480b0 --- mfs/dir.go | 15 ++++- mfs/mfs_test.go | 145 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 2 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 3ec39bf7d3..b714cb0935 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "os" + "path" "sync" "time" @@ -48,7 +49,7 @@ func NewDirectory(ctx context.Context, name string, node *dag.Node, parent child } // closeChild updates the child by the given name to the dag node 'nd' -// and changes its own dag node, then propogates the changes upward +// and changes its own dag node func (d *Directory) closeChild(name string, nd *dag.Node) error { mynd, err := d.closeChildUpdate(name, nd) if err != nil { @@ -300,7 +301,7 @@ func (d *Directory) Unlink(name string) error { return err } - return d.parent.closeChild(d.name, d.node) + return nil } func (d *Directory) Flush() error { @@ -375,6 +376,16 @@ func (d *Directory) sync() error { return nil } +func (d *Directory) Path() string { + cur := d + var out string + for cur != nil { + out = path.Join(cur.name, out) + cur = cur.parent.(*Directory) + } + return out +} + func (d *Directory) GetNode() (*dag.Node, error) { d.lock.Lock() defer d.lock.Unlock() diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 62f0d08360..65e1e1a84d 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -6,10 +6,12 @@ import ( "fmt" "io" "io/ioutil" + "math/rand" "os" "sort" "testing" + randbo "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/randbo" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" @@ -474,3 +476,146 @@ func TestMfsFile(t *testing.T) { t.Fatal(err) } } + +func randomWalk(d *Directory, n int) (*Directory, error) { + for i := 0; i < n; i++ { + dirents, err := d.List() + if err != nil { + return nil, err + } + + var childdirs []NodeListing + for _, child := range dirents { + if child.Type == int(TDir) { + childdirs = append(childdirs, child) + } + } + if len(childdirs) == 0 { + return d, nil + } + + next := childdirs[rand.Intn(len(childdirs))].Name + + nextD, err := d.Child(next) + if err != nil { + return nil, err + } + + d = nextD.(*Directory) + } + return d, nil +} + +func randomName() string { + set := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_" + length := rand.Intn(10) + 2 + var out string + for i := 0; i < length; i++ { + j := rand.Intn(len(set)) + out += set[j : j+1] + } + return out +} + +func actorMakeFile(d *Directory) error { + d, err := randomWalk(d, rand.Intn(7)) + if err != nil { + return err + } + + name := randomName() + f, err := NewFile(name, &dag.Node{Data: ft.FilePBData(nil, 0)}, d, d.dserv) + if err != nil { + return err + } + + r := io.LimitReader(randbo.New(), int64(77*rand.Intn(123))) + _, err = io.Copy(f, r) + if err != nil { + return err + } + + err = f.Close() + if err != nil { + return err + } + + return nil +} +func actorMkdir(d *Directory) error { + d, err := randomWalk(d, rand.Intn(7)) + if err != nil { + return err + } + + _, err = d.Mkdir(randomName()) + if err != nil { + return err + } + + return nil +} + +func actorRemoveFile(d *Directory) error { + d, err := randomWalk(d, rand.Intn(7)) + if err != nil { + return err + } + + ents, err := d.List() + if err != nil { + return err + } + + if len(ents) == 0 { + return nil + } + + re := ents[rand.Intn(len(ents))] + + return d.Unlink(re.Name) +} + +func testActor(rt *Root, iterations int, errs chan error) { + d := rt.GetValue().(*Directory) + for i := 0; i < iterations; i++ { + switch rand.Intn(4) { + case 0: + if err := actorMkdir(d); err != nil { + errs <- err + return + } + case 1, 2: + if err := actorMakeFile(d); err != nil { + errs <- err + return + } + case 3: + if err := actorRemoveFile(d); err != nil { + errs <- err + return + } + } + } + errs <- nil +} + +func TestMfsStress(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + _, rt := setupRoot(ctx, t) + + numroutines := 2 + + errs := make(chan error) + for i := 0; i < numroutines; i++ { + go testActor(rt, 50, errs) + } + + for i := 0; i < numroutines; i++ { + err := <-errs + if err != nil { + t.Fatal(err) + } + } +} From 1d3a6c86b6013ef39d3c7de03059bdf47eae86cd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Jul 2015 10:12:27 -0700 Subject: [PATCH 0946/3147] comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@9f9c117252549e39850ae69459c6ff63921b79d2 --- blockstore/blockstore.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index e6a13cda61..bc000df932 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -52,9 +52,11 @@ type GCBlockstore interface { } func NewBlockstore(d ds.Batching) *blockstore { + var dsb ds.Batching dd := dsns.Wrap(d, BlockPrefix) + dsb = dd return &blockstore{ - datastore: dd, + datastore: dsb, } } From bf307d126bbf2f6708e1932c47597c165dfb9abc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 30 Sep 2015 17:12:51 -0700 Subject: [PATCH 0947/3147] address comments from CR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@90f6f5f07669a871a585de7be87e7927d4212305 --- unixfs/mod/dagmodifier.go | 20 ++++++++++++--- unixfs/mod/dagmodifier_test.go | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 3c6a110f6f..aa4de8caf8 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -368,19 +368,31 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { return 0, err } + fisize, err := dm.Size() + if err != nil { + return 0, err + } + + var newoffset uint64 switch whence { case os.SEEK_CUR: - dm.curWrOff += uint64(offset) - dm.writeStart = dm.curWrOff + newoffset = dm.curWrOff + uint64(offset) case os.SEEK_SET: - dm.curWrOff = uint64(offset) - dm.writeStart = uint64(offset) + newoffset = uint64(offset) case os.SEEK_END: return 0, ErrSeekEndNotImpl default: return 0, ErrUnrecognizedWhence } + if offset > fisize { + if err := dm.expandSparse(offset - fisize); err != nil { + return 0, err + } + } + dm.curWrOff = newoffset + dm.writeStart = newoffset + if dm.read != nil { _, err = dm.read.Seek(offset, whence) if err != nil { diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 6f53a90d1e..f3341690c0 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -487,6 +487,53 @@ func TestSparseWrite(t *testing.T) { } } +func TestSeekPastEndWrite(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + + buf := make([]byte, 5000) + u.NewTimeSeededRand().Read(buf[2500:]) + + nseek, err := dagmod.Seek(2500, os.SEEK_SET) + if err != nil { + t.Fatal(err) + } + + if nseek != 2500 { + t.Fatal("failed to seek") + } + + wrote, err := dagmod.Write(buf[2500:]) + if err != nil { + t.Fatal(err) + } + + if wrote != 2500 { + t.Fatal("incorrect write amount") + } + + _, err = dagmod.Seek(0, os.SEEK_SET) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(dagmod) + if err != nil { + t.Fatal(err) + } + + if err = arrComp(out, buf); err != nil { + t.Fatal(err) + } +} + func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := getMockDagServ(b) From 2c7d246e5e39583903ed1bc38534d74ebb56b50c Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 17 Nov 2015 15:36:48 +0700 Subject: [PATCH 0948/3147] Replace strings.Join(elms, "/") with path.Join(elms) License: MIT Signed-off-by: rht This commit was moved from ipfs/go-path@3c97f83b1ab4187301825513c4accf2a41722689 --- path/path.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/path.go b/path/path.go index e865ba2875..b6aa187b96 100644 --- a/path/path.go +++ b/path/path.go @@ -102,3 +102,7 @@ func (p *Path) IsValid() error { _, err := ParsePath(p.String()) return err } + +func Join(pths []string) string { + return strings.Join(pths, "/") +} From cb0149c2071c690535ffc5552b66c0e5f5de9d37 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 5 Dec 2015 20:31:25 -0800 Subject: [PATCH 0949/3147] Allow for gc during adds License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@13ffb8d488b23b1c10f376407cfe390c148cd451 --- pinning/pinner/gc/gc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ec61f816a4..df9ddedc6b 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -24,7 +24,6 @@ var log = logging.Logger("gc") // deletes any block that is not found in the marked set. func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key.Key, error) { unlock := bs.GCLock() - defer unlock() bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) @@ -42,6 +41,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. output := make(chan key.Key) go func() { defer close(output) + defer unlock() for { select { case k, ok := <-keychan: From eadca4f99956a3f247733ab4070199e6cc499d5a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 20 Nov 2015 11:12:14 -0800 Subject: [PATCH 0950/3147] return sentinel error for invalid records License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@dc331e4c635216a289dfd5e69df182b0c3942b14 --- routing/dht/dht.go | 8 +++++--- routing/dht/routing.go | 25 +++++++++++++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index c0b7970be5..015b77805a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -150,6 +150,8 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, skey string) err return nil } +var errInvalidRecord = errors.New("received invalid record") + // getValueOrPeers queries a particular peer p for the value for // key. It returns either the value or a list of closer peers. // NOTE: it will update the dht's peerstore with any new addresses @@ -173,11 +175,11 @@ func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, err = dht.verifyRecordOnline(ctx, record) if err != nil { log.Info("Received invalid record! (discarded)") - // still return a non-nil record to signify that we received - // a bad record from this peer + // return a sentinal to signify an invalid record was received + err = errInvalidRecord record = new(pb.Record) } - return record, peers, nil + return record, peers, err } if len(peers) > 0 { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 0f6d50d1af..627c936078 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -171,21 +171,26 @@ func (dht *IpfsDHT) GetValues(ctx context.Context, key key.Key, nvals int) ([]ro }) rec, peers, err := dht.getValueOrPeers(ctx, p, key) - if err != nil { - if err == routing.ErrNotFound { - // in this case, they responded with nothing, - // still send a notification - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, - ID: p, - }) - } + switch err { + case routing.ErrNotFound: + // in this case, they responded with nothing, + // still send a notification so listeners can know the + // request has completed 'successfully' + notif.PublishQueryEvent(parent, ¬if.QueryEvent{ + Type: notif.PeerResponse, + ID: p, + }) + return nil, err + default: return nil, err + + case nil, errInvalidRecord: + // in either of these cases, we want to keep going } res := &dhtQueryResult{closerPeers: peers} - if rec.GetValue() != nil { + if rec.GetValue() != nil || err == errInvalidRecord { rv := routing.RecvdVal{ Val: rec.GetValue(), From: p, From 87ef7c12bb1430ef3ba7a665cc2aad78b56ea1c5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 13:26:33 -0800 Subject: [PATCH 0951/3147] fix shared node reference issue License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@d004e9fa8df6f3a14ce7beb042bbc8430a5052c2 --- mfs/dir.go | 6 ++--- mfs/file.go | 9 +++++--- mfs/mfs_test.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++-- mfs/ops.go | 10 ++++----- 4 files changed, 72 insertions(+), 13 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index b714cb0935..649bcb88d2 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -258,9 +258,9 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { d.lock.Lock() defer d.lock.Unlock() - _, err := d.childDir(name) + child, err := d.childDir(name) if err == nil { - return nil, os.ErrExist + return child, os.ErrExist } _, err = d.childFile(name) if err == nil { @@ -395,7 +395,7 @@ func (d *Directory) GetNode() (*dag.Node, error) { return nil, err } - return d.node, nil + return d.node.Copy(), nil } func (d *Directory) Lock() { diff --git a/mfs/file.go b/mfs/file.go index 8539a253f5..15aecb805e 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -65,6 +65,7 @@ func (fi *File) Close() error { if fi.hasChanges { err := fi.mod.Sync() if err != nil { + fi.Unlock() return err } @@ -74,6 +75,7 @@ func (fi *File) Close() error { // it will manage the lock for us return fi.flushUp() } + fi.Unlock() return nil } @@ -93,12 +95,13 @@ func (fi *File) flushUp() error { return err } - name := fi.name - parent := fi.parent + //name := fi.name + //parent := fi.parent // explicit unlock *only* before closeChild call fi.Unlock() - return parent.closeChild(name, nd) + return nil + //return parent.closeChild(name, nd) } // Sync flushes the changes in the file to disk diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 65e1e1a84d..ff6c9d03c6 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -576,10 +576,56 @@ func actorRemoveFile(d *Directory) error { return d.Unlink(re.Name) } +func actorReadFile(d *Directory) error { + d, err := randomWalk(d, rand.Intn(6)) + if err != nil { + return err + } + + ents, err := d.List() + if err != nil { + return err + } + + var files []string + for _, e := range ents { + if e.Type == int(TFile) { + files = append(files, e.Name) + } + } + + if len(files) == 0 { + return nil + } + + fname := files[rand.Intn(len(files))] + fsn, err := d.Child(fname) + if err != nil { + return err + } + + fi, ok := fsn.(*File) + if !ok { + return errors.New("file wasnt a file, race?") + } + + _, err = fi.Size() + if err != nil { + return err + } + + _, err = ioutil.ReadAll(fi) + if err != nil { + return err + } + + return fi.Close() +} + func testActor(rt *Root, iterations int, errs chan error) { d := rt.GetValue().(*Directory) for i := 0; i < iterations; i++ { - switch rand.Intn(4) { + switch rand.Intn(5) { case 0: if err := actorMkdir(d); err != nil { errs <- err @@ -591,10 +637,20 @@ func testActor(rt *Root, iterations int, errs chan error) { return } case 3: + continue + // randomly deleting things + // doesnt really give us any sort of useful test results. + // you will never have this in a real environment where + // you expect anything productive to happen... if err := actorRemoveFile(d); err != nil { errs <- err return } + case 4: + if err := actorReadFile(d); err != nil { + errs <- err + return + } } } errs <- nil @@ -605,7 +661,7 @@ func TestMfsStress(t *testing.T) { defer cancel() _, rt := setupRoot(ctx, t) - numroutines := 2 + numroutines := 10 errs := make(chan error) for i := 0; i < numroutines; i++ { diff --git a/mfs/ops.go b/mfs/ops.go index d21f717708..75c5d6a844 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -99,8 +99,8 @@ func PutNode(r *Root, path string, nd *dag.Node) error { } // Mkdir creates a directory at 'path' under the directory 'd', creating -// intermediary directories as needed if 'parents' is set to true -func Mkdir(r *Root, pth string, parents bool, flush bool) error { +// intermediary directories as needed if 'mkparents' is set to true +func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { if pth == "" { return nil } @@ -116,7 +116,7 @@ func Mkdir(r *Root, pth string, parents bool, flush bool) error { if len(parts) == 0 { // this will only happen on 'mkdir /' - if parents { + if mkparents { return nil } return fmt.Errorf("cannot create directory '/': Already exists") @@ -125,7 +125,7 @@ func Mkdir(r *Root, pth string, parents bool, flush bool) error { cur := r.GetValue().(*Directory) for i, d := range parts[:len(parts)-1] { fsn, err := cur.Child(d) - if err == os.ErrNotExist && parents { + if err == os.ErrNotExist && mkparents { mkd, err := cur.Mkdir(d) if err != nil { return err @@ -144,7 +144,7 @@ func Mkdir(r *Root, pth string, parents bool, flush bool) error { final, err := cur.Mkdir(parts[len(parts)-1]) if err != nil { - if !parents || err != os.ErrExist { + if !mkparents || err != os.ErrExist || final == nil { return err } } From 546cfe3e05d1804017da36b696fc162103503799 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 5 Dec 2015 20:31:25 -0800 Subject: [PATCH 0952/3147] Allow for gc during adds License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@05437d567d4c32daa9f78e53dcb5bef3d58a0dcd --- blockstore/blockstore.go | 15 ++++++++++++++- blockstore/write_cache.go | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index bc000df932..59f0f2c72c 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -5,6 +5,7 @@ package blockstore import ( "errors" "sync" + "sync/atomic" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" @@ -49,6 +50,10 @@ type GCBlockstore interface { // at the same time, but no GC should not happen simulatenously. // Reading during Pinning is safe, and requires no lock. PinLock() func() + + // GcRequested returns true if GCLock has been called and is waiting to + // take the lock + GCRequested() bool } func NewBlockstore(d ds.Batching) *blockstore { @@ -63,7 +68,9 @@ func NewBlockstore(d ds.Batching) *blockstore { type blockstore struct { datastore ds.Batching - lk sync.RWMutex + lk sync.RWMutex + gcreq int32 + gcreqlk sync.Mutex } func (bs *blockstore) Get(k key.Key) (*blocks.Block, error) { @@ -192,7 +199,9 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { } func (bs *blockstore) GCLock() func() { + atomic.AddInt32(&bs.gcreq, 1) bs.lk.Lock() + atomic.AddInt32(&bs.gcreq, -1) return bs.lk.Unlock } @@ -200,3 +209,7 @@ func (bs *blockstore) PinLock() func() { bs.lk.RLock() return bs.lk.RUnlock } + +func (bs *blockstore) GCRequested() bool { + return atomic.LoadInt32(&bs.gcreq) > 0 +} diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 52af696e4a..73a7813f5a 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -66,3 +66,7 @@ func (w *writecache) GCLock() func() { func (w *writecache) PinLock() func() { return w.blockstore.(GCBlockstore).PinLock() } + +func (w *writecache) GCRequested() bool { + return w.blockstore.(GCBlockstore).GCRequested() +} From 636da38b157e991293639f11fe96525f72774b3a Mon Sep 17 00:00:00 2001 From: rht Date: Sun, 15 Nov 2015 18:50:05 +0700 Subject: [PATCH 0953/3147] Remove chunk channels License: MIT Signed-off-by: rht This commit was moved from ipfs/go-unixfs@222445c94734cc698b0e817ceeaa1d415106a7bb --- unixfs/mod/dagmodifier.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index aa4de8caf8..197e330a9c 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -103,8 +103,7 @@ func (zr zeroReader) Read(b []byte) (int, error) { func (dm *DagModifier) expandSparse(size int64) error { r := io.LimitReader(zeroReader{}, size) spl := chunk.NewSizeSplitter(r, 4096) - blks, errs := chunk.Chan(spl) - nnode, err := dm.appendData(dm.curNode, blks, errs) + nnode, err := dm.appendData(dm.curNode, spl) if err != nil { return err } @@ -191,8 +190,7 @@ func (dm *DagModifier) Sync() error { // need to write past end of current dag if !done { - blks, errs := chunk.Chan(dm.splitter(dm.wrBuf)) - nd, err = dm.appendData(dm.curNode, blks, errs) + nd, err = dm.appendData(dm.curNode, dm.splitter(dm.wrBuf)) if err != nil { return err } @@ -286,13 +284,13 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) } // appendData appends the blocks from the given chan to the end of this dag -func (dm *DagModifier) appendData(node *mdag.Node, blks <-chan []byte, errs <-chan error) (*mdag.Node, error) { +func (dm *DagModifier) appendData(node *mdag.Node, spl chunk.Splitter) (*mdag.Node, error) { dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, } - return trickle.TrickleAppend(dm.ctx, node, dbp.New(blks, errs)) + return trickle.TrickleAppend(dm.ctx, node, dbp.New(spl)) } // Read data from this dag starting at the current offset From 3c23819650308e75105898b8a9697ef0ed8c6aad Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0954/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@a70bed6d2168493510593987506475d1ddfb55bf --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 4c9868b577..6dea9864e6 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -4,7 +4,7 @@ import ( "strings" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" diff --git a/namesys/publisher.go b/namesys/publisher.go index 78d7bb37cc..1197d7217f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,7 +7,7 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index b633f454c3..11b47d0f1e 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -14,7 +14,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 11145ff019..219efda0f2 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" From 1cc66466500b7a48af5e4cecc070f3a446a14c9a Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 24 Nov 2015 13:59:34 +0700 Subject: [PATCH 0955/3147] strings.Split -> path.SplitList License: MIT Signed-off-by: rht This commit was moved from ipfs/go-path@4db917b82da5715df10d32eced55a3068806ff77 --- path/path.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/path.go b/path/path.go index b6aa187b96..6f14f90163 100644 --- a/path/path.go +++ b/path/path.go @@ -106,3 +106,7 @@ func (p *Path) IsValid() error { func Join(pths []string) string { return strings.Join(pths, "/") } + +func SplitList(pth string) []string { + return strings.Split(pth, "/") +} From 94f9bdde45acd92fb85a05cd878eb4f29ea8b537 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0956/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@c6b8993011c9b2c258925fe10cd7c7d8aba1f7b1 --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 41d97a1420..4cb2b2c68b 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -7,7 +7,7 @@ import ( "sync" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 818a414ab9..9356d3101c 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -6,8 +6,8 @@ import ( context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" bs "github.com/ipfs/go-ipfs/blockservice" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index a487449396..b076c41466 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -4,8 +4,8 @@ import ( "testing" "testing/quick" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/key" From 82885735d3320ff349eaf513f76a35057ddf6153 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0957/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@2b2d7ad3258acbb95bf381180549611e57739de6 --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 4 ++-- routing/dht/handlers.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 015b77805a..31979aa8b8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -21,7 +21,7 @@ import ( logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index c09871610f..32560c59f8 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 710a9afca1..a770a0962d 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -8,8 +8,8 @@ import ( "time" ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 6fa4d3f9b3..121f7623b1 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -6,7 +6,7 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index e7aa44968f..f360f9a8ae 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -5,7 +5,7 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index a62f64f8d7..075750c3ad 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -5,7 +5,7 @@ import ( "sync" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index df8d7cdfc7..fc3b876e7f 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -1,8 +1,8 @@ package mockrouting import ( - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" dht "github.com/ipfs/go-ipfs/routing/dht" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index f18e387d87..b16b99046f 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,7 +5,7 @@ package mockrouting import ( - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 54f2bb87f2..83775566c8 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -5,7 +5,7 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/p2p/crypto" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index ab82ab5f15..32a69ead55 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -5,7 +5,7 @@ import ( "fmt" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index d8ea8ea4ee..ea3ead0c24 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" ) From 9f2e80098ad3396e2b9848d239f0385237b375da Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0958/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@9af99e6a443adf8beb10a31990c44079e3f23d28 --- blockservice/test/blocks_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 6ba5eb40ff..8b56753ad5 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" From d5edab62ed63b8425a2f24bb3082a342dc056696 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Jan 2016 04:15:25 -0800 Subject: [PATCH 0959/3147] a small amount of cleanup in mfs dir License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@b712a6fe7e95f9965aa3d37d29a3dcfe8cdefd15 --- mfs/dir.go | 68 +++++++++++++----------------------------------------- 1 file changed, 16 insertions(+), 52 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 649bcb88d2..15b4ea777e 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -101,45 +101,6 @@ func (d *Directory) Type() NodeType { return TDir } -// childFile returns a file under this directory by the given name if it exists -func (d *Directory) childFile(name string) (*File, error) { - fi, ok := d.files[name] - if ok { - return fi, nil - } - - fsn, err := d.childNode(name) - if err != nil { - return nil, err - } - - if fi, ok := fsn.(*File); ok { - return fi, nil - } - - return nil, fmt.Errorf("%s is not a file", name) -} - -// childDir returns a directory under this directory by the given name if it -// exists. -func (d *Directory) childDir(name string) (*Directory, error) { - dir, ok := d.childDirs[name] - if ok { - return dir, nil - } - - fsn, err := d.childNode(name) - if err != nil { - return nil, err - } - - if dir, ok := fsn.(*Directory); ok { - return dir, nil - } - - return nil, fmt.Errorf("%s is not a directory", name) -} - // childNode returns a FSNode under this directory by the given name if it exists. // it does *not* check the cached dirs and files func (d *Directory) childNode(name string) (FSNode, error) { @@ -172,6 +133,13 @@ func (d *Directory) childNode(name string) (FSNode, error) { } } +// Child returns the child of this directory by the given name +func (d *Directory) Child(name string) (FSNode, error) { + d.lock.Lock() + defer d.lock.Unlock() + return d.childUnsync(name) +} + // childFromDag searches through this directories dag node for a child link // with the given name func (d *Directory) childFromDag(name string) (*dag.Node, error) { @@ -184,13 +152,6 @@ func (d *Directory) childFromDag(name string) (*dag.Node, error) { return nil, os.ErrNotExist } -// Child returns the child of this directory by the given name -func (d *Directory) Child(name string) (FSNode, error) { - d.lock.Lock() - defer d.lock.Unlock() - return d.childUnsync(name) -} - // childUnsync returns the child under this directory by the given name // without locking, useful for operations which already hold a lock func (d *Directory) childUnsync(name string) (FSNode, error) { @@ -258,13 +219,16 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { d.lock.Lock() defer d.lock.Unlock() - child, err := d.childDir(name) - if err == nil { - return child, os.ErrExist - } - _, err = d.childFile(name) + fsn, err := d.childUnsync(name) if err == nil { - return nil, os.ErrExist + switch fsn := fsn.(type) { + case *Directory: + return fsn, os.ErrExist + case *File: + return nil, os.ErrExist + default: + return nil, fmt.Errorf("unrecognized type: %#v", fsn) + } } ndir := &dag.Node{Data: ft.FolderPBData()} From 12a27d8c16d7df59de55a3ab7f07197bb687b5a7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0960/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@00b55617867f5655b3fcf54a080f6d6ce43de5d6 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index dc00716064..0a4787f071 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -3,8 +3,8 @@ package offline import ( "testing" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" From a448b2d693e60c2e302374ecee47096f2a202aa7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0961/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@a2b4f8b19f5c3568878f18197b14ab422435b2bd --- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/write_cache_test.go | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 59f0f2c72c..342bbc72db 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -7,9 +7,9 @@ import ( "sync" "sync/atomic" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/namespace" - dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/namespace" + dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 934c7933e7..9c535b9d8e 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,9 +5,9 @@ import ( "fmt" "testing" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" - ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" + ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" blocks "github.com/ipfs/go-ipfs/blocks" diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index a51d2f7c66..97bf86b127 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -3,9 +3,9 @@ package blockstore import ( "testing" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query" - syncds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" + syncds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks" ) From eb213d26d470419e3dd9ec65ac24180624f9a9c5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 2 Jan 2016 17:56:42 -0800 Subject: [PATCH 0962/3147] vendor in new go-datastore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@02b3c19108b43f177000cd8d08db69b02176c0e2 --- unixfs/mod/dagmodifier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index f3341690c0..16f7dca337 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -7,7 +7,7 @@ import ( "os" "testing" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" @@ -20,7 +20,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "github.com/ipfs/go-ipfs/util" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ) From 66d84e35733c0248ed365b68a32492d4d77dbfda Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 13 Jan 2016 11:03:09 -0800 Subject: [PATCH 0963/3147] do resolve operations concurrently License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@a1e80e7e955284328ad2f46d44f57b8a83a7225b --- namesys/routing.go | 51 +++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index 5f9e3bc87e..a288f75576 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -11,6 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" + ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" @@ -123,32 +124,50 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa hash, err := mh.FromB58String(name) if err != nil { + // name should be a multihash. if it isn't, error out here. log.Warningf("RoutingResolve: bad input hash: [%s]\n", name) return "", err } - // name should be a multihash. if it isn't, error out here. // use the routing system to get the name. // /ipns/ h := []byte("/ipns/" + string(hash)) - ipnsKey := key.Key(h) - val, err := r.routing.GetValue(ctx, ipnsKey) - if err != nil { - log.Warning("RoutingResolve get failed.") - return "", err - } + var entry *pb.IpnsEntry + var pubkey ci.PubKey - entry := new(pb.IpnsEntry) - err = proto.Unmarshal(val, entry) - if err != nil { - return "", err - } + resp := make(chan error, 2) + go func() { + ipnsKey := key.Key(h) + val, err := r.routing.GetValue(ctx, ipnsKey) + if err != nil { + log.Warning("RoutingResolve get failed.") + resp <- err + } - // name should be a public key retrievable from ipfs - pubkey, err := routing.GetPublicKey(r.routing, ctx, hash) - if err != nil { - return "", err + entry = new(pb.IpnsEntry) + err = proto.Unmarshal(val, entry) + if err != nil { + resp <- err + } + resp <- nil + }() + + go func() { + // name should be a public key retrievable from ipfs + pubk, err := routing.GetPublicKey(r.routing, ctx, hash) + if err != nil { + resp <- err + } + pubkey = pubk + resp <- nil + }() + + for i := 0; i < 2; i++ { + err = <-resp + if err != nil { + return "", err + } } hsh, _ := pubkey.Hash() From f2885663bc60f2e120ecae96353d1f0bf20cac1f Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Sat, 16 Jan 2016 03:10:28 +0100 Subject: [PATCH 0964/3147] Implements path.IsJustAKey(). License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-path@1de11497ec351d161ec064f9ea349608895fe653 --- path/path.go | 6 ++++++ path/path_test.go | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/path/path.go b/path/path.go index 6f14f90163..dc2d5d1de3 100644 --- a/path/path.go +++ b/path/path.go @@ -44,6 +44,12 @@ func (p Path) String() string { return string(p) } +// IsJustAKey returns true if the path is of the form or /ipfs/. +func (p Path) IsJustAKey() bool { + parts := p.Segments() + return (len(parts) == 2 && parts[0] == "ipfs") +} + func FromSegments(prefix string, seg ...string) (Path, error) { return ParsePath(prefix + strings.Join(seg, "/")) } diff --git a/path/path_test.go b/path/path_test.go index f800e19e71..464cd419a9 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -28,3 +28,23 @@ func TestPathParsing(t *testing.T) { } } } + +func TestIsJustAKey(t *testing.T) { + cases := map[string]bool{ + "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": false, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": false, + } + + for p, expected := range cases { + path, err := ParsePath(p) + if err != nil { + t.Fatalf("ParsePath failed to parse \"%s\", but should have succeeded", p) + } + result := path.IsJustAKey() + if result != expected { + t.Fatalf("expected IsJustAKey(%s) to return %v, not %v", p, expected, result) + } + } +} From f06f1e8883a0ac8a3754bcdfe0c146f0d73e350b Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sat, 16 Jan 2016 14:37:04 +0100 Subject: [PATCH 0965/3147] pin/pin: replace isPinned() with isPinnedWithType() It is more generic to be able to pass a pin type argument. License: MIT Signed-off-by: Christian Couder This commit was moved from ipfs/go-ipfs-pinner@cd06a2f13a7ae9e1cfc9509b3d4703e0faf6571d --- pinning/pinner/pin.go | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4cb2b2c68b..86b0d58daa 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -36,6 +36,7 @@ const ( type Pinner interface { IsPinned(key.Key) (string, bool, error) + IsPinnedWithType(key.Key, string) (string, bool, error) Pin(context.Context, *mdag.Node, bool) error Unpin(context.Context, key.Key, bool) error @@ -126,7 +127,7 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() - reason, pinned, err := p.isPinned(k) + reason, pinned, err := p.isPinnedWithType(k, "all") if err != nil { return err } @@ -159,22 +160,46 @@ func (p *pinner) isInternalPin(key key.Key) bool { func (p *pinner) IsPinned(k key.Key) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.isPinned(k) + return p.isPinnedWithType(k, "all") } -// isPinned is the implementation of IsPinned that does not lock. +func (p *pinner) IsPinnedWithType(k key.Key, typeStr string) (string, bool, error) { + p.lock.RLock() + defer p.lock.RUnlock() + return p.isPinnedWithType(k, typeStr) +} + +// isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // intended for use by other pinned methods that already take locks -func (p *pinner) isPinned(k key.Key) (string, bool, error) { - if p.recursePin.HasKey(k) { +func (p *pinner) isPinnedWithType(k key.Key, typeStr string) (string, bool, error) { + switch typeStr { + case "all", "direct", "indirect", "recursive", "internal": + default: + err := fmt.Errorf("Invalid type '%s', must be one of {direct, indirect, recursive, internal, all}", typeStr) + return "", false, err + } + if (typeStr == "recursive" || typeStr == "all") && p.recursePin.HasKey(k) { return "recursive", true, nil } - if p.directPin.HasKey(k) { + if typeStr == "recursive" { + return "", false, nil + } + + if (typeStr == "direct" || typeStr == "all") && p.directPin.HasKey(k) { return "direct", true, nil } - if p.isInternalPin(k) { + if typeStr == "direct" { + return "", false, nil + } + + if (typeStr == "internal" || typeStr == "all") && p.isInternalPin(k) { return "internal", true, nil } + if typeStr == "internal" { + return "", false, nil + } + // Default is "indirect" for _, rk := range p.recursePin.GetKeys() { rnd, err := p.dserv.Get(context.Background(), rk) if err != nil { From 5ce8b9402afe50fca8f8e423c309a2da35febd02 Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Thu, 21 Jan 2016 16:38:16 +0100 Subject: [PATCH 0966/3147] wip License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-path@376fb073f33f409f2755f8736b35c2c54e44024d --- path/path_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/path/path_test.go b/path/path_test.go index 464cd419a9..33b93a3a01 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -35,6 +35,7 @@ func TestIsJustAKey(t *testing.T) { "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": false, "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": false, + "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": false, } for p, expected := range cases { From 6213c349215b2ab5c7f80c11e1c85da2da1947cc Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Sun, 24 Jan 2016 23:29:41 -0800 Subject: [PATCH 0967/3147] Implements Path.PopLastSegment(). This allows a path (/ipfs/foo/bar) to be separated between its head (/ipfs/foo) and its tail (bar). License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-path@b38fdfea328e74fc610275f2e09c3ab4a3db25a2 --- path/path.go | 18 ++++++++++++++++++ path/path_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/path/path.go b/path/path.go index dc2d5d1de3..0891e84668 100644 --- a/path/path.go +++ b/path/path.go @@ -50,6 +50,24 @@ func (p Path) IsJustAKey() bool { return (len(parts) == 2 && parts[0] == "ipfs") } +// PopLastSegment returns a new Path without its final segment, and the final +// segment, separately. If there is no more to pop (the path is just a key), +// the original path is returned. +func (p Path) PopLastSegment() (Path, string, error) { + + if p.IsJustAKey() { + return p, "", nil + } + + segs := p.Segments() + newPath, err := ParsePath("/" + strings.Join(segs[:len(segs)-1], "/")) + if err != nil { + return "", "", err + } + + return newPath, segs[len(segs)-1], nil +} + func FromSegments(prefix string, seg ...string) (Path, error) { return ParsePath(prefix + strings.Join(seg, "/")) } diff --git a/path/path_test.go b/path/path_test.go index 33b93a3a01..a718bd81f1 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -49,3 +49,31 @@ func TestIsJustAKey(t *testing.T) { } } } + +func TestPopLastSegment(t *testing.T) { + cases := map[string][]string{ + "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", ""}, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", ""}, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", "a"}, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a", "b"}, + "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y/z": []string{"/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y", "z"}, + } + + for p, expected := range cases { + path, err := ParsePath(p) + if err != nil { + t.Fatalf("ParsePath failed to parse \"%s\", but should have succeeded", p) + } + head, tail, err := path.PopLastSegment() + if err != nil { + t.Fatalf("PopLastSegment failed, but should have succeeded: %s", err) + } + headStr := head.String() + if headStr != expected[0] { + t.Fatalf("expected head of PopLastSegment(%s) to return %v, not %v", p, expected[0], headStr) + } + if tail != expected[1] { + t.Fatalf("expected tail of PopLastSegment(%s) to return %v, not %v", p, expected[1], tail) + } + } +} From 1dc3403c0dfd04e8e86ab085f6eadaf983499058 Mon Sep 17 00:00:00 2001 From: Kubuxu Date: Mon, 11 Jan 2016 16:01:09 +0100 Subject: [PATCH 0968/3147] Make dns resolve paths under _dnslink. Thus allowing to CNAME main site entry to gateway and stil specify dnslink. License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@df674f0d508fa9446cffb7b2ac476f0ca0502db5 --- namesys/dns.go | 63 ++++++++++++++++++++++++++++++++++++++------- namesys/dns_test.go | 28 ++++++++++++++++++++ 2 files changed, 81 insertions(+), 10 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 96147534a8..a02a73ad8c 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -41,33 +41,76 @@ func (r *DNSResolver) ResolveN(ctx context.Context, name string, depth int) (pat return resolve(ctx, r, name, depth, "/ipns/") } +type lookupRes struct { + path path.Path + error error +} + // resolveOnce implements resolver. // TXT records for a given domain name should contain a b58 // encoded multihash. func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { segments := strings.SplitN(name, "/", 2) + domain := segments[0] - if !isd.IsDomain(segments[0]) { + if !isd.IsDomain(domain) { return "", errors.New("not a valid domain name") } + log.Infof("DNSResolver resolving %s", domain) + + rootChan := make(chan lookupRes, 1) + go workDomain(r, domain, rootChan) + + subChan := make(chan lookupRes, 1) + go workDomain(r, "_dnslink."+domain, subChan) + + var subRes lookupRes + select { + case subRes = <-subChan: + case <-ctx.Done(): + return "", ctx.Err() + } + + var p path.Path + if subRes.error == nil { + p = subRes.path + } else { + var rootRes lookupRes + select { + case rootRes = <-rootChan: + case <-ctx.Done(): + return "", ctx.Err() + } + if rootRes.error == nil { + p = rootRes.path + } else { + return "", ErrResolveFailed + } + } + if len(segments) > 1 { + return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[1]) + } else { + return p, nil + } +} + +func workDomain(r *DNSResolver, name string, res chan lookupRes) { + txt, err := r.lookupTXT(name) - log.Infof("DNSResolver resolving %s", segments[0]) - txt, err := r.lookupTXT(segments[0]) if err != nil { - return "", err + // Error is != nil + res <- lookupRes{"", err} + return } for _, t := range txt { p, err := parseEntry(t) if err == nil { - if len(segments) > 1 { - return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[1]) - } - return p, nil + res <- lookupRes{p, nil} + return } } - - return "", ErrResolveFailed + res <- lookupRes{"", ErrResolveFailed} } func parseEntry(txt string) (path.Path, error) { diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 27b3883db7..9b11845ac1 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -65,6 +65,9 @@ func newMockDNS() *mockDNS { "ipfs.example.com": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, + "_dnslink.dipfs.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + }, "dns1.example.com": []string{ "dnslink=/ipns/ipfs.example.com", }, @@ -85,6 +88,12 @@ func newMockDNS() *mockDNS { "loop2.example.com": []string{ "dnslink=/ipns/loop1.example.com", }, + "_dnslink.dloop1.example.com": []string{ + "dnslink=/ipns/loop2.example.com", + }, + "_dnslink.dloop2.example.com": []string{ + "dnslink=/ipns/loop1.example.com", + }, "bad.example.com": []string{ "dnslink=", }, @@ -100,6 +109,18 @@ func newMockDNS() *mockDNS { "withtrailingrec.example.com": []string{ "dnslink=/ipns/withtrailing.example.com/segment/", }, + "double.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + }, + "_dnslink.double.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + }, + "double.conflict.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", + }, + "_dnslink.conflict.example.com": []string{ + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", + }, }, } } @@ -109,6 +130,7 @@ func TestDNSResolution(t *testing.T) { r := &DNSResolver{lookupTXT: mock.lookupTXT} testResolution(t, r, "multihash.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "ipfs.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "dipfs.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "dns1.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "dns1.example.com", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) testResolution(t, r, "dns2.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) @@ -122,6 +144,10 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "loop1.example.com", 2, "/ipns/loop1.example.com", ErrResolveRecursion) testResolution(t, r, "loop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion) testResolution(t, r, "loop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) + testResolution(t, r, "dloop1.example.com", 1, "/ipns/loop2.example.com", ErrResolveRecursion) + testResolution(t, r, "dloop1.example.com", 2, "/ipns/loop1.example.com", ErrResolveRecursion) + testResolution(t, r, "dloop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion) + testResolution(t, r, "dloop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed) testResolution(t, r, "withsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", nil) testResolution(t, r, "withrecsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub", nil) @@ -129,4 +155,6 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "withrecsegment.example.com/test2", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test2", nil) testResolution(t, r, "withrecsegment.example.com/test3/", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test3/", nil) testResolution(t, r, "withtrailingrec.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/", nil) + testResolution(t, r, "double.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "conflict.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", nil) } From b5aa5583f8ed8b43a7a523c418261fead1c821ef Mon Sep 17 00:00:00 2001 From: rht Date: Thu, 21 Jan 2016 14:40:15 +0700 Subject: [PATCH 0969/3147] Wire ctx to getdag operations in gc.GC License: MIT Signed-off-by: rht This commit was moved from ipfs/go-ipfs-pinner@51084f5ddca1274e0f2d0c4c3d6dff76e5921649 --- pinning/pinner/gc/gc.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index df9ddedc6b..5cf35fb7e8 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -28,7 +28,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) - gcs, err := ColoredSet(pn, ds) + gcs, err := ColoredSet(ctx, pn, ds) if err != nil { return nil, err } @@ -69,16 +69,16 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. return output, nil } -func Descendants(ds dag.DAGService, set key.KeySet, roots []key.Key) error { +func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []key.Key) error { for _, k := range roots { set.Add(k) - nd, err := ds.Get(context.Background(), k) + nd, err := ds.Get(ctx, k) if err != nil { return err } // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(context.Background(), ds, nd, set) + err = dag.EnumerateChildren(ctx, ds, nd, set) if err != nil { return err } @@ -87,11 +87,11 @@ func Descendants(ds dag.DAGService, set key.KeySet, roots []key.Key) error { return nil } -func ColoredSet(pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := key.NewKeySet() - err := Descendants(ds, gcs, pn.RecursiveKeys()) + err := Descendants(ctx, ds, gcs, pn.RecursiveKeys()) if err != nil { return nil, err } @@ -100,7 +100,7 @@ func ColoredSet(pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) { gcs.Add(k) } - err = Descendants(ds, gcs, pn.InternalPins()) + err = Descendants(ctx, ds, gcs, pn.InternalPins()) if err != nil { return nil, err } From f0eb4aa81ce6357faa79778cb2dadbf40f6def3c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0970/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@20a6e66f4b5fdfd6ecc7f896aa6ff218bc0c8eb3 --- namesys/base.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 2 +- namesys/proquint.go | 2 +- namesys/publisher.go | 6 +++--- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 6 +++--- 12 files changed, 23 insertions(+), 23 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index e552fce464..569cb4bb37 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -3,7 +3,7 @@ package namesys import ( "strings" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" ) diff --git a/namesys/dns.go b/namesys/dns.go index 96147534a8..5ddd57f4ef 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,7 +6,7 @@ import ( "strings" isd "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" ) diff --git a/namesys/interface.go b/namesys/interface.go index 09c296c23a..404274bfaf 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -33,9 +33,9 @@ import ( "errors" "time" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ci "github.com/ipfs/go-ipfs/p2p/crypto" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index ebd81e86d6..5ce96cb141 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -9,9 +9,9 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" pb "github.com/ipfs/go-ipfs/namesys/pb" - ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" u "github.com/ipfs/go-ipfs/util" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 6dea9864e6..a89abdcdfa 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,10 +5,10 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ci "github.com/ipfs/go-ipfs/p2p/crypto" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 256228c3e6..f44f17ef5a 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index 2ad3275a4a..8dbf4a19af 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "errors" proquint "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 1197d7217f..aac6a9ceeb 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,13 +8,11 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/namesys/pb" - ci "github.com/ipfs/go-ipfs/p2p/crypto" - peer "github.com/ipfs/go-ipfs/p2p/peer" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" routing "github.com/ipfs/go-ipfs/routing" @@ -22,6 +20,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" u "github.com/ipfs/go-ipfs/util" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 11b47d0f1e..70961de8e2 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -8,17 +8,17 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" namesys "github.com/ipfs/go-ipfs/namesys" pb "github.com/ipfs/go-ipfs/namesys/pb" - peer "github.com/ipfs/go-ipfs/p2p/peer" path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 92c224a738..a4fde300fd 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -6,15 +6,15 @@ import ( "time" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/core" mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" - peer "github.com/ipfs/go-ipfs/p2p/peer" path "github.com/ipfs/go-ipfs/path" + mocknet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 219efda0f2..cd22eecc29 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,13 +6,13 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "github.com/ipfs/go-ipfs/util" testutil "github.com/ipfs/go-ipfs/util/testutil" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index a288f75576..40cf658d48 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,15 +7,15 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" - ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) var log = logging.Logger("namesys") From 3cba9c02bb9deadd81ed8418341bf741359719eb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0971/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@cd393ab5952ca88a6307f3e13886b13982c0b59a --- routing/dht/dht.go | 12 ++++++------ routing/dht/dht_bootstrap.go | 4 ++-- routing/dht/dht_net.go | 10 +++++----- routing/dht/dht_test.go | 8 ++++---- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 10 +++++----- routing/dht/handlers.go | 4 ++-- routing/dht/lookup.go | 4 ++-- routing/dht/notif.go | 4 ++-- routing/dht/pb/message.go | 8 ++++---- routing/dht/providers.go | 4 ++-- routing/dht/providers_test.go | 4 ++-- routing/dht/query.go | 10 +++++----- routing/dht/records.go | 6 +++--- routing/dht/routing.go | 6 +++--- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 4 ++-- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 8 ++++---- routing/mock/centralized_server.go | 4 ++-- routing/mock/centralized_test.go | 4 ++-- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 8 ++++---- routing/offline/offline.go | 8 ++++---- routing/record/record.go | 4 ++-- routing/record/validation.go | 2 +- routing/routing.go | 6 +++--- routing/supernode/client.go | 8 ++++---- routing/supernode/proxy/loopback.go | 6 +++--- routing/supernode/proxy/standard.go | 14 +++++++------- routing/supernode/server.go | 4 ++-- 34 files changed, 96 insertions(+), 96 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 31979aa8b8..2a349652d9 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,21 +10,21 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" - ci "github.com/ipfs/go-ipfs/p2p/crypto" - host "github.com/ipfs/go-ipfs/p2p/host" - peer "github.com/ipfs/go-ipfs/p2p/peer" - protocol "github.com/ipfs/go-ipfs/p2p/protocol" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + host "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/protocol" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) var log = logging.Logger("dht") diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 4a07d9f0ba..d9b62c36e2 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -8,13 +8,13 @@ import ( "sync" "time" - peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // BootstrapConfig specifies parameters used bootstrapping the DHT. diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 722ece7ea2..aa04993119 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,10 +6,10 @@ import ( ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - inet "github.com/ipfs/go-ipfs/p2p/net" - peer "github.com/ipfs/go-ipfs/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // handleNewStream implements the inet.StreamHandler @@ -71,7 +71,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s dht starting stream", dht.self) - s, err := dht.host.NewStream(ProtocolDHT, p) + s, err := dht.host.NewStream(ctx, ProtocolDHT, p) if err != nil { return nil, err } @@ -109,7 +109,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message) error { log.Debugf("%s dht starting stream", dht.self) - s, err := dht.host.NewStream(ProtocolDHT, p) + s, err := dht.host.NewStream(ctx, ProtocolDHT, p) if err != nil { return err } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 32560c59f8..b5499d0bfe 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,15 +11,15 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" - netutil "github.com/ipfs/go-ipfs/p2p/test/util" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/util/testutil/ci" travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index a7a632c3e8..3a466ed96c 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index a770a0962d..75ef4800e5 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -10,16 +10,16 @@ import ( ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - inet "github.com/ipfs/go-ipfs/p2p/net" - mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" - peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" + inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) func TestGetFailures(t *testing.T) { @@ -120,7 +120,7 @@ func TestGetFailures(t *testing.T) { Record: rec, } - s, err := hosts[1].NewStream(ProtocolDHT, hosts[0].ID()) + s, err := hosts[1].NewStream(context.Background(), ProtocolDHT, hosts[0].ID()) if err != nil { t.Fatal(err) } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 121f7623b1..da122bd281 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -7,12 +7,12 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // The number of closer peers to send on requests. diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index dc377e8b7f..01dd899649 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -1,12 +1,12 @@ package dht import ( - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" - peer "github.com/ipfs/go-ipfs/p2p/peer" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/util/peerset" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Required in order for proper JSON marshaling diff --git a/routing/dht/notif.go b/routing/dht/notif.go index cfe411c38e..00089f00ac 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -1,9 +1,9 @@ package dht import ( - ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" - inet "github.com/ipfs/go-ipfs/p2p/net" + inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index f780b1b057..c13a5cf3a7 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -1,12 +1,12 @@ package dht_pb import ( - ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "github.com/ipfs/go-ipfs/p2p/net" - peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 17455b3368..25bb967bd2 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,9 +6,9 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) type ProviderManager struct { diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 7e2e47d933..7b16fc807d 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,9 +4,9 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func TestProviderManager(t *testing.T) { diff --git a/routing/dht/query.go b/routing/dht/query.go index d64e432ea5..70765b6945 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -5,17 +5,17 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" - peer "github.com/ipfs/go-ipfs/p2p/peer" - queue "github.com/ipfs/go-ipfs/p2p/peer/queue" "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + queue "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer/queue" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) var maxQueryConcurrency = AlphaValue @@ -90,7 +90,7 @@ func newQueryRunner(q *dhtQuery) *dhtQueryRunner { ctx := ctxproc.OnClosingContext(proc) return &dhtQueryRunner{ query: q, - peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(q.key)), + peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(string(q.key))), peersRemaining: todoctr.NewSyncCounter(), peersSeen: pset.New(), rateLimit: make(chan struct{}, q.concurrency), diff --git a/routing/dht/records.go b/routing/dht/records.go index 49a06d5574..18c17dec96 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -5,12 +5,12 @@ import ( "time" ctxfrac "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/frac" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - ci "github.com/ipfs/go-ipfs/p2p/crypto" - peer "github.com/ipfs/go-ipfs/p2p/peer" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // MaxRecordAge specifies the maximum time that any node will hold onto a record diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 627c936078..85d4638deb 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -5,16 +5,16 @@ import ( "sync" "time" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" - inet "github.com/ipfs/go-ipfs/p2p/net" - peer "github.com/ipfs/go-ipfs/p2p/peer" "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/util/peerset" + inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 35ceed385e..df8f92e9f9 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 875b822615..0daae3b44d 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index d4cf051f33..8dd3ff3afa 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index e5b01cc721..eb16167f5a 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index e37a701830..be477ff480 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -6,9 +6,9 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index f360f9a8ae..463c216b5f 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,15 +6,15 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 075750c3ad..1757536ac2 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,10 +6,10 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" "github.com/ipfs/go-ipfs/util/testutil" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index a719570aa0..a71580a234 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -4,11 +4,11 @@ import ( "testing" "time" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index fc3b876e7f..716f23c1bb 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - mocknet "github.com/ipfs/go-ipfs/p2p/net/mock" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/util/testutil" + mocknet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index b16b99046f..6e29bad8a9 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -6,12 +6,12 @@ package mockrouting import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 6d16a88bf7..0caa78c45c 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -3,13 +3,13 @@ package nilrouting import ( "errors" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - p2phost "github.com/ipfs/go-ipfs/p2p/host" - peer "github.com/ipfs/go-ipfs/p2p/peer" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + p2phost "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 83775566c8..88fedb9cbc 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -6,14 +6,14 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - ci "github.com/ipfs/go-ipfs/p2p/crypto" - "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 944f615d0a..f3868a79aa 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -6,9 +6,9 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" key "github.com/ipfs/go-ipfs/blocks/key" - ci "github.com/ipfs/go-ipfs/p2p/crypto" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) var log = logging.Logger("routing/record") diff --git a/routing/record/validation.go b/routing/record/validation.go index a2afc0dfab..0a25c30e79 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -5,10 +5,10 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "github.com/ipfs/go-ipfs/p2p/crypto" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index 1c799b9843..9894d9953d 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -4,10 +4,10 @@ package routing import ( "errors" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" key "github.com/ipfs/go-ipfs/blocks/key" - ci "github.com/ipfs/go-ipfs/p2p/crypto" - peer "github.com/ipfs/go-ipfs/p2p/peer" + ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // ErrNotFound is returned when a search fails to find anything diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 5b7c4a3063..b0a62aae83 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -6,15 +6,15 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/p2p/host" - peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 1437b574a2..80f010c4fd 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,11 +2,11 @@ package proxy import ( ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "github.com/ipfs/go-ipfs/p2p/net" - peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 279cbe7dec..f89995110e 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,15 +4,15 @@ import ( "errors" ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - host "github.com/ipfs/go-ipfs/p2p/host" - inet "github.com/ipfs/go-ipfs/p2p/net" - peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + host "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" + inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) const ProtocolSNR = "/ipfs/supernoderouting" @@ -98,7 +98,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe if err = px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { return err } - s, err := px.Host.NewStream(ProtocolSNR, remote) + s, err := px.Host.NewStream(ctx, ProtocolSNR, remote) if err != nil { return err } @@ -133,7 +133,7 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe e.SetError(err) return nil, err } - s, err := px.Host.NewStream(ProtocolSNR, remote) + s, err := px.Host.NewStream(ctx, ProtocolSNR, remote) if err != nil { e.SetError(err) return nil, err diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 32a69ead55..f4111abad2 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -6,13 +6,13 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 0404df8cf02e3875eed43c47e3f0fafa225954fa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0972/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@510524a21d88d69992502c85796e7e789d54937b --- blockservice/blockservice.go | 4 ++-- blockservice/test/blocks_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 9c5cc00e52..b9f616c053 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -6,12 +6,12 @@ package blockservice import ( "errors" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 8b56753ad5..4c6dca16ce 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -7,7 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" From c75557f15673ee4badc0b82a28e06dd90f828c21 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0973/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@452278a79cb2f1b9fedfdf7547ec4ffb0e2bd935 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 1fbd5ccd97..1ec1760f01 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -6,7 +6,7 @@ import ( "io" "path" - cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + cxt "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 6536e443e8..2d470b6675 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -7,7 +7,7 @@ import ( "time" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + cxt "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 646a69a40f..647c1572e2 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -8,7 +8,7 @@ import ( "os" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 6fdef9ffb0..8dad9a16dd 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -1,7 +1,7 @@ package io import ( - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" mdag "github.com/ipfs/go-ipfs/merkledag" diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 197e330a9c..a344ff398d 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -8,7 +8,7 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" chunk "github.com/ipfs/go-ipfs/importer/chunk" @@ -17,7 +17,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 16f7dca337..0cd4a2f10a 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -21,7 +21,7 @@ import ( u "github.com/ipfs/go-ipfs/util" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func getMockDagServ(t testing.TB) mdag.DAGService { From 58b614b8d386f3cca3327caeee9455dfe8526642 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0974/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@a91825094db96b824029d285e748f488fc381ac3 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index df9ddedc6b..daa082f919 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 86b0d58daa..cd17daba75 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -8,11 +8,11 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 9356d3101c..5dd9c45cfd 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 71851af6ed..9188f4d56c 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,7 +12,7 @@ import ( "unsafe" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index b076c41466..eb796d9190 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blockservice" From cb7d7473ae9e83b6d035e600cd254baf34c8d35f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0975/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@915d7a0820a5fc4490b59b0ba198d5748f52a04f --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 1a149ed9d1..0f38f86b36 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -4,7 +4,7 @@ package exchange import ( "io" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" ) From 59b50fbc54fd74bbbcb6af6d018dff0426ff6d58 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0976/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@39f5dc4e02e2f3e0b3717daa3a326f3a24cbddec --- mfs/dir.go | 2 +- mfs/file.go | 2 +- mfs/mfs_test.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 15b4ea777e..28d9f73068 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -8,7 +8,7 @@ import ( "sync" "time" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" diff --git a/mfs/file.go b/mfs/file.go index 15aecb805e..da47371406 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -7,7 +7,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" mod "github.com/ipfs/go-ipfs/unixfs/mod" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index ff6c9d03c6..0cf8b639e1 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,7 +14,7 @@ import ( randbo "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/randbo" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/path" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 36db90e805..4ba7bae4fb 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/util/testutil/ci" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index d3e7052739..4b9afed7d5 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -18,8 +18,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var ErrNotExist = errors.New("no such rootfs") From 801f10f1ba2689206cff30c85159be4dc7fdb96b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0977/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@805dfd2b24a7bd529d6c012fdd3b73b107fbf8d3 --- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 2 +- blockstore/write_cache.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 342bbc72db..f7bbbc8aac 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -11,10 +11,10 @@ import ( dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/namespace" dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 9c535b9d8e..685745f008 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -8,7 +8,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 73a7813f5a..55ff4a1d98 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -2,7 +2,7 @@ package blockstore import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" ) From 1db8396406aa6c8fd7a29bc3aaad18eb861d0edf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0978/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@a15c85a271ecb9fd0d2bad356d9918bd5278425b --- path/resolver.go | 4 ++-- path/resolver_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 4ed7b67e94..d4e68a1bff 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -7,11 +7,11 @@ import ( "time" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index c0342fd621..9ebb3f7a95 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" From ec991c76e3c79bf5a02921430d201fa05bc65b2f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0979/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@3fdc04167ac0048296e3b3829a47e14f63d44bc6 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index a2f1dac4f4..84545cdfca 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var log = logging.Logger("chunk") From f616658cd3a5e33062762e65013c146ca3ce0730 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 0980/3147] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@2fec5b54d1f9ba33ac5d57b97a8e30f744733a18 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 9a448906e7..47e555e260 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -3,7 +3,7 @@ package offline import ( - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 0a4787f071..407865703a 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -5,7 +5,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" From 65fc69b3d7587a220c12db894db3ea529ceef152 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 09:43:06 -0800 Subject: [PATCH 0981/3147] go-keyspace dep from libp2p added License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@767b845830e83e06469e87bca8c2c37f5761c037 --- namesys/interface.go | 4 ++-- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 4 ++-- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 404274bfaf..4917370b4c 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -33,9 +33,9 @@ import ( "errors" "time" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 5ce96cb141..856d0b4d9d 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index a89abdcdfa..b258289095 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,10 +5,10 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index aac6a9ceeb..513a45e618 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -20,8 +20,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 70961de8e2..cf2608651b 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index a4fde300fd..4b546fa68a 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index cd22eecc29..8b9e955f02 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,13 +6,13 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "github.com/ipfs/go-ipfs/util" testutil "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 40cf658d48..23334e48a8 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,8 +14,8 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) var log = logging.Logger("namesys") From 3559d16deabcef34a5a9d5a413856593edc2fef5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 09:43:06 -0800 Subject: [PATCH 0982/3147] go-keyspace dep from libp2p added License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@6a37a454c18b3124451a1d0b6a8dea6acbbca844 --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 6 +++--- routing/dht/dht_test.go | 6 +++--- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 4 ++-- routing/dht/lookup.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 6 +++--- routing/dht/routing.go | 6 +++--- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 6 +++--- routing/mock/centralized_server.go | 4 ++-- routing/mock/centralized_test.go | 4 ++-- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 6 +++--- routing/offline/offline.go | 6 +++--- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 34 files changed, 66 insertions(+), 66 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 2a349652d9..8c9060a0d5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,11 +14,11 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + host "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/protocol" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" - host "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/protocol" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index d9b62c36e2..4cc49c6adc 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index aa04993119..b2a5b669f6 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,10 +6,10 @@ import ( ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b5499d0bfe..70d4692594 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,15 +11,15 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/test/util" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/util/testutil/ci" travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 3a466ed96c..2a183a34ef 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 75ef4800e5..c74dba02d8 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -17,9 +17,9 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index da122bd281..92ba7469b8 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -7,12 +7,12 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // The number of closer peers to send on requests. diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 01dd899649..3d8f400c96 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -1,12 +1,12 @@ package dht import ( - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/util/peerset" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // Required in order for proper JSON marshaling diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 00089f00ac..9df5abdee2 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" - inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" + inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index c13a5cf3a7..177134991f 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,9 +4,9 @@ import ( ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" + inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 25bb967bd2..601a578ed8 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 7b16fc807d..1f92713e3b 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 70765b6945..c520e738d5 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -9,9 +9,9 @@ import ( u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + queue "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer/queue" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" - queue "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer/queue" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" diff --git a/routing/dht/records.go b/routing/dht/records.go index 18c17dec96..82aeb66bb1 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -5,12 +5,12 @@ import ( "time" ctxfrac "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/frac" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // MaxRecordAge specifies the maximum time that any node will hold onto a record diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 85d4638deb..fa099e0ca6 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -5,7 +5,6 @@ import ( "sync" "time" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" "github.com/ipfs/go-ipfs/routing" @@ -13,8 +12,9 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/util/peerset" - inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index df8f92e9f9..77fd6dbfbb 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 0daae3b44d..33b6a440f9 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 8dd3ff3afa..2386fd103b 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index eb16167f5a..1c9db10a15 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index be477ff480..a0c634781d 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 463c216b5f..1a572e303e 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,15 +6,15 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 1757536ac2..3f05d54321 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,10 +6,10 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index a71580a234..69df8bbc81 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -4,11 +4,11 @@ import ( "testing" "time" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 716f23c1bb..66a9d169a1 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/util/testutil" - mocknet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net/mock" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 6e29bad8a9..6fc9fa910c 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -6,12 +6,12 @@ package mockrouting import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 0caa78c45c..172daf90ad 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -3,13 +3,13 @@ package nilrouting import ( "errors" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" + p2phost "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - p2phost "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 88fedb9cbc..20f770d161 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -6,14 +6,14 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" - "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index f3868a79aa..2d424b276e 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" ) var log = logging.Logger("routing/record") diff --git a/routing/record/validation.go b/routing/record/validation.go index 0a25c30e79..2179d1b2d9 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index 9894d9953d..80d6e32367 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,8 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index b0a62aae83..90f4744c5f 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,9 +12,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 80f010c4fd..2600a6a6a4 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index f89995110e..3b57ad625d 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,10 +9,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" + host "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" + inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - host "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/host" - inet "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/net" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index f4111abad2..0eaeb7fd97 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 276d61440cf783e044593e9b84e8c0043f44e264 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 09:43:06 -0800 Subject: [PATCH 0983/3147] go-keyspace dep from libp2p added License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@8c596d25a2d3a7bbb6919003c3b7271478fa5c62 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index b9f616c053..3f17e249ae 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -6,11 +6,11 @@ package blockservice import ( "errors" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" ) From c6ed4716c00af45aadfdcd9c1a7802c5eac8f6c2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0984/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@bf709dda438b0062e87296c65a709224fad96bf5 --- namesys/proquint.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/proquint.go b/namesys/proquint.go index 8dbf4a19af..ce17181e83 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "errors" proquint "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" path "github.com/ipfs/go-ipfs/path" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) type ProquintResolver struct{} diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index cf2608651b..60ce8cd0d5 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -18,7 +18,7 @@ import ( goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/routing.go b/namesys/routing.go index 23334e48a8..f814ef1658 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -15,7 +15,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("namesys") From f2787c806bcee11e5f2c6a4a9e7b9ff6f77ceba2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0985/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@feb5a23da2fd426adeb7ee9c51f5488540b13fda --- routing/dht/dht.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/kbucket/table.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/standard.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 8c9060a0d5..1742e58fc5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,7 +18,7 @@ import ( host "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" protocol "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/protocol" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 177134991f..ae2cbb398f 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index c520e738d5..c7c5b2f0ea 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -11,7 +11,7 @@ import ( todoctr "github.com/ipfs/go-ipfs/util/todocounter" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" queue "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer/queue" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 2386fd103b..e849ed38e5 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,7 +8,7 @@ import ( "time" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("table") diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 1a572e303e..a15405a3fd 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -14,7 +14,7 @@ import ( ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 172daf90ad..4ae1c2c894 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,7 +9,7 @@ import ( p2phost "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 20f770d161..980cb1f9ad 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -13,7 +13,7 @@ import ( ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 2d424b276e..ca4a7b4564 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("routing/record") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 90f4744c5f..72b9347f33 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -14,7 +14,7 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 3b57ad625d..b08494c576 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -12,7 +12,7 @@ import ( host "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) const ProtocolSNR = "/ipfs/supernoderouting" From 305f452eb731e3103adde5de0b4798185450de8c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0986/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@05022b0ed34e74c9db7d4651718e015ae30479b2 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index a344ff398d..e9dbe40a01 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -17,7 +17,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") From 17af64cc6266ad63c7335c03e849da867e77f45d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0987/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@ae987a615a7e99139bef2abb3185d1f79e089772 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index daa082f919..8586e2b9bb 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,7 +9,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index cd17daba75..fb6269d3eb 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -8,11 +8,11 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 9188f4d56c..a07762a319 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,10 +12,10 @@ import ( "unsafe" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index eb796d9190..3ef7ce51ba 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" "github.com/ipfs/go-ipfs/merkledag" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func ignoreKeys(key.Key) {} From 642ad8b499d5bbc12c94dd08f651565e1b21c8f0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0988/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@d63fbc7e4334cb75b7c308109a88e820d51b6307 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 0f38f86b36..32954b8621 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -4,9 +4,9 @@ package exchange import ( "io" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // Any type that implements exchange.Interface may be used as an IPFS block From 03cb18ff5d1c60d7f648039059b36ad345ee932b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0989/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@facd6b3c1d6fb2cd1a5fbe900be2c55fe5c2ca14 --- mfs/mfs_test.go | 2 +- mfs/system.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 0cf8b639e1..917845f5af 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,8 +14,8 @@ import ( randbo "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/randbo" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/path" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/mfs/system.go b/mfs/system.go index 4b9afed7d5..c059bf5ce5 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,7 +19,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var ErrNotExist = errors.New("no such rootfs") From a13bf8f01b5653a8d558ac0d86eba12c7a0eb3f8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0990/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@d14e7c79ca6280018f3597acceff45ad43f5a0c5 --- blockstore/blockstore.go | 4 ++-- blockstore/write_cache.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f7bbbc8aac..8221ec4a5d 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -11,10 +11,10 @@ import ( dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/namespace" dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("blockstore") diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 55ff4a1d98..90109e8a2b 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -2,9 +2,9 @@ package blockstore import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // WriteCached returns a blockstore that caches up to |size| unique writes (bs.Put). From 118dc6418df0a45c49b84bcdda47ea4676f32140 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0991/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@f5bfff1912893b33495ca78902e9566463d202c4 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index d4e68a1bff..569a4d1be7 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("path") From 0d2222ee64d1cd18bbc08ba74bb28ab99f790230 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0992/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@c1b893699bb1159d9855410b8f328c5ec593d24e --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3f17e249ae..21af30dfbe 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 4c6dca16ce..8cd5e6dfb9 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -7,7 +7,6 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" @@ -15,6 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" u "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func TestBlocks(t *testing.T) { From fba5b00664191d0a52164d07855f4b9600a9eaa0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0993/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@48f7f0637e2db5d7d6778653e9e6541b04decc1f --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 84545cdfca..3b539fe7bf 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("chunk") From af0810c60c566a996569355bdb8a8c1d27b2060b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 0994/3147] correct go-log dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@17a6633c8ee46e9933d2c6a4ffcc5c4c3a1b6aac --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 47e555e260..8f857d9331 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -3,11 +3,11 @@ package offline import ( - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 407865703a..d7d17341e9 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -5,11 +5,11 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func TestBlockReturnsErr(t *testing.T) { From f583c5534e3556ae8a99036a1ecf1b75aac8a4d0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 31 Jan 2016 10:19:50 -0800 Subject: [PATCH 0995/3147] update libp2p dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@03d76dd20414f04c01ac0adef1a2ba35ab8686af --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 4917370b4c..adce88024b 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 856d0b4d9d..78cbb1c5f1 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index b258289095..9df56da8c8 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 513a45e618..71349e5281 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -20,8 +20,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 60ce8cd0d5..e57c6f6eaa 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 4b546fa68a..8303a36afd 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 8b9e955f02..6ed7b88709 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,7 +11,7 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "github.com/ipfs/go-ipfs/util" testutil "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index f814ef1658..1293721a2b 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,7 +14,7 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From d9275b47a04776a965049ca4fa4b175b5247db1c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 31 Jan 2016 10:19:50 -0800 Subject: [PATCH 0996/3147] update libp2p dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d2e33cfa5be5a6dd6bfcd157bcf4dce8054bade7 --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 34 files changed, 52 insertions(+), 52 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 1742e58fc5..cd51f2be32 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,10 +14,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" - host "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/protocol" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + host "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 4cc49c6adc..8e94e92951 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index b2a5b669f6..add91f0ca6 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -7,8 +7,8 @@ import ( ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 70d4692594..de7256512f 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -18,8 +18,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/test/util" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/util/testutil/ci" travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 2a183a34ef..674a1f44cf 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index c74dba02d8..e431c183ab 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -17,9 +17,9 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 92ba7469b8..95df157f4d 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 3d8f400c96..b8e0c0c5de 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,7 +5,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/util/peerset" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 9df5abdee2..92c39c06e7 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" - inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" + inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index ae2cbb398f..bb72763126 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,8 +4,8 @@ import ( ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 601a578ed8..a76bf6727a 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 1f92713e3b..2087ee6365 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index c7c5b2f0ea..832389c322 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -9,8 +9,8 @@ import ( u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - queue "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer/queue" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + queue "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer/queue" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" diff --git a/routing/dht/records.go b/routing/dht/records.go index 82aeb66bb1..c84e524517 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,8 +8,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index fa099e0ca6..035e608997 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,8 +12,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/util/peerset" - inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 77fd6dbfbb..494f448a7c 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 33b6a440f9..ae3d136674 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index e849ed38e5..2464251e27 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 1c9db10a15..083e17287d 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index a0c634781d..50c17c3eb2 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index a15405a3fd..eb769308f6 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -11,8 +11,8 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 3f05d54321..6331e7964a 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,7 +8,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 69df8bbc81..d1a55e86c2 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 66a9d169a1..64fa620a97 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/util/testutil" - mocknet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 6fc9fa910c..1f21d0b4ed 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 4ae1c2c894..f6be101516 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + p2phost "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 980cb1f9ad..36a8e1d8e7 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" - "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/record.go b/routing/record/record.go index ca4a7b4564..96d9f69da8 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index 2179d1b2d9..f1cfb2bfbd 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index 80d6e32367..b737c27c22 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,8 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 72b9347f33..40d6e79b35 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,8 +12,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 2600a6a6a4..58f11a73ad 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index b08494c576..487cade629 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,9 +9,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - host "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/host" - inet "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/net" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + host "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" + inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 0eaeb7fd97..7a7c78bc3b 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 36b3b43bb1d0c45ef658714733aaf0a02fb58bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Fri, 23 Oct 2015 21:57:29 +0200 Subject: [PATCH 0997/3147] Add log events when blocks are added/removed from the blockstore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-ipfs-blockstore@68d6c7eb55da7560cb66ba3b07f624ee830d56d5 --- blockstore/write_cache.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 73a7813f5a..ecb8933bcd 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -22,6 +22,7 @@ type writecache struct { } func (w *writecache) DeleteBlock(k key.Key) error { + defer log.EventBegin(context.TODO(), "writecache.BlockRemoved", &k).Done() w.cache.Remove(k) return w.blockstore.DeleteBlock(k) } @@ -38,9 +39,12 @@ func (w *writecache) Get(k key.Key) (*blocks.Block, error) { } func (w *writecache) Put(b *blocks.Block) error { - if _, ok := w.cache.Get(b.Key()); ok { + k := b.Key() + if _, ok := w.cache.Get(k); ok { return nil } + defer log.EventBegin(context.TODO(), "writecache.BlockAdded", &k).Done() + w.cache.Add(b.Key(), struct{}{}) return w.blockstore.Put(b) } @@ -50,6 +54,8 @@ func (w *writecache) PutMany(bs []*blocks.Block) error { for _, b := range bs { if _, ok := w.cache.Get(b.Key()); !ok { good = append(good, b) + k := b.Key() + defer log.EventBegin(context.TODO(), "writecache.BlockAdded", &k).Done() } } return w.blockstore.PutMany(good) From 44366170a7914eb4f474da6f246dfcffb2f8c0b4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 31 Jan 2016 15:37:39 -0800 Subject: [PATCH 0998/3147] do that last thing again License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@522df738c30edb10c0590aa0a5b16fd81047c662 --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index adce88024b..68933bfe05 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 78cbb1c5f1..beeb0ac7c9 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 9df56da8c8..b9c7538818 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 71349e5281..981814f52d 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -20,8 +20,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index e57c6f6eaa..37d4d19e23 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 8303a36afd..a56111874e 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 6ed7b88709..ff1b27f540 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,7 +11,7 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "github.com/ipfs/go-ipfs/util" testutil "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index 1293721a2b..933bdd041b 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,7 +14,7 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From 5cdee8eedfe00f5266b38832f8ba39d8eca1b242 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 31 Jan 2016 15:37:39 -0800 Subject: [PATCH 0999/3147] do that last thing again License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@e6a40c1ab9a508fc276da2df39f6dc9b4f77ad38 --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 34 files changed, 52 insertions(+), 52 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index cd51f2be32..eadd5b4be3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,10 +14,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" - host "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/protocol" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + host "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 8e94e92951..3865bca13a 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index add91f0ca6..e88a94dc6b 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -7,8 +7,8 @@ import ( ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index de7256512f..55ed11c55c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -18,8 +18,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/test/util" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/util/testutil/ci" travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 674a1f44cf..3f8a7a9292 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index e431c183ab..adff49c90c 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -17,9 +17,9 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" u "github.com/ipfs/go-ipfs/util" - inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 95df157f4d..265ff49f91 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index b8e0c0c5de..140fcae213 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,7 +5,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/util/peerset" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 92c39c06e7..2fe6cce404 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" - inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" + inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index bb72763126..a1c4887e11 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,8 +4,8 @@ import ( ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index a76bf6727a..c0c16c54e0 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 2087ee6365..ec3b7a5d1f 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 832389c322..53e75fecbc 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -9,8 +9,8 @@ import ( u "github.com/ipfs/go-ipfs/util" pset "github.com/ipfs/go-ipfs/util/peerset" todoctr "github.com/ipfs/go-ipfs/util/todocounter" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" - queue "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer/queue" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + queue "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer/queue" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" diff --git a/routing/dht/records.go b/routing/dht/records.go index c84e524517..06a4e70b16 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,8 +8,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 035e608997..e0feda4ec8 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,8 +12,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/util/peerset" - inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 494f448a7c..8924a63d4d 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index ae3d136674..e1e0a1bbfc 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 2464251e27..5128b7821d 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 083e17287d..13f02df897 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 50c17c3eb2..73602d185d 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index eb769308f6..407f0c0942 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -11,8 +11,8 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 6331e7964a..8e8d5d0b21 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,7 +8,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index d1a55e86c2..d71b24c0bd 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 64fa620a97..99ef8ba882 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/util/testutil" - mocknet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 1f21d0b4ed..75daee9e96 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index f6be101516..1f7c9749f9 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + p2phost "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 36a8e1d8e7..7e5f80275f 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" - "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/record.go b/routing/record/record.go index 96d9f69da8..2adcc21bc0 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index f1cfb2bfbd..32c33e966d 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" u "github.com/ipfs/go-ipfs/util" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index b737c27c22..5acce6f54f 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,8 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 40d6e79b35..8838b7aeb3 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,8 +12,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 58f11a73ad..c067f634b3 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 487cade629..00892de88b 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,9 +9,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - host "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/host" - inet "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/net" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + host "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" + inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 7a7c78bc3b..46caf03eac 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From f20e2806b84e74a42e0d2896cf6b76fc794410d1 Mon Sep 17 00:00:00 2001 From: Thomas Gardner Date: Sun, 24 Jan 2016 14:18:03 +1000 Subject: [PATCH 1000/3147] trivial: various superficial fixes misc/completion/ipfs-completion.bash: add `ipfs stats` to BASH completion core/commands/mount_unix.go: ensure error is not nil before printing it contribute.md: fix bibliography indexing in example core/commands/swarm.go: change tabs to spaces in USAGE message *: 80-column readability improvements License: MIT Signed-off-by: Thomas Gardner This commit was moved from ipfs/go-unixfs@527151a784fecc880591a8a6d771a1685e66781c --- unixfs/format.go | 5 +++-- unixfs/io/dagreader.go | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index 472a575e7c..0bf5694380 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -1,5 +1,6 @@ -// Package format implements a data format for files in the ipfs filesystem -// It is not the only format in ipfs, but it is the one that the filesystem assumes +// Package format implements a data format for files in the ipfs filesystem It +// is not the only format in ipfs, but it is the one that the filesystem +// assumes package unixfs import ( diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 646a69a40f..4cc5220250 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -56,8 +56,8 @@ type ReadSeekCloser interface { io.WriterTo } -// NewDagReader creates a new reader object that reads the data represented by the given -// node, using the passed in DAGService for data retreival +// NewDagReader creates a new reader object that reads the data represented by +// the given node, using the passed in DAGService for data retreival func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*DagReader, error) { pb := new(ftpb.Data) if err := proto.Unmarshal(n.Data, pb); err != nil { @@ -102,8 +102,8 @@ func NewDataFileReader(ctx context.Context, n *mdag.Node, pb *ftpb.Data, serv md } } -// precalcNextBuf follows the next link in line and loads it from the DAGService, -// setting the next buffer to read from +// precalcNextBuf follows the next link in line and loads it from the +// DAGService, setting the next buffer to read from func (dr *DagReader) precalcNextBuf(ctx context.Context) error { dr.buf.Close() // Just to make sure if dr.linkPosition >= len(dr.promises) { From dc753b913ecbfaaa4643456b2c72766929393563 Mon Sep 17 00:00:00 2001 From: Thomas Gardner Date: Sun, 24 Jan 2016 14:18:03 +1000 Subject: [PATCH 1001/3147] trivial: various superficial fixes misc/completion/ipfs-completion.bash: add `ipfs stats` to BASH completion core/commands/mount_unix.go: ensure error is not nil before printing it contribute.md: fix bibliography indexing in example core/commands/swarm.go: change tabs to spaces in USAGE message *: 80-column readability improvements License: MIT Signed-off-by: Thomas Gardner This commit was moved from ipfs/go-ipfs-exchange-interface@5916b728a63371e5afb3c4d6d23e0548c5103197 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 1a149ed9d1..05f52a64b7 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -11,7 +11,7 @@ import ( // Any type that implements exchange.Interface may be used as an IPFS block // exchange protocol. -type Interface interface { +type Interface interface { // type Exchanger interface // GetBlock returns the block associated with a given key. GetBlock(context.Context, key.Key) (*blocks.Block, error) From af7fbeb68e497194fbed0c6af16857bf0f0df551 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Jan 2016 03:20:41 -0800 Subject: [PATCH 1002/3147] flushing and shallow list names License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@2edcf0e284bf7f4af0e2519b14dc8291de739853 --- mfs/dir.go | 24 +++++++++++++++++++ mfs/mfs_test.go | 50 ++++++++++++++++++++++++++++++++++++++++ mfs/ops.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+) diff --git a/mfs/dir.go b/mfs/dir.go index 28d9f73068..f4147dd2a1 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -175,6 +175,30 @@ type NodeListing struct { Hash string } +func (d *Directory) ListNames() []string { + d.Lock() + defer d.Unlock() + + names := make(map[string]struct{}) + for n, _ := range d.childDirs { + names[n] = struct{}{} + } + for n, _ := range d.files { + names[n] = struct{}{} + } + + for _, l := range d.node.Links { + names[l.Name] = struct{}{} + } + + var out []string + for n, _ := range names { + out = append(out, n) + } + + return out +} + func (d *Directory) List() ([]NodeListing, error) { d.lock.Lock() defer d.lock.Unlock() diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 917845f5af..161a8945aa 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -675,3 +675,53 @@ func TestMfsStress(t *testing.T) { } } } + +func TestFlushing(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + _, rt := setupRoot(ctx, t) + + dir := rt.GetValue().(*Directory) + c := mkdirP(t, dir, "a/b/c") + d := mkdirP(t, dir, "a/b/d") + e := mkdirP(t, dir, "a/b/e") + + data := []byte("this is a test\n") + nd1 := &dag.Node{Data: ft.FilePBData(data, uint64(len(data)))} + + if err := c.AddChild("TEST", nd1); err != nil { + t.Fatal(err) + } + if err := d.AddChild("TEST", nd1); err != nil { + t.Fatal(err) + } + if err := e.AddChild("TEST", nd1); err != nil { + t.Fatal(err) + } + + if err := FlushPath(rt, "/a/b/c/TEST"); err != nil { + t.Fatal(err) + } + + if err := FlushPath(rt, "/a/b/d/TEST"); err != nil { + t.Fatal(err) + } + + if err := FlushPath(rt, "/a/b/e/TEST"); err != nil { + t.Fatal(err) + } + + rnd, err := dir.GetNode() + if err != nil { + t.Fatal(err) + } + + rnk, err := rnd.Key() + if err != nil { + t.Fatal(err) + } + + if rnk.B58String() != "QmWcvrHUFk7LQRrA4WqKjqy7ZyRGFLVagtgNxbEodTEzQ4" { + t.Fatal("dag looks wrong") + } +} diff --git a/mfs/ops.go b/mfs/ops.go index 75c5d6a844..6edc9dd76a 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -194,3 +194,64 @@ func DirLookup(d *Directory, pth string) (FSNode, error) { } return cur, nil } + +func FlushPath(r *Root, pth string) error { + parts := path.SplitList(strings.Trim(pth, "/")) + + d, ok := r.GetValue().(*Directory) + if !ok { + return errors.New("mfs root somehow didnt point to a directory") + } + + nd, err := flushPathRec(d, parts) + if err != nil { + return err + } + + k, err := nd.Key() + if err != nil { + return err + } + + r.repub.Update(k) + return nil +} + +func flushPathRec(d *Directory, parts []string) (*dag.Node, error) { + if len(parts) == 0 { + return d.GetNode() + } + + d.Lock() + defer d.Unlock() + + next, err := d.childUnsync(parts[0]) + if err != nil { + log.Errorf("childnode: %q %q", parts[0], err) + return nil, err + } + + switch next := next.(type) { + case *Directory: + nd, err := flushPathRec(next, parts[1:]) + if err != nil { + return nil, err + } + + newnode, err := d.node.UpdateNodeLink(parts[0], nd) + if err != nil { + return nil, err + } + + d.node = newnode + return newnode, nil + case *File: + if len(parts) > 1 { + return nil, fmt.Errorf("%s is a file, not a directory", parts[0]) + } + + return next.GetNode() + default: + return nil, fmt.Errorf("unrecognized FSNode type: %#v", next) + } +} From ecdb1b5762e5c19fc42968d7a8f79d72d087430d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Jan 2016 05:37:34 -0800 Subject: [PATCH 1003/3147] flush pinning improvements License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@12a3d99b70a7bf2ee650cc266f20f879ab1dbb5e --- mfs/ops.go | 22 +++++++++++++++++++++- mfs/system.go | 19 +++++++++++++++---- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/mfs/ops.go b/mfs/ops.go index 6edc9dd76a..3348d45227 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -197,6 +197,9 @@ func DirLookup(d *Directory, pth string) (FSNode, error) { func FlushPath(r *Root, pth string) error { parts := path.SplitList(strings.Trim(pth, "/")) + if len(parts) == 1 && parts[0] == "" { + parts = nil + } d, ok := r.GetValue().(*Directory) if !ok { @@ -214,12 +217,24 @@ func FlushPath(r *Root, pth string) error { } r.repub.Update(k) + r.repub.WaitPub() + return nil } func flushPathRec(d *Directory, parts []string) (*dag.Node, error) { if len(parts) == 0 { - return d.GetNode() + nd, err := d.GetNode() + if err != nil { + return nil, err + } + + _, err = d.dserv.Add(nd) + if err != nil { + return nil, err + } + + return nd, nil } d.Lock() @@ -243,6 +258,11 @@ func flushPathRec(d *Directory, parts []string) (*dag.Node, error) { return nil, err } + _, err = d.dserv.Add(newnode) + if err != nil { + return nil, err + } + d.node = newnode return newnode, nil case *File: diff --git a/mfs/system.go b/mfs/system.go index c059bf5ce5..b5fe387680 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -165,7 +165,7 @@ type Republisher struct { TimeoutShort time.Duration Publish chan struct{} pubfunc PubFunc - pubnowch chan struct{} + pubnowch chan chan struct{} ctx context.Context cancel func() @@ -190,7 +190,7 @@ func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration TimeoutLong: tlong, Publish: make(chan struct{}, 1), pubfunc: pf, - pubnowch: make(chan struct{}), + pubnowch: make(chan chan struct{}), ctx: ctx, cancel: cancel, } @@ -204,11 +204,17 @@ func (p *Republisher) setVal(k key.Key) { func (p *Republisher) pubNow() { select { - case p.pubnowch <- struct{}{}: + case p.pubnowch <- nil: default: } } +func (p *Republisher) WaitPub() { + wait := make(chan struct{}) + p.pubnowch <- wait + <-wait +} + func (p *Republisher) Close() error { err := p.publish(p.ctx) p.cancel() @@ -235,6 +241,8 @@ func (np *Republisher) Run() { longer := time.After(np.TimeoutLong) wait: + var pubnowresp chan struct{} + select { case <-np.ctx.Done(): return @@ -243,10 +251,13 @@ func (np *Republisher) Run() { goto wait case <-quick: case <-longer: - case <-np.pubnowch: + case pubnowresp = <-np.pubnowch: } err := np.publish(np.ctx) + if pubnowresp != nil { + pubnowresp <- struct{}{} + } if err != nil { log.Error("republishRoot error: %s", err) } From 78a5e1d3572f0bcfcdf82c91eff0944f49fea0a6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Jan 2016 06:04:04 -0800 Subject: [PATCH 1004/3147] use correct context in pubfunc pinning License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@f180e18d6cdf1b14770580e1293f3e589d006dcd --- mfs/ops.go | 1 + 1 file changed, 1 insertion(+) diff --git a/mfs/ops.go b/mfs/ops.go index 3348d45227..f12dfa7430 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -162,6 +162,7 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { func Lookup(r *Root, path string) (FSNode, error) { dir, ok := r.GetValue().(*Directory) if !ok { + log.Error("root not a dir: %#v", r.GetValue()) return nil, errors.New("root was not a directory") } From 0dbaeae6e13642a046b2245ff3c768bc7705aba2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Jan 2016 06:06:33 -0800 Subject: [PATCH 1005/3147] sort ListNames output License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@dc6d031c980f8077e9d1062d51a511affed0c678 --- mfs/dir.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mfs/dir.go b/mfs/dir.go index f4147dd2a1..c70555bb73 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "path" + "sort" "sync" "time" @@ -195,6 +196,7 @@ func (d *Directory) ListNames() []string { for n, _ := range names { out = append(out, n) } + sort.Strings(out) return out } From 1e023678666c65eb96bc5bd00a6cf22816f71496 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 15 Jan 2016 15:14:29 -0800 Subject: [PATCH 1006/3147] blockstore locks return unlocker object now License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@0e72f107dd9ca58828b9f1fd46f907c1909d86fd --- mfs/dir.go | 36 +++++++++++---------- mfs/file.go | 14 ++++----- mfs/mfs_test.go | 83 ++++++++++++++++++++++++++++++++++++++++--------- mfs/ops.go | 38 ++++++++++++---------- mfs/system.go | 8 ++--- 5 files changed, 120 insertions(+), 59 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index c70555bb73..d437b28d74 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -51,17 +51,20 @@ func NewDirectory(ctx context.Context, name string, node *dag.Node, parent child // closeChild updates the child by the given name to the dag node 'nd' // and changes its own dag node -func (d *Directory) closeChild(name string, nd *dag.Node) error { - mynd, err := d.closeChildUpdate(name, nd) +func (d *Directory) closeChild(name string, nd *dag.Node, sync bool) error { + mynd, err := d.closeChildUpdate(name, nd, sync) if err != nil { return err } - return d.parent.closeChild(d.name, mynd) + if sync { + return d.parent.closeChild(d.name, mynd, true) + } + return nil } // closeChildUpdate is the portion of closeChild that needs to be locked around -func (d *Directory) closeChildUpdate(name string, nd *dag.Node) (*dag.Node, error) { +func (d *Directory) closeChildUpdate(name string, nd *dag.Node, sync bool) (*dag.Node, error) { d.lock.Lock() defer d.lock.Unlock() @@ -70,7 +73,10 @@ func (d *Directory) closeChildUpdate(name string, nd *dag.Node) (*dag.Node, erro return nil, err } - return d.flushCurrentNode() + if sync { + return d.flushCurrentNode() + } + return nil, nil } func (d *Directory) flushCurrentNode() (*dag.Node, error) { @@ -295,12 +301,15 @@ func (d *Directory) Unlink(name string) error { } func (d *Directory) Flush() error { + d.lock.Lock() nd, err := d.flushCurrentNode() if err != nil { + d.lock.Unlock() return err } + d.lock.Unlock() - return d.parent.closeChild(d.name, nd) + return d.parent.closeChild(d.name, nd, true) } // AddChild adds the node 'nd' under this directory giving it the name 'name' @@ -335,11 +344,6 @@ func (d *Directory) sync() error { return err } - _, err = d.dserv.Add(nd) - if err != nil { - return err - } - err = d.updateChild(name, nd) if err != nil { return err @@ -352,11 +356,6 @@ func (d *Directory) sync() error { return err } - _, err = d.dserv.Add(nd) - if err != nil { - return err - } - err = d.updateChild(name, nd) if err != nil { return err @@ -385,6 +384,11 @@ func (d *Directory) GetNode() (*dag.Node, error) { return nil, err } + _, err = d.dserv.Add(d.node) + if err != nil { + return nil, err + } + return d.node.Copy(), nil } diff --git a/mfs/file.go b/mfs/file.go index da47371406..99dfff0df1 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -73,7 +73,7 @@ func (fi *File) Close() error { // explicitly stay locked for flushUp call, // it will manage the lock for us - return fi.flushUp() + return fi.flushUp(true) } fi.Unlock() @@ -82,7 +82,7 @@ func (fi *File) Close() error { // flushUp syncs the file and adds it to the dagservice // it *must* be called with the File's lock taken -func (fi *File) flushUp() error { +func (fi *File) flushUp(fullsync bool) error { nd, err := fi.mod.GetNode() if err != nil { fi.Unlock() @@ -95,20 +95,18 @@ func (fi *File) flushUp() error { return err } - //name := fi.name - //parent := fi.parent + name := fi.name + parent := fi.parent // explicit unlock *only* before closeChild call fi.Unlock() - return nil - //return parent.closeChild(name, nd) + return parent.closeChild(name, nd, fullsync) } // Sync flushes the changes in the file to disk func (fi *File) Sync() error { fi.Lock() - defer fi.Unlock() - return fi.mod.Sync() + return fi.flushUp(false) } // Seek implements io.Seeker diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 161a8945aa..38237c2183 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -576,15 +576,15 @@ func actorRemoveFile(d *Directory) error { return d.Unlink(re.Name) } -func actorReadFile(d *Directory) error { +func randomFile(d *Directory) (*File, error) { d, err := randomWalk(d, rand.Intn(6)) if err != nil { - return err + return nil, err } ents, err := d.List() if err != nil { - return err + return nil, err } var files []string @@ -595,18 +595,61 @@ func actorReadFile(d *Directory) error { } if len(files) == 0 { - return nil + return nil, nil } fname := files[rand.Intn(len(files))] fsn, err := d.Child(fname) if err != nil { - return err + return nil, err } fi, ok := fsn.(*File) if !ok { - return errors.New("file wasnt a file, race?") + return nil, errors.New("file wasnt a file, race?") + } + + return fi, nil +} + +func actorWriteFile(d *Directory) error { + fi, err := randomFile(d) + if err != nil { + return err + } + if fi == nil { + return nil + } + + size := rand.Intn(1024) + buf := make([]byte, size) + randbo.New().Read(buf) + + s, err := fi.Size() + if err != nil { + return err + } + + offset := rand.Int63n(s) + + n, err := fi.WriteAt(buf, offset) + if err != nil { + return err + } + if n != size { + return fmt.Errorf("didnt write enough") + } + + return fi.Close() +} + +func actorReadFile(d *Directory) error { + fi, err := randomFile(d) + if err != nil { + return err + } + if fi == nil { + return nil } _, err = fi.Size() @@ -637,12 +680,7 @@ func testActor(rt *Root, iterations int, errs chan error) { return } case 3: - continue - // randomly deleting things - // doesnt really give us any sort of useful test results. - // you will never have this in a real environment where - // you expect anything productive to happen... - if err := actorRemoveFile(d); err != nil { + if err := actorWriteFile(d); err != nil { errs <- err return } @@ -698,6 +736,9 @@ func TestFlushing(t *testing.T) { if err := e.AddChild("TEST", nd1); err != nil { t.Fatal(err) } + if err := dir.AddChild("FILE", nd1); err != nil { + t.Fatal(err) + } if err := FlushPath(rt, "/a/b/c/TEST"); err != nil { t.Fatal(err) @@ -711,17 +752,31 @@ func TestFlushing(t *testing.T) { t.Fatal(err) } + if err := FlushPath(rt, "/FILE"); err != nil { + t.Fatal(err) + } + rnd, err := dir.GetNode() if err != nil { t.Fatal(err) } + fsnode, err := ft.FSNodeFromBytes(rnd.Data) + if err != nil { + t.Fatal(err) + } + + if fsnode.Type != ft.TDirectory { + t.Fatal("root wasnt a directory") + } + rnk, err := rnd.Key() if err != nil { t.Fatal(err) } - if rnk.B58String() != "QmWcvrHUFk7LQRrA4WqKjqy7ZyRGFLVagtgNxbEodTEzQ4" { - t.Fatal("dag looks wrong") + exp := "QmWMVyhTuyxUrXX3ynz171jq76yY3PktfY9Bxiph7b9ikr" + if rnk.B58String() != exp { + t.Fatalf("dag looks wrong, expected %s, but got %s", exp, rnk.B58String()) } } diff --git a/mfs/ops.go b/mfs/ops.go index f12dfa7430..9bc59994ce 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -230,11 +230,6 @@ func flushPathRec(d *Directory, parts []string) (*dag.Node, error) { return nil, err } - _, err = d.dserv.Add(nd) - if err != nil { - return nil, err - } - return nd, nil } @@ -247,6 +242,7 @@ func flushPathRec(d *Directory, parts []string) (*dag.Node, error) { return nil, err } + var ndagnode *dag.Node switch next := next.(type) { case *Directory: nd, err := flushPathRec(next, parts[1:]) @@ -254,25 +250,33 @@ func flushPathRec(d *Directory, parts []string) (*dag.Node, error) { return nil, err } - newnode, err := d.node.UpdateNodeLink(parts[0], nd) - if err != nil { - return nil, err - } - - _, err = d.dserv.Add(newnode) - if err != nil { - return nil, err - } + ndagnode = nd - d.node = newnode - return newnode, nil case *File: if len(parts) > 1 { return nil, fmt.Errorf("%s is a file, not a directory", parts[0]) } - return next.GetNode() + child, err := next.GetNode() + if err != nil { + return nil, err + } + + ndagnode = child default: return nil, fmt.Errorf("unrecognized FSNode type: %#v", next) } + + newnode, err := d.node.UpdateNodeLink(parts[0], ndagnode) + if err != nil { + return nil, err + } + + _, err = d.dserv.Add(newnode) + if err != nil { + return nil, err + } + + d.node = newnode + return newnode, nil } diff --git a/mfs/system.go b/mfs/system.go index b5fe387680..454577c457 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -29,7 +29,7 @@ var log = logging.Logger("mfs") var ErrIsDirectory = errors.New("error: is a directory") type childCloser interface { - closeChild(string, *dag.Node) error + closeChild(string, *dag.Node, bool) error } type NodeType int @@ -115,7 +115,7 @@ func (kr *Root) Flush() error { return err } - k, err := kr.dserv.Add(nd) + k, err := nd.Key() if err != nil { return err } @@ -128,7 +128,7 @@ func (kr *Root) Flush() error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published -func (kr *Root) closeChild(name string, nd *dag.Node) error { +func (kr *Root) closeChild(name string, nd *dag.Node, sync bool) error { k, err := kr.dserv.Add(nd) if err != nil { return err @@ -146,7 +146,7 @@ func (kr *Root) Close() error { return err } - k, err := kr.dserv.Add(nd) + k, err := nd.Key() if err != nil { return err } From 64cf9fefd56de64974d3f6a5b4289177ea71709f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 15 Jan 2016 15:14:29 -0800 Subject: [PATCH 1007/3147] blockstore locks return unlocker object now License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@a85166021a651da1dd72d33873dc61fc8dffc91c --- unixfs/mod/dagmodifier.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index e9dbe40a01..5306399f61 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -169,12 +169,6 @@ func (dm *DagModifier) Sync() error { // Number of bytes we're going to write buflen := dm.wrBuf.Len() - // Grab key for unpinning after mod operation - _, err := dm.curNode.Key() - if err != nil { - return err - } - // overwrite existing dag nodes thisk, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) if err != nil { From 888a6640c3f8bce10ffd36da18748922f2ca0b37 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 15 Jan 2016 15:14:29 -0800 Subject: [PATCH 1008/3147] blockstore locks return unlocker object now License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@478ebe0ca768d14cc8001acf665fe537476ebb29 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 695da62ec8..0aad6c03ff 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -23,7 +23,7 @@ var log = logging.Logger("gc") // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key.Key, error) { - unlock := bs.GCLock() + unlocker := bs.GCLock() bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) @@ -41,7 +41,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. output := make(chan key.Key) go func() { defer close(output) - defer unlock() + defer unlocker.Unlock() for { select { case k, ok := <-keychan: diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index fb6269d3eb..a7f62417f6 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -123,6 +123,8 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { return nil } +var ErrNotPinned = fmt.Errorf("not pinned") + // Unpin a given key func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { p.lock.Lock() @@ -132,7 +134,7 @@ func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { return err } if !pinned { - return fmt.Errorf("%s is not pinned", k) + return ErrNotPinned } switch reason { case "recursive": From bcced0c184bcf7cb43ef95a16f42f7843f863ca4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 15 Jan 2016 15:14:29 -0800 Subject: [PATCH 1009/3147] blockstore locks return unlocker object now License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@dfdb1014a5fa19f8200db4c6d3d4324822b8b271 --- blockstore/blockstore.go | 25 +++++++++++++++++++------ blockstore/write_cache.go | 4 ++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 8221ec4a5d..51979e6534 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -43,13 +43,13 @@ type GCBlockstore interface { // GCLock locks the blockstore for garbage collection. No operations // that expect to finish with a pin should ocurr simultaneously. // Reading during GC is safe, and requires no lock. - GCLock() func() + GCLock() Unlocker // PinLock locks the blockstore for sequences of puts expected to finish // with a pin (before GC). Multiple put->pin sequences can write through // at the same time, but no GC should not happen simulatenously. // Reading during Pinning is safe, and requires no lock. - PinLock() func() + PinLock() Unlocker // GcRequested returns true if GCLock has been called and is waiting to // take the lock @@ -198,16 +198,29 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return output, nil } -func (bs *blockstore) GCLock() func() { +type Unlocker interface { + Unlock() +} + +type unlocker struct { + unlock func() +} + +func (u *unlocker) Unlock() { + u.unlock() + u.unlock = nil // ensure its not called twice +} + +func (bs *blockstore) GCLock() Unlocker { atomic.AddInt32(&bs.gcreq, 1) bs.lk.Lock() atomic.AddInt32(&bs.gcreq, -1) - return bs.lk.Unlock + return &unlocker{bs.lk.Unlock} } -func (bs *blockstore) PinLock() func() { +func (bs *blockstore) PinLock() Unlocker { bs.lk.RLock() - return bs.lk.RUnlock + return &unlocker{bs.lk.RUnlock} } func (bs *blockstore) GCRequested() bool { diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 90109e8a2b..2567a72160 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -59,11 +59,11 @@ func (w *writecache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { return w.blockstore.AllKeysChan(ctx) } -func (w *writecache) GCLock() func() { +func (w *writecache) GCLock() Unlocker { return w.blockstore.(GCBlockstore).GCLock() } -func (w *writecache) PinLock() func() { +func (w *writecache) PinLock() Unlocker { return w.blockstore.(GCBlockstore).PinLock() } From 2a3fd08f2ca65bba2955d36d351431b6b07d31a7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 3 Feb 2016 20:45:12 -0800 Subject: [PATCH 1010/3147] introduce concept of filedescriptors to mfs, adjust fuse code to use them License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@3dc110f8742708a8040a847933525cbf18a79ed0 --- mfs/dir.go | 12 +-- mfs/fd.go | 151 ++++++++++++++++++++++++++++ mfs/file.go | 174 ++++++++++++--------------------- mfs/mfs_test.go | 255 ++++++++++++++++++++++++++++++++++++++++++++---- mfs/ops.go | 78 +-------------- mfs/system.go | 11 ++- 6 files changed, 462 insertions(+), 219 deletions(-) create mode 100644 mfs/fd.go diff --git a/mfs/dir.go b/mfs/dir.go index d437b28d74..fc949621ac 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -183,8 +183,8 @@ type NodeListing struct { } func (d *Directory) ListNames() []string { - d.Lock() - defer d.Unlock() + d.lock.Lock() + defer d.lock.Unlock() names := make(map[string]struct{}) for n, _ := range d.childDirs { @@ -391,11 +391,3 @@ func (d *Directory) GetNode() (*dag.Node, error) { return d.node.Copy(), nil } - -func (d *Directory) Lock() { - d.lock.Lock() -} - -func (d *Directory) Unlock() { - d.lock.Unlock() -} diff --git a/mfs/fd.go b/mfs/fd.go new file mode 100644 index 0000000000..2d3f2f3d0e --- /dev/null +++ b/mfs/fd.go @@ -0,0 +1,151 @@ +package mfs + +import ( + "fmt" + "io" + + mod "github.com/ipfs/go-ipfs/unixfs/mod" + + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + +type FileDescriptor interface { + io.Reader + CtxReadFull(context.Context, []byte) (int, error) + + io.Writer + io.WriterAt + + io.Closer + io.Seeker + + Truncate(int64) error + Size() (int64, error) + Sync() error + Flush() error +} + +type fileDescriptor struct { + inode *File + mod *mod.DagModifier + perms int + sync bool + hasChanges bool + + closed bool +} + +// Size returns the size of the file referred to by this descriptor +func (fi *fileDescriptor) Size() (int64, error) { + return fi.mod.Size() +} + +// Truncate truncates the file to size +func (fi *fileDescriptor) Truncate(size int64) error { + if fi.perms == OpenReadOnly { + return fmt.Errorf("cannot call truncate on readonly file descriptor") + } + fi.hasChanges = true + return fi.mod.Truncate(size) +} + +// Write writes the given data to the file at its current offset +func (fi *fileDescriptor) Write(b []byte) (int, error) { + if fi.perms == OpenReadOnly { + return 0, fmt.Errorf("cannot write on not writeable descriptor") + } + fi.hasChanges = true + return fi.mod.Write(b) +} + +// Read reads into the given buffer from the current offset +func (fi *fileDescriptor) Read(b []byte) (int, error) { + if fi.perms == OpenWriteOnly { + return 0, fmt.Errorf("cannot read on write-only descriptor") + } + return fi.mod.Read(b) +} + +// Read reads into the given buffer from the current offset +func (fi *fileDescriptor) CtxReadFull(ctx context.Context, b []byte) (int, error) { + if fi.perms == OpenWriteOnly { + return 0, fmt.Errorf("cannot read on write-only descriptor") + } + return fi.mod.CtxReadFull(ctx, b) +} + +// Close flushes, then propogates the modified dag node up the directory structure +// and signals a republish to occur +func (fi *fileDescriptor) Close() error { + defer func() { + switch fi.perms { + case OpenReadOnly: + fi.inode.desclock.RUnlock() + case OpenWriteOnly, OpenReadWrite: + fi.inode.desclock.Unlock() + } + }() + + if fi.closed { + panic("attempted to close file descriptor twice!") + } + + if fi.hasChanges { + err := fi.mod.Sync() + if err != nil { + return err + } + + fi.hasChanges = false + + // explicitly stay locked for flushUp call, + // it will manage the lock for us + return fi.flushUp(fi.sync) + } + + return nil +} + +func (fi *fileDescriptor) Sync() error { + return fi.flushUp(false) +} + +func (fi *fileDescriptor) Flush() error { + return fi.flushUp(true) +} + +// flushUp syncs the file and adds it to the dagservice +// it *must* be called with the File's lock taken +func (fi *fileDescriptor) flushUp(fullsync bool) error { + nd, err := fi.mod.GetNode() + if err != nil { + return err + } + + _, err = fi.inode.dserv.Add(nd) + if err != nil { + return err + } + + fi.inode.nodelk.Lock() + fi.inode.node = nd + name := fi.inode.name + parent := fi.inode.parent + fi.inode.nodelk.Unlock() + + return parent.closeChild(name, nd, fullsync) +} + +// Seek implements io.Seeker +func (fi *fileDescriptor) Seek(offset int64, whence int) (int64, error) { + return fi.mod.Seek(offset, whence) +} + +// Write At writes the given bytes at the offset 'at' +func (fi *fileDescriptor) WriteAt(b []byte, at int64) (int, error) { + if fi.perms == OpenReadOnly { + return 0, fmt.Errorf("cannot write on not writeable descriptor") + } + fi.hasChanges = true + return fi.mod.WriteAt(b, at) +} diff --git a/mfs/file.go b/mfs/file.go index 99dfff0df1..578da98f6d 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -1,10 +1,12 @@ package mfs import ( + "fmt" "sync" chunk "github.com/ipfs/go-ipfs/importer/chunk" dag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" @@ -13,150 +15,98 @@ import ( type File struct { parent childCloser - name string - hasChanges bool + name string - dserv dag.DAGService - mod *mod.DagModifier - lock sync.Mutex + desclock sync.RWMutex + + dserv dag.DAGService + node *dag.Node + nodelk sync.Mutex } // NewFile returns a NewFile object with the given parameters func NewFile(name string, node *dag.Node, parent childCloser, dserv dag.DAGService) (*File, error) { - dmod, err := mod.NewDagModifier(context.Background(), node, dserv, chunk.DefaultSplitter) - if err != nil { - return nil, err - } - return &File{ dserv: dserv, parent: parent, name: name, - mod: dmod, + node: node, }, nil } -// Write writes the given data to the file at its current offset -func (fi *File) Write(b []byte) (int, error) { - fi.Lock() - defer fi.Unlock() - fi.hasChanges = true - return fi.mod.Write(b) -} - -// Read reads into the given buffer from the current offset -func (fi *File) Read(b []byte) (int, error) { - fi.Lock() - defer fi.Unlock() - return fi.mod.Read(b) -} - -// Read reads into the given buffer from the current offset -func (fi *File) CtxReadFull(ctx context.Context, b []byte) (int, error) { - fi.Lock() - defer fi.Unlock() - return fi.mod.CtxReadFull(ctx, b) -} +const ( + OpenReadOnly = iota + OpenWriteOnly + OpenReadWrite +) -// Close flushes, then propogates the modified dag node up the directory structure -// and signals a republish to occur -func (fi *File) Close() error { - fi.Lock() - if fi.hasChanges { - err := fi.mod.Sync() - if err != nil { - fi.Unlock() - return err - } - - fi.hasChanges = false - - // explicitly stay locked for flushUp call, - // it will manage the lock for us - return fi.flushUp(true) +func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { + fi.nodelk.Lock() + node := fi.node + fi.nodelk.Unlock() + + switch flags { + case OpenReadOnly: + fi.desclock.RLock() + case OpenWriteOnly, OpenReadWrite: + fi.desclock.Lock() + default: + // TODO: support other modes + return nil, fmt.Errorf("mode not supported") } - fi.Unlock() - return nil -} - -// flushUp syncs the file and adds it to the dagservice -// it *must* be called with the File's lock taken -func (fi *File) flushUp(fullsync bool) error { - nd, err := fi.mod.GetNode() + dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dserv, chunk.DefaultSplitter) if err != nil { - fi.Unlock() - return err + return nil, err } - _, err = fi.dserv.Add(nd) + return &fileDescriptor{ + inode: fi, + perms: flags, + sync: sync, + mod: dmod, + }, nil +} + +// Size returns the size of this file +func (fi *File) Size() (int64, error) { + fi.nodelk.Lock() + defer fi.nodelk.Unlock() + pbd, err := ft.FromBytes(fi.node.Data) if err != nil { - fi.Unlock() - return err + return 0, err } - name := fi.name - parent := fi.parent - - // explicit unlock *only* before closeChild call - fi.Unlock() - return parent.closeChild(name, nd, fullsync) + return int64(pbd.GetFilesize()), nil } -// Sync flushes the changes in the file to disk -func (fi *File) Sync() error { - fi.Lock() - return fi.flushUp(false) +// GetNode returns the dag node associated with this file +func (fi *File) GetNode() (*dag.Node, error) { + fi.nodelk.Lock() + defer fi.nodelk.Unlock() + return fi.node, nil } -// Seek implements io.Seeker -func (fi *File) Seek(offset int64, whence int) (int64, error) { - fi.Lock() - defer fi.Unlock() - return fi.mod.Seek(offset, whence) -} +func (fi *File) Flush() error { + // open the file in fullsync mode + fd, err := fi.Open(OpenWriteOnly, true) + if err != nil { + return err + } -// Write At writes the given bytes at the offset 'at' -func (fi *File) WriteAt(b []byte, at int64) (int, error) { - fi.Lock() - defer fi.Unlock() - fi.hasChanges = true - return fi.mod.WriteAt(b, at) -} + defer fd.Close() -// Size returns the size of this file -func (fi *File) Size() (int64, error) { - fi.Lock() - defer fi.Unlock() - return fi.mod.Size() + return fd.Flush() } -// GetNode returns the dag node associated with this file -func (fi *File) GetNode() (*dag.Node, error) { - fi.Lock() - defer fi.Unlock() - return fi.mod.GetNode() -} - -// Truncate truncates the file to size -func (fi *File) Truncate(size int64) error { - fi.Lock() - defer fi.Unlock() - fi.hasChanges = true - return fi.mod.Truncate(size) +func (fi *File) Sync() error { + // just being able to take the writelock means the descriptor is synced + fi.desclock.Lock() + fi.desclock.Unlock() + return nil } // Type returns the type FSNode this is func (fi *File) Type() NodeType { return TFile } - -// Lock the file -func (fi *File) Lock() { - fi.lock.Lock() -} - -// Unlock the file -func (fi *File) Unlock() { - fi.lock.Unlock() -} diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 38237c2183..b8ba320ce9 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -9,7 +9,9 @@ import ( "math/rand" "os" "sort" + "sync" "testing" + "time" randbo "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/randbo" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" @@ -38,6 +40,10 @@ func getDagserv(t *testing.T) dag.DAGService { func getRandFile(t *testing.T, ds dag.DAGService, size int64) *dag.Node { r := io.LimitReader(u.NewTimeSeededRand(), size) + return fileNodeFromReader(t, ds, r) +} + +func fileNodeFromReader(t *testing.T, ds dag.DAGService, r io.Reader) *dag.Node { nd, err := importer.BuildDagFromReader(ds, chunk.DefaultSplitter(r)) if err != nil { t.Fatal(err) @@ -143,7 +149,12 @@ func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.Node, pth str return fmt.Errorf("%s was not a file!", pth) } - out, err := ioutil.ReadAll(file) + rfd, err := file.Open(OpenReadOnly, false) + if err != nil { + return err + } + + out, err := ioutil.ReadAll(rfd) if err != nil { return err } @@ -374,6 +385,11 @@ func TestMfsFile(t *testing.T) { t.Fatal("some is seriously wrong here") } + wfd, err := fi.Open(OpenReadWrite, true) + if err != nil { + t.Fatal(err) + } + // assert size is as expected size, err := fi.Size() if size != int64(fisize) { @@ -382,7 +398,7 @@ func TestMfsFile(t *testing.T) { // write to beginning of file b := []byte("THIS IS A TEST") - n, err := fi.Write(b) + n, err := wfd.Write(b) if err != nil { t.Fatal(err) } @@ -392,19 +408,19 @@ func TestMfsFile(t *testing.T) { } // sync file - err = fi.Sync() + err = wfd.Sync() if err != nil { t.Fatal(err) } // make sure size hasnt changed - size, err = fi.Size() + size, err = wfd.Size() if size != int64(fisize) { t.Fatal("size isnt correct") } // seek back to beginning - ns, err := fi.Seek(0, os.SEEK_SET) + ns, err := wfd.Seek(0, os.SEEK_SET) if err != nil { t.Fatal(err) } @@ -415,7 +431,7 @@ func TestMfsFile(t *testing.T) { // read back bytes we wrote buf := make([]byte, len(b)) - n, err = fi.Read(buf) + n, err = wfd.Read(buf) if err != nil { t.Fatal(err) } @@ -429,12 +445,12 @@ func TestMfsFile(t *testing.T) { } // truncate file to ten bytes - err = fi.Truncate(10) + err = wfd.Truncate(10) if err != nil { t.Fatal(err) } - size, err = fi.Size() + size, err = wfd.Size() if err != nil { t.Fatal(err) } @@ -445,7 +461,7 @@ func TestMfsFile(t *testing.T) { // 'writeAt' to extend it data := []byte("this is a test foo foo foo") - nwa, err := fi.WriteAt(data, 5) + nwa, err := wfd.WriteAt(data, 5) if err != nil { t.Fatal(err) } @@ -455,7 +471,7 @@ func TestMfsFile(t *testing.T) { } // assert size once more - size, err = fi.Size() + size, err = wfd.Size() if err != nil { t.Fatal(err) } @@ -464,14 +480,14 @@ func TestMfsFile(t *testing.T) { t.Fatal("size was incorrect") } - // make sure we can get node. TODO: verify it later - _, err = fi.GetNode() + // close it out! + err = wfd.Close() if err != nil { t.Fatal(err) } - // close it out! - err = fi.Close() + // make sure we can get node. TODO: verify it later + _, err = fi.GetNode() if err != nil { t.Fatal(err) } @@ -529,13 +545,18 @@ func actorMakeFile(d *Directory) error { return err } + wfd, err := f.Open(OpenWriteOnly, true) + if err != nil { + return err + } + r := io.LimitReader(randbo.New(), int64(77*rand.Intn(123))) - _, err = io.Copy(f, r) + _, err = io.Copy(wfd, r) if err != nil { return err } - err = f.Close() + err = wfd.Close() if err != nil { return err } @@ -630,9 +651,14 @@ func actorWriteFile(d *Directory) error { return err } + wfd, err := fi.Open(OpenWriteOnly, true) + if err != nil { + return err + } + offset := rand.Int63n(s) - n, err := fi.WriteAt(buf, offset) + n, err := wfd.WriteAt(buf, offset) if err != nil { return err } @@ -640,7 +666,7 @@ func actorWriteFile(d *Directory) error { return fmt.Errorf("didnt write enough") } - return fi.Close() + return wfd.Close() } func actorReadFile(d *Directory) error { @@ -657,12 +683,17 @@ func actorReadFile(d *Directory) error { return err } - _, err = ioutil.ReadAll(fi) + rfd, err := fi.Open(OpenReadOnly, false) if err != nil { return err } - return fi.Close() + _, err = ioutil.ReadAll(rfd) + if err != nil { + return err + } + + return rfd.Close() } func testActor(rt *Root, iterations int, errs chan error) { @@ -780,3 +811,187 @@ func TestFlushing(t *testing.T) { t.Fatalf("dag looks wrong, expected %s, but got %s", exp, rnk.B58String()) } } + +func readFile(rt *Root, path string, offset int64, buf []byte) error { + n, err := Lookup(rt, path) + if err != nil { + return err + } + + fi, ok := n.(*File) + if !ok { + return fmt.Errorf("%s was not a file", path) + } + + fd, err := fi.Open(OpenReadOnly, false) + if err != nil { + return err + } + + _, err = fd.Seek(offset, os.SEEK_SET) + if err != nil { + return err + } + + nread, err := fd.Read(buf) + if err != nil { + return err + } + if nread != len(buf) { + return fmt.Errorf("didnt read enough!") + } + + return fd.Close() +} + +func TestConcurrentReads(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ds, rt := setupRoot(ctx, t) + + rootdir := rt.GetValue().(*Directory) + + path := "a/b/c" + d := mkdirP(t, rootdir, path) + + buf := make([]byte, 2048) + randbo.New().Read(buf) + + fi := fileNodeFromReader(t, ds, bytes.NewReader(buf)) + err := d.AddChild("afile", fi) + if err != nil { + t.Fatal(err) + } + + var wg sync.WaitGroup + nloops := 100 + for i := 0; i < 10; i++ { + wg.Add(1) + go func(me int) { + defer wg.Done() + mybuf := make([]byte, len(buf)) + for j := 0; j < nloops; j++ { + offset := rand.Intn(len(buf)) + length := rand.Intn(len(buf) - offset) + + err := readFile(rt, "/a/b/c/afile", int64(offset), mybuf[:length]) + if err != nil { + t.Error("readfile failed: ", err) + return + } + + if !bytes.Equal(mybuf[:length], buf[offset:offset+length]) { + t.Error("incorrect read!") + } + } + }(i) + } + wg.Wait() +} + +func TestFileDescriptors(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ds, rt := setupRoot(ctx, t) + dir := rt.GetValue().(*Directory) + + nd := &dag.Node{Data: ft.FilePBData(nil, 0)} + fi, err := NewFile("test", nd, dir, ds) + if err != nil { + t.Fatal(err) + } + + // test read only + rfd1, err := fi.Open(OpenReadOnly, false) + if err != nil { + t.Fatal(err) + } + + err = rfd1.Truncate(0) + if err == nil { + t.Fatal("shouldnt be able to truncate readonly fd") + } + + _, err = rfd1.Write([]byte{}) + if err == nil { + t.Fatal("shouldnt be able to write to readonly fd") + } + + _, err = rfd1.Read([]byte{}) + if err != nil { + t.Fatalf("expected to be able to read from file: %s", err) + } + + done := make(chan struct{}) + go func() { + defer close(done) + // can open second readonly file descriptor + rfd2, err := fi.Open(OpenReadOnly, false) + if err != nil { + t.Error(err) + return + } + + rfd2.Close() + }() + + select { + case <-time.After(time.Second): + t.Fatal("open second file descriptor failed") + case <-done: + } + + if t.Failed() { + return + } + + // test not being able to open for write until reader are closed + done = make(chan struct{}) + go func() { + defer close(done) + wfd1, err := fi.Open(OpenWriteOnly, true) + if err != nil { + t.Error(err) + } + + wfd1.Close() + }() + + select { + case <-time.After(time.Millisecond * 200): + case <-done: + if t.Failed() { + return + } + + t.Fatal("shouldnt have been able to open file for writing") + } + + err = rfd1.Close() + if err != nil { + t.Fatal(err) + } + + select { + case <-time.After(time.Second): + t.Fatal("should have been able to open write fd after closing read fd") + case <-done: + } + + wfd, err := fi.Open(OpenWriteOnly, true) + if err != nil { + t.Fatal(err) + } + + _, err = wfd.Read([]byte{}) + if err == nil { + t.Fatal("shouldnt have been able to read from write only filedescriptor") + } + + _, err = wfd.Write([]byte{}) + if err != nil { + t.Fatal(err) + } +} diff --git a/mfs/ops.go b/mfs/ops.go index 9bc59994ce..b02d64fd1f 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -196,87 +196,17 @@ func DirLookup(d *Directory, pth string) (FSNode, error) { return cur, nil } -func FlushPath(r *Root, pth string) error { - parts := path.SplitList(strings.Trim(pth, "/")) - if len(parts) == 1 && parts[0] == "" { - parts = nil - } - - d, ok := r.GetValue().(*Directory) - if !ok { - return errors.New("mfs root somehow didnt point to a directory") - } - - nd, err := flushPathRec(d, parts) +func FlushPath(rt *Root, pth string) error { + nd, err := Lookup(rt, pth) if err != nil { return err } - k, err := nd.Key() + err = nd.Flush() if err != nil { return err } - r.repub.Update(k) - r.repub.WaitPub() - + rt.repub.WaitPub() return nil } - -func flushPathRec(d *Directory, parts []string) (*dag.Node, error) { - if len(parts) == 0 { - nd, err := d.GetNode() - if err != nil { - return nil, err - } - - return nd, nil - } - - d.Lock() - defer d.Unlock() - - next, err := d.childUnsync(parts[0]) - if err != nil { - log.Errorf("childnode: %q %q", parts[0], err) - return nil, err - } - - var ndagnode *dag.Node - switch next := next.(type) { - case *Directory: - nd, err := flushPathRec(next, parts[1:]) - if err != nil { - return nil, err - } - - ndagnode = nd - - case *File: - if len(parts) > 1 { - return nil, fmt.Errorf("%s is a file, not a directory", parts[0]) - } - - child, err := next.GetNode() - if err != nil { - return nil, err - } - - ndagnode = child - default: - return nil, fmt.Errorf("unrecognized FSNode type: %#v", next) - } - - newnode, err := d.node.UpdateNodeLink(parts[0], ndagnode) - if err != nil { - return nil, err - } - - _, err = d.dserv.Add(newnode) - if err != nil { - return nil, err - } - - d.node = newnode - return newnode, nil -} diff --git a/mfs/system.go b/mfs/system.go index 454577c457..2ccc6650c7 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -42,9 +42,8 @@ const ( // FSNode represents any node (directory, root, or file) in the mfs filesystem type FSNode interface { GetNode() (*dag.Node, error) + Flush() error Type() NodeType - Lock() - Unlock() } // Root represents the root of a filesystem tree @@ -210,6 +209,13 @@ func (p *Republisher) pubNow() { } func (p *Republisher) WaitPub() { + p.lk.Lock() + consistent := p.lastpub == p.val + p.lk.Unlock() + if consistent { + return + } + wait := make(chan struct{}) p.pubnowch <- wait <-wait @@ -273,7 +279,6 @@ func (np *Republisher) publish(ctx context.Context) error { topub := np.val np.lk.Unlock() - log.Info("Publishing Changes!") err := np.pubfunc(ctx, topub) if err != nil { return err From ccb3f15863c0a8af115258eedd9b07020a9a6d4a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 3 Feb 2016 20:45:12 -0800 Subject: [PATCH 1011/3147] introduce concept of filedescriptors to mfs, adjust fuse code to use them License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@ff4ffe58fd28133e68c0b228a53ab47c3b57897d --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 5306399f61..0f5793867f 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -372,7 +372,7 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { case os.SEEK_SET: newoffset = uint64(offset) case os.SEEK_END: - return 0, ErrSeekEndNotImpl + newoffset = uint64(fisize) - uint64(offset) default: return 0, ErrUnrecognizedWhence } From 089c37c4b4ff1df73c0483b78c9db9a1653eb764 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 10 Feb 2016 16:07:06 -0800 Subject: [PATCH 1012/3147] bump kvalue from 10 to 20 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@b2c9738c80cea987ccac102e943654637875b8c9 --- routing/dht/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/util.go b/routing/dht/util.go index 2b0c1e2a2a..a605759a95 100644 --- a/routing/dht/util.go +++ b/routing/dht/util.go @@ -8,7 +8,7 @@ import ( var PoolSize = 6 // K is the maximum number of requests to perform before returning failure. -var KValue = 10 +var KValue = 20 // Alpha is the concurrency factor for asynchronous requests. var AlphaValue = 3 From 9a83304f20da9025baf9eed95819fa36e0e940bc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 10 Feb 2016 17:03:22 -0800 Subject: [PATCH 1013/3147] put pubkey and ipns entry to dht in parallel License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@d4d2314f568c089aec770742a38a50b5495a05c3 --- namesys/publisher.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 981814f52d..67fcb26ef3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -146,12 +146,22 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) } - err = PublishEntry(ctx, r, ipnskey, entry) + errs := make(chan error) + + go func() { + errs <- PublishEntry(ctx, r, ipnskey, entry) + }() + + go func() { + errs <- PublishPublicKey(ctx, r, namekey, k.GetPublic()) + }() + + err = waitOnErrChan(ctx, errs) if err != nil { return err } - err = PublishPublicKey(ctx, r, namekey, k.GetPublic()) + err = waitOnErrChan(ctx, errs) if err != nil { return err } @@ -159,6 +169,19 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn return nil } +func waitOnErrChan(ctx context.Context, errs chan error) error { + select { + case err := <-errs: + if err != nil { + return err + } + case <-ctx.Done(): + return ctx.Err() + } + + return nil +} + func PublishPublicKey(ctx context.Context, r routing.IpfsRouting, k key.Key, pubk ci.PubKey) error { log.Debugf("Storing pubkey at: %s", k) pkbytes, err := pubk.Bytes() From 6f6b622d1119d56b1b5c2206ea402d864787f6fd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 10 Feb 2016 22:09:43 -0800 Subject: [PATCH 1014/3147] cleanup waitfunc License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@bb93660f70ad592352959ad4eddb29d29e4a7eb8 --- namesys/publisher.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 67fcb26ef3..8cf44c9d75 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -172,14 +172,10 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn func waitOnErrChan(ctx context.Context, errs chan error) error { select { case err := <-errs: - if err != nil { - return err - } + return err case <-ctx.Done(): return ctx.Err() } - - return nil } func PublishPublicKey(ctx context.Context, r routing.IpfsRouting, k key.Key, pubk ci.PubKey) error { From c0ee5062d4d747c24f21c11e248f18a2d986a774 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Thu, 11 Feb 2016 13:03:32 -0500 Subject: [PATCH 1015/3147] Capitalized could License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-namesys@dc13affa13edcaf81162dde045ea403f090256ca --- namesys/interface.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 68933bfe05..7978d74dd6 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -50,14 +50,14 @@ const ( ) // ErrResolveFailed signals an error when attempting to resolve. -var ErrResolveFailed = errors.New("could not resolve name.") +var ErrResolveFailed = errors.New("Could not resolve name.") // ErrResolveRecursion signals a recursion-depth limit. var ErrResolveRecursion = errors.New( - "could not resolve name (recursion limit exceeded).") + "Could not resolve name (recursion limit exceeded).") // ErrPublishFailed signals an error when attempting to publish. -var ErrPublishFailed = errors.New("could not publish name.") +var ErrPublishFailed = errors.New("Could not publish name.") // Namesys represents a cohesive name publishing and resolving system. // From 66c56b923a1f57c8f75184f0c85f6a4c5f2dffef Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 11 Feb 2016 11:09:09 -0800 Subject: [PATCH 1016/3147] fix race conditions in tests License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@1553868c9917d849bc4fd8aa00cc2080816364f0 --- namesys/resolve_test.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index ff1b27f540..555b3055a6 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,6 +6,7 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" @@ -16,8 +17,10 @@ import ( ) func TestRoutingResolve(t *testing.T) { - d := mockrouting.NewServer().Client(testutil.RandIdentityOrFatal(t)) - dstore := ds.NewMapDatastore() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + serv := mockrouting.NewServer() + id := testutil.RandIdentityOrFatal(t) + d := serv.ClientWithDatastore(context.Background(), id, dstore) resolver := NewRoutingResolver(d, 0) publisher := NewRoutingPublisher(d, dstore) @@ -50,7 +53,7 @@ func TestRoutingResolve(t *testing.T) { } func TestPrexistingExpiredRecord(t *testing.T) { - dstore := ds.NewMapDatastore() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) resolver := NewRoutingResolver(d, 0) @@ -87,7 +90,7 @@ func TestPrexistingExpiredRecord(t *testing.T) { } func TestPrexistingRecord(t *testing.T) { - dstore := ds.NewMapDatastore() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) resolver := NewRoutingResolver(d, 0) From 39bc0f01cf078d9b3c62f2a4af5ce8f66765b936 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 11 Feb 2016 11:09:09 -0800 Subject: [PATCH 1017/3147] fix race conditions in tests License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@ab366112d87ec1aeabcb2857ae8a0c60528ccf14 --- routing/mock/centralized_server.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 8e8d5d0b21..c05ca9460b 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,6 +6,7 @@ import ( "time" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/util/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" @@ -74,7 +75,7 @@ func (rs *s) Providers(k key.Key) []peer.PeerInfo { } func (rs *s) Client(p testutil.Identity) Client { - return rs.ClientWithDatastore(context.Background(), p, ds.NewMapDatastore()) + return rs.ClientWithDatastore(context.Background(), p, dssync.MutexWrap(ds.NewMapDatastore())) } func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Identity, datastore ds.Datastore) Client { From bd5e193a183d3e1584c64641c62b8fbee8738f5b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 8 Feb 2016 16:45:15 -0800 Subject: [PATCH 1018/3147] remove goprocess from godeps, use gx vendored one License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@66086e9b7df9ab974d1e932c5b67f19b4da3f242 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_bootstrap.go | 4 ++-- routing/dht/providers.go | 4 ++-- routing/dht/query.go | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index eadd5b4be3..ddab5044f3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -22,8 +22,8 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 3865bca13a..b059c11d67 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -12,8 +12,8 @@ import ( u "github.com/ipfs/go-ipfs/util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - periodicproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/periodic" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index c0c16c54e0..2f0a8e64df 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -3,9 +3,9 @@ package dht import ( "time" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - goprocessctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" key "github.com/ipfs/go-ipfs/blocks/key" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/query.go b/routing/dht/query.go index 53e75fecbc..e7dc7a8e1b 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -13,8 +13,8 @@ import ( queue "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer/queue" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - ctxproc "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 99d14e234327575081ee2921b36ad5d47f564643 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 8 Feb 2016 16:45:15 -0800 Subject: [PATCH 1019/3147] remove goprocess from godeps, use gx vendored one License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@356ca49837876b87be8bf7973b2fb7a1870aa99a --- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 37d4d19e23..4c4ca9386c 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -15,8 +15,8 @@ import ( proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" - gpctx "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess/context" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index a56111874e..31195892a6 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - goprocess "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/core" From 73509d6d6dd21b76e0d8507c5fd07688a24feefe Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 8 Feb 2016 23:10:19 -0800 Subject: [PATCH 1020/3147] remove randbo from godeps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@f97b811bc529af2fa02daec4ba43d64d43e6f2c2 --- mfs/mfs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index b8ba320ce9..060f8083c6 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -13,10 +13,10 @@ import ( "testing" "time" - randbo "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/dustin/randbo" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/path" + randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" From 6e6af6ddef736fb2bffaefb79ff3a39ce626fe29 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:07:20 -0800 Subject: [PATCH 1021/3147] remove gogo-protobuf from godeps, use gx vendored License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@fba232f88149839ab994eb4fb321c65f98f67b40 --- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/pb/dht.pb.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ddab5044f3..aad30fa513 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -20,7 +20,7 @@ import ( protocol "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index e88a94dc6b..d54c678efc 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,7 +4,7 @@ import ( "errors" "time" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index adff49c90c..dad0ac645d 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 265ff49f91..84320ab5de 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go index 2d7ad1d9db..24dc2e5be3 100644 --- a/routing/dht/pb/dht.pb.go +++ b/routing/dht/pb/dht.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package dht_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 407f0c0942..15e7eebeba 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,7 +4,7 @@ import ( "errors" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7e5f80275f..5dd6ceb87c 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,7 +4,7 @@ import ( "errors" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/record/record.go b/routing/record/record.go index 2adcc21bc0..78051e6963 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -3,7 +3,7 @@ package record import ( "bytes" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 8838b7aeb3..8f7d063b61 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -5,7 +5,7 @@ import ( "errors" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index c067f634b3..4fc7b7f04d 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,7 +1,7 @@ package proxy import ( - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 00892de88b..e8ec2f4340 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -3,7 +3,7 @@ package proxy import ( "errors" - ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 46caf03eac..8c79d21728 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" From 3158488783e4d37758a33ce1fcd16bfc171abc08 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:07:20 -0800 Subject: [PATCH 1022/3147] remove gogo-protobuf from godeps, use gx vendored License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@714fcc1714c62394a4516c9b4015097c74adf666 --- unixfs/archive/tar/writer.go | 2 +- unixfs/format.go | 2 +- unixfs/format_test.go | 2 +- unixfs/io/dagreader.go | 2 +- unixfs/mod/dagmodifier.go | 2 +- unixfs/pb/unixfs.pb.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 2d470b6675..32596618a2 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -6,7 +6,7 @@ import ( "path" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cxt "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" diff --git a/unixfs/format.go b/unixfs/format.go index 0bf5694380..af62f994f6 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -6,7 +6,7 @@ package unixfs import ( "errors" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "github.com/ipfs/go-ipfs/unixfs/pb" ) diff --git a/unixfs/format_test.go b/unixfs/format_test.go index f178b5615e..ac35db56f1 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -3,7 +3,7 @@ package unixfs import ( "testing" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "github.com/ipfs/go-ipfs/unixfs/pb" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index a1a104e442..5b2a8b112e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -7,7 +7,7 @@ import ( "io" "os" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0f5793867f..38d4459d95 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -6,7 +6,7 @@ import ( "io" "os" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index e89fca29a3..55348ad766 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. From 65e7875382410d6032d59fe0491040c969882e7b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:07:20 -0800 Subject: [PATCH 1023/3147] remove gogo-protobuf from godeps, use gx vendored License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@75d030b04a946c17cc17bee92020de231aca99f6 --- pinning/pinner/internal/pb/header.pb.go | 2 +- pinning/pinner/set.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go index eafb246e70..b77d37743e 100644 --- a/pinning/pinner/internal/pb/header.pb.go +++ b/pinning/pinner/internal/pb/header.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index a07762a319..f3d8258184 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -11,7 +11,7 @@ import ( "sort" "unsafe" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" From cf737bc2b8230856be788fb42e5860bb409b114a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:07:20 -0800 Subject: [PATCH 1024/3147] remove gogo-protobuf from godeps, use gx vendored License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@51213941ef479fe74f22796739d8aaee51c6d2bb --- namesys/ipns_select_test.go | 2 +- namesys/pb/namesys.pb.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index beeb0ac7c9..fb171e901d 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" diff --git a/namesys/pb/namesys.pb.go b/namesys/pb/namesys.pb.go index 0508e772df..31e6355d7d 100644 --- a/namesys/pb/namesys.pb.go +++ b/namesys/pb/namesys.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package namesys_pb -import proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/namesys/publisher.go b/namesys/publisher.go index 8cf44c9d75..241b40d3ad 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4c4ca9386c..2647a39543 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -13,7 +13,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/namesys/routing.go b/namesys/routing.go index 933bdd041b..7d499fe61a 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" From 652c3e009050c19ff82dce107879f45b05489708 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1025/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@ca32b60f28bd64be70c755842a1b2cb9fda39aab --- mfs/mfs_test.go | 2 +- mfs/repub_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 060f8083c6..a56b689394 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -28,7 +28,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func getDagserv(t *testing.T) dag.DAGService { diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 4ba7bae4fb..32e0b2b27b 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,7 +5,7 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" - ci "github.com/ipfs/go-ipfs/util/testutil/ci" + ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 1510b18838e7841b0e56c2ec445cb89bccd30f03 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1026/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@52fd0b26429e2fbff2511227a991c9f7f981ef17 --- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_test.go | 6 +++--- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 6 +++--- routing/dht/lookup.go | 2 +- routing/dht/query.go | 6 +++--- routing/dht/routing.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/keyspace/xor.go | 2 +- routing/keyspace/xor_test.go | 2 +- routing/mock/centralized_client.go | 6 +++--- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/record/validation.go | 2 +- 17 files changed, 25 insertions(+), 25 deletions(-) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index b059c11d67..b544884fc0 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,7 +9,7 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 55ed11c55c..3834c75e7c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,12 +17,12 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" netutil "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/test/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "github.com/ipfs/go-ipfs/util/testutil/ci" - travisci "github.com/ipfs/go-ipfs/util/testutil/ci/travis" + ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" + travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" ) var testCaseValues = map[key.Key][]byte{} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index dad0ac645d..41048df2a7 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,7 +16,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 84320ab5de..ea8996416b 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,13 +5,13 @@ import ( "fmt" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - u "github.com/ipfs/go-ipfs/util" - lgbl "github.com/ipfs/go-ipfs/util/eventlog/loggables" + lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 140fcae213..2def4046bc 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -4,7 +4,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" - pset "github.com/ipfs/go-ipfs/util/peerset" + pset "github.com/ipfs/go-ipfs/thirdparty/peerset" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index e7dc7a8e1b..518f1e11fa 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -6,11 +6,11 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" - pset "github.com/ipfs/go-ipfs/util/peerset" - todoctr "github.com/ipfs/go-ipfs/util/todocounter" + pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" queue "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer/queue" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index e0feda4ec8..5a74301220 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -11,7 +11,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - pset "github.com/ipfs/go-ipfs/util/peerset" + pset "github.com/ipfs/go-ipfs/thirdparty/peerset" inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 13f02df897..a023dba4e6 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - tu "github.com/ipfs/go-ipfs/util/testutil" + tu "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 73602d185d..df32378224 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/routing/keyspace/xor.go b/routing/keyspace/xor.go index 8fae7744f2..fd96fd65b3 100644 --- a/routing/keyspace/xor.go +++ b/routing/keyspace/xor.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "math/big" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // XORKeySpace is a KeySpace which: diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go index cac274278a..a461c094e7 100644 --- a/routing/keyspace/xor_test.go +++ b/routing/keyspace/xor_test.go @@ -5,7 +5,7 @@ import ( "math/big" "testing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func TestPrefixLen(t *testing.T) { diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 15e7eebeba..4f29a57761 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,15 +4,15 @@ import ( "errors" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - u "github.com/ipfs/go-ipfs/util" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index c05ca9460b..cc57e6a076 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,7 +8,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index d71b24c0bd..0bafda9b26 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 99ef8ba882..96be2a4895 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -4,7 +4,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 75daee9e96..69035c2324 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -9,7 +9,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "github.com/ipfs/go-ipfs/util/testutil" + "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index 32c33e966d..a898259c62 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) From c87778d31ec54e17497294fb8a763b0730b3a01c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1027/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@40e7d74e907795995026f02b2eb2ae6acd484fe1 --- unixfs/mod/dagmodifier.go | 2 +- unixfs/mod/dagmodifier_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 38d4459d95..ec70725971 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -7,7 +7,7 @@ import ( "os" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 0cd4a2f10a..a5ed5dc1b5 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -18,7 +18,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" From cea66196a47e5bd754af140ddbdb5e89440dcc62 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1028/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@a25e4c47c28950f3eeade963f8d523a2ac928a59 --- path/path.go | 2 +- path/resolver.go | 2 +- path/resolver_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/path/path.go b/path/path.go index 0891e84668..c069734171 100644 --- a/path/path.go +++ b/path/path.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 569a4d1be7..10368bbfdc 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/path/resolver_test.go b/path/resolver_test.go index 9ebb3f7a95..7f5f756c49 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -10,7 +10,7 @@ import ( merkledag "github.com/ipfs/go-ipfs/merkledag" dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - util "github.com/ipfs/go-ipfs/util" + util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func randNode() (*merkledag.Node, key.Key) { From c19b983a1c250f45a07dd8a3aaf14d64f185a033 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1029/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@9a1422d23616dd751c3d56a20d124550cf457798 --- pinning/pinner/pin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 5dd9c45cfd..9eb61acefe 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -13,7 +13,7 @@ import ( bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func randNode() (*mdag.Node, key.Key) { From 43cc40861b1c13736ad7b8da4c8201ea87816a74 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1030/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@08cbf9077d7d0cffc167a98f00665f930f38e677 --- namesys/ipns_select_test.go | 2 +- namesys/publisher.go | 2 +- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index fb171e901d..b6ffe1c407 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 241b40d3ad..4f3cfaf2ef 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,7 +19,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 555b3055a6..69f03f035c 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,9 +10,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - u "github.com/ipfs/go-ipfs/util" - testutil "github.com/ipfs/go-ipfs/util/testutil" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index 7d499fe61a..b10c224907 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,14 +6,14 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From 9e2fdbcba9b3fbd7f25884666984bfe9bb77b7b0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1031/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@88ccc80a73026e6daf9da65c385290341f1467a2 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 51979e6534..42c83b64ba 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -10,9 +10,9 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/namespace" dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" - mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From 1dd13ced0239300aa76ebf9be14f36f10acbac89 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1032/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@7cf3183239b5ba5a5269d305cfaa43510d5d2047 --- blockservice/test/blocks_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 8cd5e6dfb9..ab6a476aae 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -13,7 +13,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 6f98c452ba721acc901f42d1072b3f50a7883abd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 1033/3147] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@55f8309bfefb04bce470aea77271578c8ae225cc --- chunker/rabin_test.go | 2 +- chunker/splitting_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index b4e1b2dc4e..7702d3e76e 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/util" + "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "io" "testing" ) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 27b2a7b7a6..83dcaadba3 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From e5cb566fbcd0c5dd811a9f445f6bce06c3673112 Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Thu, 18 Feb 2016 13:40:03 -0800 Subject: [PATCH 1034/3147] Fixes range error by using > 0 length buffer. License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-mfs@6a77a95b450801f4612956b3de8bc85693c0567b --- mfs/mfs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index a56b689394..927a20f865 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -642,7 +642,7 @@ func actorWriteFile(d *Directory) error { return nil } - size := rand.Intn(1024) + size := rand.Intn(1024) + 1 buf := make([]byte, size) randbo.New().Read(buf) From cc7740d2db723ca755e7b4c8be2aa59de0d7fbc2 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Thu, 18 Feb 2016 17:39:26 -0500 Subject: [PATCH 1035/3147] Capitalized DHT License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-ipfs-routing@da75b0f0811264e5b2b10d044dfed8baf22c485f --- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/handlers.go | 2 +- routing/dht/records.go | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index d54c678efc..8fec446853 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -70,7 +70,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // measure the RTT for latency measurements. func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - log.Debugf("%s dht starting stream", dht.self) + log.Debugf("%s DHT starting stream", dht.self) s, err := dht.host.NewStream(ctx, ProtocolDHT, p) if err != nil { return nil, err @@ -108,7 +108,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message // sendMessage sends out a message func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message) error { - log.Debugf("%s dht starting stream", dht.self) + log.Debugf("%s DHT starting stream", dht.self) s, err := dht.host.NewStream(ctx, ProtocolDHT, p) if err != nil { return err diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3834c75e7c..cdd1c5e51a 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -93,7 +93,7 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { ctx, cancel := context.WithCancel(ctx) - log.Debugf("bootstrapping dhts...") + log.Debugf("Bootstrapping DHTs...") // tried async. sequential fares much better. compare: // 100 async https://gist.github.com/jbenet/56d12f0578d5f34810b2 @@ -391,7 +391,7 @@ func TestPeriodicBootstrap(t *testing.T) { connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) } - t.Logf("dhts are now connected to 1-2 others.", nDHTs) + t.Logf("DHTs are now connected to 1-2 others.", nDHTs) for _, dht := range dhts { rtlen := dht.routingTable.Size() if rtlen > 2 { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index ea8996416b..9c9598ffcc 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -106,7 +106,7 @@ func (dht *IpfsDHT) checkLocalDatastore(k key.Key) (*pb.Record, error) { rec := new(pb.Record) err = proto.Unmarshal(byts, rec) if err != nil { - log.Debug("Failed to unmarshal dht record from datastore") + log.Debug("Failed to unmarshal DHT record from datastore.") return nil, err } diff --git a/routing/dht/records.go b/routing/dht/records.go index 06a4e70b16..3c9587dfa7 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -42,7 +42,7 @@ func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, err } // last ditch effort: let's try the dht. - log.Debugf("pk for %s not in peerstore, and peer failed. trying dht.", p) + log.Debugf("pk for %s not in peerstore, and peer failed. Trying DHT.", p) pkkey := routing.KeyForPublicKey(p) val, err := dht.GetValue(ctxT, pkkey) @@ -77,14 +77,14 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub // node doesn't have key :( record := pmes.GetRecord() if record == nil { - return nil, fmt.Errorf("node not responding with its public key: %s", p) + return nil, fmt.Errorf("Node not responding with its public key: %s", p) } // Success! We were given the value. we don't need to check // validity because a) we can't. b) we know the hash of the // key we're looking for. val := record.GetValue() - log.Debug("dht got a value from other peer.") + log.Debug("DHT got a value from other peer.") pk, err = ci.UnmarshalPublicKey(val) if err != nil { @@ -100,7 +100,7 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub } // ok! it's valid. we got it! - log.Debugf("dht got public key from node itself.") + log.Debugf("DHT got public key from node itself.") return pk, nil } From dd4510967818ab02794ce8d677ef7d7846b2e258 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 Feb 2016 18:57:41 -0800 Subject: [PATCH 1036/3147] fix minor mfs truncate bug License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@aee8b331ad392947b4c4c34283cf61c30a8ed1fd --- unixfs/mod/dagmodifier.go | 2 +- unixfs/mod/dagmodifier_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index ec70725971..33f0824175 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -6,8 +6,8 @@ import ( "io" "os" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index a5ed5dc1b5..fc3810f3f1 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -447,6 +447,20 @@ func TestDagTruncate(t *testing.T) { if size != 10 { t.Fatal("size was incorrect!") } + + err = dagmod.Truncate(0) + if err != nil { + t.Fatal(err) + } + + size, err = dagmod.Size() + if err != nil { + t.Fatal(err) + } + + if size != 0 { + t.Fatal("size was incorrect!") + } } func TestSparseWrite(t *testing.T) { From 257f619f5819acb5e2daa2265cbe2e5349710eed Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 Feb 2016 18:57:41 -0800 Subject: [PATCH 1037/3147] fix minor mfs truncate bug License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@080e046ca1cf21e463e8f4eb9ed99d9a699fa609 --- mfs/dir.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/dir.go b/mfs/dir.go index fc949621ac..b73d8ad7cc 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -126,7 +126,7 @@ func (d *Directory) childNode(name string) (FSNode, error) { ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) d.childDirs[name] = ndir return ndir, nil - case ufspb.Data_File: + case ufspb.Data_File, ufspb.Data_Raw: nfi, err := NewFile(name, nd, d, d.dserv) if err != nil { return nil, err From 993fdae1b8620c36fa7c66fea067201c007aa357 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 20 Feb 2016 10:27:07 -0800 Subject: [PATCH 1038/3147] change batch fetching methods of dagserv License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@90961cf508c1d4436a1e7b2da1403f2d3e83182f --- unixfs/archive/tar/writer.go | 2 +- unixfs/io/dagreader.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 32596618a2..ad151016ad 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -39,7 +39,7 @@ func (w *Writer) writeDir(nd *mdag.Node, fpath string) error { return err } - for i, ng := range w.Dag.GetDAG(w.ctx, nd) { + for i, ng := range mdag.GetDAG(w.ctx, w.Dag, nd) { child, err := ng.Get(w.ctx) if err != nil { return err diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 5b2a8b112e..3c68ad896b 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -90,7 +90,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag func NewDataFileReader(ctx context.Context, n *mdag.Node, pb *ftpb.Data, serv mdag.DAGService) *DagReader { fctx, cancel := context.WithCancel(ctx) - promises := serv.GetDAG(fctx, n) + promises := mdag.GetDAG(fctx, serv, n) return &DagReader{ node: n, serv: serv, From 401e50350db4d04cccaca47fcfb2ee4b320bdd6f Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Mon, 26 Oct 2015 17:13:44 +0100 Subject: [PATCH 1039/3147] Remove usage of merkledag.Link.Node pointer outside of merkledag This prepares for inclusion of IPLD where the Node pointer won't be there. License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-path@6ffa40e3b9ae633d0a085626b044d05d97eb0b02 --- path/resolver.go | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 10368bbfdc..d5a6745e1c 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -111,37 +111,27 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names // for each of the path components for _, name := range names { - var next key.Key var nlink *merkledag.Link // for each of the links in nd, the current object for _, link := range nd.Links { if link.Name == name { - next = key.Key(link.Hash) nlink = link break } } - if next == "" { + if nlink == nil || len(nlink.Hash) == 0 { n, _ := nd.Multihash() return result, ErrNoLink{Name: name, Node: n} } - if nlink.Node == nil { - // fetch object for link and assign to nd - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - var err error - nd, err = s.DAG.Get(ctx, next) - if err != nil { - return append(result, nd), err - } - nlink.Node = nd - } else { - nd = nlink.Node + var err error + nd, err = nlink.GetNodeAndCache(ctx, s.DAG, time.Minute) + if err != nil { + return append(result, nd), err } - result = append(result, nlink.Node) + result = append(result, nd) } return result, nil } From e55e2c8431ddccef4aadf9581600f6d1eea30e39 Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Mon, 26 Oct 2015 22:47:04 +0100 Subject: [PATCH 1040/3147] path/resolver.go: Handle timeout here License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-path@4f4b6d19670930729150ffe295db6afc466fb26b --- path/resolver.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index d5a6745e1c..4bb11ecf07 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -125,8 +125,14 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names return result, ErrNoLink{Name: name, Node: n} } + if nlink.GetCachedNode() == nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, time.Minute) + defer cancel() + } + var err error - nd, err = nlink.GetNodeAndCache(ctx, s.DAG, time.Minute) + nd, err = nlink.GetNodeAndCache(ctx, s.DAG) if err != nil { return append(result, nd), err } From 4f85034cfbb187c64e4750fe39c17e8ffe35f63b Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Wed, 24 Feb 2016 08:34:32 +0100 Subject: [PATCH 1041/3147] merkledag: make Link.Node (the node cache) a private field License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-ipfs-pinner@4ee875a57dda07a989071172d00f4c0ea150b18b --- pinning/pinner/set.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index f3d8258184..669fa7a604 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -11,10 +11,10 @@ import ( "sort" "unsafe" - "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" + "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) @@ -172,7 +172,6 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint Name: "", Hash: childKey.ToMultihash(), Size: size, - Node: child, } n.Links[int(h%defaultFanout)] = l } From 5a16de4a1d0354cfbe32649eefbcfa69c75f7cf7 Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Wed, 24 Feb 2016 08:41:55 +0100 Subject: [PATCH 1042/3147] path/resolver.go: simplify ResolveLinks() License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-path@1cc3164818770bb9da2436f0b48742b5491cfdc1 --- path/resolver.go | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 4bb11ecf07..3eaf345fff 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -111,33 +111,20 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names // for each of the path components for _, name := range names { - var nlink *merkledag.Link - // for each of the links in nd, the current object - for _, link := range nd.Links { - if link.Name == name { - nlink = link - break - } - } + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, time.Minute) + defer cancel() - if nlink == nil || len(nlink.Hash) == 0 { + nextnode, err := nd.GetLinkedNode(ctx, s.DAG, name) + if err == merkledag.ErrLinkNotFound { n, _ := nd.Multihash() return result, ErrNoLink{Name: name, Node: n} + } else if err != nil { + return append(result, nextnode), err } - if nlink.GetCachedNode() == nil { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, time.Minute) - defer cancel() - } - - var err error - nd, err = nlink.GetNodeAndCache(ctx, s.DAG) - if err != nil { - return append(result, nd), err - } - - result = append(result, nd) + nd = nextnode + result = append(result, nextnode) } return result, nil } From c358779c99831c6db8213f612b286ffa49ec43ea Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Thu, 25 Feb 2016 07:35:28 +0100 Subject: [PATCH 1043/3147] Rename Encoded() to EncodeProtobuf() License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-unixfs@b3a517a2c125bad1b462edda6c253203469cc6a6 --- unixfs/mod/dagmodifier.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 33f0824175..0f5866716f 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -258,7 +258,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) node.Links[i].Hash = mh.Multihash(k) // Recache serialized node - _, err = node.Encoded(true) + _, err = node.EncodeProtobuf(true) if err != nil { return "", false, err } @@ -489,7 +489,7 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer nd.Data = d // invalidate cache and recompute serialized data - _, err = nd.Encoded(true) + _, err = nd.EncodeProtobuf(true) if err != nil { return nil, err } From 0927249d3c1a8fb85495a8f6ebe68dd16fdaf51a Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Sun, 28 Feb 2016 11:30:26 +0100 Subject: [PATCH 1044/3147] merkledag: Remove unused AddRecursive and RemoveRecursive License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-ipfs-pinner@104b9f6f818dac05d8d24e9b1dc24ce8534efb8a --- pinning/pinner/pin_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 9eb61acefe..09371fc6e9 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -104,7 +104,11 @@ func TestPinnerBasic(t *testing.T) { d.AddNodeLink("e", e) // Must be in dagserv for unpin to work - err = dserv.AddRecursive(d) + _, err = dserv.Add(e) + if err != nil { + t.Fatal(err) + } + _, err = dserv.Add(d) if err != nil { t.Fatal(err) } From 1fb33c024ff438dc2f480b962d3dd6389ab8b93b Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Sun, 28 Feb 2016 11:30:26 +0100 Subject: [PATCH 1045/3147] merkledag: Remove unused AddRecursive and RemoveRecursive License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-path@aa614ccddb36ba6679dd917f6a57d965b3855efb --- path/resolver_test.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/path/resolver_test.go b/path/resolver_test.go index 7f5f756c49..fe8155a85a 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -39,9 +39,11 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - err = dagService.AddRecursive(a) - if err != nil { - t.Fatal(err) + for _, n := range []*merkledag.Node{a, b, c} { + _, err = dagService.Add(n) + if err != nil { + t.Fatal(err) + } } aKey, err := a.Key() From e702c8f88d5402c20ba731d71d5efddcfb5b7cc9 Mon Sep 17 00:00:00 2001 From: Mildred Ki'Lya Date: Wed, 2 Mar 2016 09:54:42 +0100 Subject: [PATCH 1046/3147] Improve error reporting and fix pin/set_test.go License: MIT Signed-off-by: Mildred Ki'Lya This commit was moved from ipfs/go-ipfs-pinner@8b350306ea958e8f2b29369790d4a7ee5e88fc8e --- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 669fa7a604..fec38e2547 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -271,12 +271,12 @@ func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node func loadMultiset(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node, name string, internalKeys keyObserver) (map[key.Key]uint64, error) { l, err := root.GetNodeLink(name) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to get link %s: %v", name, err) } internalKeys(key.Key(l.Hash)) n, err := l.GetNode(ctx, dag) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to get node from link %s: %v", name, err) } refcounts := make(map[key.Key]uint64) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 3ef7ce51ba..b25f91a969 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -11,6 +11,8 @@ import ( "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" "github.com/ipfs/go-ipfs/merkledag" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) @@ -31,6 +33,14 @@ func TestMultisetRoundtrip(t *testing.T) { dag := merkledag.NewDAGService(bserv) fn := func(m map[key.Key]uint16) bool { + // Convert invalid multihash from input to valid ones + for k, v := range m { + if _, err := mh.Cast([]byte(k)); err != nil { + delete(m, k) + m[key.Key(u.Hash([]byte(k)))] = v + } + } + // Generate a smaller range for refcounts than full uint64, as // otherwise this just becomes overly cpu heavy, splitting it // out into too many items. That means we need to convert to @@ -43,6 +53,17 @@ func TestMultisetRoundtrip(t *testing.T) { if err != nil { t.Fatalf("storing multiset: %v", err) } + + // Check that the node n is in the DAG + k, err := n.Key() + if err != nil { + t.Fatalf("Could not get key: %v", err) + } + _, err = dag.Get(ctx, k) + if err != nil { + t.Fatalf("Could not get node: %v", err) + } + root := &merkledag.Node{} const linkName = "dummylink" if err := root.AddNodeLink(linkName, n); err != nil { From e7e6ca871d130c88fa5c780dbe332f5d96e7421d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 9 Mar 2016 09:53:19 -0800 Subject: [PATCH 1047/3147] update libp2p dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@6159b3f1358ce1cc4a2bc7f2ddb4b5eed3257012 --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 6 +++--- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 7978d74dd6..67f52f8916 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index b6ffe1c407..80aa83070d 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index b9c7538818..a3820ddae9 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 4f3cfaf2ef..186573a278 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,8 +6,8 @@ import ( "fmt" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" @@ -19,9 +19,9 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 2647a39543..e73279c137 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,12 +11,12 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 31195892a6..1e7df8dbdd 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 69f03f035c..9518552d46 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index b10c224907..e37dde5e51 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -4,17 +4,17 @@ import ( "fmt" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From 2d315d86daa512c1715569e363773daa6a6f2962 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 9 Mar 2016 09:53:19 -0800 Subject: [PATCH 1048/3147] update libp2p dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@a72cf948d2f3dd53d70a9402c3eca5108e6f0b0d --- routing/dht/dht.go | 10 +++++----- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 6 +++--- routing/dht/dht_test.go | 6 +++--- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 8 ++++---- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 4 ++-- routing/dht/pb/message.go | 6 +++--- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 6 +++--- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 4 ++-- 34 files changed, 61 insertions(+), 61 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index aad30fa513..53ed4d3ef9 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,16 +14,16 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" - host "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/protocol" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + host "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index b544884fc0..4cbfb3c4e5 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,8 +9,8 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 8fec446853..3af84e3ec3 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,11 +4,11 @@ import ( "errors" "time" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index cdd1c5e51a..4bb3390610 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,14 +11,14 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/test/util" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 3f8a7a9292..555f2ed626 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 41048df2a7..64745be79b 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -7,19 +7,19 @@ import ( "testing" "time" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 9c9598ffcc..ceecfa0ef0 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -9,7 +9,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 2def4046bc..076f3f5322 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,7 +5,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 2fe6cce404..224fecb9e0 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -1,9 +1,9 @@ package dht import ( - ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" + ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" - inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" + inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index a1c4887e11..d0ff6fa95e 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -1,11 +1,11 @@ package dht_pb import ( - ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" + ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 2f0a8e64df..94ec0e840f 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -4,9 +4,9 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index ec3b7a5d1f..b711246c95 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 518f1e11fa..419245c27d 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" - queue "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer/queue" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + queue "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/routing/dht/records.go b/routing/dht/records.go index 3c9587dfa7..f3def809d8 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,8 +8,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 5a74301220..33bf6a2ac2 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,8 +12,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 8924a63d4d..e12fe56c2d 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index e1e0a1bbfc..f96170e37d 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 5128b7821d..b627d681d2 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index a023dba4e6..9be348c531 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index df32378224..8b005315a3 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 4f29a57761..134f1477d0 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,12 +9,12 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ma "gx/ipfs/QmR3JkmZBKYXgNMNsNZawm914455Qof3PEopwuVSeXG7aV/go-multiaddr" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index cc57e6a076..1a131d01a4 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,7 +9,7 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 0bafda9b26..d875c94928 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 96be2a4895..77603c81c7 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 69035c2324..9d8e51423c 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 1f7c9749f9..be540f754e 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + p2phost "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 5dd6ceb87c..6ce6571c4f 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,14 +4,14 @@ import ( "errors" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" - "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/record.go b/routing/record/record.go index 78051e6963..f17ae9c614 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index a898259c62..bab827da57 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index 5acce6f54f..c039b8c394 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,8 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 8f7d063b61..d1485f1700 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,8 +12,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 4fc7b7f04d..50b7415526 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index e8ec2f4340..659f4b186d 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,9 +9,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - host "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/host" - inet "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/net" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + host "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" + inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 8c79d21728..45374f56ba 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,15 +4,15 @@ import ( "errors" "fmt" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 771e98c53d79d64ba131779e7a29193203f0f19b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 9 Mar 2016 09:53:19 -0800 Subject: [PATCH 1049/3147] update libp2p dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@13358c2e1cd8faa51103505c7cd1293ab350f2c7 --- unixfs/format.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/format.go b/unixfs/format.go index af62f994f6..6acb41050c 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -6,8 +6,8 @@ package unixfs import ( "errors" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "github.com/ipfs/go-ipfs/unixfs/pb" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) const ( From dcad7d641c9456a9edb8ae2b5cdf8700c90c1ff0 Mon Sep 17 00:00:00 2001 From: Chris P Date: Wed, 16 Mar 2016 18:51:15 +0100 Subject: [PATCH 1050/3147] util: Add DefaultIpfsHash constant for programtically accessing the current default. This commit was moved from ipfs/go-ipfs-util@9814eaec2c59803d85016286c561010345e98f05 --- util/util.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/util/util.go b/util/util.go index 1ce3a19b4e..019d0420c3 100644 --- a/util/util.go +++ b/util/util.go @@ -16,6 +16,9 @@ import ( mh "github.com/jbenet/go-multihash" ) +// DefaultIpfsHash is the current default hash function used by IPFS. +const DefaultIpfsHash = mh.SHA2_256 + // Debug is a global flag for debugging. var Debug bool @@ -115,7 +118,7 @@ func RPartition(subject string, sep string) (string, string, string) { // Hash is the global IPFS hash function. uses multihash SHA2_256, 256 bits func Hash(data []byte) mh.Multihash { - h, err := mh.Sum(data, mh.SHA2_256, -1) + h, err := mh.Sum(data, DefaultIpfsHash, -1) if err != nil { // this error can be safely ignored (panic) because multihash only fails // from the selection of hash function. If the fn + length are valid, it From d7c8aa7989ab98151e7457115564fb50271979c7 Mon Sep 17 00:00:00 2001 From: jbenet Date: Tue, 22 Mar 2016 09:02:29 -0400 Subject: [PATCH 1051/3147] license This commit was moved from ipfs/go-ipfs-util@d6aa22b9506c5587fc5c20489c0d96463569f8d0 --- util/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 util/LICENSE diff --git a/util/LICENSE b/util/LICENSE new file mode 100644 index 0000000000..c7386b3c94 --- /dev/null +++ b/util/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Juan Batiz-Benet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From b7b8ab23cf3b8d7c28ae246430f9f61018b597c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 20 Mar 2016 17:07:25 +0100 Subject: [PATCH 1052/3147] clean deprecated Key.Pretty() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-namesys@f647d44ebf098c094b885fb28020d450365b0a05 --- namesys/resolve_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 9518552d46..7429235683 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -42,7 +42,7 @@ func TestRoutingResolve(t *testing.T) { } pkhash := u.Hash(pubkb) - res, err := resolver.Resolve(context.Background(), key.Key(pkhash).Pretty()) + res, err := resolver.Resolve(context.Background(), key.Key(pkhash).B58String()) if err != nil { t.Fatal(err) } From 9f2bab9a18aaa53173af58aa3b771757bef927d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 20 Mar 2016 17:07:25 +0100 Subject: [PATCH 1053/3147] clean deprecated Key.Pretty() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-ipfs-routing@521e05f4f4b40acab876c3ce40c8b4a1034c4aeb --- routing/dht/handlers.go | 4 ++-- routing/dht/pb/message.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index ceecfa0ef0..bc74af0051 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -210,7 +210,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) key := key.Key(pmes.GetKey()) - lm["key"] = func() interface{} { return key.Pretty() } + lm["key"] = func() interface{} { return key.B58String() } // debug logging niceness. reqDesc := fmt.Sprintf("%s handleGetProviders(%s, %s): ", dht.self, p, key) @@ -254,7 +254,7 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M defer log.EventBegin(ctx, "handleAddProvider", lm).Done() key := key.Key(pmes.GetKey()) - lm["key"] = func() interface{} { return key.Pretty() } + lm["key"] = func() interface{} { return key.B58String() } log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, key) diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index d0ff6fa95e..5b9fb43090 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -143,7 +143,7 @@ func (m *Message) Loggable() map[string]interface{} { return map[string]interface{}{ "message": map[string]string{ "type": m.Type.String(), - "key": key.Key(m.GetKey()).Pretty(), + "key": key.Key(m.GetKey()).B58String(), }, } } From 2655942d672d2d5393d1060bcfadf1a9da2fcc50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 20 Mar 2016 17:07:25 +0100 Subject: [PATCH 1054/3147] clean deprecated Key.Pretty() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-ipfs-blockstore@f097ef90837f60360c19a5c949d9146591646e90 --- blockstore/blockstore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 685745f008..4987f96708 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -82,7 +82,7 @@ func TestAllKeysSimple(t *testing.T) { keys2 := collect(ch) // for _, k2 := range keys2 { - // t.Log("found ", k2.Pretty()) + // t.Log("found ", k2.B58String()) // } expectMatches(t, keys, keys2) From 07548b24a9322b18bcdbf02de1e33fb0546725da Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 29 Mar 2016 19:18:14 -0700 Subject: [PATCH 1055/3147] update utp and cleanup more godeps along the way License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@746d9328fecf865702a16a90b37cd7acff7bbd37 --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 67f52f8916..fa4bf3b358 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 80aa83070d..f6247df1cb 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index a3820ddae9..1a2fa18492 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 186573a278..d7875ce275 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,8 +19,8 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index e73279c137..7c31ae36e1 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 1e7df8dbdd..3bfc6711d7 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 7429235683..a3ed3d3e25 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index e37dde5e51..5a9dd85101 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,7 +13,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From 31f40ca08e935da4c24655539eec8d75875f265c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 29 Mar 2016 19:18:14 -0700 Subject: [PATCH 1056/3147] update utp and cleanup more godeps along the way License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d5f3462a862e30a70af82b776b7bda04b4c4a0ed --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 34 files changed, 52 insertions(+), 52 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 53ed4d3ef9..2cd9a9c545 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,10 +14,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" - host "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/protocol" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + host "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 4cbfb3c4e5..32e09a5cd0 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,7 +9,7 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 3af84e3ec3..2d3de7e9d5 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,8 +6,8 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 4bb3390610..a43c118ab9 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,8 +17,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/test/util" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 555f2ed626..a43bd2b57b 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 64745be79b..6656a6db04 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,9 +16,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index bc74af0051..d8141e71e4 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -9,7 +9,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 076f3f5322..d5fbd667a2 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,7 +5,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 224fecb9e0..74a31c8f02 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" - inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" + inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 5b9fb43090..7a01ff8b56 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,8 +4,8 @@ import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 94ec0e840f..3592c17344 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -4,9 +4,9 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index b711246c95..8c65fa97fa 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 419245c27d..d70e80e65b 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" - queue "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer/queue" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + queue "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/routing/dht/records.go b/routing/dht/records.go index f3def809d8..7376a1abe3 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,8 +8,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 33bf6a2ac2..28daaf1741 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,8 +12,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index e12fe56c2d..7ce83a0f83 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index f96170e37d..a190120b04 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index b627d681d2..15b0ed7dfd 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 9be348c531..ce11e673c7 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 8b005315a3..2b055e7947 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 134f1477d0..fd6442d415 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,7 +9,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 1a131d01a4..12f2c8fac8 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,7 +9,7 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index d875c94928..0ded9e7f52 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 77603c81c7..62da12d4e6 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 9d8e51423c..89425f82e1 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index be540f754e..470a0e7f56 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + p2phost "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 6ce6571c4f..c55b2b7f89 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -9,8 +9,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" - "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/routing/record/record.go b/routing/record/record.go index f17ae9c614..09bdda4f6b 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index bab827da57..9ed37766dc 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/routing.go b/routing/routing.go index c039b8c394..eb25d9429e 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,8 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index d1485f1700..becc4e7520 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,8 +12,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 50b7415526..62b018285c 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 659f4b186d..8fea1123ca 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,9 +9,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - host "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/host" - inet "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/net" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + host "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" + inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 45374f56ba..7040243b39 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 3b7b02e2b5a231ca8866d858e89cdaaf0be14b5f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 6 Apr 2016 15:42:06 -0700 Subject: [PATCH 1057/3147] switch to new libp2p with mss crypto License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@e33d8b243f57053130776240800419665860264e --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index fa4bf3b358..e29d3740be 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index f6247df1cb..2be0381f4b 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index 1a2fa18492..e5d6a7f64f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index d7875ce275..6b54335619 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,8 +19,8 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 7c31ae36e1..0b5024476a 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 3bfc6711d7..c67cdb0a5e 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index a3ed3d3e25..b5af6de2dc 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index 5a9dd85101..cadaa092ea 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,7 +13,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From db46906ea35a2e6f17312d6efcf9fe70e492ae86 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 6 Apr 2016 15:42:06 -0700 Subject: [PATCH 1058/3147] switch to new libp2p with mss crypto License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@0a26936a720619152dd49ee636d32cbdd37214ea --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 34 files changed, 52 insertions(+), 52 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 2cd9a9c545..99b073033a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,10 +14,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" - host "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/protocol" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" + host "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 32e09a5cd0..584f8b5a6a 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,7 +9,7 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 2d3de7e9d5..3eb6ee371e 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,9 +6,9 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index a43c118ab9..c8c60d63d3 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,8 +17,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/test/util" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index a43bd2b57b..c69ada553a 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 6656a6db04..e08307c8f4 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,9 +16,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index d8141e71e4..b8c51aae00 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -9,8 +9,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index d5fbd667a2..99c9b45de6 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,7 +5,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 74a31c8f02..69f603a99d 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" - inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" + inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 7a01ff8b56..2290de1039 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,8 +4,8 @@ import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 3592c17344..e16400291f 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 8c65fa97fa..3353db3016 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index d70e80e65b..34a5ca9b84 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" - queue "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer/queue" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + queue "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/routing/dht/records.go b/routing/dht/records.go index 7376a1abe3..0dd5756079 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,8 +8,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 28daaf1741..b9d31cda5f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,8 +12,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 7ce83a0f83..b061a67a06 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index a190120b04..8b1dada128 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 15b0ed7dfd..e0e398e4d7 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index ce11e673c7..4c5057754b 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 2b055e7947..1d6fe05a34 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index fd6442d415..3824a2b9c1 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,8 +9,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 12f2c8fac8..ac23d44804 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,7 +9,7 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 0ded9e7f52..adf63ae5c9 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 62da12d4e6..41fc4fe9e7 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 89425f82e1..894c25f8e4 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 470a0e7f56..4484c0f1c4 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + p2phost "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index c55b2b7f89..0dc281f1d1 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -9,9 +9,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" - "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" + "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/record.go b/routing/record/record.go index 09bdda4f6b..41c408f91f 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index 9ed37766dc..29e796f3df 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/routing.go b/routing/routing.go index eb25d9429e..dc2e6efc58 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,8 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index becc4e7520..e712a32518 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,8 +12,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 62b018285c..7f9e0be1de 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 8fea1123ca..5f11973080 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,9 +9,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - host "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/host" - inet "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/net" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + host "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" + inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 7040243b39..0993b55eae 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 37d9a65a8289d734e1f1ceecd0fce99e8031473c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 14 Feb 2016 23:58:45 -0800 Subject: [PATCH 1059/3147] fix dht command key escaping License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@0ad133af6d998128a8dbc496d7793245a3c7dd41 --- namesys/publisher.go | 1 + 1 file changed, 1 insertion(+) diff --git a/namesys/publisher.go b/namesys/publisher.go index 6b54335619..ba7353f6ad 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -141,6 +141,7 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn return err } + log.Error("KEY: ", []byte(namekey)) ttl, ok := checkCtxTTL(ctx) if ok { entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) From 98dc01f731b82cb0e27d5d8949077d280f586ec8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 15 Feb 2016 00:49:06 -0800 Subject: [PATCH 1060/3147] Remove debug log License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@da22186d9637f25bf084283b69f7ceac03009b5a --- namesys/publisher.go | 1 - 1 file changed, 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index ba7353f6ad..6b54335619 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -141,7 +141,6 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn return err } - log.Error("KEY: ", []byte(namekey)) ttl, ok := checkCtxTTL(ctx) if ok { entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) From 1e9171a2594a671fdf5c598699426cfa252912dd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Apr 2016 12:52:54 -0700 Subject: [PATCH 1061/3147] update libp2p dep to fix hanging listeners problem License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@a2a78b3f8a846401b2d74499b052efc26b7d378e --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 34 files changed, 52 insertions(+), 52 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 99b073033a..10f6efefcd 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,11 +14,11 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" - host "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" + host "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/protocol" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 584f8b5a6a..4427134df1 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,8 +9,8 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 3eb6ee371e..75525a8a82 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -7,9 +7,9 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index c8c60d63d3..3f3280c265 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,9 +17,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index c69ada553a..0a3679c05e 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index e08307c8f4..4c1af12eb6 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,10 +16,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index b8c51aae00..a1e1336463 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -10,9 +10,9 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // The number of closer peers to send on requests. diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 99c9b45de6..ccbae23182 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,8 +5,8 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Required in order for proper JSON marshaling diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 69f603a99d..3e39c12a7b 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" - inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" + inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 2290de1039..7219bd3ed2 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,9 +4,9 @@ import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index e16400291f..be84a7207f 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 3353db3016..7729bb889d 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 34a5ca9b84..85e80e42ca 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" - queue "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + queue "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer/queue" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/routing/dht/records.go b/routing/dht/records.go index 0dd5756079..504b0f2db5 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,9 +8,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // MaxRecordAge specifies the maximum time that any node will hold onto a record diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b9d31cda5f..af1f725e8e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,9 +12,9 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index b061a67a06..aebb4e5f5f 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 8b1dada128..d188554d71 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index e0e398e4d7..336fc3de1b 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 4c5057754b..90f1781863 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 1d6fe05a34..b81c4c05bc 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 3824a2b9c1..71720e2546 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -10,10 +10,10 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index ac23d44804..015f074903 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,8 +9,8 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index adf63ae5c9..515ad3db3b 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 41fc4fe9e7..95f5e2ab0a 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + mocknet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 894c25f8e4..50a01c3262 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 4484c0f1c4..a065c07270 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + p2phost "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 0dc281f1d1..0e5582a4d9 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,10 +10,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" - "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" + "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 41c408f91f..d20c3f2137 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) var log = logging.Logger("routing/record") diff --git a/routing/record/validation.go b/routing/record/validation.go index 29e796f3df..71d3a01d9d 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index dc2e6efc58..8305ca185f 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,9 +5,9 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // ErrNotFound is returned when a search fails to find anything diff --git a/routing/supernode/client.go b/routing/supernode/client.go index e712a32518..7a46b90d72 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,9 +12,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 7f9e0be1de..0985fbf83a 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 5f11973080..0be8ccaef3 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,10 +9,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - host "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/host" - inet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + host "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" + inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 0993b55eae..81cd1b22fc 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 9e46c96c41445c8a281ba1e2c288b3959a70808a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Apr 2016 12:52:54 -0700 Subject: [PATCH 1062/3147] update libp2p dep to fix hanging listeners problem License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@9c73fc24d373a2415a0a12d67bda1fcbb0b93110 --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index e29d3740be..b492bc93ed 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,8 +34,8 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 2be0381f4b..b62b1c98a1 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index e5d6a7f64f..62d21072bd 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,8 +7,8 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index 6b54335619..aa97dd73c2 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,9 +19,9 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 0b5024476a..e22031528e 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index c67cdb0a5e..4b281b0d28 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index b5af6de2dc..6550849aa4 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,9 +11,9 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index cadaa092ea..1520bfb685 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,9 +13,9 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) var log = logging.Logger("namesys") From 1074a079b4f9bba2e6470b8185a77d698342dfcd Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Wed, 6 Apr 2016 12:31:06 -0700 Subject: [PATCH 1063/3147] mfs.Mkdir returns the final Directory it creates License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-mfs@a40b1ab3793a8a38cc5c141306c1ac40d28e7c88 --- mfs/ops.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/ops.go b/mfs/ops.go index b02d64fd1f..e5c36206a6 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -100,9 +100,9 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // Mkdir creates a directory at 'path' under the directory 'd', creating // intermediary directories as needed if 'mkparents' is set to true -func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { +func Mkdir(r *Root, pth string, mkparents bool, flush bool) (*Directory, error) { if pth == "" { - return nil + return nil, nil } parts := path.SplitList(pth) if parts[0] == "" { @@ -117,9 +117,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { if len(parts) == 0 { // this will only happen on 'mkdir /' if mkparents { - return nil + return nil, nil } - return fmt.Errorf("cannot create directory '/': Already exists") + return nil, fmt.Errorf("cannot create directory '/': Already exists") } cur := r.GetValue().(*Directory) @@ -128,16 +128,16 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { if err == os.ErrNotExist && mkparents { mkd, err := cur.Mkdir(d) if err != nil { - return err + return nil, err } fsn = mkd } else if err != nil { - return err + return nil, err } next, ok := fsn.(*Directory) if !ok { - return fmt.Errorf("%s was not a directory", path.Join(parts[:i])) + return nil, fmt.Errorf("%s was not a directory", path.Join(parts[:i])) } cur = next } @@ -145,18 +145,18 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { final, err := cur.Mkdir(parts[len(parts)-1]) if err != nil { if !mkparents || err != os.ErrExist || final == nil { - return err + return nil, err } } if flush { err := final.Flush() if err != nil { - return err + return nil, err } } - return nil + return final, nil } func Lookup(r *Root, path string) (FSNode, error) { From b7a5e248126a57ff2c8a3cacc4af37ee3c0f2044 Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Wed, 6 Apr 2016 19:25:17 -0700 Subject: [PATCH 1064/3147] Cache files/dirs when added. License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-mfs@8b1e520cc2418cddd2fcad19cb9c0fbb1d871910 --- mfs/dir.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mfs/dir.go b/mfs/dir.go index b73d8ad7cc..ba14464ae7 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -116,6 +116,11 @@ func (d *Directory) childNode(name string) (FSNode, error) { return nil, err } + return d.cacheNode(name, nd) +} + +// cacheNode caches a node into d.childDirs or d.files and returns the FSNode. +func (d *Directory) cacheNode(name string, nd *dag.Node) (FSNode, error) { i, err := ft.FromBytes(nd.Data) if err != nil { return nil, err @@ -334,6 +339,17 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { d.modTime = time.Now() + if len(nd.Links) == 0 { + nfi, err := NewFile(name, nd, d, d.dserv) + if err != nil { + return err + } + d.files[name] = nfi + } else { + ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) + d.childDirs[name] = ndir + } + return nil } From 8f514f18ea11f96bc311b643d4bd16087a75cd53 Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Fri, 8 Apr 2016 14:33:38 -0700 Subject: [PATCH 1065/3147] More thorough error checking. License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-mfs@edc2a19a9eb8d129b81bca689e8201648dbb6c1d --- mfs/ops.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/ops.go b/mfs/ops.go index e5c36206a6..e45c367d78 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -102,7 +102,7 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // intermediary directories as needed if 'mkparents' is set to true func Mkdir(r *Root, pth string, mkparents bool, flush bool) (*Directory, error) { if pth == "" { - return nil, nil + return nil, fmt.Errorf("no path given to Mkdir") } parts := path.SplitList(pth) if parts[0] == "" { From 2b076bf6b8ef213795d52e2698f5b5ac9c55ec20 Mon Sep 17 00:00:00 2001 From: Stephen Whitmore Date: Tue, 12 Apr 2016 13:30:09 -0700 Subject: [PATCH 1066/3147] Revert "mfs.Mkdir returns the final Directory it creates" This reverts commit dfd98f27b25868c770cb1d50c3a3a82e5f53453d. License: MIT Signed-off-by: Stephen Whitmore This commit was moved from ipfs/go-mfs@f8a6382480a92a89e8cbf7c9a5f6786afc23b430 --- mfs/ops.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/ops.go b/mfs/ops.go index e45c367d78..950552f1b9 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -100,9 +100,9 @@ func PutNode(r *Root, path string, nd *dag.Node) error { // Mkdir creates a directory at 'path' under the directory 'd', creating // intermediary directories as needed if 'mkparents' is set to true -func Mkdir(r *Root, pth string, mkparents bool, flush bool) (*Directory, error) { +func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { if pth == "" { - return nil, fmt.Errorf("no path given to Mkdir") + return fmt.Errorf("no path given to Mkdir") } parts := path.SplitList(pth) if parts[0] == "" { @@ -117,9 +117,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) (*Directory, error) if len(parts) == 0 { // this will only happen on 'mkdir /' if mkparents { - return nil, nil + return nil } - return nil, fmt.Errorf("cannot create directory '/': Already exists") + return fmt.Errorf("cannot create directory '/': Already exists") } cur := r.GetValue().(*Directory) @@ -128,16 +128,16 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) (*Directory, error) if err == os.ErrNotExist && mkparents { mkd, err := cur.Mkdir(d) if err != nil { - return nil, err + return err } fsn = mkd } else if err != nil { - return nil, err + return err } next, ok := fsn.(*Directory) if !ok { - return nil, fmt.Errorf("%s was not a directory", path.Join(parts[:i])) + return fmt.Errorf("%s was not a directory", path.Join(parts[:i])) } cur = next } @@ -145,18 +145,18 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) (*Directory, error) final, err := cur.Mkdir(parts[len(parts)-1]) if err != nil { if !mkparents || err != os.ErrExist || final == nil { - return nil, err + return err } } if flush { err := final.Flush() if err != nil { - return nil, err + return err } } - return final, nil + return nil } func Lookup(r *Root, path string) (FSNode, error) { From 856c400ec88bddef16e48c4ba58921d893e22f8e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 13 Apr 2016 11:04:36 -0700 Subject: [PATCH 1067/3147] remove a ton of unused godeps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@c55cb13464aaf203a74771b8d1f6e0dfb45cae22 --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index c069734171..790168de09 100644 --- a/path/path.go +++ b/path/path.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" - b58 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" + b58 "gx/ipfs/QmT8rehPR3F6bmwL6zjUN8XpiDBFFpMP2myPdC6ApsWfJf/go-base58" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" ) From 4703f6a43037116b88a58bf185cecb6eb1e39a78 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sat, 16 Apr 2016 21:23:47 -0700 Subject: [PATCH 1068/3147] Update go-libp2p License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-namesys@7928016566bf85277c05a00e9443e1a01c464dd9 --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index b492bc93ed..52f934efb6 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,8 +34,8 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index b62b1c98a1..0ad5632e0b 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 62d21072bd..ac0efd8d91 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,8 +7,8 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index aa97dd73c2..5cd03c7419 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,9 +19,9 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index e22031528e..8f0184cb9f 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 4b281b0d28..cad47d478d 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 6550849aa4..ffdbac4f1b 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,9 +11,9 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 1520bfb685..1c91230d6a 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,9 +13,9 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) var log = logging.Logger("namesys") From 5d954c3c5fe43dab4bb1fa51c45c8a32d1369dab Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sat, 16 Apr 2016 21:23:47 -0700 Subject: [PATCH 1069/3147] Update go-libp2p License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-ipfs-routing@279515968ce93fe8f7cba095605470ae9782165d --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 34 files changed, 52 insertions(+), 52 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 10f6efefcd..2f834ccf7d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,11 +14,11 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + host "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + protocol "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/protocol" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" - host "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" - protocol "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/protocol" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 4427134df1..d660153e72 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,8 +9,8 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 75525a8a82..9a085c17b0 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,10 +6,10 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3f3280c265..3e369f1d66 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,9 +17,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + netutil "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" - netutil "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 0a3679c05e..c451a470de 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 4c1af12eb6..54904291d7 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,10 +16,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index a1e1336463..474cd82d09 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -9,10 +9,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // The number of closer peers to send on requests. diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index ccbae23182..ba08ea3ae3 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,8 +5,8 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Required in order for proper JSON marshaling diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 3e39c12a7b..baf5f81e8d 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" - inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" + inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 7219bd3ed2..d329ef44a9 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,9 +4,9 @@ import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" + inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index be84a7207f..0851319ead 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 7729bb889d..5fa0aa754b 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 85e80e42ca..5174370bf0 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + queue "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" - queue "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer/queue" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/routing/dht/records.go b/routing/dht/records.go index 504b0f2db5..05f628c479 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,9 +8,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // MaxRecordAge specifies the maximum time that any node will hold onto a record diff --git a/routing/dht/routing.go b/routing/dht/routing.go index af1f725e8e..46c7de416e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,9 +12,9 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index aebb4e5f5f..6ec1fcd75d 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index d188554d71..c23b49e6c0 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 336fc3de1b..c6cce4c88d 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 90f1781863..b6b44ed038 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index b81c4c05bc..4588702cea 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 71720e2546..574085bc72 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,11 +9,11 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 015f074903..b809de1ddb 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,8 +9,8 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 515ad3db3b..8cdc8e9e12 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 95f5e2ab0a..c276f97c9c 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" + mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - mocknet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 50a01c3262..25f95d72cb 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index a065c07270..f414dfdae3 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" + p2phost "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - p2phost "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 0e5582a4d9..4a2bb7fe8f 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -9,11 +9,11 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" - "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index d20c3f2137..ca30840178 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) var log = logging.Logger("routing/record") diff --git a/routing/record/validation.go b/routing/record/validation.go index 71d3a01d9d..c0d9ce1987 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/routing.go b/routing/routing.go index 8305ca185f..34200a1ae9 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,9 +5,9 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" + ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ci "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // ErrNotFound is returned when a search fails to find anything diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 7a46b90d72..7590fd47a5 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,9 +12,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 0985fbf83a..66f24dc86b 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 0be8ccaef3..dc0df97ddc 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,10 +9,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" + host "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" + inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - host "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/host" - inet "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/net" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 81cd1b22fc..ca7d387a65 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) // Server handles routing queries using a database backend From 0c2f7cda4ed296d9964dd89525ba7d399fd61bb4 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sat, 16 Apr 2016 21:38:22 -0700 Subject: [PATCH 1070/3147] Use extracted go-libp2p-crypto, -secio, -peer packages License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-namesys@8bc828e524d160f37362e253c6f1bbe38b15db0a --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 52f934efb6..c70bb86f26 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 0ad5632e0b..aadaa97951 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index ac0efd8d91..727aa71cec 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 5cd03c7419..970472546a 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,9 +19,9 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 8f0184cb9f..c84c30d2ed 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index cad47d478d..6fa9252660 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index ffdbac4f1b..995e80ee20 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,8 +11,8 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index 1c91230d6a..e3c6cc6108 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,7 +13,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From 3f872ef7f2255abbe500b3cfa5cb9561cc3ccc16 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sat, 16 Apr 2016 21:38:22 -0700 Subject: [PATCH 1071/3147] Use extracted go-libp2p-crypto, -secio, -peer packages License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-ipfs-routing@148d097451c87fec529336a799c68c372420b8a6 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 2 +- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/validation.go | 2 +- routing/routing.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- 32 files changed, 37 insertions(+), 37 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 2f834ccf7d..e0010bf5f2 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,10 +14,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" host "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" protocol "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/protocol" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index d660153e72..bfe5cc0918 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,8 +9,8 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 9a085c17b0..a0d8989728 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -7,8 +7,8 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 3e369f1d66..c3ff566bf0 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,9 +17,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" netutil "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index c451a470de..e87464b718 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 54904291d7..ac9b017498 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -18,8 +18,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 474cd82d09..c439834cc3 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -9,9 +9,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index ba08ea3ae3..975967ff23 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,7 +5,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index d329ef44a9..64f671a36f 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -5,7 +5,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 0851319ead..2656e02846 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 5fa0aa754b..e88b982f1f 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 5174370bf0..4a733ca9b9 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,9 +8,9 @@ import ( "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" - queue "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + queue "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer/queue" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/records.go b/routing/dht/records.go index 05f628c479..2d74be310c 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,8 +8,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 46c7de416e..5fdbae82b4 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -13,7 +13,7 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 6ec1fcd75d..30126d35d5 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index c23b49e6c0..1ff7acc250 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index c6cce4c88d..d8dd4344b5 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index b6b44ed038..caa999757c 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 4588702cea..e2c610f16b 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 574085bc72..dc92325e33 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,9 +9,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index b809de1ddb..3baf01a282 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,7 +9,7 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 8cdc8e9e12..09d96eeef1 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 25f95d72cb..a3a027a4b3 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index f414dfdae3..f47e0ada95 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,7 +7,7 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" p2phost "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 4a2bb7fe8f..aae1492184 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -9,9 +9,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" - "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/record.go b/routing/record/record.go index ca30840178..7cecc8d709 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/record/validation.go b/routing/record/validation.go index c0d9ce1987..e9a35cf54e 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/routing.go b/routing/routing.go index 34200a1ae9..4ccaa55828 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,8 +5,8 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/crypto" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 7590fd47a5..2d1d3c410d 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -13,7 +13,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 66f24dc86b..4b8cdc27d9 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index dc0df97ddc..9a4f4fda52 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -11,7 +11,7 @@ import ( kbucket "github.com/ipfs/go-ipfs/routing/kbucket" host "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index ca7d387a65..e3d1a92840 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // Server handles routing queries using a database backend From bc2dd479305dc7d62934d9660b73425c003689bf Mon Sep 17 00:00:00 2001 From: Michael Pfister Date: Mon, 18 Apr 2016 13:32:03 -0700 Subject: [PATCH 1072/3147] ipfs name resolve --local fixed multihash error resolveOnce should remove '/ipns/' prefix before using multihash functions. Fixes #2527 License: MIT Signed-off-by: Mike Pfister This commit was moved from ipfs/go-namesys@aac00c6dc9819e89f4e27be26337835eb7ea6534 --- namesys/routing.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/namesys/routing.go b/namesys/routing.go index 1520bfb685..6db13dfb0e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -2,6 +2,7 @@ package namesys import ( "fmt" + "strings" "time" lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" @@ -122,6 +123,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa return cached, nil } + name = strings.TrimPrefix(name, "/ipns/") hash, err := mh.FromB58String(name) if err != nil { // name should be a multihash. if it isn't, error out here. From de77a29dfcd4a97b52d97f5dcbcd4d4d64b91f8c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 20 Nov 2015 15:24:14 -0800 Subject: [PATCH 1073/3147] wire contexts into bitswap requests more deeply License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@d493d2d99105ef070fa474239cfde23ecf8686d1 --- blockservice/blockservice.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 21af30dfbe..0b0397b5b1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -122,6 +122,10 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []key.Key) <-chan *bloc } } + if len(misses) == 0 { + return + } + rblocks, err := s.Exchange.GetBlocks(ctx, misses) if err != nil { log.Debugf("Error with GetBlocks: %s", err) From 991f9577a8cffc62cd500abefaec7403588c02e2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Apr 2016 10:39:48 -0700 Subject: [PATCH 1074/3147] update libp2p with utp dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@cee268be625c07fec64f02250fbfafca55f6417c --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e0010bf5f2..d90e96c872 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,8 +15,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - host "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" - protocol "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/protocol" + host "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" + protocol "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/protocol" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index a0d8989728..40ceb29aad 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,7 +6,7 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index c3ff566bf0..586b9e56f5 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,7 +17,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - netutil "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/test/util" + netutil "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index ac9b017498..359ee32ce7 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,8 +16,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" + inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net/mock" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index baf5f81e8d..e14d520449 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" - inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 64f671a36f..54af0db4aa 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,7 +4,7 @@ import ( ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 5fdbae82b4..b2c0f9fd90 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,7 +12,7 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index c276f97c9c..a137b33933 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index f47e0ada95..828ac3a64a 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" + p2phost "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 2d1d3c410d..845643d36b 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,7 +12,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" + "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 4b8cdc27d9..25ae211094 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,7 +5,7 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 9a4f4fda52..4d98b61935 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,8 +9,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - host "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/host" - inet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net" + host "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" + inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) From e3c40948d4aef9fc1f0d4b80782bb350fd611cd7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Apr 2016 10:39:48 -0700 Subject: [PATCH 1075/3147] update libp2p with utp dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@8cb65a84ebc3587eb8cf225ff84c3094df902417 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 6fa9252660..40365ec209 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net/mock" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) From d441d92dde6a521dcd14c30ee8ab0a3bb2ab37ec Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Fri, 29 Apr 2016 16:57:19 -0400 Subject: [PATCH 1076/3147] Capitalized `NOTE`, first letter of following word License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-ipfs-routing@73ff11cc3068a343e8bce452f1c5bb5ec5df3361 --- routing/dht/dht.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/routing.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d90e96c872..d8552d977f 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -154,7 +154,7 @@ var errInvalidRecord = errors.New("received invalid record") // getValueOrPeers queries a particular peer p for the value for // key. It returns either the value or a list of closer peers. -// NOTE: it will update the dht's peerstore with any new addresses +// NOTE: It will update the dht's peerstore with any new addresses // it finds for the given peer. func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, key key.Key) (*pb.Record, []peer.PeerInfo, error) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index c439834cc3..a295b927b5 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -127,7 +127,7 @@ func (dht *IpfsDHT) checkLocalDatastore(k key.Key) (*pb.Record, error) { recordIsBad = true } - // NOTE: we do not verify the record here beyond checking these timestamps. + // NOTE: We do not verify the record here beyond checking these timestamps. // we put the burden of checking the records on the requester as checking a record // may be computationally expensive diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b2c0f9fd90..3663dc49ec 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -283,7 +283,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, ps := pset.NewLimited(count) provs := dht.providers.GetProviders(ctx, key) for _, p := range provs { - // NOTE: assuming that this list of peers is unique + // NOTE: Assuming that this list of peers is unique if ps.TryAdd(p) { select { case peerOut <- dht.peerstore.PeerInfo(p): From 6308abbf2454db1703ae209cc1d93da3665fc7f4 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Fri, 29 Apr 2016 16:57:19 -0400 Subject: [PATCH 1077/3147] Capitalized `NOTE`, first letter of following word License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-ipfs-pinner@0b8bb0494df428f52ea02d670a97b6d7f9e171aa --- pinning/pinner/pin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 09371fc6e9..c8859660ab 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -213,7 +213,7 @@ func TestPinRecursiveFail(t *testing.T) { t.Fatal(err) } - // Note: this isnt a time based test, we expect the pin to fail + // NOTE: This isnt a time based test, we expect the pin to fail mctx, _ := context.WithTimeout(ctx, time.Millisecond) err = p.Pin(mctx, a, true) if err == nil { From 4d4e54d12ef23afaac1acaec90c5ed9f18e492fc Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1078/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-routing@d01180a6bd8ee82a3f9baa3703dabe89649b12bd --- routing/dht/dht.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/kbucket/table.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 8 ++++---- routing/supernode/proxy/standard.go | 10 +++++----- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index d8552d977f..e5959e70ac 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,7 +18,7 @@ import ( host "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" protocol "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/protocol" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 54af0db4aa..7dc7e8f28e 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index 4a733ca9b9..a89ce2b803 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -11,7 +11,7 @@ import ( u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" queue "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer/queue" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index d8dd4344b5..1d41da7b15 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,7 +8,7 @@ import ( "time" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("table") diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index dc92325e33..93f4d5acc2 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -13,7 +13,7 @@ import ( u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 828ac3a64a..b8d2877b30 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,7 +9,7 @@ import ( p2phost "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index aae1492184..eca9416552 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -13,7 +13,7 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 7cecc8d709..41071e6c02 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("routing/record") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 845643d36b..6330cc2eb6 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,13 +8,14 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("supernode") @@ -37,7 +38,6 @@ func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (* } func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { - ctx = logging.ContextWithLoggable(ctx, logging.Uuid("findProviders")) defer log.EventBegin(ctx, "findProviders", &k).Done() ch := make(chan peer.PeerInfo) go func() { diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 4d98b61935..1e5906ada9 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,13 +6,14 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - kbucket "github.com/ipfs/go-ipfs/routing/kbucket" host "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + + key "github.com/ipfs/go-ipfs/blocks/key" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + kbucket "github.com/ipfs/go-ipfs/routing/kbucket" ) const ProtocolSNR = "/ipfs/supernoderouting" @@ -158,7 +159,6 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe return nil, err } e.Append(logging.Pair("response", response)) - e.Append(logging.Pair("uuid", logging.Uuid("foo"))) return response, nil } From 60e252f294440cb9d252039c133a0345cf6420c4 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1079/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-blockstore@0b8ac0fc671155184c56e92018018526d1eadc16 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 42c83b64ba..f8c086cc2a 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -14,7 +14,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("blockstore") From 8021a5d059236151446ab581c321b50fef38c5e8 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1080/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@364267d13702e925c0a2253b5137237aafc6eb6b --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0b0397b5b1..802f493d13 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("blockservice") From b994de89344cbc159a175bde9fd466ef24eef9e1 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1081/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-chunker@64cb0cf21198515d1fdefb1b3127e75c1c925966 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 3b539fe7bf..6b82a8c87a 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("chunk") From 40dfdca9a75f54e6e6274ee6f3b3f36f1ffbfc42 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1082/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@2c686c4d6b8a97001a3e3b1657c26fd64739ee87 --- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index c84c30d2ed..52004fbfb3 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -18,7 +18,7 @@ import ( gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/routing.go b/namesys/routing.go index bbfd0ae153..174e3506b6 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -16,7 +16,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("namesys") From 002e65175ddca7baaeb362bba9fc2f4fe6cba55c Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1083/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@b21fb9fe219fdba4d383f023f02a582dcdc0633a --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 0aad6c03ff..425fe1383d 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,7 +9,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index a7f62417f6..64c1bf2649 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,7 +12,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("pin") From 082d62ace6f1c5fcb198bef273a02f698954e5c4 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1084/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@8f33a2deb32ddc1f336c4c242303c3e9762035e8 --- mfs/system.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/system.go b/mfs/system.go index 2ccc6650c7..19f90a40df 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,7 +19,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var ErrNotExist = errors.New("no such rootfs") From a9c3d34493c845d327fd08d79c070099814434bb Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1085/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@4d071e23b88b547dc02b4e0c3beac15cb15ee475 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0f5866716f..ba266f3969 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -17,7 +17,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") From 9ae5edea482a830f462fddcb1d904fe2be6e4953 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 1086/3147] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-path@171db441fd1cbcb3b2625027ebee85b290b6de0c --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index 3eaf345fff..fb95b4f52f 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("path") From f6ce5ea30753430892772bd8a48287fdd9cf60be Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 5 May 2016 00:54:20 +0200 Subject: [PATCH 1087/3147] Restore go-log.Uuid() calls as loggables.Uuid() calls License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-routing@2c964c34e000172c58d342e25811272c7314d6fe --- routing/supernode/client.go | 2 ++ routing/supernode/proxy/standard.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 6330cc2eb6..acb4710582 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -16,6 +16,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" ) var log = logging.Logger("supernode") @@ -38,6 +39,7 @@ func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (* } func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { + logging.ContextWithLoggable(ctx, loggables.Uuid("findProviders")) defer log.EventBegin(ctx, "findProviders", &k).Done() ch := make(chan peer.PeerInfo) go func() { diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 1e5906ada9..2c0da5adca 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -14,6 +14,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" + loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" ) const ProtocolSNR = "/ipfs/supernoderouting" @@ -159,6 +160,7 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe return nil, err } e.Append(logging.Pair("response", response)) + e.Append(logging.Pair("uuid", loggables.Uuid("foo"))) return response, nil } From c98fef86577b2e619edc3b5cb4bbc1086f26ff89 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 5 May 2016 18:00:43 -0400 Subject: [PATCH 1088/3147] Make blocks.Block an interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@cc91da6feace4e695fa944f16bb9386abc19ecaf --- blockstore/blockstore.go | 16 ++++++++-------- blockstore/blockstore_test.go | 2 +- blockstore/write_cache.go | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f8c086cc2a..671ae2c254 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -30,9 +30,9 @@ var ErrNotFound = errors.New("blockstore: block not found") type Blockstore interface { DeleteBlock(key.Key) error Has(key.Key) (bool, error) - Get(key.Key) (*blocks.Block, error) - Put(*blocks.Block) error - PutMany([]*blocks.Block) error + Get(key.Key) (blocks.Block, error) + Put(blocks.Block) error + PutMany([]blocks.Block) error AllKeysChan(ctx context.Context) (<-chan key.Key, error) } @@ -73,7 +73,7 @@ type blockstore struct { gcreqlk sync.Mutex } -func (bs *blockstore) Get(k key.Key) (*blocks.Block, error) { +func (bs *blockstore) Get(k key.Key) (blocks.Block, error) { maybeData, err := bs.datastore.Get(k.DsKey()) if err == ds.ErrNotFound { return nil, ErrNotFound @@ -89,7 +89,7 @@ func (bs *blockstore) Get(k key.Key) (*blocks.Block, error) { return blocks.NewBlockWithHash(bdata, mh.Multihash(k)) } -func (bs *blockstore) Put(block *blocks.Block) error { +func (bs *blockstore) Put(block blocks.Block) error { k := block.Key().DsKey() // Has is cheaper than Put, so see if we already have it @@ -97,10 +97,10 @@ func (bs *blockstore) Put(block *blocks.Block) error { if err == nil && exists { return nil // already stored. } - return bs.datastore.Put(k, block.Data) + return bs.datastore.Put(k, block.Data()) } -func (bs *blockstore) PutMany(blocks []*blocks.Block) error { +func (bs *blockstore) PutMany(blocks []blocks.Block) error { t, err := bs.datastore.Batch() if err != nil { return err @@ -112,7 +112,7 @@ func (bs *blockstore) PutMany(blocks []*blocks.Block) error { continue } - err = t.Put(k, b.Data) + err = t.Put(k, b.Data()) if err != nil { return err } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 4987f96708..446d4b7762 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -40,7 +40,7 @@ func TestPutThenGetBlock(t *testing.T) { if err != nil { t.Fatal(err) } - if !bytes.Equal(block.Data, blockFromBlockstore.Data) { + if !bytes.Equal(block.Data(), blockFromBlockstore.Data()) { t.Fail() } } diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index 9084b1a672..f7c2caf456 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -34,11 +34,11 @@ func (w *writecache) Has(k key.Key) (bool, error) { return w.blockstore.Has(k) } -func (w *writecache) Get(k key.Key) (*blocks.Block, error) { +func (w *writecache) Get(k key.Key) (blocks.Block, error) { return w.blockstore.Get(k) } -func (w *writecache) Put(b *blocks.Block) error { +func (w *writecache) Put(b blocks.Block) error { k := b.Key() if _, ok := w.cache.Get(k); ok { return nil @@ -49,8 +49,8 @@ func (w *writecache) Put(b *blocks.Block) error { return w.blockstore.Put(b) } -func (w *writecache) PutMany(bs []*blocks.Block) error { - var good []*blocks.Block +func (w *writecache) PutMany(bs []blocks.Block) error { + var good []blocks.Block for _, b := range bs { if _, ok := w.cache.Get(b.Key()); !ok { good = append(good, b) From a375343ba729d31edec655f181b853be7ce3fdf0 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 5 May 2016 18:00:43 -0400 Subject: [PATCH 1089/3147] Make blocks.Block an interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-blockservice@a4fea7bb531bd4dc5a3ecf10ea56b2fdb1bda694 --- blockservice/blockservice.go | 10 +++++----- blockservice/test/blocks_test.go | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 802f493d13..78838757a4 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -41,7 +41,7 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. -func (s *BlockService) AddBlock(b *blocks.Block) (key.Key, error) { +func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) { k := b.Key() err := s.Blockstore.Put(b) if err != nil { @@ -53,7 +53,7 @@ func (s *BlockService) AddBlock(b *blocks.Block) (key.Key, error) { return k, nil } -func (s *BlockService) AddBlocks(bs []*blocks.Block) ([]key.Key, error) { +func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) { err := s.Blockstore.PutMany(bs) if err != nil { return nil, err @@ -71,7 +71,7 @@ func (s *BlockService) AddBlocks(bs []*blocks.Block) ([]key.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). -func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (*blocks.Block, error) { +func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", k) block, err := s.Blockstore.Get(k) if err == nil { @@ -103,8 +103,8 @@ func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (*blocks.Block, // GetBlocks gets a list of blocks asynchronously and returns through // the returned channel. // NB: No guarantees are made about order. -func (s *BlockService) GetBlocks(ctx context.Context, ks []key.Key) <-chan *blocks.Block { - out := make(chan *blocks.Block, 0) +func (s *BlockService) GetBlocks(ctx context.Context, ks []key.Key) <-chan blocks.Block { + out := make(chan blocks.Block, 0) go func() { defer close(out) var misses []key.Key diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index ab6a476aae..584505b215 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -24,7 +24,7 @@ func TestBlocks(t *testing.T) { b := blocks.NewBlock([]byte("beep boop")) h := u.Hash([]byte("beep boop")) - if !bytes.Equal(b.Multihash, h) { + if !bytes.Equal(b.Multihash(), h) { t.Error("Block Multihash and data multihash not equal") } @@ -54,7 +54,7 @@ func TestBlocks(t *testing.T) { t.Error("Block keys not equal.") } - if !bytes.Equal(b.Data, b2.Data) { + if !bytes.Equal(b.Data(), b2.Data()) { t.Error("Block data is not equal.") } } @@ -79,7 +79,7 @@ func TestGetBlocksSequential(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*50) defer cancel() out := servs[i].GetBlocks(ctx, keys) - gotten := make(map[key.Key]*blocks.Block) + gotten := make(map[key.Key]blocks.Block) for blk := range out { if _, ok := gotten[blk.Key()]; ok { t.Fatal("Got duplicate block!") From c2176c681912628bd3e2827cf1d85c1e5e2537a0 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 5 May 2016 18:00:43 -0400 Subject: [PATCH 1090/3147] Make blocks.Block an interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-chunker@f5c45f3a3e8e1186039cbc9f9d73cacaccc1bbef --- chunker/rabin_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 7702d3e76e..9b9cfce8fd 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -39,10 +39,10 @@ func TestRabinChunking(t *testing.T) { } } -func chunkData(t *testing.T, data []byte) map[key.Key]*blocks.Block { +func chunkData(t *testing.T, data []byte) map[key.Key]blocks.Block { r := NewRabin(bytes.NewReader(data), 1024*256) - blkmap := make(map[key.Key]*blocks.Block) + blkmap := make(map[key.Key]blocks.Block) for { blk, err := r.NextBytes() From 3d7122a77c2e9a9946bc77d6f4e8fe59ac247ee2 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 5 May 2016 18:00:43 -0400 Subject: [PATCH 1091/3147] Make blocks.Block an interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-exchange-offline@9e9cf60bd2b08383a11a51ed29a8b2da905efcdf --- exchange/offline/offline.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 8f857d9331..d2ee4fbaa6 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -23,12 +23,12 @@ type offlineExchange struct { // GetBlock returns nil to signal that a block could not be retrieved for the // given key. // NB: This function may return before the timeout expires. -func (e *offlineExchange) GetBlock(_ context.Context, k key.Key) (*blocks.Block, error) { +func (e *offlineExchange) GetBlock(_ context.Context, k key.Key) (blocks.Block, error) { return e.bs.Get(k) } // HasBlock always returns nil. -func (e *offlineExchange) HasBlock(b *blocks.Block) error { +func (e *offlineExchange) HasBlock(b blocks.Block) error { return e.bs.Put(b) } @@ -39,8 +39,8 @@ func (_ *offlineExchange) Close() error { return nil } -func (e *offlineExchange) GetBlocks(ctx context.Context, ks []key.Key) (<-chan *blocks.Block, error) { - out := make(chan *blocks.Block, 0) +func (e *offlineExchange) GetBlocks(ctx context.Context, ks []key.Key) (<-chan blocks.Block, error) { + out := make(chan blocks.Block, 0) go func() { defer close(out) var misses []key.Key From 4f1aeff4a0c23a5cf088cb5368f3d21e4b74b609 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 5 May 2016 18:00:43 -0400 Subject: [PATCH 1092/3147] Make blocks.Block an interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-exchange-interface@631c4132a2d6119fdcf41f8158a9cb328afa668a --- exchange/interface.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index dbc66e3b67..6db476d9ec 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -13,13 +13,13 @@ import ( // exchange protocol. type Interface interface { // type Exchanger interface // GetBlock returns the block associated with a given key. - GetBlock(context.Context, key.Key) (*blocks.Block, error) + GetBlock(context.Context, key.Key) (blocks.Block, error) - GetBlocks(context.Context, []key.Key) (<-chan *blocks.Block, error) + GetBlocks(context.Context, []key.Key) (<-chan blocks.Block, error) // TODO Should callers be concerned with whether the block was made // available on the network? - HasBlock(*blocks.Block) error + HasBlock(blocks.Block) error io.Closer } From f22917bda9ae382574dc9c2c6c4aab6a2c6a6617 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 May 2016 16:06:28 -0700 Subject: [PATCH 1093/3147] update libp2p with go-multiaddr and go-stream-muxer updates License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@803748f00a8f0f4712dfce88c626204aea043f14 --- routing/dht/dht.go | 6 +++--- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 6 +++--- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 4 ++-- routing/dht/pb/message.go | 6 +++--- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 2 +- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 2 +- routing/routing.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 32 files changed, 50 insertions(+), 50 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index e5959e70ac..77a6c8cab8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,10 +15,10 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - host "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" - protocol "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/protocol" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + host "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" + protocol "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/protocol" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index bfe5cc0918..5fddf954e9 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 40ceb29aad..8dec0fe83b 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,10 +6,10 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 586b9e56f5..1234be143e 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,15 +11,15 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - netutil "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + netutil "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index e87464b718..cf30393f18 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 359ee32ce7..0c43b3b2b7 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,10 +16,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net/mock" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net/mock" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index a295b927b5..15fd256793 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -11,7 +11,7 @@ import ( lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 975967ff23..ad523d6d94 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,7 +5,7 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index e14d520449..a64eb42048 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -1,9 +1,9 @@ package dht import ( - ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" + ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" + inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 7dc7e8f28e..75a138ed2e 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -1,12 +1,12 @@ package dht_pb import ( - ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" + ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 2656e02846..df16a5c15b 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index e88b982f1f..9d48619432 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index a89ce2b803..872e9f9476 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -9,8 +9,8 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" - queue "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer/queue" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + queue "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer/queue" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/records.go b/routing/dht/records.go index 2d74be310c..fdfb12d2dd 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -9,7 +9,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 3663dc49ec..9182c0873b 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,9 +12,9 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 30126d35d5..37b7cb8c8d 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 1ff7acc250..6d282e0f09 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 1d41da7b15..7c22fec7d6 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index caa999757c..4ac3a2af02 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index e2c610f16b..8653c7e6aa 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 93f4d5acc2..5230fba832 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,12 +9,12 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" + ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 3baf01a282..13ae8e2621 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,7 +9,7 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 09d96eeef1..1d88623065 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index a137b33933..3f2d01272d 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + mocknet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index a3a027a4b3..25069071be 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index b8d2877b30..d40eb30fb3 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + p2phost "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index eca9416552..4942b27c6a 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -11,7 +11,7 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) diff --git a/routing/routing.go b/routing/routing.go index 4ccaa55828..3b1ab799c2 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index acb4710582..034c223d9b 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,9 +8,9 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 25ae211094..3fc8690c8a 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 2c0da5adca..c97248df65 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,10 +6,10 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - host "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/host" - inet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + host "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" + inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index e3d1a92840..815e53e1be 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // Server handles routing queries using a database backend From cae6bf0b1a90c6577382d14ec88c86d6e7c1270b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 May 2016 16:06:28 -0700 Subject: [PATCH 1094/3147] update libp2p with go-multiaddr and go-stream-muxer updates License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@b5f18e1fb46745ffbac21bab3f6a2317ee042c27 --- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 970472546a..17bc7d7361 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -21,7 +21,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 52004fbfb3..dc06458988 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 40365ec209..81f0495a2f 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmXDvxcXUYn2DDnGKJwdQPxkJgG83jBTp5UmmNzeHzqbj5/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + mocknet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 995e80ee20..4d638735f3 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -12,7 +12,7 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 76bb21e8d296f7f00c497b2d0eb7a394b69689d3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 13 May 2016 13:42:46 -0700 Subject: [PATCH 1095/3147] update deps to introduce yamux hang fix License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@139f9f0b453e2eb02883f1832bd68ebf2aba6be1 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 77a6c8cab8..149000603d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -16,9 +16,9 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + host "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" + protocol "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/protocol" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - host "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" - protocol "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/protocol" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 8dec0fe83b..415ab9d423 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -8,8 +8,8 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 1234be143e..5d53e18339 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -19,7 +19,7 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - netutil "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/test/util" + netutil "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 0c43b3b2b7..dfdf999291 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -18,8 +18,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net/mock" + inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net/mock" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/notif.go b/routing/dht/notif.go index a64eb42048..ed312b9288 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" + inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 75a138ed2e..ec69c35125 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -5,8 +5,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9182c0873b..63163d6882 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -13,8 +13,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 3f2d01272d..a5a0bef257 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" + mocknet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - mocknet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index d40eb30fb3..887c593f48 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,9 +7,9 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + p2phost "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - p2phost "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" ) var log = logging.Logger("mockrouter") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 034c223d9b..def4319542 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -9,8 +9,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 3fc8690c8a..3a2b081575 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" + inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index c97248df65..04706a55d3 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -7,9 +7,9 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + host "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" + inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - host "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/host" - inet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" From fadb803fede1823eb13c0a65be4a453b27acf172 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 13 May 2016 13:42:46 -0700 Subject: [PATCH 1096/3147] update deps to introduce yamux hang fix License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@31cf8180275458066ba4d3c298e115130c71ac5e --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 81f0495a2f..872e92d3ad 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - mocknet "gx/ipfs/QmcQTVCQWCN2MYgBHpFXE5S56rcg2mRsxaRgMYmA1UWgA8/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From b2d05625c11ff1ea305287e1cfffea15da21183b Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sun, 15 May 2016 18:15:28 +0200 Subject: [PATCH 1097/3147] pin: add missing consts and convertion functions License: MIT Signed-off-by: Christian Couder This commit was moved from ipfs/go-ipfs-pinner@a54f592f0908a246a01d7c38aed3049d7ae8fa42 --- pinning/pinner/pin.go | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 64c1bf2649..df7440fac3 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -22,8 +22,13 @@ var pinDatastoreKey = ds.NewKey("/local/pins") var emptyKey = key.B58KeyDecode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") const ( - linkDirect = "direct" linkRecursive = "recursive" + linkDirect = "direct" + linkIndirect = "indirect" + linkInternal = "internal" + linkNotPinned = "not pinned" + linkAny = "any" + linkAll = "all" ) type PinMode int @@ -31,9 +36,39 @@ type PinMode int const ( Recursive PinMode = iota Direct + Indirect + Internal NotPinned + Any ) +func PinModeToString(mode PinMode) (string, bool) { + m := map[PinMode]string{ + Recursive: linkRecursive, + Direct: linkDirect, + Indirect: linkIndirect, + Internal: linkInternal, + NotPinned: linkNotPinned, + Any: linkAny, + } + s, ok := m[mode] + return s, ok +} + +func StringToPinMode(s string) (PinMode, bool) { + m := map[string]PinMode{ + linkRecursive: Recursive, + linkDirect: Direct, + linkIndirect: Indirect, + linkInternal: Internal, + linkNotPinned: NotPinned, + linkAny: Any, + linkAll: Any, // "all" and "any" means the same thing + } + mode, ok := m[s] + return mode, ok +} + type Pinner interface { IsPinned(key.Key) (string, bool, error) IsPinnedWithType(key.Key, string) (string, bool, error) From 1d461b7e9818e76b9293c0c933651ce8ffbc494e Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sun, 15 May 2016 17:13:55 +0200 Subject: [PATCH 1098/3147] pin: use new constants instead of literal values License: MIT Signed-off-by: Christian Couder This commit was moved from ipfs/go-ipfs-pinner@262c7287ad9438cbd2822b8cc35bc0471d2ed1d1 --- pinning/pinner/pin.go | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index df7440fac3..0696e79848 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -71,7 +71,7 @@ func StringToPinMode(s string) (PinMode, bool) { type Pinner interface { IsPinned(key.Key) (string, bool, error) - IsPinnedWithType(key.Key, string) (string, bool, error) + IsPinnedWithType(key.Key, PinMode) (string, bool, error) Pin(context.Context, *mdag.Node, bool) error Unpin(context.Context, key.Key, bool) error @@ -164,7 +164,7 @@ var ErrNotPinned = fmt.Errorf("not pinned") func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() - reason, pinned, err := p.isPinnedWithType(k, "all") + reason, pinned, err := p.isPinnedWithType(k, Any) if err != nil { return err } @@ -197,46 +197,47 @@ func (p *pinner) isInternalPin(key key.Key) bool { func (p *pinner) IsPinned(k key.Key) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.isPinnedWithType(k, "all") + return p.isPinnedWithType(k, Any) } -func (p *pinner) IsPinnedWithType(k key.Key, typeStr string) (string, bool, error) { +func (p *pinner) IsPinnedWithType(k key.Key, mode PinMode) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.isPinnedWithType(k, typeStr) + return p.isPinnedWithType(k, mode) } // isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // intended for use by other pinned methods that already take locks -func (p *pinner) isPinnedWithType(k key.Key, typeStr string) (string, bool, error) { - switch typeStr { - case "all", "direct", "indirect", "recursive", "internal": +func (p *pinner) isPinnedWithType(k key.Key, mode PinMode) (string, bool, error) { + switch mode { + case Any, Direct, Indirect, Recursive, Internal: default: - err := fmt.Errorf("Invalid type '%s', must be one of {direct, indirect, recursive, internal, all}", typeStr) + err := fmt.Errorf("Invalid Pin Mode '%d', must be one of {%d, %d, %d, %d, %d}", + mode, Direct, Indirect, Recursive, Internal, Any) return "", false, err } - if (typeStr == "recursive" || typeStr == "all") && p.recursePin.HasKey(k) { - return "recursive", true, nil + if (mode == Recursive || mode == Any) && p.recursePin.HasKey(k) { + return linkRecursive, true, nil } - if typeStr == "recursive" { + if mode == Recursive { return "", false, nil } - if (typeStr == "direct" || typeStr == "all") && p.directPin.HasKey(k) { - return "direct", true, nil + if (mode == Direct || mode == Any) && p.directPin.HasKey(k) { + return linkDirect, true, nil } - if typeStr == "direct" { + if mode == Direct { return "", false, nil } - if (typeStr == "internal" || typeStr == "all") && p.isInternalPin(k) { - return "internal", true, nil + if (mode == Internal || mode == Any) && p.isInternalPin(k) { + return linkInternal, true, nil } - if typeStr == "internal" { + if mode == Internal { return "", false, nil } - // Default is "indirect" + // Default is Indirect for _, rk := range p.recursePin.GetKeys() { rnd, err := p.dserv.Get(context.Background(), rk) if err != nil { From 27106f3f3f38768d38822577f94493e94e59d9f1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 16 May 2016 11:22:36 -0700 Subject: [PATCH 1099/3147] update libp2p to v3.2.1 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@7553bcb1d057c80b798d6b526b629eab0a84712d --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 149000603d..deef860226 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,9 +15,9 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + host "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" + protocol "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/protocol" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - host "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" - protocol "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/protocol" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 415ab9d423..2fe516cec7 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,9 +6,9 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 5d53e18339..0c66a55028 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,9 +17,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" + netutil "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - netutil "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/test/util" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index dfdf999291..7c54461726 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,10 +16,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net/mock" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net/mock" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/notif.go b/routing/dht/notif.go index ed312b9288..fb7c2ee145 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" + inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index ec69c35125..919841f049 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,8 +4,8 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" + inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 63163d6882..d91478101b 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,8 +12,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index a5a0bef257..cb4987cfca 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 887c593f48..f549efca60 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" + p2phost "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - p2phost "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index def4319542..4a362693cc 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,8 +8,8 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 3a2b081575..0ecd65b601 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 04706a55d3..6d242ad43d 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,9 +6,9 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + host "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" + inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - host "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/host" - inet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" key "github.com/ipfs/go-ipfs/blocks/key" From cd807dd35ef53a5082cc6820a154af5da8a4d2b7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 16 May 2016 11:22:36 -0700 Subject: [PATCH 1100/3147] update libp2p to v3.2.1 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@80cc569b51b8db54089fd62acbb489c5472cd9ef --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 872e92d3ad..4d838d33f7 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" + mocknet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net/mock" peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - mocknet "gx/ipfs/QmZpVD1kkRwoC67vNknvCrY72pjmVdtZ7txSk8mtCbuwd3/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 03a0bde418657e2185cf972e56161f0cd4d0e867 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 16 May 2016 17:09:54 -0700 Subject: [PATCH 1101/3147] don't return nil multiaddrs from dht messages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d76463e795c5a8d97b0eae8e012979640c26ba7a --- routing/dht/pb/message.go | 11 ++++++----- routing/dht/pb/message_test.go | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 routing/dht/pb/message_test.go diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 919841f049..ba3104ca24 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -107,14 +107,15 @@ func (m *Message_Peer) Addresses() []ma.Multiaddr { return nil } - var err error - maddrs := make([]ma.Multiaddr, len(m.Addrs)) - for i, addr := range m.Addrs { - maddrs[i], err = ma.NewMultiaddrBytes(addr) + maddrs := make([]ma.Multiaddr, 0, len(m.Addrs)) + for _, addr := range m.Addrs { + maddr, err := ma.NewMultiaddrBytes(addr) if err != nil { - log.Debugf("error decoding Multiaddr for peer: %s", m.GetId()) + log.Warningf("error decoding Multiaddr for peer: %s", m.GetId()) continue } + + maddrs = append(maddrs, maddr) } return maddrs } diff --git a/routing/dht/pb/message_test.go b/routing/dht/pb/message_test.go new file mode 100644 index 0000000000..71f4abdc5e --- /dev/null +++ b/routing/dht/pb/message_test.go @@ -0,0 +1,15 @@ +package dht_pb + +import ( + "testing" +) + +func TestBadAddrsDontReturnNil(t *testing.T) { + mp := new(Message_Peer) + mp.Addrs = [][]byte{[]byte("NOT A VALID MULTIADDR")} + + addrs := mp.Addresses() + if len(addrs) > 0 { + t.Fatal("shouldnt have any multiaddrs") + } +} From 48e48404d4a5b2bb9ee90c3ff3ec9cbdfa84a154 Mon Sep 17 00:00:00 2001 From: jbenet Date: Mon, 16 May 2016 22:39:39 -0700 Subject: [PATCH 1102/3147] add error checking for nil keys Checks in: - blockstore - blockservice - dagservice - bitswap Do not anger the pokemans #2715 License: MIT Signed-off-by: Juan Benet This commit was moved from ipfs/go-ipfs-blockstore@7faf20ac0452de7192ca4f15c24476ca874b75ae --- blockstore/blockstore.go | 4 ++++ blockstore/blockstore_test.go | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 671ae2c254..d3a9b1aa11 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -74,6 +74,10 @@ type blockstore struct { } func (bs *blockstore) Get(k key.Key) (blocks.Block, error) { + if k == "" { + return nil, ErrNotFound + } + maybeData, err := bs.datastore.Get(k.DsKey()) if err == ds.ErrNotFound { return nil, ErrNotFound diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 446d4b7762..8b0609f1f5 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -27,6 +27,14 @@ func TestGetWhenKeyNotPresent(t *testing.T) { t.Fail() } +func TestGetWhenKeyIsEmptyString(t *testing.T) { + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) + _, err := bs.Get(key.Key("")) + if err != ErrNotFound { + t.Fail() + } +} + func TestPutThenGetBlock(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) block := blocks.NewBlock([]byte("some data")) From 964076e0fd6e9ae530a58bf6d4066e4507cb12d7 Mon Sep 17 00:00:00 2001 From: jbenet Date: Mon, 16 May 2016 22:39:39 -0700 Subject: [PATCH 1103/3147] add error checking for nil keys Checks in: - blockstore - blockservice - dagservice - bitswap Do not anger the pokemans #2715 License: MIT Signed-off-by: Juan Benet This commit was moved from ipfs/go-blockservice@f576ac716a224aa871751ff9775362d3a73fc48d --- blockservice/blockservice.go | 5 +++++ blockservice/test/blocks_test.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 78838757a4..945f60ae67 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -72,6 +72,11 @@ func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (blocks.Block, error) { + if k == "" { + log.Debug("BlockService GetBlock: Nil Key") + return nil, ErrNotFound + } + log.Debugf("BlockService GetBlock: '%s'", k) block, err := s.Blockstore.Get(k) if err == nil { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 584505b215..ed61dad590 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -22,6 +22,11 @@ func TestBlocks(t *testing.T) { bs := New(bstore, offline.Exchange(bstore)) defer bs.Close() + _, err := bs.GetBlock(context.Background(), key.Key("")) + if err != ErrNotFound { + t.Error("Empty String Key should error", err) + } + b := blocks.NewBlock([]byte("beep boop")) h := u.Hash([]byte("beep boop")) if !bytes.Equal(b.Multihash(), h) { From c9aeb17bbf5b88c179b32cfda207f4cae56c1ca2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 17 May 2016 10:23:10 -0700 Subject: [PATCH 1104/3147] update go-libp2p 3.2.2, nil maddr fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@66ac0a21e97787f8412f80879b1d67299162e914 --- routing/dht/dht.go | 6 +++--- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 4 ++-- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 2 +- routing/dht/routing.go | 4 ++-- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 2 +- routing/routing.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 32 files changed, 46 insertions(+), 46 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index deef860226..0d9be4a555 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,10 +15,10 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - host "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" - protocol "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/protocol" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + host "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" + protocol "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/protocol" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 5fddf954e9..01d23a7f05 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -10,7 +10,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 2fe516cec7..94b5a435d1 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,10 +6,10 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" + inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 0c66a55028..760871d321 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,9 +17,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - netutil "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/test/util" + netutil "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index cf30393f18..59ceae87e4 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 7c54461726..de94f44135 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,10 +16,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net/mock" + inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net/mock" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 15fd256793..47c03f01e8 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -11,8 +11,8 @@ import ( lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // The number of closer peers to send on requests. diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index ad523d6d94..9c1ebc22fd 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,8 +5,8 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Required in order for proper JSON marshaling diff --git a/routing/dht/notif.go b/routing/dht/notif.go index fb7c2ee145..235f0f9332 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" + inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index ba3104ca24..93815e3aae 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,9 +4,9 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index df16a5c15b..ecfd691ae1 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 9d48619432..0e9cfd835d 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 872e9f9476..b2d853b854 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -9,9 +9,9 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" - queue "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer/queue" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + queue "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer/queue" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/routing/dht/records.go b/routing/dht/records.go index fdfb12d2dd..23b01410b4 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -9,8 +9,8 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // MaxRecordAge specifies the maximum time that any node will hold onto a record diff --git a/routing/dht/routing.go b/routing/dht/routing.go index d91478101b..040b5d56b4 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,9 +12,9 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 37b7cb8c8d..96c0a68080 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 6d282e0f09..5d0c834e03 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 7c22fec7d6..3787415869 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 4ac3a2af02..85c579c805 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 8653c7e6aa..107dbf473a 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 5230fba832..e48cb679b9 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -12,9 +12,9 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 13ae8e2621..5af2b92ff4 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,8 +9,8 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 1d88623065..6bbbc1fbf5 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index cb4987cfca..6cb63fa51c 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 25069071be..66d43d0bc9 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index f549efca60..58f397577a 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + p2phost "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 4942b27c6a..398e5b07ba 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -11,9 +11,9 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("offlinerouting") diff --git a/routing/routing.go b/routing/routing.go index 3b1ab799c2..bedcabd539 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // ErrNotFound is returned when a search fails to find anything diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 4a362693cc..d8ee83f6bf 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,9 +8,9 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 0ecd65b601..5bbecbcf80 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 6d242ad43d..983bf79ee7 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,10 +6,10 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - host "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/host" - inet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + host "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" + inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 815e53e1be..64b0ef87b0 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -12,7 +12,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Server handles routing queries using a database backend From 0da4509f489dd139d84a64ebd9ef67a39b80ef78 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 17 May 2016 10:23:10 -0700 Subject: [PATCH 1105/3147] update go-libp2p 3.2.2, nil maddr fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@15822a89018331dd2ed96b3589cb1ca219063fe1 --- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 17bc7d7361..d8ca95623f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -21,7 +21,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index dc06458988..3071b9bb80 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 4d838d33f7..93539c7f08 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmUHrgorZ1F9yGkgF2His5fsQ9xtCzjdsPGjizmcEW94i5/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + mocknet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net/mock" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 4d638735f3..95060e9035 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -12,8 +12,8 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { From 07ceaaae018bc55b5f31bac7a49c755df22d1021 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 19 May 2016 12:33:04 +0200 Subject: [PATCH 1106/3147] Move proquint from Godeps to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@a5c9e238483d0ea9f7b81e62cf7b94cb017a1edb --- namesys/proquint.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/proquint.go b/namesys/proquint.go index ce17181e83..f90a4c8a1e 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -3,8 +3,8 @@ package namesys import ( "errors" - proquint "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/bren2010/proquint" path "github.com/ipfs/go-ipfs/path" + proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From b38bfc8161dd96f80ba41be461c5500e89932f5c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 May 2016 22:14:21 -0700 Subject: [PATCH 1107/3147] update libp2p to v3.2.3 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@6704479321aeb8c391d4af61a0f5d67525e20caa --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0d9be4a555..70d597d4b1 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,9 +14,9 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" + host "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" + protocol "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/protocol" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - host "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" - protocol "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/protocol" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 94b5a435d1..ded60c18b7 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,7 +6,7 @@ import ( ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 760871d321..e281563b20 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,7 +17,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - netutil "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/test/util" + netutil "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index de94f44135..f64a725395 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -16,8 +16,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net/mock" + inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net/mock" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 235f0f9332..c7c6399b92 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 93815e3aae..9733c38b72 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,7 +4,7 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 040b5d56b4..413847e00e 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,7 +12,7 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 6cb63fa51c..d5d2d40d85 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 58f397577a..fa80f1e637 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,7 +6,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" + p2phost "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index d8ee83f6bf..2a71319618 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,7 +8,7 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" + "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 5bbecbcf80..88041a1afc 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,7 +5,7 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 983bf79ee7..7e3ea1ee86 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,8 +6,8 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - host "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/host" - inet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net" + host "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" + inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" From 2aeefcf9f3381aad29ad93156262d3e9a2a9d1cc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 May 2016 22:14:21 -0700 Subject: [PATCH 1108/3147] update libp2p to v3.2.3 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@1f36f2a43db0533673414e91ded6a735401727f3 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 93539c7f08..44c3622569 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmVL44QeoQDTYK8RVdpkyja7uYcK3WDNoBNHVLonf9YDtm/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net/mock" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) From 189763dd7bd4ea467e05a6c65205a9ecb9613d78 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 24 May 2016 21:05:15 +0200 Subject: [PATCH 1109/3147] Move go-context to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@cb083ee28b9f5dce25b7e03db928b789a03a3904 --- routing/dht/dht_net.go | 2 +- routing/dht/records.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index ded60c18b7..221c60dc1d 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,9 +4,9 @@ import ( "errors" "time" - ctxio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/io" pb "github.com/ipfs/go-ipfs/routing/dht/pb" inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" + ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" diff --git a/routing/dht/records.go b/routing/dht/records.go index 23b01410b4..9d2eab248c 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -4,11 +4,11 @@ import ( "fmt" "time" - ctxfrac "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-context/frac" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + ctxfrac "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/frac" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) From 86c4958210b672a94517b1752d997ec91465adad Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 1 Jun 2016 12:18:59 -0700 Subject: [PATCH 1110/3147] buffer error chan to prevent dead goro buildup License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@f14ee339e4513c19fdfb03b395ea502d3b8a8c1b --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index d8ca95623f..5388583a50 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -146,7 +146,7 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) } - errs := make(chan error) + errs := make(chan error, 2) go func() { errs <- PublishEntry(ctx, r, ipnskey, entry) From a92b4b41d07baa304c5ee31a4d176c37fcd84840 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 1 Jun 2016 12:20:04 -0700 Subject: [PATCH 1111/3147] localize context cancellation in PutRecordToRouting License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@f71ea1933d1239dd2cdef55837ed54737f8c0b00 --- namesys/publisher.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/namesys/publisher.go b/namesys/publisher.go index 5388583a50..5fdbb725ae 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -135,6 +135,9 @@ func checkCtxTTL(ctx context.Context) (time.Duration, bool) { } func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqnum uint64, eol time.Time, r routing.IpfsRouting, id peer.ID) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + namekey, ipnskey := IpnsKeysForID(id) entry, err := CreateRoutingEntryData(k, value, seqnum, eol) if err != nil { From 7b2b834523457fc5657ba7e689ea4e92aa8bdb83 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 1 Jun 2016 15:51:39 -0700 Subject: [PATCH 1112/3147] update libp2p to v3.3.1 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@462beabf988d6297c1f680cf72bdd1a8c9a466a1 --- routing/dht/dht.go | 27 ++++++++++++------------ routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 28 ++++++++++++------------- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 16 +++++++-------- routing/dht/handlers.go | 16 ++++++++------- routing/dht/lookup.go | 12 ++++++----- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 25 +++++++++++----------- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 21 ++++++++++--------- routing/dht/records.go | 2 +- routing/dht/routing.go | 32 +++++++++++++++-------------- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 7 ++++--- routing/kbucket/table_test.go | 15 +++++++------- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 16 ++++++++------- routing/mock/centralized_server.go | 16 ++++++++------- routing/mock/centralized_test.go | 5 +++-- routing/mock/dht.go | 2 +- routing/mock/interface.go | 5 +++-- routing/none/none_client.go | 13 ++++++------ routing/offline/offline.go | 14 +++++++------ routing/routing.go | 9 ++++---- routing/supernode/client.go | 32 ++++++++++++++--------------- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 19 +++++++++-------- routing/supernode/server.go | 19 +++++++++-------- 32 files changed, 199 insertions(+), 176 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 70d597d4b1..6ddd4325e7 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -14,17 +14,18 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - host "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" - protocol "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/protocol" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + host "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" + protocol "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/protocol" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("dht") @@ -40,9 +41,9 @@ const NumBootstrapQueries = 5 // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { - host host.Host // the network services we need - self peer.ID // Local peer (yourself) - peerstore peer.Peerstore // Peer Registry + host host.Host // the network services we need + self peer.ID // Local peer (yourself) + peerstore pstore.Peerstore // Peer Registry datastore ds.Datastore // Local data @@ -127,7 +128,7 @@ func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, skey string) error { // add self as the provider - pi := peer.PeerInfo{ + pi := pstore.PeerInfo{ ID: dht.self, Addrs: dht.host.Addrs(), } @@ -140,7 +141,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, skey string) err } pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, skey, 0) - pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]peer.PeerInfo{pi}) + pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]pstore.PeerInfo{pi}) err := dht.sendMessage(ctx, p, pmes) if err != nil { return err @@ -157,7 +158,7 @@ var errInvalidRecord = errors.New("received invalid record") // NOTE: It will update the dht's peerstore with any new addresses // it finds for the given peer. func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, - key key.Key) (*pb.Record, []peer.PeerInfo, error) { + key key.Key) (*pb.Record, []pstore.PeerInfo, error) { pmes, err := dht.getValueSingle(ctx, p, key) if err != nil { @@ -258,12 +259,12 @@ func (dht *IpfsDHT) Update(ctx context.Context, p peer.ID) { } // FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. -func (dht *IpfsDHT) FindLocal(id peer.ID) peer.PeerInfo { +func (dht *IpfsDHT) FindLocal(id peer.ID) pstore.PeerInfo { p := dht.routingTable.Find(id) if p != "" { return dht.peerstore.PeerInfo(p) } - return peer.PeerInfo{} + return pstore.PeerInfo{} } // findPeerSingle asks peer 'p' if they know where the peer with id 'id' is diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 01d23a7f05..774e632de3 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,8 +9,8 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 221c60dc1d..4ebd6e3f67 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -5,11 +5,11 @@ import ( "time" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index e281563b20..f4bc863a69 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,18 +11,18 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" - netutil "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/test/util" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" - ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + netutil "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/test/util" + ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) var testCaseValues = map[key.Key][]byte{} @@ -73,8 +73,8 @@ func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { t.Fatal("peers setup incorrectly: no local address") } - a.peerstore.AddAddrs(idB, addrB, peer.TempAddrTTL) - pi := peer.PeerInfo{ID: idB} + a.peerstore.AddAddrs(idB, addrB, pstore.TempAddrTTL) + pi := pstore.PeerInfo{ID: idB} if err := a.host.Connect(ctx, pi); err != nil { t.Fatal(err) } @@ -705,7 +705,7 @@ func TestFindPeersConnectedToPeer(t *testing.T) { } // shouldFind := []peer.ID{peers[1], peers[3]} - found := []peer.PeerInfo{} + var found []pstore.PeerInfo for nextp := range pchan { found = append(found, nextp) } @@ -776,14 +776,14 @@ func TestConnectCollision(t *testing.T) { errs := make(chan error) go func() { - dhtA.peerstore.AddAddr(peerB, addrB, peer.TempAddrTTL) - pi := peer.PeerInfo{ID: peerB} + dhtA.peerstore.AddAddr(peerB, addrB, pstore.TempAddrTTL) + pi := pstore.PeerInfo{ID: peerB} err := dhtA.host.Connect(ctx, pi) errs <- err }() go func() { - dhtB.peerstore.AddAddr(peerA, addrA, peer.TempAddrTTL) - pi := peer.PeerInfo{ID: peerA} + dhtB.peerstore.AddAddr(peerA, addrA, pstore.TempAddrTTL) + pi := pstore.PeerInfo{ID: peerA} err := dhtB.host.Connect(ctx, pi) errs <- err }() diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 59ceae87e4..7958a27837 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index f64a725395..28868a9922 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -9,17 +9,17 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net/mock" + + inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net/mock" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func TestGetFailures(t *testing.T) { @@ -183,7 +183,7 @@ func TestNotFound(t *testing.T) { case pb.Message_GET_VALUE: resp := &pb.Message{Type: pmes.Type} - ps := []peer.PeerInfo{} + ps := []pstore.PeerInfo{} for i := 0; i < 7; i++ { p := hosts[rand.Intn(len(hosts))].ID() pi := host.Peerstore().PeerInfo(p) @@ -262,7 +262,7 @@ func TestLessThanKResponses(t *testing.T) { pi := host.Peerstore().PeerInfo(hosts[1].ID()) resp := &pb.Message{ Type: pmes.Type, - CloserPeers: pb.PeerInfosToPBPeers(d.host.Network(), []peer.PeerInfo{pi}), + CloserPeers: pb.PeerInfosToPBPeers(d.host.Network(), []pstore.PeerInfo{pi}), } if err := pbw.WriteMsg(resp); err != nil { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 47c03f01e8..59aae44233 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -9,10 +9,12 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // The number of closer peers to send on requests. @@ -63,7 +65,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess // Find closest peer on given cluster to desired key and reply with that info closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if len(closer) > 0 { - closerinfos := peer.PeerInfos(dht.peerstore, closer) + closerinfos := pstore.PeerInfos(dht.peerstore, closer) for _, pi := range closerinfos { log.Debugf("handleGetValue returning closer peer: '%s'", pi.ID) if len(pi.Addrs) < 1 { @@ -190,8 +192,8 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess return resp, nil } - var withAddresses []peer.PeerInfo - closestinfos := peer.PeerInfos(dht.peerstore, closest) + var withAddresses []pstore.PeerInfo + closestinfos := pstore.PeerInfos(dht.peerstore, closest) for _, pi := range closestinfos { if len(pi.Addrs) > 0 { withAddresses = append(withAddresses, pi) @@ -232,7 +234,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. } if providers != nil && len(providers) > 0 { - infos := peer.PeerInfos(dht.peerstore, providers) + infos := pstore.PeerInfos(dht.peerstore, providers) resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) log.Debugf("%s have %d providers: %s", reqDesc, len(providers), infos) } @@ -240,7 +242,7 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. // Also send closer peers. closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if closer != nil { - infos := peer.PeerInfos(dht.peerstore, closer) + infos := pstore.PeerInfos(dht.peerstore, closer) resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) log.Debugf("%s have %d closer peers: %s", reqDesc, len(closer), infos) } @@ -276,7 +278,7 @@ func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.M log.Infof("received provider %s for %s (addrs: %s)", p, key, pi.Addrs) if pi.ID != dht.self { // dont add own addrs. // add the received addresses to our peerstore. - dht.peerstore.AddAddrs(pi.ID, pi.Addrs, peer.ProviderAddrTTL) + dht.peerstore.AddAddrs(pi.ID, pi.Addrs, pstore.ProviderAddrTTL) } dht.providers.AddProvider(ctx, key, p) } diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 9c1ebc22fd..2744fb5a74 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -5,13 +5,15 @@ import ( notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Required in order for proper JSON marshaling -func pointerizePeerInfos(pis []peer.PeerInfo) []*peer.PeerInfo { - out := make([]*peer.PeerInfo, len(pis)) +func pointerizePeerInfos(pis []pstore.PeerInfo) []*pstore.PeerInfo { + out := make([]*pstore.PeerInfo, len(pis)) for i, p := range pis { np := p out[i] = &np @@ -56,7 +58,7 @@ func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key key.Key) (<-chan pe return nil, err } - var filtered []peer.PeerInfo + var filtered []pstore.PeerInfo for _, clp := range closer { if kb.Closer(clp, dht.self, key) && peerset.TryAdd(clp) { select { @@ -101,7 +103,7 @@ func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key key.Key, p peer.I for _, pbp := range pmes.GetCloserPeers() { pid := peer.ID(pbp.GetId()) if pid != dht.self { // dont add self - dht.peerstore.AddAddrs(pid, pbp.Addresses(), peer.TempAddrTTL) + dht.peerstore.AddAddrs(pid, pbp.Addresses(), pstore.TempAddrTTL) out = append(out, pid) } } diff --git a/routing/dht/notif.go b/routing/dht/notif.go index c7c6399b92..b9d16819f2 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" + inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 9733c38b72..b1ab8097b2 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,15 +4,16 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("dht.pb") type PeerRoutingInfo struct { - peer.PeerInfo + pstore.PeerInfo inet.Connectedness } @@ -40,7 +41,7 @@ func peerRoutingInfoToPBPeer(p PeerRoutingInfo) *Message_Peer { return pbp } -func peerInfoToPBPeer(p peer.PeerInfo) *Message_Peer { +func peerInfoToPBPeer(p pstore.PeerInfo) *Message_Peer { pbp := new(Message_Peer) pbp.Addrs = make([][]byte, len(p.Addrs)) @@ -52,9 +53,9 @@ func peerInfoToPBPeer(p peer.PeerInfo) *Message_Peer { return pbp } -// PBPeerToPeer turns a *Message_Peer into its peer.PeerInfo counterpart -func PBPeerToPeerInfo(pbp *Message_Peer) peer.PeerInfo { - return peer.PeerInfo{ +// PBPeerToPeer turns a *Message_Peer into its pstore.PeerInfo counterpart +func PBPeerToPeerInfo(pbp *Message_Peer) pstore.PeerInfo { + return pstore.PeerInfo{ ID: peer.ID(pbp.GetId()), Addrs: pbp.Addresses(), } @@ -62,7 +63,7 @@ func PBPeerToPeerInfo(pbp *Message_Peer) peer.PeerInfo { // RawPeerInfosToPBPeers converts a slice of Peers into a slice of *Message_Peers, // ready to go out on the wire. -func RawPeerInfosToPBPeers(peers []peer.PeerInfo) []*Message_Peer { +func RawPeerInfosToPBPeers(peers []pstore.PeerInfo) []*Message_Peer { pbpeers := make([]*Message_Peer, len(peers)) for i, p := range peers { pbpeers[i] = peerInfoToPBPeer(p) @@ -74,7 +75,7 @@ func RawPeerInfosToPBPeers(peers []peer.PeerInfo) []*Message_Peer { // which can be written to a message and sent out. the key thing this function // does (in addition to PeersToPBPeers) is set the ConnectionType with // information from the given inet.Network. -func PeerInfosToPBPeers(n inet.Network, peers []peer.PeerInfo) []*Message_Peer { +func PeerInfosToPBPeers(n inet.Network, peers []pstore.PeerInfo) []*Message_Peer { pbps := RawPeerInfosToPBPeers(peers) for i, pbp := range pbps { c := ConnectionType(n.Connectedness(peers[i].ID)) @@ -91,10 +92,10 @@ func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []*Message_Peer { return pbpeers } -// PBPeersToPeerInfos converts given []*Message_Peer into []peer.PeerInfo +// PBPeersToPeerInfos converts given []*Message_Peer into []pstore.PeerInfo // Invalid addresses will be silently omitted. -func PBPeersToPeerInfos(pbps []*Message_Peer) []peer.PeerInfo { - peers := make([]peer.PeerInfo, 0, len(pbps)) +func PBPeersToPeerInfos(pbps []*Message_Peer) []pstore.PeerInfo { + peers := make([]pstore.PeerInfo, 0, len(pbps)) for _, pbp := range pbps { peers = append(peers, PBPeerToPeerInfo(pbp)) } diff --git a/routing/dht/providers.go b/routing/dht/providers.go index ecfd691ae1..a394123c83 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -4,9 +4,9 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 0e9cfd835d..8d25cfeba6 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -4,7 +4,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index b2d853b854..6b7cc0c048 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -8,14 +8,15 @@ import ( "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" - queue "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer/queue" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + queue "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore/queue" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var maxQueryConcurrency = AlphaValue @@ -28,10 +29,10 @@ type dhtQuery struct { } type dhtQueryResult struct { - value []byte // GetValue - peer peer.PeerInfo // FindPeer - providerPeers []peer.PeerInfo // GetProviders - closerPeers []peer.PeerInfo // * + value []byte // GetValue + peer pstore.PeerInfo // FindPeer + providerPeers []pstore.PeerInfo // GetProviders + closerPeers []pstore.PeerInfo // * success bool } @@ -239,7 +240,7 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { // forward progress during potentially very high latency dials. r.rateLimit <- struct{}{} - pi := peer.PeerInfo{ID: p} + pi := pstore.PeerInfo{ID: p} if err := r.query.dht.host.Connect(ctx, pi); err != nil { log.Debugf("Error connecting: %s", err) @@ -286,7 +287,7 @@ func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { } // add their addresses to the dialer's peerstore - r.query.dht.peerstore.AddAddrs(next.ID, next.Addrs, peer.TempAddrTTL) + r.query.dht.peerstore.AddAddrs(next.ID, next.Addrs, pstore.TempAddrTTL) r.addPeerToQuery(next.ID) log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } diff --git a/routing/dht/records.go b/routing/dht/records.go index 9d2eab248c..477f8c6c07 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -7,10 +7,10 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" ctxfrac "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/frac" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // MaxRecordAge specifies the maximum time that any node will hold onto a record diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 413847e00e..ca1018d973 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -12,9 +12,11 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // asyncQueryBuffer is the size of buffered channels in async queries. This @@ -258,8 +260,8 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key key.Key) error { } // FindProviders searches until the context expires. -func (dht *IpfsDHT) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { - var providers []peer.PeerInfo +func (dht *IpfsDHT) FindProviders(ctx context.Context, key key.Key) ([]pstore.PeerInfo, error) { + var providers []pstore.PeerInfo for p := range dht.FindProvidersAsync(ctx, key, KValue) { providers = append(providers, p) } @@ -269,14 +271,14 @@ func (dht *IpfsDHT) FindProviders(ctx context.Context, key key.Key) ([]peer.Peer // FindProvidersAsync is the same thing as FindProviders, but returns a channel. // Peers will be returned on the channel as soon as they are found, even before // the search query completes. -func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key key.Key, count int) <-chan peer.PeerInfo { +func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key key.Key, count int) <-chan pstore.PeerInfo { log.Event(ctx, "findProviders", &key) - peerOut := make(chan peer.PeerInfo, count) + peerOut := make(chan pstore.PeerInfo, count) go dht.findProvidersAsyncRoutine(ctx, key, count, peerOut) return peerOut } -func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, count int, peerOut chan peer.PeerInfo) { +func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, count int, peerOut chan pstore.PeerInfo) { defer log.EventBegin(ctx, "findProvidersAsync", &key).Done() defer close(peerOut) @@ -357,7 +359,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, } // FindPeer searches for a peer with given ID. -func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { +func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, error) { defer log.EventBegin(ctx, "FindPeer", id).Done() // Check if were already connected to them @@ -367,7 +369,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), KValue) if len(peers) == 0 { - return peer.PeerInfo{}, kb.ErrLookupFailure + return pstore.PeerInfo{}, kb.ErrLookupFailure } // Sanity... @@ -415,22 +417,22 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er // run it! result, err := query.Run(ctx, peers) if err != nil { - return peer.PeerInfo{}, err + return pstore.PeerInfo{}, err } log.Debugf("FindPeer %v %v", id, result.success) if result.peer.ID == "" { - return peer.PeerInfo{}, routing.ErrNotFound + return pstore.PeerInfo{}, routing.ErrNotFound } return result.peer, nil } // FindPeersConnectedToPeer searches for peers directly connected to a given peer. -func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan peer.PeerInfo, error) { +func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan pstore.PeerInfo, error) { - peerchan := make(chan peer.PeerInfo, asyncQueryBuffer) - peersSeen := peer.Set{} + peerchan := make(chan pstore.PeerInfo, asyncQueryBuffer) + peersSeen := make(map[peer.ID]struct{}) peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), KValue) if len(peers) == 0 { @@ -445,7 +447,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< return nil, err } - var clpeers []peer.PeerInfo + var clpeers []pstore.PeerInfo closer := pmes.GetCloserPeers() for _, pbp := range closer { pi := pb.PBPeerToPeerInfo(pbp) diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 96c0a68080..1f887bd72b 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 5d0c834e03..8b4fce8636 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 3787415869..fc9c096727 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,8 +7,9 @@ import ( "sync" "time" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("table") @@ -23,7 +24,7 @@ type RoutingTable struct { tabLock sync.RWMutex // latency metrics - metrics peer.Metrics + metrics pstore.Metrics // Maximum acceptable latency for peers in this cluster maxLatency time.Duration @@ -34,7 +35,7 @@ type RoutingTable struct { } // NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. -func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peer.Metrics) *RoutingTable { +func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m pstore.Metrics) *RoutingTable { rt := new(RoutingTable) rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 85c579c805..271b798c8b 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,8 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" ) // Test basic features of the bucket struct @@ -51,7 +52,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := tu.RandPeerIDFatal(t) - m := peer.NewMetrics() + m := pstore.NewMetrics() rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) peers := make([]peer.ID, 100) @@ -75,7 +76,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := tu.RandPeerIDFatal(t) - m := peer.NewMetrics() + m := pstore.NewMetrics() rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) peers := make([]peer.ID, 100) @@ -93,7 +94,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := tu.RandPeerIDFatal(t) - m := peer.NewMetrics() + m := pstore.NewMetrics() rt := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) peers := make([]peer.ID, 100) @@ -114,7 +115,7 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - m := peer.NewMetrics() + m := pstore.NewMetrics() tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) var peers []peer.ID for i := 0; i < 500; i++ { @@ -153,7 +154,7 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - m := peer.NewMetrics() + m := pstore.NewMetrics() tab := NewRoutingTable(20, local, time.Hour, m) var peers []peer.ID @@ -170,7 +171,7 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - m := peer.NewMetrics() + m := pstore.NewMetrics() tab := NewRoutingTable(20, local, time.Hour, m) var peers []peer.ID diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 107dbf473a..ad3fe49835 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index e48cb679b9..cc4bc2d0ff 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,12 +9,14 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("mockrouter") @@ -72,17 +74,17 @@ func (c *client) GetValues(ctx context.Context, key key.Key, count int) ([]routi return []routing.RecvdVal{{Val: data, From: c.peer.ID()}}, nil } -func (c *client) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { +func (c *client) FindProviders(ctx context.Context, key key.Key) ([]pstore.PeerInfo, error) { return c.server.Providers(key), nil } -func (c *client) FindPeer(ctx context.Context, pid peer.ID) (peer.PeerInfo, error) { +func (c *client) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { log.Debugf("FindPeer: %s", pid) - return peer.PeerInfo{}, nil + return pstore.PeerInfo{}, nil } -func (c *client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { - out := make(chan peer.PeerInfo) +func (c *client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan pstore.PeerInfo { + out := make(chan pstore.PeerInfo) go func() { defer close(out) for i, p := range c.server.Providers(k) { @@ -102,7 +104,7 @@ func (c *client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-c // Provide returns once the message is on the network. Value is not necessarily // visible yet. func (c *client) Provide(_ context.Context, key key.Key) error { - info := peer.PeerInfo{ + info := pstore.PeerInfo{ ID: c.peer.ID(), Addrs: []ma.Multiaddr{c.peer.Address()}, } diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 5af2b92ff4..e36c3d1d9d 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,14 +9,16 @@ import ( dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // server is the mockrouting.Client's private interface to the routing server type server interface { - Announce(peer.PeerInfo, key.Key) error - Providers(key.Key) []peer.PeerInfo + Announce(pstore.PeerInfo, key.Key) error + Providers(key.Key) []pstore.PeerInfo Server } @@ -30,11 +32,11 @@ type s struct { } type providerRecord struct { - Peer peer.PeerInfo + Peer pstore.PeerInfo Created time.Time } -func (rs *s) Announce(p peer.PeerInfo, k key.Key) error { +func (rs *s) Announce(p pstore.PeerInfo, k key.Key) error { rs.lock.Lock() defer rs.lock.Unlock() @@ -49,13 +51,13 @@ func (rs *s) Announce(p peer.PeerInfo, k key.Key) error { return nil } -func (rs *s) Providers(k key.Key) []peer.PeerInfo { +func (rs *s) Providers(k key.Key) []pstore.PeerInfo { rs.delayConf.Query.Wait() // before locking rs.lock.RLock() defer rs.lock.RUnlock() - var ret []peer.PeerInfo + var ret []pstore.PeerInfo records, ok := rs.providers[k] if !ok { return ret diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 6bbbc1fbf5..647a100423 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,8 +7,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) func TestKeyNotFound(t *testing.T) { @@ -150,7 +151,7 @@ func TestValidAfter(t *testing.T) { rs.Client(pi).Provide(ctx, key) - var providers []peer.PeerInfo + var providers []pstore.PeerInfo providers, err := rs.Client(pi).FindProviders(ctx, key) if err != nil { t.Fatal(err) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index d5d2d40d85..536f908e58 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 66d43d0bc9..1d833858a2 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,8 +10,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Server provides mockrouting Clients @@ -22,7 +23,7 @@ type Server interface { // Client implements IpfsRouting type Client interface { - FindProviders(context.Context, key.Key) ([]peer.PeerInfo, error) + FindProviders(context.Context, key.Key) ([]pstore.PeerInfo, error) routing.IpfsRouting } diff --git a/routing/none/none_client.go b/routing/none/none_client.go index fa80f1e637..1752f33c7d 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,11 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - p2phost "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + p2phost "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("mockrouter") @@ -29,12 +30,12 @@ func (c *nilclient) GetValues(_ context.Context, _ key.Key, _ int) ([]routing.Re return nil, errors.New("Tried GetValues from nil routing.") } -func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (peer.PeerInfo, error) { - return peer.PeerInfo{}, nil +func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, error) { + return pstore.PeerInfo{}, nil } -func (c *nilclient) FindProvidersAsync(_ context.Context, _ key.Key, _ int) <-chan peer.PeerInfo { - out := make(chan peer.PeerInfo) +func (c *nilclient) FindProvidersAsync(_ context.Context, _ key.Key, _ int) <-chan pstore.PeerInfo { + out := make(chan pstore.PeerInfo) defer close(out) return out } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 398e5b07ba..6175f9111a 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -9,11 +9,13 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + + "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("offlinerouting") @@ -88,16 +90,16 @@ func (c *offlineRouting) GetValues(ctx context.Context, key key.Key, _ int) ([]r }, nil } -func (c *offlineRouting) FindProviders(ctx context.Context, key key.Key) ([]peer.PeerInfo, error) { +func (c *offlineRouting) FindProviders(ctx context.Context, key key.Key) ([]pstore.PeerInfo, error) { return nil, ErrOffline } -func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (peer.PeerInfo, error) { - return peer.PeerInfo{}, ErrOffline +func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { + return pstore.PeerInfo{}, ErrOffline } -func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { - out := make(chan peer.PeerInfo) +func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan pstore.PeerInfo { + out := make(chan pstore.PeerInfo) close(out) return out } diff --git a/routing/routing.go b/routing/routing.go index bedcabd539..b2f2a1f716 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,9 +5,10 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // ErrNotFound is returned when a search fails to find anything @@ -16,7 +17,7 @@ var ErrNotFound = errors.New("routing: not found") // IpfsRouting is the routing module interface // It is implemented by things like DHTs, etc. type IpfsRouting interface { - FindProvidersAsync(context.Context, key.Key, int) <-chan peer.PeerInfo + FindProvidersAsync(context.Context, key.Key, int) <-chan pstore.PeerInfo // Basic Put/Get @@ -45,9 +46,9 @@ type IpfsRouting interface { Provide(context.Context, key.Key) error // Find specific Peer - // FindPeer searches for a peer with given ID, returns a peer.PeerInfo + // FindPeer searches for a peer with given ID, returns a pstore.PeerInfo // with relevant addresses. - FindPeer(context.Context, peer.ID) (peer.PeerInfo, error) + FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) // Bootstrap allows callers to hint to the routing system to get into a // Boostrapped state diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 2a71319618..060d77733c 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -5,31 +5,31 @@ import ( "errors" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - - "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("supernode") type Client struct { peerhost host.Host - peerstore peer.Peerstore + peerstore pstore.Peerstore proxy proxy.Proxy local peer.ID } // TODO take in datastore/cache -func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (*Client, error) { +func NewClient(px proxy.Proxy, h host.Host, ps pstore.Peerstore, local peer.ID) (*Client, error) { return &Client{ proxy: px, local: local, @@ -38,10 +38,10 @@ func NewClient(px proxy.Proxy, h host.Host, ps peer.Peerstore, local peer.ID) (* }, nil } -func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan peer.PeerInfo { +func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan pstore.PeerInfo { logging.ContextWithLoggable(ctx, loggables.Uuid("findProviders")) defer log.EventBegin(ctx, "findProviders", &k).Done() - ch := make(chan peer.PeerInfo) + ch := make(chan pstore.PeerInfo) go func() { defer close(ch) request := pb.NewMessage(pb.Message_GET_PROVIDERS, string(k), 0) @@ -105,7 +105,7 @@ func (c *Client) Provide(ctx context.Context, k key.Key) error { // FIXME how is connectedness defined for the local node pri := []pb.PeerRoutingInfo{ { - PeerInfo: peer.PeerInfo{ + PeerInfo: pstore.PeerInfo{ ID: c.local, Addrs: c.peerhost.Addrs(), }, @@ -115,23 +115,23 @@ func (c *Client) Provide(ctx context.Context, k key.Key) error { return c.proxy.SendMessage(ctx, msg) // TODO wrap to hide remote } -func (c *Client) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, error) { +func (c *Client) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, error) { defer log.EventBegin(ctx, "findPeer", id).Done() request := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) response, err := c.proxy.SendRequest(ctx, request) // hide remote if err != nil { - return peer.PeerInfo{}, err + return pstore.PeerInfo{}, err } for _, p := range pb.PBPeersToPeerInfos(response.GetCloserPeers()) { if p.ID == id { return p, nil } } - return peer.PeerInfo{}, errors.New("could not find peer") + return pstore.PeerInfo{}, errors.New("could not find peer") } // creates and signs a record for the given key/value pair -func makeRecord(ps peer.Peerstore, p peer.ID, k key.Key, v []byte) (*pb.Record, error) { +func makeRecord(ps pstore.Peerstore, p peer.ID, k key.Key, v []byte) (*pb.Record, error) { blob := bytes.Join([][]byte{[]byte(k), v, []byte(p)}, []byte{}) sig, err := ps.PrivKey(p).Sign(blob) if err != nil { diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 88041a1afc..91efb60017 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 7e3ea1ee86..4fbf4d1be8 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,10 +6,11 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - host "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/host" - inet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + host "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" + inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" @@ -31,11 +32,11 @@ type Proxy interface { type standard struct { Host host.Host - remoteInfos []peer.PeerInfo // addr required for bootstrapping - remoteIDs []peer.ID // []ID is required for each req. here, cached for performance. + remoteInfos []pstore.PeerInfo // addr required for bootstrapping + remoteIDs []peer.ID // []ID is required for each req. here, cached for performance. } -func Standard(h host.Host, remotes []peer.PeerInfo) Proxy { +func Standard(h host.Host, remotes []pstore.PeerInfo) Proxy { var ids []peer.ID for _, remote := range remotes { ids = append(ids, remote.ID) @@ -44,7 +45,7 @@ func Standard(h host.Host, remotes []peer.PeerInfo) Proxy { } func (px *standard) Bootstrap(ctx context.Context) error { - var cxns []peer.PeerInfo + var cxns []pstore.PeerInfo for _, info := range px.remoteInfos { if err := px.Host.Connect(ctx, info); err != nil { continue @@ -97,7 +98,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe } e.Done() }() - if err = px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { + if err = px.Host.Connect(ctx, pstore.PeerInfo{ID: remote}); err != nil { return err } s, err := px.Host.NewStream(ctx, ProtocolSNR, remote) @@ -131,7 +132,7 @@ func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.M func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (*dhtpb.Message, error) { e := log.EventBegin(ctx, "sendRoutingRequest", px.Host.ID(), remote, logging.Pair("request", m)) defer e.Done() - if err := px.Host.Connect(ctx, peer.PeerInfo{ID: remote}); err != nil { + if err := px.Host.Connect(ctx, pstore.PeerInfo{ID: remote}); err != nil { e.SetError(err) return nil, err } diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 64b0ef87b0..850e96d649 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -5,26 +5,27 @@ import ( "fmt" datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // Server handles routing queries using a database backend type Server struct { local peer.ID routingBackend datastore.Datastore - peerstore peer.Peerstore + peerstore pstore.Peerstore *proxy.Loopback // so server can be injected into client } // NewServer creates a new Supernode routing Server -func NewServer(ds datastore.Datastore, ps peer.Peerstore, local peer.ID) (*Server, error) { +func NewServer(ds datastore.Datastore, ps pstore.Peerstore, local peer.ID) (*Server, error) { s := &Server{local, ds, ps, nil} s.Loopback = &proxy.Loopback{ Handler: s, @@ -169,7 +170,7 @@ func putRoutingProviders(ds datastore.Datastore, k key.Key, newRecords []*dhtpb. return ds.Put(providerKey(k), data) } -func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb.Message_Peer) { +func storeProvidersToPeerstore(ps pstore.Peerstore, p peer.ID, providers []*dhtpb.Message_Peer) { for _, provider := range providers { providerID := peer.ID(provider.GetId()) if providerID != p { @@ -178,7 +179,7 @@ func storeProvidersToPeerstore(ps peer.Peerstore, p peer.ID, providers []*dhtpb. } for _, maddr := range provider.Addresses() { // as a router, we want to store addresses for peers who have provided - ps.AddAddr(p, maddr, peer.AddressTTL) + ps.AddAddr(p, maddr, pstore.AddressTTL) } } } @@ -203,7 +204,7 @@ func providerKey(k key.Key) datastore.Key { return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) } -func verify(ps peer.Peerstore, r *dhtpb.Record) error { +func verify(ps pstore.Peerstore, r *dhtpb.Record) error { v := make(record.Validator) v["pk"] = record.PublicKeyValidator p := peer.ID(r.GetAuthor()) From 4636edbb8ddc74fd27c665b7eb4c5fd3fa80c3db Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 1 Jun 2016 15:51:39 -0700 Subject: [PATCH 1113/3147] update libp2p to v3.3.1 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@076a13dbfe63a987e020e8cd7406bea6445d9fea --- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 7 ++++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 5fdbb725ae..7c3b4b95ca 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,9 +19,9 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 3071b9bb80..ef5baef045 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,12 +11,13 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) @@ -32,7 +33,7 @@ const DefaultRecordLifetime = time.Hour * 24 type Republisher struct { r routing.IpfsRouting ds ds.Datastore - ps peer.Peerstore + ps pstore.Peerstore Interval time.Duration @@ -43,7 +44,7 @@ type Republisher struct { entries map[peer.ID]struct{} } -func NewRepublisher(r routing.IpfsRouting, ds ds.Datastore, ps peer.Peerstore) *Republisher { +func NewRepublisher(r routing.IpfsRouting, ds ds.Datastore, ps pstore.Peerstore) *Republisher { return &Republisher{ r: r, ps: ps, diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 44c3622569..d9bf196748 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmRW2xiYTpDLWTHb822ZYbPBoh3dGLJwaXLGS9tnPyWZpq/go-libp2p/p2p/net/mock" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + mocknet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { @@ -44,7 +44,7 @@ func TestRepublish(t *testing.T) { mn.LinkAll() bsinf := core.BootstrapConfigWithPeers( - []peer.PeerInfo{ + []pstore.PeerInfo{ nodes[0].Peerstore.PeerInfo(nodes[0].Identity), }, ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 95060e9035..1025b5f804 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,9 +11,9 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { From 2d9b4bd47c8169f68ec1bcb965a7fb50a86c8d0a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 1 Jun 2016 15:51:39 -0700 Subject: [PATCH 1114/3147] update libp2p to v3.3.1 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@f153bc4dabdab5117f9c7e9311842c69fcb4f8ad --- pinning/pinner/pin.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 0696e79848..d68f6b16a0 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -45,11 +45,11 @@ const ( func PinModeToString(mode PinMode) (string, bool) { m := map[PinMode]string{ Recursive: linkRecursive, - Direct: linkDirect, - Indirect: linkIndirect, - Internal: linkInternal, + Direct: linkDirect, + Indirect: linkIndirect, + Internal: linkInternal, NotPinned: linkNotPinned, - Any: linkAny, + Any: linkAny, } s, ok := m[mode] return s, ok @@ -58,12 +58,12 @@ func PinModeToString(mode PinMode) (string, bool) { func StringToPinMode(s string) (PinMode, bool) { m := map[string]PinMode{ linkRecursive: Recursive, - linkDirect: Direct, - linkIndirect: Indirect, - linkInternal: Internal, + linkDirect: Direct, + linkIndirect: Indirect, + linkInternal: Internal, linkNotPinned: NotPinned, - linkAny: Any, - linkAll: Any, // "all" and "any" means the same thing + linkAny: Any, + linkAll: Any, // "all" and "any" means the same thing } mode, ok := m[s] return mode, ok From c40aa7fb8d5142c439efebe9cb2841262360335b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Jun 2016 12:12:43 -0700 Subject: [PATCH 1115/3147] rework add-mfs to not use caching License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@4d9ddb1d25546ad5edf4d903dd459e58a1df5a83 --- mfs/dir.go | 14 +------------- mfs/file.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index ba14464ae7..fba61ea4c4 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -131,7 +131,7 @@ func (d *Directory) cacheNode(name string, nd *dag.Node) (FSNode, error) { ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) d.childDirs[name] = ndir return ndir, nil - case ufspb.Data_File, ufspb.Data_Raw: + case ufspb.Data_File, ufspb.Data_Raw, ufspb.Data_Symlink: nfi, err := NewFile(name, nd, d, d.dserv) if err != nil { return nil, err @@ -338,18 +338,6 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error { } d.modTime = time.Now() - - if len(nd.Links) == 0 { - nfi, err := NewFile(name, nd, d, d.dserv) - if err != nil { - return err - } - d.files[name] = nfi - } else { - ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) - d.childDirs[name] = ndir - } - return nil } diff --git a/mfs/file.go b/mfs/file.go index 578da98f6d..216bdfa751 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -45,6 +45,20 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { node := fi.node fi.nodelk.Unlock() + fsn, err := ft.FSNodeFromBytes(node.Data) + if err != nil { + return nil, err + } + + switch fsn.Type { + default: + return nil, fmt.Errorf("unsupported fsnode type for 'file'") + case ft.TSymlink: + return nil, fmt.Errorf("symlinks not yet supported") + case ft.TFile, ft.TRaw: + // OK case + } + switch flags { case OpenReadOnly: fi.desclock.RLock() From 586e128b3a14d0524cf21ad208b3f8f23569e2c4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Jun 2016 12:12:43 -0700 Subject: [PATCH 1116/3147] rework add-mfs to not use caching License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@d561f32b6192a56c2a1adb0e75e7500486a01579 --- unixfs/format.go | 1 + 1 file changed, 1 insertion(+) diff --git a/unixfs/format.go b/unixfs/format.go index 6acb41050c..f279a8843b 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -15,6 +15,7 @@ const ( TFile = pb.Data_File TDirectory = pb.Data_Directory TMetadata = pb.Data_Metadata + TSymlink = pb.Data_Symlink ) var ErrMalformedFileFormat = errors.New("malformed data in file format") From df6b2dc4f573ff7e78f8cf4f2d52136b791518c3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 3 Jun 2016 13:52:28 -0700 Subject: [PATCH 1117/3147] fix cleanup of empty provider sets License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@132e16ab925d0f63c4cde1960e6c89ea560c5a0c --- routing/dht/providers.go | 19 ++++++++++++++---- routing/dht/providers_test.go | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index a394123c83..09e2634617 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -11,6 +11,9 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) +var ProvideValidity = time.Hour * 24 +var defaultCleanupInterval = time.Hour + type ProviderManager struct { // all non channel fields are meant to be accessed only within // the run method @@ -23,6 +26,8 @@ type ProviderManager struct { getprovs chan *getProv period time.Duration proc goprocess.Process + + cleanupInterval time.Duration } type providerSet struct { @@ -48,13 +53,14 @@ func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { pm.getlocal = make(chan chan []key.Key) pm.local = make(map[key.Key]struct{}) pm.proc = goprocessctx.WithContext(ctx) + pm.cleanupInterval = defaultCleanupInterval pm.proc.Go(func(p goprocess.Process) { pm.run() }) return pm } func (pm *ProviderManager) run() { - tick := time.NewTicker(time.Hour) + tick := time.NewTicker(pm.cleanupInterval) for { select { case np := <-pm.newprovs: @@ -85,16 +91,21 @@ func (pm *ProviderManager) run() { lc <- keys case <-tick.C: - for _, provs := range pm.providers { + for k, provs := range pm.providers { var filtered []peer.ID for p, t := range provs.set { - if time.Now().Sub(t) > time.Hour*24 { + if time.Now().Sub(t) > ProvideValidity { delete(provs.set, p) } else { filtered = append(filtered, p) } } - provs.providers = filtered + + if len(filtered) > 0 { + provs.providers = filtered + } else { + delete(pm.providers, k) + } } case <-pm.proc.Closing(): diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 8d25cfeba6..9fa9d4b3a4 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -2,6 +2,7 @@ package dht import ( "testing" + "time" key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" @@ -21,3 +22,40 @@ func TestProviderManager(t *testing.T) { } p.proc.Close() } + +func TestProvidesExpire(t *testing.T) { + ProvideValidity = time.Second + defaultCleanupInterval = time.Second + + ctx := context.Background() + mid := peer.ID("testing") + p := NewProviderManager(ctx, mid) + + peers := []peer.ID{"a", "b"} + var keys []key.Key + for i := 0; i < 10; i++ { + k := key.Key(i) + keys = append(keys, k) + p.AddProvider(ctx, k, peers[0]) + p.AddProvider(ctx, k, peers[1]) + } + + for i := 0; i < 10; i++ { + out := p.GetProviders(ctx, keys[i]) + if len(out) != 2 { + t.Fatal("expected providers to still be there") + } + } + + time.Sleep(time.Second * 3) + for i := 0; i < 10; i++ { + out := p.GetProviders(ctx, keys[i]) + if len(out) > 2 { + t.Fatal("expected providers to be cleaned up") + } + } + + if len(p.providers) != 0 { + t.Fatal("providers map not cleaned up") + } +} From 8db6cf3e4b739571b195646704b694d56a59c87b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 6 Jun 2016 17:35:56 -0700 Subject: [PATCH 1118/3147] reuse streams in the dht networking code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@415a300f56d49ad5b5d5a14c3e973a67b61a015e --- routing/dht/dht.go | 4 + routing/dht/dht_net.go | 194 ++++++++++++++++++++++++++-------------- routing/dht/ext_test.go | 6 +- 3 files changed, 134 insertions(+), 70 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6ddd4325e7..1ef8245985 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -58,6 +58,9 @@ type IpfsDHT struct { ctx context.Context proc goprocess.Process + + strmap map[peer.ID]*messageSender + smlk sync.Mutex } // NewDHT creates a new DHT object with the given peer as the 'local' host @@ -77,6 +80,7 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.Datastore) *IpfsDHT { return nil }) + dht.strmap = make(map[peer.ID]*messageSender) dht.ctx = ctx h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 4ebd6e3f67..abafb5297e 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -1,7 +1,7 @@ package dht import ( - "errors" + "sync" "time" pb "github.com/ipfs/go-ipfs/routing/dht/pb" @@ -27,40 +27,42 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { w := ggio.NewDelimitedWriter(cw) mPeer := s.Conn().RemotePeer() - // receive msg - pmes := new(pb.Message) - if err := r.ReadMsg(pmes); err != nil { - log.Debugf("Error unmarshaling data: %s", err) - return - } - - // update the peer (on valid msgs only) - dht.updateFromMessage(ctx, mPeer, pmes) - - // get handler for this msg type. - handler := dht.handlerForMsgType(pmes.GetType()) - if handler == nil { - log.Debug("got back nil handler from handlerForMsgType") - return - } - - // dispatch handler. - rpmes, err := handler(ctx, mPeer, pmes) - if err != nil { - log.Debugf("handle message error: %s", err) - return - } - - // if nil response, return it before serializing - if rpmes == nil { - log.Debug("Got back nil response from request.") - return - } - - // send out response msg - if err := w.WriteMsg(rpmes); err != nil { - log.Debugf("send response error: %s", err) - return + for { + // receive msg + pmes := new(pb.Message) + if err := r.ReadMsg(pmes); err != nil { + log.Debugf("Error unmarshaling data: %s", err) + return + } + + // update the peer (on valid msgs only) + dht.updateFromMessage(ctx, mPeer, pmes) + + // get handler for this msg type. + handler := dht.handlerForMsgType(pmes.GetType()) + if handler == nil { + log.Debug("got back nil handler from handlerForMsgType") + return + } + + // dispatch handler. + rpmes, err := handler(ctx, mPeer, pmes) + if err != nil { + log.Debugf("handle message error: %s", err) + return + } + + // if nil response, return it before serializing + if rpmes == nil { + log.Debug("Got back nil response from request.") + continue + } + + // send out response msg + if err := w.WriteMsg(rpmes); err != nil { + log.Debugf("send response error: %s", err) + return + } } return @@ -70,32 +72,14 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // measure the RTT for latency measurements. func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - log.Debugf("%s DHT starting stream", dht.self) - s, err := dht.host.NewStream(ctx, ProtocolDHT, p) - if err != nil { - return nil, err - } - defer s.Close() - - cr := ctxio.NewReader(ctx, s) // ok to use. we defer close stream in this func - cw := ctxio.NewWriter(ctx, s) // ok to use. we defer close stream in this func - r := ggio.NewDelimitedReader(cr, inet.MessageSizeMax) - w := ggio.NewDelimitedWriter(cw) + ms := dht.messageSenderForPeer(p) start := time.Now() - if err := w.WriteMsg(pmes); err != nil { - return nil, err - } - log.Event(ctx, "dhtSentMessage", dht.self, p, pmes) - - rpmes := new(pb.Message) - if err := r.ReadMsg(rpmes); err != nil { + rpmes, err := ms.SendRequest(ctx, pmes) + if err != nil { return nil, err } - if rpmes == nil { - return nil, errors.New("no response to request") - } // update the peer (on valid msgs only) dht.updateFromMessage(ctx, p, rpmes) @@ -108,17 +92,9 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message // sendMessage sends out a message func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message) error { - log.Debugf("%s DHT starting stream", dht.self) - s, err := dht.host.NewStream(ctx, ProtocolDHT, p) - if err != nil { - return err - } - defer s.Close() + ms := dht.messageSenderForPeer(p) - cw := ctxio.NewWriter(ctx, s) // ok to use. we defer close stream in this func - w := ggio.NewDelimitedWriter(cw) - - if err := w.WriteMsg(pmes); err != nil { + if err := ms.SendMessage(ctx, pmes); err != nil { return err } log.Event(ctx, "dhtSentMessage", dht.self, p, pmes) @@ -129,3 +105,89 @@ func (dht *IpfsDHT) updateFromMessage(ctx context.Context, p peer.ID, mes *pb.Me dht.Update(ctx, p) return nil } + +func (dht *IpfsDHT) messageSenderForPeer(p peer.ID) *messageSender { + dht.smlk.Lock() + defer dht.smlk.Unlock() + + ms, ok := dht.strmap[p] + if !ok { + ms = dht.newMessageSender(p) + dht.strmap[p] = ms + } + + return ms +} + +type messageSender struct { + s inet.Stream + r ggio.ReadCloser + w ggio.WriteCloser + lk sync.Mutex + p peer.ID + dht *IpfsDHT +} + +func (dht *IpfsDHT) newMessageSender(p peer.ID) *messageSender { + return &messageSender{p: p, dht: dht} +} + +func (ms *messageSender) prep() error { + if ms.s != nil { + return nil + } + + nstr, err := ms.dht.host.NewStream(ms.dht.ctx, ProtocolDHT, ms.p) + if err != nil { + return err + } + + ms.r = ggio.NewDelimitedReader(nstr, inet.MessageSizeMax) + ms.w = ggio.NewDelimitedWriter(nstr) + ms.s = nstr + + return nil +} + +func (ms *messageSender) SendMessage(ctx context.Context, pmes *pb.Message) error { + ms.lk.Lock() + defer ms.lk.Unlock() + if err := ms.prep(); err != nil { + return err + } + + err := ms.w.WriteMsg(pmes) + if err != nil { + ms.s.Close() + ms.s = nil + return err + } + return nil +} + +func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb.Message, error) { + ms.lk.Lock() + defer ms.lk.Unlock() + if err := ms.prep(); err != nil { + return nil, err + } + + err := ms.w.WriteMsg(pmes) + if err != nil { + ms.s.Close() + ms.s = nil + return nil, err + } + + log.Event(ctx, "dhtSentMessage", ms.dht.self, ms.p, pmes) + + mes := new(pb.Message) + err = ms.r.ReadMsg(mes) + if err != nil { + ms.s.Close() + ms.s = nil + return nil, err + } + + return mes, nil +} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 28868a9922..b5fa640d8f 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -2,7 +2,6 @@ package dht import ( "io" - "io/ioutil" "math/rand" "testing" "time" @@ -40,8 +39,7 @@ func TestGetFailures(t *testing.T) { // Reply with failures to every message hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { - defer s.Close() - io.Copy(ioutil.Discard, s) + s.Close() }) // This one should time out @@ -51,7 +49,7 @@ func TestGetFailures(t *testing.T) { err = merr[0] } - if err.Error() != "process closing" { + if err != io.EOF { t.Fatal("Got different error than we expected", err) } } else { From 7c1c2254fe6efb89cf294b678e0d32a8c0952dee Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 6 Jun 2016 23:28:39 -0700 Subject: [PATCH 1119/3147] cleanup stream reuse License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@9288e70c73aaeb01b695f657f36b863305508663 --- routing/dht/dht_net.go | 45 +++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index abafb5297e..9d127425b4 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -126,6 +126,8 @@ type messageSender struct { lk sync.Mutex p peer.ID dht *IpfsDHT + + singleMes int } func (dht *IpfsDHT) newMessageSender(p peer.ID) *messageSender { @@ -156,11 +158,39 @@ func (ms *messageSender) SendMessage(ctx context.Context, pmes *pb.Message) erro return err } + if err := ms.writeMessage(pmes); err != nil { + return err + } + + if ms.singleMes > 3 { + ms.s.Close() + ms.s = nil + } + + return nil +} + +func (ms *messageSender) writeMessage(pmes *pb.Message) error { err := ms.w.WriteMsg(pmes) if err != nil { + // If the other side isnt expecting us to be reusing streams, we're gonna + // end up erroring here. To make sure things work seamlessly, lets retry once + // before continuing + + log.Infof("error writing message: ", err) ms.s.Close() ms.s = nil - return err + if err := ms.prep(); err != nil { + return err + } + + if err := ms.w.WriteMsg(pmes); err != nil { + return err + } + + // keep track of this happening. If it happens a few times, its + // likely we can assume the otherside will never support stream reuse + ms.singleMes++ } return nil } @@ -172,22 +202,23 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb return nil, err } - err := ms.w.WriteMsg(pmes) - if err != nil { - ms.s.Close() - ms.s = nil + if err := ms.writeMessage(pmes); err != nil { return nil, err } log.Event(ctx, "dhtSentMessage", ms.dht.self, ms.p, pmes) mes := new(pb.Message) - err = ms.r.ReadMsg(mes) - if err != nil { + if err := ms.r.ReadMsg(mes); err != nil { ms.s.Close() ms.s = nil return nil, err } + if ms.singleMes > 3 { + ms.s.Close() + ms.s = nil + } + return mes, nil } From 4fddd0d1ad2ceb4f09ae0a905958f10727118c62 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 7 Jun 2016 00:20:06 -0700 Subject: [PATCH 1120/3147] update libp2p to version 3.2.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@f41ad4ac079c048ccc5e87b91b06493d34942745 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6ddd4325e7..b54d469835 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -17,11 +17,11 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - host "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" - protocol "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/protocol" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + host "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" + protocol "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/protocol" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 4ebd6e3f67..5016856c8c 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,8 +6,8 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" + inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f4bc863a69..86fccc65e7 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -18,7 +18,7 @@ import ( travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - netutil "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/test/util" + netutil "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/test/util" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 28868a9922..08981366eb 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -14,8 +14,8 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net/mock" + inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net/mock" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" diff --git a/routing/dht/notif.go b/routing/dht/notif.go index b9d16819f2..995d9177ce 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index b1ab8097b2..bde199dfd6 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -5,7 +5,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index ca1018d973..641619397f 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -14,7 +14,7 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 536f908e58..150235ba82 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 1752f33c7d..02c715e58d 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,7 +7,7 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - p2phost "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" + p2phost "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 060d77733c..ee7fafa558 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,7 +12,7 @@ import ( loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" + "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 91efb60017..8f49c585dd 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 4fbf4d1be8..9c8eb04fc0 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -7,8 +7,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - host "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/host" - inet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net" + host "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" + inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" From eb6f99b1d49b6cff3e672e80923223991455f9b0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 7 Jun 2016 00:20:06 -0700 Subject: [PATCH 1121/3147] update libp2p to version 3.2.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@c3e05c6296d8bdee63ff5a115298b550868acbcf --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index d9bf196748..816c388d04 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmQgQeBQxQmJdeUSaDagc8cr2ompDwGn13Cybjdtzfuaki/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" ) From da9e1d0f8064cef099cd49c0380ed0d393ca0645 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 7 Jun 2016 01:27:39 -0700 Subject: [PATCH 1122/3147] use constants for stream reuse heuristics License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@ff292b663d291198eae0d3569d696cf02000653e --- routing/dht/dht_net.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 9d127425b4..7deac0a683 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -151,6 +151,11 @@ func (ms *messageSender) prep() error { return nil } +// streamReuseTries is the number of times we will try to reuse a stream to a +// given peer before giving up and reverting to the old one-message-per-stream +// behaviour. +const streamReuseTries = 3 + func (ms *messageSender) SendMessage(ctx context.Context, pmes *pb.Message) error { ms.lk.Lock() defer ms.lk.Unlock() @@ -162,7 +167,7 @@ func (ms *messageSender) SendMessage(ctx context.Context, pmes *pb.Message) erro return err } - if ms.singleMes > 3 { + if ms.singleMes > streamReuseTries { ms.s.Close() ms.s = nil } @@ -215,7 +220,7 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb return nil, err } - if ms.singleMes > 3 { + if ms.singleMes > streamReuseTries { ms.s.Close() ms.s = nil } From 888d3aa4f3cba1d4b9a24af5a3426db2d2348cda Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 7 Jun 2016 01:50:08 -0700 Subject: [PATCH 1123/3147] clean up some dead code in the dht License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@3b4bbf97a3b74a01ef777a88464a58edeeb1309f --- routing/dht/dht.go | 10 --------- routing/dht/dht_logger.go | 46 --------------------------------------- routing/dht/diag.go | 44 ------------------------------------- 3 files changed, 100 deletions(-) delete mode 100644 routing/dht/dht_logger.go delete mode 100644 routing/dht/diag.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b54d469835..ad5dcd97d2 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -96,16 +96,6 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.Datastore) *IpfsDHT { return dht } -// LocalPeer returns the peer.Peer of the dht. -func (dht *IpfsDHT) LocalPeer() peer.ID { - return dht.self -} - -// log returns the dht's logger -func (dht *IpfsDHT) log() logging.EventLogger { - return log // TODO rm -} - // putValueToPeer stores the given key/value pair at the peer 'p' func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, key key.Key, rec *pb.Record) error { diff --git a/routing/dht/dht_logger.go b/routing/dht/dht_logger.go deleted file mode 100644 index eea47ec1ae..0000000000 --- a/routing/dht/dht_logger.go +++ /dev/null @@ -1,46 +0,0 @@ -package dht - -import ( - "encoding/json" - "fmt" - "time" -) - -type logDhtRPC struct { - Type string - Start time.Time - End time.Time - Duration time.Duration - RPCCount int - Success bool -} - -func startNewRPC(name string) *logDhtRPC { - r := new(logDhtRPC) - r.Type = name - r.Start = time.Now() - return r -} - -func (l *logDhtRPC) EndLog() { - l.End = time.Now() - l.Duration = l.End.Sub(l.Start) -} - -func (l *logDhtRPC) Print() { - b, err := json.Marshal(l) - if err != nil { - log.Debugf("Error marshaling logDhtRPC object: %s", err) - } else { - log.Debug(string(b)) - } -} - -func (l *logDhtRPC) String() string { - return fmt.Sprintf("DHT RPC: %s took %s, success = %v", l.Type, l.Duration, l.Success) -} - -func (l *logDhtRPC) EndAndPrint() { - l.EndLog() - l.Print() -} diff --git a/routing/dht/diag.go b/routing/dht/diag.go deleted file mode 100644 index 7958a27837..0000000000 --- a/routing/dht/diag.go +++ /dev/null @@ -1,44 +0,0 @@ -package dht - -import ( - "encoding/json" - "time" - - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" -) - -type connDiagInfo struct { - Latency time.Duration - ID peer.ID -} - -type diagInfo struct { - ID peer.ID - Connections []connDiagInfo - Keys []string - LifeSpan time.Duration - CodeVersion string -} - -func (di *diagInfo) Marshal() []byte { - b, err := json.Marshal(di) - if err != nil { - panic(err) - } - //TODO: also consider compressing this. There will be a lot of these - return b -} - -func (dht *IpfsDHT) getDiagInfo() *diagInfo { - di := new(diagInfo) - di.CodeVersion = "github.com/ipfs/go-ipfs" - di.ID = dht.self - di.LifeSpan = time.Since(dht.birth) - di.Keys = nil // Currently no way to query datastore - - for _, p := range dht.routingTable.ListPeers() { - d := connDiagInfo{dht.peerstore.LatencyEWMA(p), p} - di.Connections = append(di.Connections, d) - } - return di -} From 7fba18a85d90aab37b6cdc638d11fda715e9a800 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1124/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@0c91bb2c06a621d437a786928b76fb8b8e2a3512 --- routing/dht/dht.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/kbucket/table.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/record/record.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/standard.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6ece6dbae3..16012d12d8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -22,10 +22,10 @@ import ( ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" host "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" protocol "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/protocol" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("dht") diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index bde199dfd6..4d60c7d024 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -6,8 +6,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index 6b7cc0c048..ab13b95da0 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -12,11 +12,11 @@ import ( peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" queue "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var maxQueryConcurrency = AlphaValue diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index fc9c096727..2d57c56592 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,8 +8,8 @@ import ( "time" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("table") diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index cc4bc2d0ff..88b12b87c4 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -11,12 +11,12 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 02c715e58d..1e9a6f3f32 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -8,9 +8,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" p2phost "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 6175f9111a..b1baf5cd6b 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -12,10 +12,10 @@ import ( "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("offlinerouting") diff --git a/routing/record/record.go b/routing/record/record.go index 41071e6c02..83a1974233 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" ) var log = logging.Logger("routing/record") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index ee7fafa558..e04ae87210 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -13,10 +13,10 @@ import ( peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 9c8eb04fc0..fee61d00d7 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,8 +9,8 @@ import ( peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" host "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" From de129a2ad696653e555ebc863c4f7977cda23a76 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1125/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@7f6705f7cbb9fc0d06288dedf33b2b23fbe95347 --- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index ef5baef045..f0d1411818 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -16,10 +16,10 @@ import ( peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/routing.go b/namesys/routing.go index 174e3506b6..053e974405 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -15,8 +15,8 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("namesys") From cff9e32d6cfb3faee68f85ddaaf043829a26acb1 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1126/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@67ac5e9398b34c1c8e3a83d5ee565d20de34f2ab --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index d3a9b1aa11..3ca3c44e3b 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -13,8 +13,8 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("blockstore") From 21b445d469bf27f3ec595ccdd51d663aeb9e000c Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1127/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-mfs@cfdebf6b5bf6a9d7c3dc9d2d699050b7f3e9ee20 --- mfs/system.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/system.go b/mfs/system.go index 19f90a40df..b97b1c5943 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -18,8 +18,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var ErrNotExist = errors.New("no such rootfs") From 66b9c1fcb67962bfd82c65867ed0ada473a2c1c0 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1128/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@89d04b1aa4ccf4412fa043bde3074545b8183e50 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index ba266f3969..91ceef9567 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -17,7 +17,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") From 910e759ac0773b762576b3419f761762004a5e85 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1129/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@b4adcd1b0c16a77e029d188d817c98574cdfce5d --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 945f60ae67..b80f8cd171 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,8 +10,8 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("blockservice") From 1d878e1abd8aaeac2993c0f3e17618d09c9372b2 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1130/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@16d5517230d78efc00a481b36456cd58dcf60521 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 425fe1383d..1a043c8177 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d68f6b16a0..8bfcddebed 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -11,8 +11,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("pin") From a3f5275a13358d7463179baab94c833a5f199c8d Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1131/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-path@bd593846ce5157df0b4ec160d8a9492ed8a5da90 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index fb95b4f52f..af4d215efb 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" ) var log = logging.Logger("path") From 567a12345c1a84658339041256622be5fb6c8aa5 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 1132/3147] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@4b3a59d013596e82dd3945cefc1a9b5a39d2c033 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 6b82a8c87a..6457de8103 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" ) var log = logging.Logger("chunk") From 6a46edf5a62ebe15044dea53944cdfe9ae6f7cd1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Jun 2016 16:12:06 -0700 Subject: [PATCH 1133/3147] respect contexts while reading messages in dht License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@98050270bf57fbcb88fd9deda25c0358048fce9d --- routing/dht/dht_net.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 0152dab4a9..8ad4286ce5 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -214,7 +214,7 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb log.Event(ctx, "dhtSentMessage", ms.dht.self, ms.p, pmes) mes := new(pb.Message) - if err := ms.r.ReadMsg(mes); err != nil { + if err := ms.ctxReadMsg(ctx, mes); err != nil { ms.s.Close() ms.s = nil return nil, err @@ -227,3 +227,17 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb return mes, nil } + +func (ms *messageSender) ctxReadMsg(ctx context.Context, mes *pb.Message) error { + errc := make(chan error, 1) + go func() { + errc <- ms.r.ReadMsg(mes) + }() + + select { + case err := <-errc: + return err + case <-ctx.Done(): + return ctx.Err() + } +} From 33715827de15f6e0b7eb7a2f31700c443ed9523f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 10 Jun 2016 00:11:00 +0200 Subject: [PATCH 1134/3147] Add some sanity tests for the misdial failure License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@92f236151b33c484f440837000f43f621df9dc9b --- routing/dht/dht_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 86fccc65e7..da5e924337 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -56,10 +56,24 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer dhts := make([]*IpfsDHT, n) peers := make([]peer.ID, n) + sanityAddrsMap := make(map[string]struct{}) + sanityPeersMap := make(map[string]struct{}) + for i := 0; i < n; i++ { dhts[i] = setupDHT(ctx, t) peers[i] = dhts[i].self addrs[i] = dhts[i].peerstore.Addrs(dhts[i].self)[0] + + if _, lol := sanityAddrsMap[addrs[i].String()]; lol { + t.Fatal("While setting up DHTs address got dumplicated.") + } else { + sanityAddrsMap[addrs[i].String()] = struct{}{} + } + if _, lol := sanityPeersMap[peers[i].String()]; lol { + t.Fatal("While setting up DHTs peerid got dumplicated.") + } else { + sanityPeersMap[peers[i].String()] = struct{}{} + } } return addrs, peers, dhts From 5abf0d5e80c35b9f8164b271a08c003e88bd48b0 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 10 Jun 2016 00:50:50 +0200 Subject: [PATCH 1135/3147] Fix typo in test License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@7d7c71264565c5f58aad5eac32f7f8e1e3a64b37 --- routing/dht/dht_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index da5e924337..0be4c90807 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -65,12 +65,12 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer addrs[i] = dhts[i].peerstore.Addrs(dhts[i].self)[0] if _, lol := sanityAddrsMap[addrs[i].String()]; lol { - t.Fatal("While setting up DHTs address got dumplicated.") + t.Fatal("While setting up DHTs address got duplicated.") } else { sanityAddrsMap[addrs[i].String()] = struct{}{} } if _, lol := sanityPeersMap[peers[i].String()]; lol { - t.Fatal("While setting up DHTs peerid got dumplicated.") + t.Fatal("While setting up DHTs peerid got duplicated.") } else { sanityPeersMap[peers[i].String()] = struct{}{} } From d154840c6f9f7c129442a02d7f86137ca0c21184 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Jun 2016 10:33:44 -0700 Subject: [PATCH 1136/3147] pull in libp2p updates with utp fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@61d243a7f10164798cb8d163673c4f99a62af120 --- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index f0d1411818..55007db0d2 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -16,9 +16,9 @@ import ( peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 816c388d04..9a2d317f55 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { From ed405e9aaf683fbf09ffc718016243a261a990ad Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Jun 2016 10:33:44 -0700 Subject: [PATCH 1137/3147] pull in libp2p updates with utp fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@e9c78ad8b342e161e1fc83869127989ac1bcdafe --- routing/dht/dht.go | 6 +++--- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 2 +- routing/dht/lookup.go | 2 +- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 4 ++-- routing/dht/query.go | 4 ++-- routing/dht/routing.go | 4 ++-- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 2 +- routing/routing.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- 24 files changed, 36 insertions(+), 36 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 16012d12d8..f9d3963dc5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -17,14 +17,14 @@ import ( ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + host "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" + protocol "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/protocol" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - host "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" - protocol "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/protocol" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 8ad4286ce5..c7d2453410 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,8 +6,8 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" - inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 0be4c90807..8e682e9527 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -18,9 +18,9 @@ import ( travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - netutil "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/test/util" + netutil "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/test/util" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 8288c9186a..034d46c7c8 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -13,10 +13,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net/mock" + inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 59aae44233..529206d0d2 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -11,8 +11,8 @@ import ( lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 2744fb5a74..daa125cf68 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -7,7 +7,7 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 995d9177ce..0592915472 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" + inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 4d60c7d024..923eaea628 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -5,9 +5,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" + inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/query.go b/routing/dht/query.go index ab13b95da0..9c8a2956dd 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -12,9 +12,9 @@ import ( peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + queue "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore/queue" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" - queue "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore/queue" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 641619397f..9f56fdba14 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -14,8 +14,8 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 2d57c56592..ff77275d9e 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -8,8 +8,8 @@ import ( "time" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 271b798c8b..67c2d199d3 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -8,7 +8,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" ) // Test basic features of the bucket struct diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 88b12b87c4..419c430a81 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -11,10 +11,10 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index e36c3d1d9d..7eff1fddf8 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 647a100423..66cbbabf1d 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,7 +8,7 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 150235ba82..677859273f 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,7 +5,7 @@ import ( sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 1d833858a2..eda6b3e3ca 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,7 +11,7 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 1e9a6f3f32..3bbf6df84b 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,9 +7,9 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - p2phost "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" + p2phost "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index b1baf5cd6b..1755921eff 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -12,9 +12,9 @@ import ( "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/routing.go b/routing/routing.go index b2f2a1f716..a0f3ec5553 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index e04ae87210..90029f534a 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,10 +12,10 @@ import ( loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" + "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 8f49c585dd..a76a550efc 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" + inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index fee61d00d7..9ce316b6e7 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -7,10 +7,10 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - host "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/host" - inet "gx/ipfs/QmXJBB9U6e6ennAJPzk8E2rSaVGuHVR2jCxE9H9gPDtRrq/go-libp2p/p2p/net" + host "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" + inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 850e96d649..6e2c705bec 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -11,8 +11,8 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From a27bcde33a6e402779e23b9fc39f036a2f9242ea Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Jun 2016 17:08:34 -0700 Subject: [PATCH 1138/3147] a few small changes to make the dht more efficient License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@267e180a7f4b52e5acf72410d9f4f956c427bdc5 --- routing/dht/dht.go | 28 ---------------------------- routing/dht/routing.go | 24 +++++++++++++++++++++++- routing/kbucket/table.go | 4 ++-- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f9d3963dc5..4ab7b8f32e 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -117,34 +117,6 @@ func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, return nil } -// putProvider sends a message to peer 'p' saying that the local node -// can provide the value of 'key' -func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, skey string) error { - - // add self as the provider - pi := pstore.PeerInfo{ - ID: dht.self, - Addrs: dht.host.Addrs(), - } - - // // only share WAN-friendly addresses ?? - // pi.Addrs = addrutil.WANShareableAddrs(pi.Addrs) - if len(pi.Addrs) < 1 { - // log.Infof("%s putProvider: %s for %s error: no wan-friendly addresses", dht.self, p, key.Key(key), pi.Addrs) - return fmt.Errorf("no known addresses for self. cannot put provider.") - } - - pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, skey, 0) - pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]pstore.PeerInfo{pi}) - err := dht.sendMessage(ctx, p, pmes) - if err != nil { - return err - } - - log.Debugf("%s putProvider: %s for %s (%s)", dht.self, p, key.Key(skey), pi.Addrs) - return nil -} - var errInvalidRecord = errors.New("received invalid record") // getValueOrPeers queries a particular peer p for the value for diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9f56fdba14..7298490df4 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -2,6 +2,7 @@ package dht import ( "bytes" + "fmt" "sync" "time" @@ -243,13 +244,18 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key key.Key) error { return err } + mes, err := dht.makeProvRecord(key) + if err != nil { + return err + } + wg := sync.WaitGroup{} for p := range peers { wg.Add(1) go func(p peer.ID) { defer wg.Done() log.Debugf("putProvider(%s, %s)", key, p) - err := dht.putProvider(ctx, p, string(key)) + err := dht.sendMessage(ctx, p, mes) if err != nil { log.Debug(err) } @@ -258,6 +264,22 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key key.Key) error { wg.Wait() return nil } +func (dht *IpfsDHT) makeProvRecord(skey key.Key) (*pb.Message, error) { + pi := pstore.PeerInfo{ + ID: dht.self, + Addrs: dht.host.Addrs(), + } + + // // only share WAN-friendly addresses ?? + // pi.Addrs = addrutil.WANShareableAddrs(pi.Addrs) + if len(pi.Addrs) < 1 { + return nil, fmt.Errorf("no known addresses for self. cannot put provider.") + } + + pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(skey), 0) + pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]pstore.PeerInfo{pi}) + return pmes, nil +} // FindProviders searches until the context expires. func (dht *IpfsDHT) FindProviders(ctx context.Context, key key.Key) ([]pstore.PeerInfo, error) { diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index ff77275d9e..49a8b7447e 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -48,11 +48,11 @@ func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m pstore // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned func (rt *RoutingTable) Update(p peer.ID) { - rt.tabLock.Lock() - defer rt.tabLock.Unlock() peerID := ConvertPeerID(p) cpl := commonPrefixLen(peerID, rt.local) + rt.tabLock.Lock() + defer rt.tabLock.Unlock() bucketID := cpl if bucketID >= len(rt.Buckets) { bucketID = len(rt.Buckets) - 1 From 189cac735e0c5302866eb55da285ee1b55c81dfa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Jun 2016 23:07:06 -0700 Subject: [PATCH 1139/3147] sort peers outside of locks License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@3ca92a833f3c24d8a46ae2d46ae4910792aadc05 --- routing/kbucket/table.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 49a8b7447e..0dfdff4578 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -144,10 +144,10 @@ func (rt *RoutingTable) NearestPeer(id ID) peer.ID { // NearestPeers returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { - rt.tabLock.RLock() - defer rt.tabLock.RUnlock() cpl := commonPrefixLen(id, rt.local) + rt.tabLock.RLock() + // Get bucket at cpl index or last bucket var bucket *Bucket if cpl >= len(rt.Buckets) { @@ -170,6 +170,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { peerArr = copyPeersFromList(id, peerArr, plist) } } + rt.tabLock.RUnlock() // Sort by distance to local peer sort.Sort(peerArr) From 53925576230f3ab6e882bcaec99a2b4c16040045 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1140/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@fe781ab33e110e2e70eaac17a45cf5ff985a3254 --- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/write_cache_test.go | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 3ca3c44e3b..b3f3f323b2 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -7,9 +7,9 @@ import ( "sync" "sync/atomic" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dsns "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/namespace" - dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" + ds "github.com/ipfs/go-datastore" + dsns "github.com/ipfs/go-datastore/namespace" + dsq "github.com/ipfs/go-datastore/query" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 8b0609f1f5..3a4a96bc6d 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,9 +5,9 @@ import ( "fmt" "testing" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" - ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-datastore/query" + ds_sync "github.com/ipfs/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index 97bf86b127..37ca8b6248 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -3,9 +3,9 @@ package blockstore import ( "testing" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dsq "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/query" - syncds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-datastore/query" + syncds "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks" ) From 749a120722ed930f3dd1f6929b41cde170e8dd46 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1141/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@42e0aad20c891a52c6090f07a11ff7e77d0ca162 --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 727aa71cec..bc24b5a11b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -4,7 +4,7 @@ import ( "strings" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" diff --git a/namesys/publisher.go b/namesys/publisher.go index 7c3b4b95ca..1f50b5bbcc 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 55007db0d2..b6a34d4a9a 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,7 +12,7 @@ import ( "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 1025b5f804..da6fbe1a76 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" From 99efe1fff3d14d28a69e4f8012ca4fa2929a5721 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1142/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@2cfd05409ff564bbe18f3458bcd2553ade916c77 --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 4 ++-- routing/dht/handlers.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 ++-- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f9d3963dc5..9795d8b8e6 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,7 +15,7 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" host "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" protocol "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/protocol" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 8e682e9527..55c978c117 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 034d46c7c8..ed1692816f 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -6,8 +6,8 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 529206d0d2..05a8ad5b26 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 419c430a81..9973b957a5 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,7 +4,7 @@ import ( "errors" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 7eff1fddf8..6ed8f27493 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -5,8 +5,8 @@ import ( "sync" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 677859273f..5171cd1606 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -1,8 +1,8 @@ package mockrouting import ( - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + sync "github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index eda6b3e3ca..fe23671eb6 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,7 +5,7 @@ package mockrouting import ( - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 1755921eff..6c470d611f 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,7 +4,7 @@ import ( "errors" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 6e2c705bec..dd125342c7 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + datastore "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index ea3ead0c24..0da7e8aa8e 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - datastore "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + datastore "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" ) From 50deb1ba89855bea95bdfb51790ed2ba2ed93e94 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1143/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-mfs@664262c21c73471a6e79b1342ba424bc4f3184b8 --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 927a20f865..833bc39eea 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -13,8 +13,8 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/path" randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" From f7ffe8cb39348128afaef2035a786fe7f36df917 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1144/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@79c57de8fabbea73c4fb8b9f9bde75bcdebb7cc6 --- unixfs/mod/dagmodifier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index fc3810f3f1..d77b9ef732 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -7,7 +7,7 @@ import ( "os" "testing" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" @@ -20,7 +20,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From b9ab883d8e9df9942d2d1d10e5578332ab1268e9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1145/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@c8d31d23576186a79eb1ffb40a65b380e6125ad9 --- blockservice/test/blocks_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index ed61dad590..7bbb60fcd6 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" From 495ee4176c463cfb88ced3afaafb90ecf7addb26 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1146/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@49ed743e7bdd9303893a21885f69761f09888f42 --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 8bfcddebed..281cab7663 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -7,7 +7,7 @@ import ( "sync" "time" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" + ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index c8859660ab..1a70b15c6c 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -6,8 +6,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" bs "github.com/ipfs/go-ipfs/blockservice" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index b25f91a969..e67bb65bc5 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -4,8 +4,8 @@ import ( "testing" "testing/quick" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blockservice" From a1fa03b83b7a3c5e0f99b80bc9c412b57a79aeff Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:11:56 +0200 Subject: [PATCH 1147/3147] Remove go-datastore from Godeps License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-exchange-offline@c322b28bd1002413cd22c25d0ee6243b61948d30 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index d7d17341e9..6b66e1abb8 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -3,8 +3,8 @@ package offline import ( "testing" - ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore" - ds_sync "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/ipfs/go-datastore/sync" + ds "github.com/ipfs/go-datastore" + ds_sync "github.com/ipfs/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" From 2cee0e0e61163d44bd3d4337e55f3e53b5e18c32 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1148/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@f11d6a1fd23b0ad2bb2b0be946894c89f44857ce --- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/write_cache_test.go | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index b3f3f323b2..4d940fc06e 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -7,13 +7,13 @@ import ( "sync" "sync/atomic" - ds "github.com/ipfs/go-datastore" - dsns "github.com/ipfs/go-datastore/namespace" - dsq "github.com/ipfs/go-datastore/query" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dsns "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/namespace" + dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 3a4a96bc6d..2dc828ea23 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,9 +5,9 @@ import ( "fmt" "testing" - ds "github.com/ipfs/go-datastore" - dsq "github.com/ipfs/go-datastore/query" - ds_sync "github.com/ipfs/go-datastore/sync" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" + ds_sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index 37ca8b6248..01c52ae409 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -3,10 +3,10 @@ package blockstore import ( "testing" - ds "github.com/ipfs/go-datastore" - dsq "github.com/ipfs/go-datastore/query" - syncds "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" + syncds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" ) func TestReturnsErrorWhenSizeNegative(t *testing.T) { From 61632560413662198db6dfe3d4143187a39d759e Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1149/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@f4ce73df75ecd627f42596b18ffe261c3f165332 --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index bc24b5a11b..c7c68bfbdc 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -4,10 +4,10 @@ import ( "strings" "time" - ds "github.com/ipfs/go-datastore" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 1f50b5bbcc..53324d676f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,8 +6,8 @@ import ( "fmt" "time" - ds "github.com/ipfs/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index b6a34d4a9a..7156fc39ef 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,13 +12,13 @@ import ( "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - ds "github.com/ipfs/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index da6fbe1a76..93198e502f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -5,13 +5,13 @@ import ( "testing" "time" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 9400e1b52f646f3cd7489c71592e1d42b07ee84d Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1150/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@48deaf3bafbf78b343bf7a58f7558c45da1f778f --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 4 ++-- routing/dht/handlers.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 ++-- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 9795d8b8e6..cac05ba7bc 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,7 +15,6 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - ds "github.com/ipfs/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" host "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" protocol "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/protocol" @@ -25,6 +24,7 @@ import ( pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 55c978c117..fcac1a7b7c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -9,13 +9,13 @@ import ( "testing" "time" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" netutil "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/test/util" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index ed1692816f..efc5a8a751 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 05a8ad5b26..7672ba0cd2 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,10 +5,10 @@ import ( "fmt" "time" - ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 9973b957a5..57a86e4002 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,11 +4,11 @@ import ( "errors" "time" - ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 6ed8f27493..742b3bac97 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -5,10 +5,10 @@ import ( "sync" "time" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 5171cd1606..dd3e41f633 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -1,11 +1,11 @@ package mockrouting import ( - ds "github.com/ipfs/go-datastore" - sync "github.com/ipfs/go-datastore/sync" dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index fe23671eb6..be28f4751c 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,13 +5,13 @@ package mockrouting import ( - ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 6c470d611f..f3b3c55dcb 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,11 +4,11 @@ import ( "errors" "time" - ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index dd125342c7..64d54a4658 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,11 +4,11 @@ import ( "errors" "fmt" - datastore "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + datastore "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 0da7e8aa8e..1d3ff54c0f 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,9 +3,9 @@ package supernode import ( "testing" - datastore "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + datastore "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 2e71d750534b4ce94811358c90b0cb9c1357d758 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1151/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-mfs@1237e96b6664c900da304e0d1b7c71b917e7c82a --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 833bc39eea..4c58b83f6e 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -13,10 +13,10 @@ import ( "testing" "time" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/path" randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" From 2d24226a7c46c62c1155dfc86793e0d3cef16ac9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1152/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@0a7b40de63387ca95f58a128b205c8669ffced9f --- unixfs/mod/dagmodifier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index d77b9ef732..404a187ec0 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -7,7 +7,6 @@ import ( "os" "testing" - "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" @@ -18,9 +17,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ds "github.com/ipfs/go-datastore" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 11aefc999e184038e6663f5cce27f4e9a94a8798 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1153/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@6c0a36c04fec70cce0cc4c2e4619a02f6d6dab32 --- blockservice/test/blocks_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 7bbb60fcd6..7c8e9ba96a 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -5,14 +5,14 @@ import ( "testing" "time" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From c085f4476f33e0ae7f4936f33862678148c904e5 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1154/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@374a34778cd089263ad0f34dd8bed9804d0b7a29 --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 281cab7663..6cd0b80dae 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -7,11 +7,11 @@ import ( "sync" "time" - ds "github.com/ipfs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 1a70b15c6c..ecc1fc1f63 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -6,13 +6,13 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e67bb65bc5..f1993e8ece 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -4,14 +4,14 @@ import ( "testing" "testing/quick" - "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" "github.com/ipfs/go-ipfs/merkledag" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 00b391a35801bf2f6972ada7ea523327045b88c2 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:18:44 +0200 Subject: [PATCH 1155/3147] Import go-datastore to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-exchange-offline@44d69474541043a87e42021aabedf612a266d794 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 6b66e1abb8..46cb4fb2a2 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -3,12 +3,12 @@ package offline import ( "testing" - ds "github.com/ipfs/go-datastore" - ds_sync "github.com/ipfs/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + ds_sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From fa19adbfbfc0e63990e2950b0bce4eb131f26808 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:26:57 +0200 Subject: [PATCH 1156/3147] Move golang-lru to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@7f028d29e0768bb772a23c8ea4ba9f74b9db7162 --- blockstore/write_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go index f7c2caf456..fbeee25ba7 100644 --- a/blockstore/write_cache.go +++ b/blockstore/write_cache.go @@ -1,9 +1,9 @@ package blockstore import ( - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 29fc7809c56aad8f0b997382bf967e8b6477ed7c Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 11 Jun 2016 16:26:57 +0200 Subject: [PATCH 1157/3147] Move golang-lru to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@9a45ffb7b46c29ee6bb159df4c3b080f1cfa8439 --- namesys/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/routing.go b/namesys/routing.go index 053e974405..da08213e8e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,7 +5,7 @@ import ( "strings" "time" - lru "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/hashicorp/golang-lru" + lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" From 29eb505a3dd68e6e2e852c3ac10fcb01fef75d68 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 14 Jun 2016 13:32:48 +0200 Subject: [PATCH 1158/3147] Remove errors pointed out by govet License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@9d996c95d27a0bb30228e056355dd2812fc72218 --- routing/dht/dht_net.go | 2 -- routing/dht/dht_test.go | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index c7d2453410..f67474760d 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -64,8 +64,6 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { return } } - - return } // sendRequest sends out a request, but also makes sure to diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index fcac1a7b7c..b9eb5eb5a1 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -214,7 +214,7 @@ func TestProvides(t *testing.T) { t.Fatal(err) } if !bytes.Equal(bits.GetValue(), v) { - t.Fatal("didn't store the right bits (%s, %s)", k, v) + t.Fatalf("didn't store the right bits (%s, %s)", k, v) } } @@ -289,7 +289,7 @@ func waitForWellFormedTables(t *testing.T, dhts []*IpfsDHT, minPeers, avgPeers i func printRoutingTables(dhts []*IpfsDHT) { // the routing tables should be full now. let's inspect them. - fmt.Println("checking routing table of %d", len(dhts)) + fmt.Printf("checking routing table of %d\n", len(dhts)) for _, dht := range dhts { fmt.Printf("checking routing table of %s\n", dht.self) dht.routingTable.Print() @@ -487,7 +487,7 @@ func TestProvidesMany(t *testing.T) { t.Fatal(err) } if !bytes.Equal(bits.GetValue(), v) { - t.Fatal("didn't store the right bits (%s, %s)", k, v) + t.Fatalf("didn't store the right bits (%s, %s)", k, v) } t.Logf("announcing provider for %s", k) From 1b294b9126dfdab0dda96841fbbb1bf6ebb3b643 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 14 Jun 2016 13:32:48 +0200 Subject: [PATCH 1159/3147] Remove errors pointed out by govet License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-mfs@3ddd719a9f939a354eec1e88c9cbe7184354292b --- mfs/ops.go | 2 +- mfs/system.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/ops.go b/mfs/ops.go index 950552f1b9..7cf9ed9f30 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -162,7 +162,7 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { func Lookup(r *Root, path string) (FSNode, error) { dir, ok := r.GetValue().(*Directory) if !ok { - log.Error("root not a dir: %#v", r.GetValue()) + log.Errorf("root not a dir: %#v", r.GetValue()) return nil, errors.New("root was not a directory") } diff --git a/mfs/system.go b/mfs/system.go index b97b1c5943..b0ee42e736 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -265,7 +265,7 @@ func (np *Republisher) Run() { pubnowresp <- struct{}{} } if err != nil { - log.Error("republishRoot error: %s", err) + log.Errorf("republishRoot error: %s", err) } case <-np.ctx.Done(): From ece10b3c60885f36f26f6c381a262f9ccef303a1 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 14 Jun 2016 13:32:48 +0200 Subject: [PATCH 1160/3147] Remove errors pointed out by govet License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@b646160d8b12d6cb24b07c629ecdc739f9063abb --- unixfs/io/dagreader.go | 1 - 1 file changed, 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 3c68ad896b..b78b46269f 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -279,7 +279,6 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { default: return 0, errors.New("invalid whence") } - return 0, nil } // readSeekNopCloser wraps a bytes.Reader to implement ReadSeekCloser From f77ee6e40b47306a0fe54b29f419c9b5a3a7ce56 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Tue, 14 Jun 2016 12:20:21 +0100 Subject: [PATCH 1161/3147] Decapitalized log.Debug messages According to golang standards, these should not be capitalized nor having a trailing period, AFAIK. License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-ipfs-routing@be602328c25a641e0cd3a879258399c426e6a456 --- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/records.go | 2 +- routing/dht/routing.go | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0b049e575b..53b825f4e6 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -267,7 +267,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ // == to self? thats bad for _, p := range closer { if p == dht.self { - log.Debug("Attempted to return self! this shouldnt happen...") + log.Debug("attempted to return self! this shouldn't happen...") return nil } } diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index c7d2453410..9a1b8f558a 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -54,7 +54,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { // if nil response, return it before serializing if rpmes == nil { - log.Debug("Got back nil response from request.") + log.Debug("got back nil response from request") continue } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 7672ba0cd2..734393705f 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -108,7 +108,7 @@ func (dht *IpfsDHT) checkLocalDatastore(k key.Key) (*pb.Record, error) { rec := new(pb.Record) err = proto.Unmarshal(byts, rec) if err != nil { - log.Debug("Failed to unmarshal DHT record from datastore.") + log.Debug("failed to unmarshal DHT record from datastore") return nil, err } diff --git a/routing/dht/records.go b/routing/dht/records.go index 477f8c6c07..a1fcc5b8c3 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -84,7 +84,7 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub // validity because a) we can't. b) we know the hash of the // key we're looking for. val := record.GetValue() - log.Debug("DHT got a value from other peer.") + log.Debug("DHT got a value from other peer") pk, err = ci.UnmarshalPublicKey(val) if err != nil { diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 7298490df4..6b68d42353 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -46,7 +46,7 @@ func (dht *IpfsDHT) PutValue(ctx context.Context, key key.Key, value []byte) err rec, err := record.MakePutRecord(sk, key, value, sign) if err != nil { - log.Debug("Creation of record failed!") + log.Debug("creation of record failed!") return err } @@ -346,7 +346,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, select { case peerOut <- prov: case <-ctx.Done(): - log.Debug("Context timed out sending more providers") + log.Debug("context timed out sending more providers") return nil, ctx.Err() } } @@ -397,7 +397,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, // Sanity... for _, p := range peers { if p == id { - log.Debug("Found target peer in list of closest peers...") + log.Debug("found target peer in list of closest peers...") return dht.peerstore.PeerInfo(p), nil } } From 8def240137aa095ead93c1442819a1d9efae1890 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Tue, 14 Jun 2016 12:20:21 +0100 Subject: [PATCH 1162/3147] Decapitalized log.Debug messages According to golang standards, these should not be capitalized nor having a trailing period, AFAIK. License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-namesys@9549e44fb6b48c6b98fa2dea404c22ccbae529a1 --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 53324d676f..4af9df2cc5 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -314,7 +314,7 @@ func ValidateIpnsRecord(k key.Key, val []byte) error { case pb.IpnsEntry_EOL: t, err := u.ParseRFC3339(string(entry.GetValidity())) if err != nil { - log.Debug("Failed parsing time for ipns record EOL") + log.Debug("failed parsing time for ipns record EOL") return err } if time.Now().After(t) { From 8e7613edffd3809277948893f33a236fe444db41 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Tue, 14 Jun 2016 12:20:21 +0100 Subject: [PATCH 1163/3147] Decapitalized log.Debug messages According to golang standards, these should not be capitalized nor having a trailing period, AFAIK. License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-blockservice@3bcf99c8a6fdf68c6980539545339edb06c8ceab --- blockservice/blockservice.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index b80f8cd171..1c158aaf60 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -86,7 +86,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (blocks.Block, e if err == blockstore.ErrNotFound && s.Exchange != nil { // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. - log.Debug("Blockservice: Searching bitswap.") + log.Debug("Blockservice: Searching bitswap") blk, err := s.Exchange.GetBlock(ctx, k) if err != nil { if err == blockstore.ErrNotFound { @@ -97,7 +97,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (blocks.Block, e return blk, nil } - log.Debug("Blockservice GetBlock: Not found.") + log.Debug("Blockservice GetBlock: Not found") if err == blockstore.ErrNotFound { return nil, ErrNotFound } @@ -119,7 +119,7 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []key.Key) <-chan block misses = append(misses, k) continue } - log.Debug("Blockservice: Got data in datastore.") + log.Debug("Blockservice: Got data in datastore") select { case out <- hit: case <-ctx.Done(): From 83d3d9f365c206411baee048af6bd135198b2ab1 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Tue, 14 Jun 2016 12:20:21 +0100 Subject: [PATCH 1164/3147] Decapitalized log.Debug messages According to golang standards, these should not be capitalized nor having a trailing period, AFAIK. License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-path@ebf54d5bc1ea7e3153d5ea88e0455dcacf94ecf2 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index af4d215efb..8eb96de236 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -86,7 +86,7 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*me return nil, err } - log.Debug("Resolve dag get.") + log.Debug("resolve dag get") nd, err := s.DAG.Get(ctx, key.Key(h)) if err != nil { return nil, err From b62798f346873584a4af807230b395b5c02e5a34 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 15 Jun 2016 11:13:35 -0700 Subject: [PATCH 1165/3147] pass reference to reader instead of using the one on the object License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@8e809fe925d2227d840e54e80244ce8cd71b031d --- routing/dht/dht_net.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index c7d2453410..cc7802e89d 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -230,9 +230,9 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb func (ms *messageSender) ctxReadMsg(ctx context.Context, mes *pb.Message) error { errc := make(chan error, 1) - go func() { - errc <- ms.r.ReadMsg(mes) - }() + go func(r ggio.ReadCloser) { + errc <- r.ReadMsg(mes) + }(ms.r) select { case err := <-errc: From a77d46b8e3a05faf0a97b3998b50f97e86acad70 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 15 Jun 2016 20:26:35 +0200 Subject: [PATCH 1166/3147] Remove failing blockstore test with context Why is it failing: process is started, cancel() is called, between we satart listening to the channels in select statemnet there is race of three things that can happent: 1. Task can complete 2. Task can start closing <- expected 3. Task already closed This race causes failures of the test. It is basing heavily on race of conditions where the task not closing, nor the task is completed before channels are being listened. It is quite impossible to resolve without adding bunch of timings in there, which we want to avoid, as there is no atomic "send message on channel and select" in Golang License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@876df4351406ce8a2276b16554488b7429bf6e7e --- blockstore/blockstore_test.go | 125 ++++++++++------------------------ 1 file changed, 35 insertions(+), 90 deletions(-) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 2dc828ea23..4a7eb7c741 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -117,97 +117,42 @@ func TestAllKeysRespectsContext(t *testing.T) { errors <- nil // a nil one to signal break } - // Once without context, to make sure it all works - { - var results dsq.Results - var resultsmu = make(chan struct{}) - resultChan := make(chan dsq.Result) - d.SetFunc(func(q dsq.Query) (dsq.Results, error) { - results = dsq.ResultsWithChan(q, resultChan) - resultsmu <- struct{}{} - return results, nil - }) - - go getKeys(context.Background()) - - // make sure it's waiting. - <-started - <-resultsmu - select { - case <-done: - t.Fatal("sync is wrong") - case <-results.Process().Closing(): - t.Fatal("should not be closing") - case <-results.Process().Closed(): - t.Fatal("should not be closed") - default: - } - - e := dsq.Entry{Key: BlockPrefix.ChildString("foo").String()} - resultChan <- dsq.Result{Entry: e} // let it go. - close(resultChan) - <-done // should be done now. - <-results.Process().Closed() // should be closed now - - // print any errors - for err := range errors { - if err == nil { - break - } - t.Error(err) - } - } - - // Once with - { - var results dsq.Results - var resultsmu = make(chan struct{}) - resultChan := make(chan dsq.Result) - d.SetFunc(func(q dsq.Query) (dsq.Results, error) { - results = dsq.ResultsWithChan(q, resultChan) - resultsmu <- struct{}{} - return results, nil - }) - - ctx, cancel := context.WithCancel(context.Background()) - go getKeys(ctx) - - // make sure it's waiting. - <-started - <-resultsmu - select { - case <-done: - t.Fatal("sync is wrong") - case <-results.Process().Closing(): - t.Fatal("should not be closing") - case <-results.Process().Closed(): - t.Fatal("should not be closed") - default: - } - - cancel() // let it go. - - select { - case <-done: - t.Fatal("sync is wrong") - case <-results.Process().Closed(): - t.Fatal("should not be closed") // should not be closed yet. - case <-results.Process().Closing(): - // should be closing now! - t.Log("closing correctly at this point.") - } - - close(resultChan) - <-done // should be done now. - <-results.Process().Closed() // should be closed now - - // print any errors - for err := range errors { - if err == nil { - break - } - t.Error(err) + var results dsq.Results + var resultsmu = make(chan struct{}) + resultChan := make(chan dsq.Result) + d.SetFunc(func(q dsq.Query) (dsq.Results, error) { + results = dsq.ResultsWithChan(q, resultChan) + resultsmu <- struct{}{} + return results, nil + }) + + go getKeys(context.Background()) + + // make sure it's waiting. + <-started + <-resultsmu + select { + case <-done: + t.Fatal("sync is wrong") + case <-results.Process().Closing(): + t.Fatal("should not be closing") + case <-results.Process().Closed(): + t.Fatal("should not be closed") + default: + } + + e := dsq.Entry{Key: BlockPrefix.ChildString("foo").String()} + resultChan <- dsq.Result{Entry: e} // let it go. + close(resultChan) + <-done // should be done now. + <-results.Process().Closed() // should be closed now + + // print any errors + for err := range errors { + if err == nil { + break } + t.Error(err) } } From 12b888018a08667a000a9a14a04ef527558e0370 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 15 Jun 2016 13:04:49 -0700 Subject: [PATCH 1167/3147] update go-libp2p to 3.3.4 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@4d2f27d02eaddc5f3a272111635ddda27d1e72ab --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 0b049e575b..d33c7977a3 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -16,8 +16,6 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - host "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" - protocol "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/protocol" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" @@ -26,6 +24,8 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + host "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" + protocol "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/protocol" ) var log = logging.Logger("dht") diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 64d20283cd..94b589feff 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,10 +6,10 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) // handleNewStream implements the inet.StreamHandler diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b9eb5eb5a1..b58eaa853e 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -18,11 +18,11 @@ import ( dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - netutil "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/test/util" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + netutil "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/test/util" ) var testCaseValues = map[key.Key][]byte{} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index efc5a8a751..049cfffd9c 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -13,12 +13,12 @@ import ( ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" - inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net/mock" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 0592915472..74bbeefe40 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" + inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 923eaea628..5eaaebeedb 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -5,9 +5,9 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 7298490df4..fbf51895f7 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -15,9 +15,9 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/mock/dht.go b/routing/mock/dht.go index dd3e41f633..41a8684e8c 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + mocknet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 3bbf6df84b..5c1c7227c0 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,10 +7,10 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - p2phost "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + p2phost "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" ) var log = logging.Logger("mockrouter") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 90029f534a..2ef8d52498 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,11 +12,11 @@ import ( loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index a76a550efc..7e57a82382 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" + inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 9ce316b6e7..7d411b427e 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -7,10 +7,10 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - host "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/host" - inet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + host "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" + inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" From 3f6af6fb0834799782c94f7db53a5320c0a9c850 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 15 Jun 2016 13:04:49 -0700 Subject: [PATCH 1168/3147] update go-libp2p to 3.3.4 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@c68978425032b56945d1a0f748d01de871d62f26 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 9a2d317f55..625f585b15 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmQkQP7WmeT9FRJDsEzAaGYDparttDiB6mCpVBrq2MuWQS/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + mocknet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From c68b9a1f010fdfc8980ce56018a9762c8fd25ec6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Jun 2016 11:01:35 -0700 Subject: [PATCH 1169/3147] implement some simple dht request read timeouts License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@ce4158b1c92580f10137c0b5a046a20f12203eae --- routing/dht/dht.go | 43 +++++++++++++++++++++++++++++++++++++++--- routing/dht/dht_net.go | 9 +++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 3e06e978f1..b2164ff1f5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -107,6 +107,16 @@ func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) pmes.Record = rec rpmes, err := dht.sendRequest(ctx, p, pmes) + switch err { + case ErrReadTimeout: + log.Errorf("read timeout: %s %s", p, key) + fallthrough + default: + return err + case nil: + break + } + if err != nil { return err } @@ -164,7 +174,16 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, defer log.EventBegin(ctx, "getValueSingle", p, &key).Done() pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), 0) - return dht.sendRequest(ctx, p, pmes) + resp, err := dht.sendRequest(ctx, p, pmes) + switch err { + case nil: + return resp, nil + case ErrReadTimeout: + log.Errorf("read timeout: %s %s", p, key) + fallthrough + default: + return nil, err + } } // getLocal attempts to retrieve the value from the datastore @@ -238,14 +257,32 @@ func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.ID, id peer.ID) ( defer log.EventBegin(ctx, "findPeerSingle", p, id).Done() pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) - return dht.sendRequest(ctx, p, pmes) + resp, err := dht.sendRequest(ctx, p, pmes) + switch err { + case nil: + return resp, nil + case ErrReadTimeout: + log.Errorf("read timeout: %s %s", p, id) + fallthrough + default: + return nil, err + } } func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key key.Key) (*pb.Message, error) { defer log.EventBegin(ctx, "findProvidersSingle", p, &key).Done() pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), 0) - return dht.sendRequest(ctx, p, pmes) + resp, err := dht.sendRequest(ctx, p, pmes) + switch err { + case nil: + return resp, nil + case ErrReadTimeout: + log.Errorf("read timeout: %s %s", p, key) + fallthrough + default: + return nil, err + } } // nearestPeersToQuery returns the routing tables closest peers. diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index bc5d02d3d6..b864d2caab 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -1,6 +1,7 @@ package dht import ( + "fmt" "sync" "time" @@ -12,6 +13,9 @@ import ( inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) +var dhtReadMessageTimeout = time.Minute +var ErrReadTimeout = fmt.Errorf("timed out reading response") + // handleNewStream implements the inet.StreamHandler func (dht *IpfsDHT) handleNewStream(s inet.Stream) { go dht.handleNewMessage(s) @@ -232,10 +236,15 @@ func (ms *messageSender) ctxReadMsg(ctx context.Context, mes *pb.Message) error errc <- r.ReadMsg(mes) }(ms.r) + t := time.NewTimer(dhtReadMessageTimeout) + defer t.Stop() + select { case err := <-errc: return err case <-ctx.Done(): return ctx.Err() + case <-t.C: + return ErrReadTimeout } } From 604ac4d43e1856109d3d289da0d746b9ba9eae67 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 17 Jun 2016 14:34:48 -0700 Subject: [PATCH 1170/3147] demote errors to warnings License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@6585b9ce1a250f4e2c984205c7d02ab5d685f5a4 --- routing/dht/dht.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b2164ff1f5..f96b676920 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -109,7 +109,7 @@ func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, rpmes, err := dht.sendRequest(ctx, p, pmes) switch err { case ErrReadTimeout: - log.Errorf("read timeout: %s %s", p, key) + log.Warningf("read timeout: %s %s", p.Pretty(), key) fallthrough default: return err @@ -179,7 +179,7 @@ func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, case nil: return resp, nil case ErrReadTimeout: - log.Errorf("read timeout: %s %s", p, key) + log.Warningf("read timeout: %s %s", p.Pretty(), key) fallthrough default: return nil, err @@ -262,7 +262,7 @@ func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.ID, id peer.ID) ( case nil: return resp, nil case ErrReadTimeout: - log.Errorf("read timeout: %s %s", p, id) + log.Warningf("read timeout: %s %s", p.Pretty(), id) fallthrough default: return nil, err @@ -278,7 +278,7 @@ func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key key. case nil: return resp, nil case ErrReadTimeout: - log.Errorf("read timeout: %s %s", p, key) + log.Warningf("read timeout: %s %s", p.Pretty(), key) fallthrough default: return nil, err From 58bd3a74e858cb21e8082684da28ebdc4c46be14 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 20 Jun 2016 17:06:04 -0400 Subject: [PATCH 1171/3147] Add Files API root as best-effort pin. Closes #2697. Closes #2698. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@76aa2070021787ed8f2319e15960b709b3266736 --- pinning/pinner/gc/gc.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 1a043c8177..34906fffb6 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -17,18 +17,19 @@ var log = logging.Logger("gc") // GC performs a mark and sweep garbage collection of the blocks in the blockstore // first, it creates a 'marked' set and adds to it the following: // - all recursively pinned blocks, plus all of their descendants (recursively) +// - bestEffortRoots, plus all of its descendants (recursively) // - all directly pinned blocks // - all blocks utilized internally by the pinner // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key.Key, error) { +func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRoots []key.Key) (<-chan key.Key, error) { unlocker := bs.GCLock() bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) - gcs, err := ColoredSet(ctx, pn, ds) + gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots) if err != nil { return nil, err } @@ -69,7 +70,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner) (<-chan key. return output, nil } -func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []key.Key) error { +func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []key.Key, bestEffort bool) error { for _, k := range roots { set.Add(k) nd, err := ds.Get(ctx, k) @@ -78,7 +79,7 @@ func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots [ } // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ds, nd, set) + err = dag.EnumerateChildren(ctx, ds, nd, set, bestEffort) if err != nil { return err } @@ -87,11 +88,16 @@ func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots [ return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService) (key.KeySet, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService, bestEffortRoots []key.Key) (key.KeySet, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := key.NewKeySet() - err := Descendants(ctx, ds, gcs, pn.RecursiveKeys()) + err := Descendants(ctx, ds, gcs, pn.RecursiveKeys(), false) + if err != nil { + return nil, err + } + + err = Descendants(ctx, ds, gcs, bestEffortRoots, true) if err != nil { return nil, err } @@ -100,7 +106,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService) (key.KeyS gcs.Add(k) } - err = Descendants(ctx, ds, gcs, pn.InternalPins()) + err = Descendants(ctx, ds, gcs, pn.InternalPins(), false) if err != nil { return nil, err } From f38062b3502af829db314fed6c99875b7affe6ce Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Tue, 21 Jun 2016 13:20:31 +0100 Subject: [PATCH 1172/3147] Standardized Readme See https://github.com/ipfs/community/issues/124 This commit was moved from ipfs/go-ipfs-util@445bfb31dda5736bfbe206b693c7c3527a167d99 --- util/LICENSE | 2 +- util/README.md | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 util/README.md diff --git a/util/LICENSE b/util/LICENSE index c7386b3c94..9ce9744462 100644 --- a/util/LICENSE +++ b/util/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Juan Batiz-Benet +Copyright (c) 2016 Juan Batiz-Benet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/util/README.md b/util/README.md new file mode 100644 index 0000000000..766f3812bc --- /dev/null +++ b/util/README.md @@ -0,0 +1,27 @@ +# go-ipfs-util + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![](https://img.shields.io/badge/discussion_repo-go_to_issues-brightgreen.svg?style=flat-square)](https://github.com/ipfs/NAME/issues) + +> Common utilities used by go-ipfs and other related go packages + +## Install + +## Usage + +## Contribute + +Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/go-ipfs-util/issues)! + +This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). + +### Want to hack on IPFS? + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) + +## License + +MIT From dce3662fda5c7e23f84afb77d69c109994850cf8 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1173/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@34f3ab653a93d422967b3bdb571ea31fcb994423 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 4d940fc06e..3cc87a2704 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -9,8 +9,8 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" dsns "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/namespace" dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" From 8d536b17f6c5667b88ff94966eb098ddaee47171 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1174/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@f1d4ba963c0e300a17b8b6ae3b3c42246ae849eb --- routing/dht/dht.go | 12 ++++++------ routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 6 +++--- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 4 ++-- routing/dht/lookup.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 8 ++++---- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 8 ++++---- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 6 +++--- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 6 +++--- routing/kbucket/table_test.go | 4 ++-- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 6 +++--- routing/mock/centralized_server.go | 4 ++-- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 8 ++++---- routing/offline/offline.go | 8 ++++---- routing/record/record.go | 4 ++-- routing/record/validation.go | 2 +- routing/routing.go | 6 +++--- routing/supernode/client.go | 8 ++++---- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 10 +++++----- routing/supernode/server.go | 4 ++-- 33 files changed, 79 insertions(+), 79 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index f96b676920..b914e9b86d 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -15,17 +15,17 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + host "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" + protocol "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/protocol" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - host "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" - protocol "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/protocol" ) var log = logging.Logger("dht") diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 774e632de3..5f14472998 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,7 +9,7 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index b864d2caab..2c8232c5dd 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,11 +6,11 @@ import ( "time" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) var dhtReadMessageTimeout = time.Minute diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b58eaa853e..865263a7b9 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,12 +17,12 @@ import ( ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" + netutil "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - netutil "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/test/util" ) var testCaseValues = map[key.Key][]byte{} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 049cfffd9c..42de2b4776 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -13,12 +13,12 @@ import ( ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net/mock" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 734393705f..fa6490fba3 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -10,8 +10,8 @@ import ( lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index daa125cf68..db4d651a21 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -6,8 +6,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 74bbeefe40..6ce249e4fe 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" + inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 5eaaebeedb..e35f40891a 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,10 +4,10 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 09e2634617..f1bdd088e6 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -4,9 +4,9 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 9fa9d4b3a4..362a83cb62 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -5,7 +5,7 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 9c8a2956dd..3cf1434a4c 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -9,12 +9,12 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + queue "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore/queue" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - queue "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore/queue" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/records.go b/routing/dht/records.go index a1fcc5b8c3..d920e9843e 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -7,8 +7,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" ctxfrac "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/frac" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index c50c50503e..9a2ca14aaa 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -14,10 +14,10 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 1f887bd72b..d835e24fdf 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 8b4fce8636..ff9dc3d896 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 0dfdff4578..3898af4587 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,9 +7,9 @@ import ( "sync" "time" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 67c2d199d3..6a0c75e5b1 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,8 +7,8 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index ad3fe49835..f9fbed0600 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 57a86e4002..f508f5b08a 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -10,9 +10,9 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 742b3bac97..8628a1db99 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -10,8 +10,8 @@ import ( ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 66cbbabf1d..2b407c5e3b 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,7 +8,7 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 41a8684e8c..2779d35964 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" + mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - mocknet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index be28f4751c..4a8bc37935 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -9,8 +9,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 5c1c7227c0..ee57000a46 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + p2phost "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - p2phost "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index f3b3c55dcb..333dfac0cb 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,10 +10,10 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/record/record.go b/routing/record/record.go index 83a1974233..0a8a29a39e 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" ) var log = logging.Logger("routing/record") diff --git a/routing/record/validation.go b/routing/record/validation.go index e9a35cf54e..4cce81b2a8 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/routing.go b/routing/routing.go index a0f3ec5553..f58f4a737a 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,9 +5,9 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 2ef8d52498..4d3b3d7b08 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -11,12 +11,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 7e57a82382..730cef6bf3 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 7d411b427e..a736b57530 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,11 +6,11 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - host "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/host" - inet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + host "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" + inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 64d54a4658..425b99aa8f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,8 +10,8 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" datastore "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From b51779c983144b3af0852cbaa327ece8d49d4c5e Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1175/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@084cdfbed049ad449bb89f74583626552afbda5d --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index c70bb86f26..e4a4c35963 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index aadaa97951..4660948ccd 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index c7c68bfbdc..2233032a76 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 4af9df2cc5..ef64f9390f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,8 +19,8 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 7156fc39ef..aba06aba63 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,11 +12,11 @@ import ( "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 625f585b15..57f706d0fb 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - mocknet "gx/ipfs/QmdBpVuSYuTGDA8Kn66CbKvEThXqKUh2nTANZEhzSxqrmJ/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 93198e502f..d3097b1396 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" diff --git a/namesys/routing.go b/namesys/routing.go index da08213e8e..79f38939be 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,8 +14,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ci "gx/ipfs/QmUEUu1CM8bxBJxc3ZLojAi8evhTr4byQogWstABet79oY/go-libp2p-crypto" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) From ddc2dea0456a99c63ce15eb063bd7e3a3c5bda7f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1176/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-mfs@7d36c96932bb777d316030fa1c02212ace68f428 --- mfs/system.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/system.go b/mfs/system.go index b0ee42e736..15e7c76849 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -18,7 +18,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 2c9b32b200a16b8d94928149c28c96bb6b4ad146 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1177/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@5f0e10bc266494b78f7db871cc7128bbcc745e94 --- unixfs/mod/dagmodifier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 91ceef9567..cb3cfd5897 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -17,7 +17,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" ) var ErrSeekFail = errors.New("failed to seek properly") From e75ba5ecd3cb4944d1be231764f93447239da4d2 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1178/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@8b26136875d76a57afccd501cbaa9bc4482cfbac --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 34906fffb6..487f7947eb 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,7 +8,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 6cd0b80dae..018ce6cf7f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From a3f472fabe9b8fc77de4765deed4f0bec4382673 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1179/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@9eaf21247baebde621df4147e31eea503d8d3f88 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 1c158aaf60..7105806144 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,7 +10,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 5cc58efe0f96af5b62531d1f6e0019977550ac2a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1180/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-path@f0fd887a66b9e52102875b974ed41e3fcee4a894 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index 8eb96de236..e5e94f2ff7 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" ) var log = logging.Logger("path") From 5eaf556fccffa4f7b9250333616f2d31560850ff Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 1181/3147] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@b5d317a923b95d514bedbce77eebbd7326c85d82 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 6457de8103..98cdef7397 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" ) var log = logging.Logger("chunk") From cdaff26d0859275feb279bac4d5ac232b619596a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 21:31:58 +0200 Subject: [PATCH 1182/3147] blockstore: add fetch rehashing License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@f49cb3536971ec85c5c06c655ac9bffd965d10bc --- blockstore/blockstore.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 3cc87a2704..a1f1f600bb 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -22,7 +22,8 @@ var log = logging.Logger("blockstore") // BlockPrefix namespaces blockstore datastores var BlockPrefix = ds.NewKey("blocks") -var ValueTypeMismatch = errors.New("The retrieved value is not a Block") +var ValueTypeMismatch = errors.New("the retrieved value is not a Block") +var ErrHashMismatch = errors.New("block in storage has different hash than requested") var ErrNotFound = errors.New("blockstore: block not found") @@ -71,6 +72,12 @@ type blockstore struct { lk sync.RWMutex gcreq int32 gcreqlk sync.Mutex + + rehash bool +} + +func (bs *blockstore) RuntimeHashing(enabled bool) { + bs.rehash = enabled } func (bs *blockstore) Get(k key.Key) (blocks.Block, error) { @@ -90,7 +97,16 @@ func (bs *blockstore) Get(k key.Key) (blocks.Block, error) { return nil, ValueTypeMismatch } - return blocks.NewBlockWithHash(bdata, mh.Multihash(k)) + if bs.rehash { + rb := blocks.NewBlock(bdata) + if rb.Key() != k { + return nil, ErrHashMismatch + } else { + return rb, nil + } + } else { + return blocks.NewBlockWithHash(bdata, mh.Multihash(k)) + } } func (bs *blockstore) Put(block blocks.Block) error { From 6a14db935a1337ce658bb0627c601b95f54be436 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 22:03:16 +0200 Subject: [PATCH 1183/3147] tests: Add test to RuntimeHashing option of blockstore License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@ccf71bab8b88e545fa78bb01cf1852e36508e35e --- blockstore/blockstore_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 4a7eb7c741..babd1a99a2 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -53,6 +53,22 @@ func TestPutThenGetBlock(t *testing.T) { } } +func TestRuntimeHashing(t *testing.T) { + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) + bl := blocks.NewBlock([]byte("some data")) + blBad, err := blocks.NewBlockWithHash([]byte("some other data"), bl.Key().ToMultihash()) + if err != nil { + t.Fatal("Debug is enabled") + } + + bs.Put(blBad) + bs.RuntimeHashing(true) + + if _, err := bs.Get(bl.Key()); err != ErrHashMismatch { + t.Fatalf("Expected '%v' got '%v'\n", ErrHashMismatch, err) + } +} + func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []key.Key) { if d == nil { d = ds.NewMapDatastore() From 5ba55e5afe4cb6235c2fd10917a35fb9d65e5a61 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 16 May 2016 17:01:00 -0700 Subject: [PATCH 1184/3147] Write providers to disk to avoid memory leaks License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@0304ec22658a24e19325f87f0780d6c910c14b7c --- routing/dht/dht.go | 7 +- routing/dht/providers.go | 165 ----------- routing/dht/providers/providers.go | 363 ++++++++++++++++++++++++ routing/dht/providers/providers_test.go | 134 +++++++++ routing/dht/providers_test.go | 61 ---- 5 files changed, 501 insertions(+), 229 deletions(-) delete mode 100644 routing/dht/providers.go create mode 100644 routing/dht/providers/providers.go create mode 100644 routing/dht/providers/providers_test.go delete mode 100644 routing/dht/providers_test.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go index b914e9b86d..ecee8c8201 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -12,6 +12,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + providers "github.com/ipfs/go-ipfs/routing/dht/providers" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" @@ -48,7 +49,7 @@ type IpfsDHT struct { datastore ds.Datastore // Local data routingTable *kb.RoutingTable // Array of routing tables for differently distanced nodes - providers *ProviderManager + providers *providers.ProviderManager birth time.Time // When this peer started up diaglock sync.Mutex // lock to make diagnostics work better @@ -84,8 +85,8 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.Datastore) *IpfsDHT { dht.ctx = ctx h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) - dht.providers = NewProviderManager(dht.ctx, dht.self) - dht.proc.AddChild(dht.providers.proc) + dht.providers = providers.NewProviderManager(dht.ctx, dht.self, dstore) + dht.proc.AddChild(dht.providers.Process()) goprocessctx.CloseAfterContext(dht.proc, ctx) dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) diff --git a/routing/dht/providers.go b/routing/dht/providers.go deleted file mode 100644 index f1bdd088e6..0000000000 --- a/routing/dht/providers.go +++ /dev/null @@ -1,165 +0,0 @@ -package dht - -import ( - "time" - - key "github.com/ipfs/go-ipfs/blocks/key" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -var ProvideValidity = time.Hour * 24 -var defaultCleanupInterval = time.Hour - -type ProviderManager struct { - // all non channel fields are meant to be accessed only within - // the run method - providers map[key.Key]*providerSet - local map[key.Key]struct{} - lpeer peer.ID - - getlocal chan chan []key.Key - newprovs chan *addProv - getprovs chan *getProv - period time.Duration - proc goprocess.Process - - cleanupInterval time.Duration -} - -type providerSet struct { - providers []peer.ID - set map[peer.ID]time.Time -} - -type addProv struct { - k key.Key - val peer.ID -} - -type getProv struct { - k key.Key - resp chan []peer.ID -} - -func NewProviderManager(ctx context.Context, local peer.ID) *ProviderManager { - pm := new(ProviderManager) - pm.getprovs = make(chan *getProv) - pm.newprovs = make(chan *addProv) - pm.providers = make(map[key.Key]*providerSet) - pm.getlocal = make(chan chan []key.Key) - pm.local = make(map[key.Key]struct{}) - pm.proc = goprocessctx.WithContext(ctx) - pm.cleanupInterval = defaultCleanupInterval - pm.proc.Go(func(p goprocess.Process) { pm.run() }) - - return pm -} - -func (pm *ProviderManager) run() { - tick := time.NewTicker(pm.cleanupInterval) - for { - select { - case np := <-pm.newprovs: - if np.val == pm.lpeer { - pm.local[np.k] = struct{}{} - } - provs, ok := pm.providers[np.k] - if !ok { - provs = newProviderSet() - pm.providers[np.k] = provs - } - provs.Add(np.val) - - case gp := <-pm.getprovs: - var parr []peer.ID - provs, ok := pm.providers[gp.k] - if ok { - parr = provs.providers - } - - gp.resp <- parr - - case lc := <-pm.getlocal: - var keys []key.Key - for k := range pm.local { - keys = append(keys, k) - } - lc <- keys - - case <-tick.C: - for k, provs := range pm.providers { - var filtered []peer.ID - for p, t := range provs.set { - if time.Now().Sub(t) > ProvideValidity { - delete(provs.set, p) - } else { - filtered = append(filtered, p) - } - } - - if len(filtered) > 0 { - provs.providers = filtered - } else { - delete(pm.providers, k) - } - } - - case <-pm.proc.Closing(): - return - } - } -} - -func (pm *ProviderManager) AddProvider(ctx context.Context, k key.Key, val peer.ID) { - prov := &addProv{ - k: k, - val: val, - } - select { - case pm.newprovs <- prov: - case <-ctx.Done(): - } -} - -func (pm *ProviderManager) GetProviders(ctx context.Context, k key.Key) []peer.ID { - gp := &getProv{ - k: k, - resp: make(chan []peer.ID, 1), // buffered to prevent sender from blocking - } - select { - case <-ctx.Done(): - return nil - case pm.getprovs <- gp: - } - select { - case <-ctx.Done(): - return nil - case peers := <-gp.resp: - return peers - } -} - -func (pm *ProviderManager) GetLocal() []key.Key { - resp := make(chan []key.Key) - pm.getlocal <- resp - return <-resp -} - -func newProviderSet() *providerSet { - return &providerSet{ - set: make(map[peer.ID]time.Time), - } -} - -func (ps *providerSet) Add(p peer.ID) { - _, found := ps.set[p] - if !found { - ps.providers = append(ps.providers, p) - } - - ps.set[p] = time.Now() -} diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go new file mode 100644 index 0000000000..beb53d4ae3 --- /dev/null +++ b/routing/dht/providers/providers.go @@ -0,0 +1,363 @@ +package providers + +import ( + "encoding/base32" + "encoding/binary" + "fmt" + "strings" + "time" + + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" + + key "github.com/ipfs/go-ipfs/blocks/key" + + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + +var log = logging.Logger("providers") + +var lruCacheSize = 256 +var ProvideValidity = time.Hour * 24 +var defaultCleanupInterval = time.Hour + +type ProviderManager struct { + // all non channel fields are meant to be accessed only within + // the run method + providers *lru.Cache + local map[key.Key]struct{} + lpeer peer.ID + dstore ds.Datastore + + getlocal chan chan []key.Key + newprovs chan *addProv + getprovs chan *getProv + period time.Duration + proc goprocess.Process + + cleanupInterval time.Duration +} + +type providerSet struct { + providers []peer.ID + set map[peer.ID]time.Time +} + +type addProv struct { + k key.Key + val peer.ID +} + +type getProv struct { + k key.Key + resp chan []peer.ID +} + +func NewProviderManager(ctx context.Context, local peer.ID, dstore ds.Datastore) *ProviderManager { + pm := new(ProviderManager) + pm.getprovs = make(chan *getProv) + pm.newprovs = make(chan *addProv) + pm.dstore = dstore + cache, err := lru.New(lruCacheSize) + if err != nil { + panic(err) //only happens if negative value is passed to lru constructor + } + pm.providers = cache + + pm.getlocal = make(chan chan []key.Key) + pm.local = make(map[key.Key]struct{}) + pm.proc = goprocessctx.WithContext(ctx) + pm.cleanupInterval = defaultCleanupInterval + pm.proc.Go(func(p goprocess.Process) { pm.run() }) + + return pm +} + +const providersKeyPrefix = "/providers/" + +func mkProvKey(k key.Key) ds.Key { + return ds.NewKey(providersKeyPrefix + base32.StdEncoding.EncodeToString([]byte(k))) +} + +func (pm *ProviderManager) Process() goprocess.Process { + return pm.proc +} + +func (pm *ProviderManager) providersForKey(k key.Key) ([]peer.ID, error) { + pset, err := pm.getProvSet(k) + if err != nil { + return nil, err + } + return pset.providers, nil +} + +func (pm *ProviderManager) getProvSet(k key.Key) (*providerSet, error) { + cached, ok := pm.providers.Get(k) + if ok { + return cached.(*providerSet), nil + } + + pset, err := loadProvSet(pm.dstore, k) + if err != nil { + return nil, err + } + + if len(pset.providers) > 0 { + pm.providers.Add(k, pset) + } + + return pset, nil +} + +func loadProvSet(dstore ds.Datastore, k key.Key) (*providerSet, error) { + res, err := dstore.Query(dsq.Query{Prefix: mkProvKey(k).String()}) + if err != nil { + return nil, err + } + + out := newProviderSet() + for e := range res.Next() { + if e.Error != nil { + log.Error("got an error: ", err) + continue + } + parts := strings.Split(e.Key, "/") + if len(parts) != 4 { + log.Warning("incorrectly formatted key: ", e.Key) + continue + } + + decstr, err := base32.StdEncoding.DecodeString(parts[len(parts)-1]) + if err != nil { + log.Error("base32 decoding error: ", err) + continue + } + + pid := peer.ID(decstr) + + t, err := readTimeValue(e.Value) + if err != nil { + log.Warning("parsing providers record from disk: ", err) + continue + } + + out.setVal(pid, t) + } + + return out, nil +} + +func readTimeValue(i interface{}) (time.Time, error) { + data, ok := i.([]byte) + if !ok { + return time.Time{}, fmt.Errorf("data was not a []byte") + } + + nsec, _ := binary.Varint(data) + + return time.Unix(0, nsec), nil +} + +func (pm *ProviderManager) addProv(k key.Key, p peer.ID) error { + iprovs, ok := pm.providers.Get(k) + if !ok { + iprovs = newProviderSet() + pm.providers.Add(k, iprovs) + } + provs := iprovs.(*providerSet) + now := time.Now() + provs.setVal(p, now) + + return writeProviderEntry(pm.dstore, k, p, now) +} + +func writeProviderEntry(dstore ds.Datastore, k key.Key, p peer.ID, t time.Time) error { + dsk := mkProvKey(k).ChildString(base32.StdEncoding.EncodeToString([]byte(p))) + + buf := make([]byte, 16) + n := binary.PutVarint(buf, t.UnixNano()) + + return dstore.Put(dsk, buf[:n]) +} + +func (pm *ProviderManager) deleteProvSet(k key.Key) error { + pm.providers.Remove(k) + + res, err := pm.dstore.Query(dsq.Query{ + KeysOnly: true, + Prefix: mkProvKey(k).String(), + }) + + entries, err := res.Rest() + if err != nil { + return err + } + + for _, e := range entries { + err := pm.dstore.Delete(ds.NewKey(e.Key)) + if err != nil { + log.Error("deleting provider set: ", err) + } + } + return nil +} + +func (pm *ProviderManager) getAllProvKeys() ([]key.Key, error) { + res, err := pm.dstore.Query(dsq.Query{ + KeysOnly: true, + Prefix: providersKeyPrefix, + }) + + if err != nil { + return nil, err + } + + entries, err := res.Rest() + if err != nil { + return nil, err + } + + out := make([]key.Key, 0, len(entries)) + seen := make(map[key.Key]struct{}) + for _, e := range entries { + parts := strings.Split(e.Key, "/") + if len(parts) != 4 { + log.Warning("incorrectly formatted provider entry in datastore") + continue + } + decoded, err := base32.StdEncoding.DecodeString(parts[2]) + if err != nil { + log.Warning("error decoding base32 provider key") + continue + } + + k := key.Key(decoded) + if _, ok := seen[k]; !ok { + out = append(out, key.Key(decoded)) + seen[k] = struct{}{} + } + } + + return out, nil +} + +func (pm *ProviderManager) run() { + tick := time.NewTicker(pm.cleanupInterval) + for { + select { + case np := <-pm.newprovs: + if np.val == pm.lpeer { + pm.local[np.k] = struct{}{} + } + err := pm.addProv(np.k, np.val) + if err != nil { + log.Error("error adding new providers: ", err) + } + case gp := <-pm.getprovs: + provs, err := pm.providersForKey(gp.k) + if err != nil && err != ds.ErrNotFound { + log.Error("error reading providers: ", err) + } + + gp.resp <- provs + case lc := <-pm.getlocal: + var keys []key.Key + for k := range pm.local { + keys = append(keys, k) + } + lc <- keys + + case <-tick.C: + keys, err := pm.getAllProvKeys() + if err != nil { + log.Error("Error loading provider keys: ", err) + continue + } + for _, k := range keys { + provs, err := pm.getProvSet(k) + if err != nil { + log.Error("error loading known provset: ", err) + continue + } + var filtered []peer.ID + for p, t := range provs.set { + if time.Now().Sub(t) > ProvideValidity { + delete(provs.set, p) + } else { + filtered = append(filtered, p) + } + } + + if len(filtered) > 0 { + provs.providers = filtered + } else { + err := pm.deleteProvSet(k) + if err != nil { + log.Error("error deleting provider set: ", err) + } + } + } + case <-pm.proc.Closing(): + return + } + } +} + +func (pm *ProviderManager) AddProvider(ctx context.Context, k key.Key, val peer.ID) { + prov := &addProv{ + k: k, + val: val, + } + select { + case pm.newprovs <- prov: + case <-ctx.Done(): + } +} + +func (pm *ProviderManager) GetProviders(ctx context.Context, k key.Key) []peer.ID { + gp := &getProv{ + k: k, + resp: make(chan []peer.ID, 1), // buffered to prevent sender from blocking + } + select { + case <-ctx.Done(): + return nil + case pm.getprovs <- gp: + } + select { + case <-ctx.Done(): + return nil + case peers := <-gp.resp: + return peers + } +} + +func (pm *ProviderManager) GetLocal() []key.Key { + resp := make(chan []key.Key) + pm.getlocal <- resp + return <-resp +} + +func newProviderSet() *providerSet { + return &providerSet{ + set: make(map[peer.ID]time.Time), + } +} + +func (ps *providerSet) Add(p peer.ID) { + ps.setVal(p, time.Now()) +} + +func (ps *providerSet) setVal(p peer.ID, t time.Time) { + _, found := ps.set[p] + if !found { + ps.providers = append(ps.providers, p) + } + + ps.set[p] = t +} diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go new file mode 100644 index 0000000000..2943e5ccb1 --- /dev/null +++ b/routing/dht/providers/providers_test.go @@ -0,0 +1,134 @@ +package providers + +import ( + "fmt" + "testing" + "time" + + key "github.com/ipfs/go-ipfs/blocks/key" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + +func TestProviderManager(t *testing.T) { + ctx := context.Background() + mid := peer.ID("testing") + p := NewProviderManager(ctx, mid, ds.NewMapDatastore()) + a := key.Key("test") + p.AddProvider(ctx, a, peer.ID("testingprovider")) + resp := p.GetProviders(ctx, a) + if len(resp) != 1 { + t.Fatal("Could not retrieve provider.") + } + p.proc.Close() +} + +func TestProvidersDatastore(t *testing.T) { + old := lruCacheSize + lruCacheSize = 10 + defer func() { lruCacheSize = old }() + + ctx := context.Background() + mid := peer.ID("testing") + p := NewProviderManager(ctx, mid, ds.NewMapDatastore()) + defer p.proc.Close() + + friend := peer.ID("friend") + var keys []key.Key + for i := 0; i < 100; i++ { + k := key.Key(fmt.Sprint(i)) + keys = append(keys, k) + p.AddProvider(ctx, k, friend) + } + + for _, k := range keys { + resp := p.GetProviders(ctx, k) + if len(resp) != 1 { + t.Fatal("Could not retrieve provider.") + } + if resp[0] != friend { + t.Fatal("expected provider to be 'friend'") + } + } +} + +func TestProvidersSerialization(t *testing.T) { + dstore := ds.NewMapDatastore() + + k := key.Key("my key!") + p := peer.ID("my peer") + pt := time.Now() + + err := writeProviderEntry(dstore, k, p, pt) + if err != nil { + t.Fatal(err) + } + + pset, err := loadProvSet(dstore, k) + if err != nil { + t.Fatal(err) + } + + lt, ok := pset.set[p] + if !ok { + t.Fatal("failed to load set correctly") + } + + if pt != lt { + t.Fatal("time wasnt serialized correctly") + } +} + +func TestProvidesExpire(t *testing.T) { + pval := ProvideValidity + cleanup := defaultCleanupInterval + ProvideValidity = time.Second / 2 + defaultCleanupInterval = time.Second / 2 + defer func() { + ProvideValidity = pval + defaultCleanupInterval = cleanup + }() + + ctx := context.Background() + mid := peer.ID("testing") + p := NewProviderManager(ctx, mid, ds.NewMapDatastore()) + + peers := []peer.ID{"a", "b"} + var keys []key.Key + for i := 0; i < 10; i++ { + k := key.Key(i) + keys = append(keys, k) + p.AddProvider(ctx, k, peers[0]) + p.AddProvider(ctx, k, peers[1]) + } + + for i := 0; i < 10; i++ { + out := p.GetProviders(ctx, keys[i]) + if len(out) != 2 { + t.Fatal("expected providers to still be there") + } + } + + time.Sleep(time.Second) + for i := 0; i < 10; i++ { + out := p.GetProviders(ctx, keys[i]) + if len(out) > 2 { + t.Fatal("expected providers to be cleaned up") + } + } + + if p.providers.Len() != 0 { + t.Fatal("providers map not cleaned up") + } + + allprovs, err := p.getAllProvKeys() + if err != nil { + t.Fatal(err) + } + + if len(allprovs) != 0 { + t.Fatal("expected everything to be cleaned out of the datastore") + } +} diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go deleted file mode 100644 index 362a83cb62..0000000000 --- a/routing/dht/providers_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package dht - -import ( - "testing" - "time" - - key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -func TestProviderManager(t *testing.T) { - ctx := context.Background() - mid := peer.ID("testing") - p := NewProviderManager(ctx, mid) - a := key.Key("test") - p.AddProvider(ctx, a, peer.ID("testingprovider")) - resp := p.GetProviders(ctx, a) - if len(resp) != 1 { - t.Fatal("Could not retrieve provider.") - } - p.proc.Close() -} - -func TestProvidesExpire(t *testing.T) { - ProvideValidity = time.Second - defaultCleanupInterval = time.Second - - ctx := context.Background() - mid := peer.ID("testing") - p := NewProviderManager(ctx, mid) - - peers := []peer.ID{"a", "b"} - var keys []key.Key - for i := 0; i < 10; i++ { - k := key.Key(i) - keys = append(keys, k) - p.AddProvider(ctx, k, peers[0]) - p.AddProvider(ctx, k, peers[1]) - } - - for i := 0; i < 10; i++ { - out := p.GetProviders(ctx, keys[i]) - if len(out) != 2 { - t.Fatal("expected providers to still be there") - } - } - - time.Sleep(time.Second * 3) - for i := 0; i < 10; i++ { - out := p.GetProviders(ctx, keys[i]) - if len(out) > 2 { - t.Fatal("expected providers to be cleaned up") - } - } - - if len(p.providers) != 0 { - t.Fatal("providers map not cleaned up") - } -} From 6c52054775072d130e157697d0d2e61077f55ddf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 25 Jun 2016 22:59:57 -0700 Subject: [PATCH 1185/3147] providers test with multiple peers License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@34d3e4e869892312d28e59ce5c387006b9ad9b02 --- routing/dht/providers/providers_test.go | 26 ++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go index 2943e5ccb1..660640267e 100644 --- a/routing/dht/providers/providers_test.go +++ b/routing/dht/providers/providers_test.go @@ -58,10 +58,17 @@ func TestProvidersSerialization(t *testing.T) { dstore := ds.NewMapDatastore() k := key.Key("my key!") - p := peer.ID("my peer") - pt := time.Now() + p1 := peer.ID("peer one") + p2 := peer.ID("peer two") + pt1 := time.Now() + pt2 := pt1.Add(time.Hour) - err := writeProviderEntry(dstore, k, p, pt) + err := writeProviderEntry(dstore, k, p1, pt1) + if err != nil { + t.Fatal(err) + } + + err = writeProviderEntry(dstore, k, p2, pt2) if err != nil { t.Fatal(err) } @@ -71,12 +78,21 @@ func TestProvidersSerialization(t *testing.T) { t.Fatal(err) } - lt, ok := pset.set[p] + lt1, ok := pset.set[p1] + if !ok { + t.Fatal("failed to load set correctly") + } + + if pt1 != lt1 { + t.Fatal("time wasnt serialized correctly") + } + + lt2, ok := pset.set[p2] if !ok { t.Fatal("failed to load set correctly") } - if pt != lt { + if pt2 != lt2 { t.Fatal("time wasnt serialized correctly") } } From 19ce01f6e85ac09edae745dc4baa1751779ed292 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 27 Jun 2016 14:43:01 -0700 Subject: [PATCH 1186/3147] use no padding encoding License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@a020b75eb01df645aded3da596b8a54505ee7102 --- routing/dht/providers/providers.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index beb53d4ae3..95d9b70d2a 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -1,7 +1,6 @@ package providers import ( - "encoding/base32" "encoding/binary" "fmt" "strings" @@ -14,6 +13,7 @@ import ( lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" + base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" key "github.com/ipfs/go-ipfs/blocks/key" @@ -81,7 +81,7 @@ func NewProviderManager(ctx context.Context, local peer.ID, dstore ds.Datastore) const providersKeyPrefix = "/providers/" func mkProvKey(k key.Key) ds.Key { - return ds.NewKey(providersKeyPrefix + base32.StdEncoding.EncodeToString([]byte(k))) + return ds.NewKey(providersKeyPrefix + base32.RawStdEncoding.EncodeToString([]byte(k))) } func (pm *ProviderManager) Process() goprocess.Process { @@ -132,7 +132,7 @@ func loadProvSet(dstore ds.Datastore, k key.Key) (*providerSet, error) { continue } - decstr, err := base32.StdEncoding.DecodeString(parts[len(parts)-1]) + decstr, err := base32.RawStdEncoding.DecodeString(parts[len(parts)-1]) if err != nil { log.Error("base32 decoding error: ", err) continue @@ -177,7 +177,7 @@ func (pm *ProviderManager) addProv(k key.Key, p peer.ID) error { } func writeProviderEntry(dstore ds.Datastore, k key.Key, p peer.ID, t time.Time) error { - dsk := mkProvKey(k).ChildString(base32.StdEncoding.EncodeToString([]byte(p))) + dsk := mkProvKey(k).ChildString(base32.RawStdEncoding.EncodeToString([]byte(p))) buf := make([]byte, 16) n := binary.PutVarint(buf, t.UnixNano()) @@ -230,7 +230,7 @@ func (pm *ProviderManager) getAllProvKeys() ([]key.Key, error) { log.Warning("incorrectly formatted provider entry in datastore") continue } - decoded, err := base32.StdEncoding.DecodeString(parts[2]) + decoded, err := base32.RawStdEncoding.DecodeString(parts[2]) if err != nil { log.Warning("error decoding base32 provider key") continue From c38cd01172703e2148897a978ed46e78e0c58b72 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 1 Jul 2016 14:51:19 +0200 Subject: [PATCH 1187/3147] routing: Use correct error variable License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@fe58cd34c47aa7cd87179b213db6bc0df6e80313 --- routing/dht/providers/providers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index 95d9b70d2a..ca8dff18bf 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -123,7 +123,7 @@ func loadProvSet(dstore ds.Datastore, k key.Key) (*providerSet, error) { out := newProviderSet() for e := range res.Next() { if e.Error != nil { - log.Error("got an error: ", err) + log.Error("got an error: ", e.Error) continue } parts := strings.Split(e.Key, "/") From 680ccdbc1e9f76d5dd322f265afaf9208f4f4810 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1188/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@e6f5fb0404f0fe3f5948a74be7cf19ce96ce5e4c --- blockstore/blockstore.go | 23 ++++++++++++++--------- blockstore/blockstore_test.go | 6 +++--- blockstore/write_cache_test.go | 6 +++--- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index a1f1f600bb..eb35fdbaf6 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -11,10 +11,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dsns "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/namespace" - dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dsns "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/namespace" + dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" ) var log = logging.Logger("blockstore") @@ -164,26 +164,31 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { } // this function is here to compartmentalize - get := func() (k key.Key, ok bool) { + get := func() (key.Key, bool) { select { case <-ctx.Done(): - return k, false + return "", false case e, more := <-res.Next(): if !more { - return k, false + return "", false } if e.Error != nil { log.Debug("blockstore.AllKeysChan got err:", e.Error) - return k, false + return "", false } // need to convert to key.Key using key.KeyFromDsKey. - k = key.KeyFromDsKey(ds.NewKey(e.Key)) + k, err := key.KeyFromDsKey(ds.NewKey(e.Key)) + if err != nil { + log.Warningf("error parsing key from DsKey: ", err) + return "", true + } log.Debug("blockstore: query got key", k) // key must be a multihash. else ignore it. - _, err := mh.Cast([]byte(k)) + _, err = mh.Cast([]byte(k)) if err != nil { + log.Warningf("key from datastore was not a multihash: ", err) return "", true } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index babd1a99a2..1996a4729e 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" - ds_sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" + ds_sync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index 01c52ae409..e3b32ff0bd 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -4,9 +4,9 @@ import ( "testing" "github.com/ipfs/go-ipfs/blocks" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" - syncds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" + syncds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" ) func TestReturnsErrorWhenSizeNegative(t *testing.T) { From 2227676ff4ecf0a8edd7dbb197b4f6c082f6a314 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1189/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@65264936353b346c8e890dbdf82b1e2c752d3dca --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 2233032a76..5cbade9bae 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,8 +7,8 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index ef64f9390f..ec4629d105 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index aba06aba63..0629e5d4df 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -18,8 +18,8 @@ import ( gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index d3097b1396..6fe1e6818f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,10 +10,10 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { From 724e7d0f0303355daa175cc0dccf96edf6a71c31 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1190/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@4c7eeaecf225b6c4cd65fe8ab23dd2374e889d84 --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 4 ++-- routing/dht/handlers.go | 2 +- routing/dht/providers/providers.go | 4 ++-- routing/dht/providers/providers_test.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 ++-- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ecee8c8201..bbb8fd5a48 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -23,10 +23,10 @@ import ( peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" host "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" protocol "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/protocol" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" ) var log = logging.Logger("dht") diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 865263a7b9..92344c8012 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,8 +14,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 42de2b4776..867124fc57 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index fa6490fba3..dabdd0e371 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index ca8dff18bf..4a5c0ef0e2 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -11,9 +11,9 @@ import ( goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dsq "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/query" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go index 660640267e..8f2e8c2293 100644 --- a/routing/dht/providers/providers_test.go +++ b/routing/dht/providers/providers_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index f508f5b08a..32a0e1436b 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,7 +8,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 8628a1db99..7536c87729 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 2779d35964..8d9a9b5afd 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + sync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 4a8bc37935..875522af20 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" ) // Server provides mockrouting Clients diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 333dfac0cb..c9cf3d8a8e 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -8,7 +8,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 425b99aa8f..7c6fb0c7d2 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,7 +8,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - datastore "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + datastore "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 1d3ff54c0f..7eefa52496 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -5,7 +5,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - datastore "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" + datastore "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 896af3232fcd6f2c0844ac6a7fb7e9e348b096e8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1191/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@4a623eb06ec64d035e9ab25dbe7313198da22547 --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 4c58b83f6e..c75a0db415 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -15,9 +15,9 @@ import ( "github.com/ipfs/go-ipfs/path" randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" From 834a57b99f5d14ac5803a4404b6170ac6c9a7419 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1192/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@2d151cc13215d12928b76bb8f3e079a7ebef4700 --- unixfs/mod/dagmodifier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 404a187ec0..8a57d49d64 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -17,11 +17,11 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" ) func getMockDagServ(t testing.TB) mdag.DAGService { From a7b2f40ed1cdd36ee8c999674dc9dc120e77356e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1193/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@740596d9395c9484740b9727532ad1a5187556db --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 018ce6cf7f..5e39e1ce7d 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index ecc1fc1f63..c7220dada0 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -11,9 +11,9 @@ import ( bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" ) func randNode() (*mdag.Node, key.Key) { diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index f1993e8ece..64006ca41e 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -10,10 +10,10 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" "github.com/ipfs/go-ipfs/merkledag" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" ) func ignoreKeys(key.Key) {} From 58552c4d4047a2ee2092f1de5780321a726ec1f8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1194/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@4f0a801662035b83307fd7e217a0e525d7e92fe5 --- blockservice/test/blocks_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 7c8e9ba96a..7a3b9ce94e 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -11,10 +11,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - dssync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" ) func TestBlocks(t *testing.T) { From b323e9198c0489b2c863ea369e912dce523e3713 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Jun 2016 14:28:40 -0700 Subject: [PATCH 1195/3147] encode keys to datastore with base32 standard encoding Fixes #2601 Also bump version to 0.4.3-dev License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@c0304d193821b1cca840b05947e7f5b76097ec99 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 46cb4fb2a2..bdb6262af3 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore" - ds_sync "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds_sync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" ) func TestBlockReturnsErr(t *testing.T) { From e87e9022cf5b66334890a199d6f3ebf1f838ec61 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1196/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@cadf17239e4d0470305dce2be50046118e4b2ae0 --- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/write_cache_test.go | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index eb35fdbaf6..477141cd62 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,9 +12,9 @@ import ( logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dsns "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/namespace" - dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dsns "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/namespace" + dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 1996a4729e..f7a5325ab5 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -6,9 +6,9 @@ import ( "testing" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" - ds_sync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" + ds_sync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/blockstore/write_cache_test.go b/blockstore/write_cache_test.go index e3b32ff0bd..966ff06109 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/write_cache_test.go @@ -4,9 +4,9 @@ import ( "testing" "github.com/ipfs/go-ipfs/blocks" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" - syncds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" + syncds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func TestReturnsErrorWhenSizeNegative(t *testing.T) { From 17aafd8dc3b547b438e7c9aeed4a02985a9e3a98 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1197/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@e27c7535551596a3e51a2fb21265af515cfec7f1 --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 5cbade9bae..bf058e5ffa 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -8,7 +8,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index ec4629d105..65c4826557 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,7 +8,7 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 0629e5d4df..fc6c41bc72 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -19,7 +19,7 @@ import ( peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 6fe1e6818f..03f64abaca 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -12,8 +12,8 @@ import ( peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { From a6845e0ecd84ec067ebfb8b7c818c99700f3c27e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1198/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@05ae43401d850329b5172526cb94c91cd6d91e94 --- routing/dht/dht.go | 2 +- routing/dht/dht_test.go | 4 ++-- routing/dht/ext_test.go | 4 ++-- routing/dht/handlers.go | 2 +- routing/dht/providers/providers.go | 4 ++-- routing/dht/providers/providers_test.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 ++-- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index bbb8fd5a48..71f21f9950 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -26,7 +26,7 @@ import ( host "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" protocol "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/protocol" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) var log = logging.Logger("dht") diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 92344c8012..018f72215e 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,8 +14,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 867124fc57..3e33fd0f0f 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index dabdd0e371..0152ff1bd6 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index 4a5c0ef0e2..da3cf76061 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -12,8 +12,8 @@ import ( peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dsq "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/query" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go index 8f2e8c2293..11e1506a81 100644 --- a/routing/dht/providers/providers_test.go +++ b/routing/dht/providers/providers_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 32a0e1436b..e3e036bdf9 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,7 +8,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 7536c87729..ed4973e7a6 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 8d9a9b5afd..bf729f11d4 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - sync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + sync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 875522af20..ea092f13e0 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -12,7 +12,7 @@ import ( pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) // Server provides mockrouting Clients diff --git a/routing/offline/offline.go b/routing/offline/offline.go index c9cf3d8a8e..a207836664 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -8,7 +8,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 7c6fb0c7d2..0a105256ce 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,7 +8,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - datastore "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + datastore "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 7eefa52496..bde8ca2b66 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -5,7 +5,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - datastore "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + datastore "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 65713afc49790b80f8a08983a1bdef7eae44c23e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1199/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@57018c3957cdc356393b63706ad1551ceaf9755b --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index c75a0db415..84ce226684 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -16,8 +16,8 @@ import ( "github.com/ipfs/go-ipfs/path" randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" From 62796c838f090bd1e2dde0d798daa631006aa8ff Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1200/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@b58612a64164d34eba6636040ff4a9fc8691b159 --- unixfs/mod/dagmodifier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 8a57d49d64..dffd205bf1 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -18,10 +18,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) func getMockDagServ(t testing.TB) mdag.DAGService { From 45db7db0177a8c21961358f05d45aad67b04e035 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1201/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@4ad46f6ff37f5f0bfa8f3d99329fc139f23ad0ce --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 5e39e1ce7d..83a6f5b88c 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,7 +12,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index c7220dada0..a6ec85dac6 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -12,8 +12,8 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func randNode() (*mdag.Node, key.Key) { diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 64006ca41e..da5f0702db 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -12,8 +12,8 @@ import ( mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func ignoreKeys(key.Key) {} From 05fb104598af4c1563adc3d602390310741e4f39 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1202/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@123a7d847a3e5e424441f7fd4b760a9e0046d9b7 --- blockservice/test/blocks_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 7a3b9ce94e..943bf09443 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -13,8 +13,8 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - dssync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func TestBlocks(t *testing.T) { From 665b7c1c7a924627398caaf193df8da2a31077fd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 1 Jul 2016 22:40:57 -0700 Subject: [PATCH 1203/3147] update go-datastore changes 0.1.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@d00c30cf32ca758fcd15de5d79777d02d1904fd6 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index bdb6262af3..56066a552c 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore" - ds_sync "gx/ipfs/QmbCg24DeRKaRDLHbzzSVj7xndmWCPanBLkAM7Lx2nbrFs/go-datastore/sync" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + ds_sync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func TestBlockReturnsErr(t *testing.T) { From 3c5f7181b8718128286cc2f44a370bca0e407d5f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 21 Jun 2016 21:05:59 +0200 Subject: [PATCH 1204/3147] blocks/blockstore: Add bloom filter Replace write_cache with bloom_cache Improve ARC caching Fix small issue in case of AllKeysChan fails deps: Update go-datastore blocks/blockstore: Invalidate ARC cache before deletin block deps: Update go-datastore License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@eebe80643815623d206ae2c5c1371d27ef12f785 --- blockstore/bloom_cache.go | 175 ++++++++++++++++++ ...rite_cache_test.go => bloom_cache_test.go} | 51 ++++- blockstore/write_cache.go | 78 -------- 3 files changed, 218 insertions(+), 86 deletions(-) create mode 100644 blockstore/bloom_cache.go rename blockstore/{write_cache_test.go => bloom_cache_test.go} (66%) delete mode 100644 blockstore/write_cache.go diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go new file mode 100644 index 0000000000..ca61d755af --- /dev/null +++ b/blockstore/bloom_cache.go @@ -0,0 +1,175 @@ +package blockstore + +import ( + "github.com/ipfs/go-ipfs/blocks" + key "github.com/ipfs/go-ipfs/blocks/key" + lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" +) + +// BloomCached returns Blockstore that caches Has requests using Bloom filter +// Size is size of bloom filter in bytes +func BloomCached(bs Blockstore, bloomSize, lruSize int) (*bloomcache, error) { + bl, err := bloom.New(float64(bloomSize), float64(7)) + if err != nil { + return nil, err + } + arc, err := lru.NewARC(lruSize) + if err != nil { + return nil, err + } + bc := &bloomcache{blockstore: bs, bloom: bl, arc: arc} + bc.Invalidate() + go bc.Rebuild() + + return bc, nil +} + +type bloomcache struct { + bloom *bloom.Bloom + active bool + + arc *lru.ARCCache + // This chan is only used for testing to wait for bloom to enable + rebuildChan chan struct{} + blockstore Blockstore + + // Statistics + hits uint64 + misses uint64 +} + +func (b *bloomcache) Invalidate() { + b.rebuildChan = make(chan struct{}) + b.active = false +} + +func (b *bloomcache) BloomActive() bool { + return b.active +} + +func (b *bloomcache) Rebuild() { + ctx := context.TODO() + evt := log.EventBegin(ctx, "bloomcache.Rebuild") + defer evt.Done() + + ch, err := b.blockstore.AllKeysChan(ctx) + if err != nil { + log.Errorf("AllKeysChan failed in bloomcache rebuild with: %v", err) + return + } + for key := range ch { + b.bloom.AddTS([]byte(key)) // Use binary key, the more compact the better + } + close(b.rebuildChan) + b.active = true +} + +func (b *bloomcache) DeleteBlock(k key.Key) error { + if has, ok := b.hasCached(k); ok && !has { + return ErrNotFound + } + + b.arc.Remove(k) // Invalidate cache before deleting. + err := b.blockstore.DeleteBlock(k) + if err == nil { + b.arc.Add(k, false) + } else if err == ds.ErrNotFound || err == ErrNotFound { + b.arc.Add(k, false) + return ErrNotFound + } + return err +} + +// if ok == false has is inconclusive +// if ok == true then has respons to question: is it contained +func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { + if k == "" { + return true, true + } + if b.active { + blr := b.bloom.HasTS([]byte(k)) + if blr == false { // not contained in bloom is only conclusive answer bloom gives + return blr, true + } + } + h, ok := b.arc.Get(k) + if ok { + return h.(bool), ok + } else { + return false, ok + } +} + +func (b *bloomcache) Has(k key.Key) (bool, error) { + if has, ok := b.hasCached(k); ok { + return has, nil + } + + res, err := b.blockstore.Has(k) + if err == nil { + b.arc.Add(k, res) + } + return res, err +} + +func (b *bloomcache) Get(k key.Key) (blocks.Block, error) { + if has, ok := b.hasCached(k); ok && !has { + return nil, ErrNotFound + } + + bl, err := b.blockstore.Get(k) + if bl == nil && err == ErrNotFound { + b.arc.Add(k, false) + } else if bl != nil { + b.arc.Add(k, true) + } + return bl, err +} + +func (b *bloomcache) Put(bl blocks.Block) error { + if has, ok := b.hasCached(bl.Key()); ok && has { + return nil + } + + err := b.blockstore.Put(bl) + if err == nil { + b.bloom.AddTS([]byte(bl.Key())) + b.arc.Add(bl.Key(), true) + } + return err +} + +func (b *bloomcache) PutMany(bs []blocks.Block) error { + var good []blocks.Block + for _, block := range bs { + if has, ok := b.hasCached(block.Key()); !ok || (ok && !has) { + good = append(good, block) + } + } + err := b.blockstore.PutMany(bs) + if err == nil { + for _, block := range bs { + b.bloom.AddTS([]byte(block.Key())) + } + } + return err +} + +func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { + return b.blockstore.AllKeysChan(ctx) +} + +func (b *bloomcache) GCLock() Unlocker { + return b.blockstore.(GCBlockstore).GCLock() +} + +func (b *bloomcache) PinLock() Unlocker { + return b.blockstore.(GCBlockstore).PinLock() +} + +func (b *bloomcache) GCRequested() bool { + return b.blockstore.(GCBlockstore).GCRequested() +} diff --git a/blockstore/write_cache_test.go b/blockstore/bloom_cache_test.go similarity index 66% rename from blockstore/write_cache_test.go rename to blockstore/bloom_cache_test.go index 966ff06109..6c9f13cdcd 100644 --- a/blockstore/write_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -1,28 +1,32 @@ package blockstore import ( - "testing" - + "fmt" "github.com/ipfs/go-ipfs/blocks" ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" syncds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" + "testing" + "time" ) func TestReturnsErrorWhenSizeNegative(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) - _, err := WriteCached(bs, -1) - if err != nil { - return + _, err := BloomCached(bs, 100, -1) + if err == nil { + t.Fail() + } + _, err = BloomCached(bs, -1, 100) + if err == nil { + t.Fail() } - t.Fail() } func TestRemoveCacheEntryOnDelete(t *testing.T) { b := blocks.NewBlock([]byte("foo")) cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := WriteCached(bs, 1) + cachedbs, err := BloomCached(bs, 1, 1) if err != nil { t.Fatal(err) } @@ -43,7 +47,7 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { func TestElideDuplicateWrite(t *testing.T) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := WriteCached(bs, 1) + cachedbs, err := BloomCached(bs, 1, 1) if err != nil { t.Fatal(err) } @@ -56,6 +60,37 @@ func TestElideDuplicateWrite(t *testing.T) { }) cachedbs.Put(b1) } +func TestHasIsBloomCached(t *testing.T) { + cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} + bs := NewBlockstore(syncds.MutexWrap(cd)) + + for i := 0; i < 1000; i++ { + bs.Put(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i)))) + } + cachedbs, err := BloomCached(bs, 256*1024, 128) + if err != nil { + t.Fatal(err) + } + + select { + case <-cachedbs.rebuildChan: + case <-time.After(1 * time.Second): + t.Fatalf("Timeout wating for rebuild: %d", cachedbs.bloom.ElementsAdded()) + } + + cacheFails := 0 + cd.SetFunc(func() { + cacheFails++ + }) + + for i := 0; i < 1000; i++ { + cachedbs.Has(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i+2000))).Key()) + } + + if float64(cacheFails)/float64(1000) > float64(0.05) { + t.Fatal("Bloom filter has cache miss rate of more than 5%") + } +} type callbackDatastore struct { f func() diff --git a/blockstore/write_cache.go b/blockstore/write_cache.go deleted file mode 100644 index fbeee25ba7..0000000000 --- a/blockstore/write_cache.go +++ /dev/null @@ -1,78 +0,0 @@ -package blockstore - -import ( - "github.com/ipfs/go-ipfs/blocks" - key "github.com/ipfs/go-ipfs/blocks/key" - "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -// WriteCached returns a blockstore that caches up to |size| unique writes (bs.Put). -func WriteCached(bs Blockstore, size int) (*writecache, error) { - c, err := lru.New(size) - if err != nil { - return nil, err - } - return &writecache{blockstore: bs, cache: c}, nil -} - -type writecache struct { - cache *lru.Cache // pointer b/c Cache contains a Mutex as value (complicates copying) - blockstore Blockstore -} - -func (w *writecache) DeleteBlock(k key.Key) error { - defer log.EventBegin(context.TODO(), "writecache.BlockRemoved", &k).Done() - w.cache.Remove(k) - return w.blockstore.DeleteBlock(k) -} - -func (w *writecache) Has(k key.Key) (bool, error) { - if _, ok := w.cache.Get(k); ok { - return true, nil - } - return w.blockstore.Has(k) -} - -func (w *writecache) Get(k key.Key) (blocks.Block, error) { - return w.blockstore.Get(k) -} - -func (w *writecache) Put(b blocks.Block) error { - k := b.Key() - if _, ok := w.cache.Get(k); ok { - return nil - } - defer log.EventBegin(context.TODO(), "writecache.BlockAdded", &k).Done() - - w.cache.Add(b.Key(), struct{}{}) - return w.blockstore.Put(b) -} - -func (w *writecache) PutMany(bs []blocks.Block) error { - var good []blocks.Block - for _, b := range bs { - if _, ok := w.cache.Get(b.Key()); !ok { - good = append(good, b) - k := b.Key() - defer log.EventBegin(context.TODO(), "writecache.BlockAdded", &k).Done() - } - } - return w.blockstore.PutMany(good) -} - -func (w *writecache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { - return w.blockstore.AllKeysChan(ctx) -} - -func (w *writecache) GCLock() Unlocker { - return w.blockstore.(GCBlockstore).GCLock() -} - -func (w *writecache) PinLock() Unlocker { - return w.blockstore.(GCBlockstore).PinLock() -} - -func (w *writecache) GCRequested() bool { - return w.blockstore.(GCBlockstore).GCRequested() -} From 67b72ce57dc65642a9391d72186f61d53f22f1ce Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 4 Jul 2016 20:12:13 +0200 Subject: [PATCH 1205/3147] blocks/blockstorage: use automic for bloom.active License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@0858a213d01717cd9a7d51de0a5fad876e91ef60 --- blockstore/bloom_cache.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index ca61d755af..bafa232396 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -7,6 +7,8 @@ import ( bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + + "sync/atomic" ) // BloomCached returns Blockstore that caches Has requests using Bloom filter @@ -29,7 +31,7 @@ func BloomCached(bs Blockstore, bloomSize, lruSize int) (*bloomcache, error) { type bloomcache struct { bloom *bloom.Bloom - active bool + active int32 arc *lru.ARCCache // This chan is only used for testing to wait for bloom to enable @@ -43,11 +45,11 @@ type bloomcache struct { func (b *bloomcache) Invalidate() { b.rebuildChan = make(chan struct{}) - b.active = false + atomic.StoreInt32(&b.active, 0) } func (b *bloomcache) BloomActive() bool { - return b.active + return atomic.LoadInt32(&b.active) != 0 } func (b *bloomcache) Rebuild() { @@ -64,7 +66,7 @@ func (b *bloomcache) Rebuild() { b.bloom.AddTS([]byte(key)) // Use binary key, the more compact the better } close(b.rebuildChan) - b.active = true + atomic.StoreInt32(&b.active, 1) } func (b *bloomcache) DeleteBlock(k key.Key) error { @@ -89,7 +91,7 @@ func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { if k == "" { return true, true } - if b.active { + if b.BloomActive() { blr := b.bloom.HasTS([]byte(k)) if blr == false { // not contained in bloom is only conclusive answer bloom gives return blr, true From 002b484afe9ab6db4e6312b4c0fd5b6d0af938c9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 4 Jul 2016 20:34:07 +0200 Subject: [PATCH 1206/3147] test: fix races in bloomcache tests License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@61a4d9b3aa5ee3dbaa5cbf706aa81175ea61e733 --- blockstore/bloom_cache_test.go | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 6c9f13cdcd..3b8bb8b911 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -2,12 +2,15 @@ package blockstore import ( "fmt" + "sync" + "testing" + "time" + "github.com/ipfs/go-ipfs/blocks" + ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" syncds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" - "testing" - "time" ) func TestReturnsErrorWhenSizeNegative(t *testing.T) { @@ -32,7 +35,10 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { } cachedbs.Put(b) + cd.Lock() writeHitTheDatastore := false + cd.Unlock() + cd.SetFunc(func() { writeHitTheDatastore = true }) @@ -93,34 +99,45 @@ func TestHasIsBloomCached(t *testing.T) { } type callbackDatastore struct { + sync.Mutex f func() ds ds.Datastore } -func (c *callbackDatastore) SetFunc(f func()) { c.f = f } +func (c *callbackDatastore) SetFunc(f func()) { + c.Lock() + defer c.Unlock() + c.f = f +} + +func (c *callbackDatastore) CallF() { + c.Lock() + defer c.Unlock() + c.f() +} func (c *callbackDatastore) Put(key ds.Key, value interface{}) (err error) { - c.f() + c.CallF() return c.ds.Put(key, value) } func (c *callbackDatastore) Get(key ds.Key) (value interface{}, err error) { - c.f() + c.CallF() return c.ds.Get(key) } func (c *callbackDatastore) Has(key ds.Key) (exists bool, err error) { - c.f() + c.CallF() return c.ds.Has(key) } func (c *callbackDatastore) Delete(key ds.Key) (err error) { - c.f() + c.CallF() return c.ds.Delete(key) } func (c *callbackDatastore) Query(q dsq.Query) (dsq.Results, error) { - c.f() + c.CallF() return c.ds.Query(q) } From 2ba791d2793c91120b9e812848225588818e4e2a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 4 Jul 2016 20:34:46 +0200 Subject: [PATCH 1207/3147] blocks/blockstore: style cleanup of bloomcache License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@aa8ea8f78ada9a4f77f87242f556276d4a9b6532 --- blockstore/bloom_cache.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index bafa232396..3e4038869a 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -76,32 +76,36 @@ func (b *bloomcache) DeleteBlock(k key.Key) error { b.arc.Remove(k) // Invalidate cache before deleting. err := b.blockstore.DeleteBlock(k) - if err == nil { + switch err { + case nil: b.arc.Add(k, false) - } else if err == ds.ErrNotFound || err == ErrNotFound { + case ds.ErrNotFound, ErrNotFound: b.arc.Add(k, false) - return ErrNotFound + default: + return err } - return err + return nil } // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { if k == "" { - return true, true + // Return cache invalid so call to blockstore + // in case of invalid key is forwarded deeper + return false, false } if b.BloomActive() { blr := b.bloom.HasTS([]byte(k)) if blr == false { // not contained in bloom is only conclusive answer bloom gives - return blr, true + return false, true } } h, ok := b.arc.Get(k) if ok { return h.(bool), ok } else { - return false, ok + return false, false } } From 7979e8fa3e61f964a1482724c47ac72f56bf0e97 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 4 Jul 2016 12:27:26 -0700 Subject: [PATCH 1208/3147] update go-libp2p License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d9b322b937e4aac2c984d7dcf1a1b01f4b1798f9 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 71f21f9950..4aab2bce75 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -22,9 +22,9 @@ import ( goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + host "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" + protocol "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/protocol" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - host "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" - protocol "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/protocol" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 2c8232c5dd..405ae1572f 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -7,9 +7,9 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 018f72215e..e5ce56fead 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -19,8 +19,8 @@ import ( pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + netutil "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/test/util" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - netutil "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/test/util" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 3e33fd0f0f..a675c5d6bf 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -14,9 +14,9 @@ import ( dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net/mock" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 6ce249e4fe..3fdd435fe4 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" + inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index e35f40891a..26b2615358 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -7,7 +7,7 @@ import ( logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" + inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9a2ca14aaa..1ac8983fc1 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -16,7 +16,7 @@ import ( pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" + inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index bf729f11d4..5a017d55bc 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,7 +3,7 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" sync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" diff --git a/routing/none/none_client.go b/routing/none/none_client.go index ee57000a46..140c3f84e3 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,7 +9,7 @@ import ( logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - p2phost "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" + p2phost "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 4d3b3d7b08..cba449742e 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -14,8 +14,8 @@ import ( logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 730cef6bf3..2dc2e77211 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" + inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index a736b57530..438cdd99f1 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,8 +9,8 @@ import ( logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - host "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/host" - inet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net" + host "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" + inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" From 3b147d01ab7af1d15c893e4cc7a684ce4718cb8c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 4 Jul 2016 12:27:26 -0700 Subject: [PATCH 1209/3147] update go-libp2p License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@2dac68bb94b954d426131ec965e12e8d3911395e --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 57f706d0fb..26056ca97e 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - mocknet "gx/ipfs/QmZ8bCZpMWDbFSh6h2zgTYwrhnjrGM5c9WCzw72SU8p63b/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 26cead531077395b71b1f4ac99aad48e3941be5b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Jul 2016 12:19:54 -0700 Subject: [PATCH 1210/3147] fix handling of dht records and local fixups License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@7faccda63d01a075414a30ff4649493047f49ee2 --- routing/dht/routing.go | 7 +++++++ routing/record/validation.go | 14 +++++++++---- routing/record/validation_test.go | 35 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 routing/record/validation_test.go diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 9a2ca14aaa..49c82f19c2 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -122,6 +122,13 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { // if someone sent us a different 'less-valid' record, lets correct them if !bytes.Equal(v.Val, best) { go func(v routing.RecvdVal) { + if v.From == dht.self { + err := dht.putLocal(key, fixupRec) + if err != nil { + log.Error("Error correcting local dht entry:", err) + } + return + } ctx, cancel := context.WithTimeout(dht.Context(), time.Second*30) defer cancel() err := dht.putValueToPeer(ctx, v.From, key, fixupRec) diff --git a/routing/record/validation.go b/routing/record/validation.go index 4cce81b2a8..16bf60090c 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -73,13 +73,19 @@ func (v Validator) IsSigned(k key.Key) (bool, error) { // verifies that the passed in record value is the PublicKey // that matches the passed in key. func ValidatePublicKeyRecord(k key.Key, val []byte) error { - keyparts := bytes.Split([]byte(k), []byte("/")) - if len(keyparts) < 3 { - return errors.New("invalid key") + if len(k) != 38 { + return errors.New("invalid public key record key") } + prefix := string(k[:4]) + if prefix != "/pk/" { + return errors.New("key was not prefixed with /pk/") + } + + keyhash := []byte(k[4:]) + pkh := u.Hash(val) - if !bytes.Equal(keyparts[2], pkh) { + if !bytes.Equal(keyhash, pkh) { return errors.New("public key does not match storage key") } return nil diff --git a/routing/record/validation_test.go b/routing/record/validation_test.go new file mode 100644 index 0000000000..ae389244ef --- /dev/null +++ b/routing/record/validation_test.go @@ -0,0 +1,35 @@ +package record + +import ( + "encoding/base64" + "testing" + + key "github.com/ipfs/go-ipfs/blocks/key" + ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" +) + +var OffensiveKey = "CAASXjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDjXAQQMal4SB2tSnX6NJIPmC69/BT8A8jc7/gDUZNkEhdhYHvc7k7S4vntV/c92nJGxNdop9fKJyevuNMuXhhHAgMBAAE=" + +func TestValidatePublicKey(t *testing.T) { + pkb, err := base64.StdEncoding.DecodeString(OffensiveKey) + if err != nil { + t.Fatal(err) + } + + pubk, err := ci.UnmarshalPublicKey(pkb) + if err != nil { + t.Fatal(err) + } + + pkh, err := pubk.Hash() + if err != nil { + t.Fatal(err) + } + + k := key.Key("/pk/" + string(pkh)) + + err = ValidatePublicKeyRecord(k, pkb) + if err != nil { + t.Fatal(err) + } +} From 1f78b07a152510a9ff2b1e6bdb857d5c3c8a6e1a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Jul 2016 13:24:13 -0700 Subject: [PATCH 1211/3147] better checking of dht keys License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@7bc2ead2153e2fb53b44111399b906e43ac0bf63 --- routing/record/validation.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/routing/record/validation.go b/routing/record/validation.go index 16bf60090c..23d8922362 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -3,11 +3,13 @@ package record import ( "bytes" "errors" + "fmt" key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) @@ -73,7 +75,7 @@ func (v Validator) IsSigned(k key.Key) (bool, error) { // verifies that the passed in record value is the PublicKey // that matches the passed in key. func ValidatePublicKeyRecord(k key.Key, val []byte) error { - if len(k) != 38 { + if len(k) < 5 { return errors.New("invalid public key record key") } @@ -83,6 +85,9 @@ func ValidatePublicKeyRecord(k key.Key, val []byte) error { } keyhash := []byte(k[4:]) + if _, err := mh.Cast(keyhash); err != nil { + return fmt.Errorf("key did not contain valid multihash: %s", err) + } pkh := u.Hash(val) if !bytes.Equal(keyhash, pkh) { From b8d716f11d23b5bc4282f03ee2dc2c7de10def29 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 4 Jul 2016 20:08:18 +0200 Subject: [PATCH 1212/3147] blocks/blockstore: add CacheOpts - structure of cache config License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@09d9204bf852e114e91720c335b025d613c312ec --- blockstore/caching.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 blockstore/caching.go diff --git a/blockstore/caching.go b/blockstore/caching.go new file mode 100644 index 0000000000..5657059d89 --- /dev/null +++ b/blockstore/caching.go @@ -0,0 +1,16 @@ +package blockstore + +// Next to each option is it aproximate memory usage per unit +type CacheOpts struct { + HasBloomFilterSize int // 1 bit + HasBloomFilterHashes int // No size, 7 is usually best, consult bloom papers + HasARCCacheSize int // 32 bytes +} + +func DefaultCacheOpts() CacheOpts { + return CacheOpts{ + HasBloomFilterSize: 512 * 8 * 1024, + HasBloomFilterHashes: 7, + HasARCCacheSize: 64 * 1024, + } +} From d463e86e65d2fe3765dc6873f6a1f01ed7482108 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 4 Jul 2016 23:02:29 +0200 Subject: [PATCH 1213/3147] blocks/blockstore: introduce context passing to blockstore License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@17a64ee5b588423e30b7c401fbc9ffc14a195ded --- blockstore/bloom_cache.go | 26 ++++++++++++++++++-------- blockstore/bloom_cache_test.go | 24 ++++++++++++++++++------ blockstore/caching.go | 26 ++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 14 deletions(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 3e4038869a..d9f93b3e85 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -11,10 +11,10 @@ import ( "sync/atomic" ) -// BloomCached returns Blockstore that caches Has requests using Bloom filter +// bloomCached returns Blockstore that caches Has requests using Bloom filter // Size is size of bloom filter in bytes -func BloomCached(bs Blockstore, bloomSize, lruSize int) (*bloomcache, error) { - bl, err := bloom.New(float64(bloomSize), float64(7)) +func bloomCached(bs Blockstore, ctx context.Context, bloomSize, hashCount, lruSize int) (*bloomcache, error) { + bl, err := bloom.New(float64(bloomSize), float64(hashCount)) if err != nil { return nil, err } @@ -24,7 +24,7 @@ func BloomCached(bs Blockstore, bloomSize, lruSize int) (*bloomcache, error) { } bc := &bloomcache{blockstore: bs, bloom: bl, arc: arc} bc.Invalidate() - go bc.Rebuild() + go bc.Rebuild(ctx) return bc, nil } @@ -52,8 +52,7 @@ func (b *bloomcache) BloomActive() bool { return atomic.LoadInt32(&b.active) != 0 } -func (b *bloomcache) Rebuild() { - ctx := context.TODO() +func (b *bloomcache) Rebuild(ctx context.Context) { evt := log.EventBegin(ctx, "bloomcache.Rebuild") defer evt.Done() @@ -62,8 +61,19 @@ func (b *bloomcache) Rebuild() { log.Errorf("AllKeysChan failed in bloomcache rebuild with: %v", err) return } - for key := range ch { - b.bloom.AddTS([]byte(key)) // Use binary key, the more compact the better + finish := false + for !finish { + select { + case key, ok := <-ch: + if ok { + b.bloom.AddTS([]byte(key)) // Use binary key, the more compact the better + } else { + finish = true + } + case <-ctx.Done(): + log.Warning("Cache rebuild closed by context finishing.") + return + } } close(b.rebuildChan) atomic.StoreInt32(&b.active, 1) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 3b8bb8b911..768bca750f 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -8,18 +8,29 @@ import ( "github.com/ipfs/go-ipfs/blocks" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" syncds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) +func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) { + opts := DefaultCacheOpts() + bbs, err := CachedBlockstore(bs, ctx, opts) + if err == nil { + return bbs.(*bloomcache), nil + } else { + return nil, err + } +} + func TestReturnsErrorWhenSizeNegative(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) - _, err := BloomCached(bs, 100, -1) + _, err := bloomCached(bs, nil, 100, 1, -1) if err == nil { t.Fail() } - _, err = BloomCached(bs, -1, 100) + _, err = bloomCached(bs, nil, -1, 1, 100) if err == nil { t.Fail() } @@ -29,7 +40,7 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { b := blocks.NewBlock([]byte("foo")) cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := BloomCached(bs, 1, 1) + cachedbs, err := testBloomCached(bs, nil) if err != nil { t.Fatal(err) } @@ -53,7 +64,7 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { func TestElideDuplicateWrite(t *testing.T) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := BloomCached(bs, 1, 1) + cachedbs, err := testBloomCached(bs, nil) if err != nil { t.Fatal(err) } @@ -73,14 +84,15 @@ func TestHasIsBloomCached(t *testing.T) { for i := 0; i < 1000; i++ { bs.Put(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i)))) } - cachedbs, err := BloomCached(bs, 256*1024, 128) + ctx, _ := context.WithTimeout(context.Background(), 1*time.Second) + cachedbs, err := testBloomCached(bs, ctx) if err != nil { t.Fatal(err) } select { case <-cachedbs.rebuildChan: - case <-time.After(1 * time.Second): + case <-ctx.Done(): t.Fatalf("Timeout wating for rebuild: %d", cachedbs.bloom.ElementsAdded()) } diff --git a/blockstore/caching.go b/blockstore/caching.go index 5657059d89..b1121f6b17 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -1,5 +1,11 @@ package blockstore +import ( + "errors" + + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + // Next to each option is it aproximate memory usage per unit type CacheOpts struct { HasBloomFilterSize int // 1 bit @@ -14,3 +20,23 @@ func DefaultCacheOpts() CacheOpts { HasARCCacheSize: 64 * 1024, } } + +func CachedBlockstore(bs GCBlockstore, + ctx context.Context, opts CacheOpts) (cbs GCBlockstore, err error) { + if ctx == nil { + ctx = context.TODO() // For tests + } + + if opts.HasBloomFilterSize < 0 || opts.HasBloomFilterHashes < 0 || + opts.HasARCCacheSize < 0 { + return nil, errors.New("all options for cache need to be greater than zero") + } + + if opts.HasBloomFilterSize != 0 && opts.HasBloomFilterHashes == 0 { + return nil, errors.New("bloom filter hash count can't be 0 when there is size set") + } + cbs, err = bloomCached(bs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes, + opts.HasARCCacheSize) + + return cbs, err +} From a1e04e869984f2bbccaff62effaf63d0a22ffe5f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 5 Jul 2016 15:17:52 +0200 Subject: [PATCH 1214/3147] blocks/blockstore: improve logic a bit License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@6bd011468acdbb87b8c02323c6a9c5e9223b9d86 --- blockstore/caching.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/blockstore/caching.go b/blockstore/caching.go index b1121f6b17..3decc9e8d3 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -26,6 +26,7 @@ func CachedBlockstore(bs GCBlockstore, if ctx == nil { ctx = context.TODO() // For tests } + cbs = bs if opts.HasBloomFilterSize < 0 || opts.HasBloomFilterHashes < 0 || opts.HasARCCacheSize < 0 { @@ -35,8 +36,10 @@ func CachedBlockstore(bs GCBlockstore, if opts.HasBloomFilterSize != 0 && opts.HasBloomFilterHashes == 0 { return nil, errors.New("bloom filter hash count can't be 0 when there is size set") } - cbs, err = bloomCached(bs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes, - opts.HasARCCacheSize) + if opts.HasBloomFilterSize != 0 { + cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes, + opts.HasARCCacheSize) + } return cbs, err } From f1cc4274af50c824e823273d8c15aa1f974319a9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 5 Jul 2016 16:59:23 +0200 Subject: [PATCH 1215/3147] block/blockstore: bloomcache PutMany logic was not adding to ARC License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@b5293178fe6b0a116bd37cef541ddc466743e821 --- blockstore/bloom_cache.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index d9f93b3e85..1a4c57ac47 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -169,6 +169,7 @@ func (b *bloomcache) PutMany(bs []blocks.Block) error { if err == nil { for _, block := range bs { b.bloom.AddTS([]byte(block.Key())) + b.arc.Add(block.Key(), true) } } return err From 7eaee7743acd7b9849cc7b65914f5e93e7580a90 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 10 Jul 2016 15:16:42 +0200 Subject: [PATCH 1216/3147] blocks/blockstore: shift insertion of TODO context to tests License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@e34e230d0e474f469bdcbda605b020dbd0046006 --- blockstore/bloom_cache_test.go | 7 +++++-- blockstore/caching.go | 3 --- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 768bca750f..bddcee56c6 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -15,6 +15,9 @@ import ( ) func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) { + if ctx == nil { + ctx = context.TODO() + } opts := DefaultCacheOpts() bbs, err := CachedBlockstore(bs, ctx, opts) if err == nil { @@ -26,11 +29,11 @@ func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) func TestReturnsErrorWhenSizeNegative(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) - _, err := bloomCached(bs, nil, 100, 1, -1) + _, err := bloomCached(bs, context.TODO(), 100, 1, -1) if err == nil { t.Fail() } - _, err = bloomCached(bs, nil, -1, 1, 100) + _, err = bloomCached(bs, context.TODO(), -1, 1, 100) if err == nil { t.Fail() } diff --git a/blockstore/caching.go b/blockstore/caching.go index 3decc9e8d3..689a9b5fc1 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -23,9 +23,6 @@ func DefaultCacheOpts() CacheOpts { func CachedBlockstore(bs GCBlockstore, ctx context.Context, opts CacheOpts) (cbs GCBlockstore, err error) { - if ctx == nil { - ctx = context.TODO() // For tests - } cbs = bs if opts.HasBloomFilterSize < 0 || opts.HasBloomFilterHashes < 0 || From ae9de138661036c59a7667d2794494c9e93a2a0a Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 10 Jul 2016 15:35:27 -0400 Subject: [PATCH 1217/3147] Increase channel buffer size in blockstore.AllKeysChan(). License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@c12d54cbf219c979937c09b8dbaa64307df95e69 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 477141cd62..605be2bd86 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -196,7 +196,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { } } - output := make(chan key.Key) + output := make(chan key.Key, dsq.KeysOnlyBufSize) go func() { defer func() { res.Process().Close() // ensure exit (signals early exit, too) From 6f8ddb716fbe474a8c9795967948ded19066abaf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Jul 2016 00:40:23 -0700 Subject: [PATCH 1218/3147] cache encoded data when reading dag nodes from disk License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@12d9e261df3646007065b56f0fd07d254fcdfac8 --- mfs/dir.go | 5 +++-- mfs/file.go | 4 ++-- mfs/mfs_test.go | 36 +++++++++++++++++++----------------- mfs/system.go | 2 +- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index fba61ea4c4..cf178e4527 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -121,7 +121,7 @@ func (d *Directory) childNode(name string) (FSNode, error) { // cacheNode caches a node into d.childDirs or d.files and returns the FSNode. func (d *Directory) cacheNode(name string, nd *dag.Node) (FSNode, error) { - i, err := ft.FromBytes(nd.Data) + i, err := ft.FromBytes(nd.Data()) if err != nil { return nil, err } @@ -268,7 +268,8 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { } } - ndir := &dag.Node{Data: ft.FolderPBData()} + ndir := new(dag.Node) + ndir.SetData(ft.FolderPBData()) _, err = d.dserv.Add(ndir) if err != nil { diff --git a/mfs/file.go b/mfs/file.go index 216bdfa751..46ca7314b0 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -45,7 +45,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { node := fi.node fi.nodelk.Unlock() - fsn, err := ft.FSNodeFromBytes(node.Data) + fsn, err := ft.FSNodeFromBytes(node.Data()) if err != nil { return nil, err } @@ -86,7 +86,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { func (fi *File) Size() (int64, error) { fi.nodelk.Lock() defer fi.nodelk.Unlock() - pbd, err := ft.FromBytes(fi.node.Data) + pbd, err := ft.FromBytes(fi.node.Data()) if err != nil { return 0, err } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 84ce226684..3069fb13c3 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -31,6 +31,10 @@ import ( u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) +func emptyDirNode() *dag.Node { + return dag.NodeWithData(ft.FolderPBData()) +} + func getDagserv(t *testing.T) dag.DAGService { db := dssync.MutexWrap(ds.NewMapDatastore()) bs := bstore.NewBlockstore(db) @@ -183,7 +187,7 @@ func catNode(ds dag.DAGService, nd *dag.Node) ([]byte, error) { func setupRoot(ctx context.Context, t *testing.T) (dag.DAGService, *Root) { ds := getDagserv(t) - root := &dag.Node{Data: ft.FolderPBData()} + root := emptyDirNode() rt, err := NewRoot(ctx, ds, root, func(ctx context.Context, k key.Key) error { fmt.Println("PUBLISHED: ", k) return nil @@ -282,7 +286,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { t.Fatal(err) } - dir := &dag.Node{Data: ft.FolderPBData()} + dir := emptyDirNode() _, err = ds.Add(dir) if err != nil { t.Fatal(err) @@ -293,17 +297,15 @@ func TestDirectoryLoadFromDag(t *testing.T) { t.Fatal(err) } - top := &dag.Node{ - Data: ft.FolderPBData(), - Links: []*dag.Link{ - &dag.Link{ - Name: "a", - Hash: fihash, - }, - &dag.Link{ - Name: "b", - Hash: dirhash, - }, + top := emptyDirNode() + top.Links = []*dag.Link{ + &dag.Link{ + Name: "a", + Hash: fihash, + }, + &dag.Link{ + Name: "b", + Hash: dirhash, }, } @@ -540,7 +542,7 @@ func actorMakeFile(d *Directory) error { } name := randomName() - f, err := NewFile(name, &dag.Node{Data: ft.FilePBData(nil, 0)}, d, d.dserv) + f, err := NewFile(name, dag.NodeWithData(ft.FilePBData(nil, 0)), d, d.dserv) if err != nil { return err } @@ -756,7 +758,7 @@ func TestFlushing(t *testing.T) { e := mkdirP(t, dir, "a/b/e") data := []byte("this is a test\n") - nd1 := &dag.Node{Data: ft.FilePBData(data, uint64(len(data)))} + nd1 := dag.NodeWithData(ft.FilePBData(data, uint64(len(data)))) if err := c.AddChild("TEST", nd1); err != nil { t.Fatal(err) @@ -792,7 +794,7 @@ func TestFlushing(t *testing.T) { t.Fatal(err) } - fsnode, err := ft.FSNodeFromBytes(rnd.Data) + fsnode, err := ft.FSNodeFromBytes(rnd.Data()) if err != nil { t.Fatal(err) } @@ -897,7 +899,7 @@ func TestFileDescriptors(t *testing.T) { ds, rt := setupRoot(ctx, t) dir := rt.GetValue().(*Directory) - nd := &dag.Node{Data: ft.FilePBData(nil, 0)} + nd := dag.NodeWithData(ft.FilePBData(nil, 0)) fi, err := NewFile("test", nd, dir, ds) if err != nil { t.Fatal(err) diff --git a/mfs/system.go b/mfs/system.go index 15e7c76849..40d9d29cdb 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -83,7 +83,7 @@ func NewRoot(parent context.Context, ds dag.DAGService, node *dag.Node, pf PubFu dserv: ds, } - pbn, err := ft.FromBytes(node.Data) + pbn, err := ft.FromBytes(node.Data()) if err != nil { log.Error("IPNS pointer was not unixfs node") return nil, err From 0f8cbb60eae7abadbb6111410105315ba6060b93 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Jul 2016 00:40:23 -0700 Subject: [PATCH 1219/3147] cache encoded data when reading dag nodes from disk License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@defd7d6aa1da4acd3b7eb260eb590c728adecfd2 --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 65c4826557..eebb3153ed 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -330,7 +330,7 @@ func ValidateIpnsRecord(k key.Key, val []byte) error { // point to an empty directory. // TODO: this doesnt feel like it belongs here func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, pins pin.Pinner, key ci.PrivKey) error { - emptyDir := &dag.Node{Data: ft.FolderPBData()} + emptyDir := ft.EmptyDirNode() nodek, err := ds.Add(emptyDir) if err != nil { return err From 427900ef5db455fec92a498ab10afc3b233e0832 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Jul 2016 00:40:23 -0700 Subject: [PATCH 1220/3147] cache encoded data when reading dag nodes from disk License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@0cabbe550feeb1d7da538107e161ad0d14d2cddc --- unixfs/archive/tar/writer.go | 2 +- unixfs/format.go | 5 +++++ unixfs/io/dagreader.go | 4 ++-- unixfs/io/dirbuilder.go | 4 +++- unixfs/mod/dagmodifier.go | 15 ++++++++------- unixfs/mod/dagmodifier_test.go | 4 ++-- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index ad151016ad..3d1f47eea1 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -69,7 +69,7 @@ func (w *Writer) writeFile(nd *mdag.Node, pb *upb.Data, fpath string) error { func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error { pb := new(upb.Data) - if err := proto.Unmarshal(nd.Data, pb); err != nil { + if err := proto.Unmarshal(nd.Data(), pb); err != nil { return err } diff --git a/unixfs/format.go b/unixfs/format.go index f279a8843b..0235f0c7c7 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -6,6 +6,7 @@ package unixfs import ( "errors" + dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/unixfs/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) @@ -222,3 +223,7 @@ func BytesForMetadata(m *Metadata) ([]byte, error) { pbd.Data = mdd return proto.Marshal(pbd) } + +func EmptyDirNode() *dag.Node { + return dag.NodeWithData(FolderPBData()) +} diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index b78b46269f..cbbe028585 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -60,7 +60,7 @@ type ReadSeekCloser interface { // the given node, using the passed in DAGService for data retreival func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*DagReader, error) { pb := new(ftpb.Data) - if err := proto.Unmarshal(n.Data, pb); err != nil { + if err := proto.Unmarshal(n.Data(), pb); err != nil { return nil, err } @@ -117,7 +117,7 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { dr.linkPosition++ pb := new(ftpb.Data) - err = proto.Unmarshal(nxt.Data, pb) + err = proto.Unmarshal(nxt.Data(), pb) if err != nil { return fmt.Errorf("incorrectly formatted protobuf: %s", err) } diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 8dad9a16dd..3db0b9ef96 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -15,7 +15,9 @@ type directoryBuilder struct { // NewEmptyDirectory returns an empty merkledag Node with a folder Data chunk func NewEmptyDirectory() *mdag.Node { - return &mdag.Node{Data: format.FolderPBData()} + nd := new(mdag.Node) + nd.SetData(format.FolderPBData()) + return nd } // NewDirectory returns a directoryBuilder. It needs a DAGService to add the Children diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index cb3cfd5897..66ba5f24bb 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -139,7 +139,7 @@ func (dm *DagModifier) Write(b []byte) (int, error) { } func (dm *DagModifier) Size() (int64, error) { - pbn, err := ft.FromBytes(dm.curNode.Data) + pbn, err := ft.FromBytes(dm.curNode.Data()) if err != nil { return 0, err } @@ -207,7 +207,7 @@ func (dm *DagModifier) Sync() error { // returns the new key of the passed in node and whether or not all the data in the reader // has been consumed. func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (key.Key, bool, error) { - f, err := ft.FromBytes(node.Data) + f, err := ft.FromBytes(node.Data()) if err != nil { return "", false, err } @@ -225,7 +225,8 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) return "", false, err } - nd := &mdag.Node{Data: b} + nd := new(mdag.Node) + nd.SetData(b) k, err := dm.dagserv.Add(nd) if err != nil { return "", false, err @@ -429,12 +430,12 @@ func (dm *DagModifier) Truncate(size int64) error { func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, error) { if len(nd.Links) == 0 { // TODO: this can likely be done without marshaling and remarshaling - pbn, err := ft.FromBytes(nd.Data) + pbn, err := ft.FromBytes(nd.Data()) if err != nil { return nil, err } - nd.Data = ft.WrapData(pbn.Data[:size]) + nd.SetData(ft.WrapData(pbn.Data[:size])) return nd, nil } @@ -448,7 +449,7 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer return nil, err } - childsize, err := ft.DataSize(child.Data) + childsize, err := ft.DataSize(child.Data()) if err != nil { return nil, err } @@ -486,7 +487,7 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer return nil, err } - nd.Data = d + nd.SetData(d) // invalidate cache and recompute serialized data _, err = nd.EncodeProtobuf(true) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index dffd205bf1..7ed30dd266 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -156,7 +156,7 @@ func TestDagModifierBasic(t *testing.T) { t.Fatal(err) } - size, err := ft.DataSize(node.Data) + size, err := ft.DataSize(node.Data()) if err != nil { t.Fatal(err) } @@ -590,7 +590,7 @@ func arrComp(a, b []byte) error { } func printDag(nd *mdag.Node, ds mdag.DAGService, indent int) { - pbd, err := ft.FromBytes(nd.Data) + pbd, err := ft.FromBytes(nd.Data()) if err != nil { panic(err) } From 78e850c120224690775af4f9f57daf4ce26bb3ca Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Jul 2016 00:40:23 -0700 Subject: [PATCH 1221/3147] cache encoded data when reading dag nodes from disk License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@62a1d46c4e91fe06903ee00ed129ed0ac1a5baa5 --- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index a6ec85dac6..1430061c27 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -18,8 +18,8 @@ import ( func randNode() (*mdag.Node, key.Key) { nd := new(mdag.Node) - nd.Data = make([]byte, 32) - util.NewTimeSeededRand().Read(nd.Data) + nd.SetData(make([]byte, 32)) + util.NewTimeSeededRand().Read(nd.Data()) k, _ := nd.Key() return nd, k } diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index fec38e2547..7257ccaecb 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -111,7 +111,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if err := writeHdr(n, hdr); err != nil { return nil, err } - hdrLen := len(n.Data) + hdrLen := len(n.Data()) if estimatedLen < maxItems { // it'll probably fit @@ -122,12 +122,12 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint break } n.Links = append(n.Links, &merkledag.Link{Hash: k.ToMultihash()}) - n.Data = append(n.Data, data...) + n.SetData(append(n.Data(), data...)) } // sort by hash, also swap item Data s := sortByHash{ links: n.Links[defaultFanout:], - data: n.Data[hdrLen:], + data: n.Data()[hdrLen:], } sort.Stable(s) } @@ -179,11 +179,11 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint } func readHdr(n *merkledag.Node) (*pb.Set, []byte, error) { - hdrLenRaw, consumed := binary.Uvarint(n.Data) + hdrLenRaw, consumed := binary.Uvarint(n.Data()) if consumed <= 0 { return nil, nil, errors.New("invalid Set header length") } - buf := n.Data[consumed:] + buf := n.Data()[consumed:] if hdrLenRaw > uint64(len(buf)) { return nil, nil, errors.New("impossibly large Set header length") } @@ -209,10 +209,10 @@ func writeHdr(n *merkledag.Node, hdr *pb.Set) error { if err != nil { return err } - n.Data = make([]byte, binary.MaxVarintLen64, binary.MaxVarintLen64+len(hdrData)) - written := binary.PutUvarint(n.Data, uint64(len(hdrData))) - n.Data = n.Data[:written] - n.Data = append(n.Data, hdrData...) + n.SetData(make([]byte, binary.MaxVarintLen64, binary.MaxVarintLen64+len(hdrData))) + written := binary.PutUvarint(n.Data(), uint64(len(hdrData))) + n.SetData(n.Data()[:written]) + n.SetData(append(n.Data(), hdrData...)) return nil } From 7babb9a48435e9f5cdae0b214901178d0d31adc1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Jul 2016 00:40:23 -0700 Subject: [PATCH 1222/3147] cache encoded data when reading dag nodes from disk License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@8899d71fbefce2e2080fff000a761da7dda1eccf --- path/resolver_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/path/resolver_test.go b/path/resolver_test.go index fe8155a85a..735a79e6d2 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -15,8 +15,8 @@ import ( func randNode() (*merkledag.Node, key.Key) { node := new(merkledag.Node) - node.Data = make([]byte, 32) - util.NewTimeSeededRand().Read(node.Data) + node.SetData(make([]byte, 32)) + util.NewTimeSeededRand().Read(node.Data()) k, _ := node.Key() return node, k } From 330e3c14d2460ddb3b28208de16aad01aa036319 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 19 Jul 2016 07:41:00 -0700 Subject: [PATCH 1223/3147] mfs: fix copying into directory with no given filename License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@b17fb288234e17df845bd92de4401126951e11e3 --- mfs/ops.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mfs/ops.go b/mfs/ops.go index 7cf9ed9f30..94c6c30df8 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -89,6 +89,9 @@ func lookupDir(r *Root, path string) (*Directory, error) { // PutNode inserts 'nd' at 'path' in the given mfs func PutNode(r *Root, path string, nd *dag.Node) error { dirp, filename := gopath.Split(path) + if filename == "" { + return fmt.Errorf("cannot create file with empty name") + } pdir, err := lookupDir(r, dirp) if err != nil { From f5a5cfe68624360ad98b7f6bfd660dc47ba2e4aa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1224/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@803bc31e2b19dbc068ef9cd0c16368a57e9a0d40 --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 3069fb13c3..383bcfd73a 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,10 +14,10 @@ import ( "time" "github.com/ipfs/go-ipfs/path" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" From aff3ba1392464bdc8bf07a13267a2ff1ec0dd064 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1225/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@456bb4bacc85e4674c74a9dd1b57d571a4819c7b --- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/bloom_cache.go | 2 +- blockstore/bloom_cache_test.go | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 605be2bd86..380e0b640a 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -10,11 +10,11 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dsns "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/namespace" + dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dsns "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/namespace" - dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index f7a5325ab5..2f02691413 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" + ds_sync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" - ds_sync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 1a4c57ac47..35d6ce38f8 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -3,10 +3,10 @@ package blockstore import ( "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" "sync/atomic" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index bddcee56c6..d9cc5c817c 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/blocks" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" + syncds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" - syncds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) { From 3bc3b40b3a6d875cc652f4388b96c6ded1bd45f5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1226/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@12b555448dcdb3fc6f5050bcc33d5a2bad6a2cd6 --- routing/dht/dht.go | 4 +-- routing/dht/dht_test.go | 4 +-- routing/dht/ext_test.go | 4 +-- routing/dht/handlers.go | 2 +- routing/dht/providers/providers.go | 38 +++++++++---------------- routing/dht/providers/providers_test.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 +-- routing/mock/dht.go | 4 +-- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 13 files changed, 31 insertions(+), 41 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4aab2bce75..ba2d197aaf 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -21,12 +21,12 @@ import ( goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" host "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" protocol "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/protocol" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) var log = logging.Logger("dht") @@ -65,7 +65,7 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, h host.Host, dstore ds.Datastore) *IpfsDHT { +func NewDHT(ctx context.Context, h host.Host, dstore ds.Batching) *IpfsDHT { dht := new(IpfsDHT) dht.datastore = dstore dht.self = h.ID() diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index e5ce56fead..0abc27ed76 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,8 +14,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index a675c5d6bf..bcc95aff17 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -10,8 +10,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 0152ff1bd6..feaf9aea2f 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index da3cf76061..286108a15f 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -10,16 +10,26 @@ import ( goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + autobatch "gx/ipfs/QmVvJ27GcLaLSXvcB4auk3Gn3xuWK5ti5ENkZ2pCoJEYW4/autobatch" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dsq "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/query" key "github.com/ipfs/go-ipfs/blocks/key" + flags "github.com/ipfs/go-ipfs/flags" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) +var batchBufferSize = 256 + +func init() { + if flags.LowMemMode { + batchBufferSize = 8 + } +} + var log = logging.Logger("providers") var lruCacheSize = 256 @@ -30,11 +40,9 @@ type ProviderManager struct { // all non channel fields are meant to be accessed only within // the run method providers *lru.Cache - local map[key.Key]struct{} lpeer peer.ID dstore ds.Datastore - getlocal chan chan []key.Key newprovs chan *addProv getprovs chan *getProv period time.Duration @@ -58,19 +66,17 @@ type getProv struct { resp chan []peer.ID } -func NewProviderManager(ctx context.Context, local peer.ID, dstore ds.Datastore) *ProviderManager { +func NewProviderManager(ctx context.Context, local peer.ID, dstore ds.Batching) *ProviderManager { pm := new(ProviderManager) pm.getprovs = make(chan *getProv) pm.newprovs = make(chan *addProv) - pm.dstore = dstore + pm.dstore = autobatch.NewAutoBatching(dstore, batchBufferSize) cache, err := lru.New(lruCacheSize) if err != nil { panic(err) //only happens if negative value is passed to lru constructor } pm.providers = cache - pm.getlocal = make(chan chan []key.Key) - pm.local = make(map[key.Key]struct{}) pm.proc = goprocessctx.WithContext(ctx) pm.cleanupInterval = defaultCleanupInterval pm.proc.Go(func(p goprocess.Process) { pm.run() }) @@ -251,9 +257,6 @@ func (pm *ProviderManager) run() { for { select { case np := <-pm.newprovs: - if np.val == pm.lpeer { - pm.local[np.k] = struct{}{} - } err := pm.addProv(np.k, np.val) if err != nil { log.Error("error adding new providers: ", err) @@ -265,13 +268,6 @@ func (pm *ProviderManager) run() { } gp.resp <- provs - case lc := <-pm.getlocal: - var keys []key.Key - for k := range pm.local { - keys = append(keys, k) - } - lc <- keys - case <-tick.C: keys, err := pm.getAllProvKeys() if err != nil { @@ -337,12 +333,6 @@ func (pm *ProviderManager) GetProviders(ctx context.Context, k key.Key) []peer.I } } -func (pm *ProviderManager) GetLocal() []key.Key { - resp := make(chan []key.Key) - pm.getlocal <- resp - return <-resp -} - func newProviderSet() *providerSet { return &providerSet{ set: make(map[peer.ID]time.Time), diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go index 11e1506a81..287dff6c0b 100644 --- a/routing/dht/providers/providers_test.go +++ b/routing/dht/providers/providers_test.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index e3e036bdf9..6847bd2782 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,7 +8,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index ed4973e7a6..c13c3a70ca 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 5a017d55bc..044905eb27 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + sync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" mocknet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - sync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index ea092f13e0..e4e0289772 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) // Server provides mockrouting Clients diff --git a/routing/offline/offline.go b/routing/offline/offline.go index a207836664..1d85f3ac0f 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -8,7 +8,7 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 0a105256ce..42f5720f50 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,7 +8,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - datastore "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + datastore "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index bde8ca2b66..025dd1dc20 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -5,7 +5,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - datastore "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" + datastore "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 5f2d1cb47db9a9140a5fc1debc8d1abc8c0a92b3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1227/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@1777498c479848d176d5a5efb2ce987f165eb890 --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index bf058e5ffa..0830fb2696 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,9 +6,9 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index eebb3153ed..6c4b7e790e 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,9 +6,9 @@ import ( "fmt" "time" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index fc6c41bc72..5de248c125 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -17,9 +17,9 @@ import ( goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 03f64abaca..2adbe63496 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,10 +10,10 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { From 4d768b4da52d1cedf132e85ec45424b347c9cdf3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1228/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@41db935bb0bd289cf8e7ff3f2ee9fb37fee87157 --- unixfs/mod/dagmodifier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 7ed30dd266..7767f99d3f 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -17,11 +17,11 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) func getMockDagServ(t testing.TB) mdag.DAGService { From 2d3d2a51780617dd2a704dcdeb5a1933e6fc156e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1229/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@63cbf6e4af611b288ee8e92f3dd7d3e7988273a2 --- blockservice/test/blocks_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 943bf09443..b7df8721cf 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -11,10 +11,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func TestBlocks(t *testing.T) { From f58bc2cb5bb0bbebd21b2af57cd7ab662482df3b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1230/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@c30d68d59a8417713acc61d1dbf4e31d93ba49ef --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 56066a552c..b7962e2d7c 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds_sync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - ds_sync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func TestBlockReturnsErr(t *testing.T) { From ebd8c5211cfc4f64f74b0e901f986374e90eb1b3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Jul 2016 10:48:25 -0700 Subject: [PATCH 1231/3147] use batching datastore for providers storage License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@a519e711d4c2449a9057f6850de8afa1848fd8a9 --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 83a6f5b88c..fa2af39dbb 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 1430061c27..8e4cfd8a8b 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -11,9 +11,9 @@ import ( bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - ds "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func randNode() (*mdag.Node, key.Key) { diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index da5f0702db..e4c8bd4de7 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -9,11 +9,11 @@ import ( "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" "github.com/ipfs/go-ipfs/merkledag" + "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore" - dssync "gx/ipfs/QmfQzVugPq1w5shWRcLWSeiHF4a2meBX7yVD8Vw7GWJM9o/go-datastore/sync" ) func ignoreKeys(key.Key) {} From 319cd12b3bf255b98370ddeb08eb7a4b28120ea0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Aug 2016 16:53:45 -0700 Subject: [PATCH 1232/3147] don't cache entire mfs tree on add finalize License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@45d1eadf2f0961bf2bafbd2d7fb5491fe83c3e98 --- mfs/dir.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mfs/dir.go b/mfs/dir.go index cf178e4527..9009d2431b 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -152,6 +152,13 @@ func (d *Directory) Child(name string) (FSNode, error) { return d.childUnsync(name) } +func (d *Directory) Uncache(name string) { + d.lock.Lock() + defer d.lock.Unlock() + delete(d.files, name) + delete(d.childDirs, name) +} + // childFromDag searches through this directories dag node for a child link // with the given name func (d *Directory) childFromDag(name string) (*dag.Node, error) { From d91d433c87c298960d5f81a8b1e390a13254d8df Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 2 Aug 2016 01:10:48 +0100 Subject: [PATCH 1233/3147] blockstore: extract ARC cache from Bloom cache it removes race condition that would happen during various calls License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@249be194a84991cdd91b4462dd47c009aed9ad04 --- blockstore/arc_cache.go | 127 +++++++++++++++++++++++++++++++++ blockstore/arc_cache_test.go | 67 +++++++++++++++++ blockstore/bloom_cache.go | 46 ++---------- blockstore/bloom_cache_test.go | 49 +------------ blockstore/caching.go | 6 +- 5 files changed, 206 insertions(+), 89 deletions(-) create mode 100644 blockstore/arc_cache.go create mode 100644 blockstore/arc_cache_test.go diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go new file mode 100644 index 0000000000..37a8f0d027 --- /dev/null +++ b/blockstore/arc_cache.go @@ -0,0 +1,127 @@ +package blockstore + +import ( + "github.com/ipfs/go-ipfs/blocks" + key "github.com/ipfs/go-ipfs/blocks/key" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + +type arccache struct { + arc *lru.ARCCache + blockstore Blockstore +} + +func arcCached(bs Blockstore, lruSize int) (*arccache, error) { + arc, err := lru.NewARC(lruSize) + if err != nil { + return nil, err + } + + return &arccache{arc: arc, blockstore: bs}, nil +} + +func (b *arccache) DeleteBlock(k key.Key) error { + if has, ok := b.hasCached(k); ok && !has { + return ErrNotFound + } + + b.arc.Remove(k) // Invalidate cache before deleting. + err := b.blockstore.DeleteBlock(k) + switch err { + case nil: + b.arc.Add(k, false) + case ds.ErrNotFound, ErrNotFound: + b.arc.Add(k, false) + default: + return err + } + return nil +} + +// if ok == false has is inconclusive +// if ok == true then has respons to question: is it contained +func (b *arccache) hasCached(k key.Key) (has bool, ok bool) { + if k == "" { + // Return cache invalid so call to blockstore + // in case of invalid key is forwarded deeper + return false, false + } + h, ok := b.arc.Get(k) + if ok { + return h.(bool), ok + } else { + return false, false + } +} + +func (b *arccache) Has(k key.Key) (bool, error) { + if has, ok := b.hasCached(k); ok { + return has, nil + } + + res, err := b.blockstore.Has(k) + if err == nil { + b.arc.Add(k, res) + } + return res, err +} + +func (b *arccache) Get(k key.Key) (blocks.Block, error) { + if has, ok := b.hasCached(k); ok && !has { + return nil, ErrNotFound + } + + bl, err := b.blockstore.Get(k) + if bl == nil && err == ErrNotFound { + b.arc.Add(k, false) + } else if bl != nil { + b.arc.Add(k, true) + } + return bl, err +} + +func (b *arccache) Put(bl blocks.Block) error { + if has, ok := b.hasCached(bl.Key()); ok && has { + return nil + } + + err := b.blockstore.Put(bl) + if err == nil { + b.arc.Add(bl.Key(), true) + } + return err +} + +func (b *arccache) PutMany(bs []blocks.Block) error { + var good []blocks.Block + for _, block := range bs { + if has, ok := b.hasCached(block.Key()); !ok || (ok && !has) { + good = append(good, block) + } + } + err := b.blockstore.PutMany(bs) + if err == nil { + for _, block := range bs { + b.arc.Add(block.Key(), true) + } + } + return err +} + +func (b *arccache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { + return b.blockstore.AllKeysChan(ctx) +} + +func (b *arccache) GCLock() Unlocker { + return b.blockstore.(GCBlockstore).GCLock() +} + +func (b *arccache) PinLock() Unlocker { + return b.blockstore.(GCBlockstore).PinLock() +} + +func (b *arccache) GCRequested() bool { + return b.blockstore.(GCBlockstore).GCRequested() +} diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go new file mode 100644 index 0000000000..505f7e1ea1 --- /dev/null +++ b/blockstore/arc_cache_test.go @@ -0,0 +1,67 @@ +package blockstore + +import ( + "github.com/ipfs/go-ipfs/blocks" + "testing" + + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + syncds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + +func testArcCached(bs GCBlockstore, ctx context.Context) (*arccache, error) { + if ctx == nil { + ctx = context.TODO() + } + opts := DefaultCacheOpts() + opts.HasBloomFilterSize = 0 + opts.HasBloomFilterHashes = 0 + bbs, err := CachedBlockstore(bs, ctx, opts) + if err == nil { + return bbs.(*arccache), nil + } else { + return nil, err + } +} + +func TestRemoveCacheEntryOnDelete(t *testing.T) { + b := blocks.NewBlock([]byte("foo")) + cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} + bs := NewBlockstore(syncds.MutexWrap(cd)) + cachedbs, err := testArcCached(bs, nil) + if err != nil { + t.Fatal(err) + } + cachedbs.Put(b) + + cd.Lock() + writeHitTheDatastore := false + cd.Unlock() + + cd.SetFunc(func() { + writeHitTheDatastore = true + }) + + cachedbs.DeleteBlock(b.Key()) + cachedbs.Put(b) + if !writeHitTheDatastore { + t.Fail() + } +} + +func TestElideDuplicateWrite(t *testing.T) { + cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} + bs := NewBlockstore(syncds.MutexWrap(cd)) + cachedbs, err := testArcCached(bs, nil) + if err != nil { + t.Fatal(err) + } + + b1 := blocks.NewBlock([]byte("foo")) + + cachedbs.Put(b1) + cd.SetFunc(func() { + t.Fatal("write hit the datastore") + }) + cachedbs.Put(b1) +} diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 35d6ce38f8..e10dacfaf1 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -3,8 +3,6 @@ package blockstore import ( "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" @@ -13,16 +11,12 @@ import ( // bloomCached returns Blockstore that caches Has requests using Bloom filter // Size is size of bloom filter in bytes -func bloomCached(bs Blockstore, ctx context.Context, bloomSize, hashCount, lruSize int) (*bloomcache, error) { +func bloomCached(bs Blockstore, ctx context.Context, bloomSize, hashCount int) (*bloomcache, error) { bl, err := bloom.New(float64(bloomSize), float64(hashCount)) if err != nil { return nil, err } - arc, err := lru.NewARC(lruSize) - if err != nil { - return nil, err - } - bc := &bloomcache{blockstore: bs, bloom: bl, arc: arc} + bc := &bloomcache{blockstore: bs, bloom: bl} bc.Invalidate() go bc.Rebuild(ctx) @@ -33,7 +27,6 @@ type bloomcache struct { bloom *bloom.Bloom active int32 - arc *lru.ARCCache // This chan is only used for testing to wait for bloom to enable rebuildChan chan struct{} blockstore Blockstore @@ -84,17 +77,7 @@ func (b *bloomcache) DeleteBlock(k key.Key) error { return ErrNotFound } - b.arc.Remove(k) // Invalidate cache before deleting. - err := b.blockstore.DeleteBlock(k) - switch err { - case nil: - b.arc.Add(k, false) - case ds.ErrNotFound, ErrNotFound: - b.arc.Add(k, false) - default: - return err - } - return nil + return b.blockstore.DeleteBlock(k) } // if ok == false has is inconclusive @@ -111,12 +94,7 @@ func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { return false, true } } - h, ok := b.arc.Get(k) - if ok { - return h.(bool), ok - } else { - return false, false - } + return false, false } func (b *bloomcache) Has(k key.Key) (bool, error) { @@ -124,11 +102,7 @@ func (b *bloomcache) Has(k key.Key) (bool, error) { return has, nil } - res, err := b.blockstore.Has(k) - if err == nil { - b.arc.Add(k, res) - } - return res, err + return b.blockstore.Has(k) } func (b *bloomcache) Get(k key.Key) (blocks.Block, error) { @@ -136,13 +110,7 @@ func (b *bloomcache) Get(k key.Key) (blocks.Block, error) { return nil, ErrNotFound } - bl, err := b.blockstore.Get(k) - if bl == nil && err == ErrNotFound { - b.arc.Add(k, false) - } else if bl != nil { - b.arc.Add(k, true) - } - return bl, err + return b.blockstore.Get(k) } func (b *bloomcache) Put(bl blocks.Block) error { @@ -153,7 +121,6 @@ func (b *bloomcache) Put(bl blocks.Block) error { err := b.blockstore.Put(bl) if err == nil { b.bloom.AddTS([]byte(bl.Key())) - b.arc.Add(bl.Key(), true) } return err } @@ -169,7 +136,6 @@ func (b *bloomcache) PutMany(bs []blocks.Block) error { if err == nil { for _, block := range bs { b.bloom.AddTS([]byte(block.Key())) - b.arc.Add(block.Key(), true) } } return err diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index d9cc5c817c..fbffd42f53 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -19,6 +19,7 @@ func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) ctx = context.TODO() } opts := DefaultCacheOpts() + opts.HasARCCacheSize = 0 bbs, err := CachedBlockstore(bs, ctx, opts) if err == nil { return bbs.(*bloomcache), nil @@ -29,56 +30,10 @@ func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) func TestReturnsErrorWhenSizeNegative(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) - _, err := bloomCached(bs, context.TODO(), 100, 1, -1) + _, err := bloomCached(bs, context.TODO(), -1, 1) if err == nil { t.Fail() } - _, err = bloomCached(bs, context.TODO(), -1, 1, 100) - if err == nil { - t.Fail() - } -} - -func TestRemoveCacheEntryOnDelete(t *testing.T) { - b := blocks.NewBlock([]byte("foo")) - cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} - bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := testBloomCached(bs, nil) - if err != nil { - t.Fatal(err) - } - cachedbs.Put(b) - - cd.Lock() - writeHitTheDatastore := false - cd.Unlock() - - cd.SetFunc(func() { - writeHitTheDatastore = true - }) - - cachedbs.DeleteBlock(b.Key()) - cachedbs.Put(b) - if !writeHitTheDatastore { - t.Fail() - } -} - -func TestElideDuplicateWrite(t *testing.T) { - cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} - bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := testBloomCached(bs, nil) - if err != nil { - t.Fatal(err) - } - - b1 := blocks.NewBlock([]byte("foo")) - - cachedbs.Put(b1) - cd.SetFunc(func() { - t.Fatal("write hit the datastore") - }) - cachedbs.Put(b1) } func TestHasIsBloomCached(t *testing.T) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} diff --git a/blockstore/caching.go b/blockstore/caching.go index 689a9b5fc1..f691f89f8c 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -34,8 +34,10 @@ func CachedBlockstore(bs GCBlockstore, return nil, errors.New("bloom filter hash count can't be 0 when there is size set") } if opts.HasBloomFilterSize != 0 { - cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes, - opts.HasARCCacheSize) + cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes) + } + if opts.HasARCCacheSize > 0 { + cbs, err = arcCached(cbs, opts.HasARCCacheSize) } return cbs, err From ebf91aecf16929c33af2f0470b26688c19e2e1ba Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 2 Aug 2016 10:59:38 +0100 Subject: [PATCH 1234/3147] blockstore: cleanup style a bit License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@6ebcf7aa68a6213c3f81610a3f500d5ce5775461 --- blockstore/arc_cache.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 37a8f0d027..7ab07e1d51 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -102,12 +102,13 @@ func (b *arccache) PutMany(bs []blocks.Block) error { } } err := b.blockstore.PutMany(bs) - if err == nil { - for _, block := range bs { - b.arc.Add(block.Key(), true) - } + if err != nil { + return err } - return err + for _, block := range bs { + b.arc.Add(block.Key(), true) + } + return nil } func (b *arccache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { From 3e1083bff3b5a327481cc6b21ab7368a4f485737 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 3 Aug 2016 13:54:37 +0200 Subject: [PATCH 1235/3147] blockstore: cleanup the style removing some mess from the refactor License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@680c54e90d0f3ec954570c5c40662e2c50ec1acb --- blockstore/arc_cache.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 7ab07e1d51..63253ef9c0 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -30,30 +30,28 @@ func (b *arccache) DeleteBlock(k key.Key) error { b.arc.Remove(k) // Invalidate cache before deleting. err := b.blockstore.DeleteBlock(k) switch err { - case nil: - b.arc.Add(k, false) - case ds.ErrNotFound, ErrNotFound: + case nil, ds.ErrNotFound, ErrNotFound: b.arc.Add(k, false) + return nil default: return err } - return nil } // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained func (b *arccache) hasCached(k key.Key) (has bool, ok bool) { if k == "" { - // Return cache invalid so call to blockstore - // in case of invalid key is forwarded deeper + // Return cache invalid so the call to blockstore happens + // in case of invalid key and correct error is created. return false, false } + h, ok := b.arc.Get(k) if ok { - return h.(bool), ok - } else { - return false, false + return h.(bool), true } + return false, false } func (b *arccache) Has(k key.Key) (bool, error) { From 5ef40ffea8a2169a1a3154df68c2e13bf0f5ecc4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 3 Aug 2016 18:19:47 -0700 Subject: [PATCH 1236/3147] dht: add in code to detect and diagnose #3032 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@b9835f0363366c4693c9b798c2bf3dda02678d04 --- routing/dht/routing.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 252d51dd3c..b9e547cacb 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -3,6 +3,7 @@ package dht import ( "bytes" "fmt" + "runtime" "sync" "time" @@ -380,6 +381,16 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, _, err := query.Run(ctx, peers) if err != nil { log.Debugf("Query error: %s", err) + // Special handling for issue: https://github.com/ipfs/go-ipfs/issues/3032 + if fmt.Sprint(err) == "" { + log.Error("reproduced bug 3032:") + log.Errorf("Errors type information: %#v", err) + log.Errorf("go version: %s", runtime.Version()) + log.Error("please report this information to: https://github.com/ipfs/go-ipfs/issues/3032") + + // replace problematic error with something that won't crash the daemon + err = fmt.Errorf("") + } notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ Type: notif.QueryError, Extra: err.Error(), From 1f40257f57713c3a235b789ade7e7a46400a113b Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 12 Aug 2016 16:41:18 +0200 Subject: [PATCH 1237/3147] deps: move go-is-domain to gx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@dd6fb69dff84f006ec0d819895af4c64ba97fbe8 --- namesys/dns.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index bb9ebdfb31..d825ea00ed 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -5,8 +5,8 @@ import ( "net" "strings" - isd "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + isd "gx/ipfs/QmaeHSCBd9XjXxmgHEiKkHtLcMCb2eZsPLKT7bHgBfBkqw/go-is-domain" path "github.com/ipfs/go-ipfs/path" ) From 5ad8a237987d90dd9b1235f4213b7f2e1cf859fb Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 11 Aug 2016 22:18:15 +0200 Subject: [PATCH 1238/3147] test: 81% coverage on blockstore Coverage report available at: https://ipfs.io/ipfs/QmTuMtwGCfHrbYyZdQ1RaGNwS2MGsmAkjA8AaB69N7Ya1g/coverage.html#file0 Part of #3053 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@71c187804168f77721f8e2e707edac414ff868e2 --- blockstore/arc_cache_test.go | 140 +++++++++++++++++++++++++++++---- blockstore/blockstore_test.go | 7 +- blockstore/bloom_cache_test.go | 25 ++++++ blockstore/caching_test.go | 35 +++++++++ 4 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 blockstore/caching_test.go diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 505f7e1ea1..b37092602c 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -2,6 +2,7 @@ package blockstore import ( "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-ipfs/blocks/key" "testing" ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" @@ -9,6 +10,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) +var exampleBlock = blocks.NewBlock([]byte("foo")) + func testArcCached(bs GCBlockstore, ctx context.Context) (*arccache, error) { if ctx == nil { ctx = context.TODO() @@ -24,15 +27,29 @@ func testArcCached(bs GCBlockstore, ctx context.Context) (*arccache, error) { } } -func TestRemoveCacheEntryOnDelete(t *testing.T) { - b := blocks.NewBlock([]byte("foo")) +func createStores(t *testing.T) (*arccache, *blockstore, *callbackDatastore) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := testArcCached(bs, nil) + arc, err := testArcCached(bs, nil) if err != nil { t.Fatal(err) } - cachedbs.Put(b) + return arc, bs, cd +} + +func trap(message string, cd *callbackDatastore, t *testing.T) { + cd.SetFunc(func() { + t.Fatal(message) + }) +} +func untrap(cd *callbackDatastore) { + cd.SetFunc(func() {}) +} + +func TestRemoveCacheEntryOnDelete(t *testing.T) { + arc, _, cd := createStores(t) + + arc.Put(exampleBlock) cd.Lock() writeHitTheDatastore := false @@ -42,26 +59,119 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { writeHitTheDatastore = true }) - cachedbs.DeleteBlock(b.Key()) - cachedbs.Put(b) + arc.DeleteBlock(exampleBlock.Key()) + arc.Put(exampleBlock) if !writeHitTheDatastore { t.Fail() } } func TestElideDuplicateWrite(t *testing.T) { - cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} - bs := NewBlockstore(syncds.MutexWrap(cd)) - cachedbs, err := testArcCached(bs, nil) + arc, _, cd := createStores(t) + + arc.Put(exampleBlock) + trap("write hit datastore", cd, t) + arc.Put(exampleBlock) +} + +func TestHasRequestTriggersCache(t *testing.T) { + arc, _, cd := createStores(t) + + arc.Has(exampleBlock.Key()) + trap("has hit datastore", cd, t) + if has, err := arc.Has(exampleBlock.Key()); has || err != nil { + t.Fatal("has was true but there is no such block") + } + + untrap(cd) + err := arc.Put(exampleBlock) if err != nil { t.Fatal(err) } - b1 := blocks.NewBlock([]byte("foo")) + trap("has hit datastore", cd, t) - cachedbs.Put(b1) - cd.SetFunc(func() { - t.Fatal("write hit the datastore") - }) - cachedbs.Put(b1) + if has, err := arc.Has(exampleBlock.Key()); !has || err != nil { + t.Fatal("has returned invalid result") + } +} + +func TestGetFillsCache(t *testing.T) { + arc, _, cd := createStores(t) + + if bl, err := arc.Get(exampleBlock.Key()); bl != nil || err == nil { + t.Fatal("block was found or there was no error") + } + + trap("has hit datastore", cd, t) + + if has, err := arc.Has(exampleBlock.Key()); has || err != nil { + t.Fatal("has was true but there is no such block") + } + + untrap(cd) + + if err := arc.Put(exampleBlock); err != nil { + t.Fatal(err) + } + + trap("has hit datastore", cd, t) + + if has, err := arc.Has(exampleBlock.Key()); !has || err != nil { + t.Fatal("has returned invalid result") + } +} + +func TestGetAndDeleteFalseShortCirciot(t *testing.T) { + arc, _, cd := createStores(t) + + arc.Has(exampleBlock.Key()) + + trap("get hit datastore", cd, t) + + if bl, err := arc.Get(exampleBlock.Key()); bl != nil || err != ErrNotFound { + t.Fatal("get returned invalid result") + } + + if arc.DeleteBlock(exampleBlock.Key()) != ErrNotFound { + t.Fatal("expected ErrNotFound error") + } +} + +func TestArcCreationFailure(t *testing.T) { + if arc, err := arcCached(nil, -1); arc != nil || err == nil { + t.Fatal("expected error and no cache") + } +} + +func TestInvalidKey(t *testing.T) { + arc, _, _ := createStores(t) + + bl, err := arc.Get(key.Key("")) + + if bl != nil { + t.Fatal("blocks should be nil") + } + if err == nil { + t.Fatal("expected error") + } +} + +func TestHasAfterSucessfulGetIsCached(t *testing.T) { + arc, bs, cd := createStores(t) + + bs.Put(exampleBlock) + + arc.Get(exampleBlock.Key()) + + trap("has hit datastore", cd, t) + arc.Has(exampleBlock.Key()) +} + +func TestPutManyCaches(t *testing.T) { + arc, _, cd := createStores(t) + arc.PutMany([]blocks.Block{exampleBlock}) + + trap("has hit datastore", cd, t) + arc.Has(exampleBlock.Key()) } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 2f02691413..2cca07cfbb 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -57,16 +57,21 @@ func TestRuntimeHashing(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) bl := blocks.NewBlock([]byte("some data")) blBad, err := blocks.NewBlockWithHash([]byte("some other data"), bl.Key().ToMultihash()) + bl2 := blocks.NewBlock([]byte("some other data")) if err != nil { t.Fatal("Debug is enabled") } - bs.Put(blBad) + bs.Put(bl2) bs.RuntimeHashing(true) if _, err := bs.Get(bl.Key()); err != ErrHashMismatch { t.Fatalf("Expected '%v' got '%v'\n", ErrHashMismatch, err) } + + if b, err := bs.Get(bl2.Key()); err != nil || b.String() != bl2.String() { + t.Fatal("got wrong blocks") + } } func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []key.Key) { diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index fbffd42f53..2a2638eaf7 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -66,6 +66,31 @@ func TestHasIsBloomCached(t *testing.T) { if float64(cacheFails)/float64(1000) > float64(0.05) { t.Fatal("Bloom filter has cache miss rate of more than 5%") } + + cacheFails = 0 + block := blocks.NewBlock([]byte("newBlock")) + + cachedbs.PutMany([]blocks.Block{block}) + if cacheFails != 2 { + t.Fatalf("expected two datastore hits: %d", cacheFails) + } + cachedbs.Put(block) + if cacheFails != 3 { + t.Fatalf("expected datastore hit: %d", cacheFails) + } + + if has, err := cachedbs.Has(block.Key()); !has || err != nil { + t.Fatal("has gave wrong response") + } + + bl, err := cachedbs.Get(block.Key()) + if bl.String() != block.String() { + t.Fatal("block data doesn't match") + } + + if err != nil { + t.Fatal("there should't be an error") + } } type callbackDatastore struct { diff --git a/blockstore/caching_test.go b/blockstore/caching_test.go new file mode 100644 index 0000000000..473f79a300 --- /dev/null +++ b/blockstore/caching_test.go @@ -0,0 +1,35 @@ +package blockstore + +import "testing" + +func TestCachingOptsLessThanZero(t *testing.T) { + opts := DefaultCacheOpts() + opts.HasARCCacheSize = -1 + + if _, err := CachedBlockstore(nil, nil, opts); err == nil { + t.Fatal() + } + + opts = DefaultCacheOpts() + opts.HasBloomFilterSize = -1 + + if _, err := CachedBlockstore(nil, nil, opts); err == nil { + t.Fatal() + } + + opts = DefaultCacheOpts() + opts.HasBloomFilterHashes = -1 + + if _, err := CachedBlockstore(nil, nil, opts); err == nil { + t.Fatal() + } +} + +func TestBloomHashesAtZero(t *testing.T) { + opts := DefaultCacheOpts() + opts.HasBloomFilterHashes = 0 + + if _, err := CachedBlockstore(nil, nil, opts); err == nil { + t.Fatal() + } +} From 97666a90b21684731be7adde51d2d1d536fc4484 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 11 Aug 2016 17:45:22 -0400 Subject: [PATCH 1239/3147] Check for multiple pinned blocks in a single pass. Provide a new method, Pinner.CheckIfPinned(), which will check if any of the arguments are pinned. Previously IsPinned would need to be called once for each block. The new method will speed up the checking of multiple pinned blocks from O(p*n) to O(p) (where p is the number of pinned blocks and n is the number of blocks to be check) Use the new method in "block rm". License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@eb2035cb98c1fed1c84da35e40fd494ba3a67847 --- pinning/pinner/pin.go | 74 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index fa2af39dbb..49c5a8dd1e 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -75,6 +75,10 @@ type Pinner interface { Pin(context.Context, *mdag.Node, bool) error Unpin(context.Context, key.Key, bool) error + // Check if a set of keys are pinned, more efficient than + // calling IsPinned for each key + CheckIfPinned(keys ...key.Key) ([]Pinned, error) + // PinWithMode is for manually editing the pin structure. Use with // care! If used improperly, garbage collection may not be // successful. @@ -90,6 +94,12 @@ type Pinner interface { InternalPins() []key.Key } +type Pinned struct { + Key key.Key + Mode PinMode + Via key.Key +} + // pinner implements the Pinner interface type pinner struct { lock sync.RWMutex @@ -255,6 +265,70 @@ func (p *pinner) isPinnedWithType(k key.Key, mode PinMode) (string, bool, error) return "", false, nil } +func (p *pinner) CheckIfPinned(keys ...key.Key) ([]Pinned, error) { + p.lock.RLock() + defer p.lock.RUnlock() + pinned := make([]Pinned, 0, len(keys)) + toCheck := make(map[key.Key]struct{}) + + // First check for non-Indirect pins directly + for _, k := range keys { + if p.recursePin.HasKey(k) { + pinned = append(pinned, Pinned{Key: k, Mode: Recursive}) + } else if p.directPin.HasKey(k) { + pinned = append(pinned, Pinned{Key: k, Mode: Direct}) + } else if p.isInternalPin(k) { + pinned = append(pinned, Pinned{Key: k, Mode: Internal}) + } else { + toCheck[k] = struct{}{} + } + } + + // Now walk all recursive pins to check for indirect pins + var checkChildren func(key.Key, key.Key) error + checkChildren = func(rk key.Key, parentKey key.Key) error { + parent, err := p.dserv.Get(context.Background(), parentKey) + if err != nil { + return err + } + for _, lnk := range parent.Links { + k := key.Key(lnk.Hash) + + if _, found := toCheck[k]; found { + pinned = append(pinned, + Pinned{Key: k, Mode: Indirect, Via: rk}) + delete(toCheck, k) + } + + err := checkChildren(rk, k) + if err != nil { + return err + } + + if len(toCheck) == 0 { + return nil + } + } + return nil + } + for _, rk := range p.recursePin.GetKeys() { + err := checkChildren(rk, rk) + if err != nil { + return nil, err + } + if len(toCheck) == 0 { + break + } + } + + // Anything left in toCheck is not pinned + for k, _ := range toCheck { + pinned = append(pinned, Pinned{Key: k, Mode: NotPinned}) + } + + return pinned, nil +} + func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { p.lock.Lock() defer p.lock.Unlock() From 05223c88da24681d729a171fa39cb7ee850edf7a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 16 Aug 2016 18:59:36 +0200 Subject: [PATCH 1240/3147] test: fixup style and add more checks to blockstore tests License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@edf6fdfeb8217b129cbca2b409f4e2ba50cd5d59 --- blockstore/blockstore_test.go | 26 ++++++++++++++++---------- blockstore/caching_test.go | 8 ++++---- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 2cca07cfbb..6653a6259f 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -8,23 +8,23 @@ import ( ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" ds_sync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" ) -// TODO(brian): TestGetReturnsNil - func TestGetWhenKeyNotPresent(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) - _, err := bs.Get(key.Key("not present")) + bl, err := bs.Get(key.Key("not present")) - if err != nil { - t.Log("As expected, block is not present") - return + if bl != nil { + t.Error("nil block expected") + } + if err == nil { + t.Error("error expected, got nil") } - t.Fail() } func TestGetWhenKeyIsEmptyString(t *testing.T) { @@ -54,19 +54,25 @@ func TestPutThenGetBlock(t *testing.T) { } func TestRuntimeHashing(t *testing.T) { + orginalDebug := u.Debug + defer (func() { + u.Debug = orginalDebug + })() + u.Debug = false + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) bl := blocks.NewBlock([]byte("some data")) blBad, err := blocks.NewBlockWithHash([]byte("some other data"), bl.Key().ToMultihash()) - bl2 := blocks.NewBlock([]byte("some other data")) if err != nil { - t.Fatal("Debug is enabled") + t.Fatal("debug is off, still got an error") } + bl2 := blocks.NewBlock([]byte("some other data")) bs.Put(blBad) bs.Put(bl2) bs.RuntimeHashing(true) if _, err := bs.Get(bl.Key()); err != ErrHashMismatch { - t.Fatalf("Expected '%v' got '%v'\n", ErrHashMismatch, err) + t.Fatalf("expected '%v' got '%v'\n", ErrHashMismatch, err) } if b, err := bs.Get(bl2.Key()); err != nil || b.String() != bl2.String() { diff --git a/blockstore/caching_test.go b/blockstore/caching_test.go index 473f79a300..3c3c195467 100644 --- a/blockstore/caching_test.go +++ b/blockstore/caching_test.go @@ -7,21 +7,21 @@ func TestCachingOptsLessThanZero(t *testing.T) { opts.HasARCCacheSize = -1 if _, err := CachedBlockstore(nil, nil, opts); err == nil { - t.Fatal() + t.Error("wrong ARC setting was not detected") } opts = DefaultCacheOpts() opts.HasBloomFilterSize = -1 if _, err := CachedBlockstore(nil, nil, opts); err == nil { - t.Fatal() + t.Error("negative bloom size was not detected") } opts = DefaultCacheOpts() opts.HasBloomFilterHashes = -1 if _, err := CachedBlockstore(nil, nil, opts); err == nil { - t.Fatal() + t.Error("negative hashes setting was not detected") } } @@ -30,6 +30,6 @@ func TestBloomHashesAtZero(t *testing.T) { opts.HasBloomFilterHashes = 0 if _, err := CachedBlockstore(nil, nil, opts); err == nil { - t.Fatal() + t.Error("zero hashes setting with positive size was not detected") } } From 43edaa9a380b67e1917574469e2c9406f915365a Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 16 Aug 2016 19:26:17 -0400 Subject: [PATCH 1241/3147] Fix bug in arccache.DeleteBlock() method. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@885d31cb377f09f695289c0509937a69b2b2e98f --- blockstore/arc_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 63253ef9c0..2b6aa04e29 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -32,7 +32,7 @@ func (b *arccache) DeleteBlock(k key.Key) error { switch err { case nil, ds.ErrNotFound, ErrNotFound: b.arc.Add(k, false) - return nil + return err default: return err } From 92d9feff8fc11a028c61f2087b58f1090e57e6b6 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 17 Aug 2016 19:13:15 +0200 Subject: [PATCH 1242/3147] unixfs: cleanup imports and remove unused error License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@148c16f265fa132e5e4be8b539bb0fb3ba123cb5 --- unixfs/mod/dagmodifier.go | 9 ++++----- unixfs/mod/dagmodifier_test.go | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 66ba5f24bb..dd8cfa70b4 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -6,10 +6,6 @@ import ( "io" "os" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" chunk "github.com/ipfs/go-ipfs/importer/chunk" help "github.com/ipfs/go-ipfs/importer/helpers" @@ -17,11 +13,14 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) var ErrSeekFail = errors.New("failed to seek properly") -var ErrSeekEndNotImpl = errors.New("SEEK_END currently not implemented") var ErrUnrecognizedWhence = errors.New("unrecognized whence") // 2MB diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 7767f99d3f..6ca38f63b0 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -17,10 +17,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 9e42a9090325966c48f6d1d752edbe8cf7190eba Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 17 Aug 2016 19:13:38 +0200 Subject: [PATCH 1243/3147] unixfs: fix relative seek not expanding file properly License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@6ecbaeb8b297999164d395e2cfd5b14c1db6d47a --- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index dd8cfa70b4..54af9997d8 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -377,8 +377,8 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { return 0, ErrUnrecognizedWhence } - if offset > fisize { - if err := dm.expandSparse(offset - fisize); err != nil { + if int64(newoffset) > fisize { + if err := dm.expandSparse(int64(newoffset) - fisize); err != nil { return 0, err } } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 6ca38f63b0..9bfc63f7cb 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -548,6 +548,36 @@ func TestSeekPastEndWrite(t *testing.T) { } } +func TestRelativeSeek(t *testing.T) { + dserv := getMockDagServ(t) + _, n := getNode(t, dserv, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + + for i := 0; i < 64; i++ { + dagmod.Write([]byte{byte(i)}) + if _, err := dagmod.Seek(1, os.SEEK_CUR); err != nil { + t.Fatal(err) + } + } + + out, err := ioutil.ReadAll(dagmod) + if err != nil { + t.Fatal(err) + } + + for i, v := range out { + if v != 0 && i/2 != int(v) { + t.Errorf("expected %d, at index %d, got %d", i/2, i, v) + } + } +} + func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := getMockDagServ(b) From afc83f900e2d8e9b6db2ef84333c785429547546 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 17 Aug 2016 19:39:09 +0200 Subject: [PATCH 1244/3147] unixfs: add more seek test cases License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@c0ee2cab4576ad2e1529e756e743ae02b0312d4f --- unixfs/mod/dagmodifier_test.go | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 9bfc63f7cb..1e6d1968f8 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -578,6 +578,57 @@ func TestRelativeSeek(t *testing.T) { } } +func TestInvalidSeek(t *testing.T) { + dserv := getMockDagServ(t) + + _, n := getNode(t, dserv, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + _, err = dagmod.Seek(10, -10) + + if err != ErrUnrecognizedWhence { + t.Fatal(err) + } +} + +func TestEndSeek(t *testing.T) { + dserv := getMockDagServ(t) + + _, n := getNode(t, dserv, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + + _, err = dagmod.Write(make([]byte, 100)) + if err != nil { + t.Fatal(err) + } + + offset, err := dagmod.Seek(0, os.SEEK_CUR) + if offset != 100 { + t.Fatal("expected the relative seek 0 to return current location") + } + + offset, err = dagmod.Seek(0, os.SEEK_SET) + if offset != 0 { + t.Fatal("expected the absolute seek to set offset at 0") + } + + offset, err = dagmod.Seek(0, os.SEEK_END) + if offset != 100 { + t.Fatal("expected the end seek to set offset at end") + } +} + func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := getMockDagServ(b) From 5056f61eda30525ae3b284c1df0c09a378e8e99c Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 17 Aug 2016 21:51:21 +0200 Subject: [PATCH 1245/3147] unixfs: add ReadAndSeek test License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@d094c87f4a672e96b959fa65a7dae7414497039c --- unixfs/io/dagreader.go | 4 +++ unixfs/mod/dagmodifier_test.go | 64 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index cbbe028585..0648f96001 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -210,6 +210,10 @@ func (dr *DagReader) Close() error { return nil } +func (dr *DagReader) Offset() int64 { + return dr.offset +} + // Seek implements io.Seeker, and will seek to a given offset in the file // interface matches standard unix seek // TODO: check if we can do relative seeks, to reduce the amount of dagreader diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 1e6d1968f8..c92d5e2201 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -629,6 +629,70 @@ func TestEndSeek(t *testing.T) { } } +func TestReadAndSeek(t *testing.T) { + dserv := getMockDagServ(t) + + _, n := getNode(t, dserv, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + + writeBuf := []byte{0, 1, 2, 3, 4, 5, 6, 7} + dagmod.Write(writeBuf) + + readBuf := make([]byte, 4) + offset, err := dagmod.Seek(0, os.SEEK_SET) + if offset != 0 { + t.Fatal("expected offset to be 0") + } + if err != nil { + t.Fatal(err) + } + + // read 0,1,2,3 + c, err := dagmod.Read(readBuf) + if err != nil { + t.Fatal(err) + } + if c != 4 { + t.Fatalf("expected length of 4 got %d", c) + } + + for i := byte(0); i < 4; i++ { + if readBuf[i] != i { + t.Fatalf("wrong value %d [at index %d]", readBuf[i], i) + } + } + + // skip 4 + _, err = dagmod.Seek(1, os.SEEK_CUR) + if err != nil { + t.Fatalf("error: %s, offset %d, reader offset %d", err, dagmod.curWrOff, dagmod.read.Offset()) + } + + //read 5,6,7 + readBuf = make([]byte, 3) + c, err = dagmod.Read(readBuf) + if err != nil { + t.Fatal(err) + } + if c != 3 { + t.Fatalf("expected length of 3 got %d", c) + } + + for i := byte(0); i < 3; i++ { + if readBuf[i] != i+5 { + t.Fatalf("wrong value %d [at index %d]", readBuf[i], i) + } + + } + +} + func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := getMockDagServ(b) From ae39c68b6cff85aa17d300cd84f52e64c04d4d02 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 18 Aug 2016 17:59:47 +0200 Subject: [PATCH 1246/3147] test: reach 80% coverage of unixfs/mod License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@ca57fa6ac4541d4e61f300915ca557bd72cd58f9 --- unixfs/mod/dagmodifier_test.go | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index c92d5e2201..929ede941e 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -644,6 +644,10 @@ func TestReadAndSeek(t *testing.T) { writeBuf := []byte{0, 1, 2, 3, 4, 5, 6, 7} dagmod.Write(writeBuf) + if !dagmod.HasChanges() { + t.Fatal("there are changes, this should be true") + } + readBuf := make([]byte, 4) offset, err := dagmod.Seek(0, os.SEEK_SET) if offset != 0 { @@ -693,6 +697,37 @@ func TestReadAndSeek(t *testing.T) { } +func TestCtxRead(t *testing.T) { + dserv := getMockDagServ(t) + + _, n := getNode(t, dserv, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + + _, err = dagmod.Write([]byte{0, 1, 2, 3, 4, 5, 6, 7}) + if err != nil { + t.Fatal(err) + } + dagmod.Seek(0, os.SEEK_SET) + + readBuf := make([]byte, 4) + _, err = dagmod.CtxReadFull(ctx, readBuf) + if err != nil { + t.Fatal(err) + } + err = arrComp(readBuf, []byte{0, 1, 2, 3}) + if err != nil { + t.Fatal(err) + } + // TODO(Kubuxu): context cancel case, I will do it after I figure out dagreader tests, + // because this is exacelly the same. +} + func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := getMockDagServ(b) From 1b5dd0154db3042de316343f81b754c892483f9f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 18 Aug 2016 18:09:16 +0200 Subject: [PATCH 1247/3147] test: fix typo in blockstore test Also format imports License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@1064d01616ed4714180d0e4be2c529b6c3aa431d --- blockstore/arc_cache_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index b37092602c..1d60416752 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -1,9 +1,10 @@ package blockstore import ( + "testing" + "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/key" - "testing" ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" syncds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" @@ -122,7 +123,7 @@ func TestGetFillsCache(t *testing.T) { } } -func TestGetAndDeleteFalseShortCirciot(t *testing.T) { +func TestGetAndDeleteFalseShortCircuit(t *testing.T) { arc, _, cd := createStores(t) arc.Has(exampleBlock.Key()) From b04b79b78f12bde55c5b2cf3054eb172d2aeeec8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 Aug 2016 17:45:49 -0700 Subject: [PATCH 1248/3147] pin: use separate dagservice for storing pinsets License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@e0bf4c12e0904808b01fca0fa8a268cec26574f1 --- pinning/pinner/pin.go | 23 ++++++++++++----------- pinning/pinner/pin_test.go | 10 +++++----- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 49c5a8dd1e..2628359cbc 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -110,15 +110,14 @@ type pinner struct { // not delete them. internalPin map[key.Key]struct{} dserv mdag.DAGService + internal mdag.DAGService // dagservice used to store internal objects dstore ds.Datastore } // NewPinner creates a new pinner using the given datastore as a backend -func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner { +func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { - // Load set from given datastore... rcset := set.NewSimpleBlockSet() - dirset := set.NewSimpleBlockSet() return &pinner{ @@ -126,6 +125,7 @@ func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner { directPin: dirset, dserv: serv, dstore: dstore, + internal: internal, } } @@ -344,7 +344,7 @@ func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { } // LoadPinner loads a pinner and its keysets from the given datastore -func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { +func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) { p := new(pinner) rootKeyI, err := d.Get(pinDatastoreKey) @@ -361,7 +361,7 @@ func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5) defer cancel() - root, err := dserv.Get(ctx, rootKey) + root, err := internal.Get(ctx, rootKey) if err != nil { return nil, fmt.Errorf("cannot find pinning root object: %v", err) } @@ -374,7 +374,7 @@ func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { } { // load recursive set - recurseKeys, err := loadSet(ctx, dserv, root, linkRecursive, recordInternal) + recurseKeys, err := loadSet(ctx, internal, root, linkRecursive, recordInternal) if err != nil { return nil, fmt.Errorf("cannot load recursive pins: %v", err) } @@ -382,7 +382,7 @@ func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { } { // load direct set - directKeys, err := loadSet(ctx, dserv, root, linkDirect, recordInternal) + directKeys, err := loadSet(ctx, internal, root, linkDirect, recordInternal) if err != nil { return nil, fmt.Errorf("cannot load direct pins: %v", err) } @@ -394,6 +394,7 @@ func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) { // assign services p.dserv = dserv p.dstore = d + p.internal = internal return p, nil } @@ -422,7 +423,7 @@ func (p *pinner) Flush() error { root := &mdag.Node{} { - n, err := storeSet(ctx, p.dserv, p.directPin.GetKeys(), recordInternal) + n, err := storeSet(ctx, p.internal, p.directPin.GetKeys(), recordInternal) if err != nil { return err } @@ -432,7 +433,7 @@ func (p *pinner) Flush() error { } { - n, err := storeSet(ctx, p.dserv, p.recursePin.GetKeys(), recordInternal) + n, err := storeSet(ctx, p.internal, p.recursePin.GetKeys(), recordInternal) if err != nil { return err } @@ -442,12 +443,12 @@ func (p *pinner) Flush() error { } // add the empty node, its referenced by the pin sets but never created - _, err := p.dserv.Add(new(mdag.Node)) + _, err := p.internal.Add(new(mdag.Node)) if err != nil { return err } - k, err := p.dserv.Add(root) + k, err := p.internal.Add(root) if err != nil { return err } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 8e4cfd8a8b..d6496618ee 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -45,7 +45,7 @@ func TestPinnerBasic(t *testing.T) { dserv := mdag.NewDAGService(bserv) // TODO does pinner need to share datastore with blockservice? - p := NewPinner(dstore, dserv) + p := NewPinner(dstore, dserv, dserv) a, ak := randNode() _, err := dserv.Add(a) @@ -133,7 +133,7 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - np, err := LoadPinner(dstore, dserv) + np, err := LoadPinner(dstore, dserv, dserv) if err != nil { t.Fatal(err) } @@ -154,7 +154,7 @@ func TestDuplicateSemantics(t *testing.T) { dserv := mdag.NewDAGService(bserv) // TODO does pinner need to share datastore with blockservice? - p := NewPinner(dstore, dserv) + p := NewPinner(dstore, dserv, dserv) a, _ := randNode() _, err := dserv.Add(a) @@ -187,7 +187,7 @@ func TestFlush(t *testing.T) { bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - p := NewPinner(dstore, dserv) + p := NewPinner(dstore, dserv, dserv) _, k := randNode() p.PinWithMode(k, Recursive) @@ -204,7 +204,7 @@ func TestPinRecursiveFail(t *testing.T) { bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - p := NewPinner(dstore, dserv) + p := NewPinner(dstore, dserv, dserv) a, _ := randNode() b, _ := randNode() From ccbc8933444f1a197406551163bc10bf7e88a243 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 Aug 2016 19:52:49 -0700 Subject: [PATCH 1249/3147] cmds: implement ipfs dht provide command License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d6e466889b00758952a9c67accced988f54c8161 --- routing/dht/routing.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index b9e547cacb..4bdb39a869 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -263,6 +263,10 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key key.Key) error { go func(p peer.ID) { defer wg.Done() log.Debugf("putProvider(%s, %s)", key, p) + notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ + Type: notif.FinalPeer, + ID: p, + }) err := dht.sendMessage(ctx, p, mes) if err != nil { log.Debug(err) @@ -272,6 +276,7 @@ func (dht *IpfsDHT) Provide(ctx context.Context, key key.Key) error { wg.Wait() return nil } + func (dht *IpfsDHT) makeProvRecord(skey key.Key) (*pb.Message, error) { pi := pstore.PeerInfo{ ID: dht.self, From 356accf60e1ed78f779ec521c3801fbd8fdecec4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 20 Aug 2016 11:30:15 -0700 Subject: [PATCH 1250/3147] routing: rework interfaces to make separation easier License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@1ea91178f41963d4c215acd41fa36f01af83d96b --- routing/routing.go | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/routing/routing.go b/routing/routing.go index f58f4a737a..6473ecc930 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -14,11 +14,27 @@ import ( // ErrNotFound is returned when a search fails to find anything var ErrNotFound = errors.New("routing: not found") -// IpfsRouting is the routing module interface -// It is implemented by things like DHTs, etc. -type IpfsRouting interface { +// ContentRouting is a value provider layer of indirection. It is used to find +// information about who has what content. +type ContentRouting interface { + // Announce that this node can provide value for given key + Provide(context.Context, key.Key) error + + // Search for peers who are able to provide a given key FindProvidersAsync(context.Context, key.Key, int) <-chan pstore.PeerInfo +} + +// PeerRouting is a way to find information about certain peers. +// This can be implemented by a simple lookup table, a tracking server, +// or even a DHT. +type PeerRouting interface { + // Find specific Peer + // FindPeer searches for a peer with given ID, returns a pstore.PeerInfo + // with relevant addresses. + FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) +} +type ValueStore interface { // Basic Put/Get // PutValue adds value corresponding to given Key. @@ -38,17 +54,15 @@ type IpfsRouting interface { // As a result, a value of '1' is mostly useful for cases where the record // in question has only one valid value (such as public keys) GetValues(c context.Context, k key.Key, count int) ([]RecvdVal, error) +} - // Value provider layer of indirection. - // This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. - - // Announce that this node can provide value for given key - Provide(context.Context, key.Key) error - - // Find specific Peer - // FindPeer searches for a peer with given ID, returns a pstore.PeerInfo - // with relevant addresses. - FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) +// IpfsRouting is the combination of different routing types that ipfs +// uses. It can be satisfied by a single item (such as a DHT) or multiple +// different pieces that are more optimized to each task. +type IpfsRouting interface { + ContentRouting + PeerRouting + ValueStore // Bootstrap allows callers to hint to the routing system to get into a // Boostrapped state @@ -74,7 +88,7 @@ func KeyForPublicKey(id peer.ID) key.Key { return key.Key("/pk/" + string(id)) } -func GetPublicKey(r IpfsRouting, ctx context.Context, pkhash []byte) (ci.PubKey, error) { +func GetPublicKey(r ValueStore, ctx context.Context, pkhash []byte) (ci.PubKey, error) { if dht, ok := r.(PubKeyFetcher); ok { // If we have a DHT as our routing system, use optimized fetcher return dht.GetPublicKey(ctx, peer.ID(pkhash)) From 97d62a48ade25e12bd6c85fd7f0e48212b6494ef Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 20 Aug 2016 11:30:15 -0700 Subject: [PATCH 1251/3147] routing: rework interfaces to make separation easier License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@2691567ba3c0df4261bfae37263c88aa915eda54 --- namesys/namesys.go | 2 +- namesys/publisher.go | 10 +++++----- namesys/republisher/repub.go | 4 ++-- namesys/routing.go | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 0830fb2696..29a831f452 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -26,7 +26,7 @@ type mpns struct { } // NewNameSystem will construct the IPFS naming system based on Routing -func NewNameSystem(r routing.IpfsRouting, ds ds.Datastore, cachesize int) NameSystem { +func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSystem { return &mpns{ resolvers: map[string]resolver{ "dns": newDNSResolver(), diff --git a/namesys/publisher.go b/namesys/publisher.go index 6c4b7e790e..f182314451 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -37,12 +37,12 @@ var PublishPutValTimeout = time.Minute // ipnsPublisher is capable of publishing and resolving names to the IPFS // routing system. type ipnsPublisher struct { - routing routing.IpfsRouting + routing routing.ValueStore ds ds.Datastore } // NewRoutingPublisher constructs a publisher for the IPFS Routing name system. -func NewRoutingPublisher(route routing.IpfsRouting, ds ds.Datastore) *ipnsPublisher { +func NewRoutingPublisher(route routing.ValueStore, ds ds.Datastore) *ipnsPublisher { if ds == nil { panic("nil datastore") } @@ -134,7 +134,7 @@ func checkCtxTTL(ctx context.Context) (time.Duration, bool) { return d, ok } -func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqnum uint64, eol time.Time, r routing.IpfsRouting, id peer.ID) error { +func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqnum uint64, eol time.Time, r routing.ValueStore, id peer.ID) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -181,7 +181,7 @@ func waitOnErrChan(ctx context.Context, errs chan error) error { } } -func PublishPublicKey(ctx context.Context, r routing.IpfsRouting, k key.Key, pubk ci.PubKey) error { +func PublishPublicKey(ctx context.Context, r routing.ValueStore, k key.Key, pubk ci.PubKey) error { log.Debugf("Storing pubkey at: %s", k) pkbytes, err := pubk.Bytes() if err != nil { @@ -199,7 +199,7 @@ func PublishPublicKey(ctx context.Context, r routing.IpfsRouting, k key.Key, pub return nil } -func PublishEntry(ctx context.Context, r routing.IpfsRouting, ipnskey key.Key, rec *pb.IpnsEntry) error { +func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey key.Key, rec *pb.IpnsEntry) error { timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) defer cancel() diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 5de248c125..633407fd1e 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -31,7 +31,7 @@ var DefaultRebroadcastInterval = time.Hour * 4 const DefaultRecordLifetime = time.Hour * 24 type Republisher struct { - r routing.IpfsRouting + r routing.ValueStore ds ds.Datastore ps pstore.Peerstore @@ -44,7 +44,7 @@ type Republisher struct { entries map[peer.ID]struct{} } -func NewRepublisher(r routing.IpfsRouting, ds ds.Datastore, ps pstore.Peerstore) *Republisher { +func NewRepublisher(r routing.ValueStore, ds ds.Datastore, ps pstore.Peerstore) *Republisher { return &Republisher{ r: r, ps: ps, diff --git a/namesys/routing.go b/namesys/routing.go index 79f38939be..d613044ba0 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -23,7 +23,7 @@ var log = logging.Logger("namesys") // routingResolver implements NSResolver for the main IPFS SFS-like naming type routingResolver struct { - routing routing.IpfsRouting + routing routing.ValueStore cache *lru.Cache } @@ -88,7 +88,7 @@ type cacheEntry struct { // to implement SFS-like naming on top. // cachesize is the limit of the number of entries in the lru cache. Setting it // to '0' will disable caching. -func NewRoutingResolver(route routing.IpfsRouting, cachesize int) *routingResolver { +func NewRoutingResolver(route routing.ValueStore, cachesize int) *routingResolver { if route == nil { panic("attempt to create resolver with nil routing system") } From 2bf079f0680559eaa3cc8899b6d1af37cf2e3694 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 Aug 2016 18:33:44 -0700 Subject: [PATCH 1252/3147] blockservice: don't store blocks we already have License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@be6f25b06132335e5d55bec19e09ef78ffdb5a2e --- blockservice/blockservice.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 7105806144..12aa022c00 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -43,7 +43,15 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) { k := b.Key() - err := s.Blockstore.Put(b) + has, err := s.Blockstore.Has(k) + if err != nil { + return k, err + } + if has { + return k, nil + } + + err = s.Blockstore.Put(b) if err != nil { return k, err } @@ -54,13 +62,27 @@ func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) { } func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) { - err := s.Blockstore.PutMany(bs) + var toput []blocks.Block + for _, b := range bs { + has, err := s.Blockstore.Has(b.Key()) + if err != nil { + return nil, err + } + + if has { + continue + } + + toput = append(toput, b) + } + + err := s.Blockstore.PutMany(toput) if err != nil { return nil, err } var ks []key.Key - for _, b := range bs { + for _, b := range toput { if err := s.Exchange.HasBlock(b); err != nil { return nil, errors.New("blockservice is closed") } From f54512fba1751e671773748148c6269735fda6f4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1253/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@a41d31c6eef9e8996dc2bd61fd47c51da6bb0026 --- mfs/mfs_test.go | 4 ++-- mfs/system.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 383bcfd73a..f7398e83bc 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,8 +14,8 @@ import ( "time" "github.com/ipfs/go-ipfs/path" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/mfs/system.go b/mfs/system.go index 40d9d29cdb..56891cc215 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -18,7 +18,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 7095a19af51369bfdf396f66e50afd10432ef108 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1254/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@6877d2878caba1500f97e08188485995a957d41e --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 8 ++++---- blockstore/blockstore_test.go | 6 +++--- blockstore/bloom_cache_test.go | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 2b6aa04e29..c0ec192312 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,7 +3,7 @@ package blockstore import ( "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 1d60416752..1757012327 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -6,8 +6,8 @@ import ( "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - syncds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + syncds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 380e0b640a..f96178b443 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -9,10 +9,10 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dsns "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/namespace" - dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dsns "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/namespace" + dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 6653a6259f..fc78ca6e9b 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,9 +5,9 @@ import ( "fmt" "testing" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" - ds_sync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" + ds_sync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 2a2638eaf7..607bf8d241 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -8,9 +8,9 @@ import ( "github.com/ipfs/go-ipfs/blocks" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" - syncds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" + syncds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 6c7141a1c5f534d74f5cb56ddedf429a6341e1a4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1255/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@5ff692f28bd6bd132de969a3674424ee64254a85 --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 12aa022c00..25282a4414 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,7 +10,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index b7df8721cf..81d61818b3 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -11,8 +11,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From f3be971804513f1ff35517266006e7bb5a036fc9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1256/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@6152fe93f65a5569ec8c82ef72481c3b00f6df4c --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 4 ++-- namesys/publisher.go | 6 +++--- namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 6 +++--- namesys/routing.go | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index e4a4c35963..ae734af4fd 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,7 +34,7 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 4660948ccd..ca04674c51 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index 29a831f452..699cc5327a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,8 +6,8 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index f182314451..77604ae955 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" @@ -19,8 +19,8 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 633407fd1e..91228ea523 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,12 +12,12 @@ import ( "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 26056ca97e..be54999eb3 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - mocknet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + mocknet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 2adbe63496..57e08ccdbc 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -9,9 +9,9 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/namesys/routing.go b/namesys/routing.go index d613044ba0..d2c4fda110 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,8 +14,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) From b50d5d059307fbe8c0cc2af0ca072a15bafcd221 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1257/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@82557145f4da20d9f1655a04fc059a854cd71795 --- unixfs/mod/dagmodifier.go | 2 +- unixfs/mod/dagmodifier_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 54af9997d8..784cef8a49 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,7 +14,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 929ede941e..815ac5fc0b 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -18,8 +18,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 30f9160e072df59b7ea152d4cdfb4c5215af7814 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1258/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@8593ac21c56c9d0a0ae78682f7f6def21ff47f0d --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 487f7947eb..0eb87f867e 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,7 +8,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 2628359cbc..d034cbc43b 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,8 +10,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index d6496618ee..91c6b8c0e9 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -11,8 +11,8 @@ import ( bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e4c8bd4de7..83d65dd02f 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -9,8 +9,8 @@ import ( "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" "github.com/ipfs/go-ipfs/merkledag" - "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" From 857d21972e926c9f191dbf80c137e1a49c9381ad Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1259/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@29fb6a6dca42648bb7ede9f9a53eb15e8fc03523 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index b7962e2d7c..6f1687586b 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -7,8 +7,8 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - ds_sync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + ds_sync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From d98d19b8182e960e73f99d9baed4034c5cecfc7c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1260/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@5699b0621fd8235dd61a3272d85681213331d874 --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index e5e94f2ff7..a254f456c1 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ) var log = logging.Logger("path") From dcb3e1a4c4019cf25f91ea0aca5371365663962c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1261/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@233550e1075b96054390295687206f335f6306e5 --- routing/dht/dht.go | 14 +++++++------- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 6 +++--- routing/dht/dht_test.go | 10 +++++----- routing/dht/ext_test.go | 12 ++++++------ routing/dht/handlers.go | 6 +++--- routing/dht/lookup.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 8 ++++---- routing/dht/providers/providers.go | 10 +++++----- routing/dht/providers/providers_test.go | 4 ++-- routing/dht/query.go | 8 ++++---- routing/dht/records.go | 4 ++-- routing/dht/routing.go | 6 +++--- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 6 +++--- routing/kbucket/table_test.go | 4 ++-- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 8 ++++---- routing/mock/centralized_server.go | 8 ++++---- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 6 +++--- routing/mock/interface.go | 6 +++--- routing/none/none_client.go | 8 ++++---- routing/offline/offline.go | 10 +++++----- routing/record/record.go | 4 ++-- routing/record/validation.go | 2 +- routing/record/validation_test.go | 2 +- routing/routing.go | 6 +++--- routing/supernode/client.go | 8 ++++---- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 14 +++++++------- routing/supernode/server.go | 6 +++--- routing/supernode/server_test.go | 2 +- 35 files changed, 104 insertions(+), 104 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ba2d197aaf..6de362e13c 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -16,17 +16,17 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" - host "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" - protocol "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/protocol" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + host "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" + protocol "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/protocol" ) var log = logging.Logger("dht") diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 5f14472998..46f549ab9c 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,7 +9,7 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 405ae1572f..92819b4374 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,11 +6,11 @@ import ( "time" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" ) var dhtReadMessageTimeout = time.Minute @@ -141,7 +141,7 @@ func (ms *messageSender) prep() error { return nil } - nstr, err := ms.dht.host.NewStream(ms.dht.ctx, ProtocolDHT, ms.p) + nstr, err := ms.dht.host.NewStream(ms.dht.ctx, ms.p, ProtocolDHT) if err != nil { return err } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 0abc27ed76..8243d2ed97 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,15 +14,15 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - netutil "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/test/util" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + netutil "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/test/util" ) var testCaseValues = map[key.Key][]byte{} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index bcc95aff17..bbfe025384 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -10,15 +10,15 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" + mocknet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net/mock" ) func TestGetFailures(t *testing.T) { @@ -118,7 +118,7 @@ func TestGetFailures(t *testing.T) { Record: rec, } - s, err := hosts[1].NewStream(context.Background(), ProtocolDHT, hosts[0].ID()) + s, err := hosts[1].NewStream(context.Background(), hosts[0].ID(), ProtocolDHT) if err != nil { t.Fatal(err) } diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index feaf9aea2f..b12582a947 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -8,10 +8,10 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index db4d651a21..2a279c89ff 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -6,8 +6,8 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 3fdd435fe4..4a55724bf4 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" + inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 26b2615358..d7c4dd7d2c 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,10 +4,10 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" key "github.com/ipfs/go-ipfs/blocks/key" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index 286108a15f..e48aaccef3 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -6,15 +6,15 @@ import ( "strings" "time" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dsq "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/query" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - autobatch "gx/ipfs/QmVvJ27GcLaLSXvcB4auk3Gn3xuWK5ti5ENkZ2pCoJEYW4/autobatch" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" + autobatch "gx/ipfs/QmcRHLm2aqDabkpcto1NzLad7YQhH99MGDHSWWvwMxKiZw/autobatch" key "github.com/ipfs/go-ipfs/blocks/key" flags "github.com/ipfs/go-ipfs/flags" diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go index 287dff6c0b..32ede44691 100644 --- a/routing/dht/providers/providers_test.go +++ b/routing/dht/providers/providers_test.go @@ -6,8 +6,8 @@ import ( "time" key "github.com/ipfs/go-ipfs/blocks/key" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 3cf1434a4c..2b1efb337e 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -9,12 +9,12 @@ import ( pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - queue "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore/queue" process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + queue "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore/queue" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/records.go b/routing/dht/records.go index d920e9843e..0b461382af 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -7,8 +7,8 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" ctxfrac "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/frac" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4bdb39a869..abd9c42ff4 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -15,10 +15,10 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index d835e24fdf..171436279a 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index ff9dc3d896..19ea84f680 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 3898af4587..47a3228caf 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,9 +7,9 @@ import ( "sync" "time" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 6a0c75e5b1..115fd34ea3 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,8 +7,8 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index f9fbed0600..58cd3c3e3b 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 6847bd2782..26437b310b 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,11 +8,11 @@ import ( routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index c13c3a70ca..b7fe52d9a7 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -7,11 +7,11 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 2b407c5e3b..3cd8e388a0 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,7 +8,7 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 044905eb27..7e09cdf288 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - sync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" - mocknet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net/mock" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + sync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + mocknet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index e4e0289772..b86e25f067 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -9,9 +9,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 140c3f84e3..2ff9fa68e5 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - p2phost "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + p2phost "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 1d85f3ac0f..855f35191d 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -8,12 +8,12 @@ import ( routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" + "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/record/record.go b/routing/record/record.go index 0a8a29a39e..316763f7f7 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" ) var log = logging.Logger("routing/record") diff --git a/routing/record/validation.go b/routing/record/validation.go index 23d8922362..a17e36fad8 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) diff --git a/routing/record/validation_test.go b/routing/record/validation_test.go index ae389244ef..56bf6a8421 100644 --- a/routing/record/validation_test.go +++ b/routing/record/validation_test.go @@ -5,7 +5,7 @@ import ( "testing" key "github.com/ipfs/go-ipfs/blocks/key" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" ) var OffensiveKey = "CAASXjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDjXAQQMal4SB2tSnX6NJIPmC69/BT8A8jc7/gDUZNkEhdhYHvc7k7S4vntV/c92nJGxNdop9fKJyevuNMuXhhHAgMBAAE=" diff --git a/routing/routing.go b/routing/routing.go index 6473ecc930..ad12981f24 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -5,9 +5,9 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - ci "gx/ipfs/QmUWER4r4qMvaCnX5zREcfyiWN7cXN9g3a7fkRqNz8qWPP/go-libp2p-crypto" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index cba449742e..17839f3aa8 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -11,12 +11,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 2dc2e77211..379527f07b 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 438cdd99f1..693fe6bc9b 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,11 +6,11 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - host "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/host" - inet "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/net" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + host "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" + inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" @@ -101,7 +101,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe if err = px.Host.Connect(ctx, pstore.PeerInfo{ID: remote}); err != nil { return err } - s, err := px.Host.NewStream(ctx, ProtocolSNR, remote) + s, err := px.Host.NewStream(ctx, remote, ProtocolSNR) if err != nil { return err } @@ -136,7 +136,7 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe e.SetError(err) return nil, err } - s, err := px.Host.NewStream(ctx, ProtocolSNR, remote) + s, err := px.Host.NewStream(ctx, remote, ProtocolSNR) if err != nil { e.SetError(err) return nil, err diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 42f5720f50..f34c5eb2bf 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,10 +8,10 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - datastore "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + datastore "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 025dd1dc20..25c54ec32a 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -5,7 +5,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - datastore "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + datastore "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 9c3b450ea5657bdd42c1dd2bd9b9a150f0c9eec9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Aug 2016 22:29:25 -0700 Subject: [PATCH 1262/3147] update deps for libp2p 3.4.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@28b8a70b9f54c6f8e38040e886bf03426f5d9f82 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 98cdef7397..f3256c4587 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ) var log = logging.Logger("chunk") From b089a0a7b92c9b6cb07f621d471a065e433abfbd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 23 Aug 2016 22:23:31 -0700 Subject: [PATCH 1263/3147] remove randbo dep, its no longer needed License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@f80f90c315875a00c8a4f5239b449ab793a8e334 --- mfs/mfs_test.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index f7398e83bc..f4aba72cbe 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -13,12 +13,6 @@ import ( "testing" "time" - "github.com/ipfs/go-ipfs/path" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" - randbo "gx/ipfs/QmYvsG72GsfLgUeSojXArjnU6L4Wmwk7wuAxtNLuyXcc1T/randbo" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - bstore "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" bserv "github.com/ipfs/go-ipfs/blockservice" @@ -26,9 +20,14 @@ import ( importer "github.com/ipfs/go-ipfs/importer" chunk "github.com/ipfs/go-ipfs/importer/chunk" dag "github.com/ipfs/go-ipfs/merkledag" + "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) func emptyDirNode() *dag.Node { @@ -552,7 +551,8 @@ func actorMakeFile(d *Directory) error { return err } - r := io.LimitReader(randbo.New(), int64(77*rand.Intn(123))) + rread := rand.New(rand.NewSource(time.Now().UnixNano())) + r := io.LimitReader(rread, int64(77*rand.Intn(123))) _, err = io.Copy(wfd, r) if err != nil { return err @@ -646,7 +646,7 @@ func actorWriteFile(d *Directory) error { size := rand.Intn(1024) + 1 buf := make([]byte, size) - randbo.New().Read(buf) + rand.Read(buf) s, err := fi.Size() if err != nil { @@ -858,7 +858,7 @@ func TestConcurrentReads(t *testing.T) { d := mkdirP(t, rootdir, path) buf := make([]byte, 2048) - randbo.New().Read(buf) + rand.Read(buf) fi := fileNodeFromReader(t, ds, bytes.NewReader(buf)) err := d.AddChild("afile", fi) From 7b2d1ebee67a03ebe3ad213849719891b8c53c7a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 26 Aug 2016 13:56:47 -0700 Subject: [PATCH 1264/3147] use correct protocol names for ipfs services License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@c953271975bc4b658360513a5cd445a66648b451 --- routing/dht/dht.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6de362e13c..29660c6fce 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -31,7 +31,8 @@ import ( var log = logging.Logger("dht") -var ProtocolDHT protocol.ID = "/ipfs/dht" +var ProtocolDHT protocol.ID = "/ipfs/kad/1.0.0" +var ProtocolDHTOld protocol.ID = "/ipfs/dht" // NumBootstrapQueries defines the number of random dht queries to do to // collect members of the routing table. @@ -85,6 +86,7 @@ func NewDHT(ctx context.Context, h host.Host, dstore ds.Batching) *IpfsDHT { dht.ctx = ctx h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) + h.SetStreamHandler(ProtocolDHTOld, dht.handleNewStream) dht.providers = providers.NewProviderManager(dht.ctx, dht.self, dstore) dht.proc.AddChild(dht.providers.Process()) goprocessctx.CloseAfterContext(dht.proc, ctx) From 40921fbe2732dbfac2d7d6ee94bc82bfee4998d7 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 29 Aug 2016 21:53:40 +0200 Subject: [PATCH 1265/3147] blockstore: rename RuntimeHashing to HashOnRead License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@5d79e53dbeef5d7d597d23c8083195df5f2327f3 --- blockstore/blockstore.go | 2 +- blockstore/blockstore_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f96178b443..4200467732 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -76,7 +76,7 @@ type blockstore struct { rehash bool } -func (bs *blockstore) RuntimeHashing(enabled bool) { +func (bs *blockstore) HashOnRead(enabled bool) { bs.rehash = enabled } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index fc78ca6e9b..9d97cb542d 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -53,7 +53,7 @@ func TestPutThenGetBlock(t *testing.T) { } } -func TestRuntimeHashing(t *testing.T) { +func TestHashOnRead(t *testing.T) { orginalDebug := u.Debug defer (func() { u.Debug = orginalDebug @@ -69,7 +69,7 @@ func TestRuntimeHashing(t *testing.T) { bl2 := blocks.NewBlock([]byte("some other data")) bs.Put(blBad) bs.Put(bl2) - bs.RuntimeHashing(true) + bs.HashOnRead(true) if _, err := bs.Get(bl.Key()); err != ErrHashMismatch { t.Fatalf("expected '%v' got '%v'\n", ErrHashMismatch, err) From 6f45593ddc60aeddd12fdbb11b6ddc06ca620804 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 31 Aug 2016 12:56:06 +0200 Subject: [PATCH 1266/3147] blockstore: fix PutMany with cache logic Thanks @whyrusleeping for noticing it. Removed PutMany logic in bloom cache as it can't help with anything. Fixed ARC cache to use filtered results instad of all blocks. License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@892824cfb334756f584a9ddb8bc7043efef0e370 --- blockstore/arc_cache.go | 7 +++++-- blockstore/bloom_cache.go | 26 +++++++++++++------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index c0ec192312..10ef8b01ba 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,6 +3,7 @@ package blockstore import ( "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" @@ -95,15 +96,17 @@ func (b *arccache) Put(bl blocks.Block) error { func (b *arccache) PutMany(bs []blocks.Block) error { var good []blocks.Block for _, block := range bs { + // call put on block if result is inconclusive or we are sure that + // the block isn't in storage if has, ok := b.hasCached(block.Key()); !ok || (ok && !has) { good = append(good, block) } } - err := b.blockstore.PutMany(bs) + err := b.blockstore.PutMany(good) if err != nil { return err } - for _, block := range bs { + for _, block := range good { b.arc.Add(block.Key(), true) } return nil diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index e10dacfaf1..b064b77db3 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -1,12 +1,13 @@ package blockstore import ( + "sync/atomic" + "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - - "sync/atomic" ) // bloomCached returns Blockstore that caches Has requests using Bloom filter @@ -126,19 +127,18 @@ func (b *bloomcache) Put(bl blocks.Block) error { } func (b *bloomcache) PutMany(bs []blocks.Block) error { - var good []blocks.Block - for _, block := range bs { - if has, ok := b.hasCached(block.Key()); !ok || (ok && !has) { - good = append(good, block) - } - } + // bloom cache gives only conclusive resulty if key is not contained + // to reduce number of puts we need conclusive infomration if block is contained + // this means that PutMany can't be improved with bloom cache so we just + // just do a passthrough. err := b.blockstore.PutMany(bs) - if err == nil { - for _, block := range bs { - b.bloom.AddTS([]byte(block.Key())) - } + if err != nil { + return err } - return err + for _, bl := range bs { + b.bloom.AddTS([]byte(bl.Key())) + } + return nil } func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { From 038104eb81257de7e079505c5b5d59afc901e361 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 31 Aug 2016 13:05:07 +0200 Subject: [PATCH 1267/3147] test: add test case for PutMany using cache to eliminate the call License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@186e5a2b06ea6f3fb0fb344bf913762328db56e3 --- blockstore/arc_cache_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 1757012327..ac61496d29 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -175,4 +175,10 @@ func TestPutManyCaches(t *testing.T) { trap("has hit datastore", cd, t) arc.Has(exampleBlock.Key()) + untrap(cd) + arc.DeleteBlock(exampleBlock.Key()) + + arc.Put(exampleBlock) + trap("PunMany has hit datastore", cd, t) + arc.PutMany([]blocks.Block{exampleBlock}) } From 61dbf8f980a042f81e3cc5b6dae418e22b1d291e Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 31 Aug 2016 17:27:07 +0200 Subject: [PATCH 1268/3147] test: add test case for PutMany on bloom filter skipping add to bloom License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@aa26a821c3308073396ac95963da07998ed7a0cd --- blockstore/bloom_cache_test.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 607bf8d241..d9d23341a3 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -28,6 +28,39 @@ func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) } } +func TestPutManyAddsToBloom(t *testing.T) { + bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) + + ctx, _ := context.WithTimeout(context.Background(), 1*time.Second) + cachedbs, err := testBloomCached(bs, ctx) + + select { + case <-cachedbs.rebuildChan: + case <-ctx.Done(): + t.Fatalf("Timeout wating for rebuild: %d", cachedbs.bloom.ElementsAdded()) + } + + block1 := blocks.NewBlock([]byte("foo")) + block2 := blocks.NewBlock([]byte("bar")) + + cachedbs.PutMany([]blocks.Block{block1}) + has, err := cachedbs.Has(block1.Key()) + if err != nil { + t.Fatal(err) + } + if has == false { + t.Fatal("added block is reported missing") + } + + has, err = cachedbs.Has(block2.Key()) + if err != nil { + t.Fatal(err) + } + if has == true { + t.Fatal("not added block is reported to be in blockstore") + } +} + func TestReturnsErrorWhenSizeNegative(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) _, err := bloomCached(bs, context.TODO(), -1, 1) From ef4a7d3c72e5c80370d6ae4552cab337817bf001 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 6 Sep 2016 19:25:34 +0200 Subject: [PATCH 1269/3147] blockstore: change unit of bloom filter to byte from bits License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@b9f5b4065c0e2f922008a499e92adf26d8334022 --- blockstore/caching.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/blockstore/caching.go b/blockstore/caching.go index f691f89f8c..bc78134e0b 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -8,16 +8,16 @@ import ( // Next to each option is it aproximate memory usage per unit type CacheOpts struct { - HasBloomFilterSize int // 1 bit + HasBloomFilterSize int // 1 byte HasBloomFilterHashes int // No size, 7 is usually best, consult bloom papers HasARCCacheSize int // 32 bytes } func DefaultCacheOpts() CacheOpts { return CacheOpts{ - HasBloomFilterSize: 512 * 8 * 1024, + HasBloomFilterSize: 512 << 10, HasBloomFilterHashes: 7, - HasARCCacheSize: 64 * 1024, + HasARCCacheSize: 64 << 10, } } @@ -34,7 +34,8 @@ func CachedBlockstore(bs GCBlockstore, return nil, errors.New("bloom filter hash count can't be 0 when there is size set") } if opts.HasBloomFilterSize != 0 { - cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes) + // *8 because of bytes to bits conversion + cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize*8, opts.HasBloomFilterHashes) } if opts.HasARCCacheSize > 0 { cbs, err = arcCached(cbs, opts.HasARCCacheSize) From ba89bf9b1f14e11165eaff18fb675af75adc5320 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1270/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@1aafbacd50fba458cb671bf5a17c914279d47a7d --- blockservice/blockservice.go | 87 +++++++++++++++++++++----------- blockservice/test/blocks_test.go | 64 ++++++++++++++--------- 2 files changed, 99 insertions(+), 52 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 25282a4414..f98c0f96f4 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -5,13 +5,16 @@ package blockservice import ( "errors" + "fmt" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var log = logging.Logger("blockservice") @@ -27,6 +30,12 @@ type BlockService struct { Exchange exchange.Interface } +// an Object is simply a typed block +type Object interface { + Cid() *cid.Cid + blocks.Block +} + // NewBlockService creates a BlockService with given datastore instance. func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { if rem == nil { @@ -41,30 +50,41 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. -func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) { - k := b.Key() - has, err := s.Blockstore.Has(k) +func (s *BlockService) AddObject(o Object) (*cid.Cid, error) { + // TODO: while this is a great optimization, we should think about the + // possibility of streaming writes directly to disk. If we can pass this object + // all the way down to the datastore without having to 'buffer' its data, + // we could implement a `WriteTo` method on it that could do a streaming write + // of the content, saving us (probably) considerable memory. + c := o.Cid() + has, err := s.Blockstore.Has(key.Key(c.Hash())) if err != nil { - return k, err + return nil, err } + if has { - return k, nil + return c, nil } - err = s.Blockstore.Put(b) + err = s.Blockstore.Put(o) if err != nil { - return k, err + return nil, err } - if err := s.Exchange.HasBlock(b); err != nil { - return "", errors.New("blockservice is closed") + + if err := s.Exchange.HasBlock(o); err != nil { + return nil, errors.New("blockservice is closed") } - return k, nil + + return c, nil } -func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) { +func (s *BlockService) AddObjects(bs []Object) ([]*cid.Cid, error) { var toput []blocks.Block + var toputcids []*cid.Cid for _, b := range bs { - has, err := s.Blockstore.Has(b.Key()) + c := b.Cid() + + has, err := s.Blockstore.Has(key.Key(c.Hash())) if err != nil { return nil, err } @@ -74,6 +94,7 @@ func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) { } toput = append(toput, b) + toputcids = append(toputcids, c) } err := s.Blockstore.PutMany(toput) @@ -81,26 +102,25 @@ func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) { return nil, err } - var ks []key.Key - for _, b := range toput { - if err := s.Exchange.HasBlock(b); err != nil { - return nil, errors.New("blockservice is closed") + var ks []*cid.Cid + for _, o := range toput { + if err := s.Exchange.HasBlock(o); err != nil { + return nil, fmt.Errorf("blockservice is closed (%s)", err) } - ks = append(ks, b.Key()) + + c := o.(Object).Cid() // cast is safe, we created these + ks = append(ks, c) } return ks, nil } // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). -func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (blocks.Block, error) { - if k == "" { - log.Debug("BlockService GetBlock: Nil Key") - return nil, ErrNotFound - } +func (s *BlockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { + log.Debugf("BlockService GetBlock: '%s'", c) - log.Debugf("BlockService GetBlock: '%s'", k) - block, err := s.Blockstore.Get(k) + // TODO: blockstore shouldnt care about Cids, need an easier way to strip the abstraction + block, err := s.Blockstore.Get(key.Key(c.Hash())) if err == nil { return block, nil } @@ -109,7 +129,7 @@ func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (blocks.Block, e // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. log.Debug("Blockservice: Searching bitswap") - blk, err := s.Exchange.GetBlock(ctx, k) + blk, err := s.Exchange.GetBlock(ctx, key.Key(c.Hash())) if err != nil { if err == blockstore.ErrNotFound { return nil, ErrNotFound @@ -130,12 +150,13 @@ func (s *BlockService) GetBlock(ctx context.Context, k key.Key) (blocks.Block, e // GetBlocks gets a list of blocks asynchronously and returns through // the returned channel. // NB: No guarantees are made about order. -func (s *BlockService) GetBlocks(ctx context.Context, ks []key.Key) <-chan blocks.Block { +func (s *BlockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { out := make(chan blocks.Block, 0) go func() { defer close(out) var misses []key.Key - for _, k := range ks { + for _, c := range ks { + k := key.Key(c.Hash()) hit, err := s.Blockstore.Get(k) if err != nil { misses = append(misses, k) @@ -171,11 +192,19 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []key.Key) <-chan block } // DeleteBlock deletes a block in the blockservice from the datastore -func (s *BlockService) DeleteBlock(k key.Key) error { - return s.Blockstore.DeleteBlock(k) +func (s *BlockService) DeleteObject(o Object) error { + return s.Blockstore.DeleteBlock(o.Key()) } func (s *BlockService) Close() error { log.Debug("blockservice is shutting down...") return s.Exchange.Close() } + +type RawBlockObject struct { + blocks.Block +} + +func (rob *RawBlockObject) Cid() *cid.Cid { + return cid.NewCidV0(rob.Block.Multihash()) +} diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 81d61818b3..a64264dab1 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -2,80 +2,98 @@ package bstest import ( "bytes" + "fmt" "testing" "time" blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" - blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil" key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) +func newObject(data []byte) *testObject { + return &testObject{ + Block: blocks.NewBlock(data), + } +} + +type testObject struct { + blocks.Block +} + +func (o *testObject) Cid() *cid.Cid { + return cid.NewCidV0(o.Block.Multihash()) +} + func TestBlocks(t *testing.T) { bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) bs := New(bstore, offline.Exchange(bstore)) defer bs.Close() - _, err := bs.GetBlock(context.Background(), key.Key("")) - if err != ErrNotFound { - t.Error("Empty String Key should error", err) - } - - b := blocks.NewBlock([]byte("beep boop")) + o := newObject([]byte("beep boop")) h := u.Hash([]byte("beep boop")) - if !bytes.Equal(b.Multihash(), h) { + if !bytes.Equal(o.Multihash(), h) { t.Error("Block Multihash and data multihash not equal") } - if b.Key() != key.Key(h) { + if o.Key() != key.Key(h) { t.Error("Block key and data multihash key not equal") } - k, err := bs.AddBlock(b) + k, err := bs.AddObject(o) if err != nil { t.Error("failed to add block to BlockService", err) return } - if k != b.Key() { + if !k.Equals(o.Cid()) { t.Error("returned key is not equal to block key", err) } ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() - b2, err := bs.GetBlock(ctx, b.Key()) + b2, err := bs.GetBlock(ctx, o.Cid()) if err != nil { t.Error("failed to retrieve block from BlockService", err) return } - if b.Key() != b2.Key() { + if o.Key() != b2.Key() { t.Error("Block keys not equal.") } - if !bytes.Equal(b.Data(), b2.Data()) { + if !bytes.Equal(o.RawData(), b2.RawData()) { t.Error("Block data is not equal.") } } +func makeObjects(n int) []*testObject { + var out []*testObject + for i := 0; i < n; i++ { + out = append(out, newObject([]byte(fmt.Sprintf("object %d", i)))) + } + return out +} + func TestGetBlocksSequential(t *testing.T) { var servs = Mocks(4) for _, s := range servs { defer s.Close() } - bg := blocksutil.NewBlockGenerator() - blks := bg.Blocks(50) + objs := makeObjects(50) - var keys []key.Key - for _, blk := range blks { - keys = append(keys, blk.Key()) - servs[0].AddBlock(blk) + var cids []*cid.Cid + for _, o := range objs { + cids = append(cids, o.Cid()) + servs[0].AddObject(o) } t.Log("one instance at a time, get blocks concurrently") @@ -83,7 +101,7 @@ func TestGetBlocksSequential(t *testing.T) { for i := 1; i < len(servs); i++ { ctx, cancel := context.WithTimeout(context.Background(), time.Second*50) defer cancel() - out := servs[i].GetBlocks(ctx, keys) + out := servs[i].GetBlocks(ctx, cids) gotten := make(map[key.Key]blocks.Block) for blk := range out { if _, ok := gotten[blk.Key()]; ok { @@ -91,8 +109,8 @@ func TestGetBlocksSequential(t *testing.T) { } gotten[blk.Key()] = blk } - if len(gotten) != len(blks) { - t.Fatalf("Didnt get enough blocks back: %d/%d", len(gotten), len(blks)) + if len(gotten) != len(objs) { + t.Fatalf("Didnt get enough blocks back: %d/%d", len(gotten), len(objs)) } } } From b1f168d03a0d8186895ff8f1df55bbe228e2b5bd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1271/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@8f5dba62074a56af025dd1afb92ba07b687ca867 --- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f96178b443..dc0f361341 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -117,7 +117,7 @@ func (bs *blockstore) Put(block blocks.Block) error { if err == nil && exists { return nil // already stored. } - return bs.datastore.Put(k, block.Data()) + return bs.datastore.Put(k, block.RawData()) } func (bs *blockstore) PutMany(blocks []blocks.Block) error { @@ -132,7 +132,7 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { continue } - err = t.Put(k, b.Data()) + err = t.Put(k, b.RawData()) if err != nil { return err } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index fc78ca6e9b..e4b6931ae6 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -48,7 +48,7 @@ func TestPutThenGetBlock(t *testing.T) { if err != nil { t.Fatal(err) } - if !bytes.Equal(block.Data(), blockFromBlockstore.Data()) { + if !bytes.Equal(block.RawData(), blockFromBlockstore.RawData()) { t.Fail() } } From 17e87be7ee9eda7c1ce60dc9ba9641e8df6b0665 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1272/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@54ea34e71464f4b5ce1638081d3bb89650deb430 --- namesys/dns.go | 2 +- namesys/publisher.go | 2 +- namesys/routing.go | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index d825ea00ed..79fb00c2f5 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -114,7 +114,7 @@ func workDomain(r *DNSResolver, name string, res chan lookupRes) { } func parseEntry(txt string) (path.Path, error) { - p, err := path.ParseKeyToPath(txt) // bare IPFS multihashes + p, err := path.ParseCidToPath(txt) // bare IPFS multihashes if err == nil { return p, nil } diff --git a/namesys/publisher.go b/namesys/publisher.go index 77604ae955..61fa8d6d05 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -348,7 +348,7 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p return err } - err = pub.Publish(ctx, key, path.FromKey(nodek)) + err = pub.Publish(ctx, key, path.FromCid(nodek)) if err != nil { return err } diff --git a/namesys/routing.go b/namesys/routing.go index d2c4fda110..b4eea2af93 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,9 +14,11 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var log = logging.Logger("namesys") @@ -196,7 +198,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa } else { // Its an old style multihash record log.Warning("Detected old style multihash record") - p := path.FromKey(key.Key(valh)) + p := path.FromCid(cid.NewCidV0(valh)) r.cacheSet(name, p, entry) return p, nil } From 067376e4317a48443d45844a790a514207ebe7fe Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1273/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@b8d46812f8d2b0f3050d8cdfcdb301591b3163b3 --- unixfs/io/dirbuilder.go | 6 +++--- unixfs/mod/dagmodifier.go | 27 +++++++++++++-------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 3db0b9ef96..7a7783a7d4 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -3,9 +3,9 @@ package io import ( "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) type directoryBuilder struct { @@ -29,8 +29,8 @@ func NewDirectory(dserv mdag.DAGService) *directoryBuilder { } // AddChild adds a (name, key)-pair to the root node. -func (d *directoryBuilder) AddChild(ctx context.Context, name string, k key.Key) error { - cnode, err := d.dserv.Get(ctx, k) +func (d *directoryBuilder) AddChild(ctx context.Context, name string, c *cid.Cid) error { + cnode, err := d.dserv.Get(ctx, c) if err != nil { return err } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 784cef8a49..d45dffdef0 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -6,7 +6,6 @@ import ( "io" "os" - key "github.com/ipfs/go-ipfs/blocks/key" chunk "github.com/ipfs/go-ipfs/importer/chunk" help "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" @@ -15,9 +14,9 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") @@ -169,12 +168,12 @@ func (dm *DagModifier) Sync() error { buflen := dm.wrBuf.Len() // overwrite existing dag nodes - thisk, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) + thisc, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) if err != nil { return err } - nd, err := dm.dagserv.Get(dm.ctx, thisk) + nd, err := dm.dagserv.Get(dm.ctx, thisc) if err != nil { return err } @@ -188,7 +187,7 @@ func (dm *DagModifier) Sync() error { return err } - thisk, err = dm.dagserv.Add(nd) + _, err = dm.dagserv.Add(nd) if err != nil { return err } @@ -205,30 +204,30 @@ func (dm *DagModifier) Sync() error { // modifyDag writes the data in 'data' over the data in 'node' starting at 'offset' // returns the new key of the passed in node and whether or not all the data in the reader // has been consumed. -func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (key.Key, bool, error) { +func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) { f, err := ft.FromBytes(node.Data()) if err != nil { - return "", false, err + return nil, false, err } // If we've reached a leaf node. if len(node.Links) == 0 { n, err := data.Read(f.Data[offset:]) if err != nil && err != io.EOF { - return "", false, err + return nil, false, err } // Update newly written node.. b, err := proto.Marshal(f) if err != nil { - return "", false, err + return nil, false, err } nd := new(mdag.Node) nd.SetData(b) k, err := dm.dagserv.Add(nd) if err != nil { - return "", false, err + return nil, false, err } // Hey look! we're done! @@ -247,20 +246,20 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) if cur+bs > offset { child, err := node.Links[i].GetNode(dm.ctx, dm.dagserv) if err != nil { - return "", false, err + return nil, false, err } k, sdone, err := dm.modifyDag(child, offset-cur, data) if err != nil { - return "", false, err + return nil, false, err } offset += bs - node.Links[i].Hash = mh.Multihash(k) + node.Links[i].Hash = k.Hash() // Recache serialized node _, err = node.EncodeProtobuf(true) if err != nil { - return "", false, err + return nil, false, err } if sdone { From 46639086d6dd76b17f0a39f8236dccdd5d073154 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1274/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@626b04074d36af61f09bfec0d5d1decffe8ba6db --- pinning/pinner/gc/gc.go | 25 ++-- pinning/pinner/pin.go | 243 ++++++++++++++++++++----------------- pinning/pinner/pin_test.go | 18 +-- pinning/pinner/set.go | 104 +++++----------- pinning/pinner/set_test.go | 92 +------------- 5 files changed, 190 insertions(+), 292 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 0eb87f867e..c1e2eb4718 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -10,6 +10,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var log = logging.Logger("gc") @@ -23,7 +24,7 @@ var log = logging.Logger("gc") // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRoots []key.Key) (<-chan key.Key, error) { +func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan key.Key, error) { unlocker := bs.GCLock() bsrv := bserv.New(bs, offline.Exchange(bs)) @@ -70,16 +71,24 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRo return output, nil } -func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []key.Key, bestEffort bool) error { - for _, k := range roots { - set.Add(k) - nd, err := ds.Get(ctx, k) +func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []*cid.Cid, bestEffort bool) error { + for _, c := range roots { + set.Add(key.Key(c.Hash())) + nd, err := ds.Get(ctx, c) if err != nil { return err } // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ds, nd, set, bestEffort) + err = dag.EnumerateChildren(ctx, ds, nd, func(c *cid.Cid) bool { + k := key.Key(c.Hash()) + seen := set.Has(k) + if seen { + return false + } + set.Add(k) + return true + }, bestEffort) if err != nil { return err } @@ -88,7 +97,7 @@ func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots [ return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService, bestEffortRoots []key.Key) (key.KeySet, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService, bestEffortRoots []*cid.Cid) (key.KeySet, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := key.NewKeySet() @@ -103,7 +112,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService, bestEffor } for _, k := range pn.DirectKeys() { - gcs.Add(k) + gcs.Add(key.Key(k.Hash())) } err = Descendants(ctx, ds, gcs, pn.InternalPins(), false) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d034cbc43b..56979cc69f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -4,22 +4,33 @@ package pin import ( "fmt" + "os" "sync" "time" key "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/blocks/set" mdag "github.com/ipfs/go-ipfs/merkledag" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var log = logging.Logger("pin") var pinDatastoreKey = ds.NewKey("/local/pins") -var emptyKey = key.B58KeyDecode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") +var emptyKey *cid.Cid + +func init() { + e, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") + if err != nil { + log.Error("failed to decode empty key constant") + os.Exit(1) + } + emptyKey = e +} const ( linkRecursive = "recursive" @@ -70,45 +81,45 @@ func StringToPinMode(s string) (PinMode, bool) { } type Pinner interface { - IsPinned(key.Key) (string, bool, error) - IsPinnedWithType(key.Key, PinMode) (string, bool, error) + IsPinned(*cid.Cid) (string, bool, error) + IsPinnedWithType(*cid.Cid, PinMode) (string, bool, error) Pin(context.Context, *mdag.Node, bool) error - Unpin(context.Context, key.Key, bool) error + Unpin(context.Context, *cid.Cid, bool) error // Check if a set of keys are pinned, more efficient than // calling IsPinned for each key - CheckIfPinned(keys ...key.Key) ([]Pinned, error) + CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) // PinWithMode is for manually editing the pin structure. Use with // care! If used improperly, garbage collection may not be // successful. - PinWithMode(key.Key, PinMode) + PinWithMode(*cid.Cid, PinMode) // RemovePinWithMode is for manually editing the pin structure. // Use with care! If used improperly, garbage collection may not // be successful. - RemovePinWithMode(key.Key, PinMode) + RemovePinWithMode(*cid.Cid, PinMode) Flush() error - DirectKeys() []key.Key - RecursiveKeys() []key.Key - InternalPins() []key.Key + DirectKeys() []*cid.Cid + RecursiveKeys() []*cid.Cid + InternalPins() []*cid.Cid } type Pinned struct { - Key key.Key + Key *cid.Cid Mode PinMode - Via key.Key + Via *cid.Cid } // pinner implements the Pinner interface type pinner struct { lock sync.RWMutex - recursePin set.BlockSet - directPin set.BlockSet + recursePin *cid.Set + directPin *cid.Set // Track the keys used for storing the pinning state, so gc does // not delete them. - internalPin map[key.Key]struct{} + internalPin *cid.Set dserv mdag.DAGService internal mdag.DAGService // dagservice used to store internal objects dstore ds.Datastore @@ -117,15 +128,16 @@ type pinner struct { // NewPinner creates a new pinner using the given datastore as a backend func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { - rcset := set.NewSimpleBlockSet() - dirset := set.NewSimpleBlockSet() + rcset := cid.NewSet() + dirset := cid.NewSet() return &pinner{ - recursePin: rcset, - directPin: dirset, - dserv: serv, - dstore: dstore, - internal: internal, + recursePin: rcset, + directPin: dirset, + dserv: serv, + dstore: dstore, + internal: internal, + internalPin: cid.NewSet(), } } @@ -133,18 +145,16 @@ func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() - k, err := node.Key() - if err != nil { - return err - } + c := node.Cid() + k := key.Key(c.Hash()) if recurse { - if p.recursePin.HasKey(k) { + if p.recursePin.Has(c) { return nil } - if p.directPin.HasKey(k) { - p.directPin.RemoveBlock(k) + if p.directPin.Has(c) { + p.directPin.Remove(c) } // fetch entire graph @@ -153,17 +163,17 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { return err } - p.recursePin.AddBlock(k) + p.recursePin.Add(c) } else { - if _, err := p.dserv.Get(ctx, k); err != nil { + if _, err := p.dserv.Get(ctx, c); err != nil { return err } - if p.recursePin.HasKey(k) { + if p.recursePin.Has(c) { return fmt.Errorf("%s already pinned recursively", k.B58String()) } - p.directPin.AddBlock(k) + p.directPin.Add(c) } return nil } @@ -171,10 +181,10 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { var ErrNotPinned = fmt.Errorf("not pinned") // Unpin a given key -func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { +func (p *pinner) Unpin(ctx context.Context, c *cid.Cid, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() - reason, pinned, err := p.isPinnedWithType(k, Any) + reason, pinned, err := p.isPinnedWithType(c, Any) if err != nil { return err } @@ -184,41 +194,41 @@ func (p *pinner) Unpin(ctx context.Context, k key.Key, recursive bool) error { switch reason { case "recursive": if recursive { - p.recursePin.RemoveBlock(k) + p.recursePin.Remove(c) return nil } else { - return fmt.Errorf("%s is pinned recursively", k) + return fmt.Errorf("%s is pinned recursively", c) } case "direct": - p.directPin.RemoveBlock(k) + p.directPin.Remove(c) return nil default: - return fmt.Errorf("%s is pinned indirectly under %s", k, reason) + return fmt.Errorf("%s is pinned indirectly under %s", c, reason) } } -func (p *pinner) isInternalPin(key key.Key) bool { - _, ok := p.internalPin[key] - return ok +func (p *pinner) isInternalPin(c *cid.Cid) bool { + return p.internalPin.Has(c) } // IsPinned returns whether or not the given key is pinned // and an explanation of why its pinned -func (p *pinner) IsPinned(k key.Key) (string, bool, error) { +func (p *pinner) IsPinned(c *cid.Cid) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.isPinnedWithType(k, Any) + return p.isPinnedWithType(c, Any) } -func (p *pinner) IsPinnedWithType(k key.Key, mode PinMode) (string, bool, error) { +func (p *pinner) IsPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.isPinnedWithType(k, mode) + return p.isPinnedWithType(c, mode) } // isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // intended for use by other pinned methods that already take locks -func (p *pinner) isPinnedWithType(k key.Key, mode PinMode) (string, bool, error) { +func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { + k := key.Key(c.Hash()) switch mode { case Any, Direct, Indirect, Recursive, Internal: default: @@ -226,21 +236,21 @@ func (p *pinner) isPinnedWithType(k key.Key, mode PinMode) (string, bool, error) mode, Direct, Indirect, Recursive, Internal, Any) return "", false, err } - if (mode == Recursive || mode == Any) && p.recursePin.HasKey(k) { + if (mode == Recursive || mode == Any) && p.recursePin.Has(c) { return linkRecursive, true, nil } if mode == Recursive { return "", false, nil } - if (mode == Direct || mode == Any) && p.directPin.HasKey(k) { + if (mode == Direct || mode == Any) && p.directPin.Has(c) { return linkDirect, true, nil } if mode == Direct { return "", false, nil } - if (mode == Internal || mode == Any) && p.isInternalPin(k) { + if (mode == Internal || mode == Any) && p.isInternalPin(c) { return linkInternal, true, nil } if mode == Internal { @@ -248,8 +258,8 @@ func (p *pinner) isPinnedWithType(k key.Key, mode PinMode) (string, bool, error) } // Default is Indirect - for _, rk := range p.recursePin.GetKeys() { - rnd, err := p.dserv.Get(context.Background(), rk) + for _, rc := range p.recursePin.Keys() { + rnd, err := p.dserv.Get(context.Background(), rc) if err != nil { return "", false, err } @@ -259,90 +269,99 @@ func (p *pinner) isPinnedWithType(k key.Key, mode PinMode) (string, bool, error) return "", false, err } if has { - return rk.B58String(), true, nil + return rc.String(), true, nil } } return "", false, nil } -func (p *pinner) CheckIfPinned(keys ...key.Key) ([]Pinned, error) { +func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { p.lock.RLock() defer p.lock.RUnlock() - pinned := make([]Pinned, 0, len(keys)) - toCheck := make(map[key.Key]struct{}) + pinned := make([]Pinned, 0, len(cids)) + toCheck := cid.NewSet() // First check for non-Indirect pins directly - for _, k := range keys { - if p.recursePin.HasKey(k) { - pinned = append(pinned, Pinned{Key: k, Mode: Recursive}) - } else if p.directPin.HasKey(k) { - pinned = append(pinned, Pinned{Key: k, Mode: Direct}) - } else if p.isInternalPin(k) { - pinned = append(pinned, Pinned{Key: k, Mode: Internal}) + for _, c := range cids { + if p.recursePin.Has(c) { + pinned = append(pinned, Pinned{Key: c, Mode: Recursive}) + } else if p.directPin.Has(c) { + pinned = append(pinned, Pinned{Key: c, Mode: Direct}) + } else if p.isInternalPin(c) { + pinned = append(pinned, Pinned{Key: c, Mode: Internal}) } else { - toCheck[k] = struct{}{} + toCheck.Add(c) } } // Now walk all recursive pins to check for indirect pins - var checkChildren func(key.Key, key.Key) error - checkChildren = func(rk key.Key, parentKey key.Key) error { + var checkChildren func(*cid.Cid, *cid.Cid) error + checkChildren = func(rk, parentKey *cid.Cid) error { parent, err := p.dserv.Get(context.Background(), parentKey) if err != nil { return err } for _, lnk := range parent.Links { - k := key.Key(lnk.Hash) + c := cid.NewCidV0(lnk.Hash) - if _, found := toCheck[k]; found { + if toCheck.Has(c) { pinned = append(pinned, - Pinned{Key: k, Mode: Indirect, Via: rk}) - delete(toCheck, k) + Pinned{Key: c, Mode: Indirect, Via: rk}) + toCheck.Remove(c) } - err := checkChildren(rk, k) + err := checkChildren(rk, c) if err != nil { return err } - if len(toCheck) == 0 { + if toCheck.Len() == 0 { return nil } } return nil } - for _, rk := range p.recursePin.GetKeys() { + + for _, rk := range p.recursePin.Keys() { err := checkChildren(rk, rk) if err != nil { return nil, err } - if len(toCheck) == 0 { + if toCheck.Len() == 0 { break } } // Anything left in toCheck is not pinned - for k, _ := range toCheck { + for _, k := range toCheck.Keys() { pinned = append(pinned, Pinned{Key: k, Mode: NotPinned}) } return pinned, nil } -func (p *pinner) RemovePinWithMode(key key.Key, mode PinMode) { +func (p *pinner) RemovePinWithMode(c *cid.Cid, mode PinMode) { p.lock.Lock() defer p.lock.Unlock() switch mode { case Direct: - p.directPin.RemoveBlock(key) + p.directPin.Remove(c) case Recursive: - p.recursePin.RemoveBlock(key) + p.recursePin.Remove(c) default: // programmer error, panic OK panic("unrecognized pin type") } } +func cidSetWithValues(cids []*cid.Cid) *cid.Set { + out := cid.NewSet() + for _, c := range cids { + out.Add(c) + } + return out +} + // LoadPinner loads a pinner and its keysets from the given datastore func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) { p := new(pinner) @@ -356,29 +375,29 @@ func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) return nil, fmt.Errorf("cannot load pin state: %s was not bytes", pinDatastoreKey) } - rootKey := key.Key(rootKeyBytes) + rootCid, err := cid.Cast(rootKeyBytes) + if err != nil { + return nil, err + } ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5) defer cancel() - root, err := internal.Get(ctx, rootKey) + root, err := internal.Get(ctx, rootCid) if err != nil { return nil, fmt.Errorf("cannot find pinning root object: %v", err) } - internalPin := map[key.Key]struct{}{ - rootKey: struct{}{}, - } - recordInternal := func(k key.Key) { - internalPin[k] = struct{}{} - } + internalset := cid.NewSet() + internalset.Add(rootCid) + recordInternal := internalset.Add { // load recursive set recurseKeys, err := loadSet(ctx, internal, root, linkRecursive, recordInternal) if err != nil { return nil, fmt.Errorf("cannot load recursive pins: %v", err) } - p.recursePin = set.SimpleSetFromKeys(recurseKeys) + p.recursePin = cidSetWithValues(recurseKeys) } { // load direct set @@ -386,10 +405,10 @@ func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) if err != nil { return nil, fmt.Errorf("cannot load direct pins: %v", err) } - p.directPin = set.SimpleSetFromKeys(directKeys) + p.directPin = cidSetWithValues(directKeys) } - p.internalPin = internalPin + p.internalPin = internalset // assign services p.dserv = dserv @@ -400,13 +419,13 @@ func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) } // DirectKeys returns a slice containing the directly pinned keys -func (p *pinner) DirectKeys() []key.Key { - return p.directPin.GetKeys() +func (p *pinner) DirectKeys() []*cid.Cid { + return p.directPin.Keys() } // RecursiveKeys returns a slice containing the recursively pinned keys -func (p *pinner) RecursiveKeys() []key.Key { - return p.recursePin.GetKeys() +func (p *pinner) RecursiveKeys() []*cid.Cid { + return p.recursePin.Keys() } // Flush encodes and writes pinner keysets to the datastore @@ -416,14 +435,12 @@ func (p *pinner) Flush() error { ctx := context.TODO() - internalPin := make(map[key.Key]struct{}) - recordInternal := func(k key.Key) { - internalPin[k] = struct{}{} - } + internalset := cid.NewSet() + recordInternal := internalset.Add root := &mdag.Node{} { - n, err := storeSet(ctx, p.internal, p.directPin.GetKeys(), recordInternal) + n, err := storeSet(ctx, p.internal, p.directPin.Keys(), recordInternal) if err != nil { return err } @@ -433,7 +450,7 @@ func (p *pinner) Flush() error { } { - n, err := storeSet(ctx, p.internal, p.recursePin.GetKeys(), recordInternal) + n, err := storeSet(ctx, p.internal, p.recursePin.Keys(), recordInternal) if err != nil { return err } @@ -453,45 +470,45 @@ func (p *pinner) Flush() error { return err } - internalPin[k] = struct{}{} - if err := p.dstore.Put(pinDatastoreKey, []byte(k)); err != nil { + internalset.Add(k) + if err := p.dstore.Put(pinDatastoreKey, k.Bytes()); err != nil { return fmt.Errorf("cannot store pin state: %v", err) } - p.internalPin = internalPin + p.internalPin = internalset return nil } -func (p *pinner) InternalPins() []key.Key { +func (p *pinner) InternalPins() []*cid.Cid { p.lock.Lock() defer p.lock.Unlock() - var out []key.Key - for k, _ := range p.internalPin { - out = append(out, k) + var out []*cid.Cid + for _, c := range p.internalPin.Keys() { + out = append(out, c) } return out } // PinWithMode allows the user to have fine grained control over pin // counts -func (p *pinner) PinWithMode(k key.Key, mode PinMode) { +func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { p.lock.Lock() defer p.lock.Unlock() switch mode { case Recursive: - p.recursePin.AddBlock(k) + p.recursePin.Add(c) case Direct: - p.directPin.AddBlock(k) + p.directPin.Add(c) } } func hasChild(ds mdag.DAGService, root *mdag.Node, child key.Key) (bool, error) { for _, lnk := range root.Links { - k := key.Key(lnk.Hash) - if k == child { + c := cid.NewCidV0(lnk.Hash) + if key.Key(c.Hash()) == child { return true, nil } - nd, err := ds.Get(context.Background(), k) + nd, err := ds.Get(context.Background(), c) if err != nil { return false, err } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 91c6b8c0e9..f1f626f547 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -4,28 +4,28 @@ import ( "testing" "time" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "github.com/ipfs/go-ipfs/blocks/blockstore" - key "github.com/ipfs/go-ipfs/blocks/key" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" + ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) -func randNode() (*mdag.Node, key.Key) { +func randNode() (*mdag.Node, *cid.Cid) { nd := new(mdag.Node) nd.SetData(make([]byte, 32)) util.NewTimeSeededRand().Read(nd.Data()) - k, _ := nd.Key() + k := nd.Cid() return nd, k } -func assertPinned(t *testing.T, p Pinner, k key.Key, failmsg string) { - _, pinned, err := p.IsPinned(k) +func assertPinned(t *testing.T, p Pinner, c *cid.Cid, failmsg string) { + _, pinned, err := p.IsPinned(c) if err != nil { t.Fatal(err) } @@ -93,7 +93,7 @@ func TestPinnerBasic(t *testing.T) { assertPinned(t, p, ck, "child of recursively pinned node not found") - bk, _ := b.Key() + bk := b.Cid() assertPinned(t, p, bk, "Recursively pinned node not found..") d, _ := randNode() @@ -119,7 +119,7 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - dk, _ := d.Key() + dk := d.Cid() assertPinned(t, p, dk, "pinned node not found.") // Test recursive unpin diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 7257ccaecb..eb5cb5d915 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "hash/fnv" - "io" "sort" "unsafe" @@ -16,6 +15,7 @@ import ( "github.com/ipfs/go-ipfs/pin/internal/pb" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) const ( @@ -31,18 +31,18 @@ func randomSeed() (uint32, error) { return binary.LittleEndian.Uint32(buf[:]), nil } -func hash(seed uint32, k key.Key) uint32 { +func hash(seed uint32, c *cid.Cid) uint32 { var buf [4]byte binary.LittleEndian.PutUint32(buf[:], seed) h := fnv.New32a() _, _ = h.Write(buf[:]) - _, _ = io.WriteString(h, string(k)) + _, _ = h.Write(c.Bytes()) return h.Sum32() } -type itemIterator func() (k key.Key, data []byte, ok bool) +type itemIterator func() (c *cid.Cid, data []byte, ok bool) -type keyObserver func(key.Key) +type keyObserver func(*cid.Cid) // refcount is the marshaled format of refcounts. It may change // between versions; this is valid for version 1. Changing it may @@ -100,7 +100,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint Links: make([]*merkledag.Link, 0, defaultFanout+maxItems), } for i := 0; i < defaultFanout; i++ { - n.Links = append(n.Links, &merkledag.Link{Hash: emptyKey.ToMultihash()}) + n.Links = append(n.Links, &merkledag.Link{Hash: emptyKey.Hash()}) } internalKeys(emptyKey) hdr := &pb.Set{ @@ -121,7 +121,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint // all done break } - n.Links = append(n.Links, &merkledag.Link{Hash: k.ToMultihash()}) + n.Links = append(n.Links, &merkledag.Link{Hash: k.Hash()}) n.SetData(append(n.Data(), data...)) } // sort by hash, also swap item Data @@ -134,7 +134,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint // wasteful but simple type item struct { - k key.Key + c *cid.Cid data []byte } hashed := make(map[uint32][]item) @@ -147,13 +147,13 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint hashed[h] = append(hashed[h], item{k, data}) } for h, items := range hashed { - childIter := func() (k key.Key, data []byte, ok bool) { + childIter := func() (c *cid.Cid, data []byte, ok bool) { if len(items) == 0 { - return "", nil, false + return nil, nil, false } first := items[0] items = items[1:] - return first.k, first.data, true + return first.c, first.data, true } child, err := storeItems(ctx, dag, uint64(len(items)), childIter, internalKeys) if err != nil { @@ -170,7 +170,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint internalKeys(childKey) l := &merkledag.Link{ Name: "", - Hash: childKey.ToMultihash(), + Hash: childKey.Hash(), Size: size, } n.Links[int(h%defaultFanout)] = l @@ -231,8 +231,9 @@ func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.Node, } } for _, l := range n.Links[:fanout] { - children(key.Key(l.Hash)) - if key.Key(l.Hash) == emptyKey { + c := cid.NewCidV0(l.Hash) + children(c) + if c.Equals(emptyKey) { continue } subtree, err := l.GetNode(ctx, dag) @@ -246,20 +247,23 @@ func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.Node, return nil } -func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node, name string, internalKeys keyObserver) ([]key.Key, error) { +func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node, name string, internalKeys keyObserver) ([]*cid.Cid, error) { l, err := root.GetNodeLink(name) if err != nil { return nil, err } - internalKeys(key.Key(l.Hash)) + + lnkc := cid.NewCidV0(l.Hash) + internalKeys(lnkc) + n, err := l.GetNode(ctx, dag) if err != nil { return nil, err } - var res []key.Key + var res []*cid.Cid walk := func(buf []byte, idx int, link *merkledag.Link) error { - res = append(res, key.Key(link.Hash)) + res = append(res, cid.NewCidV0(link.Hash)) return nil } if err := walkItems(ctx, dag, n, walk, internalKeys); err != nil { @@ -273,7 +277,8 @@ func loadMultiset(ctx context.Context, dag merkledag.DAGService, root *merkledag if err != nil { return nil, fmt.Errorf("Failed to get link %s: %v", name, err) } - internalKeys(key.Key(l.Hash)) + c := cid.NewCidV0(l.Hash) + internalKeys(c) n, err := l.GetNode(ctx, dag) if err != nil { return nil, fmt.Errorf("Failed to get node from link %s: %v", name, err) @@ -292,24 +297,24 @@ func loadMultiset(ctx context.Context, dag merkledag.DAGService, root *merkledag return refcounts, nil } -func storeSet(ctx context.Context, dag merkledag.DAGService, keys []key.Key, internalKeys keyObserver) (*merkledag.Node, error) { - iter := func() (k key.Key, data []byte, ok bool) { - if len(keys) == 0 { - return "", nil, false +func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.Node, error) { + iter := func() (c *cid.Cid, data []byte, ok bool) { + if len(cids) == 0 { + return nil, nil, false } - first := keys[0] - keys = keys[1:] + first := cids[0] + cids = cids[1:] return first, nil, true } - n, err := storeItems(ctx, dag, uint64(len(keys)), iter, internalKeys) + n, err := storeItems(ctx, dag, uint64(len(cids)), iter, internalKeys) if err != nil { return nil, err } - k, err := dag.Add(n) + c, err := dag.Add(n) if err != nil { return nil, err } - internalKeys(k) + internalKeys(c) return n, nil } @@ -320,46 +325,3 @@ func copyRefcounts(orig map[key.Key]uint64) map[key.Key]uint64 { } return r } - -func storeMultiset(ctx context.Context, dag merkledag.DAGService, refcounts map[key.Key]uint64, internalKeys keyObserver) (*merkledag.Node, error) { - // make a working copy of the refcounts - refcounts = copyRefcounts(refcounts) - - iter := func() (k key.Key, data []byte, ok bool) { - // Every call of this function returns the next refcount item. - // - // This function splits out the uint64 reference counts as - // smaller increments, as fits in type refcount. Most of the - // time the refcount will fit inside just one, so this saves - // space. - // - // We use range here to pick an arbitrary item in the map, but - // not really iterate the map. - for k, refs := range refcounts { - // Max value a single multiset item can store - num := ^refcount(0) - if refs <= uint64(num) { - // Remaining count fits in a single item; remove the - // key from the map. - num = refcount(refs) - delete(refcounts, k) - } else { - // Count is too large to fit in one item, the key will - // repeat in some later call. - refcounts[k] -= uint64(num) - } - return k, num.Bytes(), true - } - return "", nil, false - } - n, err := storeItems(ctx, dag, uint64(len(refcounts)), iter, internalKeys) - if err != nil { - return nil, err - } - k, err := dag.Add(n) - if err != nil { - return nil, err - } - internalKeys(k) - return n, nil -} diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 83d65dd02f..a5e9152d4c 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -1,20 +1,6 @@ package pin -import ( - "testing" - "testing/quick" - - "github.com/ipfs/go-ipfs/blocks/blockstore" - "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/blockservice" - "github.com/ipfs/go-ipfs/exchange/offline" - "github.com/ipfs/go-ipfs/merkledag" - "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) +import "github.com/ipfs/go-ipfs/blocks/key" func ignoreKeys(key.Key) {} @@ -25,79 +11,3 @@ func copyMap(m map[key.Key]uint16) map[key.Key]uint64 { } return c } - -func TestMultisetRoundtrip(t *testing.T) { - dstore := dssync.MutexWrap(datastore.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := blockservice.New(bstore, offline.Exchange(bstore)) - dag := merkledag.NewDAGService(bserv) - - fn := func(m map[key.Key]uint16) bool { - // Convert invalid multihash from input to valid ones - for k, v := range m { - if _, err := mh.Cast([]byte(k)); err != nil { - delete(m, k) - m[key.Key(u.Hash([]byte(k)))] = v - } - } - - // Generate a smaller range for refcounts than full uint64, as - // otherwise this just becomes overly cpu heavy, splitting it - // out into too many items. That means we need to convert to - // the right kind of map. As storeMultiset mutates the map as - // part of its bookkeeping, this is actually good. - refcounts := copyMap(m) - - ctx := context.Background() - n, err := storeMultiset(ctx, dag, refcounts, ignoreKeys) - if err != nil { - t.Fatalf("storing multiset: %v", err) - } - - // Check that the node n is in the DAG - k, err := n.Key() - if err != nil { - t.Fatalf("Could not get key: %v", err) - } - _, err = dag.Get(ctx, k) - if err != nil { - t.Fatalf("Could not get node: %v", err) - } - - root := &merkledag.Node{} - const linkName = "dummylink" - if err := root.AddNodeLink(linkName, n); err != nil { - t.Fatalf("adding link to root node: %v", err) - } - - roundtrip, err := loadMultiset(ctx, dag, root, linkName, ignoreKeys) - if err != nil { - t.Fatalf("loading multiset: %v", err) - } - - orig := copyMap(m) - success := true - for k, want := range orig { - if got, ok := roundtrip[k]; ok { - if got != want { - success = false - t.Logf("refcount changed: %v -> %v for %q", want, got, k) - } - delete(orig, k) - delete(roundtrip, k) - } - } - for k, v := range orig { - success = false - t.Logf("refcount missing: %v for %q", v, k) - } - for k, v := range roundtrip { - success = false - t.Logf("refcount extra: %v for %q", v, k) - } - return success - } - if err := quick.Check(fn, nil); err != nil { - t.Fatal(err) - } -} From afa7972d33562d9582566f263024bf35458cf214 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1275/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@10389ab7a8513a693ab1ee2091a5b121078b5ab6 --- exchange/interface.go | 1 + 1 file changed, 1 insertion(+) diff --git a/exchange/interface.go b/exchange/interface.go index 6db476d9ec..6f246ebc0a 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -6,6 +6,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" key "github.com/ipfs/go-ipfs/blocks/key" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From f1996a259d88521ca8891acc34c4207d9f8f54ee Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1276/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@e698e39a6382fc0e9171a540c37fbdd084bd738d --- exchange/offline/offline.go | 1 + 1 file changed, 1 insertion(+) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index d2ee4fbaa6..e36d59a67f 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -7,6 +7,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From e957e3f059522e439436ba6ff3c2bff74426f73e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1277/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@09bae926ba05d38aa22589c3a12337760bcc42f2 --- mfs/dir.go | 7 +------ mfs/mfs_test.go | 22 ++++++---------------- mfs/repub_test.go | 8 ++++---- mfs/system.go | 46 ++++++++++++++++------------------------------ 4 files changed, 27 insertions(+), 56 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 9009d2431b..3612516f51 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -246,12 +246,7 @@ func (d *Directory) List() ([]NodeListing, error) { return nil, err } - k, err := nd.Key() - if err != nil { - return nil, err - } - - child.Hash = k.B58String() + child.Hash = nd.Key().B58String() out = append(out, child) } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index f4aba72cbe..13da0358ed 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,7 +14,6 @@ import ( "time" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" - key "github.com/ipfs/go-ipfs/blocks/key" bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" importer "github.com/ipfs/go-ipfs/importer" @@ -28,6 +27,7 @@ import ( dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) func emptyDirNode() *dag.Node { @@ -187,8 +187,8 @@ func setupRoot(ctx context.Context, t *testing.T) (dag.DAGService, *Root) { ds := getDagserv(t) root := emptyDirNode() - rt, err := NewRoot(ctx, ds, root, func(ctx context.Context, k key.Key) error { - fmt.Println("PUBLISHED: ", k) + rt, err := NewRoot(ctx, ds, root, func(ctx context.Context, c *cid.Cid) error { + fmt.Println("PUBLISHED: ", c) return nil }) @@ -280,10 +280,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { t.Fatal(err) } - fihash, err := nd.Multihash() - if err != nil { - t.Fatal(err) - } + fihash := nd.Multihash() dir := emptyDirNode() _, err = ds.Add(dir) @@ -291,10 +288,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { t.Fatal(err) } - dirhash, err := dir.Multihash() - if err != nil { - t.Fatal(err) - } + dirhash := dir.Multihash() top := emptyDirNode() top.Links = []*dag.Link{ @@ -803,11 +797,7 @@ func TestFlushing(t *testing.T) { t.Fatal("root wasnt a directory") } - rnk, err := rnd.Key() - if err != nil { - t.Fatal(err) - } - + rnk := rnd.Key() exp := "QmWMVyhTuyxUrXX3ynz171jq76yY3PktfY9Bxiph7b9ikr" if rnk.B58String() != exp { t.Fatalf("dag looks wrong, expected %s, but got %s", exp, rnk.B58String()) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 32e0b2b27b..09d8d4124d 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -4,10 +4,10 @@ import ( "testing" "time" - key "github.com/ipfs/go-ipfs/blocks/key" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) func TestRepublisher(t *testing.T) { @@ -19,7 +19,7 @@ func TestRepublisher(t *testing.T) { pub := make(chan struct{}) - pf := func(ctx context.Context, k key.Key) error { + pf := func(ctx context.Context, c *cid.Cid) error { pub <- struct{}{} return nil } @@ -30,7 +30,7 @@ func TestRepublisher(t *testing.T) { rp := NewRepublisher(ctx, pf, tshort, tlong) go rp.Run() - rp.Update("test") + rp.Update(nil) // should hit short timeout select { @@ -43,7 +43,7 @@ func TestRepublisher(t *testing.T) { go func() { for { - rp.Update("a") + rp.Update(nil) time.Sleep(time.Millisecond * 10) select { case <-cctx.Done(): diff --git a/mfs/system.go b/mfs/system.go index 56891cc215..3e2e74e764 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -14,12 +14,12 @@ import ( "sync" "time" - key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var ErrNotExist = errors.New("no such rootfs") @@ -61,19 +61,15 @@ type Root struct { Type string } -type PubFunc func(context.Context, key.Key) error +type PubFunc func(context.Context, *cid.Cid) error // newRoot creates a new Root and starts up a republisher routine for it func NewRoot(parent context.Context, ds dag.DAGService, node *dag.Node, pf PubFunc) (*Root, error) { - ndk, err := node.Key() - if err != nil { - return nil, err - } var repub *Republisher if pf != nil { repub = NewRepublisher(parent, pf, time.Millisecond*300, time.Second*3) - repub.setVal(ndk) + repub.setVal(node.Cid()) go repub.Run() } @@ -91,9 +87,9 @@ func NewRoot(parent context.Context, ds dag.DAGService, node *dag.Node, pf PubFu switch pbn.GetType() { case ft.TDirectory: - root.val = NewDirectory(parent, ndk.String(), node, root, ds) + root.val = NewDirectory(parent, node.String(), node, root, ds) case ft.TFile, ft.TMetadata, ft.TRaw: - fi, err := NewFile(ndk.String(), node, root, ds) + fi, err := NewFile(node.String(), node, root, ds) if err != nil { return nil, err } @@ -114,13 +110,8 @@ func (kr *Root) Flush() error { return err } - k, err := nd.Key() - if err != nil { - return err - } - if kr.repub != nil { - kr.repub.Update(k) + kr.repub.Update(nd.Cid()) } return nil } @@ -128,13 +119,13 @@ func (kr *Root) Flush() error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published func (kr *Root) closeChild(name string, nd *dag.Node, sync bool) error { - k, err := kr.dserv.Add(nd) + c, err := kr.dserv.Add(nd) if err != nil { return err } if kr.repub != nil { - kr.repub.Update(k) + kr.repub.Update(c) } return nil } @@ -145,13 +136,8 @@ func (kr *Root) Close() error { return err } - k, err := nd.Key() - if err != nil { - return err - } - if kr.repub != nil { - kr.repub.Update(k) + kr.repub.Update(nd.Cid()) return kr.repub.Close() } @@ -170,11 +156,11 @@ type Republisher struct { cancel func() lk sync.Mutex - val key.Key - lastpub key.Key + val *cid.Cid + lastpub *cid.Cid } -func (rp *Republisher) getVal() key.Key { +func (rp *Republisher) getVal() *cid.Cid { rp.lk.Lock() defer rp.lk.Unlock() return rp.val @@ -195,10 +181,10 @@ func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration } } -func (p *Republisher) setVal(k key.Key) { +func (p *Republisher) setVal(c *cid.Cid) { p.lk.Lock() defer p.lk.Unlock() - p.val = k + p.val = c } func (p *Republisher) pubNow() { @@ -230,8 +216,8 @@ func (p *Republisher) Close() error { // Touch signals that an update has occurred since the last publish. // Multiple consecutive touches may extend the time period before // the next Publish occurs in order to more efficiently batch updates -func (np *Republisher) Update(k key.Key) { - np.setVal(k) +func (np *Republisher) Update(c *cid.Cid) { + np.setVal(c) select { case np.Publish <- struct{}{}: default: From 0920b431ee88001da967f5485561cf844bc2f9f9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Sep 2016 07:50:27 -0700 Subject: [PATCH 1278/3147] integrate CIDv0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@c3c3c3486cca6a1a6c91090917f33673d0362e84 --- path/path.go | 30 ++++++++++++------------------ path/resolver.go | 14 ++++++-------- path/resolver_test.go | 12 +++--------- 3 files changed, 21 insertions(+), 35 deletions(-) diff --git a/path/path.go b/path/path.go index 790168de09..884c1780d0 100644 --- a/path/path.go +++ b/path/path.go @@ -5,10 +5,7 @@ import ( "path" "strings" - key "github.com/ipfs/go-ipfs/blocks/key" - - b58 "gx/ipfs/QmT8rehPR3F6bmwL6zjUN8XpiDBFFpMP2myPdC6ApsWfJf/go-base58" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted @@ -23,9 +20,9 @@ func FromString(s string) Path { return Path(s) } -// FromKey safely converts a Key type to a Path type -func FromKey(k key.Key) Path { - return Path("/ipfs/" + k.String()) +// FromCid safely converts a cid.Cid type to a Path type +func FromCid(c *cid.Cid) Path { + return Path("/ipfs/" + c.String()) } func (p Path) Segments() []string { @@ -75,7 +72,7 @@ func FromSegments(prefix string, seg ...string) (Path, error) { func ParsePath(txt string) (Path, error) { parts := strings.Split(txt, "/") if len(parts) == 1 { - kp, err := ParseKeyToPath(txt) + kp, err := ParseCidToPath(txt) if err == nil { return kp, nil } @@ -84,7 +81,7 @@ func ParsePath(txt string) (Path, error) { // if the path doesnt being with a '/' // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { - if _, err := ParseKeyToPath(parts[0]); err != nil { + if _, err := ParseCidToPath(parts[0]); err != nil { return "", ErrBadPath } // The case when the path starts with hash without a protocol prefix @@ -96,7 +93,7 @@ func ParsePath(txt string) (Path, error) { } if parts[1] == "ipfs" { - if _, err := ParseKeyToPath(parts[2]); err != nil { + if _, err := ParseCidToPath(parts[2]); err != nil { return "", err } } else if parts[1] != "ipns" { @@ -106,20 +103,17 @@ func ParsePath(txt string) (Path, error) { return Path(txt), nil } -func ParseKeyToPath(txt string) (Path, error) { +func ParseCidToPath(txt string) (Path, error) { if txt == "" { return "", ErrNoComponents } - chk := b58.Decode(txt) - if len(chk) == 0 { - return "", errors.New("not a key") - } - - if _, err := mh.Cast(chk); err != nil { + c, err := cid.Decode(txt) + if err != nil { return "", err } - return FromKey(key.Key(chk)), nil + + return FromCid(c), nil } func (p *Path) IsValid() error { diff --git a/path/resolver.go b/path/resolver.go index a254f456c1..8fc59ac9de 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var log = logging.Logger("path") @@ -38,7 +38,7 @@ type Resolver struct { // SplitAbsPath clean up and split fpath. It extracts the first component (which // must be a Multihash) and return it separately. -func SplitAbsPath(fpath Path) (mh.Multihash, []string, error) { +func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { log.Debugf("Resolve: '%s'", fpath) @@ -52,14 +52,12 @@ func SplitAbsPath(fpath Path) (mh.Multihash, []string, error) { return nil, nil, ErrNoComponents } - // first element in the path is a b58 hash (for now) - h, err := mh.FromB58String(parts[0]) + c, err := cid.Decode(parts[0]) if err != nil { - log.Debug("given path element is not a base58 string.\n") return nil, nil, err } - return h, parts[1:], nil + return c, parts[1:], nil } // ResolvePath fetches the node for given path. It returns the last item @@ -87,7 +85,7 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*me } log.Debug("resolve dag get") - nd, err := s.DAG.Get(ctx, key.Key(h)) + nd, err := s.DAG.Get(ctx, h) if err != nil { return nil, err } @@ -117,7 +115,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names nextnode, err := nd.GetLinkedNode(ctx, s.DAG, name) if err == merkledag.ErrLinkNotFound { - n, _ := nd.Multihash() + n := nd.Multihash() return result, ErrNoLink{Name: name, Node: n} } else if err != nil { return append(result, nextnode), err diff --git a/path/resolver_test.go b/path/resolver_test.go index 735a79e6d2..3a45581ed7 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -17,7 +17,7 @@ func randNode() (*merkledag.Node, key.Key) { node := new(merkledag.Node) node.SetData(make([]byte, 32)) util.NewTimeSeededRand().Read(node.Data()) - k, _ := node.Key() + k := node.Key() return node, k } @@ -46,10 +46,7 @@ func TestRecurivePathResolution(t *testing.T) { } } - aKey, err := a.Key() - if err != nil { - t.Fatal(err) - } + aKey := a.Key() segments := []string{aKey.String(), "child", "grandchild"} p, err := path.FromSegments("/ipfs/", segments...) @@ -63,10 +60,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - key, err := node.Key() - if err != nil { - t.Fatal(err) - } + key := node.Key() if key.String() != cKey.String() { t.Fatal(fmt.Errorf( "recursive path resolution failed for %s: %s != %s", From 4198daa0889773dbdf7863aabaaad0cfbcd40230 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 7 Sep 2016 15:16:21 -0700 Subject: [PATCH 1279/3147] SQUASHME: some cleanup License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@0d2ac7b76050f296e57f81c6ce20be935e89eb7a --- blockservice/blockservice.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index f98c0f96f4..aeea822bfb 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -119,7 +119,6 @@ func (s *BlockService) AddObjects(bs []Object) ([]*cid.Cid, error) { func (s *BlockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", c) - // TODO: blockstore shouldnt care about Cids, need an easier way to strip the abstraction block, err := s.Blockstore.Get(key.Key(c.Hash())) if err == nil { return block, nil @@ -200,11 +199,3 @@ func (s *BlockService) Close() error { log.Debug("blockservice is shutting down...") return s.Exchange.Close() } - -type RawBlockObject struct { - blocks.Block -} - -func (rob *RawBlockObject) Cid() *cid.Cid { - return cid.NewCidV0(rob.Block.Multihash()) -} From d629fb51a49a9e082a321479ede114ebf5502d24 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 8 Sep 2016 12:21:29 -0700 Subject: [PATCH 1280/3147] dht: protect against a panic in case record on pbmessage is nil License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@8298f72590810340ff1f0a0dde68d92f86e8df4e --- routing/dht/dht_test.go | 17 +++++++++++++++-- routing/dht/handlers.go | 10 +++++++--- routing/dht/records.go | 4 ++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 0abc27ed76..3bd8880e07 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -11,14 +11,15 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" netutil "gx/ipfs/QmVCe3SNMjkcPgnpFhZs719dheq6xE7gJwjzV7aWcUM4Ms/go-libp2p/p2p/test/util" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" @@ -826,3 +827,15 @@ func TestConnectCollision(t *testing.T) { dhtB.host.Close() } } + +func TestBadProtoMessages(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + d := setupDHT(ctx, t) + + nilrec := new(pb.Message) + if _, err := d.handlePutValue(ctx, "testpeer", nilrec); err == nil { + t.Fatal("should have errored on nil record") + } +} diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index feaf9aea2f..edb3d90605 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -150,13 +150,17 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess defer log.EventBegin(ctx, "handlePutValue", p).Done() dskey := key.Key(pmes.GetKey()).DsKey() - if err := dht.verifyRecordLocally(pmes.GetRecord()); err != nil { + rec := pmes.GetRecord() + if rec == nil { + log.Infof("Got nil record from: %s", p.Pretty()) + return nil, errors.New("nil record") + } + + if err := dht.verifyRecordLocally(rec); err != nil { log.Warningf("Bad dht record in PUT from: %s. %s", key.Key(pmes.GetRecord().GetAuthor()), err) return nil, err } - rec := pmes.GetRecord() - // record the time we receive every record rec.TimeReceived = proto.String(u.FormatRFC3339(time.Now())) diff --git a/routing/dht/records.go b/routing/dht/records.go index d920e9843e..5714697500 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -107,6 +107,10 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub // verifyRecordLocally attempts to verify a record. if we do not have the public // key, we fail. we do not search the dht. func (dht *IpfsDHT) verifyRecordLocally(r *pb.Record) error { + if r == nil { + log.Error("nil record passed into verifyRecordLocally") + return fmt.Errorf("nil record") + } if len(r.Signature) > 0 { // First, validate the signature From 9cc1041763132edcbcc05f4497fc7ccedee88296 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1281/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-routing@8a1163aba7dee3d822e891cfa4d354a3009156ac --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 4 ++-- routing/dht/dht_test.go | 6 +++--- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 4 ++-- routing/dht/lookup.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/providers/providers.go | 12 ++++++------ routing/dht/providers/providers_test.go | 4 ++-- routing/dht/query.go | 6 +++--- routing/dht/routing.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 6 +++--- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 2 +- routing/offline/offline.go | 4 ++-- routing/record/record.go | 2 +- routing/record/selection.go | 2 +- routing/record/validation.go | 2 +- routing/record/validation_test.go | 2 +- routing/routing.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 4 ++-- routing/supernode/server_test.go | 4 ++-- 28 files changed, 53 insertions(+), 53 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 6de362e13c..2352bebd08 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -9,22 +9,22 @@ import ( "sync" "time" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" providers "github.com/ipfs/go-ipfs/routing/dht/providers" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + goprocessctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" host "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" protocol "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/protocol" ) diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 46f549ab9c..9af9ce142d 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -12,8 +12,8 @@ import ( peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - periodicproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/periodic" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + periodicproc "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/periodic" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 8243d2ed97..8926b6deb2 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -9,13 +9,13 @@ import ( "testing" "time" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" record "github.com/ipfs/go-ipfs/routing/record" ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index bbfe025384..f04214b476 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index b12582a947..97a0c0a1ee 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,10 +5,10 @@ import ( "fmt" "time" - key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 2a279c89ff..6df68a40f6 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -1,10 +1,10 @@ package dht import ( - key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index d7c4dd7d2c..297829d604 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -3,10 +3,10 @@ package dht_pb import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - key "github.com/ipfs/go-ipfs/blocks/key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" ) diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index e48aaccef3..7bd9dc1650 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -6,18 +6,18 @@ import ( "strings" "time" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + goprocessctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" + autobatch "gx/ipfs/QmSp3diFRRv4zR25nHU4MWNCdhT4R6cxrTPLx12MCi1TZb/autobatch" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" - autobatch "gx/ipfs/QmcRHLm2aqDabkpcto1NzLad7YQhH99MGDHSWWvwMxKiZw/autobatch" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" - key "github.com/ipfs/go-ipfs/blocks/key" flags "github.com/ipfs/go-ipfs/flags" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go index 32ede44691..4b74ee6a99 100644 --- a/routing/dht/providers/providers_test.go +++ b/routing/dht/providers/providers_test.go @@ -5,9 +5,9 @@ import ( "testing" "time" - key "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 2b1efb337e..723f60ce82 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,14 +3,14 @@ package dht import ( "sync" - key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" "github.com/ipfs/go-ipfs/routing" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - process "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - ctxproc "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + process "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + ctxproc "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" queue "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore/queue" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index abd9c42ff4..4e40014064 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -7,13 +7,13 @@ import ( "sync" "time" - key "github.com/ipfs/go-ipfs/blocks/key" notif "github.com/ipfs/go-ipfs/notifications" "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" pset "github.com/ipfs/go-ipfs/thirdparty/peerset" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 58cd3c3e3b..0a6da860a4 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -5,10 +5,10 @@ import ( "crypto/sha256" "errors" - key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) // Returned if a routing table query returns no results. This is NOT expected diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 26437b310b..dde11087d1 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,11 +4,11 @@ import ( "errors" "time" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index b7fe52d9a7..91ccbb6c1e 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -5,10 +5,10 @@ import ( "sync" "time" - key "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 3cd8e388a0..4557ea8deb 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -4,9 +4,9 @@ import ( "testing" "time" - key "github.com/ipfs/go-ipfs/blocks/key" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 7e09cdf288..354bc5a9c1 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,9 +3,9 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - sync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" mocknet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net/mock" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index b86e25f067..a816c4793d 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,14 +5,14 @@ package mockrouting import ( - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 2ff9fa68e5..088d8b961f 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -3,13 +3,13 @@ package nilrouting import ( "errors" - key "github.com/ipfs/go-ipfs/blocks/key" repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" p2phost "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 855f35191d..c853e50f95 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,11 +4,11 @@ import ( "errors" "time" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" diff --git a/routing/record/record.go b/routing/record/record.go index 316763f7f7..59b66f68b9 100644 --- a/routing/record/record.go +++ b/routing/record/record.go @@ -5,10 +5,10 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/routing/dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) var log = logging.Logger("routing/record") diff --git a/routing/record/selection.go b/routing/record/selection.go index 8e68006c17..5b1f5bb983 100644 --- a/routing/record/selection.go +++ b/routing/record/selection.go @@ -3,8 +3,8 @@ package record import ( "errors" - key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) // A SelectorFunc selects the best value for the given key from diff --git a/routing/record/validation.go b/routing/record/validation.go index a17e36fad8..65e181fda7 100644 --- a/routing/record/validation.go +++ b/routing/record/validation.go @@ -5,12 +5,12 @@ import ( "errors" "fmt" - key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" pb "github.com/ipfs/go-ipfs/routing/dht/pb" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) // ValidatorFunc is a function that is called to validate a given diff --git a/routing/record/validation_test.go b/routing/record/validation_test.go index 56bf6a8421..175f902d8b 100644 --- a/routing/record/validation_test.go +++ b/routing/record/validation_test.go @@ -4,8 +4,8 @@ import ( "encoding/base64" "testing" - key "github.com/ipfs/go-ipfs/blocks/key" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) var OffensiveKey = "CAASXjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDjXAQQMal4SB2tSnX6NJIPmC69/BT8A8jc7/gDUZNkEhdhYHvc7k7S4vntV/c92nJGxNdop9fKJyevuNMuXhhHAgMBAAE=" diff --git a/routing/routing.go b/routing/routing.go index ad12981f24..56671a7c90 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -4,11 +4,11 @@ package routing import ( "errors" - key "github.com/ipfs/go-ipfs/blocks/key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) // ErrNotFound is returned when a search fails to find anything diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 17839f3aa8..929c1497be 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -5,11 +5,11 @@ import ( "errors" "time" - key "github.com/ipfs/go-ipfs/blocks/key" routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 693fe6bc9b..506514de6d 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -12,10 +12,10 @@ import ( host "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" - key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index f34c5eb2bf..edd451cbb9 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,11 +4,11 @@ import ( "errors" "fmt" - key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - datastore "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 25c54ec32a..4cbc7de6fa 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,9 +3,9 @@ package supernode import ( "testing" - key "github.com/ipfs/go-ipfs/blocks/key" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - datastore "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" + datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 09f8aa4b5bed23a824a8b0ce5b5eb499434ddd54 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1282/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-namesys@f8ba607b41c53f8765c5c940298f7500c265c133 --- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 6 +++--- namesys/routing.go | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 699cc5327a..87c1854cd4 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,9 +6,9 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index 61fa8d6d05..02eff04153 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,11 +6,10 @@ import ( "fmt" "time" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "github.com/ipfs/go-ipfs/blocks/key" dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" @@ -22,6 +21,7 @@ import ( ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 91228ea523..5b03d04bdc 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -5,21 +5,21 @@ import ( "sync" "time" - key "github.com/ipfs/go-ipfs/blocks/key" namesys "github.com/ipfs/go-ipfs/namesys" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/routing" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index be54999eb3..727e4c22ea 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/core" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 57e08ccdbc..e8e1e74b53 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - key "github.com/ipfs/go-ipfs/blocks/key" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index b4eea2af93..31c863fce4 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -10,10 +10,10 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" routing "github.com/ipfs/go-ipfs/routing" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" From a0b7187371952f45c614f91c5c2aab5165dcc4d7 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1283/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-unixfs@c5e8eacaffe660d1847b365a4256f7c8bfdb1fb4 --- unixfs/mod/dagmodifier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 815ac5fc0b..6ea3c31f06 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -18,10 +18,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) func getMockDagServ(t testing.TB) mdag.DAGService { From ad971cd97cedad16dfd933a823946439a36e5cda Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1284/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-pinner@e31be8b47018a9851f787dae99160cfbcbe855d3 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/indirect.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index c1e2eb4718..3e35c2b278 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -2,11 +2,11 @@ package gc import ( bstore "github.com/ipfs/go-ipfs/blocks/blockstore" - key "github.com/ipfs/go-ipfs/blocks/key" bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index 22e3a1fb47..a837d60fd0 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -1,7 +1,7 @@ package pin import ( - key "github.com/ipfs/go-ipfs/blocks/key" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) type indirectPin struct { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 56979cc69f..3e85b894a7 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -8,12 +8,12 @@ import ( "sync" "time" - key "github.com/ipfs/go-ipfs/blocks/key" mdag "github.com/ipfs/go-ipfs/merkledag" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index f1f626f547..af3aa08dab 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -9,10 +9,10 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index eb5cb5d915..acb154e77f 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,11 +10,11 @@ import ( "sort" "unsafe" - "github.com/ipfs/go-ipfs/blocks/key" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index a5e9152d4c..a71cd0db64 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -1,6 +1,6 @@ package pin -import "github.com/ipfs/go-ipfs/blocks/key" +import "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" func ignoreKeys(key.Key) {} From c71be488012b4f9219a493aaa7534d8dd490f509 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1285/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-blockstore@34307018286e3f59845ff9c361bb46de92ddc920 --- blockstore/arc_cache.go | 4 ++-- blockstore/arc_cache_test.go | 6 +++--- blockstore/blockstore.go | 8 ++++---- blockstore/blockstore_test.go | 8 ++++---- blockstore/bloom_cache.go | 2 +- blockstore/bloom_cache_test.go | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 10ef8b01ba..da50bd4700 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -2,11 +2,11 @@ package blockstore import ( "github.com/ipfs/go-ipfs/blocks" - key "github.com/ipfs/go-ipfs/blocks/key" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) type arccache struct { diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index ac61496d29..a8c2227b86 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,11 +4,11 @@ import ( "testing" "github.com/ipfs/go-ipfs/blocks" - "github.com/ipfs/go-ipfs/blocks/key" + "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - syncds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 993d5c6827..45d27d1b50 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -8,13 +8,13 @@ import ( "sync/atomic" blocks "github.com/ipfs/go-ipfs/blocks" - key "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dsns "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/namespace" - dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dsns "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/namespace" + dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 64db91dfe8..096bf34cd3 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,14 +5,14 @@ import ( "fmt" "testing" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" - ds_sync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" + ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" - key "github.com/ipfs/go-ipfs/blocks/key" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index b064b77db3..af8422d0ff 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -4,7 +4,7 @@ import ( "sync/atomic" "github.com/ipfs/go-ipfs/blocks" - key "github.com/ipfs/go-ipfs/blocks/key" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index d9d23341a3..4ce2d01521 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/blocks" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dsq "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/query" - syncds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" + syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) { From cd68af7f789f5d3a6a8a098055c4ffa8d5eec1ee Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1286/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-exchange-interface@27247009d786225eb9aca2e4c39f0e78c9f1a4f4 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 6f246ebc0a..4b40d7390e 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,7 +5,7 @@ import ( "io" blocks "github.com/ipfs/go-ipfs/blocks" - key "github.com/ipfs/go-ipfs/blocks/key" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From 3220e777e3d13503872ead6e057ce44ec9ee8547 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1287/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-exchange-offline@d544161c2652c36bd3447716b2c976aa143a78bf --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index e36d59a67f..b1a6ecb97b 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -5,8 +5,8 @@ package offline import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" - key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 6f1687586b..8eaf751441 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -6,10 +6,10 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - key "github.com/ipfs/go-ipfs/blocks/key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - ds_sync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) func TestBlockReturnsErr(t *testing.T) { From 9ac0ee3bce2d3db8f5735a6f54c04e5f761c8816 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1288/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-mfs@f628ad93956e259741a874dc6115879f1567ee0a --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 13da0358ed..261ec76e1b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -23,10 +23,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) From c709d5f23cb796b7f574188d64e8b7c35a305715 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1289/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-blockservice@3817dda309bd891f7220c11e27d133d43c34d5b3 --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index aeea822bfb..840fa606d6 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -9,8 +9,8 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" - key "github.com/ipfs/go-ipfs/blocks/key" exchange "github.com/ipfs/go-ipfs/exchange" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index a64264dab1..ba67f9f3d0 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -8,14 +8,14 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" - key "github.com/ipfs/go-ipfs/blocks/key" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - ds "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore" - dssync "gx/ipfs/QmNgqJarToRiq2GBaPJhkmW4B5BxS5B74E1rkGvv2JoaTp/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) From ff94c0b372b08d50c52e829f3dce2c62abece8b3 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1290/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-chunker@a9d6959ec26edcdafdf27fc1fe5cdef6b3b3d7f5 --- chunker/rabin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 9b9cfce8fd..99b1bad588 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -4,8 +4,8 @@ import ( "bytes" "fmt" "github.com/ipfs/go-ipfs/blocks" - "github.com/ipfs/go-ipfs/blocks/key" "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" "io" "testing" ) From dfc3375c19832e94b205059ebdb17d299a150e30 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 9 Sep 2016 15:41:28 +0100 Subject: [PATCH 1291/3147] Extract key and datastore License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-path@657dfd3a32c2f89e23e2ec96e6e6e18d81da12e6 --- path/resolver_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver_test.go b/path/resolver_test.go index 3a45581ed7..0d26ff48e0 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -6,11 +6,11 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "github.com/ipfs/go-ipfs/blocks/key" merkledag "github.com/ipfs/go-ipfs/merkledag" dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) func randNode() (*merkledag.Node, key.Key) { From b41609915c110c457ae81959df7d0356defccc45 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 10 Sep 2016 12:57:12 -0700 Subject: [PATCH 1292/3147] dht: add missing protocol ID to newStream call License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@9e32f1a2ad8fcfe879dfcd4cc177ea6922b602d3 --- routing/dht/dht_net.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 92819b4374..a6ae6f7f2e 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -141,7 +141,7 @@ func (ms *messageSender) prep() error { return nil } - nstr, err := ms.dht.host.NewStream(ms.dht.ctx, ms.p, ProtocolDHT) + nstr, err := ms.dht.host.NewStream(ms.dht.ctx, ms.p, ProtocolDHT, ProtocolDHTOld) if err != nil { return err } From 55e82160f833b7f4c7313652b0093f2348c53430 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Sat, 10 Sep 2016 23:00:05 +0100 Subject: [PATCH 1293/3147] Extract thirdparty/loggables License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-routing@54f51ae6047277f893181a4da1501563acd486e8 --- routing/dht/handlers.go | 5 +++-- routing/supernode/client.go | 5 +++-- routing/supernode/proxy/standard.go | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 97a0c0a1ee..2282dfcec4 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -5,11 +5,12 @@ import ( "fmt" "time" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - lgbl "github.com/ipfs/go-ipfs/thirdparty/loggables" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + pb "github.com/ipfs/go-ipfs/routing/dht/pb" + lgbl "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" + pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 929c1497be..eb1392f19c 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -5,11 +5,12 @@ import ( "errors" "time" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 506514de6d..d1f0fafeb7 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -12,10 +12,11 @@ import ( host "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" kbucket "github.com/ipfs/go-ipfs/routing/kbucket" - loggables "github.com/ipfs/go-ipfs/thirdparty/loggables" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" ) const ProtocolSNR = "/ipfs/supernoderouting" From 1f844b0af1a2b378540b03832a12f13288156e49 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Sat, 10 Sep 2016 23:22:17 +0100 Subject: [PATCH 1294/3147] Extract peerset, update peer, peerset, secio, libp2p License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-ipfs-routing@6b3304648211e725e264fd88af904d80f8a0aabc --- routing/dht/dht.go | 8 ++++---- routing/dht/dht_bootstrap.go | 2 +- routing/dht/dht_net.go | 4 ++-- routing/dht/dht_test.go | 6 +++--- routing/dht/ext_test.go | 6 +++--- routing/dht/handlers.go | 4 ++-- routing/dht/lookup.go | 9 +++++---- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 6 +++--- routing/dht/providers/providers.go | 2 +- routing/dht/providers/providers_test.go | 2 +- routing/dht/query.go | 11 ++++++----- routing/dht/records.go | 2 +- routing/dht/routing.go | 11 ++++++----- routing/kbucket/bucket.go | 2 +- routing/kbucket/sorting.go | 2 +- routing/kbucket/table.go | 4 ++-- routing/kbucket/table_test.go | 4 ++-- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 4 ++-- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 6 +++--- routing/offline/offline.go | 4 ++-- routing/routing.go | 4 ++-- routing/supernode/client.go | 6 +++--- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 8 ++++---- routing/supernode/server.go | 4 ++-- 31 files changed, 72 insertions(+), 69 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 43a4a154e5..60d87368b0 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -18,15 +18,15 @@ import ( goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" goprocessctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + host "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" + protocol "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/protocol" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - host "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" - protocol "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/protocol" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("dht") diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go index 9af9ce142d..366939ae2b 100644 --- a/routing/dht/dht_bootstrap.go +++ b/routing/dht/dht_bootstrap.go @@ -9,7 +9,7 @@ import ( "time" routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index a6ae6f7f2e..d9bfc4007d 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,11 +6,11 @@ import ( "time" pb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" + inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" ) var dhtReadMessageTimeout = time.Minute diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 8926b6deb2..265612cec8 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,12 +17,12 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + netutil "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/test/util" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - netutil "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/test/util" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var testCaseValues = map[key.Key][]byte{} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index f04214b476..6f0c6b45e5 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -13,12 +13,12 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" + inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net/mock" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" - mocknet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) func TestGetFailures(t *testing.T) { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index 2282dfcec4..ea539a95d9 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -11,11 +11,11 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" lgbl "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // The number of closer peers to send on requests. diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go index 6df68a40f6..2ff6306cc2 100644 --- a/routing/dht/lookup.go +++ b/routing/dht/lookup.go @@ -1,14 +1,15 @@ package dht import ( + pset "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer/peerset" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + notif "github.com/ipfs/go-ipfs/notifications" kb "github.com/ipfs/go-ipfs/routing/kbucket" - pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // Required in order for proper JSON marshaling diff --git a/routing/dht/notif.go b/routing/dht/notif.go index 4a55724bf4..e123c15b7e 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" + inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 297829d604..a9bc571793 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -3,11 +3,11 @@ package dht_pb import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("dht.pb") diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go index 7bd9dc1650..a34fec6bb9 100644 --- a/routing/dht/providers/providers.go +++ b/routing/dht/providers/providers.go @@ -11,7 +11,7 @@ import ( autobatch "gx/ipfs/QmSp3diFRRv4zR25nHU4MWNCdhT4R6cxrTPLx12MCi1TZb/autobatch" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go index 4b74ee6a99..01cee7b73c 100644 --- a/routing/dht/providers/providers_test.go +++ b/routing/dht/providers/providers_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" diff --git a/routing/dht/query.go b/routing/dht/query.go index 723f60ce82..d17e00e2db 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,20 +3,21 @@ package dht import ( "sync" + pset "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer/peerset" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + notif "github.com/ipfs/go-ipfs/notifications" "github.com/ipfs/go-ipfs/routing" - pset "github.com/ipfs/go-ipfs/thirdparty/peerset" todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" process "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" ctxproc "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - queue "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore/queue" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + queue "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore/queue" ) var maxQueryConcurrency = AlphaValue diff --git a/routing/dht/records.go b/routing/dht/records.go index 0b461382af..af71698610 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -8,7 +8,7 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ctxfrac "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/frac" "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4e40014064..16a497c610 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -7,18 +7,19 @@ import ( "sync" "time" + pset "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer/peerset" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + notif "github.com/ipfs/go-ipfs/notifications" "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" - pset "github.com/ipfs/go-ipfs/thirdparty/peerset" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // asyncQueryBuffer is the size of buffered channels in async queries. This diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 171436279a..d280d91403 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index 19ea84f680..f662640f2e 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" "sort" ) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 47a3228caf..6c4827a32a 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,9 +7,9 @@ import ( "sync" "time" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("table") diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index 115fd34ea3..fb34d9976c 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,8 +7,8 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 0a6da860a4..2722540d63 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -6,7 +6,7 @@ import ( "errors" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index dde11087d1..d6f9218458 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -10,13 +10,13 @@ import ( ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 91ccbb6c1e..b8e95762b0 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -10,9 +10,9 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 4557ea8deb..c66085e620 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 354bc5a9c1..d680cc15bc 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" + mocknet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - mocknet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index a816c4793d..b0c1b14a1e 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,11 +8,11 @@ import ( routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 088d8b961f..571abb0acf 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -5,12 +5,12 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + p2phost "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - p2phost "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index c853e50f95..66564d0ef8 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,12 +10,12 @@ import ( ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("offlinerouting") diff --git a/routing/routing.go b/routing/routing.go index 56671a7c90..6e15bed6fb 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -4,11 +4,11 @@ package routing import ( "errors" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // ErrNotFound is returned when a search fails to find anything diff --git a/routing/supernode/client.go b/routing/supernode/client.go index eb1392f19c..3674bc29d6 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -12,12 +12,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 379527f07b..b3123b00ae 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" - inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index d1f0fafeb7..06bfdb650a 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,11 +6,11 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" - host "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/host" - inet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + host "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" + inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index edd451cbb9..d3473d12da 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,10 +10,10 @@ import ( datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // Server handles routing queries using a database backend From 080d85f95a56617345874e7da59875d5070b3dee Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Sat, 10 Sep 2016 23:22:17 +0100 Subject: [PATCH 1295/3147] Extract peerset, update peer, peerset, secio, libp2p License: MIT Signed-off-by: George Antoniadis This commit was moved from ipfs/go-namesys@33429916d8a779bb07efbbe0ba17eb61c1273d16 --- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 02eff04153..4e634cef00 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,7 +19,7 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 5b03d04bdc..6b91749533 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -14,12 +14,12 @@ import ( goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 727e4c22ea..51f002f076 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d/go-libp2p-peerstore" - mocknet "gx/ipfs/Qmf4ETeAWXuThBfWwonVyFqGFSgTWepUDEr1txcctvpTXS/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index e8e1e74b53..d7fbdf6cac 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8/go-libp2p-peer" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" From 99c970f0123f37984cadfc3cf703b18841919fa3 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 18 Aug 2016 21:09:56 +0200 Subject: [PATCH 1296/3147] test: add basic dagreader test License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@9698163d2a97e5a8546ac9d3b864f5a58404e32d --- unixfs/io/dagserv_test.go | 90 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 unixfs/io/dagserv_test.go diff --git a/unixfs/io/dagserv_test.go b/unixfs/io/dagserv_test.go new file mode 100644 index 0000000000..74da2152a8 --- /dev/null +++ b/unixfs/io/dagserv_test.go @@ -0,0 +1,90 @@ +package io + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "testing" + + "github.com/ipfs/go-ipfs/blocks/blockstore" + bs "github.com/ipfs/go-ipfs/blockservice" + "github.com/ipfs/go-ipfs/exchange/offline" + imp "github.com/ipfs/go-ipfs/importer" + "github.com/ipfs/go-ipfs/importer/chunk" + mdag "github.com/ipfs/go-ipfs/merkledag" + + ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" + "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + +func getMockDagServ(t testing.TB) mdag.DAGService { + dstore := ds.NewMapDatastore() + tsds := sync.MutexWrap(dstore) + bstore := blockstore.NewBlockstore(tsds) + bserv := bs.New(bstore, offline.Exchange(bstore)) + return mdag.NewDAGService(bserv) +} + +func sizeSplitterGen(size int64) chunk.SplitterGen { + return func(r io.Reader) chunk.Splitter { + return chunk.NewSizeSplitter(r, size) + } +} + +func getNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.Node { + in := bytes.NewReader(data) + node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in)) + if err != nil { + t.Fatal(err) + } + + return node +} + +func getRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { + in := io.LimitReader(u.NewTimeSeededRand(), size) + buf, err := ioutil.ReadAll(in) + if err != nil { + t.Fatal(err) + } + + node := getNode(t, dserv, buf) + return buf, node +} + +func arrComp(a, b []byte) error { + if len(a) != len(b) { + return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) + } + for i, v := range a { + if v != b[i] { + return fmt.Errorf("Arrays differ at index: %d", i) + } + } + return nil +} + +func TestBasicRead(t *testing.T) { + dserv := getMockDagServ(t) + inbuf, node := getRandomNode(t, dserv, 1024) + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + outbuf, err := ioutil.ReadAll(reader) + if err != nil { + t.Fatal(err) + } + + err = arrComp(inbuf, outbuf) + if err != nil { + t.Fatal(err) + } +} From 16eb08cc43761ca088a37c97f0454c4d7e0647ef Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 18 Aug 2016 21:33:59 +0200 Subject: [PATCH 1297/3147] test: use mdag/test.Mock() instead License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@ed88094808e1c6c440b2a2e1bbb976cc0354d3e2 --- unixfs/io/dagserv_test.go | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/unixfs/io/dagserv_test.go b/unixfs/io/dagserv_test.go index 74da2152a8..23d01786ed 100644 --- a/unixfs/io/dagserv_test.go +++ b/unixfs/io/dagserv_test.go @@ -7,27 +7,15 @@ import ( "io/ioutil" "testing" - "github.com/ipfs/go-ipfs/blocks/blockstore" - bs "github.com/ipfs/go-ipfs/blockservice" - "github.com/ipfs/go-ipfs/exchange/offline" imp "github.com/ipfs/go-ipfs/importer" "github.com/ipfs/go-ipfs/importer/chunk" mdag "github.com/ipfs/go-ipfs/merkledag" + mdagmock "github.com/ipfs/go-ipfs/merkledag/test" - ds "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) -func getMockDagServ(t testing.TB) mdag.DAGService { - dstore := ds.NewMapDatastore() - tsds := sync.MutexWrap(dstore) - bstore := blockstore.NewBlockstore(tsds) - bserv := bs.New(bstore, offline.Exchange(bstore)) - return mdag.NewDAGService(bserv) -} - func sizeSplitterGen(size int64) chunk.SplitterGen { return func(r io.Reader) chunk.Splitter { return chunk.NewSizeSplitter(r, size) @@ -68,7 +56,7 @@ func arrComp(a, b []byte) error { } func TestBasicRead(t *testing.T) { - dserv := getMockDagServ(t) + dserv := mdagmock.Mock() inbuf, node := getRandomNode(t, dserv, 1024) ctx, closer := context.WithCancel(context.Background()) defer closer() From 740684102363c9d25559fe9ee4bf82892578be26 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 18 Aug 2016 22:34:28 +0200 Subject: [PATCH 1298/3147] test: refactor some utities out of mod package License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@7bd8990644c8d68a03e29553904bea96e1ec3288 --- unixfs/io/dagserv_test.go | 56 +--------- unixfs/mod/dagmodifier_test.go | 189 ++++++++++----------------------- unixfs/test/utils.go | 93 ++++++++++++++++ 3 files changed, 154 insertions(+), 184 deletions(-) create mode 100644 unixfs/test/utils.go diff --git a/unixfs/io/dagserv_test.go b/unixfs/io/dagserv_test.go index 23d01786ed..fca849924a 100644 --- a/unixfs/io/dagserv_test.go +++ b/unixfs/io/dagserv_test.go @@ -1,63 +1,17 @@ package io import ( - "bytes" - "fmt" - "io" "io/ioutil" "testing" - imp "github.com/ipfs/go-ipfs/importer" - "github.com/ipfs/go-ipfs/importer/chunk" - mdag "github.com/ipfs/go-ipfs/merkledag" - mdagmock "github.com/ipfs/go-ipfs/merkledag/test" - - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -func sizeSplitterGen(size int64) chunk.SplitterGen { - return func(r io.Reader) chunk.Splitter { - return chunk.NewSizeSplitter(r, size) - } -} - -func getNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.Node { - in := bytes.NewReader(data) - node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in)) - if err != nil { - t.Fatal(err) - } - - return node -} -func getRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { - in := io.LimitReader(u.NewTimeSeededRand(), size) - buf, err := ioutil.ReadAll(in) - if err != nil { - t.Fatal(err) - } - - node := getNode(t, dserv, buf) - return buf, node -} - -func arrComp(a, b []byte) error { - if len(a) != len(b) { - return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) - } - for i, v := range a { - if v != b[i] { - return fmt.Errorf("Arrays differ at index: %d", i) - } - } - return nil -} + testu "github.com/ipfs/go-ipfs/unixfs/test" +) func TestBasicRead(t *testing.T) { - dserv := mdagmock.Mock() - inbuf, node := getRandomNode(t, dserv, 1024) + dserv := testu.GetDAGServ() + inbuf, node := testu.GetRandomNode(t, dserv, 1024) ctx, closer := context.WithCancel(context.Background()) defer closer() @@ -71,7 +25,7 @@ func TestBasicRead(t *testing.T) { t.Fatal(err) } - err = arrComp(inbuf, outbuf) + err = testu.ArrComp(inbuf, outbuf) if err != nil { t.Fatal(err) } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 6ea3c31f06..56a2f922f4 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -2,7 +2,6 @@ package mod import ( "fmt" - "io" "io/ioutil" "os" "testing" @@ -10,13 +9,12 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" - imp "github.com/ipfs/go-ipfs/importer" - "github.com/ipfs/go-ipfs/importer/chunk" h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + testu "github.com/ipfs/go-ipfs/unixfs/test" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" @@ -24,14 +22,6 @@ import ( "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) -func getMockDagServ(t testing.TB) mdag.DAGService { - dstore := ds.NewMapDatastore() - tsds := sync.MutexWrap(dstore) - bstore := blockstore.NewBlockstore(tsds) - bserv := bs.New(bstore, offline.Exchange(bstore)) - return mdag.NewDAGService(bserv) -} - func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.GCBlockstore) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) @@ -41,26 +31,6 @@ func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.GCBlocks return dserv, bstore } -func getNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { - in := io.LimitReader(u.NewTimeSeededRand(), size) - node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in)) - if err != nil { - t.Fatal(err) - } - - dr, err := uio.NewDagReader(context.Background(), node, dserv) - if err != nil { - t.Fatal(err) - } - - b, err := ioutil.ReadAll(dr) - if err != nil { - t.Fatal(err) - } - - return b, node -} - func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { newdata := make([]byte, size) r := u.NewTimeSeededRand() @@ -100,26 +70,20 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) t.Fatal(err) } - err = arrComp(after, orig) + err = testu.ArrComp(after, orig) if err != nil { t.Fatal(err) } return orig } -func sizeSplitterGen(size int64) chunk.SplitterGen { - return func(r io.Reader) chunk.Splitter { - return chunk.NewSizeSplitter(r, size) - } -} - func TestDagModifierBasic(t *testing.T) { - dserv := getMockDagServ(t) - b, n := getNode(t, dserv, 50000) + dserv := testu.GetDAGServ() + b, n := testu.GetRandomNode(t, dserv, 50000) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -168,13 +132,13 @@ func TestDagModifierBasic(t *testing.T) { } func TestMultiWrite(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -214,20 +178,20 @@ func TestMultiWrite(t *testing.T) { t.Fatal(err) } - err = arrComp(rbuf, data) + err = testu.ArrComp(rbuf, data) if err != nil { t.Fatal(err) } } func TestMultiWriteAndFlush(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -262,20 +226,20 @@ func TestMultiWriteAndFlush(t *testing.T) { t.Fatal(err) } - err = arrComp(rbuf, data) + err = testu.ArrComp(rbuf, data) if err != nil { t.Fatal(err) } } func TestWriteNewFile(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -306,19 +270,19 @@ func TestWriteNewFile(t *testing.T) { t.Fatal(err) } - if err := arrComp(data, towrite); err != nil { + if err := testu.ArrComp(data, towrite); err != nil { t.Fatal(err) } } func TestMultiWriteCoal(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -351,20 +315,20 @@ func TestMultiWriteCoal(t *testing.T) { t.Fatal(err) } - err = arrComp(rbuf, data) + err = testu.ArrComp(rbuf, data) if err != nil { t.Fatal(err) } } func TestLargeWriteChunks(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -390,19 +354,19 @@ func TestLargeWriteChunks(t *testing.T) { t.Fatal(err) } - if err = arrComp(out, data); err != nil { + if err = testu.ArrComp(out, data); err != nil { t.Fatal(err) } } func TestDagTruncate(t *testing.T) { - dserv := getMockDagServ(t) - b, n := getNode(t, dserv, 50000) + dserv := testu.GetDAGServ() + b, n := testu.GetRandomNode(t, dserv, 50000) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -430,7 +394,7 @@ func TestDagTruncate(t *testing.T) { t.Fatal(err) } - if err = arrComp(out, b[:12345]); err != nil { + if err = testu.ArrComp(out, b[:12345]); err != nil { t.Fatal(err) } @@ -464,12 +428,12 @@ func TestDagTruncate(t *testing.T) { } func TestSparseWrite(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -496,18 +460,18 @@ func TestSparseWrite(t *testing.T) { t.Fatal(err) } - if err = arrComp(out, buf); err != nil { + if err = testu.ArrComp(out, buf); err != nil { t.Fatal(err) } } func TestSeekPastEndWrite(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -543,18 +507,18 @@ func TestSeekPastEndWrite(t *testing.T) { t.Fatal(err) } - if err = arrComp(out, buf); err != nil { + if err = testu.ArrComp(out, buf); err != nil { t.Fatal(err) } } func TestRelativeSeek(t *testing.T) { - dserv := getMockDagServ(t) - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -579,13 +543,12 @@ func TestRelativeSeek(t *testing.T) { } func TestInvalidSeek(t *testing.T) { - dserv := getMockDagServ(t) - - _, n := getNode(t, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -597,13 +560,13 @@ func TestInvalidSeek(t *testing.T) { } func TestEndSeek(t *testing.T) { - dserv := getMockDagServ(t) + dserv := testu.GetDAGServ() - _, n := getNode(t, dserv, 0) + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -630,13 +593,13 @@ func TestEndSeek(t *testing.T) { } func TestReadAndSeek(t *testing.T) { - dserv := getMockDagServ(t) + dserv := testu.GetDAGServ() - _, n := getNode(t, dserv, 0) + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -698,13 +661,13 @@ func TestReadAndSeek(t *testing.T) { } func TestCtxRead(t *testing.T) { - dserv := getMockDagServ(t) + dserv := testu.GetDAGServ() - _, n := getNode(t, dserv, 0) + n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } @@ -720,7 +683,7 @@ func TestCtxRead(t *testing.T) { if err != nil { t.Fatal(err) } - err = arrComp(readBuf, []byte{0, 1, 2, 3}) + err = testu.ArrComp(readBuf, []byte{0, 1, 2, 3}) if err != nil { t.Fatal(err) } @@ -730,14 +693,14 @@ func TestCtxRead(t *testing.T) { func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() - dserv := getMockDagServ(b) - _, n := getNode(b, dserv, 0) + dserv := testu.GetDAGServ() + n := testu.GetEmptyNode(b, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() wrsize := 4096 - dagmod, err := NewDagModifier(ctx, n, dserv, sizeSplitterGen(512)) + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { b.Fatal(err) } @@ -756,43 +719,3 @@ func BenchmarkDagmodWrite(b *testing.B) { } } } - -func arrComp(a, b []byte) error { - if len(a) != len(b) { - return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) - } - for i, v := range a { - if v != b[i] { - return fmt.Errorf("Arrays differ at index: %d", i) - } - } - return nil -} - -func printDag(nd *mdag.Node, ds mdag.DAGService, indent int) { - pbd, err := ft.FromBytes(nd.Data()) - if err != nil { - panic(err) - } - - for i := 0; i < indent; i++ { - fmt.Print(" ") - } - fmt.Printf("{size = %d, type = %s, children = %d", pbd.GetFilesize(), pbd.GetType().String(), len(pbd.GetBlocksizes())) - if len(nd.Links) > 0 { - fmt.Println() - } - for _, lnk := range nd.Links { - child, err := lnk.GetNode(context.Background(), ds) - if err != nil { - panic(err) - } - printDag(child, ds, indent+1) - } - if len(nd.Links) > 0 { - for i := 0; i < indent; i++ { - fmt.Print(" ") - } - } - fmt.Println("}") -} diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go new file mode 100644 index 0000000000..e512eeb9d1 --- /dev/null +++ b/unixfs/test/utils.go @@ -0,0 +1,93 @@ +package testu + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "testing" + + imp "github.com/ipfs/go-ipfs/importer" + "github.com/ipfs/go-ipfs/importer/chunk" + mdag "github.com/ipfs/go-ipfs/merkledag" + mdagmock "github.com/ipfs/go-ipfs/merkledag/test" + ft "github.com/ipfs/go-ipfs/unixfs" + + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" +) + +func SizeSplitterGen(size int64) chunk.SplitterGen { + return func(r io.Reader) chunk.Splitter { + return chunk.NewSizeSplitter(r, size) + } +} + +func GetDAGServ() mdag.DAGService { + return mdagmock.Mock() +} + +func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.Node { + in := bytes.NewReader(data) + node, err := imp.BuildTrickleDagFromReader(dserv, SizeSplitterGen(500)(in)) + if err != nil { + t.Fatal(err) + } + + return node +} + +func GetEmptyNode(t testing.TB, dserv mdag.DAGService) *mdag.Node { + return GetNode(t, dserv, []byte{}) +} + +func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { + in := io.LimitReader(u.NewTimeSeededRand(), size) + buf, err := ioutil.ReadAll(in) + if err != nil { + t.Fatal(err) + } + + node := GetNode(t, dserv, buf) + return buf, node +} + +func ArrComp(a, b []byte) error { + if len(a) != len(b) { + return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) + } + for i, v := range a { + if v != b[i] { + return fmt.Errorf("Arrays differ at index: %d", i) + } + } + return nil +} + +func PrintDag(nd *mdag.Node, ds mdag.DAGService, indent int) { + pbd, err := ft.FromBytes(nd.Data()) + if err != nil { + panic(err) + } + + for i := 0; i < indent; i++ { + fmt.Print(" ") + } + fmt.Printf("{size = %d, type = %s, children = %d", pbd.GetFilesize(), pbd.GetType().String(), len(pbd.GetBlocksizes())) + if len(nd.Links) > 0 { + fmt.Println() + } + for _, lnk := range nd.Links { + child, err := lnk.GetNode(context.Background(), ds) + if err != nil { + panic(err) + } + PrintDag(child, ds, indent+1) + } + if len(nd.Links) > 0 { + for i := 0; i < indent; i++ { + fmt.Print(" ") + } + } + fmt.Println("}") +} From 8dc1abd1cd7a6a942904251daddecab29311d492 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 20 Aug 2016 19:05:26 +0200 Subject: [PATCH 1299/3147] test: add absolute seek test move tests to different file License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@03ad2d8ebd9dc74066910106e8091df5646ee012 --- unixfs/io/dagreader_test.go | 75 +++++++++++++++++++++++++++++++++++++ unixfs/io/dagserv_test.go | 32 ---------------- 2 files changed, 75 insertions(+), 32 deletions(-) create mode 100644 unixfs/io/dagreader_test.go delete mode 100644 unixfs/io/dagserv_test.go diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go new file mode 100644 index 0000000000..67d2b01a3b --- /dev/null +++ b/unixfs/io/dagreader_test.go @@ -0,0 +1,75 @@ +package io + +import ( + "io/ioutil" + "os" + "testing" + + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + + testu "github.com/ipfs/go-ipfs/unixfs/test" +) + +func TestBasicRead(t *testing.T) { + dserv := testu.GetDAGServ() + inbuf, node := testu.GetRandomNode(t, dserv, 1024) + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + outbuf, err := ioutil.ReadAll(reader) + if err != nil { + t.Fatal(err) + } + + err = testu.ArrComp(inbuf, outbuf) + if err != nil { + t.Fatal(err) + } +} + +func TestSeekAndRead(t *testing.T) { + dserv := testu.GetDAGServ() + inbuf := make([]byte, 256) + for i := 0; i <= 255; i++ { + inbuf[i] = byte(i) + } + + node := testu.GetNode(t, dserv, inbuf) + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + for i := 255; i >= 0; i-- { + reader.Seek(int64(i), os.SEEK_SET) + out := make([]byte, 1) + + if reader.Offset() != int64(i) { + t.Fatal("expected offset to be increased by one after read") + } + + c, err := reader.Read(out) + if c != 1 { + t.Fatal("reader should have read just one byte") + } + if err != nil { + t.Fatal(err) + } + + if int(out[0]) != i { + t.Fatalf("read %d at index %d, expected %d", out[0], i, i) + } + + if reader.Offset() != int64(i+1) { + t.Fatal("expected offset to be increased by one after read") + } + } +} diff --git a/unixfs/io/dagserv_test.go b/unixfs/io/dagserv_test.go deleted file mode 100644 index fca849924a..0000000000 --- a/unixfs/io/dagserv_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package io - -import ( - "io/ioutil" - "testing" - - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - - testu "github.com/ipfs/go-ipfs/unixfs/test" -) - -func TestBasicRead(t *testing.T) { - dserv := testu.GetDAGServ() - inbuf, node := testu.GetRandomNode(t, dserv, 1024) - ctx, closer := context.WithCancel(context.Background()) - defer closer() - - reader, err := NewDagReader(ctx, node, dserv) - if err != nil { - t.Fatal(err) - } - - outbuf, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - - err = testu.ArrComp(inbuf, outbuf) - if err != nil { - t.Fatal(err) - } -} From aab02713b84426d727a19cdf2451893ad0efde92 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 20 Aug 2016 19:49:36 +0200 Subject: [PATCH 1300/3147] test: add relative seek test to dagreader License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@0cb0052ac79ad0d95d27f10198f61a9bf5473401 --- unixfs/io/dagreader_test.go | 54 ++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 67d2b01a3b..cb8dd399d4 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -50,22 +50,15 @@ func TestSeekAndRead(t *testing.T) { for i := 255; i >= 0; i-- { reader.Seek(int64(i), os.SEEK_SET) - out := make([]byte, 1) if reader.Offset() != int64(i) { t.Fatal("expected offset to be increased by one after read") } - c, err := reader.Read(out) - if c != 1 { - t.Fatal("reader should have read just one byte") - } - if err != nil { - t.Fatal(err) - } + out := readByte(t, reader) - if int(out[0]) != i { - t.Fatalf("read %d at index %d, expected %d", out[0], i, i) + if int(out) != i { + t.Fatalf("read %d at index %d, expected %d", out, i, i) } if reader.Offset() != int64(i+1) { @@ -73,3 +66,44 @@ func TestSeekAndRead(t *testing.T) { } } } + +func TestRelativeSeek(t *testing.T) { + dserv := testu.GetDAGServ() + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + inbuf := make([]byte, 1024) + + for i := 0; i < 256; i++ { + inbuf[i*4] = byte(i) + } + node := testu.GetNode(t, dserv, inbuf) + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + for i := 0; i < 256; i++ { + out := readByte(t, reader) + if int(out) != i { + t.Fatalf("expected to read: %d at %d, read %d", i, reader.Offset(), out) + } + reader.Seek(3, os.SEEK_CUR) + } + +} + +func readByte(t testing.TB, reader *DagReader) byte { + out := make([]byte, 1) + c, err := reader.Read(out) + + if c != 1 { + t.Fatal("reader should have read just one byte") + } + if err != nil { + t.Fatal(err) + } + + return out[0] +} From ce8b477292f81579ccccf6f23caaf256e8269556 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 20 Aug 2016 20:12:19 +0200 Subject: [PATCH 1301/3147] test: add reverse relative seeking test to dagreader License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@03956178f5f102ff320d14c83abb04eada335772 --- unixfs/io/dagreader_test.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index cb8dd399d4..68179a194c 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -77,6 +77,8 @@ func TestRelativeSeek(t *testing.T) { for i := 0; i < 256; i++ { inbuf[i*4] = byte(i) } + + inbuf[1023] = 1 // force the reader to be 1024 bytes node := testu.GetNode(t, dserv, inbuf) reader, err := NewDagReader(ctx, node, dserv) @@ -85,11 +87,35 @@ func TestRelativeSeek(t *testing.T) { } for i := 0; i < 256; i++ { + if reader.Offset() != int64(i*4) { + t.Fatalf("offset should be %d, was %d", i*4, reader.Offset()) + } out := readByte(t, reader) if int(out) != i { - t.Fatalf("expected to read: %d at %d, read %d", i, reader.Offset(), out) + t.Fatalf("expected to read: %d at %d, read %d", i, reader.Offset()-1, out) + } + if i != 255 { + _, err := reader.Seek(3, os.SEEK_CUR) + if err != nil { + t.Fatal(err) + } + } + } + + _, err = reader.Seek(4, os.SEEK_END) + if err != nil { + t.Fatal(err) + } + + for i := 0; i < 256; i++ { + if reader.Offset() != int64(1020-i*4) { + t.Fatalf("offset should be %d, was %d", 1020-i*4, reader.Offset()) + } + out := readByte(t, reader) + if int(out) != 255-i { + t.Fatalf("expected to read: %d at %d, read %d", 255-i, reader.Offset()-1, out) } - reader.Seek(3, os.SEEK_CUR) + reader.Seek(-5, os.SEEK_CUR) // seek 4 bytes but we read one byte every time so 5 bytes } } From b43cea68d752cfc0d1a9888791b05568f8497807 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 21 Aug 2016 00:39:09 +0200 Subject: [PATCH 1302/3147] test: add test for bad node types in dagreader License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@5e98b274828eeaa3f0740b439b73fa09961f054d --- unixfs/io/dagreader.go | 4 +--- unixfs/io/dagreader_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 0648f96001..3b9dfcb287 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -68,9 +68,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag case ftpb.Data_Directory: // Dont allow reading directories return nil, ErrIsDir - case ftpb.Data_Raw: - fallthrough - case ftpb.Data_File: + case ftpb.Data_File, ftpb.Data_Raw: return NewDataFileReader(ctx, n, pb, serv), nil case ftpb.Data_Metadata: if len(n.Links) == 0 { diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 68179a194c..7924683cc6 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -5,6 +5,9 @@ import ( "os" "testing" + mdag "github.com/ipfs/go-ipfs/merkledag" + "github.com/ipfs/go-ipfs/unixfs" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" testu "github.com/ipfs/go-ipfs/unixfs/test" @@ -120,6 +123,27 @@ func TestRelativeSeek(t *testing.T) { } +func TestTypeFailures(t *testing.T) { + dserv := testu.GetDAGServ() + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + node := unixfs.EmptyDirNode() + if _, err := NewDagReader(ctx, node, dserv); err != ErrIsDir { + t.Fatalf("excepted to get %v, got %v", ErrIsDir, err) + } + + data, err := unixfs.SymlinkData("/somelink") + if err != nil { + t.Fatal(err) + } + node = mdag.NodeWithData(data) + + if _, err := NewDagReader(ctx, node, dserv); err != ErrCantReadSymlinks { + t.Fatalf("excepted to get %v, got %v", ErrCantReadSymlinks, err) + } +} + func readByte(t testing.TB, reader *DagReader) byte { out := make([]byte, 1) c, err := reader.Read(out) From 768599b3b0f37af116ffec22ae5a314354fab675 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 21 Aug 2016 00:52:02 +0200 Subject: [PATCH 1303/3147] test: add invialid protobuf data testcase to dagreader License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@600437d88a4497ff7af135bfb2358f2b73736a2c --- unixfs/io/dagreader.go | 2 +- unixfs/io/dagreader_test.go | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 3b9dfcb287..53916aa573 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -131,7 +131,7 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { dr.buf = NewRSNCFromBytes(pb.GetData()) return nil case ftpb.Data_Metadata: - return errors.New("Shouldnt have had metadata object inside file") + return errors.New("shouldnt have had metadata object inside file") case ftpb.Data_Symlink: return errors.New("shouldnt have had symlink inside file") default: diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 7924683cc6..1321da4a65 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -144,6 +144,19 @@ func TestTypeFailures(t *testing.T) { } } +func TestBadPBData(t *testing.T) { + dserv := testu.GetDAGServ() + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + node := mdag.NodeWithData([]byte{42}) + _, err := NewDagReader(ctx, node, dserv) + if err == nil { + t.Fatal("excepted error, got nil") + } + +} + func readByte(t testing.TB, reader *DagReader) byte { out := make([]byte, 1) c, err := reader.Read(out) From da4b66263149fd9905c8a104fc300d6c6297abc0 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 21 Aug 2016 01:11:23 +0200 Subject: [PATCH 1304/3147] test: add metadata node testcase to dagreader.go License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@d76abd44a998c65f6e5ee4c799e19ba58a1c88dd --- unixfs/io/dagreader_test.go | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 1321da4a65..1d147b4c30 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -3,6 +3,7 @@ package io import ( "io/ioutil" "os" + "strings" "testing" mdag "github.com/ipfs/go-ipfs/merkledag" @@ -154,7 +155,46 @@ func TestBadPBData(t *testing.T) { if err == nil { t.Fatal("excepted error, got nil") } +} + +func TestMetadataNode(t *testing.T) { + dserv := testu.GetDAGServ() + rdata, rnode := testu.GetRandomNode(t, dserv, 512) + _, err := dserv.Add(rnode) + if err != nil { + t.Fatal(err) + } + + ctx, closer := context.WithCancel(context.Background()) + defer closer() + data, err := unixfs.BytesForMetadata(&unixfs.Metadata{"text", 125}) + if err != nil { + t.Fatal(err) + } + node := mdag.NodeWithData(data) + + _, err = NewDagReader(ctx, node, dserv) + if err == nil { + t.Fatal("expected an error") + } + if !strings.Contains(err.Error(), "incorrectly formatted") { + t.Fatal("expected different error") + } + + node.AddNodeLink("", rnode) + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + readdata, err := ioutil.ReadAll(reader) + if err != nil { + t.Fatal(err) + } + if err := testu.ArrComp(rdata, readdata); err != nil { + t.Fatal(err) + } } func readByte(t testing.TB, reader *DagReader) byte { From 6f41b4a49fdb156a02b717a8e01d62202d1e0bd7 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 8 Sep 2016 13:28:30 +0200 Subject: [PATCH 1305/3147] test: add unixfs/reader tests for WriteTo and size License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@00edb4c3b579323478b49ae65caad990639e595b --- unixfs/io/dagreader_test.go | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 1d147b4c30..ac8d4d52f9 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -1,6 +1,7 @@ package io import ( + "bytes" "io/ioutil" "os" "strings" @@ -197,6 +198,44 @@ func TestMetadataNode(t *testing.T) { } } +func TestWriteTo(t *testing.T) { + dserv := testu.GetDAGServ() + inbuf, node := testu.GetRandomNode(t, dserv, 1024) + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + outbuf := new(bytes.Buffer) + reader.WriteTo(outbuf) + + err = testu.ArrComp(inbuf, outbuf.Bytes()) + if err != nil { + t.Fatal(err) + } + +} + +func TestReaderSzie(t *testing.T) { + dserv := testu.GetDAGServ() + size := int64(1024) + _, node := testu.GetRandomNode(t, dserv, size) + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + if reader.Size() != uint64(size) { + t.Fatal("wrong reader size") + } +} + func readByte(t testing.TB, reader *DagReader) byte { out := make([]byte, 1) c, err := reader.Read(out) From 0172496225662368202a96840a94be8f5ef19ee6 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 8 Sep 2016 13:40:18 +0200 Subject: [PATCH 1306/3147] test: add dirbuilder tests License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@6c0c4ca0ebf832ac621b9b195ad616bbb7c388a3 --- unixfs/io/dirbuilder_test.go | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 unixfs/io/dirbuilder_test.go diff --git a/unixfs/io/dirbuilder_test.go b/unixfs/io/dirbuilder_test.go new file mode 100644 index 0000000000..80a01d3251 --- /dev/null +++ b/unixfs/io/dirbuilder_test.go @@ -0,0 +1,50 @@ +package io + +import ( + "context" + "io/ioutil" + "testing" + + testu "github.com/ipfs/go-ipfs/unixfs/test" +) + +func TestEmptyNode(t *testing.T) { + n := NewEmptyDirectory() + if len(n.Links) != 0 { + t.Fatal("empty node should have 0 links") + } +} + +func TestDirBuilder(t *testing.T) { + dserv := testu.GetDAGServ() + ctx, closer := context.WithCancel(context.Background()) + defer closer() + inbuf, node := testu.GetRandomNode(t, dserv, 1024) + key := node.Cid() + + b := NewDirectory(dserv) + + b.AddChild(ctx, "random", key) + + dir := b.GetNode() + outn, err := dir.GetLinkedNode(ctx, dserv, "random") + if err != nil { + t.Fatal(err) + } + + reader, err := NewDagReader(ctx, outn, dserv) + if err != nil { + t.Fatal(err) + } + + outbuf, err := ioutil.ReadAll(reader) + if err != nil { + t.Fatal(err) + } + + err = testu.ArrComp(inbuf, outbuf) + if err != nil { + t.Fatal(err) + } + +} From 454fc16915e023917b8df0c19cfb19de961bdb8f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 12 Sep 2016 07:47:04 -0700 Subject: [PATCH 1307/3147] Update libp2p to have fixed spdystream dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@08807bf0da9154d9f6b59a42c000074df65cd436 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 60d87368b0..5615c4d4a5 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -21,11 +21,11 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - host "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" - protocol "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/protocol" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + host "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" + protocol "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/protocol" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index d9bfc4007d..a7052257fa 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -8,9 +8,9 @@ import ( pb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" - inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" ) var dhtReadMessageTimeout = time.Minute diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 265612cec8..b3af1e7308 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -18,10 +18,10 @@ import ( key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - netutil "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/test/util" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + netutil "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/test/util" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 6f0c6b45e5..6454b301fa 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -13,11 +13,11 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net/mock" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index e123c15b7e..e0f8cb9474 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" + inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index a9bc571793..b000abdf2b 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -5,8 +5,8 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 16a497c610..6b7362c051 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -17,8 +17,8 @@ import ( record "github.com/ipfs/go-ipfs/routing/record" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index d680cc15bc..f696402f92 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + mocknet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 571abb0acf..efa69f9ec9 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,9 +7,9 @@ import ( routing "github.com/ipfs/go-ipfs/routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - p2phost "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + p2phost "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 3674bc29d6..bb75a8cd90 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -14,9 +14,9 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index b3123b00ae..cbc67863dd 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -6,7 +6,7 @@ import ( dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" + inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 06bfdb650a..d9440c0146 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -8,8 +8,8 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - host "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/host" - inet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net" + host "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" + inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" From a1ecbd0ea0e08ac516c15087c904c511a9deb12e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 12 Sep 2016 07:47:04 -0700 Subject: [PATCH 1308/3147] Update libp2p to have fixed spdystream dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@4b772b5c495840c3ebabdff2ef790b9b61ebc09b --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 51f002f076..ffae1e0a36 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmXnaDLonE9YBTVDdWBM6Jb5YxxmW1MHMkXzgsnu1jTEmK/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) From 66b1bae970c75c016cdc78bde9d4020cea1388dd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 12 Sep 2016 14:26:55 -0700 Subject: [PATCH 1309/3147] Update libp2p to 3.5.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@4a9d1ad26d858871d2ff1cdeb062553fb9454837 --- routing/dht/dht.go | 4 ++-- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/notif.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 5615c4d4a5..f6ba805d0a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -19,13 +19,13 @@ import ( goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" goprocessctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + host "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" + protocol "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/protocol" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - host "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" - protocol "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/protocol" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index a7052257fa..fc5af65425 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -6,11 +6,11 @@ import ( "time" pb "github.com/ipfs/go-ipfs/routing/dht/pb" + inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" ) var dhtReadMessageTimeout = time.Minute diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index b3af1e7308..8952abec9b 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -17,11 +17,11 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + netutil "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/test/util" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - netutil "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/test/util" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 6454b301fa..d600e83ddb 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -13,11 +13,11 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" + mocknet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/mock" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/notif.go b/routing/dht/notif.go index e0f8cb9474..57a3b8f2cb 100644 --- a/routing/dht/notif.go +++ b/routing/dht/notif.go @@ -3,7 +3,7 @@ package dht import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" + inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" ) // netNotifiee defines methods to be used with the IpfsDHT diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index b000abdf2b..2a6936e4e8 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,9 +4,9 @@ import ( ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 6b7362c051..8b72a17118 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -16,9 +16,9 @@ import ( kb "github.com/ipfs/go-ipfs/routing/kbucket" record "github.com/ipfs/go-ipfs/routing/record" + inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index f696402f92..dfda92770e 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" + mocknet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/mock" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - mocknet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index efa69f9ec9..0142cf1e6e 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "github.com/ipfs/go-ipfs/routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + p2phost "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - p2phost "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index bb75a8cd90..98ad4026e9 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -13,10 +13,10 @@ import ( loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index cbc67863dd..9f47ff5e7b 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -5,8 +5,8 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index d9440c0146..396dc0f9ff 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -7,9 +7,9 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + host "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" + inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - host "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/host" - inet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" From a7493450481eeeb101b8ecb1b139aee52eea6e17 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 12 Sep 2016 14:26:55 -0700 Subject: [PATCH 1310/3147] Update libp2p to 3.5.2 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@d655b1f40d71df6c23ba692c43d608f1f61d7ba9 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index ffae1e0a36..25cdb6ea52 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmcpZpCmnfjRunzeYtXZdtcy16P2mC65CThjb7aA8sPqNY/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) From 71567a15a8b664f2e38a0b62a7fd5eb9dff59a7c Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 5 Sep 2016 17:04:30 +0200 Subject: [PATCH 1311/3147] metrics: add hit counter for ARC and bloom caches License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@60eb42d1217accfa792a07580aaa0cf33f56555d --- blockstore/arc_cache.go | 16 +++++++++++++--- blockstore/arc_cache_test.go | 2 +- blockstore/bloom_cache.go | 11 +++++++++-- blockstore/caching.go | 6 +++++- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index da50bd4700..e2293472fd 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -1,9 +1,11 @@ package blockstore import ( - "github.com/ipfs/go-ipfs/blocks" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + "github.com/ipfs/go-ipfs/blocks" + + "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" @@ -12,15 +14,21 @@ import ( type arccache struct { arc *lru.ARCCache blockstore Blockstore + + hits metrics.Counter + total metrics.Counter } -func arcCached(bs Blockstore, lruSize int) (*arccache, error) { +func newARCCachedBS(bs Blockstore, ctx context.Context, lruSize int) (*arccache, error) { arc, err := lru.NewARC(lruSize) if err != nil { return nil, err } + c := &arccache{arc: arc, blockstore: bs} + c.hits = metrics.NewCtx(ctx, "arc.hits_total", "Number of ARC cache hits").Counter() + c.total = metrics.NewCtx(ctx, "arc_total", "Total number of ARC cache requests").Counter() - return &arccache{arc: arc, blockstore: bs}, nil + return c, nil } func (b *arccache) DeleteBlock(k key.Key) error { @@ -42,6 +50,7 @@ func (b *arccache) DeleteBlock(k key.Key) error { // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained func (b *arccache) hasCached(k key.Key) (has bool, ok bool) { + b.total.Inc() if k == "" { // Return cache invalid so the call to blockstore happens // in case of invalid key and correct error is created. @@ -50,6 +59,7 @@ func (b *arccache) hasCached(k key.Key) (has bool, ok bool) { h, ok := b.arc.Get(k) if ok { + b.hits.Inc() return h.(bool), true } return false, false diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index a8c2227b86..02caf14293 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -140,7 +140,7 @@ func TestGetAndDeleteFalseShortCircuit(t *testing.T) { } func TestArcCreationFailure(t *testing.T) { - if arc, err := arcCached(nil, -1); arc != nil || err == nil { + if arc, err := newARCCachedBS(nil, context.TODO(), -1); arc != nil || err == nil { t.Fatal("expected error and no cache") } } diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index af8422d0ff..79bf81e31f 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -6,6 +6,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + "gx/ipfs/QmVWBQQAz4Cd2XgW9KgQoqXXrU8KJoCb9WCrhWRFVBKvFe/go-metrics-interface" bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) @@ -18,6 +19,10 @@ func bloomCached(bs Blockstore, ctx context.Context, bloomSize, hashCount int) ( return nil, err } bc := &bloomcache{blockstore: bs, bloom: bl} + bc.hits = metrics.NewCtx(ctx, "bloom.hits_total", + "Number of cache hits in bloom cache").Counter() + bc.total = metrics.NewCtx(ctx, "bloom_total", + "Total number of requests to bloom cache").Counter() bc.Invalidate() go bc.Rebuild(ctx) @@ -33,8 +38,8 @@ type bloomcache struct { blockstore Blockstore // Statistics - hits uint64 - misses uint64 + hits metrics.Counter + total metrics.Counter } func (b *bloomcache) Invalidate() { @@ -84,6 +89,7 @@ func (b *bloomcache) DeleteBlock(k key.Key) error { // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { + b.total.Inc() if k == "" { // Return cache invalid so call to blockstore // in case of invalid key is forwarded deeper @@ -92,6 +98,7 @@ func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { if b.BloomActive() { blr := b.bloom.HasTS([]byte(k)) if blr == false { // not contained in bloom is only conclusive answer bloom gives + b.hits.Inc() return false, true } } diff --git a/blockstore/caching.go b/blockstore/caching.go index f691f89f8c..a0c4c27f57 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -3,6 +3,7 @@ package blockstore import ( "errors" + "gx/ipfs/QmVWBQQAz4Cd2XgW9KgQoqXXrU8KJoCb9WCrhWRFVBKvFe/go-metrics-interface" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) @@ -33,11 +34,14 @@ func CachedBlockstore(bs GCBlockstore, if opts.HasBloomFilterSize != 0 && opts.HasBloomFilterHashes == 0 { return nil, errors.New("bloom filter hash count can't be 0 when there is size set") } + + ctx = metrics.CtxSubScope(ctx, "bs.cache") + if opts.HasBloomFilterSize != 0 { cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes) } if opts.HasARCCacheSize > 0 { - cbs, err = arcCached(cbs, opts.HasARCCacheSize) + cbs, err = newARCCachedBS(cbs, ctx, opts.HasARCCacheSize) } return cbs, err From 856460611f9e60fc23f3143579fc17e2dba7f958 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 5 Sep 2016 17:05:36 +0200 Subject: [PATCH 1312/3147] blockstore: move ARC cache below the bloom cache ARC cache is influenced by requests and bloom isn't This means that if bloom is able to remove some requests caching them in ARC is pointless. License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@8966b0c25ab745c6b140c7b53c595ed6bfc3bb98 --- blockstore/caching.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/caching.go b/blockstore/caching.go index a0c4c27f57..8e2c6cad1c 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -37,12 +37,12 @@ func CachedBlockstore(bs GCBlockstore, ctx = metrics.CtxSubScope(ctx, "bs.cache") - if opts.HasBloomFilterSize != 0 { - cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes) - } if opts.HasARCCacheSize > 0 { cbs, err = newARCCachedBS(cbs, ctx, opts.HasARCCacheSize) } + if opts.HasBloomFilterSize != 0 { + cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes) + } return cbs, err } From 8b60e635736ff7892656250e855b0afd011b271b Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 6 Sep 2016 08:03:05 +0200 Subject: [PATCH 1313/3147] blockstore: change order of newARCCachedBS parmaeters so the context is first one License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@c81b3fc927f4e6dc4d76e96ae660b8760fe34c57 --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 2 +- blockstore/caching.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index e2293472fd..5cc2ff4332 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -19,7 +19,7 @@ type arccache struct { total metrics.Counter } -func newARCCachedBS(bs Blockstore, ctx context.Context, lruSize int) (*arccache, error) { +func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, error) { arc, err := lru.NewARC(lruSize) if err != nil { return nil, err diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 02caf14293..eb8086a79b 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -140,7 +140,7 @@ func TestGetAndDeleteFalseShortCircuit(t *testing.T) { } func TestArcCreationFailure(t *testing.T) { - if arc, err := newARCCachedBS(nil, context.TODO(), -1); arc != nil || err == nil { + if arc, err := newARCCachedBS(context.TODO(), nil, -1); arc != nil || err == nil { t.Fatal("expected error and no cache") } } diff --git a/blockstore/caching.go b/blockstore/caching.go index 8e2c6cad1c..08a841d5fd 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -38,7 +38,7 @@ func CachedBlockstore(bs GCBlockstore, ctx = metrics.CtxSubScope(ctx, "bs.cache") if opts.HasARCCacheSize > 0 { - cbs, err = newARCCachedBS(cbs, ctx, opts.HasARCCacheSize) + cbs, err = newARCCachedBS(ctx, cbs, opts.HasARCCacheSize) } if opts.HasBloomFilterSize != 0 { cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize, opts.HasBloomFilterHashes) From 98ea675ee5db7bdf8a8c6d9619c3e581079ad5ed Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 6 Sep 2016 09:17:42 +0200 Subject: [PATCH 1314/3147] blockstore: update bbloom License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@1ba651762884e785a76fd1a1d8c8d265618200b6 --- blockstore/bloom_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 79bf81e31f..0eafb7203e 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -7,8 +7,8 @@ import ( key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" "gx/ipfs/QmVWBQQAz4Cd2XgW9KgQoqXXrU8KJoCb9WCrhWRFVBKvFe/go-metrics-interface" - bloom "gx/ipfs/QmWQ2SJisXwcCLsUXLwYCKSfyExXjFRW2WbBH5sqCUnwX5/bbloom" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) // bloomCached returns Blockstore that caches Has requests using Bloom filter From ea9937ef027397d6c8d5b53ef23fc41d8239ae18 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 6 Sep 2016 09:46:06 +0200 Subject: [PATCH 1315/3147] blockstore: add Bloom fill ratio metric License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@5e08775f0dd24551f5f81850dd6807886ad0df8c --- blockstore/bloom_cache.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 0eafb7203e..03fa58348c 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -2,6 +2,7 @@ package blockstore import ( "sync/atomic" + "time" "github.com/ipfs/go-ipfs/blocks" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" @@ -23,9 +24,25 @@ func bloomCached(bs Blockstore, ctx context.Context, bloomSize, hashCount int) ( "Number of cache hits in bloom cache").Counter() bc.total = metrics.NewCtx(ctx, "bloom_total", "Total number of requests to bloom cache").Counter() + + fill := metrics.NewCtx(ctx, "bloom_fill_ratio", + "Ratio of bloom filter fullnes, (updated once a minute)").Gauge() + bc.Invalidate() go bc.Rebuild(ctx) - + go func() { + <-bc.rebuildChan + t := time.NewTicker(1 * time.Minute) + for { + select { + case <-ctx.Done(): + t.Stop() + return + case <-t.C: + fill.Set(bc.bloom.FillRatio()) + } + } + }() return bc, nil } From fd13a1c87fd5cf68d7132fc3dc129faa84749696 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 7 Sep 2016 18:12:16 +0200 Subject: [PATCH 1316/3147] deps: update go-metrics-interface and -prometheus to 0.1.2 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@704dd8889f872b12f8c9b662a38931ff79f77091 --- blockstore/bloom_cache.go | 2 +- blockstore/caching.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 03fa58348c..1f54e54822 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - "gx/ipfs/QmVWBQQAz4Cd2XgW9KgQoqXXrU8KJoCb9WCrhWRFVBKvFe/go-metrics-interface" + "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/caching.go b/blockstore/caching.go index 08a841d5fd..d482e04595 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -3,7 +3,7 @@ package blockstore import ( "errors" - "gx/ipfs/QmVWBQQAz4Cd2XgW9KgQoqXXrU8KJoCb9WCrhWRFVBKvFe/go-metrics-interface" + "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) From d489239887c4d5a202e1731bd88445cc2c4aa9c6 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 7 Sep 2016 18:32:35 +0200 Subject: [PATCH 1317/3147] metrics: do not run bloom fillrate collector when metrics are inactive License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@1532e2d275f53b2621eb5270623b711699bf282b --- blockstore/bloom_cache.go | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 1f54e54822..9607561cbd 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -25,24 +25,26 @@ func bloomCached(bs Blockstore, ctx context.Context, bloomSize, hashCount int) ( bc.total = metrics.NewCtx(ctx, "bloom_total", "Total number of requests to bloom cache").Counter() - fill := metrics.NewCtx(ctx, "bloom_fill_ratio", - "Ratio of bloom filter fullnes, (updated once a minute)").Gauge() - bc.Invalidate() go bc.Rebuild(ctx) - go func() { - <-bc.rebuildChan - t := time.NewTicker(1 * time.Minute) - for { - select { - case <-ctx.Done(): - t.Stop() - return - case <-t.C: - fill.Set(bc.bloom.FillRatio()) + if metrics.Active() { + go func() { + fill := metrics.NewCtx(ctx, "bloom_fill_ratio", + "Ratio of bloom filter fullnes, (updated once a minute)").Gauge() + + <-bc.rebuildChan + t := time.NewTicker(1 * time.Minute) + for { + select { + case <-ctx.Done(): + t.Stop() + return + case <-t.C: + fill.Set(bc.bloom.FillRatio()) + } } - } - }() + }() + } return bc, nil } From 594bac466383d5ad4a836a61e0354897096ec876 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 21 Aug 2016 09:39:49 -0400 Subject: [PATCH 1318/3147] Pinner: Provide Pinned.String() method and use it in "block rm" License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@7b4ae57ce234a2ae524ce07ca17a91ec49092f2b --- pinning/pinner/pin.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 3e85b894a7..db90346243 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -111,6 +111,26 @@ type Pinned struct { Via *cid.Cid } +func (p Pinned) Pinned() bool { + if p.Mode == NotPinned { + return false + } else { + return true + } +} + +func (p Pinned) String() string { + switch p.Mode { + case NotPinned: + return "not pinned" + case Indirect: + return fmt.Sprintf("pinned via %s", p.Via) + default: + modeStr, _ := PinModeToString(p.Mode) + return fmt.Sprintf("pinned: %s", modeStr) + } +} + // pinner implements the Pinner interface type pinner struct { lock sync.RWMutex From 4e459c018c4dfdeb8ef81452b3bb6c261b3989fe Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 14 Sep 2016 18:45:44 -0400 Subject: [PATCH 1319/3147] "block rm": move core functionally into blockstore_util package Note: this code can not go in the "blockstore" package due to a circular dependency with the "pin" package. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@5ba29b4bf284db659537352f3164f10fe0eec54d --- blockstore/util/remove.go | 100 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 blockstore/util/remove.go diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go new file mode 100644 index 0000000000..21b4e6015b --- /dev/null +++ b/blockstore/util/remove.go @@ -0,0 +1,100 @@ +package blockstore_util + +import ( + "fmt" + "io" + + bs "github.com/ipfs/go-ipfs/blocks/blockstore" + "github.com/ipfs/go-ipfs/pin" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" +) + +type RemovedBlock struct { + Hash string `json:",omitempty"` + Error string `json:",omitempty"` +} + +type RmBlocksOpts struct { + Prefix string + Quiet bool + Force bool +} + +func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid, opts RmBlocksOpts) error { + go func() { + defer close(out) + + unlocker := blocks.GCLock() + defer unlocker.Unlock() + + stillOkay, err := checkIfPinned(pins, cids, out) + if err != nil { + out <- &RemovedBlock{Error: fmt.Sprintf("pin check failed: %s", err)} + return + } + + for _, c := range stillOkay { + err := blocks.DeleteBlock(key.Key(c.Hash())) + if err != nil && opts.Force && (err == bs.ErrNotFound || err == ds.ErrNotFound) { + // ignore non-existent blocks + } else if err != nil { + out <- &RemovedBlock{Hash: c.String(), Error: err.Error()} + } else if !opts.Quiet { + out <- &RemovedBlock{Hash: c.String()} + } + } + }() + return nil +} + +func checkIfPinned(pins pin.Pinner, cids []*cid.Cid, out chan<- interface{}) ([]*cid.Cid, error) { + stillOkay := make([]*cid.Cid, 0, len(cids)) + res, err := pins.CheckIfPinned(cids...) + if err != nil { + return nil, err + } + for _, r := range res { + if !r.Pinned() { + stillOkay = append(stillOkay, r.Key) + } else { + out <- &RemovedBlock{ + Hash: r.Key.String(), + Error: r.String(), + } + } + } + return stillOkay, nil +} + +type RmError struct { + Fatal bool + Msg string +} + +func (err RmError) Error() string { return err.Msg } + +func ProcRmOutput(in <-chan interface{}, sout io.Writer, serr io.Writer) *RmError { + someFailed := false + for res := range in { + r := res.(*RemovedBlock) + if r.Hash == "" && r.Error != "" { + return &RmError{ + Fatal: true, + Msg: fmt.Sprintf("aborted: %s", r.Error), + } + } else if r.Error != "" { + someFailed = true + fmt.Fprintf(serr, "cannot remove %s: %s\n", r.Hash, r.Error) + } else { + fmt.Fprintf(sout, "removed %s\n", r.Hash) + } + } + if someFailed { + return &RmError{ + Msg: fmt.Sprintf("some blocks not removed"), + } + } + return nil +} From b2bb98494ad215c17614ad6917cb2934e5ba9377 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 15 Sep 2016 04:11:02 -0400 Subject: [PATCH 1320/3147] "block rm": just return "error" in ProcRmOutput License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@45deaaa5882f2abf9e2865ed6f2ddf5831f978c8 --- blockstore/util/remove.go | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 21b4e6015b..5b79c09f81 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -68,22 +68,12 @@ func checkIfPinned(pins pin.Pinner, cids []*cid.Cid, out chan<- interface{}) ([] return stillOkay, nil } -type RmError struct { - Fatal bool - Msg string -} - -func (err RmError) Error() string { return err.Msg } - -func ProcRmOutput(in <-chan interface{}, sout io.Writer, serr io.Writer) *RmError { +func ProcRmOutput(in <-chan interface{}, sout io.Writer, serr io.Writer) error { someFailed := false for res := range in { r := res.(*RemovedBlock) if r.Hash == "" && r.Error != "" { - return &RmError{ - Fatal: true, - Msg: fmt.Sprintf("aborted: %s", r.Error), - } + return fmt.Errorf("aborted: %s", r.Error) } else if r.Error != "" { someFailed = true fmt.Fprintf(serr, "cannot remove %s: %s\n", r.Hash, r.Error) @@ -92,9 +82,7 @@ func ProcRmOutput(in <-chan interface{}, sout io.Writer, serr io.Writer) *RmErro } } if someFailed { - return &RmError{ - Msg: fmt.Sprintf("some blocks not removed"), - } + return fmt.Errorf("some blocks not removed") } return nil } From 6123b397ef5b0019a00065ac05b95cd50dd135aa Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 15 Sep 2016 13:41:07 -0400 Subject: [PATCH 1321/3147] "block rm": Document RemovedBlock. Interface tweaks. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@a27132a405a5cf349d8198bcf8abc6f8365c46c5 --- blockstore/util/remove.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 5b79c09f81..c7db675a8c 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -11,6 +11,12 @@ import ( cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) +// RemovedBlock is used to respresent the result of removing a block. +// If a block was removed successfully than the Error string will be +// empty. If a block could not be removed than Error will contain the +// reason the block could not be removed. If the removal was aborted +// due to a fatal error Hash will be be empty, Error will contain the +// reason, and no more results will be sent. type RemovedBlock struct { Hash string `json:",omitempty"` Error string `json:",omitempty"` @@ -29,11 +35,7 @@ func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, out chan<- interface{}, c unlocker := blocks.GCLock() defer unlocker.Unlock() - stillOkay, err := checkIfPinned(pins, cids, out) - if err != nil { - out <- &RemovedBlock{Error: fmt.Sprintf("pin check failed: %s", err)} - return - } + stillOkay := FilterPinned(pins, out, cids) for _, c := range stillOkay { err := blocks.DeleteBlock(key.Key(c.Hash())) @@ -49,11 +51,12 @@ func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, out chan<- interface{}, c return nil } -func checkIfPinned(pins pin.Pinner, cids []*cid.Cid, out chan<- interface{}) ([]*cid.Cid, error) { +func FilterPinned(pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid) []*cid.Cid { stillOkay := make([]*cid.Cid, 0, len(cids)) res, err := pins.CheckIfPinned(cids...) if err != nil { - return nil, err + out <- &RemovedBlock{Error: fmt.Sprintf("pin check failed: %s", err)} + return nil } for _, r := range res { if !r.Pinned() { @@ -65,7 +68,7 @@ func checkIfPinned(pins pin.Pinner, cids []*cid.Cid, out chan<- interface{}) ([] } } } - return stillOkay, nil + return stillOkay } func ProcRmOutput(in <-chan interface{}, sout io.Writer, serr io.Writer) error { From 6036f08fa6e991ad0f5018ffaccca04823ea45c3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 13 Sep 2016 15:17:07 -0700 Subject: [PATCH 1322/3147] routing: use extracted dht and routing code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@cac3e7b96ac8f6fce81c82e57db51843f11efca2 --- routing/dht/dht.go | 342 ---------- routing/dht/dht_bootstrap.go | 182 ------ routing/dht/dht_net.go | 250 ------- routing/dht/dht_test.go | 828 ------------------------ routing/dht/ext_test.go | 290 --------- routing/dht/handlers.go | 288 --------- routing/dht/lookup.go | 112 ---- routing/dht/notif.go | 39 -- routing/dht/pb/Makefile | 11 - routing/dht/pb/dht.pb.go | 272 -------- routing/dht/pb/dht.proto | 81 --- routing/dht/pb/message.go | 185 ------ routing/dht/pb/message_test.go | 15 - routing/dht/providers/providers.go | 353 ---------- routing/dht/providers/providers_test.go | 150 ----- routing/dht/query.go | 298 --------- routing/dht/records.go | 149 ----- routing/dht/routing.go | 538 --------------- routing/dht/util.go | 39 -- routing/kbucket/bucket.go | 108 ---- routing/kbucket/sorting.go | 55 -- routing/kbucket/table.go | 225 ------- routing/kbucket/table_test.go | 187 ------ routing/kbucket/util.go | 63 -- routing/keyspace/keyspace.go | 97 --- routing/keyspace/xor.go | 67 -- routing/keyspace/xor_test.go | 122 ---- routing/mock/centralized_client.go | 8 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 3 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 6 +- routing/record/record.go | 48 -- routing/record/selection.go | 40 -- routing/record/validation.go | 114 ---- routing/record/validation_test.go | 35 - routing/routing.go | 105 --- routing/supernode/client.go | 30 +- routing/supernode/proxy/loopback.go | 7 +- routing/supernode/proxy/standard.go | 4 +- routing/supernode/server.go | 17 +- routing/supernode/server_test.go | 2 +- 42 files changed, 41 insertions(+), 5728 deletions(-) delete mode 100644 routing/dht/dht.go delete mode 100644 routing/dht/dht_bootstrap.go delete mode 100644 routing/dht/dht_net.go delete mode 100644 routing/dht/dht_test.go delete mode 100644 routing/dht/ext_test.go delete mode 100644 routing/dht/handlers.go delete mode 100644 routing/dht/lookup.go delete mode 100644 routing/dht/notif.go delete mode 100644 routing/dht/pb/Makefile delete mode 100644 routing/dht/pb/dht.pb.go delete mode 100644 routing/dht/pb/dht.proto delete mode 100644 routing/dht/pb/message.go delete mode 100644 routing/dht/pb/message_test.go delete mode 100644 routing/dht/providers/providers.go delete mode 100644 routing/dht/providers/providers_test.go delete mode 100644 routing/dht/query.go delete mode 100644 routing/dht/records.go delete mode 100644 routing/dht/routing.go delete mode 100644 routing/dht/util.go delete mode 100644 routing/kbucket/bucket.go delete mode 100644 routing/kbucket/sorting.go delete mode 100644 routing/kbucket/table.go delete mode 100644 routing/kbucket/table_test.go delete mode 100644 routing/kbucket/util.go delete mode 100644 routing/keyspace/keyspace.go delete mode 100644 routing/keyspace/xor.go delete mode 100644 routing/keyspace/xor_test.go delete mode 100644 routing/record/record.go delete mode 100644 routing/record/selection.go delete mode 100644 routing/record/validation.go delete mode 100644 routing/record/validation_test.go delete mode 100644 routing/routing.go diff --git a/routing/dht/dht.go b/routing/dht/dht.go deleted file mode 100644 index f6ba805d0a..0000000000 --- a/routing/dht/dht.go +++ /dev/null @@ -1,342 +0,0 @@ -// Package dht implements a distributed hash table that satisfies the ipfs routing -// interface. This DHT is modeled after kademlia with Coral and S/Kademlia modifications. -package dht - -import ( - "bytes" - "errors" - "fmt" - "sync" - "time" - - routing "github.com/ipfs/go-ipfs/routing" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - providers "github.com/ipfs/go-ipfs/routing/dht/providers" - kb "github.com/ipfs/go-ipfs/routing/kbucket" - record "github.com/ipfs/go-ipfs/routing/record" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - goprocessctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - host "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" - protocol "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/protocol" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -var log = logging.Logger("dht") - -var ProtocolDHT protocol.ID = "/ipfs/kad/1.0.0" -var ProtocolDHTOld protocol.ID = "/ipfs/dht" - -// NumBootstrapQueries defines the number of random dht queries to do to -// collect members of the routing table. -const NumBootstrapQueries = 5 - -// TODO. SEE https://github.com/jbenet/node-ipfs/blob/master/submodules/ipfs-dht/index.js - -// IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. -// It is used to implement the base IpfsRouting module. -type IpfsDHT struct { - host host.Host // the network services we need - self peer.ID // Local peer (yourself) - peerstore pstore.Peerstore // Peer Registry - - datastore ds.Datastore // Local data - - routingTable *kb.RoutingTable // Array of routing tables for differently distanced nodes - providers *providers.ProviderManager - - birth time.Time // When this peer started up - diaglock sync.Mutex // lock to make diagnostics work better - - Validator record.Validator // record validator funcs - Selector record.Selector // record selection funcs - - ctx context.Context - proc goprocess.Process - - strmap map[peer.ID]*messageSender - smlk sync.Mutex -} - -// NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, h host.Host, dstore ds.Batching) *IpfsDHT { - dht := new(IpfsDHT) - dht.datastore = dstore - dht.self = h.ID() - dht.peerstore = h.Peerstore() - dht.host = h - - // register for network notifs. - dht.host.Network().Notify((*netNotifiee)(dht)) - - dht.proc = goprocess.WithTeardown(func() error { - // remove ourselves from network notifs. - dht.host.Network().StopNotify((*netNotifiee)(dht)) - return nil - }) - - dht.strmap = make(map[peer.ID]*messageSender) - dht.ctx = ctx - - h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) - h.SetStreamHandler(ProtocolDHTOld, dht.handleNewStream) - dht.providers = providers.NewProviderManager(dht.ctx, dht.self, dstore) - dht.proc.AddChild(dht.providers.Process()) - goprocessctx.CloseAfterContext(dht.proc, ctx) - - dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) - dht.birth = time.Now() - - dht.Validator = make(record.Validator) - dht.Validator["pk"] = record.PublicKeyValidator - - dht.Selector = make(record.Selector) - dht.Selector["pk"] = record.PublicKeySelector - - return dht -} - -// putValueToPeer stores the given key/value pair at the peer 'p' -func (dht *IpfsDHT) putValueToPeer(ctx context.Context, p peer.ID, - key key.Key, rec *pb.Record) error { - - pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(key), 0) - pmes.Record = rec - rpmes, err := dht.sendRequest(ctx, p, pmes) - switch err { - case ErrReadTimeout: - log.Warningf("read timeout: %s %s", p.Pretty(), key) - fallthrough - default: - return err - case nil: - break - } - - if err != nil { - return err - } - - if !bytes.Equal(rpmes.GetRecord().Value, pmes.GetRecord().Value) { - return errors.New("value not put correctly") - } - return nil -} - -var errInvalidRecord = errors.New("received invalid record") - -// getValueOrPeers queries a particular peer p for the value for -// key. It returns either the value or a list of closer peers. -// NOTE: It will update the dht's peerstore with any new addresses -// it finds for the given peer. -func (dht *IpfsDHT) getValueOrPeers(ctx context.Context, p peer.ID, - key key.Key) (*pb.Record, []pstore.PeerInfo, error) { - - pmes, err := dht.getValueSingle(ctx, p, key) - if err != nil { - return nil, nil, err - } - - // Perhaps we were given closer peers - peers := pb.PBPeersToPeerInfos(pmes.GetCloserPeers()) - - if record := pmes.GetRecord(); record != nil { - // Success! We were given the value - log.Debug("getValueOrPeers: got value") - - // make sure record is valid. - err = dht.verifyRecordOnline(ctx, record) - if err != nil { - log.Info("Received invalid record! (discarded)") - // return a sentinal to signify an invalid record was received - err = errInvalidRecord - record = new(pb.Record) - } - return record, peers, err - } - - if len(peers) > 0 { - log.Debug("getValueOrPeers: peers") - return nil, peers, nil - } - - log.Warning("getValueOrPeers: routing.ErrNotFound") - return nil, nil, routing.ErrNotFound -} - -// getValueSingle simply performs the get value RPC with the given parameters -func (dht *IpfsDHT) getValueSingle(ctx context.Context, p peer.ID, - key key.Key) (*pb.Message, error) { - defer log.EventBegin(ctx, "getValueSingle", p, &key).Done() - - pmes := pb.NewMessage(pb.Message_GET_VALUE, string(key), 0) - resp, err := dht.sendRequest(ctx, p, pmes) - switch err { - case nil: - return resp, nil - case ErrReadTimeout: - log.Warningf("read timeout: %s %s", p.Pretty(), key) - fallthrough - default: - return nil, err - } -} - -// getLocal attempts to retrieve the value from the datastore -func (dht *IpfsDHT) getLocal(key key.Key) (*pb.Record, error) { - - log.Debug("getLocal %s", key) - v, err := dht.datastore.Get(key.DsKey()) - if err != nil { - return nil, err - } - log.Debug("found in db") - - byt, ok := v.([]byte) - if !ok { - return nil, errors.New("value stored in datastore not []byte") - } - rec := new(pb.Record) - err = proto.Unmarshal(byt, rec) - if err != nil { - return nil, err - } - - err = dht.verifyRecordLocally(rec) - if err != nil { - log.Debugf("local record verify failed: %s (discarded)", err) - return nil, err - } - - return rec, nil -} - -// getOwnPrivateKey attempts to load the local peers private -// key from the peerstore. -func (dht *IpfsDHT) getOwnPrivateKey() (ci.PrivKey, error) { - sk := dht.peerstore.PrivKey(dht.self) - if sk == nil { - log.Warningf("%s dht cannot get own private key!", dht.self) - return nil, fmt.Errorf("cannot get private key to sign record!") - } - return sk, nil -} - -// putLocal stores the key value pair in the datastore -func (dht *IpfsDHT) putLocal(key key.Key, rec *pb.Record) error { - data, err := proto.Marshal(rec) - if err != nil { - return err - } - - return dht.datastore.Put(key.DsKey(), data) -} - -// Update signals the routingTable to Update its last-seen status -// on the given peer. -func (dht *IpfsDHT) Update(ctx context.Context, p peer.ID) { - log.Event(ctx, "updatePeer", p) - dht.routingTable.Update(p) -} - -// FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in. -func (dht *IpfsDHT) FindLocal(id peer.ID) pstore.PeerInfo { - p := dht.routingTable.Find(id) - if p != "" { - return dht.peerstore.PeerInfo(p) - } - return pstore.PeerInfo{} -} - -// findPeerSingle asks peer 'p' if they know where the peer with id 'id' is -func (dht *IpfsDHT) findPeerSingle(ctx context.Context, p peer.ID, id peer.ID) (*pb.Message, error) { - defer log.EventBegin(ctx, "findPeerSingle", p, id).Done() - - pmes := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) - resp, err := dht.sendRequest(ctx, p, pmes) - switch err { - case nil: - return resp, nil - case ErrReadTimeout: - log.Warningf("read timeout: %s %s", p.Pretty(), id) - fallthrough - default: - return nil, err - } -} - -func (dht *IpfsDHT) findProvidersSingle(ctx context.Context, p peer.ID, key key.Key) (*pb.Message, error) { - defer log.EventBegin(ctx, "findProvidersSingle", p, &key).Done() - - pmes := pb.NewMessage(pb.Message_GET_PROVIDERS, string(key), 0) - resp, err := dht.sendRequest(ctx, p, pmes) - switch err { - case nil: - return resp, nil - case ErrReadTimeout: - log.Warningf("read timeout: %s %s", p.Pretty(), key) - fallthrough - default: - return nil, err - } -} - -// nearestPeersToQuery returns the routing tables closest peers. -func (dht *IpfsDHT) nearestPeersToQuery(pmes *pb.Message, count int) []peer.ID { - key := key.Key(pmes.GetKey()) - closer := dht.routingTable.NearestPeers(kb.ConvertKey(key), count) - return closer -} - -// betterPeerToQuery returns nearestPeersToQuery, but iff closer than self. -func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) []peer.ID { - closer := dht.nearestPeersToQuery(pmes, count) - - // no node? nil - if closer == nil { - return nil - } - - // == to self? thats bad - for _, p := range closer { - if p == dht.self { - log.Debug("attempted to return self! this shouldn't happen...") - return nil - } - } - - var filtered []peer.ID - for _, clp := range closer { - // Dont send a peer back themselves - if p == clp { - continue - } - - filtered = append(filtered, clp) - } - - // ok seems like closer nodes - return filtered -} - -// Context return dht's context -func (dht *IpfsDHT) Context() context.Context { - return dht.ctx -} - -// Process return dht's process -func (dht *IpfsDHT) Process() goprocess.Process { - return dht.proc -} - -// Close calls Process Close -func (dht *IpfsDHT) Close() error { - return dht.proc.Close() -} diff --git a/routing/dht/dht_bootstrap.go b/routing/dht/dht_bootstrap.go deleted file mode 100644 index 366939ae2b..0000000000 --- a/routing/dht/dht_bootstrap.go +++ /dev/null @@ -1,182 +0,0 @@ -// Package dht implements a distributed hash table that satisfies the ipfs routing -// interface. This DHT is modeled after kademlia with Coral and S/Kademlia modifications. -package dht - -import ( - "crypto/rand" - "fmt" - "sync" - "time" - - routing "github.com/ipfs/go-ipfs/routing" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - periodicproc "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/periodic" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -// BootstrapConfig specifies parameters used bootstrapping the DHT. -// -// Note there is a tradeoff between the bootstrap period and the -// number of queries. We could support a higher period with less -// queries. -type BootstrapConfig struct { - Queries int // how many queries to run per period - Period time.Duration // how often to run periodi cbootstrap. - Timeout time.Duration // how long to wait for a bootstrao query to run -} - -var DefaultBootstrapConfig = BootstrapConfig{ - // For now, this is set to 1 query. - // We are currently more interested in ensuring we have a properly formed - // DHT than making sure our dht minimizes traffic. Once we are more certain - // of our implementation's robustness, we should lower this down to 8 or 4. - Queries: 1, - - // For now, this is set to 1 minute, which is a medium period. We are - // We are currently more interested in ensuring we have a properly formed - // DHT than making sure our dht minimizes traffic. - Period: time.Duration(5 * time.Minute), - - Timeout: time.Duration(10 * time.Second), -} - -// Bootstrap ensures the dht routing table remains healthy as peers come and go. -// it builds up a list of peers by requesting random peer IDs. The Bootstrap -// process will run a number of queries each time, and run every time signal fires. -// These parameters are configurable. -// -// As opposed to BootstrapWithConfig, Bootstrap satisfies the routing interface -func (dht *IpfsDHT) Bootstrap(ctx context.Context) error { - proc, err := dht.BootstrapWithConfig(DefaultBootstrapConfig) - if err != nil { - return err - } - - // wait till ctx or dht.Context exits. - // we have to do it this way to satisfy the Routing interface (contexts) - go func() { - defer proc.Close() - select { - case <-ctx.Done(): - case <-dht.Context().Done(): - } - }() - - return nil -} - -// BootstrapWithConfig ensures the dht routing table remains healthy as peers come and go. -// it builds up a list of peers by requesting random peer IDs. The Bootstrap -// process will run a number of queries each time, and run every time signal fires. -// These parameters are configurable. -// -// BootstrapWithConfig returns a process, so the user can stop it. -func (dht *IpfsDHT) BootstrapWithConfig(config BootstrapConfig) (goprocess.Process, error) { - sig := time.Tick(config.Period) - return dht.BootstrapOnSignal(config, sig) -} - -// SignalBootstrap ensures the dht routing table remains healthy as peers come and go. -// it builds up a list of peers by requesting random peer IDs. The Bootstrap -// process will run a number of queries each time, and run every time signal fires. -// These parameters are configurable. -// -// SignalBootstrap returns a process, so the user can stop it. -func (dht *IpfsDHT) BootstrapOnSignal(cfg BootstrapConfig, signal <-chan time.Time) (goprocess.Process, error) { - if cfg.Queries <= 0 { - return nil, fmt.Errorf("invalid number of queries: %d", cfg.Queries) - } - - if signal == nil { - return nil, fmt.Errorf("invalid signal: %v", signal) - } - - proc := periodicproc.Ticker(signal, func(worker goprocess.Process) { - // it would be useful to be able to send out signals of when we bootstrap, too... - // maybe this is a good case for whole module event pub/sub? - - ctx := dht.Context() - if err := dht.runBootstrap(ctx, cfg); err != nil { - log.Warning(err) - // A bootstrapping error is important to notice but not fatal. - } - }) - - return proc, nil -} - -// runBootstrap builds up list of peers by requesting random peer IDs -func (dht *IpfsDHT) runBootstrap(ctx context.Context, cfg BootstrapConfig) error { - bslog := func(msg string) { - log.Debugf("DHT %s dhtRunBootstrap %s -- routing table size: %d", dht.self, msg, dht.routingTable.Size()) - } - bslog("start") - defer bslog("end") - defer log.EventBegin(ctx, "dhtRunBootstrap").Done() - - var merr u.MultiErr - - randomID := func() peer.ID { - // 16 random bytes is not a valid peer id. it may be fine becuase - // the dht will rehash to its own keyspace anyway. - id := make([]byte, 16) - rand.Read(id) - id = u.Hash(id) - return peer.ID(id) - } - - // bootstrap sequentially, as results will compound - ctx, cancel := context.WithTimeout(ctx, cfg.Timeout) - defer cancel() - runQuery := func(ctx context.Context, id peer.ID) { - p, err := dht.FindPeer(ctx, id) - if err == routing.ErrNotFound { - // this isn't an error. this is precisely what we expect. - } else if err != nil { - merr = append(merr, err) - } else { - // woah, actually found a peer with that ID? this shouldn't happen normally - // (as the ID we use is not a real ID). this is an odd error worth logging. - err := fmt.Errorf("Bootstrap peer error: Actually FOUND peer. (%s, %s)", id, p) - log.Warningf("%s", err) - merr = append(merr, err) - } - } - - sequential := true - if sequential { - // these should be parallel normally. but can make them sequential for debugging. - // note that the core/bootstrap context deadline should be extended too for that. - for i := 0; i < cfg.Queries; i++ { - id := randomID() - log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, cfg.Queries, id) - runQuery(ctx, id) - } - - } else { - // note on parallelism here: the context is passed in to the queries, so they - // **should** exit when it exceeds, making this function exit on ctx cancel. - // normally, we should be selecting on ctx.Done() here too, but this gets - // complicated to do with WaitGroup, and doesnt wait for the children to exit. - var wg sync.WaitGroup - for i := 0; i < cfg.Queries; i++ { - wg.Add(1) - go func() { - defer wg.Done() - - id := randomID() - log.Debugf("Bootstrapping query (%d/%d) to random ID: %s", i+1, cfg.Queries, id) - runQuery(ctx, id) - }() - } - wg.Wait() - } - - if len(merr) > 0 { - return merr - } - return nil -} diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go deleted file mode 100644 index fc5af65425..0000000000 --- a/routing/dht/dht_net.go +++ /dev/null @@ -1,250 +0,0 @@ -package dht - -import ( - "fmt" - "sync" - "time" - - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - ctxio "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/io" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -var dhtReadMessageTimeout = time.Minute -var ErrReadTimeout = fmt.Errorf("timed out reading response") - -// handleNewStream implements the inet.StreamHandler -func (dht *IpfsDHT) handleNewStream(s inet.Stream) { - go dht.handleNewMessage(s) -} - -func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { - defer s.Close() - - ctx := dht.Context() - cr := ctxio.NewReader(ctx, s) // ok to use. we defer close stream in this func - cw := ctxio.NewWriter(ctx, s) // ok to use. we defer close stream in this func - r := ggio.NewDelimitedReader(cr, inet.MessageSizeMax) - w := ggio.NewDelimitedWriter(cw) - mPeer := s.Conn().RemotePeer() - - for { - // receive msg - pmes := new(pb.Message) - if err := r.ReadMsg(pmes); err != nil { - log.Debugf("Error unmarshaling data: %s", err) - return - } - - // update the peer (on valid msgs only) - dht.updateFromMessage(ctx, mPeer, pmes) - - // get handler for this msg type. - handler := dht.handlerForMsgType(pmes.GetType()) - if handler == nil { - log.Debug("got back nil handler from handlerForMsgType") - return - } - - // dispatch handler. - rpmes, err := handler(ctx, mPeer, pmes) - if err != nil { - log.Debugf("handle message error: %s", err) - return - } - - // if nil response, return it before serializing - if rpmes == nil { - log.Debug("got back nil response from request") - continue - } - - // send out response msg - if err := w.WriteMsg(rpmes); err != nil { - log.Debugf("send response error: %s", err) - return - } - } -} - -// sendRequest sends out a request, but also makes sure to -// measure the RTT for latency measurements. -func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - - ms := dht.messageSenderForPeer(p) - - start := time.Now() - - rpmes, err := ms.SendRequest(ctx, pmes) - if err != nil { - return nil, err - } - - // update the peer (on valid msgs only) - dht.updateFromMessage(ctx, p, rpmes) - - dht.peerstore.RecordLatency(p, time.Since(start)) - log.Event(ctx, "dhtReceivedMessage", dht.self, p, rpmes) - return rpmes, nil -} - -// sendMessage sends out a message -func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message) error { - - ms := dht.messageSenderForPeer(p) - - if err := ms.SendMessage(ctx, pmes); err != nil { - return err - } - log.Event(ctx, "dhtSentMessage", dht.self, p, pmes) - return nil -} - -func (dht *IpfsDHT) updateFromMessage(ctx context.Context, p peer.ID, mes *pb.Message) error { - dht.Update(ctx, p) - return nil -} - -func (dht *IpfsDHT) messageSenderForPeer(p peer.ID) *messageSender { - dht.smlk.Lock() - defer dht.smlk.Unlock() - - ms, ok := dht.strmap[p] - if !ok { - ms = dht.newMessageSender(p) - dht.strmap[p] = ms - } - - return ms -} - -type messageSender struct { - s inet.Stream - r ggio.ReadCloser - w ggio.WriteCloser - lk sync.Mutex - p peer.ID - dht *IpfsDHT - - singleMes int -} - -func (dht *IpfsDHT) newMessageSender(p peer.ID) *messageSender { - return &messageSender{p: p, dht: dht} -} - -func (ms *messageSender) prep() error { - if ms.s != nil { - return nil - } - - nstr, err := ms.dht.host.NewStream(ms.dht.ctx, ms.p, ProtocolDHT, ProtocolDHTOld) - if err != nil { - return err - } - - ms.r = ggio.NewDelimitedReader(nstr, inet.MessageSizeMax) - ms.w = ggio.NewDelimitedWriter(nstr) - ms.s = nstr - - return nil -} - -// streamReuseTries is the number of times we will try to reuse a stream to a -// given peer before giving up and reverting to the old one-message-per-stream -// behaviour. -const streamReuseTries = 3 - -func (ms *messageSender) SendMessage(ctx context.Context, pmes *pb.Message) error { - ms.lk.Lock() - defer ms.lk.Unlock() - if err := ms.prep(); err != nil { - return err - } - - if err := ms.writeMessage(pmes); err != nil { - return err - } - - if ms.singleMes > streamReuseTries { - ms.s.Close() - ms.s = nil - } - - return nil -} - -func (ms *messageSender) writeMessage(pmes *pb.Message) error { - err := ms.w.WriteMsg(pmes) - if err != nil { - // If the other side isnt expecting us to be reusing streams, we're gonna - // end up erroring here. To make sure things work seamlessly, lets retry once - // before continuing - - log.Infof("error writing message: ", err) - ms.s.Close() - ms.s = nil - if err := ms.prep(); err != nil { - return err - } - - if err := ms.w.WriteMsg(pmes); err != nil { - return err - } - - // keep track of this happening. If it happens a few times, its - // likely we can assume the otherside will never support stream reuse - ms.singleMes++ - } - return nil -} - -func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb.Message, error) { - ms.lk.Lock() - defer ms.lk.Unlock() - if err := ms.prep(); err != nil { - return nil, err - } - - if err := ms.writeMessage(pmes); err != nil { - return nil, err - } - - log.Event(ctx, "dhtSentMessage", ms.dht.self, ms.p, pmes) - - mes := new(pb.Message) - if err := ms.ctxReadMsg(ctx, mes); err != nil { - ms.s.Close() - ms.s = nil - return nil, err - } - - if ms.singleMes > streamReuseTries { - ms.s.Close() - ms.s = nil - } - - return mes, nil -} - -func (ms *messageSender) ctxReadMsg(ctx context.Context, mes *pb.Message) error { - errc := make(chan error, 1) - go func(r ggio.ReadCloser) { - errc <- r.ReadMsg(mes) - }(ms.r) - - t := time.NewTimer(dhtReadMessageTimeout) - defer t.Stop() - - select { - case err := <-errc: - return err - case <-ctx.Done(): - return ctx.Err() - case <-t.C: - return ErrReadTimeout - } -} diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go deleted file mode 100644 index 8952abec9b..0000000000 --- a/routing/dht/dht_test.go +++ /dev/null @@ -1,828 +0,0 @@ -package dht - -import ( - "bytes" - "fmt" - "math/rand" - "sort" - "sync" - "testing" - "time" - - routing "github.com/ipfs/go-ipfs/routing" - record "github.com/ipfs/go-ipfs/routing/record" - ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" - travisci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci/travis" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - netutil "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/test/util" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -var testCaseValues = map[key.Key][]byte{} - -func init() { - testCaseValues["hello"] = []byte("world") - for i := 0; i < 100; i++ { - k := fmt.Sprintf("%d -- key", i) - v := fmt.Sprintf("%d -- value", i) - testCaseValues[key.Key(k)] = []byte(v) - } -} - -func setupDHT(ctx context.Context, t *testing.T) *IpfsDHT { - h := netutil.GenHostSwarm(t, ctx) - - dss := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, h, dss) - - d.Validator["v"] = &record.ValidChecker{ - Func: func(key.Key, []byte) error { - return nil - }, - Sign: false, - } - return d -} - -func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.ID, []*IpfsDHT) { - addrs := make([]ma.Multiaddr, n) - dhts := make([]*IpfsDHT, n) - peers := make([]peer.ID, n) - - sanityAddrsMap := make(map[string]struct{}) - sanityPeersMap := make(map[string]struct{}) - - for i := 0; i < n; i++ { - dhts[i] = setupDHT(ctx, t) - peers[i] = dhts[i].self - addrs[i] = dhts[i].peerstore.Addrs(dhts[i].self)[0] - - if _, lol := sanityAddrsMap[addrs[i].String()]; lol { - t.Fatal("While setting up DHTs address got duplicated.") - } else { - sanityAddrsMap[addrs[i].String()] = struct{}{} - } - if _, lol := sanityPeersMap[peers[i].String()]; lol { - t.Fatal("While setting up DHTs peerid got duplicated.") - } else { - sanityPeersMap[peers[i].String()] = struct{}{} - } - } - - return addrs, peers, dhts -} - -func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) { - - idB := b.self - addrB := b.peerstore.Addrs(idB) - if len(addrB) == 0 { - t.Fatal("peers setup incorrectly: no local address") - } - - a.peerstore.AddAddrs(idB, addrB, pstore.TempAddrTTL) - pi := pstore.PeerInfo{ID: idB} - if err := a.host.Connect(ctx, pi); err != nil { - t.Fatal(err) - } - - // loop until connection notification has been received. - // under high load, this may not happen as immediately as we would like. - for a.routingTable.Find(b.self) == "" { - time.Sleep(time.Millisecond * 5) - } - - for b.routingTable.Find(a.self) == "" { - time.Sleep(time.Millisecond * 5) - } -} - -func bootstrap(t *testing.T, ctx context.Context, dhts []*IpfsDHT) { - - ctx, cancel := context.WithCancel(ctx) - log.Debugf("Bootstrapping DHTs...") - - // tried async. sequential fares much better. compare: - // 100 async https://gist.github.com/jbenet/56d12f0578d5f34810b2 - // 100 sync https://gist.github.com/jbenet/6c59e7c15426e48aaedd - // probably because results compound - - var cfg BootstrapConfig - cfg = DefaultBootstrapConfig - cfg.Queries = 3 - - start := rand.Intn(len(dhts)) // randomize to decrease bias. - for i := range dhts { - dht := dhts[(start+i)%len(dhts)] - dht.runBootstrap(ctx, cfg) - } - cancel() -} - -func TestValueGetSet(t *testing.T) { - // t.Skip("skipping test to debug another") - - ctx := context.Background() - - dhtA := setupDHT(ctx, t) - dhtB := setupDHT(ctx, t) - - defer dhtA.Close() - defer dhtB.Close() - defer dhtA.host.Close() - defer dhtB.host.Close() - - vf := &record.ValidChecker{ - Func: func(key.Key, []byte) error { - return nil - }, - Sign: false, - } - nulsel := func(_ key.Key, bs [][]byte) (int, error) { - return 0, nil - } - - dhtA.Validator["v"] = vf - dhtB.Validator["v"] = vf - dhtA.Selector["v"] = nulsel - dhtB.Selector["v"] = nulsel - - connect(t, ctx, dhtA, dhtB) - - ctxT, _ := context.WithTimeout(ctx, time.Second) - dhtA.PutValue(ctxT, "/v/hello", []byte("world")) - - ctxT, _ = context.WithTimeout(ctx, time.Second*2) - val, err := dhtA.GetValue(ctxT, "/v/hello") - if err != nil { - t.Fatal(err) - } - - if string(val) != "world" { - t.Fatalf("Expected 'world' got '%s'", string(val)) - } - - ctxT, _ = context.WithTimeout(ctx, time.Second*2) - val, err = dhtB.GetValue(ctxT, "/v/hello") - if err != nil { - t.Fatal(err) - } - - if string(val) != "world" { - t.Fatalf("Expected 'world' got '%s'", string(val)) - } -} - -func TestProvides(t *testing.T) { - // t.Skip("skipping test to debug another") - ctx := context.Background() - - _, _, dhts := setupDHTS(ctx, 4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Close() - defer dhts[i].host.Close() - } - }() - - connect(t, ctx, dhts[0], dhts[1]) - connect(t, ctx, dhts[1], dhts[2]) - connect(t, ctx, dhts[1], dhts[3]) - - for k, v := range testCaseValues { - log.Debugf("adding local values for %s = %s", k, v) - sk := dhts[3].peerstore.PrivKey(dhts[3].self) - rec, err := record.MakePutRecord(sk, k, v, false) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].putLocal(k, rec) - if err != nil { - t.Fatal(err) - } - - bits, err := dhts[3].getLocal(k) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(bits.GetValue(), v) { - t.Fatalf("didn't store the right bits (%s, %s)", k, v) - } - } - - for k := range testCaseValues { - log.Debugf("announcing provider for %s", k) - if err := dhts[3].Provide(ctx, k); err != nil { - t.Fatal(err) - } - } - - // what is this timeout for? was 60ms before. - time.Sleep(time.Millisecond * 6) - - n := 0 - for k := range testCaseValues { - n = (n + 1) % 3 - - log.Debugf("getting providers for %s from %d", k, n) - ctxT, _ := context.WithTimeout(ctx, time.Second) - provchan := dhts[n].FindProvidersAsync(ctxT, k, 1) - - select { - case prov := <-provchan: - if prov.ID == "" { - t.Fatal("Got back nil provider") - } - if prov.ID != dhts[3].self { - t.Fatal("Got back wrong provider") - } - case <-ctxT.Done(): - t.Fatal("Did not get a provider back.") - } - } -} - -// if minPeers or avgPeers is 0, dont test for it. -func waitForWellFormedTables(t *testing.T, dhts []*IpfsDHT, minPeers, avgPeers int, timeout time.Duration) bool { - // test "well-formed-ness" (>= minPeers peers in every routing table) - - checkTables := func() bool { - totalPeers := 0 - for _, dht := range dhts { - rtlen := dht.routingTable.Size() - totalPeers += rtlen - if minPeers > 0 && rtlen < minPeers { - t.Logf("routing table for %s only has %d peers (should have >%d)", dht.self, rtlen, minPeers) - return false - } - } - actualAvgPeers := totalPeers / len(dhts) - t.Logf("avg rt size: %d", actualAvgPeers) - if avgPeers > 0 && actualAvgPeers < avgPeers { - t.Logf("avg rt size: %d < %d", actualAvgPeers, avgPeers) - return false - } - return true - } - - timeoutA := time.After(timeout) - for { - select { - case <-timeoutA: - log.Debugf("did not reach well-formed routing tables by %s", timeout) - return false // failed - case <-time.After(5 * time.Millisecond): - if checkTables() { - return true // succeeded - } - } - } -} - -func printRoutingTables(dhts []*IpfsDHT) { - // the routing tables should be full now. let's inspect them. - fmt.Printf("checking routing table of %d\n", len(dhts)) - for _, dht := range dhts { - fmt.Printf("checking routing table of %s\n", dht.self) - dht.routingTable.Print() - fmt.Println("") - } -} - -func TestBootstrap(t *testing.T) { - // t.Skip("skipping test to debug another") - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - - nDHTs := 30 - _, _, dhts := setupDHTS(ctx, nDHTs, t) - defer func() { - for i := 0; i < nDHTs; i++ { - dhts[i].Close() - defer dhts[i].host.Close() - } - }() - - t.Logf("connecting %d dhts in a ring", nDHTs) - for i := 0; i < nDHTs; i++ { - connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) - } - - <-time.After(100 * time.Millisecond) - // bootstrap a few times until we get good tables. - stop := make(chan struct{}) - go func() { - for { - t.Logf("bootstrapping them so they find each other", nDHTs) - ctxT, _ := context.WithTimeout(ctx, 5*time.Second) - bootstrap(t, ctxT, dhts) - - select { - case <-time.After(50 * time.Millisecond): - continue // being explicit - case <-stop: - return - } - } - }() - - waitForWellFormedTables(t, dhts, 7, 10, 20*time.Second) - close(stop) - - if u.Debug { - // the routing tables should be full now. let's inspect them. - printRoutingTables(dhts) - } -} - -func TestPeriodicBootstrap(t *testing.T) { - // t.Skip("skipping test to debug another") - if ci.IsRunning() { - t.Skip("skipping on CI. highly timing dependent") - } - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - - nDHTs := 30 - _, _, dhts := setupDHTS(ctx, nDHTs, t) - defer func() { - for i := 0; i < nDHTs; i++ { - dhts[i].Close() - defer dhts[i].host.Close() - } - }() - - // signal amplifier - amplify := func(signal chan time.Time, other []chan time.Time) { - for t := range signal { - for _, s := range other { - s <- t - } - } - for _, s := range other { - close(s) - } - } - - signal := make(chan time.Time) - allSignals := []chan time.Time{} - - var cfg BootstrapConfig - cfg = DefaultBootstrapConfig - cfg.Queries = 5 - - // kick off periodic bootstrappers with instrumented signals. - for _, dht := range dhts { - s := make(chan time.Time) - allSignals = append(allSignals, s) - dht.BootstrapOnSignal(cfg, s) - } - go amplify(signal, allSignals) - - t.Logf("dhts are not connected.", nDHTs) - for _, dht := range dhts { - rtlen := dht.routingTable.Size() - if rtlen > 0 { - t.Errorf("routing table for %s should have 0 peers. has %d", dht.self, rtlen) - } - } - - for i := 0; i < nDHTs; i++ { - connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) - } - - t.Logf("DHTs are now connected to 1-2 others.", nDHTs) - for _, dht := range dhts { - rtlen := dht.routingTable.Size() - if rtlen > 2 { - t.Errorf("routing table for %s should have at most 2 peers. has %d", dht.self, rtlen) - } - } - - if u.Debug { - printRoutingTables(dhts) - } - - t.Logf("bootstrapping them so they find each other", nDHTs) - signal <- time.Now() - - // this is async, and we dont know when it's finished with one cycle, so keep checking - // until the routing tables look better, or some long timeout for the failure case. - waitForWellFormedTables(t, dhts, 7, 10, 20*time.Second) - - if u.Debug { - printRoutingTables(dhts) - } -} - -func TestProvidesMany(t *testing.T) { - t.Skip("this test doesn't work") - // t.Skip("skipping test to debug another") - ctx := context.Background() - - nDHTs := 40 - _, _, dhts := setupDHTS(ctx, nDHTs, t) - defer func() { - for i := 0; i < nDHTs; i++ { - dhts[i].Close() - defer dhts[i].host.Close() - } - }() - - t.Logf("connecting %d dhts in a ring", nDHTs) - for i := 0; i < nDHTs; i++ { - connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)]) - } - - <-time.After(100 * time.Millisecond) - t.Logf("bootstrapping them so they find each other", nDHTs) - ctxT, _ := context.WithTimeout(ctx, 20*time.Second) - bootstrap(t, ctxT, dhts) - - if u.Debug { - // the routing tables should be full now. let's inspect them. - t.Logf("checking routing table of %d", nDHTs) - for _, dht := range dhts { - fmt.Printf("checking routing table of %s\n", dht.self) - dht.routingTable.Print() - fmt.Println("") - } - } - - var providers = map[key.Key]peer.ID{} - - d := 0 - for k, v := range testCaseValues { - d = (d + 1) % len(dhts) - dht := dhts[d] - providers[k] = dht.self - - t.Logf("adding local values for %s = %s (on %s)", k, v, dht.self) - rec, err := record.MakePutRecord(nil, k, v, false) - if err != nil { - t.Fatal(err) - } - - err = dht.putLocal(k, rec) - if err != nil { - t.Fatal(err) - } - - bits, err := dht.getLocal(k) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(bits.GetValue(), v) { - t.Fatalf("didn't store the right bits (%s, %s)", k, v) - } - - t.Logf("announcing provider for %s", k) - if err := dht.Provide(ctx, k); err != nil { - t.Fatal(err) - } - } - - // what is this timeout for? was 60ms before. - time.Sleep(time.Millisecond * 6) - - errchan := make(chan error) - - ctxT, _ = context.WithTimeout(ctx, 5*time.Second) - - var wg sync.WaitGroup - getProvider := func(dht *IpfsDHT, k key.Key) { - defer wg.Done() - - expected := providers[k] - - provchan := dht.FindProvidersAsync(ctxT, k, 1) - select { - case prov := <-provchan: - actual := prov.ID - if actual == "" { - errchan <- fmt.Errorf("Got back nil provider (%s at %s)", k, dht.self) - } else if actual != expected { - errchan <- fmt.Errorf("Got back wrong provider (%s != %s) (%s at %s)", - expected, actual, k, dht.self) - } - case <-ctxT.Done(): - errchan <- fmt.Errorf("Did not get a provider back (%s at %s)", k, dht.self) - } - } - - for k := range testCaseValues { - // everyone should be able to find it... - for _, dht := range dhts { - log.Debugf("getting providers for %s at %s", k, dht.self) - wg.Add(1) - go getProvider(dht, k) - } - } - - // we need this because of printing errors - go func() { - wg.Wait() - close(errchan) - }() - - for err := range errchan { - t.Error(err) - } -} - -func TestProvidesAsync(t *testing.T) { - // t.Skip("skipping test to debug another") - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - - _, _, dhts := setupDHTS(ctx, 4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Close() - defer dhts[i].host.Close() - } - }() - - connect(t, ctx, dhts[0], dhts[1]) - connect(t, ctx, dhts[1], dhts[2]) - connect(t, ctx, dhts[1], dhts[3]) - - k := key.Key("hello") - val := []byte("world") - sk := dhts[3].peerstore.PrivKey(dhts[3].self) - rec, err := record.MakePutRecord(sk, k, val, false) - if err != nil { - t.Fatal(err) - } - - err = dhts[3].putLocal(k, rec) - if err != nil { - t.Fatal(err) - } - - bits, err := dhts[3].getLocal(k) - if err != nil && bytes.Equal(bits.GetValue(), val) { - t.Fatal(err) - } - - err = dhts[3].Provide(ctx, key.Key("hello")) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 60) - - ctxT, _ := context.WithTimeout(ctx, time.Millisecond*300) - provs := dhts[0].FindProvidersAsync(ctxT, key.Key("hello"), 5) - select { - case p, ok := <-provs: - if !ok { - t.Fatal("Provider channel was closed...") - } - if p.ID == "" { - t.Fatal("Got back nil provider!") - } - if p.ID != dhts[3].self { - t.Fatalf("got a provider, but not the right one. %s", p) - } - case <-ctxT.Done(): - t.Fatal("Didnt get back providers") - } -} - -func TestLayeredGet(t *testing.T) { - // t.Skip("skipping test to debug another") - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - - _, _, dhts := setupDHTS(ctx, 4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Close() - defer dhts[i].host.Close() - } - }() - - connect(t, ctx, dhts[0], dhts[1]) - connect(t, ctx, dhts[1], dhts[2]) - connect(t, ctx, dhts[1], dhts[3]) - - err := dhts[3].Provide(ctx, key.Key("/v/hello")) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 6) - - t.Log("interface was changed. GetValue should not use providers.") - ctxT, _ := context.WithTimeout(ctx, time.Second) - val, err := dhts[0].GetValue(ctxT, key.Key("/v/hello")) - if err != routing.ErrNotFound { - t.Error(err) - } - if string(val) == "world" { - t.Error("should not get value.") - } - if len(val) > 0 && string(val) != "world" { - t.Error("worse, there's a value and its not even the right one.") - } -} - -func TestFindPeer(t *testing.T) { - // t.Skip("skipping test to debug another") - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - - _, peers, dhts := setupDHTS(ctx, 4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Close() - dhts[i].host.Close() - } - }() - - connect(t, ctx, dhts[0], dhts[1]) - connect(t, ctx, dhts[1], dhts[2]) - connect(t, ctx, dhts[1], dhts[3]) - - ctxT, _ := context.WithTimeout(ctx, time.Second) - p, err := dhts[0].FindPeer(ctxT, peers[2]) - if err != nil { - t.Fatal(err) - } - - if p.ID == "" { - t.Fatal("Failed to find peer.") - } - - if p.ID != peers[2] { - t.Fatal("Didnt find expected peer.") - } -} - -func TestFindPeersConnectedToPeer(t *testing.T) { - t.Skip("not quite correct (see note)") - - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - - _, peers, dhts := setupDHTS(ctx, 4, t) - defer func() { - for i := 0; i < 4; i++ { - dhts[i].Close() - dhts[i].host.Close() - } - }() - - // topology: - // 0-1, 1-2, 1-3, 2-3 - connect(t, ctx, dhts[0], dhts[1]) - connect(t, ctx, dhts[1], dhts[2]) - connect(t, ctx, dhts[1], dhts[3]) - connect(t, ctx, dhts[2], dhts[3]) - - // fmt.Println("0 is", peers[0]) - // fmt.Println("1 is", peers[1]) - // fmt.Println("2 is", peers[2]) - // fmt.Println("3 is", peers[3]) - - ctxT, _ := context.WithTimeout(ctx, time.Second) - pchan, err := dhts[0].FindPeersConnectedToPeer(ctxT, peers[2]) - if err != nil { - t.Fatal(err) - } - - // shouldFind := []peer.ID{peers[1], peers[3]} - var found []pstore.PeerInfo - for nextp := range pchan { - found = append(found, nextp) - } - - // fmt.Printf("querying 0 (%s) FindPeersConnectedToPeer 2 (%s)\n", peers[0], peers[2]) - // fmt.Println("should find 1, 3", shouldFind) - // fmt.Println("found", found) - - // testPeerListsMatch(t, shouldFind, found) - - log.Warning("TestFindPeersConnectedToPeer is not quite correct") - if len(found) == 0 { - t.Fatal("didn't find any peers.") - } -} - -func testPeerListsMatch(t *testing.T, p1, p2 []peer.ID) { - - if len(p1) != len(p2) { - t.Fatal("did not find as many peers as should have", p1, p2) - } - - ids1 := make([]string, len(p1)) - ids2 := make([]string, len(p2)) - - for i, p := range p1 { - ids1[i] = string(p) - } - - for i, p := range p2 { - ids2[i] = string(p) - } - - sort.Sort(sort.StringSlice(ids1)) - sort.Sort(sort.StringSlice(ids2)) - - for i := range ids1 { - if ids1[i] != ids2[i] { - t.Fatal("Didnt find expected peer", ids1[i], ids2) - } - } -} - -func TestConnectCollision(t *testing.T) { - // t.Skip("skipping test to debug another") - if testing.Short() { - t.SkipNow() - } - if travisci.IsRunning() { - t.Skip("Skipping on Travis-CI.") - } - - runTimes := 10 - - for rtime := 0; rtime < runTimes; rtime++ { - log.Info("Running Time: ", rtime) - - ctx := context.Background() - - dhtA := setupDHT(ctx, t) - dhtB := setupDHT(ctx, t) - - addrA := dhtA.peerstore.Addrs(dhtA.self)[0] - addrB := dhtB.peerstore.Addrs(dhtB.self)[0] - - peerA := dhtA.self - peerB := dhtB.self - - errs := make(chan error) - go func() { - dhtA.peerstore.AddAddr(peerB, addrB, pstore.TempAddrTTL) - pi := pstore.PeerInfo{ID: peerB} - err := dhtA.host.Connect(ctx, pi) - errs <- err - }() - go func() { - dhtB.peerstore.AddAddr(peerA, addrA, pstore.TempAddrTTL) - pi := pstore.PeerInfo{ID: peerA} - err := dhtB.host.Connect(ctx, pi) - errs <- err - }() - - timeout := time.After(5 * time.Second) - select { - case e := <-errs: - if e != nil { - t.Fatal(e) - } - case <-timeout: - t.Fatal("Timeout received!") - } - select { - case e := <-errs: - if e != nil { - t.Fatal(e) - } - case <-timeout: - t.Fatal("Timeout received!") - } - - dhtA.Close() - dhtB.Close() - dhtA.host.Close() - dhtB.host.Close() - } -} diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go deleted file mode 100644 index d600e83ddb..0000000000 --- a/routing/dht/ext_test.go +++ /dev/null @@ -1,290 +0,0 @@ -package dht - -import ( - "io" - "math/rand" - "testing" - "time" - - routing "github.com/ipfs/go-ipfs/routing" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - record "github.com/ipfs/go-ipfs/routing/record" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" - mocknet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/mock" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -func TestGetFailures(t *testing.T) { - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - mn, err := mocknet.FullMeshConnected(ctx, 2) - if err != nil { - t.Fatal(err) - } - hosts := mn.Hosts() - - tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, hosts[0], tsds) - d.Update(ctx, hosts[1].ID()) - - // Reply with failures to every message - hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { - s.Close() - }) - - // This one should time out - ctx1, _ := context.WithTimeout(context.Background(), 200*time.Millisecond) - if _, err := d.GetValue(ctx1, key.Key("test")); err != nil { - if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { - err = merr[0] - } - - if err != io.EOF { - t.Fatal("Got different error than we expected", err) - } - } else { - t.Fatal("Did not get expected error!") - } - - t.Log("Timeout test passed.") - - // Reply with failures to every message - hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { - defer s.Close() - - pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - pbw := ggio.NewDelimitedWriter(s) - - pmes := new(pb.Message) - if err := pbr.ReadMsg(pmes); err != nil { - panic(err) - } - - resp := &pb.Message{ - Type: pmes.Type, - } - if err := pbw.WriteMsg(resp); err != nil { - panic(err) - } - }) - - // This one should fail with NotFound. - // long context timeout to ensure we dont end too early. - // the dht should be exhausting its query and returning not found. - // (was 3 seconds before which should be _plenty_ of time, but maybe - // travis machines really have a hard time...) - ctx2, _ := context.WithTimeout(context.Background(), 20*time.Second) - _, err = d.GetValue(ctx2, key.Key("test")) - if err != nil { - if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { - err = merr[0] - } - if err != routing.ErrNotFound { - t.Fatalf("Expected ErrNotFound, got: %s", err) - } - } else { - t.Fatal("expected error, got none.") - } - - t.Log("ErrNotFound check passed!") - - // Now we test this DHT's handleGetValue failure - { - typ := pb.Message_GET_VALUE - str := "hello" - - sk, err := d.getOwnPrivateKey() - if err != nil { - t.Fatal(err) - } - - rec, err := record.MakePutRecord(sk, key.Key(str), []byte("blah"), true) - if err != nil { - t.Fatal(err) - } - req := pb.Message{ - Type: &typ, - Key: &str, - Record: rec, - } - - s, err := hosts[1].NewStream(context.Background(), hosts[0].ID(), ProtocolDHT) - if err != nil { - t.Fatal(err) - } - defer s.Close() - - pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - pbw := ggio.NewDelimitedWriter(s) - - if err := pbw.WriteMsg(&req); err != nil { - t.Fatal(err) - } - - pmes := new(pb.Message) - if err := pbr.ReadMsg(pmes); err != nil { - t.Fatal(err) - } - if pmes.GetRecord() != nil { - t.Fatal("shouldnt have value") - } - if pmes.GetProviderPeers() != nil { - t.Fatal("shouldnt have provider peers") - } - } -} - -func TestNotFound(t *testing.T) { - // t.Skip("skipping test to debug another") - if testing.Short() { - t.SkipNow() - } - - ctx := context.Background() - mn, err := mocknet.FullMeshConnected(ctx, 16) - if err != nil { - t.Fatal(err) - } - hosts := mn.Hosts() - tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, hosts[0], tsds) - - for _, p := range hosts { - d.Update(ctx, p.ID()) - } - - // Reply with random peers to every message - for _, host := range hosts { - host := host // shadow loop var - host.SetStreamHandler(ProtocolDHT, func(s inet.Stream) { - defer s.Close() - - pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - pbw := ggio.NewDelimitedWriter(s) - - pmes := new(pb.Message) - if err := pbr.ReadMsg(pmes); err != nil { - panic(err) - } - - switch pmes.GetType() { - case pb.Message_GET_VALUE: - resp := &pb.Message{Type: pmes.Type} - - ps := []pstore.PeerInfo{} - for i := 0; i < 7; i++ { - p := hosts[rand.Intn(len(hosts))].ID() - pi := host.Peerstore().PeerInfo(p) - ps = append(ps, pi) - } - - resp.CloserPeers = pb.PeerInfosToPBPeers(d.host.Network(), ps) - if err := pbw.WriteMsg(resp); err != nil { - panic(err) - } - - default: - panic("Shouldnt recieve this.") - } - }) - } - - // long timeout to ensure timing is not at play. - ctx, cancel := context.WithTimeout(ctx, time.Second*20) - defer cancel() - v, err := d.GetValue(ctx, key.Key("hello")) - log.Debugf("get value got %v", v) - if err != nil { - if merr, ok := err.(u.MultiErr); ok && len(merr) > 0 { - err = merr[0] - } - switch err { - case routing.ErrNotFound: - //Success! - return - case u.ErrTimeout: - t.Fatal("Should not have gotten timeout!") - default: - t.Fatalf("Got unexpected error: %s", err) - } - } - t.Fatal("Expected to recieve an error.") -} - -// If less than K nodes are in the entire network, it should fail when we make -// a GET rpc and nobody has the value -func TestLessThanKResponses(t *testing.T) { - // t.Skip("skipping test to debug another") - // t.Skip("skipping test because it makes a lot of output") - - ctx := context.Background() - mn, err := mocknet.FullMeshConnected(ctx, 6) - if err != nil { - t.Fatal(err) - } - hosts := mn.Hosts() - - tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, hosts[0], tsds) - - for i := 1; i < 5; i++ { - d.Update(ctx, hosts[i].ID()) - } - - // Reply with random peers to every message - for _, host := range hosts { - host := host // shadow loop var - host.SetStreamHandler(ProtocolDHT, func(s inet.Stream) { - defer s.Close() - - pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - pbw := ggio.NewDelimitedWriter(s) - - pmes := new(pb.Message) - if err := pbr.ReadMsg(pmes); err != nil { - panic(err) - } - - switch pmes.GetType() { - case pb.Message_GET_VALUE: - pi := host.Peerstore().PeerInfo(hosts[1].ID()) - resp := &pb.Message{ - Type: pmes.Type, - CloserPeers: pb.PeerInfosToPBPeers(d.host.Network(), []pstore.PeerInfo{pi}), - } - - if err := pbw.WriteMsg(resp); err != nil { - panic(err) - } - default: - panic("Shouldnt recieve this.") - } - - }) - } - - ctx, cancel := context.WithTimeout(ctx, time.Second*30) - defer cancel() - if _, err := d.GetValue(ctx, key.Key("hello")); err != nil { - switch err { - case routing.ErrNotFound: - //Success! - return - case u.ErrTimeout: - t.Fatal("Should not have gotten timeout!") - default: - t.Fatalf("Got unexpected error: %s", err) - } - } - t.Fatal("Expected to recieve an error.") -} diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go deleted file mode 100644 index ea539a95d9..0000000000 --- a/routing/dht/handlers.go +++ /dev/null @@ -1,288 +0,0 @@ -package dht - -import ( - "errors" - "fmt" - "time" - - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - lgbl "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" - - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -// The number of closer peers to send on requests. -var CloserPeerCount = KValue - -// dhthandler specifies the signature of functions that handle DHT messages. -type dhtHandler func(context.Context, peer.ID, *pb.Message) (*pb.Message, error) - -func (dht *IpfsDHT) handlerForMsgType(t pb.Message_MessageType) dhtHandler { - switch t { - case pb.Message_GET_VALUE: - return dht.handleGetValue - case pb.Message_PUT_VALUE: - return dht.handlePutValue - case pb.Message_FIND_NODE: - return dht.handleFindPeer - case pb.Message_ADD_PROVIDER: - return dht.handleAddProvider - case pb.Message_GET_PROVIDERS: - return dht.handleGetProviders - case pb.Message_PING: - return dht.handlePing - default: - return nil - } -} - -func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - defer log.EventBegin(ctx, "handleGetValue", p).Done() - log.Debugf("%s handleGetValue for key: %s", dht.self, pmes.GetKey()) - - // setup response - resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) - - // first, is there even a key? - k := key.Key(pmes.GetKey()) - if k == "" { - return nil, errors.New("handleGetValue but no key was provided") - // TODO: send back an error response? could be bad, but the other node's hanging. - } - - rec, err := dht.checkLocalDatastore(k) - if err != nil { - return nil, err - } - resp.Record = rec - - // Find closest peer on given cluster to desired key and reply with that info - closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) - if len(closer) > 0 { - closerinfos := pstore.PeerInfos(dht.peerstore, closer) - for _, pi := range closerinfos { - log.Debugf("handleGetValue returning closer peer: '%s'", pi.ID) - if len(pi.Addrs) < 1 { - log.Errorf(`no addresses on peer being sent! - [local:%s] - [sending:%s] - [remote:%s]`, dht.self, pi.ID, p) - } - } - - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), closerinfos) - } - - return resp, nil -} - -func (dht *IpfsDHT) checkLocalDatastore(k key.Key) (*pb.Record, error) { - log.Debugf("%s handleGetValue looking into ds", dht.self) - dskey := k.DsKey() - iVal, err := dht.datastore.Get(dskey) - log.Debugf("%s handleGetValue looking into ds GOT %v", dht.self, iVal) - - if err == ds.ErrNotFound { - return nil, nil - } - - // if we got an unexpected error, bail. - if err != nil { - return nil, err - } - - // if we have the value, send it back - log.Debugf("%s handleGetValue success!", dht.self) - - byts, ok := iVal.([]byte) - if !ok { - return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) - } - - rec := new(pb.Record) - err = proto.Unmarshal(byts, rec) - if err != nil { - log.Debug("failed to unmarshal DHT record from datastore") - return nil, err - } - - // if its our record, dont bother checking the times on it - if peer.ID(rec.GetAuthor()) == dht.self { - return rec, nil - } - - var recordIsBad bool - recvtime, err := u.ParseRFC3339(rec.GetTimeReceived()) - if err != nil { - log.Info("either no receive time set on record, or it was invalid: ", err) - recordIsBad = true - } - - if time.Now().Sub(recvtime) > MaxRecordAge { - log.Debug("old record found, tossing.") - recordIsBad = true - } - - // NOTE: We do not verify the record here beyond checking these timestamps. - // we put the burden of checking the records on the requester as checking a record - // may be computationally expensive - - if recordIsBad { - err := dht.datastore.Delete(dskey) - if err != nil { - log.Error("Failed to delete bad record from datastore: ", err) - } - - return nil, nil // can treat this as not having the record at all - } - - return rec, nil -} - -// Store a value in this peer local storage -func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - defer log.EventBegin(ctx, "handlePutValue", p).Done() - dskey := key.Key(pmes.GetKey()).DsKey() - - if err := dht.verifyRecordLocally(pmes.GetRecord()); err != nil { - log.Warningf("Bad dht record in PUT from: %s. %s", key.Key(pmes.GetRecord().GetAuthor()), err) - return nil, err - } - - rec := pmes.GetRecord() - - // record the time we receive every record - rec.TimeReceived = proto.String(u.FormatRFC3339(time.Now())) - - data, err := proto.Marshal(rec) - if err != nil { - return nil, err - } - - err = dht.datastore.Put(dskey, data) - log.Debugf("%s handlePutValue %v", dht.self, dskey) - return pmes, err -} - -func (dht *IpfsDHT) handlePing(_ context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - log.Debugf("%s Responding to ping from %s!\n", dht.self, p) - return pmes, nil -} - -func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - defer log.EventBegin(ctx, "handleFindPeer", p).Done() - resp := pb.NewMessage(pmes.GetType(), "", pmes.GetClusterLevel()) - var closest []peer.ID - - // if looking for self... special case where we send it on CloserPeers. - if peer.ID(pmes.GetKey()) == dht.self { - closest = []peer.ID{dht.self} - } else { - closest = dht.betterPeersToQuery(pmes, p, CloserPeerCount) - } - - if closest == nil { - log.Infof("%s handleFindPeer %s: could not find anything.", dht.self, p) - return resp, nil - } - - var withAddresses []pstore.PeerInfo - closestinfos := pstore.PeerInfos(dht.peerstore, closest) - for _, pi := range closestinfos { - if len(pi.Addrs) > 0 { - withAddresses = append(withAddresses, pi) - log.Debugf("handleFindPeer: sending back '%s'", pi.ID) - } - } - - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), withAddresses) - return resp, nil -} - -func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - lm := make(lgbl.DeferredMap) - lm["peer"] = func() interface{} { return p.Pretty() } - defer log.EventBegin(ctx, "handleGetProviders", lm).Done() - - resp := pb.NewMessage(pmes.GetType(), pmes.GetKey(), pmes.GetClusterLevel()) - key := key.Key(pmes.GetKey()) - lm["key"] = func() interface{} { return key.B58String() } - - // debug logging niceness. - reqDesc := fmt.Sprintf("%s handleGetProviders(%s, %s): ", dht.self, p, key) - log.Debugf("%s begin", reqDesc) - defer log.Debugf("%s end", reqDesc) - - // check if we have this value, to add ourselves as provider. - has, err := dht.datastore.Has(key.DsKey()) - if err != nil && err != ds.ErrNotFound { - log.Debugf("unexpected datastore error: %v\n", err) - has = false - } - - // setup providers - providers := dht.providers.GetProviders(ctx, key) - if has { - providers = append(providers, dht.self) - log.Debugf("%s have the value. added self as provider", reqDesc) - } - - if providers != nil && len(providers) > 0 { - infos := pstore.PeerInfos(dht.peerstore, providers) - resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) - log.Debugf("%s have %d providers: %s", reqDesc, len(providers), infos) - } - - // Also send closer peers. - closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) - if closer != nil { - infos := pstore.PeerInfos(dht.peerstore, closer) - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) - log.Debugf("%s have %d closer peers: %s", reqDesc, len(closer), infos) - } - - return resp, nil -} - -func (dht *IpfsDHT) handleAddProvider(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - lm := make(lgbl.DeferredMap) - lm["peer"] = func() interface{} { return p.Pretty() } - - defer log.EventBegin(ctx, "handleAddProvider", lm).Done() - key := key.Key(pmes.GetKey()) - lm["key"] = func() interface{} { return key.B58String() } - - log.Debugf("%s adding %s as a provider for '%s'\n", dht.self, p, key) - - // add provider should use the address given in the message - pinfos := pb.PBPeersToPeerInfos(pmes.GetProviderPeers()) - for _, pi := range pinfos { - if pi.ID != p { - // we should ignore this provider reccord! not from originator. - // (we chould sign them and check signature later...) - log.Debugf("handleAddProvider received provider %s from %s. Ignore.", pi.ID, p) - continue - } - - if len(pi.Addrs) < 1 { - log.Debugf("%s got no valid addresses for provider %s. Ignore.", dht.self, p) - continue - } - - log.Infof("received provider %s for %s (addrs: %s)", p, key, pi.Addrs) - if pi.ID != dht.self { // dont add own addrs. - // add the received addresses to our peerstore. - dht.peerstore.AddAddrs(pi.ID, pi.Addrs, pstore.ProviderAddrTTL) - } - dht.providers.AddProvider(ctx, key, p) - } - - return nil, nil -} diff --git a/routing/dht/lookup.go b/routing/dht/lookup.go deleted file mode 100644 index 2ff6306cc2..0000000000 --- a/routing/dht/lookup.go +++ /dev/null @@ -1,112 +0,0 @@ -package dht - -import ( - pset "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer/peerset" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - notif "github.com/ipfs/go-ipfs/notifications" - kb "github.com/ipfs/go-ipfs/routing/kbucket" - - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -// Required in order for proper JSON marshaling -func pointerizePeerInfos(pis []pstore.PeerInfo) []*pstore.PeerInfo { - out := make([]*pstore.PeerInfo, len(pis)) - for i, p := range pis { - np := p - out[i] = &np - } - return out -} - -// Kademlia 'node lookup' operation. Returns a channel of the K closest peers -// to the given key -func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key key.Key) (<-chan peer.ID, error) { - e := log.EventBegin(ctx, "getClosestPeers", &key) - tablepeers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) - if len(tablepeers) == 0 { - return nil, kb.ErrLookupFailure - } - - out := make(chan peer.ID, KValue) - peerset := pset.NewLimited(KValue) - - for _, p := range tablepeers { - select { - case out <- p: - case <-ctx.Done(): - return nil, ctx.Err() - } - peerset.Add(p) - } - - // since the query doesnt actually pass our context down - // we have to hack this here. whyrusleeping isnt a huge fan of goprocess - parent := ctx - query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - // For DHT query command - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.SendingQuery, - ID: p, - }) - - closer, err := dht.closerPeersSingle(ctx, key, p) - if err != nil { - log.Debugf("error getting closer peers: %s", err) - return nil, err - } - - var filtered []pstore.PeerInfo - for _, clp := range closer { - if kb.Closer(clp, dht.self, key) && peerset.TryAdd(clp) { - select { - case out <- clp: - case <-ctx.Done(): - return nil, ctx.Err() - } - filtered = append(filtered, dht.peerstore.PeerInfo(clp)) - } - } - - // For DHT query command - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, - ID: p, - Responses: pointerizePeerInfos(filtered), - }) - - return &dhtQueryResult{closerPeers: filtered}, nil - }) - - go func() { - defer close(out) - defer e.Done() - // run it! - _, err := query.Run(ctx, tablepeers) - if err != nil { - log.Debugf("closestPeers query run error: %s", err) - } - }() - - return out, nil -} - -func (dht *IpfsDHT) closerPeersSingle(ctx context.Context, key key.Key, p peer.ID) ([]peer.ID, error) { - pmes, err := dht.findPeerSingle(ctx, p, peer.ID(key)) - if err != nil { - return nil, err - } - - var out []peer.ID - for _, pbp := range pmes.GetCloserPeers() { - pid := peer.ID(pbp.GetId()) - if pid != dht.self { // dont add self - dht.peerstore.AddAddrs(pid, pbp.Addresses(), pstore.TempAddrTTL) - out = append(out, pid) - } - } - return out, nil -} diff --git a/routing/dht/notif.go b/routing/dht/notif.go deleted file mode 100644 index 57a3b8f2cb..0000000000 --- a/routing/dht/notif.go +++ /dev/null @@ -1,39 +0,0 @@ -package dht - -import ( - ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - - inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" -) - -// netNotifiee defines methods to be used with the IpfsDHT -type netNotifiee IpfsDHT - -func (nn *netNotifiee) DHT() *IpfsDHT { - return (*IpfsDHT)(nn) -} - -func (nn *netNotifiee) Connected(n inet.Network, v inet.Conn) { - dht := nn.DHT() - select { - case <-dht.Process().Closing(): - return - default: - } - dht.Update(dht.Context(), v.RemotePeer()) -} - -func (nn *netNotifiee) Disconnected(n inet.Network, v inet.Conn) { - dht := nn.DHT() - select { - case <-dht.Process().Closing(): - return - default: - } - dht.routingTable.Remove(v.RemotePeer()) -} - -func (nn *netNotifiee) OpenedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) ClosedStream(n inet.Network, v inet.Stream) {} -func (nn *netNotifiee) Listen(n inet.Network, a ma.Multiaddr) {} -func (nn *netNotifiee) ListenClose(n inet.Network, a ma.Multiaddr) {} diff --git a/routing/dht/pb/Makefile b/routing/dht/pb/Makefile deleted file mode 100644 index 08ac883d0d..0000000000 --- a/routing/dht/pb/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< - -clean: - rm -f *.pb.go - rm -f *.go diff --git a/routing/dht/pb/dht.pb.go b/routing/dht/pb/dht.pb.go deleted file mode 100644 index 24dc2e5be3..0000000000 --- a/routing/dht/pb/dht.pb.go +++ /dev/null @@ -1,272 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: dht.proto -// DO NOT EDIT! - -/* -Package dht_pb is a generated protocol buffer package. - -It is generated from these files: - dht.proto - -It has these top-level messages: - Message - Record -*/ -package dht_pb - -import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = math.Inf - -type Message_MessageType int32 - -const ( - Message_PUT_VALUE Message_MessageType = 0 - Message_GET_VALUE Message_MessageType = 1 - Message_ADD_PROVIDER Message_MessageType = 2 - Message_GET_PROVIDERS Message_MessageType = 3 - Message_FIND_NODE Message_MessageType = 4 - Message_PING Message_MessageType = 5 -) - -var Message_MessageType_name = map[int32]string{ - 0: "PUT_VALUE", - 1: "GET_VALUE", - 2: "ADD_PROVIDER", - 3: "GET_PROVIDERS", - 4: "FIND_NODE", - 5: "PING", -} -var Message_MessageType_value = map[string]int32{ - "PUT_VALUE": 0, - "GET_VALUE": 1, - "ADD_PROVIDER": 2, - "GET_PROVIDERS": 3, - "FIND_NODE": 4, - "PING": 5, -} - -func (x Message_MessageType) Enum() *Message_MessageType { - p := new(Message_MessageType) - *p = x - return p -} -func (x Message_MessageType) String() string { - return proto.EnumName(Message_MessageType_name, int32(x)) -} -func (x *Message_MessageType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Message_MessageType_value, data, "Message_MessageType") - if err != nil { - return err - } - *x = Message_MessageType(value) - return nil -} - -type Message_ConnectionType int32 - -const ( - // sender does not have a connection to peer, and no extra information (default) - Message_NOT_CONNECTED Message_ConnectionType = 0 - // sender has a live connection to peer - Message_CONNECTED Message_ConnectionType = 1 - // sender recently connected to peer - Message_CAN_CONNECT Message_ConnectionType = 2 - // sender recently tried to connect to peer repeatedly but failed to connect - // ("try" here is loose, but this should signal "made strong effort, failed") - Message_CANNOT_CONNECT Message_ConnectionType = 3 -) - -var Message_ConnectionType_name = map[int32]string{ - 0: "NOT_CONNECTED", - 1: "CONNECTED", - 2: "CAN_CONNECT", - 3: "CANNOT_CONNECT", -} -var Message_ConnectionType_value = map[string]int32{ - "NOT_CONNECTED": 0, - "CONNECTED": 1, - "CAN_CONNECT": 2, - "CANNOT_CONNECT": 3, -} - -func (x Message_ConnectionType) Enum() *Message_ConnectionType { - p := new(Message_ConnectionType) - *p = x - return p -} -func (x Message_ConnectionType) String() string { - return proto.EnumName(Message_ConnectionType_name, int32(x)) -} -func (x *Message_ConnectionType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Message_ConnectionType_value, data, "Message_ConnectionType") - if err != nil { - return err - } - *x = Message_ConnectionType(value) - return nil -} - -type Message struct { - // defines what type of message it is. - Type *Message_MessageType `protobuf:"varint,1,opt,name=type,enum=dht.pb.Message_MessageType" json:"type,omitempty"` - // defines what coral cluster level this query/response belongs to. - ClusterLevelRaw *int32 `protobuf:"varint,10,opt,name=clusterLevelRaw" json:"clusterLevelRaw,omitempty"` - // Used to specify the key associated with this message. - // PUT_VALUE, GET_VALUE, ADD_PROVIDER, GET_PROVIDERS - Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - // Used to return a value - // PUT_VALUE, GET_VALUE - Record *Record `protobuf:"bytes,3,opt,name=record" json:"record,omitempty"` - // Used to return peers closer to a key in a query - // GET_VALUE, GET_PROVIDERS, FIND_NODE - CloserPeers []*Message_Peer `protobuf:"bytes,8,rep,name=closerPeers" json:"closerPeers,omitempty"` - // Used to return Providers - // GET_VALUE, ADD_PROVIDER, GET_PROVIDERS - ProviderPeers []*Message_Peer `protobuf:"bytes,9,rep,name=providerPeers" json:"providerPeers,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} - -func (m *Message) GetType() Message_MessageType { - if m != nil && m.Type != nil { - return *m.Type - } - return Message_PUT_VALUE -} - -func (m *Message) GetClusterLevelRaw() int32 { - if m != nil && m.ClusterLevelRaw != nil { - return *m.ClusterLevelRaw - } - return 0 -} - -func (m *Message) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *Message) GetRecord() *Record { - if m != nil { - return m.Record - } - return nil -} - -func (m *Message) GetCloserPeers() []*Message_Peer { - if m != nil { - return m.CloserPeers - } - return nil -} - -func (m *Message) GetProviderPeers() []*Message_Peer { - if m != nil { - return m.ProviderPeers - } - return nil -} - -type Message_Peer struct { - // ID of a given peer. - Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` - // multiaddrs for a given peer - Addrs [][]byte `protobuf:"bytes,2,rep,name=addrs" json:"addrs,omitempty"` - // used to signal the sender's connection capabilities to the peer - Connection *Message_ConnectionType `protobuf:"varint,3,opt,name=connection,enum=dht.pb.Message_ConnectionType" json:"connection,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Message_Peer) Reset() { *m = Message_Peer{} } -func (m *Message_Peer) String() string { return proto.CompactTextString(m) } -func (*Message_Peer) ProtoMessage() {} - -func (m *Message_Peer) GetId() string { - if m != nil && m.Id != nil { - return *m.Id - } - return "" -} - -func (m *Message_Peer) GetAddrs() [][]byte { - if m != nil { - return m.Addrs - } - return nil -} - -func (m *Message_Peer) GetConnection() Message_ConnectionType { - if m != nil && m.Connection != nil { - return *m.Connection - } - return Message_NOT_CONNECTED -} - -// Record represents a dht record that contains a value -// for a key value pair -type Record struct { - // The key that references this record - Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` - // The actual value this record is storing - Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - // hash of the authors public key - Author *string `protobuf:"bytes,3,opt,name=author" json:"author,omitempty"` - // A PKI signature for the key+value+author - Signature []byte `protobuf:"bytes,4,opt,name=signature" json:"signature,omitempty"` - // Time the record was received, set by receiver - TimeReceived *string `protobuf:"bytes,5,opt,name=timeReceived" json:"timeReceived,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Record) Reset() { *m = Record{} } -func (m *Record) String() string { return proto.CompactTextString(m) } -func (*Record) ProtoMessage() {} - -func (m *Record) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *Record) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *Record) GetAuthor() string { - if m != nil && m.Author != nil { - return *m.Author - } - return "" -} - -func (m *Record) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *Record) GetTimeReceived() string { - if m != nil && m.TimeReceived != nil { - return *m.TimeReceived - } - return "" -} - -func init() { - proto.RegisterEnum("dht.pb.Message_MessageType", Message_MessageType_name, Message_MessageType_value) - proto.RegisterEnum("dht.pb.Message_ConnectionType", Message_ConnectionType_name, Message_ConnectionType_value) -} diff --git a/routing/dht/pb/dht.proto b/routing/dht/pb/dht.proto deleted file mode 100644 index de88c3451b..0000000000 --- a/routing/dht/pb/dht.proto +++ /dev/null @@ -1,81 +0,0 @@ -package dht.pb; - -//run `protoc --go_out=. *.proto` to generate - -message Message { - enum MessageType { - PUT_VALUE = 0; - GET_VALUE = 1; - ADD_PROVIDER = 2; - GET_PROVIDERS = 3; - FIND_NODE = 4; - PING = 5; - } - - enum ConnectionType { - // sender does not have a connection to peer, and no extra information (default) - NOT_CONNECTED = 0; - - // sender has a live connection to peer - CONNECTED = 1; - - // sender recently connected to peer - CAN_CONNECT = 2; - - // sender recently tried to connect to peer repeatedly but failed to connect - // ("try" here is loose, but this should signal "made strong effort, failed") - CANNOT_CONNECT = 3; - } - - message Peer { - // ID of a given peer. - optional string id = 1; - - // multiaddrs for a given peer - repeated bytes addrs = 2; - - // used to signal the sender's connection capabilities to the peer - optional ConnectionType connection = 3; - } - - // defines what type of message it is. - optional MessageType type = 1; - - // defines what coral cluster level this query/response belongs to. - optional int32 clusterLevelRaw = 10; - - // Used to specify the key associated with this message. - // PUT_VALUE, GET_VALUE, ADD_PROVIDER, GET_PROVIDERS - optional string key = 2; - - // Used to return a value - // PUT_VALUE, GET_VALUE - optional Record record = 3; - - // Used to return peers closer to a key in a query - // GET_VALUE, GET_PROVIDERS, FIND_NODE - repeated Peer closerPeers = 8; - - // Used to return Providers - // GET_VALUE, ADD_PROVIDER, GET_PROVIDERS - repeated Peer providerPeers = 9; -} - -// Record represents a dht record that contains a value -// for a key value pair -message Record { - // The key that references this record - optional string key = 1; - - // The actual value this record is storing - optional bytes value = 2; - - // hash of the authors public key - optional string author = 3; - - // A PKI signature for the key+value+author - optional bytes signature = 4; - - // Time the record was received, set by receiver - optional string timeReceived = 5; -} diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go deleted file mode 100644 index 2a6936e4e8..0000000000 --- a/routing/dht/pb/message.go +++ /dev/null @@ -1,185 +0,0 @@ -package dht_pb - -import ( - ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" - - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -var log = logging.Logger("dht.pb") - -type PeerRoutingInfo struct { - pstore.PeerInfo - inet.Connectedness -} - -// NewMessage constructs a new dht message with given type, key, and level -func NewMessage(typ Message_MessageType, key string, level int) *Message { - m := &Message{ - Type: &typ, - Key: &key, - } - m.SetClusterLevel(level) - return m -} - -func peerRoutingInfoToPBPeer(p PeerRoutingInfo) *Message_Peer { - pbp := new(Message_Peer) - - pbp.Addrs = make([][]byte, len(p.Addrs)) - for i, maddr := range p.Addrs { - pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed. - } - s := string(p.ID) - pbp.Id = &s - c := ConnectionType(p.Connectedness) - pbp.Connection = &c - return pbp -} - -func peerInfoToPBPeer(p pstore.PeerInfo) *Message_Peer { - pbp := new(Message_Peer) - - pbp.Addrs = make([][]byte, len(p.Addrs)) - for i, maddr := range p.Addrs { - pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed. - } - s := string(p.ID) - pbp.Id = &s - return pbp -} - -// PBPeerToPeer turns a *Message_Peer into its pstore.PeerInfo counterpart -func PBPeerToPeerInfo(pbp *Message_Peer) pstore.PeerInfo { - return pstore.PeerInfo{ - ID: peer.ID(pbp.GetId()), - Addrs: pbp.Addresses(), - } -} - -// RawPeerInfosToPBPeers converts a slice of Peers into a slice of *Message_Peers, -// ready to go out on the wire. -func RawPeerInfosToPBPeers(peers []pstore.PeerInfo) []*Message_Peer { - pbpeers := make([]*Message_Peer, len(peers)) - for i, p := range peers { - pbpeers[i] = peerInfoToPBPeer(p) - } - return pbpeers -} - -// PeersToPBPeers converts given []peer.Peer into a set of []*Message_Peer, -// which can be written to a message and sent out. the key thing this function -// does (in addition to PeersToPBPeers) is set the ConnectionType with -// information from the given inet.Network. -func PeerInfosToPBPeers(n inet.Network, peers []pstore.PeerInfo) []*Message_Peer { - pbps := RawPeerInfosToPBPeers(peers) - for i, pbp := range pbps { - c := ConnectionType(n.Connectedness(peers[i].ID)) - pbp.Connection = &c - } - return pbps -} - -func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []*Message_Peer { - pbpeers := make([]*Message_Peer, len(peers)) - for i, p := range peers { - pbpeers[i] = peerRoutingInfoToPBPeer(p) - } - return pbpeers -} - -// PBPeersToPeerInfos converts given []*Message_Peer into []pstore.PeerInfo -// Invalid addresses will be silently omitted. -func PBPeersToPeerInfos(pbps []*Message_Peer) []pstore.PeerInfo { - peers := make([]pstore.PeerInfo, 0, len(pbps)) - for _, pbp := range pbps { - peers = append(peers, PBPeerToPeerInfo(pbp)) - } - return peers -} - -// Addresses returns a multiaddr associated with the Message_Peer entry -func (m *Message_Peer) Addresses() []ma.Multiaddr { - if m == nil { - return nil - } - - maddrs := make([]ma.Multiaddr, 0, len(m.Addrs)) - for _, addr := range m.Addrs { - maddr, err := ma.NewMultiaddrBytes(addr) - if err != nil { - log.Warningf("error decoding Multiaddr for peer: %s", m.GetId()) - continue - } - - maddrs = append(maddrs, maddr) - } - return maddrs -} - -// GetClusterLevel gets and adjusts the cluster level on the message. -// a +/- 1 adjustment is needed to distinguish a valid first level (1) and -// default "no value" protobuf behavior (0) -func (m *Message) GetClusterLevel() int { - level := m.GetClusterLevelRaw() - 1 - if level < 0 { - return 0 - } - return int(level) -} - -// SetClusterLevel adjusts and sets the cluster level on the message. -// a +/- 1 adjustment is needed to distinguish a valid first level (1) and -// default "no value" protobuf behavior (0) -func (m *Message) SetClusterLevel(level int) { - lvl := int32(level) - m.ClusterLevelRaw = &lvl -} - -// Loggable turns a Message into machine-readable log output -func (m *Message) Loggable() map[string]interface{} { - return map[string]interface{}{ - "message": map[string]string{ - "type": m.Type.String(), - "key": key.Key(m.GetKey()).B58String(), - }, - } -} - -// ConnectionType returns a Message_ConnectionType associated with the -// inet.Connectedness. -func ConnectionType(c inet.Connectedness) Message_ConnectionType { - switch c { - default: - return Message_NOT_CONNECTED - case inet.NotConnected: - return Message_NOT_CONNECTED - case inet.Connected: - return Message_CONNECTED - case inet.CanConnect: - return Message_CAN_CONNECT - case inet.CannotConnect: - return Message_CANNOT_CONNECT - } -} - -// Connectedness returns an inet.Connectedness associated with the -// Message_ConnectionType. -func Connectedness(c Message_ConnectionType) inet.Connectedness { - switch c { - default: - return inet.NotConnected - case Message_NOT_CONNECTED: - return inet.NotConnected - case Message_CONNECTED: - return inet.Connected - case Message_CAN_CONNECT: - return inet.CanConnect - case Message_CANNOT_CONNECT: - return inet.CannotConnect - } -} diff --git a/routing/dht/pb/message_test.go b/routing/dht/pb/message_test.go deleted file mode 100644 index 71f4abdc5e..0000000000 --- a/routing/dht/pb/message_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package dht_pb - -import ( - "testing" -) - -func TestBadAddrsDontReturnNil(t *testing.T) { - mp := new(Message_Peer) - mp.Addrs = [][]byte{[]byte("NOT A VALID MULTIADDR")} - - addrs := mp.Addresses() - if len(addrs) > 0 { - t.Fatal("shouldnt have any multiaddrs") - } -} diff --git a/routing/dht/providers/providers.go b/routing/dht/providers/providers.go deleted file mode 100644 index a34fec6bb9..0000000000 --- a/routing/dht/providers/providers.go +++ /dev/null @@ -1,353 +0,0 @@ -package providers - -import ( - "encoding/binary" - "fmt" - "strings" - "time" - - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - goprocessctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - autobatch "gx/ipfs/QmSp3diFRRv4zR25nHU4MWNCdhT4R6cxrTPLx12MCi1TZb/autobatch" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" - - flags "github.com/ipfs/go-ipfs/flags" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -var batchBufferSize = 256 - -func init() { - if flags.LowMemMode { - batchBufferSize = 8 - } -} - -var log = logging.Logger("providers") - -var lruCacheSize = 256 -var ProvideValidity = time.Hour * 24 -var defaultCleanupInterval = time.Hour - -type ProviderManager struct { - // all non channel fields are meant to be accessed only within - // the run method - providers *lru.Cache - lpeer peer.ID - dstore ds.Datastore - - newprovs chan *addProv - getprovs chan *getProv - period time.Duration - proc goprocess.Process - - cleanupInterval time.Duration -} - -type providerSet struct { - providers []peer.ID - set map[peer.ID]time.Time -} - -type addProv struct { - k key.Key - val peer.ID -} - -type getProv struct { - k key.Key - resp chan []peer.ID -} - -func NewProviderManager(ctx context.Context, local peer.ID, dstore ds.Batching) *ProviderManager { - pm := new(ProviderManager) - pm.getprovs = make(chan *getProv) - pm.newprovs = make(chan *addProv) - pm.dstore = autobatch.NewAutoBatching(dstore, batchBufferSize) - cache, err := lru.New(lruCacheSize) - if err != nil { - panic(err) //only happens if negative value is passed to lru constructor - } - pm.providers = cache - - pm.proc = goprocessctx.WithContext(ctx) - pm.cleanupInterval = defaultCleanupInterval - pm.proc.Go(func(p goprocess.Process) { pm.run() }) - - return pm -} - -const providersKeyPrefix = "/providers/" - -func mkProvKey(k key.Key) ds.Key { - return ds.NewKey(providersKeyPrefix + base32.RawStdEncoding.EncodeToString([]byte(k))) -} - -func (pm *ProviderManager) Process() goprocess.Process { - return pm.proc -} - -func (pm *ProviderManager) providersForKey(k key.Key) ([]peer.ID, error) { - pset, err := pm.getProvSet(k) - if err != nil { - return nil, err - } - return pset.providers, nil -} - -func (pm *ProviderManager) getProvSet(k key.Key) (*providerSet, error) { - cached, ok := pm.providers.Get(k) - if ok { - return cached.(*providerSet), nil - } - - pset, err := loadProvSet(pm.dstore, k) - if err != nil { - return nil, err - } - - if len(pset.providers) > 0 { - pm.providers.Add(k, pset) - } - - return pset, nil -} - -func loadProvSet(dstore ds.Datastore, k key.Key) (*providerSet, error) { - res, err := dstore.Query(dsq.Query{Prefix: mkProvKey(k).String()}) - if err != nil { - return nil, err - } - - out := newProviderSet() - for e := range res.Next() { - if e.Error != nil { - log.Error("got an error: ", e.Error) - continue - } - parts := strings.Split(e.Key, "/") - if len(parts) != 4 { - log.Warning("incorrectly formatted key: ", e.Key) - continue - } - - decstr, err := base32.RawStdEncoding.DecodeString(parts[len(parts)-1]) - if err != nil { - log.Error("base32 decoding error: ", err) - continue - } - - pid := peer.ID(decstr) - - t, err := readTimeValue(e.Value) - if err != nil { - log.Warning("parsing providers record from disk: ", err) - continue - } - - out.setVal(pid, t) - } - - return out, nil -} - -func readTimeValue(i interface{}) (time.Time, error) { - data, ok := i.([]byte) - if !ok { - return time.Time{}, fmt.Errorf("data was not a []byte") - } - - nsec, _ := binary.Varint(data) - - return time.Unix(0, nsec), nil -} - -func (pm *ProviderManager) addProv(k key.Key, p peer.ID) error { - iprovs, ok := pm.providers.Get(k) - if !ok { - iprovs = newProviderSet() - pm.providers.Add(k, iprovs) - } - provs := iprovs.(*providerSet) - now := time.Now() - provs.setVal(p, now) - - return writeProviderEntry(pm.dstore, k, p, now) -} - -func writeProviderEntry(dstore ds.Datastore, k key.Key, p peer.ID, t time.Time) error { - dsk := mkProvKey(k).ChildString(base32.RawStdEncoding.EncodeToString([]byte(p))) - - buf := make([]byte, 16) - n := binary.PutVarint(buf, t.UnixNano()) - - return dstore.Put(dsk, buf[:n]) -} - -func (pm *ProviderManager) deleteProvSet(k key.Key) error { - pm.providers.Remove(k) - - res, err := pm.dstore.Query(dsq.Query{ - KeysOnly: true, - Prefix: mkProvKey(k).String(), - }) - - entries, err := res.Rest() - if err != nil { - return err - } - - for _, e := range entries { - err := pm.dstore.Delete(ds.NewKey(e.Key)) - if err != nil { - log.Error("deleting provider set: ", err) - } - } - return nil -} - -func (pm *ProviderManager) getAllProvKeys() ([]key.Key, error) { - res, err := pm.dstore.Query(dsq.Query{ - KeysOnly: true, - Prefix: providersKeyPrefix, - }) - - if err != nil { - return nil, err - } - - entries, err := res.Rest() - if err != nil { - return nil, err - } - - out := make([]key.Key, 0, len(entries)) - seen := make(map[key.Key]struct{}) - for _, e := range entries { - parts := strings.Split(e.Key, "/") - if len(parts) != 4 { - log.Warning("incorrectly formatted provider entry in datastore") - continue - } - decoded, err := base32.RawStdEncoding.DecodeString(parts[2]) - if err != nil { - log.Warning("error decoding base32 provider key") - continue - } - - k := key.Key(decoded) - if _, ok := seen[k]; !ok { - out = append(out, key.Key(decoded)) - seen[k] = struct{}{} - } - } - - return out, nil -} - -func (pm *ProviderManager) run() { - tick := time.NewTicker(pm.cleanupInterval) - for { - select { - case np := <-pm.newprovs: - err := pm.addProv(np.k, np.val) - if err != nil { - log.Error("error adding new providers: ", err) - } - case gp := <-pm.getprovs: - provs, err := pm.providersForKey(gp.k) - if err != nil && err != ds.ErrNotFound { - log.Error("error reading providers: ", err) - } - - gp.resp <- provs - case <-tick.C: - keys, err := pm.getAllProvKeys() - if err != nil { - log.Error("Error loading provider keys: ", err) - continue - } - for _, k := range keys { - provs, err := pm.getProvSet(k) - if err != nil { - log.Error("error loading known provset: ", err) - continue - } - var filtered []peer.ID - for p, t := range provs.set { - if time.Now().Sub(t) > ProvideValidity { - delete(provs.set, p) - } else { - filtered = append(filtered, p) - } - } - - if len(filtered) > 0 { - provs.providers = filtered - } else { - err := pm.deleteProvSet(k) - if err != nil { - log.Error("error deleting provider set: ", err) - } - } - } - case <-pm.proc.Closing(): - return - } - } -} - -func (pm *ProviderManager) AddProvider(ctx context.Context, k key.Key, val peer.ID) { - prov := &addProv{ - k: k, - val: val, - } - select { - case pm.newprovs <- prov: - case <-ctx.Done(): - } -} - -func (pm *ProviderManager) GetProviders(ctx context.Context, k key.Key) []peer.ID { - gp := &getProv{ - k: k, - resp: make(chan []peer.ID, 1), // buffered to prevent sender from blocking - } - select { - case <-ctx.Done(): - return nil - case pm.getprovs <- gp: - } - select { - case <-ctx.Done(): - return nil - case peers := <-gp.resp: - return peers - } -} - -func newProviderSet() *providerSet { - return &providerSet{ - set: make(map[peer.ID]time.Time), - } -} - -func (ps *providerSet) Add(p peer.ID) { - ps.setVal(p, time.Now()) -} - -func (ps *providerSet) setVal(p peer.ID, t time.Time) { - _, found := ps.set[p] - if !found { - ps.providers = append(ps.providers, p) - } - - ps.set[p] = t -} diff --git a/routing/dht/providers/providers_test.go b/routing/dht/providers/providers_test.go deleted file mode 100644 index 01cee7b73c..0000000000 --- a/routing/dht/providers/providers_test.go +++ /dev/null @@ -1,150 +0,0 @@ -package providers - -import ( - "fmt" - "testing" - "time" - - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -func TestProviderManager(t *testing.T) { - ctx := context.Background() - mid := peer.ID("testing") - p := NewProviderManager(ctx, mid, ds.NewMapDatastore()) - a := key.Key("test") - p.AddProvider(ctx, a, peer.ID("testingprovider")) - resp := p.GetProviders(ctx, a) - if len(resp) != 1 { - t.Fatal("Could not retrieve provider.") - } - p.proc.Close() -} - -func TestProvidersDatastore(t *testing.T) { - old := lruCacheSize - lruCacheSize = 10 - defer func() { lruCacheSize = old }() - - ctx := context.Background() - mid := peer.ID("testing") - p := NewProviderManager(ctx, mid, ds.NewMapDatastore()) - defer p.proc.Close() - - friend := peer.ID("friend") - var keys []key.Key - for i := 0; i < 100; i++ { - k := key.Key(fmt.Sprint(i)) - keys = append(keys, k) - p.AddProvider(ctx, k, friend) - } - - for _, k := range keys { - resp := p.GetProviders(ctx, k) - if len(resp) != 1 { - t.Fatal("Could not retrieve provider.") - } - if resp[0] != friend { - t.Fatal("expected provider to be 'friend'") - } - } -} - -func TestProvidersSerialization(t *testing.T) { - dstore := ds.NewMapDatastore() - - k := key.Key("my key!") - p1 := peer.ID("peer one") - p2 := peer.ID("peer two") - pt1 := time.Now() - pt2 := pt1.Add(time.Hour) - - err := writeProviderEntry(dstore, k, p1, pt1) - if err != nil { - t.Fatal(err) - } - - err = writeProviderEntry(dstore, k, p2, pt2) - if err != nil { - t.Fatal(err) - } - - pset, err := loadProvSet(dstore, k) - if err != nil { - t.Fatal(err) - } - - lt1, ok := pset.set[p1] - if !ok { - t.Fatal("failed to load set correctly") - } - - if pt1 != lt1 { - t.Fatal("time wasnt serialized correctly") - } - - lt2, ok := pset.set[p2] - if !ok { - t.Fatal("failed to load set correctly") - } - - if pt2 != lt2 { - t.Fatal("time wasnt serialized correctly") - } -} - -func TestProvidesExpire(t *testing.T) { - pval := ProvideValidity - cleanup := defaultCleanupInterval - ProvideValidity = time.Second / 2 - defaultCleanupInterval = time.Second / 2 - defer func() { - ProvideValidity = pval - defaultCleanupInterval = cleanup - }() - - ctx := context.Background() - mid := peer.ID("testing") - p := NewProviderManager(ctx, mid, ds.NewMapDatastore()) - - peers := []peer.ID{"a", "b"} - var keys []key.Key - for i := 0; i < 10; i++ { - k := key.Key(i) - keys = append(keys, k) - p.AddProvider(ctx, k, peers[0]) - p.AddProvider(ctx, k, peers[1]) - } - - for i := 0; i < 10; i++ { - out := p.GetProviders(ctx, keys[i]) - if len(out) != 2 { - t.Fatal("expected providers to still be there") - } - } - - time.Sleep(time.Second) - for i := 0; i < 10; i++ { - out := p.GetProviders(ctx, keys[i]) - if len(out) > 2 { - t.Fatal("expected providers to be cleaned up") - } - } - - if p.providers.Len() != 0 { - t.Fatal("providers map not cleaned up") - } - - allprovs, err := p.getAllProvKeys() - if err != nil { - t.Fatal(err) - } - - if len(allprovs) != 0 { - t.Fatal("expected everything to be cleaned out of the datastore") - } -} diff --git a/routing/dht/query.go b/routing/dht/query.go deleted file mode 100644 index d17e00e2db..0000000000 --- a/routing/dht/query.go +++ /dev/null @@ -1,298 +0,0 @@ -package dht - -import ( - "sync" - - pset "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer/peerset" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - notif "github.com/ipfs/go-ipfs/notifications" - "github.com/ipfs/go-ipfs/routing" - todoctr "github.com/ipfs/go-ipfs/thirdparty/todocounter" - - process "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - ctxproc "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" - queue "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore/queue" -) - -var maxQueryConcurrency = AlphaValue - -type dhtQuery struct { - dht *IpfsDHT - key key.Key // the key we're querying for - qfunc queryFunc // the function to execute per peer - concurrency int // the concurrency parameter -} - -type dhtQueryResult struct { - value []byte // GetValue - peer pstore.PeerInfo // FindPeer - providerPeers []pstore.PeerInfo // GetProviders - closerPeers []pstore.PeerInfo // * - success bool -} - -// constructs query -func (dht *IpfsDHT) newQuery(k key.Key, f queryFunc) *dhtQuery { - return &dhtQuery{ - key: k, - dht: dht, - qfunc: f, - concurrency: maxQueryConcurrency, - } -} - -// QueryFunc is a function that runs a particular query with a given peer. -// It returns either: -// - the value -// - a list of peers potentially better able to serve the query -// - an error -type queryFunc func(context.Context, peer.ID) (*dhtQueryResult, error) - -// Run runs the query at hand. pass in a list of peers to use first. -func (q *dhtQuery) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { - select { - case <-ctx.Done(): - return nil, ctx.Err() - default: - } - - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - runner := newQueryRunner(q) - return runner.Run(ctx, peers) -} - -type dhtQueryRunner struct { - query *dhtQuery // query to run - peersSeen *pset.PeerSet // all peers queried. prevent querying same peer 2x - peersToQuery *queue.ChanQueue // peers remaining to be queried - peersRemaining todoctr.Counter // peersToQuery + currently processing - - result *dhtQueryResult // query result - errs u.MultiErr // result errors. maybe should be a map[peer.ID]error - - rateLimit chan struct{} // processing semaphore - log logging.EventLogger - - runCtx context.Context - - proc process.Process - sync.RWMutex -} - -func newQueryRunner(q *dhtQuery) *dhtQueryRunner { - proc := process.WithParent(process.Background()) - ctx := ctxproc.OnClosingContext(proc) - return &dhtQueryRunner{ - query: q, - peersToQuery: queue.NewChanQueue(ctx, queue.NewXORDistancePQ(string(q.key))), - peersRemaining: todoctr.NewSyncCounter(), - peersSeen: pset.New(), - rateLimit: make(chan struct{}, q.concurrency), - proc: proc, - } -} - -func (r *dhtQueryRunner) Run(ctx context.Context, peers []peer.ID) (*dhtQueryResult, error) { - r.log = log - r.runCtx = ctx - - if len(peers) == 0 { - log.Warning("Running query with no peers!") - return nil, nil - } - - // setup concurrency rate limiting - for i := 0; i < r.query.concurrency; i++ { - r.rateLimit <- struct{}{} - } - - // add all the peers we got first. - for _, p := range peers { - r.addPeerToQuery(p) - } - - // go do this thing. - // do it as a child proc to make sure Run exits - // ONLY AFTER spawn workers has exited. - r.proc.Go(r.spawnWorkers) - - // so workers are working. - - // wait until they're done. - err := routing.ErrNotFound - - // now, if the context finishes, close the proc. - // we have to do it here because the logic before is setup, which - // should run without closing the proc. - ctxproc.CloseAfterContext(r.proc, ctx) - - select { - case <-r.peersRemaining.Done(): - r.proc.Close() - r.RLock() - defer r.RUnlock() - - err = routing.ErrNotFound - - // if every query to every peer failed, something must be very wrong. - if len(r.errs) > 0 && len(r.errs) == r.peersSeen.Size() { - log.Debugf("query errs: %s", r.errs) - err = r.errs[0] - } - - case <-r.proc.Closed(): - r.RLock() - defer r.RUnlock() - err = context.DeadlineExceeded - } - - if r.result != nil && r.result.success { - return r.result, nil - } - - return nil, err -} - -func (r *dhtQueryRunner) addPeerToQuery(next peer.ID) { - // if new peer is ourselves... - if next == r.query.dht.self { - r.log.Debug("addPeerToQuery skip self") - return - } - - if !r.peersSeen.TryAdd(next) { - return - } - - notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ - Type: notif.AddingPeer, - ID: next, - }) - - r.peersRemaining.Increment(1) - select { - case r.peersToQuery.EnqChan <- next: - case <-r.proc.Closing(): - } -} - -func (r *dhtQueryRunner) spawnWorkers(proc process.Process) { - for { - - select { - case <-r.peersRemaining.Done(): - return - - case <-r.proc.Closing(): - return - - case <-r.rateLimit: - select { - case p, more := <-r.peersToQuery.DeqChan: - if !more { - return // channel closed. - } - - // do it as a child func to make sure Run exits - // ONLY AFTER spawn workers has exited. - proc.Go(func(proc process.Process) { - r.queryPeer(proc, p) - }) - case <-r.proc.Closing(): - return - case <-r.peersRemaining.Done(): - return - } - } - } -} - -func (r *dhtQueryRunner) queryPeer(proc process.Process, p peer.ID) { - // ok let's do this! - - // create a context from our proc. - ctx := ctxproc.OnClosingContext(proc) - - // make sure we do this when we exit - defer func() { - // signal we're done proccessing peer p - r.peersRemaining.Decrement(1) - r.rateLimit <- struct{}{} - }() - - // make sure we're connected to the peer. - // FIXME abstract away into the network layer - if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { - log.Debug("not connected. dialing.") - - notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ - Type: notif.DialingPeer, - ID: p, - }) - // while we dial, we do not take up a rate limit. this is to allow - // forward progress during potentially very high latency dials. - r.rateLimit <- struct{}{} - - pi := pstore.PeerInfo{ID: p} - - if err := r.query.dht.host.Connect(ctx, pi); err != nil { - log.Debugf("Error connecting: %s", err) - - notif.PublishQueryEvent(r.runCtx, ¬if.QueryEvent{ - Type: notif.QueryError, - Extra: err.Error(), - ID: p, - }) - - r.Lock() - r.errs = append(r.errs, err) - r.Unlock() - <-r.rateLimit // need to grab it again, as we deferred. - return - } - <-r.rateLimit // need to grab it again, as we deferred. - log.Debugf("connected. dial success.") - } - - // finally, run the query against this peer - res, err := r.query.qfunc(ctx, p) - - if err != nil { - log.Debugf("ERROR worker for: %v %v", p, err) - r.Lock() - r.errs = append(r.errs, err) - r.Unlock() - - } else if res.success { - log.Debugf("SUCCESS worker for: %v %s", p, res) - r.Lock() - r.result = res - r.Unlock() - go r.proc.Close() // signal to everyone that we're done. - // must be async, as we're one of the children, and Close blocks. - - } else if len(res.closerPeers) > 0 { - log.Debugf("PEERS CLOSER -- worker for: %v (%d closer peers)", p, len(res.closerPeers)) - for _, next := range res.closerPeers { - if next.ID == r.query.dht.self { // dont add self. - log.Debugf("PEERS CLOSER -- worker for: %v found self", p) - continue - } - - // add their addresses to the dialer's peerstore - r.query.dht.peerstore.AddAddrs(next.ID, next.Addrs, pstore.TempAddrTTL) - r.addPeerToQuery(next.ID) - log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) - } - } else { - log.Debugf("QUERY worker for: %v - not found, and no closer peers.", p) - } -} diff --git a/routing/dht/records.go b/routing/dht/records.go deleted file mode 100644 index af71698610..0000000000 --- a/routing/dht/records.go +++ /dev/null @@ -1,149 +0,0 @@ -package dht - -import ( - "fmt" - "time" - - routing "github.com/ipfs/go-ipfs/routing" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - record "github.com/ipfs/go-ipfs/routing/record" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - ctxfrac "gx/ipfs/QmX6DhWrpBB5NtadXmPSXYNdVvuLfJXoFNMvUMoVvP5UJa/go-context/frac" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" -) - -// MaxRecordAge specifies the maximum time that any node will hold onto a record -// from the time its received. This does not apply to any other forms of validity that -// the record may contain. -// For example, a record may contain an ipns entry with an EOL saying its valid -// until the year 2020 (a great time in the future). For that record to stick around -// it must be rebroadcasted more frequently than once every 'MaxRecordAge' -const MaxRecordAge = time.Hour * 36 - -func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { - log.Debugf("getPublicKey for: %s", p) - - // check locally. - pk := dht.peerstore.PubKey(p) - if pk != nil { - return pk, nil - } - - // ok, try the node itself. if they're overwhelmed or slow we can move on. - ctxT, cancelFunc := ctxfrac.WithDeadlineFraction(ctx, 0.3) - defer cancelFunc() - if pk, err := dht.getPublicKeyFromNode(ctx, p); err == nil { - err := dht.peerstore.AddPubKey(p, pk) - if err != nil { - return pk, err - } - return pk, nil - } - - // last ditch effort: let's try the dht. - log.Debugf("pk for %s not in peerstore, and peer failed. Trying DHT.", p) - pkkey := routing.KeyForPublicKey(p) - - val, err := dht.GetValue(ctxT, pkkey) - if err != nil { - log.Warning("Failed to find requested public key.") - return nil, err - } - - pk, err = ci.UnmarshalPublicKey(val) - if err != nil { - log.Debugf("Failed to unmarshal public key: %s", err) - return nil, err - } - - return pk, dht.peerstore.AddPubKey(p, pk) -} - -func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.PubKey, error) { - - // check locally, just in case... - pk := dht.peerstore.PubKey(p) - if pk != nil { - return pk, nil - } - - pkkey := routing.KeyForPublicKey(p) - pmes, err := dht.getValueSingle(ctx, p, pkkey) - if err != nil { - return nil, err - } - - // node doesn't have key :( - record := pmes.GetRecord() - if record == nil { - return nil, fmt.Errorf("Node not responding with its public key: %s", p) - } - - // Success! We were given the value. we don't need to check - // validity because a) we can't. b) we know the hash of the - // key we're looking for. - val := record.GetValue() - log.Debug("DHT got a value from other peer") - - pk, err = ci.UnmarshalPublicKey(val) - if err != nil { - return nil, err - } - - id, err := peer.IDFromPublicKey(pk) - if err != nil { - return nil, err - } - if id != p { - return nil, fmt.Errorf("public key does not match id: %s", p) - } - - // ok! it's valid. we got it! - log.Debugf("DHT got public key from node itself.") - return pk, nil -} - -// verifyRecordLocally attempts to verify a record. if we do not have the public -// key, we fail. we do not search the dht. -func (dht *IpfsDHT) verifyRecordLocally(r *pb.Record) error { - - if len(r.Signature) > 0 { - // First, validate the signature - p := peer.ID(r.GetAuthor()) - pk := dht.peerstore.PubKey(p) - if pk == nil { - return fmt.Errorf("do not have public key for %s", p) - } - - if err := record.CheckRecordSig(r, pk); err != nil { - return err - } - } - - return dht.Validator.VerifyRecord(r) -} - -// verifyRecordOnline verifies a record, searching the DHT for the public key -// if necessary. The reason there is a distinction in the functions is that -// retrieving arbitrary public keys from the DHT as a result of passively -// receiving records (e.g. through a PUT_VALUE or ADD_PROVIDER) can cause a -// massive amplification attack on the dht. Use with care. -func (dht *IpfsDHT) verifyRecordOnline(ctx context.Context, r *pb.Record) error { - - if len(r.Signature) > 0 { - // get the public key, search for it if necessary. - p := peer.ID(r.GetAuthor()) - pk, err := dht.GetPublicKey(ctx, p) - if err != nil { - return err - } - - err = record.CheckRecordSig(r, pk) - if err != nil { - return err - } - } - - return dht.Validator.VerifyRecord(r) -} diff --git a/routing/dht/routing.go b/routing/dht/routing.go deleted file mode 100644 index 8b72a17118..0000000000 --- a/routing/dht/routing.go +++ /dev/null @@ -1,538 +0,0 @@ -package dht - -import ( - "bytes" - "fmt" - "runtime" - "sync" - "time" - - pset "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer/peerset" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - notif "github.com/ipfs/go-ipfs/notifications" - "github.com/ipfs/go-ipfs/routing" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - kb "github.com/ipfs/go-ipfs/routing/kbucket" - record "github.com/ipfs/go-ipfs/routing/record" - - inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -// asyncQueryBuffer is the size of buffered channels in async queries. This -// buffer allows multiple queries to execute simultaneously, return their -// results and continue querying closer peers. Note that different query -// results will wait for the channel to drain. -var asyncQueryBuffer = 10 - -// This file implements the Routing interface for the IpfsDHT struct. - -// Basic Put/Get - -// PutValue adds value corresponding to given Key. -// This is the top level "Store" operation of the DHT -func (dht *IpfsDHT) PutValue(ctx context.Context, key key.Key, value []byte) error { - log.Debugf("PutValue %s", key) - sk, err := dht.getOwnPrivateKey() - if err != nil { - return err - } - - sign, err := dht.Validator.IsSigned(key) - if err != nil { - return err - } - - rec, err := record.MakePutRecord(sk, key, value, sign) - if err != nil { - log.Debug("creation of record failed!") - return err - } - - err = dht.putLocal(key, rec) - if err != nil { - return err - } - - pchan, err := dht.GetClosestPeers(ctx, key) - if err != nil { - return err - } - - wg := sync.WaitGroup{} - for p := range pchan { - wg.Add(1) - go func(p peer.ID) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - defer wg.Done() - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ - Type: notif.Value, - ID: p, - }) - - err := dht.putValueToPeer(ctx, p, key, rec) - if err != nil { - log.Debugf("failed putting value to peer: %s", err) - } - }(p) - } - wg.Wait() - return nil -} - -// GetValue searches for the value corresponding to given Key. -func (dht *IpfsDHT) GetValue(ctx context.Context, key key.Key) ([]byte, error) { - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - - vals, err := dht.GetValues(ctx, key, 16) - if err != nil { - return nil, err - } - - var recs [][]byte - for _, v := range vals { - if v.Val != nil { - recs = append(recs, v.Val) - } - } - - i, err := dht.Selector.BestRecord(key, recs) - if err != nil { - return nil, err - } - - best := recs[i] - log.Debugf("GetValue %v %v", key, best) - if best == nil { - log.Errorf("GetValue yielded correct record with nil value.") - return nil, routing.ErrNotFound - } - - fixupRec, err := record.MakePutRecord(dht.peerstore.PrivKey(dht.self), key, best, true) - if err != nil { - // probably shouldnt actually 'error' here as we have found a value we like, - // but this call failing probably isnt something we want to ignore - return nil, err - } - - for _, v := range vals { - // if someone sent us a different 'less-valid' record, lets correct them - if !bytes.Equal(v.Val, best) { - go func(v routing.RecvdVal) { - if v.From == dht.self { - err := dht.putLocal(key, fixupRec) - if err != nil { - log.Error("Error correcting local dht entry:", err) - } - return - } - ctx, cancel := context.WithTimeout(dht.Context(), time.Second*30) - defer cancel() - err := dht.putValueToPeer(ctx, v.From, key, fixupRec) - if err != nil { - log.Error("Error correcting DHT entry: ", err) - } - }(v) - } - } - - return best, nil -} - -func (dht *IpfsDHT) GetValues(ctx context.Context, key key.Key, nvals int) ([]routing.RecvdVal, error) { - var vals []routing.RecvdVal - var valslock sync.Mutex - - // If we have it local, dont bother doing an RPC! - lrec, err := dht.getLocal(key) - if err == nil { - // TODO: this is tricky, we dont always want to trust our own value - // what if the authoritative source updated it? - log.Debug("have it locally") - vals = append(vals, routing.RecvdVal{ - Val: lrec.GetValue(), - From: dht.self, - }) - - if nvals <= 1 { - return vals, nil - } - } else if nvals == 0 { - return nil, err - } - - // get closest peers in the routing table - rtp := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) - log.Debugf("peers in rt: %s", len(rtp), rtp) - if len(rtp) == 0 { - log.Warning("No peers from routing table!") - return nil, kb.ErrLookupFailure - } - - // setup the Query - parent := ctx - query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.SendingQuery, - ID: p, - }) - - rec, peers, err := dht.getValueOrPeers(ctx, p, key) - switch err { - case routing.ErrNotFound: - // in this case, they responded with nothing, - // still send a notification so listeners can know the - // request has completed 'successfully' - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, - ID: p, - }) - return nil, err - default: - return nil, err - - case nil, errInvalidRecord: - // in either of these cases, we want to keep going - } - - res := &dhtQueryResult{closerPeers: peers} - - if rec.GetValue() != nil || err == errInvalidRecord { - rv := routing.RecvdVal{ - Val: rec.GetValue(), - From: p, - } - valslock.Lock() - vals = append(vals, rv) - - // If weve collected enough records, we're done - if len(vals) >= nvals { - res.success = true - } - valslock.Unlock() - } - - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, - ID: p, - Responses: pointerizePeerInfos(peers), - }) - - return res, nil - }) - - // run it! - _, err = query.Run(ctx, rtp) - if len(vals) == 0 { - if err != nil { - return nil, err - } - } - - return vals, nil - -} - -// Value provider layer of indirection. -// This is what DSHTs (Coral and MainlineDHT) do to store large values in a DHT. - -// Provide makes this node announce that it can provide a value for the given key -func (dht *IpfsDHT) Provide(ctx context.Context, key key.Key) error { - defer log.EventBegin(ctx, "provide", &key).Done() - - // add self locally - dht.providers.AddProvider(ctx, key, dht.self) - - peers, err := dht.GetClosestPeers(ctx, key) - if err != nil { - return err - } - - mes, err := dht.makeProvRecord(key) - if err != nil { - return err - } - - wg := sync.WaitGroup{} - for p := range peers { - wg.Add(1) - go func(p peer.ID) { - defer wg.Done() - log.Debugf("putProvider(%s, %s)", key, p) - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ - Type: notif.FinalPeer, - ID: p, - }) - err := dht.sendMessage(ctx, p, mes) - if err != nil { - log.Debug(err) - } - }(p) - } - wg.Wait() - return nil -} - -func (dht *IpfsDHT) makeProvRecord(skey key.Key) (*pb.Message, error) { - pi := pstore.PeerInfo{ - ID: dht.self, - Addrs: dht.host.Addrs(), - } - - // // only share WAN-friendly addresses ?? - // pi.Addrs = addrutil.WANShareableAddrs(pi.Addrs) - if len(pi.Addrs) < 1 { - return nil, fmt.Errorf("no known addresses for self. cannot put provider.") - } - - pmes := pb.NewMessage(pb.Message_ADD_PROVIDER, string(skey), 0) - pmes.ProviderPeers = pb.RawPeerInfosToPBPeers([]pstore.PeerInfo{pi}) - return pmes, nil -} - -// FindProviders searches until the context expires. -func (dht *IpfsDHT) FindProviders(ctx context.Context, key key.Key) ([]pstore.PeerInfo, error) { - var providers []pstore.PeerInfo - for p := range dht.FindProvidersAsync(ctx, key, KValue) { - providers = append(providers, p) - } - return providers, nil -} - -// FindProvidersAsync is the same thing as FindProviders, but returns a channel. -// Peers will be returned on the channel as soon as they are found, even before -// the search query completes. -func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key key.Key, count int) <-chan pstore.PeerInfo { - log.Event(ctx, "findProviders", &key) - peerOut := make(chan pstore.PeerInfo, count) - go dht.findProvidersAsyncRoutine(ctx, key, count, peerOut) - return peerOut -} - -func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key key.Key, count int, peerOut chan pstore.PeerInfo) { - defer log.EventBegin(ctx, "findProvidersAsync", &key).Done() - defer close(peerOut) - - ps := pset.NewLimited(count) - provs := dht.providers.GetProviders(ctx, key) - for _, p := range provs { - // NOTE: Assuming that this list of peers is unique - if ps.TryAdd(p) { - select { - case peerOut <- dht.peerstore.PeerInfo(p): - case <-ctx.Done(): - return - } - } - - // If we have enough peers locally, dont bother with remote RPC - if ps.Size() >= count { - return - } - } - - // setup the Query - parent := ctx - query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.SendingQuery, - ID: p, - }) - pmes, err := dht.findProvidersSingle(ctx, p, key) - if err != nil { - return nil, err - } - - log.Debugf("%d provider entries", len(pmes.GetProviderPeers())) - provs := pb.PBPeersToPeerInfos(pmes.GetProviderPeers()) - log.Debugf("%d provider entries decoded", len(provs)) - - // Add unique providers from request, up to 'count' - for _, prov := range provs { - log.Debugf("got provider: %s", prov) - if ps.TryAdd(prov.ID) { - log.Debugf("using provider: %s", prov) - select { - case peerOut <- prov: - case <-ctx.Done(): - log.Debug("context timed out sending more providers") - return nil, ctx.Err() - } - } - if ps.Size() >= count { - log.Debugf("got enough providers (%d/%d)", ps.Size(), count) - return &dhtQueryResult{success: true}, nil - } - } - - // Give closer peers back to the query to be queried - closer := pmes.GetCloserPeers() - clpeers := pb.PBPeersToPeerInfos(closer) - log.Debugf("got closer peers: %d %s", len(clpeers), clpeers) - - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, - ID: p, - Responses: pointerizePeerInfos(clpeers), - }) - return &dhtQueryResult{closerPeers: clpeers}, nil - }) - - peers := dht.routingTable.NearestPeers(kb.ConvertKey(key), KValue) - _, err := query.Run(ctx, peers) - if err != nil { - log.Debugf("Query error: %s", err) - // Special handling for issue: https://github.com/ipfs/go-ipfs/issues/3032 - if fmt.Sprint(err) == "" { - log.Error("reproduced bug 3032:") - log.Errorf("Errors type information: %#v", err) - log.Errorf("go version: %s", runtime.Version()) - log.Error("please report this information to: https://github.com/ipfs/go-ipfs/issues/3032") - - // replace problematic error with something that won't crash the daemon - err = fmt.Errorf("") - } - notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ - Type: notif.QueryError, - Extra: err.Error(), - }) - } -} - -// FindPeer searches for a peer with given ID. -func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, error) { - defer log.EventBegin(ctx, "FindPeer", id).Done() - - // Check if were already connected to them - if pi := dht.FindLocal(id); pi.ID != "" { - return pi, nil - } - - peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), KValue) - if len(peers) == 0 { - return pstore.PeerInfo{}, kb.ErrLookupFailure - } - - // Sanity... - for _, p := range peers { - if p == id { - log.Debug("found target peer in list of closest peers...") - return dht.peerstore.PeerInfo(p), nil - } - } - - // setup the Query - parent := ctx - query := dht.newQuery(key.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.SendingQuery, - ID: p, - }) - - pmes, err := dht.findPeerSingle(ctx, p, id) - if err != nil { - return nil, err - } - - closer := pmes.GetCloserPeers() - clpeerInfos := pb.PBPeersToPeerInfos(closer) - - // see it we got the peer here - for _, npi := range clpeerInfos { - if npi.ID == id { - return &dhtQueryResult{ - peer: npi, - success: true, - }, nil - } - } - - notif.PublishQueryEvent(parent, ¬if.QueryEvent{ - Type: notif.PeerResponse, - Responses: pointerizePeerInfos(clpeerInfos), - }) - - return &dhtQueryResult{closerPeers: clpeerInfos}, nil - }) - - // run it! - result, err := query.Run(ctx, peers) - if err != nil { - return pstore.PeerInfo{}, err - } - - log.Debugf("FindPeer %v %v", id, result.success) - if result.peer.ID == "" { - return pstore.PeerInfo{}, routing.ErrNotFound - } - - return result.peer, nil -} - -// FindPeersConnectedToPeer searches for peers directly connected to a given peer. -func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (<-chan pstore.PeerInfo, error) { - - peerchan := make(chan pstore.PeerInfo, asyncQueryBuffer) - peersSeen := make(map[peer.ID]struct{}) - - peers := dht.routingTable.NearestPeers(kb.ConvertPeerID(id), KValue) - if len(peers) == 0 { - return nil, kb.ErrLookupFailure - } - - // setup the Query - query := dht.newQuery(key.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { - - pmes, err := dht.findPeerSingle(ctx, p, id) - if err != nil { - return nil, err - } - - var clpeers []pstore.PeerInfo - closer := pmes.GetCloserPeers() - for _, pbp := range closer { - pi := pb.PBPeerToPeerInfo(pbp) - - // skip peers already seen - if _, found := peersSeen[pi.ID]; found { - continue - } - peersSeen[pi.ID] = struct{}{} - - // if peer is connected, send it to our client. - if pb.Connectedness(*pbp.Connection) == inet.Connected { - select { - case <-ctx.Done(): - return nil, ctx.Err() - case peerchan <- pi: - } - } - - // if peer is the peer we're looking for, don't bother querying it. - // TODO maybe query it? - if pb.Connectedness(*pbp.Connection) != inet.Connected { - clpeers = append(clpeers, pi) - } - } - - return &dhtQueryResult{closerPeers: clpeers}, nil - }) - - // run it! run it asynchronously to gen peers as results are found. - // this does no error checking - go func() { - if _, err := query.Run(ctx, peers); err != nil { - log.Debug(err) - } - - // close the peerchan channel when done. - close(peerchan) - }() - - return peerchan, nil -} diff --git a/routing/dht/util.go b/routing/dht/util.go deleted file mode 100644 index a605759a95..0000000000 --- a/routing/dht/util.go +++ /dev/null @@ -1,39 +0,0 @@ -package dht - -import ( - "sync" -) - -// Pool size is the number of nodes used for group find/set RPC calls -var PoolSize = 6 - -// K is the maximum number of requests to perform before returning failure. -var KValue = 20 - -// Alpha is the concurrency factor for asynchronous requests. -var AlphaValue = 3 - -// A counter for incrementing a variable across multiple threads -type counter struct { - n int - mut sync.Mutex -} - -func (c *counter) Increment() { - c.mut.Lock() - c.n++ - c.mut.Unlock() -} - -func (c *counter) Decrement() { - c.mut.Lock() - c.n-- - c.mut.Unlock() -} - -func (c *counter) Size() (s int) { - c.mut.Lock() - s = c.n - c.mut.Unlock() - return -} diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go deleted file mode 100644 index d280d91403..0000000000 --- a/routing/kbucket/bucket.go +++ /dev/null @@ -1,108 +0,0 @@ -package kbucket - -import ( - "container/list" - "sync" - - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" -) - -// Bucket holds a list of peers. -type Bucket struct { - lk sync.RWMutex - list *list.List -} - -func newBucket() *Bucket { - b := new(Bucket) - b.list = list.New() - return b -} - -func (b *Bucket) Peers() []peer.ID { - b.lk.RLock() - defer b.lk.RUnlock() - ps := make([]peer.ID, 0, b.list.Len()) - for e := b.list.Front(); e != nil; e = e.Next() { - id := e.Value.(peer.ID) - ps = append(ps, id) - } - return ps -} - -func (b *Bucket) Has(id peer.ID) bool { - b.lk.RLock() - defer b.lk.RUnlock() - for e := b.list.Front(); e != nil; e = e.Next() { - if e.Value.(peer.ID) == id { - return true - } - } - return false -} - -func (b *Bucket) Remove(id peer.ID) { - b.lk.Lock() - defer b.lk.Unlock() - for e := b.list.Front(); e != nil; e = e.Next() { - if e.Value.(peer.ID) == id { - b.list.Remove(e) - } - } -} - -func (b *Bucket) MoveToFront(id peer.ID) { - b.lk.Lock() - defer b.lk.Unlock() - for e := b.list.Front(); e != nil; e = e.Next() { - if e.Value.(peer.ID) == id { - b.list.MoveToFront(e) - } - } -} - -func (b *Bucket) PushFront(p peer.ID) { - b.lk.Lock() - b.list.PushFront(p) - b.lk.Unlock() -} - -func (b *Bucket) PopBack() peer.ID { - b.lk.Lock() - defer b.lk.Unlock() - last := b.list.Back() - b.list.Remove(last) - return last.Value.(peer.ID) -} - -func (b *Bucket) Len() int { - b.lk.RLock() - defer b.lk.RUnlock() - return b.list.Len() -} - -// Split splits a buckets peers into two buckets, the methods receiver will have -// peers with CPL equal to cpl, the returned bucket will have peers with CPL -// greater than cpl (returned bucket has closer peers) -func (b *Bucket) Split(cpl int, target ID) *Bucket { - b.lk.Lock() - defer b.lk.Unlock() - - out := list.New() - newbuck := newBucket() - newbuck.list = out - e := b.list.Front() - for e != nil { - peerID := ConvertPeerID(e.Value.(peer.ID)) - peerCPL := commonPrefixLen(peerID, target) - if peerCPL > cpl { - cur := e - out.PushBack(e.Value) - e = e.Next() - b.list.Remove(cur) - continue - } - e = e.Next() - } - return newbuck -} diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go deleted file mode 100644 index f662640f2e..0000000000 --- a/routing/kbucket/sorting.go +++ /dev/null @@ -1,55 +0,0 @@ -package kbucket - -import ( - "container/list" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - "sort" -) - -// A helper struct to sort peers by their distance to the local node -type peerDistance struct { - p peer.ID - distance ID -} - -// peerSorterArr implements sort.Interface to sort peers by xor distance -type peerSorterArr []*peerDistance - -func (p peerSorterArr) Len() int { return len(p) } -func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } -func (p peerSorterArr) Less(a, b int) bool { - return p[a].distance.less(p[b].distance) -} - -// - -func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(peer.ID) - pID := ConvertPeerID(p) - pd := peerDistance{ - p: p, - distance: xor(target, pID), - } - peerArr = append(peerArr, &pd) - } - return peerArr -} - -func SortClosestPeers(peers []peer.ID, target ID) []peer.ID { - var psarr peerSorterArr - for _, p := range peers { - pID := ConvertPeerID(p) - pd := &peerDistance{ - p: p, - distance: xor(target, pID), - } - psarr = append(psarr, pd) - } - sort.Sort(psarr) - var out []peer.ID - for _, p := range psarr { - out = append(out, p.p) - } - return out -} diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go deleted file mode 100644 index 6c4827a32a..0000000000 --- a/routing/kbucket/table.go +++ /dev/null @@ -1,225 +0,0 @@ -// package kbucket implements a kademlia 'k-bucket' routing table. -package kbucket - -import ( - "fmt" - "sort" - "sync" - "time" - - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -var log = logging.Logger("table") - -// RoutingTable defines the routing table. -type RoutingTable struct { - - // ID of the local peer - local ID - - // Blanket lock, refine later for better performance - tabLock sync.RWMutex - - // latency metrics - metrics pstore.Metrics - - // Maximum acceptable latency for peers in this cluster - maxLatency time.Duration - - // kBuckets define all the fingers to other nodes. - Buckets []*Bucket - bucketsize int -} - -// NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. -func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m pstore.Metrics) *RoutingTable { - rt := new(RoutingTable) - rt.Buckets = []*Bucket{newBucket()} - rt.bucketsize = bucketsize - rt.local = localID - rt.maxLatency = latency - rt.metrics = m - return rt -} - -// Update adds or moves the given peer to the front of its respective bucket -// If a peer gets removed from a bucket, it is returned -func (rt *RoutingTable) Update(p peer.ID) { - peerID := ConvertPeerID(p) - cpl := commonPrefixLen(peerID, rt.local) - - rt.tabLock.Lock() - defer rt.tabLock.Unlock() - bucketID := cpl - if bucketID >= len(rt.Buckets) { - bucketID = len(rt.Buckets) - 1 - } - - bucket := rt.Buckets[bucketID] - if bucket.Has(p) { - // If the peer is already in the table, move it to the front. - // This signifies that it it "more active" and the less active nodes - // Will as a result tend towards the back of the list - bucket.MoveToFront(p) - return - } - - if rt.metrics.LatencyEWMA(p) > rt.maxLatency { - // Connection doesnt meet requirements, skip! - return - } - - // New peer, add to bucket - bucket.PushFront(p) - - // Are we past the max bucket size? - if bucket.Len() > rt.bucketsize { - // If this bucket is the rightmost bucket, and its full - // we need to split it and create a new bucket - if bucketID == len(rt.Buckets)-1 { - rt.nextBucket() - return - } else { - // If the bucket cant split kick out least active node - bucket.PopBack() - return - } - } -} - -// Remove deletes a peer from the routing table. This is to be used -// when we are sure a node has disconnected completely. -func (rt *RoutingTable) Remove(p peer.ID) { - rt.tabLock.Lock() - defer rt.tabLock.Unlock() - peerID := ConvertPeerID(p) - cpl := commonPrefixLen(peerID, rt.local) - - bucketID := cpl - if bucketID >= len(rt.Buckets) { - bucketID = len(rt.Buckets) - 1 - } - - bucket := rt.Buckets[bucketID] - bucket.Remove(p) -} - -func (rt *RoutingTable) nextBucket() peer.ID { - bucket := rt.Buckets[len(rt.Buckets)-1] - newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) - rt.Buckets = append(rt.Buckets, newBucket) - if newBucket.Len() > rt.bucketsize { - return rt.nextBucket() - } - - // If all elements were on left side of split... - if bucket.Len() > rt.bucketsize { - return bucket.PopBack() - } - return "" -} - -// Find a specific peer by ID or return nil -func (rt *RoutingTable) Find(id peer.ID) peer.ID { - srch := rt.NearestPeers(ConvertPeerID(id), 1) - if len(srch) == 0 || srch[0] != id { - return "" - } - return srch[0] -} - -// NearestPeer returns a single peer that is nearest to the given ID -func (rt *RoutingTable) NearestPeer(id ID) peer.ID { - peers := rt.NearestPeers(id, 1) - if len(peers) > 0 { - return peers[0] - } - - log.Debugf("NearestPeer: Returning nil, table size = %d", rt.Size()) - return "" -} - -// NearestPeers returns a list of the 'count' closest peers to the given ID -func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { - cpl := commonPrefixLen(id, rt.local) - - rt.tabLock.RLock() - - // Get bucket at cpl index or last bucket - var bucket *Bucket - if cpl >= len(rt.Buckets) { - cpl = len(rt.Buckets) - 1 - } - bucket = rt.Buckets[cpl] - - var peerArr peerSorterArr - peerArr = copyPeersFromList(id, peerArr, bucket.list) - if len(peerArr) < count { - // In the case of an unusual split, one bucket may be short or empty. - // if this happens, search both surrounding buckets for nearby peers - if cpl > 0 { - plist := rt.Buckets[cpl-1].list - peerArr = copyPeersFromList(id, peerArr, plist) - } - - if cpl < len(rt.Buckets)-1 { - plist := rt.Buckets[cpl+1].list - peerArr = copyPeersFromList(id, peerArr, plist) - } - } - rt.tabLock.RUnlock() - - // Sort by distance to local peer - sort.Sort(peerArr) - - var out []peer.ID - for i := 0; i < count && i < peerArr.Len(); i++ { - out = append(out, peerArr[i].p) - } - - return out -} - -// Size returns the total number of peers in the routing table -func (rt *RoutingTable) Size() int { - var tot int - rt.tabLock.RLock() - for _, buck := range rt.Buckets { - tot += buck.Len() - } - rt.tabLock.RUnlock() - return tot -} - -// ListPeers takes a RoutingTable and returns a list of all peers from all buckets in the table. -// NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) ListPeers() []peer.ID { - var peers []peer.ID - rt.tabLock.RLock() - for _, buck := range rt.Buckets { - peers = append(peers, buck.Peers()...) - } - rt.tabLock.RUnlock() - return peers -} - -// Print prints a descriptive statement about the provided RoutingTable -func (rt *RoutingTable) Print() { - fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) - rt.tabLock.RLock() - - for i, b := range rt.Buckets { - fmt.Printf("\tbucket: %d\n", i) - - b.lk.RLock() - for e := b.list.Front(); e != nil; e = e.Next() { - p := e.Value.(peer.ID) - fmt.Printf("\t\t- %s %s\n", p.Pretty(), rt.metrics.LatencyEWMA(p).String()) - } - b.lk.RUnlock() - } - rt.tabLock.RUnlock() -} diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go deleted file mode 100644 index fb34d9976c..0000000000 --- a/routing/kbucket/table_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package kbucket - -import ( - "math/rand" - "testing" - "time" - - tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -// Test basic features of the bucket struct -func TestBucket(t *testing.T) { - b := newBucket() - - peers := make([]peer.ID, 100) - for i := 0; i < 100; i++ { - peers[i] = tu.RandPeerIDFatal(t) - b.PushFront(peers[i]) - } - - local := tu.RandPeerIDFatal(t) - localID := ConvertPeerID(local) - - i := rand.Intn(len(peers)) - if !b.Has(peers[i]) { - t.Errorf("Failed to find peer: %v", peers[i]) - } - - spl := b.Split(0, ConvertPeerID(local)) - llist := b.list - for e := llist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(peer.ID)) - cpl := commonPrefixLen(p, localID) - if cpl > 0 { - t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") - } - } - - rlist := spl.list - for e := rlist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(peer.ID)) - cpl := commonPrefixLen(p, localID) - if cpl == 0 { - t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") - } - } -} - -// Right now, this just makes sure that it doesnt hang or crash -func TestTableUpdate(t *testing.T) { - local := tu.RandPeerIDFatal(t) - m := pstore.NewMetrics() - rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) - - peers := make([]peer.ID, 100) - for i := 0; i < 100; i++ { - peers[i] = tu.RandPeerIDFatal(t) - } - - // Testing Update - for i := 0; i < 10000; i++ { - rt.Update(peers[rand.Intn(len(peers))]) - } - - for i := 0; i < 100; i++ { - id := ConvertPeerID(tu.RandPeerIDFatal(t)) - ret := rt.NearestPeers(id, 5) - if len(ret) == 0 { - t.Fatal("Failed to find node near ID.") - } - } -} - -func TestTableFind(t *testing.T) { - local := tu.RandPeerIDFatal(t) - m := pstore.NewMetrics() - rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) - - peers := make([]peer.ID, 100) - for i := 0; i < 5; i++ { - peers[i] = tu.RandPeerIDFatal(t) - rt.Update(peers[i]) - } - - t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeer(ConvertPeerID(peers[2])) - if !(found == peers[2]) { - t.Fatalf("Failed to lookup known node...") - } -} - -func TestTableFindMultiple(t *testing.T) { - local := tu.RandPeerIDFatal(t) - m := pstore.NewMetrics() - rt := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) - - peers := make([]peer.ID, 100) - for i := 0; i < 18; i++ { - peers[i] = tu.RandPeerIDFatal(t) - rt.Update(peers[i]) - } - - t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeers(ConvertPeerID(peers[2]), 15) - if len(found) != 15 { - t.Fatalf("Got back different number of peers than we expected.") - } -} - -// Looks for race conditions in table operations. For a more 'certain' -// test, increase the loop counter from 1000 to a much higher number -// and set GOMAXPROCS above 1 -func TestTableMultithreaded(t *testing.T) { - local := peer.ID("localPeer") - m := pstore.NewMetrics() - tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) - var peers []peer.ID - for i := 0; i < 500; i++ { - peers = append(peers, tu.RandPeerIDFatal(t)) - } - - done := make(chan struct{}) - go func() { - for i := 0; i < 1000; i++ { - n := rand.Intn(len(peers)) - tab.Update(peers[n]) - } - done <- struct{}{} - }() - - go func() { - for i := 0; i < 1000; i++ { - n := rand.Intn(len(peers)) - tab.Update(peers[n]) - } - done <- struct{}{} - }() - - go func() { - for i := 0; i < 1000; i++ { - n := rand.Intn(len(peers)) - tab.Find(peers[n]) - } - done <- struct{}{} - }() - <-done - <-done - <-done -} - -func BenchmarkUpdates(b *testing.B) { - b.StopTimer() - local := ConvertKey("localKey") - m := pstore.NewMetrics() - tab := NewRoutingTable(20, local, time.Hour, m) - - var peers []peer.ID - for i := 0; i < b.N; i++ { - peers = append(peers, tu.RandPeerIDFatal(b)) - } - - b.StartTimer() - for i := 0; i < b.N; i++ { - tab.Update(peers[i]) - } -} - -func BenchmarkFinds(b *testing.B) { - b.StopTimer() - local := ConvertKey("localKey") - m := pstore.NewMetrics() - tab := NewRoutingTable(20, local, time.Hour, m) - - var peers []peer.ID - for i := 0; i < b.N; i++ { - peers = append(peers, tu.RandPeerIDFatal(b)) - tab.Update(peers[i]) - } - - b.StartTimer() - for i := 0; i < b.N; i++ { - tab.Find(peers[i]) - } -} diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go deleted file mode 100644 index 2722540d63..0000000000 --- a/routing/kbucket/util.go +++ /dev/null @@ -1,63 +0,0 @@ -package kbucket - -import ( - "bytes" - "crypto/sha256" - "errors" - - ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" -) - -// Returned if a routing table query returns no results. This is NOT expected -// behaviour -var ErrLookupFailure = errors.New("failed to find any peer in table") - -// ID for IpfsDHT is in the XORKeySpace -// -// The type dht.ID signifies that its contents have been hashed from either a -// peer.ID or a util.Key. This unifies the keyspace -type ID []byte - -func (id ID) equal(other ID) bool { - return bytes.Equal(id, other) -} - -func (id ID) less(other ID) bool { - a := ks.Key{Space: ks.XORKeySpace, Bytes: id} - b := ks.Key{Space: ks.XORKeySpace, Bytes: other} - return a.Less(b) -} - -func xor(a, b ID) ID { - return ID(u.XOR(a, b)) -} - -func commonPrefixLen(a, b ID) int { - return ks.ZeroPrefixLen(u.XOR(a, b)) -} - -// ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) -func ConvertPeerID(id peer.ID) ID { - hash := sha256.Sum256([]byte(id)) - return hash[:] -} - -// ConvertKey creates a DHT ID by hashing a local key (String) -func ConvertKey(id key.Key) ID { - hash := sha256.Sum256([]byte(id)) - return hash[:] -} - -// Closer returns true if a is closer to key than b is -func Closer(a, b peer.ID, key key.Key) bool { - aid := ConvertPeerID(a) - bid := ConvertPeerID(b) - tgt := ConvertKey(key) - adist := xor(aid, tgt) - bdist := xor(bid, tgt) - - return adist.less(bdist) -} diff --git a/routing/keyspace/keyspace.go b/routing/keyspace/keyspace.go deleted file mode 100644 index e26a0e6d0d..0000000000 --- a/routing/keyspace/keyspace.go +++ /dev/null @@ -1,97 +0,0 @@ -package keyspace - -import ( - "sort" - - "math/big" -) - -// Key represents an identifier in a KeySpace. It holds a reference to the -// associated KeySpace, as well references to both the Original identifier, -// as well as the new, KeySpace Bytes one. -type Key struct { - - // Space is the KeySpace this Key is related to. - Space KeySpace - - // Original is the original value of the identifier - Original []byte - - // Bytes is the new value of the identifier, in the KeySpace. - Bytes []byte -} - -// Equal returns whether this key is equal to another. -func (k1 Key) Equal(k2 Key) bool { - if k1.Space != k2.Space { - panic("k1 and k2 not in same key space.") - } - return k1.Space.Equal(k1, k2) -} - -// Less returns whether this key comes before another. -func (k1 Key) Less(k2 Key) bool { - if k1.Space != k2.Space { - panic("k1 and k2 not in same key space.") - } - return k1.Space.Less(k1, k2) -} - -// Distance returns this key's distance to another -func (k1 Key) Distance(k2 Key) *big.Int { - if k1.Space != k2.Space { - panic("k1 and k2 not in same key space.") - } - return k1.Space.Distance(k1, k2) -} - -// KeySpace is an object used to do math on identifiers. Each keyspace has its -// own properties and rules. See XorKeySpace. -type KeySpace interface { - - // Key converts an identifier into a Key in this space. - Key([]byte) Key - - // Equal returns whether keys are equal in this key space - Equal(Key, Key) bool - - // Distance returns the distance metric in this key space - Distance(Key, Key) *big.Int - - // Less returns whether the first key is smaller than the second. - Less(Key, Key) bool -} - -// byDistanceToCenter is a type used to sort Keys by proximity to a center. -type byDistanceToCenter struct { - Center Key - Keys []Key -} - -func (s byDistanceToCenter) Len() int { - return len(s.Keys) -} - -func (s byDistanceToCenter) Swap(i, j int) { - s.Keys[i], s.Keys[j] = s.Keys[j], s.Keys[i] -} - -func (s byDistanceToCenter) Less(i, j int) bool { - a := s.Center.Distance(s.Keys[i]) - b := s.Center.Distance(s.Keys[j]) - return a.Cmp(b) == -1 -} - -// SortByDistance takes a KeySpace, a center Key, and a list of Keys toSort. -// It returns a new list, where the Keys toSort have been sorted by their -// distance to the center Key. -func SortByDistance(sp KeySpace, center Key, toSort []Key) []Key { - toSortCopy := make([]Key, len(toSort)) - copy(toSortCopy, toSort) - bdtc := &byDistanceToCenter{ - Center: center, - Keys: toSortCopy, // copy - } - sort.Sort(bdtc) - return bdtc.Keys -} diff --git a/routing/keyspace/xor.go b/routing/keyspace/xor.go deleted file mode 100644 index fd96fd65b3..0000000000 --- a/routing/keyspace/xor.go +++ /dev/null @@ -1,67 +0,0 @@ -package keyspace - -import ( - "bytes" - "crypto/sha256" - "math/big" - - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" -) - -// XORKeySpace is a KeySpace which: -// - normalizes identifiers using a cryptographic hash (sha256) -// - measures distance by XORing keys together -var XORKeySpace = &xorKeySpace{} -var _ KeySpace = XORKeySpace // ensure it conforms - -type xorKeySpace struct{} - -// Key converts an identifier into a Key in this space. -func (s *xorKeySpace) Key(id []byte) Key { - hash := sha256.Sum256(id) - key := hash[:] - return Key{ - Space: s, - Original: id, - Bytes: key, - } -} - -// Equal returns whether keys are equal in this key space -func (s *xorKeySpace) Equal(k1, k2 Key) bool { - return bytes.Equal(k1.Bytes, k2.Bytes) -} - -// Distance returns the distance metric in this key space -func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { - // XOR the keys - k3 := u.XOR(k1.Bytes, k2.Bytes) - - // interpret it as an integer - dist := big.NewInt(0).SetBytes(k3) - return dist -} - -// Less returns whether the first key is smaller than the second. -func (s *xorKeySpace) Less(k1, k2 Key) bool { - a := k1.Bytes - b := k2.Bytes - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - return a[i] < b[i] - } - } - return true -} - -// ZeroPrefixLen returns the number of consecutive zeroes in a byte slice. -func ZeroPrefixLen(id []byte) int { - for i := 0; i < len(id); i++ { - for j := 0; j < 8; j++ { - if (id[i]>>uint8(7-j))&0x1 != 0 { - return i*8 + j - } - } - } - return len(id) * 8 -} diff --git a/routing/keyspace/xor_test.go b/routing/keyspace/xor_test.go deleted file mode 100644 index a461c094e7..0000000000 --- a/routing/keyspace/xor_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package keyspace - -import ( - "bytes" - "math/big" - "testing" - - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" -) - -func TestPrefixLen(t *testing.T) { - cases := [][]byte{ - {0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x00, 0x58, 0xFF, 0x80, 0x00, 0x00, 0xF0}, - } - lens := []int{24, 56, 9} - - for i, c := range cases { - r := ZeroPrefixLen(c) - if r != lens[i] { - t.Errorf("ZeroPrefixLen failed: %v != %v", r, lens[i]) - } - } - -} - -func TestXorKeySpace(t *testing.T) { - - ids := [][]byte{ - {0xFF, 0xFF, 0xFF, 0xFF}, - {0x00, 0x00, 0x00, 0x00}, - {0xFF, 0xFF, 0xFF, 0xF0}, - } - - ks := [][2]Key{ - {XORKeySpace.Key(ids[0]), XORKeySpace.Key(ids[0])}, - {XORKeySpace.Key(ids[1]), XORKeySpace.Key(ids[1])}, - {XORKeySpace.Key(ids[2]), XORKeySpace.Key(ids[2])}, - } - - for i, set := range ks { - if !set[0].Equal(set[1]) { - t.Errorf("Key not eq. %v != %v", set[0], set[1]) - } - - if !bytes.Equal(set[0].Bytes, set[1].Bytes) { - t.Errorf("Key gen failed. %v != %v", set[0].Bytes, set[1].Bytes) - } - - if !bytes.Equal(set[0].Original, ids[i]) { - t.Errorf("ptrs to original. %v != %v", set[0].Original, ids[i]) - } - - if len(set[0].Bytes) != 32 { - t.Errorf("key length incorrect. 32 != %d", len(set[0].Bytes)) - } - } - - for i := 1; i < len(ks); i++ { - if ks[i][0].Less(ks[i-1][0]) == ks[i-1][0].Less(ks[i][0]) { - t.Errorf("less should be different.") - } - - if ks[i][0].Distance(ks[i-1][0]).Cmp(ks[i-1][0].Distance(ks[i][0])) != 0 { - t.Errorf("distance should be the same.") - } - - if ks[i][0].Equal(ks[i-1][0]) { - t.Errorf("Keys should not be eq. %v != %v", ks[i][0], ks[i-1][0]) - } - } -} - -func TestDistancesAndCenterSorting(t *testing.T) { - - adjs := [][]byte{ - {173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, - {223, 63, 97, 152, 4, 169, 47, 219, 64, 87, 25, 45, 196, 61, 215, 72, 234, 119, 138, 220, 82, 188, 73, 140, 232, 5, 36, 192, 20, 184, 17, 25}, - {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, - {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, - {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 126}, - {73, 0, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, - } - - keys := make([]Key, len(adjs)) - for i, a := range adjs { - keys[i] = Key{Space: XORKeySpace, Bytes: a} - } - - cmp := func(a int64, b *big.Int) int { - return big.NewInt(a).Cmp(b) - } - - if 0 != cmp(0, keys[2].Distance(keys[3])) { - t.Errorf("distance calculation wrong: %v", keys[2].Distance(keys[3])) - } - - if 0 != cmp(1, keys[2].Distance(keys[4])) { - t.Errorf("distance calculation wrong: %v", keys[2].Distance(keys[4])) - } - - d1 := keys[2].Distance(keys[5]) - d2 := u.XOR(keys[2].Bytes, keys[5].Bytes) - d2 = d2[len(keys[2].Bytes)-len(d1.Bytes()):] // skip empty space for big - if !bytes.Equal(d1.Bytes(), d2) { - t.Errorf("bytes should be the same. %v == %v", d1.Bytes(), d2) - } - - if -1 != cmp(2<<32, keys[2].Distance(keys[5])) { - t.Errorf("2<<32 should be smaller") - } - - keys2 := SortByDistance(XORKeySpace, keys[2], keys) - order := []int{2, 3, 4, 5, 1, 0} - for i, o := range order { - if !bytes.Equal(keys[o].Bytes, keys2[i].Bytes) { - t.Errorf("order is wrong. %d?? %v == %v", o, keys[o], keys2[i]) - } - } - -} diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index d6f9218458..1fa190028b 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,11 +4,7 @@ import ( "errors" "time" - routing "github.com/ipfs/go-ipfs/routing" - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" @@ -16,7 +12,11 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + dhtpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/dht.go b/routing/mock/dht.go index dfda92770e..23b37ba4e0 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -1,9 +1,9 @@ package mockrouting import ( - dht "github.com/ipfs/go-ipfs/routing/dht" "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index b0c1b14a1e..b0f93d2b97 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,13 +5,14 @@ package mockrouting import ( - routing "github.com/ipfs/go-ipfs/routing" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 0142cf1e6e..3ca2ce88ab 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -4,12 +4,12 @@ import ( "errors" repo "github.com/ipfs/go-ipfs/repo" - routing "github.com/ipfs/go-ipfs/routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" p2phost "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 66564d0ef8..380a146c40 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -4,11 +4,11 @@ import ( "errors" "time" - routing "github.com/ipfs/go-ipfs/routing" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - record "github.com/ipfs/go-ipfs/routing/record" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" + record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" + pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" diff --git a/routing/record/record.go b/routing/record/record.go deleted file mode 100644 index 59b66f68b9..0000000000 --- a/routing/record/record.go +++ /dev/null @@ -1,48 +0,0 @@ -package record - -import ( - "bytes" - - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" -) - -var log = logging.Logger("routing/record") - -// MakePutRecord creates and signs a dht record for the given key/value pair -func MakePutRecord(sk ci.PrivKey, key key.Key, value []byte, sign bool) (*pb.Record, error) { - record := new(pb.Record) - - record.Key = proto.String(string(key)) - record.Value = value - - pkh, err := sk.GetPublic().Hash() - if err != nil { - return nil, err - } - - record.Author = proto.String(string(pkh)) - if sign { - blob := RecordBlobForSig(record) - - sig, err := sk.Sign(blob) - if err != nil { - return nil, err - } - - record.Signature = sig - } - return record, nil -} - -// RecordBlobForSig returns the blob protected by the record signature -func RecordBlobForSig(r *pb.Record) []byte { - k := []byte(r.GetKey()) - v := []byte(r.GetValue()) - a := []byte(r.GetAuthor()) - return bytes.Join([][]byte{k, v, a}, []byte{}) -} diff --git a/routing/record/selection.go b/routing/record/selection.go deleted file mode 100644 index 5b1f5bb983..0000000000 --- a/routing/record/selection.go +++ /dev/null @@ -1,40 +0,0 @@ -package record - -import ( - "errors" - - path "github.com/ipfs/go-ipfs/path" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" -) - -// A SelectorFunc selects the best value for the given key from -// a slice of possible values and returns the index of the chosen one -type SelectorFunc func(key.Key, [][]byte) (int, error) - -type Selector map[string]SelectorFunc - -func (s Selector) BestRecord(k key.Key, recs [][]byte) (int, error) { - if len(recs) == 0 { - return 0, errors.New("no records given!") - } - - parts := path.SplitList(string(k)) - if len(parts) < 3 { - log.Infof("Record key does not have selectorfunc: %s", k) - return 0, errors.New("record key does not have selectorfunc") - } - - sel, ok := s[parts[1]] - if !ok { - log.Infof("Unrecognized key prefix: %s", parts[1]) - return 0, ErrInvalidRecordType - } - - return sel(k, recs) -} - -// PublicKeySelector just selects the first entry. -// All valid public key records will be equivalent. -func PublicKeySelector(k key.Key, vals [][]byte) (int, error) { - return 0, nil -} diff --git a/routing/record/validation.go b/routing/record/validation.go deleted file mode 100644 index 65e181fda7..0000000000 --- a/routing/record/validation.go +++ /dev/null @@ -1,114 +0,0 @@ -package record - -import ( - "bytes" - "errors" - "fmt" - - path "github.com/ipfs/go-ipfs/path" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" -) - -// ValidatorFunc is a function that is called to validate a given -// type of DHTRecord. -type ValidatorFunc func(key.Key, []byte) error - -// ErrBadRecord is returned any time a dht record is found to be -// incorrectly formatted or signed. -var ErrBadRecord = errors.New("bad dht record") - -// ErrInvalidRecordType is returned if a DHTRecord keys prefix -// is not found in the Validator map of the DHT. -var ErrInvalidRecordType = errors.New("invalid record keytype") - -// Validator is an object that helps ensure routing records are valid. -// It is a collection of validator functions, each of which implements -// its own notion of validity. -type Validator map[string]*ValidChecker - -type ValidChecker struct { - Func ValidatorFunc - Sign bool -} - -// VerifyRecord checks a record and ensures it is still valid. -// It runs needed validators -func (v Validator) VerifyRecord(r *pb.Record) error { - // Now, check validity func - parts := path.SplitList(r.GetKey()) - if len(parts) < 3 { - log.Infof("Record key does not have validator: %s", key.Key(r.GetKey())) - return nil - } - - val, ok := v[parts[1]] - if !ok { - log.Infof("Unrecognized key prefix: %s", parts[1]) - return ErrInvalidRecordType - } - - return val.Func(key.Key(r.GetKey()), r.GetValue()) -} - -func (v Validator) IsSigned(k key.Key) (bool, error) { - // Now, check validity func - parts := path.SplitList(string(k)) - if len(parts) < 3 { - log.Infof("Record key does not have validator: %s", k) - return false, nil - } - - val, ok := v[parts[1]] - if !ok { - log.Infof("Unrecognized key prefix: %s", parts[1]) - return false, ErrInvalidRecordType - } - - return val.Sign, nil -} - -// ValidatePublicKeyRecord implements ValidatorFunc and -// verifies that the passed in record value is the PublicKey -// that matches the passed in key. -func ValidatePublicKeyRecord(k key.Key, val []byte) error { - if len(k) < 5 { - return errors.New("invalid public key record key") - } - - prefix := string(k[:4]) - if prefix != "/pk/" { - return errors.New("key was not prefixed with /pk/") - } - - keyhash := []byte(k[4:]) - if _, err := mh.Cast(keyhash); err != nil { - return fmt.Errorf("key did not contain valid multihash: %s", err) - } - - pkh := u.Hash(val) - if !bytes.Equal(keyhash, pkh) { - return errors.New("public key does not match storage key") - } - return nil -} - -var PublicKeyValidator = &ValidChecker{ - Func: ValidatePublicKeyRecord, - Sign: false, -} - -func CheckRecordSig(r *pb.Record, pk ci.PubKey) error { - blob := RecordBlobForSig(r) - good, err := pk.Verify(blob, r.Signature) - if err != nil { - return nil - } - if !good { - return errors.New("invalid record signature") - } - return nil -} diff --git a/routing/record/validation_test.go b/routing/record/validation_test.go deleted file mode 100644 index 175f902d8b..0000000000 --- a/routing/record/validation_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package record - -import ( - "encoding/base64" - "testing" - - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" -) - -var OffensiveKey = "CAASXjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDjXAQQMal4SB2tSnX6NJIPmC69/BT8A8jc7/gDUZNkEhdhYHvc7k7S4vntV/c92nJGxNdop9fKJyevuNMuXhhHAgMBAAE=" - -func TestValidatePublicKey(t *testing.T) { - pkb, err := base64.StdEncoding.DecodeString(OffensiveKey) - if err != nil { - t.Fatal(err) - } - - pubk, err := ci.UnmarshalPublicKey(pkb) - if err != nil { - t.Fatal(err) - } - - pkh, err := pubk.Hash() - if err != nil { - t.Fatal(err) - } - - k := key.Key("/pk/" + string(pkh)) - - err = ValidatePublicKeyRecord(k, pkb) - if err != nil { - t.Fatal(err) - } -} diff --git a/routing/routing.go b/routing/routing.go deleted file mode 100644 index 6e15bed6fb..0000000000 --- a/routing/routing.go +++ /dev/null @@ -1,105 +0,0 @@ -// package routing defines the interface for a routing system used by ipfs. -package routing - -import ( - "errors" - - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" -) - -// ErrNotFound is returned when a search fails to find anything -var ErrNotFound = errors.New("routing: not found") - -// ContentRouting is a value provider layer of indirection. It is used to find -// information about who has what content. -type ContentRouting interface { - // Announce that this node can provide value for given key - Provide(context.Context, key.Key) error - - // Search for peers who are able to provide a given key - FindProvidersAsync(context.Context, key.Key, int) <-chan pstore.PeerInfo -} - -// PeerRouting is a way to find information about certain peers. -// This can be implemented by a simple lookup table, a tracking server, -// or even a DHT. -type PeerRouting interface { - // Find specific Peer - // FindPeer searches for a peer with given ID, returns a pstore.PeerInfo - // with relevant addresses. - FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) -} - -type ValueStore interface { - // Basic Put/Get - - // PutValue adds value corresponding to given Key. - PutValue(context.Context, key.Key, []byte) error - - // GetValue searches for the value corresponding to given Key. - GetValue(context.Context, key.Key) ([]byte, error) - - // GetValues searches for values corresponding to given Key. - // - // Passing a value of '0' for the count argument will cause the - // routing interface to return values only from cached or local storage - // and return an error if no cached value is found. - // - // Passing a value of '1' will return a local value if found, and query - // the network for the first value it finds otherwise. - // As a result, a value of '1' is mostly useful for cases where the record - // in question has only one valid value (such as public keys) - GetValues(c context.Context, k key.Key, count int) ([]RecvdVal, error) -} - -// IpfsRouting is the combination of different routing types that ipfs -// uses. It can be satisfied by a single item (such as a DHT) or multiple -// different pieces that are more optimized to each task. -type IpfsRouting interface { - ContentRouting - PeerRouting - ValueStore - - // Bootstrap allows callers to hint to the routing system to get into a - // Boostrapped state - Bootstrap(context.Context) error - - // TODO expose io.Closer or plain-old Close error -} - -// RecvdVal represents a dht value record that has been received from a given peer -// it is used to track peers with expired records in order to correct them. -type RecvdVal struct { - From peer.ID - Val []byte -} - -type PubKeyFetcher interface { - GetPublicKey(context.Context, peer.ID) (ci.PubKey, error) -} - -// KeyForPublicKey returns the key used to retrieve public keys -// from the dht. -func KeyForPublicKey(id peer.ID) key.Key { - return key.Key("/pk/" + string(id)) -} - -func GetPublicKey(r ValueStore, ctx context.Context, pkhash []byte) (ci.PubKey, error) { - if dht, ok := r.(PubKeyFetcher); ok { - // If we have a DHT as our routing system, use optimized fetcher - return dht.GetPublicKey(ctx, peer.ID(pkhash)) - } else { - key := key.Key("/pk/" + string(pkhash)) - pkval, err := r.GetValue(ctx, key) - if err != nil { - return nil, err - } - - // get PublicKey from node.Data - return ci.UnmarshalPublicKey(pkval) - } -} diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 98ad4026e9..100bfa6c78 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -5,19 +5,19 @@ import ( "errors" "time" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - routing "github.com/ipfs/go-ipfs/routing" - pb "github.com/ipfs/go-ipfs/routing/dht/pb" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" + dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" ) var log = logging.Logger("supernode") @@ -45,13 +45,13 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-c ch := make(chan pstore.PeerInfo) go func() { defer close(ch) - request := pb.NewMessage(pb.Message_GET_PROVIDERS, string(k), 0) + request := dhtpb.NewMessage(dhtpb.Message_GET_PROVIDERS, string(k), 0) response, err := c.proxy.SendRequest(ctx, request) if err != nil { log.Debug(err) return } - for _, p := range pb.PBPeersToPeerInfos(response.GetProviderPeers()) { + for _, p := range dhtpb.PBPeersToPeerInfos(response.GetProviderPeers()) { select { case <-ctx.Done(): log.Debug(ctx.Err()) @@ -69,14 +69,14 @@ func (c *Client) PutValue(ctx context.Context, k key.Key, v []byte) error { if err != nil { return err } - pmes := pb.NewMessage(pb.Message_PUT_VALUE, string(k), 0) + pmes := dhtpb.NewMessage(dhtpb.Message_PUT_VALUE, string(k), 0) pmes.Record = r return c.proxy.SendMessage(ctx, pmes) // wrap to hide the remote } func (c *Client) GetValue(ctx context.Context, k key.Key) ([]byte, error) { defer log.EventBegin(ctx, "getValue", &k).Done() - msg := pb.NewMessage(pb.Message_GET_VALUE, string(k), 0) + msg := dhtpb.NewMessage(dhtpb.Message_GET_VALUE, string(k), 0) response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote if err != nil { return nil, err @@ -86,7 +86,7 @@ func (c *Client) GetValue(ctx context.Context, k key.Key) ([]byte, error) { func (c *Client) GetValues(ctx context.Context, k key.Key, _ int) ([]routing.RecvdVal, error) { defer log.EventBegin(ctx, "getValue", &k).Done() - msg := pb.NewMessage(pb.Message_GET_VALUE, string(k), 0) + msg := dhtpb.NewMessage(dhtpb.Message_GET_VALUE, string(k), 0) response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote if err != nil { return nil, err @@ -102,9 +102,9 @@ func (c *Client) GetValues(ctx context.Context, k key.Key, _ int) ([]routing.Rec func (c *Client) Provide(ctx context.Context, k key.Key) error { defer log.EventBegin(ctx, "provide", &k).Done() - msg := pb.NewMessage(pb.Message_ADD_PROVIDER, string(k), 0) + msg := dhtpb.NewMessage(dhtpb.Message_ADD_PROVIDER, string(k), 0) // FIXME how is connectedness defined for the local node - pri := []pb.PeerRoutingInfo{ + pri := []dhtpb.PeerRoutingInfo{ { PeerInfo: pstore.PeerInfo{ ID: c.local, @@ -112,18 +112,18 @@ func (c *Client) Provide(ctx context.Context, k key.Key) error { }, }, } - msg.ProviderPeers = pb.PeerRoutingInfosToPBPeers(pri) + msg.ProviderPeers = dhtpb.PeerRoutingInfosToPBPeers(pri) return c.proxy.SendMessage(ctx, msg) // TODO wrap to hide remote } func (c *Client) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, error) { defer log.EventBegin(ctx, "findPeer", id).Done() - request := pb.NewMessage(pb.Message_FIND_NODE, string(id), 0) + request := dhtpb.NewMessage(dhtpb.Message_FIND_NODE, string(id), 0) response, err := c.proxy.SendRequest(ctx, request) // hide remote if err != nil { return pstore.PeerInfo{}, err } - for _, p := range pb.PBPeersToPeerInfos(response.GetCloserPeers()) { + for _, p := range dhtpb.PBPeersToPeerInfos(response.GetCloserPeers()) { if p.ID == id { return p, nil } diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 9f47ff5e7b..1ce2dbfc7c 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,12 +1,11 @@ package proxy import ( - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 396dc0f9ff..fad4b87908 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -14,9 +14,9 @@ import ( key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - kbucket "github.com/ipfs/go-ipfs/routing/kbucket" + kbucket "gx/ipfs/QmTZsN8hysGnbakvK6mS8rwDQ9uwokxmWFBv94pig6zGd1/go-libp2p-kbucket" loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" + dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index d3473d12da..8fab1a42aa 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -4,16 +4,17 @@ import ( "errors" "fmt" - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - record "github.com/ipfs/go-ipfs/routing/record" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" + pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" ) // Server handles routing queries using a database backend @@ -115,7 +116,7 @@ func (s *Server) handleMessage( var _ proxy.RequestHandler = &Server{} var _ proxy.Proxy = &Server{} -func getRoutingRecord(ds datastore.Datastore, k key.Key) (*dhtpb.Record, error) { +func getRoutingRecord(ds datastore.Datastore, k key.Key) (*pb.Record, error) { dskey := k.DsKey() val, err := ds.Get(dskey) if err != nil { @@ -125,14 +126,14 @@ func getRoutingRecord(ds datastore.Datastore, k key.Key) (*dhtpb.Record, error) if !ok { return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) } - var record dhtpb.Record + var record pb.Record if err := proto.Unmarshal(recordBytes, &record); err != nil { return nil, errors.New("failed to unmarshal dht record from datastore") } return &record, nil } -func putRoutingRecord(ds datastore.Datastore, k key.Key, value *dhtpb.Record) error { +func putRoutingRecord(ds datastore.Datastore, k key.Key, value *pb.Record) error { data, err := proto.Marshal(value) if err != nil { return err @@ -204,7 +205,7 @@ func providerKey(k key.Key) datastore.Key { return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) } -func verify(ps pstore.Peerstore, r *dhtpb.Record) error { +func verify(ps pstore.Peerstore, r *pb.Record) error { v := make(record.Validator) v["pk"] = record.PublicKeyValidator p := peer.ID(r.GetAuthor()) diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 4cbc7de6fa..0531d1f8cb 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" + dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) From bf3dac5140b3f351c0fc58b0458b3ae72693ccd1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 13 Sep 2016 15:17:07 -0700 Subject: [PATCH 1323/3147] routing: use extracted dht and routing code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@2692e442b38df5193da5e7b1b327b0bd89d02e0e --- namesys/namesys.go | 2 +- namesys/publisher.go | 14 +++++++------- namesys/republisher/repub.go | 8 ++++---- namesys/routing.go | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 87c1854cd4..5b3643cf4b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,10 +5,10 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - routing "github.com/ipfs/go-ipfs/routing" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index 4e634cef00..729532a1ac 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,22 +6,22 @@ import ( "fmt" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" - routing "github.com/ipfs/go-ipfs/routing" - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - record "github.com/ipfs/go-ipfs/routing/record" ft "github.com/ipfs/go-ipfs/unixfs" + ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" + record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" + dhtpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 6b91749533..b148babe82 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -8,9 +8,6 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - "github.com/ipfs/go-ipfs/routing" - dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" @@ -19,7 +16,10 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + recpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" ) var errNoEntry = errors.New("no previous entry") @@ -115,7 +115,7 @@ func (rp *Republisher) getLastVal(k key.Key) (path.Path, uint64, error) { } val := ival.([]byte) - dhtrec := new(dhtpb.Record) + dhtrec := new(recpb.Record) err = proto.Unmarshal(val, dhtrec) if err != nil { return "", 0, err diff --git a/namesys/routing.go b/namesys/routing.go index 31c863fce4..6336a1782a 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -12,8 +12,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "github.com/ipfs/go-ipfs/routing" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" From 51e26851a4d0c9bc770d2fabb0399619180767f2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 25 Sep 2016 23:42:14 -0700 Subject: [PATCH 1324/3147] update libp2p and dht packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@f8c488edfb489bcb269fe7387234bdbd45afa7f8 --- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 6 +++--- routing/offline/offline.go | 4 ++-- routing/supernode/client.go | 8 ++++---- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 10 +++++----- routing/supernode/server.go | 4 ++-- routing/supernode/server_test.go | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 1fa190028b..7ac431acab 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,15 +8,15 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" dhtpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index b8e95762b0..a112b0d534 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -11,8 +11,8 @@ import ( key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index c66085e620..d68fc5e5c9 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 23b37ba4e0..e987a5e490 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -2,9 +2,9 @@ package mockrouting import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht" + dht "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + mocknet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index b0f93d2b97..6cde15ab3d 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -9,11 +9,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 3ca2ce88ab..82e2bd02e5 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -5,12 +5,12 @@ import ( repo "github.com/ipfs/go-ipfs/repo" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - p2phost "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + p2phost "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/host" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 380a146c40..982e46ea73 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -6,16 +6,16 @@ import ( ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" ) var log = logging.Logger("offlinerouting") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 100bfa6c78..b76b300807 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,16 +8,16 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" - dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/host" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 1ce2dbfc7c..8afe91a758 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,11 +1,11 @@ package proxy import ( - inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + inet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index fad4b87908..6d7ef439f4 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -7,16 +7,16 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - host "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/host" - inet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" + host "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/host" + inet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - kbucket "gx/ipfs/QmTZsN8hysGnbakvK6mS8rwDQ9uwokxmWFBv94pig6zGd1/go-libp2p-kbucket" + kbucket "gx/ipfs/QmVsCNFD32GzZ6Q5XD1TVGPRviNYqDdoNvgq853TU9hhzP/go-libp2p-kbucket" + dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" - dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 8fab1a42aa..d6c8a48055 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -7,12 +7,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" ) diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 0531d1f8cb..5bdec5ded3 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmYvLYkYiVEi5LBHP2uFqiUaHqH7zWnEuRqoNEuGLNG6JB/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) From b08175b46e343b6d0eaf9d3dd07e9d2aa1d75f30 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 25 Sep 2016 23:42:14 -0700 Subject: [PATCH 1325/3147] update libp2p and dht packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@7b110e63470b2c80df947e7534327f3a5e763a35 --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 6 +++--- namesys/routing.go | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 5b3643cf4b..a5f4e8a901 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -8,7 +8,7 @@ import ( ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index 729532a1ac..d70cc289c8 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,9 +19,9 @@ import ( context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" dhtpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index b148babe82..d208e093c6 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -9,17 +9,17 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" + gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" recpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 25cdb6ea52..0bb9f10312 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" "github.com/ipfs/go-ipfs/core" @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmUuwQUJmtvC6ReYcu7xaYKEUM3pD46H18dFn3LBhVt2Di/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmdMfSLMDBDYhtc4oF3NYGCZr5dy4wQb6Ji26N4D4mdxa2/go-libp2p-peerstore" + pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" + mocknet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 6336a1782a..bf481be301 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,7 +13,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmcoQiBzRaaVv1DZbbXoDWiEtvDN94Ca1DcwnQKK2tP92s/go-libp2p-routing" + routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" From 014d43df82a94c6fb5e0332d8b97f3a685f51585 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 4 Oct 2016 18:21:19 -0700 Subject: [PATCH 1326/3147] gx publish 2.0.0 This commit was moved from ipfs/go-ipfs-util@03f76a71a0fc8a58f483f4725d02a442cbea1953 --- util/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/util.go b/util/util.go index 019d0420c3..28873fd029 100644 --- a/util/util.go +++ b/util/util.go @@ -13,7 +13,7 @@ import ( "time" b58 "github.com/jbenet/go-base58" - mh "github.com/jbenet/go-multihash" + mh "github.com/multiformats/go-multihash" ) // DefaultIpfsHash is the current default hash function used by IPFS. From c038d5a774234f505d48e85ce43c58685ac6f1cd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1327/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@e5e18a5a234be143e44ed312f1b0da3853159872 --- pinning/pinner/gc/gc.go | 6 +++--- pinning/pinner/indirect.go | 2 +- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 6 +++--- pinning/pinner/set.go | 6 +++--- pinning/pinner/set_test.go | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 3e35c2b278..7bfde538c1 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -6,11 +6,11 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go index a837d60fd0..b30a7c22d5 100644 --- a/pinning/pinner/indirect.go +++ b/pinning/pinner/indirect.go @@ -1,7 +1,7 @@ package pin import ( - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" ) type indirectPin struct { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index db90346243..6edd66abc2 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -9,12 +9,12 @@ import ( "time" mdag "github.com/ipfs/go-ipfs/merkledag" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index af3aa08dab..185b27a461 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -9,11 +9,11 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) func randNode() (*mdag.Node, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index acb154e77f..ec08971e9a 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,12 +10,12 @@ import ( "sort" "unsafe" + "context" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" + "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index a71cd0db64..f48fc9d175 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -1,6 +1,6 @@ package pin -import "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" +import "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" func ignoreKeys(key.Key) {} From 4cb17b0a06b35fd1d09993693f934dc829f1e3ca Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1328/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@af55c45e5bdc2643642dbf208e0bed76d433390e --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 4b40d7390e..f2edc569b0 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,9 @@ import ( "io" blocks "github.com/ipfs/go-ipfs/blocks" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" ) // Any type that implements exchange.Interface may be used as an IPFS block From 8d4134ab8060e5931571a13651ba176648652840 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1329/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@45cac731d8f66acd55de79447840bd0755733181 --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index b1a6ecb97b..b483e1825a 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -6,9 +6,9 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 8eaf751441..9cbd713336 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -3,13 +3,13 @@ package offline import ( "testing" + context "context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) func TestBlockReturnsErr(t *testing.T) { From 44136bbbb7c2a43f20faad7dc57408abefe072e8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1330/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@e93f6d5437351fce67f08af4315bd06bb72774c6 --- mfs/dir.go | 2 +- mfs/fd.go | 2 +- mfs/file.go | 2 +- mfs/mfs_test.go | 6 +++--- mfs/repub_test.go | 4 ++-- mfs/system.go | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 3612516f51..8bc486cb7a 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,7 +9,7 @@ import ( "sync" "time" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" diff --git a/mfs/fd.go b/mfs/fd.go index 2d3f2f3d0e..9eb3693164 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -6,7 +6,7 @@ import ( mod "github.com/ipfs/go-ipfs/unixfs/mod" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" ) type FileDescriptor interface { diff --git a/mfs/file.go b/mfs/file.go index 46ca7314b0..e532fb088a 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -9,7 +9,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 261ec76e1b..269c24c16b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -23,11 +23,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) func emptyDirNode() *dag.Node { diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 09d8d4124d..2e9c49df5f 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -6,8 +6,8 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + "context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 3e2e74e764..f7e31d6d60 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -17,9 +17,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From cdcbcd48db26052ec95b8a72b1bfbe08651950d0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1331/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@2176b40e1b3b6124343a38458b7d442d0927ae60 --- blockstore/arc_cache.go | 4 ++-- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/bloom_cache.go | 4 ++-- blockstore/bloom_cache_test.go | 2 +- blockstore/caching.go | 2 +- blockstore/util/remove.go | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 5cc2ff4332..fd6ff7eb97 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -1,13 +1,13 @@ package blockstore import ( - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "github.com/ipfs/go-ipfs/blocks" + context "context" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index eb8086a79b..4bf9307a8a 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,9 +4,9 @@ import ( "testing" "github.com/ipfs/go-ipfs/blocks" - "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 45d27d1b50..162a21da03 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -7,14 +7,14 @@ import ( "sync" "sync/atomic" + context "context" blocks "github.com/ipfs/go-ipfs/blocks" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsns "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/namespace" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 096bf34cd3..75385dd2a8 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,14 +5,14 @@ import ( "fmt" "testing" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" blocks "github.com/ipfs/go-ipfs/blocks" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 9607561cbd..6abd4886c2 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,10 +5,10 @@ import ( "time" "github.com/ipfs/go-ipfs/blocks" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + context "context" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 4ce2d01521..248308874d 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" diff --git a/blockstore/caching.go b/blockstore/caching.go index d1da0f7210..d28401cf8a 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -3,8 +3,8 @@ package blockstore import ( "errors" + context "context" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) // Next to each option is it aproximate memory usage per unit diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index c7db675a8c..4b5f86d14c 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,9 +6,9 @@ import ( bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) // RemovedBlock is used to respresent the result of removing a block. From b82e6bb8d2419169ab306e4959888e6da6f6a163 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1332/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@ca11d8482f775c0cbc41d5947593b86a99d42f92 --- blockservice/blockservice.go | 6 +++--- blockservice/test/blocks_test.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 840fa606d6..dd274d27e3 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,11 +10,11 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index ba67f9f3d0..9b86d5a61b 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,13 +10,13 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" ) func newObject(data []byte) *testObject { From daafe88d4b28670f49073e2e0cb70b31e1d1defd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1333/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@b051872689028ce7d4340537fe8b0b5d8a4e44c3 --- datastore/dshelp/key.go | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 datastore/dshelp/key.go diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go new file mode 100644 index 0000000000..db680add20 --- /dev/null +++ b/datastore/dshelp/key.go @@ -0,0 +1,11 @@ +package dshelp + +import ( + base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" +) + +// TODO: put this code into the go-datastore itself +func NewKeyFromBinary(s string) ds.Key { + return ds.NewKey(base32.RawStdEncoding.EncodeToString([]byte(s))) +} From 0910de3e7482840c3123514bddecffce7f31017b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1334/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@e82f0f2937e3c303d6c4ef14e668dfd46c57f00d --- chunker/rabin_test.go | 4 ++-- chunker/splitting_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 99b1bad588..a6e08f2680 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -4,8 +4,8 @@ import ( "bytes" "fmt" "github.com/ipfs/go-ipfs/blocks" - "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" "io" "testing" ) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 83dcaadba3..24c2bdcf9e 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From 82d09f0de9519d9ff390beb74552165720c1749d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1335/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@8cc48f427e79c943c2da781efba3e5ac7b922d5e --- path/path.go | 2 +- path/resolver.go | 6 +++--- path/resolver_test.go | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/path/path.go b/path/path.go index 884c1780d0..847685f867 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 8fc59ac9de..8ff4cf0778 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -6,12 +6,12 @@ import ( "fmt" "time" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "context" + mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" merkledag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index 0d26ff48e0..77e7a27e10 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -4,13 +4,13 @@ import ( "fmt" "testing" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" merkledag "github.com/ipfs/go-ipfs/merkledag" dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - util "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) func randNode() (*merkledag.Node, key.Key) { From a62808e97dc36bd3bff0c76cae3f280086d3a156 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1336/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@ad2fa7c5a40f32dff81c77c6746f6f840ec8e65a --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/io/dagreader.go | 2 +- unixfs/io/dagreader_test.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 4 ++-- unixfs/test/utils.go | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 1ec1760f01..8cc1ec2e11 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -6,7 +6,7 @@ import ( "io" "path" - cxt "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cxt "context" mdag "github.com/ipfs/go-ipfs/merkledag" tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 3d1f47eea1..475b318a49 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -6,8 +6,8 @@ import ( "path" "time" + cxt "context" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cxt "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 53916aa573..f78fbbf77e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -7,8 +7,8 @@ import ( "io" "os" + "context" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index ac8d4d52f9..5f1380c9e5 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -10,7 +10,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/unixfs" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" testu "github.com/ipfs/go-ipfs/unixfs/test" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 7a7783a7d4..ca424e28b5 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -1,11 +1,11 @@ package io import ( - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + "context" mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) type directoryBuilder struct { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index d45dffdef0..7e1fd2dc8b 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -13,10 +13,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 56a2f922f4..810ec6f234 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -16,8 +16,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index e512eeb9d1..b997a11a8e 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -13,8 +13,8 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From 997e39939aa5f34cb5fb18f67176073dcf9a35ce Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1337/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@cbad7164c47187693940a99871627bfb34b6b307 --- routing/mock/centralized_client.go | 33 +++++++++++----------- routing/mock/centralized_server.go | 23 ++++++++------- routing/mock/centralized_test.go | 22 ++++++++------- routing/mock/dht.go | 6 ++-- routing/mock/interface.go | 15 +++++----- routing/none/none_client.go | 23 +++++++-------- routing/offline/offline.go | 37 ++++++++++++------------ routing/supernode/client.go | 44 ++++++++++++++--------------- routing/supernode/proxy/loopback.go | 8 +++--- routing/supernode/proxy/standard.go | 24 +++++++--------- routing/supernode/server.go | 14 ++++----- routing/supernode/server_test.go | 4 +-- 12 files changed, 129 insertions(+), 124 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 7ac431acab..57a1301506 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -1,22 +1,23 @@ package mockrouting import ( + "context" "errors" "time" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - ma "gx/ipfs/QmYzDkkgAEmrcNzFCiYo6L1dTX4EAG1gZkbtdbd9trL4vd/go-multiaddr" + ma "gx/ipfs/QmUAQaWbKxGCUTuoQVvvicbQNZ9APF5pDGWyAZSe93AtKH/go-multiaddr" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - dhtpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) var log = logging.Logger("mockrouter") @@ -28,7 +29,7 @@ type client struct { } // FIXME(brian): is this method meant to simulate putting a value into the network? -func (c *client) PutValue(ctx context.Context, key key.Key, val []byte) error { +func (c *client) PutValue(ctx context.Context, key string, val []byte) error { log.Debugf("PutValue: %s", key) rec := new(dhtpb.Record) rec.Value = val @@ -39,13 +40,13 @@ func (c *client) PutValue(ctx context.Context, key key.Key, val []byte) error { return err } - return c.datastore.Put(key.DsKey(), data) + return c.datastore.Put(dshelp.NewKeyFromBinary(key), data) } // FIXME(brian): is this method meant to simulate getting a value from the network? -func (c *client) GetValue(ctx context.Context, key key.Key) ([]byte, error) { +func (c *client) GetValue(ctx context.Context, key string) ([]byte, error) { log.Debugf("GetValue: %s", key) - v, err := c.datastore.Get(key.DsKey()) + v, err := c.datastore.Get(dshelp.NewKeyFromBinary(key)) if err != nil { return nil, err } @@ -64,7 +65,7 @@ func (c *client) GetValue(ctx context.Context, key key.Key) ([]byte, error) { return rec.GetValue(), nil } -func (c *client) GetValues(ctx context.Context, key key.Key, count int) ([]routing.RecvdVal, error) { +func (c *client) GetValues(ctx context.Context, key string, count int) ([]routing.RecvdVal, error) { log.Debugf("GetValues: %s", key) data, err := c.GetValue(ctx, key) if err != nil { @@ -74,7 +75,7 @@ func (c *client) GetValues(ctx context.Context, key key.Key, count int) ([]routi return []routing.RecvdVal{{Val: data, From: c.peer.ID()}}, nil } -func (c *client) FindProviders(ctx context.Context, key key.Key) ([]pstore.PeerInfo, error) { +func (c *client) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { return c.server.Providers(key), nil } @@ -83,7 +84,7 @@ func (c *client) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, er return pstore.PeerInfo{}, nil } -func (c *client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan pstore.PeerInfo { +func (c *client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo { out := make(chan pstore.PeerInfo) go func() { defer close(out) @@ -103,7 +104,7 @@ func (c *client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-c // Provide returns once the message is on the network. Value is not necessarily // visible yet. -func (c *client) Provide(_ context.Context, key key.Key) error { +func (c *client) Provide(_ context.Context, key *cid.Cid) error { info := pstore.PeerInfo{ ID: c.peer.ID(), Addrs: []ma.Multiaddr{c.peer.Address()}, diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index a112b0d534..49c681edaf 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -1,24 +1,24 @@ package mockrouting import ( + "context" "math/rand" "sync" "time" "github.com/ipfs/go-ipfs/thirdparty/testutil" + + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) // server is the mockrouting.Client's private interface to the routing server type server interface { - Announce(pstore.PeerInfo, key.Key) error - Providers(key.Key) []pstore.PeerInfo + Announce(pstore.PeerInfo, *cid.Cid) error + Providers(*cid.Cid) []pstore.PeerInfo Server } @@ -28,7 +28,7 @@ type s struct { delayConf DelayConfig lock sync.RWMutex - providers map[key.Key]map[peer.ID]providerRecord + providers map[string]map[peer.ID]providerRecord } type providerRecord struct { @@ -36,10 +36,12 @@ type providerRecord struct { Created time.Time } -func (rs *s) Announce(p pstore.PeerInfo, k key.Key) error { +func (rs *s) Announce(p pstore.PeerInfo, c *cid.Cid) error { rs.lock.Lock() defer rs.lock.Unlock() + k := c.KeyString() + _, ok := rs.providers[k] if !ok { rs.providers[k] = make(map[peer.ID]providerRecord) @@ -51,11 +53,12 @@ func (rs *s) Announce(p pstore.PeerInfo, k key.Key) error { return nil } -func (rs *s) Providers(k key.Key) []pstore.PeerInfo { +func (rs *s) Providers(c *cid.Cid) []pstore.PeerInfo { rs.delayConf.Query.Wait() // before locking rs.lock.RLock() defer rs.lock.RUnlock() + k := c.KeyString() var ret []pstore.PeerInfo records, ok := rs.providers[k] diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index d68fc5e5c9..a29ec12ff2 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -1,21 +1,22 @@ package mockrouting import ( + "context" "testing" "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) func TestKeyNotFound(t *testing.T) { var pi = testutil.RandIdentityOrFatal(t) - var key = key.Key("mock key") + var key = cid.NewCidV0(u.Hash([]byte("mock key"))) var ctx = context.Background() rs := NewServer() @@ -31,7 +32,7 @@ func TestClientFindProviders(t *testing.T) { rs := NewServer() client := rs.Client(pi) - k := key.Key("hello") + k := cid.NewCidV0(u.Hash([]byte("hello"))) err := client.Provide(context.Background(), k) if err != nil { t.Fatal(err) @@ -41,7 +42,7 @@ func TestClientFindProviders(t *testing.T) { time.Sleep(time.Millisecond * 300) max := 100 - providersFromClient := client.FindProvidersAsync(context.Background(), key.Key("hello"), max) + providersFromClient := client.FindProvidersAsync(context.Background(), k, max) isInClient := false for pi := range providersFromClient { if pi.ID == pi.ID { @@ -55,7 +56,7 @@ func TestClientFindProviders(t *testing.T) { func TestClientOverMax(t *testing.T) { rs := NewServer() - k := key.Key("hello") + k := cid.NewCidV0(u.Hash([]byte("hello"))) numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { pi := testutil.RandIdentityOrFatal(t) @@ -82,7 +83,7 @@ func TestClientOverMax(t *testing.T) { // TODO does dht ensure won't receive self as a provider? probably not. func TestCanceledContext(t *testing.T) { rs := NewServer() - k := key.Key("hello") + k := cid.NewCidV0(u.Hash([]byte("hello"))) // avoid leaking goroutine, without using the context to signal // (we want the goroutine to keep trying to publish on a @@ -138,10 +139,11 @@ func TestCanceledContext(t *testing.T) { } func TestValidAfter(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() pi := testutil.RandIdentityOrFatal(t) - var key = key.Key("mock key") - var ctx = context.Background() + key := cid.NewCidV0(u.Hash([]byte("mock key"))) conf := DelayConfig{ ValueVisibility: delay.Fixed(1 * time.Hour), Query: delay.Fixed(0), diff --git a/routing/mock/dht.go b/routing/mock/dht.go index e987a5e490..3f090abe21 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -1,12 +1,12 @@ package mockrouting import ( + context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - mocknet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + mocknet "gx/ipfs/QmcRa2qn6iCmap9bjp8jAwkvYAq13AUfxdY3rrYiaJbLum/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 6cde15ab3d..e5d0e60f4d 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -5,15 +5,16 @@ package mockrouting import ( + "context" + delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) // Server provides mockrouting Clients @@ -24,7 +25,7 @@ type Server interface { // Client implements IpfsRouting type Client interface { - FindProviders(context.Context, key.Key) ([]pstore.PeerInfo, error) + FindProviders(context.Context, *cid.Cid) ([]pstore.PeerInfo, error) routing.IpfsRouting } @@ -39,7 +40,7 @@ func NewServer() Server { // NewServerWithDelay returns a mockrouting Server with a delay! func NewServerWithDelay(conf DelayConfig) Server { return &s{ - providers: make(map[key.Key]map[peer.ID]providerRecord), + providers: make(map[string]map[peer.ID]providerRecord), delayConf: conf, } } diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 82e2bd02e5..8fdebcc668 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -1,16 +1,17 @@ package nilrouting import ( + "context" "errors" repo "github.com/ipfs/go-ipfs/repo" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - p2phost "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/host" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + p2phost "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) var log = logging.Logger("mockrouter") @@ -18,15 +19,15 @@ var log = logging.Logger("mockrouter") type nilclient struct { } -func (c *nilclient) PutValue(_ context.Context, _ key.Key, _ []byte) error { +func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte) error { return nil } -func (c *nilclient) GetValue(_ context.Context, _ key.Key) ([]byte, error) { +func (c *nilclient) GetValue(_ context.Context, _ string) ([]byte, error) { return nil, errors.New("Tried GetValue from nil routing.") } -func (c *nilclient) GetValues(_ context.Context, _ key.Key, _ int) ([]routing.RecvdVal, error) { +func (c *nilclient) GetValues(_ context.Context, _ string, _ int) ([]routing.RecvdVal, error) { return nil, errors.New("Tried GetValues from nil routing.") } @@ -34,13 +35,13 @@ func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, err return pstore.PeerInfo{}, nil } -func (c *nilclient) FindProvidersAsync(_ context.Context, _ key.Key, _ int) <-chan pstore.PeerInfo { +func (c *nilclient) FindProvidersAsync(_ context.Context, _ *cid.Cid, _ int) <-chan pstore.PeerInfo { out := make(chan pstore.PeerInfo) defer close(out) return out } -func (c *nilclient) Provide(_ context.Context, _ key.Key) error { +func (c *nilclient) Provide(_ context.Context, _ *cid.Cid) error { return nil } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 982e46ea73..398a4d1b90 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -1,21 +1,22 @@ package offline import ( + "context" "errors" "time" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" - pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" + pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) var log = logging.Logger("offlinerouting") @@ -37,7 +38,7 @@ type offlineRouting struct { sk ci.PrivKey } -func (c *offlineRouting) PutValue(ctx context.Context, key key.Key, val []byte) error { +func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte) error { rec, err := record.MakePutRecord(c.sk, key, val, false) if err != nil { return err @@ -47,11 +48,11 @@ func (c *offlineRouting) PutValue(ctx context.Context, key key.Key, val []byte) return err } - return c.datastore.Put(key.DsKey(), data) + return c.datastore.Put(dshelp.NewKeyFromBinary(key), data) } -func (c *offlineRouting) GetValue(ctx context.Context, key key.Key) ([]byte, error) { - v, err := c.datastore.Get(key.DsKey()) +func (c *offlineRouting) GetValue(ctx context.Context, key string) ([]byte, error) { + v, err := c.datastore.Get(dshelp.NewKeyFromBinary(key)) if err != nil { return nil, err } @@ -69,8 +70,8 @@ func (c *offlineRouting) GetValue(ctx context.Context, key key.Key) ([]byte, err return rec.GetValue(), nil } -func (c *offlineRouting) GetValues(ctx context.Context, key key.Key, _ int) ([]routing.RecvdVal, error) { - v, err := c.datastore.Get(key.DsKey()) +func (c *offlineRouting) GetValues(ctx context.Context, key string, _ int) ([]routing.RecvdVal, error) { + v, err := c.datastore.Get(dshelp.NewKeyFromBinary(key)) if err != nil { return nil, err } @@ -90,7 +91,7 @@ func (c *offlineRouting) GetValues(ctx context.Context, key key.Key, _ int) ([]r }, nil } -func (c *offlineRouting) FindProviders(ctx context.Context, key key.Key) ([]pstore.PeerInfo, error) { +func (c *offlineRouting) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { return nil, ErrOffline } @@ -98,13 +99,13 @@ func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.Peer return pstore.PeerInfo{}, ErrOffline } -func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan pstore.PeerInfo { +func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo { out := make(chan pstore.PeerInfo) close(out) return out } -func (c *offlineRouting) Provide(_ context.Context, key key.Key) error { +func (c *offlineRouting) Provide(_ context.Context, k *cid.Cid) error { return ErrOffline } diff --git a/routing/supernode/client.go b/routing/supernode/client.go index b76b300807..79b058d0a8 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -2,22 +2,22 @@ package supernode import ( "bytes" + "context" "errors" "time" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" + loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/host" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) var log = logging.Logger("supernode") @@ -39,13 +39,13 @@ func NewClient(px proxy.Proxy, h host.Host, ps pstore.Peerstore, local peer.ID) }, nil } -func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-chan pstore.PeerInfo { +func (c *Client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo { logging.ContextWithLoggable(ctx, loggables.Uuid("findProviders")) - defer log.EventBegin(ctx, "findProviders", &k).Done() + defer log.EventBegin(ctx, "findProviders", k).Done() ch := make(chan pstore.PeerInfo) go func() { defer close(ch) - request := dhtpb.NewMessage(dhtpb.Message_GET_PROVIDERS, string(k), 0) + request := dhtpb.NewMessage(dhtpb.Message_GET_PROVIDERS, k.KeyString(), 0) response, err := c.proxy.SendRequest(ctx, request) if err != nil { log.Debug(err) @@ -63,8 +63,8 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k key.Key, max int) <-c return ch } -func (c *Client) PutValue(ctx context.Context, k key.Key, v []byte) error { - defer log.EventBegin(ctx, "putValue", &k).Done() +func (c *Client) PutValue(ctx context.Context, k string, v []byte) error { + defer log.EventBegin(ctx, "putValue").Done() r, err := makeRecord(c.peerstore, c.local, k, v) if err != nil { return err @@ -74,8 +74,8 @@ func (c *Client) PutValue(ctx context.Context, k key.Key, v []byte) error { return c.proxy.SendMessage(ctx, pmes) // wrap to hide the remote } -func (c *Client) GetValue(ctx context.Context, k key.Key) ([]byte, error) { - defer log.EventBegin(ctx, "getValue", &k).Done() +func (c *Client) GetValue(ctx context.Context, k string) ([]byte, error) { + defer log.EventBegin(ctx, "getValue").Done() msg := dhtpb.NewMessage(dhtpb.Message_GET_VALUE, string(k), 0) response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote if err != nil { @@ -84,8 +84,8 @@ func (c *Client) GetValue(ctx context.Context, k key.Key) ([]byte, error) { return response.Record.GetValue(), nil } -func (c *Client) GetValues(ctx context.Context, k key.Key, _ int) ([]routing.RecvdVal, error) { - defer log.EventBegin(ctx, "getValue", &k).Done() +func (c *Client) GetValues(ctx context.Context, k string, _ int) ([]routing.RecvdVal, error) { + defer log.EventBegin(ctx, "getValue").Done() msg := dhtpb.NewMessage(dhtpb.Message_GET_VALUE, string(k), 0) response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote if err != nil { @@ -100,9 +100,9 @@ func (c *Client) GetValues(ctx context.Context, k key.Key, _ int) ([]routing.Rec }, nil } -func (c *Client) Provide(ctx context.Context, k key.Key) error { - defer log.EventBegin(ctx, "provide", &k).Done() - msg := dhtpb.NewMessage(dhtpb.Message_ADD_PROVIDER, string(k), 0) +func (c *Client) Provide(ctx context.Context, k *cid.Cid) error { + defer log.EventBegin(ctx, "provide", k).Done() + msg := dhtpb.NewMessage(dhtpb.Message_ADD_PROVIDER, k.KeyString(), 0) // FIXME how is connectedness defined for the local node pri := []dhtpb.PeerRoutingInfo{ { @@ -132,7 +132,7 @@ func (c *Client) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, err } // creates and signs a record for the given key/value pair -func makeRecord(ps pstore.Peerstore, p peer.ID, k key.Key, v []byte) (*pb.Record, error) { +func makeRecord(ps pstore.Peerstore, p peer.ID, k string, v []byte) (*pb.Record, error) { blob := bytes.Join([][]byte{[]byte(k), v, []byte(p)}, []byte{}) sig, err := ps.PrivKey(p).Sign(blob) if err != nil { diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 8afe91a758..8a6e5230f2 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -1,11 +1,11 @@ package proxy import ( - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" + context "context" + dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - inet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net" + inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 6d7ef439f4..f7d2b80ed3 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -1,22 +1,18 @@ package proxy import ( + "context" "errors" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" - + dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - host "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/host" - inet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net" - - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - - kbucket "gx/ipfs/QmVsCNFD32GzZ6Q5XD1TVGPRviNYqDdoNvgq853TU9hhzP/go-libp2p-kbucket" - dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" - loggables "gx/ipfs/QmYrv4LgCC8FhG2Ab4bwuq5DqBdwMtx3hMb3KKJDZcr2d7/go-libp2p-loggables" + loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + host "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" + inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) const ProtocolSNR = "/ipfs/supernoderouting" @@ -167,6 +163,6 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe } func sortedByKey(peers []peer.ID, skey string) []peer.ID { - target := kbucket.ConvertKey(key.Key(skey)) + target := kbucket.ConvertKey(skey) return kbucket.SortClosestPeers(peers, target) } diff --git a/routing/supernode/server.go b/routing/supernode/server.go index d6c8a48055..3eabaa415f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -6,15 +6,15 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" + context "context" + dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" - pb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" + record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" + pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 5bdec5ded3..36f8b53b32 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,9 +3,9 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmXVWh4XWRaRGdcGeFtBp3hx7H3mzYgVRpVN7LwtTaYv2E/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 70cacafa77d40e6b4b97fc0fee7bcfe808307c79 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Oct 2016 15:49:08 -0700 Subject: [PATCH 1338/3147] update to libp2p 4.0.1 and propogate other changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@ead62da25c72c4056cbdb77f66b1a6fa48074f7f --- namesys/base.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_select_test.go | 4 ++-- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 2 +- namesys/proquint.go | 2 +- namesys/publisher.go | 34 +++++++++++++++---------------- namesys/republisher/repub.go | 20 +++++++++--------- namesys/republisher/repub_test.go | 8 ++++---- namesys/resolve_test.go | 8 ++++---- namesys/routing.go | 16 +++++++-------- 12 files changed, 54 insertions(+), 54 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 569cb4bb37..c79fbeb94c 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -3,7 +3,7 @@ package namesys import ( "strings" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" path "github.com/ipfs/go-ipfs/path" ) diff --git a/namesys/dns.go b/namesys/dns.go index 79fb00c2f5..93a5501da4 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -5,7 +5,7 @@ import ( "net" "strings" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" isd "gx/ipfs/QmaeHSCBd9XjXxmgHEiKkHtLcMCb2eZsPLKT7bHgBfBkqw/go-is-domain" path "github.com/ipfs/go-ipfs/path" diff --git a/namesys/interface.go b/namesys/interface.go index ae734af4fd..3f66498ace 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -33,9 +33,9 @@ import ( "errors" "time" + context "context" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index ca04674c51..883c00c2b0 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index a5f4e8a901..7f8d298c24 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -4,11 +4,11 @@ import ( "strings" "time" + context "context" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index f44f17ef5a..b2f92deb00 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" path "github.com/ipfs/go-ipfs/path" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index f90a4c8a1e..ee6ada978c 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -3,9 +3,9 @@ package namesys import ( "errors" + context "context" path "github.com/ipfs/go-ipfs/path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index d70cc289c8..b48e742b85 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -2,6 +2,7 @@ package namesys import ( "bytes" + "context" "errors" "fmt" "time" @@ -10,18 +11,17 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - record "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record" - dhtpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" + dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) // ErrExpiredRecord should be returned when an ipns record is @@ -79,8 +79,8 @@ func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value return PutRecordToRouting(ctx, k, value, seqnum, eol, p.routing, id) } -func (p *ipnsPublisher) getPreviousSeqNo(ctx context.Context, ipnskey key.Key) (uint64, error) { - prevrec, err := p.ds.Get(ipnskey.DsKey()) +func (p *ipnsPublisher) getPreviousSeqNo(ctx context.Context, ipnskey string) (uint64, error) { + prevrec, err := p.ds.Get(dshelp.NewKeyFromBinary(ipnskey)) if err != nil && err != ds.ErrNotFound { // None found, lets start at zero! return 0, err @@ -181,7 +181,7 @@ func waitOnErrChan(ctx context.Context, errs chan error) error { } } -func PublishPublicKey(ctx context.Context, r routing.ValueStore, k key.Key, pubk ci.PubKey) error { +func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk ci.PubKey) error { log.Debugf("Storing pubkey at: %s", k) pkbytes, err := pubk.Bytes() if err != nil { @@ -199,7 +199,7 @@ func PublishPublicKey(ctx context.Context, r routing.ValueStore, k key.Key, pubk return nil } -func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey key.Key, rec *pb.IpnsEntry) error { +func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec *pb.IpnsEntry) error { timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) defer cancel() @@ -248,7 +248,7 @@ var IpnsRecordValidator = &record.ValidChecker{ Sign: true, } -func IpnsSelectorFunc(k key.Key, vals [][]byte) (int, error) { +func IpnsSelectorFunc(k string, vals [][]byte) (int, error) { var recs []*pb.IpnsEntry for _, v := range vals { e := new(pb.IpnsEntry) @@ -304,7 +304,7 @@ func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { // ValidateIpnsRecord implements ValidatorFunc and verifies that the // given 'val' is an IpnsEntry and that that entry is valid. -func ValidateIpnsRecord(k key.Key, val []byte) error { +func ValidateIpnsRecord(k string, val []byte) error { entry := new(pb.IpnsEntry) err := proto.Unmarshal(val, entry) if err != nil { @@ -356,9 +356,9 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p return nil } -func IpnsKeysForID(id peer.ID) (name, ipns key.Key) { - namekey := key.Key("/pk/" + id) - ipnskey := key.Key("/ipns/" + id) +func IpnsKeysForID(id peer.ID) (name, ipns string) { + namekey := "/pk/" + string(id) + ipnskey := "/ipns/" + string(id) return namekey, ipnskey } diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index d208e093c6..41c0a04eea 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -1,6 +1,7 @@ package republisher import ( + "context" "errors" "sync" "time" @@ -8,18 +9,17 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - gpctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - recpb "gx/ipfs/Qme7D9iKHYxwq28p6PzCymywsYSRBx9uyGzW7qNB3s9VbC/go-libp2p-record/pb" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + recpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) var errNoEntry = errors.New("no previous entry") @@ -107,8 +107,8 @@ func (rp *Republisher) republishEntries(p goprocess.Process) error { return nil } -func (rp *Republisher) getLastVal(k key.Key) (path.Path, uint64, error) { - ival, err := rp.ds.Get(k.DsKey()) +func (rp *Republisher) getLastVal(k string) (path.Path, uint64, error) { + ival, err := rp.ds.Get(dshelp.NewKeyFromBinary(k)) if err != nil { // not found means we dont have a previously published entry return "", 0, errNoEntry diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 0bb9f10312..5b6e30794c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -5,16 +5,16 @@ import ( "testing" "time" - goprocess "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + context "context" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" "github.com/ipfs/go-ipfs/core" mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmYkwVGkwoPbMVQEbf6LonZg4SsCxGP3H7PBEtdNCNRyxD/go-libp2p-peerstore" - mocknet "gx/ipfs/QmbiRCGZqhfcSjnm9icGz3oNQQdPLAnLWnKHXixaEWXVCN/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + mocknet "gx/ipfs/QmcRa2qn6iCmap9bjp8jAwkvYAq13AUfxdY3rrYiaJbLum/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index d7fbdf6cac..145396d11e 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" + context "context" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmWXjJo15p4pzT7cayEwZi2sWgJqLnGDof6ZGMh9xBgU1p/go-libp2p-peer" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index bf481be301..3287d49407 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,20 +5,20 @@ import ( "strings" "time" + "context" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" + mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - key "gx/ipfs/Qmce4Y4zg3sYr7xKM5UueS67vhNni6EeWgCRnb7MbLJMew/go-key" - routing "gx/ipfs/QmemZcG8WprPbnVX3AM43GhhSUiA3V6NjcTLAguvWzkdpQ/go-libp2p-routing" + routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ci "gx/ipfs/QmVoi5es8D5fNHZDqoW6DgDAEPEV5hQp8GBz161vZXiwpQ/go-libp2p-crypto" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - cid "gx/ipfs/QmfSc2xehWmWLnwwYR91Y8QF4xdASypTFVknutoKQS3GHp/go-cid" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) var log = logging.Logger("namesys") @@ -142,7 +142,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa resp := make(chan error, 2) go func() { - ipnsKey := key.Key(h) + ipnsKey := string(h) val, err := r.routing.GetValue(ctx, ipnsKey) if err != nil { log.Warning("RoutingResolve get failed.") From 95047cfd1e9a2c067e0675eb442280ae37248500 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Sep 2016 12:35:40 -0700 Subject: [PATCH 1339/3147] fix bug in pinsets and add a stress test for the scenario License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@8298dcca1eb66606c26cbae61b677ea2889a85cd --- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 67 ++++++++++++++++++++++++++++++++++---- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index ec08971e9a..d93ccd1144 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -143,7 +143,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if !ok { break } - h := hash(seed, k) + h := hash(seed, k) % defaultFanout hashed[h] = append(hashed[h], item{k, data}) } for h, items := range hashed { diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index f48fc9d175..8c60633b48 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -1,13 +1,66 @@ package pin -import "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" +import ( + "context" + "fmt" + "os" + "testing" -func ignoreKeys(key.Key) {} + dag "github.com/ipfs/go-ipfs/merkledag" + mdtest "github.com/ipfs/go-ipfs/merkledag/test" -func copyMap(m map[key.Key]uint16) map[key.Key]uint64 { - c := make(map[key.Key]uint64, len(m)) - for k, v := range m { - c[k] = uint64(v) + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" +) + +func ignoreCids(_ *cid.Cid) {} + +func TestSet(t *testing.T) { + ds := mdtest.Mock() + limit := 10000 // 10000 reproduces the pinloss issue fairly reliably + + if os.Getenv("STRESS_IT_OUT_YO") != "" { + limit = 10000000 + } + var inputs []*cid.Cid + for i := 0; i < limit; i++ { + c, err := ds.Add(dag.NodeWithData([]byte(fmt.Sprint(i)))) + if err != nil { + t.Fatal(err) + } + + inputs = append(inputs, c) + } + + out, err := storeSet(context.Background(), ds, inputs, ignoreCids) + if err != nil { + t.Fatal(err) + } + + // weird wrapper node because loadSet expects us to pass an + // object pointing to multiple named sets + setroot := &dag.Node{} + err = setroot.AddNodeLinkClean("foo", out) + if err != nil { + t.Fatal(err) + } + + outset, err := loadSet(context.Background(), ds, setroot, "foo", ignoreCids) + if err != nil { + t.Fatal(err) + } + + if len(outset) != limit { + t.Fatal("got wrong number", len(outset), limit) + } + + seen := cid.NewSet() + for _, c := range outset { + seen.Add(c) + } + + for _, c := range inputs { + if !seen.Has(c) { + t.Fatalf("expected to have %s, didnt find it") + } } - return c } From 8b2e48f38c019dac93f51813bff6fbf6d41c07aa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Sep 2016 13:19:07 -0700 Subject: [PATCH 1340/3147] add comment detailing the algorithm and fix License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@a000caf094d6a7157932af1ddeb5bd5f3355f139 --- pinning/pinner/set.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index d93ccd1144..e2ac75790d 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -139,6 +139,19 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint } hashed := make(map[uint32][]item) for { + // This loop essentially enumerates every single item in the set + // and maps them all into a set of buckets. Each bucket will be recursively + // turned into its own sub-set, and so on down the chain. Each sub-set + // gets added to the dagservice, and put into its place in a set nodes + // links array. + // + // Previously, the bucket was selected by taking an int32 from the hash of + // the input key + seed. This was erroneous as we would later be assigning + // the created sub-sets into an array of length 256 by the modulus of the + // int32 hash value with 256. This resulted in overwriting existing sub-sets + // and losing pins. The fix (a few lines down from this comment), is to + // map the hash value down to the 8 bit keyspace here while creating the + // buckets. This way, we avoid any overlapping later on. k, data, ok := iter() if !ok { break From a83703e854f7152bc9d92acce662fba9d49e4608 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Sep 2016 13:41:17 -0700 Subject: [PATCH 1341/3147] pinset: clean up storeItems logic a bit Switched from using a map to an array since the bounds are small and fixed. This should save us some significant time and on accesses License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@53781e6150c5b322e2dee56dd85a065a5242a7ff --- pinning/pinner/set.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index e2ac75790d..bf0b41c740 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -132,12 +132,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint sort.Stable(s) } - // wasteful but simple - type item struct { - c *cid.Cid - data []byte - } - hashed := make(map[uint32][]item) + hashed := make([][]*cid.Cid, defaultFanout) for { // This loop essentially enumerates every single item in the set // and maps them all into a set of buckets. Each bucket will be recursively @@ -152,41 +147,49 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint // and losing pins. The fix (a few lines down from this comment), is to // map the hash value down to the 8 bit keyspace here while creating the // buckets. This way, we avoid any overlapping later on. - k, data, ok := iter() + k, _, ok := iter() if !ok { break } h := hash(seed, k) % defaultFanout - hashed[h] = append(hashed[h], item{k, data}) + hashed[h] = append(hashed[h], k) } + for h, items := range hashed { + if len(items) == 0 { + // recursion base case + continue + } + childIter := func() (c *cid.Cid, data []byte, ok bool) { if len(items) == 0 { return nil, nil, false } first := items[0] items = items[1:] - return first.c, first.data, true + return first, nil, true } + child, err := storeItems(ctx, dag, uint64(len(items)), childIter, internalKeys) if err != nil { return nil, err } + size, err := child.Size() if err != nil { return nil, err } + childKey, err := dag.Add(child) if err != nil { return nil, err } + internalKeys(childKey) - l := &merkledag.Link{ - Name: "", + n.Links[int(h)] = &merkledag.Link{ Hash: childKey.Hash(), Size: size, } - n.Links[int(h%defaultFanout)] = l } return n, nil } From 5e140a8efb53022ef7a77d39307b01b38b5f3a68 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 19 Aug 2016 15:52:27 -0400 Subject: [PATCH 1342/3147] Add DAGService.GetLinks() method and use it in the GC and elsewhere. This method will use the (also new) LinkService if it is available to retrieving just the links for a MerkleDAG without necessary having to retrieve the underlying block. For now the main benefit is that the pinner will not break when a block becomes invalid due to a change in the backing file. This is possible because the metadata for a block (that includes the Links) is stored separately and thus always available even if the backing file changes. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@fcee2829f584681a8fd6a39d649dfd748c0ffc4d --- pinning/pinner/gc/gc.go | 7 ++++--- pinning/pinner/pin.go | 16 ++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 7bfde538c1..ef57cf6ad5 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -24,11 +24,12 @@ var log = logging.Logger("gc") // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan key.Key, error) { +func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan key.Key, error) { unlocker := bs.GCLock() bsrv := bserv.New(bs, offline.Exchange(bs)) ds := dag.NewDAGService(bsrv) + ds.LinkService = ls gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots) if err != nil { @@ -74,13 +75,13 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRo func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []*cid.Cid, bestEffort bool) error { for _, c := range roots { set.Add(key.Key(c.Hash())) - nd, err := ds.Get(ctx, c) + links, err := ds.GetLinks(ctx, c) if err != nil { return err } // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ds, nd, func(c *cid.Cid) bool { + err = dag.EnumerateChildren(ctx, ds, links, func(c *cid.Cid) bool { k := key.Key(c.Hash()) seen := set.Has(k) if seen { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 6edd66abc2..ab949ec40e 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -279,12 +279,12 @@ func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error // Default is Indirect for _, rc := range p.recursePin.Keys() { - rnd, err := p.dserv.Get(context.Background(), rc) + links, err := p.dserv.GetLinks(context.Background(), rc) if err != nil { return "", false, err } - has, err := hasChild(p.dserv, rnd, k) + has, err := hasChild(p.dserv, links, k) if err != nil { return "", false, err } @@ -317,11 +317,11 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { // Now walk all recursive pins to check for indirect pins var checkChildren func(*cid.Cid, *cid.Cid) error checkChildren = func(rk, parentKey *cid.Cid) error { - parent, err := p.dserv.Get(context.Background(), parentKey) + links, err := p.dserv.GetLinks(context.Background(), parentKey) if err != nil { return err } - for _, lnk := range parent.Links { + for _, lnk := range links { c := cid.NewCidV0(lnk.Hash) if toCheck.Has(c) { @@ -521,19 +521,19 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { } } -func hasChild(ds mdag.DAGService, root *mdag.Node, child key.Key) (bool, error) { - for _, lnk := range root.Links { +func hasChild(ds mdag.DAGService, links []*mdag.Link, child key.Key) (bool, error) { + for _, lnk := range links { c := cid.NewCidV0(lnk.Hash) if key.Key(c.Hash()) == child { return true, nil } - nd, err := ds.Get(context.Background(), c) + children, err := ds.GetLinks(context.Background(), c) if err != nil { return false, err } - has, err := hasChild(ds, nd, child) + has, err := hasChild(ds, children, child) if err != nil { return false, err } From 0e14be806df32947f1eac2343293fb873a0b23f7 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 30 Sep 2016 17:06:12 -0400 Subject: [PATCH 1343/3147] Don't use a separate LinkService for DAGService.GetLinks() Instead make LinkService a part of DAGService. The LinkService is now simply an interface that DAGService implements. Also provide a GetOfflineLinkService() method that the GC uses to get an offline instance. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@9dfffa9b976d6a0d24ade84aa94814fb4e465133 --- pinning/pinner/gc/gc.go | 22 +++++++++------------- pinning/pinner/pin.go | 2 +- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ef57cf6ad5..dac5e48bac 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -2,8 +2,6 @@ package gc import ( bstore "github.com/ipfs/go-ipfs/blocks/blockstore" - bserv "github.com/ipfs/go-ipfs/blockservice" - offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" @@ -27,11 +25,9 @@ var log = logging.Logger("gc") func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan key.Key, error) { unlocker := bs.GCLock() - bsrv := bserv.New(bs, offline.Exchange(bs)) - ds := dag.NewDAGService(bsrv) - ds.LinkService = ls + ls = ls.GetOfflineLinkService() - gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots) + gcs, err := ColoredSet(ctx, pn, ls, bestEffortRoots) if err != nil { return nil, err } @@ -72,16 +68,16 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. return output, nil } -func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots []*cid.Cid, bestEffort bool) error { +func Descendants(ctx context.Context, ls dag.LinkService, set key.KeySet, roots []*cid.Cid, bestEffort bool) error { for _, c := range roots { set.Add(key.Key(c.Hash())) - links, err := ds.GetLinks(ctx, c) + links, err := ls.GetLinks(ctx, c) if err != nil { return err } // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ds, links, func(c *cid.Cid) bool { + err = dag.EnumerateChildren(ctx, ls, links, func(c *cid.Cid) bool { k := key.Key(c.Hash()) seen := set.Has(k) if seen { @@ -98,16 +94,16 @@ func Descendants(ctx context.Context, ds dag.DAGService, set key.KeySet, roots [ return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService, bestEffortRoots []*cid.Cid) (key.KeySet, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid) (key.KeySet, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := key.NewKeySet() - err := Descendants(ctx, ds, gcs, pn.RecursiveKeys(), false) + err := Descendants(ctx, ls, gcs, pn.RecursiveKeys(), false) if err != nil { return nil, err } - err = Descendants(ctx, ds, gcs, bestEffortRoots, true) + err = Descendants(ctx, ls, gcs, bestEffortRoots, true) if err != nil { return nil, err } @@ -116,7 +112,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ds dag.DAGService, bestEffor gcs.Add(key.Key(k.Hash())) } - err = Descendants(ctx, ds, gcs, pn.InternalPins(), false) + err = Descendants(ctx, ls, gcs, pn.InternalPins(), false) if err != nil { return nil, err } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ab949ec40e..cd55aaa991 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -521,7 +521,7 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { } } -func hasChild(ds mdag.DAGService, links []*mdag.Link, child key.Key) (bool, error) { +func hasChild(ds mdag.LinkService, links []*mdag.Link, child key.Key) (bool, error) { for _, lnk := range links { c := cid.NewCidV0(lnk.Hash) if key.Key(c.Hash()) == child { From b9265575042abf6a86d4e260102b1077d403f2e2 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 30 Sep 2016 17:06:12 -0400 Subject: [PATCH 1344/3147] Don't use a separate LinkService for DAGService.GetLinks() Instead make LinkService a part of DAGService. The LinkService is now simply an interface that DAGService implements. Also provide a GetOfflineLinkService() method that the GC uses to get an offline instance. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-exchange-interface@d25bf371c5ef33138d37f4b9cee576b6f092bf67 --- exchange/interface.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exchange/interface.go b/exchange/interface.go index f2edc569b0..23d830466d 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -22,5 +22,7 @@ type Interface interface { // type Exchanger interface // available on the network? HasBlock(blocks.Block) error + IsOnline() bool + io.Closer } From aa6a68503289b12225f70c09aaf5d0a4ba988e4e Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 30 Sep 2016 17:06:12 -0400 Subject: [PATCH 1345/3147] Don't use a separate LinkService for DAGService.GetLinks() Instead make LinkService a part of DAGService. The LinkService is now simply an interface that DAGService implements. Also provide a GetOfflineLinkService() method that the GC uses to get an offline instance. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-exchange-offline@be58cab5c2eadc9b9991d518961435a951c44c01 --- exchange/offline/offline.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index b483e1825a..190d5bfa24 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -67,3 +67,7 @@ func (e *offlineExchange) GetBlocks(ctx context.Context, ks []key.Key) (<-chan b }() return out, nil } + +func (e *offlineExchange) IsOnline() bool { + return false +} From 80e7f03321a39a9daec6bf795fba9e6daac6149e Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 3 Oct 2016 21:38:47 -0400 Subject: [PATCH 1346/3147] Fix EnumerateChildren & hasChild to take a *cid.Cid instead of []*mdag.Link Author: Kevin Atkinson Fix EnumerateChildren & hasChild to take a *cid.Cid instead of []*mdag.Link Author: Jeromy Johnson make FetchGraph use a cid pin: fix TestPinRecursiveFail License: MIT Signed-off-by: Jeromy License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@24a9dcfacc344adfd64c1f3f72b6c5ee224d7d6c --- pinning/pinner/gc/gc.go | 6 +----- pinning/pinner/pin.go | 22 ++++++++-------------- pinning/pinner/pin_test.go | 5 +++++ 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index dac5e48bac..32b611f654 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -71,13 +71,9 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. func Descendants(ctx context.Context, ls dag.LinkService, set key.KeySet, roots []*cid.Cid, bestEffort bool) error { for _, c := range roots { set.Add(key.Key(c.Hash())) - links, err := ls.GetLinks(ctx, c) - if err != nil { - return err - } // EnumerateChildren recursively walks the dag and adds the keys to the given set - err = dag.EnumerateChildren(ctx, ls, links, func(c *cid.Cid) bool { + err := dag.EnumerateChildren(ctx, ls, c, func(c *cid.Cid) bool { k := key.Key(c.Hash()) seen := set.Has(k) if seen { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index cd55aaa991..6e73929a6c 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -178,7 +178,7 @@ func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { } // fetch entire graph - err := mdag.FetchGraph(ctx, node, p.dserv) + err := mdag.FetchGraph(ctx, c, p.dserv) if err != nil { return err } @@ -279,12 +279,7 @@ func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error // Default is Indirect for _, rc := range p.recursePin.Keys() { - links, err := p.dserv.GetLinks(context.Background(), rc) - if err != nil { - return "", false, err - } - - has, err := hasChild(p.dserv, links, k) + has, err := hasChild(p.dserv, rc, k) if err != nil { return "", false, err } @@ -521,19 +516,18 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { } } -func hasChild(ds mdag.LinkService, links []*mdag.Link, child key.Key) (bool, error) { +func hasChild(ds mdag.LinkService, root *cid.Cid, child key.Key) (bool, error) { + links, err := ds.GetLinks(context.Background(), root) + if err != nil { + return false, err + } for _, lnk := range links { c := cid.NewCidV0(lnk.Hash) if key.Key(c.Hash()) == child { return true, nil } - children, err := ds.GetLinks(context.Background(), c) - if err != nil { - return false, err - } - - has, err := hasChild(ds, children, child) + has, err := hasChild(ds, c, child) if err != nil { return false, err } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 185b27a461..01cbeb79e9 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -225,6 +225,11 @@ func TestPinRecursiveFail(t *testing.T) { t.Fatal(err) } + _, err = dserv.Add(a) + if err != nil { + t.Fatal(err) + } + // this one is time based... but shouldnt cause any issues mctx, _ = context.WithTimeout(ctx, time.Second) err = p.Pin(mctx, a, true) From e1e8dcc441377b66827394a0e13f5ae44067c34a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 6 Oct 2016 19:08:59 -0700 Subject: [PATCH 1347/3147] Remove legacy multiset 'data' fields, comment and cleanup more License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@1573888a444f37d18bfc8f0c40034cd3c2d9d2f7 --- pinning/pinner/set.go | 154 +++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 100 deletions(-) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index bf0b41c740..9ed1559907 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -2,15 +2,14 @@ package pin import ( "bytes" + "context" "crypto/rand" "encoding/binary" "errors" "fmt" "hash/fnv" "sort" - "unsafe" - "context" "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" @@ -19,8 +18,11 @@ import ( ) const ( + // defaultFanout specifies the default number of fan-out links per layer defaultFanout = 256 - maxItems = 8192 + + // maxItems is the maximum number of items that will fit in a single bucket + maxItems = 8192 ) func randomSeed() (uint32, error) { @@ -40,36 +42,12 @@ func hash(seed uint32, c *cid.Cid) uint32 { return h.Sum32() } -type itemIterator func() (c *cid.Cid, data []byte, ok bool) +type itemIterator func() (c *cid.Cid, ok bool) type keyObserver func(*cid.Cid) -// refcount is the marshaled format of refcounts. It may change -// between versions; this is valid for version 1. Changing it may -// become desirable if there are many links with refcount > 255. -// -// There are two guarantees that need to be preserved, if this is -// changed: -// -// - the marshaled format is of fixed size, matching -// unsafe.Sizeof(refcount(0)) -// - methods of refcount handle endianness, and may -// in later versions need encoding/binary. -type refcount uint8 - -func (r refcount) Bytes() []byte { - return []byte{byte(r)} -} - -// readRefcount returns the idx'th refcount in []byte, which is -// assumed to be a sequence of refcount.Bytes results. -func (r *refcount) ReadFromIdx(buf []byte, idx int) { - *r = refcount(buf[idx]) -} - type sortByHash struct { links []*merkledag.Link - data []byte } func (s sortByHash) Len() int { @@ -82,13 +60,6 @@ func (s sortByHash) Less(a, b int) bool { func (s sortByHash) Swap(a, b int) { s.links[a], s.links[b] = s.links[b], s.links[a] - if len(s.data) != 0 { - const n = int(unsafe.Sizeof(refcount(0))) - tmp := make([]byte, n) - copy(tmp, s.data[a*n:a*n+n]) - copy(s.data[a*n:a*n+n], s.data[b*n:b*n+n]) - copy(s.data[b*n:b*n+n], tmp) - } } func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint64, iter itemIterator, internalKeys keyObserver) (*merkledag.Node, error) { @@ -96,13 +67,15 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if err != nil { return nil, err } - n := &merkledag.Node{ - Links: make([]*merkledag.Link, 0, defaultFanout+maxItems), - } + + n := &merkledag.Node{Links: make([]*merkledag.Link, 0, defaultFanout+maxItems)} for i := 0; i < defaultFanout; i++ { n.Links = append(n.Links, &merkledag.Link{Hash: emptyKey.Hash()}) } + + // add emptyKey to our set of internal pinset objects internalKeys(emptyKey) + hdr := &pb.Set{ Version: proto.Uint32(1), Fanout: proto.Uint32(defaultFanout), @@ -111,23 +84,20 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if err := writeHdr(n, hdr); err != nil { return nil, err } - hdrLen := len(n.Data()) if estimatedLen < maxItems { // it'll probably fit for i := 0; i < maxItems; i++ { - k, data, ok := iter() + k, ok := iter() if !ok { // all done break } n.Links = append(n.Links, &merkledag.Link{Hash: k.Hash()}) - n.SetData(append(n.Data(), data...)) } // sort by hash, also swap item Data s := sortByHash{ links: n.Links[defaultFanout:], - data: n.Data()[hdrLen:], } sort.Stable(s) } @@ -147,7 +117,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint // and losing pins. The fix (a few lines down from this comment), is to // map the hash value down to the 8 bit keyspace here while creating the // buckets. This way, we avoid any overlapping later on. - k, _, ok := iter() + k, ok := iter() if !ok { break } @@ -161,15 +131,9 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint continue } - childIter := func() (c *cid.Cid, data []byte, ok bool) { - if len(items) == 0 { - return nil, nil, false - } - first := items[0] - items = items[1:] - return first, nil, true - } + childIter := getCidListIterator(items) + // recursively create a pinset from the items for this bucket index child, err := storeItems(ctx, dag, uint64(len(items)), childIter, internalKeys) if err != nil { return nil, err @@ -186,7 +150,9 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint } internalKeys(childKey) - n.Links[int(h)] = &merkledag.Link{ + + // overwrite the 'empty key' in the existing links array + n.Links[h] = &merkledag.Link{ Hash: childKey.Hash(), Size: size, } @@ -194,30 +160,30 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint return n, nil } -func readHdr(n *merkledag.Node) (*pb.Set, []byte, error) { +func readHdr(n *merkledag.Node) (*pb.Set, error) { hdrLenRaw, consumed := binary.Uvarint(n.Data()) if consumed <= 0 { - return nil, nil, errors.New("invalid Set header length") + return nil, errors.New("invalid Set header length") } - buf := n.Data()[consumed:] - if hdrLenRaw > uint64(len(buf)) { - return nil, nil, errors.New("impossibly large Set header length") + + pbdata := n.Data()[consumed:] + if hdrLenRaw > uint64(len(pbdata)) { + return nil, errors.New("impossibly large Set header length") } // as hdrLenRaw was <= an int, we now know it fits in an int hdrLen := int(hdrLenRaw) var hdr pb.Set - if err := proto.Unmarshal(buf[:hdrLen], &hdr); err != nil { - return nil, nil, err + if err := proto.Unmarshal(pbdata[:hdrLen], &hdr); err != nil { + return nil, err } - buf = buf[hdrLen:] if v := hdr.GetVersion(); v != 1 { - return nil, nil, fmt.Errorf("unsupported Set version: %d", v) + return nil, fmt.Errorf("unsupported Set version: %d", v) } if uint64(hdr.GetFanout()) > uint64(len(n.Links)) { - return nil, nil, errors.New("impossibly large Fanout") + return nil, errors.New("impossibly large Fanout") } - return &hdr, buf, nil + return &hdr, nil } func writeHdr(n *merkledag.Node, hdr *pb.Set) error { @@ -225,24 +191,31 @@ func writeHdr(n *merkledag.Node, hdr *pb.Set) error { if err != nil { return err } - n.SetData(make([]byte, binary.MaxVarintLen64, binary.MaxVarintLen64+len(hdrData))) - written := binary.PutUvarint(n.Data(), uint64(len(hdrData))) - n.SetData(n.Data()[:written]) - n.SetData(append(n.Data(), hdrData...)) + + // make enough space for the length prefix and the marshalled header data + data := make([]byte, binary.MaxVarintLen64, binary.MaxVarintLen64+len(hdrData)) + + // write the uvarint length of the header data + uvarlen := binary.PutUvarint(data, uint64(len(hdrData))) + + // append the actual protobuf data *after* the length value we wrote + data = append(data[:uvarlen], hdrData...) + + n.SetData(data) return nil } -type walkerFunc func(buf []byte, idx int, link *merkledag.Link) error +type walkerFunc func(idx int, link *merkledag.Link) error func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.Node, fn walkerFunc, children keyObserver) error { - hdr, buf, err := readHdr(n) + hdr, err := readHdr(n) if err != nil { return err } // readHdr guarantees fanout is a safe value fanout := hdr.GetFanout() for i, l := range n.Links[fanout:] { - if err := fn(buf, i, l); err != nil { + if err := fn(i, l); err != nil { return err } } @@ -278,7 +251,7 @@ func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node } var res []*cid.Cid - walk := func(buf []byte, idx int, link *merkledag.Link) error { + walk := func(idx int, link *merkledag.Link) error { res = append(res, cid.NewCidV0(link.Hash)) return nil } @@ -288,40 +261,21 @@ func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node return res, nil } -func loadMultiset(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node, name string, internalKeys keyObserver) (map[key.Key]uint64, error) { - l, err := root.GetNodeLink(name) - if err != nil { - return nil, fmt.Errorf("Failed to get link %s: %v", name, err) - } - c := cid.NewCidV0(l.Hash) - internalKeys(c) - n, err := l.GetNode(ctx, dag) - if err != nil { - return nil, fmt.Errorf("Failed to get node from link %s: %v", name, err) - } - - refcounts := make(map[key.Key]uint64) - walk := func(buf []byte, idx int, link *merkledag.Link) error { - var r refcount - r.ReadFromIdx(buf, idx) - refcounts[key.Key(link.Hash)] += uint64(r) - return nil - } - if err := walkItems(ctx, dag, n, walk, internalKeys); err != nil { - return nil, err - } - return refcounts, nil -} - -func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.Node, error) { - iter := func() (c *cid.Cid, data []byte, ok bool) { +func getCidListIterator(cids []*cid.Cid) itemIterator { + return func() (c *cid.Cid, ok bool) { if len(cids) == 0 { - return nil, nil, false + return nil, false } + first := cids[0] cids = cids[1:] - return first, nil, true + return first, true } +} + +func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.Node, error) { + iter := getCidListIterator(cids) + n, err := storeItems(ctx, dag, uint64(len(cids)), iter, internalKeys) if err != nil { return nil, err From a95849021917776f586331b0aac6366c8a803d14 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Sep 2016 12:35:40 -0700 Subject: [PATCH 1348/3147] fix bug in pinsets and add a stress test for the scenario License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@e4274776e6a6a823a952e7358784c74a383b5f32 --- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 130 +++++++++++++------------------------ 2 files changed, 47 insertions(+), 85 deletions(-) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 7257ccaecb..6a72d71894 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -143,7 +143,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if !ok { break } - h := hash(seed, k) + h := hash(seed, k) % defaultFanout hashed[h] = append(hashed[h], item{k, data}) } for h, items := range hashed { diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e4c8bd4de7..75cf1f348c 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -1,103 +1,65 @@ package pin import ( + "context" + "fmt" + "os" "testing" - "testing/quick" - "github.com/ipfs/go-ipfs/blocks/blockstore" - "github.com/ipfs/go-ipfs/blocks/key" - "github.com/ipfs/go-ipfs/blockservice" - "github.com/ipfs/go-ipfs/exchange/offline" - "github.com/ipfs/go-ipfs/merkledag" - "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore" - dssync "gx/ipfs/QmTxLSvdhwg68WJimdS6icLPhZi28aTp6b7uihC2Yb47Xk/go-datastore/sync" - mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" + key "github.com/ipfs/go-ipfs/blocks/key" + dag "github.com/ipfs/go-ipfs/merkledag" + mdtest "github.com/ipfs/go-ipfs/merkledag/test" ) -func ignoreKeys(key.Key) {} +func ignoreKey(_ key.Key) {} -func copyMap(m map[key.Key]uint16) map[key.Key]uint64 { - c := make(map[key.Key]uint64, len(m)) - for k, v := range m { - c[k] = uint64(v) - } - return c -} +func TestSet(t *testing.T) { + ds := mdtest.Mock() + limit := 10000 // 10000 reproduces the pinloss issue fairly reliably -func TestMultisetRoundtrip(t *testing.T) { - dstore := dssync.MutexWrap(datastore.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := blockservice.New(bstore, offline.Exchange(bstore)) - dag := merkledag.NewDAGService(bserv) - - fn := func(m map[key.Key]uint16) bool { - // Convert invalid multihash from input to valid ones - for k, v := range m { - if _, err := mh.Cast([]byte(k)); err != nil { - delete(m, k) - m[key.Key(u.Hash([]byte(k)))] = v - } + if os.Getenv("STRESS_IT_OUT_YO") != "" { + limit = 10000000 + } + var inputs []key.Key + for i := 0; i < limit; i++ { + c, err := ds.Add(dag.NodeWithData([]byte(fmt.Sprint(i)))) + if err != nil { + t.Fatal(err) } - // Generate a smaller range for refcounts than full uint64, as - // otherwise this just becomes overly cpu heavy, splitting it - // out into too many items. That means we need to convert to - // the right kind of map. As storeMultiset mutates the map as - // part of its bookkeeping, this is actually good. - refcounts := copyMap(m) + inputs = append(inputs, c) + } - ctx := context.Background() - n, err := storeMultiset(ctx, dag, refcounts, ignoreKeys) - if err != nil { - t.Fatalf("storing multiset: %v", err) - } + out, err := storeSet(context.Background(), ds, inputs, ignoreKey) + if err != nil { + t.Fatal(err) + } - // Check that the node n is in the DAG - k, err := n.Key() - if err != nil { - t.Fatalf("Could not get key: %v", err) - } - _, err = dag.Get(ctx, k) - if err != nil { - t.Fatalf("Could not get node: %v", err) - } + // weird wrapper node because loadSet expects us to pass an + // object pointing to multiple named sets + setroot := &dag.Node{} + err = setroot.AddNodeLinkClean("foo", out) + if err != nil { + t.Fatal(err) + } - root := &merkledag.Node{} - const linkName = "dummylink" - if err := root.AddNodeLink(linkName, n); err != nil { - t.Fatalf("adding link to root node: %v", err) - } + outset, err := loadSet(context.Background(), ds, setroot, "foo", ignoreKey) + if err != nil { + t.Fatal(err) + } - roundtrip, err := loadMultiset(ctx, dag, root, linkName, ignoreKeys) - if err != nil { - t.Fatalf("loading multiset: %v", err) - } + if len(outset) != limit { + t.Fatal("got wrong number", len(outset), limit) + } - orig := copyMap(m) - success := true - for k, want := range orig { - if got, ok := roundtrip[k]; ok { - if got != want { - success = false - t.Logf("refcount changed: %v -> %v for %q", want, got, k) - } - delete(orig, k) - delete(roundtrip, k) - } - } - for k, v := range orig { - success = false - t.Logf("refcount missing: %v for %q", v, k) - } - for k, v := range roundtrip { - success = false - t.Logf("refcount extra: %v for %q", v, k) - } - return success + seen := key.NewKeySet() + for _, c := range outset { + seen.Add(c) } - if err := quick.Check(fn, nil); err != nil { - t.Fatal(err) + + for _, c := range inputs { + if !seen.Has(c) { + t.Fatalf("expected to have %s, didnt find it") + } } } From 4f98bbd57684ade8874dfd4cf1715ca52ec3e302 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1349/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@bc00d3abc5016767b8c47fd736da6e4bfd72123c --- pinning/pinner/gc/gc.go | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 32b611f654..414e061a7e 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -1,12 +1,12 @@ package gc import ( + "context" + bstore "github.com/ipfs/go-ipfs/blocks/blockstore" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) @@ -22,7 +22,7 @@ var log = logging.Logger("gc") // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan key.Key, error) { +func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan *cid.Cid, error) { unlocker := bs.GCLock() ls = ls.GetOfflineLinkService() @@ -37,7 +37,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. return nil, err } - output := make(chan key.Key) + output := make(chan *cid.Cid) go func() { defer close(output) defer unlocker.Unlock() @@ -68,20 +68,12 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. return output, nil } -func Descendants(ctx context.Context, ls dag.LinkService, set key.KeySet, roots []*cid.Cid, bestEffort bool) error { +func Descendants(ctx context.Context, ls dag.LinkService, set *cid.Set, roots []*cid.Cid, bestEffort bool) error { for _, c := range roots { - set.Add(key.Key(c.Hash())) + set.Add(c) // EnumerateChildren recursively walks the dag and adds the keys to the given set - err := dag.EnumerateChildren(ctx, ls, c, func(c *cid.Cid) bool { - k := key.Key(c.Hash()) - seen := set.Has(k) - if seen { - return false - } - set.Add(k) - return true - }, bestEffort) + err := dag.EnumerateChildren(ctx, ls, c, set.Visit, bestEffort) if err != nil { return err } @@ -90,10 +82,10 @@ func Descendants(ctx context.Context, ls dag.LinkService, set key.KeySet, roots return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid) (key.KeySet, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid) (*cid.Set, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. - gcs := key.NewKeySet() + gcs := cid.NewSet() err := Descendants(ctx, ls, gcs, pn.RecursiveKeys(), false) if err != nil { return nil, err @@ -105,7 +97,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo } for _, k := range pn.DirectKeys() { - gcs.Add(key.Key(k.Hash())) + gcs.Add(k) } err = Descendants(ctx, ls, gcs, pn.InternalPins(), false) From 5f38399a2272d908278f94d2a345e6199269c255 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1350/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@480b8850b6e01685df38b290744a69fc56425845 --- mfs/file.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index e532fb088a..bbd7b48c21 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -1,6 +1,7 @@ package mfs import ( + "context" "fmt" "sync" @@ -8,8 +9,6 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - - context "context" ) type File struct { From b473d2ac053db6564b4a18be96dce93060feb692 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1351/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@a166832ce6f21b2d3ed3142efad449638b1b3f6c --- blockstore/arc_cache.go | 44 +++++++++++++--------- blockstore/arc_cache_test.go | 52 +++++++++++++++++--------- blockstore/blockstore.go | 67 +++++++++++++++++----------------- blockstore/blockstore_test.go | 42 +++++++++++---------- blockstore/bloom_cache.go | 27 +++++++------- blockstore/bloom_cache_test.go | 10 ++--- blockstore/util/remove.go | 3 +- 7 files changed, 138 insertions(+), 107 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index fd6ff7eb97..42d798a4eb 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -1,13 +1,13 @@ package blockstore import ( - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + "context" "github.com/ipfs/go-ipfs/blocks" - context "context" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) @@ -31,7 +31,7 @@ func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, return c, nil } -func (b *arccache) DeleteBlock(k key.Key) error { +func (b *arccache) DeleteBlock(k *cid.Cid) error { if has, ok := b.hasCached(k); ok && !has { return ErrNotFound } @@ -40,7 +40,7 @@ func (b *arccache) DeleteBlock(k key.Key) error { err := b.blockstore.DeleteBlock(k) switch err { case nil, ds.ErrNotFound, ErrNotFound: - b.arc.Add(k, false) + b.addCache(k, false) return err default: return err @@ -49,15 +49,16 @@ func (b *arccache) DeleteBlock(k key.Key) error { // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained -func (b *arccache) hasCached(k key.Key) (has bool, ok bool) { +func (b *arccache) hasCached(k *cid.Cid) (has bool, ok bool) { b.total.Inc() - if k == "" { + if k == nil { + log.Error("nil cid in arccache") // Return cache invalid so the call to blockstore happens // in case of invalid key and correct error is created. return false, false } - h, ok := b.arc.Get(k) + h, ok := b.arc.Get(k.KeyString()) if ok { b.hits.Inc() return h.(bool), true @@ -65,40 +66,45 @@ func (b *arccache) hasCached(k key.Key) (has bool, ok bool) { return false, false } -func (b *arccache) Has(k key.Key) (bool, error) { +func (b *arccache) Has(k *cid.Cid) (bool, error) { if has, ok := b.hasCached(k); ok { return has, nil } res, err := b.blockstore.Has(k) if err == nil { - b.arc.Add(k, res) + b.addCache(k, res) } return res, err } -func (b *arccache) Get(k key.Key) (blocks.Block, error) { +func (b *arccache) Get(k *cid.Cid) (blocks.Block, error) { + if k == nil { + log.Error("nil cid in arc cache") + return nil, ErrNotFound + } + if has, ok := b.hasCached(k); ok && !has { return nil, ErrNotFound } bl, err := b.blockstore.Get(k) if bl == nil && err == ErrNotFound { - b.arc.Add(k, false) + b.addCache(k, false) } else if bl != nil { - b.arc.Add(k, true) + b.addCache(k, true) } return bl, err } func (b *arccache) Put(bl blocks.Block) error { - if has, ok := b.hasCached(bl.Key()); ok && has { + if has, ok := b.hasCached(bl.Cid()); ok && has { return nil } err := b.blockstore.Put(bl) if err == nil { - b.arc.Add(bl.Key(), true) + b.addCache(bl.Cid(), true) } return err } @@ -108,7 +114,7 @@ func (b *arccache) PutMany(bs []blocks.Block) error { for _, block := range bs { // call put on block if result is inconclusive or we are sure that // the block isn't in storage - if has, ok := b.hasCached(block.Key()); !ok || (ok && !has) { + if has, ok := b.hasCached(block.Cid()); !ok || (ok && !has) { good = append(good, block) } } @@ -117,12 +123,16 @@ func (b *arccache) PutMany(bs []blocks.Block) error { return err } for _, block := range good { - b.arc.Add(block.Key(), true) + b.addCache(block.Cid(), true) } return nil } -func (b *arccache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { +func (b *arccache) addCache(c *cid.Cid, has bool) { + b.arc.Add(c.KeyString(), has) +} + +func (b *arccache) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { return b.blockstore.AllKeysChan(ctx) } diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 4bf9307a8a..384cca270f 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -1,12 +1,12 @@ package blockstore import ( + "context" "testing" "github.com/ipfs/go-ipfs/blocks" - "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) @@ -60,7 +60,7 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { writeHitTheDatastore = true }) - arc.DeleteBlock(exampleBlock.Key()) + arc.DeleteBlock(exampleBlock.Cid()) arc.Put(exampleBlock) if !writeHitTheDatastore { t.Fail() @@ -78,9 +78,9 @@ func TestElideDuplicateWrite(t *testing.T) { func TestHasRequestTriggersCache(t *testing.T) { arc, _, cd := createStores(t) - arc.Has(exampleBlock.Key()) + arc.Has(exampleBlock.Cid()) trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Key()); has || err != nil { + if has, err := arc.Has(exampleBlock.Cid()); has || err != nil { t.Fatal("has was true but there is no such block") } @@ -92,7 +92,7 @@ func TestHasRequestTriggersCache(t *testing.T) { trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Key()); !has || err != nil { + if has, err := arc.Has(exampleBlock.Cid()); !has || err != nil { t.Fatal("has returned invalid result") } } @@ -100,13 +100,13 @@ func TestHasRequestTriggersCache(t *testing.T) { func TestGetFillsCache(t *testing.T) { arc, _, cd := createStores(t) - if bl, err := arc.Get(exampleBlock.Key()); bl != nil || err == nil { + if bl, err := arc.Get(exampleBlock.Cid()); bl != nil || err == nil { t.Fatal("block was found or there was no error") } trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Key()); has || err != nil { + if has, err := arc.Has(exampleBlock.Cid()); has || err != nil { t.Fatal("has was true but there is no such block") } @@ -118,7 +118,7 @@ func TestGetFillsCache(t *testing.T) { trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Key()); !has || err != nil { + if has, err := arc.Has(exampleBlock.Cid()); !has || err != nil { t.Fatal("has returned invalid result") } } @@ -126,15 +126,15 @@ func TestGetFillsCache(t *testing.T) { func TestGetAndDeleteFalseShortCircuit(t *testing.T) { arc, _, cd := createStores(t) - arc.Has(exampleBlock.Key()) + arc.Has(exampleBlock.Cid()) trap("get hit datastore", cd, t) - if bl, err := arc.Get(exampleBlock.Key()); bl != nil || err != ErrNotFound { + if bl, err := arc.Get(exampleBlock.Cid()); bl != nil || err != ErrNotFound { t.Fatal("get returned invalid result") } - if arc.DeleteBlock(exampleBlock.Key()) != ErrNotFound { + if arc.DeleteBlock(exampleBlock.Cid()) != ErrNotFound { t.Fatal("expected ErrNotFound error") } } @@ -148,7 +148,7 @@ func TestArcCreationFailure(t *testing.T) { func TestInvalidKey(t *testing.T) { arc, _, _ := createStores(t) - bl, err := arc.Get(key.Key("")) + bl, err := arc.Get(nil) if bl != nil { t.Fatal("blocks should be nil") @@ -163,10 +163,28 @@ func TestHasAfterSucessfulGetIsCached(t *testing.T) { bs.Put(exampleBlock) - arc.Get(exampleBlock.Key()) + arc.Get(exampleBlock.Cid()) trap("has hit datastore", cd, t) - arc.Has(exampleBlock.Key()) + arc.Has(exampleBlock.Cid()) +} + +func TestDifferentKeyObjectsWork(t *testing.T) { + arc, bs, cd := createStores(t) + + bs.Put(exampleBlock) + + arc.Get(exampleBlock.Cid()) + + trap("has hit datastore", cd, t) + cidstr := exampleBlock.Cid().String() + + ncid, err := cid.Decode(cidstr) + if err != nil { + t.Fatal(err) + } + + arc.Has(ncid) } func TestPutManyCaches(t *testing.T) { @@ -174,9 +192,9 @@ func TestPutManyCaches(t *testing.T) { arc.PutMany([]blocks.Block{exampleBlock}) trap("has hit datastore", cd, t) - arc.Has(exampleBlock.Key()) + arc.Has(exampleBlock.Cid()) untrap(cd) - arc.DeleteBlock(exampleBlock.Key()) + arc.DeleteBlock(exampleBlock.Cid()) arc.Put(exampleBlock) trap("PunMany has hit datastore", cd, t) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 162a21da03..7d4d10de17 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -3,15 +3,16 @@ package blockstore import ( + "context" "errors" "sync" "sync/atomic" - context "context" blocks "github.com/ipfs/go-ipfs/blocks" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsns "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/namespace" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" @@ -29,13 +30,13 @@ var ErrNotFound = errors.New("blockstore: block not found") // Blockstore wraps a Datastore type Blockstore interface { - DeleteBlock(key.Key) error - Has(key.Key) (bool, error) - Get(key.Key) (blocks.Block, error) + DeleteBlock(*cid.Cid) error + Has(*cid.Cid) (bool, error) + Get(*cid.Cid) (blocks.Block, error) Put(blocks.Block) error PutMany([]blocks.Block) error - AllKeysChan(ctx context.Context) (<-chan key.Key, error) + AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) } type GCBlockstore interface { @@ -80,12 +81,13 @@ func (bs *blockstore) HashOnRead(enabled bool) { bs.rehash = enabled } -func (bs *blockstore) Get(k key.Key) (blocks.Block, error) { - if k == "" { +func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { + if k == nil { + log.Error("nil cid in blockstore") return nil, ErrNotFound } - maybeData, err := bs.datastore.Get(k.DsKey()) + maybeData, err := bs.datastore.Get(dshelp.NewKeyFromBinary(k.KeyString())) if err == ds.ErrNotFound { return nil, ErrNotFound } @@ -99,18 +101,18 @@ func (bs *blockstore) Get(k key.Key) (blocks.Block, error) { if bs.rehash { rb := blocks.NewBlock(bdata) - if rb.Key() != k { + if !rb.Cid().Equals(k) { return nil, ErrHashMismatch } else { return rb, nil } } else { - return blocks.NewBlockWithHash(bdata, mh.Multihash(k)) + return blocks.NewBlockWithCid(bdata, k) } } func (bs *blockstore) Put(block blocks.Block) error { - k := block.Key().DsKey() + k := dshelp.NewKeyFromBinary(block.Cid().KeyString()) // Has is cheaper than Put, so see if we already have it exists, err := bs.datastore.Has(k) @@ -126,7 +128,7 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { return err } for _, b := range blocks { - k := b.Key().DsKey() + k := dshelp.NewKeyFromBinary(b.Cid().KeyString()) exists, err := bs.datastore.Has(k) if err == nil && exists { continue @@ -140,19 +142,19 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { return t.Commit() } -func (bs *blockstore) Has(k key.Key) (bool, error) { - return bs.datastore.Has(k.DsKey()) +func (bs *blockstore) Has(k *cid.Cid) (bool, error) { + return bs.datastore.Has(dshelp.NewKeyFromBinary(k.KeyString())) } -func (s *blockstore) DeleteBlock(k key.Key) error { - return s.datastore.Delete(k.DsKey()) +func (s *blockstore) DeleteBlock(k *cid.Cid) error { + return s.datastore.Delete(dshelp.NewKeyFromBinary(k.KeyString())) } // AllKeysChan runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? // // AllKeysChan respects context -func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { +func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true} @@ -164,39 +166,38 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { } // this function is here to compartmentalize - get := func() (key.Key, bool) { + get := func() (*cid.Cid, bool) { select { case <-ctx.Done(): - return "", false + return nil, false case e, more := <-res.Next(): if !more { - return "", false + return nil, false } if e.Error != nil { log.Debug("blockstore.AllKeysChan got err:", e.Error) - return "", false + return nil, false } // need to convert to key.Key using key.KeyFromDsKey. - k, err := key.KeyFromDsKey(ds.NewKey(e.Key)) + kb, err := dshelp.BinaryFromDsKey(ds.NewKey(e.Key)) // TODO: calling NewKey isnt free if err != nil { log.Warningf("error parsing key from DsKey: ", err) - return "", true + return nil, true } - log.Debug("blockstore: query got key", k) - // key must be a multihash. else ignore it. - _, err = mh.Cast([]byte(k)) + c, err := cid.Cast(kb) if err != nil { - log.Warningf("key from datastore was not a multihash: ", err) - return "", true + log.Warning("error parsing cid from decoded DsKey: ", err) + return nil, true } + log.Debug("blockstore: query got key", c) - return k, true + return c, true } } - output := make(chan key.Key, dsq.KeysOnlyBufSize) + output := make(chan *cid.Cid, dsq.KeysOnlyBufSize) go func() { defer func() { res.Process().Close() // ensure exit (signals early exit, too) @@ -208,7 +209,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { if !ok { return } - if k == "" { + if k == nil { continue } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 75385dd2a8..98882d479f 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -2,22 +2,24 @@ package blockstore import ( "bytes" + "context" "fmt" "testing" - context "context" + blocks "github.com/ipfs/go-ipfs/blocks" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - - blocks "github.com/ipfs/go-ipfs/blocks" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" ) func TestGetWhenKeyNotPresent(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) - bl, err := bs.Get(key.Key("not present")) + c := cid.NewCidV0(u.Hash([]byte("stuff"))) + bl, err := bs.Get(c) if bl != nil { t.Error("nil block expected") @@ -27,9 +29,9 @@ func TestGetWhenKeyNotPresent(t *testing.T) { } } -func TestGetWhenKeyIsEmptyString(t *testing.T) { +func TestGetWhenKeyIsNil(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) - _, err := bs.Get(key.Key("")) + _, err := bs.Get(nil) if err != ErrNotFound { t.Fail() } @@ -44,7 +46,7 @@ func TestPutThenGetBlock(t *testing.T) { t.Fatal(err) } - blockFromBlockstore, err := bs.Get(block.Key()) + blockFromBlockstore, err := bs.Get(block.Cid()) if err != nil { t.Fatal(err) } @@ -62,7 +64,7 @@ func TestHashOnRead(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) bl := blocks.NewBlock([]byte("some data")) - blBad, err := blocks.NewBlockWithHash([]byte("some other data"), bl.Key().ToMultihash()) + blBad, err := blocks.NewBlockWithCid([]byte("some other data"), bl.Cid()) if err != nil { t.Fatal("debug is off, still got an error") } @@ -71,35 +73,35 @@ func TestHashOnRead(t *testing.T) { bs.Put(bl2) bs.HashOnRead(true) - if _, err := bs.Get(bl.Key()); err != ErrHashMismatch { + if _, err := bs.Get(bl.Cid()); err != ErrHashMismatch { t.Fatalf("expected '%v' got '%v'\n", ErrHashMismatch, err) } - if b, err := bs.Get(bl2.Key()); err != nil || b.String() != bl2.String() { + if b, err := bs.Get(bl2.Cid()); err != nil || b.String() != bl2.String() { t.Fatal("got wrong blocks") } } -func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []key.Key) { +func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []*cid.Cid) { if d == nil { d = ds.NewMapDatastore() } bs := NewBlockstore(ds_sync.MutexWrap(d)) - keys := make([]key.Key, N) + keys := make([]*cid.Cid, N) for i := 0; i < N; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) err := bs.Put(block) if err != nil { t.Fatal(err) } - keys[i] = block.Key() + keys[i] = block.Cid() } return bs, keys } -func collect(ch <-chan key.Key) []key.Key { - var keys []key.Key +func collect(ch <-chan *cid.Cid) []*cid.Cid { + var keys []*cid.Cid for k := range ch { keys = append(keys, k) } @@ -188,18 +190,18 @@ func TestValueTypeMismatch(t *testing.T) { block := blocks.NewBlock([]byte("some data")) datastore := ds.NewMapDatastore() - k := BlockPrefix.Child(block.Key().DsKey()) + k := BlockPrefix.Child(dshelp.NewKeyFromBinary(block.Cid().KeyString())) datastore.Put(k, "data that isn't a block!") blockstore := NewBlockstore(ds_sync.MutexWrap(datastore)) - _, err := blockstore.Get(block.Key()) + _, err := blockstore.Get(block.Cid()) if err != ValueTypeMismatch { t.Fatal(err) } } -func expectMatches(t *testing.T, expect, actual []key.Key) { +func expectMatches(t *testing.T, expect, actual []*cid.Cid) { if len(expect) != len(actual) { t.Errorf("expect and actual differ: %d != %d", len(expect), len(actual)) @@ -207,7 +209,7 @@ func expectMatches(t *testing.T, expect, actual []key.Key) { for _, ek := range expect { found := false for _, ak := range actual { - if ek == ak { + if ek.Equals(ak) { found = true } } diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 6abd4886c2..e78a4211c9 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -1,14 +1,14 @@ package blockstore import ( + "context" "sync/atomic" "time" "github.com/ipfs/go-ipfs/blocks" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "context" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) @@ -84,7 +84,7 @@ func (b *bloomcache) Rebuild(ctx context.Context) { select { case key, ok := <-ch: if ok { - b.bloom.AddTS([]byte(key)) // Use binary key, the more compact the better + b.bloom.AddTS(key.Bytes()) // Use binary key, the more compact the better } else { finish = true } @@ -97,7 +97,7 @@ func (b *bloomcache) Rebuild(ctx context.Context) { atomic.StoreInt32(&b.active, 1) } -func (b *bloomcache) DeleteBlock(k key.Key) error { +func (b *bloomcache) DeleteBlock(k *cid.Cid) error { if has, ok := b.hasCached(k); ok && !has { return ErrNotFound } @@ -107,15 +107,16 @@ func (b *bloomcache) DeleteBlock(k key.Key) error { // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained -func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { +func (b *bloomcache) hasCached(k *cid.Cid) (has bool, ok bool) { b.total.Inc() - if k == "" { + if k == nil { + log.Error("nil cid in bloom cache") // Return cache invalid so call to blockstore // in case of invalid key is forwarded deeper return false, false } if b.BloomActive() { - blr := b.bloom.HasTS([]byte(k)) + blr := b.bloom.HasTS(k.Bytes()) if blr == false { // not contained in bloom is only conclusive answer bloom gives b.hits.Inc() return false, true @@ -124,7 +125,7 @@ func (b *bloomcache) hasCached(k key.Key) (has bool, ok bool) { return false, false } -func (b *bloomcache) Has(k key.Key) (bool, error) { +func (b *bloomcache) Has(k *cid.Cid) (bool, error) { if has, ok := b.hasCached(k); ok { return has, nil } @@ -132,7 +133,7 @@ func (b *bloomcache) Has(k key.Key) (bool, error) { return b.blockstore.Has(k) } -func (b *bloomcache) Get(k key.Key) (blocks.Block, error) { +func (b *bloomcache) Get(k *cid.Cid) (blocks.Block, error) { if has, ok := b.hasCached(k); ok && !has { return nil, ErrNotFound } @@ -141,13 +142,13 @@ func (b *bloomcache) Get(k key.Key) (blocks.Block, error) { } func (b *bloomcache) Put(bl blocks.Block) error { - if has, ok := b.hasCached(bl.Key()); ok && has { + if has, ok := b.hasCached(bl.Cid()); ok && has { return nil } err := b.blockstore.Put(bl) if err == nil { - b.bloom.AddTS([]byte(bl.Key())) + b.bloom.AddTS(bl.Cid().Bytes()) } return err } @@ -162,12 +163,12 @@ func (b *bloomcache) PutMany(bs []blocks.Block) error { return err } for _, bl := range bs { - b.bloom.AddTS([]byte(bl.Key())) + b.bloom.AddTS(bl.Cid().Bytes()) } return nil } -func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan key.Key, error) { +func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { return b.blockstore.AllKeysChan(ctx) } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 248308874d..8bdf567f07 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -44,7 +44,7 @@ func TestPutManyAddsToBloom(t *testing.T) { block2 := blocks.NewBlock([]byte("bar")) cachedbs.PutMany([]blocks.Block{block1}) - has, err := cachedbs.Has(block1.Key()) + has, err := cachedbs.Has(block1.Cid()) if err != nil { t.Fatal(err) } @@ -52,7 +52,7 @@ func TestPutManyAddsToBloom(t *testing.T) { t.Fatal("added block is reported missing") } - has, err = cachedbs.Has(block2.Key()) + has, err = cachedbs.Has(block2.Cid()) if err != nil { t.Fatal(err) } @@ -93,7 +93,7 @@ func TestHasIsBloomCached(t *testing.T) { }) for i := 0; i < 1000; i++ { - cachedbs.Has(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i+2000))).Key()) + cachedbs.Has(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i+2000))).Cid()) } if float64(cacheFails)/float64(1000) > float64(0.05) { @@ -112,11 +112,11 @@ func TestHasIsBloomCached(t *testing.T) { t.Fatalf("expected datastore hit: %d", cacheFails) } - if has, err := cachedbs.Has(block.Key()); !has || err != nil { + if has, err := cachedbs.Has(block.Cid()); !has || err != nil { t.Fatal("has gave wrong response") } - bl, err := cachedbs.Get(block.Key()) + bl, err := cachedbs.Get(block.Cid()) if bl.String() != block.String() { t.Fatal("block data doesn't match") } diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 4b5f86d14c..3afc92d456 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,7 +6,6 @@ import ( bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) @@ -38,7 +37,7 @@ func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, out chan<- interface{}, c stillOkay := FilterPinned(pins, out, cids) for _, c := range stillOkay { - err := blocks.DeleteBlock(key.Key(c.Hash())) + err := blocks.DeleteBlock(c) if err != nil && opts.Force && (err == bs.ErrNotFound || err == ds.ErrNotFound) { // ignore non-existent blocks } else if err != nil { From 3e45f2b90fd3a1e0a924037b9be56a174af7b64d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1352/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@b4c35b3ac29f6c4a35df24df8e9e5ea39458b531 --- exchange/interface.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 23d830466d..a2b3c760b6 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -2,21 +2,21 @@ package exchange import ( + "context" "io" blocks "github.com/ipfs/go-ipfs/blocks" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block // exchange protocol. type Interface interface { // type Exchanger interface // GetBlock returns the block associated with a given key. - GetBlock(context.Context, key.Key) (blocks.Block, error) + GetBlock(context.Context, *cid.Cid) (blocks.Block, error) - GetBlocks(context.Context, []key.Key) (<-chan blocks.Block, error) + GetBlocks(context.Context, []*cid.Cid) (<-chan blocks.Block, error) // TODO Should callers be concerned with whether the block was made // available on the network? From 6ad04673f33333e4593073607b546d8facb3aba8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1353/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@83741fa63ed9f162997f4cf5ca6f969e953222e3 --- exchange/offline/offline.go | 11 ++++++----- exchange/offline/offline_test.go | 17 ++++++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 190d5bfa24..7013d10a05 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -3,12 +3,13 @@ package offline import ( + "context" + blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "context" + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { @@ -24,7 +25,7 @@ type offlineExchange struct { // GetBlock returns nil to signal that a block could not be retrieved for the // given key. // NB: This function may return before the timeout expires. -func (e *offlineExchange) GetBlock(_ context.Context, k key.Key) (blocks.Block, error) { +func (e *offlineExchange) GetBlock(_ context.Context, k *cid.Cid) (blocks.Block, error) { return e.bs.Get(k) } @@ -40,11 +41,11 @@ func (_ *offlineExchange) Close() error { return nil } -func (e *offlineExchange) GetBlocks(ctx context.Context, ks []key.Key) (<-chan blocks.Block, error) { +func (e *offlineExchange) GetBlocks(ctx context.Context, ks []*cid.Cid) (<-chan blocks.Block, error) { out := make(chan blocks.Block, 0) go func() { defer close(out) - var misses []key.Key + var misses []*cid.Cid for _, k := range ks { hit, err := e.bs.Get(k) if err != nil { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 9cbd713336..80fb6bbed6 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -1,20 +1,23 @@ package offline import ( + "context" "testing" - context "context" blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) func TestBlockReturnsErr(t *testing.T) { off := Exchange(bstore()) - _, err := off.GetBlock(context.Background(), key.Key("foo")) + c := cid.NewCidV0(u.Hash([]byte("foo"))) + _, err := off.GetBlock(context.Background(), c) if err != nil { return // as desired } @@ -31,7 +34,7 @@ func TestHasBlockReturnsNil(t *testing.T) { t.Fail() } - if _, err := store.Get(block.Key()); err != nil { + if _, err := store.Get(block.Cid()); err != nil { t.Fatal(err) } } @@ -49,11 +52,11 @@ func TestGetBlocks(t *testing.T) { } } - request := func() []key.Key { - var ks []key.Key + request := func() []*cid.Cid { + var ks []*cid.Cid for _, b := range expected { - ks = append(ks, b.Key()) + ks = append(ks, b.Cid()) } return ks }() From 2971e922db2992e5e63010e0e2d9e95ebd292e7b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1354/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@b36159b9d0e7260e02cb80484e72597d8a7d0f5d --- blockservice/blockservice.go | 37 +++++++++++--------------------- blockservice/test/blocks_test.go | 17 +++++++-------- 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index dd274d27e3..3fb47aa0ba 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,7 +10,6 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" @@ -30,12 +29,6 @@ type BlockService struct { Exchange exchange.Interface } -// an Object is simply a typed block -type Object interface { - Cid() *cid.Cid - blocks.Block -} - // NewBlockService creates a BlockService with given datastore instance. func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { if rem == nil { @@ -50,14 +43,14 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. -func (s *BlockService) AddObject(o Object) (*cid.Cid, error) { +func (s *BlockService) AddBlock(o blocks.Block) (*cid.Cid, error) { // TODO: while this is a great optimization, we should think about the // possibility of streaming writes directly to disk. If we can pass this object // all the way down to the datastore without having to 'buffer' its data, // we could implement a `WriteTo` method on it that could do a streaming write // of the content, saving us (probably) considerable memory. c := o.Cid() - has, err := s.Blockstore.Has(key.Key(c.Hash())) + has, err := s.Blockstore.Has(c) if err != nil { return nil, err } @@ -78,13 +71,10 @@ func (s *BlockService) AddObject(o Object) (*cid.Cid, error) { return c, nil } -func (s *BlockService) AddObjects(bs []Object) ([]*cid.Cid, error) { +func (s *BlockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { var toput []blocks.Block - var toputcids []*cid.Cid for _, b := range bs { - c := b.Cid() - - has, err := s.Blockstore.Has(key.Key(c.Hash())) + has, err := s.Blockstore.Has(b.Cid()) if err != nil { return nil, err } @@ -94,7 +84,6 @@ func (s *BlockService) AddObjects(bs []Object) ([]*cid.Cid, error) { } toput = append(toput, b) - toputcids = append(toputcids, c) } err := s.Blockstore.PutMany(toput) @@ -108,8 +97,7 @@ func (s *BlockService) AddObjects(bs []Object) ([]*cid.Cid, error) { return nil, fmt.Errorf("blockservice is closed (%s)", err) } - c := o.(Object).Cid() // cast is safe, we created these - ks = append(ks, c) + ks = append(ks, o.Cid()) } return ks, nil } @@ -119,7 +107,7 @@ func (s *BlockService) AddObjects(bs []Object) ([]*cid.Cid, error) { func (s *BlockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", c) - block, err := s.Blockstore.Get(key.Key(c.Hash())) + block, err := s.Blockstore.Get(c) if err == nil { return block, nil } @@ -128,7 +116,7 @@ func (s *BlockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. log.Debug("Blockservice: Searching bitswap") - blk, err := s.Exchange.GetBlock(ctx, key.Key(c.Hash())) + blk, err := s.Exchange.GetBlock(ctx, c) if err != nil { if err == blockstore.ErrNotFound { return nil, ErrNotFound @@ -153,12 +141,11 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan bloc out := make(chan blocks.Block, 0) go func() { defer close(out) - var misses []key.Key + var misses []*cid.Cid for _, c := range ks { - k := key.Key(c.Hash()) - hit, err := s.Blockstore.Get(k) + hit, err := s.Blockstore.Get(c) if err != nil { - misses = append(misses, k) + misses = append(misses, c) continue } log.Debug("Blockservice: Got data in datastore") @@ -191,8 +178,8 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan bloc } // DeleteBlock deletes a block in the blockservice from the datastore -func (s *BlockService) DeleteObject(o Object) error { - return s.Blockstore.DeleteBlock(o.Key()) +func (s *BlockService) DeleteBlock(o blocks.Block) error { + return s.Blockstore.DeleteBlock(o.Cid()) } func (s *BlockService) Close() error { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 9b86d5a61b..0052077634 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -2,6 +2,7 @@ package bstest import ( "bytes" + "context" "fmt" "testing" "time" @@ -10,9 +11,7 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - "context" cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" @@ -44,11 +43,11 @@ func TestBlocks(t *testing.T) { t.Error("Block Multihash and data multihash not equal") } - if o.Key() != key.Key(h) { + if !o.Cid().Equals(cid.NewCidV0(h)) { t.Error("Block key and data multihash key not equal") } - k, err := bs.AddObject(o) + k, err := bs.AddBlock(o) if err != nil { t.Error("failed to add block to BlockService", err) return @@ -66,7 +65,7 @@ func TestBlocks(t *testing.T) { return } - if o.Key() != b2.Key() { + if !o.Cid().Equals(b2.Cid()) { t.Error("Block keys not equal.") } @@ -93,7 +92,7 @@ func TestGetBlocksSequential(t *testing.T) { var cids []*cid.Cid for _, o := range objs { cids = append(cids, o.Cid()) - servs[0].AddObject(o) + servs[0].AddBlock(o) } t.Log("one instance at a time, get blocks concurrently") @@ -102,12 +101,12 @@ func TestGetBlocksSequential(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*50) defer cancel() out := servs[i].GetBlocks(ctx, cids) - gotten := make(map[key.Key]blocks.Block) + gotten := make(map[string]blocks.Block) for blk := range out { - if _, ok := gotten[blk.Key()]; ok { + if _, ok := gotten[blk.Cid().KeyString()]; ok { t.Fatal("Got duplicate block!") } - gotten[blk.Key()] = blk + gotten[blk.Cid().KeyString()] = blk } if len(gotten) != len(objs) { t.Fatalf("Didnt get enough blocks back: %d/%d", len(gotten), len(objs)) From 370cc11d0efcff50e7c89a4d568a8cb10013fc78 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1355/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@3773f2a2ac1918e95350bbd5dacc89ae02fa5d11 --- datastore/dshelp/key.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index db680add20..417f496057 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -9,3 +9,7 @@ import ( func NewKeyFromBinary(s string) ds.Key { return ds.NewKey(base32.RawStdEncoding.EncodeToString([]byte(s))) } + +func BinaryFromDsKey(k ds.Key) ([]byte, error) { + return base32.RawStdEncoding.DecodeString(k.String()[1:]) +} From 2062cbf7524bc272ff362a7cbc6af6805b219932 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 7 Oct 2016 11:14:45 -0700 Subject: [PATCH 1356/3147] cid: integrate cid into bitswap and blockstores License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@3381102e219ffa6f90608070585ef201bee9b872 --- chunker/rabin_test.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index a6e08f2680..366d44fb82 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "github.com/ipfs/go-ipfs/blocks" - "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" "io" "testing" @@ -39,10 +38,10 @@ func TestRabinChunking(t *testing.T) { } } -func chunkData(t *testing.T, data []byte) map[key.Key]blocks.Block { +func chunkData(t *testing.T, data []byte) map[string]blocks.Block { r := NewRabin(bytes.NewReader(data), 1024*256) - blkmap := make(map[key.Key]blocks.Block) + blkmap := make(map[string]blocks.Block) for { blk, err := r.NextBytes() @@ -54,7 +53,7 @@ func chunkData(t *testing.T, data []byte) map[key.Key]blocks.Block { } b := blocks.NewBlock(blk) - blkmap[b.Key()] = b + blkmap[b.Cid().KeyString()] = b } return blkmap From d7414dea9064f0573de97652d85d9b9d78b5a089 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1357/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@c16035d36a429a67169d51ad53cf78cb1b108828 --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3fb47aa0ba..7986f61684 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 0052077634..bda0427b03 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -12,7 +12,7 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" From 17ab9c5e72681fe1f06d64c015c4d7116c95c761 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1358/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@ea5a3e9397f0b829293e1869df2455f1f4c46682 --- mfs/mfs_test.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 269c24c16b..70e96c2004 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,7 +24,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" "context" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 2e9c49df5f..b88604bc0b 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index f7e31d6d60..8f10a93c7e 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,7 +19,7 @@ import ( context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From ab1cad5b2e53694c8a1469c170014bf303dfe5ba Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1359/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@8f620a4482b1120290d0cdacd80a5113ff0a1479 --- path/path.go | 2 +- path/resolver.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 847685f867..3713259c4b 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 8ff4cf0778..fb9cbf37e0 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( merkledag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) var log = logging.Logger("path") From 3585982816dedc180f0a50f07dea80487ada8b25 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1360/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@02f1302faa95952c87a2d34cddb849d5008ab378 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 414e061a7e..5f62eb0b8d 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,7 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 6e73929a6c..ca36a55888 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -13,7 +13,7 @@ import ( context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 01cbeb79e9..911d0e88a4 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,7 +10,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" context "context" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 9ed1559907..11d56188d0 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 8c60633b48..e17906f6f0 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -9,7 +9,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" mdtest "github.com/ipfs/go-ipfs/merkledag/test" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) func ignoreCids(_ *cid.Cid) {} From 9cef2ad2b58e6e84f14c763b9546c5dd6ef5bfa5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1361/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@017c1bb3675e6c9e1a79140feb50cc907ca444c4 --- unixfs/io/dirbuilder.go | 2 +- unixfs/mod/dagmodifier.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index ca424e28b5..967e22c4bb 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -5,7 +5,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) type directoryBuilder struct { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 7e1fd2dc8b..8e3cae16a0 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -15,8 +15,8 @@ import ( context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") From 8f846ca1ff2113d63fa4360df928a4e9f68f4752 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1362/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@52e7a8b635192c2346577d76ce1067ab401ea89f --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 2 +- blockstore/blockstore_test.go | 2 +- blockstore/bloom_cache.go | 2 +- blockstore/util/remove.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 42d798a4eb..03fa3fe0c3 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -7,7 +7,7 @@ import ( "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 384cca270f..42d388a16a 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 7d4d10de17..dfa35ec413 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,7 +12,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsns "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/namespace" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 98882d479f..a5ecefd441 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -9,7 +9,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index e78a4211c9..7f6066ace5 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 3afc92d456..b3fd7501ee 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,7 +6,7 @@ import ( bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From f4ca66fa52282192e47346ce6b41dee0d86ecd54 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1363/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@fac6d91cdf1c28c38b6e030c3d2d8c59afd5314d --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index a2b3c760b6..24ed382b3a 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From f7025d274f4c9301de52bf0244755b479d3385ca Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1364/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@d1ba51d21d2f381055b0fe9cb1e2188e3b67092a --- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/supernode/client.go | 6 +++--- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 57a1301506..22b9386caa 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,12 +8,12 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ma "gx/ipfs/QmUAQaWbKxGCUTuoQVvvicbQNZ9APF5pDGWyAZSe93AtKH/go-multiaddr" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 49c681edaf..4dff16cfe9 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index a29ec12ff2..ade8304a4e 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,8 +8,8 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 3f090abe21..e71635ab56 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,7 +3,7 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht" + dht "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" mocknet "gx/ipfs/QmcRa2qn6iCmap9bjp8jAwkvYAq13AUfxdY3rrYiaJbLum/go-libp2p/p2p/net/mock" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index e5d0e60f4d..5296b529f7 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,9 +10,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 8fdebcc668..00a7cfaee8 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( repo "github.com/ipfs/go-ipfs/repo" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" p2phost "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 398a4d1b90..49ac6ec03c 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,11 +7,11 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 79b058d0a8..3f72489195 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,13 +8,13 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 8a6e5230f2..ea9c0b1b03 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,7 +2,7 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index f7d2b80ed3..15f1a71a0e 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,10 +4,10 @@ import ( "context" "errors" - dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" + dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" host "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 3eabaa415f..c6f6daf4cc 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -7,7 +7,7 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" context "context" - dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 36f8b53b32..a7a315eae2 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmRDMP3Y9E6hZtJwcFii8F6RTUSDn67Hi2o5VFTBXNRioo/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From 969dfecab87f6718275b027f1f65ce9fa7005bf9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1365/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@42f55cfe19fb55877a85400ef1a257730b16630a --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 7f8d298c24..4d65feea0e 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index b48e742b85..8909f16763 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,7 +14,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 41c0a04eea..94a9e1ce36 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,10 +11,10 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" diff --git a/namesys/routing.go b/namesys/routing.go index 3287d49407..2cf6e0d8ec 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -12,11 +12,11 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmXKuGUzLcgoQvp8M6ZEJzupWUNmx8NoqXEbYLMDjL4rjj/go-libp2p-routing" + routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) From 51a64b98d7922d032f0ddb1708d9f7df428e966d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Oct 2016 17:59:41 -0700 Subject: [PATCH 1366/3147] bitswap: protocol extension to handle cids This change adds the /ipfs/bitswap/1.1.0 protocol. The new protocol adds a 'payload' field to the protobuf message and deprecates the existing 'blocks' field. The 'payload' field is an array of pairs of cid prefixes and block data. The cid prefixes are used to ensure the correct codecs and hash functions are used to handle the block on the receiving end. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@71bcf9d46ec4d93052d858ac65321a8c8a289247 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 7013d10a05..ba3fa00175 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 80fb6bbed6..4befe796d6 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" From 51a27084816fabdf43b588e0073eacb8b5decba1 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 5 Oct 2016 23:54:16 -0400 Subject: [PATCH 1367/3147] Make BlockService an interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-blockservice@67829690c0e601108c6c21515b5350046432fe3a --- blockservice/blockservice.go | 72 ++++++++++++++++++++++-------------- blockservice/test/mock.go | 4 +- 2 files changed, 47 insertions(+), 29 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3fb47aa0ba..d2f068acc1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -23,34 +23,52 @@ var ErrNotFound = errors.New("blockservice: key not found") // BlockService is a hybrid block datastore. It stores data in a local // datastore and may retrieve data from a remote Exchange. // It uses an internal `datastore.Datastore` instance to store values. -type BlockService struct { - // TODO don't expose underlying impl details - Blockstore blockstore.Blockstore - Exchange exchange.Interface +type BlockService interface { + Blockstore() blockstore.Blockstore + Exchange() exchange.Interface + AddBlock(o blocks.Block) (*cid.Cid, error) + AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) + GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) + GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block + DeleteBlock(o blocks.Block) error + Close() error +} + +type blockService struct { + blockstore blockstore.Blockstore + exchange exchange.Interface } // NewBlockService creates a BlockService with given datastore instance. -func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { +func New(bs blockstore.Blockstore, rem exchange.Interface) BlockService { if rem == nil { log.Warning("blockservice running in local (offline) mode.") } - return &BlockService{ - Blockstore: bs, - Exchange: rem, + return &blockService{ + blockstore: bs, + exchange: rem, } } +func (bs *blockService) Blockstore() blockstore.Blockstore { + return bs.blockstore +} + +func (bs *blockService) Exchange() exchange.Interface { + return bs.exchange +} + // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. -func (s *BlockService) AddBlock(o blocks.Block) (*cid.Cid, error) { +func (s *blockService) AddBlock(o blocks.Block) (*cid.Cid, error) { // TODO: while this is a great optimization, we should think about the // possibility of streaming writes directly to disk. If we can pass this object // all the way down to the datastore without having to 'buffer' its data, // we could implement a `WriteTo` method on it that could do a streaming write // of the content, saving us (probably) considerable memory. c := o.Cid() - has, err := s.Blockstore.Has(c) + has, err := s.blockstore.Has(c) if err != nil { return nil, err } @@ -59,22 +77,22 @@ func (s *BlockService) AddBlock(o blocks.Block) (*cid.Cid, error) { return c, nil } - err = s.Blockstore.Put(o) + err = s.blockstore.Put(o) if err != nil { return nil, err } - if err := s.Exchange.HasBlock(o); err != nil { + if err := s.exchange.HasBlock(o); err != nil { return nil, errors.New("blockservice is closed") } return c, nil } -func (s *BlockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { +func (s *blockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { var toput []blocks.Block for _, b := range bs { - has, err := s.Blockstore.Has(b.Cid()) + has, err := s.blockstore.Has(b.Cid()) if err != nil { return nil, err } @@ -86,14 +104,14 @@ func (s *BlockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { toput = append(toput, b) } - err := s.Blockstore.PutMany(toput) + err := s.blockstore.PutMany(toput) if err != nil { return nil, err } var ks []*cid.Cid for _, o := range toput { - if err := s.Exchange.HasBlock(o); err != nil { + if err := s.exchange.HasBlock(o); err != nil { return nil, fmt.Errorf("blockservice is closed (%s)", err) } @@ -104,19 +122,19 @@ func (s *BlockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). -func (s *BlockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { +func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", c) - block, err := s.Blockstore.Get(c) + block, err := s.blockstore.Get(c) if err == nil { return block, nil } - if err == blockstore.ErrNotFound && s.Exchange != nil { + if err == blockstore.ErrNotFound && s.exchange != nil { // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. log.Debug("Blockservice: Searching bitswap") - blk, err := s.Exchange.GetBlock(ctx, c) + blk, err := s.exchange.GetBlock(ctx, c) if err != nil { if err == blockstore.ErrNotFound { return nil, ErrNotFound @@ -137,13 +155,13 @@ func (s *BlockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, // GetBlocks gets a list of blocks asynchronously and returns through // the returned channel. // NB: No guarantees are made about order. -func (s *BlockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { +func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { out := make(chan blocks.Block, 0) go func() { defer close(out) var misses []*cid.Cid for _, c := range ks { - hit, err := s.Blockstore.Get(c) + hit, err := s.blockstore.Get(c) if err != nil { misses = append(misses, c) continue @@ -160,7 +178,7 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan bloc return } - rblocks, err := s.Exchange.GetBlocks(ctx, misses) + rblocks, err := s.exchange.GetBlocks(ctx, misses) if err != nil { log.Debugf("Error with GetBlocks: %s", err) return @@ -178,11 +196,11 @@ func (s *BlockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan bloc } // DeleteBlock deletes a block in the blockservice from the datastore -func (s *BlockService) DeleteBlock(o blocks.Block) error { - return s.Blockstore.DeleteBlock(o.Cid()) +func (s *blockService) DeleteBlock(o blocks.Block) error { + return s.blockstore.DeleteBlock(o.Cid()) } -func (s *BlockService) Close() error { +func (s *blockService) Close() error { log.Debug("blockservice is shutting down...") - return s.Exchange.Close() + return s.exchange.Close() } diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 28e3a4e991..622d1c8d68 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -9,13 +9,13 @@ import ( ) // Mocks returns |n| connected mock Blockservices -func Mocks(n int) []*BlockService { +func Mocks(n int) []BlockService { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) sg := bitswap.NewTestSessionGenerator(net) instances := sg.Instances(n) - var servs []*BlockService + var servs []BlockService for _, i := range instances { servs = append(servs, New(i.Blockstore(), i.Exchange)) } From c22c3c947d6bf75c9e74c4211971f5a7d1f8da44 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 6 Oct 2016 14:54:25 -0400 Subject: [PATCH 1368/3147] Create a "write through" BlockService. Create a block service where all writes are guaranteed to go though to the blockstore. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-blockservice@2645e2bdb2197a6d24ebe4b096e6a58ced8b0bc3 --- blockservice/blockservice.go | 61 +++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index d2f068acc1..8ecec71f94 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -37,6 +37,9 @@ type BlockService interface { type blockService struct { blockstore blockstore.Blockstore exchange exchange.Interface + // If checkFirst is true then first check that a block doesn't + // already exist to avoid republishing the block on the exchange. + checkFirst bool } // NewBlockService creates a BlockService with given datastore instance. @@ -48,6 +51,21 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) BlockService { return &blockService{ blockstore: bs, exchange: rem, + checkFirst: true, + } +} + +// NewWriteThrough ceates a BlockService that guarantees writes will go +// through to the blockstore and are not skipped by cache checks. +func NewWriteThrough(bs blockstore.Blockstore, rem exchange.Interface) BlockService { + if rem == nil { + log.Warning("blockservice running in local (offline) mode.") + } + + return &blockService{ + blockstore: bs, + exchange: rem, + checkFirst: false, } } @@ -62,22 +80,19 @@ func (bs *blockService) Exchange() exchange.Interface { // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *blockService) AddBlock(o blocks.Block) (*cid.Cid, error) { - // TODO: while this is a great optimization, we should think about the - // possibility of streaming writes directly to disk. If we can pass this object - // all the way down to the datastore without having to 'buffer' its data, - // we could implement a `WriteTo` method on it that could do a streaming write - // of the content, saving us (probably) considerable memory. c := o.Cid() - has, err := s.blockstore.Has(c) - if err != nil { - return nil, err - } + if s.checkFirst { + has, err := s.blockstore.Has(c) + if err != nil { + return nil, err + } - if has { - return c, nil + if has { + return c, nil + } } - err = s.blockstore.Put(o) + err := s.blockstore.Put(o) if err != nil { return nil, err } @@ -91,17 +106,19 @@ func (s *blockService) AddBlock(o blocks.Block) (*cid.Cid, error) { func (s *blockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { var toput []blocks.Block - for _, b := range bs { - has, err := s.blockstore.Has(b.Cid()) - if err != nil { - return nil, err - } - - if has { - continue + if s.checkFirst { + for _, b := range bs { + has, err := s.blockstore.Has(b.Cid()) + if err != nil { + return nil, err + } + if has { + continue + } + toput = append(toput, b) } - - toput = append(toput, b) + } else { + toput = bs; } err := s.blockstore.PutMany(toput) From 87ec46cca8096221a79e6f67e51ec4ada576edf9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 10 Oct 2016 10:58:48 -0400 Subject: [PATCH 1369/3147] test: check if NewWriteThrough is not calling Has License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@06c5dbf883c10633768d9cb9e4f16c5a4c50cb90 --- blockservice/blockservice.go | 2 +- blockservice/blockservice_test.go | 44 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 blockservice/blockservice_test.go diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 8ecec71f94..d4461b66d8 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -4,6 +4,7 @@ package blockservice import ( + "context" "errors" "fmt" @@ -11,7 +12,6 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go new file mode 100644 index 0000000000..82244c1cd8 --- /dev/null +++ b/blockservice/blockservice_test.go @@ -0,0 +1,44 @@ +package blockservice + +import ( + "testing" + + "github.com/ipfs/go-ipfs/blocks/blockstore" + butil "github.com/ipfs/go-ipfs/blocks/blocksutil" + offline "github.com/ipfs/go-ipfs/exchange/offline" + + cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" +) + +func TestWriteThroughWorks(t *testing.T) { + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := HasFailingBlockstore{ + blockstore.NewBlockstore(dstore), + t, + true, + } + exch := offline.Exchange(bstore) + bserv := NewWriteThrough(bstore, exch) + bgen := butil.NewBlockGenerator() + + bserv.AddBlock(bgen.Next()) +} + +var _ blockstore.GCBlockstore = (*HasFailingBlockstore)(nil) + +type HasFailingBlockstore struct { + blockstore.GCBlockstore + t *testing.T + Fail bool +} + +func (bs HasFailingBlockstore) Has(k *cid.Cid) (bool, error) { + if bs.Fail { + bs.t.Fatal("Has shouldn't be called") + return false, nil + } + return bs.GCBlockstore.Has(k) + +} From 7c6625a7e0fa6ebc45eb603124f69b5e5f70466d Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 10 Oct 2016 15:52:50 -0400 Subject: [PATCH 1370/3147] Change the test from being Has based to Put based License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@865b8327a9604ac8a697d718c6d6947b36eb5b7f --- blockservice/blockservice_test.go | 43 +++++++++++++++++-------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 82244c1cd8..d87a383e56 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,42 +3,47 @@ package blockservice import ( "testing" + "github.com/ipfs/go-ipfs/blocks" "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - cid "gx/ipfs/QmakyCk6Vnn16WEKjbkxieZmM2YLTzkFWizbmGowoYPjro/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) func TestWriteThroughWorks(t *testing.T) { - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := HasFailingBlockstore{ - blockstore.NewBlockstore(dstore), - t, - true, + bstore := &PutCountingBlockstore{ + blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())), + 0, } - exch := offline.Exchange(bstore) + bstore2 := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + exch := offline.Exchange(bstore2) bserv := NewWriteThrough(bstore, exch) bgen := butil.NewBlockGenerator() - bserv.AddBlock(bgen.Next()) + block := bgen.Next() + + t.Logf("PutCounter: %d", bstore.PutCounter) + bserv.AddBlock(block) + if bstore.PutCounter != 1 { + t.Fatalf("expected just one Put call, have: %d", bstore.PutCounter) + } + + bserv.AddBlock(block) + if bstore.PutCounter != 2 { + t.Fatal("Put should have called again, should be 2 is: %d", bstore.PutCounter) + } } -var _ blockstore.GCBlockstore = (*HasFailingBlockstore)(nil) +var _ blockstore.GCBlockstore = (*PutCountingBlockstore)(nil) -type HasFailingBlockstore struct { +type PutCountingBlockstore struct { blockstore.GCBlockstore - t *testing.T - Fail bool + PutCounter int } -func (bs HasFailingBlockstore) Has(k *cid.Cid) (bool, error) { - if bs.Fail { - bs.t.Fatal("Has shouldn't be called") - return false, nil - } - return bs.GCBlockstore.Has(k) - +func (bs *PutCountingBlockstore) Put(block blocks.Block) error { + bs.PutCounter++ + return bs.GCBlockstore.Put(block) } From 10358175cd646c1b51d2602beefce958ede23387 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 12 Oct 2016 07:00:38 -0700 Subject: [PATCH 1371/3147] run gofmt License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@15a27eb0b1e118cd10ad65692024398e9aab0cc0 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index d4461b66d8..be84bb98ec 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -118,7 +118,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { toput = append(toput, b) } } else { - toput = bs; + toput = bs } err := s.blockstore.PutMany(toput) From 03963a2d25b8b1ae628d237743536cf0b5b93d0f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 9 Oct 2016 12:59:36 -0700 Subject: [PATCH 1372/3147] merkledag: change 'Node' to be an interface Also change existing 'Node' type to 'ProtoNode' and use that most everywhere for now. As we move forward with the integration we will try and use the Node interface in more places that we're currently using ProtoNode. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@a9cabd600077f66380d64c79f7137e37290a3144 --- mfs/dir.go | 40 +++++++++++++++++++++------------------- mfs/file.go | 6 +++--- mfs/mfs_test.go | 22 +++++++++++----------- mfs/ops.go | 2 +- mfs/system.go | 10 +++++----- 5 files changed, 41 insertions(+), 39 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 8bc486cb7a..3a1c7be8ef 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -28,7 +28,7 @@ type Directory struct { files map[string]*File lock sync.Mutex - node *dag.Node + node *dag.ProtoNode ctx context.Context modTime time.Time @@ -36,7 +36,7 @@ type Directory struct { name string } -func NewDirectory(ctx context.Context, name string, node *dag.Node, parent childCloser, dserv dag.DAGService) *Directory { +func NewDirectory(ctx context.Context, name string, node *dag.ProtoNode, parent childCloser, dserv dag.DAGService) *Directory { return &Directory{ dserv: dserv, ctx: ctx, @@ -51,7 +51,7 @@ func NewDirectory(ctx context.Context, name string, node *dag.Node, parent child // closeChild updates the child by the given name to the dag node 'nd' // and changes its own dag node -func (d *Directory) closeChild(name string, nd *dag.Node, sync bool) error { +func (d *Directory) closeChild(name string, nd *dag.ProtoNode, sync bool) error { mynd, err := d.closeChildUpdate(name, nd, sync) if err != nil { return err @@ -64,7 +64,7 @@ func (d *Directory) closeChild(name string, nd *dag.Node, sync bool) error { } // closeChildUpdate is the portion of closeChild that needs to be locked around -func (d *Directory) closeChildUpdate(name string, nd *dag.Node, sync bool) (*dag.Node, error) { +func (d *Directory) closeChildUpdate(name string, nd *dag.ProtoNode, sync bool) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() @@ -79,7 +79,7 @@ func (d *Directory) closeChildUpdate(name string, nd *dag.Node, sync bool) (*dag return nil, nil } -func (d *Directory) flushCurrentNode() (*dag.Node, error) { +func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { _, err := d.dserv.Add(d.node) if err != nil { return nil, err @@ -88,7 +88,7 @@ func (d *Directory) flushCurrentNode() (*dag.Node, error) { return d.node.Copy(), nil } -func (d *Directory) updateChild(name string, nd *dag.Node) error { +func (d *Directory) updateChild(name string, nd *dag.ProtoNode) error { err := d.node.RemoveNodeLink(name) if err != nil && err != dag.ErrNotFound { return err @@ -120,7 +120,7 @@ func (d *Directory) childNode(name string) (FSNode, error) { } // cacheNode caches a node into d.childDirs or d.files and returns the FSNode. -func (d *Directory) cacheNode(name string, nd *dag.Node) (FSNode, error) { +func (d *Directory) cacheNode(name string, nd *dag.ProtoNode) (FSNode, error) { i, err := ft.FromBytes(nd.Data()) if err != nil { return nil, err @@ -161,14 +161,16 @@ func (d *Directory) Uncache(name string) { // childFromDag searches through this directories dag node for a child link // with the given name -func (d *Directory) childFromDag(name string) (*dag.Node, error) { - for _, lnk := range d.node.Links { - if lnk.Name == name { - return lnk.GetNode(d.ctx, d.dserv) - } +func (d *Directory) childFromDag(name string) (*dag.ProtoNode, error) { + pbn, err := d.node.GetLinkedProtoNode(d.ctx, d.dserv, name) + switch err { + case nil: + return pbn, nil + case dag.ErrLinkNotFound: + return nil, os.ErrNotExist + default: + return nil, err } - - return nil, os.ErrNotExist } // childUnsync returns the child under this directory by the given name @@ -206,7 +208,7 @@ func (d *Directory) ListNames() []string { names[n] = struct{}{} } - for _, l := range d.node.Links { + for _, l := range d.node.Links() { names[l.Name] = struct{}{} } @@ -224,7 +226,7 @@ func (d *Directory) List() ([]NodeListing, error) { defer d.lock.Unlock() var out []NodeListing - for _, l := range d.node.Links { + for _, l := range d.node.Links() { child := NodeListing{} child.Name = l.Name @@ -270,7 +272,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { } } - ndir := new(dag.Node) + ndir := new(dag.ProtoNode) ndir.SetData(ft.FolderPBData()) _, err = d.dserv.Add(ndir) @@ -321,7 +323,7 @@ func (d *Directory) Flush() error { } // AddChild adds the node 'nd' under this directory giving it the name 'name' -func (d *Directory) AddChild(name string, nd *dag.Node) error { +func (d *Directory) AddChild(name string, nd *dag.ProtoNode) error { d.lock.Lock() defer d.lock.Unlock() @@ -382,7 +384,7 @@ func (d *Directory) Path() string { return out } -func (d *Directory) GetNode() (*dag.Node, error) { +func (d *Directory) GetNode() (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() diff --git a/mfs/file.go b/mfs/file.go index bbd7b48c21..373a9dd1dc 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -19,12 +19,12 @@ type File struct { desclock sync.RWMutex dserv dag.DAGService - node *dag.Node + node *dag.ProtoNode nodelk sync.Mutex } // NewFile returns a NewFile object with the given parameters -func NewFile(name string, node *dag.Node, parent childCloser, dserv dag.DAGService) (*File, error) { +func NewFile(name string, node *dag.ProtoNode, parent childCloser, dserv dag.DAGService) (*File, error) { return &File{ dserv: dserv, parent: parent, @@ -94,7 +94,7 @@ func (fi *File) Size() (int64, error) { } // GetNode returns the dag node associated with this file -func (fi *File) GetNode() (*dag.Node, error) { +func (fi *File) GetNode() (*dag.ProtoNode, error) { fi.nodelk.Lock() defer fi.nodelk.Unlock() return fi.node, nil diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 70e96c2004..f9c79769c7 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -30,7 +30,7 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) -func emptyDirNode() *dag.Node { +func emptyDirNode() *dag.ProtoNode { return dag.NodeWithData(ft.FolderPBData()) } @@ -41,12 +41,12 @@ func getDagserv(t *testing.T) dag.DAGService { return dag.NewDAGService(blockserv) } -func getRandFile(t *testing.T, ds dag.DAGService, size int64) *dag.Node { +func getRandFile(t *testing.T, ds dag.DAGService, size int64) *dag.ProtoNode { r := io.LimitReader(u.NewTimeSeededRand(), size) return fileNodeFromReader(t, ds, r) } -func fileNodeFromReader(t *testing.T, ds dag.DAGService, r io.Reader) *dag.Node { +func fileNodeFromReader(t *testing.T, ds dag.DAGService, r io.Reader) *dag.ProtoNode { nd, err := importer.BuildDagFromReader(ds, chunk.DefaultSplitter(r)) if err != nil { t.Fatal(err) @@ -124,7 +124,7 @@ func compStrArrs(a, b []string) bool { return true } -func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.Node, pth string) error { +func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.ProtoNode, pth string) error { parts := path.SplitList(pth) cur := root for i, d := range parts[:len(parts)-1] { @@ -173,7 +173,7 @@ func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.Node, pth str return nil } -func catNode(ds dag.DAGService, nd *dag.Node) ([]byte, error) { +func catNode(ds dag.DAGService, nd *dag.ProtoNode) ([]byte, error) { r, err := uio.NewDagReader(context.TODO(), nd, ds) if err != nil { return nil, err @@ -280,7 +280,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { t.Fatal(err) } - fihash := nd.Multihash() + fihash := nd.Cid() dir := emptyDirNode() _, err = ds.Add(dir) @@ -288,19 +288,19 @@ func TestDirectoryLoadFromDag(t *testing.T) { t.Fatal(err) } - dirhash := dir.Multihash() + dirhash := dir.Cid() top := emptyDirNode() - top.Links = []*dag.Link{ + top.SetLinks([]*dag.Link{ &dag.Link{ Name: "a", - Hash: fihash, + Cid: fihash, }, &dag.Link{ Name: "b", - Hash: dirhash, + Cid: dirhash, }, - } + }) err = rootdir.AddChild("foo", top) if err != nil { diff --git a/mfs/ops.go b/mfs/ops.go index 94c6c30df8..6464d84041 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -87,7 +87,7 @@ func lookupDir(r *Root, path string) (*Directory, error) { } // PutNode inserts 'nd' at 'path' in the given mfs -func PutNode(r *Root, path string, nd *dag.Node) error { +func PutNode(r *Root, path string, nd *dag.ProtoNode) error { dirp, filename := gopath.Split(path) if filename == "" { return fmt.Errorf("cannot create file with empty name") diff --git a/mfs/system.go b/mfs/system.go index 8f10a93c7e..2a69a18788 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -29,7 +29,7 @@ var log = logging.Logger("mfs") var ErrIsDirectory = errors.New("error: is a directory") type childCloser interface { - closeChild(string, *dag.Node, bool) error + closeChild(string, *dag.ProtoNode, bool) error } type NodeType int @@ -41,7 +41,7 @@ const ( // FSNode represents any node (directory, root, or file) in the mfs filesystem type FSNode interface { - GetNode() (*dag.Node, error) + GetNode() (*dag.ProtoNode, error) Flush() error Type() NodeType } @@ -49,7 +49,7 @@ type FSNode interface { // Root represents the root of a filesystem tree type Root struct { // node is the merkledag root - node *dag.Node + node *dag.ProtoNode // val represents the node. It can either be a File or a Directory val FSNode @@ -64,7 +64,7 @@ type Root struct { type PubFunc func(context.Context, *cid.Cid) error // newRoot creates a new Root and starts up a republisher routine for it -func NewRoot(parent context.Context, ds dag.DAGService, node *dag.Node, pf PubFunc) (*Root, error) { +func NewRoot(parent context.Context, ds dag.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { var repub *Republisher if pf != nil { @@ -118,7 +118,7 @@ func (kr *Root) Flush() error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published -func (kr *Root) closeChild(name string, nd *dag.Node, sync bool) error { +func (kr *Root) closeChild(name string, nd *dag.ProtoNode, sync bool) error { c, err := kr.dserv.Add(nd) if err != nil { return err From bd8265f3121a8da3b3fcea4e9c7478f33f9a6c49 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 9 Oct 2016 12:59:36 -0700 Subject: [PATCH 1373/3147] merkledag: change 'Node' to be an interface Also change existing 'Node' type to 'ProtoNode' and use that most everywhere for now. As we move forward with the integration we will try and use the Node interface in more places that we're currently using ProtoNode. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@3c44991bb030cabb4d3f9f27c406288f1bee0660 --- path/resolver.go | 34 +++++++++++++++++++--------------- path/resolver_test.go | 8 ++++---- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index fb9cbf37e0..14ed1d87c8 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -2,14 +2,13 @@ package path import ( + "context" "errors" "fmt" "time" - "context" - mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" - merkledag "github.com/ipfs/go-ipfs/merkledag" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) @@ -23,11 +22,11 @@ var ErrNoComponents = errors.New( // ErrNoLink is returned when a link is not found in a path type ErrNoLink struct { Name string - Node mh.Multihash + Node *cid.Cid } func (e ErrNoLink) Error() string { - return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.B58String()) + return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.String()) } // Resolver provides path resolution to IPFS @@ -62,7 +61,7 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. -func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (*merkledag.Node, error) { +func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (merkledag.Node, error) { // validate path if err := fpath.IsValid(); err != nil { return nil, err @@ -78,7 +77,7 @@ func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (*merkledag.Node // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. -func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*merkledag.Node, error) { +func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]merkledag.Node, error) { h, parts, err := SplitAbsPath(fpath) if err != nil { return nil, err @@ -100,28 +99,33 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]*me // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links -func (s *Resolver) ResolveLinks(ctx context.Context, ndd *merkledag.Node, names []string) ([]*merkledag.Node, error) { +func (s *Resolver) ResolveLinks(ctx context.Context, ndd merkledag.Node, names []string) ([]merkledag.Node, error) { - result := make([]*merkledag.Node, 0, len(names)+1) + result := make([]merkledag.Node, 0, len(names)+1) result = append(result, ndd) nd := ndd // dup arg workaround // for each of the path components - for _, name := range names { - + for len(names) > 0 { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, time.Minute) defer cancel() - nextnode, err := nd.GetLinkedNode(ctx, s.DAG, name) + lnk, rest, err := nd.Resolve(names) if err == merkledag.ErrLinkNotFound { - n := nd.Multihash() - return result, ErrNoLink{Name: name, Node: n} + n := nd.Cid() + return result, ErrNoLink{Name: names[0], Node: n} } else if err != nil { - return append(result, nextnode), err + return result, err + } + + nextnode, err := s.DAG.Get(ctx, lnk.Cid) + if err != nil { + return result, err } nd = nextnode + names = rest result = append(result, nextnode) } return result, nil diff --git a/path/resolver_test.go b/path/resolver_test.go index 77e7a27e10..b0130bb17d 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -13,8 +13,8 @@ import ( util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) -func randNode() (*merkledag.Node, key.Key) { - node := new(merkledag.Node) +func randNode() (*merkledag.ProtoNode, key.Key) { + node := new(merkledag.ProtoNode) node.SetData(make([]byte, 32)) util.NewTimeSeededRand().Read(node.Data()) k := node.Key() @@ -39,7 +39,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - for _, n := range []*merkledag.Node{a, b, c} { + for _, n := range []merkledag.Node{a, b, c} { _, err = dagService.Add(n) if err != nil { t.Fatal(err) @@ -60,7 +60,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - key := node.Key() + key := node.Cid() if key.String() != cKey.String() { t.Fatal(fmt.Errorf( "recursive path resolution failed for %s: %s != %s", From f09ec740a02e56bcff0c040701f139e7fc152dba Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 9 Oct 2016 12:59:36 -0700 Subject: [PATCH 1374/3147] merkledag: change 'Node' to be an interface Also change existing 'Node' type to 'ProtoNode' and use that most everywhere for now. As we move forward with the integration we will try and use the Node interface in more places that we're currently using ProtoNode. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@c167c8f6c4fc9ff9cf9995311e3bfb369ef17ca8 --- pinning/pinner/pin.go | 21 ++++++++----- pinning/pinner/pin_test.go | 4 +-- pinning/pinner/set.go | 63 +++++++++++++++++++++++++------------- pinning/pinner/set_test.go | 2 +- 4 files changed, 57 insertions(+), 33 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ca36a55888..4a59e78d9f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -83,7 +83,7 @@ func StringToPinMode(s string) (PinMode, bool) { type Pinner interface { IsPinned(*cid.Cid) (string, bool, error) IsPinnedWithType(*cid.Cid, PinMode) (string, bool, error) - Pin(context.Context, *mdag.Node, bool) error + Pin(context.Context, mdag.Node, bool) error Unpin(context.Context, *cid.Cid, bool) error // Check if a set of keys are pinned, more efficient than @@ -162,7 +162,7 @@ func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { } // Pin the given node, optionally recursive -func (p *pinner) Pin(ctx context.Context, node *mdag.Node, recurse bool) error { +func (p *pinner) Pin(ctx context.Context, node mdag.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() c := node.Cid() @@ -317,7 +317,7 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { return err } for _, lnk := range links { - c := cid.NewCidV0(lnk.Hash) + c := lnk.Cid if toCheck.Has(c) { pinned = append(pinned, @@ -403,12 +403,17 @@ func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) return nil, fmt.Errorf("cannot find pinning root object: %v", err) } + rootpb, ok := root.(*mdag.ProtoNode) + if !ok { + return nil, mdag.ErrNotProtobuf + } + internalset := cid.NewSet() internalset.Add(rootCid) recordInternal := internalset.Add { // load recursive set - recurseKeys, err := loadSet(ctx, internal, root, linkRecursive, recordInternal) + recurseKeys, err := loadSet(ctx, internal, rootpb, linkRecursive, recordInternal) if err != nil { return nil, fmt.Errorf("cannot load recursive pins: %v", err) } @@ -416,7 +421,7 @@ func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) } { // load direct set - directKeys, err := loadSet(ctx, internal, root, linkDirect, recordInternal) + directKeys, err := loadSet(ctx, internal, rootpb, linkDirect, recordInternal) if err != nil { return nil, fmt.Errorf("cannot load direct pins: %v", err) } @@ -453,7 +458,7 @@ func (p *pinner) Flush() error { internalset := cid.NewSet() recordInternal := internalset.Add - root := &mdag.Node{} + root := &mdag.ProtoNode{} { n, err := storeSet(ctx, p.internal, p.directPin.Keys(), recordInternal) if err != nil { @@ -475,7 +480,7 @@ func (p *pinner) Flush() error { } // add the empty node, its referenced by the pin sets but never created - _, err := p.internal.Add(new(mdag.Node)) + _, err := p.internal.Add(new(mdag.ProtoNode)) if err != nil { return err } @@ -522,7 +527,7 @@ func hasChild(ds mdag.LinkService, root *cid.Cid, child key.Key) (bool, error) { return false, err } for _, lnk := range links { - c := cid.NewCidV0(lnk.Hash) + c := lnk.Cid if key.Key(c.Hash()) == child { return true, nil } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 911d0e88a4..787b8226a5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -16,8 +16,8 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) -func randNode() (*mdag.Node, *cid.Cid) { - nd := new(mdag.Node) +func randNode() (*mdag.ProtoNode, *cid.Cid) { + nd := new(mdag.ProtoNode) nd.SetData(make([]byte, 32)) util.NewTimeSeededRand().Read(nd.Data()) k := nd.Cid() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 11d56188d0..1a1f9f3bf6 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -55,25 +55,27 @@ func (s sortByHash) Len() int { } func (s sortByHash) Less(a, b int) bool { - return bytes.Compare(s.links[a].Hash, s.links[b].Hash) == -1 + return bytes.Compare(s.links[a].Cid.Bytes(), s.links[b].Cid.Bytes()) == -1 } func (s sortByHash) Swap(a, b int) { s.links[a], s.links[b] = s.links[b], s.links[a] } -func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint64, iter itemIterator, internalKeys keyObserver) (*merkledag.Node, error) { +func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint64, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { seed, err := randomSeed() if err != nil { return nil, err } - - n := &merkledag.Node{Links: make([]*merkledag.Link, 0, defaultFanout+maxItems)} + links := make([]*merkledag.Link, 0, defaultFanout+maxItems) for i := 0; i < defaultFanout; i++ { - n.Links = append(n.Links, &merkledag.Link{Hash: emptyKey.Hash()}) + links = append(links, &merkledag.Link{Cid: emptyKey}) } // add emptyKey to our set of internal pinset objects + n := &merkledag.ProtoNode{} + n.SetLinks(links) + internalKeys(emptyKey) hdr := &pb.Set{ @@ -87,17 +89,22 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if estimatedLen < maxItems { // it'll probably fit + links := n.Links() for i := 0; i < maxItems; i++ { k, ok := iter() if !ok { // all done break } - n.Links = append(n.Links, &merkledag.Link{Hash: k.Hash()}) + + links = append(links, &merkledag.Link{Cid: k}) } + + n.SetLinks(links) + // sort by hash, also swap item Data s := sortByHash{ - links: n.Links[defaultFanout:], + links: n.Links()[defaultFanout:], } sort.Stable(s) } @@ -152,15 +159,15 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint internalKeys(childKey) // overwrite the 'empty key' in the existing links array - n.Links[h] = &merkledag.Link{ - Hash: childKey.Hash(), + n.Links()[h] = &merkledag.Link{ + Cid: childKey, Size: size, } } return n, nil } -func readHdr(n *merkledag.Node) (*pb.Set, error) { +func readHdr(n *merkledag.ProtoNode) (*pb.Set, error) { hdrLenRaw, consumed := binary.Uvarint(n.Data()) if consumed <= 0 { return nil, errors.New("invalid Set header length") @@ -180,13 +187,13 @@ func readHdr(n *merkledag.Node) (*pb.Set, error) { if v := hdr.GetVersion(); v != 1 { return nil, fmt.Errorf("unsupported Set version: %d", v) } - if uint64(hdr.GetFanout()) > uint64(len(n.Links)) { + if uint64(hdr.GetFanout()) > uint64(len(n.Links())) { return nil, errors.New("impossibly large Fanout") } return &hdr, nil } -func writeHdr(n *merkledag.Node, hdr *pb.Set) error { +func writeHdr(n *merkledag.ProtoNode, hdr *pb.Set) error { hdrData, err := proto.Marshal(hdr) if err != nil { return err @@ -207,20 +214,20 @@ func writeHdr(n *merkledag.Node, hdr *pb.Set) error { type walkerFunc func(idx int, link *merkledag.Link) error -func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.Node, fn walkerFunc, children keyObserver) error { +func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.ProtoNode, fn walkerFunc, children keyObserver) error { hdr, err := readHdr(n) if err != nil { return err } // readHdr guarantees fanout is a safe value fanout := hdr.GetFanout() - for i, l := range n.Links[fanout:] { + for i, l := range n.Links()[fanout:] { if err := fn(i, l); err != nil { return err } } - for _, l := range n.Links[:fanout] { - c := cid.NewCidV0(l.Hash) + for _, l := range n.Links()[:fanout] { + c := l.Cid children(c) if c.Equals(emptyKey) { continue @@ -229,20 +236,26 @@ func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.Node, if err != nil { return err } - if err := walkItems(ctx, dag, subtree, fn, children); err != nil { + + stpb, ok := subtree.(*merkledag.ProtoNode) + if !ok { + return merkledag.ErrNotProtobuf + } + + if err := walkItems(ctx, dag, stpb, fn, children); err != nil { return err } } return nil } -func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node, name string, internalKeys keyObserver) ([]*cid.Cid, error) { +func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]*cid.Cid, error) { l, err := root.GetNodeLink(name) if err != nil { return nil, err } - lnkc := cid.NewCidV0(l.Hash) + lnkc := l.Cid internalKeys(lnkc) n, err := l.GetNode(ctx, dag) @@ -250,12 +263,18 @@ func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Node return nil, err } + pbn, ok := n.(*merkledag.ProtoNode) + if !ok { + return nil, merkledag.ErrNotProtobuf + } + var res []*cid.Cid walk := func(idx int, link *merkledag.Link) error { - res = append(res, cid.NewCidV0(link.Hash)) + res = append(res, link.Cid) return nil } - if err := walkItems(ctx, dag, n, walk, internalKeys); err != nil { + + if err := walkItems(ctx, dag, pbn, walk, internalKeys); err != nil { return nil, err } return res, nil @@ -273,7 +292,7 @@ func getCidListIterator(cids []*cid.Cid) itemIterator { } } -func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.Node, error) { +func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { iter := getCidListIterator(cids) n, err := storeItems(ctx, dag, uint64(len(cids)), iter, internalKeys) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e17906f6f0..335b59e99a 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -38,7 +38,7 @@ func TestSet(t *testing.T) { // weird wrapper node because loadSet expects us to pass an // object pointing to multiple named sets - setroot := &dag.Node{} + setroot := &dag.ProtoNode{} err = setroot.AddNodeLinkClean("foo", out) if err != nil { t.Fatal(err) From d7b13141c74df3b3c5e823fbc3647d1b7b0b3999 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 9 Oct 2016 12:59:36 -0700 Subject: [PATCH 1375/3147] merkledag: change 'Node' to be an interface Also change existing 'Node' type to 'ProtoNode' and use that most everywhere for now. As we move forward with the integration we will try and use the Node interface in more places that we're currently using ProtoNode. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@93ba0e48c3e8fdf57a021c63085f52388a03232c --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 15 ++++++---- unixfs/format.go | 2 +- unixfs/io/dagreader.go | 26 +++++++++++------ unixfs/io/dirbuilder.go | 15 ++++++---- unixfs/io/dirbuilder_test.go | 4 +-- unixfs/mod/dagmodifier.go | 54 +++++++++++++++++++++++------------- unixfs/test/utils.go | 16 +++++------ 8 files changed, 85 insertions(+), 49 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 8cc1ec2e11..a94c9f7afc 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -30,7 +30,7 @@ func (i *identityWriteCloser) Close() error { } // DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` -func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { +func DagArchive(ctx cxt.Context, nd *mdag.ProtoNode, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { _, filename := path.Split(name) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 475b318a49..f710d4063c 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -34,7 +34,7 @@ func NewWriter(ctx cxt.Context, dag mdag.DAGService, archive bool, compression i }, nil } -func (w *Writer) writeDir(nd *mdag.Node, fpath string) error { +func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { if err := writeDirHeader(w.TarW, fpath); err != nil { return err } @@ -45,8 +45,13 @@ func (w *Writer) writeDir(nd *mdag.Node, fpath string) error { return err } - npath := path.Join(fpath, nd.Links[i].Name) - if err := w.WriteNode(child, npath); err != nil { + childpb, ok := child.(*mdag.ProtoNode) + if !ok { + return mdag.ErrNotProtobuf + } + + npath := path.Join(fpath, nd.Links()[i].Name) + if err := w.WriteNode(childpb, npath); err != nil { return err } } @@ -54,7 +59,7 @@ func (w *Writer) writeDir(nd *mdag.Node, fpath string) error { return nil } -func (w *Writer) writeFile(nd *mdag.Node, pb *upb.Data, fpath string) error { +func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error { if err := writeFileHeader(w.TarW, fpath, pb.GetFilesize()); err != nil { return err } @@ -67,7 +72,7 @@ func (w *Writer) writeFile(nd *mdag.Node, pb *upb.Data, fpath string) error { return nil } -func (w *Writer) WriteNode(nd *mdag.Node, fpath string) error { +func (w *Writer) WriteNode(nd *mdag.ProtoNode, fpath string) error { pb := new(upb.Data) if err := proto.Unmarshal(nd.Data(), pb); err != nil { return err diff --git a/unixfs/format.go b/unixfs/format.go index 0235f0c7c7..a8ade430c9 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -224,6 +224,6 @@ func BytesForMetadata(m *Metadata) ([]byte, error) { return proto.Marshal(pbd) } -func EmptyDirNode() *dag.Node { +func EmptyDirNode() *dag.ProtoNode { return dag.NodeWithData(FolderPBData()) } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index f78fbbf77e..086e5038ce 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -24,7 +24,7 @@ type DagReader struct { serv mdag.DAGService // the node being read - node *mdag.Node + node *mdag.ProtoNode // cached protobuf structure from node.Data pbdata *ftpb.Data @@ -58,7 +58,7 @@ type ReadSeekCloser interface { // NewDagReader creates a new reader object that reads the data represented by // the given node, using the passed in DAGService for data retreival -func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*DagReader, error) { +func NewDagReader(ctx context.Context, n *mdag.ProtoNode, serv mdag.DAGService) (*DagReader, error) { pb := new(ftpb.Data) if err := proto.Unmarshal(n.Data(), pb); err != nil { return nil, err @@ -71,14 +71,19 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag case ftpb.Data_File, ftpb.Data_Raw: return NewDataFileReader(ctx, n, pb, serv), nil case ftpb.Data_Metadata: - if len(n.Links) == 0 { + if len(n.Links()) == 0 { return nil, errors.New("incorrectly formatted metadata object") } - child, err := n.Links[0].GetNode(ctx, serv) + child, err := n.Links()[0].GetNode(ctx, serv) if err != nil { return nil, err } - return NewDagReader(ctx, child, serv) + + childpb, ok := child.(*mdag.ProtoNode) + if !ok { + return nil, mdag.ErrNotProtobuf + } + return NewDagReader(ctx, childpb, serv) case ftpb.Data_Symlink: return nil, ErrCantReadSymlinks default: @@ -86,7 +91,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag } } -func NewDataFileReader(ctx context.Context, n *mdag.Node, pb *ftpb.Data, serv mdag.DAGService) *DagReader { +func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *DagReader { fctx, cancel := context.WithCancel(ctx) promises := mdag.GetDAG(fctx, serv, n) return &DagReader{ @@ -114,8 +119,13 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { } dr.linkPosition++ + nxtpb, ok := nxt.(*mdag.ProtoNode) + if !ok { + return mdag.ErrNotProtobuf + } + pb := new(ftpb.Data) - err = proto.Unmarshal(nxt.Data(), pb) + err = proto.Unmarshal(nxtpb.Data(), pb) if err != nil { return fmt.Errorf("incorrectly formatted protobuf: %s", err) } @@ -125,7 +135,7 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { // A directory should not exist within a file return ft.ErrInvalidDirLocation case ftpb.Data_File: - dr.buf = NewDataFileReader(dr.ctx, nxt, pb, dr.serv) + dr.buf = NewDataFileReader(dr.ctx, nxtpb, pb, dr.serv) return nil case ftpb.Data_Raw: dr.buf = NewRSNCFromBytes(pb.GetData()) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 967e22c4bb..ac316f8a27 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -10,12 +10,12 @@ import ( type directoryBuilder struct { dserv mdag.DAGService - dirnode *mdag.Node + dirnode *mdag.ProtoNode } // NewEmptyDirectory returns an empty merkledag Node with a folder Data chunk -func NewEmptyDirectory() *mdag.Node { - nd := new(mdag.Node) +func NewEmptyDirectory() *mdag.ProtoNode { + nd := new(mdag.ProtoNode) nd.SetData(format.FolderPBData()) return nd } @@ -35,10 +35,15 @@ func (d *directoryBuilder) AddChild(ctx context.Context, name string, c *cid.Cid return err } - return d.dirnode.AddNodeLinkClean(name, cnode) + cnpb, ok := cnode.(*mdag.ProtoNode) + if !ok { + return mdag.ErrNotProtobuf + } + + return d.dirnode.AddNodeLinkClean(name, cnpb) } // GetNode returns the root of this directoryBuilder -func (d *directoryBuilder) GetNode() *mdag.Node { +func (d *directoryBuilder) GetNode() *mdag.ProtoNode { return d.dirnode } diff --git a/unixfs/io/dirbuilder_test.go b/unixfs/io/dirbuilder_test.go index 80a01d3251..e7539a8bc2 100644 --- a/unixfs/io/dirbuilder_test.go +++ b/unixfs/io/dirbuilder_test.go @@ -10,7 +10,7 @@ import ( func TestEmptyNode(t *testing.T) { n := NewEmptyDirectory() - if len(n.Links) != 0 { + if len(n.Links()) != 0 { t.Fatal("empty node should have 0 links") } } @@ -27,7 +27,7 @@ func TestDirBuilder(t *testing.T) { b.AddChild(ctx, "random", key) dir := b.GetNode() - outn, err := dir.GetLinkedNode(ctx, dserv, "random") + outn, err := dir.GetLinkedProtoNode(ctx, dserv, "random") if err != nil { t.Fatal(err) } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 8e3cae16a0..3479ab4a48 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -32,7 +32,7 @@ var log = logging.Logger("dagio") // Dear god, please rename this to something more pleasant type DagModifier struct { dagserv mdag.DAGService - curNode *mdag.Node + curNode *mdag.ProtoNode splitter chunk.SplitterGen ctx context.Context @@ -45,7 +45,7 @@ type DagModifier struct { read *uio.DagReader } -func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { +func NewDagModifier(ctx context.Context, from *mdag.ProtoNode, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { return &DagModifier{ curNode: from.Copy(), dagserv: serv, @@ -178,11 +178,16 @@ func (dm *DagModifier) Sync() error { return err } - dm.curNode = nd + pbnd, ok := nd.(*mdag.ProtoNode) + if !ok { + return mdag.ErrNotProtobuf + } + + dm.curNode = pbnd // need to write past end of current dag if !done { - nd, err = dm.appendData(dm.curNode, dm.splitter(dm.wrBuf)) + nd, err := dm.appendData(dm.curNode, dm.splitter(dm.wrBuf)) if err != nil { return err } @@ -204,14 +209,14 @@ func (dm *DagModifier) Sync() error { // modifyDag writes the data in 'data' over the data in 'node' starting at 'offset' // returns the new key of the passed in node and whether or not all the data in the reader // has been consumed. -func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) { +func (dm *DagModifier) modifyDag(node *mdag.ProtoNode, offset uint64, data io.Reader) (*cid.Cid, bool, error) { f, err := ft.FromBytes(node.Data()) if err != nil { return nil, false, err } // If we've reached a leaf node. - if len(node.Links) == 0 { + if len(node.Links()) == 0 { n, err := data.Read(f.Data[offset:]) if err != nil && err != io.EOF { return nil, false, err @@ -223,7 +228,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) return nil, false, err } - nd := new(mdag.Node) + nd := new(mdag.ProtoNode) nd.SetData(b) k, err := dm.dagserv.Add(nd) if err != nil { @@ -244,17 +249,23 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) for i, bs := range f.GetBlocksizes() { // We found the correct child to write into if cur+bs > offset { - child, err := node.Links[i].GetNode(dm.ctx, dm.dagserv) + child, err := node.Links()[i].GetNode(dm.ctx, dm.dagserv) if err != nil { return nil, false, err } - k, sdone, err := dm.modifyDag(child, offset-cur, data) + + childpb, ok := child.(*mdag.ProtoNode) + if !ok { + return nil, false, mdag.ErrNotProtobuf + } + + k, sdone, err := dm.modifyDag(childpb, offset-cur, data) if err != nil { return nil, false, err } offset += bs - node.Links[i].Hash = k.Hash() + node.Links()[i].Cid = k // Recache serialized node _, err = node.EncodeProtobuf(true) @@ -277,7 +288,7 @@ func (dm *DagModifier) modifyDag(node *mdag.Node, offset uint64, data io.Reader) } // appendData appends the blocks from the given chan to the end of this dag -func (dm *DagModifier) appendData(node *mdag.Node, spl chunk.Splitter) (*mdag.Node, error) { +func (dm *DagModifier) appendData(node *mdag.ProtoNode, spl chunk.Splitter) (*mdag.ProtoNode, error) { dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, @@ -340,7 +351,7 @@ func (dm *DagModifier) CtxReadFull(ctx context.Context, b []byte) (int, error) { } // GetNode gets the modified DAG Node -func (dm *DagModifier) GetNode() (*mdag.Node, error) { +func (dm *DagModifier) GetNode() (*mdag.ProtoNode, error) { err := dm.Sync() if err != nil { return nil, err @@ -425,8 +436,8 @@ func (dm *DagModifier) Truncate(size int64) error { } // dagTruncate truncates the given node to 'size' and returns the modified Node -func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGService) (*mdag.Node, error) { - if len(nd.Links) == 0 { +func dagTruncate(ctx context.Context, nd *mdag.ProtoNode, size uint64, ds mdag.DAGService) (*mdag.ProtoNode, error) { + if len(nd.Links()) == 0 { // TODO: this can likely be done without marshaling and remarshaling pbn, err := ft.FromBytes(nd.Data()) if err != nil { @@ -439,22 +450,27 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer var cur uint64 end := 0 - var modified *mdag.Node + var modified *mdag.ProtoNode ndata := new(ft.FSNode) - for i, lnk := range nd.Links { + for i, lnk := range nd.Links() { child, err := lnk.GetNode(ctx, ds) if err != nil { return nil, err } - childsize, err := ft.DataSize(child.Data()) + childpb, ok := child.(*mdag.ProtoNode) + if !ok { + return nil, err + } + + childsize, err := ft.DataSize(childpb.Data()) if err != nil { return nil, err } // found the child we want to cut if size < cur+childsize { - nchild, err := dagTruncate(ctx, child, size-cur, ds) + nchild, err := dagTruncate(ctx, childpb, size-cur, ds) if err != nil { return nil, err } @@ -474,7 +490,7 @@ func dagTruncate(ctx context.Context, nd *mdag.Node, size uint64, ds mdag.DAGSer return nil, err } - nd.Links = nd.Links[:end] + nd.SetLinks(nd.Links()[:end]) err = nd.AddNodeLinkClean("", modified) if err != nil { return nil, err diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index b997a11a8e..26755cec57 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -27,7 +27,7 @@ func GetDAGServ() mdag.DAGService { return mdagmock.Mock() } -func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.Node { +func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.ProtoNode { in := bytes.NewReader(data) node, err := imp.BuildTrickleDagFromReader(dserv, SizeSplitterGen(500)(in)) if err != nil { @@ -37,11 +37,11 @@ func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.Node { return node } -func GetEmptyNode(t testing.TB, dserv mdag.DAGService) *mdag.Node { +func GetEmptyNode(t testing.TB, dserv mdag.DAGService) *mdag.ProtoNode { return GetNode(t, dserv, []byte{}) } -func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.Node) { +func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.ProtoNode) { in := io.LimitReader(u.NewTimeSeededRand(), size) buf, err := ioutil.ReadAll(in) if err != nil { @@ -64,7 +64,7 @@ func ArrComp(a, b []byte) error { return nil } -func PrintDag(nd *mdag.Node, ds mdag.DAGService, indent int) { +func PrintDag(nd *mdag.ProtoNode, ds mdag.DAGService, indent int) { pbd, err := ft.FromBytes(nd.Data()) if err != nil { panic(err) @@ -74,17 +74,17 @@ func PrintDag(nd *mdag.Node, ds mdag.DAGService, indent int) { fmt.Print(" ") } fmt.Printf("{size = %d, type = %s, children = %d", pbd.GetFilesize(), pbd.GetType().String(), len(pbd.GetBlocksizes())) - if len(nd.Links) > 0 { + if len(nd.Links()) > 0 { fmt.Println() } - for _, lnk := range nd.Links { + for _, lnk := range nd.Links() { child, err := lnk.GetNode(context.Background(), ds) if err != nil { panic(err) } - PrintDag(child, ds, indent+1) + PrintDag(child.(*mdag.ProtoNode), ds, indent+1) } - if len(nd.Links) > 0 { + if len(nd.Links()) > 0 { for i := 0; i < indent; i++ { fmt.Print(" ") } From 0cc119fbe3e79281134fcd011ba56706784d5a43 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 9 Oct 2016 12:59:36 -0700 Subject: [PATCH 1376/3147] merkledag: change 'Node' to be an interface Also change existing 'Node' type to 'ProtoNode' and use that most everywhere for now. As we move forward with the integration we will try and use the Node interface in more places that we're currently using ProtoNode. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@210328aa58edd3b56851df0378c707a322fb1b38 --- blockservice/test/blocks_test.go | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index bda0427b03..956420da28 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -18,18 +18,8 @@ import ( dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) -func newObject(data []byte) *testObject { - return &testObject{ - Block: blocks.NewBlock(data), - } -} - -type testObject struct { - blocks.Block -} - -func (o *testObject) Cid() *cid.Cid { - return cid.NewCidV0(o.Block.Multihash()) +func newObject(data []byte) blocks.Block { + return blocks.NewBlock(data) } func TestBlocks(t *testing.T) { @@ -38,12 +28,8 @@ func TestBlocks(t *testing.T) { defer bs.Close() o := newObject([]byte("beep boop")) - h := u.Hash([]byte("beep boop")) - if !bytes.Equal(o.Multihash(), h) { - t.Error("Block Multihash and data multihash not equal") - } - - if !o.Cid().Equals(cid.NewCidV0(h)) { + h := cid.NewCidV0(u.Hash([]byte("beep boop"))) + if !o.Cid().Equals(h) { t.Error("Block key and data multihash key not equal") } @@ -74,8 +60,8 @@ func TestBlocks(t *testing.T) { } } -func makeObjects(n int) []*testObject { - var out []*testObject +func makeObjects(n int) []blocks.Block { + var out []blocks.Block for i := 0; i < n; i++ { out = append(out, newObject([]byte(fmt.Sprintf("object %d", i)))) } From d7ffbf5f165decc6696c3a5c57a53b7ffe74d0ae Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Oct 2016 07:53:48 -0700 Subject: [PATCH 1377/3147] extract node interface License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@7a8bd733876e95add95b94e83c1fbae577bf8d0d --- mfs/mfs_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index f9c79769c7..dcec37356c 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -2,6 +2,7 @@ package mfs import ( "bytes" + "context" "errors" "fmt" "io" @@ -23,8 +24,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - "context" cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" @@ -291,12 +292,12 @@ func TestDirectoryLoadFromDag(t *testing.T) { dirhash := dir.Cid() top := emptyDirNode() - top.SetLinks([]*dag.Link{ - &dag.Link{ + top.SetLinks([]*node.Link{ + { Name: "a", Cid: fihash, }, - &dag.Link{ + { Name: "b", Cid: dirhash, }, From 933a4315576ca66edc1084868620c8c69e6f1ff0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Oct 2016 07:53:48 -0700 Subject: [PATCH 1378/3147] extract node interface License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@5158c31c19713b1c4127fa3f09d9c5dbb8efebda --- path/resolver.go | 9 +++++---- path/resolver_test.go | 7 ++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 14ed1d87c8..e4bfe8f796 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,6 +11,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) var log = logging.Logger("path") @@ -61,7 +62,7 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. -func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (merkledag.Node, error) { +func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, error) { // validate path if err := fpath.IsValid(); err != nil { return nil, err @@ -77,7 +78,7 @@ func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (merkledag.Node, // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. -func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]merkledag.Node, error) { +func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]node.Node, error) { h, parts, err := SplitAbsPath(fpath) if err != nil { return nil, err @@ -99,9 +100,9 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]mer // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links -func (s *Resolver) ResolveLinks(ctx context.Context, ndd merkledag.Node, names []string) ([]merkledag.Node, error) { +func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []string) ([]node.Node, error) { - result := make([]merkledag.Node, 0, len(names)+1) + result := make([]node.Node, 0, len(names)+1) result = append(result, ndd) nd := ndd // dup arg workaround diff --git a/path/resolver_test.go b/path/resolver_test.go index b0130bb17d..652f387965 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -1,15 +1,16 @@ package path_test import ( + "context" "fmt" "testing" - context "context" - merkledag "github.com/ipfs/go-ipfs/merkledag" dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" + key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) @@ -39,7 +40,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - for _, n := range []merkledag.Node{a, b, c} { + for _, n := range []node.Node{a, b, c} { _, err = dagService.Add(n) if err != nil { t.Fatal(err) From 40ba80e69b56352fac75896731c82545325bb3ca Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 14 Oct 2016 07:53:48 -0700 Subject: [PATCH 1379/3147] extract node interface License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@11add1c863910f892792585ac152d08ee4056389 --- pinning/pinner/pin.go | 18 ++++++++---------- pinning/pinner/set.go | 16 +++++++++------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4a59e78d9f..10c60c2569 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -3,17 +3,17 @@ package pin import ( + "context" "fmt" "os" "sync" "time" mdag "github.com/ipfs/go-ipfs/merkledag" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) @@ -83,7 +83,7 @@ func StringToPinMode(s string) (PinMode, bool) { type Pinner interface { IsPinned(*cid.Cid) (string, bool, error) IsPinnedWithType(*cid.Cid, PinMode) (string, bool, error) - Pin(context.Context, mdag.Node, bool) error + Pin(context.Context, node.Node, bool) error Unpin(context.Context, *cid.Cid, bool) error // Check if a set of keys are pinned, more efficient than @@ -162,11 +162,10 @@ func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { } // Pin the given node, optionally recursive -func (p *pinner) Pin(ctx context.Context, node mdag.Node, recurse bool) error { +func (p *pinner) Pin(ctx context.Context, node node.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() c := node.Cid() - k := key.Key(c.Hash()) if recurse { if p.recursePin.Has(c) { @@ -190,7 +189,7 @@ func (p *pinner) Pin(ctx context.Context, node mdag.Node, recurse bool) error { } if p.recursePin.Has(c) { - return fmt.Errorf("%s already pinned recursively", k.B58String()) + return fmt.Errorf("%s already pinned recursively", c.String()) } p.directPin.Add(c) @@ -248,7 +247,6 @@ func (p *pinner) IsPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error // isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // intended for use by other pinned methods that already take locks func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { - k := key.Key(c.Hash()) switch mode { case Any, Direct, Indirect, Recursive, Internal: default: @@ -279,7 +277,7 @@ func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error // Default is Indirect for _, rc := range p.recursePin.Keys() { - has, err := hasChild(p.dserv, rc, k) + has, err := hasChild(p.dserv, rc, c) if err != nil { return "", false, err } @@ -521,14 +519,14 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { } } -func hasChild(ds mdag.LinkService, root *cid.Cid, child key.Key) (bool, error) { +func hasChild(ds mdag.LinkService, root *cid.Cid, child *cid.Cid) (bool, error) { links, err := ds.GetLinks(context.Background(), root) if err != nil { return false, err } for _, lnk := range links { c := lnk.Cid - if key.Key(c.Hash()) == child { + if lnk.Cid.Equals(child) { return true, nil } diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 1a1f9f3bf6..eaaba7884c 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,11 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) const ( @@ -47,7 +49,7 @@ type itemIterator func() (c *cid.Cid, ok bool) type keyObserver func(*cid.Cid) type sortByHash struct { - links []*merkledag.Link + links []*node.Link } func (s sortByHash) Len() int { @@ -67,9 +69,9 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if err != nil { return nil, err } - links := make([]*merkledag.Link, 0, defaultFanout+maxItems) + links := make([]*node.Link, 0, defaultFanout+maxItems) for i := 0; i < defaultFanout; i++ { - links = append(links, &merkledag.Link{Cid: emptyKey}) + links = append(links, &node.Link{Cid: emptyKey}) } // add emptyKey to our set of internal pinset objects @@ -97,7 +99,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint break } - links = append(links, &merkledag.Link{Cid: k}) + links = append(links, &node.Link{Cid: k}) } n.SetLinks(links) @@ -159,7 +161,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint internalKeys(childKey) // overwrite the 'empty key' in the existing links array - n.Links()[h] = &merkledag.Link{ + n.Links()[h] = &node.Link{ Cid: childKey, Size: size, } @@ -212,7 +214,7 @@ func writeHdr(n *merkledag.ProtoNode, hdr *pb.Set) error { return nil } -type walkerFunc func(idx int, link *merkledag.Link) error +type walkerFunc func(idx int, link *node.Link) error func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.ProtoNode, fn walkerFunc, children keyObserver) error { hdr, err := readHdr(n) @@ -269,7 +271,7 @@ func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.Prot } var res []*cid.Cid - walk := func(idx int, link *merkledag.Link) error { + walk := func(idx int, link *node.Link) error { res = append(res, link.Cid) return nil } From 467e22510c8ed2082589cacd78e6ed3cb135249a Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 17 Oct 2016 18:13:07 -0400 Subject: [PATCH 1380/3147] ds-help: add helper func to convert from Cid to DsKey and the reverse License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@05752dceaa35d49d149c109b74654388a740b768 --- blockstore/blockstore.go | 17 ++++++----------- blockstore/blockstore_test.go | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index dfa35ec413..861863d9d7 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -87,7 +87,7 @@ func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { return nil, ErrNotFound } - maybeData, err := bs.datastore.Get(dshelp.NewKeyFromBinary(k.KeyString())) + maybeData, err := bs.datastore.Get(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { return nil, ErrNotFound } @@ -112,7 +112,7 @@ func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { } func (bs *blockstore) Put(block blocks.Block) error { - k := dshelp.NewKeyFromBinary(block.Cid().KeyString()) + k := dshelp.CidToDsKey(block.Cid()) // Has is cheaper than Put, so see if we already have it exists, err := bs.datastore.Has(k) @@ -128,7 +128,7 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { return err } for _, b := range blocks { - k := dshelp.NewKeyFromBinary(b.Cid().KeyString()) + k := dshelp.CidToDsKey(b.Cid()) exists, err := bs.datastore.Has(k) if err == nil && exists { continue @@ -143,11 +143,11 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { } func (bs *blockstore) Has(k *cid.Cid) (bool, error) { - return bs.datastore.Has(dshelp.NewKeyFromBinary(k.KeyString())) + return bs.datastore.Has(dshelp.CidToDsKey(k)) } func (s *blockstore) DeleteBlock(k *cid.Cid) error { - return s.datastore.Delete(dshelp.NewKeyFromBinary(k.KeyString())) + return s.datastore.Delete(dshelp.CidToDsKey(k)) } // AllKeysChan runs a query for keys from the blockstore. @@ -180,17 +180,12 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) } // need to convert to key.Key using key.KeyFromDsKey. - kb, err := dshelp.BinaryFromDsKey(ds.NewKey(e.Key)) // TODO: calling NewKey isnt free + c, err := dshelp.DsKeyToCid(ds.NewKey(e.Key)) // TODO: calling NewKey isnt free if err != nil { log.Warningf("error parsing key from DsKey: ", err) return nil, true } - c, err := cid.Cast(kb) - if err != nil { - log.Warning("error parsing cid from decoded DsKey: ", err) - return nil, true - } log.Debug("blockstore: query got key", c) return c, true diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index a5ecefd441..4c1a4db881 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -190,7 +190,7 @@ func TestValueTypeMismatch(t *testing.T) { block := blocks.NewBlock([]byte("some data")) datastore := ds.NewMapDatastore() - k := BlockPrefix.Child(dshelp.NewKeyFromBinary(block.Cid().KeyString())) + k := BlockPrefix.Child(dshelp.CidToDsKey(block.Cid())) datastore.Put(k, "data that isn't a block!") blockstore := NewBlockstore(ds_sync.MutexWrap(datastore)) From 992aa07fa54ef0ad89f156769dcea6027b46fadc Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 17 Oct 2016 18:13:07 -0400 Subject: [PATCH 1381/3147] ds-help: add helper func to convert from Cid to DsKey and the reverse License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-ds-help@e6e00eda4cde5fd07edcaff0c2246567b8dfa98c --- datastore/dshelp/key.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 417f496057..7db86aedb8 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -3,6 +3,7 @@ package dshelp import ( base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) // TODO: put this code into the go-datastore itself @@ -13,3 +14,15 @@ func NewKeyFromBinary(s string) ds.Key { func BinaryFromDsKey(k ds.Key) ([]byte, error) { return base32.RawStdEncoding.DecodeString(k.String()[1:]) } + +func CidToDsKey(k *cid.Cid) ds.Key { + return NewKeyFromBinary(k.KeyString()) +} + +func DsKeyToCid(dsKey ds.Key) (*cid.Cid, error) { + kb, err := BinaryFromDsKey(dsKey) + if err != nil { + return nil, err + } + return cid.Cast(kb) +} From d98265033d89af122cb363cfb5fa7cd23a45e3b4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 15 Oct 2016 09:06:44 -0700 Subject: [PATCH 1382/3147] unixfs: allow use of raw merkledag nodes for unixfs files License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@f47e36a5e8caa016533eaf857b62aeaa00d16655 --- unixfs/io/dagreader.go | 66 ++++++++++++++++++++++----------------- unixfs/mod/dagmodifier.go | 29 +++++++++++++---- unixfs/test/utils.go | 9 +++--- 3 files changed, 66 insertions(+), 38 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 086e5038ce..4eb3e04c61 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -2,17 +2,18 @@ package io import ( "bytes" + "context" "errors" "fmt" "io" "os" - "context" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) var ErrIsDir = errors.New("this dag node is a directory") @@ -58,36 +59,45 @@ type ReadSeekCloser interface { // NewDagReader creates a new reader object that reads the data represented by // the given node, using the passed in DAGService for data retreival -func NewDagReader(ctx context.Context, n *mdag.ProtoNode, serv mdag.DAGService) (*DagReader, error) { - pb := new(ftpb.Data) - if err := proto.Unmarshal(n.Data(), pb); err != nil { - return nil, err - } - - switch pb.GetType() { - case ftpb.Data_Directory: - // Dont allow reading directories - return nil, ErrIsDir - case ftpb.Data_File, ftpb.Data_Raw: - return NewDataFileReader(ctx, n, pb, serv), nil - case ftpb.Data_Metadata: - if len(n.Links()) == 0 { - return nil, errors.New("incorrectly formatted metadata object") - } - child, err := n.Links()[0].GetNode(ctx, serv) - if err != nil { +func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (*DagReader, error) { + switch n := n.(type) { + case *mdag.RawNode: + return &DagReader{ + buf: NewRSNCFromBytes(n.RawData()), + }, nil + case *mdag.ProtoNode: + pb := new(ftpb.Data) + if err := proto.Unmarshal(n.Data(), pb); err != nil { return nil, err } - childpb, ok := child.(*mdag.ProtoNode) - if !ok { - return nil, mdag.ErrNotProtobuf + switch pb.GetType() { + case ftpb.Data_Directory: + // Dont allow reading directories + return nil, ErrIsDir + case ftpb.Data_File, ftpb.Data_Raw: + return NewDataFileReader(ctx, n, pb, serv), nil + case ftpb.Data_Metadata: + if len(n.Links()) == 0 { + return nil, errors.New("incorrectly formatted metadata object") + } + child, err := n.Links()[0].GetNode(ctx, serv) + if err != nil { + return nil, err + } + + childpb, ok := child.(*mdag.ProtoNode) + if !ok { + return nil, mdag.ErrNotProtobuf + } + return NewDagReader(ctx, childpb, serv) + case ftpb.Data_Symlink: + return nil, ErrCantReadSymlinks + default: + return nil, ft.ErrUnrecognizedType } - return NewDagReader(ctx, childpb, serv) - case ftpb.Data_Symlink: - return nil, ErrCantReadSymlinks default: - return nil, ft.ErrUnrecognizedType + return nil, fmt.Errorf("unrecognized node type") } } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 3479ab4a48..fe59436ee4 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -2,6 +2,7 @@ package mod import ( "bytes" + "context" "errors" "io" "os" @@ -13,10 +14,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) var ErrSeekFail = errors.New("failed to seek properly") @@ -45,9 +46,14 @@ type DagModifier struct { read *uio.DagReader } -func NewDagModifier(ctx context.Context, from *mdag.ProtoNode, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { +func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { + pbn, ok := from.(*mdag.ProtoNode) + if !ok { + return nil, mdag.ErrNotProtobuf + } + return &DagModifier{ - curNode: from.Copy(), + curNode: pbn.Copy(), dagserv: serv, splitter: spl, ctx: ctx, @@ -109,7 +115,13 @@ func (dm *DagModifier) expandSparse(size int64) error { if err != nil { return err } - dm.curNode = nnode + + pbnnode, ok := nnode.(*mdag.ProtoNode) + if !ok { + return mdag.ErrNotProtobuf + } + + dm.curNode = pbnnode return nil } @@ -197,7 +209,12 @@ func (dm *DagModifier) Sync() error { return err } - dm.curNode = nd + pbnode, ok := nd.(*mdag.ProtoNode) + if !ok { + return mdag.ErrNotProtobuf + } + + dm.curNode = pbnode } dm.writeStart += uint64(buflen) @@ -288,7 +305,7 @@ func (dm *DagModifier) modifyDag(node *mdag.ProtoNode, offset uint64, data io.Re } // appendData appends the blocks from the given chan to the end of this dag -func (dm *DagModifier) appendData(node *mdag.ProtoNode, spl chunk.Splitter) (*mdag.ProtoNode, error) { +func (dm *DagModifier) appendData(node *mdag.ProtoNode, spl chunk.Splitter) (node.Node, error) { dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 26755cec57..abe292300f 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -2,6 +2,7 @@ package testu import ( "bytes" + "context" "fmt" "io" "io/ioutil" @@ -13,7 +14,7 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - context "context" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) @@ -27,7 +28,7 @@ func GetDAGServ() mdag.DAGService { return mdagmock.Mock() } -func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.ProtoNode { +func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) node.Node { in := bytes.NewReader(data) node, err := imp.BuildTrickleDagFromReader(dserv, SizeSplitterGen(500)(in)) if err != nil { @@ -37,11 +38,11 @@ func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) *mdag.ProtoNode { return node } -func GetEmptyNode(t testing.TB, dserv mdag.DAGService) *mdag.ProtoNode { +func GetEmptyNode(t testing.TB, dserv mdag.DAGService) node.Node { return GetNode(t, dserv, []byte{}) } -func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, *mdag.ProtoNode) { +func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, node.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) buf, err := ioutil.ReadAll(in) if err != nil { From 6a3aa9d939ea8b3ad96f37fc8c9337b15622091a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 15 Oct 2016 09:06:44 -0700 Subject: [PATCH 1383/3147] unixfs: allow use of raw merkledag nodes for unixfs files License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@0e015bac5adc170aca8e97a7ff7237f1565a1e84 --- mfs/dir.go | 7 ++++--- mfs/mfs_test.go | 11 ++++++++--- mfs/ops.go | 5 +++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 3a1c7be8ef..e8004c80fd 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -1,6 +1,7 @@ package mfs import ( + "context" "errors" "fmt" "os" @@ -9,11 +10,11 @@ import ( "sync" "time" - context "context" - dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" + + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) var ErrNotYetImplemented = errors.New("not yet implemented") @@ -323,7 +324,7 @@ func (d *Directory) Flush() error { } // AddChild adds the node 'nd' under this directory giving it the name 'name' -func (d *Directory) AddChild(name string, nd *dag.ProtoNode) error { +func (d *Directory) AddChild(name string, nd node.Node) error { d.lock.Lock() defer d.lock.Unlock() diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index dcec37356c..4ac1b4a744 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -42,12 +42,12 @@ func getDagserv(t *testing.T) dag.DAGService { return dag.NewDAGService(blockserv) } -func getRandFile(t *testing.T, ds dag.DAGService, size int64) *dag.ProtoNode { +func getRandFile(t *testing.T, ds dag.DAGService, size int64) node.Node { r := io.LimitReader(u.NewTimeSeededRand(), size) return fileNodeFromReader(t, ds, r) } -func fileNodeFromReader(t *testing.T, ds dag.DAGService, r io.Reader) *dag.ProtoNode { +func fileNodeFromReader(t *testing.T, ds dag.DAGService, r io.Reader) node.Node { nd, err := importer.BuildDagFromReader(ds, chunk.DefaultSplitter(r)) if err != nil { t.Fatal(err) @@ -125,7 +125,12 @@ func compStrArrs(a, b []string) bool { return true } -func assertFileAtPath(ds dag.DAGService, root *Directory, exp *dag.ProtoNode, pth string) error { +func assertFileAtPath(ds dag.DAGService, root *Directory, expn node.Node, pth string) error { + exp, ok := expn.(*dag.ProtoNode) + if !ok { + return dag.ErrNotProtobuf + } + parts := path.SplitList(pth) cur := root for i, d := range parts[:len(parts)-1] { diff --git a/mfs/ops.go b/mfs/ops.go index 6464d84041..1c1fef82b7 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -7,8 +7,9 @@ import ( gopath "path" "strings" - dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" + + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) // Mv moves the file or directory at 'src' to 'dst' @@ -87,7 +88,7 @@ func lookupDir(r *Root, path string) (*Directory, error) { } // PutNode inserts 'nd' at 'path' in the given mfs -func PutNode(r *Root, path string, nd *dag.ProtoNode) error { +func PutNode(r *Root, path string, nd node.Node) error { dirp, filename := gopath.Split(path) if filename == "" { return fmt.Errorf("cannot create file with empty name") From 7f0e864e0241b6b0022c06c0d1e6334e787cbcd4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 18 Oct 2016 11:07:32 -0700 Subject: [PATCH 1384/3147] raw dag: make raw nodes work in cat and get, add tests License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@64720f3b628abca1db75690c7772b86e05708490 --- unixfs/io/dagreader.go | 51 ++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 4eb3e04c61..44945dd311 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -129,33 +129,36 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { } dr.linkPosition++ - nxtpb, ok := nxt.(*mdag.ProtoNode) - if !ok { - return mdag.ErrNotProtobuf - } - - pb := new(ftpb.Data) - err = proto.Unmarshal(nxtpb.Data(), pb) - if err != nil { - return fmt.Errorf("incorrectly formatted protobuf: %s", err) - } + switch nxt := nxt.(type) { + case *mdag.ProtoNode: + pb := new(ftpb.Data) + err = proto.Unmarshal(nxt.Data(), pb) + if err != nil { + return fmt.Errorf("incorrectly formatted protobuf: %s", err) + } - switch pb.GetType() { - case ftpb.Data_Directory: - // A directory should not exist within a file - return ft.ErrInvalidDirLocation - case ftpb.Data_File: - dr.buf = NewDataFileReader(dr.ctx, nxtpb, pb, dr.serv) - return nil - case ftpb.Data_Raw: - dr.buf = NewRSNCFromBytes(pb.GetData()) + switch pb.GetType() { + case ftpb.Data_Directory: + // A directory should not exist within a file + return ft.ErrInvalidDirLocation + case ftpb.Data_File: + dr.buf = NewDataFileReader(dr.ctx, nxt, pb, dr.serv) + return nil + case ftpb.Data_Raw: + dr.buf = NewRSNCFromBytes(pb.GetData()) + return nil + case ftpb.Data_Metadata: + return errors.New("shouldnt have had metadata object inside file") + case ftpb.Data_Symlink: + return errors.New("shouldnt have had symlink inside file") + default: + return ft.ErrUnrecognizedType + } + case *mdag.RawNode: + dr.buf = NewRSNCFromBytes(nxt.RawData()) return nil - case ftpb.Data_Metadata: - return errors.New("shouldnt have had metadata object inside file") - case ftpb.Data_Symlink: - return errors.New("shouldnt have had symlink inside file") default: - return ft.ErrUnrecognizedType + return errors.New("unrecognized node type in DagReader") } } From 80eb0bcc50170d93d11e3f386a873b93f69acfd0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 18 Oct 2016 14:41:47 -0700 Subject: [PATCH 1385/3147] fix add/cat of small files License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@acf015ec49216cca7aceaf2c1f7788740cd7914d --- mfs/dir.go | 50 ++++++++++++++++++++++++++++------------------ mfs/file.go | 53 ++++++++++++++++++++++++++++++------------------- mfs/mfs_test.go | 13 ++++++++---- mfs/system.go | 5 +++-- 4 files changed, 76 insertions(+), 45 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index e8004c80fd..38bee4cccd 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -89,7 +89,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { return d.node.Copy(), nil } -func (d *Directory) updateChild(name string, nd *dag.ProtoNode) error { +func (d *Directory) updateChild(name string, nd node.Node) error { err := d.node.RemoveNodeLink(name) if err != nil && err != dag.ErrNotFound { return err @@ -121,28 +121,40 @@ func (d *Directory) childNode(name string) (FSNode, error) { } // cacheNode caches a node into d.childDirs or d.files and returns the FSNode. -func (d *Directory) cacheNode(name string, nd *dag.ProtoNode) (FSNode, error) { - i, err := ft.FromBytes(nd.Data()) - if err != nil { - return nil, err - } +func (d *Directory) cacheNode(name string, nd node.Node) (FSNode, error) { + switch nd := nd.(type) { + case *dag.ProtoNode: + i, err := ft.FromBytes(nd.Data()) + if err != nil { + return nil, err + } - switch i.GetType() { - case ufspb.Data_Directory: - ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) - d.childDirs[name] = ndir - return ndir, nil - case ufspb.Data_File, ufspb.Data_Raw, ufspb.Data_Symlink: + switch i.GetType() { + case ufspb.Data_Directory: + ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) + d.childDirs[name] = ndir + return ndir, nil + case ufspb.Data_File, ufspb.Data_Raw, ufspb.Data_Symlink: + nfi, err := NewFile(name, nd, d, d.dserv) + if err != nil { + return nil, err + } + d.files[name] = nfi + return nfi, nil + case ufspb.Data_Metadata: + return nil, ErrNotYetImplemented + default: + return nil, ErrInvalidChild + } + case *dag.RawNode: nfi, err := NewFile(name, nd, d, d.dserv) if err != nil { return nil, err } d.files[name] = nfi return nfi, nil - case ufspb.Data_Metadata: - return nil, ErrNotYetImplemented default: - return nil, ErrInvalidChild + return nil, fmt.Errorf("unrecognized node type in cache node") } } @@ -162,8 +174,8 @@ func (d *Directory) Uncache(name string) { // childFromDag searches through this directories dag node for a child link // with the given name -func (d *Directory) childFromDag(name string) (*dag.ProtoNode, error) { - pbn, err := d.node.GetLinkedProtoNode(d.ctx, d.dserv, name) +func (d *Directory) childFromDag(name string) (node.Node, error) { + pbn, err := d.node.GetLinkedNode(d.ctx, d.dserv, name) switch err { case nil: return pbn, nil @@ -249,7 +261,7 @@ func (d *Directory) List() ([]NodeListing, error) { return nil, err } - child.Hash = nd.Key().B58String() + child.Hash = nd.Cid().String() out = append(out, child) } @@ -385,7 +397,7 @@ func (d *Directory) Path() string { return out } -func (d *Directory) GetNode() (*dag.ProtoNode, error) { +func (d *Directory) GetNode() (node.Node, error) { d.lock.Lock() defer d.lock.Unlock() diff --git a/mfs/file.go b/mfs/file.go index 373a9dd1dc..931827ebb6 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -9,6 +9,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" + + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) type File struct { @@ -19,12 +21,12 @@ type File struct { desclock sync.RWMutex dserv dag.DAGService - node *dag.ProtoNode + node node.Node nodelk sync.Mutex } // NewFile returns a NewFile object with the given parameters -func NewFile(name string, node *dag.ProtoNode, parent childCloser, dserv dag.DAGService) (*File, error) { +func NewFile(name string, node node.Node, parent childCloser, dserv dag.DAGService) (*File, error) { return &File{ dserv: dserv, parent: parent, @@ -44,18 +46,23 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { node := fi.node fi.nodelk.Unlock() - fsn, err := ft.FSNodeFromBytes(node.Data()) - if err != nil { - return nil, err - } - - switch fsn.Type { - default: - return nil, fmt.Errorf("unsupported fsnode type for 'file'") - case ft.TSymlink: - return nil, fmt.Errorf("symlinks not yet supported") - case ft.TFile, ft.TRaw: - // OK case + switch node := node.(type) { + case *dag.ProtoNode: + fsn, err := ft.FSNodeFromBytes(node.Data()) + if err != nil { + return nil, err + } + + switch fsn.Type { + default: + return nil, fmt.Errorf("unsupported fsnode type for 'file'") + case ft.TSymlink: + return nil, fmt.Errorf("symlinks not yet supported") + case ft.TFile, ft.TRaw: + // OK case + } + case *dag.RawNode: + // Ok as well. } switch flags { @@ -85,16 +92,22 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { func (fi *File) Size() (int64, error) { fi.nodelk.Lock() defer fi.nodelk.Unlock() - pbd, err := ft.FromBytes(fi.node.Data()) - if err != nil { - return 0, err + switch nd := fi.node.(type) { + case *dag.ProtoNode: + pbd, err := ft.FromBytes(nd.Data()) + if err != nil { + return 0, err + } + return int64(pbd.GetFilesize()), nil + case *dag.RawNode: + return int64(len(nd.RawData())), nil + default: + return 0, fmt.Errorf("unrecognized node type in mfs/file.Size()") } - - return int64(pbd.GetFilesize()), nil } // GetNode returns the dag node associated with this file -func (fi *File) GetNode() (*dag.ProtoNode, error) { +func (fi *File) GetNode() (node.Node, error) { fi.nodelk.Lock() defer fi.nodelk.Unlock() return fi.node, nil diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 4ac1b4a744..b7e725fbc2 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -794,7 +794,12 @@ func TestFlushing(t *testing.T) { t.Fatal(err) } - fsnode, err := ft.FSNodeFromBytes(rnd.Data()) + pbrnd, ok := rnd.(*dag.ProtoNode) + if !ok { + t.Fatal(dag.ErrNotProtobuf) + } + + fsnode, err := ft.FSNodeFromBytes(pbrnd.Data()) if err != nil { t.Fatal(err) } @@ -803,10 +808,10 @@ func TestFlushing(t *testing.T) { t.Fatal("root wasnt a directory") } - rnk := rnd.Key() + rnk := rnd.Cid() exp := "QmWMVyhTuyxUrXX3ynz171jq76yY3PktfY9Bxiph7b9ikr" - if rnk.B58String() != exp { - t.Fatalf("dag looks wrong, expected %s, but got %s", exp, rnk.B58String()) + if rnk.String() != exp { + t.Fatalf("dag looks wrong, expected %s, but got %s", exp, rnk.String()) } } diff --git a/mfs/system.go b/mfs/system.go index 2a69a18788..4912c0fd33 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -10,6 +10,7 @@ package mfs import ( + "context" "errors" "sync" "time" @@ -17,9 +18,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - context "context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) var ErrNotExist = errors.New("no such rootfs") @@ -41,7 +42,7 @@ const ( // FSNode represents any node (directory, root, or file) in the mfs filesystem type FSNode interface { - GetNode() (*dag.ProtoNode, error) + GetNode() (node.Node, error) Flush() error Type() NodeType } From 7f3f4222b25f2b49aefae0e9c370ad4677e8556e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 18 Oct 2016 16:03:26 -0700 Subject: [PATCH 1386/3147] update HashOnRead validation to properly support cids License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@c0661448235c35536f55a811cdd00c989000ee99 --- blockstore/blockstore.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index dfa35ec413..fb8a0f067f 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -100,12 +100,16 @@ func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { } if bs.rehash { - rb := blocks.NewBlock(bdata) - if !rb.Cid().Equals(k) { + rbcid, err := k.Prefix().Sum(bdata) + if err != nil { + return nil, err + } + + if !rbcid.Equals(k) { return nil, ErrHashMismatch - } else { - return rb, nil } + + return blocks.NewBlockWithCid(bdata, rbcid) } else { return blocks.NewBlockWithCid(bdata, k) } From 38733364d9df454d5fda1ecc7945fd91e05d97f8 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 16 Oct 2016 21:06:28 -0400 Subject: [PATCH 1387/3147] Create a FilestoreNode object to carry PosInfo When doing a filestore add, we wrap whatever nodes we create in a FilestoreNode object and add the PosInfo to it so that the filestore will be able to extract information as needed. Edited by whyrusleeping License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-chunker@a61e184fe3a89cbed366a8ec27f72c753f1eb395 --- chunker/rabin.go | 10 ++++++++-- chunker/splitting.go | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/chunker/rabin.go b/chunker/rabin.go index ce9b5fc567..d2d71460d3 100644 --- a/chunker/rabin.go +++ b/chunker/rabin.go @@ -10,7 +10,8 @@ import ( var IpfsRabinPoly = chunker.Pol(17437180132763653) type Rabin struct { - r *chunker.Chunker + r *chunker.Chunker + reader io.Reader } func NewRabin(r io.Reader, avgBlkSize uint64) *Rabin { @@ -25,7 +26,8 @@ func NewRabinMinMax(r io.Reader, min, avg, max uint64) *Rabin { ch := chunker.New(r, IpfsRabinPoly, h, avg, min, max) return &Rabin{ - r: ch, + r: ch, + reader: r, } } @@ -37,3 +39,7 @@ func (r *Rabin) NextBytes() ([]byte, error) { return ch.Data, nil } + +func (r *Rabin) Reader() io.Reader { + return r.reader +} diff --git a/chunker/splitting.go b/chunker/splitting.go index f3256c4587..6fd55e22da 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -12,6 +12,7 @@ var log = logging.Logger("chunk") var DefaultBlockSize int64 = 1024 * 256 type Splitter interface { + Reader() io.Reader NextBytes() ([]byte, error) } @@ -77,3 +78,7 @@ func (ss *sizeSplitterv2) NextBytes() ([]byte, error) { return buf[:n], nil } + +func (ss *sizeSplitterv2) Reader() io.Reader { + return ss.r +} From 95c599f6ac8ab9551a4511cf478589bd9b60b581 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1388/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@12a491b4b90594e21b6e3ae6ca41d7059a8dd60f --- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/test/utils.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 44945dd311..2d25895f13 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -12,8 +12,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) var ErrIsDir = errors.New("this dag node is a directory") diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index ac316f8a27..df2f18b403 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -5,7 +5,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) type directoryBuilder struct { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index fe59436ee4..63afd33e78 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -15,9 +15,9 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index abe292300f..4b1ef7c490 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,7 +14,7 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) From 20ce4a7da8ff420848f9d4c4097ffe7cdc2635e9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1389/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@b68ea04482dcb7b3517a507fc92c7ca168c505eb --- path/path.go | 2 +- path/resolver.go | 6 +++--- path/resolver_test.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index 3713259c4b..c05c3c798e 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index e4bfe8f796..8a1bb5e2ea 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -10,8 +10,8 @@ import ( merkledag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) var log = logging.Logger("path") @@ -112,7 +112,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri ctx, cancel = context.WithTimeout(ctx, time.Minute) defer cancel() - lnk, rest, err := nd.Resolve(names) + lnk, rest, err := nd.ResolveLink(names) if err == merkledag.ErrLinkNotFound { n := nd.Cid() return result, ErrNoLink{Name: names[0], Node: n} diff --git a/path/resolver_test.go b/path/resolver_test.go index 652f387965..db69fde5f9 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) From 6fb4fcf05901ad106df4fd590803c56a57f1b0b5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1390/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@c52c4ee1415a0aa8a658350f6818991dc3860088 --- mfs/dir.go | 2 +- mfs/file.go | 2 +- mfs/mfs_test.go | 4 ++-- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 38bee4cccd..e425a6094e 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -14,7 +14,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 931827ebb6..72be2117af 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index b7e725fbc2..04513d3e3c 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,8 +24,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" diff --git a/mfs/ops.go b/mfs/ops.go index 1c1fef82b7..a27eb7d4ac 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index b88604bc0b..6cb38850ad 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 4912c0fd33..234fc92fa6 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,8 +19,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From 79584b7ea7c53ea29fe273440e5b14a7c860f76a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1391/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@99935f5baff7ce959a5c6e78c24486491ff3f04a --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 24ed382b3a..d8d8a14fc7 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From b8971d6ab29a4fef25faca535f11203e7480ed4e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1392/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@0bc06285476a2361714e27e51b01b9d3520613d3 --- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/supernode/client.go | 6 +++--- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 22b9386caa..753f8bc860 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,11 +8,11 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ma "gx/ipfs/QmUAQaWbKxGCUTuoQVvvicbQNZ9APF5pDGWyAZSe93AtKH/go-multiaddr" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 4dff16cfe9..424f3ea583 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,8 +8,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index ade8304a4e..2cd9855c3d 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,8 +8,8 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index e71635ab56..eb117afd6b 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,7 +3,7 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht" + dht "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" mocknet "gx/ipfs/QmcRa2qn6iCmap9bjp8jAwkvYAq13AUfxdY3rrYiaJbLum/go-libp2p/p2p/net/mock" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 5296b529f7..a297165638 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,9 +10,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 00a7cfaee8..939ebea6ed 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" p2phost "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 49ac6ec03c..b675cbec54 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,10 +7,10 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 3f72489195..12b6fc2955 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,12 +8,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index ea9c0b1b03..eb08817101 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,7 +2,7 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 15f1a71a0e..2640381950 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,8 +6,8 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" - dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" host "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index c6f6daf4cc..25268e7c4d 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -7,7 +7,7 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" context "context" - dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index a7a315eae2..59cdd814e0 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmWHiyk5y2EKgxHogFJ4Zt1xTqKeVsBc4zcBke8ie9C2Bn/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From be1dbf059b07aeae70399be647cbd2f089060bd2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1393/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@d91d4b27218cca72ef174583d50fba701762c5f5 --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 4d65feea0e..54c305c9dd 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 8909f16763..d23f66fb2b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,7 +14,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 94a9e1ce36..727270504e 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" diff --git a/namesys/routing.go b/namesys/routing.go index 2cf6e0d8ec..33b5431d47 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -12,11 +12,11 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmNUgVQTYnXQVrGT2rajZYsuKV8GYdiL91cdZSQDKNPNgE/go-libp2p-routing" + routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) From 6dbd2037cd7ce94f2972a7d1f684a4ebbf7c2bcd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1394/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@8f3fb21c4e11f4e0b1201246f982c8c841270765 --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 2 +- blockstore/blockstore_test.go | 2 +- blockstore/bloom_cache.go | 2 +- blockstore/util/remove.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 03fa3fe0c3..8bc74436c6 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -7,7 +7,7 @@ import ( "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 42d388a16a..d796214c5c 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index b607bfc098..f5dc26c1c4 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,7 +12,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsns "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/namespace" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 4c1a4db881..abe8a1a72d 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -9,7 +9,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 7f6066ace5..3febffd01e 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index b3fd7501ee..01f2ce44e3 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,7 +6,7 @@ import ( bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From 18ac09553f871c0431719abda2c68997dbd62ef8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1395/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@6b702f1fa501aa1ee2d295d0758e5f9d59791c50 --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 675bb97515..8f1d069ab1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 956420da28..4aae38bef1 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -12,7 +12,7 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" From 649e4c899b7de38af5d8e6bfd2a1d6a97be11896 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1396/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@fbd1999a51a43078eb70f9d5c05215774fefe3c1 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 7db86aedb8..20308d7045 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,9 +1,9 @@ package dshelp import ( + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" ) // TODO: put this code into the go-datastore itself From b5eafffcd72c12f8b3475d2ac50fd092deebdf3e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1397/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@2c9e8d7a00b464fa9ea86d68da830f82ff60ecc7 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 5f62eb0b8d..d2607bdbef 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,7 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 10c60c2569..2263d51116 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,8 +12,8 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 787b8226a5..65c480ab84 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,7 +10,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" context "context" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index eaaba7884c..2d7566b77d 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -13,10 +13,10 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/QmZx42H5khbVQhV5odp66TApShV4XCujYazcvYduZ4TroB/go-ipld-node" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 335b59e99a..3a33219ac7 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -9,7 +9,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" mdtest "github.com/ipfs/go-ipfs/merkledag/test" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) func ignoreCids(_ *cid.Cid) {} From 077d708d57482b3c4bbaff1cc55f91f08e2783aa Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 24 Oct 2016 20:39:27 -0700 Subject: [PATCH 1398/3147] update to new cid and ipld node packages License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@7867ef218191e26eff094e5d44857f3ecc0fb3b4 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index ba3fa00175..5017cc8dfc 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 4befe796d6..3ec1478e85 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - cid "gx/ipfs/QmXUuRadqDq5BuFWzVU6VuKaSjTcNm1gNCtLvvP1TJCW4z/go-cid" + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" From 160604fae1ca2e36ab55ec0f04ab00f1a0f6767d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 19 Oct 2016 10:05:58 -0700 Subject: [PATCH 1399/3147] make path resolver no longer require whole node for construction License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@31b5b667d044b2a00fca7bf2aed7ac2a3a1f4bfd --- unixfs/io/resolve.go | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 unixfs/io/resolve.go diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go new file mode 100644 index 0000000000..a796c6bb71 --- /dev/null +++ b/unixfs/io/resolve.go @@ -0,0 +1,46 @@ +package io + +import ( + "context" + + dag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" + + node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" +) + +func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { + pbnd, ok := nd.(*dag.ProtoNode) + if !ok { + lnk, _, err := nd.ResolveLink([]string{name}) + return lnk, err + } + + upb, err := ft.FromBytes(pbnd.Data()) + if err != nil { + // Not a unixfs node, use standard object traversal code + lnk, _, err := nd.ResolveLink([]string{name}) + return lnk, err + } + + switch upb.GetType() { + /* + case ft.THAMTShard: + s, err := hamt.NewHamtFromDag(ds, nd) + if err != nil { + return nil, err + } + + // TODO: optimized routine on HAMT for returning a dag.Link to avoid extra disk hits + out, err := s.Find(ctx, name) + if err != nil { + return nil, err + } + + return dag.MakeLink(out) + */ + default: + lnk, _, err := nd.ResolveLink([]string{name}) + return lnk, err + } +} From be5c19c26ba069e9663eaabaad7303ca0dd5f2cc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 19 Oct 2016 10:05:58 -0700 Subject: [PATCH 1400/3147] make path resolver no longer require whole node for construction License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@8205cde77f68c847312b375a2fd1dabcaa90b5e5 --- path/resolver.go | 31 ++++++++++++++++++++++++------- path/resolver_test.go | 2 +- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 8a1bb5e2ea..e284ce1364 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -7,7 +7,7 @@ import ( "fmt" "time" - merkledag "github.com/ipfs/go-ipfs/merkledag" + dag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" @@ -32,8 +32,19 @@ func (e ErrNoLink) Error() string { // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. +// TODO: now that this is more modular, try to unify this code with the +// the resolvers in namesys type Resolver struct { - DAG merkledag.DAGService + DAG dag.DAGService + + ResolveOnce func(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) +} + +func NewBasicResolver(ds dag.DAGService) *Resolver { + return &Resolver{ + DAG: ds, + ResolveOnce: ResolveSingle, + } } // SplitAbsPath clean up and split fpath. It extracts the first component (which @@ -53,7 +64,9 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { } c, err := cid.Decode(parts[0]) + // first element in the path is a cid if err != nil { + log.Debug("given path element is not a cid.\n") return nil, nil, err } @@ -75,6 +88,11 @@ func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, erro return nodes[len(nodes)-1], err } +func ResolveSingle(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { + lnk, _, err := nd.ResolveLink([]string{name}) + return lnk, err +} + // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. @@ -113,21 +131,20 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri defer cancel() lnk, rest, err := nd.ResolveLink(names) - if err == merkledag.ErrLinkNotFound { - n := nd.Cid() - return result, ErrNoLink{Name: names[0], Node: n} + if err == dag.ErrLinkNotFound { + return result, ErrNoLink{Name: names[0], Node: nd.Cid()} } else if err != nil { return result, err } - nextnode, err := s.DAG.Get(ctx, lnk.Cid) + nextnode, err := lnk.GetNode(ctx, s.DAG) if err != nil { return result, err } nd = nextnode - names = rest result = append(result, nextnode) + names = rest } return result, nil } diff --git a/path/resolver_test.go b/path/resolver_test.go index db69fde5f9..68e67b36a5 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -55,7 +55,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - resolver := &path.Resolver{DAG: dagService} + resolver := path.NewBasicResolver(dagService) node, err := resolver.ResolvePath(ctx, p) if err != nil { t.Fatal(err) From 52b3590f7fa5b91fde6386138c58e0d5e338bbe9 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Fri, 1 Jul 2016 18:36:55 +0100 Subject: [PATCH 1401/3147] Changed so only explicit ipfs cli commands are lowercased License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-namesys@16183d0dfc06b4dc145ee730e0771038e52232eb --- namesys/namesys.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 54c305c9dd..87294190d8 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -14,11 +14,11 @@ import ( // mpns (a multi-protocol NameSystem) implements generic IPFS naming. // // Uses several Resolvers: -// (a) ipfs routing naming: SFS-like PKI names. +// (a) IPFS routing naming: SFS-like PKI names. // (b) dns domains: resolves using links in DNS TXT records // (c) proquints: interprets string as the raw byte data. // -// It can only publish to: (a) ipfs routing naming. +// It can only publish to: (a) IPFS routing naming. // type mpns struct { resolvers map[string]resolver From b9d6852bb40b57e526ed906de633aee8e11c3caf Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Fri, 1 Jul 2016 18:36:55 +0100 Subject: [PATCH 1402/3147] Changed so only explicit ipfs cli commands are lowercased License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-unixfs@3d3560255024b08e2a2073fcd783b92e95ad3915 --- unixfs/format.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/format.go b/unixfs/format.go index a8ade430c9..7a602362ee 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -1,4 +1,4 @@ -// Package format implements a data format for files in the ipfs filesystem It +// Package format implements a data format for files in the IPFS filesystem It // is not the only format in ipfs, but it is the one that the filesystem // assumes package unixfs From 90b45f468bcf4ff6605e4d7fe4e65c22bbbfbb17 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Fri, 1 Jul 2016 18:36:55 +0100 Subject: [PATCH 1403/3147] Changed so only explicit ipfs cli commands are lowercased License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-path@fdf89242fbd0f5424d22296ae3dbe704f2e88da3 --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index c05c3c798e..dbc67189a9 100644 --- a/path/path.go +++ b/path/path.go @@ -9,7 +9,7 @@ import ( ) // ErrBadPath is returned when a given path is incorrectly formatted -var ErrBadPath = errors.New("invalid ipfs ref path") +var ErrBadPath = errors.New("invalid 'ipfs ref' path") // TODO: debate making this a private struct wrapped in a public interface // would allow us to control creation, and cache segments. From 02387765608d89af2eff392372a56d614b624db4 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Fri, 1 Jul 2016 18:36:55 +0100 Subject: [PATCH 1404/3147] Changed so only explicit ipfs cli commands are lowercased License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-mfs@b4356f1afd5eab9e5edee7d4c71d17a1943b19cb --- mfs/system.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/system.go b/mfs/system.go index 234fc92fa6..a565d7346b 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -1,4 +1,4 @@ -// package mfs implements an in memory model of a mutable ipfs filesystem. +// package mfs implements an in memory model of a mutable IPFS filesystem. // // It consists of four main structs: // 1) The Filesystem From 59d465b30b558e2473d00865c432c86c05f35400 Mon Sep 17 00:00:00 2001 From: Richard Littauer Date: Fri, 1 Jul 2016 18:36:55 +0100 Subject: [PATCH 1405/3147] Changed so only explicit ipfs cli commands are lowercased License: MIT Signed-off-by: Richard Littauer This commit was moved from ipfs/go-ipfs-exchange-interface@35dc50badcccd77d0210935f4c7257aefa4015e1 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index d8d8a14fc7..caf3720011 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -1,4 +1,4 @@ -// package exchange defines the IPFS Exchange interface +// package exchange defines the IPFS exchange interface package exchange import ( From 67f5e0294339594032595cbe074ee86c89cf5b62 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 30 Oct 2016 19:01:03 -0700 Subject: [PATCH 1406/3147] update go-libp2p-swarm with deadlock fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@06b8db4ec90fb686ec002b5dad377a31ebadb85f --- routing/mock/dht.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index eb117afd6b..07a79d65ce 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmQ7iWUfqrLEoJwsoNdrZu4625bKyhZCi4Sh6MfjywEfbG/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - mocknet "gx/ipfs/QmcRa2qn6iCmap9bjp8jAwkvYAq13AUfxdY3rrYiaJbLum/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 12b6fc2955..aee5c3b635 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -9,9 +9,9 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" + dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index eb08817101..506966684a 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,7 +2,7 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 2640381950..b50fdfa49c 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,9 +4,9 @@ import ( "context" "errors" + dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 25268e7c4d..7bbdaf3542 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -7,7 +7,7 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" context "context" - dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 59cdd814e0..87008840d3 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmTyXZijAwx3ptKzQkzq7BWBhmSJhjxLpDKF2Fp95WUd13/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From e100d17ffcf91368ebe4e97c07bcf87bad7a2eb9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 30 Oct 2016 19:01:03 -0700 Subject: [PATCH 1407/3147] update go-libp2p-swarm with deadlock fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@2ba84ca317cd56c24647d681cfc84fc22ff731b3 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 5b6e30794c..951d89b60b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" + mocknet "gx/ipfs/QmQ7iWUfqrLEoJwsoNdrZu4625bKyhZCi4Sh6MfjywEfbG/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - mocknet "gx/ipfs/QmcRa2qn6iCmap9bjp8jAwkvYAq13AUfxdY3rrYiaJbLum/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 300f8829ccf8bd930ac582b4200670a7f16661ce Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 1 Nov 2016 14:00:02 -0700 Subject: [PATCH 1408/3147] namesys: return right after errors License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@0ee319347b397d34def2328cb1e23b7ec86a8f9d --- namesys/routing.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/namesys/routing.go b/namesys/routing.go index 33b5431d47..eb9652e7a2 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -147,13 +147,16 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa if err != nil { log.Warning("RoutingResolve get failed.") resp <- err + return } entry = new(pb.IpnsEntry) err = proto.Unmarshal(val, entry) if err != nil { resp <- err + return } + resp <- nil }() @@ -162,7 +165,9 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa pubk, err := routing.GetPublicKey(r.routing, ctx, hash) if err != nil { resp <- err + return } + pubkey = pubk resp <- nil }() From e8ba0bbecb2e8ab53e6ed2ee5cd119683d4c4dff Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 1 Nov 2016 15:37:51 -0700 Subject: [PATCH 1409/3147] dht: update to dht code with fixed GetClosestPeers License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@3eebc714bf4158e5da1821cdcd5b551bc16cad17 --- routing/mock/dht.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 07a79d65ce..1acb2cd58b 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -4,7 +4,7 @@ import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmQ7iWUfqrLEoJwsoNdrZu4625bKyhZCi4Sh6MfjywEfbG/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht" + dht "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index aee5c3b635..b04fdb0b28 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -9,12 +9,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" - dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 506966684a..a825bb7349 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,8 +2,8 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index b50fdfa49c..4a2d94f1ab 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,12 +4,12 @@ import ( "context" "errors" - dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" host "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 7bbdaf3542..6171dc294d 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -7,10 +7,10 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" context "context" - dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 87008840d3..0f0afff2bf 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmSb1SYG4dxsuiscd8dyNvn4UuT6gKU8HzQCwa5jtGgGMR/go-libp2p-kad-dht/pb" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From 150ce099470195cff4a5839183f567f9f73071cd Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 2 Nov 2016 21:56:34 -0400 Subject: [PATCH 1410/3147] Separate out the G.C. Locking from the Blockstore interface. Factored out of #3257 (Add support for multiple blockstores). License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@a4a6958c2715497fd4b961d01aae60ab4b59478a --- blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 34 ++++++++++++++++++++++++++++------ blockstore/bloom_cache_test.go | 2 +- blockstore/caching.go | 4 ++-- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index d796214c5c..0f7823c5cc 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -13,7 +13,7 @@ import ( var exampleBlock = blocks.NewBlock([]byte("foo")) -func testArcCached(bs GCBlockstore, ctx context.Context) (*arccache, error) { +func testArcCached(bs Blockstore, ctx context.Context) (*arccache, error) { if ctx == nil { ctx = context.TODO() } diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f5dc26c1c4..274c1ee7b4 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -39,9 +39,7 @@ type Blockstore interface { AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) } -type GCBlockstore interface { - Blockstore - +type GCLocker interface { // GCLock locks the blockstore for garbage collection. No operations // that expect to finish with a pin should ocurr simultaneously. // Reading during GC is safe, and requires no lock. @@ -58,6 +56,20 @@ type GCBlockstore interface { GCRequested() bool } +type GCBlockstore interface { + Blockstore + GCLocker +} + +func NewGCBlockstore(bs Blockstore, gcl GCLocker) GCBlockstore { + return gcBlockstore{bs, gcl} +} + +type gcBlockstore struct { + Blockstore + GCLocker +} + func NewBlockstore(d ds.Batching) *blockstore { var dsb ds.Batching dd := dsns.Wrap(d, BlockPrefix) @@ -223,6 +235,16 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return output, nil } +func NewGCLocker() *gclocker { + return &gclocker{} +} + +type gclocker struct { + lk sync.RWMutex + gcreq int32 + gcreqlk sync.Mutex +} + type Unlocker interface { Unlock() } @@ -236,18 +258,18 @@ func (u *unlocker) Unlock() { u.unlock = nil // ensure its not called twice } -func (bs *blockstore) GCLock() Unlocker { +func (bs *gclocker) GCLock() Unlocker { atomic.AddInt32(&bs.gcreq, 1) bs.lk.Lock() atomic.AddInt32(&bs.gcreq, -1) return &unlocker{bs.lk.Unlock} } -func (bs *blockstore) PinLock() Unlocker { +func (bs *gclocker) PinLock() Unlocker { bs.lk.RLock() return &unlocker{bs.lk.RUnlock} } -func (bs *blockstore) GCRequested() bool { +func (bs *gclocker) GCRequested() bool { return atomic.LoadInt32(&bs.gcreq) > 0 } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 8bdf567f07..72223cd44e 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -14,7 +14,7 @@ import ( syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) -func testBloomCached(bs GCBlockstore, ctx context.Context) (*bloomcache, error) { +func testBloomCached(bs Blockstore, ctx context.Context) (*bloomcache, error) { if ctx == nil { ctx = context.TODO() } diff --git a/blockstore/caching.go b/blockstore/caching.go index d28401cf8a..d19f478226 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -22,8 +22,8 @@ func DefaultCacheOpts() CacheOpts { } } -func CachedBlockstore(bs GCBlockstore, - ctx context.Context, opts CacheOpts) (cbs GCBlockstore, err error) { +func CachedBlockstore(bs Blockstore, + ctx context.Context, opts CacheOpts) (cbs Blockstore, err error) { cbs = bs if opts.HasBloomFilterSize < 0 || opts.HasBloomFilterHashes < 0 || From b42513cefb7abbb11f1e6bd2bfdd40b4730eb56f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 2 Nov 2016 21:56:34 -0400 Subject: [PATCH 1411/3147] Separate out the G.C. Locking from the Blockstore interface. Factored out of #3257 (Add support for multiple blockstores). License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@f60182927913c30c35dd796f83e8b9e4e741301a --- unixfs/mod/dagmodifier_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 810ec6f234..9c7ac89d7b 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -22,7 +22,7 @@ import ( "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) -func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.GCBlockstore) { +func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore) { dstore := ds.NewMapDatastore() tsds := sync.MutexWrap(dstore) bstore := blockstore.NewBlockstore(tsds) From 86af8bc836bdc0bfb3184f50958c3f18f9f66d6e Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 2 Nov 2016 21:56:34 -0400 Subject: [PATCH 1412/3147] Separate out the G.C. Locking from the Blockstore interface. Factored out of #3257 (Add support for multiple blockstores). License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-blockservice@8ec3091f5788fe6bbe971e04239fdcf6efe2371b --- blockservice/blockservice_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index d87a383e56..0415f8213d 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -36,14 +36,14 @@ func TestWriteThroughWorks(t *testing.T) { } } -var _ blockstore.GCBlockstore = (*PutCountingBlockstore)(nil) +var _ blockstore.Blockstore = (*PutCountingBlockstore)(nil) type PutCountingBlockstore struct { - blockstore.GCBlockstore + blockstore.Blockstore PutCounter int } func (bs *PutCountingBlockstore) Put(block blocks.Block) error { bs.PutCounter++ - return bs.GCBlockstore.Put(block) + return bs.Blockstore.Put(block) } From 448e6d2a4f3310e16c0551b450a1ca8b02a7cf70 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 3 Nov 2016 20:06:32 -0700 Subject: [PATCH 1413/3147] update go-libp2p License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@03aa9e4b9742ef1714fa39cc3196b13cc2f7d5bc --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 951d89b60b..747d9938db 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmQ7iWUfqrLEoJwsoNdrZu4625bKyhZCi4Sh6MfjywEfbG/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmVN76ekoYakYa8WVDwhkUsnjt2MYuFpQs1uuU57T5KMD8/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ) From b38395cd6d4fde68a02af1b2cc58b7e228946a3b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 3 Nov 2016 20:06:32 -0700 Subject: [PATCH 1414/3147] update go-libp2p License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@22e95c64975a2fa01a10f7a8d18eb75ba414e8cb --- routing/mock/dht.go | 4 ++-- routing/none/none_client.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 1acb2cd58b..c39c97fe94 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmQ7iWUfqrLEoJwsoNdrZu4625bKyhZCi4Sh6MfjywEfbG/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmVN76ekoYakYa8WVDwhkUsnjt2MYuFpQs1uuU57T5KMD8/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + dht "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 939ebea6ed..71737b8e93 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -8,9 +8,9 @@ import ( routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + p2phost "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" - p2phost "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index b04fdb0b28..fe09c4cc28 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -11,12 +11,12 @@ import ( routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" - "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index a825bb7349..3b989fb0da 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -3,8 +3,8 @@ package proxy import ( context "context" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" - inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" + dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmdysBu77i3YaagNtMAjiCJdeWWvds18ho5XEB784guQ41/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 4a2d94f1ab..22aa5711ea 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -7,11 +7,11 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" + host "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" - host "gx/ipfs/QmdML3R42PRSwnt46jSuEts9bHSqLctVYEjJqMR3UYV8ki/go-libp2p-host" - inet "gx/ipfs/QmdXimY9QHaasZmw6hWojWnCJvfgxETjZQfg9g6ZrA9wMX/go-libp2p-net" + dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmdysBu77i3YaagNtMAjiCJdeWWvds18ho5XEB784guQ41/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 6171dc294d..c15fb64474 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,8 +10,8 @@ import ( pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 0f0afff2bf..bbf987e5f7 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,8 +4,8 @@ import ( "testing" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - dhtpb "gx/ipfs/QmaWzyiqs7sUayh2G1EaovupWrA1qdKXqRMYA97ruU1xS5/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From ff1cba37c1eda3086c478f0ab429dc8eafb4597f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 5 Nov 2016 20:10:32 -0700 Subject: [PATCH 1415/3147] update to libp2p 4.0.4 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@5fed7589280760e4a49f814053481e2500f0c875 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 747d9938db..9204a89ecb 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmVN76ekoYakYa8WVDwhkUsnjt2MYuFpQs1uuU57T5KMD8/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmQfvKShQ2v7nkfCE4ygisxpcSBFvBYaorQ54SibY6PGXV/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ) From 01f8f836d1717f95a9dfb4ee3e81442cb23b72d3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 5 Nov 2016 20:10:32 -0700 Subject: [PATCH 1416/3147] update to libp2p 4.0.4 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@9e0faefb3f5aecf7828f364f124b707bc6235641 --- routing/mock/dht.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index c39c97fe94..298f8cdefc 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmVN76ekoYakYa8WVDwhkUsnjt2MYuFpQs1uuU57T5KMD8/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmQfvKShQ2v7nkfCE4ygisxpcSBFvBYaorQ54SibY6PGXV/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - dht "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index fe09c4cc28..f677958755 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -11,11 +11,11 @@ import ( routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 3b989fb0da..cf46dd69c4 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,8 +2,8 @@ package proxy import ( context "context" + dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmdysBu77i3YaagNtMAjiCJdeWWvds18ho5XEB784guQ41/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 22aa5711ea..cecca688b3 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,11 +6,11 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" host "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmdysBu77i3YaagNtMAjiCJdeWWvds18ho5XEB784guQ41/go-libp2p-net" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index c15fb64474..7a81c6629f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -7,11 +7,11 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" context "context" + dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index bbf987e5f7..57816bf5d6 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,9 +3,9 @@ package supernode import ( "testing" + dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dhtpb "gx/ipfs/Qmct31kwWeGYkbwGmKPvUVp4BGsydhtkk69iM6NSGiJkfR/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 9a989442e7cd6463a7473cf7d6ed03e823c8b38a Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sun, 11 Sep 2016 05:09:43 +0200 Subject: [PATCH 1417/3147] coreapi: get going, add Cat() and Ls() License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/interface-go-ipfs-core@d6cc518f50f331dfd20dc79e87319f307fa2b5e7 --- coreiface/interface.go | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 coreiface/interface.go diff --git a/coreiface/interface.go b/coreiface/interface.go new file mode 100644 index 0000000000..694a116a52 --- /dev/null +++ b/coreiface/interface.go @@ -0,0 +1,56 @@ +package iface + +import ( + "context" + "errors" + "io" + + cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" +) + +// type CoreAPI interface { +// ID() CoreID +// Version() CoreVersion +// } + +type Link struct { + Name string + Size uint64 + Cid *cid.Cid +} + +type Reader interface { + io.ReadSeeker + io.Closer +} + +type UnixfsAPI interface { + Cat(context.Context, string) (Reader, error) + Ls(context.Context, string) ([]*Link, error) +} + +// type ObjectAPI interface { +// New() (cid.Cid, Object) +// Get(string) (Object, error) +// Links(string) ([]*Link, error) +// Data(string) (Reader, error) +// Stat(string) (ObjectStat, error) +// Put(Object) (cid.Cid, error) +// SetData(string, Reader) (cid.Cid, error) +// AppendData(string, Data) (cid.Cid, error) +// AddLink(string, string, string) (cid.Cid, error) +// RmLink(string, string) (cid.Cid, error) +// } + +// type ObjectStat struct { +// Cid cid.Cid +// NumLinks int +// BlockSize int +// LinksSize int +// DataSize int +// CumulativeSize int +// } + +var ErrIsDir = errors.New("object is a directory") +var ErrIsNonDag = errors.New("not a merkledag object") +var ErrOffline = errors.New("can't resolve, ipfs node is offline") From b83c5e3fc362276e9bfa6a34848598556289bdfa Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Tue, 20 Sep 2016 04:30:43 +0200 Subject: [PATCH 1418/3147] coreapi: add Add() License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/interface-go-ipfs-core@87e9bc0419bdabee9aa6534e53a669484ac2e706 --- coreiface/interface.go | 1 + 1 file changed, 1 insertion(+) diff --git a/coreiface/interface.go b/coreiface/interface.go index 694a116a52..297e8bfede 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -25,6 +25,7 @@ type Reader interface { } type UnixfsAPI interface { + Add(context.Context, io.Reader) (*cid.Cid, error) Cat(context.Context, string) (Reader, error) Ls(context.Context, string) ([]*Link, error) } From 54a9bc53742ad876e1b9705c10b50fc47d58377d Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sun, 30 Oct 2016 03:09:48 +0100 Subject: [PATCH 1419/3147] coreapi: reuse go-ipld-node.Link License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/interface-go-ipfs-core@c34bbcac7cbf4b4b075dac8474dad72ef4b6063b --- coreiface/interface.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 297e8bfede..18328a2a09 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,6 +5,7 @@ import ( "errors" "io" + ipld "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ) @@ -13,11 +14,7 @@ import ( // Version() CoreVersion // } -type Link struct { - Name string - Size uint64 - Cid *cid.Cid -} +type Link ipld.Link type Reader interface { io.ReadSeeker From fdf795607b140caba491ac6c0845389a5c81e6fc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 10 Nov 2016 17:38:10 -0800 Subject: [PATCH 1420/3147] update to go-libp2p 4.1.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@2f06e829e1a0d980d4b2343b4e0d12989fbaca8f --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 9204a89ecb..3ac209038c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmQfvKShQ2v7nkfCE4ygisxpcSBFvBYaorQ54SibY6PGXV/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmUYzZRJcuUxLSnSzF1bSyw1jYbNAULkBrbS6rnr7F72uK/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ) From e2cefebdc955a5b59c4a54f454446fe6a2441a8c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 10 Nov 2016 17:38:10 -0800 Subject: [PATCH 1421/3147] update to go-libp2p 4.1.0 License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@9cab2bab02910d5e25176a37af5393c5ba0a01cc --- routing/mock/dht.go | 4 ++-- routing/none/none_client.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 298f8cdefc..382df6fcae 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,8 +3,8 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmQfvKShQ2v7nkfCE4ygisxpcSBFvBYaorQ54SibY6PGXV/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmUYzZRJcuUxLSnSzF1bSyw1jYbNAULkBrbS6rnr7F72uK/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 71737b8e93..a2e7fab796 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -8,9 +8,9 @@ import ( routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - p2phost "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + p2phost "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index f677958755..ad4d3d642b 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -11,11 +11,11 @@ import ( routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" - "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" + "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index cf46dd69c4..66974c0458 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,9 +2,9 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmU3pGGVT1riXp5dBJbNrGpxssVScfvk9236drRHZZbKJ1/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - inet "gx/ipfs/QmdysBu77i3YaagNtMAjiCJdeWWvds18ho5XEB784guQ41/go-libp2p-net" + dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index cecca688b3..75ec2dd4db 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,12 +6,12 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmU3pGGVT1riXp5dBJbNrGpxssVScfvk9236drRHZZbKJ1/go-libp2p-net" kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" - host "gx/ipfs/QmWf338UyG5DKyemvoFiomDPtkVNHLsw3GAt9XXHX5ZtsM/go-libp2p-host" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - inet "gx/ipfs/QmdysBu77i3YaagNtMAjiCJdeWWvds18ho5XEB784guQ41/go-libp2p-net" + dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" + host "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 7a81c6629f..58cbc32e2a 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -7,10 +7,10 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" context "context" - dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 57816bf5d6..eda46cabc2 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmTmmre42AYNbLX7N9nt7qo3DHVmRZ6ZoGisrYcCsBYuVw/go-libp2p-kad-dht/pb" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" + dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From af6044b5d6f3ac201c65ad43a6a64905ace911a6 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 14 Nov 2016 01:49:39 -0500 Subject: [PATCH 1422/3147] blockstore: fix TODO and avoid calling ds.NewKey License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@970d14cd1e0d257e0d53eb0e7b7536da81fbf704 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 274c1ee7b4..004a5bf1f7 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -196,7 +196,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) } // need to convert to key.Key using key.KeyFromDsKey. - c, err := dshelp.DsKeyToCid(ds.NewKey(e.Key)) // TODO: calling NewKey isnt free + c, err := dshelp.DsKeyStringToCid(e.Key) if err != nil { log.Warningf("error parsing key from DsKey: ", err) return nil, true From 65ba3494f68e1ac31943dc8d7e59127917f77991 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 14 Nov 2016 01:49:39 -0500 Subject: [PATCH 1423/3147] blockstore: fix TODO and avoid calling ds.NewKey License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-ds-help@08888f5e463874f643bf39b0d5318fc374dce4e2 --- datastore/dshelp/key.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 20308d7045..1f2248a223 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -26,3 +26,11 @@ func DsKeyToCid(dsKey ds.Key) (*cid.Cid, error) { } return cid.Cast(kb) } + +func DsKeyStringToCid(dsKey string) (*cid.Cid, error) { + kb, err := base32.RawStdEncoding.DecodeString(dsKey[1:]) + if err != nil { + return nil, err + } + return cid.Cast(kb) +} From 0058db4cb919fe860f74bf2745172c112b965bb9 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 14 Nov 2016 16:57:40 -0500 Subject: [PATCH 1424/3147] blockstore: remove expensive debug statement in AllKeysChan License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@fb2b28398795ff1b8df0a55e04657ee68e82ed44 --- blockstore/blockstore.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 274c1ee7b4..bd944fc545 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -202,8 +202,6 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return nil, true } - log.Debug("blockstore: query got key", c) - return c, true } } From 725744b25edc198fc3d04e1ebeb6040cf86b2441 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1425/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@7cf2f1e00c7fe49a740df1dc3d3d9adc128df3e2 --- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 2 +- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 8 ++++---- unixfs/test/utils.go | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 2d25895f13..61276e5b88 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -12,7 +12,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index df2f18b403..1fe8fbd99c 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -5,7 +5,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) type directoryBuilder struct { diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index a796c6bb71..80d51773c4 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -6,7 +6,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" ) func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 63afd33e78..4de446bce8 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -15,9 +15,9 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") @@ -53,7 +53,7 @@ func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, s } return &DagModifier{ - curNode: pbn.Copy(), + curNode: pbn.Copy().(*mdag.ProtoNode), dagserv: serv, splitter: spl, ctx: ctx, @@ -373,7 +373,7 @@ func (dm *DagModifier) GetNode() (*mdag.ProtoNode, error) { if err != nil { return nil, err } - return dm.curNode.Copy(), nil + return dm.curNode.Copy().(*mdag.ProtoNode), nil } // HasChanges returned whether or not there are unflushed changes to this dag diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 4b1ef7c490..d4eb010207 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,7 +14,7 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) From aeeb14818886cbfebe60809988b6b2170d6ed5a7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1426/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@9569d2e0c091d1ca0565c20b45b15383c2778dcf --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 87294190d8..eb4408294c 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index d23f66fb2b..6883589b60 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,7 +14,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 727270504e..3e108e6b4b 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,10 +11,10 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" diff --git a/namesys/routing.go b/namesys/routing.go index eb9652e7a2..c785320136 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -12,12 +12,12 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) From bfa20138bc3037207a8ea55d67651e93ee315375 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1427/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@3a846ff3c61df384ccf082a92c6111989c8dc6d3 --- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/supernode/client.go | 6 +++--- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 753f8bc860..4b78d535c4 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,14 +8,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ma "gx/ipfs/QmUAQaWbKxGCUTuoQVvvicbQNZ9APF5pDGWyAZSe93AtKH/go-multiaddr" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 424f3ea583..6ba6bb6caa 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,9 +9,9 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 2cd9855c3d..013a958844 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -9,8 +9,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 382df6fcae..7f9d864b56 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -4,7 +4,7 @@ import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" mocknet "gx/ipfs/QmUYzZRJcuUxLSnSzF1bSyw1jYbNAULkBrbS6rnr7F72uK/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht" + dht "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index a297165638..63e893c4e3 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,10 +10,10 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index a2e7fab796..62f46dadce 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" p2phost "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index b675cbec54..dc86585c12 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,12 +7,12 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index ad4d3d642b..33b01a1348 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,14 +8,14 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - routing "gx/ipfs/QmQKEgGgYCDyk8VNY6A65FpuE4YwbspvjXHco1rdb75PVc/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 66974c0458..690011d664 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -4,7 +4,7 @@ import ( context "context" inet "gx/ipfs/QmU3pGGVT1riXp5dBJbNrGpxssVScfvk9236drRHZZbKJ1/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 75ec2dd4db..9221699248 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -10,7 +10,7 @@ import ( kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" host "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 58cbc32e2a..71e59d4be0 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,7 +10,7 @@ import ( pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index eda46cabc2..83dfd9aa4c 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - dhtpb "gx/ipfs/QmaQrN5Gi5jz2ViKuJ5PU2LXV79D6vGuH7eVQnwxpoRqrd/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From a726738979f4d056fe3c35b191f9830eb06e9c7c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1428/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@943dbbe0d853384c9cd7c8cee3e950739011f22b --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index d2607bdbef..c09480ea81 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,7 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 2263d51116..f83aa40d87 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,9 +12,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 65c480ab84..a0e7d88ab3 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,10 +10,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" context "context" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 2d7566b77d..02a279bf95 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -13,10 +13,10 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 3a33219ac7..7d69f4ce4b 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -9,7 +9,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" mdtest "github.com/ipfs/go-ipfs/merkledag/test" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func ignoreCids(_ *cid.Cid) {} From f2f7bfa8581d42acd5193d13165e65f647f68a02 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1429/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@a8365a42815401d426e017eb6ddf94ab0351720c --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index dbc67189a9..e9f300df9b 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index e284ce1364..2c57eff423 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -10,8 +10,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index 68e67b36a5..bf13fac0a5 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,7 +9,7 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) From 9f7a17cc3eca10af79fb0e0c4ff2468fba375ecb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1430/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@65a4ab2e346731f2dd53b7f373ad671b0bb2d8b7 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 1f2248a223..5e89209f55 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,9 +1,9 @@ package dshelp import ( - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) // TODO: put this code into the go-datastore itself From 0fbb197434a311e38b0a9c931510e16a3a5c17c9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1431/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@07f1af9aa37d454a502caead140e37edd088cad6 --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 2 +- blockstore/blockstore_test.go | 2 +- blockstore/bloom_cache.go | 2 +- blockstore/util/remove.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 8bc74436c6..145dbe0113 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -7,8 +7,8 @@ import ( "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) type arccache struct { diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 0f7823c5cc..7a977680a9 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -6,9 +6,9 @@ import ( "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index ecc54bb909..953737f9c9 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,10 +12,10 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsns "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/namespace" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index abe8a1a72d..23e754ed74 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -9,11 +9,11 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 3febffd01e..a0ef903337 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 01f2ce44e3..1c8f0c31e9 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,8 +6,8 @@ import ( bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) // RemovedBlock is used to respresent the result of removing a block. From f9d92ae74d60501fa02c072d1f7cc581c8ce675d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1432/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@6faf71a6925b8cd92d4b146eae48de7362c69dd9 --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 8f1d069ab1..ae5bec1938 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 4aae38bef1..813a6ff96b 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -12,10 +12,10 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func newObject(data []byte) blocks.Block { From 4f28fc777233e298a426081032b35501ea5ae8eb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1433/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/interface-go-ipfs-core@23f95c6d1e4016ab5a01c9339b3926fdace37198 --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 18328a2a09..c1c83fa26f 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - ipld "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + ipld "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) // type CoreAPI interface { From 257528d9f73471bc9c6530c1bca81422bb26ca78 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1434/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@c5598ad4b658de5ba60d75d8251f793df230a091 --- mfs/dir.go | 6 +++--- mfs/file.go | 2 +- mfs/mfs_test.go | 4 ++-- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index e425a6094e..3ff28f5fdf 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -14,7 +14,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" ) var ErrNotYetImplemented = errors.New("not yet implemented") @@ -86,7 +86,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { return nil, err } - return d.node.Copy(), nil + return d.node.Copy().(*dag.ProtoNode), nil } func (d *Directory) updateChild(name string, nd node.Node) error { @@ -411,5 +411,5 @@ func (d *Directory) GetNode() (node.Node, error) { return nil, err } - return d.node.Copy(), nil + return d.node.Copy().(*dag.ProtoNode), nil } diff --git a/mfs/file.go b/mfs/file.go index 72be2117af..65b9f6cc7d 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 04513d3e3c..22fa3f7743 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index a27eb7d4ac..0df5704636 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 6cb38850ad..f56b5a84d6 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index a565d7346b..bb1f4baf03 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,8 +19,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From 6791b43841c5f69f6f590ce79c2eb89b6da24d6c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1435/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@2ac36f5a30c1892e8dd71077b317e2a0a6ccab39 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 5017cc8dfc..b0df47f13b 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 3ec1478e85..7b3cc1ee9f 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From c20bfadda94de1b8715395c9d7c5238f23ab4bf0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 18:00:49 -0800 Subject: [PATCH 1436/3147] update to newer ipld node interface with Copy and better Tree License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@ace823f6a9d766e8cb8137dd34e2ddae71f1b9b3 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index caf3720011..1ee0eaf0e0 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmXfiyr2RWEXpVDdaYnD2HNiBk6UBddsvEP4RPfXb6nGqY/go-cid" + cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From 90e71bd1621e71691ae866044c726bb1fb0098b2 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 21 Nov 2016 17:12:49 +0100 Subject: [PATCH 1437/3147] Make unixio.DagReader an interface License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@b736dc15fa72acd2dd0fee86ece4c6b288c95f96 --- unixfs/io/dagreader.go | 35 +++++++++++++++++++++-------------- unixfs/io/dagreader_test.go | 2 +- unixfs/mod/dagmodifier.go | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 61276e5b88..da1fd65c82 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -20,8 +20,15 @@ var ErrIsDir = errors.New("this dag node is a directory") var ErrCantReadSymlinks = errors.New("cannot currently read symlinks") +type DagReader interface { + ReadSeekCloser + Size() uint64 + CtxReadFull(context.Context, []byte) (int, error) + Offset() int64 +} + // DagReader provides a way to easily read the data contained in a dag. -type DagReader struct { +type pbDagReader struct { serv mdag.DAGService // the node being read @@ -59,10 +66,10 @@ type ReadSeekCloser interface { // NewDagReader creates a new reader object that reads the data represented by // the given node, using the passed in DAGService for data retreival -func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (*DagReader, error) { +func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (DagReader, error) { switch n := n.(type) { case *mdag.RawNode: - return &DagReader{ + return &pbDagReader{ buf: NewRSNCFromBytes(n.RawData()), }, nil case *mdag.ProtoNode: @@ -101,10 +108,10 @@ func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (*DagR } } -func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *DagReader { +func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *pbDagReader { fctx, cancel := context.WithCancel(ctx) promises := mdag.GetDAG(fctx, serv, n) - return &DagReader{ + return &pbDagReader{ node: n, serv: serv, buf: NewRSNCFromBytes(pb.GetData()), @@ -117,7 +124,7 @@ func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, se // precalcNextBuf follows the next link in line and loads it from the // DAGService, setting the next buffer to read from -func (dr *DagReader) precalcNextBuf(ctx context.Context) error { +func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { dr.buf.Close() // Just to make sure if dr.linkPosition >= len(dr.promises) { return io.EOF @@ -158,22 +165,22 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error { dr.buf = NewRSNCFromBytes(nxt.RawData()) return nil default: - return errors.New("unrecognized node type in DagReader") + return errors.New("unrecognized node type in pbDagReader") } } // Size return the total length of the data from the DAG structured file. -func (dr *DagReader) Size() uint64 { +func (dr *pbDagReader) Size() uint64 { return dr.pbdata.GetFilesize() } // Read reads data from the DAG structured file -func (dr *DagReader) Read(b []byte) (int, error) { +func (dr *pbDagReader) Read(b []byte) (int, error) { return dr.CtxReadFull(dr.ctx, b) } // CtxReadFull reads data from the DAG structured file -func (dr *DagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { +func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { // If no cached buffer, load one total := 0 for { @@ -201,7 +208,7 @@ func (dr *DagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { } } -func (dr *DagReader) WriteTo(w io.Writer) (int64, error) { +func (dr *pbDagReader) WriteTo(w io.Writer) (int64, error) { // If no cached buffer, load one total := int64(0) for { @@ -226,12 +233,12 @@ func (dr *DagReader) WriteTo(w io.Writer) (int64, error) { } } -func (dr *DagReader) Close() error { +func (dr *pbDagReader) Close() error { dr.cancel() return nil } -func (dr *DagReader) Offset() int64 { +func (dr *pbDagReader) Offset() int64 { return dr.offset } @@ -239,7 +246,7 @@ func (dr *DagReader) Offset() int64 { // interface matches standard unix seek // TODO: check if we can do relative seeks, to reduce the amount of dagreader // recreations that need to happen. -func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { +func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { switch whence { case os.SEEK_SET: if offset < 0 { diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 5f1380c9e5..27d7f3b097 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -236,7 +236,7 @@ func TestReaderSzie(t *testing.T) { } } -func readByte(t testing.TB, reader *DagReader) byte { +func readByte(t testing.TB, reader DagReader) byte { out := make([]byte, 1) c, err := reader.Read(out) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 4de446bce8..943e309b8b 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -43,7 +43,7 @@ type DagModifier struct { curWrOff uint64 wrBuf *bytes.Buffer - read *uio.DagReader + read uio.DagReader } func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { From e72fadd7e80c75237e46a346d8a16cf20cceb16a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 21 Nov 2016 17:18:22 +0100 Subject: [PATCH 1438/3147] Move proto-dag reader to separate file and change name License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@72df8b2f61e0e1797257e2013d083fab0d5e43f7 --- unixfs/archive/tar/writer.go | 2 +- unixfs/io/dagreader.go | 250 +-------------------------------- unixfs/io/pbdagreader.go | 262 +++++++++++++++++++++++++++++++++++ 3 files changed, 264 insertions(+), 250 deletions(-) create mode 100644 unixfs/io/pbdagreader.go diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index f710d4063c..17c43e7170 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -64,7 +64,7 @@ func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error return err } - dagr := uio.NewDataFileReader(w.ctx, nd, pb, w.Dag) + dagr := uio.NewPBFileReader(w.ctx, nd, pb, w.Dag) if _, err := dagr.WriteTo(w.TarW); err != nil { return err } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index da1fd65c82..f893de8024 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -1,12 +1,10 @@ package io import ( - "bytes" "context" "errors" "fmt" "io" - "os" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" @@ -27,36 +25,6 @@ type DagReader interface { Offset() int64 } -// DagReader provides a way to easily read the data contained in a dag. -type pbDagReader struct { - serv mdag.DAGService - - // the node being read - node *mdag.ProtoNode - - // cached protobuf structure from node.Data - pbdata *ftpb.Data - - // the current data buffer to be read from - // will either be a bytes.Reader or a child DagReader - buf ReadSeekCloser - - // NodeGetters for each of 'nodes' child links - promises []mdag.NodeGetter - - // the index of the child link currently being read from - linkPosition int - - // current offset for the read head within the 'file' - offset int64 - - // Our context - ctx context.Context - - // context cancel for children - cancel func() -} - type ReadSeekCloser interface { io.Reader io.Seeker @@ -83,7 +51,7 @@ func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (DagRe // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File, ftpb.Data_Raw: - return NewDataFileReader(ctx, n, pb, serv), nil + return NewPBFileReader(ctx, n, pb, serv), nil case ftpb.Data_Metadata: if len(n.Links()) == 0 { return nil, errors.New("incorrectly formatted metadata object") @@ -107,219 +75,3 @@ func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (DagRe return nil, fmt.Errorf("unrecognized node type") } } - -func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *pbDagReader { - fctx, cancel := context.WithCancel(ctx) - promises := mdag.GetDAG(fctx, serv, n) - return &pbDagReader{ - node: n, - serv: serv, - buf: NewRSNCFromBytes(pb.GetData()), - promises: promises, - ctx: fctx, - cancel: cancel, - pbdata: pb, - } -} - -// precalcNextBuf follows the next link in line and loads it from the -// DAGService, setting the next buffer to read from -func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { - dr.buf.Close() // Just to make sure - if dr.linkPosition >= len(dr.promises) { - return io.EOF - } - - nxt, err := dr.promises[dr.linkPosition].Get(ctx) - if err != nil { - return err - } - dr.linkPosition++ - - switch nxt := nxt.(type) { - case *mdag.ProtoNode: - pb := new(ftpb.Data) - err = proto.Unmarshal(nxt.Data(), pb) - if err != nil { - return fmt.Errorf("incorrectly formatted protobuf: %s", err) - } - - switch pb.GetType() { - case ftpb.Data_Directory: - // A directory should not exist within a file - return ft.ErrInvalidDirLocation - case ftpb.Data_File: - dr.buf = NewDataFileReader(dr.ctx, nxt, pb, dr.serv) - return nil - case ftpb.Data_Raw: - dr.buf = NewRSNCFromBytes(pb.GetData()) - return nil - case ftpb.Data_Metadata: - return errors.New("shouldnt have had metadata object inside file") - case ftpb.Data_Symlink: - return errors.New("shouldnt have had symlink inside file") - default: - return ft.ErrUnrecognizedType - } - case *mdag.RawNode: - dr.buf = NewRSNCFromBytes(nxt.RawData()) - return nil - default: - return errors.New("unrecognized node type in pbDagReader") - } -} - -// Size return the total length of the data from the DAG structured file. -func (dr *pbDagReader) Size() uint64 { - return dr.pbdata.GetFilesize() -} - -// Read reads data from the DAG structured file -func (dr *pbDagReader) Read(b []byte) (int, error) { - return dr.CtxReadFull(dr.ctx, b) -} - -// CtxReadFull reads data from the DAG structured file -func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { - // If no cached buffer, load one - total := 0 - for { - // Attempt to fill bytes from cached buffer - n, err := dr.buf.Read(b[total:]) - total += n - dr.offset += int64(n) - if err != nil { - // EOF is expected - if err != io.EOF { - return total, err - } - } - - // If weve read enough bytes, return - if total == len(b) { - return total, nil - } - - // Otherwise, load up the next block - err = dr.precalcNextBuf(ctx) - if err != nil { - return total, err - } - } -} - -func (dr *pbDagReader) WriteTo(w io.Writer) (int64, error) { - // If no cached buffer, load one - total := int64(0) - for { - // Attempt to write bytes from cached buffer - n, err := dr.buf.WriteTo(w) - total += n - dr.offset += n - if err != nil { - if err != io.EOF { - return total, err - } - } - - // Otherwise, load up the next block - err = dr.precalcNextBuf(dr.ctx) - if err != nil { - if err == io.EOF { - return total, nil - } - return total, err - } - } -} - -func (dr *pbDagReader) Close() error { - dr.cancel() - return nil -} - -func (dr *pbDagReader) Offset() int64 { - return dr.offset -} - -// Seek implements io.Seeker, and will seek to a given offset in the file -// interface matches standard unix seek -// TODO: check if we can do relative seeks, to reduce the amount of dagreader -// recreations that need to happen. -func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { - switch whence { - case os.SEEK_SET: - if offset < 0 { - return -1, errors.New("Invalid offset") - } - - // Grab cached protobuf object (solely to make code look cleaner) - pb := dr.pbdata - - // left represents the number of bytes remaining to seek to (from beginning) - left := offset - if int64(len(pb.Data)) >= offset { - // Close current buf to close potential child dagreader - dr.buf.Close() - dr.buf = NewRSNCFromBytes(pb.GetData()[offset:]) - - // start reading links from the beginning - dr.linkPosition = 0 - dr.offset = offset - return offset, nil - } else { - // skip past root block data - left -= int64(len(pb.Data)) - } - - // iterate through links and find where we need to be - for i := 0; i < len(pb.Blocksizes); i++ { - if pb.Blocksizes[i] > uint64(left) { - dr.linkPosition = i - break - } else { - left -= int64(pb.Blocksizes[i]) - } - } - - // start sub-block request - err := dr.precalcNextBuf(dr.ctx) - if err != nil { - return 0, err - } - - // set proper offset within child readseeker - n, err := dr.buf.Seek(left, os.SEEK_SET) - if err != nil { - return -1, err - } - - // sanity - left -= n - if left != 0 { - return -1, errors.New("failed to seek properly") - } - dr.offset = offset - return offset, nil - case os.SEEK_CUR: - // TODO: be smarter here - noffset := dr.offset + offset - return dr.Seek(noffset, os.SEEK_SET) - case os.SEEK_END: - noffset := int64(dr.pbdata.GetFilesize()) - offset - return dr.Seek(noffset, os.SEEK_SET) - default: - return 0, errors.New("invalid whence") - } -} - -// readSeekNopCloser wraps a bytes.Reader to implement ReadSeekCloser -type readSeekNopCloser struct { - *bytes.Reader -} - -func NewRSNCFromBytes(b []byte) ReadSeekCloser { - return &readSeekNopCloser{bytes.NewReader(b)} -} - -func (r *readSeekNopCloser) Close() error { return nil } diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go new file mode 100644 index 0000000000..34f622bd62 --- /dev/null +++ b/unixfs/io/pbdagreader.go @@ -0,0 +1,262 @@ +package io + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "os" + + mdag "github.com/ipfs/go-ipfs/merkledag" + ft "github.com/ipfs/go-ipfs/unixfs" + ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +) + +// DagReader provides a way to easily read the data contained in a dag. +type pbDagReader struct { + serv mdag.DAGService + + // the node being read + node *mdag.ProtoNode + + // cached protobuf structure from node.Data + pbdata *ftpb.Data + + // the current data buffer to be read from + // will either be a bytes.Reader or a child DagReader + buf ReadSeekCloser + + // NodeGetters for each of 'nodes' child links + promises []mdag.NodeGetter + + // the index of the child link currently being read from + linkPosition int + + // current offset for the read head within the 'file' + offset int64 + + // Our context + ctx context.Context + + // context cancel for children + cancel func() +} + +func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *pbDagReader { + fctx, cancel := context.WithCancel(ctx) + promises := mdag.GetDAG(fctx, serv, n) + return &pbDagReader{ + node: n, + serv: serv, + buf: NewRSNCFromBytes(pb.GetData()), + promises: promises, + ctx: fctx, + cancel: cancel, + pbdata: pb, + } +} + +// precalcNextBuf follows the next link in line and loads it from the +// DAGService, setting the next buffer to read from +func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { + dr.buf.Close() // Just to make sure + if dr.linkPosition >= len(dr.promises) { + return io.EOF + } + + nxt, err := dr.promises[dr.linkPosition].Get(ctx) + if err != nil { + return err + } + dr.linkPosition++ + + switch nxt := nxt.(type) { + case *mdag.ProtoNode: + pb := new(ftpb.Data) + err = proto.Unmarshal(nxt.Data(), pb) + if err != nil { + return fmt.Errorf("incorrectly formatted protobuf: %s", err) + } + + switch pb.GetType() { + case ftpb.Data_Directory: + // A directory should not exist within a file + return ft.ErrInvalidDirLocation + case ftpb.Data_File: + dr.buf = NewPBFileReader(dr.ctx, nxt, pb, dr.serv) + return nil + case ftpb.Data_Raw: + dr.buf = NewRSNCFromBytes(pb.GetData()) + return nil + case ftpb.Data_Metadata: + return errors.New("shouldnt have had metadata object inside file") + case ftpb.Data_Symlink: + return errors.New("shouldnt have had symlink inside file") + default: + return ft.ErrUnrecognizedType + } + case *mdag.RawNode: + dr.buf = NewRSNCFromBytes(nxt.RawData()) + return nil + default: + return errors.New("unrecognized node type in pbDagReader") + } +} + +// Size return the total length of the data from the DAG structured file. +func (dr *pbDagReader) Size() uint64 { + return dr.pbdata.GetFilesize() +} + +// Read reads data from the DAG structured file +func (dr *pbDagReader) Read(b []byte) (int, error) { + return dr.CtxReadFull(dr.ctx, b) +} + +// CtxReadFull reads data from the DAG structured file +func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { + // If no cached buffer, load one + total := 0 + for { + // Attempt to fill bytes from cached buffer + n, err := dr.buf.Read(b[total:]) + total += n + dr.offset += int64(n) + if err != nil { + // EOF is expected + if err != io.EOF { + return total, err + } + } + + // If weve read enough bytes, return + if total == len(b) { + return total, nil + } + + // Otherwise, load up the next block + err = dr.precalcNextBuf(ctx) + if err != nil { + return total, err + } + } +} + +func (dr *pbDagReader) WriteTo(w io.Writer) (int64, error) { + // If no cached buffer, load one + total := int64(0) + for { + // Attempt to write bytes from cached buffer + n, err := dr.buf.WriteTo(w) + total += n + dr.offset += n + if err != nil { + if err != io.EOF { + return total, err + } + } + + // Otherwise, load up the next block + err = dr.precalcNextBuf(dr.ctx) + if err != nil { + if err == io.EOF { + return total, nil + } + return total, err + } + } +} + +func (dr *pbDagReader) Close() error { + dr.cancel() + return nil +} + +func (dr *pbDagReader) Offset() int64 { + return dr.offset +} + +// Seek implements io.Seeker, and will seek to a given offset in the file +// interface matches standard unix seek +// TODO: check if we can do relative seeks, to reduce the amount of dagreader +// recreations that need to happen. +func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { + switch whence { + case os.SEEK_SET: + if offset < 0 { + return -1, errors.New("Invalid offset") + } + + // Grab cached protobuf object (solely to make code look cleaner) + pb := dr.pbdata + + // left represents the number of bytes remaining to seek to (from beginning) + left := offset + if int64(len(pb.Data)) >= offset { + // Close current buf to close potential child dagreader + dr.buf.Close() + dr.buf = NewRSNCFromBytes(pb.GetData()[offset:]) + + // start reading links from the beginning + dr.linkPosition = 0 + dr.offset = offset + return offset, nil + } else { + // skip past root block data + left -= int64(len(pb.Data)) + } + + // iterate through links and find where we need to be + for i := 0; i < len(pb.Blocksizes); i++ { + if pb.Blocksizes[i] > uint64(left) { + dr.linkPosition = i + break + } else { + left -= int64(pb.Blocksizes[i]) + } + } + + // start sub-block request + err := dr.precalcNextBuf(dr.ctx) + if err != nil { + return 0, err + } + + // set proper offset within child readseeker + n, err := dr.buf.Seek(left, os.SEEK_SET) + if err != nil { + return -1, err + } + + // sanity + left -= n + if left != 0 { + return -1, errors.New("failed to seek properly") + } + dr.offset = offset + return offset, nil + case os.SEEK_CUR: + // TODO: be smarter here + noffset := dr.offset + offset + return dr.Seek(noffset, os.SEEK_SET) + case os.SEEK_END: + noffset := int64(dr.pbdata.GetFilesize()) - offset + return dr.Seek(noffset, os.SEEK_SET) + default: + return 0, errors.New("invalid whence") + } +} + +// readSeekNopCloser wraps a bytes.Reader to implement ReadSeekCloser +type readSeekNopCloser struct { + *bytes.Reader +} + +func NewRSNCFromBytes(b []byte) ReadSeekCloser { + return &readSeekNopCloser{bytes.NewReader(b)} +} + +func (r *readSeekNopCloser) Close() error { return nil } From 87330a25dcfcd10a2e39ba54620d5ff9cadea9cb Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 21 Nov 2016 17:49:25 +0100 Subject: [PATCH 1439/3147] Create bufDagReader License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@d6e8b60e554a4e4e72dcd3eae0fd136fd028c6fc --- unixfs/io/bufdagreader.go | 41 +++++++++++++++++++++++++++++++++++++++ unixfs/io/dagreader.go | 4 +--- unixfs/io/pbdagreader.go | 2 ++ 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 unixfs/io/bufdagreader.go diff --git a/unixfs/io/bufdagreader.go b/unixfs/io/bufdagreader.go new file mode 100644 index 0000000000..2f73586407 --- /dev/null +++ b/unixfs/io/bufdagreader.go @@ -0,0 +1,41 @@ +package io + +import ( + "bytes" + "context" + "io" +) + +type bufDagReader struct { + *bytes.Reader +} + +func NewBufDagReader(b []byte) *bufDagReader { + return &bufDagReader{bytes.NewReader(b)} +} + +var _ DagReader = (*bufDagReader)(nil) + +func (*bufDagReader) Close() error { + return nil +} + +func (rd *bufDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { + return rd.Read(b) +} + +func (rd *bufDagReader) Offset() int64 { + of, err := rd.Seek(0, io.SeekCurrent) + if err != nil { + panic("this should never happen " + err.Error()) + } + return of +} + +func (rd *bufDagReader) Size() uint64 { + s := rd.Reader.Size() + if s < 0 { + panic("size smaller than 0 (impossible!!)") + } + return uint64(s) +} diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index f893de8024..8da86b9246 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -37,9 +37,7 @@ type ReadSeekCloser interface { func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (DagReader, error) { switch n := n.(type) { case *mdag.RawNode: - return &pbDagReader{ - buf: NewRSNCFromBytes(n.RawData()), - }, nil + return NewBufDagReader(n.RawData()), nil case *mdag.ProtoNode: pb := new(ftpb.Data) if err := proto.Unmarshal(n.Data(), pb); err != nil { diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 34f622bd62..b2724e1041 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -45,6 +45,8 @@ type pbDagReader struct { cancel func() } +var _ DagReader = (*pbDagReader)(nil) + func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *pbDagReader { fctx, cancel := context.WithCancel(ctx) promises := mdag.GetDAG(fctx, serv, n) From 38ad0130453a2f53b681916898a83d7f524d523a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 18 Nov 2016 00:24:00 +0100 Subject: [PATCH 1440/3147] Update go-libp2p across codebase License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@97a5e50f21ac159bb4ec36d114023831686de064 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 3ac209038c..96b76da626 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmUYzZRJcuUxLSnSzF1bSyw1jYbNAULkBrbS6rnr7F72uK/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + mocknet "gx/ipfs/QmZyBJGpRnbQ7oUstoGNZbhXC4HJuFUCgpp8pmsVTUwdS3/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 3bfb3d6f873087e933312cee1f35c45956d6c9cf Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 18 Nov 2016 00:24:00 +0100 Subject: [PATCH 1441/3147] Update go-libp2p across codebase License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@83e9c2bdc8f92d6a639fd7264e71b63722c43fe2 --- routing/mock/dht.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 7f9d864b56..352717da69 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,8 +3,8 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmUYzZRJcuUxLSnSzF1bSyw1jYbNAULkBrbS6rnr7F72uK/go-libp2p/p2p/net/mock" - dht "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmZyBJGpRnbQ7oUstoGNZbhXC4HJuFUCgpp8pmsVTUwdS3/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht" ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 33b01a1348..385558da10 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -13,7 +13,7 @@ import ( routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 690011d664..7dc615b24b 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -4,7 +4,7 @@ import ( context "context" inet "gx/ipfs/QmU3pGGVT1riXp5dBJbNrGpxssVScfvk9236drRHZZbKJ1/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 9221699248..af843fc0c9 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -10,7 +10,7 @@ import ( kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" host "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 71e59d4be0..0efb774673 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,7 +10,7 @@ import ( pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 83dfd9aa4c..4dab1aac71 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - dhtpb "gx/ipfs/Qmap6Qnt8RRvQ1BawQw4HZKHaSJAZC5VybyapizCXGdfUK/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) From 5f1a2bfba660037c959aaef8a6e03f4c8c8558ce Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 22 Nov 2016 19:10:35 +0100 Subject: [PATCH 1442/3147] Remove NewRSNCFromBytes and use NewDagReader for recursive reading License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@b845e420de6801d6ba35c5c4ea267d4a25384ee6 --- unixfs/io/pbdagreader.go | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index b2724e1041..344ee34400 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -1,7 +1,6 @@ package io import ( - "bytes" "context" "errors" "fmt" @@ -53,7 +52,7 @@ func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv return &pbDagReader{ node: n, serv: serv, - buf: NewRSNCFromBytes(pb.GetData()), + buf: NewBufDagReader(pb.GetData()), promises: promises, ctx: fctx, cancel: cancel, @@ -91,7 +90,7 @@ func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { dr.buf = NewPBFileReader(dr.ctx, nxt, pb, dr.serv) return nil case ftpb.Data_Raw: - dr.buf = NewRSNCFromBytes(pb.GetData()) + dr.buf = NewBufDagReader(pb.GetData()) return nil case ftpb.Data_Metadata: return errors.New("shouldnt have had metadata object inside file") @@ -100,11 +99,10 @@ func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { default: return ft.ErrUnrecognizedType } - case *mdag.RawNode: - dr.buf = NewRSNCFromBytes(nxt.RawData()) - return nil default: - return errors.New("unrecognized node type in pbDagReader") + var err error + dr.buf, err = NewDagReader(ctx, nxt, dr.serv) + return err } } @@ -200,7 +198,7 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { if int64(len(pb.Data)) >= offset { // Close current buf to close potential child dagreader dr.buf.Close() - dr.buf = NewRSNCFromBytes(pb.GetData()[offset:]) + dr.buf = NewBufDagReader(pb.GetData()[offset:]) // start reading links from the beginning dr.linkPosition = 0 @@ -252,13 +250,3 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { } } -// readSeekNopCloser wraps a bytes.Reader to implement ReadSeekCloser -type readSeekNopCloser struct { - *bytes.Reader -} - -func NewRSNCFromBytes(b []byte) ReadSeekCloser { - return &readSeekNopCloser{bytes.NewReader(b)} -} - -func (r *readSeekNopCloser) Close() error { return nil } From 70ace495fbbc405713b93f5a78ab17a00eb552a1 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 23 Nov 2016 18:00:20 -0500 Subject: [PATCH 1443/3147] "block rm": make channel large enough to avoid blocking Make the channel for the output of RmBlocks large enough to hold any result to avoid blocking while holding the GCLock. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@7556923648ff10224935c60001d5ac0ec45f0254 --- blockstore/util/remove.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 1c8f0c31e9..b4375855bb 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -27,7 +27,10 @@ type RmBlocksOpts struct { Force bool } -func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid, opts RmBlocksOpts) error { +func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, cids []*cid.Cid, opts RmBlocksOpts) (<-chan interface{}, error) { + // make the channel large enough to hold any result to avoid + // blocking while holding the GCLock + out := make(chan interface{}, len(cids)) go func() { defer close(out) @@ -47,7 +50,7 @@ func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, out chan<- interface{}, c } } }() - return nil + return out, nil } func FilterPinned(pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid) []*cid.Cid { From 117256bca45ca444432fec1e2e341a6ead9a59f6 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 24 Nov 2016 20:05:01 +0100 Subject: [PATCH 1444/3147] Remove trailing new-line from pbdagreader.go License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@91871b4117ad549232001a514eed3184cef21b57 --- unixfs/io/pbdagreader.go | 1 - 1 file changed, 1 deletion(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 344ee34400..a5a53ffa25 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -249,4 +249,3 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { return 0, errors.New("invalid whence") } } - From af92c4baeb03e298c95b267253ecafd762aeb194 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 21:42:32 -0800 Subject: [PATCH 1445/3147] completely remove go-key dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@f22a7ba55d81868af412969565f2e89a374350f3 --- namesys/resolve_test.go | 10 ++++------ namesys/routing.go | 15 +++++---------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 145396d11e..78c4444f04 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -1,16 +1,15 @@ package namesys import ( + "context" "errors" "testing" "time" - context "context" path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" @@ -36,13 +35,12 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - pubkb, err := pubk.Bytes() + pid, err := peer.IDFromPublicKey(pubk) if err != nil { t.Fatal(err) } - pkhash := u.Hash(pubkb) - res, err := resolver.Resolve(context.Background(), key.Key(pkhash).B58String()) + res, err := resolver.Resolve(context.Background(), pid.Pretty()) if err != nil { t.Fatal(err) } diff --git a/namesys/routing.go b/namesys/routing.go index c785320136..8c2dc84887 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -1,21 +1,19 @@ package namesys import ( + "context" "fmt" "strings" "time" - "context" - lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" + lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" @@ -179,9 +177,6 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa } } - hsh, _ := pubkey.Hash() - log.Debugf("pk hash = %s", key.Key(hsh)) - // check sig with pk if ok, err := pubkey.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pubkey) From b0260ab74e225671ea50d8b4515a55db7f043149 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 21:42:32 -0800 Subject: [PATCH 1446/3147] completely remove go-key dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@353586cff7d87960fc6e88deaa6b3f9fadf225dd --- routing/supernode/server.go | 32 ++++++++++++++++---------------- routing/supernode/server_test.go | 3 +-- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 0efb774673..e5aaea4345 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -1,14 +1,14 @@ package supernode import ( + "context" "errors" "fmt" proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - context "context" pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" @@ -55,7 +55,7 @@ func (s *Server) handleMessage( switch req.GetType() { case dhtpb.Message_GET_VALUE: - rawRecord, err := getRoutingRecord(s.routingBackend, key.Key(req.GetKey())) + rawRecord, err := getRoutingRecord(s.routingBackend, req.GetKey()) if err != nil { return "", nil } @@ -69,7 +69,7 @@ func (s *Server) handleMessage( // log.Event(ctx, "validationFailed", req, p) // return "", nil // } - putRoutingRecord(s.routingBackend, key.Key(req.GetKey()), req.GetRecord()) + putRoutingRecord(s.routingBackend, req.GetKey(), req.GetRecord()) return p, req case dhtpb.Message_FIND_NODE: @@ -89,7 +89,7 @@ func (s *Server) handleMessage( if providerID == p { store := []*dhtpb.Message_Peer{provider} storeProvidersToPeerstore(s.peerstore, p, store) - if err := putRoutingProviders(s.routingBackend, key.Key(req.GetKey()), store); err != nil { + if err := putRoutingProviders(s.routingBackend, req.GetKey(), store); err != nil { return "", nil } } else { @@ -99,7 +99,7 @@ func (s *Server) handleMessage( return "", nil case dhtpb.Message_GET_PROVIDERS: - providers, err := getRoutingProviders(s.routingBackend, key.Key(req.GetKey())) + providers, err := getRoutingProviders(s.routingBackend, req.GetKey()) if err != nil { return "", nil } @@ -116,8 +116,8 @@ func (s *Server) handleMessage( var _ proxy.RequestHandler = &Server{} var _ proxy.Proxy = &Server{} -func getRoutingRecord(ds datastore.Datastore, k key.Key) (*pb.Record, error) { - dskey := k.DsKey() +func getRoutingRecord(ds datastore.Datastore, k string) (*pb.Record, error) { + dskey := dshelp.NewKeyFromBinary(k) val, err := ds.Get(dskey) if err != nil { return nil, err @@ -133,12 +133,12 @@ func getRoutingRecord(ds datastore.Datastore, k key.Key) (*pb.Record, error) { return &record, nil } -func putRoutingRecord(ds datastore.Datastore, k key.Key, value *pb.Record) error { +func putRoutingRecord(ds datastore.Datastore, k string, value *pb.Record) error { data, err := proto.Marshal(value) if err != nil { return err } - dskey := k.DsKey() + dskey := dshelp.NewKeyFromBinary(k) // TODO namespace if err := ds.Put(dskey, data); err != nil { return err @@ -146,8 +146,8 @@ func putRoutingRecord(ds datastore.Datastore, k key.Key, value *pb.Record) error return nil } -func putRoutingProviders(ds datastore.Datastore, k key.Key, newRecords []*dhtpb.Message_Peer) error { - log.Event(context.Background(), "putRoutingProviders", &k) +func putRoutingProviders(ds datastore.Datastore, k string, newRecords []*dhtpb.Message_Peer) error { + log.Event(context.Background(), "putRoutingProviders") oldRecords, err := getRoutingProviders(ds, k) if err != nil { return err @@ -185,8 +185,8 @@ func storeProvidersToPeerstore(ps pstore.Peerstore, p peer.ID, providers []*dhtp } } -func getRoutingProviders(ds datastore.Datastore, k key.Key) ([]*dhtpb.Message_Peer, error) { - e := log.EventBegin(context.Background(), "getProviders", &k) +func getRoutingProviders(ds datastore.Datastore, k string) ([]*dhtpb.Message_Peer, error) { + e := log.EventBegin(context.Background(), "getProviders") defer e.Done() var providers []*dhtpb.Message_Peer if v, err := ds.Get(providerKey(k)); err == nil { @@ -201,8 +201,8 @@ func getRoutingProviders(ds datastore.Datastore, k key.Key) ([]*dhtpb.Message_Pe return providers, nil } -func providerKey(k key.Key) datastore.Key { - return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()}) +func providerKey(k string) datastore.Key { + return datastore.KeyWithNamespaces([]string{"routing", "providers", k}) } func verify(ps pstore.Peerstore, r *pb.Record) error { diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 4dab1aac71..180acbf3d0 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,14 +3,13 @@ package supernode import ( "testing" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { routingBackend := datastore.NewMapDatastore() - k := key.Key("foo") + k := "foo" put := []*dhtpb.Message_Peer{ convPeer("bob", "127.0.0.1/tcp/4001"), convPeer("alice", "10.0.0.10/tcp/4001"), From f22026c4e7fc926075d267b2e20d0e92e6991f8c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 21:42:32 -0800 Subject: [PATCH 1447/3147] completely remove go-key dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@6b9e0880d4e8871f9dd4d073f18f8c43c1608ef8 --- pinning/pinner/indirect.go | 39 -------------------------------------- pinning/pinner/set.go | 9 --------- 2 files changed, 48 deletions(-) delete mode 100644 pinning/pinner/indirect.go diff --git a/pinning/pinner/indirect.go b/pinning/pinner/indirect.go deleted file mode 100644 index b30a7c22d5..0000000000 --- a/pinning/pinner/indirect.go +++ /dev/null @@ -1,39 +0,0 @@ -package pin - -import ( - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" -) - -type indirectPin struct { - refCounts map[key.Key]uint64 -} - -func newIndirectPin() *indirectPin { - return &indirectPin{ - refCounts: make(map[key.Key]uint64), - } -} - -func (i *indirectPin) Increment(k key.Key) { - i.refCounts[k]++ -} - -func (i *indirectPin) Decrement(k key.Key) { - if i.refCounts[k] == 0 { - log.Warningf("pinning: bad call: asked to unpin nonexistent indirect key: %v", k) - return - } - i.refCounts[k]-- - if i.refCounts[k] == 0 { - delete(i.refCounts, k) - } -} - -func (i *indirectPin) HasKey(k key.Key) bool { - _, found := i.refCounts[k] - return found -} - -func (i *indirectPin) GetRefs() map[key.Key]uint64 { - return i.refCounts -} diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 02a279bf95..f84a57a278 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -14,7 +14,6 @@ import ( "github.com/ipfs/go-ipfs/pin/internal/pb" node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" - "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" ) @@ -308,11 +307,3 @@ func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, in internalKeys(c) return n, nil } - -func copyRefcounts(orig map[key.Key]uint64) map[key.Key]uint64 { - r := make(map[key.Key]uint64, len(orig)) - for k, v := range orig { - r[k] = v - } - return r -} From fc08a836401cd18020c428e58f05693584a4fd5d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 21:42:32 -0800 Subject: [PATCH 1448/3147] completely remove go-key dep License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@2c94649950b491ca4dea4d3de2c367793bd6df84 --- path/resolver_test.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/path/resolver_test.go b/path/resolver_test.go index bf13fac0a5..b05c0393c3 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -10,25 +10,23 @@ import ( path "github.com/ipfs/go-ipfs/path" node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" - key "gx/ipfs/QmYEoKZXHoAToWfhGF3vryhMn3WWhE1o2MasQ8uzY5iDi9/go-key" util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) -func randNode() (*merkledag.ProtoNode, key.Key) { +func randNode() *merkledag.ProtoNode { node := new(merkledag.ProtoNode) node.SetData(make([]byte, 32)) util.NewTimeSeededRand().Read(node.Data()) - k := node.Key() - return node, k + return node } func TestRecurivePathResolution(t *testing.T) { ctx := context.Background() dagService := dagmock.Mock() - a, _ := randNode() - b, _ := randNode() - c, cKey := randNode() + a := randNode() + b := randNode() + c := randNode() err := b.AddNodeLink("grandchild", c) if err != nil { @@ -47,7 +45,7 @@ func TestRecurivePathResolution(t *testing.T) { } } - aKey := a.Key() + aKey := a.Cid() segments := []string{aKey.String(), "child", "grandchild"} p, err := path.FromSegments("/ipfs/", segments...) @@ -61,6 +59,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } + cKey := c.Cid() key := node.Cid() if key.String() != cKey.String() { t.Fatal(fmt.Errorf( From 9a756692d97f4ef297c87b094953a3ff94b4d22c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1449/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@f89d2c11bec95194f6e093e32ab9835b10b263c3 --- namesys/namesys.go | 4 ++-- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index eb4408294c..d2f4a3bf7a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,8 +6,8 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 6883589b60..345f21e339 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,10 +14,10 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 3e108e6b4b..9abe8688e1 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,14 +11,14 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" recpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 96b76da626..ff456593d1 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - mocknet "gx/ipfs/QmZyBJGpRnbQ7oUstoGNZbhXC4HJuFUCgpp8pmsVTUwdS3/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmbzCT1CwxVZ2ednptC9RavuJe7Bv8DDi2Ne89qUrA37XM/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 78c4444f04..f7d41ead40 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,8 +10,8 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/namesys/routing.go b/namesys/routing.go index 8c2dc84887..859da7d604 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -10,12 +10,12 @@ import ( path "github.com/ipfs/go-ipfs/path" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) From 937a097813cef8beab10380b5a73d0768e5ad2e9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1450/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@7c7f24a9a3af360204188faa817a867fb36cda1f --- routing/mock/centralized_client.go | 8 ++++---- routing/mock/centralized_server.go | 8 ++++---- routing/mock/centralized_test.go | 4 ++-- routing/mock/dht.go | 8 ++++---- routing/mock/interface.go | 8 ++++---- routing/none/none_client.go | 8 ++++---- routing/offline/offline.go | 8 ++++---- routing/supernode/client.go | 10 +++++----- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 10 +++++----- routing/supernode/server.go | 6 +++--- routing/supernode/server_test.go | 4 ++-- 12 files changed, 43 insertions(+), 43 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 4b78d535c4..1a413ab9c1 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,15 +8,15 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ma "gx/ipfs/QmUAQaWbKxGCUTuoQVvvicbQNZ9APF5pDGWyAZSe93AtKH/go-multiaddr" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 6ba6bb6caa..041a8ad29f 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 013a958844..13c3708d66 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,9 +8,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 352717da69..fa2b666d2a 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmZyBJGpRnbQ7oUstoGNZbhXC4HJuFUCgpp8pmsVTUwdS3/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + dht "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + mocknet "gx/ipfs/QmbzCT1CwxVZ2ednptC9RavuJe7Bv8DDi2Ne89qUrA37XM/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 63e893c4e3..28217d600b 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,10 +10,10 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 62f46dadce..cd6ceec030 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( repo "github.com/ipfs/go-ipfs/repo" + p2phost "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" - p2phost "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index dc86585c12..1e3297bb39 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,14 +7,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 385558da10..fe642d2621 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,15 +8,15 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" + "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - routing "gx/ipfs/QmUrCwTDvJgmBbJVHu1HGEyqDaod3dR6sEkZkpxZk4u47c/go-libp2p-routing" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" - "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 7dc615b24b..da73fee7fb 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,9 +2,9 @@ package proxy import ( context "context" - inet "gx/ipfs/QmU3pGGVT1riXp5dBJbNrGpxssVScfvk9236drRHZZbKJ1/go-libp2p-net" + dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index af843fc0c9..fa619ff323 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,14 +4,14 @@ import ( "context" "errors" + dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" + host "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" + inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" + kbucket "gx/ipfs/QmRVHVr38ChANF2PUMNKQs7Q4uVWCLVabrfcTG9taNbcVy/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - inet "gx/ipfs/QmU3pGGVT1riXp5dBJbNrGpxssVScfvk9236drRHZZbKJ1/go-libp2p-net" - kbucket "gx/ipfs/QmUKePKcUEXwdvJENZJ6z8mJjPaxLsDZ3V9CZjPPtyawPm/go-libp2p-kbucket" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" - host "gx/ipfs/Qmb6UFbVu1grhv5o5KnouvtZ6cqdrjXj6zLejAHWunxgCt/go-libp2p-host" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index e5aaea4345..6c96cbc2e2 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,12 +8,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - pstore "gx/ipfs/QmXXCcQ7CLg5a81Ui9TTR35QcR4y7ZyihxwfjqaHfUVcVo/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" + datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" - datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" + pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 180acbf3d0..3f65808c9a 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmaMRCpeKL34rdT7t3bEndrENbVdD6gcCZr3YdkDUk6jue/go-libp2p-kad-dht/pb" - datastore "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" + dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" + datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 071255c104615fbab260bd870aec34665de075cc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1451/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@764e5c7cd3b92cd38d9d6af8073de4ca510f02ca --- datastore/dshelp/key.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 5e89209f55..256cb15922 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,9 +1,9 @@ package dshelp import ( - base32 "gx/ipfs/Qmb1DA2A9LS2wR4FFweB4uEDomFsdmnw1VLawLE1yQzudj/base32" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) // TODO: put this code into the go-datastore itself From b18a7ee46f7039005eb38ef5630f3cdca0f0e0a8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1452/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@0434e61ca23776c1d73d868b4ee291de8c553029 --- blockstore/arc_cache.go | 4 ++-- blockstore/arc_cache_test.go | 6 +++--- blockstore/blockstore.go | 8 ++++---- blockstore/blockstore_test.go | 8 ++++---- blockstore/bloom_cache.go | 2 +- blockstore/bloom_cache_test.go | 6 +++--- blockstore/util/remove.go | 4 ++-- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 145dbe0113..d4b85136f0 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -5,10 +5,10 @@ import ( "github.com/ipfs/go-ipfs/blocks" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) type arccache struct { diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 7a977680a9..7e59a49df9 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -6,9 +6,9 @@ import ( "github.com/ipfs/go-ipfs/blocks" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 953737f9c9..40763276b7 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -11,11 +11,11 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" + dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dsns "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/namespace" - dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 23e754ed74..0ea102b2ba 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -9,11 +9,11 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" - ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index a0ef903337..7d234b3fc3 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 72223cd44e..7941a647c0 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -9,9 +9,9 @@ import ( "github.com/ipfs/go-ipfs/blocks" context "context" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dsq "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/query" - syncds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" ) func testBloomCached(bs Blockstore, ctx context.Context) (*bloomcache, error) { diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 1c8f0c31e9..3b87a1de5a 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,8 +6,8 @@ import ( bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) // RemovedBlock is used to respresent the result of removing a block. From e747adfea4ba0725bcb62ed46c4db2d4571034ba Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1453/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@b4c08b0e5b4bfb8cbc69b6173a99e3ed11fc8b4f --- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 2 +- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 4 ++-- unixfs/test/utils.go | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8da86b9246..aded131dc2 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 1fe8fbd99c..569ee371f0 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -5,7 +5,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) type directoryBuilder struct { diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 80d51773c4..9603b08dc5 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -6,7 +6,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" ) func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 943e309b8b..356a5b1e9b 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,10 +14,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 9c7ac89d7b..fdeabbbb29 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -17,9 +17,9 @@ import ( testu "github.com/ipfs/go-ipfs/unixfs/test" context "context" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" ) func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore) { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index d4eb010207..7b9775cff2 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,7 +14,7 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) From 0c1d2f6b444adb1f14560a935f48c409e4b20f92 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1454/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@d0390c91ccc4a505486a34849d57e0cfc1f645ef --- blockservice/blockservice.go | 2 +- blockservice/blockservice_test.go | 4 ++-- blockservice/test/blocks_test.go | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index ae5bec1938..d05a013555 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 0415f8213d..a97c315ba6 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -8,8 +8,8 @@ import ( butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 813a6ff96b..ed700d46f8 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -12,10 +12,10 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func newObject(data []byte) blocks.Block { From bc3f5df70df5e51a2f7c22b6d7175340f4bc08c1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1455/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@235ff52e67024c1c84d83dac7efba25cd71f68ff --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 6 +++--- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index c09480ea81..cc85d99790 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,7 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index f83aa40d87..baf0d59585 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -11,10 +11,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index a0e7d88ab3..90bbc52139 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,10 +10,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" context "context" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index f84a57a278..89791b1b60 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -13,9 +13,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 7d69f4ce4b..c409fae4b9 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -9,7 +9,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" mdtest "github.com/ipfs/go-ipfs/merkledag/test" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func ignoreCids(_ *cid.Cid) {} From 4210265e4dcb474b826ada83b2a0145c75305e59 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1456/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@c981bb52ad5c57b59c9be0dfed6f7b1421e01030 --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index e9f300df9b..550368ad82 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 2c57eff423..fb472953ee 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index b05c0393c3..93f3ff7c49 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,7 +9,7 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" ) From da6ace83a4549449f1c3f08748d0906d0bfeee37 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1457/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/interface-go-ipfs-core@3f68a10d21f3553c4639f477388b3b36492912a2 --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index c1c83fa26f..cf64719476 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - ipld "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + ipld "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) // type CoreAPI interface { From b68906032f58cedbe0401b0f8bce9e0d7d0607a5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1458/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@3a7f9b09f6da9fe3f5107bcda73ab5ca4a7c8f81 --- mfs/dir.go | 2 +- mfs/file.go | 2 +- mfs/mfs_test.go | 8 ++++---- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 3ff28f5fdf..ec6de0a45b 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -14,7 +14,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 65b9f6cc7d..b61380d77a 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 22fa3f7743..7b19f50b3b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - dssync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 0df5704636..d71109226f 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index f56b5a84d6..2b8acea73e 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index bb1f4baf03..0578166af6 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -18,9 +18,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmUsVJ7AEnGyjX8YWnrwq9vmECVGwBQNAKPpgz5KSg8dcq/go-ipld-node" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From f867cf89df35bdcb8009c444d19cbae0b05617d7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1459/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@4c9286a80e68ce2636a592f3693d9e20634631e3 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index b0df47f13b..0fae10da69 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 7b3cc1ee9f..08c4aaf879 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ds "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore" - ds_sync "gx/ipfs/QmbzuUusHqaLLoNTDEVLcSF6vZDHZDLPC7p4bztRvvkXxU/go-datastore/sync" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From d152fab36757862e7bdf332ad18d30741334c8dd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 28 Nov 2016 22:29:38 -0800 Subject: [PATCH 1460/3147] bubble up go-datastore deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@cf6f27e29a938eba19ca56542e3a8c5fe30aa1ff --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 1ee0eaf0e0..62e22c38d2 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmcEcrBAMrwMyhSjXt4yfyPpzgSuV8HLHavnfmiKCSRqZU/go-cid" + cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From 75981c86d1b56cfd8a15f8231cb761225bd7ba6b Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 21 Nov 2016 21:33:28 -0500 Subject: [PATCH 1461/3147] ds-help: avoid unnecessary allocs when posssible and make use of RawKey License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@02ca16d30272a72916ea71c725b8a42b13a598b0 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 40763276b7..9e5d8ca809 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -196,7 +196,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) } // need to convert to key.Key using key.KeyFromDsKey. - c, err := dshelp.DsKeyStringToCid(e.Key) + c, err := dshelp.DsKeyToCid(ds.RawKey(e.Key)) if err != nil { log.Warningf("error parsing key from DsKey: ", err) return nil, true From 778a8e5806853c3bcf6c6a237265cec6608a49ed Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 21 Nov 2016 21:33:28 -0500 Subject: [PATCH 1462/3147] ds-help: avoid unnecessary allocs when posssible and make use of RawKey License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@22f525be5590c82bb80b508d32ad046968a81432 --- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 345f21e339..795023c83c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -80,7 +80,7 @@ func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value } func (p *ipnsPublisher) getPreviousSeqNo(ctx context.Context, ipnskey string) (uint64, error) { - prevrec, err := p.ds.Get(dshelp.NewKeyFromBinary(ipnskey)) + prevrec, err := p.ds.Get(dshelp.NewKeyFromBinary([]byte(ipnskey))) if err != nil && err != ds.ErrNotFound { // None found, lets start at zero! return 0, err diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 9abe8688e1..e4e0bdc928 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -108,7 +108,7 @@ func (rp *Republisher) republishEntries(p goprocess.Process) error { } func (rp *Republisher) getLastVal(k string) (path.Path, uint64, error) { - ival, err := rp.ds.Get(dshelp.NewKeyFromBinary(k)) + ival, err := rp.ds.Get(dshelp.NewKeyFromBinary([]byte(k))) if err != nil { // not found means we dont have a previously published entry return "", 0, errNoEntry From 58c0937faab6cf98bb9aaaf16c6957c8ceed755e Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 21 Nov 2016 21:33:28 -0500 Subject: [PATCH 1463/3147] ds-help: avoid unnecessary allocs when posssible and make use of RawKey License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-routing@79b5c2e449be69fb5f08af18b5d9ff5db37fa27d --- routing/mock/centralized_client.go | 4 ++-- routing/offline/offline.go | 6 +++--- routing/supernode/server.go | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 1a413ab9c1..135f3be99e 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -40,13 +40,13 @@ func (c *client) PutValue(ctx context.Context, key string, val []byte) error { return err } - return c.datastore.Put(dshelp.NewKeyFromBinary(key), data) + return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data) } // FIXME(brian): is this method meant to simulate getting a value from the network? func (c *client) GetValue(ctx context.Context, key string) ([]byte, error) { log.Debugf("GetValue: %s", key) - v, err := c.datastore.Get(dshelp.NewKeyFromBinary(key)) + v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 1e3297bb39..566466139b 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -48,11 +48,11 @@ func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte) e return err } - return c.datastore.Put(dshelp.NewKeyFromBinary(key), data) + return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data) } func (c *offlineRouting) GetValue(ctx context.Context, key string) ([]byte, error) { - v, err := c.datastore.Get(dshelp.NewKeyFromBinary(key)) + v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err } @@ -71,7 +71,7 @@ func (c *offlineRouting) GetValue(ctx context.Context, key string) ([]byte, erro } func (c *offlineRouting) GetValues(ctx context.Context, key string, _ int) ([]routing.RecvdVal, error) { - v, err := c.datastore.Get(dshelp.NewKeyFromBinary(key)) + v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err } diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 6c96cbc2e2..b97e613a53 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -117,7 +117,7 @@ var _ proxy.RequestHandler = &Server{} var _ proxy.Proxy = &Server{} func getRoutingRecord(ds datastore.Datastore, k string) (*pb.Record, error) { - dskey := dshelp.NewKeyFromBinary(k) + dskey := dshelp.NewKeyFromBinary([]byte(k)) val, err := ds.Get(dskey) if err != nil { return nil, err @@ -138,7 +138,7 @@ func putRoutingRecord(ds datastore.Datastore, k string, value *pb.Record) error if err != nil { return err } - dskey := dshelp.NewKeyFromBinary(k) + dskey := dshelp.NewKeyFromBinary([]byte(k)) // TODO namespace if err := ds.Put(dskey, data); err != nil { return err From 76d273cd644b0884d0b23979709d7111eab50b65 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 21 Nov 2016 21:33:28 -0500 Subject: [PATCH 1464/3147] ds-help: avoid unnecessary allocs when posssible and make use of RawKey License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-ds-help@d0530afe5763c6712b536f4f1f33349a7d015499 --- datastore/dshelp/key.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 256cb15922..7e962fff04 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -7,8 +7,12 @@ import ( ) // TODO: put this code into the go-datastore itself -func NewKeyFromBinary(s string) ds.Key { - return ds.NewKey(base32.RawStdEncoding.EncodeToString([]byte(s))) + +func NewKeyFromBinary(rawKey []byte) ds.Key { + buf := make([]byte, 1+base32.RawStdEncoding.EncodedLen(len(rawKey))) + buf[0] = '/' + base32.RawStdEncoding.Encode(buf[1:], rawKey) + return ds.RawKey(string(buf)) } func BinaryFromDsKey(k ds.Key) ([]byte, error) { @@ -16,7 +20,7 @@ func BinaryFromDsKey(k ds.Key) ([]byte, error) { } func CidToDsKey(k *cid.Cid) ds.Key { - return NewKeyFromBinary(k.KeyString()) + return NewKeyFromBinary(k.Bytes()) } func DsKeyToCid(dsKey ds.Key) (*cid.Cid, error) { @@ -26,11 +30,3 @@ func DsKeyToCid(dsKey ds.Key) (*cid.Cid, error) { } return cid.Cast(kb) } - -func DsKeyStringToCid(dsKey string) (*cid.Cid, error) { - kb, err := base32.RawStdEncoding.DecodeString(dsKey[1:]) - if err != nil { - return nil, err - } - return cid.Cast(kb) -} From 5754c72858f6f8d76948df029485dd40b1cdc2f6 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 30 Nov 2016 17:45:17 -0500 Subject: [PATCH 1465/3147] blockstore.AllKeyChan: avoid channels by using the new NextSync method License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@c2ebb19a608323aef7bd1565661116188c7eb4a4 --- blockstore/blockstore.go | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 9e5d8ca809..d5a77ab231 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -181,44 +181,27 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return nil, err } - // this function is here to compartmentalize - get := func() (*cid.Cid, bool) { - select { - case <-ctx.Done(): - return nil, false - case e, more := <-res.Next(): - if !more { - return nil, false - } - if e.Error != nil { - log.Debug("blockstore.AllKeysChan got err:", e.Error) - return nil, false - } - - // need to convert to key.Key using key.KeyFromDsKey. - c, err := dshelp.DsKeyToCid(ds.RawKey(e.Key)) - if err != nil { - log.Warningf("error parsing key from DsKey: ", err) - return nil, true - } - - return c, true - } - } - output := make(chan *cid.Cid, dsq.KeysOnlyBufSize) go func() { defer func() { - res.Process().Close() // ensure exit (signals early exit, too) + res.Close() // ensure exit (signals early exit, too) close(output) }() for { - k, ok := get() + e, ok := res.NextSync() if !ok { return } - if k == nil { + if e.Error != nil { + log.Debug("blockstore.AllKeysChan got err:", e.Error) + continue + } + + // need to convert to key.Key using key.KeyFromDsKey. + k, err := dshelp.DsKeyToCid(ds.RawKey(e.Key)) + if err != nil { + log.Warningf("error parsing key from DsKey: ", err) continue } From afe8ba0ad9767c0668cd1408e547ec31d88c371f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 30 Nov 2016 18:21:24 -0500 Subject: [PATCH 1466/3147] blockstore.AllKeyChan: fix/cleanup error handling License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-blockstore@68412cde465609210425e277b1dc56ab7790b797 --- blockstore/blockstore.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index d5a77ab231..6313cfffe4 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -194,8 +194,8 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return } if e.Error != nil { - log.Debug("blockstore.AllKeysChan got err:", e.Error) - continue + log.Errorf("blockstore.AllKeysChan got err:", e.Error) + return } // need to convert to key.Key using key.KeyFromDsKey. From 8a7a19377805f96366b9ac6ed735fe842db7be25 Mon Sep 17 00:00:00 2001 From: Mib Kd743naq Date: Fri, 2 Dec 2016 05:25:27 +0100 Subject: [PATCH 1467/3147] Fix bad formatting introduced by e855047ec License: MIT Signed-off-by: Mib Kd743naq This commit was moved from ipfs/go-ipfs-blockstore@2426bda300ef587362e66055b6cab15f3de659d3 --- blockstore/util/remove.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 3c16549bf5..e4ae678682 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -29,7 +29,7 @@ type RmBlocksOpts struct { func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, cids []*cid.Cid, opts RmBlocksOpts) (<-chan interface{}, error) { // make the channel large enough to hold any result to avoid - // blocking while holding the GCLock + // blocking while holding the GCLock out := make(chan interface{}, len(cids)) go func() { defer close(out) From dfc7c724a7f33eb8f27e8e713c3077a9b8758ea1 Mon Sep 17 00:00:00 2001 From: Mib Kd743naq Date: Fri, 2 Dec 2016 06:37:11 +0100 Subject: [PATCH 1468/3147] Switch unixfs.Metadata.MimeType to optional *** THIS IS A BREAKING CHANGE *** as per [1]: "Required is forever" Nevertheless this seems like a good idea at this time: there are no known producers ( nor consumers ) of MetaData nodes, and the current requirement of MimeType has an extremely narrow application scope. This change could very well be rejected in lieu of implementing a new type of node ( e.g. TheRealMetadata ) in the DataType enum. Based on https://github.com/ipfs/go-ipfs/issues/3451#issuecomment-264246718 License: MIT Signed-off-by: Mib Kd743naq [1] https://developers.google.com/protocol-buffers/docs/proto#specifying-field-rules This commit was moved from ipfs/go-unixfs@e94be522d89ba2057d8b12796e4f3cfbeed7fe37 --- unixfs/pb/unixfs.pb.go | 10 +++++++--- unixfs/pb/unixfs.proto | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 55348ad766..ffd3bb905f 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -15,10 +15,12 @@ It has these top-level messages: package unixfs_pb import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +import fmt "fmt" import math "math" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal +var _ = fmt.Errorf var _ = math.Inf type Data_DataType int32 @@ -64,8 +66,8 @@ func (x *Data_DataType) UnmarshalJSON(data []byte) error { } type Data struct { - Type *Data_DataType `protobuf:"varint,1,req,enum=unixfs.pb.Data_DataType" json:"Type,omitempty"` - Data []byte `protobuf:"bytes,2,opt" json:"Data,omitempty"` + Type *Data_DataType `protobuf:"varint,1,req,name=Type,enum=unixfs.pb.Data_DataType" json:"Type,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=Data" json:"Data,omitempty"` Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` XXX_unrecognized []byte `json:"-"` @@ -104,7 +106,7 @@ func (m *Data) GetBlocksizes() []uint64 { } type Metadata struct { - MimeType *string `protobuf:"bytes,1,req" json:"MimeType,omitempty"` + MimeType *string `protobuf:"bytes,1,opt,name=MimeType" json:"MimeType,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -120,5 +122,7 @@ func (m *Metadata) GetMimeType() string { } func init() { + proto.RegisterType((*Data)(nil), "unixfs.pb.Data") + proto.RegisterType((*Metadata)(nil), "unixfs.pb.Metadata") proto.RegisterEnum("unixfs.pb.Data_DataType", Data_DataType_name, Data_DataType_value) } diff --git a/unixfs/pb/unixfs.proto b/unixfs/pb/unixfs.proto index 4a52c3af57..2e4d47947f 100644 --- a/unixfs/pb/unixfs.proto +++ b/unixfs/pb/unixfs.proto @@ -16,5 +16,5 @@ message Data { } message Metadata { - required string MimeType = 1; + optional string MimeType = 1; } From 9397964cf68a0b92b2151bae1c22ba7b0684025d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 30 Nov 2016 10:18:09 -0800 Subject: [PATCH 1469/3147] basic keystore implementation License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-keystore@c2eb8ce52da2c03ea3932e2e54a37aecda6b7782 --- keystore/keystore.go | 123 ++++++++++++++++++++++++++++++++++++++++ keystore/memkeystore.go | 55 ++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 keystore/keystore.go create mode 100644 keystore/memkeystore.go diff --git a/keystore/keystore.go b/keystore/keystore.go new file mode 100644 index 0000000000..19e77f1733 --- /dev/null +++ b/keystore/keystore.go @@ -0,0 +1,123 @@ +package keystore + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" +) + +type Keystore interface { + Put(string, ci.PrivKey) error + Get(string) (ci.PrivKey, error) + Delete(string) error + List() ([]string, error) +} + +var ErrNoSuchKey = fmt.Errorf("no key by the given name was found") +var ErrKeyExists = fmt.Errorf("key by that name already exists, refusing to overwrite") + +type FSKeystore struct { + dir string +} + +func validateName(name string) error { + if name == "" { + return fmt.Errorf("key names must be at least one character") + } + + if strings.Contains(name, "/") { + return fmt.Errorf("key names may not contain slashes") + } + + if strings.HasPrefix(name, ".") { + return fmt.Errorf("key names may not begin with a period") + } + + return nil +} + +func NewFSKeystore(dir string) (*FSKeystore, error) { + _, err := os.Stat(dir) + if err != nil { + if !os.IsNotExist(err) { + return nil, err + } + if err := os.Mkdir(dir, 0700); err != nil { + return nil, err + } + } + + return &FSKeystore{dir}, nil +} + +func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { + if err := validateName(name); err != nil { + return err + } + + b, err := k.Bytes() + if err != nil { + return err + } + + kp := filepath.Join(ks.dir, name) + + _, err = os.Stat(kp) + if err == nil { + return ErrKeyExists + } + + fi, err := os.Create(kp) + if err != nil { + return err + } + defer fi.Close() + + _, err = fi.Write(b) + if err != nil { + return err + } + + return nil +} + +func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { + if err := validateName(name); err != nil { + return nil, err + } + + kp := filepath.Join(ks.dir, name) + + data, err := ioutil.ReadFile(kp) + if err != nil { + if os.IsNotExist(err) { + return nil, ErrNoSuchKey + } + return nil, err + } + + return ci.UnmarshalPrivateKey(data) +} + +func (ks *FSKeystore) Delete(name string) error { + if err := validateName(name); err != nil { + return err + } + + kp := filepath.Join(ks.dir, name) + + return os.Remove(kp) +} + +func (ks *FSKeystore) List() ([]string, error) { + dir, err := os.Open(ks.dir) + if err != nil { + return nil, err + } + + return dir.Readdirnames(0) +} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go new file mode 100644 index 0000000000..9eec377db9 --- /dev/null +++ b/keystore/memkeystore.go @@ -0,0 +1,55 @@ +package keystore + +import ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + +type MemKeystore struct { + keys map[string]ci.PrivKey +} + +func NewMemKeystore() *MemKeystore { + return &MemKeystore{make(map[string]ci.PrivKey)} +} + +func (mk *MemKeystore) Put(name string, k ci.PrivKey) error { + if err := validateName(name); err != nil { + return err + } + + _, ok := mk.keys[name] + if ok { + return ErrKeyExists + } + + mk.keys[name] = k + return nil +} + +func (mk *MemKeystore) Get(name string) (ci.PrivKey, error) { + if err := validateName(name); err != nil { + return nil, err + } + + k, ok := mk.keys[name] + if !ok { + return nil, ErrNoSuchKey + } + + return k, nil +} + +func (mk *MemKeystore) Delete(name string) error { + if err := validateName(name); err != nil { + return err + } + + delete(mk.keys, name) + return nil +} + +func (mk *MemKeystore) List() ([]string, error) { + out := make([]string, 0, len(mk.keys)) + for k, _ := range mk.keys { + out = append(out, k) + } + return out, nil +} From 7add5c37293ab06b5003eb10c976213f4b82d13d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 6 Dec 2016 11:20:18 -0800 Subject: [PATCH 1470/3147] address comments and add some tests License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-keystore@1bcdb41555eb4723075846b6314ca2663a909310 --- keystore/keystore.go | 2 + keystore/keystore_test.go | 177 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 keystore/keystore_test.go diff --git a/keystore/keystore.go b/keystore/keystore.go index 19e77f1733..a18da46200 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -69,6 +69,8 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { _, err = os.Stat(kp) if err == nil { return ErrKeyExists + } else if !os.IsNotExist(err) { + return err } fi, err := os.Create(kp) diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go new file mode 100644 index 0000000000..7f1fcd5ba8 --- /dev/null +++ b/keystore/keystore_test.go @@ -0,0 +1,177 @@ +package keystore + +import ( + "fmt" + "io/ioutil" + "math/rand" + "sort" + "testing" + + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" +) + +type rr struct{} + +func (rr rr) Read(b []byte) (int, error) { + return rand.Read(b) +} + +func privKeyOrFatal(t *testing.T) ci.PrivKey { + priv, _, err := ci.GenerateEd25519Key(rr{}) + if err != nil { + t.Fatal(err) + } + return priv +} + +func TestKeystoreBasics(t *testing.T) { + tdir, err := ioutil.TempDir("", "keystore-test") + if err != nil { + t.Fatal(err) + } + + ks, err := NewFSKeystore(tdir) + if err != nil { + t.Fatal(err) + } + + l, err := ks.List() + if err != nil { + t.Fatal(err) + } + + if len(l) != 0 { + t.Fatal("expected no keys") + } + + k1 := privKeyOrFatal(t) + k2 := privKeyOrFatal(t) + k3 := privKeyOrFatal(t) + k4 := privKeyOrFatal(t) + + err = ks.Put("foo", k1) + if err != nil { + t.Fatal(err) + } + + err = ks.Put("bar", k2) + if err != nil { + t.Fatal(err) + } + + l, err = ks.List() + if err != nil { + t.Fatal(err) + } + + sort.Strings(l) + if l[0] != "bar" || l[1] != "foo" { + t.Fatal("wrong entries listed") + } + + if err := assertDirContents(tdir, []string{"foo", "bar"}); err != nil { + t.Fatal(err) + } + + err = ks.Put("foo", k3) + if err == nil { + t.Fatal("should not be able to overwrite key") + } + + if err := assertDirContents(tdir, []string{"foo", "bar"}); err != nil { + t.Fatal(err) + } + + if err := ks.Delete("bar"); err != nil { + t.Fatal(err) + } + + if err := assertDirContents(tdir, []string{"foo"}); err != nil { + t.Fatal(err) + } + + if err := ks.Put("beep", k3); err != nil { + t.Fatal(err) + } + + if err := ks.Put("boop", k4); err != nil { + t.Fatal(err) + } + + if err := assertDirContents(tdir, []string{"foo", "beep", "boop"}); err != nil { + t.Fatal(err) + } + + if err := assertGetKey(ks, "foo", k1); err != nil { + t.Fatal(err) + } + + if err := assertGetKey(ks, "beep", k3); err != nil { + t.Fatal(err) + } + + if err := assertGetKey(ks, "boop", k4); err != nil { + t.Fatal(err) + } + + if err := ks.Put("..///foo/", k1); err == nil { + t.Fatal("shouldnt be able to put a poorly named key") + } + + if err := ks.Put("", k1); err == nil { + t.Fatal("shouldnt be able to put a key with no name") + } + + if err := ks.Put(".foo", k1); err == nil { + t.Fatal("shouldnt be able to put a key with a 'hidden' name") + } +} + +func TestMakeKeystoreNoDir(t *testing.T) { + _, err := NewFSKeystore("/this/is/not/a/real/dir") + if err == nil { + t.Fatal("shouldnt be able to make a keystore in a nonexistant directory") + } +} + +func assertGetKey(ks Keystore, name string, exp ci.PrivKey) error { + out_k, err := ks.Get(name) + if err != nil { + return err + } + + if !out_k.Equals(exp) { + return fmt.Errorf("key we got out didnt match expectation") + } + + return nil +} + +func assertDirContents(dir string, exp []string) error { + finfos, err := ioutil.ReadDir(dir) + if err != nil { + return err + } + + if len(finfos) != len(exp) { + return fmt.Errorf("Expected %d directory entries", len(exp)) + } + + var names []string + for _, fi := range finfos { + names = append(names, fi.Name()) + } + + sort.Strings(names) + sort.Strings(exp) + if len(names) != len(exp) { + return fmt.Errorf("directory had wrong number of entries in it") + } + + for i, v := range names { + if v != exp[i] { + return fmt.Errorf("had wrong entry in directory") + } + } + return nil +} From 4f7baa099162f46fe6ca103a1da043da9b500b0f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 7 Dec 2016 08:59:54 +0100 Subject: [PATCH 1471/3147] test: add test for nonexistant key License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-keystore@387bce4f9b807a631df77ac3aff8e529378925f1 --- keystore/keystore_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 7f1fcd5ba8..a58fe778ca 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -127,6 +127,26 @@ func TestKeystoreBasics(t *testing.T) { } } +func TestNonExistingKey(t *testing.T) { + tdir, err := ioutil.TempDir("", "keystore-test") + if err != nil { + t.Fatal(err) + } + + ks, err := NewFSKeystore(tdir) + if err != nil { + t.Fatal(err) + } + + k, err := ks.Get("does-it-exist") + if err != ErrNoSuchKey { + t.Fatalf("expected: %s, got %s", ErrNoSuchKey, err) + } + if k != nil { + t.Fatalf("Get on nonexistant key should give nil") + } +} + func TestMakeKeystoreNoDir(t *testing.T) { _, err := NewFSKeystore("/this/is/not/a/real/dir") if err == nil { From 58ac5c59d1afabd7b68868d3ef006bf3afd7e837 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 7 Dec 2016 09:02:23 +0100 Subject: [PATCH 1472/3147] test: add memkeystore test License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-keystore@79f8956be7122a8f337b58b7639427dd9a00aa80 --- keystore/memkeystore_test.go | 82 ++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 keystore/memkeystore_test.go diff --git a/keystore/memkeystore_test.go b/keystore/memkeystore_test.go new file mode 100644 index 0000000000..7f4362795d --- /dev/null +++ b/keystore/memkeystore_test.go @@ -0,0 +1,82 @@ +package keystore + +import ( + "sort" + "testing" +) + +func TestMemKeyStoreBasics(t *testing.T) { + ks := NewMemKeystore() + + l, err := ks.List() + if err != nil { + t.Fatal(err) + } + + if len(l) != 0 { + t.Fatal("expected no keys") + } + + k1 := privKeyOrFatal(t) + k2 := privKeyOrFatal(t) + k3 := privKeyOrFatal(t) + k4 := privKeyOrFatal(t) + + err = ks.Put("foo", k1) + if err != nil { + t.Fatal(err) + } + + err = ks.Put("bar", k2) + if err != nil { + t.Fatal(err) + } + + l, err = ks.List() + if err != nil { + t.Fatal(err) + } + + sort.Strings(l) + if l[0] != "bar" || l[1] != "foo" { + t.Fatal("wrong entries listed") + } + + err = ks.Put("foo", k3) + if err == nil { + t.Fatal("should not be able to overwrite key") + } + if err := ks.Delete("bar"); err != nil { + t.Fatal(err) + } + if err := ks.Put("beep", k3); err != nil { + t.Fatal(err) + } + + if err := ks.Put("boop", k4); err != nil { + t.Fatal(err) + } + if err := assertGetKey(ks, "foo", k1); err != nil { + t.Fatal(err) + } + + if err := assertGetKey(ks, "beep", k3); err != nil { + t.Fatal(err) + } + + if err := assertGetKey(ks, "boop", k4); err != nil { + t.Fatal(err) + } + + if err := ks.Put("..///foo/", k1); err == nil { + t.Fatal("shouldnt be able to put a poorly named key") + } + + if err := ks.Put("", k1); err == nil { + t.Fatal("shouldnt be able to put a key with no name") + } + + if err := ks.Put(".foo", k1); err == nil { + t.Fatal("shouldnt be able to put a key with a 'hidden' name") + } +} From 4d7c91c043ecd518cc091f4befb4710ee83d367f Mon Sep 17 00:00:00 2001 From: Zander Mackie Date: Fri, 9 Dec 2016 07:28:24 -0500 Subject: [PATCH 1473/3147] Add test for unixfs/format to reach 87% coverage. License: MIT Signed-off-by: Zander Mackie This commit was moved from ipfs/go-unixfs@63cfd751de156ddacfe3cf3d583a939ed18bc2b7 --- unixfs/format_test.go | 124 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/unixfs/format_test.go b/unixfs/format_test.go index ac35db56f1..10421431a0 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -1,6 +1,7 @@ package unixfs import ( + "bytes" "testing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" @@ -11,9 +12,10 @@ import ( func TestFSNode(t *testing.T) { fsn := new(FSNode) fsn.Type = TFile - for i := 0; i < 15; i++ { + for i := 0; i < 16; i++ { fsn.AddBlockSize(100) } + fsn.RemoveBlockSize(15) fsn.Data = make([]byte, 128) @@ -32,8 +34,128 @@ func TestFSNode(t *testing.T) { if err != nil { t.Fatal(err) } + nKids := fsn.NumChildren() + if nKids != 15 { + t.Fatal("Wrong number of child nodes") + } if ds != (100*15)+128 { t.Fatal("Datasize calculations incorrect!") } + + nfsn, err := FSNodeFromBytes(b) + if err != nil { + t.Fatal(err) + } + + if nfsn.FileSize() != (100*15)+128 { + t.Fatal("fsNode FileSize calculations incorrect") + } +} + +func TestPBdataTools(t *testing.T) { + raw := []byte{0x00, 0x01, 0x02, 0x17, 0xA1} + rawPB := WrapData(raw) + + pbDataSize, err := DataSize(rawPB) + if err != nil { + t.Fatal(err) + } + + same := len(raw) == int(pbDataSize) + if !same { + t.Fatal("WrapData changes the size of data.") + } + + rawPBBytes, err := UnwrapData(rawPB) + if err != nil { + t.Fatal(err) + } + + same = bytes.Equal(raw, rawPBBytes) + if !same { + t.Fatal("Unwrap failed to produce the correct wrapped data.") + } + + rawPBdata, err := FromBytes(rawPB) + if err != nil { + t.Fatal(err) + } + + isRaw := rawPBdata.GetType() == TRaw + if !isRaw { + t.Fatal("WrapData does not create pb.Data_Raw!") + } + + catFile := []byte("Mr_Meowgie.gif") + catPBfile := FilePBData(catFile, 17) + catSize, err := DataSize(catPBfile) + if catSize != 17 { + t.Fatal("FilePBData is the wrong size.") + } + if err != nil { + t.Fatal(err) + } + + dirPB := FolderPBData() + dir, err := FromBytes(dirPB) + isDir := dir.GetType() == TDirectory + if !isDir { + t.Fatal("FolderPBData does not create a directory!") + } + if err != nil { + t.Fatal(err) + } + _, dirErr := DataSize(dirPB) + if dirErr == nil { + t.Fatal("DataSize didn't throw an error when taking the size of a directory.") + } + + catSym, err := SymlinkData("/ipfs/adad123123/meowgie.gif") + if err != nil { + t.Fatal(err) + } + + catSymPB, err := FromBytes(catSym) + isSym := catSymPB.GetType() == TSymlink + if !isSym { + t.Fatal("Failed to make a Symlink.") + } + if err != nil { + t.Fatal(err) + } + + _, sizeErr := DataSize(catSym) + if sizeErr == nil { + t.Fatal("DataSize didn't throw an error when taking the size of a Symlink.") + } + +} + +func TestMetedata(t *testing.T) { + meta := &Metadata{ + MimeType: "audio/aiff", + Size: 12345, + } + + _, err := meta.Bytes() + if err != nil { + t.Fatal(err) + } + + metaPB, err := BytesForMetadata(meta) + if err != nil { + t.Fatal(err) + } + + meta, err = MetadataFromBytes(metaPB) + if err != nil { + t.Fatal(err) + } + + mimeAiff := meta.MimeType == "audio/aiff" + if !mimeAiff { + t.Fatal("Metadata does not Marshal and Unmarshal properly!") + } + } From 3faabecca7efb39b5ada2e3e5e31e6f8719332d6 Mon Sep 17 00:00:00 2001 From: Zander Mackie Date: Fri, 9 Dec 2016 07:27:16 -0500 Subject: [PATCH 1474/3147] Add Some Comments to unixfs/format License: MIT Signed-off-by: Zander Mackie This commit was moved from ipfs/go-unixfs@2e3a9f76a80e455c5e9627dce74be5197c9518b3 --- unixfs/format.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unixfs/format.go b/unixfs/format.go index 7a602362ee..96dd109d17 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -51,7 +51,7 @@ func FilePBData(data []byte, totalsize uint64) []byte { return data } -// Returns Bytes that represent a Directory +//FolderPBData returns Bytes that represent a Directory. func FolderPBData() []byte { pbfile := new(pb.Data) typ := pb.Data_Directory @@ -65,6 +65,7 @@ func FolderPBData() []byte { return data } +//WrapData marshals raw bytes into a `Data_Raw` type protobuf message. func WrapData(b []byte) []byte { pbdata := new(pb.Data) typ := pb.Data_Raw @@ -81,6 +82,7 @@ func WrapData(b []byte) []byte { return out } +//SymlinkData returns a `Data_Symlink` protobuf message for the path you specify. func SymlinkData(path string) ([]byte, error) { pbdata := new(pb.Data) typ := pb.Data_Symlink @@ -184,6 +186,7 @@ type Metadata struct { Size uint64 } +//MetadataFromBytes Unmarshals a protobuf message into Metadata. func MetadataFromBytes(b []byte) (*Metadata, error) { pbd := new(pb.Data) err := proto.Unmarshal(b, pbd) From d73ec21cf71c8e64e767f5b452d6e3f3bd7afe31 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 13 Dec 2016 18:51:54 +0100 Subject: [PATCH 1475/3147] namesys: add entry to DHT cache after publish License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@8999061a8c2ed44c0869e067fbd8522a9b467c19 --- namesys/namesys.go | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index d2f4a3bf7a..271aaee89f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,13 +1,15 @@ package namesys import ( + "context" "strings" "time" - context "context" path "github.com/ipfs/go-ipfs/path" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) @@ -87,9 +89,44 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) // Publish implements Publisher func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { - return ns.publishers["/ipns/"].Publish(ctx, name, value) + err := ns.publishers["/ipns/"].Publish(ctx, name, value) + if err != nil { + return err + } + ns.addToDHTCache(name, value, time.Now().Add(time.Hour*24)) + return nil +} + +func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { + err := ns.publishers["/ipns/"].PublishWithEOL(ctx, name, value, eol) + if err != nil { + return err + } + ns.addToDHTCache(name, value, eol) + return nil } -func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, val path.Path, eol time.Time) error { - return ns.publishers["/ipns/"].PublishWithEOL(ctx, name, val, eol) +func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { + var err error + value, err = path.ParsePath(value.String()) + if err != nil { + log.Error("could not parse path") + return + } + + name, err := peer.IDFromPrivateKey(key) + if err != nil { + log.Error("while adding to cache, could not get peerid from private key") + return + } + + rr, ok := ns.resolvers["dht"].(*routingResolver) + if !ok { + // should never happen, purely for sanity + log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["dht"]) + } + rr.cache.Add(name.Pretty(), cacheEntry{ + val: value, + eol: eol, + }) } From 07735e48c505d1c8b867c97818169e5f57cf1461 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 13 Dec 2016 20:58:10 +0100 Subject: [PATCH 1476/3147] namesys: fix length of self resolve cache License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@5bcfdda9220461bd774dd506dc60cd69bcb9ee23 --- namesys/namesys.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/namesys/namesys.go b/namesys/namesys.go index 271aaee89f..3fa72c3326 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -125,6 +125,9 @@ func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { // should never happen, purely for sanity log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["dht"]) } + if time.Now().Add(DefaultResolverCacheTTL).Before(eol) { + eol = time.Now().Add(DefaultResolverCacheTTL) + } rr.cache.Add(name.Pretty(), cacheEntry{ val: value, eol: eol, From 0851cb8da61f0136361fb74496d2e756fcd94171 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 14 Dec 2016 20:50:04 +0100 Subject: [PATCH 1477/3147] namesys: extract DefaultRecortTTL to a variable License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@412670d5e5649fb228b32242f6e367b4083c23f6 --- namesys/namesys.go | 2 +- namesys/publisher.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 3fa72c3326..8acc1dc2c3 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -93,7 +93,7 @@ func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) e if err != nil { return err } - ns.addToDHTCache(name, value, time.Now().Add(time.Hour*24)) + ns.addToDHTCache(name, value, time.Now().Add(DefaultRecortTTL)) return nil } diff --git a/namesys/publisher.go b/namesys/publisher.go index 795023c83c..5f5a15abdb 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -33,6 +33,7 @@ var ErrExpiredRecord = errors.New("expired record") var ErrUnrecognizedValidity = errors.New("unrecognized validity type") var PublishPutValTimeout = time.Minute +var DefaultRecortTTL = 24 * time.Hour // ipnsPublisher is capable of publishing and resolving names to the IPFS // routing system. @@ -53,7 +54,7 @@ func NewRoutingPublisher(route routing.ValueStore, ds ds.Datastore) *ipnsPublish // and publishes it out to the routing system func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) - return p.PublishWithEOL(ctx, k, value, time.Now().Add(time.Hour*24)) + return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecortTTL)) } // PublishWithEOL is a temporary stand in for the ipns records implementation From 2ed19f93609eb1c073658f1e5c5ed0db944a2c25 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 14 Dec 2016 21:53:10 +0100 Subject: [PATCH 1478/3147] namesys: fix TYPO, make constant constant License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@5958b93e9fba009cc19117665628e9d6744ac644 --- namesys/namesys.go | 2 +- namesys/publisher.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 8acc1dc2c3..3e0456ce20 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -93,7 +93,7 @@ func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) e if err != nil { return err } - ns.addToDHTCache(name, value, time.Now().Add(DefaultRecortTTL)) + ns.addToDHTCache(name, value, time.Now().Add(DefaultRecordTTL)) return nil } diff --git a/namesys/publisher.go b/namesys/publisher.go index 5f5a15abdb..54a0e834ef 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -32,8 +32,8 @@ var ErrExpiredRecord = errors.New("expired record") // unknown validity type. var ErrUnrecognizedValidity = errors.New("unrecognized validity type") -var PublishPutValTimeout = time.Minute -var DefaultRecortTTL = 24 * time.Hour +const PublishPutValTimeout = time.Minute +const DefaultRecordTTL = 24 * time.Hour // ipnsPublisher is capable of publishing and resolving names to the IPFS // routing system. @@ -54,7 +54,7 @@ func NewRoutingPublisher(route routing.ValueStore, ds ds.Datastore) *ipnsPublish // and publishes it out to the routing system func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) - return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecortTTL)) + return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordTTL)) } // PublishWithEOL is a temporary stand in for the ipns records implementation From d3de2aeda32ed324697051d34ad016589c139acb Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 15 Dec 2016 02:16:40 +0100 Subject: [PATCH 1479/3147] namesys: fix case where there is no cache License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@1826eb9b65de1b4614e5d8cd33a44b6f781eb286 --- namesys/namesys.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 3e0456ce20..bf1c68967a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -107,6 +107,16 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. } func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { + rr, ok := ns.resolvers["dht"].(*routingResolver) + if !ok { + // should never happen, purely for sanity + log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["dht"]) + } + if rr.cache == nil { + // resolver has no caching + return + } + var err error value, err = path.ParsePath(value.String()) if err != nil { @@ -120,11 +130,6 @@ func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { return } - rr, ok := ns.resolvers["dht"].(*routingResolver) - if !ok { - // should never happen, purely for sanity - log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["dht"]) - } if time.Now().Add(DefaultResolverCacheTTL).Before(eol) { eol = time.Now().Add(DefaultResolverCacheTTL) } From f8bb6be911145d6d2e0e449711c4b4797d07d6a9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 15 Dec 2016 22:05:23 +0100 Subject: [PATCH 1480/3147] namesys: add test for publish with cache size 0 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@cf5666c0f802ec61727cf21bd1308278f49dbf6f --- namesys/namesys_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index b2f92deb00..7d5c637b5d 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,6 +7,11 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" + offroute "github.com/ipfs/go-ipfs/routing/offline" + "github.com/ipfs/go-ipfs/unixfs" + + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) type mockResolver struct { @@ -69,3 +74,19 @@ func TestNamesysResolution(t *testing.T) { testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 2, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 3, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) } + +func TestPublishWithCache0(t *testing.T) { + dst := ds.NewMapDatastore() + priv, _, err := ci.GenerateKeyPair(ci.RSA, 1024) + if err != nil { + t.Fatal(err) + } + routing := offroute.NewOfflineRouter(dst, priv) + + nsys := NewNameSystem(routing, dst, 0) + p, err := path.ParsePath(unixfs.EmptyDirNode().Cid().String()) + if err != nil { + t.Fatal(err) + } + nsys.Publish(context.Background(), priv, p) +} From 3edcfea3e1b218eb523dc36f15e90811dcf6c385 Mon Sep 17 00:00:00 2001 From: Zander Mackie Date: Tue, 13 Dec 2016 07:46:29 -0500 Subject: [PATCH 1481/3147] Tests for OfflineRouting storage and Retrieval License: MIT Signed-off-by: Zander Mackie This commit was moved from ipfs/go-ipfs-routing@eac4ce0474c2e15c49cc4d5640abfc67e032e68b --- routing/offline/offline_test.go | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 routing/offline/offline_test.go diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go new file mode 100644 index 0000000000..5f031a14ad --- /dev/null +++ b/routing/offline/offline_test.go @@ -0,0 +1,48 @@ +package offline + +import ( + "bytes" + "context" + "github.com/ipfs/go-ipfs/thirdparty/testutil" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + "testing" +) + +func TestOfflineRouterStorage(t *testing.T) { + ctx := context.Background() + + nds := ds.NewMapDatastore() + privkey, _, _ := testutil.RandTestKeyPair(128) + offline := NewOfflineRouter(nds, privkey) + + err := offline.PutValue(ctx, "key", []byte("testing 1 2 3")) + if err != nil { + t.Fatal(err) + } + + val, err := offline.GetValue(ctx, "key") + if !bytes.Equal([]byte("testing 1 2 3"), val) { + t.Fatal("OfflineRouter does not properly store") + } + + val, err = offline.GetValue(ctx, "notHere") + if err == nil { + t.Fatal("Router should throw errors for unfound records") + } + + recVal, err := offline.GetValues(ctx, "key", 0) + if err != nil { + t.Fatal(err) + } + + _, err = offline.GetValues(ctx, "notHere", 0) + if err == nil { + t.Fatal("Router should throw errors for unfound records") + } + + local := recVal[0].Val + if !bytes.Equal([]byte("testing 1 2 3"), local) { + t.Fatal("OfflineRouter does not properly store") + } +} + From 430ae6b33ea33152ae50c93418e0d525bf2faaee Mon Sep 17 00:00:00 2001 From: Zander Mackie Date: Wed, 14 Dec 2016 07:25:21 -0500 Subject: [PATCH 1482/3147] Testing the rest of the interface License: MIT Signed-off-by: Zander Mackie This commit was moved from ipfs/go-ipfs-routing@3ca260628ecff7d727dcf2781f89ae1629a9ba47 --- routing/offline/offline_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 5f031a14ad..629206b4e2 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -46,3 +46,34 @@ func TestOfflineRouterStorage(t *testing.T) { } } +func TestOfflineRouterLocal(t *testing.T) { + ctx := context.Background() + + nds := ds.NewMapDatastore() + privkey, _, _ := testutil.RandTestKeyPair(128) + offline := NewOfflineRouter(nds, privkey) + + id, _ := testutil.RandPeerID() + _, err := offline.FindPeer(ctx, id) + if err != ErrOffline { + t.Fatal("OfflineRouting should alert that its offline") + } + + cid, _ := testutil.RandCidV0() + pChan := offline.FindProvidersAsync(ctx, cid, 1) + p, ok := <-pChan + if ok { + t.Fatalf("FindProvidersAsync did not return a closed channel. Instead we got %+v !", p) + } + + cid, _ = testutil.RandCidV0() + err = offline.Provide(ctx, cid) + if err != ErrOffline { + t.Fatal("OfflineRouting should alert that its offline") + } + + err = offline.Bootstrap(ctx) + if err != nil { + t.Fatal("You shouldn't be able to bootstrap offline routing.") + } +} From bf3a8a92ce2575f6672ffd5f889b0ee084b2981a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Dec 2016 02:13:59 -0800 Subject: [PATCH 1483/3147] update libp2p for identify configuration updates License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@27a18f150e430b4364fa5596b3bc3b3cbd9150db --- routing/mock/dht.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index fa2b666d2a..9251429730 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmQHmMFyhfp2ZXnbYWqAWhEideDCNDM6hzJwqCU29Y5zV2/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - mocknet "gx/ipfs/QmbzCT1CwxVZ2ednptC9RavuJe7Bv8DDi2Ne89qUrA37XM/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index fe642d2621..45bab6121f 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,10 +8,10 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index da73fee7fb..56bb99147c 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,8 +2,8 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" + dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index fa619ff323..73e4f420e9 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,12 +4,12 @@ import ( "context" "errors" - dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" host "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" kbucket "gx/ipfs/QmRVHVr38ChANF2PUMNKQs7Q4uVWCLVabrfcTG9taNbcVy/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index b97e613a53..01d72563a0 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,8 +8,8 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 3f65808c9a..7715e98fbf 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmNQPjpcXrwwwgDErKzKUm2xxhXCB3cuFgTHsrcCJ5uGbu/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 6678d2a4d9a986f186f4720c456d59efaaa0e254 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Dec 2016 02:13:59 -0800 Subject: [PATCH 1484/3147] update libp2p for identify configuration updates License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@ac0e3c59259c2484c868f6068e6de2c1f033e99d --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index ff456593d1..3ed2eee593 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmbzCT1CwxVZ2ednptC9RavuJe7Bv8DDi2Ne89qUrA37XM/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmQHmMFyhfp2ZXnbYWqAWhEideDCNDM6hzJwqCU29Y5zV2/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" ) From 3fb616239ffbc6000dd1e1783ff32829e88b7afe Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 4 Jan 2017 16:01:23 -0500 Subject: [PATCH 1485/3147] Fix typo and formatting issues. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@4df138770eea3a1f003619a04b49669bedfdc026 --- unixfs/format_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/format_test.go b/unixfs/format_test.go index 10421431a0..6edc2ca0bb 100644 --- a/unixfs/format_test.go +++ b/unixfs/format_test.go @@ -132,7 +132,7 @@ func TestPBdataTools(t *testing.T) { } -func TestMetedata(t *testing.T) { +func TestMetadata(t *testing.T) { meta := &Metadata{ MimeType: "audio/aiff", Size: 12345, From 0d2240b544b571a94a3526aeea81aff101c5c550 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 Jan 2017 05:56:28 -0800 Subject: [PATCH 1486/3147] update go-libp2p with negotiate lazy fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@3a15ceb9527de07e55ea750c1696a261124aab83 --- routing/mock/dht.go | 4 ++-- routing/none/none_client.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 9251429730..c307410ab9 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmQHmMFyhfp2ZXnbYWqAWhEideDCNDM6hzJwqCU29Y5zV2/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - dht "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht" + dht "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmdzDdLZ7nj133QvNHypyS9Y39g35bMFk5DJ2pmX7YqtKU/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index cd6ceec030..2d0bba3a40 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,7 +6,7 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - p2phost "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" + p2phost "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 45bab6121f..67f27c396f 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,11 +8,11 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" + "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 56bb99147c..71ff52f00b 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -3,8 +3,8 @@ package proxy import ( context "context" inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" - dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 73e4f420e9..f6e37a4124 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,13 +4,13 @@ import ( "context" "errors" - host "gx/ipfs/QmPTGbC34bPKaUm9wTxBo7zSCac7pDuG42ZmnXC718CKZZ/go-libp2p-host" + host "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" kbucket "gx/ipfs/QmRVHVr38ChANF2PUMNKQs7Q4uVWCLVabrfcTG9taNbcVy/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" - dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 01d72563a0..616b9f1dee 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,8 +9,8 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 7715e98fbf..421b04e84a 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmYTccce26rGtEbE7SpnSeRcJkT4uqa7aPyzRXufisiTEd/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 547158a304fa7e1b2dd27f31951405533a56e3d6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 Jan 2017 05:56:28 -0800 Subject: [PATCH 1487/3147] update go-libp2p with negotiate lazy fixes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@b849ce7af81ee96ca83ef363b747924aab0e86ce --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 3ed2eee593..65a2df82fe 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmQHmMFyhfp2ZXnbYWqAWhEideDCNDM6hzJwqCU29Y5zV2/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmdzDdLZ7nj133QvNHypyS9Y39g35bMFk5DJ2pmX7YqtKU/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" ) From e3aee1cd33fd62aacc14d609123f069da2691b0b Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 11 Jan 2017 18:24:11 -0500 Subject: [PATCH 1488/3147] blockservice: avoid using unnecessary continue statement License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-blockservice@53eb10a43657ccc3e01906c31a373fc8f14e265d --- blockservice/blockservice.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index d05a013555..e109b85feb 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -112,10 +112,9 @@ func (s *blockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { if err != nil { return nil, err } - if has { - continue + if !has { + toput = append(toput, b) } - toput = append(toput, b) } } else { toput = bs From 171885cdd64d301bd83d8159b474d1da09cd4c87 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 18 Jan 2017 19:39:57 -0800 Subject: [PATCH 1489/3147] update dht code to drop error log to warning License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@8a0870c29dac01a9712f36e89cb22edc4cebcee2 --- routing/mock/dht.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index c307410ab9..707ea0271e 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,9 +3,9 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" + dht "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - dht "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht" mocknet "gx/ipfs/QmdzDdLZ7nj133QvNHypyS9Y39g35bMFk5DJ2pmX7YqtKU/go-libp2p/p2p/net/mock" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 67f27c396f..5f48224253 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -9,10 +9,10 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" + dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 71ff52f00b..ab617b15a6 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -3,8 +3,8 @@ package proxy import ( context "context" inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" + dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index f6e37a4124..0612fefe4d 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -6,11 +6,11 @@ import ( host "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" + dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" kbucket "gx/ipfs/QmRVHVr38ChANF2PUMNKQs7Q4uVWCLVabrfcTG9taNbcVy/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 616b9f1dee..79c98d8989 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,9 +8,9 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 421b04e84a..b802700e2c 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" + dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmZbinR1CdVPaoom5vgD5YC5c1oeCPJqYhoGJFXoA32GKn/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From dfbd8bd2427cca2383494dce67c99c6f25dc70c7 Mon Sep 17 00:00:00 2001 From: Zander Mackie Date: Fri, 20 Jan 2017 16:32:15 -0500 Subject: [PATCH 1490/3147] Remove deprecated 'FindProviders' method from mock License: MIT Signed-off-by: Zander Mackie This commit was moved from ipfs/go-ipfs-routing@8451a895dbec88fe1e003c450ae4574b0bc76e39 --- routing/mock/centralized_test.go | 16 ++++++++-------- routing/mock/interface.go | 3 --- routing/offline/offline.go | 4 ---- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 13c3708d66..5aca0b0896 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,7 +7,6 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" @@ -154,20 +153,21 @@ func TestValidAfter(t *testing.T) { rs.Client(pi).Provide(ctx, key) var providers []pstore.PeerInfo - providers, err := rs.Client(pi).FindProviders(ctx, key) - if err != nil { - t.Fatal(err) + max := 100 + providersChan := rs.Client(pi).FindProvidersAsync(ctx, key, max) + for p := range providersChan { + providers = append(providers, p) } if len(providers) > 0 { t.Fail() } conf.ValueVisibility.Set(0) - providers, err = rs.Client(pi).FindProviders(ctx, key) - if err != nil { - t.Fatal(err) - } + providersChan = rs.Client(pi).FindProvidersAsync(ctx, key, max) t.Log("providers", providers) + for p := range providersChan { + providers = append(providers, p) + } if len(providers) != 1 { t.Fail() } diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 28217d600b..91dbc1deb4 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -12,8 +12,6 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ) @@ -25,7 +23,6 @@ type Server interface { // Client implements IpfsRouting type Client interface { - FindProviders(context.Context, *cid.Cid) ([]pstore.PeerInfo, error) routing.IpfsRouting } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 566466139b..7813208edc 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -91,10 +91,6 @@ func (c *offlineRouting) GetValues(ctx context.Context, key string, _ int) ([]ro }, nil } -func (c *offlineRouting) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { - return nil, ErrOffline -} - func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { return pstore.PeerInfo{}, ErrOffline } From f8a3b24ca53ab2eeef3fc3adbf539e31278d8cab Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jan 2017 17:19:58 -0800 Subject: [PATCH 1491/3147] Make pinset sharding deterministic Making this deterministic keeps us from creating an exponential amount of objects as the number of pins in the set increases. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@ccb8151bcc998e7f9aa8f0eb81da4c86ec1379c1 --- pinning/pinner/set.go | 23 +++----------- pinning/pinner/set_test.go | 65 +++++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 89791b1b60..01e0e198b0 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -3,7 +3,6 @@ package pin import ( "bytes" "context" - "crypto/rand" "encoding/binary" "errors" "fmt" @@ -26,14 +25,6 @@ const ( maxItems = 8192 ) -func randomSeed() (uint32, error) { - var buf [4]byte - if _, err := rand.Read(buf[:]); err != nil { - return 0, err - } - return binary.LittleEndian.Uint32(buf[:]), nil -} - func hash(seed uint32, c *cid.Cid) uint32 { var buf [4]byte binary.LittleEndian.PutUint32(buf[:], seed) @@ -63,11 +54,7 @@ func (s sortByHash) Swap(a, b int) { s.links[a], s.links[b] = s.links[b], s.links[a] } -func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint64, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { - seed, err := randomSeed() - if err != nil { - return nil, err - } +func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint64, depth uint32, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { links := make([]*node.Link, 0, defaultFanout+maxItems) for i := 0; i < defaultFanout; i++ { links = append(links, &node.Link{Cid: emptyKey}) @@ -82,7 +69,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint hdr := &pb.Set{ Version: proto.Uint32(1), Fanout: proto.Uint32(defaultFanout), - Seed: proto.Uint32(seed), + Seed: proto.Uint32(depth), } if err := writeHdr(n, hdr); err != nil { return nil, err @@ -129,7 +116,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint if !ok { break } - h := hash(seed, k) % defaultFanout + h := hash(depth, k) % defaultFanout hashed[h] = append(hashed[h], k) } @@ -142,7 +129,7 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint childIter := getCidListIterator(items) // recursively create a pinset from the items for this bucket index - child, err := storeItems(ctx, dag, uint64(len(items)), childIter, internalKeys) + child, err := storeItems(ctx, dag, uint64(len(items)), depth+1, childIter, internalKeys) if err != nil { return nil, err } @@ -296,7 +283,7 @@ func getCidListIterator(cids []*cid.Cid) itemIterator { func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { iter := getCidListIterator(cids) - n, err := storeItems(ctx, dag, uint64(len(cids)), iter, internalKeys) + n, err := storeItems(ctx, dag, uint64(len(cids)), 0, iter, internalKeys) if err != nil { return nil, err } diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index c409fae4b9..788af5a46c 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -2,40 +2,75 @@ package pin import ( "context" - "fmt" - "os" + "encoding/binary" "testing" + blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" + bserv "github.com/ipfs/go-ipfs/blockservice" + offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" - mdtest "github.com/ipfs/go-ipfs/merkledag/test" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) func ignoreCids(_ *cid.Cid) {} -func TestSet(t *testing.T) { - ds := mdtest.Mock() - limit := 10000 // 10000 reproduces the pinloss issue fairly reliably - - if os.Getenv("STRESS_IT_OUT_YO") != "" { - limit = 10000000 +func objCount(d ds.Datastore) int { + q := dsq.Query{KeysOnly: true} + res, err := d.Query(q) + if err != nil { + panic(err) } - var inputs []*cid.Cid - for i := 0; i < limit; i++ { - c, err := ds.Add(dag.NodeWithData([]byte(fmt.Sprint(i)))) - if err != nil { - t.Fatal(err) + + var count int + for { + _, ok := res.NextSync() + if !ok { + break } + count++ + } + return count +} + +func TestSet(t *testing.T) { + dst := ds.NewMapDatastore() + bstore := blockstore.NewBlockstore(dst) + ds := dag.NewDAGService(bserv.New(bstore, offline.Exchange(bstore))) + + // this value triggers the creation of a recursive shard. + // If the recursive sharding is done improperly, this will result in + // an infinite recursion and crash (OOM) + limit := uint32((defaultFanout * maxItems) + 1) + + var inputs []*cid.Cid + buf := make([]byte, 4) + for i := uint32(0); i < limit; i++ { + binary.BigEndian.PutUint32(buf, i) + c := dag.NewRawNode(buf).Cid() inputs = append(inputs, c) } + _, err := storeSet(context.Background(), ds, inputs[:len(inputs)-1], ignoreCids) + if err != nil { + t.Fatal(err) + } + + objs1 := objCount(dst) + out, err := storeSet(context.Background(), ds, inputs, ignoreCids) if err != nil { t.Fatal(err) } + objs2 := objCount(dst) + if objs2-objs1 > 2 { + t.Fatal("set sharding does not appear to be deterministic") + } + // weird wrapper node because loadSet expects us to pass an // object pointing to multiple named sets setroot := &dag.ProtoNode{} @@ -49,7 +84,7 @@ func TestSet(t *testing.T) { t.Fatal(err) } - if len(outset) != limit { + if uint32(len(outset)) != limit { t.Fatal("got wrong number", len(outset), limit) } From dcea9a1f86b413c00e5e7dc1d5cd332481260bf9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 16 Dec 2016 19:04:22 +0100 Subject: [PATCH 1492/3147] make: rework makefiles for non-recursive make and add sharness coverage This commit introduces non-recursive Makefile infrastructure that replaces current Makefile infrastructure. It also generally cleanups the Makefiles, separates them into nicer sub-modules and centralizes common operations into single definitions. It allows to depend on any target that is defined in the makefile, this means that for example `gx install` is called once when `make build test_expensive_sharness` is called instead of 4 or 5 times. It also makes the dependencies much cleaner and allows for reuse of modules. For example sharness coverage collection (WIP) uses sharness target with amended PATH, previously it might have been possible but not without wiring in the coverage collection into sharness make runner code. Yes, it is more complex but not much more. There are few rules that have to be followed and few complexities added but IMHO it is worth it. How to NR-make: 1. If make is to generate some file via a target, it MUST be defined in Rules.mk file in the directory of the target. 2. `Rules.mk` file MUST have `include mk/header.mk` statement as the first line and `include mk/footer.mk` statement as the last line (apart from project root `Rules.mk`). 3. It then MUST be included by the closest `Rules.mk` file up the directory tree. 4. Inside a `Rules.mk` special variable accessed as `$(d)` is defined. Its value is current directory, use it so if the `Rules.mk` file is moved in the tree it still works without a problem. Caution: this variable is not available in the recipe part and MUST NOT be used. Use name of the target or prerequisite to extract it if you need it. 5. Make has only one global scope, this means that name conflicts are a thing. Names SHOULD follow `VAR_NAME_$(d)` convention. There are exceptions from this rule in form of well defined global variables. Examples: General lists `TGT_BIN`, `CLEAN`; General targets: `TEST`, `COVERAGE`; General variables: `GOFLAGS`, `DEPS_GO`. 3. Any rules, definitions or variables that fit some family SHOULD be defined in `mk/$family.mk` file and included from project root `Rules.mk` License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@2d6a8b8ed1135387fc21a46c7d9a2c6cab738911 --- pinning/pinner/pin.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index baf0d59585..c0eccc2032 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -5,7 +5,6 @@ package pin import ( "context" "fmt" - "os" "sync" "time" @@ -26,8 +25,9 @@ var emptyKey *cid.Cid func init() { e, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") if err != nil { - log.Error("failed to decode empty key constant") - os.Exit(1) + msg := "failed to decode empty key constant" + log.Error(msg) + panic(msg) } emptyKey = e } From be14dcd5aec53c3ed061537ca671a17968e37715 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 20 Dec 2016 20:20:23 +0100 Subject: [PATCH 1493/3147] make: revert the panic change in pin License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@108b07ffe1c62841503881b80f514281faf30f55 --- pinning/pinner/pin.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index c0eccc2032..baf0d59585 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -5,6 +5,7 @@ package pin import ( "context" "fmt" + "os" "sync" "time" @@ -25,9 +26,8 @@ var emptyKey *cid.Cid func init() { e, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") if err != nil { - msg := "failed to decode empty key constant" - log.Error(msg) - panic(msg) + log.Error("failed to decode empty key constant") + os.Exit(1) } emptyKey = e } From 367d358916ef270c182f1920474110dc7fcd1018 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 16 Dec 2016 19:04:22 +0100 Subject: [PATCH 1494/3147] make: rework makefiles for non-recursive make and add sharness coverage This commit introduces non-recursive Makefile infrastructure that replaces current Makefile infrastructure. It also generally cleanups the Makefiles, separates them into nicer sub-modules and centralizes common operations into single definitions. It allows to depend on any target that is defined in the makefile, this means that for example `gx install` is called once when `make build test_expensive_sharness` is called instead of 4 or 5 times. It also makes the dependencies much cleaner and allows for reuse of modules. For example sharness coverage collection (WIP) uses sharness target with amended PATH, previously it might have been possible but not without wiring in the coverage collection into sharness make runner code. Yes, it is more complex but not much more. There are few rules that have to be followed and few complexities added but IMHO it is worth it. How to NR-make: 1. If make is to generate some file via a target, it MUST be defined in Rules.mk file in the directory of the target. 2. `Rules.mk` file MUST have `include mk/header.mk` statement as the first line and `include mk/footer.mk` statement as the last line (apart from project root `Rules.mk`). 3. It then MUST be included by the closest `Rules.mk` file up the directory tree. 4. Inside a `Rules.mk` special variable accessed as `$(d)` is defined. Its value is current directory, use it so if the `Rules.mk` file is moved in the tree it still works without a problem. Caution: this variable is not available in the recipe part and MUST NOT be used. Use name of the target or prerequisite to extract it if you need it. 5. Make has only one global scope, this means that name conflicts are a thing. Names SHOULD follow `VAR_NAME_$(d)` convention. There are exceptions from this rule in form of well defined global variables. Examples: General lists `TGT_BIN`, `CLEAN`; General targets: `TEST`, `COVERAGE`; General variables: `GOFLAGS`, `DEPS_GO`. 3. Any rules, definitions or variables that fit some family SHOULD be defined in `mk/$family.mk` file and included from project root `Rules.mk` License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@596a7e2355a198e3c4192073556ee30e06194199 --- namesys/pb/Makefile | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 namesys/pb/Makefile diff --git a/namesys/pb/Makefile b/namesys/pb/Makefile deleted file mode 100644 index 334feee741..0000000000 --- a/namesys/pb/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< - -clean: - rm *.pb.go From 0299ba28210b690d3a19a45207aeac4b5bdf6e76 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 16 Dec 2016 19:04:22 +0100 Subject: [PATCH 1495/3147] make: rework makefiles for non-recursive make and add sharness coverage This commit introduces non-recursive Makefile infrastructure that replaces current Makefile infrastructure. It also generally cleanups the Makefiles, separates them into nicer sub-modules and centralizes common operations into single definitions. It allows to depend on any target that is defined in the makefile, this means that for example `gx install` is called once when `make build test_expensive_sharness` is called instead of 4 or 5 times. It also makes the dependencies much cleaner and allows for reuse of modules. For example sharness coverage collection (WIP) uses sharness target with amended PATH, previously it might have been possible but not without wiring in the coverage collection into sharness make runner code. Yes, it is more complex but not much more. There are few rules that have to be followed and few complexities added but IMHO it is worth it. How to NR-make: 1. If make is to generate some file via a target, it MUST be defined in Rules.mk file in the directory of the target. 2. `Rules.mk` file MUST have `include mk/header.mk` statement as the first line and `include mk/footer.mk` statement as the last line (apart from project root `Rules.mk`). 3. It then MUST be included by the closest `Rules.mk` file up the directory tree. 4. Inside a `Rules.mk` special variable accessed as `$(d)` is defined. Its value is current directory, use it so if the `Rules.mk` file is moved in the tree it still works without a problem. Caution: this variable is not available in the recipe part and MUST NOT be used. Use name of the target or prerequisite to extract it if you need it. 5. Make has only one global scope, this means that name conflicts are a thing. Names SHOULD follow `VAR_NAME_$(d)` convention. There are exceptions from this rule in form of well defined global variables. Examples: General lists `TGT_BIN`, `CLEAN`; General targets: `TEST`, `COVERAGE`; General variables: `GOFLAGS`, `DEPS_GO`. 3. Any rules, definitions or variables that fit some family SHOULD be defined in `mk/$family.mk` file and included from project root `Rules.mk` License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@978939bcf10a49ac030051aa109915e495e67a07 --- unixfs/pb/Makefile | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 unixfs/pb/Makefile diff --git a/unixfs/pb/Makefile b/unixfs/pb/Makefile deleted file mode 100644 index 334feee741..0000000000 --- a/unixfs/pb/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< - -clean: - rm *.pb.go From a318d4fcdd538a1052243d197681dce6593f715c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1496/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@9e53626f6a8c4986a61c2508d026500ad759e5e9 --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index 550368ad82..3a885b478a 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index fb472953ee..1df66303a2 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index 93f3ff7c49..f489c1eb1b 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" - util "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + util "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func randNode() *merkledag.ProtoNode { From bf1ad22e5bd05466835ffbb002a16374e598b3be Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1497/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@b0702a0c807e489eb81d107f045c2e2039af4a7b --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 4 ++-- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 2 +- namesys/publisher.go | 12 ++++++------ namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 10 +++++----- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 3f66498ace..ac2307e76c 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,7 +35,7 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 883c00c2b0..84250baa30 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index bf1c68967a..78b406d42a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,10 +7,10 @@ import ( path "github.com/ipfs/go-ipfs/path" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 7d5c637b5d..ca99ff7996 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,8 +10,8 @@ import ( offroute "github.com/ipfs/go-ipfs/routing/offline" "github.com/ipfs/go-ipfs/unixfs" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index 54a0e834ef..8d01937d72 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,14 +14,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" - dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + record "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record" + dhtpb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index e4e0bdc928..89e32033d2 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,15 +11,15 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - recpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + recpb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 65a2df82fe..30f4140f78 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmdzDdLZ7nj133QvNHypyS9Y39g35bMFk5DJ2pmX7YqtKU/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" + mocknet "gx/ipfs/QmSNJRX4uphb3Eyp69uYbpRVvgqjPxfjnJmjcdMWkDH5Pn/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index f7d41ead40..5bc4b3e079 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -12,7 +12,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 859da7d604..89b507261c 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - mh "gx/ipfs/QmYDds3421prZgqKbLpEK7T9Aa2eVdQ7o3YarX1LVLdP2J/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + mh "gx/ipfs/QmbZ6Cee2uHjG7hf19qLHppgKDRtaG4CVtMzdmK9VCVqLu/go-multihash" ) var log = logging.Logger("namesys") From 4ff35e37016e3a38a16c44a0e20a4a3742610645 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1498/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@3e5b1ea788a6d93305159afb551924a13a4af63d --- routing/mock/centralized_client.go | 14 +++++++------- routing/mock/centralized_server.go | 6 +++--- routing/mock/centralized_test.go | 7 ++++--- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 10 +++++----- routing/offline/offline.go | 14 +++++++------- routing/supernode/client.go | 16 ++++++++-------- routing/supernode/proxy/loopback.go | 6 +++--- routing/supernode/proxy/standard.go | 14 +++++++------- routing/supernode/server.go | 10 +++++----- routing/supernode/server_test.go | 2 +- 12 files changed, 54 insertions(+), 53 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 135f3be99e..b9802adcd9 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,16 +8,16 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ma "gx/ipfs/QmSWLfmj5frN9xVLMMN846dMDriy5wN5jeghUm7aTW3DAG/go-multiaddr" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ma "gx/ipfs/QmUAQaWbKxGCUTuoQVvvicbQNZ9APF5pDGWyAZSe93AtKH/go-multiaddr" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - dhtpb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + dhtpb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 041a8ad29f..1e83ddb6b1 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,11 +8,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 5aca0b0896..f6f945ddb1 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -7,9 +7,10 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" + + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 707ea0271e..a227232f00 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - mocknet "gx/ipfs/QmdzDdLZ7nj133QvNHypyS9Y39g35bMFk5DJ2pmX7YqtKU/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmSNJRX4uphb3Eyp69uYbpRVvgqjPxfjnJmjcdMWkDH5Pn/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 91dbc1deb4..63e4dd5a85 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 2d0bba3a40..5818b55934 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,12 +6,12 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - p2phost "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + p2phost "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7813208edc..1ce0da1e7b 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,16 +7,16 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" - pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + record "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record" + pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" ) var log = logging.Logger("offlinerouting") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 5f48224253..63251ad86f 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,16 +8,16 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" - dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + loggables "gx/ipfs/QmTcfnDHimxBJqx6utpnWqVHdvyquXgkwAvYt4zMaJMKS2/go-libp2p-loggables" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" - pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" + "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" + dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index ab617b15a6..3ae8bce8d5 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" - inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" - dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmRuZnMorqodado1yeTQiv1i9rmtKj29CjPSsBKM7DFXV4/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 0612fefe4d..5933259aea 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,15 +4,15 @@ import ( "context" "errors" - host "gx/ipfs/QmPsRtodRuBUir32nz5v4zuSBTSszrR1d3fA6Ahb6eaejj/go-libp2p-host" - inet "gx/ipfs/QmQx1dHDDYENugYgqA22BaBrRfuv1coSsuPiM7rYh1wwGH/go-libp2p-net" - dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" - kbucket "gx/ipfs/QmRVHVr38ChANF2PUMNKQs7Q4uVWCLVabrfcTG9taNbcVy/go-libp2p-kbucket" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" + inet "gx/ipfs/QmRuZnMorqodado1yeTQiv1i9rmtKj29CjPSsBKM7DFXV4/go-libp2p-net" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - loggables "gx/ipfs/QmTMy4hVSY28DdwJ9kBz6y7q6MuioFzPcpM3Ma3aPjo1i3/go-libp2p-loggables" + loggables "gx/ipfs/QmTcfnDHimxBJqx6utpnWqVHdvyquXgkwAvYt4zMaJMKS2/go-libp2p-loggables" + kbucket "gx/ipfs/QmUwZcbSVMsLZzovZssH96rCUM5FAkrjaqhHLhJnFYd5z3/go-libp2p-kbucket" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + host "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" + dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 79c98d8989..7cfe3ba17f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,13 +8,13 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" + pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - record "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record" - pb "gx/ipfs/QmdM4ohF7cr4MvAECVeD3hRA3HtZrk1ngaek4n8ojVT87h/go-libp2p-record/pb" - pstore "gx/ipfs/QmeXj9VAjmYQZxpmVz7VzccbJrpmr8qkCDSjfVNsPTWTYU/go-libp2p-peerstore" - peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" + peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + record "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record" + pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" + dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index b802700e2c..5af0a8fd2d 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmRG9fdibExi5DFy8kzyxF76jvZVUb2mQBUSMNP1YaYn9M/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 33dfe6467ebe3aa5e17dd6ed6031c15026181053 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1499/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@fa89822abc9732670da14f752243bfd46f6838b4 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index cc85d99790..2c99cb502e 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,7 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index baf0d59585..489809b0c4 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -11,10 +11,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 90bbc52139..e9c8a8843f 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -12,8 +12,8 @@ import ( context "context" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 01e0e198b0..bf05924fdb 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 788af5a46c..57826a9982 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -12,7 +12,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) func ignoreCids(_ *cid.Cid) {} From f21d0c6305f8608497a805048ec3bf3cc14eb6ea Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1500/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-keystore@668bab43da04cd97ee9a2640a1c3fd287ae9f2f5 --- keystore/keystore.go | 2 +- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index a18da46200..761cd514df 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" ) type Keystore interface { diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index a58fe778ca..12dd6d29b2 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -7,7 +7,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" + ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 9eec377db9..a6462913b3 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" +import ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" type MemKeystore struct { keys map[string]ci.PrivKey From da0c7152963c7a1e1de89442c24d449b0da2eb61 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1501/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@740dde9d611c679ad112dcc52236892d5936e29a --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 2 +- blockstore/blockstore_test.go | 4 ++-- blockstore/bloom_cache.go | 2 +- blockstore/util/remove.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index d4b85136f0..989f36e114 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -7,8 +7,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) type arccache struct { diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 7e59a49df9..987185e804 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -8,7 +8,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 6313cfffe4..17ab24b3e8 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -15,7 +15,7 @@ import ( dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 0ea102b2ba..6e5216609f 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -12,8 +12,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 7d234b3fc3..63c1c368a4 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index e4ae678682..60cb1aee88 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -7,7 +7,7 @@ import ( bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) // RemovedBlock is used to respresent the result of removing a block. From 687de649285756dca7e2fa6e9deb304b64c2406a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1502/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@a3e72305bf49dc93bf22495b163109486fd9908a --- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 2 +- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 2 +- unixfs/test/utils.go | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index aded131dc2..d36c33c2e2 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 569ee371f0..071eba0556 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -5,7 +5,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) type directoryBuilder struct { diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 9603b08dc5..5970e72b53 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -6,7 +6,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 356a5b1e9b..52e821de98 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,10 +14,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index fdeabbbb29..cdd97038b1 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -19,7 +19,7 @@ import ( context "context" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore) { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 7b9775cff2..c46c4d3e52 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,8 +14,8 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From c8a57ca4e3df2570f75832b5bebcb925ae647bce Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1503/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/interface-go-ipfs-core@c7723c40fead3509cec1fa255fc8531e8e87c744 --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index cf64719476..b506e65096 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - ipld "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + ipld "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) // type CoreAPI interface { From d80198da6e3dd8c0aa5a94a3166fd9b45f77f173 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1504/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@3141caa870c41a8fbce5ab157905a95f5bf07ec4 --- mfs/dir.go | 2 +- mfs/file.go | 2 +- mfs/mfs_test.go | 6 +++--- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index ec6de0a45b..f1a61eefac 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -14,7 +14,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index b61380d77a..a379c802fb 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 7b19f50b3b..74e0d6dfb9 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index d71109226f..8dd7131d8f 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 2b8acea73e..0952de0dd2 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 0578166af6..1c57677b5f 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -18,9 +18,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) var ErrNotExist = errors.New("no such rootfs") From 679a018e5ab7938056bd0c0993d3f5a78052abe9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1505/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@806865119ab7c4ce79d7325135de987d98d7f5ce --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index e109b85feb..6629d67cd4 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index ed700d46f8..db60a37268 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -14,8 +14,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func newObject(data []byte) blocks.Block { From 20b7da53808190fb90abb5911a877c924f613d30 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1506/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@c48251feac46347b694eb83660ffa8454b4640e5 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 0fae10da69..10d6609a0a 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 08c4aaf879..df1b0452b6 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -10,8 +10,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func TestBlockReturnsErr(t *testing.T) { From 913ef5dea81b2022e3c79ff1c034aefad3018f48 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1507/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@f16adb6f37e6afa51a9c1f1d8fa4c76dded0c223 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 62e22c38d2..aabece6b3e 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From c9058e78832167522e91499c0fa5eb429c631fe8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1508/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@281ee7f81f89edc00c9f3c9dd951535ebb0caf8d --- chunker/rabin_test.go | 2 +- chunker/splitting_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 366d44fb82..5603621b2c 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" "github.com/ipfs/go-ipfs/blocks" - "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" "io" "testing" ) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 24c2bdcf9e..bbe1e499fa 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "gx/ipfs/Qmb912gdngC1UWwTkhuW8knyRbcWeu5kqkxBpveLmW8bSr/go-ipfs-util" + u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From 5c6505e8c3ddff5bfa0e9bd906fbf62b527d6abf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 2 Feb 2017 20:09:02 -0800 Subject: [PATCH 1509/3147] update go-multihash and bubble up deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@e8042edfcaea633762680d452fd6ebe1dd3cfe85 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 7e962fff04..93c22ef1ab 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -2,8 +2,8 @@ package dshelp import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" - cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid" ) // TODO: put this code into the go-datastore itself From 5ff02703456b10d03a563767a338648510498340 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 10 Dec 2016 11:25:29 -0800 Subject: [PATCH 1510/3147] add partial resolving to resolver code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@e830b010e6dc488aff1b45ebe0e07ece1a4da731 --- path/resolver.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/path/resolver.go b/path/resolver.go index 1df66303a2..4339fbf0e6 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -73,6 +73,39 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { return c, parts[1:], nil } +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (node.Node, []string, error) { + c, p, err := SplitAbsPath(fpath) + if err != nil { + return nil, nil, err + } + + nd, err := r.DAG.Get(ctx, c) + if err != nil { + return nil, nil, err + } + + for len(p) > 0 { + val, rest, err := nd.Resolve(p) + if err != nil { + return nil, nil, err + } + + switch val := val.(type) { + case *node.Link: + next, err := val.GetNode(ctx, r.DAG) + if err != nil { + return nil, nil, err + } + nd = next + p = rest + default: + return nd, p, nil + } + } + + return nd, nil, nil +} + // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, error) { From ca7ee46771345022cab18b1b6b39695cf1985b97 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 16 Feb 2017 15:19:48 +0100 Subject: [PATCH 1511/3147] deps: update dependencies for PNet License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@cb2bb69ea78f58395e079bffbd0a047ecaebda68 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 30f4140f78..aeffa790b2 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" - mocknet "gx/ipfs/QmSNJRX4uphb3Eyp69uYbpRVvgqjPxfjnJmjcdMWkDH5Pn/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmU3g3psEDiC4tQh1Qu2NYg5aYVQqxC3m74ZavLwPfJEtu/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From c89671ffdaf5354891ee8103fe0e847d038fd868 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 16 Feb 2017 15:19:48 +0100 Subject: [PATCH 1512/3147] deps: update dependencies for PNet License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-routing@de646f0caeae773b8085bbf955f269e45f772c22 --- routing/mock/dht.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index a227232f00..95a9931f96 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - mocknet "gx/ipfs/QmSNJRX4uphb3Eyp69uYbpRVvgqjPxfjnJmjcdMWkDH5Pn/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmU3g3psEDiC4tQh1Qu2NYg5aYVQqxC3m74ZavLwPfJEtu/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 63251ad86f..fb4a8ddda4 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -11,13 +11,13 @@ import ( pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTcfnDHimxBJqx6utpnWqVHdvyquXgkwAvYt4zMaJMKS2/go-libp2p-loggables" + dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" - dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 3ae8bce8d5..a7aaa2b754 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -3,9 +3,9 @@ package proxy import ( context "context" inet "gx/ipfs/QmRuZnMorqodado1yeTQiv1i9rmtKj29CjPSsBKM7DFXV4/go-libp2p-net" + dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 5933259aea..a5ae9061e9 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -8,11 +8,11 @@ import ( inet "gx/ipfs/QmRuZnMorqodado1yeTQiv1i9rmtKj29CjPSsBKM7DFXV4/go-libp2p-net" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmTcfnDHimxBJqx6utpnWqVHdvyquXgkwAvYt4zMaJMKS2/go-libp2p-loggables" + dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" kbucket "gx/ipfs/QmUwZcbSVMsLZzovZssH96rCUM5FAkrjaqhHLhJnFYd5z3/go-libp2p-kbucket" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" host "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" - dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 7cfe3ba17f..25b20724ac 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,11 +10,11 @@ import ( pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" record "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record" pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" - dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 5af0a8fd2d..b4b49e05a4 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmdFu71pRmWMNWht96ZTJ3wRx4D7BPJ2JfHH24z59Gidsc/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 86e81b41f32aae3312637a21a471c7af8aaca7a1 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 16 Feb 2017 20:39:37 -0500 Subject: [PATCH 1513/3147] Refactor EnumerateChildren to avoid need for bestEffort parameter. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@5592a13db4704321f0bdf1610975ecf3238e2a16 --- pinning/pinner/gc/gc.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 2c99cb502e..91bdde2990 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,6 +9,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) var log = logging.Logger("gc") @@ -68,12 +69,12 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. return output, nil } -func Descendants(ctx context.Context, ls dag.LinkService, set *cid.Set, roots []*cid.Cid, bestEffort bool) error { +func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { for _, c := range roots { set.Add(c) // EnumerateChildren recursively walks the dag and adds the keys to the given set - err := dag.EnumerateChildren(ctx, ls, c, set.Visit, bestEffort) + err := dag.EnumerateChildren(ctx, getLinks, c, set.Visit) if err != nil { return err } @@ -86,12 +87,19 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := cid.NewSet() - err := Descendants(ctx, ls, gcs, pn.RecursiveKeys(), false) + err := Descendants(ctx, ls.GetLinks, gcs, pn.RecursiveKeys()) if err != nil { return nil, err } - err = Descendants(ctx, ls, gcs, bestEffortRoots, true) + bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { + links, err := ls.GetLinks(ctx, cid) + if err == dag.ErrNotFound { + err = nil + } + return links, err + } + err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) if err != nil { return nil, err } @@ -100,7 +108,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo gcs.Add(k) } - err = Descendants(ctx, ls, gcs, pn.InternalPins(), false) + err = Descendants(ctx, ls.GetLinks, gcs, pn.InternalPins()) if err != nil { return nil, err } From d7ba73933058bf9a9b810f40682a197fd6ceba51 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Mar 2017 23:06:04 -0800 Subject: [PATCH 1514/3147] update go-libp2p-kad-dht with getclosestpeers fix License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@414c48365f549270ec85f54891a89325b185f51e --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 2 +- namesys/publisher.go | 10 +++++----- namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index ac2307e76c..abbc3c676b 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,7 +35,7 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 84250baa30..9bc856dd44 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,7 +10,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index 78b406d42a..dbc9bfdf6b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,10 +7,10 @@ import ( path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index ca99ff7996..030dd8bfc1 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,7 +10,7 @@ import ( offroute "github.com/ipfs/go-ipfs/routing/offline" "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 8d01937d72..d805612376 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,14 +14,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" - record "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record" - dhtpb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + record "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record" + dhtpb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 89e32033d2..622066e704 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,15 +11,15 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" - recpb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" + recpb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index aeffa790b2..675a436757 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" - mocknet "gx/ipfs/QmU3g3psEDiC4tQh1Qu2NYg5aYVQqxC3m74ZavLwPfJEtu/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + mocknet "gx/ipfs/QmeWJwi61vii5g8zQUB9UGegfUbmhTKHgeDFP9XuSp5jZ4/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 5bc4b3e079..462168f563 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -12,7 +12,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 89b507261c..11236bbcb2 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,12 +9,12 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" mh "gx/ipfs/QmbZ6Cee2uHjG7hf19qLHppgKDRtaG4CVtMzdmK9VCVqLu/go-multihash" ) From b081a313c65d22946bdb49886294b9cc07d4db1a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Mar 2017 23:06:04 -0800 Subject: [PATCH 1515/3147] update go-libp2p-kad-dht with getclosestpeers fix License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-keystore@beb8ea4e790cdcd9e0a1586b3a8c5d97191d936e --- keystore/keystore.go | 2 +- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 761cd514df..b52dabdeaf 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" ) type Keystore interface { diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 12dd6d29b2..58b699888a 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -7,7 +7,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index a6462913b3..2351f54d85 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" +import ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" type MemKeystore struct { keys map[string]ci.PrivKey From 360edf92cc20b19c3d272ee57ee80a126eb8a4ab Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Mar 2017 23:06:04 -0800 Subject: [PATCH 1516/3147] update go-libp2p-kad-dht with getclosestpeers fix License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@7aaad8204d85140d5c9cdcd641ed9c2031511a95 --- routing/mock/centralized_client.go | 8 ++++---- routing/mock/centralized_server.go | 4 ++-- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 8 ++++---- routing/offline/offline.go | 12 ++++++------ routing/supernode/client.go | 18 +++++++++--------- routing/supernode/proxy/loopback.go | 6 +++--- routing/supernode/proxy/standard.go | 14 +++++++------- routing/supernode/server.go | 10 +++++----- routing/supernode/server_test.go | 2 +- 12 files changed, 46 insertions(+), 46 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index b9802adcd9..eb2c183bb8 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,16 +8,16 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" ma "gx/ipfs/QmSWLfmj5frN9xVLMMN846dMDriy5wN5jeghUm7aTW3DAG/go-multiaddr" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" - dhtpb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + dhtpb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 1e83ddb6b1..936c06f144 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,11 +8,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index f6f945ddb1..35a51f16c1 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,9 +8,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 95a9931f96..3bc799a892 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - mocknet "gx/ipfs/QmU3g3psEDiC4tQh1Qu2NYg5aYVQqxC3m74ZavLwPfJEtu/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht" + dht "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmeWJwi61vii5g8zQUB9UGegfUbmhTKHgeDFP9XuSp5jZ4/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 63e4dd5a85..96a5a6f4e2 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 5818b55934..e48ffffda9 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,12 +6,12 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" - p2phost "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + p2phost "gx/ipfs/QmXzeAcmKDTfNZQBiyF22hQKuTK7P5z6MBBQLTk9bbiSUc/go-libp2p-host" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 1ce0da1e7b..5515e49f93 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,16 +7,16 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - ci "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" + ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" - record "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record" - pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" + record "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record" + pb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) var log = logging.Logger("offlinerouting") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index fb4a8ddda4..d96ed3ebc3 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,16 +8,16 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - loggables "gx/ipfs/QmTcfnDHimxBJqx6utpnWqVHdvyquXgkwAvYt4zMaJMKS2/go-libp2p-loggables" - dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" + routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + loggables "gx/ipfs/QmXs1igHHEaUmMxKtbP8Z9wTjitQ75sqxaKQP4QgnLN4nn/go-libp2p-loggables" + "gx/ipfs/QmXzeAcmKDTfNZQBiyF22hQKuTK7P5z6MBBQLTk9bbiSUc/go-libp2p-host" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - routing "gx/ipfs/QmZghcVHwXQC3Zvnvn24LgTmSPkEn2o3PDyKb6nrtPRzRh/go-libp2p-routing" - pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" - "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" + dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" + pb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) var log = logging.Logger("supernode") @@ -56,7 +56,7 @@ func (c *Client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <- case <-ctx.Done(): log.Debug(ctx.Err()) return - case ch <- p: + case ch <- *p: } } }() @@ -125,7 +125,7 @@ func (c *Client) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, err } for _, p := range dhtpb.PBPeersToPeerInfos(response.GetCloserPeers()) { if p.ID == id { - return p, nil + return *p, nil } } return pstore.PeerInfo{}, errors.New("could not find peer") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index a7aaa2b754..f2fa36242b 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" - inet "gx/ipfs/QmRuZnMorqodado1yeTQiv1i9rmtKj29CjPSsBKM7DFXV4/go-libp2p-net" - dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmVtMT3fD7DzQNW7hdm6Xe6KPstzcggrhNpeVZ4422UpKK/go-libp2p-net" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" + dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index a5ae9061e9..69b8812af6 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,15 +4,15 @@ import ( "context" "errors" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" - inet "gx/ipfs/QmRuZnMorqodado1yeTQiv1i9rmtKj29CjPSsBKM7DFXV4/go-libp2p-net" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - loggables "gx/ipfs/QmTcfnDHimxBJqx6utpnWqVHdvyquXgkwAvYt4zMaJMKS2/go-libp2p-loggables" - dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" - kbucket "gx/ipfs/QmUwZcbSVMsLZzovZssH96rCUM5FAkrjaqhHLhJnFYd5z3/go-libp2p-kbucket" + kbucket "gx/ipfs/QmTxn7JEA8DiBvd9vVzErAzadHn6TwjCKTjjUfPyRH9wjZ/go-libp2p-kbucket" + inet "gx/ipfs/QmVtMT3fD7DzQNW7hdm6Xe6KPstzcggrhNpeVZ4422UpKK/go-libp2p-net" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + loggables "gx/ipfs/QmXs1igHHEaUmMxKtbP8Z9wTjitQ75sqxaKQP4QgnLN4nn/go-libp2p-loggables" + host "gx/ipfs/QmXzeAcmKDTfNZQBiyF22hQKuTK7P5z6MBBQLTk9bbiSUc/go-libp2p-host" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - host "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host" + dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 25b20724ac..7744237add 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,13 +8,13 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" + peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer" - record "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record" - pb "gx/ipfs/QmZp9q8DbrGLztoxpkTC62mnRayRwHcAzGJJ8AvYRwjanR/go-libp2p-record/pb" + dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" + record "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record" + pb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" + pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index b4b49e05a4..d08e157bbd 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmUpZqxzrUoyDsgWXDri9yYgi5r5EK7J5Tan1MbgnawYLx/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 64f1fc45db2b5a1cc7aea0f45306eaf7894f8f0a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 20 Jan 2017 10:48:23 -0800 Subject: [PATCH 1517/3147] Implement basic filestore 'no-copy' functionality License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@57285e5ea0aabd3e90ecf2d0be6979cadf4f5ad9 --- filestore/filestore.go | 169 ++++++++++++++++++++++++++++++++++ filestore/filestore_test.go | 104 +++++++++++++++++++++ filestore/fsrefstore.go | 177 ++++++++++++++++++++++++++++++++++++ filestore/pb/Makefile | 10 ++ filestore/pb/dataobj.pb.go | 67 ++++++++++++++ filestore/pb/dataobj.proto | 9 ++ 6 files changed, 536 insertions(+) create mode 100644 filestore/filestore.go create mode 100644 filestore/filestore_test.go create mode 100644 filestore/fsrefstore.go create mode 100644 filestore/pb/Makefile create mode 100644 filestore/pb/dataobj.pb.go create mode 100644 filestore/pb/dataobj.proto diff --git a/filestore/filestore.go b/filestore/filestore.go new file mode 100644 index 0000000000..668b6149cd --- /dev/null +++ b/filestore/filestore.go @@ -0,0 +1,169 @@ +package filestore + +import ( + "context" + + "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-ipfs/blocks/blockstore" + posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" +) + +var log = logging.Logger("filestore") + +type Filestore struct { + fm *FileManager + bs blockstore.Blockstore +} + +func NewFilestore(bs blockstore.Blockstore, fm *FileManager) *Filestore { + return &Filestore{fm, bs} +} + +func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { + ctx, cancel := context.WithCancel(ctx) + + a, err := f.bs.AllKeysChan(ctx) + if err != nil { + return nil, err + } + + out := make(chan *cid.Cid) + go func() { + defer cancel() + defer close(out) + + var done bool + for !done { + select { + case c, ok := <-a: + if !ok { + done = true + continue + } + select { + case out <- c: + case <-ctx.Done(): + return + } + case <-ctx.Done(): + return + } + } + + // Can't do these at the same time because the abstractions around + // leveldb make us query leveldb for both operations. We apparently + // cant query leveldb concurrently + b, err := f.fm.AllKeysChan(ctx) + if err != nil { + log.Error("error querying filestore: ", err) + return + } + + done = false + for !done { + select { + case c, ok := <-b: + if !ok { + done = true + continue + } + select { + case out <- c: + case <-ctx.Done(): + return + } + case <-ctx.Done(): + return + } + } + }() + return out, nil +} + +func (f *Filestore) DeleteBlock(c *cid.Cid) error { + err1 := f.bs.DeleteBlock(c) + if err1 != nil && err1 != blockstore.ErrNotFound { + return err1 + } + + if err2 := f.fm.DeleteBlock(c); err2 != nil { + // if we successfully removed something from the blockstore, but the + // filestore didnt have it, return success + if err1 == nil && err2 != blockstore.ErrNotFound { + return nil + } + return err2 + } + + return nil +} + +func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { + blk, err := f.bs.Get(c) + switch err { + default: + return nil, err + case nil: + return blk, nil + case blockstore.ErrNotFound: + // try filestore + } + + return f.fm.Get(c) +} + +func (f *Filestore) Has(c *cid.Cid) (bool, error) { + has, err := f.bs.Has(c) + if err != nil { + return false, err + } + + if has { + return true, nil + } + + return f.fm.Has(c) +} + +func (f *Filestore) Put(b blocks.Block) error { + switch b := b.(type) { + case *posinfo.FilestoreNode: + return f.fm.Put(b) + default: + return f.bs.Put(b) + } +} + +func (f *Filestore) PutMany(bs []blocks.Block) error { + var normals []blocks.Block + var fstores []*posinfo.FilestoreNode + + for _, b := range bs { + switch b := b.(type) { + case *posinfo.FilestoreNode: + fstores = append(fstores, b) + default: + normals = append(normals, b) + } + } + + if len(normals) > 0 { + err := f.bs.PutMany(normals) + if err != nil { + return err + } + } + + if len(fstores) > 0 { + err := f.fm.PutMany(fstores) + if err != nil { + return err + } + } + return nil +} + +var _ blockstore.Blockstore = (*Filestore)(nil) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go new file mode 100644 index 0000000000..87f180003b --- /dev/null +++ b/filestore/filestore_test.go @@ -0,0 +1,104 @@ +package filestore + +import ( + "bytes" + "context" + "io/ioutil" + "math/rand" + "testing" + + "github.com/ipfs/go-ipfs/blocks/blockstore" + dag "github.com/ipfs/go-ipfs/merkledag" + posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" +) + +func newTestFilestore(t *testing.T) (string, *Filestore) { + mds := ds.NewMapDatastore() + + testdir, err := ioutil.TempDir("", "filestore-test") + if err != nil { + t.Fatal(err) + } + fm := NewFileManager(mds, testdir) + + bs := blockstore.NewBlockstore(mds) + fstore := NewFilestore(bs, fm) + return testdir, fstore +} + +func makeFile(dir string, data []byte) (string, error) { + f, err := ioutil.TempFile(dir, "file") + if err != nil { + return "", err + } + + _, err = f.Write(data) + if err != nil { + return "", err + } + + return f.Name(), nil +} + +func TestBasicFilestore(t *testing.T) { + dir, fs := newTestFilestore(t) + + buf := make([]byte, 1000) + rand.Read(buf) + + fname, err := makeFile(dir, buf) + if err != nil { + t.Fatal(err) + } + + var cids []*cid.Cid + for i := 0; i < 100; i++ { + n := &posinfo.FilestoreNode{ + PosInfo: &posinfo.PosInfo{ + FullPath: fname, + Offset: uint64(i * 10), + }, + Node: dag.NewRawNode(buf[i*10 : (i+1)*10]), + } + + err := fs.Put(n) + if err != nil { + t.Fatal(err) + } + cids = append(cids, n.Node.Cid()) + } + + for i, c := range cids { + blk, err := fs.Get(c) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(blk.RawData(), buf[i*10:(i+1)*10]) { + t.Fatal("data didnt match on the way out") + } + } + + kch, err := fs.AllKeysChan(context.Background()) + if err != nil { + t.Fatal(err) + } + + out := make(map[string]struct{}) + for c := range kch { + out[c.KeyString()] = struct{}{} + } + + if len(out) != len(cids) { + t.Fatal("mismatch in number of entries") + } + + for _, c := range cids { + if _, ok := out[c.KeyString()]; !ok { + t.Fatal("missing cid: ", c) + } + } +} diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go new file mode 100644 index 0000000000..351c81124e --- /dev/null +++ b/filestore/fsrefstore.go @@ -0,0 +1,177 @@ +package filestore + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + + "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-ipfs/blocks/blockstore" + pb "github.com/ipfs/go-ipfs/filestore/pb" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" + dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" +) + +var FilestorePrefix = ds.NewKey("filestore") + +type FileManager struct { + ds ds.Batching + root string +} + +type CorruptReferenceError struct { + Err error +} + +func (c CorruptReferenceError) Error() string { + return c.Err.Error() +} + +func NewFileManager(ds ds.Batching, root string) *FileManager { + return &FileManager{dsns.Wrap(ds, FilestorePrefix), root} +} + +func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { + q := dsq.Query{KeysOnly: true} + q.Prefix = FilestorePrefix.String() + + res, err := f.ds.Query(q) + if err != nil { + return nil, err + } + + out := make(chan *cid.Cid) + go func() { + defer close(out) + for { + v, ok := res.NextSync() + if !ok { + return + } + + k := ds.RawKey(v.Key) + c, err := dshelp.DsKeyToCid(k) + if err != nil { + log.Error("decoding cid from filestore: %s", err) + continue + } + + select { + case out <- c: + case <-ctx.Done(): + return + } + } + }() + + return out, nil +} + +func (f *FileManager) DeleteBlock(c *cid.Cid) error { + err := f.ds.Delete(dshelp.CidToDsKey(c)) + if err == ds.ErrNotFound { + return blockstore.ErrNotFound + } + return err +} + +func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { + o, err := f.ds.Get(dshelp.CidToDsKey(c)) + switch err { + case ds.ErrNotFound: + return nil, blockstore.ErrNotFound + default: + return nil, err + case nil: + // + } + + data, ok := o.([]byte) + if !ok { + return nil, fmt.Errorf("stored filestore dataobj was not a []byte") + } + + var dobj pb.DataObj + if err := proto.Unmarshal(data, &dobj); err != nil { + return nil, err + } + + out, err := f.readDataObj(&dobj) + if err != nil { + return nil, err + } + + return blocks.NewBlockWithCid(out, c) +} + +func (f *FileManager) readDataObj(d *pb.DataObj) ([]byte, error) { + abspath := filepath.Join(f.root, d.GetFilePath()) + + fi, err := os.Open(abspath) + if err != nil { + return nil, &CorruptReferenceError{err} + } + defer fi.Close() + + _, err = fi.Seek(int64(d.GetOffset()), os.SEEK_SET) + if err != nil { + return nil, &CorruptReferenceError{err} + } + + outbuf := make([]byte, d.GetSize_()) + _, err = io.ReadFull(fi, outbuf) + if err != nil { + return nil, &CorruptReferenceError{err} + } + + return outbuf, nil +} + +func (f *FileManager) Has(c *cid.Cid) (bool, error) { + // NOTE: interesting thing to consider. Has doesnt validate the data. + // So the data on disk could be invalid, and we could think we have it. + dsk := dshelp.CidToDsKey(c) + return f.ds.Has(dsk) +} + +func (f *FileManager) Put(b *posinfo.FilestoreNode) error { + var dobj pb.DataObj + + if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { + return fmt.Errorf("cannot add filestore references outside ipfs root") + } + + p, err := filepath.Rel(f.root, b.PosInfo.FullPath) + if err != nil { + return err + } + + dobj.FilePath = proto.String(p) + dobj.Offset = proto.Uint64(b.PosInfo.Offset) + dobj.Size_ = proto.Uint64(uint64(len(b.RawData()))) + + data, err := proto.Marshal(&dobj) + if err != nil { + return err + } + + return f.ds.Put(dshelp.CidToDsKey(b.Cid()), data) +} + +func (f *FileManager) PutMany(bs []*posinfo.FilestoreNode) error { + // TODO: this better + for _, b := range bs { + if err := f.Put(b); err != nil { + return err + } + } + return nil +} diff --git a/filestore/pb/Makefile b/filestore/pb/Makefile new file mode 100644 index 0000000000..5101a482d2 --- /dev/null +++ b/filestore/pb/Makefile @@ -0,0 +1,10 @@ +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --gogo_out=. $< + +clean: + rm *.pb.go diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go new file mode 100644 index 0000000000..6f1005add1 --- /dev/null +++ b/filestore/pb/dataobj.pb.go @@ -0,0 +1,67 @@ +// Code generated by protoc-gen-gogo. +// source: dataobj.proto +// DO NOT EDIT! + +/* +Package datastore_pb is a generated protocol buffer package. + +It is generated from these files: + dataobj.proto + +It has these top-level messages: + DataObj +*/ +package datastore_pb + +import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type DataObj struct { + FilePath *string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath,omitempty"` + Offset *uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset,omitempty"` + Size_ *uint64 `protobuf:"varint,3,opt,name=Size" json:"Size,omitempty"` + Modtime *float64 `protobuf:"fixed64,4,opt,name=Modtime" json:"Modtime,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DataObj) Reset() { *m = DataObj{} } +func (m *DataObj) String() string { return proto.CompactTextString(m) } +func (*DataObj) ProtoMessage() {} + +func (m *DataObj) GetFilePath() string { + if m != nil && m.FilePath != nil { + return *m.FilePath + } + return "" +} + +func (m *DataObj) GetOffset() uint64 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return 0 +} + +func (m *DataObj) GetSize_() uint64 { + if m != nil && m.Size_ != nil { + return *m.Size_ + } + return 0 +} + +func (m *DataObj) GetModtime() float64 { + if m != nil && m.Modtime != nil { + return *m.Modtime + } + return 0 +} + +func init() { + proto.RegisterType((*DataObj)(nil), "datastore.pb.DataObj") +} diff --git a/filestore/pb/dataobj.proto b/filestore/pb/dataobj.proto new file mode 100644 index 0000000000..a5364e5e06 --- /dev/null +++ b/filestore/pb/dataobj.proto @@ -0,0 +1,9 @@ +package datastore.pb; + +message DataObj { + optional string FilePath = 1; + optional uint64 Offset = 2; + optional uint64 Size = 3; + + optional double Modtime = 4; +} From 43b8ea320fcd0b9acae343c45dbb604234f0e8e2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 24 Jan 2017 14:17:29 -0800 Subject: [PATCH 1518/3147] use proper batching for filestore puts License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@ad3c5cc2dabbf6224cb9e89fcae5a3f7cda64267 --- filestore/fsrefstore.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 351c81124e..7b63a039e2 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -142,7 +142,15 @@ func (f *FileManager) Has(c *cid.Cid) (bool, error) { return f.ds.Has(dsk) } +type putter interface { + Put(ds.Key, interface{}) error +} + func (f *FileManager) Put(b *posinfo.FilestoreNode) error { + return f.putTo(b, f.ds) +} + +func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { var dobj pb.DataObj if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { @@ -163,15 +171,20 @@ func (f *FileManager) Put(b *posinfo.FilestoreNode) error { return err } - return f.ds.Put(dshelp.CidToDsKey(b.Cid()), data) + return to.Put(dshelp.CidToDsKey(b.Cid()), data) } func (f *FileManager) PutMany(bs []*posinfo.FilestoreNode) error { - // TODO: this better + batch, err := f.ds.Batch() + if err != nil { + return err + } + for _, b := range bs { - if err := f.Put(b); err != nil { + if err := f.putTo(b, batch); err != nil { return err } } - return nil + + return batch.Commit() } From 773463f40752b74aab9268a110b9f4313d5f1a73 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 24 Jan 2017 15:05:40 -0800 Subject: [PATCH 1519/3147] skip putting blocks we already have License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@699bd277cce3a35ded9c051dce8c2c8055d976a3 --- filestore/filestore.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/filestore/filestore.go b/filestore/filestore.go index 668b6149cd..34a690422b 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -129,6 +129,15 @@ func (f *Filestore) Has(c *cid.Cid) (bool, error) { } func (f *Filestore) Put(b blocks.Block) error { + has, err := f.Has(b.Cid()) + if err != nil { + return err + } + + if has { + return nil + } + switch b := b.(type) { case *posinfo.FilestoreNode: return f.fm.Put(b) @@ -142,6 +151,15 @@ func (f *Filestore) PutMany(bs []blocks.Block) error { var fstores []*posinfo.FilestoreNode for _, b := range bs { + has, err := f.Has(b.Cid()) + if err != nil { + return err + } + + if has { + continue + } + switch b := b.(type) { case *posinfo.FilestoreNode: fstores = append(fstores, b) From a51ad9d02d77bcbd2ecbf7e4d9163e492a7fadf5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 24 Jan 2017 15:46:20 -0800 Subject: [PATCH 1520/3147] fix delete logic License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@14df6d2ae902dc2e4d541b5134ea93f41a09792f --- filestore/filestore.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 34a690422b..81bda68e34 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -89,16 +89,21 @@ func (f *Filestore) DeleteBlock(c *cid.Cid) error { return err1 } - if err2 := f.fm.DeleteBlock(c); err2 != nil { - // if we successfully removed something from the blockstore, but the - // filestore didnt have it, return success - if err1 == nil && err2 != blockstore.ErrNotFound { - return nil + err2 := f.fm.DeleteBlock(c) + // if we successfully removed something from the blockstore, but the + // filestore didnt have it, return success + + switch err2 { + case nil: + return nil + case blockstore.ErrNotFound: + if err1 == blockstore.ErrNotFound { + return blockstore.ErrNotFound } + return nil + default: return err2 } - - return nil } func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { From 8e41cff71c71c8fa0689478ee2acc77768654e33 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 25 Jan 2017 12:20:32 -0800 Subject: [PATCH 1521/3147] add test for deletes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@0b252719deb507894a164531288f918fa0177480 --- filestore/filestore_test.go | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 87f180003b..2b30c79575 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -102,3 +102,63 @@ func TestBasicFilestore(t *testing.T) { } } } + +func randomFileAdd(t *testing.T, fs *Filestore, dir string, size int) (string, []*cid.Cid) { + buf := make([]byte, size) + rand.Read(buf) + + fname, err := makeFile(dir, buf) + if err != nil { + t.Fatal(err) + } + + var out []*cid.Cid + for i := 0; i < size/10; i++ { + n := &posinfo.FilestoreNode{ + PosInfo: &posinfo.PosInfo{ + FullPath: fname, + Offset: uint64(i * 10), + }, + Node: dag.NewRawNode(buf[i*10 : (i+1)*10]), + } + err := fs.Put(n) + if err != nil { + t.Fatal(err) + } + out = append(out, n.Cid()) + } + + return fname, out +} + +func TestDeletes(t *testing.T) { + dir, fs := newTestFilestore(t) + _, cids := randomFileAdd(t, fs, dir, 100) + todelete := cids[:4] + for _, c := range todelete { + err := fs.DeleteBlock(c) + if err != nil { + t.Fatal(err) + } + } + + deleted := make(map[string]bool) + for _, c := range todelete { + _, err := fs.Get(c) + if err != blockstore.ErrNotFound { + t.Fatal("expected blockstore not found error") + } + deleted[c.KeyString()] = true + } + + keys, err := fs.AllKeysChan(context.Background()) + if err != nil { + t.Fatal(err) + } + + for c := range keys { + if deleted[c.KeyString()] { + t.Fatal("shouldnt have reference to this key anymore") + } + } +} From 542fcdeb8eeab249df1b7ad7b9d6e6301ce8fc60 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Jan 2017 00:48:15 -0800 Subject: [PATCH 1522/3147] validate data read from fsrefstore License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@98d19bb981400a104fd669b9edfbcfafc39050e0 --- filestore/fsrefstore.go | 14 ++++++++++++-- filestore/pb/dataobj.pb.go | 16 ++++------------ filestore/pb/dataobj.proto | 2 -- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 7b63a039e2..5cca02d9a3 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -109,11 +109,21 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { return nil, err } + outcid, err := c.Prefix().Sum(out) + if err != nil { + return nil, err + } + + if !c.Equals(outcid) { + return nil, &CorruptReferenceError{fmt.Errorf("data in file did not match. %s offset %d", dobj.GetFilePath(), dobj.GetOffset())} + } + return blocks.NewBlockWithCid(out, c) } func (f *FileManager) readDataObj(d *pb.DataObj) ([]byte, error) { - abspath := filepath.Join(f.root, d.GetFilePath()) + p := filepath.FromSlash(d.GetFilePath()) + abspath := filepath.Join(f.root, p) fi, err := os.Open(abspath) if err != nil { @@ -162,7 +172,7 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { return err } - dobj.FilePath = proto.String(p) + dobj.FilePath = proto.String(filepath.ToSlash(p)) dobj.Offset = proto.Uint64(b.PosInfo.Offset) dobj.Size_ = proto.Uint64(uint64(len(b.RawData()))) diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index 6f1005add1..fadd40c1a4 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -23,11 +23,10 @@ var _ = fmt.Errorf var _ = math.Inf type DataObj struct { - FilePath *string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath,omitempty"` - Offset *uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset,omitempty"` - Size_ *uint64 `protobuf:"varint,3,opt,name=Size" json:"Size,omitempty"` - Modtime *float64 `protobuf:"fixed64,4,opt,name=Modtime" json:"Modtime,omitempty"` - XXX_unrecognized []byte `json:"-"` + FilePath *string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath,omitempty"` + Offset *uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset,omitempty"` + Size_ *uint64 `protobuf:"varint,3,opt,name=Size" json:"Size,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *DataObj) Reset() { *m = DataObj{} } @@ -55,13 +54,6 @@ func (m *DataObj) GetSize_() uint64 { return 0 } -func (m *DataObj) GetModtime() float64 { - if m != nil && m.Modtime != nil { - return *m.Modtime - } - return 0 -} - func init() { proto.RegisterType((*DataObj)(nil), "datastore.pb.DataObj") } diff --git a/filestore/pb/dataobj.proto b/filestore/pb/dataobj.proto index a5364e5e06..c7d7f0eea8 100644 --- a/filestore/pb/dataobj.proto +++ b/filestore/pb/dataobj.proto @@ -4,6 +4,4 @@ message DataObj { optional string FilePath = 1; optional uint64 Offset = 2; optional uint64 Size = 3; - - optional double Modtime = 4; } From dd2eb72250ffbc9497825c83bc054db1b01ab4ad Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 3 Feb 2017 16:21:35 -0500 Subject: [PATCH 1523/3147] Move block verification into readDataObj. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@509462e0b3373bafb78e736ef4c5c3ef5fb8e997 --- filestore/fsrefstore.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 5cca02d9a3..f5e43ad7b4 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -104,24 +104,16 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { return nil, err } - out, err := f.readDataObj(&dobj) + out, err := f.readDataObj(c, &dobj) if err != nil { return nil, err } - outcid, err := c.Prefix().Sum(out) - if err != nil { - return nil, err - } - - if !c.Equals(outcid) { - return nil, &CorruptReferenceError{fmt.Errorf("data in file did not match. %s offset %d", dobj.GetFilePath(), dobj.GetOffset())} - } - return blocks.NewBlockWithCid(out, c) } -func (f *FileManager) readDataObj(d *pb.DataObj) ([]byte, error) { +// reads and verifies the block +func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { p := filepath.FromSlash(d.GetFilePath()) abspath := filepath.Join(f.root, p) @@ -142,6 +134,15 @@ func (f *FileManager) readDataObj(d *pb.DataObj) ([]byte, error) { return nil, &CorruptReferenceError{err} } + outcid, err := c.Prefix().Sum(outbuf) + if err != nil { + return nil, err + } + + if !c.Equals(outcid) { + return nil, &CorruptReferenceError{fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())} + } + return outbuf, nil } From ab697d8dc39eb4b5ae7b42dbac5f284fc2f14f61 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 3 Feb 2017 16:33:51 -0500 Subject: [PATCH 1524/3147] Refactor. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@eb4c49f5ba671d0ce3e25786dccfd996f6c93d93 --- filestore/fsrefstore.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index f5e43ad7b4..382a186d63 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -84,6 +84,20 @@ func (f *FileManager) DeleteBlock(c *cid.Cid) error { } func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { + dobj, err := f.getDataObj(c) + if err != nil { + return nil, err + } + + out, err := f.readDataObj(c, dobj) + if err != nil { + return nil, err + } + + return blocks.NewBlockWithCid(out, c) +} + +func (f *FileManager) getDataObj(c *cid.Cid) (*pb.DataObj, error) { o, err := f.ds.Get(dshelp.CidToDsKey(c)) switch err { case ds.ErrNotFound: @@ -104,12 +118,7 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { return nil, err } - out, err := f.readDataObj(c, &dobj) - if err != nil { - return nil, err - } - - return blocks.NewBlockWithCid(out, c) + return &dobj, nil } // reads and verifies the block From 8b2ac73ae7f51f34e71f453e537c665f7e935a22 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 20 Jan 2017 10:48:23 -0800 Subject: [PATCH 1525/3147] Implement basic filestore 'no-copy' functionality License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@bb463151df6911c3bcd48ab91fa5fbc5ca61e7b1 --- blockstore/blockstore.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 17ab24b3e8..e34c3a8ee8 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -163,7 +163,11 @@ func (bs *blockstore) Has(k *cid.Cid) (bool, error) { } func (s *blockstore) DeleteBlock(k *cid.Cid) error { - return s.datastore.Delete(dshelp.CidToDsKey(k)) + err := s.datastore.Delete(dshelp.CidToDsKey(k)) + if err == ds.ErrNotFound { + return ErrNotFound + } + return err } // AllKeysChan runs a query for keys from the blockstore. From 7595e4a4835fa202556ab151b74ed836d50e03db Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 20 Jan 2017 10:48:23 -0800 Subject: [PATCH 1526/3147] Implement basic filestore 'no-copy' functionality License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@3a4b1d068c2c5958691ecd576b525053b279c356 --- pinning/pinner/gc/gc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 91bdde2990..78289d028d 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -51,7 +51,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. if !gcs.Has(k) { err := bs.DeleteBlock(k) if err != nil { - log.Debugf("Error removing key from blockstore: %s", err) + log.Errorf("Error removing key from blockstore: %s", err) return } select { From a1dc0b323aeb52eef9b72433db009299468fc39f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 3 Feb 2017 18:42:11 -0500 Subject: [PATCH 1527/3147] Use buffered channels in AllKeysChan to increase performance. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@3bdb485d54ea5c7b133c4524867fe4ee54182421 --- filestore/filestore.go | 3 ++- filestore/fsrefstore.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 81bda68e34..eefd925e35 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -7,6 +7,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) @@ -30,7 +31,7 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { return nil, err } - out := make(chan *cid.Cid) + out := make(chan *cid.Cid, dsq.KeysOnlyBufSize) go func() { defer cancel() defer close(out) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 382a186d63..f333a845d6 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -48,7 +48,7 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return nil, err } - out := make(chan *cid.Cid) + out := make(chan *cid.Cid, dsq.KeysOnlyBufSize) go func() { defer close(out) for { From e284d27962aed6101e84ff8be31be64ce56e2bf2 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 19 Feb 2017 22:47:23 -0500 Subject: [PATCH 1528/3147] gc: collect all errors during ColoredSet phase License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@0bdedc0344a9a620f76b478e3c0cbec5d28ad6d5 --- pinning/pinner/gc/gc.go | 53 +++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 78289d028d..a75128af89 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -1,6 +1,7 @@ package gc import ( + "bytes" "context" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" @@ -28,9 +29,9 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. ls = ls.GetOfflineLinkService() - gcs, err := ColoredSet(ctx, pn, ls, bestEffortRoots) - if err != nil { - return nil, err + gcs, errs := ColoredSet(ctx, pn, ls, bestEffortRoots) + if errs != nil { + return nil, &UnsafeToContinueError{errs} } keychan, err := bs.AllKeysChan(ctx) @@ -83,35 +84,61 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid) (*cid.Set, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid) (*cid.Set, []error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. gcs := cid.NewSet() - err := Descendants(ctx, ls.GetLinks, gcs, pn.RecursiveKeys()) + var errors []error + getLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { + links, err := ls.GetLinks(ctx, cid) + if err != nil { + errors = append(errors, err) + } + return links, nil + } + err := Descendants(ctx, getLinks, gcs, pn.RecursiveKeys()) if err != nil { - return nil, err + errors = append(errors, err) } bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { links, err := ls.GetLinks(ctx, cid) - if err == dag.ErrNotFound { - err = nil + if err != nil && err != dag.ErrNotFound { + errors = append(errors, err) } - return links, err + return links, nil } err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) if err != nil { - return nil, err + errors = append(errors, err) } for _, k := range pn.DirectKeys() { gcs.Add(k) } - err = Descendants(ctx, ls.GetLinks, gcs, pn.InternalPins()) + err = Descendants(ctx, getLinks, gcs, pn.InternalPins()) if err != nil { - return nil, err + errors = append(errors, err) + } + + if errors != nil { + return nil, errors + } else { + return gcs, nil } +} - return gcs, nil +type UnsafeToContinueError struct { + Errors []error +} + +func (e *UnsafeToContinueError) Error() string { + var buf bytes.Buffer + for _, err := range e.Errors { + buf.WriteString(err.Error()) + buf.WriteString("\n") + } + buf.WriteString("aborting due to previous errors") + return buf.String() } From a33b48dad891ce43c10ae011b9ae7c78999a5487 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 20 Feb 2017 18:00:57 -0500 Subject: [PATCH 1529/3147] gc: output all errors to a channel Errors from ColoredSet are now reported as encountered and errors encountered when deleting blocks are no longer ignored. License: MIT Signed-off-by: Kevin Atkinson gc: report errors from ColoredSet as encountered License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@c028ab33dfa7c09dc107228a78a18d130507ff58 --- pinning/pinner/gc/gc.go | 105 +++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 38 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index a75128af89..bc9a1e2dcf 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -1,8 +1,9 @@ package gc import ( - "bytes" "context" + "errors" + "fmt" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" dag "github.com/ipfs/go-ipfs/merkledag" @@ -24,50 +25,65 @@ var log = logging.Logger("gc") // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan *cid.Cid, error) { +// +func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan *cid.Cid, <-chan error) { unlocker := bs.GCLock() - ls = ls.GetOfflineLinkService() - gcs, errs := ColoredSet(ctx, pn, ls, bestEffortRoots) - if errs != nil { - return nil, &UnsafeToContinueError{errs} - } - - keychan, err := bs.AllKeysChan(ctx) - if err != nil { - return nil, err - } - output := make(chan *cid.Cid) + errOutput := make(chan error) + go func() { + defer close(errOutput) defer close(output) defer unlocker.Unlock() + + gcs, err := ColoredSet(ctx, pn, ls, bestEffortRoots, errOutput) + if err != nil { + errOutput <- err + return + } + + keychan, err := bs.AllKeysChan(ctx) + if err != nil { + errOutput <- err + return + } + + errors := false + + loop: for { select { case k, ok := <-keychan: if !ok { - return + break loop } if !gcs.Has(k) { err := bs.DeleteBlock(k) if err != nil { - log.Errorf("Error removing key from blockstore: %s", err) - return + errors = true + errOutput <- &CouldNotDeleteBlockError{k, err} + //log.Errorf("Error removing key from blockstore: %s", err) + // continue as error is non-fatal + continue loop } select { case output <- k: case <-ctx.Done(): - return + break loop } } case <-ctx.Done(): - return + break loop } } + if errors { + errOutput <- ErrCouldNotDeleteSomeBlocks + } }() - return output, nil + return output, errOutput } func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { @@ -84,33 +100,37 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid) (*cid.Set, []error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid, errOutput chan<- error) (*cid.Set, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. + errors := false gcs := cid.NewSet() - var errors []error getLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { links, err := ls.GetLinks(ctx, cid) if err != nil { - errors = append(errors, err) + errors = true + errOutput <- &CouldNotFetchLinksError{cid, err} } return links, nil } err := Descendants(ctx, getLinks, gcs, pn.RecursiveKeys()) if err != nil { - errors = append(errors, err) + errors = true + errOutput <- err } bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { links, err := ls.GetLinks(ctx, cid) if err != nil && err != dag.ErrNotFound { - errors = append(errors, err) + errors = true + errOutput <- &CouldNotFetchLinksError{cid, err} } return links, nil } err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) if err != nil { - errors = append(errors, err) + errors = true + errOutput <- err } for _, k := range pn.DirectKeys() { @@ -119,26 +139,35 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo err = Descendants(ctx, getLinks, gcs, pn.InternalPins()) if err != nil { - errors = append(errors, err) + errors = true + errOutput <- err } - if errors != nil { - return nil, errors + if errors { + return nil, ErrCouldNotFetchAllLinks } else { return gcs, nil } } -type UnsafeToContinueError struct { - Errors []error +var ErrCouldNotFetchAllLinks = errors.New("garbage collection aborted: could not retrieve some links") + +var ErrCouldNotDeleteSomeBlocks = errors.New("garbage collection incomplete: could not delete some blocks") + +type CouldNotFetchLinksError struct { + Key *cid.Cid + Err error +} + +func (e *CouldNotFetchLinksError) Error() string { + return fmt.Sprintf("could not retrieve links for %s: %s", e.Key, e.Err) } -func (e *UnsafeToContinueError) Error() string { - var buf bytes.Buffer - for _, err := range e.Errors { - buf.WriteString(err.Error()) - buf.WriteString("\n") - } - buf.WriteString("aborting due to previous errors") - return buf.String() +type CouldNotDeleteBlockError struct { + Key *cid.Cid + Err error +} + +func (e *CouldNotDeleteBlockError) Error() string { + return fmt.Sprintf("could not remove %s: %s", e.Key, e.Err) } From 83f76db7eee2370d06250f875990cae5ec92fcc2 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 24 Feb 2017 14:47:47 -0500 Subject: [PATCH 1530/3147] gc: return Result instead of two channels License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@8fab9b4849e74790ccc426437815179de7b2ad27 --- pinning/pinner/gc/gc.go | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index bc9a1e2dcf..ccf354b451 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -16,6 +16,11 @@ import ( var log = logging.Logger("gc") +type Result struct { + KeyRemoved *cid.Cid + Error error +} + // GC performs a mark and sweep garbage collection of the blocks in the blockstore // first, it creates a 'marked' set and adds to it the following: // - all recursively pinned blocks, plus all of their descendants (recursively) @@ -26,27 +31,25 @@ var log = logging.Logger("gc") // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. // -func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) (<-chan *cid.Cid, <-chan error) { +func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { unlocker := bs.GCLock() ls = ls.GetOfflineLinkService() - output := make(chan *cid.Cid) - errOutput := make(chan error) + output := make(chan Result, 128) go func() { - defer close(errOutput) defer close(output) defer unlocker.Unlock() - gcs, err := ColoredSet(ctx, pn, ls, bestEffortRoots, errOutput) + gcs, err := ColoredSet(ctx, pn, ls, bestEffortRoots, output) if err != nil { - errOutput <- err + output <- Result{Error: err} return } keychan, err := bs.AllKeysChan(ctx) if err != nil { - errOutput <- err + output <- Result{Error: err} return } @@ -63,13 +66,13 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. err := bs.DeleteBlock(k) if err != nil { errors = true - errOutput <- &CouldNotDeleteBlockError{k, err} + output <- Result{Error: &CouldNotDeleteBlockError{k, err}} //log.Errorf("Error removing key from blockstore: %s", err) // continue as error is non-fatal continue loop } select { - case output <- k: + case output <- Result{KeyRemoved: k}: case <-ctx.Done(): break loop } @@ -79,11 +82,11 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. } } if errors { - errOutput <- ErrCouldNotDeleteSomeBlocks + output <- Result{Error: ErrCouldNotDeleteSomeBlocks} } }() - return output, errOutput + return output } func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { @@ -100,7 +103,7 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots return nil } -func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid, errOutput chan<- error) (*cid.Set, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid, output chan<- Result) (*cid.Set, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. errors := false @@ -109,28 +112,28 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo links, err := ls.GetLinks(ctx, cid) if err != nil { errors = true - errOutput <- &CouldNotFetchLinksError{cid, err} + output <- Result{Error: &CouldNotFetchLinksError{cid, err}} } return links, nil } err := Descendants(ctx, getLinks, gcs, pn.RecursiveKeys()) if err != nil { errors = true - errOutput <- err + output <- Result{Error: err} } bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { links, err := ls.GetLinks(ctx, cid) if err != nil && err != dag.ErrNotFound { errors = true - errOutput <- &CouldNotFetchLinksError{cid, err} + output <- Result{Error: &CouldNotFetchLinksError{cid, err}} } return links, nil } err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) if err != nil { errors = true - errOutput <- err + output <- Result{Error: err} } for _, k := range pn.DirectKeys() { @@ -140,7 +143,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo err = Descendants(ctx, getLinks, gcs, pn.InternalPins()) if err != nil { errors = true - errOutput <- err + output <- Result{Error: err} } if errors { From 8c91e506537a31a9f676ac1a7738fa65602a8963 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 6 Mar 2017 20:12:05 -0800 Subject: [PATCH 1531/3147] make raw leaves work with 'ipfs get' License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@a0f5ffd87e16688f755523dffbeb88d9ebdfdb86 --- unixfs/archive/archive.go | 7 ++-- unixfs/archive/tar/writer.go | 68 +++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index a94c9f7afc..b39c71560f 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -3,14 +3,15 @@ package archive import ( "bufio" "compress/gzip" + "context" "io" "path" - cxt "context" - mdag "github.com/ipfs/go-ipfs/merkledag" tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" + + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. @@ -30,7 +31,7 @@ func (i *identityWriteCloser) Close() error { } // DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` -func DagArchive(ctx cxt.Context, nd *mdag.ProtoNode, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { +func DagArchive(ctx context.Context, nd node.Node, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { _, filename := path.Split(name) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 17c43e7170..26492d8978 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -2,17 +2,19 @@ package tar import ( "archive/tar" + "context" + "fmt" "io" "path" "time" - cxt "context" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" + + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) // Writer is a utility structure that helps to write @@ -22,11 +24,11 @@ type Writer struct { Dag mdag.DAGService TarW *tar.Writer - ctx cxt.Context + ctx context.Context } // NewWriter wraps given io.Writer. -func NewWriter(ctx cxt.Context, dag mdag.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { +func NewWriter(ctx context.Context, dag mdag.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { return &Writer{ Dag: dag, TarW: tar.NewWriter(w), @@ -45,13 +47,8 @@ func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { return err } - childpb, ok := child.(*mdag.ProtoNode) - if !ok { - return mdag.ErrNotProtobuf - } - npath := path.Join(fpath, nd.Links()[i].Name) - if err := w.WriteNode(childpb, npath); err != nil { + if err := w.WriteNode(child, npath); err != nil { return err } } @@ -72,25 +69,40 @@ func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error return nil } -func (w *Writer) WriteNode(nd *mdag.ProtoNode, fpath string) error { - pb := new(upb.Data) - if err := proto.Unmarshal(nd.Data(), pb); err != nil { - return err - } +func (w *Writer) WriteNode(nd node.Node, fpath string) error { + switch nd := nd.(type) { + case *mdag.ProtoNode: + pb := new(upb.Data) + if err := proto.Unmarshal(nd.Data(), pb); err != nil { + return err + } + + switch pb.GetType() { + case upb.Data_Metadata: + fallthrough + case upb.Data_Directory: + return w.writeDir(nd, fpath) + case upb.Data_Raw: + fallthrough + case upb.Data_File: + return w.writeFile(nd, pb, fpath) + case upb.Data_Symlink: + return writeSymlinkHeader(w.TarW, string(pb.GetData()), fpath) + default: + return ft.ErrUnrecognizedType + } + case *mdag.RawNode: + if err := writeFileHeader(w.TarW, fpath, uint64(len(nd.RawData()))); err != nil { + return err + } - switch pb.GetType() { - case upb.Data_Metadata: - fallthrough - case upb.Data_Directory: - return w.writeDir(nd, fpath) - case upb.Data_Raw: - fallthrough - case upb.Data_File: - return w.writeFile(nd, pb, fpath) - case upb.Data_Symlink: - return writeSymlinkHeader(w.TarW, string(pb.GetData()), fpath) + if _, err := w.TarW.Write(nd.RawData()); err != nil { + return err + } + w.TarW.Flush() + return nil default: - return ft.ErrUnrecognizedType + return fmt.Errorf("nodes of type %T are not supported in unixfs", nd) } } From b5c93d1470afc63122ca2a55ad8fd11ac0fc5f4f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 14 Mar 2017 00:57:13 +0100 Subject: [PATCH 1532/3147] fix: remove bloom filter check on Put call in blockstore To prevent put we need to have conclusive information if item is contained in the repo, bloom filter won't give this information. It only says if it is for sure not contained. License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@985475b8f70698bcd6c80d3b54e3844931868546 --- blockstore/bloom_cache.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 63c1c368a4..5c8c76ad52 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -142,10 +142,7 @@ func (b *bloomcache) Get(k *cid.Cid) (blocks.Block, error) { } func (b *bloomcache) Put(bl blocks.Block) error { - if has, ok := b.hasCached(bl.Cid()); ok && has { - return nil - } - + // See comment in PutMany err := b.blockstore.Put(bl) if err == nil { b.bloom.AddTS(bl.Cid().Bytes()) @@ -155,7 +152,7 @@ func (b *bloomcache) Put(bl blocks.Block) error { func (b *bloomcache) PutMany(bs []blocks.Block) error { // bloom cache gives only conclusive resulty if key is not contained - // to reduce number of puts we need conclusive infomration if block is contained + // to reduce number of puts we need conclusive information if block is contained // this means that PutMany can't be improved with bloom cache so we just // just do a passthrough. err := b.blockstore.PutMany(bs) From 295f1305501eabc7645b7d947d823148c3b0bb56 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Wed, 16 Nov 2016 06:21:15 +0100 Subject: [PATCH 1533/3147] coreapi: smarter way of dealing with the different APIs License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/interface-go-ipfs-core@e69000d481d335aef4d610be31750e8558f3b795 --- coreiface/interface.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index b506e65096..7bf9d5c0ac 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -9,11 +9,6 @@ import ( ipld "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) -// type CoreAPI interface { -// ID() CoreID -// Version() CoreVersion -// } - type Link ipld.Link type Reader interface { @@ -21,6 +16,10 @@ type Reader interface { io.Closer } +type CoreAPI interface { + Unixfs() UnixfsAPI +} + type UnixfsAPI interface { Add(context.Context, io.Reader) (*cid.Cid, error) Cat(context.Context, string) (Reader, error) From 61e07c830c0222fbd796118e7784e24ecf1c7e24 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Fri, 17 Mar 2017 03:47:59 +0100 Subject: [PATCH 1534/3147] coreapi: make the interfaces path centric The new coreiface.Path maps a path to the cid.Cid resulting from a full path resolution. The path is internally represented as a go-ipfs/path.Path, but that doesn't matter to the outside. Apart from the path-to-CID mapping, it also aims to hold all resolved segment CIDs of the path. Right now it only exposes Root(), and only for flat paths a la /ipfs/Qmfoo. In other cases, the root is nil. In the future, resolution will internally use go-ipfs/path.Resolver.ResolvePathComponents and thus always return the proper resolved segments, via Root(), or a future Segments() func. - Add coreiface.Path with Cid() and Root(). - Add CoreAPI.ResolvePath() for getting a coreiface.Path. - All functions now expect and return coreiface.Path. - Add ParsePath() and ParseCid() for constructing a coreiface.Path. - Add coreiface.Node and Link which are simply go-ipld-node.Node and Link. - Add CoreAPI.ResolveNode() for getting a Node from a Path. License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/interface-go-ipfs-core@66af039105d5e4ebc82a178143d8643ad3fed91d --- coreiface/interface.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 7bf9d5c0ac..d72fc8a3b0 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -9,6 +9,16 @@ import ( ipld "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) +type Path interface { + String() string + Cid() *cid.Cid + Root() *cid.Cid + Resolved() bool +} + +// TODO: should we really copy these? +// if we didn't, godoc would generate nice links straight to go-ipld-node +type Node ipld.Node type Link ipld.Link type Reader interface { @@ -18,12 +28,14 @@ type Reader interface { type CoreAPI interface { Unixfs() UnixfsAPI + ResolvePath(context.Context, Path) (Path, error) + ResolveNode(context.Context, Path) (Node, error) } type UnixfsAPI interface { - Add(context.Context, io.Reader) (*cid.Cid, error) - Cat(context.Context, string) (Reader, error) - Ls(context.Context, string) ([]*Link, error) + Add(context.Context, io.Reader) (Path, error) + Cat(context.Context, Path) (Reader, error) + Ls(context.Context, Path) ([]*Link, error) } // type ObjectAPI interface { @@ -49,5 +61,4 @@ type UnixfsAPI interface { // } var ErrIsDir = errors.New("object is a directory") -var ErrIsNonDag = errors.New("not a merkledag object") var ErrOffline = errors.New("can't resolve, ipfs node is offline") From 2aa25233c700d98900bf73f515675cf1c39b19f3 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 16 Mar 2017 09:41:35 +0100 Subject: [PATCH 1535/3147] Docs: Improve Readme and make golint happy License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-util@5e06988d92bcaaae765b36db9b70de3afc66418f --- util/README.md | 18 ++++++++++++++++++ util/file.go | 1 + util/time.go | 5 +++++ util/util.go | 12 +++++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/util/README.md b/util/README.md index 766f3812bc..33bff12cd5 100644 --- a/util/README.md +++ b/util/README.md @@ -10,8 +10,26 @@ ## Install +This is a Go module which can be installed with `go get github.com/ipfs/go-ipfs-util`. `go-ipfs-util` is however packaged with Gx, so it is recommended to use Gx to install it (see Usage section). + ## Usage +This module is packaged with [Gx](https://github.com/whyrusleeping/gx). +In order to use it in your own project do: + +``` +go get -u github.com/whyrusleeping/gx +go get -u github.com/whyrusleeping/gx-go +cd +gx init +gx import github.com/ipfs/go-ipfs-util +gx install --global +gx-go --rewrite +``` + +Please check [Gx](https://github.com/whyrusleeping/gx) and [Gx-go](https://github.com/whyrusleeping/gx-go) documentation for more information. + + ## Contribute Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/go-ipfs-util/issues)! diff --git a/util/file.go b/util/file.go index e3bd49d717..e6e30df4d3 100644 --- a/util/file.go +++ b/util/file.go @@ -2,6 +2,7 @@ package util import "os" +// FileExists check if the file with the given path exits. func FileExists(filename string) bool { fi, err := os.Lstat(filename) if fi != nil || (err != nil && !os.IsNotExist(err)) { diff --git a/util/time.go b/util/time.go index 5fc6ec66dc..37d720fb1b 100644 --- a/util/time.go +++ b/util/time.go @@ -2,8 +2,11 @@ package util import "time" +// TimeFormatIpfs is the format ipfs uses to represent time in string form. var TimeFormatIpfs = time.RFC3339Nano +// ParseRFC3339 parses an RFC3339Nano-formatted time stamp and +// returns the UTC time. func ParseRFC3339(s string) (time.Time, error) { t, err := time.Parse(TimeFormatIpfs, s) if err != nil { @@ -12,6 +15,8 @@ func ParseRFC3339(s string) (time.Time, error) { return t.UTC(), nil } +// FormatRFC3339 returns the string representation of the +// UTC value of the given time in RFC3339Nano format. func FormatRFC3339(t time.Time) string { return t.UTC().Format(TimeFormatIpfs) } diff --git a/util/util.go b/util/util.go index 28873fd029..fb4dd98284 100644 --- a/util/util.go +++ b/util/util.go @@ -28,7 +28,7 @@ var ErrNotImplemented = errors.New("Error: not implemented yet.") // ErrTimeout implies that a timeout has been triggered var ErrTimeout = errors.New("Error: Call timed out.") -// ErrSeErrSearchIncomplete implies that a search type operation didnt +// ErrSearchIncomplete implies that a search type operation didnt // find the expected node, but did find 'a' node. var ErrSearchIncomplete = errors.New("Error: Search Incomplete.") @@ -57,6 +57,8 @@ type randGen struct { rand.Rand } +// NewTimeSeededRand returns a random bytes reader +// which has been initialized with the current time. func NewTimeSeededRand() io.Reader { src := rand.NewSource(time.Now().UnixNano()) return &randGen{ @@ -64,6 +66,8 @@ func NewTimeSeededRand() io.Reader { } } +// NewSeededRand returns a random bytes reader +// initialized with the given seed. func NewSeededRand(seed int64) io.Reader { src := rand.NewSource(seed) return &randGen{ @@ -102,6 +106,9 @@ func (m MultiErr) Error() string { return s } +// Partition splits a subject 3 parts: prefix, separator, suffix. +// The first occurrence of the separator will be matched. +// ie. Partition("Ready, steady, go!", ", ") -> ["Ready", ", ", "steady, go!"] func Partition(subject string, sep string) (string, string, string) { if i := strings.Index(subject, sep); i != -1 { return subject[:i], subject[i : i+len(sep)], subject[i+len(sep):] @@ -109,6 +116,9 @@ func Partition(subject string, sep string) (string, string, string) { return subject, "", "" } +// RPartition splits a subject 3 parts: prefix, separator, suffix. +// The last occurrence of the separator will be matched. +// ie. RPartition("Ready, steady, go!", ", ") -> ["Ready, steady", ", ", "go!"] func RPartition(subject string, sep string) (string, string, string) { if i := strings.LastIndex(subject, sep); i != -1 { return subject[:i], subject[i : i+len(sep)], subject[i+len(sep):] From b71f41bbf535cca99f25ea98d56d145dfcc1054e Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 20 Mar 2017 14:46:02 -0400 Subject: [PATCH 1536/3147] gc: address CR comments License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@9a4b4e93aa0a1474867a025425df040621fa8473 --- pinning/pinner/gc/gc.go | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ccf354b451..4a990da9a9 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -16,6 +16,8 @@ import ( var log = logging.Logger("gc") +// Result represents an incremental output from a garbage collection +// run. It contains either an error, or the cid of a removed object. type Result struct { KeyRemoved *cid.Cid Error error @@ -66,7 +68,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. err := bs.DeleteBlock(k) if err != nil { errors = true - output <- Result{Error: &CouldNotDeleteBlockError{k, err}} + output <- Result{Error: &CannotDeleteBlockError{k, err}} //log.Errorf("Error removing key from blockstore: %s", err) // continue as error is non-fatal continue loop @@ -82,7 +84,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. } } if errors { - output <- Result{Error: ErrCouldNotDeleteSomeBlocks} + output <- Result{Error: ErrCannotDeleteSomeBlocks} } }() @@ -103,6 +105,8 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots return nil } +// ColoredSet computes the set of nodes in the graph that are pinned by the +// pins in the given pinner. func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid, output chan<- Result) (*cid.Set, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. @@ -112,7 +116,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo links, err := ls.GetLinks(ctx, cid) if err != nil { errors = true - output <- Result{Error: &CouldNotFetchLinksError{cid, err}} + output <- Result{Error: &CannotFetchLinksError{cid, err}} } return links, nil } @@ -126,7 +130,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo links, err := ls.GetLinks(ctx, cid) if err != nil && err != dag.ErrNotFound { errors = true - output <- Result{Error: &CouldNotFetchLinksError{cid, err}} + output <- Result{Error: &CannotFetchLinksError{cid, err}} } return links, nil } @@ -147,30 +151,30 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo } if errors { - return nil, ErrCouldNotFetchAllLinks - } else { - return gcs, nil + return nil, ErrCannotFetchAllLinks } + + return gcs, nil } -var ErrCouldNotFetchAllLinks = errors.New("garbage collection aborted: could not retrieve some links") +var ErrCannotFetchAllLinks = errors.New("garbage collection aborted: could not retrieve some links") -var ErrCouldNotDeleteSomeBlocks = errors.New("garbage collection incomplete: could not delete some blocks") +var ErrCannotDeleteSomeBlocks = errors.New("garbage collection incomplete: could not delete some blocks") -type CouldNotFetchLinksError struct { +type CannotFetchLinksError struct { Key *cid.Cid Err error } -func (e *CouldNotFetchLinksError) Error() string { +func (e *CannotFetchLinksError) Error() string { return fmt.Sprintf("could not retrieve links for %s: %s", e.Key, e.Err) } -type CouldNotDeleteBlockError struct { +type CannotDeleteBlockError struct { Key *cid.Cid Err error } -func (e *CouldNotDeleteBlockError) Error() string { +func (e *CannotDeleteBlockError) Error() string { return fmt.Sprintf("could not remove %s: %s", e.Key, e.Err) } From 407cacfe3615cfb7415dad85f33fb0c99742dd74 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 4 Aug 2016 12:45:00 -0700 Subject: [PATCH 1537/3147] implement an HAMT for unixfs directory sharding License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@21a5430e46a58a6703e8f5110853512da15fc7b4 --- unixfs/format.go | 1 + unixfs/hamt/hamt.go | 464 +++++++++++++++++++++++++++ unixfs/hamt/hamt_stress_test.go | 280 ++++++++++++++++ unixfs/hamt/hamt_test.go | 552 ++++++++++++++++++++++++++++++++ unixfs/hamt/util.go | 61 ++++ unixfs/hamt/util_test.go | 58 ++++ unixfs/io/dirbuilder.go | 142 ++++++-- unixfs/io/dirbuilder_test.go | 138 +++++++- unixfs/io/resolve.go | 36 +-- unixfs/pb/unixfs.pb.go | 19 ++ unixfs/pb/unixfs.proto | 4 + 11 files changed, 1699 insertions(+), 56 deletions(-) create mode 100644 unixfs/hamt/hamt.go create mode 100644 unixfs/hamt/hamt_stress_test.go create mode 100644 unixfs/hamt/hamt_test.go create mode 100644 unixfs/hamt/util.go create mode 100644 unixfs/hamt/util_test.go diff --git a/unixfs/format.go b/unixfs/format.go index 96dd109d17..4157ec0e57 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -17,6 +17,7 @@ const ( TDirectory = pb.Data_Directory TMetadata = pb.Data_Metadata TSymlink = pb.Data_Symlink + THAMTShard = pb.Data_HAMTShard ) var ErrMalformedFileFormat = errors.New("malformed data in file format") diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go new file mode 100644 index 0000000000..05b9402fdc --- /dev/null +++ b/unixfs/hamt/hamt.go @@ -0,0 +1,464 @@ +package hamt + +import ( + "context" + "fmt" + "math" + "math/big" + "os" + + dag "github.com/ipfs/go-ipfs/merkledag" + format "github.com/ipfs/go-ipfs/unixfs" + upb "github.com/ipfs/go-ipfs/unixfs/pb" + + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" +) + +const ( + HashMurmur3 uint64 = 0x22 +) + +type HamtShard struct { + nd *dag.ProtoNode + + bitfield *big.Int + + children []child + + tableSize int + tableSizeLg2 int + + hashFunc uint64 + + prefixPadStr string + maxpadlen int + + dserv dag.DAGService +} + +// child can either be another shard, or a leaf node value +type child interface { + Node() (node.Node, error) + Label() string +} + +func NewHamtShard(dserv dag.DAGService, size int) *HamtShard { + ds := makeHamtShard(dserv, size) + ds.bitfield = big.NewInt(0) + ds.nd = new(dag.ProtoNode) + ds.hashFunc = HashMurmur3 + return ds +} + +func makeHamtShard(ds dag.DAGService, size int) *HamtShard { + maxpadding := fmt.Sprintf("%X", size-1) + return &HamtShard{ + tableSizeLg2: int(math.Log2(float64(size))), + prefixPadStr: fmt.Sprintf("%%0%dX", len(maxpadding)), + maxpadlen: len(maxpadding), + tableSize: size, + dserv: ds, + } +} + +func NewHamtFromDag(dserv dag.DAGService, nd node.Node) (*HamtShard, error) { + pbnd, ok := nd.(*dag.ProtoNode) + if !ok { + return nil, dag.ErrLinkNotFound + } + + pbd, err := format.FromBytes(pbnd.Data()) + if err != nil { + return nil, err + } + + if pbd.GetType() != upb.Data_HAMTShard { + return nil, fmt.Errorf("node was not a dir shard") + } + + if pbd.GetHashType() != HashMurmur3 { + return nil, fmt.Errorf("only murmur3 supported as hash function") + } + + ds := makeHamtShard(dserv, int(pbd.GetFanout())) + ds.nd = pbnd.Copy().(*dag.ProtoNode) + ds.children = make([]child, len(pbnd.Links())) + ds.bitfield = new(big.Int).SetBytes(pbd.GetData()) + ds.hashFunc = pbd.GetHashType() + + return ds, nil +} + +// Node serializes the HAMT structure into a merkledag node with unixfs formatting +func (ds *HamtShard) Node() (node.Node, error) { + out := new(dag.ProtoNode) + + // TODO: optimized 'for each set bit' + for i := 0; i < ds.tableSize; i++ { + if ds.bitfield.Bit(i) == 0 { + continue + } + + cindex := ds.indexForBitPos(i) + ch := ds.children[cindex] + if ch != nil { + cnd, err := ch.Node() + if err != nil { + return nil, err + } + + err = out.AddNodeLinkClean(ds.linkNamePrefix(i)+ch.Label(), cnd) + if err != nil { + return nil, err + } + } else { + // child unloaded, just copy in link with updated name + lnk := ds.nd.Links()[cindex] + label := lnk.Name[ds.maxpadlen:] + + err := out.AddRawLink(ds.linkNamePrefix(i)+label, lnk) + if err != nil { + return nil, err + } + } + } + + typ := upb.Data_HAMTShard + data, err := proto.Marshal(&upb.Data{ + Type: &typ, + Fanout: proto.Uint64(uint64(ds.tableSize)), + HashType: proto.Uint64(HashMurmur3), + Data: ds.bitfield.Bytes(), + }) + if err != nil { + return nil, err + } + + out.SetData(data) + + _, err = ds.dserv.Add(out) + if err != nil { + return nil, err + } + + return out, nil +} + +type shardValue struct { + key string + val node.Node +} + +func (sv *shardValue) Node() (node.Node, error) { + return sv.val, nil +} + +func (sv *shardValue) Label() string { + return sv.key +} + +func hash(val []byte) []byte { + h := murmur3.New64() + h.Write(val) + return h.Sum(nil) +} + +// Label for HamtShards is the empty string, this is used to differentiate them from +// value entries +func (ds *HamtShard) Label() string { + return "" +} + +// Set sets 'name' = nd in the HAMT +func (ds *HamtShard) Set(ctx context.Context, name string, nd node.Node) error { + hv := &hashBits{b: hash([]byte(name))} + return ds.modifyValue(ctx, hv, name, nd) +} + +// Remove deletes the named entry if it exists, this operation is idempotent. +func (ds *HamtShard) Remove(ctx context.Context, name string) error { + hv := &hashBits{b: hash([]byte(name))} + return ds.modifyValue(ctx, hv, name, nil) +} + +func (ds *HamtShard) Find(ctx context.Context, name string) (node.Node, error) { + hv := &hashBits{b: hash([]byte(name))} + + var out node.Node + err := ds.getValue(ctx, hv, name, func(sv *shardValue) error { + out = sv.val + return nil + }) + + return out, err +} + +// getChild returns the i'th child of this shard. If it is cached in the +// children array, it will return it from there. Otherwise, it loads the child +// node from disk. +func (ds *HamtShard) getChild(ctx context.Context, i int) (child, error) { + if i >= len(ds.children) || i < 0 { + return nil, fmt.Errorf("invalid index passed to getChild (likely corrupt bitfield)") + } + + if len(ds.children) != len(ds.nd.Links()) { + return nil, fmt.Errorf("inconsistent lengths between children array and Links array") + } + + c := ds.children[i] + if c != nil { + return c, nil + } + + return ds.loadChild(ctx, i) +} + +// loadChild reads the i'th child node of this shard from disk and returns it +// as a 'child' interface +func (ds *HamtShard) loadChild(ctx context.Context, i int) (child, error) { + lnk := ds.nd.Links()[i] + if len(lnk.Name) < ds.maxpadlen { + return nil, fmt.Errorf("invalid link name '%s'", lnk.Name) + } + + nd, err := lnk.GetNode(ctx, ds.dserv) + if err != nil { + return nil, err + } + + var c child + if len(lnk.Name) == ds.maxpadlen { + pbnd, ok := nd.(*dag.ProtoNode) + if !ok { + return nil, dag.ErrNotProtobuf + } + + pbd, err := format.FromBytes(pbnd.Data()) + if err != nil { + return nil, err + } + + if pbd.GetType() != format.THAMTShard { + return nil, fmt.Errorf("HAMT entries must have non-zero length name") + } + + cds, err := NewHamtFromDag(ds.dserv, nd) + if err != nil { + return nil, err + } + + c = cds + } else { + c = &shardValue{ + key: lnk.Name[ds.maxpadlen:], + val: nd, + } + } + + ds.children[i] = c + return c, nil +} + +func (ds *HamtShard) setChild(i int, c child) { + ds.children[i] = c +} + +func (ds *HamtShard) insertChild(idx int, key string, val node.Node) error { + if val == nil { + return os.ErrNotExist + } + + i := ds.indexForBitPos(idx) + ds.bitfield.SetBit(ds.bitfield, idx, 1) + sv := &shardValue{ + key: key, + val: val, + } + + ds.children = append(ds.children[:i], append([]child{sv}, ds.children[i:]...)...) + ds.nd.SetLinks(append(ds.nd.Links()[:i], append([]*node.Link{nil}, ds.nd.Links()[i:]...)...)) + return nil +} + +func (ds *HamtShard) rmChild(i int) error { + if i < 0 || i >= len(ds.children) || i >= len(ds.nd.Links()) { + return fmt.Errorf("hamt: attempted to remove child with out of range index") + } + + copy(ds.children[i:], ds.children[i+1:]) + ds.children = ds.children[:len(ds.children)-1] + + copy(ds.nd.Links()[i:], ds.nd.Links()[i+1:]) + ds.nd.SetLinks(ds.nd.Links()[:len(ds.nd.Links())-1]) + + return nil +} + +func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*shardValue) error) error { + idx := hv.Next(ds.tableSizeLg2) + if ds.bitfield.Bit(int(idx)) == 1 { + cindex := ds.indexForBitPos(idx) + + child, err := ds.getChild(ctx, cindex) + if err != nil { + return err + } + + switch child := child.(type) { + case *HamtShard: + return child.getValue(ctx, hv, key, cb) + case *shardValue: + if child.key == key { + return cb(child) + } + } + } + + return os.ErrNotExist +} + +func (ds *HamtShard) EnumLinks() ([]*node.Link, error) { + var links []*node.Link + err := ds.walkTrie(func(sv *shardValue) error { + lnk, err := node.MakeLink(sv.val) + if err != nil { + return err + } + + lnk.Name = sv.key + + links = append(links, lnk) + return nil + }) + if err != nil { + return nil, err + } + + return links, nil +} + +func (ds *HamtShard) walkTrie(cb func(*shardValue) error) error { + for i := 0; i < ds.tableSize; i++ { + if ds.bitfield.Bit(i) == 0 { + continue + } + + idx := ds.indexForBitPos(i) + // NOTE: an optimized version could simply iterate over each + // element in the 'children' array. + c, err := ds.getChild(context.TODO(), idx) + if err != nil { + return err + } + + switch c := c.(type) { + case *shardValue: + err := cb(c) + if err != nil { + return err + } + + case *HamtShard: + err := c.walkTrie(cb) + if err != nil { + return err + } + default: + return fmt.Errorf("unexpected child type: %#v", c) + } + } + return nil +} + +func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, val node.Node) error { + idx := hv.Next(ds.tableSizeLg2) + + if ds.bitfield.Bit(idx) != 1 { + return ds.insertChild(idx, key, val) + } + + cindex := ds.indexForBitPos(idx) + + child, err := ds.getChild(ctx, cindex) + if err != nil { + return err + } + + switch child := child.(type) { + case *HamtShard: + err := child.modifyValue(ctx, hv, key, val) + if err != nil { + return err + } + + if val == nil { + switch len(child.children) { + case 0: + // empty sub-shard, prune it + // Note: this shouldnt normally ever happen + // in the event of another implementation creates flawed + // structures, this will help to normalize them. + ds.bitfield.SetBit(ds.bitfield, idx, 0) + return ds.rmChild(cindex) + case 1: + nchild, ok := child.children[0].(*shardValue) + if ok { + // sub-shard with a single value element, collapse it + ds.setChild(cindex, nchild) + } + return nil + } + } + + return nil + case *shardValue: + switch { + case val == nil: // passing a nil value signifies a 'delete' + ds.bitfield.SetBit(ds.bitfield, idx, 0) + return ds.rmChild(cindex) + + case child.key == key: // value modification + child.val = val + return nil + + default: // replace value with another shard, one level deeper + ns := NewHamtShard(ds.dserv, ds.tableSize) + chhv := &hashBits{ + b: hash([]byte(child.key)), + consumed: hv.consumed, + } + + err := ns.modifyValue(ctx, hv, key, val) + if err != nil { + return err + } + + err = ns.modifyValue(ctx, chhv, child.key, child.val) + if err != nil { + return err + } + + ds.setChild(cindex, ns) + return nil + } + default: + return fmt.Errorf("unexpected type for child: %#v", child) + } +} + +func (ds *HamtShard) indexForBitPos(bp int) int { + // TODO: an optimization could reuse the same 'mask' here and change the size + // as needed. This isnt yet done as the bitset package doesnt make it easy + // to do. + mask := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(bp)), nil), big.NewInt(1)) + mask.And(mask, ds.bitfield) + + return popCount(mask) +} + +// linkNamePrefix takes in the bitfield index of an entry and returns its hex prefix +func (ds *HamtShard) linkNamePrefix(idx int) string { + return fmt.Sprintf(ds.prefixPadStr, idx) +} diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go new file mode 100644 index 0000000000..83ad25597e --- /dev/null +++ b/unixfs/hamt/hamt_stress_test.go @@ -0,0 +1,280 @@ +package hamt + +import ( + "bufio" + "context" + "fmt" + "math/rand" + "os" + "strconv" + "strings" + "testing" + "time" + + dag "github.com/ipfs/go-ipfs/merkledag" + mdtest "github.com/ipfs/go-ipfs/merkledag/test" + ft "github.com/ipfs/go-ipfs/unixfs" +) + +func getNames(prefix string, count int) []string { + out := make([]string, count) + for i := 0; i < count; i++ { + out[i] = fmt.Sprintf("%s%d", prefix, i) + } + return out +} + +const ( + opAdd = iota + opDel + opFind +) + +type testOp struct { + Op int + Val string +} + +func stringArrToSet(arr []string) map[string]bool { + out := make(map[string]bool) + for _, s := range arr { + out[s] = true + } + return out +} + +// generate two different random sets of operations to result in the same +// ending directory (same set of entries at the end) and execute each of them +// in turn, then compare to ensure the output is the same on each. +func TestOrderConsistency(t *testing.T) { + seed := time.Now().UnixNano() + t.Logf("using seed = %d", seed) + ds := mdtest.Mock() + + shardWidth := 1024 + + keep := getNames("good", 4000) + temp := getNames("tempo", 6000) + + ops := genOpSet(seed, keep, temp) + s, err := executeOpSet(t, ds, shardWidth, ops) + if err != nil { + t.Fatal(err) + } + + err = validateOpSetCompletion(t, s, keep, temp) + if err != nil { + t.Fatal(err) + } + + ops2 := genOpSet(seed+1000, keep, temp) + s2, err := executeOpSet(t, ds, shardWidth, ops2) + if err != nil { + t.Fatal(err) + } + + err = validateOpSetCompletion(t, s2, keep, temp) + if err != nil { + t.Fatal(err) + } + + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + nd2, err := s2.Node() + if err != nil { + t.Fatal(err) + } + + k := nd.Cid() + k2 := nd2.Cid() + + if !k.Equals(k2) { + t.Fatal("got different results: ", k, k2) + } +} + +func validateOpSetCompletion(t *testing.T, s *HamtShard, keep, temp []string) error { + ctx := context.TODO() + for _, n := range keep { + _, err := s.Find(ctx, n) + if err != nil { + return fmt.Errorf("couldnt find %s: %s", n, err) + } + } + + for _, n := range temp { + _, err := s.Find(ctx, n) + if err != os.ErrNotExist { + return fmt.Errorf("expected not to find: %s", err) + } + } + + return nil +} + +func executeOpSet(t *testing.T, ds dag.DAGService, width int, ops []testOp) (*HamtShard, error) { + ctx := context.TODO() + s := NewHamtShard(ds, width) + e := ft.EmptyDirNode() + ds.Add(e) + + for _, o := range ops { + switch o.Op { + case opAdd: + err := s.Set(ctx, o.Val, e) + if err != nil { + return nil, fmt.Errorf("inserting %s: %s", o.Val, err) + } + case opDel: + err := s.Remove(ctx, o.Val) + if err != nil { + return nil, fmt.Errorf("deleting %s: %s", o.Val, err) + } + case opFind: + _, err := s.Find(ctx, o.Val) + if err != nil { + return nil, fmt.Errorf("finding %s: %s", o.Val, err) + } + } + } + + return s, nil +} + +func genOpSet(seed int64, keep, temp []string) []testOp { + tempset := stringArrToSet(temp) + + allnames := append(keep, temp...) + shuffle(seed, allnames) + + var todel []string + + var ops []testOp + + for { + n := len(allnames) + len(todel) + if n == 0 { + return ops + } + + rn := rand.Intn(n) + + if rn < len(allnames) { + next := allnames[0] + allnames = allnames[1:] + ops = append(ops, testOp{ + Op: opAdd, + Val: next, + }) + + if tempset[next] { + todel = append(todel, next) + } + } else { + shuffle(seed+100, todel) + next := todel[0] + todel = todel[1:] + + ops = append(ops, testOp{ + Op: opDel, + Val: next, + }) + } + } +} + +// executes the given op set with a repl to allow easier debugging +func debugExecuteOpSet(ds dag.DAGService, width int, ops []testOp) (*HamtShard, error) { + s := NewHamtShard(ds, width) + e := ft.EmptyDirNode() + ds.Add(e) + ctx := context.TODO() + + run := 0 + + opnames := map[int]string{ + opAdd: "add", + opDel: "del", + } + +mainloop: + for i := 0; i < len(ops); i++ { + o := ops[i] + + fmt.Printf("Op %d: %s %s\n", i, opnames[o.Op], o.Val) + for run == 0 { + cmd := readCommand() + parts := strings.Split(cmd, " ") + switch parts[0] { + case "": + run = 1 + case "find": + _, err := s.Find(ctx, parts[1]) + if err == nil { + fmt.Println("success") + } else { + fmt.Println(err) + } + case "run": + if len(parts) > 1 { + n, err := strconv.Atoi(parts[1]) + if err != nil { + panic(err) + } + + run = n + } else { + run = -1 + } + case "lookop": + for k := 0; k < len(ops); k++ { + if ops[k].Val == parts[1] { + fmt.Printf(" Op %d: %s %s\n", k, opnames[ops[k].Op], parts[1]) + } + } + case "restart": + s = NewHamtShard(ds, width) + i = -1 + continue mainloop + case "print": + nd, err := s.Node() + if err != nil { + panic(err) + } + printDag(ds, nd.(*dag.ProtoNode), 0) + } + } + run-- + + switch o.Op { + case opAdd: + err := s.Set(ctx, o.Val, e) + if err != nil { + return nil, fmt.Errorf("inserting %s: %s", o.Val, err) + } + case opDel: + fmt.Println("deleting: ", o.Val) + err := s.Remove(ctx, o.Val) + if err != nil { + return nil, fmt.Errorf("deleting %s: %s", o.Val, err) + } + case opFind: + _, err := s.Find(ctx, o.Val) + if err != nil { + return nil, fmt.Errorf("finding %s: %s", o.Val, err) + } + } + } + + return s, nil +} + +func readCommand() string { + fmt.Print("> ") + scan := bufio.NewScanner(os.Stdin) + scan.Scan() + return scan.Text() +} diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go new file mode 100644 index 0000000000..cafa1ce8cc --- /dev/null +++ b/unixfs/hamt/hamt_test.go @@ -0,0 +1,552 @@ +package hamt + +import ( + "context" + "fmt" + "math/rand" + "os" + "sort" + "strings" + "testing" + "time" + + dag "github.com/ipfs/go-ipfs/merkledag" + mdtest "github.com/ipfs/go-ipfs/merkledag/test" + dagutils "github.com/ipfs/go-ipfs/merkledag/utils" + ft "github.com/ipfs/go-ipfs/unixfs" +) + +func shuffle(seed int64, arr []string) { + r := rand.New(rand.NewSource(seed)) + for i := 0; i < len(arr); i++ { + a := r.Intn(len(arr)) + b := r.Intn(len(arr)) + arr[a], arr[b] = arr[b], arr[a] + } +} + +func makeDir(ds dag.DAGService, size int) ([]string, *HamtShard, error) { + return makeDirWidth(ds, size, 256) +} + +func makeDirWidth(ds dag.DAGService, size, width int) ([]string, *HamtShard, error) { + s := NewHamtShard(ds, width) + + var dirs []string + for i := 0; i < size; i++ { + dirs = append(dirs, fmt.Sprintf("DIRNAME%d", i)) + } + + shuffle(time.Now().UnixNano(), dirs) + + for i := 0; i < len(dirs); i++ { + nd := ft.EmptyDirNode() + ds.Add(nd) + err := s.Set(context.Background(), dirs[i], nd) + if err != nil { + return nil, nil, err + } + } + + return dirs, s, nil +} + +func assertLink(s *HamtShard, name string, found bool) error { + _, err := s.Find(context.Background(), name) + switch err { + case os.ErrNotExist: + if found { + return err + } + + return nil + case nil: + if found { + return nil + } + + return fmt.Errorf("expected not to find link named %s", name) + default: + return err + } +} + +func assertSerializationWorks(ds dag.DAGService, s *HamtShard) error { + nd, err := s.Node() + if err != nil { + return err + } + + nds, err := NewHamtFromDag(ds, nd) + if err != nil { + return err + } + + linksA, err := s.EnumLinks() + if err != nil { + return err + } + + linksB, err := nds.EnumLinks() + if err != nil { + return err + } + + if len(linksA) != len(linksB) { + return fmt.Errorf("links arrays are different sizes") + } + + for i, a := range linksA { + b := linksB[i] + if a.Name != b.Name { + return fmt.Errorf("links names mismatch") + } + + if a.Cid.String() != b.Cid.String() { + return fmt.Errorf("link hashes dont match") + } + + if a.Size != b.Size { + return fmt.Errorf("link sizes not the same") + } + } + + return nil +} + +func TestBasicSet(t *testing.T) { + ds := mdtest.Mock() + for _, w := range []int{128, 256, 512, 1024, 2048, 4096} { + t.Run(fmt.Sprintf("BasicSet%d", w), func(t *testing.T) { + names, s, err := makeDirWidth(ds, 1000, w) + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + for _, d := range names { + _, err := s.Find(ctx, d) + if err != nil { + t.Fatal(err) + } + } + }) + } +} + +func TestDirBuilding(t *testing.T) { + ds := mdtest.Mock() + s := NewHamtShard(ds, 256) + + _, s, err := makeDir(ds, 200) + if err != nil { + t.Fatal(err) + } + + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + //printDag(ds, nd, 0) + + k := nd.Cid() + + if k.String() != "QmY89TkSEVHykWMHDmyejSWFj9CYNtvzw4UwnT9xbc4Zjc" { + t.Fatalf("output didnt match what we expected (got %s)", k.String()) + } +} + +func TestShardReload(t *testing.T) { + ds := mdtest.Mock() + s := NewHamtShard(ds, 256) + ctx := context.Background() + + _, s, err := makeDir(ds, 200) + if err != nil { + t.Fatal(err) + } + + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + nds, err := NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } + + lnks, err := nds.EnumLinks() + if err != nil { + t.Fatal(err) + } + + if len(lnks) != 200 { + t.Fatal("not enough links back") + } + + _, err = nds.Find(ctx, "DIRNAME50") + if err != nil { + t.Fatal(err) + } + + // Now test roundtrip marshal with no operations + + nds, err = NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } + + ond, err := nds.Node() + if err != nil { + t.Fatal(err) + } + + outk := ond.Cid() + ndk := nd.Cid() + + if !outk.Equals(ndk) { + printDiff(ds, nd.(*dag.ProtoNode), ond.(*dag.ProtoNode)) + t.Fatal("roundtrip serialization failed") + } +} + +func TestRemoveElems(t *testing.T) { + ds := mdtest.Mock() + dirs, s, err := makeDir(ds, 500) + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + shuffle(time.Now().UnixNano(), dirs) + + for _, d := range dirs { + err := s.Remove(ctx, d) + if err != nil { + t.Fatal(err) + } + } + + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + if len(nd.Links()) > 0 { + t.Fatal("shouldnt have any links here") + } + + err = s.Remove(ctx, "doesnt exist") + if err != os.ErrNotExist { + t.Fatal("expected error does not exist") + } +} + +func TestSetAfterMarshal(t *testing.T) { + ds := mdtest.Mock() + _, s, err := makeDir(ds, 300) + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + nds, err := NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } + + empty := ft.EmptyDirNode() + for i := 0; i < 100; i++ { + err := nds.Set(ctx, fmt.Sprintf("moredirs%d", i), empty) + if err != nil { + t.Fatal(err) + } + } + + links, err := nds.EnumLinks() + if err != nil { + t.Fatal(err) + } + + if len(links) != 400 { + t.Fatal("expected 400 links") + } + + err = assertSerializationWorks(ds, nds) + if err != nil { + t.Fatal(err) + } +} + +func TestDuplicateAddShard(t *testing.T) { + ds := mdtest.Mock() + dir := NewHamtShard(ds, 256) + nd := new(dag.ProtoNode) + ctx := context.Background() + + err := dir.Set(ctx, "test", nd) + if err != nil { + t.Fatal(err) + } + + err = dir.Set(ctx, "test", nd) + if err != nil { + t.Fatal(err) + } + + lnks, err := dir.EnumLinks() + if err != nil { + t.Fatal(err) + } + + if len(lnks) != 1 { + t.Fatal("expected only one link") + } +} + +func TestLoadFailsFromNonShard(t *testing.T) { + ds := mdtest.Mock() + nd := ft.EmptyDirNode() + + _, err := NewHamtFromDag(ds, nd) + if err == nil { + t.Fatal("expected dir shard creation to fail when given normal directory") + } + + nd = new(dag.ProtoNode) + + _, err = NewHamtFromDag(ds, nd) + if err == nil { + t.Fatal("expected dir shard creation to fail when given normal directory") + } +} + +func TestFindNonExisting(t *testing.T) { + ds := mdtest.Mock() + _, s, err := makeDir(ds, 100) + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + for i := 0; i < 200; i++ { + _, err := s.Find(ctx, fmt.Sprintf("notfound%d", i)) + if err != os.ErrNotExist { + t.Fatal("expected ErrNotExist") + } + } +} + +func TestRemoveElemsAfterMarshal(t *testing.T) { + ds := mdtest.Mock() + dirs, s, err := makeDir(ds, 30) + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + sort.Strings(dirs) + + err = s.Remove(ctx, dirs[0]) + if err != nil { + t.Fatal(err) + } + + out, err := s.Find(ctx, dirs[0]) + if err == nil { + t.Fatal("expected error, got: ", out) + } + + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + nds, err := NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } + + _, err = nds.Find(ctx, dirs[0]) + if err == nil { + t.Fatal("expected not to find ", dirs[0]) + } + + for _, d := range dirs[1:] { + _, err := nds.Find(ctx, d) + if err != nil { + t.Fatal("could not find expected link after unmarshaling") + } + } + + for _, d := range dirs[1:] { + err := nds.Remove(ctx, d) + if err != nil { + t.Fatal(err) + } + } + + links, err := nds.EnumLinks() + if err != nil { + t.Fatal(err) + } + + if len(links) != 0 { + t.Fatal("expected all links to be removed") + } + + err = assertSerializationWorks(ds, nds) + if err != nil { + t.Fatal(err) + } +} + +func TestBitfieldIndexing(t *testing.T) { + ds := mdtest.Mock() + s := NewHamtShard(ds, 256) + + set := func(i int) { + s.bitfield.SetBit(s.bitfield, i, 1) + } + + assert := func(i int, val int) { + if s.indexForBitPos(i) != val { + t.Fatalf("expected index %d to be %d", i, val) + } + } + + assert(50, 0) + set(4) + set(5) + set(60) + + assert(10, 2) + set(3) + assert(10, 3) + assert(1, 0) + + assert(100, 4) + set(50) + assert(45, 3) + set(100) + assert(100, 5) +} + +// test adding a sharded directory node as the child of another directory node. +// if improperly implemented, the parent hamt may assume the child is a part of +// itself. +func TestSetHamtChild(t *testing.T) { + ds := mdtest.Mock() + s := NewHamtShard(ds, 256) + ctx := context.Background() + + e := ft.EmptyDirNode() + ds.Add(e) + + err := s.Set(ctx, "bar", e) + if err != nil { + t.Fatal(err) + } + + snd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + _, ns, err := makeDir(ds, 50) + if err != nil { + t.Fatal(err) + } + + err = ns.Set(ctx, "foo", snd) + if err != nil { + t.Fatal(err) + } + + nsnd, err := ns.Node() + if err != nil { + t.Fatal(err) + } + + hs, err := NewHamtFromDag(ds, nsnd) + if err != nil { + t.Fatal(err) + } + + err = assertLink(hs, "bar", false) + if err != nil { + t.Fatal(err) + } + + err = assertLink(hs, "foo", true) + if err != nil { + t.Fatal(err) + } +} + +func printDag(ds dag.DAGService, nd *dag.ProtoNode, depth int) { + padding := strings.Repeat(" ", depth) + fmt.Println("{") + for _, l := range nd.Links() { + fmt.Printf("%s%s: %s", padding, l.Name, l.Cid.String()) + ch, err := ds.Get(context.Background(), l.Cid) + if err != nil { + panic(err) + } + + printDag(ds, ch.(*dag.ProtoNode), depth+1) + } + fmt.Println(padding + "}") +} + +func printDiff(ds dag.DAGService, a, b *dag.ProtoNode) { + diff, err := dagutils.Diff(context.TODO(), ds, a, b) + if err != nil { + panic(err) + } + + for _, d := range diff { + fmt.Println(d) + } +} + +func BenchmarkHAMTSet(b *testing.B) { + ds := mdtest.Mock() + sh := NewHamtShard(ds, 256) + nd, err := sh.Node() + if err != nil { + b.Fatal(err) + } + + _, err = ds.Add(nd) + if err != nil { + b.Fatal(err) + } + ds.Add(ft.EmptyDirNode()) + + for i := 0; i < b.N; i++ { + s, err := NewHamtFromDag(ds, nd) + if err != nil { + b.Fatal(err) + } + + err = s.Set(context.TODO(), fmt.Sprint(i), ft.EmptyDirNode()) + if err != nil { + b.Fatal(err) + } + + out, err := s.Node() + if err != nil { + b.Fatal(err) + } + + nd = out + } +} diff --git a/unixfs/hamt/util.go b/unixfs/hamt/util.go new file mode 100644 index 0000000000..1727dbfed9 --- /dev/null +++ b/unixfs/hamt/util.go @@ -0,0 +1,61 @@ +package hamt + +import ( + "math/big" +) + +type hashBits struct { + b []byte + consumed int +} + +func mkmask(n int) byte { + return (1 << uint(n)) - 1 +} + +func (hb *hashBits) Next(i int) int { + curbi := hb.consumed / 8 + leftb := 8 - (hb.consumed % 8) + + curb := hb.b[curbi] + if i == leftb { + out := int(mkmask(i) & curb) + hb.consumed += i + return out + } else if i < leftb { + a := curb & mkmask(leftb) // mask out the high bits we don't want + b := a & ^mkmask(leftb-i) // mask out the low bits we don't want + c := b >> uint(leftb-i) // shift whats left down + hb.consumed += i + return int(c) + } else { + out := int(mkmask(leftb) & curb) + out <<= uint(i - leftb) + hb.consumed += leftb + out += hb.Next(i - leftb) + return out + } +} + +const ( + m1 = 0x5555555555555555 //binary: 0101... + m2 = 0x3333333333333333 //binary: 00110011.. + m4 = 0x0f0f0f0f0f0f0f0f //binary: 4 zeros, 4 ones ... + h01 = 0x0101010101010101 //the sum of 256 to the power of 0,1,2,3... +) + +// from https://en.wikipedia.org/wiki/Hamming_weight +func popCountUint64(x uint64) int { + x -= (x >> 1) & m1 //put count of each 2 bits into those 2 bits + x = (x & m2) + ((x >> 2) & m2) //put count of each 4 bits into those 4 bits + x = (x + (x >> 4)) & m4 //put count of each 8 bits into those 8 bits + return int((x * h01) >> 56) +} + +func popCount(i *big.Int) int { + var n int + for _, v := range i.Bits() { + n += popCountUint64(uint64(v)) + } + return n +} diff --git a/unixfs/hamt/util_test.go b/unixfs/hamt/util_test.go new file mode 100644 index 0000000000..4406ac8593 --- /dev/null +++ b/unixfs/hamt/util_test.go @@ -0,0 +1,58 @@ +package hamt + +import ( + "math/big" + "testing" +) + +func TestPopCount(t *testing.T) { + x := big.NewInt(0) + + for i := 0; i < 50; i++ { + x.SetBit(x, i, 1) + } + + if popCount(x) != 50 { + t.Fatal("expected popcount to be 50") + } +} + +func TestHashBitsEvenSizes(t *testing.T) { + buf := []byte{255, 127, 79, 45, 116, 99, 35, 17} + hb := hashBits{b: buf} + + for _, v := range buf { + if hb.Next(8) != int(v) { + t.Fatal("got wrong numbers back") + } + } +} + +func TestHashBitsUneven(t *testing.T) { + buf := []byte{255, 127, 79, 45, 116, 99, 35, 17} + hb := hashBits{b: buf} + + v := hb.Next(4) + if v != 15 { + t.Fatal("should have gotten 15: ", v) + } + + v = hb.Next(4) + if v != 15 { + t.Fatal("should have gotten 15: ", v) + } + + if v := hb.Next(3); v != 3 { + t.Fatalf("expected 3, but got %b", v) + } + if v := hb.Next(3); v != 7 { + t.Fatalf("expected 7, but got %b", v) + } + if v := hb.Next(3); v != 6 { + t.Fatalf("expected 6, but got %b", v) + } + + if v := hb.Next(15); v != 20269 { + t.Fatalf("expected 20269, but got %b (%d)", v, v) + } +} diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 071eba0556..fdb616e1bf 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -2,48 +2,144 @@ package io import ( "context" + "fmt" + "os" mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + hamt "github.com/ipfs/go-ipfs/unixfs/hamt" + + node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) -type directoryBuilder struct { +// ShardSplitThreshold specifies how large of an unsharded directory +// the Directory code will generate. Adding entries over this value will +// result in the node being restructured into a sharded object. +var ShardSplitThreshold = 1000 + +// DefaultShardWidth is the default value used for hamt sharding width. +var DefaultShardWidth = 256 + +type Directory struct { dserv mdag.DAGService dirnode *mdag.ProtoNode -} -// NewEmptyDirectory returns an empty merkledag Node with a folder Data chunk -func NewEmptyDirectory() *mdag.ProtoNode { - nd := new(mdag.ProtoNode) - nd.SetData(format.FolderPBData()) - return nd + shard *hamt.HamtShard } -// NewDirectory returns a directoryBuilder. It needs a DAGService to add the Children -func NewDirectory(dserv mdag.DAGService) *directoryBuilder { - db := new(directoryBuilder) +// NewDirectory returns a Directory. It needs a DAGService to add the Children +func NewDirectory(dserv mdag.DAGService) *Directory { + db := new(Directory) db.dserv = dserv - db.dirnode = NewEmptyDirectory() + db.dirnode = format.EmptyDirNode() return db } -// AddChild adds a (name, key)-pair to the root node. -func (d *directoryBuilder) AddChild(ctx context.Context, name string, c *cid.Cid) error { - cnode, err := d.dserv.Get(ctx, c) +func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, error) { + pbnd, ok := nd.(*mdag.ProtoNode) + if !ok { + return nil, mdag.ErrNotProtobuf + } + + pbd, err := format.FromBytes(pbnd.Data()) if err != nil { - return err + return nil, err } - cnpb, ok := cnode.(*mdag.ProtoNode) - if !ok { - return mdag.ErrNotProtobuf + switch pbd.GetType() { + case format.TDirectory: + return &Directory{ + dserv: dserv, + dirnode: pbnd.Copy().(*mdag.ProtoNode), + }, nil + case format.THAMTShard: + shard, err := hamt.NewHamtFromDag(dserv, nd) + if err != nil { + return nil, err + } + + return &Directory{ + dserv: dserv, + shard: shard, + }, nil + default: + return nil, fmt.Errorf("merkledag node was not a directory or shard") } +} - return d.dirnode.AddNodeLinkClean(name, cnpb) +// AddChild adds a (name, key)-pair to the root node. +func (d *Directory) AddChild(ctx context.Context, name string, nd node.Node) error { + if d.shard == nil { + if len(d.dirnode.Links()) < ShardSplitThreshold { + _ = d.dirnode.RemoveNodeLink(name) + return d.dirnode.AddNodeLinkClean(name, nd) + } + + err := d.switchToSharding(ctx) + if err != nil { + return err + } + } + + return d.shard.Set(ctx, name, nd) } -// GetNode returns the root of this directoryBuilder -func (d *directoryBuilder) GetNode() *mdag.ProtoNode { - return d.dirnode +func (d *Directory) switchToSharding(ctx context.Context) error { + d.shard = hamt.NewHamtShard(d.dserv, DefaultShardWidth) + for _, lnk := range d.dirnode.Links() { + cnd, err := d.dserv.Get(ctx, lnk.Cid) + if err != nil { + return err + } + + err = d.shard.Set(ctx, lnk.Name, cnd) + if err != nil { + return err + } + } + + d.dirnode = nil + return nil +} + +func (d *Directory) Links() ([]*node.Link, error) { + if d.shard == nil { + return d.dirnode.Links(), nil + } + + return d.shard.EnumLinks() +} + +func (d *Directory) Find(ctx context.Context, name string) (node.Node, error) { + if d.shard == nil { + lnk, err := d.dirnode.GetNodeLink(name) + switch err { + case mdag.ErrLinkNotFound: + return nil, os.ErrNotExist + default: + return nil, err + case nil: + } + + return d.dserv.Get(ctx, lnk.Cid) + } + + return d.shard.Find(ctx, name) +} + +func (d *Directory) RemoveChild(ctx context.Context, name string) error { + if d.shard == nil { + return d.dirnode.RemoveNodeLink(name) + } + + return d.shard.Remove(ctx, name) +} + +// GetNode returns the root of this Directory +func (d *Directory) GetNode() (node.Node, error) { + if d.shard == nil { + return d.dirnode, nil + } + + return d.shard.Node() } diff --git a/unixfs/io/dirbuilder_test.go b/unixfs/io/dirbuilder_test.go index e7539a8bc2..f07ee88947 100644 --- a/unixfs/io/dirbuilder_test.go +++ b/unixfs/io/dirbuilder_test.go @@ -2,49 +2,157 @@ package io import ( "context" - "io/ioutil" + "fmt" "testing" - testu "github.com/ipfs/go-ipfs/unixfs/test" + mdtest "github.com/ipfs/go-ipfs/merkledag/test" + ft "github.com/ipfs/go-ipfs/unixfs" ) func TestEmptyNode(t *testing.T) { - n := NewEmptyDirectory() + n := ft.EmptyDirNode() if len(n.Links()) != 0 { t.Fatal("empty node should have 0 links") } } +func TestDirectoryGrowth(t *testing.T) { + ds := mdtest.Mock() + dir := NewDirectory(ds) + ctx := context.Background() + + d := ft.EmptyDirNode() + ds.Add(d) + + nelems := 10000 + + for i := 0; i < nelems; i++ { + err := dir.AddChild(ctx, fmt.Sprintf("dir%d", i), d) + if err != nil { + t.Fatal(err) + } + } + + _, err := dir.GetNode() + if err != nil { + t.Fatal(err) + } + + links, err := dir.Links() + if err != nil { + t.Fatal(err) + } + + if len(links) != nelems { + t.Fatal("didnt get right number of elements") + } + + dirc := d.Cid() + + names := make(map[string]bool) + for _, l := range links { + names[l.Name] = true + if !l.Cid.Equals(dirc) { + t.Fatal("link wasnt correct") + } + } + + for i := 0; i < nelems; i++ { + dn := fmt.Sprintf("dir%d", i) + if !names[dn] { + t.Fatal("didnt find directory: ", dn) + } + + _, err := dir.Find(context.Background(), dn) + if err != nil { + t.Fatal(err) + } + } +} + +func TestDuplicateAddDir(t *testing.T) { + ds := mdtest.Mock() + dir := NewDirectory(ds) + ctx := context.Background() + nd := ft.EmptyDirNode() + + err := dir.AddChild(ctx, "test", nd) + if err != nil { + t.Fatal(err) + } + + err = dir.AddChild(ctx, "test", nd) + if err != nil { + t.Fatal(err) + } + + lnks, err := dir.Links() + if err != nil { + t.Fatal(err) + } + + if len(lnks) != 1 { + t.Fatal("expected only one link") + } +} + func TestDirBuilder(t *testing.T) { - dserv := testu.GetDAGServ() - ctx, closer := context.WithCancel(context.Background()) - defer closer() - inbuf, node := testu.GetRandomNode(t, dserv, 1024) - key := node.Cid() + ds := mdtest.Mock() + dir := NewDirectory(ds) + ctx := context.Background() - b := NewDirectory(dserv) + child := ft.EmptyDirNode() + _, err := ds.Add(child) + if err != nil { + t.Fatal(err) + } - b.AddChild(ctx, "random", key) + count := 5000 - dir := b.GetNode() - outn, err := dir.GetLinkedProtoNode(ctx, dserv, "random") + for i := 0; i < count; i++ { + err := dir.AddChild(ctx, fmt.Sprintf("entry %d", i), child) + if err != nil { + t.Fatal(err) + } + } + + dirnd, err := dir.GetNode() if err != nil { t.Fatal(err) } - reader, err := NewDagReader(ctx, outn, dserv) + links, err := dir.Links() if err != nil { t.Fatal(err) } - outbuf, err := ioutil.ReadAll(reader) + if len(links) != count { + t.Fatal("not enough links dawg", len(links), count) + } + + adir, err := NewDirectoryFromNode(ds, dirnd) if err != nil { t.Fatal(err) } - err = testu.ArrComp(inbuf, outbuf) + links, err = adir.Links() if err != nil { t.Fatal(err) } + names := make(map[string]bool) + for _, lnk := range links { + names[lnk.Name] = true + } + + for i := 0; i < count; i++ { + n := fmt.Sprintf("entry %d", i) + if !names[n] { + t.Fatal("COULDNT FIND: ", n) + } + } + + if len(links) != count { + t.Fatal("wrong number of links", len(links), count) + } } diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 5970e72b53..ab9239601d 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -5,26 +5,21 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + hamt "github.com/ipfs/go-ipfs/unixfs/hamt" node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" ) func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { - pbnd, ok := nd.(*dag.ProtoNode) - if !ok { - lnk, _, err := nd.ResolveLink([]string{name}) - return lnk, err - } - - upb, err := ft.FromBytes(pbnd.Data()) - if err != nil { - // Not a unixfs node, use standard object traversal code - lnk, _, err := nd.ResolveLink([]string{name}) - return lnk, err - } - - switch upb.GetType() { - /* + switch nd := nd.(type) { + case *dag.ProtoNode: + upb, err := ft.FromBytes(nd.Data()) + if err != nil { + // Not a unixfs node, use standard object traversal code + return nd.GetNodeLink(name) + } + + switch upb.GetType() { case ft.THAMTShard: s, err := hamt.NewHamtFromDag(ds, nd) if err != nil { @@ -37,10 +32,15 @@ func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, nam return nil, err } - return dag.MakeLink(out) - */ + return node.MakeLink(out) + default: + return nd.GetNodeLink(name) + } default: lnk, _, err := nd.ResolveLink([]string{name}) - return lnk, err + if err != nil { + return nil, err + } + return lnk, nil } } diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index ffd3bb905f..e280530319 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -31,6 +31,7 @@ const ( Data_File Data_DataType = 2 Data_Metadata Data_DataType = 3 Data_Symlink Data_DataType = 4 + Data_HAMTShard Data_DataType = 5 ) var Data_DataType_name = map[int32]string{ @@ -39,6 +40,7 @@ var Data_DataType_name = map[int32]string{ 2: "File", 3: "Metadata", 4: "Symlink", + 5: "HAMTShard", } var Data_DataType_value = map[string]int32{ "Raw": 0, @@ -46,6 +48,7 @@ var Data_DataType_value = map[string]int32{ "File": 2, "Metadata": 3, "Symlink": 4, + "HAMTShard": 5, } func (x Data_DataType) Enum() *Data_DataType { @@ -70,6 +73,8 @@ type Data struct { Data []byte `protobuf:"bytes,2,opt,name=Data" json:"Data,omitempty"` Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` + HashType *uint64 `protobuf:"varint,5,opt,name=hashType" json:"hashType,omitempty"` + Fanout *uint64 `protobuf:"varint,6,opt,name=fanout" json:"fanout,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -105,6 +110,20 @@ func (m *Data) GetBlocksizes() []uint64 { return nil } +func (m *Data) GetHashType() uint64 { + if m != nil && m.HashType != nil { + return *m.HashType + } + return 0 +} + +func (m *Data) GetFanout() uint64 { + if m != nil && m.Fanout != nil { + return *m.Fanout + } + return 0 +} + type Metadata struct { MimeType *string `protobuf:"bytes,1,opt,name=MimeType" json:"MimeType,omitempty"` XXX_unrecognized []byte `json:"-"` diff --git a/unixfs/pb/unixfs.proto b/unixfs/pb/unixfs.proto index 2e4d47947f..6feb7aad65 100644 --- a/unixfs/pb/unixfs.proto +++ b/unixfs/pb/unixfs.proto @@ -7,12 +7,16 @@ message Data { File = 2; Metadata = 3; Symlink = 4; + HAMTShard = 5; } required DataType Type = 1; optional bytes Data = 2; optional uint64 filesize = 3; repeated uint64 blocksizes = 4; + + optional uint64 hashType = 5; + optional uint64 fanout = 6; } message Metadata { From b9adb607a87ebf2a02d8577be4db203f28fda0f3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 15 Nov 2016 16:17:22 -0800 Subject: [PATCH 1538/3147] iterator technique for unixfs dir listing License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@c9a8a08c5a05dad83a30358f8d46af4ab5bc1817 --- unixfs/hamt/hamt.go | 18 ++++++++++-------- unixfs/io/dirbuilder.go | 13 +++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 05b9402fdc..7d0e479095 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -321,7 +321,15 @@ func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb func (ds *HamtShard) EnumLinks() ([]*node.Link, error) { var links []*node.Link - err := ds.walkTrie(func(sv *shardValue) error { + err := ds.ForEachLink(func(l *node.Link) error { + links = append(links, l) + return nil + }) + return links, err +} + +func (ds *HamtShard) ForEachLink(f func(*node.Link) error) error { + return ds.walkTrie(func(sv *shardValue) error { lnk, err := node.MakeLink(sv.val) if err != nil { return err @@ -329,14 +337,8 @@ func (ds *HamtShard) EnumLinks() ([]*node.Link, error) { lnk.Name = sv.key - links = append(links, lnk) - return nil + return f(lnk) }) - if err != nil { - return nil, err - } - - return links, nil } func (ds *HamtShard) walkTrie(cb func(*shardValue) error) error { diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index fdb616e1bf..5f0fc2242f 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -102,6 +102,19 @@ func (d *Directory) switchToSharding(ctx context.Context) error { return nil } +func (d *Directory) ForEachLink(f func(*node.Link) error) error { + if d.shard == nil { + for _, l := range d.dirnode.Links() { + if err := f(l); err != nil { + return err + } + } + return nil + } + + return d.shard.ForEachLink(f) +} + func (d *Directory) Links() ([]*node.Link, error) { if d.shard == nil { return d.dirnode.Links(), nil From cb54e845e962c6312bc243e44d6e1b64c2bda8cd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 17 Nov 2016 13:39:37 -0800 Subject: [PATCH 1539/3147] add more docs on hamt License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@ba636f0e7880dc3834a436b95c35d97a86018ee4 --- unixfs/hamt/hamt.go | 25 +++++++++++++++++++++++++ unixfs/hamt/util.go | 2 ++ 2 files changed, 27 insertions(+) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 7d0e479095..a3b0c24d9b 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -1,3 +1,23 @@ +// Package hamt implements a Hash Array Mapped Trie over ipfs merkledag nodes. +// It is implemented mostly as described in the wikipedia article on HAMTs, +// however the table size is variable (usually 256 in our usages) as opposed to +// 32 as suggested in the article. The hash function used is currently +// Murmur3, but this value is configurable (the datastructure reports which +// hash function its using). +// +// The one algorithmic change we implement that is not mentioned in the +// wikipedia article is the collapsing of empty shards. +// Given the following tree: ( '[' = shards, '{' = values ) +// [ 'A' ] -> [ 'B' ] -> { "ABC" } +// | L-> { "ABD" } +// L-> { "ASDF" } +// If we simply removed "ABC", we would end up with a tree where shard 'B' only +// has a single child. This causes two issues, the first, is that now we have +// an extra lookup required to get to "ABD". The second issue is that now we +// have a tree that contains only "ABD", but is not the same tree that we would +// get by simply inserting "ABD" into a new tree. To address this, we always +// check for empty shard nodes upon deletion and prune them to maintain a +// consistent tree, independent of insertion order. package hamt import ( @@ -450,10 +470,15 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, } } +// indexForBitPos returns the index within the collapsed array corresponding to +// the given bit in the bitset. The collapsed array contains only one entry +// per bit set in the bitfield, and this function is used to map the indices. func (ds *HamtShard) indexForBitPos(bp int) int { // TODO: an optimization could reuse the same 'mask' here and change the size // as needed. This isnt yet done as the bitset package doesnt make it easy // to do. + + // make a bitmask (all bits set) 'bp' bits long mask := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(bp)), nil), big.NewInt(1)) mask.And(mask, ds.bitfield) diff --git a/unixfs/hamt/util.go b/unixfs/hamt/util.go index 1727dbfed9..08c232a8ad 100644 --- a/unixfs/hamt/util.go +++ b/unixfs/hamt/util.go @@ -4,6 +4,7 @@ import ( "math/big" ) +// hashBits is a helper that allows the reading of the 'next n bits' as an integer. type hashBits struct { b []byte consumed int @@ -13,6 +14,7 @@ func mkmask(n int) byte { return (1 << uint(n)) - 1 } +// Next returns the next 'i' bits of the hashBits value as an integer func (hb *hashBits) Next(i int) int { curbi := hb.consumed / 8 leftb := 8 - (hb.consumed % 8) From 1deaaea2cfcff221b3f55de809f98b5fd7652d13 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 4 Aug 2016 12:45:00 -0700 Subject: [PATCH 1540/3147] implement an HAMT for unixfs directory sharding License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@17ba1579599743a6374ed4ff3eac70d9de6c3de3 --- mfs/dir.go | 116 ++++++++++++++++++++++++++------------------ mfs/mfs_test.go | 125 ++++++++++++++++++++++++++++++++++++++++++++++++ mfs/system.go | 7 ++- 3 files changed, 200 insertions(+), 48 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index f1a61eefac..51a26cf137 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -12,6 +12,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" @@ -29,25 +30,31 @@ type Directory struct { files map[string]*File lock sync.Mutex - node *dag.ProtoNode ctx context.Context + dirbuilder *uio.Directory + modTime time.Time name string } -func NewDirectory(ctx context.Context, name string, node *dag.ProtoNode, parent childCloser, dserv dag.DAGService) *Directory { - return &Directory{ - dserv: dserv, - ctx: ctx, - name: name, - node: node, - parent: parent, - childDirs: make(map[string]*Directory), - files: make(map[string]*File), - modTime: time.Now(), +func NewDirectory(ctx context.Context, name string, node node.Node, parent childCloser, dserv dag.DAGService) (*Directory, error) { + db, err := uio.NewDirectoryFromNode(dserv, node) + if err != nil { + return nil, err } + + return &Directory{ + dserv: dserv, + ctx: ctx, + name: name, + dirbuilder: db, + parent: parent, + childDirs: make(map[string]*Directory), + files: make(map[string]*File), + modTime: time.Now(), + }, nil } // closeChild updates the child by the given name to the dag node 'nd' @@ -81,21 +88,26 @@ func (d *Directory) closeChildUpdate(name string, nd *dag.ProtoNode, sync bool) } func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { - _, err := d.dserv.Add(d.node) + nd, err := d.dirbuilder.GetNode() if err != nil { return nil, err } - return d.node.Copy().(*dag.ProtoNode), nil -} + _, err = d.dserv.Add(nd) + if err != nil { + return nil, err + } -func (d *Directory) updateChild(name string, nd node.Node) error { - err := d.node.RemoveNodeLink(name) - if err != nil && err != dag.ErrNotFound { - return err + pbnd, ok := nd.(*dag.ProtoNode) + if !ok { + return nil, dag.ErrNotProtobuf } - err = d.node.AddNodeLinkClean(name, nd) + return pbnd.Copy().(*dag.ProtoNode), nil +} + +func (d *Directory) updateChild(name string, nd node.Node) error { + err := d.dirbuilder.AddChild(d.ctx, name, nd) if err != nil { return err } @@ -130,8 +142,12 @@ func (d *Directory) cacheNode(name string, nd node.Node) (FSNode, error) { } switch i.GetType() { - case ufspb.Data_Directory: - ndir := NewDirectory(d.ctx, name, nd, d, d.dserv) + case ufspb.Data_Directory, ufspb.Data_HAMTShard: + ndir, err := NewDirectory(d.ctx, name, nd, d, d.dserv) + if err != nil { + return nil, err + } + d.childDirs[name] = ndir return ndir, nil case ufspb.Data_File, ufspb.Data_Raw, ufspb.Data_Symlink: @@ -175,15 +191,7 @@ func (d *Directory) Uncache(name string) { // childFromDag searches through this directories dag node for a child link // with the given name func (d *Directory) childFromDag(name string) (node.Node, error) { - pbn, err := d.node.GetLinkedNode(d.ctx, d.dserv, name) - switch err { - case nil: - return pbn, nil - case dag.ErrLinkNotFound: - return nil, os.ErrNotExist - default: - return nil, err - } + return d.dirbuilder.Find(d.ctx, name) } // childUnsync returns the child under this directory by the given name @@ -209,7 +217,7 @@ type NodeListing struct { Hash string } -func (d *Directory) ListNames() []string { +func (d *Directory) ListNames() ([]string, error) { d.lock.Lock() defer d.lock.Unlock() @@ -221,7 +229,12 @@ func (d *Directory) ListNames() []string { names[n] = struct{}{} } - for _, l := range d.node.Links() { + links, err := d.dirbuilder.Links() + if err != nil { + return nil, err + } + + for _, l := range links { names[l.Name] = struct{}{} } @@ -231,7 +244,7 @@ func (d *Directory) ListNames() []string { } sort.Strings(out) - return out + return out, nil } func (d *Directory) List() ([]NodeListing, error) { @@ -239,7 +252,13 @@ func (d *Directory) List() ([]NodeListing, error) { defer d.lock.Unlock() var out []NodeListing - for _, l := range d.node.Links() { + + links, err := d.dirbuilder.Links() + if err != nil { + return nil, err + } + + for _, l := range links { child := NodeListing{} child.Name = l.Name @@ -285,20 +304,23 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { } } - ndir := new(dag.ProtoNode) - ndir.SetData(ft.FolderPBData()) + ndir := ft.EmptyDirNode() _, err = d.dserv.Add(ndir) if err != nil { return nil, err } - err = d.node.AddNodeLinkClean(name, ndir) + err = d.dirbuilder.AddChild(d.ctx, name, ndir) + if err != nil { + return nil, err + } + + dirobj, err := NewDirectory(d.ctx, name, ndir, d, d.dserv) if err != nil { return nil, err } - dirobj := NewDirectory(d.ctx, name, ndir, d, d.dserv) d.childDirs[name] = dirobj return dirobj, nil } @@ -310,12 +332,7 @@ func (d *Directory) Unlink(name string) error { delete(d.childDirs, name) delete(d.files, name) - err := d.node.RemoveNodeLink(name) - if err != nil { - return err - } - - _, err = d.dserv.Add(d.node) + err := d.dirbuilder.RemoveChild(d.ctx, name) if err != nil { return err } @@ -350,7 +367,7 @@ func (d *Directory) AddChild(name string, nd node.Node) error { return err } - err = d.node.AddNodeLinkClean(name, nd) + err = d.dirbuilder.AddChild(d.ctx, name, nd) if err != nil { return err } @@ -406,10 +423,15 @@ func (d *Directory) GetNode() (node.Node, error) { return nil, err } - _, err = d.dserv.Add(d.node) + nd, err := d.dirbuilder.GetNode() + if err != nil { + return nil, err + } + + _, err = d.dserv.Add(nd) if err != nil { return nil, err } - return d.node.Copy().(*dag.ProtoNode), nil + return nd, err } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 74e0d6dfb9..8471fd02c6 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -747,6 +747,67 @@ func TestMfsStress(t *testing.T) { } } +func TestMfsHugeDir(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + _, rt := setupRoot(ctx, t) + + for i := 0; i < 100000; i++ { + err := Mkdir(rt, fmt.Sprintf("/dir%d", i), false, false) + if err != nil { + t.Fatal(err) + } + } +} + +func TestMkdirP(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + _, rt := setupRoot(ctx, t) + + err := Mkdir(rt, "/a/b/c/d/e/f", true, true) + if err != nil { + t.Fatal(err) + } +} + +func TestConcurrentWriteAndFlush(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + d := mkdirP(t, rt.GetValue().(*Directory), "foo/bar/baz") + fn := fileNodeFromReader(t, ds, bytes.NewBuffer(nil)) + err := d.AddChild("file", fn) + if err != nil { + t.Fatal(err) + } + + nloops := 5000 + + wg := new(sync.WaitGroup) + wg.Add(1) + go func() { + defer wg.Done() + for i := 0; i < nloops; i++ { + err := writeFile(rt, "/foo/bar/baz/file", []byte("STUFF")) + if err != nil { + t.Error("file write failed: ", err) + return + } + } + }() + + for i := 0; i < nloops; i++ { + _, err := rt.GetValue().GetNode() + if err != nil { + t.Fatal(err) + } + } + + wg.Wait() +} + func TestFlushing(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -892,6 +953,70 @@ func TestConcurrentReads(t *testing.T) { } wg.Wait() } +func writeFile(rt *Root, path string, data []byte) error { + n, err := Lookup(rt, path) + if err != nil { + return err + } + + fi, ok := n.(*File) + if !ok { + return fmt.Errorf("expected to receive a file, but didnt get one") + } + + fd, err := fi.Open(OpenWriteOnly, true) + if err != nil { + return err + } + defer fd.Close() + + nw, err := fd.Write(data) + if err != nil { + return err + } + + if nw != 10 { + fmt.Errorf("wrote incorrect amount") + } + + return nil +} + +func TestConcurrentWrites(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ds, rt := setupRoot(ctx, t) + + rootdir := rt.GetValue().(*Directory) + + path := "a/b/c" + d := mkdirP(t, rootdir, path) + + fi := fileNodeFromReader(t, ds, bytes.NewReader(make([]byte, 0))) + err := d.AddChild("afile", fi) + if err != nil { + t.Fatal(err) + } + + var wg sync.WaitGroup + nloops := 100 + for i := 0; i < 10; i++ { + wg.Add(1) + go func(me int) { + defer wg.Done() + mybuf := bytes.Repeat([]byte{byte(me)}, 10) + for j := 0; j < nloops; j++ { + err := writeFile(rt, "a/b/c/afile", mybuf) + if err != nil { + t.Error("writefile failed: ", err) + return + } + } + }(i) + } + wg.Wait() +} func TestFileDescriptors(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) diff --git a/mfs/system.go b/mfs/system.go index 1c57677b5f..05d2a1c532 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -88,7 +88,12 @@ func NewRoot(parent context.Context, ds dag.DAGService, node *dag.ProtoNode, pf switch pbn.GetType() { case ft.TDirectory: - root.val = NewDirectory(parent, node.String(), node, root, ds) + rval, err := NewDirectory(parent, node.String(), node, root, ds) + if err != nil { + return nil, err + } + + root.val = rval case ft.TFile, ft.TMetadata, ft.TRaw: fi, err := NewFile(node.String(), node, root, ds) if err != nil { From 20c0bb05e4e5684897dd68066280e61dbc30ac11 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 22 Nov 2016 12:31:10 -0800 Subject: [PATCH 1541/3147] chekc that size input to newHamtShard is a power of two License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@a6f8ee7010efaafc2aaadd5bc5f88c1baf3b4fbf --- unixfs/hamt/hamt.go | 33 ++++++++++++++++++++++++--------- unixfs/hamt/hamt_stress_test.go | 18 +++++++++++++++--- unixfs/hamt/hamt_test.go | 21 ++++++++++++++------- unixfs/io/dirbuilder.go | 7 ++++++- 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index a3b0c24d9b..c9d6eb9dc3 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -64,23 +64,31 @@ type child interface { Label() string } -func NewHamtShard(dserv dag.DAGService, size int) *HamtShard { - ds := makeHamtShard(dserv, size) +func NewHamtShard(dserv dag.DAGService, size int) (*HamtShard, error) { + ds, err := makeHamtShard(dserv, size) + if err != nil { + return nil, err + } + ds.bitfield = big.NewInt(0) ds.nd = new(dag.ProtoNode) ds.hashFunc = HashMurmur3 - return ds + return ds, nil } -func makeHamtShard(ds dag.DAGService, size int) *HamtShard { +func makeHamtShard(ds dag.DAGService, size int) (*HamtShard, error) { + lg2s := int(math.Log2(float64(size))) + if 1< Date: Tue, 15 Nov 2016 16:17:22 -0800 Subject: [PATCH 1542/3147] iterator technique for unixfs dir listing License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@0d1ebb9077bc0e0bb5a10232cf7c2c80eff1c74f --- mfs/dir.go | 74 +++++++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 51a26cf137..cab2d9a1fe 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -221,71 +221,59 @@ func (d *Directory) ListNames() ([]string, error) { d.lock.Lock() defer d.lock.Unlock() - names := make(map[string]struct{}) - for n, _ := range d.childDirs { - names[n] = struct{}{} - } - for n, _ := range d.files { - names[n] = struct{}{} - } - - links, err := d.dirbuilder.Links() + var out []string + err := d.dirbuilder.ForEachLink(func(l *node.Link) error { + out = append(out, l.Name) + return nil + }) if err != nil { return nil, err } - for _, l := range links { - names[l.Name] = struct{}{} - } - - var out []string - for n, _ := range names { - out = append(out, n) - } sort.Strings(out) return out, nil } func (d *Directory) List() ([]NodeListing, error) { - d.lock.Lock() - defer d.lock.Unlock() - var out []NodeListing + err := d.ForEachEntry(context.TODO(), func(nl NodeListing) error { + out = append(out, nl) + return nil + }) + return out, err +} - links, err := d.dirbuilder.Links() - if err != nil { - return nil, err - } - - for _, l := range links { - child := NodeListing{} - child.Name = l.Name - +func (d *Directory) ForEachEntry(ctx context.Context, f func(NodeListing) error) error { + d.lock.Lock() + defer d.lock.Unlock() + return d.dirbuilder.ForEachLink(func(l *node.Link) error { c, err := d.childUnsync(l.Name) if err != nil { - return nil, err + return err + } + + nd, err := c.GetNode() + if err != nil { + return err + } + + child := NodeListing{ + Name: l.Name, + Type: int(c.Type()), + Hash: nd.Cid().String(), } - child.Type = int(c.Type()) if c, ok := c.(*File); ok { size, err := c.Size() if err != nil { - return nil, err + return err } child.Size = size } - nd, err := c.GetNode() - if err != nil { - return nil, err - } - child.Hash = nd.Cid().String() - - out = append(out, child) - } - - return out, nil + return f(child) + }) } func (d *Directory) Mkdir(name string) (*Directory, error) { @@ -433,5 +421,5 @@ func (d *Directory) GetNode() (node.Node, error) { return nil, err } - return nd, err + return nd.Copy(), err } From d69addcebfadcbcaeff8e8d5c7b73ff5774289e9 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 21 Mar 2017 12:25:48 +0100 Subject: [PATCH 1543/3147] Fix #3783: Improve IsPinned() lookups for indirect pins This avoids revisiting already-searched branches and cut down the IsPinned() check times considerably when recursive pins share big underlying DAGs. A test has been added which double-checks that pinned and unpinned items lookups respond as expected with shared branches. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@071a31787afb705cfaae868e37e936609d517524 --- pinning/pinner/pin.go | 22 ++++--- pinning/pinner/pin_test.go | 127 +++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 489809b0c4..e0c211ffb2 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -276,8 +276,9 @@ func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error } // Default is Indirect + visitedSet := cid.NewSet() for _, rc := range p.recursePin.Keys() { - has, err := hasChild(p.dserv, rc, c) + has, err := hasChild(p.dserv, rc, c, visitedSet.Visit) if err != nil { return "", false, err } @@ -519,7 +520,9 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { } } -func hasChild(ds mdag.LinkService, root *cid.Cid, child *cid.Cid) (bool, error) { +// hasChild recursively looks for a Cid among the children of a root Cid. +// The visit function can be used to shortcut already-visited branches. +func hasChild(ds mdag.LinkService, root *cid.Cid, child *cid.Cid, visit func(*cid.Cid) bool) (bool, error) { links, err := ds.GetLinks(context.Background(), root) if err != nil { return false, err @@ -529,14 +532,15 @@ func hasChild(ds mdag.LinkService, root *cid.Cid, child *cid.Cid) (bool, error) if lnk.Cid.Equals(child) { return true, nil } + if visit(c) { + has, err := hasChild(ds, c, child, visit) + if err != nil { + return false, err + } - has, err := hasChild(ds, c, child) - if err != nil { - return false, err - } - - if has { - return has, nil + if has { + return has, nil + } } } return false, nil diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index e9c8a8843f..009373dfe1 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -35,6 +35,17 @@ func assertPinned(t *testing.T, p Pinner, c *cid.Cid, failmsg string) { } } +func assertUnpinned(t *testing.T, p Pinner, c *cid.Cid, failmsg string) { + _, pinned, err := p.IsPinned(c) + if err != nil { + t.Fatal(err) + } + + if pinned { + t.Fatal(failmsg) + } +} + func TestPinnerBasic(t *testing.T) { ctx := context.Background() @@ -145,6 +156,122 @@ func TestPinnerBasic(t *testing.T) { assertPinned(t, np, bk, "could not find recursively pinned node") } +func TestIsPinnedLookup(t *testing.T) { + // We are going to test that lookups work in pins which share + // the same branches. For that we will construct this tree: + // + // A5->A4->A3->A2->A1->A0 + // / / + // B------- / + // \ / + // C--------------- + // + // We will ensure that IsPinned works for all objects both when they + // are pinned and once they have been unpinned. + aBranchLen := 6 + if aBranchLen < 3 { + t.Fatal("set aBranchLen to at least 3") + } + + ctx := context.Background() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + + // TODO does pinner need to share datastore with blockservice? + p := NewPinner(dstore, dserv, dserv) + + aNodes := make([]*mdag.ProtoNode, aBranchLen, aBranchLen) + aKeys := make([]*cid.Cid, aBranchLen, aBranchLen) + for i := 0; i < aBranchLen; i++ { + a, _ := randNode() + if i >= 1 { + err := a.AddNodeLink("child", aNodes[i-1]) + if err != nil { + t.Fatal(err) + } + } + + ak, err := dserv.Add(a) + if err != nil { + t.Fatal(err) + } + //t.Logf("a[%d] is %s", i, ak) + aNodes[i] = a + aKeys[i] = ak + } + + // Pin A5 recursively + if err := p.Pin(ctx, aNodes[aBranchLen-1], true); err != nil { + t.Fatal(err) + } + + // Create node B and add A3 as child + b, _ := randNode() + if err := b.AddNodeLink("mychild", aNodes[3]); err != nil { + t.Fatal(err) + } + + // Create C node + c, _ := randNode() + // Add A0 as child of C + if err := c.AddNodeLink("child", aNodes[0]); err != nil { + t.Fatal(err) + } + + // Add C + ck, err := dserv.Add(c) + if err != nil { + t.Fatal(err) + } + //t.Logf("C is %s", ck) + + // Add C to B and Add B + if err := b.AddNodeLink("myotherchild", c); err != nil { + t.Fatal(err) + } + bk, err := dserv.Add(b) + if err != nil { + t.Fatal(err) + } + //t.Logf("B is %s", bk) + + // Pin C recursively + + if err := p.Pin(ctx, c, true); err != nil { + t.Fatal(err) + } + + // Pin B recursively + + if err := p.Pin(ctx, b, true); err != nil { + t.Fatal(err) + } + + assertPinned(t, p, aKeys[0], "A0 should be pinned") + assertPinned(t, p, aKeys[1], "A1 should be pinned") + assertPinned(t, p, ck, "C should be pinned") + assertPinned(t, p, bk, "B should be pinned") + + // Unpin A5 recursively + if err := p.Unpin(ctx, aKeys[5], true); err != nil { + t.Fatal(err) + } + + assertPinned(t, p, aKeys[0], "A0 should still be pinned through B") + assertUnpinned(t, p, aKeys[4], "A4 should be unpinned") + + // Unpin B recursively + if err := p.Unpin(ctx, bk, true); err != nil { + t.Fatal(err) + } + assertUnpinned(t, p, bk, "B should be unpinned") + assertUnpinned(t, p, aKeys[1], "A1 should be unpinned") + assertPinned(t, p, aKeys[0], "A0 should still be pinned through C") +} + func TestDuplicateSemantics(t *testing.T) { ctx := context.Background() dstore := dssync.MutexWrap(ds.NewMapDatastore()) From 88584b794099e645529d24f91f0ba9c9747b08a0 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 3 Feb 2017 16:20:51 -0500 Subject: [PATCH 1544/3147] filestore util: basic filestore commands. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@bdf9b0ef4b752a512480e033ce10b918d5bb3698 --- filestore/util.go | 138 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 filestore/util.go diff --git a/filestore/util.go b/filestore/util.go new file mode 100644 index 0000000000..ac6909bc6d --- /dev/null +++ b/filestore/util.go @@ -0,0 +1,138 @@ +package filestore + +import ( + "fmt" + + pb "github.com/ipfs/go-ipfs/filestore/pb" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" + cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" +) + +type Status int32 + +const ( + StatusOk Status = 0 + StatusFileError Status = 10 // Backing File Error + //StatusFileNotFound Status = 11 // Backing File Not Found + //StatusFileChanged Status = 12 // Contents of the file changed + StatusOtherError Status = 20 // Internal Error, likely corrupt entry +) + +func (s Status) String() string { + switch s { + case StatusOk: + return "ok" + case StatusFileError: + return "error" + case StatusOtherError: + return "ERROR" + default: + return "???" + } +} + +func (s Status) Format() string { + return fmt.Sprintf("%-5s", s.String()) +} + +type ListRes struct { + Status Status + ErrorMsg string + Key *cid.Cid + FilePath string + Offset uint64 + Size uint64 +} + +func (r *ListRes) FormatLong() string { + switch { + case r.Key == nil: + return "?????????????????????????????????????????????????" + default: + return fmt.Sprintf("%-50s %6d %s %d", r.Key, r.Size, r.FilePath, r.Offset) + } +} + +func ListAll(fs *Filestore) (func() *ListRes, error) { + return listAll(fs, false) +} + +func VerifyAll(fs *Filestore) (func() *ListRes, error) { + return listAll(fs, true) +} + +func listAll(fs *Filestore, verify bool) (func() *ListRes, error) { + q := dsq.Query{} + qr, err := fs.fm.ds.Query(q) + if err != nil { + return nil, err + } + + return func() *ListRes { + cid, dobj, err := next(qr) + if dobj == nil && err == nil { + return nil + } else if err == nil && verify { + _, err = fs.fm.readDataObj(cid, dobj) + } + return mkListRes(cid, dobj, err) + }, nil +} + +func next(qr dsq.Results) (*cid.Cid, *pb.DataObj, error) { + v, ok := qr.NextSync() + if !ok { + return nil, nil, nil + } + + k := ds.RawKey(v.Key) + c, err := dshelp.DsKeyToCid(k) + if err != nil { + return nil, nil, fmt.Errorf("decoding cid from filestore: %s", err) + } + + data, ok := v.Value.([]byte) + if !ok { + return c, nil, fmt.Errorf("stored filestore dataobj was not a []byte") + } + + var dobj pb.DataObj + if err := proto.Unmarshal(data, &dobj); err != nil { + return c, nil, err + } + + return c, &dobj, nil +} + +func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { + status := StatusOk + errorMsg := "" + if err != nil { + if _, ok := err.(*CorruptReferenceError); ok { + status = StatusFileError + } else { + status = StatusOtherError + } + errorMsg = err.Error() + } + if d == nil { + return &ListRes{ + Status: status, + ErrorMsg: errorMsg, + Key: c, + } + } else { + return &ListRes{ + Status: status, + ErrorMsg: errorMsg, + Key: c, + FilePath: *d.FilePath, + Size: *d.Size_, + Offset: *d.Offset, + } + } +} From 6e1a8cdc7cff32937876a169d99469508edc8295 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 7 Mar 2017 00:48:53 -0500 Subject: [PATCH 1545/3147] filestore util: allow listing/verifying of individual blocks. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@8fdbd2fa700e769d4280f04b9a4a617f31ea3e2a --- filestore/util.go | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/filestore/util.go b/filestore/util.go index ac6909bc6d..75bb76bc1b 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -3,6 +3,7 @@ package filestore import ( "fmt" + "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" @@ -19,7 +20,8 @@ const ( StatusFileError Status = 10 // Backing File Error //StatusFileNotFound Status = 11 // Backing File Not Found //StatusFileChanged Status = 12 // Contents of the file changed - StatusOtherError Status = 20 // Internal Error, likely corrupt entry + StatusOtherError Status = 20 // Internal Error, likely corrupt entry + StatusKeyNotFound Status = 30 ) func (s Status) String() string { @@ -30,13 +32,15 @@ func (s Status) String() string { return "error" case StatusOtherError: return "ERROR" + case StatusKeyNotFound: + return "missing" default: return "???" } } func (s Status) Format() string { - return fmt.Sprintf("%-5s", s.String()) + return fmt.Sprintf("%-7s", s.String()) } type ListRes struct { @@ -52,19 +56,40 @@ func (r *ListRes) FormatLong() string { switch { case r.Key == nil: return "?????????????????????????????????????????????????" + case r.FilePath == "": + return r.Key.String() default: return fmt.Sprintf("%-50s %6d %s %d", r.Key, r.Size, r.FilePath, r.Offset) } } +func List(fs *Filestore, key *cid.Cid) *ListRes { + return list(fs, false, key) +} + func ListAll(fs *Filestore) (func() *ListRes, error) { return listAll(fs, false) } +func Verify(fs *Filestore, key *cid.Cid) *ListRes { + return list(fs, true, key) +} + func VerifyAll(fs *Filestore) (func() *ListRes, error) { return listAll(fs, true) } +func list(fs *Filestore, verify bool, key *cid.Cid) *ListRes { + dobj, err := fs.fm.getDataObj(key) + if err != nil { + return mkListRes(key, nil, err) + } + if verify { + _, err = fs.fm.readDataObj(key, dobj) + } + return mkListRes(key, dobj, err) +} + func listAll(fs *Filestore, verify bool) (func() *ListRes, error) { q := dsq.Query{} qr, err := fs.fm.ds.Query(q) @@ -112,7 +137,9 @@ func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { status := StatusOk errorMsg := "" if err != nil { - if _, ok := err.(*CorruptReferenceError); ok { + if err == ds.ErrNotFound || err == blockstore.ErrNotFound { + status = StatusKeyNotFound + } else if _, ok := err.(*CorruptReferenceError); ok { status = StatusFileError } else { status = StatusOtherError From 8eeb62628efbfc79ad57aefa9f00e3f6d9615bed Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 3 Feb 2017 18:34:08 -0500 Subject: [PATCH 1546/3147] filestore: be more specific when there is a problem reading the backing file. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@b30419ca789a2d34283d4c1b99df7158d39a69a6 --- filestore/fsrefstore.go | 29 ++++++++++++++++++++++------- filestore/util.go | 29 +++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index f333a845d6..5af21d4196 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -27,8 +27,18 @@ type FileManager struct { root string } +type CorruptReferenceCode int + +const ( + OtherErr CorruptReferenceCode = 0 + FileError CorruptReferenceCode = 1 + FileMissing CorruptReferenceCode = 2 + FileChanged CorruptReferenceCode = 3 +) + type CorruptReferenceError struct { - Err error + Code CorruptReferenceCode + Err error } func (c CorruptReferenceError) Error() string { @@ -127,20 +137,24 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { abspath := filepath.Join(f.root, p) fi, err := os.Open(abspath) - if err != nil { - return nil, &CorruptReferenceError{err} + if os.IsNotExist(err) { + return nil, &CorruptReferenceError{FileMissing, err} + } else if err != nil { + return nil, &CorruptReferenceError{FileError, err} } defer fi.Close() _, err = fi.Seek(int64(d.GetOffset()), os.SEEK_SET) if err != nil { - return nil, &CorruptReferenceError{err} + return nil, &CorruptReferenceError{FileError, err} } outbuf := make([]byte, d.GetSize_()) _, err = io.ReadFull(fi, outbuf) - if err != nil { - return nil, &CorruptReferenceError{err} + if err == io.EOF || err == io.ErrUnexpectedEOF { + return nil, &CorruptReferenceError{FileChanged, err} + } else if err != nil { + return nil, &CorruptReferenceError{FileError, err} } outcid, err := c.Prefix().Sum(outbuf) @@ -149,7 +163,8 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { } if !c.Equals(outcid) { - return nil, &CorruptReferenceError{fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())} + return nil, &CorruptReferenceError{FileChanged, + fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())} } return outbuf, nil diff --git a/filestore/util.go b/filestore/util.go index 75bb76bc1b..8049f7ec14 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -16,12 +16,12 @@ import ( type Status int32 const ( - StatusOk Status = 0 - StatusFileError Status = 10 // Backing File Error - //StatusFileNotFound Status = 11 // Backing File Not Found - //StatusFileChanged Status = 12 // Contents of the file changed - StatusOtherError Status = 20 // Internal Error, likely corrupt entry - StatusKeyNotFound Status = 30 + StatusOk Status = 0 + StatusFileError Status = 10 // Backing File Error + StatusFileNotFound Status = 11 // Backing File Not Found + StatusFileChanged Status = 12 // Contents of the file changed + StatusOtherError Status = 20 // Internal Error, likely corrupt entry + StatusKeyNotFound Status = 30 ) func (s Status) String() string { @@ -30,6 +30,10 @@ func (s Status) String() string { return "ok" case StatusFileError: return "error" + case StatusFileNotFound: + return "no-file" + case StatusFileChanged: + return "changed" case StatusOtherError: return "ERROR" case StatusKeyNotFound: @@ -139,8 +143,17 @@ func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { if err != nil { if err == ds.ErrNotFound || err == blockstore.ErrNotFound { status = StatusKeyNotFound - } else if _, ok := err.(*CorruptReferenceError); ok { - status = StatusFileError + } else if err, ok := err.(*CorruptReferenceError); ok { + switch err.Code { + case FileError: + status = StatusFileError + case FileMissing: + status = StatusFileNotFound + case FileChanged: + status = StatusFileChanged + default: + status = StatusOtherError + } } else { status = StatusOtherError } From ae2535559cf9272742599ee1df03c5c97d820e98 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 6 Feb 2017 15:54:36 -0500 Subject: [PATCH 1547/3147] filestore: use the same codes in ListRes and CorruptReferenceError. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@141c09614909930ce9d75533d9f7452dbfcfec88 --- filestore/fsrefstore.go | 23 +++++++---------------- filestore/util.go | 11 +---------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 5af21d4196..f493139e5c 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -27,17 +27,8 @@ type FileManager struct { root string } -type CorruptReferenceCode int - -const ( - OtherErr CorruptReferenceCode = 0 - FileError CorruptReferenceCode = 1 - FileMissing CorruptReferenceCode = 2 - FileChanged CorruptReferenceCode = 3 -) - type CorruptReferenceError struct { - Code CorruptReferenceCode + Code Status Err error } @@ -138,23 +129,23 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { fi, err := os.Open(abspath) if os.IsNotExist(err) { - return nil, &CorruptReferenceError{FileMissing, err} + return nil, &CorruptReferenceError{StatusFileNotFound, err} } else if err != nil { - return nil, &CorruptReferenceError{FileError, err} + return nil, &CorruptReferenceError{StatusFileError, err} } defer fi.Close() _, err = fi.Seek(int64(d.GetOffset()), os.SEEK_SET) if err != nil { - return nil, &CorruptReferenceError{FileError, err} + return nil, &CorruptReferenceError{StatusFileError, err} } outbuf := make([]byte, d.GetSize_()) _, err = io.ReadFull(fi, outbuf) if err == io.EOF || err == io.ErrUnexpectedEOF { - return nil, &CorruptReferenceError{FileChanged, err} + return nil, &CorruptReferenceError{StatusFileChanged, err} } else if err != nil { - return nil, &CorruptReferenceError{FileError, err} + return nil, &CorruptReferenceError{StatusFileError, err} } outcid, err := c.Prefix().Sum(outbuf) @@ -163,7 +154,7 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { } if !c.Equals(outcid) { - return nil, &CorruptReferenceError{FileChanged, + return nil, &CorruptReferenceError{StatusFileChanged, fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())} } diff --git a/filestore/util.go b/filestore/util.go index 8049f7ec14..652dfa2291 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -144,16 +144,7 @@ func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { if err == ds.ErrNotFound || err == blockstore.ErrNotFound { status = StatusKeyNotFound } else if err, ok := err.(*CorruptReferenceError); ok { - switch err.Code { - case FileError: - status = StatusFileError - case FileMissing: - status = StatusFileNotFound - case FileChanged: - status = StatusFileChanged - default: - status = StatusOtherError - } + status = err.Code } else { status = StatusOtherError } From dcc7c50cb75ae1b797a37f8ccc77b0d579bb3692 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Mon, 6 Feb 2017 21:53:51 -0500 Subject: [PATCH 1548/3147] filestore util: Add 'filestore dups' command. Enhance tests. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@8b58a800986bba53b9b58a9d4a33b539aadff479 --- filestore/filestore.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/filestore/filestore.go b/filestore/filestore.go index eefd925e35..da3dc17c6d 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -19,6 +19,14 @@ type Filestore struct { bs blockstore.Blockstore } +func (f *Filestore) FileManager() *FileManager { + return f.fm +} + +func (f *Filestore) MainBlockstore() blockstore.Blockstore { + return f.bs +} + func NewFilestore(bs blockstore.Blockstore, fm *FileManager) *Filestore { return &Filestore{fm, bs} } From 257c125808c4122292423dcff0310a0666890354 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 9 Feb 2017 11:59:16 -0500 Subject: [PATCH 1549/3147] filestore util: change "???..." to "" License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@987419d41b403f8a7e75030db9bf17e8677953e0 --- filestore/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/util.go b/filestore/util.go index 652dfa2291..ef77b417ab 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -59,7 +59,7 @@ type ListRes struct { func (r *ListRes) FormatLong() string { switch { case r.Key == nil: - return "?????????????????????????????????????????????????" + return "" case r.FilePath == "": return r.Key.String() default: From 73674400f2f9dea95235b7bfbcbc360827747b9c Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 9 Feb 2017 12:16:36 -0500 Subject: [PATCH 1550/3147] filestore: Refactor. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@48f9f6162283fad480ac8d3b6234b459b8397d80 --- filestore/fsrefstore.go | 4 ++++ filestore/util.go | 12 +++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index f493139e5c..3e3750cb9d 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -109,6 +109,10 @@ func (f *FileManager) getDataObj(c *cid.Cid) (*pb.DataObj, error) { // } + return unmarshalDataObj(o) +} + +func unmarshalDataObj(o interface{}) (*pb.DataObj, error) { data, ok := o.([]byte) if !ok { return nil, fmt.Errorf("stored filestore dataobj was not a []byte") diff --git a/filestore/util.go b/filestore/util.go index ef77b417ab..f098d2e177 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -9,7 +9,6 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) @@ -124,17 +123,12 @@ func next(qr dsq.Results) (*cid.Cid, *pb.DataObj, error) { return nil, nil, fmt.Errorf("decoding cid from filestore: %s", err) } - data, ok := v.Value.([]byte) - if !ok { - return c, nil, fmt.Errorf("stored filestore dataobj was not a []byte") - } - - var dobj pb.DataObj - if err := proto.Unmarshal(data, &dobj); err != nil { + dobj, err := unmarshalDataObj(v.Value) + if err != nil { return c, nil, err } - return c, &dobj, nil + return c, dobj, nil } func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { From f94b3e51d11a289ef86d4524255797546df28347 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Mar 2017 16:09:34 -0700 Subject: [PATCH 1551/3147] add global config switch for sharding License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@bd3637aab41b70978d4039330f0a761d05f4480a --- unixfs/io/dirbuilder.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 964eac582e..4b872f905c 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -17,6 +17,10 @@ import ( // result in the node being restructured into a sharded object. var ShardSplitThreshold = 1000 +// UseHAMTSharding is a global flag that signifies whether or not to use the +// HAMT sharding scheme for directory creation +var UseHAMTSharding = false + // DefaultShardWidth is the default value used for hamt sharding width. var DefaultShardWidth = 256 @@ -31,7 +35,15 @@ type Directory struct { func NewDirectory(dserv mdag.DAGService) *Directory { db := new(Directory) db.dserv = dserv - db.dirnode = format.EmptyDirNode() + if UseHAMTSharding { + s, err := hamt.NewHamtShard(dserv, DefaultShardWidth) + if err != nil { + panic(err) // will only panic if DefaultShardWidth is a bad value + } + db.shard = s + } else { + db.dirnode = format.EmptyDirNode() + } return db } @@ -70,7 +82,7 @@ func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, erro // AddChild adds a (name, key)-pair to the root node. func (d *Directory) AddChild(ctx context.Context, name string, nd node.Node) error { if d.shard == nil { - if len(d.dirnode.Links()) < ShardSplitThreshold { + if !UseHAMTSharding { _ = d.dirnode.RemoveNodeLink(name) return d.dirnode.AddNodeLinkClean(name, nd) } From 3c2b34f3a4d11234f0633f3794779aa920e64eb9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Mar 2017 16:09:34 -0700 Subject: [PATCH 1552/3147] add global config switch for sharding License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@6554bb81f4af819d25e1a6dd049a45c48475b67c --- mfs/dir.go | 9 +++------ mfs/mfs_test.go | 2 +- mfs/system.go | 9 +++++---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index cab2d9a1fe..2f3387b59f 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -59,7 +59,7 @@ func NewDirectory(ctx context.Context, name string, node node.Node, parent child // closeChild updates the child by the given name to the dag node 'nd' // and changes its own dag node -func (d *Directory) closeChild(name string, nd *dag.ProtoNode, sync bool) error { +func (d *Directory) closeChild(name string, nd node.Node, sync bool) error { mynd, err := d.closeChildUpdate(name, nd, sync) if err != nil { return err @@ -72,7 +72,7 @@ func (d *Directory) closeChild(name string, nd *dag.ProtoNode, sync bool) error } // closeChildUpdate is the portion of closeChild that needs to be locked around -func (d *Directory) closeChildUpdate(name string, nd *dag.ProtoNode, sync bool) (*dag.ProtoNode, error) { +func (d *Directory) closeChildUpdate(name string, nd node.Node, sync bool) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() @@ -329,13 +329,10 @@ func (d *Directory) Unlink(name string) error { } func (d *Directory) Flush() error { - d.lock.Lock() - nd, err := d.flushCurrentNode() + nd, err := d.GetNode() if err != nil { - d.lock.Unlock() return err } - d.lock.Unlock() return d.parent.closeChild(d.name, nd, true) } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 8471fd02c6..84df1d7589 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -752,7 +752,7 @@ func TestMfsHugeDir(t *testing.T) { defer cancel() _, rt := setupRoot(ctx, t) - for i := 0; i < 100000; i++ { + for i := 0; i < 10000; i++ { err := Mkdir(rt, fmt.Sprintf("/dir%d", i), false, false) if err != nil { t.Fatal(err) diff --git a/mfs/system.go b/mfs/system.go index 05d2a1c532..0bc3192405 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -12,6 +12,7 @@ package mfs import ( "context" "errors" + "fmt" "sync" "time" @@ -30,7 +31,7 @@ var log = logging.Logger("mfs") var ErrIsDirectory = errors.New("error: is a directory") type childCloser interface { - closeChild(string, *dag.ProtoNode, bool) error + closeChild(string, node.Node, bool) error } type NodeType int @@ -87,7 +88,7 @@ func NewRoot(parent context.Context, ds dag.DAGService, node *dag.ProtoNode, pf } switch pbn.GetType() { - case ft.TDirectory: + case ft.TDirectory, ft.THAMTShard: rval, err := NewDirectory(parent, node.String(), node, root, ds) if err != nil { return nil, err @@ -101,7 +102,7 @@ func NewRoot(parent context.Context, ds dag.DAGService, node *dag.ProtoNode, pf } root.val = fi default: - panic("unrecognized! (NYI)") + return nil, fmt.Errorf("unrecognized unixfs type: %s", pbn.GetType()) } return root, nil } @@ -124,7 +125,7 @@ func (kr *Root) Flush() error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published -func (kr *Root) closeChild(name string, nd *dag.ProtoNode, sync bool) error { +func (kr *Root) closeChild(name string, nd node.Node, sync bool) error { c, err := kr.dserv.Add(nd) if err != nil { return err From 4f97fbb09d49f1a032cf5bd55ad2a866db4f2b89 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Mar 2017 01:02:50 +0100 Subject: [PATCH 1553/3147] fix: multiple govet warnings License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@8bf6483e4458130432e53448fa7da06d562f48c7 --- unixfs/mod/dagmodifier.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 52e821de98..73852e2fa6 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -336,15 +336,18 @@ func (dm *DagModifier) readPrep() error { ctx, cancel := context.WithCancel(dm.ctx) dr, err := uio.NewDagReader(ctx, dm.curNode, dm.dagserv) if err != nil { + cancel() return err } i, err := dr.Seek(int64(dm.curWrOff), os.SEEK_SET) if err != nil { + cancel() return err } if i != int64(dm.curWrOff) { + cancel() return ErrSeekFail } From 85e57d00b2a36aa96c68a23a89a805e3931067a4 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Mar 2017 01:02:50 +0100 Subject: [PATCH 1554/3147] fix: multiple govet warnings License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-filestore@3bed4af6cb5640aca7d18f426795863fb4260199 --- filestore/filestore.go | 1 + 1 file changed, 1 insertion(+) diff --git a/filestore/filestore.go b/filestore/filestore.go index da3dc17c6d..29725cd578 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -36,6 +36,7 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { a, err := f.bs.AllKeysChan(ctx) if err != nil { + cancel() return nil, err } From b4f3e9ad96510d678151ea23a2dec008c355a4f8 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Mar 2017 01:02:50 +0100 Subject: [PATCH 1555/3147] fix: multiple govet warnings License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-blockstore@696689fb0df53001e6628b8611428698fc737814 --- blockstore/blockstore.go | 4 ++-- blockstore/bloom_cache_test.go | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index e34c3a8ee8..3d66c5ae36 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -198,14 +198,14 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return } if e.Error != nil { - log.Errorf("blockstore.AllKeysChan got err:", e.Error) + log.Errorf("blockstore.AllKeysChan got err: %s", e.Error) return } // need to convert to key.Key using key.KeyFromDsKey. k, err := dshelp.DsKeyToCid(ds.RawKey(e.Key)) if err != nil { - log.Warningf("error parsing key from DsKey: ", err) + log.Warningf("error parsing key from DsKey: %s", err) continue } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 7941a647c0..8682267eaa 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -31,7 +31,9 @@ func testBloomCached(bs Blockstore, ctx context.Context) (*bloomcache, error) { func TestPutManyAddsToBloom(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) - ctx, _ := context.WithTimeout(context.Background(), 1*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + cachedbs, err := testBloomCached(bs, ctx) select { @@ -75,7 +77,9 @@ func TestHasIsBloomCached(t *testing.T) { for i := 0; i < 1000; i++ { bs.Put(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i)))) } - ctx, _ := context.WithTimeout(context.Background(), 1*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + cachedbs, err := testBloomCached(bs, ctx) if err != nil { t.Fatal(err) From da34e7df6fddcc2c02d9f8705aa354b42a098ef4 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Mar 2017 01:02:50 +0100 Subject: [PATCH 1556/3147] fix: multiple govet warnings License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-path@c546875ce706e539b114305baee80c7940ddefaf --- path/path_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path_test.go b/path/path_test.go index a718bd81f1..c3bdcd59ef 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -24,7 +24,7 @@ func TestPathParsing(t *testing.T) { _, err := ParsePath(p) valid := (err == nil) if valid != expected { - t.Fatalf("expected %s to have valid == %s", p, expected) + t.Fatalf("expected %s to have valid == %t", p, expected) } } } From cae592c120d0c37a3b9699a54ac38f97614699e4 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Mar 2017 01:02:50 +0100 Subject: [PATCH 1557/3147] fix: multiple govet warnings License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@0ffe40144021f7bdc9f6f52433f3be24926cdb7c --- pinning/pinner/pin_test.go | 7 +++++-- pinning/pinner/set_test.go | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 009373dfe1..656f8f63d7 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -341,7 +341,9 @@ func TestPinRecursiveFail(t *testing.T) { } // NOTE: This isnt a time based test, we expect the pin to fail - mctx, _ := context.WithTimeout(ctx, time.Millisecond) + mctx, cancel := context.WithTimeout(ctx, time.Millisecond) + defer cancel() + err = p.Pin(mctx, a, true) if err == nil { t.Fatal("should have failed to pin here") @@ -358,7 +360,8 @@ func TestPinRecursiveFail(t *testing.T) { } // this one is time based... but shouldnt cause any issues - mctx, _ = context.WithTimeout(ctx, time.Second) + mctx, cancel = context.WithTimeout(ctx, time.Second) + defer cancel() err = p.Pin(mctx, a, true) if err != nil { t.Fatal(err) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 57826a9982..7dbc61a856 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -95,7 +95,7 @@ func TestSet(t *testing.T) { for _, c := range inputs { if !seen.Has(c) { - t.Fatalf("expected to have %s, didnt find it") + t.Fatalf("expected to have '%s', didnt find it", c) } } } From a81cc5d98dd15bdf327d5a76061e922b22acab66 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Mar 2017 01:02:50 +0100 Subject: [PATCH 1558/3147] fix: multiple govet warnings License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@44679931b1a8788797d4c6e899d93816e355bb5a --- blockservice/blockservice_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index a97c315ba6..bd3b0c6658 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -32,7 +32,7 @@ func TestWriteThroughWorks(t *testing.T) { bserv.AddBlock(block) if bstore.PutCounter != 2 { - t.Fatal("Put should have called again, should be 2 is: %d", bstore.PutCounter) + t.Fatalf("Put should have called again, should be 2 is: %d", bstore.PutCounter) } } From 8bb89cbe90b8348758fc90073511568114f4390d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 23 Mar 2017 17:49:26 -0700 Subject: [PATCH 1559/3147] fix go vet issues in hamt sharding PR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@5e8347cb4b8262ae7b5e8891f52966c97959413b --- unixfs/hamt/hamt.go | 14 +++++++------- unixfs/hamt/hamt_test.go | 17 ++++++++++------- unixfs/io/dagreader_test.go | 5 ++++- unixfs/io/dirbuilder.go | 8 ++++---- unixfs/io/dirbuilder_test.go | 8 ++++---- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index c9d6eb9dc3..cfe448d9cc 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -351,17 +351,17 @@ func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb return os.ErrNotExist } -func (ds *HamtShard) EnumLinks() ([]*node.Link, error) { +func (ds *HamtShard) EnumLinks(ctx context.Context) ([]*node.Link, error) { var links []*node.Link - err := ds.ForEachLink(func(l *node.Link) error { + err := ds.ForEachLink(ctx, func(l *node.Link) error { links = append(links, l) return nil }) return links, err } -func (ds *HamtShard) ForEachLink(f func(*node.Link) error) error { - return ds.walkTrie(func(sv *shardValue) error { +func (ds *HamtShard) ForEachLink(ctx context.Context, f func(*node.Link) error) error { + return ds.walkTrie(ctx, func(sv *shardValue) error { lnk, err := node.MakeLink(sv.val) if err != nil { return err @@ -373,7 +373,7 @@ func (ds *HamtShard) ForEachLink(f func(*node.Link) error) error { }) } -func (ds *HamtShard) walkTrie(cb func(*shardValue) error) error { +func (ds *HamtShard) walkTrie(ctx context.Context, cb func(*shardValue) error) error { for i := 0; i < ds.tableSize; i++ { if ds.bitfield.Bit(i) == 0 { continue @@ -382,7 +382,7 @@ func (ds *HamtShard) walkTrie(cb func(*shardValue) error) error { idx := ds.indexForBitPos(i) // NOTE: an optimized version could simply iterate over each // element in the 'children' array. - c, err := ds.getChild(context.TODO(), idx) + c, err := ds.getChild(ctx, idx) if err != nil { return err } @@ -395,7 +395,7 @@ func (ds *HamtShard) walkTrie(cb func(*shardValue) error) error { } case *HamtShard: - err := c.walkTrie(cb) + err := c.walkTrie(ctx, cb) if err != nil { return err } diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 25b7125c45..9f834a5aef 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -72,6 +72,8 @@ func assertLink(s *HamtShard, name string, found bool) error { } func assertSerializationWorks(ds dag.DAGService, s *HamtShard) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() nd, err := s.Node() if err != nil { return err @@ -82,12 +84,12 @@ func assertSerializationWorks(ds dag.DAGService, s *HamtShard) error { return err } - linksA, err := s.EnumLinks() + linksA, err := s.EnumLinks(ctx) if err != nil { return err } - linksB, err := nds.EnumLinks() + linksB, err := nds.EnumLinks(ctx) if err != nil { return err } @@ -160,7 +162,8 @@ func TestDirBuilding(t *testing.T) { func TestShardReload(t *testing.T) { ds := mdtest.Mock() s, _ := NewHamtShard(ds, 256) - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() _, s, err := makeDir(ds, 200) if err != nil { @@ -177,7 +180,7 @@ func TestShardReload(t *testing.T) { t.Fatal(err) } - lnks, err := nds.EnumLinks() + lnks, err := nds.EnumLinks(ctx) if err != nil { t.Fatal(err) } @@ -270,7 +273,7 @@ func TestSetAfterMarshal(t *testing.T) { } } - links, err := nds.EnumLinks() + links, err := nds.EnumLinks(ctx) if err != nil { t.Fatal(err) } @@ -301,7 +304,7 @@ func TestDuplicateAddShard(t *testing.T) { t.Fatal(err) } - lnks, err := dir.EnumLinks() + lnks, err := dir.EnumLinks(ctx) if err != nil { t.Fatal(err) } @@ -393,7 +396,7 @@ func TestRemoveElemsAfterMarshal(t *testing.T) { } } - links, err := nds.EnumLinks() + links, err := nds.EnumLinks(ctx) if err != nil { t.Fatal(err) } diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 27d7f3b097..b57426e38e 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -169,7 +169,10 @@ func TestMetadataNode(t *testing.T) { ctx, closer := context.WithCancel(context.Background()) defer closer() - data, err := unixfs.BytesForMetadata(&unixfs.Metadata{"text", 125}) + data, err := unixfs.BytesForMetadata(&unixfs.Metadata{ + MimeType: "text", + Size: 125, + }) if err != nil { t.Fatal(err) } diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 4b872f905c..45059f78e8 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -119,7 +119,7 @@ func (d *Directory) switchToSharding(ctx context.Context) error { return nil } -func (d *Directory) ForEachLink(f func(*node.Link) error) error { +func (d *Directory) ForEachLink(ctx context.Context, f func(*node.Link) error) error { if d.shard == nil { for _, l := range d.dirnode.Links() { if err := f(l); err != nil { @@ -129,15 +129,15 @@ func (d *Directory) ForEachLink(f func(*node.Link) error) error { return nil } - return d.shard.ForEachLink(f) + return d.shard.ForEachLink(ctx, f) } -func (d *Directory) Links() ([]*node.Link, error) { +func (d *Directory) Links(ctx context.Context) ([]*node.Link, error) { if d.shard == nil { return d.dirnode.Links(), nil } - return d.shard.EnumLinks() + return d.shard.EnumLinks(ctx) } func (d *Directory) Find(ctx context.Context, name string) (node.Node, error) { diff --git a/unixfs/io/dirbuilder_test.go b/unixfs/io/dirbuilder_test.go index f07ee88947..6118c41120 100644 --- a/unixfs/io/dirbuilder_test.go +++ b/unixfs/io/dirbuilder_test.go @@ -38,7 +38,7 @@ func TestDirectoryGrowth(t *testing.T) { t.Fatal(err) } - links, err := dir.Links() + links, err := dir.Links(ctx) if err != nil { t.Fatal(err) } @@ -86,7 +86,7 @@ func TestDuplicateAddDir(t *testing.T) { t.Fatal(err) } - lnks, err := dir.Links() + lnks, err := dir.Links(ctx) if err != nil { t.Fatal(err) } @@ -121,7 +121,7 @@ func TestDirBuilder(t *testing.T) { t.Fatal(err) } - links, err := dir.Links() + links, err := dir.Links(ctx) if err != nil { t.Fatal(err) } @@ -135,7 +135,7 @@ func TestDirBuilder(t *testing.T) { t.Fatal(err) } - links, err = adir.Links() + links, err = adir.Links(ctx) if err != nil { t.Fatal(err) } From 631a403da8df009b68ee5020e4f84bc8cbe69e72 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 23 Mar 2017 17:49:26 -0700 Subject: [PATCH 1560/3147] fix go vet issues in hamt sharding PR License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@35c2051cd2534363187c5625c02bb31d98abfa81 --- mfs/dir.go | 10 +++++----- mfs/mfs_test.go | 16 ++++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 2f3387b59f..63ae8d4080 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -217,12 +217,12 @@ type NodeListing struct { Hash string } -func (d *Directory) ListNames() ([]string, error) { +func (d *Directory) ListNames(ctx context.Context) ([]string, error) { d.lock.Lock() defer d.lock.Unlock() var out []string - err := d.dirbuilder.ForEachLink(func(l *node.Link) error { + err := d.dirbuilder.ForEachLink(ctx, func(l *node.Link) error { out = append(out, l.Name) return nil }) @@ -235,9 +235,9 @@ func (d *Directory) ListNames() ([]string, error) { return out, nil } -func (d *Directory) List() ([]NodeListing, error) { +func (d *Directory) List(ctx context.Context) ([]NodeListing, error) { var out []NodeListing - err := d.ForEachEntry(context.TODO(), func(nl NodeListing) error { + err := d.ForEachEntry(ctx, func(nl NodeListing) error { out = append(out, nl) return nil }) @@ -247,7 +247,7 @@ func (d *Directory) List() ([]NodeListing, error) { func (d *Directory) ForEachEntry(ctx context.Context, f func(NodeListing) error) error { d.lock.Lock() defer d.lock.Unlock() - return d.dirbuilder.ForEachLink(func(l *node.Link) error { + return d.dirbuilder.ForEachLink(ctx, func(l *node.Link) error { c, err := d.childUnsync(l.Name) if err != nil { return err diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 84df1d7589..e3c2f3e198 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -82,6 +82,9 @@ func mkdirP(t *testing.T, root *Directory, pth string) *Directory { } func assertDirAtPath(root *Directory, pth string, children []string) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + fsn, err := DirLookup(root, pth) if err != nil { return err @@ -92,7 +95,7 @@ func assertDirAtPath(root *Directory, pth string, children []string) error { return fmt.Errorf("%s was not a directory", pth) } - listing, err := dir.List() + listing, err := dir.List(ctx) if err != nil { return err } @@ -496,7 +499,7 @@ func TestMfsFile(t *testing.T) { func randomWalk(d *Directory, n int) (*Directory, error) { for i := 0; i < n; i++ { - dirents, err := d.List() + dirents, err := d.List(context.Background()) if err != nil { return nil, err } @@ -585,7 +588,7 @@ func actorRemoveFile(d *Directory) error { return err } - ents, err := d.List() + ents, err := d.List(context.Background()) if err != nil { return err } @@ -605,7 +608,7 @@ func randomFile(d *Directory) (*File, error) { return nil, err } - ents, err := d.List() + ents, err := d.List(context.Background()) if err != nil { return nil, err } @@ -953,6 +956,7 @@ func TestConcurrentReads(t *testing.T) { } wg.Wait() } + func writeFile(rt *Root, path string, data []byte) error { n, err := Lookup(rt, path) if err != nil { @@ -975,8 +979,8 @@ func writeFile(rt *Root, path string, data []byte) error { return err } - if nw != 10 { - fmt.Errorf("wrote incorrect amount") + if nw != len(data) { + return fmt.Errorf("wrote incorrect amount: %d != 10", nw) } return nil From 1e32292e7b52eb27306584c2157aaf25fe594c3b Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 24 Mar 2017 16:36:46 +0100 Subject: [PATCH 1561/3147] Make Golint happy in the blocks submodule. This has required changing the order of some parameters and adding HashOnRead to the Blockstore interface (which I have in turn added to all the wrapper implementations). License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@9ed31e98c5905a34016c0f96013fe2227a7c22a5 --- filestore/filestore.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/filestore/filestore.go b/filestore/filestore.go index 29725cd578..801f78d1cc 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -199,4 +199,9 @@ func (f *Filestore) PutMany(bs []blocks.Block) error { return nil } +// HashOnRead calls blockstore.HashOnRead. +func (f *Filestore) HashOnRead(enabled bool) { + f.bs.HashOnRead(enabled) +} + var _ blockstore.Blockstore = (*Filestore)(nil) From 3fdb77b4824fa697ff4c004fd09c1e0e68dce76f Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 24 Mar 2017 16:36:46 +0100 Subject: [PATCH 1562/3147] Make Golint happy in the blocks submodule. This has required changing the order of some parameters and adding HashOnRead to the Blockstore interface (which I have in turn added to all the wrapper implementations). License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-blockstore@94eff5ef801c07c0a9a530bd90d9067ff4f8d19b --- blockstore/arc_cache.go | 7 +++++ blockstore/arc_cache_test.go | 11 ++++---- blockstore/blockstore.go | 47 +++++++++++++++++++++++++--------- blockstore/blockstore_test.go | 4 +-- blockstore/bloom_cache.go | 11 +++++--- blockstore/bloom_cache_test.go | 15 +++++------ blockstore/caching.go | 12 ++++++--- blockstore/util/remove.go | 21 ++++++++++++--- 8 files changed, 91 insertions(+), 37 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 989f36e114..d14600f011 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -11,6 +11,9 @@ import ( lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" ) +// arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for +// block Cids. This provides block access-time improvements, allowing +// to short-cut many searches without query-ing the underlying datastore. type arccache struct { arc *lru.ARCCache blockstore Blockstore @@ -128,6 +131,10 @@ func (b *arccache) PutMany(bs []blocks.Block) error { return nil } +func (b *arccache) HashOnRead(enabled bool) { + b.blockstore.HashOnRead(enabled) +} + func (b *arccache) addCache(c *cid.Cid, has bool) { b.arc.Add(c.KeyString(), has) } diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 987185e804..f143a1a433 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -13,25 +13,24 @@ import ( var exampleBlock = blocks.NewBlock([]byte("foo")) -func testArcCached(bs Blockstore, ctx context.Context) (*arccache, error) { +func testArcCached(ctx context.Context, bs Blockstore) (*arccache, error) { if ctx == nil { ctx = context.TODO() } opts := DefaultCacheOpts() opts.HasBloomFilterSize = 0 opts.HasBloomFilterHashes = 0 - bbs, err := CachedBlockstore(bs, ctx, opts) + bbs, err := CachedBlockstore(ctx, bs, opts) if err == nil { return bbs.(*arccache), nil - } else { - return nil, err } + return nil, err } -func createStores(t *testing.T) (*arccache, *blockstore, *callbackDatastore) { +func createStores(t *testing.T) (*arccache, Blockstore, *callbackDatastore) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) - arc, err := testArcCached(bs, nil) + arc, err := testArcCached(nil, bs) if err != nil { t.Fatal(err) } diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 3d66c5ae36..092a9ccedb 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -1,4 +1,4 @@ -// package blockstore implements a thin wrapper over a datastore, giving a +// Package blockstore implements a thin wrapper over a datastore, giving a // clean interface for Getting and Putting block objects. package blockstore @@ -23,22 +23,36 @@ var log = logging.Logger("blockstore") // BlockPrefix namespaces blockstore datastores var BlockPrefix = ds.NewKey("blocks") -var ValueTypeMismatch = errors.New("the retrieved value is not a Block") +// ErrValueTypeMismatch is an error returned when the item retrieved from +// the datatstore is not a block. +var ErrValueTypeMismatch = errors.New("the retrieved value is not a Block") + +// ErrHashMismatch is an error returned when the hash of a block +// is different than expected. var ErrHashMismatch = errors.New("block in storage has different hash than requested") +// ErrNotFound is an error returned when a block is not found. var ErrNotFound = errors.New("blockstore: block not found") -// Blockstore wraps a Datastore +// Blockstore wraps a Datastore block-centered methods and provides a layer +// of abstraction which allows to add different caching strategies. type Blockstore interface { DeleteBlock(*cid.Cid) error Has(*cid.Cid) (bool, error) Get(*cid.Cid) (blocks.Block, error) Put(blocks.Block) error PutMany([]blocks.Block) error - + // AllKeysChan returns a channel from which + // the CIDs in the Blockstore can be read. It should respect + // the given context, closing the channel if it becomes Done. AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) + // HashOnRead specifies if every read block should be + // rehashed to make sure it matches its CID. + HashOnRead(enabled bool) } +// GCLocker abstract functionality to lock a blockstore when performing +// garbage-collection operations. type GCLocker interface { // GCLock locks the blockstore for garbage collection. No operations // that expect to finish with a pin should ocurr simultaneously. @@ -56,11 +70,15 @@ type GCLocker interface { GCRequested() bool } +// GCBlockstore is a blockstore that can safely run garbage-collection +// operations. type GCBlockstore interface { Blockstore GCLocker } +// NewGCBlockstore returns a default implementation of GCBlockstore +// using the given Blockstore and GCLocker. func NewGCBlockstore(bs Blockstore, gcl GCLocker) GCBlockstore { return gcBlockstore{bs, gcl} } @@ -70,7 +88,9 @@ type gcBlockstore struct { GCLocker } -func NewBlockstore(d ds.Batching) *blockstore { +// NewBlockstore returns a default Blockstore implementation +// using the provided datastore.Batching backend. +func NewBlockstore(d ds.Batching) Blockstore { var dsb ds.Batching dd := dsns.Wrap(d, BlockPrefix) dsb = dd @@ -108,7 +128,7 @@ func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { } bdata, ok := maybeData.([]byte) if !ok { - return nil, ValueTypeMismatch + return nil, ErrValueTypeMismatch } if bs.rehash { @@ -122,9 +142,8 @@ func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { } return blocks.NewBlockWithCid(bdata, rbcid) - } else { - return blocks.NewBlockWithCid(bdata, k) } + return blocks.NewBlockWithCid(bdata, k) } func (bs *blockstore) Put(block blocks.Block) error { @@ -162,8 +181,8 @@ func (bs *blockstore) Has(k *cid.Cid) (bool, error) { return bs.datastore.Has(dshelp.CidToDsKey(k)) } -func (s *blockstore) DeleteBlock(k *cid.Cid) error { - err := s.datastore.Delete(dshelp.CidToDsKey(k)) +func (bs *blockstore) DeleteBlock(k *cid.Cid) error { + err := bs.datastore.Delete(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { return ErrNotFound } @@ -173,7 +192,7 @@ func (s *blockstore) DeleteBlock(k *cid.Cid) error { // AllKeysChan runs a query for keys from the blockstore. // this is very simplistic, in the future, take dsq.Query as a param? // -// AllKeysChan respects context +// AllKeysChan respects context. func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { // KeysOnly, because that would be _a lot_ of data. @@ -220,7 +239,9 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return output, nil } -func NewGCLocker() *gclocker { +// NewGCLocker returns a default implementation of +// GCLocker using standard [RW] mutexes. +func NewGCLocker() GCLocker { return &gclocker{} } @@ -230,6 +251,8 @@ type gclocker struct { gcreqlk sync.Mutex } +// Unlocker represents an object which can Unlock +// something. type Unlocker interface { Unlock() } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 6e5216609f..781a1eec13 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -186,7 +186,7 @@ func TestAllKeysRespectsContext(t *testing.T) { } -func TestValueTypeMismatch(t *testing.T) { +func TestErrValueTypeMismatch(t *testing.T) { block := blocks.NewBlock([]byte("some data")) datastore := ds.NewMapDatastore() @@ -196,7 +196,7 @@ func TestValueTypeMismatch(t *testing.T) { blockstore := NewBlockstore(ds_sync.MutexWrap(datastore)) _, err := blockstore.Get(block.Cid()) - if err != ValueTypeMismatch { + if err != ErrValueTypeMismatch { t.Fatal(err) } } diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 5c8c76ad52..cc6526bc82 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -12,9 +12,10 @@ import ( bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) -// bloomCached returns Blockstore that caches Has requests using Bloom filter -// Size is size of bloom filter in bytes -func bloomCached(bs Blockstore, ctx context.Context, bloomSize, hashCount int) (*bloomcache, error) { +// bloomCached returns a Blockstore that caches Has requests using a Bloom +// filter. bloomSize is size of bloom filter in bytes. hashCount specifies the +// number of hashing functions in the bloom filter (usually known as k). +func bloomCached(ctx context.Context, bs Blockstore, bloomSize, hashCount int) (*bloomcache, error) { bl, err := bloom.New(float64(bloomSize), float64(hashCount)) if err != nil { return nil, err @@ -165,6 +166,10 @@ func (b *bloomcache) PutMany(bs []blocks.Block) error { return nil } +func (b *bloomcache) HashOnRead(enabled bool) { + b.blockstore.HashOnRead(enabled) +} + func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { return b.blockstore.AllKeysChan(ctx) } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 8682267eaa..f021efd8e7 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -14,18 +14,17 @@ import ( syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" ) -func testBloomCached(bs Blockstore, ctx context.Context) (*bloomcache, error) { +func testBloomCached(ctx context.Context, bs Blockstore) (*bloomcache, error) { if ctx == nil { - ctx = context.TODO() + ctx = context.Background() } opts := DefaultCacheOpts() opts.HasARCCacheSize = 0 - bbs, err := CachedBlockstore(bs, ctx, opts) + bbs, err := CachedBlockstore(ctx, bs, opts) if err == nil { return bbs.(*bloomcache), nil - } else { - return nil, err } + return nil, err } func TestPutManyAddsToBloom(t *testing.T) { @@ -34,7 +33,7 @@ func TestPutManyAddsToBloom(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() - cachedbs, err := testBloomCached(bs, ctx) + cachedbs, err := testBloomCached(ctx, bs) select { case <-cachedbs.rebuildChan: @@ -65,7 +64,7 @@ func TestPutManyAddsToBloom(t *testing.T) { func TestReturnsErrorWhenSizeNegative(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore())) - _, err := bloomCached(bs, context.TODO(), -1, 1) + _, err := bloomCached(context.Background(), bs, -1, 1) if err == nil { t.Fail() } @@ -80,7 +79,7 @@ func TestHasIsBloomCached(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() - cachedbs, err := testBloomCached(bs, ctx) + cachedbs, err := testBloomCached(ctx, bs) if err != nil { t.Fatal(err) } diff --git a/blockstore/caching.go b/blockstore/caching.go index d19f478226..0ea375b06c 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -7,6 +7,7 @@ import ( "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" ) +// CacheOpts wraps options for CachedBlockStore(). // Next to each option is it aproximate memory usage per unit type CacheOpts struct { HasBloomFilterSize int // 1 byte @@ -14,6 +15,7 @@ type CacheOpts struct { HasARCCacheSize int // 32 bytes } +// DefaultCacheOpts returns a CacheOpts initialized with default values. func DefaultCacheOpts() CacheOpts { return CacheOpts{ HasBloomFilterSize: 512 << 10, @@ -22,8 +24,12 @@ func DefaultCacheOpts() CacheOpts { } } -func CachedBlockstore(bs Blockstore, - ctx context.Context, opts CacheOpts) (cbs Blockstore, err error) { +// CachedBlockstore returns a blockstore wrapped in an ARCCache and +// then in a bloom filter cache, if the options indicate it. +func CachedBlockstore( + ctx context.Context, + bs Blockstore, + opts CacheOpts) (cbs Blockstore, err error) { cbs = bs if opts.HasBloomFilterSize < 0 || opts.HasBloomFilterHashes < 0 || @@ -42,7 +48,7 @@ func CachedBlockstore(bs Blockstore, } if opts.HasBloomFilterSize != 0 { // *8 because of bytes to bits conversion - cbs, err = bloomCached(cbs, ctx, opts.HasBloomFilterSize*8, opts.HasBloomFilterHashes) + cbs, err = bloomCached(ctx, cbs, opts.HasBloomFilterSize*8, opts.HasBloomFilterHashes) } return cbs, err diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 60cb1aee88..2523b3ac23 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -1,13 +1,15 @@ -package blockstore_util +// Package blockstoreutil provides utility functions for Blockstores. +package blockstoreutil import ( "fmt" "io" - bs "github.com/ipfs/go-ipfs/blocks/blockstore" - "github.com/ipfs/go-ipfs/pin" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + + bs "github.com/ipfs/go-ipfs/blocks/blockstore" + "github.com/ipfs/go-ipfs/pin" ) // RemovedBlock is used to respresent the result of removing a block. @@ -21,12 +23,17 @@ type RemovedBlock struct { Error string `json:",omitempty"` } +// RmBlocksOpts is used to wrap options for RmBlocks(). type RmBlocksOpts struct { Prefix string Quiet bool Force bool } +// RmBlocks removes the blocks provided in the cids slice. +// It returns a channel where objects of type RemovedBlock are placed, when +// not using the Quiet option. Block removal is asynchronous and will +// skip any pinned blocks. func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, cids []*cid.Cid, opts RmBlocksOpts) (<-chan interface{}, error) { // make the channel large enough to hold any result to avoid // blocking while holding the GCLock @@ -53,6 +60,11 @@ func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, cids []*cid.Cid, opts RmB return out, nil } +// FilterPinned takes a slice of Cids and returns it with the pinned Cids +// removed. If a Cid is pinned, it will place RemovedBlock objects in the given +// out channel, with an error which indicates that the Cid is pinned. +// This function is used in RmBlocks to filter out any blocks which are not +// to be removed (because they are pinned). func FilterPinned(pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid) []*cid.Cid { stillOkay := make([]*cid.Cid, 0, len(cids)) res, err := pins.CheckIfPinned(cids...) @@ -73,6 +85,9 @@ func FilterPinned(pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid) []*c return stillOkay } +// ProcRmOutput takes the channel returned by RmBlocks and writes +// to stdout/stderr according to the RemovedBlock objects received in +// that channel. func ProcRmOutput(in <-chan interface{}, sout io.Writer, serr io.Writer) error { someFailed := false for res := range in { From 88bb63cffc0e5f03aefa1288fdf2b1ce5b7e47e8 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 24 Mar 2017 20:36:00 +0100 Subject: [PATCH 1563/3147] Filestore: make golint happy Comments for exported functions and little else. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@f6b153a1eb94f6bc4bdd265918bfe612abf1b08d --- filestore/filestore.go | 29 ++++++++++++++++++++++++++ filestore/fsrefstore.go | 29 ++++++++++++++++++++++++++ filestore/util.go | 45 ++++++++++++++++++++++++++++++++--------- 3 files changed, 94 insertions(+), 9 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 801f78d1cc..8c58227056 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -1,3 +1,10 @@ +// Package filestore implements a Blockstore which is able to read certain +// blocks of data directly from its original location in the filesystem. +// +// In a Filestore, object leaves are stored as FilestoreNodes. FilestoreNodes +// include a filesystem path and an offset, allowing a Blockstore dealing with +// such blocks to avoid storing the whole contents and reading them from their +// filesystem location instead. package filestore import ( @@ -14,23 +21,31 @@ import ( var log = logging.Logger("filestore") +// Filestore implements a Blockstore by combining a standard Blockstore +// to store regular blocks and a special Blockstore called +// FileManager to store blocks which data exists in an external file. type Filestore struct { fm *FileManager bs blockstore.Blockstore } +// FileManager returns the FileManager in Filestore. func (f *Filestore) FileManager() *FileManager { return f.fm } +// MainBlockstore returns the standard Blockstore in the Filestore. func (f *Filestore) MainBlockstore() blockstore.Blockstore { return f.bs } +// NewFilestore creates one using the given Blockstore and FileManager. func NewFilestore(bs blockstore.Blockstore, fm *FileManager) *Filestore { return &Filestore{fm, bs} } +// AllKeysChan returns a channel from which to read the keys stored in +// the blockstore. If the given context is cancelled the channel will be closed. func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { ctx, cancel := context.WithCancel(ctx) @@ -93,6 +108,10 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { return out, nil } +// DeleteBlock deletes the block with the given key from the +// blockstore. As expected, in the case of FileManager blocks, only the +// reference is deleted, not its contents. It may return +// ErrNotFound when the block is not stored. func (f *Filestore) DeleteBlock(c *cid.Cid) error { err1 := f.bs.DeleteBlock(c) if err1 != nil && err1 != blockstore.ErrNotFound { @@ -116,6 +135,8 @@ func (f *Filestore) DeleteBlock(c *cid.Cid) error { } } +// Get retrieves the block with the given Cid. It may return +// ErrNotFound when the block is not stored. func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { blk, err := f.bs.Get(c) switch err { @@ -130,6 +151,8 @@ func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { return f.fm.Get(c) } +// Has returns true if the block with the given Cid is +// stored in the Filestore. func (f *Filestore) Has(c *cid.Cid) (bool, error) { has, err := f.bs.Has(c) if err != nil { @@ -143,6 +166,10 @@ func (f *Filestore) Has(c *cid.Cid) (bool, error) { return f.fm.Has(c) } +// Put stores a block in the Filestore. For blocks of +// underlying type FilestoreNode, the operation is +// delegated to the FileManager, while the rest of blocks +// are handled by the regular blockstore. func (f *Filestore) Put(b blocks.Block) error { has, err := f.Has(b.Cid()) if err != nil { @@ -161,6 +188,8 @@ func (f *Filestore) Put(b blocks.Block) error { } } +// PutMany is like Put(), but takes a slice of blocks, allowing +// the underlying blockstore to perform batch transactions. func (f *Filestore) PutMany(bs []blocks.Block) error { var normals []blocks.Block var fstores []*posinfo.FilestoreNode diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 3e3750cb9d..7b41555b9c 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -20,26 +20,43 @@ import ( cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) +// FilestorePrefix identifies the key prefix for FileManager blocks. var FilestorePrefix = ds.NewKey("filestore") +// FileManager is a blockstore implementation which stores special +// blocks FilestoreNode type. These nodes only contain a reference +// to the actual location of the block data in the filesystem +// (a path and an offset). type FileManager struct { ds ds.Batching root string } +// CorruptReferenceError implements the error interface. +// It is used to indicate that the block contents pointed +// by the referencing blocks cannot be retrieved (i.e. the +// file is not found, or the data changed as it was being read). type CorruptReferenceError struct { Code Status Err error } +// Error() returns the error message in the CorruptReferenceError +// as a string. func (c CorruptReferenceError) Error() string { return c.Err.Error() } +// NewFileManager initializes a new file manager with the given +// datastore and root. All FilestoreNodes paths are relative to the +// root path given here, which is prepended for any operations. func NewFileManager(ds ds.Batching, root string) *FileManager { return &FileManager{dsns.Wrap(ds, FilestorePrefix), root} } +// AllKeysChan returns a channel from which to read the keys stored in +// the FileManager. If the given context is cancelled the channel will be +// closed. func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { q := dsq.Query{KeysOnly: true} q.Prefix = FilestorePrefix.String() @@ -76,6 +93,8 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return out, nil } +// DeleteBlock deletes the reference-block from the underlying +// datastore. It does not touch the referenced data. func (f *FileManager) DeleteBlock(c *cid.Cid) error { err := f.ds.Delete(dshelp.CidToDsKey(c)) if err == ds.ErrNotFound { @@ -84,6 +103,10 @@ func (f *FileManager) DeleteBlock(c *cid.Cid) error { return err } +// Get reads a block from the datastore. Reading a block +// is done in two steps: the first step retrieves the reference +// block from the datastore. The second step uses the stored +// path and offsets to read the raw block data directly from disk. func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { dobj, err := f.getDataObj(c) if err != nil { @@ -165,6 +188,8 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { return outbuf, nil } +// Has returns if the FileManager is storing a block reference. It does not +// validate the data, nor checks if the reference is valid. func (f *FileManager) Has(c *cid.Cid) (bool, error) { // NOTE: interesting thing to consider. Has doesnt validate the data. // So the data on disk could be invalid, and we could think we have it. @@ -176,6 +201,8 @@ type putter interface { Put(ds.Key, interface{}) error } +// Put adds a new reference block to the FileManager. It does not check +// that the reference is valid. func (f *FileManager) Put(b *posinfo.FilestoreNode) error { return f.putTo(b, f.ds) } @@ -204,6 +231,8 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { return to.Put(dshelp.CidToDsKey(b.Cid()), data) } +// PutMany is like Put() but takes a slice of blocks instead, +// allowing it to create a batch transaction. func (f *FileManager) PutMany(bs []*posinfo.FilestoreNode) error { batch, err := f.ds.Batch() if err != nil { diff --git a/filestore/util.go b/filestore/util.go index f098d2e177..0d764cfb73 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -12,8 +12,11 @@ import ( cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" ) +// Status is used to identify the state of the block data referenced +// by a FilestoreNode. Among other places, it is used by CorruptReferenceError. type Status int32 +// These are the supported Status codes. const ( StatusOk Status = 0 StatusFileError Status = 10 // Backing File Error @@ -23,6 +26,7 @@ const ( StatusKeyNotFound Status = 30 ) +// String provides a human-readable representation for Status codes. func (s Status) String() string { switch s { case StatusOk: @@ -42,10 +46,16 @@ func (s Status) String() string { } } +// Format returns the status formatted as a string +// with leading 0s. func (s Status) Format() string { return fmt.Sprintf("%-7s", s.String()) } +// ListRes wraps the response of the List*() functions, which +// allows to obtain and verify blocks stored by the FileManager +// of a Filestore. It includes information about the referenced +// block. type ListRes struct { Status Status ErrorMsg string @@ -55,6 +65,7 @@ type ListRes struct { Size uint64 } +// FormatLong returns a human readable string for a ListRes object. func (r *ListRes) FormatLong() string { switch { case r.Key == nil: @@ -66,18 +77,34 @@ func (r *ListRes) FormatLong() string { } } +// List fetches the block with the given key from the Filemanager +// of the given Filestore and returns a ListRes object with the information. +// List does not verify that the reference is valid or whether the +// raw data is accesible. See Verify(). func List(fs *Filestore, key *cid.Cid) *ListRes { return list(fs, false, key) } +// ListAll returns a function as an iterator which, once invoked, returns +// one by one each block in the Filestore's FileManager. +// ListAll does not verify that the references are valid or whether +// the raw data is accessible. See VerifyAll(). func ListAll(fs *Filestore) (func() *ListRes, error) { return listAll(fs, false) } +// Verify fetches the block with the given key from the Filemanager +// of the given Filestore and returns a ListRes object with the information. +// Verify makes sure that the reference is valid and the block data can be +// read. func Verify(fs *Filestore, key *cid.Cid) *ListRes { return list(fs, true, key) } +// VerifyAll returns a function as an iterator which, once invoked, +// returns one by one each block in the Filestore's FileManager. +// VerifyAll checks that the reference is valid and that the block data +// can be read. func VerifyAll(fs *Filestore) (func() *ListRes, error) { return listAll(fs, true) } @@ -150,14 +177,14 @@ func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { ErrorMsg: errorMsg, Key: c, } - } else { - return &ListRes{ - Status: status, - ErrorMsg: errorMsg, - Key: c, - FilePath: *d.FilePath, - Size: *d.Size_, - Offset: *d.Offset, - } + } + + return &ListRes{ + Status: status, + ErrorMsg: errorMsg, + Key: c, + FilePath: *d.FilePath, + Size: *d.Size_, + Offset: *d.Offset, } } From a64e494e79313353256e878ccfe3fe9719a58557 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1564/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@edd462b2035c2770a7da0a2532713f16624fd1d4 --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 4 ++-- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 2 +- namesys/publisher.go | 12 ++++++------ namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 10 +++++----- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index abbc3c676b..f103fc0451 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,7 +35,7 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 9bc856dd44..497548d710 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index dbc9bfdf6b..72055331c4 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,10 +7,10 @@ import ( path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 030dd8bfc1..7df4ac9264 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,7 +10,7 @@ import ( offroute "github.com/ipfs/go-ipfs/routing/offline" "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index d805612376..fe4a03b086 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,14 +14,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" + dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" - record "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record" - dhtpb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 622066e704..fddbc2ea42 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,15 +11,15 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - recpb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 675a436757..10c7c55a7f 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" - mocknet "gx/ipfs/QmeWJwi61vii5g8zQUB9UGegfUbmhTKHgeDFP9XuSp5jZ4/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + mocknet "gx/ipfs/QmRai5yZNL67pWCoznW7sBdFnqZrFULuJ5w8KhmRyhdgN4/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 462168f563..c7e13e853c 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -12,7 +12,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 11236bbcb2..88983cedb0 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + mh "gx/ipfs/QmVGtdTZdTFaLsaj2RwdVG8jcjNNcp1DE914DKZ2kHmXHw/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" - mh "gx/ipfs/QmbZ6Cee2uHjG7hf19qLHppgKDRtaG4CVtMzdmK9VCVqLu/go-multihash" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" ) var log = logging.Logger("namesys") From 919d5c2b6120349b006d3d17459176aedb35ad3e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1565/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@1f3adf35a9a7d6818c443d0b149727c242535e38 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 2 +- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 2 +- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 2 +- unixfs/test/utils.go | 4 ++-- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index b39c71560f..c28b2fe680 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 26492d8978..5498c463e9 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,8 +13,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) // Writer is a utility structure that helps to write diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index cfe448d9cc..4c3f4f913c 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,8 +31,8 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index d36c33c2e2..48aa913699 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,8 +10,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var ErrIsDir = errors.New("this dag node is a directory") diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 45059f78e8..c0587480d3 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -9,7 +9,7 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index ab9239601d..16f360b4ac 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 73852e2fa6..c531caa159 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -15,9 +15,9 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index cdd97038b1..ecc9be644d 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -19,7 +19,7 @@ import ( context "context" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore) { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index c46c4d3e52..ada15a0862 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,8 +14,8 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From e5e51ca9a394ef8f72e0f43ce0032607ae77e00d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1566/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@7bdb9ce0045df40e8a8ee4a012ea70357dd4c632 --- mfs/dir.go | 2 +- mfs/file.go | 2 +- mfs/mfs_test.go | 6 +++--- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 63ae8d4080..a0a9205b6f 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,7 +15,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index a379c802fb..02a5b62c89 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index e3c2f3e198..11a13b8e0b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -26,9 +26,9 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 8dd7131d8f..694a001b09 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 0952de0dd2..832bee0d2a 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 0bc3192405..8bc6893c81 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -20,8 +20,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var ErrNotExist = errors.New("no such rootfs") From 57b144a54e7031f8983bd7d0f3ae063a783d13b5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1567/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@1f9263d15217bf8dc5e6e97342fb308405194ec1 --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index 3a885b478a..419f6c9c91 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 4339fbf0e6..4ebde479ff 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -10,8 +10,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index f489c1eb1b..6e7ad64de3 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" - util "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + util "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From efa1be798c6eea5d3f523aca09e09ed1fabc6967 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1568/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-keystore@c13ce809f7a06f45ef67fe4fb0c018b7442ed5b8 --- keystore/keystore.go | 2 +- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index b52dabdeaf..b69e3e940b 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ) type Keystore interface { diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 58b699888a..4840069bca 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -7,7 +7,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 2351f54d85..ae45ecf219 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" +import ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" type MemKeystore struct { keys map[string]ci.PrivKey From 2a2956584c2a9d4d6a3badef785b17b6bf407f46 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1569/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@566ac617e7f2998385bb497219a69e2fb39e568b --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 4a990da9a9..ff1ca8a351 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -10,8 +10,8 @@ import ( pin "github.com/ipfs/go-ipfs/pin" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index e0c211ffb2..8c742d1c00 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -13,8 +13,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 656f8f63d7..cbf89c6012 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -12,8 +12,8 @@ import ( context "context" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index bf05924fdb..472142b5c2 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - node "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 7dbc61a856..f31cb890fd 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -12,7 +12,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func ignoreCids(_ *cid.Cid) {} From f4d8afc5c656dd3dce440f58efae176c42f70e41 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1570/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@6f691a3b9785251b2079a37b0a2b0bc59e81771d --- routing/mock/centralized_client.go | 14 +++++++------- routing/mock/centralized_server.go | 6 +++--- routing/mock/centralized_test.go | 6 +++--- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 10 +++++----- routing/offline/offline.go | 14 +++++++------- routing/supernode/client.go | 16 ++++++++-------- routing/supernode/proxy/loopback.go | 6 +++--- routing/supernode/proxy/standard.go | 14 +++++++------- routing/supernode/server.go | 10 +++++----- routing/supernode/server_test.go | 2 +- 12 files changed, 53 insertions(+), 53 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index eb2c183bb8..513a50cb38 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,16 +8,16 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - ma "gx/ipfs/QmSWLfmj5frN9xVLMMN846dMDriy5wN5jeghUm7aTW3DAG/go-multiaddr" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" - dhtpb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + ma "gx/ipfs/QmcyqRMCAXVtYPS4DiBrA7sezL9rRGfW8Ctx7cywL4TXJj/go-multiaddr" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 936c06f144..50844f9f7a 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,11 +8,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 35a51f16c1..c7c6836d18 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,9 +8,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 3bc799a892..9a084d603f 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" + dht "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - dht "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht" - mocknet "gx/ipfs/QmeWJwi61vii5g8zQUB9UGegfUbmhTKHgeDFP9XuSp5jZ4/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmRai5yZNL67pWCoznW7sBdFnqZrFULuJ5w8KhmRyhdgN4/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 96a5a6f4e2..77db71313b 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index e48ffffda9..8e0a2a3078 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,12 +6,12 @@ import ( repo "github.com/ipfs/go-ipfs/repo" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" - p2phost "gx/ipfs/QmXzeAcmKDTfNZQBiyF22hQKuTK7P5z6MBBQLTk9bbiSUc/go-libp2p-host" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + p2phost "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 5515e49f93..165af084a4 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,16 +7,16 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - ci "gx/ipfs/QmPGxZ1DP2w45WcogpW1h43BvseXbfke9N91qotpoQcUeS/go-libp2p-crypto" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" + pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - record "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record" - pb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) var log = logging.Logger("offlinerouting") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index d96ed3ebc3..1c2fe866a0 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,16 +8,16 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmUc6twRJRE9MNrUGd8eo9WjHHxebGppdZfptGCASkR7fF/go-libp2p-routing" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" - loggables "gx/ipfs/QmXs1igHHEaUmMxKtbP8Z9wTjitQ75sqxaKQP4QgnLN4nn/go-libp2p-loggables" - "gx/ipfs/QmXzeAcmKDTfNZQBiyF22hQKuTK7P5z6MBBQLTk9bbiSUc/go-libp2p-host" + loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" + pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" - pb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index f2fa36242b..02014cef6a 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" - inet "gx/ipfs/QmVtMT3fD7DzQNW7hdm6Xe6KPstzcggrhNpeVZ4422UpKK/go-libp2p-net" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmVHSBsn8LEeay8m5ERebgUVuhzw838PsyTttCmP6GMJkg/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 69b8812af6..8cbffe2b3e 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,15 +4,15 @@ import ( "context" "errors" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - kbucket "gx/ipfs/QmTxn7JEA8DiBvd9vVzErAzadHn6TwjCKTjjUfPyRH9wjZ/go-libp2p-kbucket" - inet "gx/ipfs/QmVtMT3fD7DzQNW7hdm6Xe6KPstzcggrhNpeVZ4422UpKK/go-libp2p-net" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" - loggables "gx/ipfs/QmXs1igHHEaUmMxKtbP8Z9wTjitQ75sqxaKQP4QgnLN4nn/go-libp2p-loggables" - host "gx/ipfs/QmXzeAcmKDTfNZQBiyF22hQKuTK7P5z6MBBQLTk9bbiSUc/go-libp2p-host" + inet "gx/ipfs/QmVHSBsn8LEeay8m5ERebgUVuhzw838PsyTttCmP6GMJkg/go-libp2p-net" + loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" + kbucket "gx/ipfs/QmXKSwZVoHCTne4jTLzDtMc2K6paEZ2QaUMQfJ4ogYd28n/go-libp2p-kbucket" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + host "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 7744237add..1110c43207 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,13 +8,13 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer" + record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" + pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" - record "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record" - pb "gx/ipfs/QmcTnycWsBgvNYFYgWdWi8SRDCeevG8HBUQHkvg4KLXUsW/go-libp2p-record/pb" - pstore "gx/ipfs/Qme1g4e3m2SmdiSGGU3vSWmUStwUjc5oECnEriaK9Xa1HU/go-libp2p-peerstore" + peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index d08e157bbd..a06e29e76e 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" + dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmaoxFZcgwGyoB57pCYQobejLoNgqaA6trr3zxxrbm4UXe/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 247fb7bb38ae5f085b1f4173ac4e850431023c9e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1571/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@408083807a58fcc981ac1805840605722fd2eb8d --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 2 +- filestore/util.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 8c58227056..047d26b518 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -16,7 +16,7 @@ import ( dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 2b30c79575..5569c61b5e 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -12,7 +12,7 @@ import ( posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 7b41555b9c..46cc39b7f4 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -17,7 +17,7 @@ import ( dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 0d764cfb73..6dd6cf1c2f 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -9,7 +9,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // Status is used to identify the state of the block data referenced From 5f3b9fb0e4baec9eb2902b5f6d3abeba720ddb16 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1572/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@8b2cebdbd6601ccf88e5a6ca744e9ac5a4ca5568 --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 2 +- blockstore/blockstore_test.go | 4 ++-- blockstore/bloom_cache.go | 2 +- blockstore/util/remove.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index d14600f011..75c7ee489a 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -7,8 +7,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index f143a1a433..8790423801 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -8,7 +8,7 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 092a9ccedb..ac4b874050 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -15,7 +15,7 @@ import ( dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 781a1eec13..93705997ed 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -12,8 +12,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index cc6526bc82..47f5ac018a 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-ipfs/blocks" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 2523b3ac23..57c6741cac 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,7 +6,7 @@ import ( "io" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From 4b41430dc8f886ac7467fa38275964d65417c648 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1573/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@35ed8c337050c01d367456f1b5f84200a862d583 --- blockservice/blockservice.go | 2 +- blockservice/test/blocks_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 6629d67cd4..294b541338 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index db60a37268..68f77be7ef 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -14,8 +14,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func newObject(data []byte) blocks.Block { From 72520c5c5d0ab22c9e4f2f7d6413528d09a25983 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1574/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@b7fdde70d963266a1700a38e7c6d7d6b151ce4c0 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 10d6609a0a..399af0f58f 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index df1b0452b6..d2f877a940 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -10,8 +10,8 @@ import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From 0b9e5c49713066479418ba48f37171fa209e56db Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1575/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@e3b7efad7ef666e9b56b5ceca8f8766e2c51be68 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index aabece6b3e..58c4c14aec 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -7,7 +7,7 @@ import ( blocks "github.com/ipfs/go-ipfs/blocks" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From 9c0f3bcde5e0c8920656acad62e46155a330a2af Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1576/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@3a5a6fad0b1aa609d1901e0f7f27d9aa7a4edf7f --- chunker/rabin_test.go | 2 +- chunker/splitting_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 5603621b2c..907b809996 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" "github.com/ipfs/go-ipfs/blocks" - "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" "io" "testing" ) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index bbe1e499fa..918a466593 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util" + u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From 5bd6e88a5f3d017ae1d1bb3e8f061b23d2c5e51c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1577/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@c2f362d688362c5440b2dafbf136421680f28b2e --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 93c22ef1ab..0c4fab85b6 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -2,7 +2,7 @@ package dshelp import ( ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" ) From dcecd3345b8ceed091ee2e80857695e170ea5bf2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Mar 2017 23:51:18 -0700 Subject: [PATCH 1578/3147] bubble up updates from go-multihash changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/interface-go-ipfs-core@be73d10538ec977bdb62976f52ac926f5eb83232 --- coreiface/interface.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index d72fc8a3b0..a7762c8c2f 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - cid "gx/ipfs/QmV5gPoRsjN1Gid3LMdNZTyfCtP2DsvqEbMAmz82RmmiGk/go-cid" - ipld "gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + ipld "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) type Path interface { @@ -17,7 +17,7 @@ type Path interface { } // TODO: should we really copy these? -// if we didn't, godoc would generate nice links straight to go-ipld-node +// if we didn't, godoc would generate nice links straight to go-ipld-format type Node ipld.Node type Link ipld.Link From 7bd8b43d47ab9dcb2e0acba39cd8e07c8c179cda Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 20 Apr 2017 19:09:38 +0200 Subject: [PATCH 1579/3147] deps: Update go-is-domain to contain new gTLD It should resolve issues with newer gTLDs being not selected License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@90b1c01d20e087f8f2354fc21a1184c461ad4f01 --- namesys/dns.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index 93a5501da4..feb97e04a6 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,7 +6,7 @@ import ( "strings" context "context" - isd "gx/ipfs/QmaeHSCBd9XjXxmgHEiKkHtLcMCb2eZsPLKT7bHgBfBkqw/go-is-domain" + isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" path "github.com/ipfs/go-ipfs/path" ) From e8cd337a96c3fd724f80118d53239e735129ddbb Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 24 Apr 2017 14:57:57 +0200 Subject: [PATCH 1580/3147] mics: cleanup imports in touched files License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@94b011a00a7d051bd044c0c24c5b7269d1b14a8c --- namesys/dns.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index feb97e04a6..3cb2cd6e2a 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -1,14 +1,14 @@ package namesys import ( + "context" "errors" "net" "strings" - context "context" - isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "github.com/ipfs/go-ipfs/path" + + isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) type LookupTXTFunc func(name string) (txt []string, err error) From 1030811c0bc35cb9931b15bc4c7b14590b77ba66 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 2 Mar 2017 21:35:04 -0500 Subject: [PATCH 1581/3147] adder: add support for using CidV1 License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@123b0fd65389bbbd92e04af01bdab9b4a49e4c2b --- unixfs/io/dirbuilder.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index c0587480d3..a8663763cb 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,6 +8,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) @@ -79,6 +80,17 @@ func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, erro } } +// SetPrefix sets the prefix of the root node +func (d *Directory) SetPrefix(prefix cid.Prefix) { + if d.dirnode != nil { + d.dirnode.SetPrefix(prefix) + } + // FIXME: Should we do this? -- kevina + //if d.shard != nil { + // d.shard.SetPrefix(prefix) + //} +} + // AddChild adds a (name, key)-pair to the root node. func (d *Directory) AddChild(ctx context.Context, name string, nd node.Node) error { if d.shard == nil { From 7f20a557542d366cebb1877d458ef16f60153ff8 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 2 Mar 2017 21:35:04 -0500 Subject: [PATCH 1582/3147] adder: add support for using CidV1 License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@d054ee61c95a4d261b3dc2ac9d226017e88c700e --- mfs/dir.go | 5 +++++ mfs/ops.go | 2 ++ mfs/system.go | 3 +++ 3 files changed, 10 insertions(+) diff --git a/mfs/dir.go b/mfs/dir.go index a0a9205b6f..11280bc176 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,6 +15,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) @@ -57,6 +58,10 @@ func NewDirectory(ctx context.Context, name string, node node.Node, parent child }, nil } +func (d *Directory) SetPrefix(prefix cid.Prefix) { + d.dirbuilder.SetPrefix(prefix) +} + // closeChild updates the child by the given name to the dag node 'nd' // and changes its own dag node func (d *Directory) closeChild(name string, nd node.Node, sync bool) error { diff --git a/mfs/ops.go b/mfs/ops.go index 694a001b09..f84540a6a7 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -134,6 +134,7 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { if err != nil { return err } + mkd.SetPrefix(r.Prefix) fsn = mkd } else if err != nil { return err @@ -152,6 +153,7 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { return err } } + final.SetPrefix(r.Prefix) if flush { err := final.Flush() diff --git a/mfs/system.go b/mfs/system.go index 8bc6893c81..a28a7fb10c 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -61,6 +61,9 @@ type Root struct { dserv dag.DAGService Type string + + // Prefix to use for any children created + Prefix cid.Prefix } type PubFunc func(context.Context, *cid.Cid) error From 113478c26c042d40548b0128897b537141c188fe Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 24 Mar 2017 16:41:50 -0400 Subject: [PATCH 1583/3147] merkeldag: change SetPrefix param to a pointer and reset the prefix on nil License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@c1e9ccd624ebfe172459cf7c5752d37bb5b9ff50 --- unixfs/io/dirbuilder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index a8663763cb..a5dce7f48d 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -81,7 +81,7 @@ func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, erro } // SetPrefix sets the prefix of the root node -func (d *Directory) SetPrefix(prefix cid.Prefix) { +func (d *Directory) SetPrefix(prefix *cid.Prefix) { if d.dirnode != nil { d.dirnode.SetPrefix(prefix) } From e56a34700f02cc7bc2ba04400beed71b06e0d480 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 24 Mar 2017 16:41:50 -0400 Subject: [PATCH 1584/3147] merkeldag: change SetPrefix param to a pointer and reset the prefix on nil License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@1ecae41d13ce9628e29ee898a8d77baadf2446ea --- mfs/dir.go | 2 +- mfs/system.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 11280bc176..102ee15cb0 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -58,7 +58,7 @@ func NewDirectory(ctx context.Context, name string, node node.Node, parent child }, nil } -func (d *Directory) SetPrefix(prefix cid.Prefix) { +func (d *Directory) SetPrefix(prefix *cid.Prefix) { d.dirbuilder.SetPrefix(prefix) } diff --git a/mfs/system.go b/mfs/system.go index a28a7fb10c..4ed84d83b2 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -63,7 +63,7 @@ type Root struct { Type string // Prefix to use for any children created - Prefix cid.Prefix + Prefix *cid.Prefix } type PubFunc func(context.Context, *cid.Cid) error From fb0aded8cb0267ffeda9e8cf4bcb0596b0f94100 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 31 Mar 2017 01:00:50 -0400 Subject: [PATCH 1585/3147] hamt: support using CIDv1 by allowing the prefix to be set License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@957da2c0573e73d81fb1a185c472a3a210fc888c --- unixfs/hamt/hamt.go | 7 +++++++ unixfs/io/dirbuilder.go | 7 +++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 4c3f4f913c..17aa017335 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,6 +31,7 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" + cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" @@ -50,6 +51,7 @@ type HamtShard struct { tableSize int tableSizeLg2 int + prefix *cid.Prefix hashFunc uint64 prefixPadStr string @@ -123,9 +125,14 @@ func NewHamtFromDag(dserv dag.DAGService, nd node.Node) (*HamtShard, error) { return ds, nil } +func (ds *HamtShard) SetPrefix(prefix *cid.Prefix) { + ds.prefix = prefix +} + // Node serializes the HAMT structure into a merkledag node with unixfs formatting func (ds *HamtShard) Node() (node.Node, error) { out := new(dag.ProtoNode) + out.SetPrefix(ds.prefix) // TODO: optimized 'for each set bit' for i := 0; i < ds.tableSize; i++ { diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index a5dce7f48d..bcf9770f43 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -85,10 +85,9 @@ func (d *Directory) SetPrefix(prefix *cid.Prefix) { if d.dirnode != nil { d.dirnode.SetPrefix(prefix) } - // FIXME: Should we do this? -- kevina - //if d.shard != nil { - // d.shard.SetPrefix(prefix) - //} + if d.shard != nil { + d.shard.SetPrefix(prefix) + } } // AddChild adds a (name, key)-pair to the root node. From 6224668825fdeef1b266c1648845def45c25fbc1 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 25 Apr 2017 23:47:48 -0400 Subject: [PATCH 1586/3147] Documentation License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@e19161f5bb5997477122528a3fcfb285b26f465a --- unixfs/hamt/hamt.go | 1 + 1 file changed, 1 insertion(+) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 17aa017335..ccdffe7e44 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -125,6 +125,7 @@ func NewHamtFromDag(dserv dag.DAGService, nd node.Node) (*HamtShard, error) { return ds, nil } +// SetPrefix sets the CID Prefix func (ds *HamtShard) SetPrefix(prefix *cid.Prefix) { ds.prefix = prefix } From cd456954760ea63431d2c4a7692d6edb50878cee Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 25 Apr 2017 23:47:48 -0400 Subject: [PATCH 1587/3147] Documentation License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@58dbbadffe1cac2f0729213d9a0982828cb34dd1 --- mfs/dir.go | 1 + 1 file changed, 1 insertion(+) diff --git a/mfs/dir.go b/mfs/dir.go index 102ee15cb0..60cae39c77 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -58,6 +58,7 @@ func NewDirectory(ctx context.Context, name string, node node.Node, parent child }, nil } +// SetPrefix sets the CID prefix func (d *Directory) SetPrefix(prefix *cid.Prefix) { d.dirbuilder.SetPrefix(prefix) } From 9339a2478a19cd8004dd4674cd27b884aeeb2d5b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 29 Apr 2017 13:01:22 -0700 Subject: [PATCH 1588/3147] Fix gateway handling of sharded directories License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@fb78dc263cd3ca6ea02fbda27e4438916c4851ce --- unixfs/io/dagreader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 48aa913699..9abfe0c9df 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -45,7 +45,7 @@ func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (DagRe } switch pb.GetType() { - case ftpb.Data_Directory: + case ftpb.Data_Directory, ftpb.Data_HAMTShard: // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File, ftpb.Data_Raw: From f79019bdcdff5e75257e15249287b51009221cc5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 30 Apr 2017 13:37:37 -0700 Subject: [PATCH 1589/3147] Fix sharding memory growth, and fix resolver for unixfs paths License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@a01e57d25debd78b135ae0f8f8ff58b49bb84f50 --- unixfs/hamt/hamt.go | 63 +++++++++++++++++++++++++++++------------ unixfs/io/dirbuilder.go | 6 ++-- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index ccdffe7e44..ceda529c9a 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -62,7 +62,7 @@ type HamtShard struct { // child can either be another shard, or a leaf node value type child interface { - Node() (node.Node, error) + Link() (*node.Link, error) Label() string } @@ -144,12 +144,12 @@ func (ds *HamtShard) Node() (node.Node, error) { cindex := ds.indexForBitPos(i) ch := ds.children[cindex] if ch != nil { - cnd, err := ch.Node() + clnk, err := ch.Link() if err != nil { return nil, err } - err = out.AddNodeLinkClean(ds.linkNamePrefix(i)+ch.Label(), cnd) + err = out.AddRawLink(ds.linkNamePrefix(i)+ch.Label(), clnk) if err != nil { return nil, err } @@ -188,10 +188,10 @@ func (ds *HamtShard) Node() (node.Node, error) { type shardValue struct { key string - val node.Node + val *node.Link } -func (sv *shardValue) Node() (node.Node, error) { +func (sv *shardValue) Link() (*node.Link, error) { return sv.val, nil } @@ -214,7 +214,18 @@ func (ds *HamtShard) Label() string { // Set sets 'name' = nd in the HAMT func (ds *HamtShard) Set(ctx context.Context, name string, nd node.Node) error { hv := &hashBits{b: hash([]byte(name))} - return ds.modifyValue(ctx, hv, name, nd) + _, err := ds.dserv.Add(nd) + if err != nil { + return err + } + + lnk, err := node.MakeLink(nd) + if err != nil { + return err + } + lnk.Name = ds.linkNamePrefix(0) + name + + return ds.modifyValue(ctx, hv, name, lnk) } // Remove deletes the named entry if it exists, this operation is idempotent. @@ -226,13 +237,16 @@ func (ds *HamtShard) Remove(ctx context.Context, name string) error { func (ds *HamtShard) Find(ctx context.Context, name string) (node.Node, error) { hv := &hashBits{b: hash([]byte(name))} - var out node.Node + var out *node.Link err := ds.getValue(ctx, hv, name, func(sv *shardValue) error { out = sv.val return nil }) + if err != nil { + return nil, err + } - return out, err + return ds.dserv.Get(ctx, out.Cid) } // getChild returns the i'th child of this shard. If it is cached in the @@ -291,9 +305,10 @@ func (ds *HamtShard) loadChild(ctx context.Context, i int) (child, error) { c = cds } else { + lnk2 := *lnk c = &shardValue{ key: lnk.Name[ds.maxpadlen:], - val: nd, + val: &lnk2, } } @@ -305,16 +320,32 @@ func (ds *HamtShard) setChild(i int, c child) { ds.children[i] = c } -func (ds *HamtShard) insertChild(idx int, key string, val node.Node) error { - if val == nil { +func (ds *HamtShard) Link() (*node.Link, error) { + nd, err := ds.Node() + if err != nil { + return nil, err + } + + _, err = ds.dserv.Add(nd) + if err != nil { + return nil, err + } + + return node.MakeLink(nd) +} + +func (ds *HamtShard) insertChild(idx int, key string, lnk *node.Link) error { + if lnk == nil { return os.ErrNotExist } i := ds.indexForBitPos(idx) ds.bitfield.SetBit(ds.bitfield, idx, 1) + + lnk.Name = ds.linkNamePrefix(idx) + key sv := &shardValue{ key: key, - val: val, + val: lnk, } ds.children = append(ds.children[:i], append([]child{sv}, ds.children[i:]...)...) @@ -370,11 +401,7 @@ func (ds *HamtShard) EnumLinks(ctx context.Context) ([]*node.Link, error) { func (ds *HamtShard) ForEachLink(ctx context.Context, f func(*node.Link) error) error { return ds.walkTrie(ctx, func(sv *shardValue) error { - lnk, err := node.MakeLink(sv.val) - if err != nil { - return err - } - + lnk := sv.val lnk.Name = sv.key return f(lnk) @@ -414,7 +441,7 @@ func (ds *HamtShard) walkTrie(ctx context.Context, cb func(*shardValue) error) e return nil } -func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, val node.Node) error { +func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, val *node.Link) error { idx := hv.Next(ds.tableSizeLg2) if ds.bitfield.Bit(idx) != 1 { diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index bcf9770f43..285992081c 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -48,10 +48,12 @@ func NewDirectory(dserv mdag.DAGService) *Directory { return db } +var ErrNotADir = fmt.Errorf("merkledag node was not a directory or shard") + func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, error) { pbnd, ok := nd.(*mdag.ProtoNode) if !ok { - return nil, mdag.ErrNotProtobuf + return nil, ErrNotADir } pbd, err := format.FromBytes(pbnd.Data()) @@ -76,7 +78,7 @@ func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, erro shard: shard, }, nil default: - return nil, fmt.Errorf("merkledag node was not a directory or shard") + return nil, ErrNotADir } } From e2940720d2d5a0d371f975564a43f329f2655ada Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 30 Apr 2017 13:37:37 -0700 Subject: [PATCH 1590/3147] Fix sharding memory growth, and fix resolver for unixfs paths License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@ced50d306fd9b655d06ed86d5b8e2abaca53c2d7 --- path/resolver.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 4ebde479ff..84a6fe66c3 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -163,7 +163,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri ctx, cancel = context.WithTimeout(ctx, time.Minute) defer cancel() - lnk, rest, err := nd.ResolveLink(names) + lnk, err := s.ResolveOnce(ctx, s.DAG, nd, names[0]) if err == dag.ErrLinkNotFound { return result, ErrNoLink{Name: names[0], Node: nd.Cid()} } else if err != nil { @@ -177,7 +177,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri nd = nextnode result = append(result, nextnode) - names = rest + names = names[1:] } return result, nil } From 33450184a4dc3437cbcaf348a815efab32d4e1e4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 30 Apr 2017 14:01:48 -0700 Subject: [PATCH 1591/3147] fix coreapi unixfs resolving License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@4f4ba29659064a963973b9f1a3467373deb49b04 --- unixfs/hamt/hamt.go | 7 +++++-- unixfs/io/dirbuilder.go | 8 +++++++- unixfs/io/resolve.go | 33 ++++++++++++++++++++++----------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index ceda529c9a..d0b60a9c6f 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -191,6 +191,7 @@ type shardValue struct { val *node.Link } +// Link returns a link to this node func (sv *shardValue) Link() (*node.Link, error) { return sv.val, nil } @@ -234,7 +235,8 @@ func (ds *HamtShard) Remove(ctx context.Context, name string) error { return ds.modifyValue(ctx, hv, name, nil) } -func (ds *HamtShard) Find(ctx context.Context, name string) (node.Node, error) { +// Find searches for a child node by 'name' within this hamt +func (ds *HamtShard) Find(ctx context.Context, name string) (*node.Link, error) { hv := &hashBits{b: hash([]byte(name))} var out *node.Link @@ -246,7 +248,7 @@ func (ds *HamtShard) Find(ctx context.Context, name string) (node.Node, error) { return nil, err } - return ds.dserv.Get(ctx, out.Cid) + return out, nil } // getChild returns the i'th child of this shard. If it is cached in the @@ -320,6 +322,7 @@ func (ds *HamtShard) setChild(i int, c child) { ds.children[i] = c } +// Link returns a merklelink to this shard node func (ds *HamtShard) Link() (*node.Link, error) { nd, err := ds.Node() if err != nil { diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 285992081c..8d85097630 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -48,6 +48,7 @@ func NewDirectory(dserv mdag.DAGService) *Directory { return db } +// ErrNotADir implies that the given node was not a unixfs directory var ErrNotADir = fmt.Errorf("merkledag node was not a directory or shard") func NewDirectoryFromNode(dserv mdag.DAGService, nd node.Node) (*Directory, error) { @@ -167,7 +168,12 @@ func (d *Directory) Find(ctx context.Context, name string) (node.Node, error) { return d.dserv.Get(ctx, lnk.Cid) } - return d.shard.Find(ctx, name) + lnk, err := d.shard.Find(ctx, name) + if err != nil { + return nil, err + } + + return lnk.GetNode(ctx, d.dserv) } func (d *Directory) RemoveChild(ctx context.Context, name string) error { diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 16f360b4ac..f9213b55c3 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -10,37 +10,48 @@ import ( node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) -func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { +// ResolveUnixfsOnce resolves a single hop of a path through a graph in a +// unixfs context. This includes handling traversing sharded directories. +func ResolveUnixfsOnce(ctx context.Context, ds dag.DAGService, nd node.Node, names []string) (*node.Link, []string, error) { switch nd := nd.(type) { case *dag.ProtoNode: upb, err := ft.FromBytes(nd.Data()) if err != nil { // Not a unixfs node, use standard object traversal code - return nd.GetNodeLink(name) + lnk, err := nd.GetNodeLink(names[0]) + if err != nil { + return nil, nil, err + } + + return lnk, names[1:], nil } switch upb.GetType() { case ft.THAMTShard: s, err := hamt.NewHamtFromDag(ds, nd) if err != nil { - return nil, err + return nil, nil, err } - // TODO: optimized routine on HAMT for returning a dag.Link to avoid extra disk hits - out, err := s.Find(ctx, name) + out, err := s.Find(ctx, names[0]) if err != nil { - return nil, err + return nil, nil, err } - return node.MakeLink(out) + return out, names[1:], nil default: - return nd.GetNodeLink(name) + lnk, err := nd.GetNodeLink(names[0]) + if err != nil { + return nil, nil, err + } + + return lnk, names[1:], nil } default: - lnk, _, err := nd.ResolveLink([]string{name}) + lnk, rest, err := nd.ResolveLink(names) if err != nil { - return nil, err + return nil, nil, err } - return lnk, nil + return lnk, rest, nil } } From f02f7c8c5f9f3dea8906adda55a25c098d18c16b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 30 Apr 2017 14:01:48 -0700 Subject: [PATCH 1592/3147] fix coreapi unixfs resolving License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@9f6c93e19d6ff42601bbe439c48077bc6cfdd3ce --- path/resolver.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 84a6fe66c3..22bde65ee1 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -37,7 +37,7 @@ func (e ErrNoLink) Error() string { type Resolver struct { DAG dag.DAGService - ResolveOnce func(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) + ResolveOnce func(ctx context.Context, ds dag.DAGService, nd node.Node, names []string) (*node.Link, []string, error) } func NewBasicResolver(ds dag.DAGService) *Resolver { @@ -121,9 +121,10 @@ func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, erro return nodes[len(nodes)-1], err } -func ResolveSingle(ctx context.Context, ds dag.DAGService, nd node.Node, name string) (*node.Link, error) { - lnk, _, err := nd.ResolveLink([]string{name}) - return lnk, err +// ResolveSingle simply resolves one hop of a path through a graph with no +// extra context (does not opaquely resolve through sharded nodes) +func ResolveSingle(ctx context.Context, ds dag.DAGService, nd node.Node, names []string) (*node.Link, []string, error) { + return nd.ResolveLink(names) } // ResolvePathComponents fetches the nodes for each segment of the given path. @@ -163,7 +164,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri ctx, cancel = context.WithTimeout(ctx, time.Minute) defer cancel() - lnk, err := s.ResolveOnce(ctx, s.DAG, nd, names[0]) + lnk, rest, err := s.ResolveOnce(ctx, s.DAG, nd, names) if err == dag.ErrLinkNotFound { return result, ErrNoLink{Name: names[0], Node: nd.Cid()} } else if err != nil { @@ -177,7 +178,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri nd = nextnode result = append(result, nextnode) - names = names[1:] + names = rest } return result, nil } From 5a49a18f6c3457c72463841918bca19160aa9d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Thu, 4 May 2017 17:29:29 +0900 Subject: [PATCH 1593/3147] Add a Has(name) method to the keystore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-ipfs-keystore@a021dc6492240e19420b1b9b18d591525f59ac18 --- keystore/keystore.go | 9 +++++++++ keystore/keystore_test.go | 8 ++++++++ keystore/memkeystore.go | 5 +++++ keystore/memkeystore_test.go | 9 +++++++++ 4 files changed, 31 insertions(+) diff --git a/keystore/keystore.go b/keystore/keystore.go index b69e3e940b..de0b62dc61 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -11,6 +11,7 @@ import ( ) type Keystore interface { + Has(string) bool Put(string, ci.PrivKey) error Get(string) (ci.PrivKey, error) Delete(string) error @@ -54,6 +55,14 @@ func NewFSKeystore(dir string) (*FSKeystore, error) { return &FSKeystore{dir}, nil } +func (ks *FSKeystore) Has(name string) bool { + kp := filepath.Join(ks.dir, name) + + _, err := os.Stat(kp) + + return err == nil +} + func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { if err := validateName(name); err != nil { return err diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 4840069bca..505d9119d6 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -82,6 +82,14 @@ func TestKeystoreBasics(t *testing.T) { t.Fatal(err) } + if !ks.Has("foo") { + t.Fatal("should know it has a key named foo") + } + + if ks.Has("nonexistingkey") { + t.Fatal("should know it doesn't have a key named nonexistingkey") + } + if err := ks.Delete("bar"); err != nil { t.Fatal(err) } diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index ae45ecf219..0018ade4d3 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -10,6 +10,11 @@ func NewMemKeystore() *MemKeystore { return &MemKeystore{make(map[string]ci.PrivKey)} } +func (mk *MemKeystore) Has(name string) bool { + _, ok := mk.keys[name] + return ok +} + func (mk *MemKeystore) Put(name string, k ci.PrivKey) error { if err := validateName(name); err != nil { return err diff --git a/keystore/memkeystore_test.go b/keystore/memkeystore_test.go index 7f4362795d..913f14b83c 100644 --- a/keystore/memkeystore_test.go +++ b/keystore/memkeystore_test.go @@ -46,6 +46,15 @@ func TestMemKeyStoreBasics(t *testing.T) { if err == nil { t.Fatal("should not be able to overwrite key") } + + if !ks.Has("foo") { + t.Fatal("should know it has a key named foo") + } + + if ks.Has("nonexistingkey") { + t.Fatal("should know it doesn't have a key named nonexistingkey") + } + if err := ks.Delete("bar"); err != nil { t.Fatal(err) } From bec127b3681497b8aeda41b78c6fa46f6570b7c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Mon, 8 May 2017 17:00:00 +0900 Subject: [PATCH 1594/3147] Future-proof keystore.Has by returning an error as well MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-ipfs-keystore@c06823879c5e8984c570ca5abfce88ee3a81d4b2 --- keystore/keystore.go | 14 +++++++++++--- keystore/keystore_test.go | 12 ++++++++++-- keystore/memkeystore.go | 4 ++-- keystore/memkeystore_test.go | 12 ++++++++++-- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index de0b62dc61..e38211480e 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -11,7 +11,7 @@ import ( ) type Keystore interface { - Has(string) bool + Has(string) (bool, error) Put(string, ci.PrivKey) error Get(string) (ci.PrivKey, error) Delete(string) error @@ -55,12 +55,20 @@ func NewFSKeystore(dir string) (*FSKeystore, error) { return &FSKeystore{dir}, nil } -func (ks *FSKeystore) Has(name string) bool { +func (ks *FSKeystore) Has(name string) (bool, error) { kp := filepath.Join(ks.dir, name) _, err := os.Stat(kp) - return err == nil + if os.IsNotExist(err) { + return false, nil + } + + if err != nil { + return false, err + } + + return true, nil } func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 505d9119d6..53c30b0d7d 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -82,13 +82,21 @@ func TestKeystoreBasics(t *testing.T) { t.Fatal(err) } - if !ks.Has("foo") { + exist, err := ks.Has("foo") + if !exist { t.Fatal("should know it has a key named foo") } + if err != nil { + t.Fatal(err) + } - if ks.Has("nonexistingkey") { + exist, err = ks.Has("nonexistingkey") + if exist { t.Fatal("should know it doesn't have a key named nonexistingkey") } + if err != nil { + t.Fatal(err) + } if err := ks.Delete("bar"); err != nil { t.Fatal(err) diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 0018ade4d3..626ad8bc07 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -10,9 +10,9 @@ func NewMemKeystore() *MemKeystore { return &MemKeystore{make(map[string]ci.PrivKey)} } -func (mk *MemKeystore) Has(name string) bool { +func (mk *MemKeystore) Has(name string) (bool, error) { _, ok := mk.keys[name] - return ok + return ok, nil } func (mk *MemKeystore) Put(name string, k ci.PrivKey) error { diff --git a/keystore/memkeystore_test.go b/keystore/memkeystore_test.go index 913f14b83c..62533d54b9 100644 --- a/keystore/memkeystore_test.go +++ b/keystore/memkeystore_test.go @@ -47,13 +47,21 @@ func TestMemKeyStoreBasics(t *testing.T) { t.Fatal("should not be able to overwrite key") } - if !ks.Has("foo") { + exist, err := ks.Has("foo") + if !exist { t.Fatal("should know it has a key named foo") } + if err != nil { + t.Fatal(err) + } - if ks.Has("nonexistingkey") { + exist, err = ks.Has("nonexistingkey") + if exist { t.Fatal("should know it doesn't have a key named nonexistingkey") } + if err != nil { + t.Fatal(err) + } if err := ks.Delete("bar"); err != nil { t.Fatal(err) From fe31ce163b1aa79a3d6d508f7991481550acbf5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 14 May 2017 21:02:01 +0900 Subject: [PATCH 1595/3147] Document exported symbols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-ipfs-keystore@b6968f6a708cf767b2f981b2d2ca32826b68797e --- keystore/keystore.go | 10 ++++++++++ keystore/memkeystore.go | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/keystore/keystore.go b/keystore/keystore.go index e38211480e..8424dbafa5 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -11,10 +11,15 @@ import ( ) type Keystore interface { + // Has return whether or not a key exist in the Keystore Has(string) (bool, error) + // Put store a key in the Keystore Put(string, ci.PrivKey) error + // Get retrieve a key from the Keystore Get(string) (ci.PrivKey, error) + // Delete remove a key from the Keystore Delete(string) error + // List return a list of key identifier List() ([]string, error) } @@ -55,6 +60,7 @@ func NewFSKeystore(dir string) (*FSKeystore, error) { return &FSKeystore{dir}, nil } +// Has return whether or not a key exist in the Keystore func (ks *FSKeystore) Has(name string) (bool, error) { kp := filepath.Join(ks.dir, name) @@ -71,6 +77,7 @@ func (ks *FSKeystore) Has(name string) (bool, error) { return true, nil } +// Put store a key in the Keystore func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { if err := validateName(name); err != nil { return err @@ -104,6 +111,7 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { return nil } +// Get retrieve a key from the Keystore func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { if err := validateName(name); err != nil { return nil, err @@ -122,6 +130,7 @@ func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { return ci.UnmarshalPrivateKey(data) } +// Delete remove a key from the Keystore func (ks *FSKeystore) Delete(name string) error { if err := validateName(name); err != nil { return err @@ -132,6 +141,7 @@ func (ks *FSKeystore) Delete(name string) error { return os.Remove(kp) } +// List return a list of key identifier func (ks *FSKeystore) List() ([]string, error) { dir, err := os.Open(ks.dir) if err != nil { diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 626ad8bc07..068c5e1891 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -10,11 +10,13 @@ func NewMemKeystore() *MemKeystore { return &MemKeystore{make(map[string]ci.PrivKey)} } +// Has return whether or not a key exist in the Keystore func (mk *MemKeystore) Has(name string) (bool, error) { _, ok := mk.keys[name] return ok, nil } +// Put store a key in the Keystore func (mk *MemKeystore) Put(name string, k ci.PrivKey) error { if err := validateName(name); err != nil { return err @@ -29,6 +31,7 @@ func (mk *MemKeystore) Put(name string, k ci.PrivKey) error { return nil } +// Get retrieve a key from the Keystore func (mk *MemKeystore) Get(name string) (ci.PrivKey, error) { if err := validateName(name); err != nil { return nil, err @@ -42,6 +45,7 @@ func (mk *MemKeystore) Get(name string) (ci.PrivKey, error) { return k, nil } +// Delete remove a key from the Keystore func (mk *MemKeystore) Delete(name string) error { if err := validateName(name); err != nil { return err @@ -51,6 +55,7 @@ func (mk *MemKeystore) Delete(name string) error { return nil } +// List return a list of key identifier func (mk *MemKeystore) List() ([]string, error) { out := make([]string, 0, len(mk.keys)) for k, _ := range mk.keys { From e73ce7eb0abca2c71eb4d3aef7b7a24a03827257 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 30 Mar 2017 18:20:36 -0700 Subject: [PATCH 1596/3147] implement ipfs pin update License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@a8df3a22a07b5f6e47fac3b7f74a894632a843ad --- pinning/pinner/pin.go | 27 +++++++++++++++++++++++++++ pinning/pinner/pin_test.go | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 8c742d1c00..8de1780f09 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,6 +10,7 @@ import ( "time" mdag "github.com/ipfs/go-ipfs/merkledag" + dutils "github.com/ipfs/go-ipfs/merkledag/utils" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" @@ -86,6 +87,11 @@ type Pinner interface { Pin(context.Context, node.Node, bool) error Unpin(context.Context, *cid.Cid, bool) error + // Update updates a recursive pin from one cid to another + // this is more efficient than simply pinning the new one and unpinning the + // old one + Update(context.Context, *cid.Cid, *cid.Cid, bool) error + // Check if a set of keys are pinned, more efficient than // calling IsPinned for each key CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) @@ -94,6 +100,7 @@ type Pinner interface { // care! If used improperly, garbage collection may not be // successful. PinWithMode(*cid.Cid, PinMode) + // RemovePinWithMode is for manually editing the pin structure. // Use with care! If used improperly, garbage collection may not // be successful. @@ -447,6 +454,26 @@ func (p *pinner) RecursiveKeys() []*cid.Cid { return p.recursePin.Keys() } +func (p *pinner) Update(ctx context.Context, from, to *cid.Cid, unpin bool) error { + p.lock.Lock() + defer p.lock.Unlock() + + if !p.recursePin.Has(from) { + return fmt.Errorf("'from' cid was not recursively pinned already") + } + + err := dutils.DiffEnumerate(ctx, p.dserv, from, to) + if err != nil { + return err + } + + p.recursePin.Add(to) + if unpin { + p.recursePin.Remove(from) + } + return nil +} + // Flush encodes and writes pinner keysets to the datastore func (p *pinner) Flush() error { p.lock.Lock() diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index cbf89c6012..bb90ea0890 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -1,6 +1,7 @@ package pin import ( + "context" "testing" "time" @@ -9,7 +10,6 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - context "context" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" @@ -367,3 +367,36 @@ func TestPinRecursiveFail(t *testing.T) { t.Fatal(err) } } + +func TestPinUpdate(t *testing.T) { + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + p := NewPinner(dstore, dserv, dserv) + n1, c1 := randNode() + n2, c2 := randNode() + + dserv.Add(n1) + dserv.Add(n2) + + ctx := context.Background() + if err := p.Pin(ctx, n1, true); err != nil { + t.Fatal(err) + } + + if err := p.Update(ctx, c1, c2, true); err != nil { + t.Fatal(err) + } + + assertPinned(t, p, c2, "c2 should be pinned now") + assertUnpinned(t, p, c1, "c1 should no longer be pinned") + + if err := p.Update(ctx, c2, c1, false); err != nil { + t.Fatal(err) + } + + assertPinned(t, p, c2, "c2 should be pinned still") + assertPinned(t, p, c1, "c1 should be pinned now") +} From 1d3d2f1fc46355f9c7a44e27ba129f169afacc07 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 12 May 2017 22:04:12 -0700 Subject: [PATCH 1597/3147] address code review, add comments License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@3abaca0a752208350935b1d16e8968aebfa724b7 --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 8de1780f09..482d070fd5 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -90,7 +90,7 @@ type Pinner interface { // Update updates a recursive pin from one cid to another // this is more efficient than simply pinning the new one and unpinning the // old one - Update(context.Context, *cid.Cid, *cid.Cid, bool) error + Update(ctx context.Context, from, to *cid.Cid, unpin bool) error // Check if a set of keys are pinned, more efficient than // calling IsPinned for each key From 5e4bf09f78d1643461b65bbbee9e7f67c97abc1e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 16 May 2017 19:35:43 -0700 Subject: [PATCH 1598/3147] update to dht code with provide announce option License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@7dbb530a72f71f5d9f581c8a65b8c577fa2c42d3 --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 72055331c4..9d3f1d8f61 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -9,7 +9,7 @@ import ( ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index fe4a03b086..82e95d196f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -19,8 +19,8 @@ import ( record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index fddbc2ea42..9ac7b2968b 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -17,8 +17,8 @@ import ( gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/routing.go b/namesys/routing.go index 88983cedb0..f879053860 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -14,9 +14,9 @@ import ( mh "gx/ipfs/QmVGtdTZdTFaLsaj2RwdVG8jcjNNcp1DE914DKZ2kHmXHw/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" ) var log = logging.Logger("namesys") From ed155421f451bdf779dcf7d5df77ae1b03692052 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 16 May 2017 19:35:43 -0700 Subject: [PATCH 1599/3147] update to dht code with provide announce option License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@4bd7c545f6d235e4d2228406ea029afeca3d6b26 --- routing/mock/centralized_client.go | 7 +++++-- routing/mock/centralized_test.go | 8 ++++---- routing/mock/dht.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- routing/offline/offline_test.go | 2 +- routing/supernode/client.go | 12 +++++++++--- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 12 files changed, 29 insertions(+), 20 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 513a50cb38..2e59fa8d60 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -13,9 +13,9 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" ma "gx/ipfs/QmcyqRMCAXVtYPS4DiBrA7sezL9rRGfW8Ctx7cywL4TXJj/go-multiaddr" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) @@ -104,7 +104,10 @@ func (c *client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <- // Provide returns once the message is on the network. Value is not necessarily // visible yet. -func (c *client) Provide(_ context.Context, key *cid.Cid) error { +func (c *client) Provide(_ context.Context, key *cid.Cid, brd bool) error { + if !brd { + return nil + } info := pstore.PeerInfo{ ID: c.peer.ID(), Addrs: []ma.Multiaddr{c.peer.Address()}, diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index c7c6836d18..1f0850b4c8 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -33,7 +33,7 @@ func TestClientFindProviders(t *testing.T) { client := rs.Client(pi) k := cid.NewCidV0(u.Hash([]byte("hello"))) - err := client.Provide(context.Background(), k) + err := client.Provide(context.Background(), k, true) if err != nil { t.Fatal(err) } @@ -60,7 +60,7 @@ func TestClientOverMax(t *testing.T) { numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { pi := testutil.RandIdentityOrFatal(t) - err := rs.Client(pi).Provide(context.Background(), k) + err := rs.Client(pi).Provide(context.Background(), k, true) if err != nil { t.Fatal(err) } @@ -106,7 +106,7 @@ func TestCanceledContext(t *testing.T) { if err != nil { t.Error(err) } - err = rs.Client(pi).Provide(context.Background(), k) + err = rs.Client(pi).Provide(context.Background(), k, true) if err != nil { t.Error(err) } @@ -151,7 +151,7 @@ func TestValidAfter(t *testing.T) { rs := NewServerWithDelay(conf) - rs.Client(pi).Provide(ctx, key) + rs.Client(pi).Provide(ctx, key, true) var providers []pstore.PeerInfo max := 100 diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 9a084d603f..d5dde33887 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" mocknet "gx/ipfs/QmRai5yZNL67pWCoznW7sBdFnqZrFULuJ5w8KhmRyhdgN4/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 77db71313b..9983ccf822 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 8e0a2a3078..9e9dd90eae 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -8,8 +8,8 @@ import ( pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" p2phost "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) @@ -41,7 +41,7 @@ func (c *nilclient) FindProvidersAsync(_ context.Context, _ *cid.Cid, _ int) <-c return out } -func (c *nilclient) Provide(_ context.Context, _ *cid.Cid) error { +func (c *nilclient) Provide(_ context.Context, _ *cid.Cid, _ bool) error { return nil } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 165af084a4..c1abf70712 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -13,9 +13,9 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) @@ -101,7 +101,7 @@ func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k *cid.Cid, max return out } -func (c *offlineRouting) Provide(_ context.Context, k *cid.Cid) error { +func (c *offlineRouting) Provide(_ context.Context, k *cid.Cid, _ bool) error { return ErrOffline } diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 629206b4e2..a847a2814c 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -67,7 +67,7 @@ func TestOfflineRouterLocal(t *testing.T) { } cid, _ = testutil.RandCidV0() - err = offline.Provide(ctx, cid) + err = offline.Provide(ctx, cid, true) if err != ErrOffline { t.Fatal("OfflineRouting should alert that its offline") } diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 1c2fe866a0..2487ffe22e 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -9,13 +9,13 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmafuecpeZp3k3sHJ5mUARHd4795revuadECQMkmHB8LfW/go-libp2p-routing" "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) @@ -100,7 +100,13 @@ func (c *Client) GetValues(ctx context.Context, k string, _ int) ([]routing.Recv }, nil } -func (c *Client) Provide(ctx context.Context, k *cid.Cid) error { +// Provide adds the given key 'k' to the content routing system. If 'brd' is +// true, it announces that content to the network. For the supernode client, +// setting 'brd' to false makes this call a no-op +func (c *Client) Provide(ctx context.Context, k *cid.Cid, brd bool) error { + if !brd { + return nil + } defer log.EventBegin(ctx, "provide", k).Done() msg := dhtpb.NewMessage(dhtpb.Message_ADD_PROVIDER, k.KeyString(), 0) // FIXME how is connectedness defined for the local node diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 02014cef6a..adff6b4d82 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,7 +2,7 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmVHSBsn8LEeay8m5ERebgUVuhzw838PsyTttCmP6GMJkg/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 8cbffe2b3e..ba9c41aea8 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -5,8 +5,8 @@ import ( "errors" pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmVHSBsn8LEeay8m5ERebgUVuhzw838PsyTttCmP6GMJkg/go-libp2p-net" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" kbucket "gx/ipfs/QmXKSwZVoHCTne4jTLzDtMc2K6paEZ2QaUMQfJ4ogYd28n/go-libp2p-kbucket" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 1110c43207..e104406157 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,8 +9,8 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index a06e29e76e..d95c3684d4 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmQcRLisUbREko56ThfgzdBorMGNfNjgqzvwuPPr1jFw6A/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From ab1d1c5e585cc1654b36a6d7b255b77771730002 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 23 May 2017 17:40:20 -0400 Subject: [PATCH 1600/3147] filestore: add "--file-order" option to "filestore ls" and "verify" License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@fed25f2030fa159f77fd4fb4b999ca0bce8dd56d --- filestore/util.go | 98 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/filestore/util.go b/filestore/util.go index 6dd6cf1c2f..9a13de39a6 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -2,6 +2,7 @@ package filestore import ( "fmt" + "sort" "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" @@ -89,7 +90,10 @@ func List(fs *Filestore, key *cid.Cid) *ListRes { // one by one each block in the Filestore's FileManager. // ListAll does not verify that the references are valid or whether // the raw data is accessible. See VerifyAll(). -func ListAll(fs *Filestore) (func() *ListRes, error) { +func ListAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { + if fileOrder { + return listAllFileOrder(fs, false) + } return listAll(fs, false) } @@ -105,7 +109,10 @@ func Verify(fs *Filestore, key *cid.Cid) *ListRes { // returns one by one each block in the Filestore's FileManager. // VerifyAll checks that the reference is valid and that the block data // can be read. -func VerifyAll(fs *Filestore) (func() *ListRes, error) { +func VerifyAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { + if fileOrder { + return listAllFileOrder(fs, true) + } return listAll(fs, true) } @@ -158,6 +165,93 @@ func next(qr dsq.Results) (*cid.Cid, *pb.DataObj, error) { return c, dobj, nil } +func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { + q := dsq.Query{} + qr, err := fs.fm.ds.Query(q) + if err != nil { + return nil, err + } + + var entries listEntries + + for { + v, ok := qr.NextSync() + if !ok { + break + } + dobj, err := unmarshalDataObj(v.Value) + if err != nil { + entries = append(entries, &listEntry{ + dsKey: v.Key, + err: err, + }) + } else { + entries = append(entries, &listEntry{ + dsKey: v.Key, + filePath: dobj.GetFilePath(), + offset: dobj.GetOffset(), + size: dobj.GetSize_(), + }) + } + } + sort.Sort(entries) + + i := 0 + return func() *ListRes { + if i >= len(entries) { + return nil + } + v := entries[i] + i++ + // attempt to convert the datastore key to a CID, + // store the error but don't use it yet + cid, keyErr := dshelp.DsKeyToCid(ds.RawKey(v.dsKey)) + // first if they listRes already had an error return that error + if v.err != nil { + return mkListRes(cid, nil, v.err) + } + // now reconstruct the DataObj + dobj := pb.DataObj{ + FilePath: &v.filePath, + Offset: &v.offset, + Size_: &v.size, + } + // now if we could not convert the datastore key return that + // error + if keyErr != nil { + return mkListRes(cid, &dobj, keyErr) + } + // finally verify the dataobj if requested + var err error + if verify { + _, err = fs.fm.readDataObj(cid, &dobj) + } + return mkListRes(cid, &dobj, err) + }, nil +} + +type listEntry struct { + filePath string + offset uint64 + dsKey string + size uint64 + err error +} + +type listEntries []*listEntry + +func (l listEntries) Len() int { return len(l) } +func (l listEntries) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l listEntries) Less(i, j int) bool { + if l[i].filePath == l[j].filePath { + if l[i].offset == l[j].offset { + return l[i].dsKey < l[j].dsKey + } + return l[i].offset < l[j].offset + } + return l[i].filePath < l[j].filePath +} + func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { status := StatusOk errorMsg := "" From a4fdc8a17f6bc62fba0d32c978d28ff9350d8b0b Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Tue, 30 May 2017 02:26:05 +0200 Subject: [PATCH 1601/3147] gx: update go-libp2p-peerstore, go-libp2p, go-libp2p-kbucket License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-namesys@82a22e4768f1c8dbc1153b4727a0c737d5b0461b --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 4 ++-- namesys/routing.go | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 9d3f1d8f61..1f662bd824 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,9 +7,9 @@ import ( path "github.com/ipfs/go-ipfs/path" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 82e95d196f..6c64372f06 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,12 +14,12 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 9ac7b2968b..94ad4e8e0d 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,13 +11,13 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 10c7c55a7f..a4810e8ba8 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" - mocknet "gx/ipfs/QmRai5yZNL67pWCoznW7sBdFnqZrFULuJ5w8KhmRyhdgN4/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmQA5mdxru8Bh6dpC9PJfSkumqnmHgJX7knxSgBo5Lpime/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index f879053860..6b94876c61 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,12 +9,12 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" mh "gx/ipfs/QmVGtdTZdTFaLsaj2RwdVG8jcjNNcp1DE914DKZ2kHmXHw/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) From a519f3746c9722964fa51dca97b02286e970cd91 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Tue, 30 May 2017 02:26:05 +0200 Subject: [PATCH 1602/3147] gx: update go-libp2p-peerstore, go-libp2p, go-libp2p-kbucket License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-ipfs-routing@379ef8665d1782ef1d4a042deea3e07c1bb9ec19 --- routing/mock/centralized_client.go | 4 ++-- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 2 +- routing/none/none_client.go | 6 +++--- routing/offline/offline.go | 4 ++-- routing/supernode/client.go | 8 ++++---- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 10 +++++----- routing/supernode/server.go | 4 ++-- routing/supernode/server_test.go | 2 +- 12 files changed, 26 insertions(+), 26 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 2e59fa8d60..3dad5d3204 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,12 +8,12 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ma "gx/ipfs/QmcyqRMCAXVtYPS4DiBrA7sezL9rRGfW8Ctx7cywL4TXJj/go-multiaddr" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 50844f9f7a..4d824e6736 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,9 +8,9 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 1f0850b4c8..69b451ce3f 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,8 +8,8 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index d5dde33887..b9ee9b5baf 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" + mocknet "gx/ipfs/QmQA5mdxru8Bh6dpC9PJfSkumqnmHgJX7knxSgBo5Lpime/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - mocknet "gx/ipfs/QmRai5yZNL67pWCoznW7sBdFnqZrFULuJ5w8KhmRyhdgN4/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht" + dht "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 9983ccf822..4e9f3e8d55 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,8 +10,8 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 9e9dd90eae..35f3dedea5 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" + p2phost "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - p2phost "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index c1abf70712..8c91a1c43e 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,13 +7,13 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 2487ffe22e..47345cd82e 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,15 +8,15 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" + dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" + "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - routing "gx/ipfs/QmXiH3yLocPhjkAmL8R29fKRcEKoVXKCaVDbAS9tdTrVEd/go-libp2p-routing" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index adff6b4d82..d38cc4f439 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,8 +2,8 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" - inet "gx/ipfs/QmVHSBsn8LEeay8m5ERebgUVuhzw838PsyTttCmP6GMJkg/go-libp2p-net" + dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index ba9c41aea8..da81602543 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,14 +4,14 @@ import ( "context" "errors" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" - inet "gx/ipfs/QmVHSBsn8LEeay8m5ERebgUVuhzw838PsyTttCmP6GMJkg/go-libp2p-net" + host "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" - kbucket "gx/ipfs/QmXKSwZVoHCTne4jTLzDtMc2K6paEZ2QaUMQfJ4ogYd28n/go-libp2p-kbucket" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - host "gx/ipfs/QmcyNeWPsoFGxThGpV8JnJdfUNankKhWCTrbrcFRQda4xR/go-libp2p-host" + kbucket "gx/ipfs/QmaQG6fJdzn2532WHoPdVwKqftXr6iCSr5NtWyGi1BHytT/go-libp2p-kbucket" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index e104406157..5d42231d04 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,11 +8,11 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - pstore "gx/ipfs/QmNUVzEjq3XWJ89hegahPvyfJbTXgTaom48pLb7YBD9gHQ/go-libp2p-peerstore" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index d95c3684d4..925dad867e 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmUJKdWyaf2dpuACw7ctu3KNciyzR7S69yGFr2BP6vYUB8/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 22e21c4acb24a7a27488d863789329071edd2f75 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1603/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-unixfs@ee18aaa340af00f6cc37f09dfb979286b94c4823 --- unixfs/io/dagreader_test.go | 10 +++++----- unixfs/io/pbdagreader.go | 13 ++++++------- unixfs/mod/dagmodifier.go | 12 ++++-------- unixfs/mod/dagmodifier_test.go | 33 +++++++++++++++++++++------------ 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index b57426e38e..3ac82fc5fa 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -2,8 +2,8 @@ package io import ( "bytes" + "io" "io/ioutil" - "os" "strings" "testing" @@ -54,7 +54,7 @@ func TestSeekAndRead(t *testing.T) { } for i := 255; i >= 0; i-- { - reader.Seek(int64(i), os.SEEK_SET) + reader.Seek(int64(i), io.SeekStart) if reader.Offset() != int64(i) { t.Fatal("expected offset to be increased by one after read") @@ -100,14 +100,14 @@ func TestRelativeSeek(t *testing.T) { t.Fatalf("expected to read: %d at %d, read %d", i, reader.Offset()-1, out) } if i != 255 { - _, err := reader.Seek(3, os.SEEK_CUR) + _, err := reader.Seek(3, io.SeekCurrent) if err != nil { t.Fatal(err) } } } - _, err = reader.Seek(4, os.SEEK_END) + _, err = reader.Seek(4, io.SeekEnd) if err != nil { t.Fatal(err) } @@ -120,7 +120,7 @@ func TestRelativeSeek(t *testing.T) { if int(out) != 255-i { t.Fatalf("expected to read: %d at %d, read %d", 255-i, reader.Offset()-1, out) } - reader.Seek(-5, os.SEEK_CUR) // seek 4 bytes but we read one byte every time so 5 bytes + reader.Seek(-5, io.SeekCurrent) // seek 4 bytes but we read one byte every time so 5 bytes } } diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index a5a53ffa25..0b75fd916c 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - "os" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" @@ -185,7 +184,7 @@ func (dr *pbDagReader) Offset() int64 { // recreations that need to happen. func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { switch whence { - case os.SEEK_SET: + case io.SeekStart: if offset < 0 { return -1, errors.New("Invalid offset") } @@ -226,7 +225,7 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { } // set proper offset within child readseeker - n, err := dr.buf.Seek(left, os.SEEK_SET) + n, err := dr.buf.Seek(left, io.SeekStart) if err != nil { return -1, err } @@ -238,13 +237,13 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { } dr.offset = offset return offset, nil - case os.SEEK_CUR: + case io.SeekCurrent: // TODO: be smarter here noffset := dr.offset + offset - return dr.Seek(noffset, os.SEEK_SET) - case os.SEEK_END: + return dr.Seek(noffset, io.SeekStart) + case io.SeekEnd: noffset := int64(dr.pbdata.GetFilesize()) - offset - return dr.Seek(noffset, os.SEEK_SET) + return dr.Seek(noffset, io.SeekStart) default: return 0, errors.New("invalid whence") } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index c531caa159..090cdb5930 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -5,7 +5,6 @@ import ( "context" "errors" "io" - "os" chunk "github.com/ipfs/go-ipfs/importer/chunk" help "github.com/ipfs/go-ipfs/importer/helpers" @@ -14,7 +13,6 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" @@ -26,8 +24,6 @@ var ErrUnrecognizedWhence = errors.New("unrecognized whence") // 2MB var writebufferSize = 1 << 21 -var log = logging.Logger("dagio") - // DagModifier is the only struct licensed and able to correctly // perform surgery on a DAG 'file' // Dear god, please rename this to something more pleasant @@ -340,7 +336,7 @@ func (dm *DagModifier) readPrep() error { return err } - i, err := dr.Seek(int64(dm.curWrOff), os.SEEK_SET) + i, err := dr.Seek(int64(dm.curWrOff), io.SeekStart) if err != nil { cancel() return err @@ -397,11 +393,11 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { var newoffset uint64 switch whence { - case os.SEEK_CUR: + case io.SeekCurrent: newoffset = dm.curWrOff + uint64(offset) - case os.SEEK_SET: + case io.SeekStart: newoffset = uint64(offset) - case os.SEEK_END: + case io.SeekEnd: newoffset = uint64(fisize) - uint64(offset) default: return 0, ErrUnrecognizedWhence diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index ecc9be644d..192200dd21 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -2,8 +2,8 @@ package mod import ( "fmt" + "io" "io/ioutil" - "os" "testing" "github.com/ipfs/go-ipfs/blocks/blockstore" @@ -384,7 +384,7 @@ func TestDagTruncate(t *testing.T) { t.Fatal("size was incorrect!") } - _, err = dagmod.Seek(0, os.SEEK_SET) + _, err = dagmod.Seek(0, io.SeekStart) if err != nil { t.Fatal(err) } @@ -450,7 +450,7 @@ func TestSparseWrite(t *testing.T) { t.Fatal("incorrect write amount") } - _, err = dagmod.Seek(0, os.SEEK_SET) + _, err = dagmod.Seek(0, io.SeekStart) if err != nil { t.Fatal(err) } @@ -479,7 +479,7 @@ func TestSeekPastEndWrite(t *testing.T) { buf := make([]byte, 5000) u.NewTimeSeededRand().Read(buf[2500:]) - nseek, err := dagmod.Seek(2500, os.SEEK_SET) + nseek, err := dagmod.Seek(2500, io.SeekStart) if err != nil { t.Fatal(err) } @@ -497,7 +497,7 @@ func TestSeekPastEndWrite(t *testing.T) { t.Fatal("incorrect write amount") } - _, err = dagmod.Seek(0, os.SEEK_SET) + _, err = dagmod.Seek(0, io.SeekStart) if err != nil { t.Fatal(err) } @@ -525,7 +525,7 @@ func TestRelativeSeek(t *testing.T) { for i := 0; i < 64; i++ { dagmod.Write([]byte{byte(i)}) - if _, err := dagmod.Seek(1, os.SEEK_CUR); err != nil { + if _, err := dagmod.Seek(1, io.SeekCurrent); err != nil { t.Fatal(err) } } @@ -576,17 +576,26 @@ func TestEndSeek(t *testing.T) { t.Fatal(err) } - offset, err := dagmod.Seek(0, os.SEEK_CUR) + offset, err := dagmod.Seek(0, io.SeekCurrent) + if err != nil { + t.Fatal(err) + } if offset != 100 { t.Fatal("expected the relative seek 0 to return current location") } - offset, err = dagmod.Seek(0, os.SEEK_SET) + offset, err = dagmod.Seek(0, io.SeekStart) + if err != nil { + t.Fatal(err) + } if offset != 0 { t.Fatal("expected the absolute seek to set offset at 0") } - offset, err = dagmod.Seek(0, os.SEEK_END) + offset, err = dagmod.Seek(0, io.SeekEnd) + if err != nil { + t.Fatal(err) + } if offset != 100 { t.Fatal("expected the end seek to set offset at end") } @@ -612,7 +621,7 @@ func TestReadAndSeek(t *testing.T) { } readBuf := make([]byte, 4) - offset, err := dagmod.Seek(0, os.SEEK_SET) + offset, err := dagmod.Seek(0, io.SeekStart) if offset != 0 { t.Fatal("expected offset to be 0") } @@ -636,7 +645,7 @@ func TestReadAndSeek(t *testing.T) { } // skip 4 - _, err = dagmod.Seek(1, os.SEEK_CUR) + _, err = dagmod.Seek(1, io.SeekCurrent) if err != nil { t.Fatalf("error: %s, offset %d, reader offset %d", err, dagmod.curWrOff, dagmod.read.Offset()) } @@ -676,7 +685,7 @@ func TestCtxRead(t *testing.T) { if err != nil { t.Fatal(err) } - dagmod.Seek(0, os.SEEK_SET) + dagmod.Seek(0, io.SeekStart) readBuf := make([]byte, 4) _, err = dagmod.CtxReadFull(ctx, readBuf) From ebdd4281dd1fcfb3b92fa733defc5a68d00c35d4 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1604/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-namesys@594573bdc1fe063bbe34b77da0b4682ba216f6a0 --- namesys/publisher.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 6c64372f06..4a8570c015 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -192,12 +192,7 @@ func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk // Store associated public key timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) defer cancel() - err = r.PutValue(timectx, k, pkbytes) - if err != nil { - return err - } - - return nil + return r.PutValue(timectx, k, pkbytes) } func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec *pb.IpnsEntry) error { @@ -211,11 +206,7 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+b58(h(pubkey)) - if err := r.PutValue(timectx, ipnskey, data); err != nil { - return err - } - - return nil + return r.PutValue(timectx, ipnskey, data) } func CreateRoutingEntryData(pk ci.PrivKey, val path.Path, seq uint64, eol time.Time) (*pb.IpnsEntry, error) { From bb86068b615a66a2adceb53e5e78f004d4d09262 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1605/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-ipfs-blockstore@6ca4e115221e6d22bd14e2994103cddc8f8d41e7 --- blockstore/arc_cache_test.go | 2 +- blockstore/bloom_cache.go | 2 +- blockstore/bloom_cache_test.go | 7 +++++-- blockstore/caching_test.go | 13 ++++++++----- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 8790423801..e6f35144d0 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -30,7 +30,7 @@ func testArcCached(ctx context.Context, bs Blockstore) (*arccache, error) { func createStores(t *testing.T) (*arccache, Blockstore, *callbackDatastore) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) - arc, err := testArcCached(nil, bs) + arc, err := testArcCached(context.TODO(), bs) if err != nil { t.Fatal(err) } diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 47f5ac018a..8bcf962fe5 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -118,7 +118,7 @@ func (b *bloomcache) hasCached(k *cid.Cid) (has bool, ok bool) { } if b.BloomActive() { blr := b.bloom.HasTS(k.Bytes()) - if blr == false { // not contained in bloom is only conclusive answer bloom gives + if !blr { // not contained in bloom is only conclusive answer bloom gives b.hits.Inc() return false, true } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index f021efd8e7..85046e2705 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -34,6 +34,9 @@ func TestPutManyAddsToBloom(t *testing.T) { defer cancel() cachedbs, err := testBloomCached(ctx, bs) + if err != nil { + t.Fatal(err) + } select { case <-cachedbs.rebuildChan: @@ -49,7 +52,7 @@ func TestPutManyAddsToBloom(t *testing.T) { if err != nil { t.Fatal(err) } - if has == false { + if !has { t.Fatal("added block is reported missing") } @@ -57,7 +60,7 @@ func TestPutManyAddsToBloom(t *testing.T) { if err != nil { t.Fatal(err) } - if has == true { + if has { t.Fatal("not added block is reported to be in blockstore") } } diff --git a/blockstore/caching_test.go b/blockstore/caching_test.go index 3c3c195467..16066ad18c 100644 --- a/blockstore/caching_test.go +++ b/blockstore/caching_test.go @@ -1,26 +1,29 @@ package blockstore -import "testing" +import ( + "context" + "testing" +) func TestCachingOptsLessThanZero(t *testing.T) { opts := DefaultCacheOpts() opts.HasARCCacheSize = -1 - if _, err := CachedBlockstore(nil, nil, opts); err == nil { + if _, err := CachedBlockstore(context.TODO(), nil, opts); err == nil { t.Error("wrong ARC setting was not detected") } opts = DefaultCacheOpts() opts.HasBloomFilterSize = -1 - if _, err := CachedBlockstore(nil, nil, opts); err == nil { + if _, err := CachedBlockstore(context.TODO(), nil, opts); err == nil { t.Error("negative bloom size was not detected") } opts = DefaultCacheOpts() opts.HasBloomFilterHashes = -1 - if _, err := CachedBlockstore(nil, nil, opts); err == nil { + if _, err := CachedBlockstore(context.TODO(), nil, opts); err == nil { t.Error("negative hashes setting was not detected") } } @@ -29,7 +32,7 @@ func TestBloomHashesAtZero(t *testing.T) { opts := DefaultCacheOpts() opts.HasBloomFilterHashes = 0 - if _, err := CachedBlockstore(nil, nil, opts); err == nil { + if _, err := CachedBlockstore(context.TODO(), nil, opts); err == nil { t.Error("zero hashes setting with positive size was not detected") } } From 2d662a6123dbcbf055e65ee81f04a5365f537378 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1606/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-ipfs-routing@e213e17cd09526b06ab1316c8647d87cfb93fdfd --- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 6 +++--- routing/none/none_client.go | 3 --- routing/offline/offline.go | 3 --- routing/offline/offline_test.go | 6 ++++-- routing/supernode/proxy/standard.go | 5 +---- routing/supernode/server.go | 23 +---------------------- 7 files changed, 10 insertions(+), 38 deletions(-) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 4d824e6736..afa250b9ac 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -66,7 +66,7 @@ func (rs *s) Providers(c *cid.Cid) []pstore.PeerInfo { return ret } for _, r := range records { - if time.Now().Sub(r.Created) > rs.delayConf.ValueVisibility.Get() { + if time.Since(r.Created) > rs.delayConf.ValueVisibility.Get() { ret = append(ret, r.Peer) } } diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 69b451ce3f..3c51340d68 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -45,7 +45,7 @@ func TestClientFindProviders(t *testing.T) { providersFromClient := client.FindProvidersAsync(context.Background(), k, max) isInClient := false for pi := range providersFromClient { - if pi.ID == pi.ID { + if pi.ID == pi.ID { // <-- typo? isInClient = true } } @@ -72,7 +72,7 @@ func TestClientOverMax(t *testing.T) { providersFromClient := client.FindProvidersAsync(context.Background(), k, max) i := 0 - for _ = range providersFromClient { + for range providersFromClient { i++ } if i != max { @@ -128,7 +128,7 @@ func TestCanceledContext(t *testing.T) { providers := client.FindProvidersAsync(ctx, k, max) numProvidersReturned := 0 - for _ = range providers { + for range providers { numProvidersReturned++ } t.Log(numProvidersReturned) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 35f3dedea5..66767fdd02 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,15 +7,12 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" p2phost "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) -var log = logging.Logger("mockrouter") - type nilclient struct { } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 8c91a1c43e..2be6779202 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,7 +10,6 @@ import ( routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" @@ -19,8 +18,6 @@ import ( "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) -var log = logging.Logger("offlinerouting") - var ErrOffline = errors.New("routing system in offline mode") func NewOfflineRouter(dstore ds.Datastore, privkey ci.PrivKey) routing.IpfsRouting { diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index a847a2814c..a9564379f8 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -15,12 +15,14 @@ func TestOfflineRouterStorage(t *testing.T) { privkey, _, _ := testutil.RandTestKeyPair(128) offline := NewOfflineRouter(nds, privkey) - err := offline.PutValue(ctx, "key", []byte("testing 1 2 3")) - if err != nil { + if err := offline.PutValue(ctx, "key", []byte("testing 1 2 3")); err != nil { t.Fatal(err) } val, err := offline.GetValue(ctx, "key") + if err != nil { + t.Fatal(err) + } if !bytes.Equal([]byte("testing 1 2 3"), val) { t.Fatal("OfflineRouter does not properly store") } diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index da81602543..eaa9e07867 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -104,10 +104,7 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe } defer s.Close() pbw := ggio.NewDelimitedWriter(s) - if err := pbw.WriteMsg(m); err != nil { - return err - } - return nil + return pbw.WriteMsg(m) } // SendRequest sends the request to each remote sequentially (randomized order), diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 5d42231d04..95e70e0be9 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,7 +10,6 @@ import ( datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" - record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" @@ -140,10 +139,7 @@ func putRoutingRecord(ds datastore.Datastore, k string, value *pb.Record) error } dskey := dshelp.NewKeyFromBinary([]byte(k)) // TODO namespace - if err := ds.Put(dskey, data); err != nil { - return err - } - return nil + return ds.Put(dskey, data) } func putRoutingProviders(ds datastore.Datastore, k string, newRecords []*dhtpb.Message_Peer) error { @@ -204,20 +200,3 @@ func getRoutingProviders(ds datastore.Datastore, k string) ([]*dhtpb.Message_Pee func providerKey(k string) datastore.Key { return datastore.KeyWithNamespaces([]string{"routing", "providers", k}) } - -func verify(ps pstore.Peerstore, r *pb.Record) error { - v := make(record.Validator) - v["pk"] = record.PublicKeyValidator - p := peer.ID(r.GetAuthor()) - pk := ps.PubKey(p) - if pk == nil { - return fmt.Errorf("do not have public key for %s", p) - } - if err := record.CheckRecordSig(r, pk); err != nil { - return err - } - if err := v.VerifyRecord(r); err != nil { - return err - } - return nil -} From 780ae022981af50d7f54437a015f32c17f17712d Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1607/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-filestore@165caf091f0a3f94c24bfb10f017b3c0ec7f31a7 --- filestore/fsrefstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 46cc39b7f4..f1db5b6a8d 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -162,7 +162,7 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { } defer fi.Close() - _, err = fi.Seek(int64(d.GetOffset()), os.SEEK_SET) + _, err = fi.Seek(int64(d.GetOffset()), io.SeekStart) if err != nil { return nil, &CorruptReferenceError{StatusFileError, err} } From 80442fd3d798d59cd7f4ca78f06121780b32ae3f Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1608/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-blockservice@9a395f496dd0226bf36a5602beee727578f4d87b --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 294b541338..66701bc9d2 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -172,7 +172,7 @@ func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, // the returned channel. // NB: No guarantees are made about order. func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { - out := make(chan blocks.Block, 0) + out := make(chan blocks.Block) go func() { defer close(out) var misses []*cid.Cid From a352f9e140a63ab8f024f8ed24971a9427e20b92 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1609/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-ipfs-exchange-offline@ed54fb7ffc251e75951e0ae6a154d2b569ca07a5 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 399af0f58f..a70201c641 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -42,7 +42,7 @@ func (_ *offlineExchange) Close() error { } func (e *offlineExchange) GetBlocks(ctx context.Context, ks []*cid.Cid) (<-chan blocks.Block, error) { - out := make(chan blocks.Block, 0) + out := make(chan blocks.Block) go func() { defer close(out) var misses []*cid.Cid diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index d2f877a940..efdf2c7b18 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -67,7 +67,7 @@ func TestGetBlocks(t *testing.T) { } var count int - for _ = range received { + for range received { count++ } if len(expected) != count { From 76cdcebe8d4754db8764a79d8ae2429aeb52d5ab Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1610/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-ipfs-pinner@4d125eac21b861a1b6e59f2a2911016cc537bd8a --- pinning/pinner/gc/gc.go | 3 --- pinning/pinner/pin.go | 4 +--- pinning/pinner/pin_test.go | 4 ++-- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ff1ca8a351..f92e8eead8 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,13 +9,10 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) -var log = logging.Logger("gc") - // Result represents an incremental output from a garbage collection // run. It contains either an error, or the cid of a removed object. type Result struct { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 482d070fd5..4270884d9d 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -528,9 +528,7 @@ func (p *pinner) InternalPins() []*cid.Cid { p.lock.Lock() defer p.lock.Unlock() var out []*cid.Cid - for _, c := range p.internalPin.Keys() { - out = append(out, c) - } + out = append(out, p.internalPin.Keys()...) return out } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index bb90ea0890..072761f0a4 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -183,8 +183,8 @@ func TestIsPinnedLookup(t *testing.T) { // TODO does pinner need to share datastore with blockservice? p := NewPinner(dstore, dserv, dserv) - aNodes := make([]*mdag.ProtoNode, aBranchLen, aBranchLen) - aKeys := make([]*cid.Cid, aBranchLen, aBranchLen) + aNodes := make([]*mdag.ProtoNode, aBranchLen) + aKeys := make([]*cid.Cid, aBranchLen) for i := 0; i < aBranchLen; i++ { a, _ := randNode() if i >= 1 { From fe07a192c5cc5de6864e32dfe6c5e6944c989def Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1611/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-mfs@3e4258701b259e30e2530eee7fe9cb70bf7d7753 --- mfs/dir.go | 7 +------ mfs/mfs_test.go | 43 +++++++++++-------------------------------- mfs/ops.go | 7 +------ mfs/system.go | 13 ------------- 4 files changed, 13 insertions(+), 57 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 60cae39c77..fdfb49538d 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -326,12 +326,7 @@ func (d *Directory) Unlink(name string) error { delete(d.childDirs, name) delete(d.files, name) - err := d.dirbuilder.RemoveChild(d.ctx, name) - if err != nil { - return err - } - - return nil + return d.dirbuilder.RemoveChild(d.ctx, name) } func (d *Directory) Flush() error { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 11a13b8e0b..fa2e7c53d7 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -396,6 +396,9 @@ func TestMfsFile(t *testing.T) { // assert size is as expected size, err := fi.Size() + if err != nil { + t.Fatal(err) + } if size != int64(fisize) { t.Fatal("size isnt correct") } @@ -419,12 +422,15 @@ func TestMfsFile(t *testing.T) { // make sure size hasnt changed size, err = wfd.Size() + if err != nil { + t.Fatal(err) + } if size != int64(fisize) { t.Fatal("size isnt correct") } // seek back to beginning - ns, err := wfd.Seek(0, os.SEEK_SET) + ns, err := wfd.Seek(0, io.SeekStart) if err != nil { t.Fatal(err) } @@ -561,13 +567,9 @@ func actorMakeFile(d *Directory) error { return err } - err = wfd.Close() - if err != nil { - return err - } - - return nil + return wfd.Close() } + func actorMkdir(d *Directory) error { d, err := randomWalk(d, rand.Intn(7)) if err != nil { @@ -575,31 +577,8 @@ func actorMkdir(d *Directory) error { } _, err = d.Mkdir(randomName()) - if err != nil { - return err - } - - return nil -} - -func actorRemoveFile(d *Directory) error { - d, err := randomWalk(d, rand.Intn(7)) - if err != nil { - return err - } - - ents, err := d.List(context.Background()) - if err != nil { - return err - } - - if len(ents) == 0 { - return nil - } - - re := ents[rand.Intn(len(ents))] - return d.Unlink(re.Name) + return err } func randomFile(d *Directory) (*File, error) { @@ -895,7 +874,7 @@ func readFile(rt *Root, path string, offset int64, buf []byte) error { return err } - _, err = fd.Seek(offset, os.SEEK_SET) + _, err = fd.Seek(offset, io.SeekStart) if err != nil { return err } diff --git a/mfs/ops.go b/mfs/ops.go index f84540a6a7..0d02cbb08d 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -65,12 +65,7 @@ func Mv(r *Root, src, dst string) error { return err } - err = srcDirObj.Unlink(srcFname) - if err != nil { - return err - } - - return nil + return srcDirObj.Unlink(srcFname) } func lookupDir(r *Root, path string) (*Directory, error) { diff --git a/mfs/system.go b/mfs/system.go index 4ed84d83b2..934a326103 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -170,12 +170,6 @@ type Republisher struct { lastpub *cid.Cid } -func (rp *Republisher) getVal() *cid.Cid { - rp.lk.Lock() - defer rp.lk.Unlock() - return rp.val -} - // NewRepublisher creates a new Republisher object to republish the given root // using the given short and long time intervals func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { @@ -197,13 +191,6 @@ func (p *Republisher) setVal(c *cid.Cid) { p.val = c } -func (p *Republisher) pubNow() { - select { - case p.pubnowch <- nil: - default: - } -} - func (p *Republisher) WaitPub() { p.lk.Lock() consistent := p.lastpub == p.val From dc27deafda3c4497e16495aaea1d0019f9352dd8 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 16:56:11 -0400 Subject: [PATCH 1612/3147] apply the megacheck tool to improve code quality License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-ipfs-keystore@e0c64913def8a1d01fea7a7de3aaa06d510d8c17 --- keystore/keystore.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 8424dbafa5..acb8cb3cc8 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -104,11 +104,8 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { defer fi.Close() _, err = fi.Write(b) - if err != nil { - return err - } - return nil + return err } // Get retrieve a key from the Keystore From 3e7e5d1daffeb4879715401d9f1653fb67f6f8ec Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 23:41:26 -0400 Subject: [PATCH 1613/3147] address PR comments; remove commented/dead code License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-unixfs@427d991207ad47b698613c5e01d91afc4cf76531 --- unixfs/hamt/hamt_stress_test.go | 104 -------------------------------- unixfs/hamt/hamt_test.go | 20 +----- unixfs/mod/dagmodifier_test.go | 19 +----- 3 files changed, 4 insertions(+), 139 deletions(-) diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go index 76357b23d0..94bfce8783 100644 --- a/unixfs/hamt/hamt_stress_test.go +++ b/unixfs/hamt/hamt_stress_test.go @@ -1,13 +1,10 @@ package hamt import ( - "bufio" "context" "fmt" "math/rand" "os" - "strconv" - "strings" "testing" "time" @@ -189,104 +186,3 @@ func genOpSet(seed int64, keep, temp []string) []testOp { } } } - -// executes the given op set with a repl to allow easier debugging -func debugExecuteOpSet(ds dag.DAGService, width int, ops []testOp) (*HamtShard, error) { - s, err := NewHamtShard(ds, width) - if err != nil { - return nil, err - } - - e := ft.EmptyDirNode() - ds.Add(e) - ctx := context.TODO() - - run := 0 - - opnames := map[int]string{ - opAdd: "add", - opDel: "del", - } - -mainloop: - for i := 0; i < len(ops); i++ { - o := ops[i] - - fmt.Printf("Op %d: %s %s\n", i, opnames[o.Op], o.Val) - for run == 0 { - cmd := readCommand() - parts := strings.Split(cmd, " ") - switch parts[0] { - case "": - run = 1 - case "find": - _, err := s.Find(ctx, parts[1]) - if err == nil { - fmt.Println("success") - } else { - fmt.Println(err) - } - case "run": - if len(parts) > 1 { - n, err := strconv.Atoi(parts[1]) - if err != nil { - panic(err) - } - - run = n - } else { - run = -1 - } - case "lookop": - for k := 0; k < len(ops); k++ { - if ops[k].Val == parts[1] { - fmt.Printf(" Op %d: %s %s\n", k, opnames[ops[k].Op], parts[1]) - } - } - case "restart": - var err error - s, err = NewHamtShard(ds, width) - if err != nil { - panic(err) - } - i = -1 - continue mainloop - case "print": - nd, err := s.Node() - if err != nil { - panic(err) - } - printDag(ds, nd.(*dag.ProtoNode), 0) - } - } - run-- - - switch o.Op { - case opAdd: - err := s.Set(ctx, o.Val, e) - if err != nil { - return nil, fmt.Errorf("inserting %s: %s", o.Val, err) - } - case opDel: - fmt.Println("deleting: ", o.Val) - err := s.Remove(ctx, o.Val) - if err != nil { - return nil, fmt.Errorf("deleting %s: %s", o.Val, err) - } - case opFind: - _, err := s.Find(ctx, o.Val) - if err != nil { - return nil, fmt.Errorf("finding %s: %s", o.Val, err) - } - } - } - - return s, nil -} - -func readCommand() string { - fmt.Print("> ") - scan := bufio.NewScanner(os.Stdin) - scan.Scan() - return scan.Text() -} diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 9f834a5aef..77997d2fd1 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -6,7 +6,6 @@ import ( "math/rand" "os" "sort" - "strings" "testing" "time" @@ -138,7 +137,7 @@ func TestBasicSet(t *testing.T) { func TestDirBuilding(t *testing.T) { ds := mdtest.Mock() - s, _ := NewHamtShard(ds, 256) + _, _ = NewHamtShard(ds, 256) _, s, err := makeDir(ds, 200) if err != nil { @@ -161,7 +160,7 @@ func TestDirBuilding(t *testing.T) { func TestShardReload(t *testing.T) { ds := mdtest.Mock() - s, _ := NewHamtShard(ds, 256) + _, _ = NewHamtShard(ds, 256) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -494,21 +493,6 @@ func TestSetHamtChild(t *testing.T) { } } -func printDag(ds dag.DAGService, nd *dag.ProtoNode, depth int) { - padding := strings.Repeat(" ", depth) - fmt.Println("{") - for _, l := range nd.Links() { - fmt.Printf("%s%s: %s", padding, l.Name, l.Cid.String()) - ch, err := ds.Get(context.Background(), l.Cid) - if err != nil { - panic(err) - } - - printDag(ds, ch.(*dag.ProtoNode), depth+1) - } - fmt.Println(padding + "}") -} - func printDiff(ds dag.DAGService, a, b *dag.ProtoNode) { diff, err := dagutils.Diff(context.TODO(), ds, a, b) if err != nil { diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 192200dd21..d7b3f32670 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -1,36 +1,21 @@ package mod import ( + "context" "fmt" "io" "io/ioutil" "testing" - "github.com/ipfs/go-ipfs/blocks/blockstore" - bs "github.com/ipfs/go-ipfs/blockservice" - "github.com/ipfs/go-ipfs/exchange/offline" h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" - mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" - context "context" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) -func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore) { - dstore := ds.NewMapDatastore() - tsds := sync.MutexWrap(dstore) - bstore := blockstore.NewBlockstore(tsds) - bserv := bs.New(bstore, offline.Exchange(bstore)) - dserv := mdag.NewDAGService(bserv) - return dserv, bstore -} - func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { newdata := make([]byte, size) r := u.NewTimeSeededRand() @@ -112,7 +97,7 @@ func TestDagModifierBasic(t *testing.T) { beg = uint64(len(b)) length = 3000 t.Log("Testing pure append") - b = testModWrite(t, beg, length, b, dagmod) + _ = testModWrite(t, beg, length, b, dagmod) // Verify reported length node, err := dagmod.GetNode() From 153b52ddaf8e798df2e292f7b829da55d761aa99 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 23:41:26 -0400 Subject: [PATCH 1614/3147] address PR comments; remove commented/dead code License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-namesys@14ef6a6d7d54134090c9f8dd3f3d5944a9fdd7a5 --- namesys/publisher.go | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 4a8570c015..cba463492d 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -160,17 +160,11 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn errs <- PublishPublicKey(ctx, r, namekey, k.GetPublic()) }() - err = waitOnErrChan(ctx, errs) - if err != nil { - return err - } - - err = waitOnErrChan(ctx, errs) - if err != nil { + if err := waitOnErrChan(ctx, errs); err != nil { return err } - return nil + return waitOnErrChan(ctx, errs) } func waitOnErrChan(ctx context.Context, errs chan error) error { @@ -340,12 +334,7 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p return err } - err = pub.Publish(ctx, key, path.FromCid(nodek)) - if err != nil { - return err - } - - return nil + return pub.Publish(ctx, key, path.FromCid(nodek)) } func IpnsKeysForID(id peer.ID) (name, ipns string) { From 2347cc9739d8810848fa9efad7fad8b6aca8f605 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 23:41:26 -0400 Subject: [PATCH 1615/3147] address PR comments; remove commented/dead code License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-ipfs-blockstore@604f49c47351b0266571e260b0ebc1bd6771b274 --- blockstore/blockstore.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index ac4b874050..e1c7dcf354 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -102,10 +102,6 @@ func NewBlockstore(d ds.Batching) Blockstore { type blockstore struct { datastore ds.Batching - lk sync.RWMutex - gcreq int32 - gcreqlk sync.Mutex - rehash bool } @@ -246,9 +242,8 @@ func NewGCLocker() GCLocker { } type gclocker struct { - lk sync.RWMutex - gcreq int32 - gcreqlk sync.Mutex + lk sync.RWMutex + gcreq int32 } // Unlocker represents an object which can Unlock From 20330dc9bd0ee66de362f1733af49c773bb0b413 Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 31 May 2017 23:41:26 -0400 Subject: [PATCH 1616/3147] address PR comments; remove commented/dead code License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-ipfs-routing@908c167f8002d1bd345089a8e6bb062f0387e640 --- routing/offline/offline_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index a9564379f8..f4ccb27290 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -27,7 +27,7 @@ func TestOfflineRouterStorage(t *testing.T) { t.Fatal("OfflineRouter does not properly store") } - val, err = offline.GetValue(ctx, "notHere") + _, err = offline.GetValue(ctx, "notHere") if err == nil { t.Fatal("Router should throw errors for unfound records") } From fc3dd63083553c244feb99f9b830d904d846041c Mon Sep 17 00:00:00 2001 From: zramsay Date: Thu, 1 Jun 2017 13:58:34 -0400 Subject: [PATCH 1617/3147] hamt: reinstate a useful debug function License: MIT Signed-off-by: Zach Ramsay This commit was moved from ipfs/go-unixfs@6b9f909aeda55971691fdb181e4bbf68978199ef --- unixfs/hamt/hamt_stress_test.go | 102 ++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go index 94bfce8783..6044631b9f 100644 --- a/unixfs/hamt/hamt_stress_test.go +++ b/unixfs/hamt/hamt_stress_test.go @@ -186,3 +186,105 @@ func genOpSet(seed int64, keep, temp []string) []testOp { } } } + +// executes the given op set with a repl to allow easier debugging +/*func debugExecuteOpSet(ds dag.DAGService, width int, ops []testOp) (*HamtShard, error) { + + s, err := NewHamtShard(ds, width) + if err != nil { + return nil, err + } + + e := ft.EmptyDirNode() + ds.Add(e) + ctx := context.TODO() + + run := 0 + + opnames := map[int]string{ + opAdd: "add", + opDel: "del", + } + +mainloop: + for i := 0; i < len(ops); i++ { + o := ops[i] + + fmt.Printf("Op %d: %s %s\n", i, opnames[o.Op], o.Val) + for run == 0 { + cmd := readCommand() + parts := strings.Split(cmd, " ") + switch parts[0] { + case "": + run = 1 + case "find": + _, err := s.Find(ctx, parts[1]) + if err == nil { + fmt.Println("success") + } else { + fmt.Println(err) + } + case "run": + if len(parts) > 1 { + n, err := strconv.Atoi(parts[1]) + if err != nil { + panic(err) + } + + run = n + } else { + run = -1 + } + case "lookop": + for k = 0; k < len(ops); k++ { + if ops[k].Val == parts[1] { + fmt.Printf(" Op %d: %s %s\n", k, opnames[ops[k].Op], parts[1]) + } + } + case "restart": + var err error + s, err = NewHamtShard(ds, width) + if err != nil { + panic(err) + } + i = -1 + continue mainloop + case "print": + nd, err := s.Node() + if err != nil { + panic(err) + } + printDag(ds, nd.(*dag.ProtoNode), 0) + } + } + run-- + + switch o.Op { + case opAdd: + err := s.Set(ctx, o.Val, e) + if err != nil { + return nil, fmt.Errorf("inserting %s: %s", o.Val, err) + } + case opDel: + fmt.Println("deleting: ", o.Val) + err := s.Remove(ctx, o.Val) + if err != nil { + return nil, fmt.Errorf("deleting %s: %s", o.Val, err) + } + case opFind: + _, err := s.Find(ctx, o.Val) + if err != nil { + return nil, fmt.Errorf("finding %s: %s", o.Val, err) + } + } + } + + return s, nil +} + +func readCommand() string { + fmt.Print("> ") + scan := bufio.NewScanner(os.Stdin) + scan.Scan() + return scan.Text() +}*/ From 25bc686917f81189cd037ba8ca241ac8d6b718f1 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 7 Jun 2017 14:23:58 -0400 Subject: [PATCH 1618/3147] repub: iterate through all keys in keystore Iterate through all keys in the keystore so keys added with "ipfs key gen" behave the same as the key. Don't maintain a separate repub list as it does not really serve a purpose at this point in time. See #3808. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@95dd586dd4021626841aaa5c71dcc6a5e17c03ed --- namesys/republisher/repub.go | 81 ++++++++++++++++++++----------- namesys/republisher/repub_test.go | 3 +- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 94ad4e8e0d..9fa0907da2 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -6,18 +6,19 @@ import ( "sync" "time" + keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" + ic "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) @@ -31,9 +32,10 @@ var DefaultRebroadcastInterval = time.Hour * 4 const DefaultRecordLifetime = time.Hour * 24 type Republisher struct { - r routing.ValueStore - ds ds.Datastore - ps pstore.Peerstore + r routing.ValueStore + ds ds.Datastore + self ic.PrivKey + ks keystore.Keystore Interval time.Duration @@ -44,23 +46,18 @@ type Republisher struct { entries map[peer.ID]struct{} } -func NewRepublisher(r routing.ValueStore, ds ds.Datastore, ps pstore.Peerstore) *Republisher { +// NewRepublisher creates a new Republisher +func NewRepublisher(r routing.ValueStore, ds ds.Datastore, self ic.PrivKey, ks keystore.Keystore) *Republisher { return &Republisher{ r: r, - ps: ps, ds: ds, - entries: make(map[peer.ID]struct{}), + self: self, + ks: ks, Interval: DefaultRebroadcastInterval, RecordLifetime: DefaultRecordLifetime, } } -func (rp *Republisher) AddName(id peer.ID) { - rp.entrylock.Lock() - defer rp.entrylock.Unlock() - rp.entries[id] = struct{}{} -} - func (rp *Republisher) Run(proc goprocess.Process) { tick := time.NewTicker(rp.Interval) defer tick.Stop() @@ -82,31 +79,61 @@ func (rp *Republisher) republishEntries(p goprocess.Process) error { ctx, cancel := context.WithCancel(gpctx.OnClosingContext(p)) defer cancel() - for id, _ := range rp.entries { - log.Debugf("republishing ipns entry for %s", id) - priv := rp.ps.PrivKey(id) + err := rp.republishEntry(ctx, rp.self) + if err != nil { + return err + } - // Look for it locally only - _, ipnskey := namesys.IpnsKeysForID(id) - p, seq, err := rp.getLastVal(ipnskey) + if rp.ks != nil { + keyNames, err := rp.ks.List() if err != nil { - if err == errNoEntry { - continue - } return err } + for _, name := range keyNames { + priv, err := rp.ks.Get(name) + if err != nil { + return err + } + err = rp.republishEntry(ctx, priv) + if err != nil { + return err + } - // update record with same sequence number - eol := time.Now().Add(rp.RecordLifetime) - err = namesys.PutRecordToRouting(ctx, priv, p, seq, eol, rp.r, id) - if err != nil { - return err } } return nil } +func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) error { + id, err := peer.IDFromPrivateKey(priv) + if err != nil { + return err + } + + log.Debugf("republishing ipns entry for %s", id) + + // Look for it locally only + _, ipnskey := namesys.IpnsKeysForID(id) + p, seq, err := rp.getLastVal(ipnskey) + if err != nil { + if err == errNoEntry { + return nil + } + return err + } + + // update record with same sequence number + eol := time.Now().Add(rp.RecordLifetime) + err = namesys.PutRecordToRouting(ctx, priv, p, seq, eol, rp.r, id) + if err != nil { + println("put record to routing error: " + err.Error()) + return err + } + + return nil +} + func (rp *Republisher) getLastVal(k string) (path.Path, uint64, error) { ival, err := rp.ds.Get(dshelp.NewKeyFromBinary([]byte(k))) if err != nil { diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index a4810e8ba8..d4d7e12824 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -78,10 +78,9 @@ func TestRepublish(t *testing.T) { // The republishers that are contained within the nodes have their timeout set // to 12 hours. Instead of trying to tweak those, we're just going to pretend // they dont exist and make our own. - repub := NewRepublisher(publisher.Routing, publisher.Repo.Datastore(), publisher.Peerstore) + repub := NewRepublisher(publisher.Routing, publisher.Repo.Datastore(), publisher.PrivateKey, publisher.Repo.Keystore()) repub.Interval = time.Second repub.RecordLifetime = time.Second * 5 - repub.AddName(publisher.Identity) proc := goprocess.Go(repub.Run) defer proc.Close() From ed9cd61ad1fb1f175500aa4371fc8ba21c9695bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Thu, 8 Jun 2017 16:20:14 +0900 Subject: [PATCH 1619/3147] Filestore: more verbose error when adding a file from outside of the root MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Michael Muré This commit was moved from ipfs/go-filestore@0f6b7c31ec134e8dcba0cfa4c233d9dad7f1107f --- filestore/fsrefstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index f1db5b6a8d..46b385067a 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -211,7 +211,7 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { var dobj pb.DataObj if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { - return fmt.Errorf("cannot add filestore references outside ipfs root") + return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) } p, err := filepath.Rel(f.root, b.PosInfo.FullPath) From eca827863f0057151835a54ca3714ef04664fb8c Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sat, 10 Jun 2017 01:55:04 -0400 Subject: [PATCH 1620/3147] repub: remove unused field License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@c242b5be2011a2e81a372113ec3c60a6da6be0d1 --- namesys/republisher/repub.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 9fa0907da2..b33328b68a 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -3,7 +3,6 @@ package republisher import ( "context" "errors" - "sync" "time" keystore "github.com/ipfs/go-ipfs/keystore" @@ -41,9 +40,6 @@ type Republisher struct { // how long records that are republished should be valid for RecordLifetime time.Duration - - entrylock sync.Mutex - entries map[peer.ID]struct{} } // NewRepublisher creates a new Republisher From 6cc8281c909228c1da9083439cf63c8ca51698b6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 19 Jun 2017 22:10:37 -0400 Subject: [PATCH 1621/3147] Allow dagmodifier to be created (but not used) with raw nodes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@982e5532052f2f3e4876c0658b1229e147a5de3f --- unixfs/mod/dagmodifier.go | 55 ++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 090cdb5930..9e86d7b60a 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "errors" + "fmt" "io" chunk "github.com/ipfs/go-ipfs/importer/chunk" @@ -29,7 +30,7 @@ var writebufferSize = 1 << 21 // Dear god, please rename this to something more pleasant type DagModifier struct { dagserv mdag.DAGService - curNode *mdag.ProtoNode + curNode node.Node splitter chunk.SplitterGen ctx context.Context @@ -42,14 +43,18 @@ type DagModifier struct { read uio.DagReader } +var ErrNotUnixfs = fmt.Errorf("dagmodifier only supports unixfs nodes (proto or raw)") + func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { - pbn, ok := from.(*mdag.ProtoNode) - if !ok { - return nil, mdag.ErrNotProtobuf + switch from.(type) { + case *mdag.ProtoNode, *mdag.RawNode: + // ok + default: + return nil, ErrNotUnixfs } return &DagModifier{ - curNode: pbn.Copy().(*mdag.ProtoNode), + curNode: from.Copy(), dagserv: serv, splitter: spl, ctx: ctx, @@ -144,8 +149,15 @@ func (dm *DagModifier) Write(b []byte) (int, error) { return n, nil } +var ErrNoRawYet = fmt.Errorf("currently only fully support protonodes in the dagmodifier") + func (dm *DagModifier) Size() (int64, error) { - pbn, err := ft.FromBytes(dm.curNode.Data()) + pbnd, ok := dm.curNode.(*mdag.ProtoNode) + if !ok { + return 0, ErrNoRawYet + } + + pbn, err := ft.FromBytes(pbnd.Data()) if err != nil { return 0, err } @@ -222,7 +234,12 @@ func (dm *DagModifier) Sync() error { // modifyDag writes the data in 'data' over the data in 'node' starting at 'offset' // returns the new key of the passed in node and whether or not all the data in the reader // has been consumed. -func (dm *DagModifier) modifyDag(node *mdag.ProtoNode, offset uint64, data io.Reader) (*cid.Cid, bool, error) { +func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) { + node, ok := n.(*mdag.ProtoNode) + if !ok { + return nil, false, ErrNoRawYet + } + f, err := ft.FromBytes(node.Data()) if err != nil { return nil, false, err @@ -301,13 +318,26 @@ func (dm *DagModifier) modifyDag(node *mdag.ProtoNode, offset uint64, data io.Re } // appendData appends the blocks from the given chan to the end of this dag -func (dm *DagModifier) appendData(node *mdag.ProtoNode, spl chunk.Splitter) (node.Node, error) { +func (dm *DagModifier) appendData(nd node.Node, spl chunk.Splitter) (node.Node, error) { + + var root *mdag.ProtoNode + switch nd := nd.(type) { + case *mdag.ProtoNode: + root = nd + case *mdag.RawNode: + // TODO: be able to append to rawnodes. Probably requires making this + // node a child of a unxifs intermediate node and passing it down + return nil, fmt.Errorf("appending to raw node types not yet supported") + default: + return nil, ErrNotUnixfs + } + dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, } - return trickle.TrickleAppend(dm.ctx, node, dbp.New(spl)) + return trickle.TrickleAppend(dm.ctx, root, dbp.New(spl)) } // Read data from this dag starting at the current offset @@ -452,7 +482,12 @@ func (dm *DagModifier) Truncate(size int64) error { } // dagTruncate truncates the given node to 'size' and returns the modified Node -func dagTruncate(ctx context.Context, nd *mdag.ProtoNode, size uint64, ds mdag.DAGService) (*mdag.ProtoNode, error) { +func dagTruncate(ctx context.Context, n node.Node, size uint64, ds mdag.DAGService) (*mdag.ProtoNode, error) { + nd, ok := n.(*mdag.ProtoNode) + if !ok { + return nil, ErrNoRawYet + } + if len(nd.Links()) == 0 { // TODO: this can likely be done without marshaling and remarshaling pbn, err := ft.FromBytes(nd.Data()) From df2c4ec583fe8e620f920f9a4d46e52df7ef0a56 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 20 Jun 2017 17:05:24 -0400 Subject: [PATCH 1622/3147] Finish basic support for raw nodes in dag modifier. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@ec9e96ffc1bb694a74e84f8d7a678967fdda92f7 --- unixfs/mod/dagmodifier.go | 34 ++++++++++++++++++---------------- unixfs/mod/dagmodifier_test.go | 3 ++- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 9e86d7b60a..83da608b9a 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -152,23 +152,25 @@ func (dm *DagModifier) Write(b []byte) (int, error) { var ErrNoRawYet = fmt.Errorf("currently only fully support protonodes in the dagmodifier") func (dm *DagModifier) Size() (int64, error) { - pbnd, ok := dm.curNode.(*mdag.ProtoNode) - if !ok { - return 0, ErrNoRawYet - } - - pbn, err := ft.FromBytes(pbnd.Data()) - if err != nil { - return 0, err - } - - if dm.wrBuf != nil { - if uint64(dm.wrBuf.Len())+dm.writeStart > pbn.GetFilesize() { + switch nd := dm.curNode.(type) { + case *mdag.ProtoNode: + pbn, err := ft.FromBytes(nd.Data()) + if err != nil { + return 0, err + } + if dm.wrBuf != nil && uint64(dm.wrBuf.Len())+dm.writeStart > pbn.GetFilesize() { return int64(dm.wrBuf.Len()) + int64(dm.writeStart), nil } + return int64(pbn.GetFilesize()), nil + case *mdag.RawNode: + if dm.wrBuf != nil { + return 0, ErrNoRawYet + } + sz, err := nd.Size() + return int64(sz), err + default: + return 0, ErrNotUnixfs } - - return int64(pbn.GetFilesize()), nil } // Sync writes changes to this dag to disk @@ -397,12 +399,12 @@ func (dm *DagModifier) CtxReadFull(ctx context.Context, b []byte) (int, error) { } // GetNode gets the modified DAG Node -func (dm *DagModifier) GetNode() (*mdag.ProtoNode, error) { +func (dm *DagModifier) GetNode() (node.Node, error) { err := dm.Sync() if err != nil { return nil, err } - return dm.curNode.Copy().(*mdag.ProtoNode), nil + return dm.curNode.Copy(), nil } // HasChanges returned whether or not there are unflushed changes to this dag diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index d7b3f32670..b228441941 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -9,6 +9,7 @@ import ( h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" + mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" @@ -105,7 +106,7 @@ func TestDagModifierBasic(t *testing.T) { t.Fatal(err) } - size, err := ft.DataSize(node.Data()) + size, err := ft.DataSize(node.(*mdag.ProtoNode).Data()) if err != nil { t.Fatal(err) } From 1c7c1d05e2414cde2c376bba33f0600a8f74d97a Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 21 Jun 2017 00:49:30 -0400 Subject: [PATCH 1623/3147] dagmodifer: refactor appendData method License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@db7c21c9391738094bd8af0ec9ef87554f7edcae --- unixfs/mod/dagmodifier.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 83da608b9a..f99453c8d5 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -151,6 +151,7 @@ func (dm *DagModifier) Write(b []byte) (int, error) { var ErrNoRawYet = fmt.Errorf("currently only fully support protonodes in the dagmodifier") +// Size returns the Filesize of the node func (dm *DagModifier) Size() (int64, error) { switch nd := dm.curNode.(type) { case *mdag.ProtoNode: @@ -321,25 +322,18 @@ func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*c // appendData appends the blocks from the given chan to the end of this dag func (dm *DagModifier) appendData(nd node.Node, spl chunk.Splitter) (node.Node, error) { - - var root *mdag.ProtoNode switch nd := nd.(type) { case *mdag.ProtoNode: - root = nd + dbp := &help.DagBuilderParams{ + Dagserv: dm.dagserv, + Maxlinks: help.DefaultLinksPerBlock, + } + return trickle.TrickleAppend(dm.ctx, nd, dbp.New(spl)) case *mdag.RawNode: - // TODO: be able to append to rawnodes. Probably requires making this - // node a child of a unxifs intermediate node and passing it down return nil, fmt.Errorf("appending to raw node types not yet supported") default: return nil, ErrNotUnixfs } - - dbp := &help.DagBuilderParams{ - Dagserv: dm.dagserv, - Maxlinks: help.DefaultLinksPerBlock, - } - - return trickle.TrickleAppend(dm.ctx, root, dbp.New(spl)) } // Read data from this dag starting at the current offset From 074085a43852b5b2970aa70a1f55dafaf86963cf Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 15 Jun 2017 21:02:21 -0700 Subject: [PATCH 1624/3147] blocks: move block format to it's own repo We need to reference it from outside of this repo. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-blockstore@649232fda100f48b272b21dca8cb74eea3ef9493 --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 2 +- blockstore/blockstore_test.go | 2 +- blockstore/bloom_cache.go | 2 +- blockstore/bloom_cache_test.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 75c7ee489a..ddc9ace87f 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,7 +3,7 @@ package blockstore import ( "context" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index e6f35144d0..9ee955f0e3 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index e1c7dcf354..4a0daad6da 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -8,7 +8,7 @@ import ( "sync" "sync/atomic" - blocks "github.com/ipfs/go-ipfs/blocks" + blocks "github.com/ipfs/go-block-format" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 93705997ed..bb1525d170 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -6,7 +6,7 @@ import ( "fmt" "testing" - blocks "github.com/ipfs/go-ipfs/blocks" + blocks "github.com/ipfs/go-block-format" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 8bcf962fe5..0f2028c9a9 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,7 +5,7 @@ import ( "sync/atomic" "time" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 85046e2705..51a41a1151 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" context "context" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" From dac90c140b144b01cbae43803d66800f67dcac73 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 15 Jun 2017 21:02:21 -0700 Subject: [PATCH 1625/3147] blocks: move block format to it's own repo We need to reference it from outside of this repo. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@d45c198d8319da53f143e122dc5ac4ccbd6058f8 --- filestore/filestore.go | 2 +- filestore/fsrefstore.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 047d26b518..3472b20597 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -10,7 +10,7 @@ package filestore import ( "context" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 46b385067a..89e50344a5 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -7,7 +7,7 @@ import ( "os" "path/filepath" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" From 473d305c919b13246548bb8e4c2ff49fe3efed03 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1626/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@6e8340a4c6dd2b2bef9cd80768eeecc521203e26 --- namesys/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/routing.go b/namesys/routing.go index 6b94876c61..1f7177a1b9 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -10,12 +10,12 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" mh "gx/ipfs/QmVGtdTZdTFaLsaj2RwdVG8jcjNNcp1DE914DKZ2kHmXHw/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) From d0bca8c9443dd951ed0448cb3c6fe34dd4eb4407 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 15 Jun 2017 21:02:21 -0700 Subject: [PATCH 1627/3147] blocks: move block format to it's own repo We need to reference it from outside of this repo. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@6bd4a5102f4c080f2c248946ecd35a0611847c5a --- blockservice/blockservice.go | 2 +- blockservice/blockservice_test.go | 2 +- blockservice/test/blocks_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 66701bc9d2..14c445f893 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -8,7 +8,7 @@ import ( "errors" "fmt" - blocks "github.com/ipfs/go-ipfs/blocks" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index bd3b0c6658..3085a3444a 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,7 +3,7 @@ package blockservice import ( "testing" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 68f77be7ef..0b66202bce 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-ipfs/blocks" + blocks "github.com/ipfs/go-block-format" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" From 8825244cbbfd8eae8dc318fcb495b74d67efd182 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1628/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@bf3c1e0596f0abcfb28f7ec5f4a1a074ea2a201a --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 3dad5d3204..a047c1daea 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,12 +9,12 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ma "gx/ipfs/QmcyqRMCAXVtYPS4DiBrA7sezL9rRGfW8Ctx7cywL4TXJj/go-multiaddr" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index afa250b9ac..77759d085b 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 3c51340d68..401a571ec1 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,9 +8,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index b9ee9b5baf..51bd211182 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -6,7 +6,7 @@ import ( mocknet "gx/ipfs/QmQA5mdxru8Bh6dpC9PJfSkumqnmHgJX7knxSgBo5Lpime/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - dht "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht" + dht "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 66767fdd02..c803aea6d7 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,9 +7,9 @@ import ( repo "github.com/ipfs/go-ipfs/repo" routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" p2phost "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 2be6779202..7b1392dfbb 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -8,12 +8,12 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 47345cd82e..251489a662 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -9,13 +9,13 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" - dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index d38cc4f439..6fa5a83918 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,8 +2,8 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" + dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index eaa9e07867..04c68c5f6b 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,9 +4,9 @@ import ( "context" "errors" - dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" host "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 95e70e0be9..610daa854f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,7 +9,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 925dad867e..b090d272d0 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmRmroYSdievxnjiuy99C8BzShNstdEWcEF3LQHF7fUbez/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 7a35b04cb8b981bc3ea8912487f4bd80324183a1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 15 Jun 2017 21:02:21 -0700 Subject: [PATCH 1629/3147] blocks: move block format to it's own repo We need to reference it from outside of this repo. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-offline@8712d9bf9b3aa241c78220a468738270b813a619 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index a70201c641..a7507943a4 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -5,7 +5,7 @@ package offline import ( "context" - blocks "github.com/ipfs/go-ipfs/blocks" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index efdf2c7b18..a143183bb2 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - blocks "github.com/ipfs/go-ipfs/blocks" + blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" From 117048cedfc7a660735206ddf6f48bb9110af3d7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 15 Jun 2017 21:02:21 -0700 Subject: [PATCH 1630/3147] blocks: move block format to it's own repo We need to reference it from outside of this repo. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-interface@2185a8d7b5fc67d8b0b01fa36ae832def322fd1f --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 58c4c14aec..becb88c1a9 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,7 +5,7 @@ import ( "context" "io" - blocks "github.com/ipfs/go-ipfs/blocks" + blocks "github.com/ipfs/go-block-format" cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) From f9d4d8e1c26579658b0a73d8f65221428c2667e3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 15 Jun 2017 21:02:21 -0700 Subject: [PATCH 1631/3147] blocks: move block format to it's own repo We need to reference it from outside of this repo. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@d1535004d070a594684c058280e343453e07e5d3 --- chunker/rabin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 907b809996..3605a3dd30 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -3,7 +3,7 @@ package chunk import ( "bytes" "fmt" - "github.com/ipfs/go-ipfs/blocks" + "github.com/ipfs/go-block-format" "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" "io" "testing" From fbcec1faaa48f26c05a3061d20a94f1d0b4c9d16 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1632/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-blockstore@b878e0db7d001573638dc0d6fa02989349e7a910 --- blockstore/arc_cache.go | 4 ++-- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 4 ++-- blockstore/bloom_cache.go | 4 ++-- blockstore/bloom_cache_test.go | 2 +- blockstore/util/remove.go | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index ddc9ace87f..8eb48fc18e 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,12 +3,12 @@ package blockstore import ( "context" - "github.com/ipfs/go-block-format" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 9ee955f0e3..c2aaf93144 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,11 +4,11 @@ import ( "context" "testing" - "github.com/ipfs/go-block-format" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 4a0daad6da..ad799df885 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -8,14 +8,14 @@ import ( "sync" "sync/atomic" - blocks "github.com/ipfs/go-block-format" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index bb1525d170..6003172fd9 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -6,14 +6,14 @@ import ( "fmt" "testing" - blocks "github.com/ipfs/go-block-format" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 0f2028c9a9..cda44785c5 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,10 +5,10 @@ import ( "sync/atomic" "time" - "github.com/ipfs/go-block-format" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 51a41a1151..275244af42 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/ipfs/go-block-format" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" context "context" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 57c6741cac..3d2d0430bf 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -5,8 +5,8 @@ import ( "fmt" "io" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From c6d21725a341f05654bed14d0b9b24e8eca0450c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1633/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@1c60426310df5573a88235818bbcf2319262c87f --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 4 ++-- filestore/util.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 3472b20597..46f9c3fadd 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -10,13 +10,13 @@ package filestore import ( "context" - "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 5569c61b5e..2003827cf3 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -11,8 +11,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 89e50344a5..edfdd93228 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -7,17 +7,17 @@ import ( "os" "path/filepath" - "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 9a13de39a6..8abaead110 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -8,9 +8,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) // Status is used to identify the state of the block data referenced From 27a3e69810f36f2c07f8db637c972c2cc27c1041 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 19 Jun 2017 19:11:32 -0700 Subject: [PATCH 1634/3147] gx import/update libp2p/go-libp2p-routing For some reason, this was referenced but wasn't listed in packages.json. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@b4713a3f06216a87aebdb8bde664111b7f9fc41b --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/routing.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 1f662bd824..7da3720f2b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,9 +7,9 @@ import ( path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index cba463492d..5d24054619 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,13 +14,13 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index b33328b68a..a7c3af44d8 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,6 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ic "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" @@ -19,6 +18,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/routing.go b/namesys/routing.go index 1f7177a1b9..07f2645571 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,7 +9,6 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" @@ -17,6 +16,7 @@ import ( lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" ) var log = logging.Logger("namesys") From d858029dbf63e9d9f2ecfceea51dad7ea0cdc216 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1635/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@edfc03bf080c46552f1cd6abaadc424501884cd3 --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 2 +- blockservice/test/blocks_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 14c445f893..4adb979e16 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -8,12 +8,12 @@ import ( "errors" "fmt" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" + blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 3085a3444a..6650f2f7a7 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,10 +3,10 @@ package blockservice import ( "testing" - "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 0b66202bce..adc89a4f10 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -7,15 +7,15 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-block-format" blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" + blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func newObject(data []byte) blocks.Block { From 88c5aab4dad3889e8515b1fae9418e8b2e938537 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 19 Jun 2017 19:11:32 -0700 Subject: [PATCH 1636/3147] gx import/update libp2p/go-libp2p-routing For some reason, this was referenced but wasn't listed in packages.json. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@38b54c6b5af1379658c11eae4618af6367290178 --- routing/mock/centralized_client.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline.go | 2 +- routing/supernode/client.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index a047c1daea..41cd6e3180 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,7 +8,6 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" @@ -16,6 +15,7 @@ import ( u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" ma "gx/ipfs/QmcyqRMCAXVtYPS4DiBrA7sezL9rRGfW8Ctx7cywL4TXJj/go-multiaddr" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 4e9f3e8d55..448c4fd322 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,8 +10,8 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index c803aea6d7..2eb769dbc8 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" p2phost "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7b1392dfbb..7bebb3923d 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,7 +7,6 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" @@ -15,6 +14,7 @@ import ( pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 251489a662..2aed305f2c 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,7 +8,6 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - routing "gx/ipfs/QmNdaQ8itUU9jEZUwTsG4gHMaPmRfi6FEe89QjQAFbep3M/go-libp2p-routing" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" @@ -17,6 +16,7 @@ import ( pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) From 4153d2165aa83d3b923a53ba77663ecb45ae579a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1637/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@f368840e159d875701d4a3eb1854417a7741e432 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index f92e8eead8..030131bf75 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,8 +9,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) // Result represents an incremental output from a garbage collection diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4270884d9d..d664767393 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,10 +12,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 072761f0a4..d6e4f3b0a8 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,10 +10,10 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 472142b5c2..47301bea0d 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index f31cb890fd..37741bf274 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -10,9 +10,9 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func ignoreCids(_ *cid.Cid) {} From 91653bbff5ae15c6838c1097a33d31c76bcdda4f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1638/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@560403fac54425a1286285d179869cb751449ca9 --- mfs/dir.go | 4 ++-- mfs/file.go | 2 +- mfs/mfs_test.go | 4 ++-- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index fdfb49538d..2b208f76b1 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 02a5b62c89..8d5bafc7bc 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index fa2e7c53d7..2b39b37686 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 0d02cbb08d..3b8d8ffedb 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 832bee0d2a..37df12c104 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 934a326103..832acc344d 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,9 +19,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) var ErrNotExist = errors.New("no such rootfs") From 4d48747261e6d3d16264ed454db2fa54352f20ae Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1639/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-ds-help@91ba2644abaa4818eb188abc3a676ceebdc0e209 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 0c4fab85b6..17f5193684 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,8 +1,8 @@ package dshelp import ( + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" ) From 275547cf15e72755b43cb3b0d8a0f1805cddcaea Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1640/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-offline@97bc28e43eb6550fb3e8b21e39d41949b7455267 --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index a7507943a4..7399e1a31a 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -5,11 +5,11 @@ package offline import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" + blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index a143183bb2..efdbf1b2d7 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -4,14 +4,14 @@ import ( "context" "testing" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" + blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From 1cdb8a4c10049038b4d262607fbcc0dfa081b0ee Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1641/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-interface@f6584cf10a7277016faa9a0819150e94f211bdef --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index becb88c1a9..ea0086ffc2 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,9 @@ import ( "context" "io" - blocks "github.com/ipfs/go-block-format" + blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From 745603197b6b3ac23702e7fab84eb7cb2b565c8c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1642/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@ee13c792b06acd8b87a3c2f4e819769b464909d1 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/test/utils.go | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index c28b2fe680..c2db3779fe 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 5498c463e9..af00093bd0 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,8 +13,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) // Writer is a utility structure that helps to write diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index d0b60a9c6f..ebb37fd9bf 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,9 +31,9 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 9abfe0c9df..db549b381b 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,8 +10,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var ErrIsDir = errors.New("this dag node is a directory") diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 8d85097630..379cde2958 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,9 +8,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index f9213b55c3..b73bd3561e 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index f99453c8d5..832b0a7bce 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,9 +14,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index ada15a0862..72eed5dd17 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,8 +14,8 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From a4b8bb12c172151aaf889734fba353178bfeedd8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1643/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@9fc2f8147b50898e33111348c8cf94040bfabdb4 --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index 419f6c9c91..a44a8d99b4 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 22bde65ee1..84a39a84aa 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index 6e7ad64de3..dae766b784 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" + node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" util "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - node "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From 3ccc38e85a712d99e50b0a6e2e518bbbaf4bc099 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1644/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@6a8b93c1fd8eec7f2724891dec0e76e13a80fac1 --- chunker/rabin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 3605a3dd30..534c5c948a 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -3,8 +3,8 @@ package chunk import ( "bytes" "fmt" - "github.com/ipfs/go-block-format" "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" "io" "testing" ) From 8fd5b213838670d5fed83a6ca39240179ab8cf3f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 18 Jun 2017 13:07:24 -0700 Subject: [PATCH 1645/3147] blocks: gx import go-block-format And updated related dependencies. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@477bd882b4bdd348fd7ef8f35c81f5a11a732199 --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index a7762c8c2f..273d8e25ab 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - cid "gx/ipfs/QmYhQaCYEcaPPjxJX7YcPcVKkQfRy6sJ7B3XmGFk82XYdQ/go-cid" - ipld "gx/ipfs/Qmb3Hm9QDFmfYuET4pu7Kyg8JV78jFa1nvZx5vnCZsK4ck/go-ipld-format" + cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + ipld "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) type Path interface { From e34f7d06977c7a51d162cd6b1a14ed91992302ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1646/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-blockstore@7ef096ce1fc889321b98e6d3a23ffee16a47fc67 --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/bloom_cache_test.go | 6 +++--- blockstore/util/remove.go | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 8eb48fc18e..6ee0d52e71 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -6,8 +6,8 @@ import ( "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" ) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index c2aaf93144..c6d2df3f76 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -7,8 +7,8 @@ import ( "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + syncds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index ad799df885..078a867a42 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -12,9 +12,9 @@ import ( blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" - dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dsns "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/namespace" + dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 6003172fd9..c05e60282b 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -10,9 +10,9 @@ import ( blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" + ds_sync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 275244af42..ea9d690ccc 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -9,9 +9,9 @@ import ( "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" context "context" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" - syncds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" + syncds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" ) func testBloomCached(ctx context.Context, bs Blockstore) (*bloomcache, error) { diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 3d2d0430bf..b5b58469fa 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,7 +6,7 @@ import ( "io" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From 805266eb202ee877058d514db4dacbce4b304899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1647/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-filestore@ef991dc0f92250257f83fbe82352ade8dd9ee9cb --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 6 +++--- filestore/util.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 46f9c3fadd..7867cee0e2 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -15,7 +15,7 @@ import ( "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 2003827cf3..f3a2772462 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -12,7 +12,7 @@ import ( posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index edfdd93228..fb560b2e00 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -14,9 +14,9 @@ import ( "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dsns "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/namespace" - dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dsns "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/namespace" + dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" ) diff --git a/filestore/util.go b/filestore/util.go index 8abaead110..3437b3a29f 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -9,8 +9,8 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" ) // Status is used to identify the state of the block data referenced From 22206301dfff1c3abb612ca3bffed7f048564ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1648/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@8139fe03a030ef55b8eb820a683b9508e3cac0a4 --- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 7da3720f2b..735a18a135 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 7df4ac9264..4c5a3a2f31 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/unixfs" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index 5d24054619..8cf5ea4f04 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -15,7 +15,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index a7c3af44d8..9c573b9177 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,9 +12,9 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ic "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index c7e13e853c..45d7590b99 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,8 +10,8 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) From f75867b1083d6462aefeb6343cee431ed8d1ac0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1649/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-blockservice@084f57e0655ff36e4f2520dc538ca19199ef97a1 --- blockservice/blockservice_test.go | 4 ++-- blockservice/test/blocks_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 6650f2f7a7..123ea9a05a 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -8,8 +8,8 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index adc89a4f10..c361212f06 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -13,8 +13,8 @@ import ( blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) From 400288204942ed8f5715bcb3bbbc0e4422533302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1650/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-routing@78767a6deae5b06d0c12dc02f0c09c2e154a218a --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 ++-- routing/mock/dht.go | 6 +++--- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/offline/offline_test.go | 2 +- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 4 ++-- routing/supernode/server_test.go | 4 ++-- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 41cd6e3180..28a28608d8 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 77759d085b..1ca5ac17f8 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,8 +9,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 51bd211182..8c0519b8bb 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" + dht "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht" mocknet "gx/ipfs/QmQA5mdxru8Bh6dpC9PJfSkumqnmHgJX7knxSgBo5Lpime/go-libp2p/p2p/net/mock" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" - dht "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + sync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 448c4fd322..128ad9fbc1 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,7 +10,7 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7bebb3923d..38b0f4eb83 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -9,7 +9,7 @@ import ( cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index f4ccb27290..0e0bc7d596 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" "testing" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 2aed305f2c..34b6f2bc3c 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,9 +8,9 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 6fa5a83918..0eb0615ad7 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,8 +2,8 @@ package proxy import ( context "context" + dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" - dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 04c68c5f6b..2193a268ca 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,9 +4,9 @@ import ( "context" "errors" + dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" host "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 610daa854f..ffc924a430 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,8 +8,8 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" + datastore "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index b090d272d0..10570d325f 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - datastore "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dhtpb "gx/ipfs/QmUisRCuGWoJM7WtVQDYT2jrNxUtfZMJzvVFTogzdwv7uV/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" + datastore "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From dc004c084aa07931c9910c9b001ef534a744e026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1651/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@632ca03c5f550da90fb5729deab39b0115486833 --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d664767393..2ea2448481 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -13,7 +13,7 @@ import ( dutils "github.com/ipfs/go-ipfs/merkledag/utils" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index d6e4f3b0a8..93c2243537 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -11,8 +11,8 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 37741bf274..5dd9c0083f 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -11,8 +11,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dsq "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/query" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" ) func ignoreCids(_ *cid.Cid) {} From 0c1f9d247ce5b2818c445520d59347116cc227a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1652/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-mfs@011f45e4b1d8a0db75b4695636defed77338d65c --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 2b39b37686..77ac5f682c 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -25,8 +25,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - dssync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) From 007731ca66e5f213dd5b86761075f3799c083dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1653/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-ds-help@6360b841854ff7c6bc83deb2d85fd22f3681b1f1 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 17f5193684..5e92b0603a 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -2,7 +2,7 @@ package dshelp import ( cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" ) From f5d13978fb2528fd6449630a72ba943640f20ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 3 Jul 2017 20:17:03 +0200 Subject: [PATCH 1654/3147] Update go-datastore to 1.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-exchange-offline@6f11f9a22884daca8f38259cbbf88ad8a68c8904 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index efdbf1b2d7..10e6850660 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -9,8 +9,8 @@ import ( blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" - ds_sync "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore/sync" + ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + ds_sync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) From 0969d708ee9fc3ecbb79ffe1669ffda58da3c569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1655/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-blockstore@cb9c119c891dead778a092eed6669a01834f3914 --- blockstore/arc_cache.go | 6 +++--- blockstore/arc_cache_test.go | 8 ++++---- blockstore/blockstore.go | 10 +++++----- blockstore/blockstore_test.go | 10 +++++----- blockstore/bloom_cache.go | 4 ++-- blockstore/bloom_cache_test.go | 8 ++++---- blockstore/util/remove.go | 4 ++-- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 6ee0d52e71..1e9d46464d 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,12 +3,12 @@ package blockstore import ( "context" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index c6d2df3f76..c1868814b3 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,11 +4,11 @@ import ( "context" "testing" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - syncds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + syncds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 078a867a42..96b5c94075 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -9,13 +9,13 @@ import ( "sync/atomic" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dsns "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/namespace" - dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" + dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index c05e60282b..866fd40cd5 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -7,13 +7,13 @@ import ( "testing" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" - ds_sync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index cda44785c5..1467ad31f1 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,10 +5,10 @@ import ( "sync/atomic" "time" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index ea9d690ccc..85ed29dc95 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" context "context" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" - syncds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + syncds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ) func testBloomCached(ctx context.Context, bs Blockstore) (*bloomcache, error) { diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index b5b58469fa..defe9347d7 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -5,8 +5,8 @@ import ( "fmt" "io" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From 45c59a2733efafc1f87a9abc8cb5009be84f8016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1656/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-filestore@7ca8c39c57d3b02c013eb612a8d81413a86c5405 --- filestore/filestore.go | 6 +++--- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 7867cee0e2..c1f2df981d 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,11 +12,11 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index f3a2772462..2bbc43a268 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -11,8 +11,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index fb560b2e00..58d18aed93 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,13 +11,13 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dsns "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/namespace" - dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" + dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 3437b3a29f..6a1f90d175 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -8,9 +8,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // Status is used to identify the state of the block data referenced From d8366833ea30ef9b763feecefc04e5ce8109ba6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1657/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@78a2140357f280f533756cb50ee55bd7c061257a --- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 4 ++-- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 735a18a135..33883eb394 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -8,8 +8,8 @@ import ( path "github.com/ipfs/go-ipfs/path" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 4c5a3a2f31..a3cda90beb 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/unixfs" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index 8cf5ea4f04..31fbbc1daa 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -15,12 +15,12 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 9c573b9177..a8fa74d046 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,13 +12,13 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ic "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 45d7590b99..6eeb958c88 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,8 +10,8 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/namesys/routing.go b/namesys/routing.go index 07f2645571..45eb385579 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" mh "gx/ipfs/QmVGtdTZdTFaLsaj2RwdVG8jcjNNcp1DE914DKZ2kHmXHw/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("namesys") From b4ba8e81352d9409811b92a1e9dd032f2cbef406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1658/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-blockservice@3d6dfaad59752d198e35bc8a62c9b59f6074f287 --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 6 +++--- blockservice/test/blocks_test.go | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 4adb979e16..98afac8426 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,10 +10,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 123ea9a05a..db3b78ecc1 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -6,10 +6,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index c361212f06..45ac829554 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,12 +10,12 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func newObject(data []byte) blocks.Block { From 5f45c72dd2065d67422b862acd49f51423d9956d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1659/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-exchange-interface@e5970566436509ba4f09054ad89a15dce6e705bb --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index ea0086ffc2..fb590d25a7 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,9 @@ import ( "context" "io" - blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From 122b918d64f16370faf891efeeec97aa4e3bf380 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1660/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-routing@240183f18ff810684445d81e6641180cd377bf5a --- routing/mock/centralized_client.go | 6 +++--- routing/mock/centralized_server.go | 6 +++--- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 6 +++--- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 6 +++--- routing/offline/offline_test.go | 2 +- routing/supernode/client.go | 6 +++--- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 4 ++-- routing/supernode/server_test.go | 4 ++-- 13 files changed, 27 insertions(+), 27 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 28a28608d8..7886201b6c 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,14 +8,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ma "gx/ipfs/QmcyqRMCAXVtYPS4DiBrA7sezL9rRGfW8Ctx7cywL4TXJj/go-multiaddr" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 1ca5ac17f8..d65ab3ac1c 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,10 +8,10 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 401a571ec1..5b23862362 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,9 +8,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 8c0519b8bb..83a030ba60 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht" mocknet "gx/ipfs/QmQA5mdxru8Bh6dpC9PJfSkumqnmHgJX7knxSgBo5Lpime/go-libp2p/p2p/net/mock" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - sync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + dht "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 128ad9fbc1..ae46c1ea78 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,8 +10,8 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 2eb769dbc8..cde9dd26ff 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" p2phost "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 38b0f4eb83..f492d73be6 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,14 +7,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" ) diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 0e0bc7d596..aaa44befc0 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" "testing" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 34b6f2bc3c..04936acaf7 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,16 +8,16 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - routing "gx/ipfs/QmaNDbaV1wvPRLxTYepVsXrppXNjQ1NbrnG7ibAgKeyaXD/go-libp2p-routing" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 0eb0615ad7..0452e7b7e6 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 2193a268ca..c214643eea 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,7 +4,6 @@ import ( "context" "errors" - dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" host "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" @@ -13,6 +12,7 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" kbucket "gx/ipfs/QmaQG6fJdzn2532WHoPdVwKqftXr6iCSr5NtWyGi1BHytT/go-libp2p-kbucket" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index ffc924a430..6ed1bfe1d4 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,12 +8,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" - datastore "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 10570d325f..05dfb68f4d 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmNaAVhp2UXfeDTLhHRUxjB69Tpku38ovSmQegcAMoJXbY/go-libp2p-kad-dht/pb" - datastore "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 5cd326ac165fc0f632f284157c8944af600e8189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1661/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@b903fe09510faeb3db9c4731a577626fbdd87bde --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 6 +++--- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 030131bf75..e838046f84 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,8 +9,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // Result represents an incremental output from a garbage collection diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 2ea2448481..47886ba6f3 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,10 +12,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 93c2243537..c0068705b4 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,10 +10,10 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 47301bea0d..833f32cdec 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 5dd9c0083f..50e27a0e1f 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -10,9 +10,9 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dsq "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/query" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func ignoreCids(_ *cid.Cid) {} From dad8f72a614dc9c51cb426d4cd1fe9592533b632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1662/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-mfs@d912c24574f4b07ab8f05b645178642de696c3f8 --- mfs/dir.go | 4 ++-- mfs/file.go | 2 +- mfs/mfs_test.go | 8 ++++---- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 2b208f76b1..c9cacb0055 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 8d5bafc7bc..71ca2ced64 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 77ac5f682c..75f5c00126 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - dssync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 3b8d8ffedb..bb99d18601 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 37df12c104..d96edf07f7 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 832acc344d..88e1f2ff41 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,9 +19,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From 3f8b5380a264ecd561c922f6c6020eb1a88295fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1663/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-unixfs@459773570529e2ba6ad14dedb5b2f4780619eca3 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/test/utils.go | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index c2db3779fe..cf1d74ac94 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index af00093bd0..01d7fd8332 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,7 +13,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index ebb37fd9bf..1a6b3d1f98 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,9 +31,9 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index db549b381b..17cd6b4cac 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 379cde2958..83b49df9de 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,9 +8,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index b73bd3561e..75d88a72bb 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 832b0a7bce..00a3c1c93e 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,9 +14,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 72eed5dd17..cadc8081d1 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,7 +14,7 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) From 9cfe107e4867b816e6a6829b52887b22307536fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1664/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@be59187d9e138960b010e39e6eddf1619cd1e4fd --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index a44a8d99b4..bdb5ba1560 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 84a39a84aa..09703cd761 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index dae766b784..0208610244 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,7 +9,7 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" util "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" ) From d9bbb0d296c37a2b35df667d5854e83abf14eb3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1665/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-chunker@c48cf1250bd65049d35d5b83d69e33f9d83c4f8c --- chunker/rabin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 534c5c948a..45f2b20615 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" "io" "testing" ) From 55a5ab8c4712e614e86258e8ddfd6904e24c34cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1666/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-ds-help@506b965f6ff8dd56918bc54135ab438cedaf0ffc --- datastore/dshelp/key.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 5e92b0603a..b0b2ebe984 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,9 +1,9 @@ package dshelp import ( - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // TODO: put this code into the go-datastore itself From 9faf4c4d2a7c45a8f667ee69b09dda56526dbda5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1667/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-exchange-offline@0b956ae92b8e08c29ff9e2e61b8e9388efb1e240 --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 7399e1a31a..7c33b7af24 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 10e6850660..7055150aef 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - blocks "gx/ipfs/QmbJUay5h1HtzhJb5QQk2t26yCnJksHynvhcqp18utBPqG/go-block-format" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ds "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore" - ds_sync "gx/ipfs/QmSiN66ybp5udnQnvhb6euiWiiQWdGvwMhAWa95cC1DTCV/go-datastore/sync" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From 624057e9d94d8d44cc424dca843027b47fa25ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:18:57 +0200 Subject: [PATCH 1668/3147] Update go-datastore to 1.2.2, go-cid to 0.7.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@e706b34ea178ca535760a511e3950510e6bb1355 --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 273d8e25ab..363c5adacd 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - cid "gx/ipfs/QmNw61A6sJoXMeP37mJRtQZdNhj5e3FdjoTN3v4FyE96Gk/go-cid" - ipld "gx/ipfs/QmUBtPvHKFAX43XMsyxsYpMi3U5VwZ4jYFTo4kFhvAR33G/go-ipld-format" + ipld "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) type Path interface { From c810f26b20efd058b689f7e4efec5f3a4dbe6da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:57:18 +0200 Subject: [PATCH 1669/3147] gx updates: Fix CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-blockstore@15125df8cbab26a02b73633072ad2fae071ecbf3 --- blockstore/blockstore.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 96b5c94075..905fcf029b 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -193,8 +193,6 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true} - // datastore/namespace does *NOT* fix up Query.Prefix - q.Prefix = BlockPrefix.String() res, err := bs.datastore.Query(q) if err != nil { return nil, err From 025f0e16c986bb87e302873d36b792fe3960fb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 4 Jul 2017 20:57:18 +0200 Subject: [PATCH 1670/3147] gx updates: Fix CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-filestore@be1ec53b19946c75ef83a4d133eba65d4b6547f7 --- filestore/fsrefstore.go | 1 - 1 file changed, 1 deletion(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 58d18aed93..63978fbfd3 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -59,7 +59,6 @@ func NewFileManager(ds ds.Batching, root string) *FileManager { // closed. func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { q := dsq.Query{KeysOnly: true} - q.Prefix = FilestorePrefix.String() res, err := f.ds.Query(q) if err != nil { From b1fd507caef9d0dc1a6264dec928a59e28075d9f Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 5 Jul 2017 13:34:49 +0200 Subject: [PATCH 1671/3147] test: fix race in namesys tests Resolves #4018 License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@0cd1de91610917df0611c5d9cf64488069ec6cd0 --- namesys/namesys_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index a3cda90beb..40f3bbe74f 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -12,6 +12,7 @@ import ( ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ) type mockResolver struct { @@ -76,7 +77,7 @@ func TestNamesysResolution(t *testing.T) { } func TestPublishWithCache0(t *testing.T) { - dst := ds.NewMapDatastore() + dst := dssync.MutexWrap(ds.NewMapDatastore()) priv, _, err := ci.GenerateKeyPair(ci.RSA, 1024) if err != nil { t.Fatal(err) From 49ff30badfce48f788fd294c2c6d9376b4eebfa3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 4 May 2017 18:00:15 -0700 Subject: [PATCH 1672/3147] WIP: wire sessions up through into FetchGraph License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@7f34056f5ecbc3656666de41b91e5c4535caa2bb --- blockservice/blockservice.go | 55 ++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 98afac8426..e034b46fb1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,9 +10,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) @@ -31,6 +32,7 @@ type BlockService interface { GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block DeleteBlock(o blocks.Block) error + NewSession(context.Context) *Session Close() error } @@ -77,6 +79,21 @@ func (bs *blockService) Exchange() exchange.Interface { return bs.exchange } +func (bs *blockService) NewSession(ctx context.Context) *Session { + bswap, ok := bs.Exchange().(*bitswap.Bitswap) + if ok { + ses := bswap.NewSession(ctx) + return &Session{ + ses: ses, + bs: bs.blockstore, + } + } + return &Session{ + ses: bs.exchange, + bs: bs.blockstore, + } +} + // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *blockService) AddBlock(o blocks.Block) (*cid.Cid, error) { @@ -141,16 +158,25 @@ func (s *blockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", c) - block, err := s.blockstore.Get(c) + var f exchange.Fetcher + if s.exchange != nil { + f = s.exchange + } + + return getBlock(ctx, c, s.blockstore, f) +} + +func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) (blocks.Block, error) { + block, err := bs.Get(c) if err == nil { return block, nil } - if err == blockstore.ErrNotFound && s.exchange != nil { + if err == blockstore.ErrNotFound && f != nil { // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. log.Debug("Blockservice: Searching bitswap") - blk, err := s.exchange.GetBlock(ctx, c) + blk, err := f.GetBlock(ctx, c) if err != nil { if err == blockstore.ErrNotFound { return nil, ErrNotFound @@ -172,12 +198,16 @@ func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, // the returned channel. // NB: No guarantees are made about order. func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { + return getBlocks(ctx, ks, s.blockstore, s.exchange) +} + +func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) <-chan blocks.Block { out := make(chan blocks.Block) go func() { defer close(out) var misses []*cid.Cid for _, c := range ks { - hit, err := s.blockstore.Get(c) + hit, err := bs.Get(c) if err != nil { misses = append(misses, c) continue @@ -194,7 +224,7 @@ func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan bloc return } - rblocks, err := s.exchange.GetBlocks(ctx, misses) + rblocks, err := f.GetBlocks(ctx, misses) if err != nil { log.Debugf("Error with GetBlocks: %s", err) return @@ -220,3 +250,16 @@ func (s *blockService) Close() error { log.Debug("blockservice is shutting down...") return s.exchange.Close() } + +type Session struct { + bs blockstore.Blockstore + ses exchange.Fetcher +} + +func (s *Session) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { + return getBlock(ctx, c, s.bs, s.ses) +} + +func (s *Session) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { + return getBlocks(ctx, ks, s.bs, s.ses) +} From 7a67e77797493060da873bd499f35a409b0a98bd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 4 May 2017 18:00:15 -0700 Subject: [PATCH 1673/3147] WIP: wire sessions up through into FetchGraph License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@b010499f1267097fe0aeb5dae4289648822e6b24 --- exchange/interface.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index fb590d25a7..5b9135342c 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -13,10 +13,7 @@ import ( // Any type that implements exchange.Interface may be used as an IPFS block // exchange protocol. type Interface interface { // type Exchanger interface - // GetBlock returns the block associated with a given key. - GetBlock(context.Context, *cid.Cid) (blocks.Block, error) - - GetBlocks(context.Context, []*cid.Cid) (<-chan blocks.Block, error) + Fetcher // TODO Should callers be concerned with whether the block was made // available on the network? @@ -26,3 +23,9 @@ type Interface interface { // type Exchanger interface io.Closer } + +type Fetcher interface { + // GetBlock returns the block associated with a given key. + GetBlock(context.Context, *cid.Cid) (blocks.Block, error) + GetBlocks(context.Context, []*cid.Cid) (<-chan blocks.Block, error) +} From 955823088e15561dbd46badd1d1104d64727db85 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 May 2017 21:04:11 -0700 Subject: [PATCH 1674/3147] track broadcasted wantlist entries License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@d27d0fef65dd2ca20a1fbe95b01efa3a699ba572 --- blockservice/blockservice.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index e034b46fb1..c6ecbc386a 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -251,15 +251,18 @@ func (s *blockService) Close() error { return s.exchange.Close() } +// Session is a helper type to provide higher level access to bitswap sessions type Session struct { bs blockstore.Blockstore ses exchange.Fetcher } +// GetBlock gets a block in the context of a request session func (s *Session) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { return getBlock(ctx, c, s.bs, s.ses) } +// GetBlocks gets blocks in the context of a request session func (s *Session) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { return getBlocks(ctx, ks, s.bs, s.ses) } From 82f9dd8ccaffbbecb04fd2a74a269e1a37a1f5ad Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 May 2017 21:04:11 -0700 Subject: [PATCH 1675/3147] track broadcasted wantlist entries License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@84f2f5c22412ddaa834ee9fde01f64285d33a2e4 --- exchange/interface.go | 1 + 1 file changed, 1 insertion(+) diff --git a/exchange/interface.go b/exchange/interface.go index 5b9135342c..ac494ff993 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -24,6 +24,7 @@ type Interface interface { // type Exchanger interface io.Closer } +// Fetcher is an object that can be used to retrieve blocks type Fetcher interface { // GetBlock returns the block associated with a given key. GetBlock(context.Context, *cid.Cid) (blocks.Block, error) From 80ffa9f9387e258b546b7755d727feddb5ef61f7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 5 Jul 2017 12:31:34 -0700 Subject: [PATCH 1676/3147] make NewSession in the blockservice be a function, not a method License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@5b4cb5695f5ce89f01e157dee6b2ac36349c76de --- blockservice/blockservice.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index c6ecbc386a..d746f2fe0b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -32,7 +32,6 @@ type BlockService interface { GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block DeleteBlock(o blocks.Block) error - NewSession(context.Context) *Session Close() error } @@ -79,18 +78,18 @@ func (bs *blockService) Exchange() exchange.Interface { return bs.exchange } -func (bs *blockService) NewSession(ctx context.Context) *Session { - bswap, ok := bs.Exchange().(*bitswap.Bitswap) - if ok { +func NewSession(ctx context.Context, bs BlockService) *Session { + exchange := bs.Exchange() + if bswap, ok := exchange.(*bitswap.Bitswap); ok { ses := bswap.NewSession(ctx) return &Session{ ses: ses, - bs: bs.blockstore, + bs: bs.Blockstore(), } } return &Session{ - ses: bs.exchange, - bs: bs.blockstore, + ses: exchange, + bs: bs.Blockstore(), } } From 9ab90d4dfe97b7b7497a45e75f45ed88bf1e83b8 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 7 Jul 2017 20:54:07 +0200 Subject: [PATCH 1677/3147] bitswap: add few method comments License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@f26d40ed910d5c0bb2313dc57a8882d02d029764 --- blockservice/blockservice.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index d746f2fe0b..1f26036374 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -78,6 +78,8 @@ func (bs *blockService) Exchange() exchange.Interface { return bs.exchange } +// NewSession creates a bitswap session that allows for controlled exchange of +// wantlists to decrease the bandwidth overhead. func NewSession(ctx context.Context, bs BlockService) *Session { exchange := bs.Exchange() if bswap, ok := exchange.(*bitswap.Bitswap); ok { From 13fb00905b6772e5c4f2fed5630cfde29ad0144a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1678/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@dd868eb2135f438efd7ff72b89f450c71b45e2fc --- routing/mock/centralized_client.go | 14 +++++++------- routing/mock/centralized_server.go | 6 +++--- routing/mock/centralized_test.go | 6 +++--- routing/mock/dht.go | 4 ++-- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 10 +++++----- routing/offline/offline.go | 14 +++++++------- routing/supernode/client.go | 16 ++++++++-------- routing/supernode/proxy/loopback.go | 6 +++--- routing/supernode/proxy/standard.go | 14 +++++++------- routing/supernode/server.go | 8 ++++---- routing/supernode/server_test.go | 2 +- 12 files changed, 52 insertions(+), 52 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 7886201b6c..e790a631c0 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -8,16 +8,16 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" - ma "gx/ipfs/QmcyqRMCAXVtYPS4DiBrA7sezL9rRGfW8Ctx7cywL4TXJj/go-multiaddr" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index d65ab3ac1c..4ba17ed19c 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -8,11 +8,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/testutil" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 5b23862362..7ac250481d 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,9 +8,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 83a030ba60..25f9cdc977 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - mocknet "gx/ipfs/QmQA5mdxru8Bh6dpC9PJfSkumqnmHgJX7knxSgBo5Lpime/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - dht "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmapADMpK4e5kFGBxC2aHreaDqKP9vmMng5f91MA14Ces9/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index ae46c1ea78..de70685a4c 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -10,9 +10,9 @@ import ( delay "github.com/ipfs/go-ipfs/thirdparty/delay" "github.com/ipfs/go-ipfs/thirdparty/testutil" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index cde9dd26ff..28edfa5b49 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" - p2phost "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + p2phost "gx/ipfs/QmZy7c24mmkEHpNJndwgsEE3wcVxHd8yB969yTnAJFVw7f/go-libp2p-host" ) type nilclient struct { diff --git a/routing/offline/offline.go b/routing/offline/offline.go index f492d73be6..f2a703110e 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,15 +7,15 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" - pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" - "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" + pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) var ErrOffline = errors.New("routing system in offline mode") diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 04936acaf7..e65187b017 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,16 +8,16 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" - loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" - pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" + dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" - dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" + "gx/ipfs/QmZy7c24mmkEHpNJndwgsEE3wcVxHd8yB969yTnAJFVw7f/go-libp2p-host" + pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 0452e7b7e6..40d15c0a8e 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" - inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" + dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" - dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" + inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index c214643eea..42b76feabd 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,15 +4,15 @@ import ( "context" "errors" - inet "gx/ipfs/QmRscs8KxrSmSv4iuevHv8JfuUzHBMoqiaHzxfDRiksd6e/go-libp2p-net" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - host "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host" - loggables "gx/ipfs/QmVesPmqbPp7xRGyY96tnBwzDtVV1nqv4SCVxo5zCqKyH8/go-libp2p-loggables" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" + dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - kbucket "gx/ipfs/QmaQG6fJdzn2532WHoPdVwKqftXr6iCSr5NtWyGi1BHytT/go-libp2p-kbucket" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" - dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" + host "gx/ipfs/QmZy7c24mmkEHpNJndwgsEE3wcVxHd8yB969yTnAJFVw7f/go-libp2p-host" + inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" + kbucket "gx/ipfs/QmbiCMdwmmhif5axuGSHzYbPFGeKjLAuMY6JrGpVteHFsy/go-libp2p-kbucket" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 6ed1bfe1d4..577f26c7b6 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,12 +8,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - pb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" - dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" + pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 05dfb68f4d..44269717f9 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" + dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmfDWfnZZiwHSD58FE2PveLQhZZhZjbuvo1TU1Zu4P9Hd3/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 5fa37fff366ff36da4d5ef35f3da912735a01ff5 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1679/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@e57e6c2e7df00cb66569d45cdfcfc4e276cb91f4 --- blockstore/arc_cache.go | 4 ++-- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 6 +++--- blockstore/bloom_cache.go | 4 ++-- blockstore/bloom_cache_test.go | 2 +- blockstore/util/remove.go | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 1e9d46464d..e7a7024069 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,12 +3,12 @@ package blockstore import ( "context" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index c1868814b3..b6575a58c5 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,11 +4,11 @@ import ( "context" "testing" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" syncds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 905fcf029b..e8f11aa7c5 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -9,13 +9,13 @@ import ( "sync/atomic" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 866fd40cd5..4382c9111d 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -7,13 +7,13 @@ import ( "testing" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 1467ad31f1..8314fba02b 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,10 +5,10 @@ import ( "sync/atomic" "time" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 85ed29dc95..af318a0aab 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" context "context" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index defe9347d7..1b6d4f33a9 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -5,8 +5,8 @@ import ( "fmt" "io" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From e9cd392ccc198422c5f93e6f1856dc04c32cc309 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1680/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@8a760c6c2dd432d84e362e7d93ed61dbde8c2689 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index e838046f84..fc2a09ed4b 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,8 +9,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) // Result represents an incremental output from a garbage collection diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 47886ba6f3..c73d3dd7ba 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,10 +12,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index c0068705b4..57683eef9f 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,10 +10,10 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" + "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 833f32cdec..74bea03752 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 50e27a0e1f..310780f30a 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -10,9 +10,9 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func ignoreCids(_ *cid.Cid) {} From 96cda700359639edd78d86f9e57bd92b9379ab57 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1681/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@9984eaafe4ceb7d6ba47700d632fbd10ce05260c --- mfs/dir.go | 4 ++-- mfs/file.go | 2 +- mfs/mfs_test.go | 6 +++--- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index c9cacb0055..387becb6cd 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 71ca2ced64..d527eacf29 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 75f5c00126..3be7ed8fce 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index bb99d18601..33f8f9b799 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index d96edf07f7..4a4e53a56a 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -7,7 +7,7 @@ import ( ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" "context" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 88e1f2ff41..086808af5b 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,9 +19,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var ErrNotExist = errors.New("no such rootfs") From 0e8998953c32c1dc85c1cbb0f40cf4a3b8ea64c2 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1682/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@2aa75b733458941152fddc3b78bf78a9a99c383a --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 4 ++-- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 2 +- namesys/publisher.go | 12 ++++++------ namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 10 +++++----- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index f103fc0451..84a6bbe2c4 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,7 +35,7 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) const ( diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 497548d710..e12af16d93 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 33883eb394..e869799141 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,10 +7,10 @@ import ( path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 40f3bbe74f..1507f5510b 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,9 +10,9 @@ import ( offroute "github.com/ipfs/go-ipfs/routing/offline" "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index 31fbbc1daa..c902076491 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,14 +14,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - record "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record" - dhtpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" + dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index a8fa74d046..787636588e 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,15 +11,15 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - ic "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - recpb "gx/ipfs/QmWYCqr6UDqqD1bfRybaAPtbAqcN3TSJpveaBXMwbQ3ePZ/go-libp2p-record/pb" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + recpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index d4d7e12824..cc9eaa76b1 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmQA5mdxru8Bh6dpC9PJfSkumqnmHgJX7knxSgBo5Lpime/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + mocknet "gx/ipfs/QmapADMpK4e5kFGBxC2aHreaDqKP9vmMng5f91MA14Ces9/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 6eeb958c88..48142b2e93 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -12,7 +12,7 @@ import ( ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 45eb385579..faff33690e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" - routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing" + routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - mh "gx/ipfs/QmVGtdTZdTFaLsaj2RwdVG8jcjNNcp1DE914DKZ2kHmXHw/go-multihash" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) var log = logging.Logger("namesys") From 5ddc90819a9bf49be91796a7276fc3f7fc82d263 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1683/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@3da56381a18f50ae6de65e1f399a412af654284c --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 2 +- unixfs/test/utils.go | 4 ++-- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index cf1d74ac94..fc380baf84 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 01d7fd8332..dde968cec8 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,7 +13,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 1a6b3d1f98..b91738a089 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,9 +31,9 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 17cd6b4cac..ae1517362a 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 83b49df9de..b4af5441b0 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,9 +8,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 75d88a72bb..f1cb7f35b7 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 00a3c1c93e..cdf2b4c78a 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,9 +14,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index b228441941..314178dd5e 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -14,7 +14,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" ) func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index cadc8081d1..c70d3f3bd5 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,8 +14,8 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From 6d5df0f0e782142523d63dbcd41c4e785398fc7b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1684/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@b3b1849cd11de49e968a47758dceb082b696305b --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index bdb5ba1560..d56efd1d87 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 09703cd761..ef9bc90c18 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index 0208610244..ba903d01ce 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" - util "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + util "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From fb0c8e08bfabf99cb5542ccc54ff2391f3e8e32c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1685/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-chunker@e37393beb8360df5c4321893f8830393e7650631 --- chunker/rabin_test.go | 4 ++-- chunker/splitting_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 45f2b20615..6f9d6b7ff8 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -3,8 +3,8 @@ package chunk import ( "bytes" "fmt" - "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" "io" "testing" ) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 918a466593..a9d3798e61 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From be73ae01013b733fc84b7cce99cd77a302d088dc Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1686/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@d148605df9905ad2d609f4a79f48d26bd295e943 --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 2 +- blockservice/test/blocks_test.go | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 1f26036374..f876740562 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,8 +13,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index db3b78ecc1..663d9856db 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 45ac829554..96ed5e54d9 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,12 +10,12 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func newObject(data []byte) blocks.Block { From 56bff68eb2505e4139b2cd32f761aca1715d319d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1687/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@31880033aa95fb48a7ac67b3640ba6a5e118413f --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 4 ++-- filestore/util.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index c1f2df981d..d69aa9d23b 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,11 +12,11 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 2bbc43a268..ce2f4b1686 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -11,8 +11,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 63978fbfd3..ad7dc898e7 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,13 +11,13 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 6a1f90d175..3086ccadb2 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -8,9 +8,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // Status is used to identify the state of the block data referenced From e69baac283881dc8397a96d38a9d4f838a8ff161 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1688/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-ds-help@224f344c49dbcbd42e74c06b0a7ae43db6e37833 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index b0b2ebe984..36cc841f3c 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,9 +1,9 @@ package dshelp import ( + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) // TODO: put this code into the go-datastore itself From 3d01a09aa3c751830fbdbf0f5629789a199d859b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1689/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-offline@55faa4c18605fee4d455481d2d2e079f904f4970 --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 7c33b7af24..1c0b1a4245 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 7055150aef..d619475629 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - u "gx/ipfs/QmWbjfz3u6HkAdPh34dgPchGbQjob6LXLhAeCGii2TX69n/go-ipfs-util" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From 00f1dfd698b2fd0e37058284766ecea68d053f3e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1690/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-exchange-interface@5e140152bd585904b6d655de6d4152b610e11220 --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index ac494ff993..1373f0d3c4 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,9 @@ import ( "context" "io" - blocks "gx/ipfs/QmXxGS5QsUxpR3iqL5DjmsYPHR1Yz74siRQ4ChJqWFosMh/go-block-format" + blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From 0997d0c7d5f69975acdf597e7266427e54c223b4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1691/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/interface-go-ipfs-core@ee874380410e6a909c9517ecd58730cb17b4424d --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 363c5adacd..81197bb466 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - ipld "gx/ipfs/QmPAKbSsgEX5B6fpmxa61jXYnoWzZr5sNafd3qgPiSH8Uv/go-ipld-format" - cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid" + cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + ipld "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) type Path interface { From 7b6c96d7fe457deec1ebca55c9c6f10d68e0f54f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 11 Jul 2017 19:17:51 -0700 Subject: [PATCH 1692/3147] update go-multihash and bubble up changes License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-keystore@1050cc226f0a76bab5600b0db8967318cfebd7d6 --- keystore/keystore.go | 2 +- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index acb8cb3cc8..fd9ab94b4a 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) type Keystore interface { diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 53c30b0d7d..cf6281be20 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -7,7 +7,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 068c5e1891..3732a3262b 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto" +import ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" type MemKeystore struct { keys map[string]ci.PrivKey From 85d456df584b2b0514507f51579acffa9b244714 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 27 Jul 2017 00:02:03 -0700 Subject: [PATCH 1693/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@3a7078e71c544a82b58cc94a02b72407f2c0d393 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index cc9eaa76b1..40f3812509 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmapADMpK4e5kFGBxC2aHreaDqKP9vmMng5f91MA14Ces9/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmSatLR9HCrZjPqomt6VdNCoJmHMz8NP34WfpfBznJZ25M/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 4c2443de609e5f7dd72efa86567563f5df6beb0c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 27 Jul 2017 00:02:03 -0700 Subject: [PATCH 1694/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@6cd48d4d9c9bbc4e6939fbfe558bc13a6505570b --- routing/mock/dht.go | 4 ++-- routing/none/none_client.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 4 ++-- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 25f9cdc977..d64645acd8 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht" + dht "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmSatLR9HCrZjPqomt6VdNCoJmHMz8NP34WfpfBznJZ25M/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - mocknet "gx/ipfs/QmapADMpK4e5kFGBxC2aHreaDqKP9vmMng5f91MA14Ces9/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 28edfa5b49..8b414d188e 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -8,9 +8,9 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + p2phost "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - p2phost "gx/ipfs/QmZy7c24mmkEHpNJndwgsEE3wcVxHd8yB969yTnAJFVw7f/go-libp2p-host" ) type nilclient struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index e65187b017..fd5a3359e1 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -10,13 +10,13 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" + "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZy7c24mmkEHpNJndwgsEE3wcVxHd8yB969yTnAJFVw7f/go-libp2p-host" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 40d15c0a8e..5006e968cd 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,7 +2,7 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 42b76feabd..ebe4f20a9f 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -5,12 +5,12 @@ import ( "errors" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" + host "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - host "gx/ipfs/QmZy7c24mmkEHpNJndwgsEE3wcVxHd8yB969yTnAJFVw7f/go-libp2p-host" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" kbucket "gx/ipfs/QmbiCMdwmmhif5axuGSHzYbPFGeKjLAuMY6JrGpVteHFsy/go-libp2p-kbucket" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 577f26c7b6..b3af59de66 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,7 +9,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 44269717f9..78379025fe 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,7 +3,7 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmTHyAbD9KzGrseLNzmEoNkVxA8F2h7LQG2iV6uhBqs6kX/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ) From 88a63511b94e563e278110c6c5df35a84f959af5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 27 Jul 2017 00:02:03 -0700 Subject: [PATCH 1695/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-blockstore@5c8c656c7f9e306a2fa735cf49f814e75aa29f0f --- blockstore/bloom_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 8314fba02b..8360f82dd7 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -9,7 +9,7 @@ import ( "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - bloom "gx/ipfs/QmeiMCBkYHxkDkDfnDadzz4YxY5ruL5Pj499essE4vRsGM/bbloom" + bloom "gx/ipfs/QmXqKGu7QzfRzFC4yd5aL9sThYx22vY163VGwmxfp5qGHk/bbloom" ) // bloomCached returns a Blockstore that caches Has requests using a Bloom From 416337d64a8729e97c4618a1250a309c3bb5a80f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 31 Jul 2017 14:04:40 -0700 Subject: [PATCH 1696/3147] gx: update go-libp2p-swarm fixes #4102 (fixed in go-libp2p-swarm) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@bd0d24ed4217c15ddae72e33191a9a44ca19fbb5 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 40f3812509..2729759138 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmSatLR9HCrZjPqomt6VdNCoJmHMz8NP34WfpfBznJZ25M/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmZPBrKq6S1fdYaRAzYZivJL12QkUqHwnNzF9wC8VXC4bo/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 1731405a0af2504f711fecac448e5b85114e12c2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 31 Jul 2017 14:04:40 -0700 Subject: [PATCH 1697/3147] gx: update go-libp2p-swarm fixes #4102 (fixed in go-libp2p-swarm) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@f62a67a153cd1ba0495b7d191e1eab7124cc415d --- routing/mock/dht.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index d64645acd8..c57eaf4c95 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -3,10 +3,10 @@ package mockrouting import ( context "context" "github.com/ipfs/go-ipfs/thirdparty/testutil" - dht "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht" - mocknet "gx/ipfs/QmSatLR9HCrZjPqomt6VdNCoJmHMz8NP34WfpfBznJZ25M/go-libp2p/p2p/net/mock" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + mocknet "gx/ipfs/QmZPBrKq6S1fdYaRAzYZivJL12QkUqHwnNzF9wC8VXC4bo/go-libp2p/p2p/net/mock" + dht "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht" ) type mocknetserver struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index fd5a3359e1..259d6c2108 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -10,7 +10,6 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" - dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" @@ -18,6 +17,7 @@ import ( peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 5006e968cd..f7ed151c6d 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" + dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index ebe4f20a9f..bbcf2b5dad 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -5,7 +5,6 @@ import ( "errors" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" host "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" @@ -13,6 +12,7 @@ import ( ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" kbucket "gx/ipfs/QmbiCMdwmmhif5axuGSHzYbPFGeKjLAuMY6JrGpVteHFsy/go-libp2p-kbucket" + dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index b3af59de66..94bf3ccaaf 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,11 +9,11 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 78379025fe..4e8ba883b7 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmRKEzkaiwud2LnwJ9CgBrKw122ddKPTMtLizV3DNimVRD/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 132a47895e4c186a17b67f21cc1145bf30957289 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 9 Aug 2017 23:18:50 +0200 Subject: [PATCH 1698/3147] gc: add events for profiling GC License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@a1a412a83e3b0b0b17d403d2f46193352aaf9ecf --- pinning/pinner/gc/gc.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index fc2a09ed4b..c2ce059455 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,10 +9,13 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) +var log = logging.Logger("gc") + // Result represents an incremental output from a garbage collection // run. It contains either an error, or the cid of a removed object. type Result struct { @@ -31,7 +34,13 @@ type Result struct { // deletes any block that is not found in the marked set. // func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { + + elock := log.EventBegin(ctx, "GC.lockWait") unlocker := bs.GCLock() + elock.Done() + elock = log.EventBegin(ctx, "GC.locked") + emark := log.EventBegin(ctx, "GC.mark") + ls = ls.GetOfflineLinkService() output := make(chan Result, 128) @@ -39,12 +48,18 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. go func() { defer close(output) defer unlocker.Unlock() + defer elock.Done() gcs, err := ColoredSet(ctx, pn, ls, bestEffortRoots, output) if err != nil { output <- Result{Error: err} return } + emark.Append(logging.LoggableMap{ + "blackSetSize": fmt.Sprintf("%d", gcs.Len()), + }) + emark.Done() + esweep := log.EventBegin(ctx, "GC.sweep") keychan, err := bs.AllKeysChan(ctx) if err != nil { @@ -53,6 +68,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. } errors := false + var removed uint64 loop: for { @@ -63,6 +79,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. } if !gcs.Has(k) { err := bs.DeleteBlock(k) + removed++ if err != nil { errors = true output <- Result{Error: &CannotDeleteBlockError{k, err}} @@ -80,6 +97,10 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. break loop } } + esweep.Append(logging.LoggableMap{ + "whiteSetSize": fmt.Sprintf("%d", removed), + }) + esweep.Done() if errors { output <- Result{Error: ErrCannotDeleteSomeBlocks} } From 15fb02ec8a679e3ac19f6864ee2e52c6bebeb6cc Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 16 Aug 2017 16:51:18 -0700 Subject: [PATCH 1699/3147] extract update go-testutil License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@3fdcbb848d7db18a365b4b8ac55b884ee49e5c32 --- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 2729759138..d87cb924c9 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmZPBrKq6S1fdYaRAzYZivJL12QkUqHwnNzF9wC8VXC4bo/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmXZ6XetFwaDNmszPCux9DaKqMykEJGDtWHSqprn94UXzM/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 48142b2e93..b13c249bb1 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" + testutil "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" From a3803bab0d22ddbb3359241c9122c5dad925d0d7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 16 Aug 2017 16:51:18 -0700 Subject: [PATCH 1700/3147] extract update go-testutil License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@02c3d2c4f81d6be7bb5dc147fb5a18e491bb76e4 --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/dht.go | 6 +++--- routing/mock/interface.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline_test.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index e790a631c0..0161ed8f4e 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,7 +6,7 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "github.com/ipfs/go-ipfs/thirdparty/testutil" + "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 4ba17ed19c..3ac4a558e2 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,7 +6,7 @@ import ( "sync" "time" - "github.com/ipfs/go-ipfs/thirdparty/testutil" + "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 7ac250481d..fb35a08c13 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,7 +6,7 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "github.com/ipfs/go-ipfs/thirdparty/testutil" + "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index c57eaf4c95..7b0f25d2f8 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -2,11 +2,11 @@ package mockrouting import ( context "context" - "github.com/ipfs/go-ipfs/thirdparty/testutil" + dht "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - mocknet "gx/ipfs/QmZPBrKq6S1fdYaRAzYZivJL12QkUqHwnNzF9wC8VXC4bo/go-libp2p/p2p/net/mock" - dht "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmXZ6XetFwaDNmszPCux9DaKqMykEJGDtWHSqprn94UXzM/go-libp2p/p2p/net/mock" + "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index de70685a4c..b9c3486983 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,7 +8,7 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "github.com/ipfs/go-ipfs/thirdparty/testutil" + "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 8b414d188e..fe2320388c 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -8,8 +8,8 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" - p2phost "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + p2phost "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ) diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index aaa44befc0..02b86232e5 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -3,8 +3,8 @@ package offline import ( "bytes" "context" - "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" "testing" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 259d6c2108..e3f00dca7f 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -10,14 +10,14 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" - "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" + dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" - dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index f7ed151c6d..db77deeacf 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" + dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" - dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index bbcf2b5dad..1d215ed9fe 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -5,14 +5,14 @@ import ( "errors" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - host "gx/ipfs/QmRNyPNJGNCaZyYonJj7owciWTsMd9gRfEKmZY3o6xwN3h/go-libp2p-host" + dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" + kbucket "gx/ipfs/QmVU26BGUSt3LkbWmoH7dP16mNz5VVRg4hDmWZBHAkq97w/go-libp2p-kbucket" + host "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" - kbucket "gx/ipfs/QmbiCMdwmmhif5axuGSHzYbPFGeKjLAuMY6JrGpVteHFsy/go-libp2p-kbucket" - dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 94bf3ccaaf..c5097e1672 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,11 +9,11 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" - dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 4e8ba883b7..affcd3db67 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" + dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmcKxeQomXUjo54VwisTiXeic5FFBknwUPtT7yRWvmPD1D/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 6822cd341f77dc906509b9d80036dd0677dd2f76 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 16 Aug 2017 16:51:18 -0700 Subject: [PATCH 1701/3147] extract update go-testutil License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@74600a507cd13a00c40e01666ffff6d176ae3aa5 --- mfs/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 4a4e53a56a..f35a54800e 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - ci "github.com/ipfs/go-ipfs/thirdparty/testutil/ci" + ci "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil/ci" "context" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" From 6640db6f589c52310e0faeedb904ed4bcfaa8cbf Mon Sep 17 00:00:00 2001 From: Justin Drake Date: Wed, 28 Jun 2017 11:18:45 +0100 Subject: [PATCH 1702/3147] Do not publish public keys extractable from ID (with tests) License: MIT Signed-off-by: Justin Drake This commit was moved from ipfs/go-namesys@1cf05e7ae9ca7f1cfb6de5254b2da3e129f8b362 --- namesys/publisher.go | 18 ++++-- namesys/publisher_test.go | 115 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 namesys/publisher_test.go diff --git a/namesys/publisher.go b/namesys/publisher.go index c902076491..05a18cd95c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -150,18 +150,24 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) } - errs := make(chan error, 2) + errs := make(chan error, 2) // At most two errors (IPNS, and public key) + + // Attempt to extract the public key from the ID + extractedPublicKey := id.ExtractPublicKey() go func() { errs <- PublishEntry(ctx, r, ipnskey, entry) }() - go func() { - errs <- PublishPublicKey(ctx, r, namekey, k.GetPublic()) - }() + // Publish the public key if a public key cannot be extracted from the ID + if extractedPublicKey == nil { + go func() { + errs <- PublishPublicKey(ctx, r, namekey, k.GetPublic()) + }() - if err := waitOnErrChan(ctx, errs); err != nil { - return err + if err := waitOnErrChan(ctx, errs); err != nil { + return err + } } return waitOnErrChan(ctx, errs) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go new file mode 100644 index 0000000000..53cf22a621 --- /dev/null +++ b/namesys/publisher_test.go @@ -0,0 +1,115 @@ +package namesys + +import ( + "context" + "crypto/rand" + "testing" + "time" + + path "github.com/ipfs/go-ipfs/path" + mockrouting "github.com/ipfs/go-ipfs/routing/mock" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" + + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" +) + +type identity struct { + testutil.PeerNetParams +} + +func (p *identity) ID() peer.ID { + return p.PeerNetParams.ID +} + +func (p *identity) Address() ma.Multiaddr { + return p.Addr +} + +func (p *identity) PrivateKey() ci.PrivKey { + return p.PrivKey +} + +func (p *identity) PublicKey() ci.PubKey { + return p.PubKey +} + +func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expectedExistence bool) { + // Context + ctx := context.Background() + + // Private key + privKey, pubKey, err := ci.GenerateKeyPairWithReader(keyType, 2048, rand.Reader) + if err != nil { + t.Fatal(err) + } + + // ID + var id peer.ID + switch keyType { + case ci.Ed25519: + id, err = peer.IDFromEd25519PublicKey(pubKey) + default: + id, err = peer.IDFromPublicKey(pubKey) + } + + if err != nil { + t.Fatal(err) + } + + // Value + value := path.Path("ipfs/TESTING") + + // Seqnum + seqnum := uint64(0) + + // Eol + eol := time.Now().Add(24 * time.Hour) + + // Routing value store + p := testutil.PeerNetParams{ + ID: id, + PrivKey: privKey, + PubKey: pubKey, + Addr: testutil.ZeroLocalTCPAddress, + } + + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + serv := mockrouting.NewServer() + r := serv.ClientWithDatastore(context.Background(), &identity{p}, dstore) + + err = PutRecordToRouting(ctx, privKey, value, seqnum, eol, r, id) + if err != nil { + t.Fatal(err) + } + + // Check for namekey existence in value store + namekey, _ := IpnsKeysForID(id) + _, err = r.GetValue(ctx, namekey) + if err != expectedErr { + t.Fatal(err) + } + + // Also check datastore for completeness + key := dshelp.NewKeyFromBinary([]byte(namekey)) + exists, err := dstore.Has(key) + if err != nil { + t.Fatal(err) + } + + if exists != expectedExistence { + t.Fatal("Unexpected key existence in datastore") + } +} + +func TestRSAPublisher(t *testing.T) { + testNamekeyPublisher(t, ci.RSA, nil, true) +} + +func TestEd22519Publisher(t *testing.T) { + testNamekeyPublisher(t, ci.Ed25519, ds.ErrNotFound, false) +} From 035967340f706737c030ba67d477a6d7aa9a2f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 23 Aug 2017 16:32:32 +0200 Subject: [PATCH 1703/3147] gx: update go-reuseport MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@2647219811901e350e1cde32759e81d4f8a98150 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index d87cb924c9..60026fc93b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmXZ6XetFwaDNmszPCux9DaKqMykEJGDtWHSqprn94UXzM/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmZyngpQxUGyx1T2bzEcst6YzERkvVwDzBMbsSQF4f1smE/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From aa74cb903269312162366ccafd357c0cea071860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 23 Aug 2017 16:32:32 +0200 Subject: [PATCH 1704/3147] gx: update go-reuseport MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-routing@d7213f1e07897a34c995c8182ea6e191411d78b0 --- routing/mock/dht.go | 4 ++-- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 7b0f25d2f8..d83cf590bf 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -2,11 +2,11 @@ package mockrouting import ( context "context" - dht "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - mocknet "gx/ipfs/QmXZ6XetFwaDNmszPCux9DaKqMykEJGDtWHSqprn94UXzM/go-libp2p/p2p/net/mock" "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" + dht "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht" + mocknet "gx/ipfs/QmZyngpQxUGyx1T2bzEcst6YzERkvVwDzBMbsSQF4f1smE/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index e3f00dca7f..88e187dc38 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -10,13 +10,13 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" - dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index db77deeacf..e112173c1c 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,9 +2,9 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 1d215ed9fe..7b53a6a16e 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -5,13 +5,13 @@ import ( "errors" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" kbucket "gx/ipfs/QmVU26BGUSt3LkbWmoH7dP16mNz5VVRg4hDmWZBHAkq97w/go-libp2p-kbucket" host "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" + dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index c5097e1672..e14d14d8b8 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,10 +9,10 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index affcd3db67..35a6edd590 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmSFNexSqAnJKGfDwKnGx2sGB1EtLwsNQ586u18UkVLjAy/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 6dcd3727b59f3a1ec475704847084fdda7888872 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 30 Aug 2017 00:27:11 -0400 Subject: [PATCH 1705/3147] Fix broken import in publisher_test.go. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@e8c08d08dc5580c7a6361d733b8644e52824c029 --- namesys/publisher_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 53cf22a621..fb80d46f15 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -9,12 +9,12 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - testutil "github.com/ipfs/go-ipfs/thirdparty/testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + testutil "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) From a18378cf4a9f0dd1474aadde408c3777c937b65b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1706/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@38818c7c0844dfcc844853a209bfd9a22a222a72 --- routing/mock/centralized_client.go | 6 +++--- routing/mock/centralized_server.go | 4 ++-- routing/mock/centralized_test.go | 4 ++-- routing/mock/dht.go | 6 +++--- routing/mock/interface.go | 4 ++-- routing/none/none_client.go | 6 +++--- routing/offline/offline.go | 4 ++-- routing/offline/offline_test.go | 2 +- routing/supernode/client.go | 8 ++++---- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 0161ed8f4e..0614d2d77c 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,13 +6,13 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 3ac4a558e2..c5f90d1d88 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,10 +6,10 @@ import ( "sync" "time" - "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index fb35a08c13..84f9fcbcff 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,11 +6,11 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index d83cf590bf..ac2df5f9e7 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -2,11 +2,11 @@ package mockrouting import ( context "context" + dht "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" - dht "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht" - mocknet "gx/ipfs/QmZyngpQxUGyx1T2bzEcst6YzERkvVwDzBMbsSQF4f1smE/go-libp2p/p2p/net/mock" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + mocknet "gx/ipfs/QmbRT4BwPQEx4CPCd8LKYL46tFWYneGswQnHFdsuiczJRL/go-libp2p/p2p/net/mock" ) type mocknetserver struct { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index b9c3486983..3522c6f38f 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,9 +8,9 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index fe2320388c..8d65e81bcf 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,10 +6,10 @@ import ( repo "github.com/ipfs/go-ipfs/repo" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - p2phost "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" + p2phost "gx/ipfs/QmUwW8jMQDxXhLD2j4EfWqLEMX3MsvyWcWGvJPVDh1aTmu/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index f2a703110e..df26571758 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,9 +7,9 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 02b86232e5..9f5b3f0b23 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -4,7 +4,7 @@ import ( "bytes" "context" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" "testing" ) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 88e187dc38..7ddc5bc06c 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,15 +8,15 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" + dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" + "gx/ipfs/QmUwW8jMQDxXhLD2j4EfWqLEMX3MsvyWcWGvJPVDh1aTmu/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index e112173c1c..6b8482431c 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,9 +2,9 @@ package proxy import ( context "context" + dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 7b53a6a16e..4a0254ab3e 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,14 +4,14 @@ import ( "context" "errors" + dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + kbucket "gx/ipfs/QmSAFA8v42u4gpJNy1tb7vW3JiiXiaYDC2b845c2RnNSJL/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - kbucket "gx/ipfs/QmVU26BGUSt3LkbWmoH7dP16mNz5VVRg4hDmWZBHAkq97w/go-libp2p-kbucket" - host "gx/ipfs/QmW8Rgju5JrSMHP7RDNdiwwXyenRqAbtSaPfdQKQC7ZdH6/go-libp2p-host" + host "gx/ipfs/QmUwW8jMQDxXhLD2j4EfWqLEMX3MsvyWcWGvJPVDh1aTmu/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" ) diff --git a/routing/supernode/server.go b/routing/supernode/server.go index e14d14d8b8..1ccda74f73 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,11 +8,11 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ) diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 35a6edd590..453b18b82e 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" + dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmZSEstKChFezMwTcAWH5UQxvRckmnvgVZjFeSnGLDHU3Y/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From d2404664b65eb0e5fcfe5dca73d80187a9bf496f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1707/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@7e34904d41a0eaa5495337ca64195b4c89137d3d --- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/publisher_test.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index e869799141..d1cda08709 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" diff --git a/namesys/publisher.go b/namesys/publisher.go index 05a18cd95c..66214100fa 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,7 +14,7 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index fb80d46f15..3149b3e485 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -12,9 +12,9 @@ import ( ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - testutil "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 787636588e..3ab382473b 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,7 +11,7 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 60026fc93b..04c7b34f03 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmZyngpQxUGyx1T2bzEcst6YzERkvVwDzBMbsSQF4f1smE/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmbRT4BwPQEx4CPCd8LKYL46tFWYneGswQnHFdsuiczJRL/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index b13c249bb1..bb30a243a4 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil" + testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" diff --git a/namesys/routing.go b/namesys/routing.go index faff33690e..19e8b34d36 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,10 +9,10 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmPjTrrSfE6TzLv6ya6VWhGcCgPrUAdcgrDcQyRDX2VyW1/go-libp2p-routing" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" From e6542fd58a7d5691fa8d76198fb481e6378bc3c2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1708/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@d405e1858a48354398d771136bb8c4e956fb4476 --- mfs/dir.go | 4 ++-- mfs/file.go | 2 +- mfs/mfs_test.go | 4 ++-- mfs/ops.go | 2 +- mfs/repub_test.go | 4 ++-- mfs/system.go | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 387becb6cd..a489336d61 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index d527eacf29..6e249e3294 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 3be7ed8fce..09e9de00dd 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 33f8f9b799..a086e86025 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index f35a54800e..1c21bd793f 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -4,10 +4,10 @@ import ( "testing" "time" - ci "gx/ipfs/QmZJD56ZWLViJAVkvLc7xbbDerHzUMLr2X4fLRYfbxZWDN/go-testutil/ci" + ci "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil/ci" "context" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 086808af5b..0641704cf3 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,9 +19,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var ErrNotExist = errors.New("no such rootfs") From 0855c20ae1c2f3244dc3b5db5cc5474c2cda5f56 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1709/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@ef6144db00d6c9c97442fa5897c5b395f94b8a52 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/test/utils.go | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index fc380baf84..b913300efb 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index dde968cec8..f00d0422fd 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,7 +13,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index b91738a089..a360c37c2d 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,8 +31,8 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index ae1517362a..a7ed7944e9 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index b4af5441b0..76ec34faab 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,9 +8,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index f1cb7f35b7..dceba71a70 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index cdf2b4c78a..e3955e20c0 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,8 +14,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index c70d3f3bd5..c0b8ae18d0 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,8 +14,8 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From b1f0870348cb75e63ccbf2e90ea38a6bb93780e9 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1710/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@5f825db8701e945a3618e68937f28a5ed1da7b63 --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index d56efd1d87..85e163a258 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index ef9bc90c18..5b8fe515ae 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index ba903d01ce..200fe1f378 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" util "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From 17ec98358367d8098d1a788e7765a5e733c8508f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1711/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-blockstore@b5f4f310b1aaeb59b4d27b7834075bae5a95c985 --- blockstore/arc_cache.go | 4 ++-- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 4 ++-- blockstore/bloom_cache.go | 4 ++-- blockstore/bloom_cache_test.go | 2 +- blockstore/util/remove.go | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index e7a7024069..47ddf2d4c1 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,10 +3,10 @@ package blockstore import ( "context" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" ) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index b6575a58c5..0232249d3f 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,9 +4,9 @@ import ( "context" "testing" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" syncds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index e8f11aa7c5..21bf046125 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -9,10 +9,10 @@ import ( "sync/atomic" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 4382c9111d..8bc2b2f1b3 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -7,10 +7,10 @@ import ( "testing" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 8360f82dd7..79a4596e07 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,10 +5,10 @@ import ( "sync/atomic" "time" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" bloom "gx/ipfs/QmXqKGu7QzfRzFC4yd5aL9sThYx22vY163VGwmxfp5qGHk/bbloom" ) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index af318a0aab..4eb8d1aca0 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" context "context" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 1b6d4f33a9..47552988b8 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -5,7 +5,7 @@ import ( "fmt" "io" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" bs "github.com/ipfs/go-ipfs/blocks/blockstore" From acc4bfcb8327c45d25cd6936f670c61c8aa5aa3b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1712/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@a6be3040da28168059210e078ebfebcbaaa7e396 --- chunker/rabin_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 6f9d6b7ff8..ede2bc20ab 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" "io" "testing" ) From 70c93152caf5e394eed367fe60f0e1fce078b512 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1713/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@22195b644a585291debafbbeb1c5031afa2a08b7 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index c2ce059455..c9e6cac706 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index c73d3dd7ba..ce3722aeb3 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,10 +12,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 57683eef9f..fc303b6f23 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,8 +10,8 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 74bea03752..c191744fd8 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,8 +12,8 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - node "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 310780f30a..856a86a971 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -10,7 +10,7 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" ) From 8126cc6294f2a5d169b69c145c6359efb7961394 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1714/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@e6b1b9e9ef6dbfb3c4aa0d2ed882a721015b79b6 --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 2 +- blockservice/test/blocks_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index f876740562..6bd04c3abb 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -12,9 +12,9 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 663d9856db..1ce735f8bd 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 96ed5e54d9..59e1b4e91c 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,10 +10,10 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ) From 4c8be8166fedc554e99ce3b3835de76be2c46aae Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1715/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@763b4fc8c5e6b1502f8ffc97a0cb2d99a18163f1 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 4 ++-- filestore/util.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index d69aa9d23b..9e33f7ed8c 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,10 +12,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index ce2f4b1686..8f972dec0e 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -11,7 +11,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index ad7dc898e7..9f8ac62f51 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,10 +11,10 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" diff --git a/filestore/util.go b/filestore/util.go index 3086ccadb2..1e4f462b93 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -8,7 +8,7 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" ) From b38e8ebf12b2a17924624ec116b39bb0d709f331 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1716/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-ds-help@4b5026248ff4c569fcdca1c7fa47e19313e5627e --- datastore/dshelp/key.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 36cc841f3c..21a12c7b48 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,9 +1,9 @@ package dshelp import ( - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - base32 "gx/ipfs/QmZvZSVtvxak4dcTkhsQhqd1SQ6rg5UzaSTu62WfWKjj93/base32" + base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) // TODO: put this code into the go-datastore itself From fc81cbaf3ee8ec42e2c8c5337bd4fd5ad8ed6aaf Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1717/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-offline@58a7fd34fa09a38c8df473365a938d3da2e3b662 --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 1c0b1a4245..fed9c2d875 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index d619475629..fce8b613ee 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -6,10 +6,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ) From fe32e90cb6326d44f8ed28fa0ecc9e5f28e36a8e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1718/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-interface@79cacb5624acc5ad0621ea0a61395d8c1338d667 --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 1373f0d3c4..4fe8e0f3de 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,9 @@ import ( "context" "io" - blocks "gx/ipfs/QmVA4mafxbfH5aEvNz8fyoxC6J1xhAtw88B4GerPznSZBg/go-block-format" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From d45714f3fa2fcf0224d6b0774cd729941109a450 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 28 Aug 2017 20:32:16 -0700 Subject: [PATCH 1719/3147] gx: update go-cid, go-multibase, base32 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@6c6807b399ac688cbe92d85156b74cae3bd45321 --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 81197bb466..78a64dd40b 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - cid "gx/ipfs/QmTprEaAA2A9bst5XH7exuyi5KzNMK3SEDNN8rBDnKWcUS/go-cid" - ipld "gx/ipfs/QmYNyRZJBUYPNrLszFmrBrPJbsBh2vMsefz5gnDpB5M1P6/go-ipld-format" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + ipld "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) type Path interface { From e35c0cc0a8b95627dda05c6b6b21712d0e13e4b2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 4 Sep 2017 20:15:20 -0700 Subject: [PATCH 1720/3147] remove some dead code License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@df02a9befa77fb250839dd34cdfbfc4e49cd384c --- routing/mock/dht.go | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 routing/mock/dht.go diff --git a/routing/mock/dht.go b/routing/mock/dht.go deleted file mode 100644 index ac2df5f9e7..0000000000 --- a/routing/mock/dht.go +++ /dev/null @@ -1,37 +0,0 @@ -package mockrouting - -import ( - context "context" - dht "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" - mocknet "gx/ipfs/QmbRT4BwPQEx4CPCd8LKYL46tFWYneGswQnHFdsuiczJRL/go-libp2p/p2p/net/mock" -) - -type mocknetserver struct { - mn mocknet.Mocknet -} - -func NewDHTNetwork(mn mocknet.Mocknet) Server { - return &mocknetserver{ - mn: mn, - } -} - -func (rs *mocknetserver) Client(p testutil.Identity) Client { - return rs.ClientWithDatastore(context.TODO(), p, ds.NewMapDatastore()) -} - -func (rs *mocknetserver) ClientWithDatastore(ctx context.Context, p testutil.Identity, ds ds.Datastore) Client { - - // FIXME AddPeer doesn't appear to be idempotent - - host, err := rs.mn.AddPeer(p.PrivateKey(), p.Address()) - if err != nil { - panic("FIXME") - } - return dht.NewDHT(ctx, host, sync.MutexWrap(ds)) -} - -var _ Server = &mocknetserver{} From 41178aaeef0a935d84b5e2d76be2d95b7179cc84 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 4 Sep 2017 23:37:11 -0700 Subject: [PATCH 1721/3147] gx: update go-ws-transport License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@a8742aaa7e4d581c2da1046bb6bab37e98870357 --- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index 7ddc5bc06c..ed8ebab851 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -8,7 +8,6 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" @@ -18,6 +17,7 @@ import ( peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 6b8482431c..5b996b02b7 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" - dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" + dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 4a0254ab3e..67c06458da 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,7 +4,6 @@ import ( "context" "errors" - dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" kbucket "gx/ipfs/QmSAFA8v42u4gpJNy1tb7vW3JiiXiaYDC2b845c2RnNSJL/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" @@ -13,6 +12,7 @@ import ( peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" + dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 1ccda74f73..081f42313d 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -8,12 +8,12 @@ import ( proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 453b18b82e..6d3155f884 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" - dhtpb "gx/ipfs/QmNV315eTphFgCttWPrT5ARNsiPNRLGFWHRJZyXyqvmjD6/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 819d9f016b6771fa37e52730b89a8ec9eaeec35d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 4 Sep 2017 23:37:11 -0700 Subject: [PATCH 1722/3147] gx: update go-ws-transport License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@facb6fd902726f0707b31c68635b1e404886df5a --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 04c7b34f03..364d84e602 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmbRT4BwPQEx4CPCd8LKYL46tFWYneGswQnHFdsuiczJRL/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmXZyBQMkqSYigxhJResC6fLWDGFhbphK67eZoqMDUvBmK/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From a1a652a68d9417118c2eb5e55da70dec80fc7d67 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 14 Sep 2017 11:39:25 -0700 Subject: [PATCH 1723/3147] gx: update go-stream-muxer Introduces a new Reset method on streams that kills both sides of the connection. Close now officially just closes the write side (what it did all along...) * Also pull through shiny new go-multiplexer fixes. * Also pull in go-reuseport update. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@9a26f829c8e391182e5f1156aa9973f5b8fc1205 --- routing/none/none_client.go | 2 +- routing/supernode/client.go | 4 ++-- routing/supernode/proxy/loopback.go | 4 ++-- routing/supernode/proxy/standard.go | 6 +++--- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 8d65e81bcf..ae9c6c352f 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,8 +9,8 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - p2phost "gx/ipfs/QmUwW8jMQDxXhLD2j4EfWqLEMX3MsvyWcWGvJPVDh1aTmu/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + p2phost "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" ) type nilclient struct { diff --git a/routing/supernode/client.go b/routing/supernode/client.go index ed8ebab851..a9dacd82d4 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -13,11 +13,11 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - "gx/ipfs/QmUwW8jMQDxXhLD2j4EfWqLEMX3MsvyWcWGvJPVDh1aTmu/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" - dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index 5b996b02b7..e8b77b3220 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -2,10 +2,10 @@ package proxy import ( context "context" + inet "gx/ipfs/QmNa31VPzC561NWwRsJLE7nGYZYuuD2QfpK2b1q9BK54J1/go-libp2p-net" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" - dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index 67c06458da..d5a9b51bf3 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -4,15 +4,15 @@ import ( "context" "errors" + inet "gx/ipfs/QmNa31VPzC561NWwRsJLE7nGYZYuuD2QfpK2b1q9BK54J1/go-libp2p-net" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" kbucket "gx/ipfs/QmSAFA8v42u4gpJNy1tb7vW3JiiXiaYDC2b845c2RnNSJL/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - host "gx/ipfs/QmUwW8jMQDxXhLD2j4EfWqLEMX3MsvyWcWGvJPVDh1aTmu/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - inet "gx/ipfs/QmahYsGWry85Y7WUe2SX5G4JkH2zifEQAUtJVLZ24aC9DF/go-libp2p-net" - dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" + host "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" + dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 081f42313d..46f00ccdf7 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -13,7 +13,7 @@ import ( peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" - dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 6d3155f884..6579a6b35d 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmeQMs9pr9Goci9xJ1Wo5ZQrknzBZwnmHYWJXA8stQDFMx/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From dd7472fae7cbc82ea43b26efa09c83bef7497b6b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 14 Sep 2017 11:39:25 -0700 Subject: [PATCH 1724/3147] gx: update go-stream-muxer Introduces a new Reset method on streams that kills both sides of the connection. Close now officially just closes the write side (what it did all along...) * Also pull through shiny new go-multiplexer fixes. * Also pull in go-reuseport update. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@f3fec337803608235494be5dc1f8a16abf1c5dc5 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 364d84e602..c1398a9097 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmXZyBQMkqSYigxhJResC6fLWDGFhbphK67eZoqMDUvBmK/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmZ3ma9g2NTg7GNF1ntWNRa1GW9jVzGq8UE9cKCwRKv6dS/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 5844fd6dc3124b1a73957fb1aba2cd7c4bbb9a4f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 14 Sep 2017 11:52:14 -0700 Subject: [PATCH 1725/3147] use stream.Reset where appropriate License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@38fc7aeea18921b9a4c8f8ead11aebea6edb3376 --- routing/supernode/proxy/loopback.go | 5 ++++- routing/supernode/proxy/standard.go | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index e8b77b3220..f6d9c0bb77 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -42,6 +42,7 @@ func (lb *Loopback) HandleStream(s inet.Stream) { pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) var incoming dhtpb.Message if err := pbr.ReadMsg(&incoming); err != nil { + s.Reset() log.Debug(err) return } @@ -51,6 +52,8 @@ func (lb *Loopback) HandleStream(s inet.Stream) { pbw := ggio.NewDelimitedWriter(s) if err := pbw.WriteMsg(outgoing); err != nil { - return // TODO logerr + s.Reset() + log.Debug(err) + return } } diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index d5a9b51bf3..eddd1e84fb 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -60,7 +60,7 @@ func (px *standard) Bootstrap(ctx context.Context) error { func (p *standard) HandleStream(s inet.Stream) { // TODO(brian): Should clients be able to satisfy requests? log.Error("supernode client received (dropped) a routing message from", s.Conn().RemotePeer()) - s.Close() + s.Reset() } const replicationFactor = 2 @@ -102,9 +102,15 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe if err != nil { return err } - defer s.Close() pbw := ggio.NewDelimitedWriter(s) - return pbw.WriteMsg(m) + + err = pbw.WriteMsg(m) + if err == nil { + s.Close() + } else { + s.Reset() + } + return err } // SendRequest sends the request to each remote sequentially (randomized order), @@ -139,17 +145,20 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) w := ggio.NewDelimitedWriter(s) if err = w.WriteMsg(m); err != nil { + s.Reset() e.SetError(err) return nil, err } response := &dhtpb.Message{} if err = r.ReadMsg(response); err != nil { + s.Reset() e.SetError(err) return nil, err } // need ctx expiration? if response == nil { + s.Reset() err := errors.New("no response to request") e.SetError(err) return nil, err From 4a1f699f3bebccb7351ddefff56766590b0ea693 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 15 Sep 2017 18:56:44 -0700 Subject: [PATCH 1726/3147] update yamux We need to cancel out all readers/writers on stream reset. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@dac011aa6b28aa7627ed20ce662810afcdddcd64 --- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index a9dacd82d4..fcfca86cad 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -13,11 +13,11 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" + dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" - dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) var log = logging.Logger("supernode") diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index f6d9c0bb77..a2887851c8 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -3,9 +3,9 @@ package proxy import ( context "context" inet "gx/ipfs/QmNa31VPzC561NWwRsJLE7nGYZYuuD2QfpK2b1q9BK54J1/go-libp2p-net" + dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) // RequestHandler handles routing requests locally diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index eddd1e84fb..a7359a75f4 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,10 +9,10 @@ import ( kbucket "gx/ipfs/QmSAFA8v42u4gpJNy1tb7vW3JiiXiaYDC2b845c2RnNSJL/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" + dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" host "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" - dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) const ProtocolSNR = "/ipfs/supernoderouting" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 46f00ccdf7..458a36a49d 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -10,10 +10,10 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" - dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" ) // Server handles routing queries using a database backend diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index 6579a6b35d..d9d214c33b 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -4,7 +4,7 @@ import ( "testing" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmdPuLwm97UHxH7nR33TJxFi4PteFEDZagYWfTY1mNQWA5/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 53158b40756aa0ef4f348d47eb2e2654e542dfb2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 15 Sep 2017 18:56:44 -0700 Subject: [PATCH 1727/3147] update yamux We need to cancel out all readers/writers on stream reset. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@38886dbfb2062305637d77b41971933210dba7ae --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index c1398a9097..2a71875373 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmZ3ma9g2NTg7GNF1ntWNRa1GW9jVzGq8UE9cKCwRKv6dS/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmRQ76P5dgvxTujhfPsCRAG83rC15jgb1G9bKLuomuC6dQ/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 825e97aed83037bf87fa4b2761a81bc63ad7a7ef Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 19 Sep 2017 16:00:44 -0700 Subject: [PATCH 1728/3147] fix dht memory leak update go-libp2p-kad-dht to fix a nasty memory leak License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@6cac0ea04794a7cd7c73580bed8ed9b307f88732 --- routing/supernode/client.go | 2 +- routing/supernode/proxy/loopback.go | 2 +- routing/supernode/proxy/standard.go | 2 +- routing/supernode/server.go | 2 +- routing/supernode/server_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/supernode/client.go b/routing/supernode/client.go index fcfca86cad..6764f784fb 100644 --- a/routing/supernode/client.go +++ b/routing/supernode/client.go @@ -13,7 +13,7 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go index a2887851c8..16480e65cf 100644 --- a/routing/supernode/proxy/loopback.go +++ b/routing/supernode/proxy/loopback.go @@ -3,7 +3,7 @@ package proxy import ( context "context" inet "gx/ipfs/QmNa31VPzC561NWwRsJLE7nGYZYuuD2QfpK2b1q9BK54J1/go-libp2p-net" - dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" ) diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go index a7359a75f4..09c78d69a8 100644 --- a/routing/supernode/proxy/standard.go +++ b/routing/supernode/proxy/standard.go @@ -9,7 +9,7 @@ import ( kbucket "gx/ipfs/QmSAFA8v42u4gpJNy1tb7vW3JiiXiaYDC2b845c2RnNSJL/go-libp2p-kbucket" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" + dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" host "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" diff --git a/routing/supernode/server.go b/routing/supernode/server.go index 458a36a49d..592cd0732f 100644 --- a/routing/supernode/server.go +++ b/routing/supernode/server.go @@ -9,8 +9,8 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go index d9d214c33b..348fbe3926 100644 --- a/routing/supernode/server_test.go +++ b/routing/supernode/server_test.go @@ -3,8 +3,8 @@ package supernode import ( "testing" + dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dhtpb "gx/ipfs/QmXF6hA3AWGNmE33GarqeCu3ksAXhLiwhcRR4mvfyWTZcT/go-libp2p-kad-dht/pb" ) func TestPutProviderDoesntResultInDuplicates(t *testing.T) { From 808c7bea35630577d1ba7727a893aa94c0414901 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 5 Oct 2017 17:10:16 +0300 Subject: [PATCH 1729/3147] update go-testutil to 1.1.12 License: MIT Signed-off-by: vyzo This commit was moved from ipfs/go-ipfs-routing@7538286951c86c2318bce4a11ea8d4ed34003550 --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 2 +- routing/offline/offline_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 0614d2d77c..407629299f 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,7 +6,7 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index c5f90d1d88..02929a4cf6 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,7 +6,7 @@ import ( "sync" "time" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 84f9fcbcff..9ecba1181d 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,7 +6,7 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 3522c6f38f..5dcbbd21db 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,7 +8,7 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 9f5b3f0b23..f922f399c6 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -3,8 +3,8 @@ package offline import ( "bytes" "context" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" "testing" ) From e87f67d10f4b991ba94c3210d0af9e2ffd0fe2e6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 5 Oct 2017 17:10:16 +0300 Subject: [PATCH 1730/3147] update go-testutil to 1.1.12 License: MIT Signed-off-by: vyzo This commit was moved from ipfs/go-namesys@32574df8cadde4250f37e5faa21cee5ab2cf9371 --- namesys/publisher_test.go | 2 +- namesys/resolve_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 3149b3e485..28635f3bfc 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -10,9 +10,9 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index bb30a243a4..7503ad3d7e 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" From 8e81dc64a51e41f1925e612bf13982cff0f0f289 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 5 Oct 2017 17:10:16 +0300 Subject: [PATCH 1731/3147] update go-testutil to 1.1.12 License: MIT Signed-off-by: vyzo This commit was moved from ipfs/go-mfs@65b0e8640cdff39997bbbbdeae0edc65b2eee1b6 --- mfs/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 1c21bd793f..2dd199e8f9 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - ci "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil/ci" + ci "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil/ci" "context" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" From a6fa6e29395f52d5ae54e0d75667676fe8a3e070 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 12 Oct 2017 19:39:29 -0700 Subject: [PATCH 1732/3147] remove supernode routing It was never fully implemented and isn't used. fixes #3950 (not removing routing/mock because that *is* in use). License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@330c8e84f88434faa9c430de4b9ca77cab733ee7 --- routing/supernode/client.go | 164 ---------------------- routing/supernode/proxy/loopback.go | 59 -------- routing/supernode/proxy/standard.go | 174 ------------------------ routing/supernode/server.go | 202 ---------------------------- routing/supernode/server_test.go | 39 ------ 5 files changed, 638 deletions(-) delete mode 100644 routing/supernode/client.go delete mode 100644 routing/supernode/proxy/loopback.go delete mode 100644 routing/supernode/proxy/standard.go delete mode 100644 routing/supernode/server.go delete mode 100644 routing/supernode/server_test.go diff --git a/routing/supernode/client.go b/routing/supernode/client.go deleted file mode 100644 index 6764f784fb..0000000000 --- a/routing/supernode/client.go +++ /dev/null @@ -1,164 +0,0 @@ -package supernode - -import ( - "bytes" - "context" - "errors" - "time" - - proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" - pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" -) - -var log = logging.Logger("supernode") - -type Client struct { - peerhost host.Host - peerstore pstore.Peerstore - proxy proxy.Proxy - local peer.ID -} - -// TODO take in datastore/cache -func NewClient(px proxy.Proxy, h host.Host, ps pstore.Peerstore, local peer.ID) (*Client, error) { - return &Client{ - proxy: px, - local: local, - peerstore: ps, - peerhost: h, - }, nil -} - -func (c *Client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo { - logging.ContextWithLoggable(ctx, loggables.Uuid("findProviders")) - defer log.EventBegin(ctx, "findProviders", k).Done() - ch := make(chan pstore.PeerInfo) - go func() { - defer close(ch) - request := dhtpb.NewMessage(dhtpb.Message_GET_PROVIDERS, k.KeyString(), 0) - response, err := c.proxy.SendRequest(ctx, request) - if err != nil { - log.Debug(err) - return - } - for _, p := range dhtpb.PBPeersToPeerInfos(response.GetProviderPeers()) { - select { - case <-ctx.Done(): - log.Debug(ctx.Err()) - return - case ch <- *p: - } - } - }() - return ch -} - -func (c *Client) PutValue(ctx context.Context, k string, v []byte) error { - defer log.EventBegin(ctx, "putValue").Done() - r, err := makeRecord(c.peerstore, c.local, k, v) - if err != nil { - return err - } - pmes := dhtpb.NewMessage(dhtpb.Message_PUT_VALUE, string(k), 0) - pmes.Record = r - return c.proxy.SendMessage(ctx, pmes) // wrap to hide the remote -} - -func (c *Client) GetValue(ctx context.Context, k string) ([]byte, error) { - defer log.EventBegin(ctx, "getValue").Done() - msg := dhtpb.NewMessage(dhtpb.Message_GET_VALUE, string(k), 0) - response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote - if err != nil { - return nil, err - } - return response.Record.GetValue(), nil -} - -func (c *Client) GetValues(ctx context.Context, k string, _ int) ([]routing.RecvdVal, error) { - defer log.EventBegin(ctx, "getValue").Done() - msg := dhtpb.NewMessage(dhtpb.Message_GET_VALUE, string(k), 0) - response, err := c.proxy.SendRequest(ctx, msg) // TODO wrap to hide the remote - if err != nil { - return nil, err - } - - return []routing.RecvdVal{ - { - Val: response.Record.GetValue(), - From: c.local, - }, - }, nil -} - -// Provide adds the given key 'k' to the content routing system. If 'brd' is -// true, it announces that content to the network. For the supernode client, -// setting 'brd' to false makes this call a no-op -func (c *Client) Provide(ctx context.Context, k *cid.Cid, brd bool) error { - if !brd { - return nil - } - defer log.EventBegin(ctx, "provide", k).Done() - msg := dhtpb.NewMessage(dhtpb.Message_ADD_PROVIDER, k.KeyString(), 0) - // FIXME how is connectedness defined for the local node - pri := []dhtpb.PeerRoutingInfo{ - { - PeerInfo: pstore.PeerInfo{ - ID: c.local, - Addrs: c.peerhost.Addrs(), - }, - }, - } - msg.ProviderPeers = dhtpb.PeerRoutingInfosToPBPeers(pri) - return c.proxy.SendMessage(ctx, msg) // TODO wrap to hide remote -} - -func (c *Client) FindPeer(ctx context.Context, id peer.ID) (pstore.PeerInfo, error) { - defer log.EventBegin(ctx, "findPeer", id).Done() - request := dhtpb.NewMessage(dhtpb.Message_FIND_NODE, string(id), 0) - response, err := c.proxy.SendRequest(ctx, request) // hide remote - if err != nil { - return pstore.PeerInfo{}, err - } - for _, p := range dhtpb.PBPeersToPeerInfos(response.GetCloserPeers()) { - if p.ID == id { - return *p, nil - } - } - return pstore.PeerInfo{}, errors.New("could not find peer") -} - -// creates and signs a record for the given key/value pair -func makeRecord(ps pstore.Peerstore, p peer.ID, k string, v []byte) (*pb.Record, error) { - blob := bytes.Join([][]byte{[]byte(k), v, []byte(p)}, []byte{}) - sig, err := ps.PrivKey(p).Sign(blob) - if err != nil { - return nil, err - } - return &pb.Record{ - Key: proto.String(string(k)), - Value: v, - Author: proto.String(string(p)), - Signature: sig, - }, nil -} - -func (c *Client) Ping(ctx context.Context, id peer.ID) (time.Duration, error) { - defer log.EventBegin(ctx, "ping", id).Done() - return time.Nanosecond, errors.New("supernode routing does not support the ping method") -} - -func (c *Client) Bootstrap(ctx context.Context) error { - return c.proxy.Bootstrap(ctx) -} - -var _ routing.IpfsRouting = &Client{} diff --git a/routing/supernode/proxy/loopback.go b/routing/supernode/proxy/loopback.go deleted file mode 100644 index 16480e65cf..0000000000 --- a/routing/supernode/proxy/loopback.go +++ /dev/null @@ -1,59 +0,0 @@ -package proxy - -import ( - context "context" - inet "gx/ipfs/QmNa31VPzC561NWwRsJLE7nGYZYuuD2QfpK2b1q9BK54J1/go-libp2p-net" - dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" -) - -// RequestHandler handles routing requests locally -type RequestHandler interface { - HandleRequest(ctx context.Context, p peer.ID, m *dhtpb.Message) *dhtpb.Message -} - -// Loopback forwards requests to a local handler -type Loopback struct { - Handler RequestHandler - Local peer.ID -} - -func (_ *Loopback) Bootstrap(ctx context.Context) error { - return nil -} - -// SendMessage intercepts local requests, forwarding them to a local handler -func (lb *Loopback) SendMessage(ctx context.Context, m *dhtpb.Message) error { - response := lb.Handler.HandleRequest(ctx, lb.Local, m) - if response != nil { - log.Warning("loopback handler returned unexpected message") - } - return nil -} - -// SendRequest intercepts local requests, forwarding them to a local handler -func (lb *Loopback) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { - return lb.Handler.HandleRequest(ctx, lb.Local, m), nil -} - -func (lb *Loopback) HandleStream(s inet.Stream) { - defer s.Close() - pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - var incoming dhtpb.Message - if err := pbr.ReadMsg(&incoming); err != nil { - s.Reset() - log.Debug(err) - return - } - ctx := context.TODO() - outgoing := lb.Handler.HandleRequest(ctx, s.Conn().RemotePeer(), &incoming) - - pbw := ggio.NewDelimitedWriter(s) - - if err := pbw.WriteMsg(outgoing); err != nil { - s.Reset() - log.Debug(err) - return - } -} diff --git a/routing/supernode/proxy/standard.go b/routing/supernode/proxy/standard.go deleted file mode 100644 index 09c78d69a8..0000000000 --- a/routing/supernode/proxy/standard.go +++ /dev/null @@ -1,174 +0,0 @@ -package proxy - -import ( - "context" - "errors" - - inet "gx/ipfs/QmNa31VPzC561NWwRsJLE7nGYZYuuD2QfpK2b1q9BK54J1/go-libp2p-net" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - kbucket "gx/ipfs/QmSAFA8v42u4gpJNy1tb7vW3JiiXiaYDC2b845c2RnNSJL/go-libp2p-kbucket" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - loggables "gx/ipfs/QmT4PgCNdv73hnFAqzHqwW44q7M9PWpykSswHDxndquZbc/go-libp2p-loggables" - dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - ggio "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/io" - host "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" -) - -const ProtocolSNR = "/ipfs/supernoderouting" - -var log = logging.Logger("supernode/proxy") - -type Proxy interface { - Bootstrap(context.Context) error - HandleStream(inet.Stream) - SendMessage(ctx context.Context, m *dhtpb.Message) error - SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) -} - -type standard struct { - Host host.Host - - remoteInfos []pstore.PeerInfo // addr required for bootstrapping - remoteIDs []peer.ID // []ID is required for each req. here, cached for performance. -} - -func Standard(h host.Host, remotes []pstore.PeerInfo) Proxy { - var ids []peer.ID - for _, remote := range remotes { - ids = append(ids, remote.ID) - } - return &standard{h, remotes, ids} -} - -func (px *standard) Bootstrap(ctx context.Context) error { - var cxns []pstore.PeerInfo - for _, info := range px.remoteInfos { - if err := px.Host.Connect(ctx, info); err != nil { - continue - } - cxns = append(cxns, info) - } - if len(cxns) == 0 { - log.Error("unable to bootstrap to any supernode routers") - } else { - log.Infof("bootstrapped to %d supernode routers: %s", len(cxns), cxns) - } - return nil -} - -func (p *standard) HandleStream(s inet.Stream) { - // TODO(brian): Should clients be able to satisfy requests? - log.Error("supernode client received (dropped) a routing message from", s.Conn().RemotePeer()) - s.Reset() -} - -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 -} - -func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote peer.ID) (err error) { - e := log.EventBegin(ctx, "sendRoutingMessage", px.Host.ID(), remote, m) - defer func() { - if err != nil { - e.SetError(err) - } - e.Done() - }() - if err = px.Host.Connect(ctx, pstore.PeerInfo{ID: remote}); err != nil { - return err - } - s, err := px.Host.NewStream(ctx, remote, ProtocolSNR) - if err != nil { - return err - } - pbw := ggio.NewDelimitedWriter(s) - - err = pbw.WriteMsg(m) - if err == nil { - s.Close() - } else { - s.Reset() - } - return err -} - -// SendRequest sends the request to each remote sequentially (randomized order), -// stopping after the first successful response. If all fail, returns the last -// error. -func (px *standard) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { - var err error - for _, remote := range sortedByKey(px.remoteIDs, m.GetKey()) { - var reply *dhtpb.Message - reply, err = px.sendRequest(ctx, m, remote) // careful don't redeclare err! - if err != nil { - continue - } - return reply, nil // success - } - return nil, err // NB: returns the last error -} - -func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote peer.ID) (*dhtpb.Message, error) { - e := log.EventBegin(ctx, "sendRoutingRequest", px.Host.ID(), remote, logging.Pair("request", m)) - defer e.Done() - if err := px.Host.Connect(ctx, pstore.PeerInfo{ID: remote}); err != nil { - e.SetError(err) - return nil, err - } - s, err := px.Host.NewStream(ctx, remote, ProtocolSNR) - if err != nil { - e.SetError(err) - return nil, err - } - defer s.Close() - r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) - w := ggio.NewDelimitedWriter(s) - if err = w.WriteMsg(m); err != nil { - s.Reset() - e.SetError(err) - return nil, err - } - - response := &dhtpb.Message{} - if err = r.ReadMsg(response); err != nil { - s.Reset() - e.SetError(err) - return nil, err - } - // need ctx expiration? - if response == nil { - s.Reset() - err := errors.New("no response to request") - e.SetError(err) - return nil, err - } - e.Append(logging.Pair("response", response)) - e.Append(logging.Pair("uuid", loggables.Uuid("foo"))) - return response, nil -} - -func sortedByKey(peers []peer.ID, skey string) []peer.ID { - target := kbucket.ConvertKey(skey) - return kbucket.SortClosestPeers(peers, target) -} diff --git a/routing/supernode/server.go b/routing/supernode/server.go deleted file mode 100644 index 592cd0732f..0000000000 --- a/routing/supernode/server.go +++ /dev/null @@ -1,202 +0,0 @@ -package supernode - -import ( - "context" - "errors" - "fmt" - - proxy "github.com/ipfs/go-ipfs/routing/supernode/proxy" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" - datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" -) - -// Server handles routing queries using a database backend -type Server struct { - local peer.ID - routingBackend datastore.Datastore - peerstore pstore.Peerstore - *proxy.Loopback // so server can be injected into client -} - -// NewServer creates a new Supernode routing Server -func NewServer(ds datastore.Datastore, ps pstore.Peerstore, local peer.ID) (*Server, error) { - s := &Server{local, ds, ps, nil} - s.Loopback = &proxy.Loopback{ - Handler: s, - Local: local, - } - return s, nil -} - -func (_ *Server) Bootstrap(ctx context.Context) error { - return nil -} - -// HandleLocalRequest implements the proxy.RequestHandler interface. This is -// where requests are received from the outside world. -func (s *Server) HandleRequest(ctx context.Context, p peer.ID, req *dhtpb.Message) *dhtpb.Message { - _, response := s.handleMessage(ctx, p, req) // ignore response peer. it's local. - return response -} - -func (s *Server) handleMessage( - ctx context.Context, p peer.ID, req *dhtpb.Message) (peer.ID, *dhtpb.Message) { - - defer log.EventBegin(ctx, "routingMessageReceived", req, p).Done() - - var response = dhtpb.NewMessage(req.GetType(), req.GetKey(), req.GetClusterLevel()) - switch req.GetType() { - - case dhtpb.Message_GET_VALUE: - rawRecord, err := getRoutingRecord(s.routingBackend, req.GetKey()) - if err != nil { - return "", nil - } - response.Record = rawRecord - return p, response - - case dhtpb.Message_PUT_VALUE: - // FIXME: verify complains that the peer's ID is not present in the - // peerstore. Mocknet problem? - // if err := verify(s.peerstore, req.GetRecord()); err != nil { - // log.Event(ctx, "validationFailed", req, p) - // return "", nil - // } - putRoutingRecord(s.routingBackend, req.GetKey(), req.GetRecord()) - return p, req - - case dhtpb.Message_FIND_NODE: - p := s.peerstore.PeerInfo(peer.ID(req.GetKey())) - pri := []dhtpb.PeerRoutingInfo{ - { - PeerInfo: p, - // Connectedness: TODO - }, - } - response.CloserPeers = dhtpb.PeerRoutingInfosToPBPeers(pri) - return p.ID, response - - case dhtpb.Message_ADD_PROVIDER: - for _, provider := range req.GetProviderPeers() { - providerID := peer.ID(provider.GetId()) - if providerID == p { - store := []*dhtpb.Message_Peer{provider} - storeProvidersToPeerstore(s.peerstore, p, store) - if err := putRoutingProviders(s.routingBackend, req.GetKey(), store); err != nil { - return "", nil - } - } else { - log.Event(ctx, "addProviderBadRequest", p, req) - } - } - return "", nil - - case dhtpb.Message_GET_PROVIDERS: - providers, err := getRoutingProviders(s.routingBackend, req.GetKey()) - if err != nil { - return "", nil - } - response.ProviderPeers = providers - return p, response - - case dhtpb.Message_PING: - return p, req - default: - } - return "", nil -} - -var _ proxy.RequestHandler = &Server{} -var _ proxy.Proxy = &Server{} - -func getRoutingRecord(ds datastore.Datastore, k string) (*pb.Record, error) { - dskey := dshelp.NewKeyFromBinary([]byte(k)) - val, err := ds.Get(dskey) - if err != nil { - return nil, err - } - recordBytes, ok := val.([]byte) - if !ok { - return nil, fmt.Errorf("datastore had non byte-slice value for %v", dskey) - } - var record pb.Record - if err := proto.Unmarshal(recordBytes, &record); err != nil { - return nil, errors.New("failed to unmarshal dht record from datastore") - } - return &record, nil -} - -func putRoutingRecord(ds datastore.Datastore, k string, value *pb.Record) error { - data, err := proto.Marshal(value) - if err != nil { - return err - } - dskey := dshelp.NewKeyFromBinary([]byte(k)) - // TODO namespace - return ds.Put(dskey, data) -} - -func putRoutingProviders(ds datastore.Datastore, k string, newRecords []*dhtpb.Message_Peer) error { - log.Event(context.Background(), "putRoutingProviders") - oldRecords, err := getRoutingProviders(ds, k) - if err != nil { - return err - } - mergedRecords := make(map[string]*dhtpb.Message_Peer) - for _, provider := range oldRecords { - mergedRecords[provider.GetId()] = provider // add original records - } - for _, provider := range newRecords { - mergedRecords[provider.GetId()] = provider // overwrite old record if new exists - } - var protomsg dhtpb.Message - protomsg.ProviderPeers = make([]*dhtpb.Message_Peer, 0, len(mergedRecords)) - for _, provider := range mergedRecords { - protomsg.ProviderPeers = append(protomsg.ProviderPeers, provider) - } - data, err := proto.Marshal(&protomsg) - if err != nil { - return err - } - return ds.Put(providerKey(k), data) -} - -func storeProvidersToPeerstore(ps pstore.Peerstore, p peer.ID, providers []*dhtpb.Message_Peer) { - for _, provider := range providers { - providerID := peer.ID(provider.GetId()) - if providerID != p { - log.Errorf("provider message came from third-party %s", p) - continue - } - for _, maddr := range provider.Addresses() { - // as a router, we want to store addresses for peers who have provided - ps.AddAddr(p, maddr, pstore.AddressTTL) - } - } -} - -func getRoutingProviders(ds datastore.Datastore, k string) ([]*dhtpb.Message_Peer, error) { - e := log.EventBegin(context.Background(), "getProviders") - defer e.Done() - var providers []*dhtpb.Message_Peer - if v, err := ds.Get(providerKey(k)); err == nil { - if data, ok := v.([]byte); ok { - var msg dhtpb.Message - if err := proto.Unmarshal(data, &msg); err != nil { - return nil, err - } - providers = append(providers, msg.GetProviderPeers()...) - } - } - return providers, nil -} - -func providerKey(k string) datastore.Key { - return datastore.KeyWithNamespaces([]string{"routing", "providers", k}) -} diff --git a/routing/supernode/server_test.go b/routing/supernode/server_test.go deleted file mode 100644 index 348fbe3926..0000000000 --- a/routing/supernode/server_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package supernode - -import ( - "testing" - - dhtpb "gx/ipfs/QmT7PnPxYkeKPCG8pAnucfcjrXc15Q7FgvFv7YC24EPrw8/go-libp2p-kad-dht/pb" - datastore "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" -) - -func TestPutProviderDoesntResultInDuplicates(t *testing.T) { - routingBackend := datastore.NewMapDatastore() - k := "foo" - put := []*dhtpb.Message_Peer{ - convPeer("bob", "127.0.0.1/tcp/4001"), - convPeer("alice", "10.0.0.10/tcp/4001"), - } - if err := putRoutingProviders(routingBackend, k, put); err != nil { - t.Fatal(err) - } - if err := putRoutingProviders(routingBackend, k, put); err != nil { - t.Fatal(err) - } - - got, err := getRoutingProviders(routingBackend, k) - if err != nil { - t.Fatal(err) - } - if len(got) != 2 { - t.Fatal("should be 2 values, but there are", len(got)) - } -} - -func convPeer(name string, addrs ...string) *dhtpb.Message_Peer { - var rawAddrs [][]byte - for _, addr := range addrs { - rawAddrs = append(rawAddrs, []byte(addr)) - } - return &dhtpb.Message_Peer{Id: &name, Addrs: rawAddrs} -} From 1522cf05171e46ec19da15305426692e3a57e6ca Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 6 Oct 2017 08:42:59 -0700 Subject: [PATCH 1733/3147] update deps for new connmgr code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@de5141478619b23ddb5e584980879bbc7526eb78 --- namesys/publisher_test.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 28635f3bfc..3149b3e485 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -10,9 +10,9 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 2a71875373..5078c704ab 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmRQ76P5dgvxTujhfPsCRAG83rC15jgb1G9bKLuomuC6dQ/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/Qmbgce14YTWE2qhE49JVvTBPaHTyz3FaFmqQPyuZAz6C28/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 7503ad3d7e..bb30a243a4 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" From 3cbca5580b4e01b5fc4ec4525990dee328633953 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 6 Oct 2017 08:42:59 -0700 Subject: [PATCH 1734/3147] update deps for new connmgr code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@c649b07ceeed976ef09646df1bc2195c9f456ba3 --- mfs/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 2dd199e8f9..1c21bd793f 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - ci "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil/ci" + ci "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil/ci" "context" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" From 4b81492c629965d8a4920ad3f63de29e5db793d7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 6 Oct 2017 08:42:59 -0700 Subject: [PATCH 1735/3147] update deps for new connmgr code License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-routing@dc82c3c14ad3dfd16f9aebd8834c087581890f55 --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline_test.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 407629299f..0614d2d77c 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,7 +6,7 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 02929a4cf6..c5f90d1d88 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,7 +6,7 @@ import ( "sync" "time" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 9ecba1181d..84f9fcbcff 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,7 +6,7 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 5dcbbd21db..3522c6f38f 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,7 +8,7 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" diff --git a/routing/none/none_client.go b/routing/none/none_client.go index ae9c6c352f..d0a00a0ee4 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -10,7 +10,7 @@ import ( routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - p2phost "gx/ipfs/QmaSxYRuMq4pkpBBG2CYaRrPx2z7NmMVEs34b9g61biQA6/go-libp2p-host" + p2phost "gx/ipfs/Qmc1XhrFEiSeBNn3mpfg6gEuYCt5im2gYmNVmncsvmpeAk/go-libp2p-host" ) type nilclient struct { diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index f922f399c6..9f5b3f0b23 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -3,8 +3,8 @@ package offline import ( "bytes" "context" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" "testing" ) From 7f16b33e24bd390da0dd32f53a93f4c51a51896d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 18 Oct 2017 20:10:22 +0200 Subject: [PATCH 1736/3147] gateway: fix seeker can't seek on specific files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-unixfs@6d459435f3c99ce2048baa775a6140fd559d69ce --- unixfs/io/pbdagreader.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 0b75fd916c..7ba63649ff 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -243,7 +243,16 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { return dr.Seek(noffset, io.SeekStart) case io.SeekEnd: noffset := int64(dr.pbdata.GetFilesize()) - offset - return dr.Seek(noffset, io.SeekStart) + n, err := dr.Seek(noffset, io.SeekStart) + + // Return negative number if we can't figure out the file size. Using io.EOF + // for this seems to be good(-enough) solution as it's only returned by + // precalcNextBuf when we step out of file range. + // This is needed for gateway to function properly + if err == io.EOF && *dr.pbdata.Type == ftpb.Data_File { + return -1, nil + } + return n, err default: return 0, errors.New("invalid whence") } From c6d1565a62ca06753ca5c5fa34b13a850fe0183f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 18 Oct 2017 22:25:36 +0200 Subject: [PATCH 1737/3147] gateway: custom seeker for files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-unixfs@f98d19ae1bb1e1b973787b9504b569c0e961ff2e --- unixfs/io/pbdagreader.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 7ba63649ff..dcd383460d 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -188,6 +188,9 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { if offset < 0 { return -1, errors.New("Invalid offset") } + if offset == dr.offset { + return offset, nil + } // Grab cached protobuf object (solely to make code look cleaner) pb := dr.pbdata @@ -239,6 +242,10 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { return offset, nil case io.SeekCurrent: // TODO: be smarter here + if offset == 0 { + return dr.offset, nil + } + noffset := dr.offset + offset return dr.Seek(noffset, io.SeekStart) case io.SeekEnd: From b1ba8f4df0417efeae025976462920459e439714 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 19 Oct 2017 07:51:55 -0700 Subject: [PATCH 1738/3147] gx update go-peerstream, go-libp2p-floodsub License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@fb512415880c09f5236b83441a6a403ac43f1593 --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 5078c704ab..be438b8389 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/Qmbgce14YTWE2qhE49JVvTBPaHTyz3FaFmqQPyuZAz6C28/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmefgzMbKZYsmHFkLqxgaTBG9ypeEjrdWRD5WXH4j1cWDL/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 5d3cc5cb43f19bfe3d9ed0e9f5a01d88f4c59f8f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sat, 5 Aug 2017 17:22:34 -0400 Subject: [PATCH 1739/3147] Test raw leaves in trickle dag tests. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@5a0548a024b75710449639fba990f90d1a7cf42f --- unixfs/mod/dagmodifier_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 314178dd5e..a79436b8d5 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -41,7 +41,11 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) t.Fatal(err) } - err = trickle.VerifyTrickleDagStructure(nd, dm.dagserv, h.DefaultLinksPerBlock, 4) + err = trickle.VerifyTrickleDagStructure(nd, trickle.VerifyParams{ + Getter: dm.dagserv, + Direct: h.DefaultLinksPerBlock, + LayerRepeat: 4, + }) if err != nil { t.Fatal(err) } From ed43d10ebb054949effab3483c13f11823cabe90 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 8 Aug 2017 01:56:49 -0400 Subject: [PATCH 1740/3147] Provide support for raw leaves in DAG modifier. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@e3ad5de807f518499064e58816000dfc5f8d784f --- unixfs/io/dagreader_test.go | 12 +- unixfs/mod/dagmodifier.go | 222 ++++++++++++++++++--------------- unixfs/mod/dagmodifier_test.go | 112 +++++++++++++---- unixfs/test/utils.go | 29 +++-- 4 files changed, 235 insertions(+), 140 deletions(-) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 3ac82fc5fa..85c805e9ce 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -17,7 +17,7 @@ import ( func TestBasicRead(t *testing.T) { dserv := testu.GetDAGServ() - inbuf, node := testu.GetRandomNode(t, dserv, 1024) + inbuf, node := testu.GetRandomNode(t, dserv, 1024, testu.ProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() @@ -44,7 +44,7 @@ func TestSeekAndRead(t *testing.T) { inbuf[i] = byte(i) } - node := testu.GetNode(t, dserv, inbuf) + node := testu.GetNode(t, dserv, inbuf, testu.ProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() @@ -84,7 +84,7 @@ func TestRelativeSeek(t *testing.T) { } inbuf[1023] = 1 // force the reader to be 1024 bytes - node := testu.GetNode(t, dserv, inbuf) + node := testu.GetNode(t, dserv, inbuf, testu.ProtoBufLeaves) reader, err := NewDagReader(ctx, node, dserv) if err != nil { @@ -160,7 +160,7 @@ func TestBadPBData(t *testing.T) { func TestMetadataNode(t *testing.T) { dserv := testu.GetDAGServ() - rdata, rnode := testu.GetRandomNode(t, dserv, 512) + rdata, rnode := testu.GetRandomNode(t, dserv, 512, testu.ProtoBufLeaves) _, err := dserv.Add(rnode) if err != nil { t.Fatal(err) @@ -203,7 +203,7 @@ func TestMetadataNode(t *testing.T) { func TestWriteTo(t *testing.T) { dserv := testu.GetDAGServ() - inbuf, node := testu.GetRandomNode(t, dserv, 1024) + inbuf, node := testu.GetRandomNode(t, dserv, 1024, testu.ProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() @@ -225,7 +225,7 @@ func TestWriteTo(t *testing.T) { func TestReaderSzie(t *testing.T) { dserv := testu.GetDAGServ() size := int64(1024) - _, node := testu.GetRandomNode(t, dserv, size) + _, node := testu.GetRandomNode(t, dserv, size, testu.ProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index e3955e20c0..5eaad4779d 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -40,6 +40,8 @@ type DagModifier struct { curWrOff uint64 wrBuf *bytes.Buffer + RawLeaves bool + read uio.DagReader } @@ -113,17 +115,7 @@ func (dm *DagModifier) expandSparse(size int64) error { return err } _, err = dm.dagserv.Add(nnode) - if err != nil { - return err - } - - pbnnode, ok := nnode.(*mdag.ProtoNode) - if !ok { - return mdag.ErrNotProtobuf - } - - dm.curNode = pbnnode - return nil + return err } // Write continues writing to the dag at the current offset @@ -149,26 +141,28 @@ func (dm *DagModifier) Write(b []byte) (int, error) { return n, nil } -var ErrNoRawYet = fmt.Errorf("currently only fully support protonodes in the dagmodifier") - // Size returns the Filesize of the node func (dm *DagModifier) Size() (int64, error) { - switch nd := dm.curNode.(type) { + fileSize, err := fileSize(dm.curNode) + if err != nil { + return 0, err + } + if dm.wrBuf != nil && int64(dm.wrBuf.Len())+int64(dm.writeStart) > int64(fileSize) { + return int64(dm.wrBuf.Len()) + int64(dm.writeStart), nil + } + return int64(fileSize), nil +} + +func fileSize(n node.Node) (uint64, error) { + switch nd := n.(type) { case *mdag.ProtoNode: - pbn, err := ft.FromBytes(nd.Data()) + f, err := ft.FromBytes(nd.Data()) if err != nil { return 0, err } - if dm.wrBuf != nil && uint64(dm.wrBuf.Len())+dm.writeStart > pbn.GetFilesize() { - return int64(dm.wrBuf.Len()) + int64(dm.writeStart), nil - } - return int64(pbn.GetFilesize()), nil + return f.GetFilesize(), nil case *mdag.RawNode: - if dm.wrBuf != nil { - return 0, ErrNoRawYet - } - sz, err := nd.Size() - return int64(sz), err + return uint64(len(nd.RawData())), nil default: return 0, ErrNotUnixfs } @@ -196,36 +190,22 @@ func (dm *DagModifier) Sync() error { return err } - nd, err := dm.dagserv.Get(dm.ctx, thisc) + dm.curNode, err = dm.dagserv.Get(dm.ctx, thisc) if err != nil { return err } - pbnd, ok := nd.(*mdag.ProtoNode) - if !ok { - return mdag.ErrNotProtobuf - } - - dm.curNode = pbnd - // need to write past end of current dag if !done { - nd, err := dm.appendData(dm.curNode, dm.splitter(dm.wrBuf)) + dm.curNode, err = dm.appendData(dm.curNode, dm.splitter(dm.wrBuf)) if err != nil { return err } - _, err = dm.dagserv.Add(nd) + _, err = dm.dagserv.Add(dm.curNode) if err != nil { return err } - - pbnode, ok := nd.(*mdag.ProtoNode) - if !ok { - return mdag.ErrNotProtobuf - } - - dm.curNode = pbnode } dm.writeStart += uint64(buflen) @@ -238,43 +218,86 @@ func (dm *DagModifier) Sync() error { // returns the new key of the passed in node and whether or not all the data in the reader // has been consumed. func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) { - node, ok := n.(*mdag.ProtoNode) - if !ok { - return nil, false, ErrNoRawYet - } + // If we've reached a leaf node. + if len(n.Links()) == 0 { + switch nd0 := n.(type) { + case *mdag.ProtoNode: + f, err := ft.FromBytes(nd0.Data()) + if err != nil { + return nil, false, err + } - f, err := ft.FromBytes(node.Data()) - if err != nil { - return nil, false, err - } + n, err := data.Read(f.Data[offset:]) + if err != nil && err != io.EOF { + return nil, false, err + } - // If we've reached a leaf node. - if len(node.Links()) == 0 { - n, err := data.Read(f.Data[offset:]) - if err != nil && err != io.EOF { - return nil, false, err - } + // Update newly written node.. + b, err := proto.Marshal(f) + if err != nil { + return nil, false, err + } - // Update newly written node.. - b, err := proto.Marshal(f) - if err != nil { - return nil, false, err - } + nd := new(mdag.ProtoNode) + nd.SetData(b) + k, err := dm.dagserv.Add(nd) + if err != nil { + return nil, false, err + } - nd := new(mdag.ProtoNode) - nd.SetData(b) - k, err := dm.dagserv.Add(nd) - if err != nil { - return nil, false, err - } + // Hey look! we're done! + var done bool + if n < len(f.Data[offset:]) { + done = true + } + + return k, done, nil + case *mdag.RawNode: + origData := nd0.RawData() + bytes := make([]byte, len(origData)) - // Hey look! we're done! - var done bool - if n < len(f.Data[offset:]) { - done = true + // copy orig data up to offset + copy(bytes, origData[:offset]) + + // copy in new data + n, err := data.Read(bytes[offset:]) + if err != nil && err != io.EOF { + return nil, false, err + } + + // copy remaining data + offsetPlusN := int(offset) + n + if offsetPlusN < len(origData) { + copy(bytes[offsetPlusN:], origData[offsetPlusN:]) + } + + nd, err := mdag.NewRawNodeWPrefix(bytes, nd0.Cid().Prefix()) + if err != nil { + return nil, false, err + } + k, err := dm.dagserv.Add(nd) + if err != nil { + return nil, false, err + } + + // Hey look! we're done! + var done bool + if n < len(bytes[offset:]) { + done = true + } + + return k, done, nil } + } - return k, done, nil + node, ok := n.(*mdag.ProtoNode) + if !ok { + return nil, false, ErrNotUnixfs + } + + f, err := ft.FromBytes(node.Data()) + if err != nil { + return nil, false, err } var cur uint64 @@ -287,12 +310,7 @@ func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*c return nil, false, err } - childpb, ok := child.(*mdag.ProtoNode) - if !ok { - return nil, false, mdag.ErrNotProtobuf - } - - k, sdone, err := dm.modifyDag(childpb, offset-cur, data) + k, sdone, err := dm.modifyDag(child, offset-cur, data) if err != nil { return nil, false, err } @@ -323,14 +341,13 @@ func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*c // appendData appends the blocks from the given chan to the end of this dag func (dm *DagModifier) appendData(nd node.Node, spl chunk.Splitter) (node.Node, error) { switch nd := nd.(type) { - case *mdag.ProtoNode: + case *mdag.ProtoNode, *mdag.RawNode: dbp := &help.DagBuilderParams{ - Dagserv: dm.dagserv, - Maxlinks: help.DefaultLinksPerBlock, + Dagserv: dm.dagserv, + Maxlinks: help.DefaultLinksPerBlock, + RawLeaves: dm.RawLeaves, } return trickle.TrickleAppend(dm.ctx, nd, dbp.New(spl)) - case *mdag.RawNode: - return nil, fmt.Errorf("appending to raw node types not yet supported") default: return nil, ErrNotUnixfs } @@ -478,26 +495,30 @@ func (dm *DagModifier) Truncate(size int64) error { } // dagTruncate truncates the given node to 'size' and returns the modified Node -func dagTruncate(ctx context.Context, n node.Node, size uint64, ds mdag.DAGService) (*mdag.ProtoNode, error) { - nd, ok := n.(*mdag.ProtoNode) - if !ok { - return nil, ErrNoRawYet - } - - if len(nd.Links()) == 0 { - // TODO: this can likely be done without marshaling and remarshaling - pbn, err := ft.FromBytes(nd.Data()) - if err != nil { - return nil, err +func dagTruncate(ctx context.Context, n node.Node, size uint64, ds mdag.DAGService) (node.Node, error) { + if len(n.Links()) == 0 { + switch nd := n.(type) { + case *mdag.ProtoNode: + // TODO: this can likely be done without marshaling and remarshaling + pbn, err := ft.FromBytes(nd.Data()) + if err != nil { + return nil, err + } + nd.SetData(ft.WrapData(pbn.Data[:size])) + return nd, nil + case *mdag.RawNode: + return mdag.NewRawNodeWPrefix(nd.RawData()[:size], nd.Cid().Prefix()) } + } - nd.SetData(ft.WrapData(pbn.Data[:size])) - return nd, nil + nd, ok := n.(*mdag.ProtoNode) + if !ok { + return nil, ErrNotUnixfs } var cur uint64 end := 0 - var modified *mdag.ProtoNode + var modified node.Node ndata := new(ft.FSNode) for i, lnk := range nd.Links() { child, err := lnk.GetNode(ctx, ds) @@ -505,19 +526,14 @@ func dagTruncate(ctx context.Context, n node.Node, size uint64, ds mdag.DAGServi return nil, err } - childpb, ok := child.(*mdag.ProtoNode) - if !ok { - return nil, err - } - - childsize, err := ft.DataSize(childpb.Data()) + childsize, err := fileSize(child) if err != nil { return nil, err } // found the child we want to cut if size < cur+childsize { - nchild, err := dagTruncate(ctx, childpb, size-cur, ds) + nchild, err := dagTruncate(ctx, child, size-cur, ds) if err != nil { return nil, err } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index a79436b8d5..7b15b8532d 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -9,15 +9,14 @@ import ( h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" - mdag "github.com/ipfs/go-ipfs/merkledag" - ft "github.com/ipfs/go-ipfs/unixfs" + uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" ) -func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) []byte { +func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, rawLeaves testu.UseRawLeaves) []byte { newdata := make([]byte, size) r := u.NewTimeSeededRand() r.Read(newdata) @@ -45,9 +44,10 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) Getter: dm.dagserv, Direct: h.DefaultLinksPerBlock, LayerRepeat: 4, + RawLeaves: bool(rawLeaves), }) if err != nil { - t.Fatal(err) + t.Error(err) } rd, err := uio.NewDagReader(context.Background(), nd, dm.dagserv) @@ -67,9 +67,17 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier) return orig } +func runBothSubtests(t *testing.T, tfunc func(*testing.T, testu.UseRawLeaves)) { + t.Run("leaves=ProtoBuf", func(t *testing.T) { tfunc(t, testu.ProtoBufLeaves) }) + t.Run("leaves=Raw", func(t *testing.T) { tfunc(t, testu.RawLeaves) }) +} + func TestDagModifierBasic(t *testing.T) { + runBothSubtests(t, testDagModifierBasic) +} +func testDagModifierBasic(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - b, n := testu.GetRandomNode(t, dserv, 50000) + b, n := testu.GetRandomNode(t, dserv, 50000, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -77,32 +85,33 @@ func TestDagModifierBasic(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) // Within zero block beg := uint64(15) length := uint64(60) t.Log("Testing mod within zero block") - b = testModWrite(t, beg, length, b, dagmod) + b = testModWrite(t, beg, length, b, dagmod, rawLeaves) // Within bounds of existing file beg = 1000 length = 4000 t.Log("Testing mod within bounds of existing multiblock file.") - b = testModWrite(t, beg, length, b, dagmod) + b = testModWrite(t, beg, length, b, dagmod, rawLeaves) // Extend bounds beg = 49500 length = 4000 t.Log("Testing mod that extends file.") - b = testModWrite(t, beg, length, b, dagmod) + b = testModWrite(t, beg, length, b, dagmod, rawLeaves) // "Append" beg = uint64(len(b)) length = 3000 t.Log("Testing pure append") - _ = testModWrite(t, beg, length, b, dagmod) + _ = testModWrite(t, beg, length, b, dagmod, rawLeaves) // Verify reported length node, err := dagmod.GetNode() @@ -110,7 +119,7 @@ func TestDagModifierBasic(t *testing.T) { t.Fatal(err) } - size, err := ft.DataSize(node.(*mdag.ProtoNode).Data()) + size, err := fileSize(node) if err != nil { t.Fatal(err) } @@ -122,8 +131,11 @@ func TestDagModifierBasic(t *testing.T) { } func TestMultiWrite(t *testing.T) { + runBothSubtests(t, testMultiWrite) +} +func testMultiWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -132,6 +144,7 @@ func TestMultiWrite(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) data := make([]byte, 4000) u.NewTimeSeededRand().Read(data) @@ -175,8 +188,11 @@ func TestMultiWrite(t *testing.T) { } func TestMultiWriteAndFlush(t *testing.T) { + runBothSubtests(t, testMultiWriteAndFlush) +} +func testMultiWriteAndFlush(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -185,6 +201,7 @@ func TestMultiWriteAndFlush(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) data := make([]byte, 20) u.NewTimeSeededRand().Read(data) @@ -223,8 +240,11 @@ func TestMultiWriteAndFlush(t *testing.T) { } func TestWriteNewFile(t *testing.T) { + runBothSubtests(t, testWriteNewFile) +} +func testWriteNewFile(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -233,6 +253,7 @@ func TestWriteNewFile(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) towrite := make([]byte, 2000) u.NewTimeSeededRand().Read(towrite) @@ -266,8 +287,11 @@ func TestWriteNewFile(t *testing.T) { } func TestMultiWriteCoal(t *testing.T) { + runBothSubtests(t, testMultiWriteCoal) +} +func testMultiWriteCoal(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -276,6 +300,7 @@ func TestMultiWriteCoal(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) data := make([]byte, 1000) u.NewTimeSeededRand().Read(data) @@ -300,6 +325,8 @@ func TestMultiWriteCoal(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) + rbuf, err := ioutil.ReadAll(read) if err != nil { t.Fatal(err) @@ -312,8 +339,11 @@ func TestMultiWriteCoal(t *testing.T) { } func TestLargeWriteChunks(t *testing.T) { + runBothSubtests(t, testLargeWriteChunks) +} +func testLargeWriteChunks(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -322,6 +352,7 @@ func TestLargeWriteChunks(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) wrsize := 1000 datasize := 10000000 @@ -351,8 +382,11 @@ func TestLargeWriteChunks(t *testing.T) { } func TestDagTruncate(t *testing.T) { + runBothSubtests(t, testDagTruncate) +} +func testDagTruncate(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - b, n := testu.GetRandomNode(t, dserv, 50000) + b, n := testu.GetRandomNode(t, dserv, 50000, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -360,6 +394,7 @@ func TestDagTruncate(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) err = dagmod.Truncate(12345) if err != nil { @@ -418,8 +453,11 @@ func TestDagTruncate(t *testing.T) { } func TestSparseWrite(t *testing.T) { + runBothSubtests(t, testSparseWrite) +} +func testSparseWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -427,6 +465,7 @@ func TestSparseWrite(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) buf := make([]byte, 5000) u.NewTimeSeededRand().Read(buf[2500:]) @@ -456,8 +495,11 @@ func TestSparseWrite(t *testing.T) { } func TestSeekPastEndWrite(t *testing.T) { + runBothSubtests(t, testSeekPastEndWrite) +} +func testSeekPastEndWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -465,6 +507,7 @@ func TestSeekPastEndWrite(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) buf := make([]byte, 5000) u.NewTimeSeededRand().Read(buf[2500:]) @@ -503,8 +546,11 @@ func TestSeekPastEndWrite(t *testing.T) { } func TestRelativeSeek(t *testing.T) { + runBothSubtests(t, testRelativeSeek) +} +func testRelativeSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -512,6 +558,7 @@ func TestRelativeSeek(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) for i := 0; i < 64; i++ { dagmod.Write([]byte{byte(i)}) @@ -533,8 +580,11 @@ func TestRelativeSeek(t *testing.T) { } func TestInvalidSeek(t *testing.T) { + runBothSubtests(t, testInvalidSeek) +} +func testInvalidSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -542,6 +592,8 @@ func TestInvalidSeek(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) + _, err = dagmod.Seek(10, -10) if err != ErrUnrecognizedWhence { @@ -550,9 +602,12 @@ func TestInvalidSeek(t *testing.T) { } func TestEndSeek(t *testing.T) { + runBothSubtests(t, testEndSeek) +} +func testEndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -560,6 +615,7 @@ func TestEndSeek(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) _, err = dagmod.Write(make([]byte, 100)) if err != nil { @@ -592,9 +648,12 @@ func TestEndSeek(t *testing.T) { } func TestReadAndSeek(t *testing.T) { + runBothSubtests(t, testReadAndSeek) +} +func testReadAndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -602,6 +661,7 @@ func TestReadAndSeek(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) writeBuf := []byte{0, 1, 2, 3, 4, 5, 6, 7} dagmod.Write(writeBuf) @@ -660,9 +720,12 @@ func TestReadAndSeek(t *testing.T) { } func TestCtxRead(t *testing.T) { + runBothSubtests(t, testCtxRead) +} +func testCtxRead(t *testing.T, rawLeaves testu.UseRawLeaves) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv) + n := testu.GetEmptyNode(t, dserv, rawLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -670,6 +733,7 @@ func TestCtxRead(t *testing.T) { if err != nil { t.Fatal(err) } + dagmod.RawLeaves = bool(rawLeaves) _, err = dagmod.Write([]byte{0, 1, 2, 3, 4, 5, 6, 7}) if err != nil { @@ -693,7 +757,7 @@ func TestCtxRead(t *testing.T) { func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(b, dserv) + n := testu.GetEmptyNode(b, dserv, testu.ProtoBufLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index c0b8ae18d0..933493f367 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -8,8 +8,9 @@ import ( "io/ioutil" "testing" - imp "github.com/ipfs/go-ipfs/importer" "github.com/ipfs/go-ipfs/importer/chunk" + h "github.com/ipfs/go-ipfs/importer/helpers" + trickle "github.com/ipfs/go-ipfs/importer/trickle" mdag "github.com/ipfs/go-ipfs/merkledag" mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" @@ -28,9 +29,23 @@ func GetDAGServ() mdag.DAGService { return mdagmock.Mock() } -func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) node.Node { +type UseRawLeaves bool + +const ( + ProtoBufLeaves UseRawLeaves = false + RawLeaves UseRawLeaves = true +) + +func GetNode(t testing.TB, dserv mdag.DAGService, data []byte, rawLeaves UseRawLeaves) node.Node { in := bytes.NewReader(data) - node, err := imp.BuildTrickleDagFromReader(dserv, SizeSplitterGen(500)(in)) + + dbp := h.DagBuilderParams{ + Dagserv: dserv, + Maxlinks: h.DefaultLinksPerBlock, + RawLeaves: bool(rawLeaves), + } + + node, err := trickle.TrickleLayout(dbp.New(SizeSplitterGen(500)(in))) if err != nil { t.Fatal(err) } @@ -38,18 +53,18 @@ func GetNode(t testing.TB, dserv mdag.DAGService, data []byte) node.Node { return node } -func GetEmptyNode(t testing.TB, dserv mdag.DAGService) node.Node { - return GetNode(t, dserv, []byte{}) +func GetEmptyNode(t testing.TB, dserv mdag.DAGService, rawLeaves UseRawLeaves) node.Node { + return GetNode(t, dserv, []byte{}, rawLeaves) } -func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64) ([]byte, node.Node) { +func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64, rawLeaves UseRawLeaves) ([]byte, node.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) buf, err := ioutil.ReadAll(in) if err != nil { t.Fatal(err) } - node := GetNode(t, dserv, buf) + node := GetNode(t, dserv, buf, rawLeaves) return buf, node } From 90941cbccd392e1dd3aff47d07b583c5c2607129 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 8 Aug 2017 14:33:47 -0400 Subject: [PATCH 1741/3147] Add "--raw-leaves" option to "ipfs files" License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@2e660e8fa590886edcb10911d55c08ed5b55e18c --- mfs/file.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mfs/file.go b/mfs/file.go index 6e249e3294..85c9e59bc2 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -23,6 +23,8 @@ type File struct { dserv dag.DAGService node node.Node nodelk sync.Mutex + + RawLeaves bool } // NewFile returns a NewFile object with the given parameters @@ -79,6 +81,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { if err != nil { return nil, err } + dmod.RawLeaves = fi.RawLeaves return &fileDescriptor{ inode: fi, From 3a8feec6d443a70efa813982140d25927767fa7c Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 8 Aug 2017 18:19:46 -0400 Subject: [PATCH 1742/3147] Enable CidV1 (and other prefixes) in the Dag Modifier. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@109d1983cab5fc6c0bff9518dff05eb781175551 --- unixfs/io/dagreader_test.go | 12 +- unixfs/mod/dagmodifier.go | 24 +++- unixfs/mod/dagmodifier_test.go | 247 ++++++++++++++------------------- unixfs/test/utils.go | 29 ++-- 4 files changed, 151 insertions(+), 161 deletions(-) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 85c805e9ce..a5ed6dd396 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -17,7 +17,7 @@ import ( func TestBasicRead(t *testing.T) { dserv := testu.GetDAGServ() - inbuf, node := testu.GetRandomNode(t, dserv, 1024, testu.ProtoBufLeaves) + inbuf, node := testu.GetRandomNode(t, dserv, 1024, testu.UseProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() @@ -44,7 +44,7 @@ func TestSeekAndRead(t *testing.T) { inbuf[i] = byte(i) } - node := testu.GetNode(t, dserv, inbuf, testu.ProtoBufLeaves) + node := testu.GetNode(t, dserv, inbuf, testu.UseProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() @@ -84,7 +84,7 @@ func TestRelativeSeek(t *testing.T) { } inbuf[1023] = 1 // force the reader to be 1024 bytes - node := testu.GetNode(t, dserv, inbuf, testu.ProtoBufLeaves) + node := testu.GetNode(t, dserv, inbuf, testu.UseProtoBufLeaves) reader, err := NewDagReader(ctx, node, dserv) if err != nil { @@ -160,7 +160,7 @@ func TestBadPBData(t *testing.T) { func TestMetadataNode(t *testing.T) { dserv := testu.GetDAGServ() - rdata, rnode := testu.GetRandomNode(t, dserv, 512, testu.ProtoBufLeaves) + rdata, rnode := testu.GetRandomNode(t, dserv, 512, testu.UseProtoBufLeaves) _, err := dserv.Add(rnode) if err != nil { t.Fatal(err) @@ -203,7 +203,7 @@ func TestMetadataNode(t *testing.T) { func TestWriteTo(t *testing.T) { dserv := testu.GetDAGServ() - inbuf, node := testu.GetRandomNode(t, dserv, 1024, testu.ProtoBufLeaves) + inbuf, node := testu.GetRandomNode(t, dserv, 1024, testu.UseProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() @@ -225,7 +225,7 @@ func TestWriteTo(t *testing.T) { func TestReaderSzie(t *testing.T) { dserv := testu.GetDAGServ() size := int64(1024) - _, node := testu.GetRandomNode(t, dserv, size, testu.ProtoBufLeaves) + _, node := testu.GetRandomNode(t, dserv, size, testu.UseProtoBufLeaves) ctx, closer := context.WithCancel(context.Background()) defer closer() diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 5eaad4779d..23c1945a50 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -40,6 +40,7 @@ type DagModifier struct { curWrOff uint64 wrBuf *bytes.Buffer + Prefix cid.Prefix RawLeaves bool read uio.DagReader @@ -47,6 +48,10 @@ type DagModifier struct { var ErrNotUnixfs = fmt.Errorf("dagmodifier only supports unixfs nodes (proto or raw)") +// NewDagModifier returns a new DagModifier, the Cid prefix for newly +// created nodes will be inherted from the passed in node. If the Cid +// version if not 0 raw leaves will also be enabled. The Prefix and +// RawLeaves options can be overridden by changing them after the call. func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { switch from.(type) { case *mdag.ProtoNode, *mdag.RawNode: @@ -55,11 +60,20 @@ func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, s return nil, ErrNotUnixfs } + prefix := from.Cid().Prefix() + prefix.Codec = cid.DagProtobuf + rawLeaves := false + if prefix.Version > 0 { + rawLeaves = true + } + return &DagModifier{ - curNode: from.Copy(), - dagserv: serv, - splitter: spl, - ctx: ctx, + curNode: from.Copy(), + dagserv: serv, + splitter: spl, + ctx: ctx, + Prefix: prefix, + RawLeaves: rawLeaves, }, nil } @@ -240,6 +254,7 @@ func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*c nd := new(mdag.ProtoNode) nd.SetData(b) + nd.SetPrefix(&nd0.Prefix) k, err := dm.dagserv.Add(nd) if err != nil { return nil, false, err @@ -345,6 +360,7 @@ func (dm *DagModifier) appendData(nd node.Node, spl chunk.Splitter) (node.Node, dbp := &help.DagBuilderParams{ Dagserv: dm.dagserv, Maxlinks: help.DefaultLinksPerBlock, + Prefix: &dm.Prefix, RawLeaves: dm.RawLeaves, } return trickle.TrickleAppend(dm.ctx, nd, dbp.New(spl)) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 7b15b8532d..1b1cc52f74 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -16,7 +16,7 @@ import ( u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" ) -func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, rawLeaves testu.UseRawLeaves) []byte { +func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, opts testu.NodeOpts) []byte { newdata := make([]byte, size) r := u.NewTimeSeededRand() r.Read(newdata) @@ -35,6 +35,12 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, t.Fatalf("Mod length not correct! %d != %d", nmod, size) } + verifyNode(t, orig, dm, opts) + + return orig +} + +func verifyNode(t *testing.T, orig []byte, dm *DagModifier, opts testu.NodeOpts) { nd, err := dm.GetNode() if err != nil { t.Fatal(err) @@ -44,10 +50,11 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, Getter: dm.dagserv, Direct: h.DefaultLinksPerBlock, LayerRepeat: 4, - RawLeaves: bool(rawLeaves), + Prefix: &opts.Prefix, + RawLeaves: opts.RawLeavesUsed, }) if err != nil { - t.Error(err) + t.Fatal(err) } rd, err := uio.NewDagReader(context.Background(), nd, dm.dagserv) @@ -64,20 +71,20 @@ func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, if err != nil { t.Fatal(err) } - return orig } -func runBothSubtests(t *testing.T, tfunc func(*testing.T, testu.UseRawLeaves)) { - t.Run("leaves=ProtoBuf", func(t *testing.T) { tfunc(t, testu.ProtoBufLeaves) }) - t.Run("leaves=Raw", func(t *testing.T) { tfunc(t, testu.RawLeaves) }) +func runAllSubtests(t *testing.T, tfunc func(*testing.T, testu.NodeOpts)) { + t.Run("opts=ProtoBufLeaves", func(t *testing.T) { tfunc(t, testu.UseProtoBufLeaves) }) + t.Run("opts=RawLeaves", func(t *testing.T) { tfunc(t, testu.UseRawLeaves) }) + t.Run("opts=CidV1", func(t *testing.T) { tfunc(t, testu.UseCidV1) }) } func TestDagModifierBasic(t *testing.T) { - runBothSubtests(t, testDagModifierBasic) + runAllSubtests(t, testDagModifierBasic) } -func testDagModifierBasic(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testDagModifierBasic(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - b, n := testu.GetRandomNode(t, dserv, 50000, rawLeaves) + b, n := testu.GetRandomNode(t, dserv, 50000, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -85,33 +92,35 @@ func testDagModifierBasic(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } // Within zero block beg := uint64(15) length := uint64(60) t.Log("Testing mod within zero block") - b = testModWrite(t, beg, length, b, dagmod, rawLeaves) + b = testModWrite(t, beg, length, b, dagmod, opts) // Within bounds of existing file beg = 1000 length = 4000 t.Log("Testing mod within bounds of existing multiblock file.") - b = testModWrite(t, beg, length, b, dagmod, rawLeaves) + b = testModWrite(t, beg, length, b, dagmod, opts) // Extend bounds beg = 49500 length = 4000 t.Log("Testing mod that extends file.") - b = testModWrite(t, beg, length, b, dagmod, rawLeaves) + b = testModWrite(t, beg, length, b, dagmod, opts) // "Append" beg = uint64(len(b)) length = 3000 t.Log("Testing pure append") - _ = testModWrite(t, beg, length, b, dagmod, rawLeaves) + _ = testModWrite(t, beg, length, b, dagmod, opts) // Verify reported length node, err := dagmod.GetNode() @@ -131,11 +140,11 @@ func testDagModifierBasic(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestMultiWrite(t *testing.T) { - runBothSubtests(t, testMultiWrite) + runAllSubtests(t, testMultiWrite) } -func testMultiWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testMultiWrite(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -144,7 +153,9 @@ func testMultiWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } data := make([]byte, 4000) u.NewTimeSeededRand().Read(data) @@ -167,32 +178,16 @@ func testMultiWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { t.Fatal("Size was reported incorrectly") } } - nd, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - read, err := uio.NewDagReader(context.Background(), nd, dserv) - if err != nil { - t.Fatal(err) - } - rbuf, err := ioutil.ReadAll(read) - if err != nil { - t.Fatal(err) - } - - err = testu.ArrComp(rbuf, data) - if err != nil { - t.Fatal(err) - } + verifyNode(t, data, dagmod, opts) } func TestMultiWriteAndFlush(t *testing.T) { - runBothSubtests(t, testMultiWriteAndFlush) + runAllSubtests(t, testMultiWriteAndFlush) } -func testMultiWriteAndFlush(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testMultiWriteAndFlush(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -201,7 +196,9 @@ func testMultiWriteAndFlush(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } data := make([]byte, 20) u.NewTimeSeededRand().Read(data) @@ -219,32 +216,16 @@ func testMultiWriteAndFlush(t *testing.T, rawLeaves testu.UseRawLeaves) { t.Fatal(err) } } - nd, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - read, err := uio.NewDagReader(context.Background(), nd, dserv) - if err != nil { - t.Fatal(err) - } - rbuf, err := ioutil.ReadAll(read) - if err != nil { - t.Fatal(err) - } - - err = testu.ArrComp(rbuf, data) - if err != nil { - t.Fatal(err) - } + verifyNode(t, data, dagmod, opts) } func TestWriteNewFile(t *testing.T) { - runBothSubtests(t, testWriteNewFile) + runAllSubtests(t, testWriteNewFile) } -func testWriteNewFile(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testWriteNewFile(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -253,7 +234,9 @@ func testWriteNewFile(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } towrite := make([]byte, 2000) u.NewTimeSeededRand().Read(towrite) @@ -266,32 +249,15 @@ func testWriteNewFile(t *testing.T, rawLeaves testu.UseRawLeaves) { t.Fatal("Wrote wrong amount") } - nd, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - - read, err := uio.NewDagReader(ctx, nd, dserv) - if err != nil { - t.Fatal(err) - } - - data, err := ioutil.ReadAll(read) - if err != nil { - t.Fatal(err) - } - - if err := testu.ArrComp(data, towrite); err != nil { - t.Fatal(err) - } + verifyNode(t, towrite, dagmod, opts) } func TestMultiWriteCoal(t *testing.T) { - runBothSubtests(t, testMultiWriteCoal) + runAllSubtests(t, testMultiWriteCoal) } -func testMultiWriteCoal(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testMultiWriteCoal(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -300,7 +266,9 @@ func testMultiWriteCoal(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } data := make([]byte, 1000) u.NewTimeSeededRand().Read(data) @@ -316,34 +284,16 @@ func testMultiWriteCoal(t *testing.T, rawLeaves testu.UseRawLeaves) { } } - nd, err := dagmod.GetNode() - if err != nil { - t.Fatal(err) - } - read, err := uio.NewDagReader(context.Background(), nd, dserv) - if err != nil { - t.Fatal(err) - } - dagmod.RawLeaves = bool(rawLeaves) - - rbuf, err := ioutil.ReadAll(read) - if err != nil { - t.Fatal(err) - } - - err = testu.ArrComp(rbuf, data) - if err != nil { - t.Fatal(err) - } + verifyNode(t, data, dagmod, opts) } func TestLargeWriteChunks(t *testing.T) { - runBothSubtests(t, testLargeWriteChunks) + runAllSubtests(t, testLargeWriteChunks) } -func testLargeWriteChunks(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testLargeWriteChunks(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -352,7 +302,9 @@ func testLargeWriteChunks(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } wrsize := 1000 datasize := 10000000 @@ -378,15 +330,14 @@ func testLargeWriteChunks(t *testing.T, rawLeaves testu.UseRawLeaves) { if err = testu.ArrComp(out, data); err != nil { t.Fatal(err) } - } func TestDagTruncate(t *testing.T) { - runBothSubtests(t, testDagTruncate) + runAllSubtests(t, testDagTruncate) } -func testDagTruncate(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testDagTruncate(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - b, n := testu.GetRandomNode(t, dserv, 50000, rawLeaves) + b, n := testu.GetRandomNode(t, dserv, 50000, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -394,7 +345,9 @@ func testDagTruncate(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } err = dagmod.Truncate(12345) if err != nil { @@ -453,11 +406,11 @@ func testDagTruncate(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestSparseWrite(t *testing.T) { - runBothSubtests(t, testSparseWrite) + runAllSubtests(t, testSparseWrite) } -func testSparseWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testSparseWrite(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -465,7 +418,9 @@ func testSparseWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } buf := make([]byte, 5000) u.NewTimeSeededRand().Read(buf[2500:]) @@ -495,11 +450,11 @@ func testSparseWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestSeekPastEndWrite(t *testing.T) { - runBothSubtests(t, testSeekPastEndWrite) + runAllSubtests(t, testSeekPastEndWrite) } -func testSeekPastEndWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testSeekPastEndWrite(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -507,7 +462,9 @@ func testSeekPastEndWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } buf := make([]byte, 5000) u.NewTimeSeededRand().Read(buf[2500:]) @@ -546,11 +503,11 @@ func testSeekPastEndWrite(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestRelativeSeek(t *testing.T) { - runBothSubtests(t, testRelativeSeek) + runAllSubtests(t, testRelativeSeek) } -func testRelativeSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testRelativeSeek(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -558,7 +515,9 @@ func testRelativeSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } for i := 0; i < 64; i++ { dagmod.Write([]byte{byte(i)}) @@ -580,11 +539,11 @@ func testRelativeSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestInvalidSeek(t *testing.T) { - runBothSubtests(t, testInvalidSeek) + runAllSubtests(t, testInvalidSeek) } -func testInvalidSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testInvalidSeek(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -592,7 +551,9 @@ func testInvalidSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } _, err = dagmod.Seek(10, -10) @@ -602,12 +563,12 @@ func testInvalidSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestEndSeek(t *testing.T) { - runBothSubtests(t, testEndSeek) + runAllSubtests(t, testEndSeek) } -func testEndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testEndSeek(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -615,7 +576,9 @@ func testEndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } _, err = dagmod.Write(make([]byte, 100)) if err != nil { @@ -648,12 +611,12 @@ func testEndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestReadAndSeek(t *testing.T) { - runBothSubtests(t, testReadAndSeek) + runAllSubtests(t, testReadAndSeek) } -func testReadAndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testReadAndSeek(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -661,7 +624,9 @@ func testReadAndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } writeBuf := []byte{0, 1, 2, 3, 4, 5, 6, 7} dagmod.Write(writeBuf) @@ -720,12 +685,12 @@ func testReadAndSeek(t *testing.T, rawLeaves testu.UseRawLeaves) { } func TestCtxRead(t *testing.T) { - runBothSubtests(t, testCtxRead) + runAllSubtests(t, testCtxRead) } -func testCtxRead(t *testing.T, rawLeaves testu.UseRawLeaves) { +func testCtxRead(t *testing.T, opts testu.NodeOpts) { dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(t, dserv, rawLeaves) + n := testu.GetEmptyNode(t, dserv, opts) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -733,7 +698,9 @@ func testCtxRead(t *testing.T, rawLeaves testu.UseRawLeaves) { if err != nil { t.Fatal(err) } - dagmod.RawLeaves = bool(rawLeaves) + if opts.ForceRawLeaves { + dagmod.RawLeaves = true + } _, err = dagmod.Write([]byte{0, 1, 2, 3, 4, 5, 6, 7}) if err != nil { @@ -757,7 +724,7 @@ func testCtxRead(t *testing.T, rawLeaves testu.UseRawLeaves) { func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := testu.GetDAGServ() - n := testu.GetEmptyNode(b, dserv, testu.ProtoBufLeaves) + n := testu.GetEmptyNode(b, dserv, testu.UseProtoBufLeaves) ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 933493f367..fc9a04be36 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -15,6 +15,7 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" ) @@ -29,20 +30,26 @@ func GetDAGServ() mdag.DAGService { return mdagmock.Mock() } -type UseRawLeaves bool +type NodeOpts struct { + Prefix cid.Prefix + // ForceRawLeaves if true will force the use of raw leaves + ForceRawLeaves bool + // RawLeavesUsed is true if raw leaves or either implicitly or explicitly enabled + RawLeavesUsed bool +} -const ( - ProtoBufLeaves UseRawLeaves = false - RawLeaves UseRawLeaves = true -) +var UseProtoBufLeaves = NodeOpts{Prefix: mdag.V0CidPrefix()} +var UseRawLeaves = NodeOpts{Prefix: mdag.V0CidPrefix(), ForceRawLeaves: true, RawLeavesUsed: true} +var UseCidV1 = NodeOpts{Prefix: mdag.V1CidPrefix(), RawLeavesUsed: true} -func GetNode(t testing.TB, dserv mdag.DAGService, data []byte, rawLeaves UseRawLeaves) node.Node { +func GetNode(t testing.TB, dserv mdag.DAGService, data []byte, opts NodeOpts) node.Node { in := bytes.NewReader(data) dbp := h.DagBuilderParams{ Dagserv: dserv, Maxlinks: h.DefaultLinksPerBlock, - RawLeaves: bool(rawLeaves), + Prefix: &opts.Prefix, + RawLeaves: opts.RawLeavesUsed, } node, err := trickle.TrickleLayout(dbp.New(SizeSplitterGen(500)(in))) @@ -53,18 +60,18 @@ func GetNode(t testing.TB, dserv mdag.DAGService, data []byte, rawLeaves UseRawL return node } -func GetEmptyNode(t testing.TB, dserv mdag.DAGService, rawLeaves UseRawLeaves) node.Node { - return GetNode(t, dserv, []byte{}, rawLeaves) +func GetEmptyNode(t testing.TB, dserv mdag.DAGService, opts NodeOpts) node.Node { + return GetNode(t, dserv, []byte{}, opts) } -func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64, rawLeaves UseRawLeaves) ([]byte, node.Node) { +func GetRandomNode(t testing.TB, dserv mdag.DAGService, size int64, opts NodeOpts) ([]byte, node.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) buf, err := ioutil.ReadAll(in) if err != nil { t.Fatal(err) } - node := GetNode(t, dserv, buf, rawLeaves) + node := GetNode(t, dserv, buf, opts) return buf, node } From a1af55c1896cb85a2123d695d1caad2b2a7b1de6 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 8 Aug 2017 18:20:56 -0400 Subject: [PATCH 1743/3147] Test for alternative hash function in Dag Modifier. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@95015163f834f4e9b47358b4461a31449bdfd09f --- unixfs/mod/dagmodifier_test.go | 1 + unixfs/test/utils.go | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 1b1cc52f74..473d34294c 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -77,6 +77,7 @@ func runAllSubtests(t *testing.T, tfunc func(*testing.T, testu.NodeOpts)) { t.Run("opts=ProtoBufLeaves", func(t *testing.T) { tfunc(t, testu.UseProtoBufLeaves) }) t.Run("opts=RawLeaves", func(t *testing.T) { tfunc(t, testu.UseRawLeaves) }) t.Run("opts=CidV1", func(t *testing.T) { tfunc(t, testu.UseCidV1) }) + t.Run("opts=Blake2b256", func(t *testing.T) { tfunc(t, testu.UseBlake2b256) }) } func TestDagModifierBasic(t *testing.T) { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index fc9a04be36..8b18ad9cd0 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -18,6 +18,7 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" ) func SizeSplitterGen(size int64) chunk.SplitterGen { @@ -41,6 +42,13 @@ type NodeOpts struct { var UseProtoBufLeaves = NodeOpts{Prefix: mdag.V0CidPrefix()} var UseRawLeaves = NodeOpts{Prefix: mdag.V0CidPrefix(), ForceRawLeaves: true, RawLeavesUsed: true} var UseCidV1 = NodeOpts{Prefix: mdag.V1CidPrefix(), RawLeavesUsed: true} +var UseBlake2b256 NodeOpts + +func init() { + UseBlake2b256 = UseCidV1 + UseBlake2b256.Prefix.MhType = mh.Names["blake2b-256"] + UseBlake2b256.Prefix.MhLength = -1 +} func GetNode(t testing.TB, dserv mdag.DAGService, data []byte, opts NodeOpts) node.Node { in := bytes.NewReader(data) From 466288eddeee5bc9887983552c2094d772b34317 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 16 Aug 2017 19:18:05 -0400 Subject: [PATCH 1744/3147] mfs: inherit CID prefix from from parent directory License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@d0d21fa723a8bd5d23c5f33cf6d07c68ddb8b072 --- unixfs/hamt/hamt.go | 7 +++++++ unixfs/io/dirbuilder.go | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index a360c37c2d..bd28093018 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -121,6 +121,7 @@ func NewHamtFromDag(dserv dag.DAGService, nd node.Node) (*HamtShard, error) { ds.children = make([]child, len(pbnd.Links())) ds.bitfield = new(big.Int).SetBytes(pbd.GetData()) ds.hashFunc = pbd.GetHashType() + ds.prefix = &ds.nd.Prefix return ds, nil } @@ -130,6 +131,11 @@ func (ds *HamtShard) SetPrefix(prefix *cid.Prefix) { ds.prefix = prefix } +// GetPrefix gets the CID Prefix, may be nil if unset +func (ds *HamtShard) Prefix() *cid.Prefix { + return ds.prefix +} + // Node serializes the HAMT structure into a merkledag node with unixfs formatting func (ds *HamtShard) Node() (node.Node, error) { out := new(dag.ProtoNode) @@ -500,6 +506,7 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, if err != nil { return err } + ns.prefix = ds.prefix chhv := &hashBits{ b: hash([]byte(child.key)), consumed: hv.consumed, diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 76ec34faab..9ca587e2c2 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -115,6 +115,7 @@ func (d *Directory) switchToSharding(ctx context.Context) error { if err != nil { return err } + s.SetPrefix(&d.dirnode.Prefix) d.shard = s for _, lnk := range d.dirnode.Links() { @@ -192,3 +193,11 @@ func (d *Directory) GetNode() (node.Node, error) { return d.shard.Node() } + +func (d *Directory) GetPrefix() *cid.Prefix { + if d.shard == nil { + return &d.dirnode.Prefix + } + + return d.shard.Prefix() +} From dcbf369ce4c4271a6dff8a45a778379ea5b901f7 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 16 Aug 2017 19:18:05 -0400 Subject: [PATCH 1745/3147] mfs: inherit CID prefix from from parent directory License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@032e029850f09a7f929576fba589657770384c7e --- mfs/dir.go | 6 ++++++ mfs/file.go | 11 ++++++++--- mfs/ops.go | 8 ++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index a489336d61..219dc4cceb 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -58,6 +58,11 @@ func NewDirectory(ctx context.Context, name string, node node.Node, parent child }, nil } +// GetPrefix gets the CID prefix of the root node +func (d *Directory) GetPrefix() *cid.Prefix { + return d.dirbuilder.GetPrefix() +} + // SetPrefix sets the CID prefix func (d *Directory) SetPrefix(prefix *cid.Prefix) { d.dirbuilder.SetPrefix(prefix) @@ -299,6 +304,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { } ndir := ft.EmptyDirNode() + ndir.SetPrefix(d.GetPrefix()) _, err = d.dserv.Add(ndir) if err != nil { diff --git a/mfs/file.go b/mfs/file.go index 85c9e59bc2..0ff8b41dec 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -27,14 +27,19 @@ type File struct { RawLeaves bool } -// NewFile returns a NewFile object with the given parameters +// NewFile returns a NewFile object with the given parameters. If the +// Cid version is non-zero RawLeaves will be enabled. func NewFile(name string, node node.Node, parent childCloser, dserv dag.DAGService) (*File, error) { - return &File{ + fi := &File{ dserv: dserv, parent: parent, name: name, node: node, - }, nil + } + if node.Cid().Prefix().Version > 0 { + fi.RawLeaves = true + } + return fi, nil } const ( diff --git a/mfs/ops.go b/mfs/ops.go index a086e86025..5b72adcadc 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -129,7 +129,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { if err != nil { return err } - mkd.SetPrefix(r.Prefix) + if r.Prefix != nil { + mkd.SetPrefix(r.Prefix) + } fsn = mkd } else if err != nil { return err @@ -148,7 +150,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { return err } } - final.SetPrefix(r.Prefix) + if r.Prefix != nil { + final.SetPrefix(r.Prefix) + } if flush { err := final.Flush() From 0c4947c2d28bcc0b049b889b653e985f74aceee5 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 19 Oct 2017 12:09:56 -0400 Subject: [PATCH 1746/3147] Documentation. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-unixfs@e94381ac5176c45d95d376fc0974a8d564eaf267 --- unixfs/hamt/hamt.go | 2 +- unixfs/io/dirbuilder.go | 1 + unixfs/test/utils.go | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index bd28093018..fecf23b46a 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -131,7 +131,7 @@ func (ds *HamtShard) SetPrefix(prefix *cid.Prefix) { ds.prefix = prefix } -// GetPrefix gets the CID Prefix, may be nil if unset +// Prefix gets the CID Prefix, may be nil if unset func (ds *HamtShard) Prefix() *cid.Prefix { return ds.prefix } diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 9ca587e2c2..f86d23fb77 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -194,6 +194,7 @@ func (d *Directory) GetNode() (node.Node, error) { return d.shard.Node() } +// GetPrefix returns the CID Prefix used func (d *Directory) GetPrefix() *cid.Prefix { if d.shard == nil { return &d.dirnode.Prefix diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 8b18ad9cd0..24359d377b 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -31,6 +31,7 @@ func GetDAGServ() mdag.DAGService { return mdagmock.Mock() } +// NodeOpts is used by GetNode, GetEmptyNode and GetRandomNode type NodeOpts struct { Prefix cid.Prefix // ForceRawLeaves if true will force the use of raw leaves From 202f8628892026ebf3d4c9d31e2a1dd125d6576a Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 8 Sep 2017 21:00:55 -0400 Subject: [PATCH 1747/3147] Eliminate Prefix field from MFS root, use MkdirOpts. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@bff6529fcc742f1080f6bdb4eee91b2b7af5d229 --- mfs/mfs_test.go | 4 ++-- mfs/ops.go | 26 +++++++++++++++++--------- mfs/system.go | 3 --- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 09e9de00dd..bebfa8d308 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -735,7 +735,7 @@ func TestMfsHugeDir(t *testing.T) { _, rt := setupRoot(ctx, t) for i := 0; i < 10000; i++ { - err := Mkdir(rt, fmt.Sprintf("/dir%d", i), false, false) + err := Mkdir(rt, fmt.Sprintf("/dir%d", i), MkdirOpts{Mkparents: false, Flush: false}) if err != nil { t.Fatal(err) } @@ -747,7 +747,7 @@ func TestMkdirP(t *testing.T) { defer cancel() _, rt := setupRoot(ctx, t) - err := Mkdir(rt, "/a/b/c/d/e/f", true, true) + err := Mkdir(rt, "/a/b/c/d/e/f", MkdirOpts{Mkparents: true, Flush: true}) if err != nil { t.Fatal(err) } diff --git a/mfs/ops.go b/mfs/ops.go index 5b72adcadc..49ce398d44 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,6 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) @@ -97,9 +98,16 @@ func PutNode(r *Root, path string, nd node.Node) error { return pdir.AddChild(filename, nd) } +// MkdirOpts is used by Mkdir +type MkdirOpts struct { + Mkparents bool + Flush bool + Prefix *cid.Prefix +} + // Mkdir creates a directory at 'path' under the directory 'd', creating // intermediary directories as needed if 'mkparents' is set to true -func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { +func Mkdir(r *Root, pth string, opts MkdirOpts) error { if pth == "" { return fmt.Errorf("no path given to Mkdir") } @@ -115,7 +123,7 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { if len(parts) == 0 { // this will only happen on 'mkdir /' - if mkparents { + if opts.Mkparents { return nil } return fmt.Errorf("cannot create directory '/': Already exists") @@ -124,13 +132,13 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { cur := r.GetValue().(*Directory) for i, d := range parts[:len(parts)-1] { fsn, err := cur.Child(d) - if err == os.ErrNotExist && mkparents { + if err == os.ErrNotExist && opts.Mkparents { mkd, err := cur.Mkdir(d) if err != nil { return err } - if r.Prefix != nil { - mkd.SetPrefix(r.Prefix) + if opts.Prefix != nil { + mkd.SetPrefix(opts.Prefix) } fsn = mkd } else if err != nil { @@ -146,15 +154,15 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error { final, err := cur.Mkdir(parts[len(parts)-1]) if err != nil { - if !mkparents || err != os.ErrExist || final == nil { + if !opts.Mkparents || err != os.ErrExist || final == nil { return err } } - if r.Prefix != nil { - final.SetPrefix(r.Prefix) + if opts.Prefix != nil { + final.SetPrefix(opts.Prefix) } - if flush { + if opts.Flush { err := final.Flush() if err != nil { return err diff --git a/mfs/system.go b/mfs/system.go index 0641704cf3..fc5be0f6e2 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -61,9 +61,6 @@ type Root struct { dserv dag.DAGService Type string - - // Prefix to use for any children created - Prefix *cid.Prefix } type PubFunc func(context.Context, *cid.Cid) error From 570e7f4f00972642107f803848c1aa708bde4243 Mon Sep 17 00:00:00 2001 From: Forrest Weston Date: Tue, 14 Nov 2017 17:39:30 -0800 Subject: [PATCH 1748/3147] Add event logging around path resolution License: MIT Signed-off-by: Forrest Weston This commit was moved from ipfs/go-path@cd26e8c3067055d430c594cfc53ec99033ac7de2 --- path/resolver.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/path/resolver.go b/path/resolver.go index 5b8fe515ae..e11c2767d4 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -135,6 +135,7 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]nod if err != nil { return nil, err } + defer log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"parts": parts, "cid": h}).Done() log.Debug("resolve dag get") nd, err := s.DAG.Get(ctx, h) @@ -154,6 +155,7 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]nod // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []string) ([]node.Node, error) { + defer log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}).Done() result := make([]node.Node, 0, len(names)+1) result = append(result, ndd) nd := ndd // dup arg workaround From b6f9fbb2bc163d4eb806e0710cc60e9f38ba0332 Mon Sep 17 00:00:00 2001 From: Forrest Weston Date: Wed, 15 Nov 2017 12:21:08 -0800 Subject: [PATCH 1749/3147] Add error message to event logs in path resolution If an error occurs during an event add it to the events metadata License: MIT Signed-off-by: Forrest Weston This commit was moved from ipfs/go-path@0fbb0f904f4002b8709009e468122649bfbcdd0e --- path/resolver.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index e11c2767d4..094bc755ea 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -131,15 +131,19 @@ func ResolveSingle(ctx context.Context, ds dag.DAGService, nd node.Node, names [ // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]node.Node, error) { + evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) + defer evt.Done() + h, parts, err := SplitAbsPath(fpath) if err != nil { + evt.Append(logging.LoggableMap{"error": err.Error()}) return nil, err } - defer log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"parts": parts, "cid": h}).Done() log.Debug("resolve dag get") nd, err := s.DAG.Get(ctx, h) if err != nil { + evt.Append(logging.LoggableMap{"error": err.Error()}) return nil, err } @@ -155,7 +159,8 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]nod // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []string) ([]node.Node, error) { - defer log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}).Done() + evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) + defer evt.Done() result := make([]node.Node, 0, len(names)+1) result = append(result, ndd) nd := ndd // dup arg workaround @@ -168,13 +173,16 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []stri lnk, rest, err := s.ResolveOnce(ctx, s.DAG, nd, names) if err == dag.ErrLinkNotFound { + evt.Append(logging.LoggableMap{"error": err.Error()}) return result, ErrNoLink{Name: names[0], Node: nd.Cid()} } else if err != nil { + evt.Append(logging.LoggableMap{"error": err.Error()}) return result, err } nextnode, err := lnk.GetNode(ctx, s.DAG) if err != nil { + evt.Append(logging.LoggableMap{"error": err.Error()}) return result, err } From 1c1d72f6e54924c5b6ffe741a69a18fbafc90e1b Mon Sep 17 00:00:00 2001 From: Jan Winkelmann Date: Sat, 1 Apr 2017 16:58:17 +0200 Subject: [PATCH 1750/3147] cmd: use go-ipfs-cmds License: MIT Signed-off-by: keks This commit was moved from ipfs/go-namesys@3f50c3f4fb66fa91d7205841cb58620dd1420dcf --- namesys/dns.go | 1 - namesys/interface.go | 1 + namesys/ipns_select_test.go | 4 ++-- namesys/proquint.go | 1 + namesys/republisher/repub_test.go | 6 +++--- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 3cb2cd6e2a..1267ef56b1 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -7,7 +7,6 @@ import ( "strings" path "github.com/ipfs/go-ipfs/path" - isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 84a6bbe2c4..acaec17407 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -34,6 +34,7 @@ import ( "time" context "context" + path "github.com/ipfs/go-ipfs/path" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index e12af16d93..9c0f341143 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index ee6ada978c..3a842f97ae 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,6 +4,7 @@ import ( "errors" context "context" + path "github.com/ipfs/go-ipfs/path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index be438b8389..377b959ae2 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -1,20 +1,20 @@ package republisher_test import ( + "context" "errors" "testing" "time" - context "context" - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - "github.com/ipfs/go-ipfs/core" mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" mocknet "gx/ipfs/QmefgzMbKZYsmHFkLqxgaTBG9ypeEjrdWRD5WXH4j1cWDL/go-libp2p/p2p/net/mock" + goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" ) func TestRepublish(t *testing.T) { From e3d111303c5dcdd442930445a07b229046e1864d Mon Sep 17 00:00:00 2001 From: Jan Winkelmann Date: Sat, 1 Apr 2017 16:58:17 +0200 Subject: [PATCH 1751/3147] cmd: use go-ipfs-cmds License: MIT Signed-off-by: keks This commit was moved from ipfs/go-ipfs-routing@9983272af4dab3ae091b12205e3a6bb762190fa6 --- routing/offline/offline_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 9f5b3f0b23..253c533c07 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -3,9 +3,10 @@ package offline import ( "bytes" "context" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" "testing" + + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ) func TestOfflineRouterStorage(t *testing.T) { From 82b858de9b79db8d6d62e8ccdd413feb8a20654e Mon Sep 17 00:00:00 2001 From: Jan Winkelmann Date: Sat, 1 Apr 2017 16:58:17 +0200 Subject: [PATCH 1752/3147] cmd: use go-ipfs-cmds License: MIT Signed-off-by: keks This commit was moved from ipfs/go-mfs@5e27273a759088ca800a5ba0a8da149f54b54cc3 --- mfs/repub_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 1c21bd793f..4a9bc48690 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -1,13 +1,12 @@ package mfs import ( + "context" "testing" "time" - ci "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil/ci" - - "context" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + ci "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil/ci" ) func TestRepublisher(t *testing.T) { From d06a7c961f382ae908fbce332633bae651901333 Mon Sep 17 00:00:00 2001 From: Jan Winkelmann Date: Sat, 1 Apr 2017 16:58:17 +0200 Subject: [PATCH 1753/3147] cmd: use go-ipfs-cmds License: MIT Signed-off-by: keks This commit was moved from ipfs/go-ipfs-blockstore@6593a2089deeb670590ba6fec93c8dd78125843e --- blockstore/caching.go | 1 + blockstore/util/remove.go | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/blockstore/caching.go b/blockstore/caching.go index 0ea375b06c..5d6f3bc85c 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -4,6 +4,7 @@ import ( "errors" context "context" + "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" ) diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 47552988b8..467f55092a 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -85,12 +85,17 @@ func FilterPinned(pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid) []*c return stillOkay } -// ProcRmOutput takes the channel returned by RmBlocks and writes -// to stdout/stderr according to the RemovedBlock objects received in -// that channel. -func ProcRmOutput(in <-chan interface{}, sout io.Writer, serr io.Writer) error { +// ProcRmOutput takes a function which returns a result from RmBlocks or EOF if there is no input. +// It then writes to stdout/stderr according to the RemovedBlock object returned from the function. +func ProcRmOutput(next func() (interface{}, error), sout io.Writer, serr io.Writer) error { someFailed := false - for res := range in { + for { + res, err := next() + if err == io.EOF { + break + } else if err != nil { + return err + } r := res.(*RemovedBlock) if r.Hash == "" && r.Error != "" { return fmt.Errorf("aborted: %s", r.Error) From b3f2eff24aee7366c41d0aa817f2c8268570f0a5 Mon Sep 17 00:00:00 2001 From: Jan Winkelmann Date: Sat, 1 Apr 2017 16:58:17 +0200 Subject: [PATCH 1754/3147] cmd: use go-ipfs-cmds License: MIT Signed-off-by: keks This commit was moved from ipfs/go-ipfs-chunker@c33af760f3207511885976640353577de98fa471 --- chunker/rabin_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index ede2bc20ab..9cef888ce2 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -3,10 +3,11 @@ package chunk import ( "bytes" "fmt" - "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" "io" "testing" + + util "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" ) func TestRabinChunking(t *testing.T) { From 8a45b9465e4ccdbd156dae25ccee464459c16eef Mon Sep 17 00:00:00 2001 From: keks Date: Mon, 23 Oct 2017 16:50:39 +0200 Subject: [PATCH 1755/3147] compatible to js-ipfs-api License: MIT Signed-off-by: keks This commit was moved from ipfs/go-namesys@01755f54922f0c05f28f25ea776b45c5f6e8207b --- namesys/republisher/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 377b959ae2..7586b2f6ca 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( path "github.com/ipfs/go-ipfs/path" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - mocknet "gx/ipfs/QmefgzMbKZYsmHFkLqxgaTBG9ypeEjrdWRD5WXH4j1cWDL/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" + mocknet "gx/ipfs/QmefgzMbKZYsmHFkLqxgaTBG9ypeEjrdWRD5WXH4j1cWDL/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { From 467b6c80fadbc8529b4edd0cedb836d7a213ce5d Mon Sep 17 00:00:00 2001 From: keks Date: Mon, 23 Oct 2017 16:50:39 +0200 Subject: [PATCH 1756/3147] compatible to js-ipfs-api License: MIT Signed-off-by: keks This commit was moved from ipfs/go-ipfs-routing@d47f90716dd411ac613cdf6cad1cd94e38e41506 --- routing/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 253c533c07..5c00bc3c10 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -4,9 +4,9 @@ import ( "bytes" "context" "testing" - - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ) func TestOfflineRouterStorage(t *testing.T) { From fd7d7c96b5f44ae191f3d723260479d1803a62e4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 18 Nov 2017 08:39:38 -0800 Subject: [PATCH 1757/3147] fix hamt delete issue License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@2f01bfb081e436e3adcc05c38ff0c2aacf091b0b --- unixfs/hamt/hamt.go | 17 +++++++++++------ unixfs/hamt/hamt_test.go | 14 ++++++++++++++ unixfs/hamt/util.go | 18 ++---------------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index fecf23b46a..bd73434cb0 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -492,16 +492,21 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, return nil case *shardValue: - switch { - case val == nil: // passing a nil value signifies a 'delete' - ds.bitfield.SetBit(ds.bitfield, idx, 0) - return ds.rmChild(cindex) + if child.key == key { + // value modification + if val == nil { + ds.bitfield.SetBit(ds.bitfield, idx, 0) + return ds.rmChild(cindex) + } - case child.key == key: // value modification child.val = val return nil + } else { + if val == nil { + return os.ErrNotExist + } - default: // replace value with another shard, one level deeper + // replace value with another shard, one level deeper ns, err := NewHamtShard(ds.dserv, ds.tableSize) if err != nil { return err diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 77997d2fd1..eb204dfd62 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -222,6 +222,20 @@ func TestRemoveElems(t *testing.T) { } ctx := context.Background() + for i := 0; i < 100; i++ { + err := s.Remove(ctx, fmt.Sprintf("NOTEXIST%d", rand.Int())) + if err != os.ErrNotExist { + t.Fatal("shouldnt be able to remove things that don't exist") + } + } + + for _, d := range dirs { + _, err := s.Find(ctx, d) + if err != nil { + t.Fatal(err) + } + } + shuffle(time.Now().UnixNano(), dirs) for _, d := range dirs { diff --git a/unixfs/hamt/util.go b/unixfs/hamt/util.go index 08c232a8ad..4692e74939 100644 --- a/unixfs/hamt/util.go +++ b/unixfs/hamt/util.go @@ -2,6 +2,7 @@ package hamt import ( "math/big" + "math/bits" ) // hashBits is a helper that allows the reading of the 'next n bits' as an integer. @@ -39,25 +40,10 @@ func (hb *hashBits) Next(i int) int { } } -const ( - m1 = 0x5555555555555555 //binary: 0101... - m2 = 0x3333333333333333 //binary: 00110011.. - m4 = 0x0f0f0f0f0f0f0f0f //binary: 4 zeros, 4 ones ... - h01 = 0x0101010101010101 //the sum of 256 to the power of 0,1,2,3... -) - -// from https://en.wikipedia.org/wiki/Hamming_weight -func popCountUint64(x uint64) int { - x -= (x >> 1) & m1 //put count of each 2 bits into those 2 bits - x = (x & m2) + ((x >> 2) & m2) //put count of each 4 bits into those 4 bits - x = (x + (x >> 4)) & m4 //put count of each 8 bits into those 8 bits - return int((x * h01) >> 56) -} - func popCount(i *big.Int) int { var n int for _, v := range i.Bits() { - n += popCountUint64(uint64(v)) + n += bits.OnesCount64(uint64(v)) } return n } From 49b81e8c1995959ac93aef793e8236986789f39d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 20 Nov 2017 16:25:06 -0800 Subject: [PATCH 1758/3147] gx: massive update Note: This commit is technically broken. However, I need to make a bunch of cmds changes to make this work and I'd rather not bundle both changes into a single commit. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@3d92102c8593ebe056b3459d8bde243531fb358a --- namesys/publisher_test.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 3149b3e485..28635f3bfc 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -10,9 +10,9 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" - testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 7586b2f6ca..43c9c1f5e3 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmefgzMbKZYsmHFkLqxgaTBG9ypeEjrdWRD5WXH4j1cWDL/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmTzs3Gp2rU3HuNayjBVG7qBgbaKWE8bgtwJ7faRxAe9UP/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index bb30a243a4..7503ad3d7e 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" From b116aeb9dfdc7751ee63fc885d6cd7d4630001bb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 20 Nov 2017 16:25:06 -0800 Subject: [PATCH 1759/3147] gx: massive update Note: This commit is technically broken. However, I need to make a bunch of cmds changes to make this work and I'd rather not bundle both changes into a single commit. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@f547b08f69da817f05362da898ee302b77c446c0 --- mfs/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 4a9bc48690..45b9006b4c 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -6,7 +6,7 @@ import ( "time" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ci "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil/ci" + ci "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil/ci" ) func TestRepublisher(t *testing.T) { From b3895e641e436a845eeed0468b03f31a5a01942d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 20 Nov 2017 16:25:06 -0800 Subject: [PATCH 1760/3147] gx: massive update Note: This commit is technically broken. However, I need to make a bunch of cmds changes to make this work and I'd rather not bundle both changes into a single commit. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@517d7a32e9c0980dc8c0c6650f7a2fbc6ffc9abe --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 2 +- routing/none/none_client.go | 2 +- routing/offline/offline_test.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 0614d2d77c..407629299f 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,7 +6,7 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index c5f90d1d88..02929a4cf6 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,7 +6,7 @@ import ( "sync" "time" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 84f9fcbcff..9ecba1181d 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,7 +6,7 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 3522c6f38f..5dcbbd21db 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,7 +8,7 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" diff --git a/routing/none/none_client.go b/routing/none/none_client.go index d0a00a0ee4..ccf535fcac 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -9,8 +9,8 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" - p2phost "gx/ipfs/Qmc1XhrFEiSeBNn3mpfg6gEuYCt5im2gYmNVmncsvmpeAk/go-libp2p-host" ) type nilclient struct { diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 5c00bc3c10..2b1eb521ec 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -5,8 +5,8 @@ import ( "context" "testing" + "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - "gx/ipfs/QmWRCn8vruNAzHx8i6SAXinuheRitKEGu8c7m26stKvsYx/go-testutil" ) func TestOfflineRouterStorage(t *testing.T) { From 9790921dd683cfd5075e932df7777f1cd58cee4e Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 7 Jul 2017 18:32:59 +0300 Subject: [PATCH 1761/3147] namesys/pubsub: publisher and resolver Commits: namesys: pubsub Publisher and Resolver namesys/pubsub: pacify code climate. namesys/pubsub: timeout for rendezvous namesys/pubsub: filter self in bootstrap connections namesys/pubsub: Publish to the correct topic License: MIT Signed-off-by: vyzo namesys/pubsub: unit test Commits: namesys/pubsub: test namesys/pubsub_test: pacify code climate namesys/pubsub: update test to use extant mock routing License: MIT Signed-off-by: vyzo namesys/pubsub: integrate namesys pubsub namesys: integrate pubsub resolvers namesys/pubsub_test: tweak delays - trying to make travis happy. namesys/pubsub: fix duplicate bootstraps - subscription key is topic, not ipnskey. namesys/pubsub: no warning needed on cancellation namesys/pubsub: warning for receive errors - and more informative error messages at that. namesys/pubsub_test: smaller test - make it work with seemingly low fdlimits in travis/macosx. also, more informative test failures. namesys/pubsub: add delay to let pubsub perform handshake namesys/pubsub: update gx imports namesys/pubsub_test: preconnect publisher, reduce delays - preconnects the publisher to the receivers in order to avoid bootstrap flakiness with connectivity problems in travis. reduces sleeps to 1s for flood propagation (3s seems excessive with 5 hosts). namesys/pubsub: drop named return values in resolveOnce - per review comment. namesys/pubsub: check errors namesys/pubsub: store bytes in resolver datastore namesys/pubsub: resolver Cancel - for canceling subscriptions, pre whyrusleeping's request. namesys/pubsub: fix resolution without /ipns prefix - also improve the logging a bit. namesys/pubsub: don't resolve own keys through pubsub namesys/pubsub: signal ErrResolveFailed on resolution failure namesys/pubsub: use sync datastore, resolver lock only for subs namesys/pubsub_test: coverage for Cancel License: MIT Signed-off-by: vyzo namesys/pubsub: parallelize dht and pubsub publishing Commits: namesys/pubsub: code cosmetics namesys: parallelize publishing with dht and pubsub namesys/pubsub: periodically reprovide topic rendezvous namesys/pubsub: cancelation for rendezvous goroutine namesys/pubsub: log ipns record seqno on publish License: MIT Signed-off-by: vyzo namesys/pubsub: error checking License: MIT Signed-off-by: vyzo namesys/pubsub: --enable-namesys-pubsub option and management Commits: package.json: update go-libp2p-blankhost namesys: fix stale package imports update go-testutil namesys/pubsub: reduce bootstrap provide period to 8hr namesys/pubsub: try to extract the key from id first option to enable ipns pubsub: --enable-namesys-pubsub ipfs name pubsub management subcommands corehttp/gateway_test: mockNamesys needs to implement GetResolver pacify code climate License: MIT Signed-off-by: vyzo namesys/pubsub: pubsub sharness test test/sharness: test for ipns pubsub namesys/pubsub: return boolean indicator on Cancel package.json: remove duplicate entry for go-testutil update gx deps, testutil to 1.1.12 fix jenkins failure: use tabs in t0183-namesys-pubsub t0183: use 4 spaces for tabification License: MIT Signed-off-by: vyzo namesys/pubsub: update for new command interface License: MIT Signed-off-by: vyzo namesys/pubsub: fix sharness test for broken MacOS echo echo -n "" should print -n, but hey it's a mac. License: MIT Signed-off-by: vyzo This commit was moved from ipfs/go-namesys@054f5016250e786b1d94dd1c88872409ed65329a --- namesys/interface.go | 8 + namesys/namesys.go | 138 +++++++++++-- namesys/namesys_test.go | 4 +- namesys/pubsub.go | 430 ++++++++++++++++++++++++++++++++++++++++ namesys/pubsub_test.go | 187 +++++++++++++++++ 5 files changed, 745 insertions(+), 22 deletions(-) create mode 100644 namesys/pubsub.go create mode 100644 namesys/pubsub_test.go diff --git a/namesys/interface.go b/namesys/interface.go index acaec17407..8097ac6162 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -70,6 +70,7 @@ var ErrPublishFailed = errors.New("Could not publish name.") type NameSystem interface { Resolver Publisher + ResolverLookup } // Resolver is an object capable of resolving names. @@ -112,3 +113,10 @@ type Publisher interface { // call once the records spec is implemented PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error } + +// ResolverLookup is an object capable of finding resolvers for a subsystem +type ResolverLookup interface { + + // GetResolver retrieves a resolver associated with a subsystem + GetResolver(subs string) (Resolver, bool) +} diff --git a/namesys/namesys.go b/namesys/namesys.go index d1cda08709..82952f250f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -2,14 +2,20 @@ package namesys import ( "context" + "errors" "strings" + "sync" "time" path "github.com/ipfs/go-ipfs/path" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" + p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" + mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" + floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) @@ -36,11 +42,28 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSys "dht": NewRoutingResolver(r, cachesize), }, publishers: map[string]Publisher{ - "/ipns/": NewRoutingPublisher(r, ds), + "dht": NewRoutingPublisher(r, ds), }, } } +// AddPubsubNameSystem adds the pubsub publisher and resolver to the namesystem +func AddPubsubNameSystem(ctx context.Context, ns NameSystem, host p2phost.Host, r routing.IpfsRouting, ds ds.Datastore, ps *floodsub.PubSub) error { + mpns, ok := ns.(*mpns) + if !ok { + return errors.New("unexpected NameSystem; not an mpns instance") + } + + pkf, ok := r.(routing.PubKeyFetcher) + if !ok { + return errors.New("unexpected IpfsRouting; not a PubKeyFetcher instance") + } + + mpns.resolvers["pubsub"] = NewPubsubResolver(ctx, host, r, pkf, ps) + mpns.publishers["pubsub"] = NewPubsubPublisher(ctx, host, ds, r, ps) + return nil +} + const DefaultResolverCacheTTL = time.Minute // Resolve implements Resolver. @@ -72,38 +95,100 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) return "", ErrResolveFailed } - for protocol, resolver := range ns.resolvers { - log.Debugf("Attempting to resolve %s with %s", segments[2], protocol) - p, err := resolver.resolveOnce(ctx, segments[2]) - if err == nil { - if len(segments) > 3 { - return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) - } else { - return p, err + makePath := func(p path.Path) (path.Path, error) { + if len(segments) > 3 { + return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + } else { + return p, nil + } + } + + // Resolver selection: + // 1. if it is a multihash resolve through "pubsub" (if available), + // with fallback to "dht" + // 2. if it is a domain name, resolve through "dns" + // 3. otherwise resolve through the "proquint" resolver + key := segments[2] + + _, err := mh.FromB58String(key) + if err == nil { + res, ok := ns.resolvers["pubsub"] + if ok { + p, err := res.resolveOnce(ctx, key) + if err == nil { + return makePath(p) + } + } + + res, ok = ns.resolvers["dht"] + if ok { + p, err := res.resolveOnce(ctx, key) + if err == nil { + return makePath(p) + } + } + + return "", ErrResolveFailed + } + + if isd.IsDomain(key) { + res, ok := ns.resolvers["dns"] + if ok { + p, err := res.resolveOnce(ctx, key) + if err == nil { + return makePath(p) } } + + return "", ErrResolveFailed } + + res, ok := ns.resolvers["proquint"] + if ok { + p, err := res.resolveOnce(ctx, key) + if err == nil { + return makePath(p) + } + + return "", ErrResolveFailed + } + log.Warningf("No resolver found for %s", name) return "", ErrResolveFailed } // Publish implements Publisher func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { - err := ns.publishers["/ipns/"].Publish(ctx, name, value) - if err != nil { - return err - } - ns.addToDHTCache(name, value, time.Now().Add(DefaultRecordTTL)) - return nil + return ns.PublishWithEOL(ctx, name, value, time.Now().Add(DefaultRecordTTL)) } func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { - err := ns.publishers["/ipns/"].PublishWithEOL(ctx, name, value, eol) - if err != nil { - return err + var dhtErr error + + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + dhtErr = ns.publishers["dht"].PublishWithEOL(ctx, name, value, eol) + if dhtErr == nil { + ns.addToDHTCache(name, value, eol) + } + wg.Done() + }() + + pub, ok := ns.publishers["pubsub"] + if ok { + wg.Add(1) + go func() { + err := pub.PublishWithEOL(ctx, name, value, eol) + if err != nil { + log.Warningf("error publishing %s with pubsub: %s", name, err.Error()) + } + wg.Done() + }() } - ns.addToDHTCache(name, value, eol) - return nil + + wg.Wait() + return dhtErr } func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { @@ -138,3 +223,16 @@ func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { eol: eol, }) } + +// GetResolver implements ResolverLookup +func (ns *mpns) GetResolver(subs string) (Resolver, bool) { + res, ok := ns.resolvers[subs] + if ok { + ires, ok := res.(Resolver) + if ok { + return ires, true + } + } + + return nil, false +} diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 1507f5510b..78396c25ee 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -58,8 +58,8 @@ func mockResolverTwo() *mockResolver { func TestNamesysResolution(t *testing.T) { r := &mpns{ resolvers: map[string]resolver{ - "one": mockResolverOne(), - "two": mockResolverTwo(), + "dht": mockResolverOne(), + "dns": mockResolverTwo(), }, } diff --git a/namesys/pubsub.go b/namesys/pubsub.go new file mode 100644 index 0000000000..6c1284f270 --- /dev/null +++ b/namesys/pubsub.go @@ -0,0 +1,430 @@ +package namesys + +import ( + "context" + "errors" + "fmt" + "strings" + "sync" + "time" + + pb "github.com/ipfs/go-ipfs/namesys/pb" + path "github.com/ipfs/go-ipfs/path" + dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" + + cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" + u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" + floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" + dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" +) + +// PubsubPublisher is a publisher that distributes IPNS records through pubsub +type PubsubPublisher struct { + ctx context.Context + ds ds.Datastore + host p2phost.Host + cr routing.ContentRouting + ps *floodsub.PubSub + + mx sync.Mutex + subs map[string]struct{} +} + +// PubsubResolver is a resolver that receives IPNS records through pubsub +type PubsubResolver struct { + ctx context.Context + ds ds.Datastore + host p2phost.Host + cr routing.ContentRouting + pkf routing.PubKeyFetcher + ps *floodsub.PubSub + + mx sync.Mutex + subs map[string]*floodsub.Subscription +} + +// NewPubsubPublisher constructs a new Publisher that publishes IPNS records through pubsub. +// The constructor interface is complicated by the need to bootstrap the pubsub topic. +// This could be greatly simplified if the pubsub implementation handled bootstrap itself +func NewPubsubPublisher(ctx context.Context, host p2phost.Host, ds ds.Datastore, cr routing.ContentRouting, ps *floodsub.PubSub) *PubsubPublisher { + return &PubsubPublisher{ + ctx: ctx, + ds: ds, + host: host, // needed for pubsub bootstrap + cr: cr, // needed for pubsub bootstrap + ps: ps, + subs: make(map[string]struct{}), + } +} + +// NewPubsubResolver constructs a new Resolver that resolves IPNS records through pubsub. +// same as above for pubsub bootstrap dependencies +func NewPubsubResolver(ctx context.Context, host p2phost.Host, cr routing.ContentRouting, pkf routing.PubKeyFetcher, ps *floodsub.PubSub) *PubsubResolver { + return &PubsubResolver{ + ctx: ctx, + ds: dssync.MutexWrap(ds.NewMapDatastore()), + host: host, // needed for pubsub bootstrap + cr: cr, // needed for pubsub bootstrap + pkf: pkf, + ps: ps, + subs: make(map[string]*floodsub.Subscription), + } +} + +// Publish publishes an IPNS record through pubsub with default TTL +func (p *PubsubPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { + return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordTTL)) +} + +// PublishWithEOL publishes an IPNS record through pubsub +func (p *PubsubPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { + id, err := peer.IDFromPrivateKey(k) + if err != nil { + return err + } + + _, ipnskey := IpnsKeysForID(id) + + seqno, err := p.getPreviousSeqNo(ctx, ipnskey) + if err != nil { + return err + } + + seqno++ + + return p.publishRecord(ctx, k, value, seqno, eol, ipnskey, id) +} + +func (p *PubsubPublisher) getPreviousSeqNo(ctx context.Context, ipnskey string) (uint64, error) { + // the datastore is shared with the routing publisher to properly increment and persist + // ipns record sequence numbers. + prevrec, err := p.ds.Get(dshelp.NewKeyFromBinary([]byte(ipnskey))) + if err != nil { + if err == ds.ErrNotFound { + // None found, lets start at zero! + return 0, nil + } + return 0, err + } + + prbytes, ok := prevrec.([]byte) + if !ok { + return 0, fmt.Errorf("unexpected type returned from datastore: %#v", prevrec) + } + + var dsrec dhtpb.Record + err = proto.Unmarshal(prbytes, &dsrec) + if err != nil { + return 0, err + } + + var entry pb.IpnsEntry + err = proto.Unmarshal(dsrec.GetValue(), &entry) + if err != nil { + return 0, err + } + + return entry.GetSequence(), nil +} + +func (p *PubsubPublisher) publishRecord(ctx context.Context, k ci.PrivKey, value path.Path, seqno uint64, eol time.Time, ipnskey string, ID peer.ID) error { + entry, err := CreateRoutingEntryData(k, value, seqno, eol) + if err != nil { + return err + } + + data, err := proto.Marshal(entry) + if err != nil { + return err + } + + // the datastore is shared with the routing publisher to properly increment and persist + // ipns record sequence numbers; so we need to Record our new entry in the datastore + dsrec, err := record.MakePutRecord(k, ipnskey, data, true) + if err != nil { + return err + } + + dsdata, err := proto.Marshal(dsrec) + if err != nil { + return err + } + + err = p.ds.Put(dshelp.NewKeyFromBinary([]byte(ipnskey)), dsdata) + if err != nil { + return err + } + + // now we publish, but we also need to bootstrap pubsub for our messages to propagate + topic := "/ipns/" + ID.Pretty() + + p.mx.Lock() + _, ok := p.subs[topic] + + if !ok { + p.subs[topic] = struct{}{} + p.mx.Unlock() + + bootstrapPubsub(p.ctx, p.cr, p.host, topic) + } else { + p.mx.Unlock() + } + + log.Debugf("PubsubPublish: publish IPNS record for %s (%d)", topic, seqno) + return p.ps.Publish(topic, data) +} + +// Resolve resolves a name through pubsub and default depth limit +func (r *PubsubResolver) Resolve(ctx context.Context, name string) (path.Path, error) { + return r.ResolveN(ctx, name, DefaultDepthLimit) +} + +// ResolveN resolves a name through pubsub with the specified depth limit +func (r *PubsubResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { + return resolve(ctx, r, name, depth, "/ipns/") +} + +func (r *PubsubResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { + log.Debugf("PubsubResolve: resolve '%s'", name) + + // retrieve the public key once (for verifying messages) + xname := strings.TrimPrefix(name, "/ipns/") + hash, err := mh.FromB58String(xname) + if err != nil { + log.Warningf("PubsubResolve: bad input hash: [%s]", xname) + return "", err + } + + id := peer.ID(hash) + if r.host.Peerstore().PrivKey(id) != nil { + return "", errors.New("Cannot resolve own name through pubsub") + } + + pubk := id.ExtractPublicKey() + if pubk == nil { + pubk, err = r.pkf.GetPublicKey(ctx, id) + if err != nil { + log.Warningf("PubsubResolve: error fetching public key: %s [%s]", err.Error(), xname) + return "", err + } + } + + // the topic is /ipns/Qmhash + if !strings.HasPrefix(name, "/ipns/") { + name = "/ipns/" + name + } + + r.mx.Lock() + // see if we already have a pubsub subscription; if not, subscribe + sub, ok := r.subs[name] + if !ok { + sub, err = r.ps.Subscribe(name) + if err != nil { + r.mx.Unlock() + return "", err + } + + log.Debugf("PubsubResolve: subscribed to %s", name) + + r.subs[name] = sub + + ctx, cancel := context.WithCancel(r.ctx) + go r.handleSubscription(sub, name, pubk, cancel) + go bootstrapPubsub(ctx, r.cr, r.host, name) + } + r.mx.Unlock() + + // resolve to what we may already have in the datastore + dsval, err := r.ds.Get(dshelp.NewKeyFromBinary([]byte(name))) + if err != nil { + if err == ds.ErrNotFound { + return "", ErrResolveFailed + } + return "", err + } + + data := dsval.([]byte) + entry := new(pb.IpnsEntry) + + err = proto.Unmarshal(data, entry) + if err != nil { + return "", err + } + + // check EOL; if the entry has expired, delete from datastore and return ds.ErrNotFound + eol, ok := checkEOL(entry) + if ok && eol.Before(time.Now()) { + err = r.ds.Delete(dshelp.NewKeyFromBinary([]byte(name))) + if err != nil { + log.Warningf("PubsubResolve: error deleting stale value for %s: %s", name, err.Error()) + } + + return "", ErrResolveFailed + } + + value, err := path.ParsePath(string(entry.GetValue())) + return value, err +} + +// GetSubscriptions retrieves a list of active topic subscriptions +func (r *PubsubResolver) GetSubscriptions() []string { + r.mx.Lock() + defer r.mx.Unlock() + + var res []string + for sub := range r.subs { + res = append(res, sub) + } + + return res +} + +// Cancel cancels a topic subscription; returns true if an active +// subscription was canceled +func (r *PubsubResolver) Cancel(name string) bool { + r.mx.Lock() + defer r.mx.Unlock() + + sub, ok := r.subs[name] + if ok { + sub.Cancel() + delete(r.subs, name) + } + + return ok +} + +func (r *PubsubResolver) handleSubscription(sub *floodsub.Subscription, name string, pubk ci.PubKey, cancel func()) { + defer sub.Cancel() + defer cancel() + + for { + msg, err := sub.Next(r.ctx) + if err != nil { + if err != context.Canceled { + log.Warningf("PubsubResolve: subscription error in %s: %s", name, err.Error()) + } + return + } + + err = r.receive(msg, name, pubk) + if err != nil { + log.Warningf("PubsubResolve: error proessing update for %s: %s", name, err.Error()) + } + } +} + +func (r *PubsubResolver) receive(msg *floodsub.Message, name string, pubk ci.PubKey) error { + data := msg.GetData() + if data == nil { + return errors.New("empty message") + } + + entry := new(pb.IpnsEntry) + err := proto.Unmarshal(data, entry) + if err != nil { + return err + } + + ok, err := pubk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()) + if err != nil || !ok { + return errors.New("signature verification failed") + } + + _, err = path.ParsePath(string(entry.GetValue())) + if err != nil { + return err + } + + eol, ok := checkEOL(entry) + if ok && eol.Before(time.Now()) { + return errors.New("stale update; EOL exceeded") + } + + // check the sequence number against what we may already have in our datastore + oval, err := r.ds.Get(dshelp.NewKeyFromBinary([]byte(name))) + if err == nil { + odata := oval.([]byte) + oentry := new(pb.IpnsEntry) + + err = proto.Unmarshal(odata, oentry) + if err != nil { + return err + } + + if entry.GetSequence() <= oentry.GetSequence() { + return errors.New("stale update; sequence number too small") + } + } + + log.Debugf("PubsubResolve: receive IPNS record for %s", name) + + return r.ds.Put(dshelp.NewKeyFromBinary([]byte(name)), data) +} + +// rendezvous with peers in the name topic through provider records +// Note: rendezbous/boostrap should really be handled by the pubsub implementation itself! +func bootstrapPubsub(ctx context.Context, cr routing.ContentRouting, host p2phost.Host, name string) { + topic := "floodsub:" + name + hash := u.Hash([]byte(topic)) + rz := cid.NewCidV1(cid.Raw, hash) + + err := cr.Provide(ctx, rz, true) + if err != nil { + log.Warningf("bootstrapPubsub: error providing rendezvous for %s: %s", topic, err.Error()) + } + + go func() { + for { + select { + case <-time.After(8 * time.Hour): + err := cr.Provide(ctx, rz, true) + if err != nil { + log.Warningf("bootstrapPubsub: error providing rendezvous for %s: %s", topic, err.Error()) + } + case <-ctx.Done(): + return + } + } + }() + + rzctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + + wg := &sync.WaitGroup{} + for pi := range cr.FindProvidersAsync(rzctx, rz, 10) { + if pi.ID == host.ID() { + continue + } + wg.Add(1) + go func(pi pstore.PeerInfo) { + defer wg.Done() + + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + + err := host.Connect(ctx, pi) + if err != nil { + log.Debugf("Error connecting to pubsub peer %s: %s", pi.ID, err.Error()) + return + } + + // delay to let pubsub perform its handshake + time.Sleep(time.Millisecond * 250) + + log.Debugf("Connected to pubsub peer %s", pi.ID) + }(pi) + } + + wg.Wait() +} diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go new file mode 100644 index 0000000000..a7fa7be9bb --- /dev/null +++ b/namesys/pubsub_test.go @@ -0,0 +1,187 @@ +package namesys + +import ( + "context" + "sync" + "testing" + "time" + + path "github.com/ipfs/go-ipfs/path" + mockrouting "github.com/ipfs/go-ipfs/routing/mock" + + routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" + pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" + testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" + netutil "gx/ipfs/QmUUNDRYXgfqdjxTg79ogkciczU5y4WY1tKMU2vEX9CRN7/go-libp2p-netutil" + floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" + ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + bhost "gx/ipfs/Qmb37wDRoh9VZMZXmmZktN35szvj9GeBYDtA9giDmXwwd7/go-libp2p-blankhost" +) + +func newNetHost(ctx context.Context, t *testing.T) p2phost.Host { + netw := netutil.GenSwarmNetwork(t, ctx) + return bhost.NewBlankHost(netw) +} + +func newNetHosts(ctx context.Context, t *testing.T, n int) []p2phost.Host { + var out []p2phost.Host + + for i := 0; i < n; i++ { + h := newNetHost(ctx, t) + out = append(out, h) + } + + return out +} + +// PubKeyFetcher implementation with a global key store +type mockKeyStore struct { + keys map[peer.ID]ci.PubKey + mx sync.Mutex +} + +func (m *mockKeyStore) addPubKey(id peer.ID, pkey ci.PubKey) { + m.mx.Lock() + defer m.mx.Unlock() + m.keys[id] = pkey +} + +func (m *mockKeyStore) getPubKey(id peer.ID) (ci.PubKey, error) { + m.mx.Lock() + defer m.mx.Unlock() + pkey, ok := m.keys[id] + if ok { + return pkey, nil + } + + return nil, routing.ErrNotFound +} + +func (m *mockKeyStore) GetPublicKey(ctx context.Context, id peer.ID) (ci.PubKey, error) { + return m.getPubKey(id) +} + +func newMockKeyStore() *mockKeyStore { + return &mockKeyStore{ + keys: make(map[peer.ID]ci.PubKey), + } +} + +// ConentRouting mock +func newMockRouting(ms mockrouting.Server, ks *mockKeyStore, host p2phost.Host) routing.ContentRouting { + id := host.ID() + + privk := host.Peerstore().PrivKey(id) + pubk := host.Peerstore().PubKey(id) + pi := host.Peerstore().PeerInfo(id) + + ks.addPubKey(id, pubk) + return ms.Client(testutil.NewIdentity(id, pi.Addrs[0], privk, pubk)) +} + +func newMockRoutingForHosts(ms mockrouting.Server, ks *mockKeyStore, hosts []p2phost.Host) []routing.ContentRouting { + rs := make([]routing.ContentRouting, len(hosts)) + for i := 0; i < len(hosts); i++ { + rs[i] = newMockRouting(ms, ks, hosts[i]) + } + return rs +} + +// tests +func TestPubsubPublishSubscribe(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ms := mockrouting.NewServer() + ks := newMockKeyStore() + + pubhost := newNetHost(ctx, t) + pubmr := newMockRouting(ms, ks, pubhost) + pub := NewPubsubPublisher(ctx, pubhost, ds.NewMapDatastore(), pubmr, floodsub.NewFloodSub(ctx, pubhost)) + privk := pubhost.Peerstore().PrivKey(pubhost.ID()) + pubpinfo := pstore.PeerInfo{ID: pubhost.ID(), Addrs: pubhost.Addrs()} + + name := "/ipns/" + pubhost.ID().Pretty() + + reshosts := newNetHosts(ctx, t, 5) + resmrs := newMockRoutingForHosts(ms, ks, reshosts) + res := make([]*PubsubResolver, len(reshosts)) + for i := 0; i < len(res); i++ { + res[i] = NewPubsubResolver(ctx, reshosts[i], resmrs[i], ks, floodsub.NewFloodSub(ctx, reshosts[i])) + if err := reshosts[i].Connect(ctx, pubpinfo); err != nil { + t.Fatal(err) + } + } + + time.Sleep(time.Millisecond * 100) + for i := 0; i < len(res); i++ { + checkResolveNotFound(ctx, t, i, res[i], name) + // delay to avoid connection storms + time.Sleep(time.Millisecond * 100) + } + + // let the bootstrap finish + time.Sleep(time.Second * 1) + + val := path.Path("/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY") + err := pub.Publish(ctx, privk, val) + if err != nil { + t.Fatal(err) + } + + // let the flood propagate + time.Sleep(time.Second * 1) + for i := 0; i < len(res); i++ { + checkResolve(ctx, t, i, res[i], name, val) + } + + val = path.Path("/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD") + err = pub.Publish(ctx, privk, val) + if err != nil { + t.Fatal(err) + } + + // let the flood propagate + time.Sleep(time.Second * 1) + for i := 0; i < len(res); i++ { + checkResolve(ctx, t, i, res[i], name, val) + } + + // cancel subscriptions + for i := 0; i < len(res); i++ { + res[i].Cancel(name) + } + time.Sleep(time.Millisecond * 100) + + nval := path.Path("/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr") + err = pub.Publish(ctx, privk, nval) + if err != nil { + t.Fatal(err) + } + + // check we still have the old value in the resolver + time.Sleep(time.Second * 1) + for i := 0; i < len(res); i++ { + checkResolve(ctx, t, i, res[i], name, val) + } +} + +func checkResolveNotFound(ctx context.Context, t *testing.T, i int, resolver Resolver, name string) { + _, err := resolver.Resolve(ctx, name) + if err != ErrResolveFailed { + t.Fatalf("[resolver %d] unexpected error: %s", i, err.Error()) + } +} + +func checkResolve(ctx context.Context, t *testing.T, i int, resolver Resolver, name string, val path.Path) { + xval, err := resolver.Resolve(ctx, name) + if err != nil { + t.Fatalf("[resolver %d] resolve failed: %s", i, err.Error()) + } + if xval != val { + t.Fatalf("[resolver %d] unexpected value: %s %s", i, val, xval) + } +} From 411d608548d4683f786b6f1bcf30081683f4a02c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Nov 2017 15:22:00 -0800 Subject: [PATCH 1762/3147] publish ipns records on start (after a delay of 1 minute) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@70bbe63ca77d8d38c5cffaa358946c2ec7224ae2 --- namesys/republisher/repub.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 3ab382473b..b7c864cbd6 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -27,6 +27,7 @@ var errNoEntry = errors.New("no previous entry") var log = logging.Logger("ipns-repub") var DefaultRebroadcastInterval = time.Hour * 4 +var InitialRebroadcastDelay = time.Minute * 1 const DefaultRecordLifetime = time.Hour * 24 @@ -57,10 +58,12 @@ func NewRepublisher(r routing.ValueStore, ds ds.Datastore, self ic.PrivKey, ks k func (rp *Republisher) Run(proc goprocess.Process) { tick := time.NewTicker(rp.Interval) defer tick.Stop() + delayCh := time.After(InitialRebroadcastDelay) for { select { - case <-tick.C: + case <-delayCh: + delayCh = tick.C err := rp.republishEntries(proc) if err != nil { log.Error("Republisher failed to republish: ", err) From b76d31c5bb68102810886e4cedcb9244f1075a39 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Nov 2017 15:27:49 -0800 Subject: [PATCH 1763/3147] retry publishing IPNS records every 5 minutes on failure This way, if we *happen* to be offline while attempting a publish, we don't wait the full interval. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@a0ddd0a72812a25cab5d6965eabe18671941227a --- namesys/republisher/repub.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index b7c864cbd6..28a873f104 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -28,6 +28,7 @@ var log = logging.Logger("ipns-repub") var DefaultRebroadcastInterval = time.Hour * 4 var InitialRebroadcastDelay = time.Minute * 1 +var FailureRetryInterval = time.Minute * 5 const DefaultRecordLifetime = time.Hour * 24 @@ -56,17 +57,17 @@ func NewRepublisher(r routing.ValueStore, ds ds.Datastore, self ic.PrivKey, ks k } func (rp *Republisher) Run(proc goprocess.Process) { - tick := time.NewTicker(rp.Interval) - defer tick.Stop() - delayCh := time.After(InitialRebroadcastDelay) + timer := time.NewTimer(InitialRebroadcastDelay) + defer timer.Stop() for { select { - case <-delayCh: - delayCh = tick.C + case <-timer.C: + timer.Reset(rp.Interval) err := rp.republishEntries(proc) if err != nil { log.Error("Republisher failed to republish: ", err) + timer.Reset(FailureRetryInterval) } case <-proc.Closing(): return From c126bd313e6c5a6b2326d208f28219660d6e2a38 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Nov 2017 15:46:34 -0800 Subject: [PATCH 1764/3147] document ipns republisher variables (makes code climate happy) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@85da0e65d1d92b55cd09146dfdb57849eefb10d8 --- namesys/republisher/repub.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 28a873f104..e1b0473d8c 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -26,10 +26,16 @@ var errNoEntry = errors.New("no previous entry") var log = logging.Logger("ipns-repub") +// DefaultRebroadcastInterval is the default interval at which we rebroadcast IPNS records var DefaultRebroadcastInterval = time.Hour * 4 + +// InitialRebroadcastDelay is the delay before first broadcasting IPNS records on start var InitialRebroadcastDelay = time.Minute * 1 + +// FailureRetryInterval is the interval at which we retry IPNS records broadcasts (when they fail) var FailureRetryInterval = time.Minute * 5 +// DefaultRecordLifetime is the default lifetime for IPNS records const DefaultRecordLifetime = time.Hour * 24 type Republisher struct { From 36b580c1f51076d1d4dc774c9624362f2a8eb0d9 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Nov 2017 15:54:06 -0800 Subject: [PATCH 1765/3147] always obey the IPNS rebroadcast interval if it's smaller License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@a67ebbd2a801005f2eda25f698cbb74e278e217a --- namesys/republisher/repub.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index e1b0473d8c..4b1496fe6f 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -65,6 +65,9 @@ func NewRepublisher(r routing.ValueStore, ds ds.Datastore, self ic.PrivKey, ks k func (rp *Republisher) Run(proc goprocess.Process) { timer := time.NewTimer(InitialRebroadcastDelay) defer timer.Stop() + if rp.Interval < InitialRebroadcastDelay { + timer.Reset(rp.Interval) + } for { select { @@ -73,7 +76,9 @@ func (rp *Republisher) Run(proc goprocess.Process) { err := rp.republishEntries(proc) if err != nil { log.Error("Republisher failed to republish: ", err) - timer.Reset(FailureRetryInterval) + if FailureRetryInterval < rp.Interval { + timer.Reset(FailureRetryInterval) + } } case <-proc.Closing(): return From 3240e210b45bafc00d63d8a19783e82955618886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1766/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@8df35968bdab1afdb7d2c5481e3855136a020325 --- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/publisher.go | 2 +- namesys/publisher_test.go | 4 ++-- namesys/pubsub.go | 4 ++-- namesys/pubsub_test.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 82952f250f..cc284fb2ca 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -13,10 +13,10 @@ import ( p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 78396c25ee..66062156d5 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,9 +10,9 @@ import ( offroute "github.com/ipfs/go-ipfs/routing/offline" "github.com/ipfs/go-ipfs/unixfs" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index 66214100fa..03feb204a6 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -16,12 +16,12 @@ import ( routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 28635f3bfc..47045669ac 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -11,11 +11,11 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) type identity struct { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 6c1284f270..f6af423c86 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -19,13 +19,13 @@ import ( u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) // PubsubPublisher is a publisher that distributes IPNS records through pubsub diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index a7fa7be9bb..9fab0238b1 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -15,10 +15,10 @@ import ( p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" netutil "gx/ipfs/QmUUNDRYXgfqdjxTg79ogkciczU5y4WY1tKMU2vEX9CRN7/go-libp2p-netutil" floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" bhost "gx/ipfs/Qmb37wDRoh9VZMZXmmZktN35szvj9GeBYDtA9giDmXwwd7/go-libp2p-blankhost" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) func newNetHost(ctx context.Context, t *testing.T) p2phost.Host { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4b1496fe6f..ffd12a30e2 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -15,11 +15,11 @@ import ( goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" recpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 7503ad3d7e..6490507817 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -10,9 +10,9 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { From a02b31d52830eb52f7926be62753177525998e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1767/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@efdb0f508f62347d47b89a63f3863c33720609f1 --- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ce3722aeb3..4faaea6f75 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -15,7 +15,7 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index fc303b6f23..3298ef7e0a 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -12,8 +12,8 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 856a86a971..d68e79f8a6 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -11,8 +11,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" ) func ignoreCids(_ *cid.Cid) {} From afb1c758a87da6a880cc599b43705a49f50aaf38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1768/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-mfs@b7193a383a0d03df094af30b803308352dcd6017 --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index bebfa8d308..c225a08eb8 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -27,8 +27,8 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func emptyDirNode() *dag.ProtoNode { From cc00df5d85ffab633a1455cbe98d256bbbb31805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1769/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-blockservice@15d7b8a115e4c2c236800d7d97c34166537f451b --- blockservice/blockservice_test.go | 4 ++-- blockservice/test/blocks_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 1ce735f8bd..7d808f5161 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -8,8 +8,8 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 59e1b4e91c..f59ccf1e57 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -14,8 +14,8 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func newObject(data []byte) blocks.Block { From c4619300f19d5c8752c8dfe5a4c6510be2dd6d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1770/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-blockstore@2f8f9452adcc1da360f8371a86fbfc483be1e5c1 --- blockstore/arc_cache.go | 2 +- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 6 +++--- blockstore/blockstore_test.go | 6 +++--- blockstore/bloom_cache_test.go | 6 +++--- blockstore/util/remove.go | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 47ddf2d4c1..5062ab1978 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -7,8 +7,8 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 0232249d3f..c73ecfffb8 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -7,8 +7,8 @@ import ( "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - syncds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + syncds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 21bf046125..21f6919c69 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -13,9 +13,9 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" - dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dsns "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/namespace" + dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 8bc2b2f1b3..e0e40f3b84 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -11,9 +11,9 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" - ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" + ds_sync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 4eb8d1aca0..21bfaca1b2 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -9,9 +9,9 @@ import ( "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" context "context" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" - syncds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" + syncds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func testBloomCached(ctx context.Context, bs Blockstore) (*bloomcache, error) { diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 467f55092a..6fc24f01eb 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -6,7 +6,7 @@ import ( "io" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From 495bc37e30d1c7d64d8791951a0aad0546933d55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1771/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-routing@e189eacc32c210d1d9a9e912c44df5f84bd5a6dd --- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 4 ++-- routing/mock/interface.go | 2 +- routing/offline/offline.go | 2 +- routing/offline/offline_test.go | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 407629299f..7006b20e47 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -13,11 +13,11 @@ import ( pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 02929a4cf6..e3544de599 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -10,9 +10,9 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dssync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 5dcbbd21db..cd1da17df2 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -11,8 +11,8 @@ import ( "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) // Server provides mockrouting Clients diff --git a/routing/offline/offline.go b/routing/offline/offline.go index df26571758..a154d31874 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -10,12 +10,12 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) var ErrOffline = errors.New("routing system in offline mode") diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 2b1eb521ec..d49c9c8512 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -6,7 +6,7 @@ import ( "testing" "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) func TestOfflineRouterStorage(t *testing.T) { From bdc02ef7589956f1ccfe64b47080033c9652615e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1772/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-filestore@771a82690d5642860d6b25301d46fb28c9d32369 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 6 +++--- filestore/util.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 9e33f7ed8c..095b1018d2 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -16,7 +16,7 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 8f972dec0e..e9425aa957 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -12,7 +12,7 @@ import ( posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 9f8ac62f51..881ce82336 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -15,9 +15,9 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dsns "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/namespace" - dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dsns "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/namespace" + dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 1e4f462b93..985281e236 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -9,8 +9,8 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - dsq "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/query" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" ) // Status is used to identify the state of the block data referenced From 5f315566b1073a405615ac3a7181a78a83d94e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1773/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-ds-help@4809e1e105c9ec9fe618846bf805700938c4fc55 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 21a12c7b48..a176ee0bb8 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -2,7 +2,7 @@ package dshelp import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) From a29bc82628eb3350a0715ff11829053f52b1ee33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 19 Nov 2017 04:32:55 +0100 Subject: [PATCH 1774/3147] gx: Update go-datastore to 1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-exchange-offline@9939618cfde044d154fd681e22da3d8da4f222e9 --- exchange/offline/offline_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index fce8b613ee..9abf97eb72 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -10,8 +10,8 @@ import ( cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore" - ds_sync "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore/sync" + ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + ds_sync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) func TestBlockReturnsErr(t *testing.T) { From 38f74d8431adf5aecd0b99b6b64bc22d3b4c9960 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 18:58:05 -0800 Subject: [PATCH 1775/3147] don't add nodes to DAG twice. Now that we add nodes to the DAG when pinning, don't bother adding them twice. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@9e4a37349f6855d53836a9ea48e6a838b9d19ae4 --- namesys/publisher.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 03feb204a6..e98c239166 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,7 +7,6 @@ import ( "fmt" "time" - dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" @@ -321,16 +320,12 @@ func ValidateIpnsRecord(k string, val []byte) error { // InitializeKeyspace sets the ipns record for the given key to // point to an empty directory. // TODO: this doesnt feel like it belongs here -func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, pins pin.Pinner, key ci.PrivKey) error { +func InitializeKeyspace(ctx context.Context, pub Publisher, pins pin.Pinner, key ci.PrivKey) error { emptyDir := ft.EmptyDirNode() - nodek, err := ds.Add(emptyDir) - if err != nil { - return err - } // pin recursively because this might already be pinned // and doing a direct pin would throw an error in that case - err = pins.Pin(ctx, emptyDir, true) + err := pins.Pin(ctx, emptyDir, true) if err != nil { return err } @@ -340,7 +335,7 @@ func InitializeKeyspace(ctx context.Context, ds dag.DAGService, pub Publisher, p return err } - return pub.Publish(ctx, key, path.FromCid(nodek)) + return pub.Publish(ctx, key, path.FromCid(emptyDir.Cid())) } func IpnsKeysForID(id peer.ID) (name, ipns string) { From b7e9594ed2781939379dbe23426dbebb9caec943 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 18:53:02 -0800 Subject: [PATCH 1776/3147] add node to dagserv under lock Otherwise, we could run a GC between adding and pinning. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@d8e8d19bf7bc60315bccfe6383180b6616015ffa --- pinning/pinner/pin.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4faaea6f75..0e55963b36 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -172,7 +172,10 @@ func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { func (p *pinner) Pin(ctx context.Context, node node.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() - c := node.Cid() + c, err := p.dserv.Add(node) + if err != nil { + return err + } if recurse { if p.recursePin.Has(c) { From d49a740ee20d6c855a3751c54cf51fda64bf3119 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 4 Dec 2017 10:59:57 -0800 Subject: [PATCH 1777/3147] appease codeclimate License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@0ad237b4cbbdf5ec0b729bb79e09c74760de929e --- unixfs/hamt/hamt.go | 48 ++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index bd73434cb0..034c45ebbc 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -501,35 +501,35 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, child.val = val return nil - } else { - if val == nil { - return os.ErrNotExist - } + } - // replace value with another shard, one level deeper - ns, err := NewHamtShard(ds.dserv, ds.tableSize) - if err != nil { - return err - } - ns.prefix = ds.prefix - chhv := &hashBits{ - b: hash([]byte(child.key)), - consumed: hv.consumed, - } + if val == nil { + return os.ErrNotExist + } - err = ns.modifyValue(ctx, hv, key, val) - if err != nil { - return err - } + // replace value with another shard, one level deeper + ns, err := NewHamtShard(ds.dserv, ds.tableSize) + if err != nil { + return err + } + ns.prefix = ds.prefix + chhv := &hashBits{ + b: hash([]byte(child.key)), + consumed: hv.consumed, + } - err = ns.modifyValue(ctx, chhv, child.key, child.val) - if err != nil { - return err - } + err = ns.modifyValue(ctx, hv, key, val) + if err != nil { + return err + } - ds.setChild(cindex, ns) - return nil + err = ns.modifyValue(ctx, chhv, child.key, child.val) + if err != nil { + return err } + + ds.setChild(cindex, ns) + return nil default: return fmt.Errorf("unexpected type for child: %#v", child) } From 9be3c6c6c8f3f311a96917d7ac3c323e2ae44ab7 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sun, 26 Nov 2017 03:17:41 +0100 Subject: [PATCH 1778/3147] namesys: degrade most logging to debug level License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-namesys@e1de4367cc2ebcf3fa5968ddc4b1a6f954b5f8d7 --- namesys/base.go | 3 +-- namesys/dns.go | 2 +- namesys/namesys.go | 4 ++-- namesys/routing.go | 10 +++++----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index c79fbeb94c..9953eddc58 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -18,10 +18,9 @@ func resolve(ctx context.Context, r resolver, name string, depth int, prefixes . for { p, err := r.resolveOnce(ctx, name) if err != nil { - log.Warningf("Could not resolve %s", name) return "", err } - log.Debugf("Resolved %s to %s", name, p.String()) + log.Debugf("resolved %s to %s", name, p.String()) if strings.HasPrefix(p.String(), "/ipfs/") { // we've bottomed out with an IPFS path diff --git a/namesys/dns.go b/namesys/dns.go index 1267ef56b1..de5c98fdbe 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -55,7 +55,7 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, if !isd.IsDomain(domain) { return "", errors.New("not a valid domain name") } - log.Infof("DNSResolver resolving %s", domain) + log.Debugf("DNSResolver resolving %s", domain) rootChan := make(chan lookupRes, 1) go workDomain(r, domain, rootChan) diff --git a/namesys/namesys.go b/namesys/namesys.go index cc284fb2ca..f6c8adbc2a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -91,7 +91,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) } segments := strings.SplitN(name, "/", 4) if len(segments) < 3 || segments[0] != "" { - log.Warningf("Invalid name syntax for %s", name) + log.Debugf("invalid name syntax for %s", name) return "", ErrResolveFailed } @@ -153,7 +153,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) return "", ErrResolveFailed } - log.Warningf("No resolver found for %s", name) + log.Debugf("no resolver found for %s", name) return "", ErrResolveFailed } diff --git a/namesys/routing.go b/namesys/routing.go index 19e8b34d36..22ec45a477 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -117,7 +117,7 @@ func (r *routingResolver) ResolveN(ctx context.Context, name string, depth int) // resolveOnce implements resolver. Uses the IPFS routing system to // resolve SFS-like names. func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { - log.Debugf("RoutingResolve: '%s'", name) + log.Debugf("RoutingResolver resolving %s", name) cached, ok := r.cacheGet(name) if ok { return cached, nil @@ -127,7 +127,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa hash, err := mh.FromB58String(name) if err != nil { // name should be a multihash. if it isn't, error out here. - log.Warningf("RoutingResolve: bad input hash: [%s]\n", name) + log.Debugf("RoutingResolver: bad input hash: [%s]\n", name) return "", err } @@ -143,7 +143,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa ipnsKey := string(h) val, err := r.routing.GetValue(ctx, ipnsKey) if err != nil { - log.Warning("RoutingResolve get failed.") + log.Debugf("RoutingResolver: dht get failed: %s", err) resp <- err return } @@ -179,7 +179,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa // check sig with pk if ok, err := pubkey.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { - return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pubkey) + return "", fmt.Errorf("ipns entry for %s has invalid signature", h) } // ok sig checks out. this is a valid name. @@ -197,7 +197,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa return p, nil } else { // Its an old style multihash record - log.Warning("Detected old style multihash record") + log.Debugf("encountered CIDv0 ipns entry: %s", h) p := path.FromCid(cid.NewCidV0(valh)) r.cacheSet(name, p, entry) return p, nil From efbab5e602175954bcef811bbbba89340ebfe687 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1779/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@b5fea556bf3c13bbeed2b0fe72605f0c23b17ae3 --- coreiface/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 78a64dd40b..aef86d63ad 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -5,8 +5,8 @@ import ( "errors" "io" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ipld "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + ipld "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) type Path interface { From 8632fa68f62d80c1c3b7ca2f3977ed0b08b21a3f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1780/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@2a5b689c9bfd914578286cc09d68d9189bdf072d --- chunker/rabin_test.go | 4 ++-- chunker/splitting_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 9cef888ce2..888b9ac2ed 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -6,8 +6,8 @@ import ( "io" "testing" - util "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + util "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" ) func TestRabinChunking(t *testing.T) { diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index a9d3798e61..ff433f0485 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From 1e33e263ecc232a8b3718715a3698fd5113f1155 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1781/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@5f0190feb7335474468851c45ba98a0e751cfd45 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 2 +- unixfs/test/utils.go | 8 ++++---- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index b913300efb..8061f90ddd 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index f00d0422fd..360334b79c 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,7 +13,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 034c45ebbc..fdf7223877 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,9 +31,9 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index a7ed7944e9..8ec527033c 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index f86d23fb77..1ab8cf7121 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,9 +8,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index dceba71a70..a66de7bdf4 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 23c1945a50..92fd3f4ccc 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,9 +14,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 473d34294c..d6ba1ddb80 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -13,7 +13,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ) func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, opts testu.NodeOpts) []byte { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 24359d377b..8ea7de6e16 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -15,10 +15,10 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From 99a2ed8b0f2f144481baae958f8ce6e205e048a7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1782/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@b91d6098e0baf15df89a9088e970273a1b850052 --- mfs/dir.go | 4 ++-- mfs/file.go | 2 +- mfs/mfs_test.go | 6 +++--- mfs/ops.go | 4 ++-- mfs/repub_test.go | 4 ++-- mfs/system.go | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 219dc4cceb..57e4554f08 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 0ff8b41dec..3630268868 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index c225a08eb8..6498a76158 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 49ce398d44..214a66fca8 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,8 +9,8 @@ import ( path "github.com/ipfs/go-ipfs/path" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 45b9006b4c..60045fec56 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - ci "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil/ci" + ci "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil/ci" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index fc5be0f6e2..f0dd099583 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,9 +19,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From 1ee4bdd150a0b944ec6df4465af3741535ce0f67 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1783/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@96db6fa79cda8cb18fda63ce7d613daff1550fd8 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index c9e6cac706..f3b98597bc 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 0e55963b36..dc2eee7f2d 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,10 +12,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 3298ef7e0a..f34283b79c 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,10 +10,10 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index c191744fd8..116e622971 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index d68e79f8a6..1ee16ed384 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -10,9 +10,9 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func ignoreCids(_ *cid.Cid) {} From 74f6ea40d22641ea904224a624db60087c8fde8c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1784/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@8b810ae1865bedd8cf3d29a1148d53fd1638dff6 --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 2 +- blockservice/test/blocks_test.go | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 6bd04c3abb..7929a67f3a 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -12,9 +12,9 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 7d808f5161..00d9ccabff 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index f59ccf1e57..da54461d6d 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,12 +10,12 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func newObject(data []byte) blocks.Block { From 5b168b444987b02e84fd45fb0c84bcd118324b09 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1785/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-blockstore@ce76423d55ce7315b6f1ef7e20e9dc8cf0f67e3d --- blockstore/arc_cache.go | 4 ++-- blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 6 +++--- blockstore/bloom_cache.go | 4 ++-- blockstore/bloom_cache_test.go | 2 +- blockstore/util/remove.go | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 5062ab1978..da3b6d7a2f 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,12 +3,12 @@ package blockstore import ( "context" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index c73ecfffb8..734f1e73dd 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,11 +4,11 @@ import ( "context" "testing" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" syncds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 21f6919c69..4ef59ffe33 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -9,13 +9,13 @@ import ( "sync/atomic" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dsns "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/namespace" dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index e0e40f3b84..31e75acf65 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -7,13 +7,13 @@ import ( "testing" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" ds_sync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 79a4596e07..b06f56c115 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,11 +5,11 @@ import ( "sync/atomic" "time" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" bloom "gx/ipfs/QmXqKGu7QzfRzFC4yd5aL9sThYx22vY163VGwmxfp5qGHk/bbloom" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // bloomCached returns a Blockstore that caches Has requests using a Bloom diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 21bfaca1b2..f2f1666fee 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" context "context" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 6fc24f01eb..94b52254ea 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -5,8 +5,8 @@ import ( "fmt" "io" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From 872fc007660901d824fd7e2b0638c3ca6c79a0e4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1786/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@7d6cd1c45f81cc8c03c4aac2fb50a137cf564606 --- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 10 +++++----- namesys/publisher.go | 10 +++++----- namesys/publisher_test.go | 6 +++--- namesys/pubsub.go | 20 ++++++++++---------- namesys/pubsub_test.go | 16 ++++++++-------- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 8 ++++---- 10 files changed, 43 insertions(+), 43 deletions(-) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 9c0f341143..e36eade006 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -9,7 +9,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index f6c8adbc2a..7f7adec1ff 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -9,11 +9,11 @@ import ( path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" - mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" - floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + floodsub "gx/ipfs/QmP1T1SGU6276R2MHKP2owbck37Fnzd6ZkpyNJvnG2LoTG/go-libp2p-floodsub" + p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" diff --git a/namesys/publisher.go b/namesys/publisher.go index e98c239166..bdfbe5e3be 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -13,13 +13,13 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + record "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record" + dhtpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" - dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 47045669ac..37e3aeeae6 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -10,12 +10,12 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" - ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ma "gx/ipfs/QmW8s4zTsUoX1Q6CeYxVKPyqSKbF7H1YDUyTostBtZ8DaG/go-multiaddr" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + testutil "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" ) type identity struct { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index f6af423c86..6760568528 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -12,20 +12,20 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" - mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" - floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + floodsub "gx/ipfs/QmP1T1SGU6276R2MHKP2owbck37Fnzd6ZkpyNJvnG2LoTG/go-libp2p-floodsub" + p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + record "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record" + dhtpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" - dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // PubsubPublisher is a publisher that distributes IPNS records through pubsub diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index 9fab0238b1..c82a425db9 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -9,16 +9,16 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" - p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" - netutil "gx/ipfs/QmUUNDRYXgfqdjxTg79ogkciczU5y4WY1tKMU2vEX9CRN7/go-libp2p-netutil" - floodsub "gx/ipfs/QmVNv1WV6XxzQV4MBuiLX5729wMazaf8TNzm2Sq6ejyHh7/go-libp2p-floodsub" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + floodsub "gx/ipfs/QmP1T1SGU6276R2MHKP2owbck37Fnzd6ZkpyNJvnG2LoTG/go-libp2p-floodsub" + p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" + bhost "gx/ipfs/QmYmhgAcvmDGXct1qBvc1kz9BxQSit1XBrTeiGZp2FvRyn/go-libp2p-blankhost" + netutil "gx/ipfs/QmZTcPxK6VqrwY94JpKZPvEqAZ6tEr1rLrpcqJbbRZbg2V/go-libp2p-netutil" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - bhost "gx/ipfs/Qmb37wDRoh9VZMZXmmZktN35szvj9GeBYDtA9giDmXwwd7/go-libp2p-blankhost" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + testutil "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" ) func newNetHost(ctx context.Context, t *testing.T) p2phost.Host { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index ffd12a30e2..d871aaca3c 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,14 +11,14 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + recpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - recpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 43c9c1f5e3..441b7cce2e 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -12,9 +12,9 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmTzs3Gp2rU3HuNayjBVG7qBgbaKWE8bgtwJ7faRxAe9UP/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" + mocknet "gx/ipfs/Qma23bpHwQrQyvKeBemaeJh7sAoRHggPkgnge1B9489ff5/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 6490507817..9c1f838164 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,9 +8,9 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + testutil "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 22ec45a477..cd6ee7c4b3 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - mh "gx/ipfs/QmU9a9NV9RdPNwZQDYd5uKsm6N6LJLSvLbywDDYFbaaC6P/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("namesys") From ee36ce753bab98788b884d3969aa797063e1172a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1787/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@e46eb708290007ceaf819a1174d0ce6fa1b00c4a --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index 85e163a258..9c4d8f135e 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index 094bc755ea..c4aabe1b75 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index 200fe1f378..5339328144 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" - util "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + util "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ) func randNode() *merkledag.ProtoNode { From 80b1e90338a91053e4f8d6370e4bdcc102e1378d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1788/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@1ff01d3f89b31d1cf3e714587d4bbc48960b29f3 --- routing/mock/centralized_client.go | 16 ++++++++-------- routing/mock/centralized_server.go | 8 ++++---- routing/mock/centralized_test.go | 8 ++++---- routing/mock/interface.go | 6 +++--- routing/none/none_client.go | 10 +++++----- routing/offline/offline.go | 12 ++++++------ routing/offline/offline_test.go | 2 +- 7 files changed, 31 insertions(+), 31 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 7006b20e47..175a9d436d 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,18 +6,18 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + ma "gx/ipfs/QmW8s4zTsUoX1Q6CeYxVKPyqSKbF7H1YDUyTostBtZ8DaG/go-multiaddr" + dhtpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dhtpb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index e3544de599..1a3d6ef374 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,13 +6,13 @@ import ( "sync" "time" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 9ecba1181d..917b71afb7 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,11 +6,11 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index cd1da17df2..3aed934ce3 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,10 +8,10 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" + "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index ccf535fcac..64f9893b03 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - p2phost "gx/ipfs/QmRS46AyqtpJBsf1zmQdeizSDEzo1qkWR7rdEuPFAv8237/go-libp2p-host" - peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) type nilclient struct { diff --git a/routing/offline/offline.go b/routing/offline/offline.go index a154d31874..a1d58f0920 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,15 +7,15 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - routing "gx/ipfs/QmPR2JzfKd9poHx9XBhzoFeBBC31ZM3W5iUPKJZWyaoZZm/go-libp2p-routing" - pstore "gx/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr/go-libp2p-peerstore" - "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer" + routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + record "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record" + pb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" + "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record" - pb "gx/ipfs/QmbxkgUceEcuSZ4ZdBA3x74VUDSSYjHYmmeEqkjxbtZ6Jg/go-libp2p-record/pb" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var ErrOffline = errors.New("routing system in offline mode") diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index d49c9c8512..e0da0d2ef0 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -5,8 +5,8 @@ import ( "context" "testing" - "gx/ipfs/QmQgLZP9haZheimMHqqAjJh2LhRmNfEoZDfbtkpeMhi9xK/go-testutil" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" ) func TestOfflineRouterStorage(t *testing.T) { From 2d886dab72a0ac9dfc3a0491a74088d8a907d918 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1789/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@3ba2c9f70a3eafef77a375e6c295314191db2d4a --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 4 ++-- filestore/util.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 095b1018d2..502b11fed7 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,11 +12,11 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index e9425aa957..13a95ee5f8 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -11,8 +11,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 881ce82336..b77990073e 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,13 +11,13 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dsns "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/namespace" dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 985281e236..932061be3a 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -8,9 +8,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // Status is used to identify the state of the block data referenced From bf4886933cd1d3708c2c036d47d39611ec10a964 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1790/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-ds-help@dccc9977ef0be890dbad443da03fbb6fb18af9e8 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index a176ee0bb8..072d4fa9a0 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,8 +1,8 @@ package dshelp import ( - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) From 9eb5ec46865a1cde749b6af24a571933ca4815fb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1791/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-offline@dbbdca60e030eae6b3a6a4db2816d4310b8cf22b --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index fed9c2d875..f104d20b13 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 9abf97eb72..681ea23285 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" - u "gx/ipfs/QmSU6eubNdhXjFBJBSksTp8kv8YRub8mGAPv8tVJHmL2EU/go-ipfs-util" + u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" ds_sync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From 4deb98bb0c4065ab512331567e62944b30e81d23 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 3 Dec 2017 21:34:29 -0800 Subject: [PATCH 1792/3147] gx: update go-multihash License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-interface@10c75eed681e86ba6dc34491d59f06ace43c5a9f --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 4fe8e0f3de..443672d897 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,9 @@ import ( "context" "io" - blocks "gx/ipfs/QmSn9Td7xgxm9EV7iEjTckpUWmWApggzPxu7eFGWkkpwin/go-block-format" + blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From 9cc221d2ae772fe67425e873db64516bf1bf1f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Dec 2017 01:34:49 +0100 Subject: [PATCH 1793/3147] docs/coreapi: Add some documentation to CoreAPI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@2fbdcd09c87e05ff355b4a492b01029273b1f0f3 --- coreiface/interface.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/coreiface/interface.go b/coreiface/interface.go index 78a64dd40b..87e9fcd0ff 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -1,3 +1,5 @@ +// Package iface defines IPFS Core API which is a set of interfaces used to +// interact with IPFS nodes. package iface import ( @@ -9,6 +11,8 @@ import ( ipld "gx/ipfs/QmPN7cwmpcc4DWXb4KTB9dNAJgjuPY69h3npsMfhRrQL9c/go-ipld-format" ) +// Path is a generic wrapper for paths used in the API. A path can be resolved +// to a CID using one of Resolve functions in the API. type Path interface { String() string Cid() *cid.Cid @@ -26,15 +30,28 @@ type Reader interface { io.Closer } +// CoreAPI defines an unified interface to IPFS for Go programs. type CoreAPI interface { + // Unixfs returns an implementation of Unixfs API Unixfs() UnixfsAPI + + // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (Path, error) + + // ResolveNode resolves the path (if not resolved already) using Unixfs + // resolver, gets and returns the resolved Node ResolveNode(context.Context, Path) (Node, error) } +// UnixfsAPI is the basic interface to immutable files in IPFS type UnixfsAPI interface { + // Add imports the data from the reader into merkledag file Add(context.Context, io.Reader) (Path, error) + + // Cat returns a reader for the file Cat(context.Context, Path) (Reader, error) + + // Ls returns the list of links in a directory Ls(context.Context, Path) ([]*Link, error) } From 3a9d6a18c6a68c0cc91db2f56d040706e9172fc0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 18 Dec 2017 10:37:12 -0800 Subject: [PATCH 1794/3147] switch to a faster b58 library and update go-multihash This commit was moved from ipfs/go-ipfs-util@a5ec80aed64a2438aee9a0a4a4c1a9140c0db273 --- util/util.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/util/util.go b/util/util.go index fb4dd98284..8ebe3c706f 100644 --- a/util/util.go +++ b/util/util.go @@ -12,7 +12,7 @@ import ( "strings" "time" - b58 "github.com/jbenet/go-base58" + b58 "github.com/mr-tron/base58/base58" mh "github.com/multiformats/go-multihash" ) @@ -140,15 +140,12 @@ func Hash(data []byte) mh.Multihash { // IsValidHash checks whether a given hash is valid (b58 decodable, len > 0) func IsValidHash(s string) bool { - out := b58.Decode(s) - if out == nil || len(out) == 0 { - return false - } - _, err := mh.Cast(out) + out, err := b58.Decode(s) if err != nil { return false } - return true + _, err = mh.Cast(out) + return err == nil } // XOR takes two byte slices, XORs them together, returns the resulting slice. From f92658b17920f3c022e2e7cf6e6a7acaa00f8ebb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 19 Dec 2017 14:23:31 -0800 Subject: [PATCH 1795/3147] Don't waste 256KiB buffers on small chunks. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@73797622845836601496e64ba3481b207d53d4bc --- chunker/splitting.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 6fd55e22da..ddd71e969c 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -5,6 +5,7 @@ import ( "io" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + mpool "gx/ipfs/QmWBug6eBS7AxRdCDVuSY5CnSit7cS2XnPFYJWqWDumhCG/go-msgio/mpool" ) var log = logging.Logger("chunk") @@ -51,14 +52,14 @@ func Chan(s Splitter) (<-chan []byte, <-chan error) { type sizeSplitterv2 struct { r io.Reader - size int64 + size uint32 err error } func NewSizeSplitter(r io.Reader, size int64) Splitter { return &sizeSplitterv2{ r: r, - size: size, + size: uint32(size), } } @@ -66,17 +67,22 @@ func (ss *sizeSplitterv2) NextBytes() ([]byte, error) { if ss.err != nil { return nil, ss.err } - buf := make([]byte, ss.size) - n, err := io.ReadFull(ss.r, buf) - if err == io.ErrUnexpectedEOF { + + full := mpool.ByteSlicePool.Get(ss.size).([]byte)[:ss.size] + n, err := io.ReadFull(ss.r, full) + switch err { + case io.ErrUnexpectedEOF: ss.err = io.EOF - err = nil - } - if err != nil { + small := make([]byte, n) + copy(small, full) + mpool.ByteSlicePool.Put(ss.size, full) + return small, nil + case nil: + return full, nil + default: + mpool.ByteSlicePool.Put(ss.size, full) return nil, err } - - return buf[:n], nil } func (ss *sizeSplitterv2) Reader() io.Reader { From 40dd4d8df955c6e62dd77e7cf76a27d93f909d2b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 19 Dec 2017 15:49:33 -0800 Subject: [PATCH 1796/3147] use DefaultSplitter function where appropriate License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@03fd98e790e23947354096a6693cdd7177570125 --- chunker/parse.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/parse.go b/chunker/parse.go index 55e96cc043..f4cc562908 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -11,7 +11,7 @@ import ( func FromString(r io.Reader, chunker string) (Splitter, error) { switch { case chunker == "" || chunker == "default": - return NewSizeSplitter(r, DefaultBlockSize), nil + return DefaultSplitter(r), nil case strings.HasPrefix(chunker, "size-"): sizeStr := strings.Split(chunker, "-")[1] From 12599113d0e6eac51dc5fe6096bbcdf51438b14b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 19 Dec 2017 19:29:49 -0800 Subject: [PATCH 1797/3147] add test for overallocation in chunker License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@9d0e6bcff5c2f577e761aba9548b159336a8d631 --- chunker/splitting_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index ff433f0485..68df428030 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -22,6 +22,20 @@ func copyBuf(buf []byte) []byte { return cpy } +func TestSizeSplitterOverAllocate(t *testing.T) { + max := 1000 + r := bytes.NewReader(randBuf(t, max)) + chunksize := int64(1024 * 256) + splitter := NewSizeSplitter(r, chunksize) + chunk, err := splitter.NextBytes() + if err != nil { + t.Fatal(err) + } + if cap(chunk) > len(chunk) { + t.Fatal("chunk capacity too large") + } +} + func TestSizeSplitterIsDeterministic(t *testing.T) { if testing.Short() { t.SkipNow() From b351a5a73c7db7a1dbbbffe546f76563c91c2fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 8 Dec 2017 22:51:35 +0100 Subject: [PATCH 1798/3147] coreapi: DAG API proposal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@c6015845cbf43a2b9fc83d749137bee10f9d6396 --- coreiface/interface.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index b753c41844..508588a04c 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -34,13 +34,14 @@ type Reader interface { type CoreAPI interface { // Unixfs returns an implementation of Unixfs API Unixfs() UnixfsAPI + Dag() DagAPI // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (Path, error) // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node - ResolveNode(context.Context, Path) (Node, error) + ResolveNode(context.Context, Path) (Node, error) //TODO: should this get dropped in favor of DagAPI.Get? } // UnixfsAPI is the basic interface to immutable files in IPFS @@ -55,6 +56,12 @@ type UnixfsAPI interface { Ls(context.Context, Path) ([]*Link, error) } +type DagAPI interface { + Put(ctx context.Context, src io.Reader, inputEnc string, format *cid.Prefix) ([]Node, error) + Get(ctx context.Context, path Path) (Node, error) + Tree(ctx context.Context, path Path, depth int) ([]Path, error) +} + // type ObjectAPI interface { // New() (cid.Cid, Object) // Get(string) (Object, error) From b0b4e68ff7103e39dd2698db9877b96978bc3ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Dec 2017 17:22:21 +0100 Subject: [PATCH 1799/3147] coreapi: add tests for dag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@c593c49d857c407d9e3b6a5576f2cdb5a1fe1e97 --- coreiface/interface.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 508588a04c..ecccc1c643 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -41,7 +41,7 @@ type CoreAPI interface { // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node - ResolveNode(context.Context, Path) (Node, error) //TODO: should this get dropped in favor of DagAPI.Get? + ResolveNode(context.Context, Path) (Node, error) } // UnixfsAPI is the basic interface to immutable files in IPFS @@ -56,9 +56,17 @@ type UnixfsAPI interface { Ls(context.Context, Path) ([]*Link, error) } +// DagAPI specifies the interface to IPLD type DagAPI interface { - Put(ctx context.Context, src io.Reader, inputEnc string, format *cid.Prefix) ([]Node, error) + // Put inserts data using specified format and input encoding. + // If format is not specified (nil), default dag-cbor/sha256 is used + Put(ctx context.Context, src io.Reader, inputEnc string, format *cid.Prefix) ([]Node, error) //TODO: make format optional + + // Get attempts to resolve and get the node specified by the path Get(ctx context.Context, path Path) (Node, error) + + // Tree returns list of paths within a node specified by the path. + // To get all paths in a tree, set depth to -1 Tree(ctx context.Context, path Path, depth int) ([]Path, error) } From 9901857d2d284da55025a64aacf72d6ac9c89b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 17 Dec 2017 03:23:50 +0100 Subject: [PATCH 1800/3147] coreapi: functional options for DagAPI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@39f8afada852b5189996725ccde10b6d64f1b5ab --- coreiface/interface.go | 25 ++++++++++-- coreiface/options/dag.go | 83 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 coreiface/options/dag.go diff --git a/coreiface/interface.go b/coreiface/interface.go index ecccc1c643..f43700e9cb 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -7,6 +7,8 @@ import ( "errors" "io" + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + ipld "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) @@ -60,14 +62,31 @@ type UnixfsAPI interface { type DagAPI interface { // Put inserts data using specified format and input encoding. // If format is not specified (nil), default dag-cbor/sha256 is used - Put(ctx context.Context, src io.Reader, inputEnc string, format *cid.Prefix) ([]Node, error) //TODO: make format optional + Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) ([]Node, error) + + // WithInputEnc is an option for Put which specifies the input encoding of the + // data. Default is "json", most formats/codecs support "raw" + WithInputEnc(enc string) options.DagPutOption + + // WithCodec is an option for Put which specifies the multicodec to use to + // serialize the object. Default is cid.DagCBOR (0x71) + WithCodec(codec uint64) options.DagPutOption + + // WithHash is an option for Put which specifies the multihash settings to use + // when hashing the object. Default is based on the codec used + // (mh.SHA2_256 (0x12) for DagCBOR). If mhLen is set to -1, default length for + // the hash will be used + WithHash(mhType uint64, mhLen int) options.DagPutOption // Get attempts to resolve and get the node specified by the path Get(ctx context.Context, path Path) (Node, error) // Tree returns list of paths within a node specified by the path. - // To get all paths in a tree, set depth to -1 - Tree(ctx context.Context, path Path, depth int) ([]Path, error) + Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) + + // WithDepth is an option for Tree which specifies maximum depth of the + // returned tree. Default is -1 (no depth limit) + WithDepth(depth int) options.DagTreeOption } // type ObjectAPI interface { diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go new file mode 100644 index 0000000000..7850c4bc3a --- /dev/null +++ b/coreiface/options/dag.go @@ -0,0 +1,83 @@ +package options + +import ( + "math" + + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" +) + +type DagPutSettings struct { + InputEnc string + Codec uint64 + MhType uint64 + MhLength int +} + +type DagTreeSettings struct { + Depth int +} + +type DagPutOption func(*DagPutSettings) error +type DagTreeOption func(*DagTreeSettings) error + +func DagPutOptions(opts ...DagPutOption) (*DagPutSettings, error) { + options := &DagPutSettings{ + InputEnc: "json", + Codec: cid.DagCBOR, + MhType: math.MaxUint64, + MhLength: -1, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +func DagTreeOptions(opts ...DagTreeOption) (*DagTreeSettings, error) { + options := &DagTreeSettings{ + Depth: -1, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type DagOptions struct{} + +func (api *DagOptions) WithInputEnc(enc string) DagPutOption { + return func(settings *DagPutSettings) error { + settings.InputEnc = enc + return nil + } +} + +func (api *DagOptions) WithCodec(codec uint64) DagPutOption { + return func(settings *DagPutSettings) error { + settings.Codec = codec + return nil + } +} + +func (api *DagOptions) WithHash(mhType uint64, mhLen int) DagPutOption { + return func(settings *DagPutSettings) error { + settings.MhType = mhType + settings.MhLength = mhLen + return nil + } +} + +func (api *DagOptions) WithDepth(depth int) DagTreeOption { + return func(settings *DagTreeSettings) error { + settings.Depth = depth + return nil + } +} From bae5f5303ec03d6399c3345ba6c14397812b1ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 21 Dec 2017 01:56:41 +0100 Subject: [PATCH 1801/3147] coreapi: dag review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@20fa7a599e839af20bef873f12fcc2f94fd0c529 --- coreiface/interface.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index f43700e9cb..e51888e601 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -61,8 +61,9 @@ type UnixfsAPI interface { // DagAPI specifies the interface to IPLD type DagAPI interface { // Put inserts data using specified format and input encoding. - // If format is not specified (nil), default dag-cbor/sha256 is used - Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) ([]Node, error) + // Unless used with WithCodec or WithHash, the defaults "dag-cbor" and + // "sha256" are used. + Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (Path, error) // WithInputEnc is an option for Put which specifies the input encoding of the // data. Default is "json", most formats/codecs support "raw" From 3faa30b50066c0ee87ff43c4e0408b69cf1cb3e0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 26 Dec 2017 14:30:22 -0800 Subject: [PATCH 1802/3147] clear out memory after reads from the dagreader License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@c2f7361a8ea07e8db59c42ce1a4dd0648a20c7c3 --- unixfs/io/pbdagreader.go | 60 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index dcd383460d..891865400b 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -10,7 +10,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" ) // DagReader provides a way to easily read the data contained in a dag. @@ -30,6 +32,9 @@ type pbDagReader struct { // NodeGetters for each of 'nodes' child links promises []mdag.NodeGetter + // the cid of each child of the current node + links []*cid.Cid + // the index of the child link currently being read from linkPosition int @@ -47,30 +52,54 @@ var _ DagReader = (*pbDagReader)(nil) func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *pbDagReader { fctx, cancel := context.WithCancel(ctx) - promises := mdag.GetDAG(fctx, serv, n) + curLinks := getLinkCids(n) return &pbDagReader{ node: n, serv: serv, buf: NewBufDagReader(pb.GetData()), - promises: promises, + promises: make([]mdag.NodeGetter, len(curLinks)), + links: curLinks, ctx: fctx, cancel: cancel, pbdata: pb, } } +const preloadSize = 10 + +func (dr *pbDagReader) preloadNextNodes(ctx context.Context) { + beg := dr.linkPosition + end := beg + preloadSize + if end >= len(dr.links) { + end = len(dr.links) + } + + for i, p := range mdag.GetNodes(ctx, dr.serv, dr.links[beg:end]) { + dr.promises[beg+i] = p + } +} + // precalcNextBuf follows the next link in line and loads it from the // DAGService, setting the next buffer to read from func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { - dr.buf.Close() // Just to make sure + if dr.buf != nil { + dr.buf.Close() // Just to make sure + dr.buf = nil + } + if dr.linkPosition >= len(dr.promises) { return io.EOF } + if dr.promises[dr.linkPosition] == nil { + dr.preloadNextNodes(ctx) + } + nxt, err := dr.promises[dr.linkPosition].Get(ctx) if err != nil { return err } + dr.promises[dr.linkPosition] = nil dr.linkPosition++ switch nxt := nxt.(type) { @@ -105,6 +134,15 @@ func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { } } +func getLinkCids(n node.Node) []*cid.Cid { + links := n.Links() + out := make([]*cid.Cid, 0, len(links)) + for _, l := range links { + out = append(out, l.Cid) + } + return out +} + // Size return the total length of the data from the DAG structured file. func (dr *pbDagReader) Size() uint64 { return dr.pbdata.GetFilesize() @@ -117,6 +155,12 @@ func (dr *pbDagReader) Read(b []byte) (int, error) { // CtxReadFull reads data from the DAG structured file func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { + if dr.buf == nil { + if err := dr.precalcNextBuf(ctx); err != nil { + return 0, err + } + } + // If no cached buffer, load one total := 0 for { @@ -145,6 +189,12 @@ func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { } func (dr *pbDagReader) WriteTo(w io.Writer) (int64, error) { + if dr.buf == nil { + if err := dr.precalcNextBuf(dr.ctx); err != nil { + return 0, err + } + } + // If no cached buffer, load one total := int64(0) for { @@ -199,7 +249,9 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { left := offset if int64(len(pb.Data)) >= offset { // Close current buf to close potential child dagreader - dr.buf.Close() + if dr.buf != nil { + dr.buf.Close() + } dr.buf = NewBufDagReader(pb.GetData()[offset:]) // start reading links from the beginning From b85f8e2d0cdb6238c90e8e954875b4fcd897a2ec Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 19 Dec 2017 21:53:02 -0800 Subject: [PATCH 1803/3147] Fix memory clearing in adder License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@adaacbb8a96c4484cb2051b4b06f69f1bbaf2513 --- mfs/system.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/mfs/system.go b/mfs/system.go index f0dd099583..28875d3b38 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -123,6 +123,36 @@ func (kr *Root) Flush() error { return nil } +// FlushMemFree flushes the root directory and then uncaches all of its links. +// This has the effect of clearing out potentially stale references and allows +// them to be garbage collected. +// CAUTION: Take care not to ever call this while holding a reference to any +// child directories. Those directories will be bad references and using them +// may have unintended racy side effects. +// A better implemented mfs system (one that does smarter internal caching and +// refcounting) shouldnt need this method. +func (kr *Root) FlushMemFree(ctx context.Context) error { + dir, ok := kr.GetValue().(*Directory) + if !ok { + return fmt.Errorf("invalid mfs structure, root should be a directory") + } + + if err := dir.Flush(); err != nil { + return err + } + + dir.lock.Lock() + defer dir.lock.Unlock() + for name := range dir.files { + delete(dir.files, name) + } + for name := range dir.childDirs { + delete(dir.childDirs, name) + } + + return nil +} + // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published func (kr *Root) closeChild(name string, nd node.Node, sync bool) error { From 8972ab9e110214d72b9c048240ac75e33bd69248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2017 23:15:37 +0100 Subject: [PATCH 1804/3147] coreapi: Name API proposal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@1b5e997ca845b58519a3592db60c78d4ec7efdc8 --- coreiface/interface.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/coreiface/interface.go b/coreiface/interface.go index e51888e601..3fcf7374e1 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -6,6 +6,7 @@ import ( "context" "errors" "io" + "time" options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" @@ -27,6 +28,11 @@ type Path interface { type Node ipld.Node type Link ipld.Link +type IpnsEntry struct { + Name string + Value Path +} + type Reader interface { io.ReadSeeker io.Closer @@ -37,6 +43,7 @@ type CoreAPI interface { // Unixfs returns an implementation of Unixfs API Unixfs() UnixfsAPI Dag() DagAPI + Name() NameAPI // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (Path, error) @@ -90,6 +97,18 @@ type DagAPI interface { WithDepth(depth int) options.DagTreeOption } +type NameAPI interface { + Publish(ctx context.Context, path Path, validTime time.Duration, key string) (*IpnsEntry, error) + Resolve(ctx context.Context, name string, recursive bool, local bool, nocache bool) (Path, error) +} + +type KeyApi interface { + Generate(ctx context.Context, name string, algorithm string, size int) error + List(ctx context.Context) (map[string]string, error) //TODO: better key type? + Rename(ctx context.Context, oldName string, newName string) error + Remove(ctx context.Context, name string) error +} + // type ObjectAPI interface { // New() (cid.Cid, Object) // Get(string) (Object, error) From 286e418f6c66494631d6b570b1ec86396c13e2f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2017 23:48:16 +0100 Subject: [PATCH 1805/3147] coreapi: Keystore API proposal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@4fbdf56dc24b8b7357c0eb06c223093c506c1bbc --- coreiface/interface.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 3fcf7374e1..f6412d68fa 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -44,6 +44,7 @@ type CoreAPI interface { Unixfs() UnixfsAPI Dag() DagAPI Name() NameAPI + Key() KeyAPI // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (Path, error) @@ -102,11 +103,11 @@ type NameAPI interface { Resolve(ctx context.Context, name string, recursive bool, local bool, nocache bool) (Path, error) } -type KeyApi interface { - Generate(ctx context.Context, name string, algorithm string, size int) error +type KeyAPI interface { + Generate(ctx context.Context, name string, algorithm string, size int) (string, error) List(ctx context.Context) (map[string]string, error) //TODO: better key type? - Rename(ctx context.Context, oldName string, newName string) error - Remove(ctx context.Context, name string) error + Rename(ctx context.Context, oldName string, newName string, force bool) (string, bool, error) + Remove(ctx context.Context, name string) (string, error) } // type ObjectAPI interface { From c02dc49770c2cbbb89c695c8e83bfc1276c6d665 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 13 Dec 2017 19:05:23 +0100 Subject: [PATCH 1806/3147] coreapi: name/key functional options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@7a786c5509ec924e3cfe2c29b42f76c47ccecbc4 --- coreiface/interface.go | 19 +++++++-- coreiface/options/key.go | 65 ++++++++++++++++++++++++++++ coreiface/options/name.go | 89 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 coreiface/options/key.go create mode 100644 coreiface/options/name.go diff --git a/coreiface/interface.go b/coreiface/interface.go index f6412d68fa..36bd801a14 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -99,14 +99,25 @@ type DagAPI interface { } type NameAPI interface { - Publish(ctx context.Context, path Path, validTime time.Duration, key string) (*IpnsEntry, error) - Resolve(ctx context.Context, name string, recursive bool, local bool, nocache bool) (Path, error) + Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (*IpnsEntry, error) + WithValidTime(validTime time.Duration) options.NamePublishOption + WithKey(key string) options.NamePublishOption + + Resolve(ctx context.Context, name string, opts ...options.NameResolveOption) (Path, error) + WithRecursive(recursive bool) options.NameResolveOption + WithLocal(local bool) options.NameResolveOption + WithNoCache(nocache bool) options.NameResolveOption } type KeyAPI interface { - Generate(ctx context.Context, name string, algorithm string, size int) (string, error) + Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (string, error) + WithAlgorithm(algorithm string) options.KeyGenerateOption + WithSize(size int) options.KeyGenerateOption + + Rename(ctx context.Context, oldName string, newName string, opts ...options.KeyRenameOption) (string, bool, error) + WithForce(force bool) options.KeyRenameOption + List(ctx context.Context) (map[string]string, error) //TODO: better key type? - Rename(ctx context.Context, oldName string, newName string, force bool) (string, bool, error) Remove(ctx context.Context, name string) (string, error) } diff --git a/coreiface/options/key.go b/coreiface/options/key.go new file mode 100644 index 0000000000..5ed7b408f5 --- /dev/null +++ b/coreiface/options/key.go @@ -0,0 +1,65 @@ +package options + +type KeyGenerateSettings struct { + Algorithm string + Size int +} + +type KeyRenameSettings struct { + Force bool +} + +type KeyGenerateOption func(*KeyGenerateSettings) error +type KeyRenameOption func(*KeyRenameSettings) error + +func KeyGenerateOptions(opts ...KeyGenerateOption) (*KeyGenerateSettings, error) { + options := &KeyGenerateSettings{ + Algorithm: "rsa", + Size: 0, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +func KeyRenameOptions(opts ...KeyRenameOption) (*KeyRenameSettings, error) { + options := &KeyRenameSettings{ + Force: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type KeyOptions struct{} + +func (api *KeyOptions) WithAlgorithm(algorithm string) KeyGenerateOption { + return func(settings *KeyGenerateSettings) error { + settings.Algorithm = algorithm + return nil + } +} + +func (api *KeyOptions) WithSize(size int) KeyGenerateOption { + return func(settings *KeyGenerateSettings) error { + settings.Size = size + return nil + } +} + +func (api *KeyOptions) WithForce(force bool) KeyRenameOption { + return func(settings *KeyRenameSettings) error { + settings.Force = force + return nil + } +} diff --git a/coreiface/options/name.go b/coreiface/options/name.go new file mode 100644 index 0000000000..aa21291620 --- /dev/null +++ b/coreiface/options/name.go @@ -0,0 +1,89 @@ +package options + +import ( + "time" +) + +type NamePublishSettings struct { + ValidTime time.Duration + Key string +} + +type NameResolveSettings struct { + Recursive bool + Local bool + Nocache bool +} + +type NamePublishOption func(*NamePublishSettings) error +type NameResolveOption func(*NameResolveSettings) error + +func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings, error) { + options := &NamePublishSettings{ + ValidTime: 24 * time.Hour, + Key: "self", + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + + return options, nil +} + +func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings, error) { + options := &NameResolveSettings{ + Recursive: false, + Local: false, + Nocache: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + + return options, nil +} + +type NameOptions struct{} + +func (api *NameOptions) WithValidTime(validTime time.Duration) NamePublishOption { + return func(settings *NamePublishSettings) error { + settings.ValidTime = validTime + return nil + } +} + +func (api *NameOptions) WithKey(key string) NamePublishOption { + return func(settings *NamePublishSettings) error { + settings.Key = key + return nil + } +} + +func (api *NameOptions) WithRecursive(recursive bool) NameResolveOption { + return func(settings *NameResolveSettings) error { + settings.Recursive = recursive + return nil + } +} + +func (api *NameOptions) WithLocal(local bool) NameResolveOption { + return func(settings *NameResolveSettings) error { + settings.Local = local + return nil + } +} + +func (api *NameOptions) WithNoCache(nocache bool) NameResolveOption { + return func(settings *NameResolveSettings) error { + settings.Nocache = nocache + return nil + } +} From d733fa263ca5d8340684f8c062ef474000f54fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Dec 2017 01:03:53 +0100 Subject: [PATCH 1807/3147] coreapi: Documentation for Name/Key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@74695ab9b4f2efc64b6a88fcd900fbd67a63b416 --- coreiface/interface.go | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/coreiface/interface.go b/coreiface/interface.go index 36bd801a14..a861e47001 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -98,26 +98,73 @@ type DagAPI interface { WithDepth(depth int) options.DagTreeOption } +// NameAPI specifies the interface to IPNS. +// +// IPNS is a PKI namespace, where names are the hashes of public keys, and the +// private key enables publishing new (signed) values. In both publish and +// resolve, the default name used is the node's own PeerID, which is the hash of +// its public key. +// +// You can use .Key API to list and generate more names and their respective keys. type NameAPI interface { + // Publish announces new IPNS name Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (*IpnsEntry, error) + + // WithValidTime is an option for Publish which specifies for how long the + // entry will remain valid. Default value is 24h WithValidTime(validTime time.Duration) options.NamePublishOption + + // WithKey is an option for Publish which specifies the key to use for + // publishing. Default value is "self" which is the node's own PeerID. + // + // You can use .Key API to list and generate more names and their respective keys. WithKey(key string) options.NamePublishOption + // Resolve attempts to resolve the newest version of the specified name Resolve(ctx context.Context, name string, opts ...options.NameResolveOption) (Path, error) + + // WithRecursive is an option for Resolve which specifies whether to perform a + // recursive lookup. Default value is false WithRecursive(recursive bool) options.NameResolveOption + + // WithLocal is an option for Resolve which specifies if the lookup should be + // offline. Default value is false WithLocal(local bool) options.NameResolveOption + + // WithNoCache is an option for Resolve which specifies when set to true + // disables the use of local name cache. Default value is false WithNoCache(nocache bool) options.NameResolveOption } +// KeyAPI specifies the interface to Keystore type KeyAPI interface { + // Generate generates new key, stores it in the keystore under the specified + // name and returns a base58 encoded multihash of it's public key Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (string, error) + + // WithAlgorithm is an option for Generate which specifies which algorithm + // should be used for the key. Default is "rsa" + // + // Supported algorithms: + // * rsa + // * ed25519 WithAlgorithm(algorithm string) options.KeyGenerateOption + + // WithSize is an option for Generate which specifies the size of the key to + // generated. Default is 0 WithSize(size int) options.KeyGenerateOption + // Rename renames oldName key to newName. Rename(ctx context.Context, oldName string, newName string, opts ...options.KeyRenameOption) (string, bool, error) + + // WithForce is an option for Rename which specifies whether to allow to + // replace existing keys. WithForce(force bool) options.KeyRenameOption + // List lists keys stored in keystore List(ctx context.Context) (map[string]string, error) //TODO: better key type? + + // Remove removes keys from keystore Remove(ctx context.Context, name string) (string, error) } From d0730a47d3a8d4e4be5cc9d1886b8b5a32816267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 17 Dec 2017 03:44:13 +0100 Subject: [PATCH 1808/3147] coreapi: name/key review suggestions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@8f7e0241ec5a85f3acaf3152107bd9ad202f56a8 --- coreiface/interface.go | 45 ++++++++++++++++++++++----------------- coreiface/options/key.go | 7 +++++- coreiface/options/name.go | 14 +++++++----- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index a861e47001..0086bd0d62 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -28,16 +28,21 @@ type Path interface { type Node ipld.Node type Link ipld.Link -type IpnsEntry struct { - Name string - Value Path -} - type Reader interface { io.ReadSeeker io.Closer } +type IpnsEntry interface { + Name() string + Value() Path +} + +type Key interface { + Name() string + Path() Path +} + // CoreAPI defines an unified interface to IPFS for Go programs. type CoreAPI interface { // Unixfs returns an implementation of Unixfs API @@ -108,7 +113,7 @@ type DagAPI interface { // You can use .Key API to list and generate more names and their respective keys. type NameAPI interface { // Publish announces new IPNS name - Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (*IpnsEntry, error) + Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (IpnsEntry, error) // WithValidTime is an option for Publish which specifies for how long the // entry will remain valid. Default value is 24h @@ -116,8 +121,9 @@ type NameAPI interface { // WithKey is an option for Publish which specifies the key to use for // publishing. Default value is "self" which is the node's own PeerID. + // The key parameter must be either PeerID or keystore key alias. // - // You can use .Key API to list and generate more names and their respective keys. + // You can use KeyAPI to list and generate more names and their respective keys. WithKey(key string) options.NamePublishOption // Resolve attempts to resolve the newest version of the specified name @@ -131,41 +137,42 @@ type NameAPI interface { // offline. Default value is false WithLocal(local bool) options.NameResolveOption - // WithNoCache is an option for Resolve which specifies when set to true - // disables the use of local name cache. Default value is false - WithNoCache(nocache bool) options.NameResolveOption + // WithCache is an option for Resolve which specifies if cache should be used. + // Default value is true + WithCache(cache bool) options.NameResolveOption } // KeyAPI specifies the interface to Keystore type KeyAPI interface { // Generate generates new key, stores it in the keystore under the specified // name and returns a base58 encoded multihash of it's public key - Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (string, error) + Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (Key, error) // WithAlgorithm is an option for Generate which specifies which algorithm - // should be used for the key. Default is "rsa" + // should be used for the key. Default is options.RSAKey // // Supported algorithms: - // * rsa - // * ed25519 + // * options.RSAKey + // * options.Ed25519Key WithAlgorithm(algorithm string) options.KeyGenerateOption // WithSize is an option for Generate which specifies the size of the key to // generated. Default is 0 WithSize(size int) options.KeyGenerateOption - // Rename renames oldName key to newName. - Rename(ctx context.Context, oldName string, newName string, opts ...options.KeyRenameOption) (string, bool, error) + // Rename renames oldName key to newName. Returns the key and whether another + // key was overwritten, or an error + Rename(ctx context.Context, oldName string, newName string, opts ...options.KeyRenameOption) (Key, bool, error) // WithForce is an option for Rename which specifies whether to allow to // replace existing keys. WithForce(force bool) options.KeyRenameOption // List lists keys stored in keystore - List(ctx context.Context) (map[string]string, error) //TODO: better key type? + List(ctx context.Context) ([]Key, error) - // Remove removes keys from keystore - Remove(ctx context.Context, name string) (string, error) + // Remove removes keys from keystore. Returns ipns path of the removed key + Remove(ctx context.Context, name string) (Path, error) } // type ObjectAPI interface { diff --git a/coreiface/options/key.go b/coreiface/options/key.go index 5ed7b408f5..c84f0f8f8b 100644 --- a/coreiface/options/key.go +++ b/coreiface/options/key.go @@ -1,5 +1,10 @@ package options +const ( + RSAKey = "rsa" + Ed25519Key = "ed25519" +) + type KeyGenerateSettings struct { Algorithm string Size int @@ -14,7 +19,7 @@ type KeyRenameOption func(*KeyRenameSettings) error func KeyGenerateOptions(opts ...KeyGenerateOption) (*KeyGenerateSettings, error) { options := &KeyGenerateSettings{ - Algorithm: "rsa", + Algorithm: RSAKey, Size: 0, } diff --git a/coreiface/options/name.go b/coreiface/options/name.go index aa21291620..9f8aaafc83 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -4,6 +4,10 @@ import ( "time" ) +const ( + DefaultNameValidTime = 24 * time.Hour +) + type NamePublishSettings struct { ValidTime time.Duration Key string @@ -12,7 +16,7 @@ type NamePublishSettings struct { type NameResolveSettings struct { Recursive bool Local bool - Nocache bool + Cache bool } type NamePublishOption func(*NamePublishSettings) error @@ -20,7 +24,7 @@ type NameResolveOption func(*NameResolveSettings) error func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings, error) { options := &NamePublishSettings{ - ValidTime: 24 * time.Hour, + ValidTime: DefaultNameValidTime, Key: "self", } @@ -38,7 +42,7 @@ func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings, error) options := &NameResolveSettings{ Recursive: false, Local: false, - Nocache: false, + Cache: true, } for _, opt := range opts { @@ -81,9 +85,9 @@ func (api *NameOptions) WithLocal(local bool) NameResolveOption { } } -func (api *NameOptions) WithNoCache(nocache bool) NameResolveOption { +func (api *NameOptions) WithCache(cache bool) NameResolveOption { return func(settings *NameResolveSettings) error { - settings.Nocache = nocache + settings.Cache = cache return nil } } From 6527d6e06318ce93a01a40d769225f9ad4fce6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 1 Jan 2018 18:59:07 +0100 Subject: [PATCH 1809/3147] coreapi: key tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@ed5f040416bbc6a72008cf3c9f299c47da6f42f1 --- coreiface/interface.go | 6 +++--- coreiface/options/key.go | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 0086bd0d62..dc83656699 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -148,13 +148,13 @@ type KeyAPI interface { // name and returns a base58 encoded multihash of it's public key Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (Key, error) - // WithAlgorithm is an option for Generate which specifies which algorithm + // WithType is an option for Generate which specifies which algorithm // should be used for the key. Default is options.RSAKey // - // Supported algorithms: + // Supported key types: // * options.RSAKey // * options.Ed25519Key - WithAlgorithm(algorithm string) options.KeyGenerateOption + WithType(algorithm string) options.KeyGenerateOption // WithSize is an option for Generate which specifies the size of the key to // generated. Default is 0 diff --git a/coreiface/options/key.go b/coreiface/options/key.go index c84f0f8f8b..114361875a 100644 --- a/coreiface/options/key.go +++ b/coreiface/options/key.go @@ -3,6 +3,8 @@ package options const ( RSAKey = "rsa" Ed25519Key = "ed25519" + + DefaultRSALen = 2048 ) type KeyGenerateSettings struct { @@ -20,7 +22,7 @@ type KeyRenameOption func(*KeyRenameSettings) error func KeyGenerateOptions(opts ...KeyGenerateOption) (*KeyGenerateSettings, error) { options := &KeyGenerateSettings{ Algorithm: RSAKey, - Size: 0, + Size: -1, } for _, opt := range opts { @@ -48,7 +50,7 @@ func KeyRenameOptions(opts ...KeyRenameOption) (*KeyRenameSettings, error) { type KeyOptions struct{} -func (api *KeyOptions) WithAlgorithm(algorithm string) KeyGenerateOption { +func (api *KeyOptions) WithType(algorithm string) KeyGenerateOption { return func(settings *KeyGenerateSettings) error { settings.Algorithm = algorithm return nil From 78823e7ccbdc16b651c269f86e4cf5915144250a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Jan 2018 00:53:48 +0100 Subject: [PATCH 1810/3147] coreapi: Name tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@d28b9301ac2ca1a9e209680ba5bb613f19cbb6fe --- coreiface/interface.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index dc83656699..cdbb2508bd 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -157,7 +157,10 @@ type KeyAPI interface { WithType(algorithm string) options.KeyGenerateOption // WithSize is an option for Generate which specifies the size of the key to - // generated. Default is 0 + // generated. Default is -1 + // + // value of -1 means 'use default size for key type': + // * 2048 for RSA WithSize(size int) options.KeyGenerateOption // Rename renames oldName key to newName. Returns the key and whether another From 7432bcc1bb9b78ac813df705042e2b8997b255f6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 31 Dec 2017 15:15:18 -0800 Subject: [PATCH 1811/3147] test promised don't get allocated where not wanted License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@83c1bd02c0d308574b1e6b6e9b326d0dd368b571 --- unixfs/io/dagreader_test.go | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index a5ed6dd396..da16feaf72 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -4,6 +4,7 @@ import ( "bytes" "io" "io/ioutil" + "math/rand" "strings" "testing" @@ -72,6 +73,55 @@ func TestSeekAndRead(t *testing.T) { } } +func TestSeekAndReadLarge(t *testing.T) { + dserv := testu.GetDAGServ() + inbuf := make([]byte, 20000) + rand.Read(inbuf) + + node := testu.GetNode(t, dserv, inbuf, testu.UseProtoBufLeaves) + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + _, err = reader.Seek(10000, io.SeekStart) + if err != nil { + t.Fatal(err) + } + + buf := make([]byte, 100) + _, err = io.ReadFull(reader, buf) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(buf, inbuf[10000:10100]) { + t.Fatal("seeked read failed") + } + + pbdr := reader.(*pbDagReader) + var count int + for i, p := range pbdr.promises { + if i > 20 && i < 30 { + if p == nil { + t.Fatal("expected index to be not nil: ", i) + } + count++ + } else { + if p != nil { + t.Fatal("expected index to be nil: ", i) + } + } + } + // -1 because we read some and it cleared one + if count != preloadSize-1 { + t.Fatalf("expected %d preloaded promises, got %d", preloadSize-1, count) + } +} + func TestRelativeSeek(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) From a4f17aa015a281f2c32278ab7e7419cd5b06d085 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 21 Jan 2018 11:31:47 -0800 Subject: [PATCH 1812/3147] interface docs for pinner License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@407d3b91bcca61d36257bdcc24844180c3dd0b60 --- pinning/pinner/pin.go | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index dc2eee7f2d..4d66408efe 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -46,11 +46,22 @@ const ( type PinMode int const ( + // Recursive pins pin the target cids along with any reachable children. Recursive PinMode = iota + + // Direct pins pin just the target cid. Direct + + // Indirect pins are cids who have some ancestor pinned recursively. Indirect + + // Internal pins are cids used to keep the internal state of the pinner. Internal + + // NotPinned NotPinned + + // Any refers to any pinned cid Any ) @@ -82,10 +93,20 @@ func StringToPinMode(s string) (PinMode, bool) { } type Pinner interface { + // IsPinned returns whether or not the given cid is pinned + // and an explanation of why its pinned IsPinned(*cid.Cid) (string, bool, error) + + // IsPinnedWithType returns whether or not the given cid is pinned with the + // given pin type, as well as returning the type of pin its pinned with. IsPinnedWithType(*cid.Cid, PinMode) (string, bool, error) - Pin(context.Context, node.Node, bool) error - Unpin(context.Context, *cid.Cid, bool) error + + // Pin the given node, optionally recursively. + Pin(ctx context.Context, node node.Node, recursive bool) error + + // Unpin the given cid. If recursive is true, removes either a recursive or + // a direct pin. If recursive is false, only removes a direct pin. + Unpin(ctx context.Context, cid *cid.Cid, recursive bool) error // Update updates a recursive pin from one cid to another // this is more efficient than simply pinning the new one and unpinning the @@ -106,9 +127,17 @@ type Pinner interface { // be successful. RemovePinWithMode(*cid.Cid, PinMode) + // Flush writes the pin state to the backing datastore Flush() error + + // DirectKeys returns all directly pinned cids DirectKeys() []*cid.Cid + + // DirectKeys returns all recursively pinned cids RecursiveKeys() []*cid.Cid + + // InternalPins returns all cids kept pinned for the internal state of the + // pinner InternalPins() []*cid.Cid } From 85305cdd71ff3684195bb904670715376a6ced0c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 21 Jan 2018 11:46:03 -0800 Subject: [PATCH 1813/3147] data storage interfaces License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-blockservice@dda5735c758fa289ef61220497569d3b09c7993b --- blockservice/blockservice.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 7929a67f3a..65d98c8d9d 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -25,13 +25,26 @@ var ErrNotFound = errors.New("blockservice: key not found") // datastore and may retrieve data from a remote Exchange. // It uses an internal `datastore.Datastore` instance to store values. type BlockService interface { + // Blockstore returns a reference to the underlying blockstore Blockstore() blockstore.Blockstore + + // Exchange returns a reference to the underlying exchange (usually bitswap) Exchange() exchange.Interface + + // AddBlock puts a given block to the underlying datastore AddBlock(o blocks.Block) (*cid.Cid, error) + + // AddBlocks adds a slice of blocks at the same time using batching + // capabilities of the underlying datastore whenever possible. AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) + GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) - GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block DeleteBlock(o blocks.Block) error + + // GetBlocks does a batch request for the given cids, returning blocks as + // they are found, in no particular order. + GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block + Close() error } From a0f854cef0db5c0a5195b108564f1cf37d2b996d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 21 Jan 2018 11:46:03 -0800 Subject: [PATCH 1814/3147] data storage interfaces License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@d86b647b2129e82c2c6b7050747d62cef1aa1112 --- blockstore/blockstore.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 4ef59ffe33..946b1d69cf 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -40,12 +40,19 @@ type Blockstore interface { DeleteBlock(*cid.Cid) error Has(*cid.Cid) (bool, error) Get(*cid.Cid) (blocks.Block, error) + + // Put puts a given block to the underlying datastore Put(blocks.Block) error + + // PutMany puts a slice of blocks at the same time using batching + // capabilities of the underlying datastore whenever possible. PutMany([]blocks.Block) error + // AllKeysChan returns a channel from which // the CIDs in the Blockstore can be read. It should respect // the given context, closing the channel if it becomes Done. AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) + // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. HashOnRead(enabled bool) From adaf5f3c2403fc849702c3341f40d3a888161a99 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 22 Jan 2018 11:20:07 -0800 Subject: [PATCH 1815/3147] keystore interface docs License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-keystore@797c1f50b9add32cfec7ca92f87bbfe27f605608 --- keystore/keystore.go | 22 +++++++++++++--------- keystore/memkeystore.go | 4 +++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index fd9ab94b4a..56dfd1b013 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -10,22 +10,25 @@ import ( ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) +// Keystore provides a key management interface type Keystore interface { - // Has return whether or not a key exist in the Keystore + // Has returns whether or not a key exist in the Keystore Has(string) (bool, error) - // Put store a key in the Keystore + // Put stores a key in the Keystore, if a key with the same name already exists, returns ErrKeyExists Put(string, ci.PrivKey) error - // Get retrieve a key from the Keystore + // Get retrieves a key from the Keystore if it exists, and returns ErrNoSuchKey + // otherwise. Get(string) (ci.PrivKey, error) - // Delete remove a key from the Keystore + // Delete removes a key from the Keystore Delete(string) error - // List return a list of key identifier + // List returns a list of key identifier List() ([]string, error) } var ErrNoSuchKey = fmt.Errorf("no key by the given name was found") var ErrKeyExists = fmt.Errorf("key by that name already exists, refusing to overwrite") +// FSKeystore is a keystore backed by files in a given directory stored on disk. type FSKeystore struct { dir string } @@ -60,7 +63,7 @@ func NewFSKeystore(dir string) (*FSKeystore, error) { return &FSKeystore{dir}, nil } -// Has return whether or not a key exist in the Keystore +// Has returns whether or not a key exist in the Keystore func (ks *FSKeystore) Has(name string) (bool, error) { kp := filepath.Join(ks.dir, name) @@ -77,7 +80,7 @@ func (ks *FSKeystore) Has(name string) (bool, error) { return true, nil } -// Put store a key in the Keystore +// Put stores a key in the Keystore, if a key with the same name already exists, returns ErrKeyExists func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { if err := validateName(name); err != nil { return err @@ -108,7 +111,8 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { return err } -// Get retrieve a key from the Keystore +// Get retrieves a key from the Keystore if it exists, and returns ErrNoSuchKey +// otherwise. func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { if err := validateName(name); err != nil { return nil, err @@ -127,7 +131,7 @@ func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { return ci.UnmarshalPrivateKey(data) } -// Delete remove a key from the Keystore +// Delete removes a key from the Keystore func (ks *FSKeystore) Delete(name string) error { if err := validateName(name); err != nil { return err diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 3732a3262b..6d07f6dc37 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -2,6 +2,8 @@ package keystore import ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" +// MemKeystore is an in memory keystore implementation that is not persisted to +// any backing storage. type MemKeystore struct { keys map[string]ci.PrivKey } @@ -58,7 +60,7 @@ func (mk *MemKeystore) Delete(name string) error { // List return a list of key identifier func (mk *MemKeystore) List() ([]string, error) { out := make([]string, 0, len(mk.keys)) - for k, _ := range mk.keys { + for k := range mk.keys { out = append(out, k) } return out, nil From 5debdd2c6b53f24a9f1afd6bd976d260905bd296 Mon Sep 17 00:00:00 2001 From: ForrestWeston Date: Mon, 22 Jan 2018 14:51:46 -0800 Subject: [PATCH 1816/3147] docs for mfs system method impls License: MIT Signed-off-by: ForrestWeston This commit was moved from ipfs/go-mfs@03918104b7a1af5d200e4e1b47fc721ee73d6fe8 --- mfs/system.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/mfs/system.go b/mfs/system.go index 28875d3b38..319ba3020c 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -41,19 +41,19 @@ const ( TDir ) -// FSNode represents any node (directory, root, or file) in the mfs filesystem +// FSNode represents any node (directory, root, or file) in the mfs filesystem. type FSNode interface { GetNode() (node.Node, error) Flush() error Type() NodeType } -// Root represents the root of a filesystem tree +// Root represents the root of a filesystem tree. type Root struct { - // node is the merkledag root + // node is the merkledag root. node *dag.ProtoNode - // val represents the node. It can either be a File or a Directory + // val represents the node. It can either be a File or a Directory. val FSNode repub *Republisher @@ -63,9 +63,10 @@ type Root struct { Type string } +// PubFunc is the function used by the `publish()` method. type PubFunc func(context.Context, *cid.Cid) error -// newRoot creates a new Root and starts up a republisher routine for it +// NewRoot creates a new Root and starts up a republisher routine for it. func NewRoot(parent context.Context, ds dag.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { var repub *Republisher @@ -107,10 +108,13 @@ func NewRoot(parent context.Context, ds dag.DAGService, node *dag.ProtoNode, pf return root, nil } +// GetValue returns the value of Root. func (kr *Root) GetValue() FSNode { return kr.val } +// Flush signals that an update has occurred since the last publish, +// and updates the Root republisher. func (kr *Root) Flush() error { nd, err := kr.GetValue().GetNode() if err != nil { @@ -154,7 +158,7 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { } // closeChild implements the childCloser interface, and signals to the publisher that -// there are changes ready to be published +// there are changes ready to be published. func (kr *Root) closeChild(name string, nd node.Node, sync bool) error { c, err := kr.dserv.Add(nd) if err != nil { @@ -181,7 +185,7 @@ func (kr *Root) Close() error { return nil } -// Republisher manages when to publish a given entry +// Republisher manages when to publish a given entry. type Republisher struct { TimeoutLong time.Duration TimeoutShort time.Duration @@ -198,7 +202,7 @@ type Republisher struct { } // NewRepublisher creates a new Republisher object to republish the given root -// using the given short and long time intervals +// using the given short and long time intervals. func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { ctx, cancel := context.WithCancel(ctx) return &Republisher{ @@ -218,6 +222,8 @@ func (p *Republisher) setVal(c *cid.Cid) { p.val = c } +// WaitPub Returns immediately if `lastpub` value is consistent with the +// current value `val`, else will block until `val` has been published. func (p *Republisher) WaitPub() { p.lk.Lock() consistent := p.lastpub == p.val @@ -239,7 +245,7 @@ func (p *Republisher) Close() error { // Touch signals that an update has occurred since the last publish. // Multiple consecutive touches may extend the time period before -// the next Publish occurs in order to more efficiently batch updates +// the next Publish occurs in order to more efficiently batch updates. func (np *Republisher) Update(c *cid.Cid) { np.setVal(c) select { @@ -248,7 +254,7 @@ func (np *Republisher) Update(c *cid.Cid) { } } -// Run is the main republisher loop +// Run is the main republisher loop. func (np *Republisher) Run() { for { select { @@ -284,6 +290,7 @@ func (np *Republisher) Run() { } } +// publish calls the `PubFunc`. func (np *Republisher) publish(ctx context.Context) error { np.lk.Lock() topub := np.val From 985de409b9b6b302aaefe1372ea0419c235f06ca Mon Sep 17 00:00:00 2001 From: ForrestWeston Date: Mon, 22 Jan 2018 14:52:22 -0800 Subject: [PATCH 1817/3147] docs for pin method impls License: MIT Signed-off-by: ForrestWeston This commit was moved from ipfs/go-ipfs-pinner@5972a48b4657c99d6b8552ba4c39814d096b01d9 --- pinning/pinner/pin.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4d66408efe..0019817925 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -147,6 +147,7 @@ type Pinned struct { Via *cid.Cid } +// Pinned returns whether or not the given cid is pinned func (p Pinned) Pinned() bool { if p.Mode == NotPinned { return false @@ -155,6 +156,7 @@ func (p Pinned) Pinned() bool { } } +// String Returns pin status as string func (p Pinned) String() string { switch p.Mode { case NotPinned: @@ -277,6 +279,8 @@ func (p *pinner) IsPinned(c *cid.Cid) (string, bool, error) { return p.isPinnedWithType(c, Any) } +// IsPinnedWithType returns whether or not the given cid is pinned with the +// given pin type, as well as returning the type of pin its pinned with. func (p *pinner) IsPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() @@ -328,6 +332,8 @@ func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error return "", false, nil } +// CheckIfPinned Checks if a set of keys are pinned, more efficient than +// calling IsPinned for each key, returns the pinned status of cid(s) func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { p.lock.RLock() defer p.lock.RUnlock() @@ -393,6 +399,9 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { return pinned, nil } +// RemovePinWithMode is for manually editing the pin structure. +// Use with care! If used improperly, garbage collection may not +// be successful. func (p *pinner) RemovePinWithMode(c *cid.Cid, mode PinMode) { p.lock.Lock() defer p.lock.Unlock() @@ -486,6 +495,9 @@ func (p *pinner) RecursiveKeys() []*cid.Cid { return p.recursePin.Keys() } +// Update updates a recursive pin from one cid to another +// this is more efficient than simply pinning the new one and unpinning the +// old one func (p *pinner) Update(ctx context.Context, from, to *cid.Cid, unpin bool) error { p.lock.Lock() defer p.lock.Unlock() @@ -556,6 +568,8 @@ func (p *pinner) Flush() error { return nil } +// InternalPins returns all cids kept pinned for the internal state of the +// pinner func (p *pinner) InternalPins() []*cid.Cid { p.lock.Lock() defer p.lock.Unlock() From 4d4c3dc176859461010b576f9af66919f34aaed3 Mon Sep 17 00:00:00 2001 From: ForrestWeston Date: Mon, 22 Jan 2018 14:44:46 -0800 Subject: [PATCH 1818/3147] interface docs for coreapi interface License: MIT Signed-off-by: ForrestWeston This commit was moved from ipfs/interface-go-ipfs-core@2c3137f0557f44ca23730ff134b38b9426731e56 --- coreiface/interface.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index cdbb2508bd..720f935e28 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -17,9 +17,13 @@ import ( // Path is a generic wrapper for paths used in the API. A path can be resolved // to a CID using one of Resolve functions in the API. type Path interface { + // String returns the path as a string. String() string + // Cid returns cid referred to by path Cid() *cid.Cid + // Root returns cid of root path Root() *cid.Cid + // Resolved returns whether path has been fully resolved Resolved() bool } @@ -33,22 +37,31 @@ type Reader interface { io.Closer } +// IpnsEntry specifies the interface to IpnsEntries type IpnsEntry interface { + // Name returns IpnsEntry name Name() string + // Value returns IpnsEntry value Value() Path } +// Key specifies the interface to Keys in KeyAPI Keystore type Key interface { + // Key returns key name Name() string + // Path returns key path Path() Path } // CoreAPI defines an unified interface to IPFS for Go programs. type CoreAPI interface { - // Unixfs returns an implementation of Unixfs API + // Unixfs returns an implementation of Unixfs API. Unixfs() UnixfsAPI + // Dag returns an implementation of Dag API. Dag() DagAPI + // Name returns an implementation of Name API. Name() NameAPI + // Key returns an implementation of Key API. Key() KeyAPI // ResolvePath resolves the path using Unixfs resolver From d6646aa5af68ad060b12d0d9a6500c84496712dc Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1819/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@0001c46f2a5fe3a0b7d7593a78ef32b0b2a7a8f4 --- namesys/ipns_select_test.go | 2 +- namesys/namesys.go | 12 ++++++------ namesys/namesys_test.go | 4 ++-- namesys/publisher.go | 12 ++++++------ namesys/publisher_test.go | 10 +++++----- namesys/pubsub.go | 24 ++++++++++++------------ namesys/pubsub_test.go | 18 +++++++++--------- namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 8 ++++---- namesys/routing.go | 8 ++++---- 11 files changed, 55 insertions(+), 55 deletions(-) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index e36eade006..7489f139b1 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -9,7 +9,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index 7f7adec1ff..e38d58455f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -9,14 +9,14 @@ import ( path "github.com/ipfs/go-ipfs/path" - floodsub "gx/ipfs/QmP1T1SGU6276R2MHKP2owbck37Fnzd6ZkpyNJvnG2LoTG/go-libp2p-floodsub" - p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + floodsub "gx/ipfs/Qma2TkMxcFLVGkYECTo4hrQohBYPx7uhpYL9EejEi8y3Nm/go-libp2p-floodsub" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 66062156d5..2cd91c79f8 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,9 +10,9 @@ import ( offroute "github.com/ipfs/go-ipfs/routing/offline" "github.com/ipfs/go-ipfs/unixfs" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index bdfbe5e3be..6d033d5023 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -13,14 +13,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - record "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record" - dhtpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" + dhtpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 37e3aeeae6..de6a5c694c 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -10,12 +10,12 @@ import ( mockrouting "github.com/ipfs/go-ipfs/routing/mock" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - ma "gx/ipfs/QmW8s4zTsUoX1Q6CeYxVKPyqSKbF7H1YDUyTostBtZ8DaG/go-multiaddr" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - testutil "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + testutil "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" ) type identity struct { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 6760568528..c71d82a7d8 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -12,20 +12,20 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - floodsub "gx/ipfs/QmP1T1SGU6276R2MHKP2owbck37Fnzd6ZkpyNJvnG2LoTG/go-libp2p-floodsub" - p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - record "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record" - dhtpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + floodsub "gx/ipfs/Qma2TkMxcFLVGkYECTo4hrQohBYPx7uhpYL9EejEi8y3Nm/go-libp2p-floodsub" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" + dhtpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" + p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) // PubsubPublisher is a publisher that distributes IPNS records through pubsub diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index c82a425db9..abafa732b6 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -9,16 +9,16 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - floodsub "gx/ipfs/QmP1T1SGU6276R2MHKP2owbck37Fnzd6ZkpyNJvnG2LoTG/go-libp2p-floodsub" - p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" - bhost "gx/ipfs/QmYmhgAcvmDGXct1qBvc1kz9BxQSit1XBrTeiGZp2FvRyn/go-libp2p-blankhost" - netutil "gx/ipfs/QmZTcPxK6VqrwY94JpKZPvEqAZ6tEr1rLrpcqJbbRZbg2V/go-libp2p-netutil" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + netutil "gx/ipfs/QmV1axkk86DDkYwS269AvPy9eV5h7mUyHveJkSVHPjrQtY/go-libp2p-netutil" + bhost "gx/ipfs/QmZ15dDSCo4DKn4o4GnqqLExKATBeeo3oNyQ5FBKtNjEQT/go-libp2p-blankhost" + floodsub "gx/ipfs/Qma2TkMxcFLVGkYECTo4hrQohBYPx7uhpYL9EejEi8y3Nm/go-libp2p-floodsub" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - testutil "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" + testutil "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" + p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) func newNetHost(ctx context.Context, t *testing.T) p2phost.Host { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index d871aaca3c..dc158fea62 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,15 +11,15 @@ import ( path "github.com/ipfs/go-ipfs/path" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - recpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + recpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 441b7cce2e..08bb700a39 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -12,9 +12,9 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" + mocknet "gx/ipfs/QmNRN4eZGmY89CRC4T5PC4xDYRx6GkDKEfRnvrT65fVeio/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" - mocknet "gx/ipfs/Qma23bpHwQrQyvKeBemaeJh7sAoRHggPkgnge1B9489ff5/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 9c1f838164..2e0159860b 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,11 +8,11 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + testutil "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index cd6ee7c4b3..7a1abbecf0 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) var log = logging.Logger("namesys") From d4c45857d8ae7c5cae0e4a705821e40b13542625 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1820/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@9f63580f460e49383e675ac95e277d1c7014c015 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/io/pbdagreader.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 4 ++-- unixfs/mod/dagmodifier_test.go | 2 +- unixfs/test/utils.go | 8 ++++---- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 8061f90ddd..dc3afd0c27 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 360334b79c..27372e8f84 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,8 +13,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // Writer is a utility structure that helps to write diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index fdf7223877..044017f974 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -31,9 +31,9 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8ec527033c..9d197876c0 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,8 +10,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var ErrIsDir = errors.New("this dag node is a directory") diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 1ab8cf7121..822533435e 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,9 +8,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 891865400b..0bc8d61e87 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -10,9 +10,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // DagReader provides a way to easily read the data contained in a dag. diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index a66de7bdf4..a5b4f132ad 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 92fd3f4ccc..b6ae06fa10 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,9 +14,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var ErrSeekFail = errors.New("failed to seek properly") diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index d6ba1ddb80..41979c613b 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -13,7 +13,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ) func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, opts testu.NodeOpts) []byte { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 8ea7de6e16..fe2a23508c 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -15,10 +15,10 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - mh "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) func SizeSplitterGen(size int64) chunk.SplitterGen { From 64cdae564e63caee9fcdddbcc7e90e3a04f8e921 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1821/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@c1c25e0487f7f1fe77667fca019893ced93fd320 --- mfs/dir.go | 4 ++-- mfs/file.go | 2 +- mfs/mfs_test.go | 10 +++++----- mfs/ops.go | 4 ++-- mfs/repub_test.go | 4 ++-- mfs/system.go | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 57e4554f08..250219d758 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 3630268868..aa870551a5 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 6498a76158..b9ec1b4e42 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -24,11 +24,11 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 214a66fca8..9d7182124d 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,8 +9,8 @@ import ( path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 60045fec56..499650d131 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - ci "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil/ci" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ci "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil/ci" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 319ba3020c..28dbe8aecb 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,9 +19,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var ErrNotExist = errors.New("no such rootfs") From c0d999672929fec9c44b96dede6eec18d3f3a09e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1822/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@9d578c6c95a0df18fc0283b56a1acf47caea02c3 --- path/path.go | 2 +- path/resolver.go | 4 ++-- path/resolver_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index 9c4d8f135e..decf289048 100644 --- a/path/path.go +++ b/path/path.go @@ -5,7 +5,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) // ErrBadPath is returned when a given path is incorrectly formatted diff --git a/path/resolver.go b/path/resolver.go index c4aabe1b75..68639fbc0d 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var log = logging.Logger("path") diff --git a/path/resolver_test.go b/path/resolver_test.go index 5339328144..8347fc6023 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -9,8 +9,8 @@ import ( dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" - util "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From fd663e85e9d4bb599ba038d0dcab5818f9fb834f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1823/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@851ef0de0db5a513f92059bb78c94fa3aead01da --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 6 +++--- blockservice/test/blocks_test.go | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 65d98c8d9d..7388226054 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,8 +13,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 00d9ccabff..c7ed02dc01 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -6,10 +6,10 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index da54461d6d..965327dae3 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,12 +10,12 @@ import ( blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) func newObject(data []byte) blocks.Block { From 125aac2a8b61ef5b36ce8af54c9e11b756e36297 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1824/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@b6e449bf82c9e9be359e3a1cd635f79d07830284 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 8 ++++---- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index f3b98597bc..7a19b69698 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 0019817925..f148053ff7 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,10 +12,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index f34283b79c..7980c8dbc4 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,10 +10,10 @@ import ( "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) func randNode() (*mdag.ProtoNode, *cid.Cid) { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 116e622971..6d4bff54b5 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - node "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 1ee16ed384..0eab73b354 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -10,9 +10,9 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) func ignoreCids(_ *cid.Cid) {} From 5e7d211f6eb13d87e9a47729d28beb2a4250aa14 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1825/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@318e958cdd426798e644612d76dc294463975f71 --- coreiface/interface.go | 4 ++-- coreiface/options/dag.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 720f935e28..6e00d51ab4 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -10,8 +10,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmNwUEK7QbwSqyKBu3mMtToo8SUc6wQJ7gdZq4gGGJqfnf/go-ipld-format" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // Path is a generic wrapper for paths used in the API. A path can be resolved diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index 7850c4bc3a..b56fcd81a6 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) type DagPutSettings struct { From b882f44bec20e69f81e5c28432db26b2f4e21c92 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1826/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@25bee4be0b1987d02114dce9fd35fe5e9012fc98 --- routing/mock/centralized_client.go | 18 +++++++++--------- routing/mock/centralized_server.go | 12 ++++++------ routing/mock/centralized_test.go | 8 ++++---- routing/mock/interface.go | 8 ++++---- routing/none/none_client.go | 10 +++++----- routing/offline/offline.go | 14 +++++++------- routing/offline/offline_test.go | 4 ++-- 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 175a9d436d..683a2a8848 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,18 +6,18 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ma "gx/ipfs/QmW8s4zTsUoX1Q6CeYxVKPyqSKbF7H1YDUyTostBtZ8DaG/go-multiaddr" - dhtpb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" + ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + dhtpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 1a3d6ef374..6a86a6c6b9 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,13 +6,13 @@ import ( "sync" "time" - "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dssync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 917b71afb7..0fb7ce90fd 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,11 +6,11 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 3aed934ce3..31de6b0cc6 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,11 +8,11 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 64f9893b03..7d29395930 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - p2phost "gx/ipfs/QmP46LGWhzVZTMmt5akNNLfoV8qL4h5wTwmzQxLyDafggd/go-libp2p-host" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - peer "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" + p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) type nilclient struct { diff --git a/routing/offline/offline.go b/routing/offline/offline.go index a1d58f0920..46cb34adac 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,15 +7,15 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - routing "gx/ipfs/QmPCGUjMRuBcPybZFpjhzpifwPP9wPRoiy5geTQKU4vqWA/go-libp2p-routing" - record "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record" - pb "gx/ipfs/QmWGtsyPYEoiqTtWLpeUA2jpW4YSZgarKDD2zivYAFz7sR/go-libp2p-record/pb" - "gx/ipfs/QmWNY7dV54ZDYmTA1ykVdwNCqC11mpU4zSUp6XDpLTH9eG/go-libp2p-peer" - pstore "gx/ipfs/QmYijbtjCxFEjSXaudaQAUz3LN5VKLssm8WCUsRoqzXmQR/go-libp2p-peerstore" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" + pb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) var ErrOffline = errors.New("routing system in offline mode") diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index e0da0d2ef0..42a8001623 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -5,8 +5,8 @@ import ( "context" "testing" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - "gx/ipfs/QmeDA8gNhvRTsbrjEieay5wezupJDiky8xvCzDABbsGzmp/go-testutil" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" ) func TestOfflineRouterStorage(t *testing.T) { From c80dc3e03e3fdd15a06d75a381ac352bc6460b8c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1827/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@c332004241e4750ddb8b2e0d52d1707e2ffd8a2b --- filestore/filestore.go | 6 +++--- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 502b11fed7..873ef12c3a 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,11 +12,11 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 13a95ee5f8..8021114244 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -11,8 +11,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index b77990073e..603a513805 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,13 +11,13 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" - "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" + dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dsns "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/namespace" - dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 932061be3a..35a640b68f 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -8,9 +8,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) // Status is used to identify the state of the block data referenced From 9698cb6d6474a01803c23f22712555a8da2c1357 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1828/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-blockstore@b2425312319f61818535a45da36fe73801b5a16c --- blockstore/arc_cache.go | 6 +++--- blockstore/arc_cache_test.go | 8 ++++---- blockstore/blockstore.go | 10 +++++----- blockstore/blockstore_test.go | 12 ++++++------ blockstore/bloom_cache.go | 4 ++-- blockstore/bloom_cache_test.go | 8 ++++---- blockstore/util/remove.go | 4 ++-- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index da3b6d7a2f..e403bb96c2 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,12 +3,12 @@ package blockstore import ( "context" - "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 734f1e73dd..5a160d72b0 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,11 +4,11 @@ import ( "context" "testing" - "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - syncds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + syncds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 946b1d69cf..5a37560c5d 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -9,13 +9,13 @@ import ( "sync/atomic" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" + dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dsns "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/namespace" - dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 31e75acf65..2b0366096c 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -7,13 +7,13 @@ import ( "testing" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" - ds_sync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" + ds_sync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index b06f56c115..5c2366207b 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,11 +5,11 @@ import ( "sync/atomic" "time" - "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" bloom "gx/ipfs/QmXqKGu7QzfRzFC4yd5aL9sThYx22vY163VGwmxfp5qGHk/bbloom" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) // bloomCached returns a Blockstore that caches Has requests using a Bloom diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index f2f1666fee..a0385a99c4 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" context "context" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - dsq "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/query" - syncds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" + syncds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" ) func testBloomCached(ctx context.Context, bs Blockstore) (*bloomcache, error) { diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go index 94b52254ea..0ce2b3feab 100644 --- a/blockstore/util/remove.go +++ b/blockstore/util/remove.go @@ -5,8 +5,8 @@ import ( "fmt" "io" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" bs "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/pin" From 7b3a3b536b555668c405fc98074d4eeedc2b8a09 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1829/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@3778982739f1fffde380705e245f20a4d5070c96 --- chunker/rabin_test.go | 4 ++-- chunker/splitting_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 888b9ac2ed..1d5702e383 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -6,8 +6,8 @@ import ( "io" "testing" - util "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) func TestRabinChunking(t *testing.T) { diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 68df428030..c5ef621e04 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From 0a0b9070e16d622c5cb7397e5fd034d979b3d656 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1830/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-ds-help@1880bdda2ec2d13f7cf9d93395c3afffa261acae --- datastore/dshelp/key.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 072d4fa9a0..c1cf2c4847 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,8 +1,8 @@ package dshelp import ( - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) From cb3474c1465f33743fd27b08d8715a4ea8a07f29 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1831/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-offline@ee573eb86105abb7082cf09a68b55a01e4af893e --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index f104d20b13..35c38887f3 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 681ea23285..5bc2926c10 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -6,12 +6,12 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - u "gx/ipfs/QmPsAfmDBnZN3kZGSuNwvCNDZiHneERSKmRcFyG3UkvcT3/go-ipfs-util" - ds "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore" - ds_sync "gx/ipfs/QmdHG8MAuARdGHxx4rPQASLcvhz24fzjSQq7AJRAQEorq5/go-datastore/sync" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + ds_sync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) func TestBlockReturnsErr(t *testing.T) { From 7338fb157f61f38dbe9f75dbc4f1e61ea13e02e6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Jan 2018 15:55:28 -0800 Subject: [PATCH 1832/3147] gx: mass update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-exchange-interface@51df926aeeebd1ee3a8ff8d317b61194089f625b --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 443672d897..c1dd116244 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,9 @@ import ( "context" "io" - blocks "gx/ipfs/QmYsEQydGrsxNZfAiskvQ76N2xE9hDQtSAkRSynwMiUK3c/go-block-format" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) // Any type that implements exchange.Interface may be used as an IPFS block From f10a09d9b25f8ec1a43f7e93f9fe182ca5ef82ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 14 Dec 2017 23:55:24 +0100 Subject: [PATCH 1833/3147] coreapi: Basic object API implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@52f5b7ce1f8cc0503ec9d9ce070afdee7997049c --- coreiface/interface.go | 44 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 720f935e28..2c31d01b17 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -191,27 +191,29 @@ type KeyAPI interface { Remove(ctx context.Context, name string) (Path, error) } -// type ObjectAPI interface { -// New() (cid.Cid, Object) -// Get(string) (Object, error) -// Links(string) ([]*Link, error) -// Data(string) (Reader, error) -// Stat(string) (ObjectStat, error) -// Put(Object) (cid.Cid, error) -// SetData(string, Reader) (cid.Cid, error) -// AppendData(string, Data) (cid.Cid, error) -// AddLink(string, string, string) (cid.Cid, error) -// RmLink(string, string) (cid.Cid, error) -// } - -// type ObjectStat struct { -// Cid cid.Cid -// NumLinks int -// BlockSize int -// LinksSize int -// DataSize int -// CumulativeSize int -// } +//TODO: Should this use paths instead of cids? +type ObjectAPI interface { + New(ctx context.Context) (Node, error) + Put(context.Context, Node) error + Get(context.Context, Path) (Node, error) + Data(context.Context, Path) (io.Reader, error) + Links(context.Context, Path) ([]*Link, error) + Stat(context.Context, Path) (*ObjectStat, error) + + AddLink(ctx context.Context, base Path, name string, child Path, create bool) (Node, error) //TODO: make create optional + RmLink(context.Context, Path, string) (Node, error) + AppendData(context.Context, Path, io.Reader) (Node, error) + SetData(context.Context, Path, io.Reader) (Node, error) +} + +type ObjectStat struct { + Cid *cid.Cid + NumLinks int + BlockSize int + LinksSize int + DataSize int + CumulativeSize int +} var ErrIsDir = errors.New("object is a directory") var ErrOffline = errors.New("can't resolve, ipfs node is offline") From 85688ca1e91bcfa3cc7441142e5391b760b2b43c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 22 Dec 2017 17:22:53 +0100 Subject: [PATCH 1834/3147] coreapi: Object api review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3b4b26deb1bc75aefe85df809afca5e3e09f71c6 --- coreiface/interface.go | 10 +++++-- coreiface/options/object.go | 56 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 coreiface/options/object.go diff --git a/coreiface/interface.go b/coreiface/interface.go index 2c31d01b17..db993a5c34 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -193,14 +193,18 @@ type KeyAPI interface { //TODO: Should this use paths instead of cids? type ObjectAPI interface { - New(ctx context.Context) (Node, error) - Put(context.Context, Node) error + New(context.Context, ...options.ObjectNewOption) (Node, error) + WithType(string) options.ObjectNewOption + + Put(context.Context, Node) (Path, error) Get(context.Context, Path) (Node, error) Data(context.Context, Path) (io.Reader, error) Links(context.Context, Path) ([]*Link, error) Stat(context.Context, Path) (*ObjectStat, error) - AddLink(ctx context.Context, base Path, name string, child Path, create bool) (Node, error) //TODO: make create optional + AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Node, error) + WithCreate(create bool) options.ObjectAddLinkOption + RmLink(context.Context, Path, string) (Node, error) AppendData(context.Context, Path, io.Reader) (Node, error) SetData(context.Context, Path, io.Reader) (Node, error) diff --git a/coreiface/options/object.go b/coreiface/options/object.go new file mode 100644 index 0000000000..6a144ab2b6 --- /dev/null +++ b/coreiface/options/object.go @@ -0,0 +1,56 @@ +package options + +type ObjectNewSettings struct { + Type string +} + +type ObjectAddLinkSettings struct { + Create bool +} + +type ObjectNewOption func(*ObjectNewSettings) error +type ObjectAddLinkOption func(*ObjectAddLinkSettings) error + +func ObjectNewOptions(opts ...ObjectNewOption) (*ObjectNewSettings, error) { + options := &ObjectNewSettings{ + Type: "empty", + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +func ObjectAddLinkOptions(opts ...ObjectAddLinkOption) (*ObjectAddLinkSettings, error) { + options := &ObjectAddLinkSettings{ + Create: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type ObjectOptions struct{} + +func (api *ObjectOptions) WithType(t string) ObjectNewOption { + return func(settings *ObjectNewSettings) error { + settings.Type = t + return nil + } +} + +func (api *ObjectOptions) WithCreate(create bool) ObjectAddLinkOption { + return func(settings *ObjectAddLinkSettings) error { + settings.Create = create + return nil + } +} From 36545a88bcc2f636493de49939e8105d7fd1977c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Jan 2018 21:22:20 +0100 Subject: [PATCH 1835/3147] coreapi: object docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@55c56578038a9e748aa996f7f9cb7dc1b546f1ac --- coreiface/interface.go | 55 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index db993a5c34..7809c8b99b 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -191,31 +191,72 @@ type KeyAPI interface { Remove(ctx context.Context, name string) (Path, error) } -//TODO: Should this use paths instead of cids? +// ObjectAPI specifies the interface to MerkleDAG and contains useful utilities +// for manipulating MerkleDAG data structures. type ObjectAPI interface { + // New creates new, empty (by default) dag-node. New(context.Context, ...options.ObjectNewOption) (Node, error) + + // WithType is an option for New which allows to change the type of created + // dag node. + // + // Supported types: + // * 'empty' - Empty node + // * 'unixfs-dir' - Empty UnixFS directory WithType(string) options.ObjectNewOption + // Put imports the node into merkledag Put(context.Context, Node) (Path, error) + + // Get returns the node for the path Get(context.Context, Path) (Node, error) + + // Data returns reader for data of the node Data(context.Context, Path) (io.Reader, error) + + // Links returns lint or links the node contains Links(context.Context, Path) ([]*Link, error) + + // Stat returns information about the node Stat(context.Context, Path) (*ObjectStat, error) + // AddLink adds a link under the specified path. child path can point to a + // subdirectory within the patent which must be present (can be overridden + // with WithCreate option). AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Node, error) + + // WithCreate is an option for AddLink which specifies whether create required + // directories for the child WithCreate(create bool) options.ObjectAddLinkOption - RmLink(context.Context, Path, string) (Node, error) + // RmLink removes a link from the node + RmLink(ctx context.Context, base Path, link string) (Node, error) + + // AppendData appends data to the node AppendData(context.Context, Path, io.Reader) (Node, error) + + // SetData sets the data contained in the node SetData(context.Context, Path, io.Reader) (Node, error) } +// ObjectStat provides information about dag nodes type ObjectStat struct { - Cid *cid.Cid - NumLinks int - BlockSize int - LinksSize int - DataSize int + // Cid is the CID of the node + Cid *cid.Cid + + // NumLinks is number of links the node contains + NumLinks int + + // BlockSize is size of the raw serialized node + BlockSize int + + // LinksSize is size of the links block section + LinksSize int + + // DataSize is the size of data block section + DataSize int + + // CumulativeSize is size of node CumulativeSize int } From 8162a16f7c173b07fa645d5a20121f1ad29e5198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Jan 2018 17:20:16 +0100 Subject: [PATCH 1836/3147] coreapi: implement object.Put MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@104bc87d13e259e45b68c3d00231e140a7b88fb6 --- coreiface/interface.go | 15 +++++++++++++-- coreiface/options/object.go | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 7809c8b99b..3e0e3d4605 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -64,6 +64,9 @@ type CoreAPI interface { // Key returns an implementation of Key API. Key() KeyAPI + // ObjectAPI returns an implementation of Object API + Object() ObjectAPI + // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (Path, error) @@ -205,8 +208,16 @@ type ObjectAPI interface { // * 'unixfs-dir' - Empty UnixFS directory WithType(string) options.ObjectNewOption - // Put imports the node into merkledag - Put(context.Context, Node) (Path, error) + // Put imports the data into merkledag + Put(context.Context, io.Reader, ...options.ObjectPutOption) (Path, error) + + // WithInputEnc is an option for Put which specifies the input encoding of the + // data. Default is "json". + // + // Supported encodings: + // * "protobuf" + // * "json" + WithInputEnc(e string) options.ObjectPutOption // Get returns the node for the path Get(context.Context, Path) (Node, error) diff --git a/coreiface/options/object.go b/coreiface/options/object.go index 6a144ab2b6..fe86a1cded 100644 --- a/coreiface/options/object.go +++ b/coreiface/options/object.go @@ -4,11 +4,16 @@ type ObjectNewSettings struct { Type string } +type ObjectPutSettings struct { + InputEnc string +} + type ObjectAddLinkSettings struct { Create bool } type ObjectNewOption func(*ObjectNewSettings) error +type ObjectPutOption func(*ObjectPutSettings) error type ObjectAddLinkOption func(*ObjectAddLinkSettings) error func ObjectNewOptions(opts ...ObjectNewOption) (*ObjectNewSettings, error) { @@ -25,6 +30,20 @@ func ObjectNewOptions(opts ...ObjectNewOption) (*ObjectNewSettings, error) { return options, nil } +func ObjectPutOptions(opts ...ObjectPutOption) (*ObjectPutSettings, error) { + options := &ObjectPutSettings{ + InputEnc: "json", + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + func ObjectAddLinkOptions(opts ...ObjectAddLinkOption) (*ObjectAddLinkSettings, error) { options := &ObjectAddLinkSettings{ Create: false, @@ -48,6 +67,13 @@ func (api *ObjectOptions) WithType(t string) ObjectNewOption { } } +func (api *ObjectOptions) WithInputEnc(e string) ObjectPutOption { + return func(settings *ObjectPutSettings) error { + settings.InputEnc = e + return nil + } +} + func (api *ObjectOptions) WithCreate(create bool) ObjectAddLinkOption { return func(settings *ObjectAddLinkSettings) error { settings.Create = create From d878d812272fc70b7e3e799f139056885dab474f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 5 Jan 2018 01:13:07 +0100 Subject: [PATCH 1837/3147] coreapi: object API tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@858d49b07c296b36a58fa4d4469f5e08a9f9b5e7 --- coreiface/interface.go | 18 +++++++++++++----- coreiface/options/object.go | 9 +++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 3e0e3d4605..9dca7f3c94 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -219,6 +219,14 @@ type ObjectAPI interface { // * "json" WithInputEnc(e string) options.ObjectPutOption + // WithDataType specifies the encoding of data field when using Josn or XML + // input encoding. + // + // Supported types: + // * "text" (default) + // * "base64" + WithDataType(t string) options.ObjectPutOption + // Get returns the node for the path Get(context.Context, Path) (Node, error) @@ -234,20 +242,20 @@ type ObjectAPI interface { // AddLink adds a link under the specified path. child path can point to a // subdirectory within the patent which must be present (can be overridden // with WithCreate option). - AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Node, error) + AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Path, error) // WithCreate is an option for AddLink which specifies whether create required // directories for the child WithCreate(create bool) options.ObjectAddLinkOption // RmLink removes a link from the node - RmLink(ctx context.Context, base Path, link string) (Node, error) + RmLink(ctx context.Context, base Path, link string) (Path, error) // AppendData appends data to the node - AppendData(context.Context, Path, io.Reader) (Node, error) + AppendData(context.Context, Path, io.Reader) (Path, error) // SetData sets the data contained in the node - SetData(context.Context, Path, io.Reader) (Node, error) + SetData(context.Context, Path, io.Reader) (Path, error) } // ObjectStat provides information about dag nodes @@ -267,7 +275,7 @@ type ObjectStat struct { // DataSize is the size of data block section DataSize int - // CumulativeSize is size of node + // CumulativeSize is size of the tree (BlockSize + link sizes) CumulativeSize int } diff --git a/coreiface/options/object.go b/coreiface/options/object.go index fe86a1cded..9c8c9a9ddd 100644 --- a/coreiface/options/object.go +++ b/coreiface/options/object.go @@ -6,6 +6,7 @@ type ObjectNewSettings struct { type ObjectPutSettings struct { InputEnc string + DataType string } type ObjectAddLinkSettings struct { @@ -33,6 +34,7 @@ func ObjectNewOptions(opts ...ObjectNewOption) (*ObjectNewSettings, error) { func ObjectPutOptions(opts ...ObjectPutOption) (*ObjectPutSettings, error) { options := &ObjectPutSettings{ InputEnc: "json", + DataType: "text", } for _, opt := range opts { @@ -74,6 +76,13 @@ func (api *ObjectOptions) WithInputEnc(e string) ObjectPutOption { } } +func (api *ObjectOptions) WithDataType(t string) ObjectPutOption { + return func(settings *ObjectPutSettings) error { + settings.DataType = t + return nil + } +} + func (api *ObjectOptions) WithCreate(create bool) ObjectAddLinkOption { return func(settings *ObjectAddLinkSettings) error { settings.Create = create From b87a1b9994009e70cfe8218c668fab3cc5f0f78d Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Sat, 20 Jan 2018 17:25:55 -0500 Subject: [PATCH 1838/3147] Update ipns validator License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@8e71a4ffdaf238757874d0dec1d733ec7a7fe7a1 --- namesys/ipns_validate_test.go | 93 +++++++++++++++++++++++++++++++++++ namesys/publisher.go | 32 +++++++++++- 2 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 namesys/ipns_validate_test.go diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go new file mode 100644 index 0000000000..d75fa6cb70 --- /dev/null +++ b/namesys/ipns_validate_test.go @@ -0,0 +1,93 @@ +package namesys + +import ( + "testing" + "time" + + path "github.com/ipfs/go-ipfs/path" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" +) + +func TestValidation(t *testing.T) { + // Create a record validator + validator := make(record.Validator) + validator["ipns"] = &record.ValidChecker{ValidateIpnsRecord, true} + + // Generate a key for signing the records + r := u.NewSeededRand(15) // generate deterministic keypair + priv, pubk, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + if err != nil { + t.Fatal(err) + } + + // Create entry with expiry in one hour + ts := time.Now() + entry, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + + // Get IPNS record path + pubkb, err := pubk.Bytes() + if err != nil { + t.Fatal(err) + } + pubkh := u.Hash(pubkb).B58String() + ipnsPath := "/ipns/" + pubkh + + val, err := proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + + // Create the record + r1, err := record.MakePutRecord(priv, ipnsPath, val, true) + + // Validate the record + err = validator.VerifyRecord(r1) + if err != nil { + t.Fatal(err) + } + + // Create IPNS record path with a different key + _, pubk2, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + if err != nil { + t.Fatal(err) + } + pubkb2, err := pubk2.Bytes() + if err != nil { + t.Fatal(err) + } + pubkh2 := u.Hash(pubkb2).B58String() + ipnsWrongPath := "/ipns/" + pubkh2 + + r2, err := record.MakePutRecord(priv, ipnsWrongPath, val, true) + + // Record should fail validation because path doesn't match author + err = validator.VerifyRecord(r2) + if err != ErrInvalidAuthor { + t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + } + + // Create expired entry + expired, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(-1*time.Hour)) + if err != nil { + t.Fatal(err) + } + valExp, err := proto.Marshal(expired) + if err != nil { + t.Fatal(err) + } + + // Create record with the expired entry + r3, err := record.MakePutRecord(priv, ipnsPath, valExp, true) + + // Record should fail validation because entry is expired + err = validator.VerifyRecord(r3) + if err != ErrExpiredRecord { + t.Fatal("ValidateIpnsRecord should have returned ErrExpiredRecord") + } +} diff --git a/namesys/publisher.go b/namesys/publisher.go index 6d033d5023..4861a1eaee 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "strings" "time" pb "github.com/ipfs/go-ipfs/namesys/pb" @@ -31,6 +32,14 @@ var ErrExpiredRecord = errors.New("expired record") // unknown validity type. var ErrUnrecognizedValidity = errors.New("unrecognized validity type") +// ErrInvalidAuthor is returned when an IpnsRecord has an +// author that does not match the IPNS path +var ErrInvalidAuthor = errors.New("author does not match path") + +// ErrInvalidPath should be returned when an ipns record path +// is not in a valid format +var ErrInvalidPath = errors.New("record path invalid") + const PublishPutValTimeout = time.Minute const DefaultRecordTTL = 24 * time.Hour @@ -295,12 +304,31 @@ func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { // ValidateIpnsRecord implements ValidatorFunc and verifies that the // given 'val' is an IpnsEntry and that that entry is valid. -func ValidateIpnsRecord(k string, val []byte) error { +func ValidateIpnsRecord(r *record.ValidationRecord) error { + if r.Namespace != "ipns" { + return ErrInvalidPath + } + entry := new(pb.IpnsEntry) - err := proto.Unmarshal(val, entry) + err := proto.Unmarshal(r.Value, entry) if err != nil { return err } + + // Note: The DHT will actually check the signature so we don't + // need to do that here + + // Author in key must match author in record + parts := strings.Split(r.Key, "/") + pid, err := peer.IDB58Decode(parts[0]) + if err != nil { + return ErrInvalidAuthor + } + if string(pid) != string(r.Author) { + return ErrInvalidAuthor + } + + // Check that record has not expired switch entry.GetValidityType() { case pb.IpnsEntry_EOL: t, err := u.ParseRFC3339(string(entry.GetValidity())) From 2bd9c1713931b57131fcb52ac0bd6f273ebf729e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Sun, 21 Jan 2018 09:51:29 -0500 Subject: [PATCH 1839/3147] Remove unneccesary split in IpnsValidator License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@4b48de6de6e8830892677480c488169202600fc0 --- namesys/ipns_validate_test.go | 91 ++++++++++++++++++++++++++--------- namesys/publisher.go | 4 +- 2 files changed, 68 insertions(+), 27 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index d75fa6cb70..8e9adc781c 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -1,6 +1,7 @@ package namesys import ( + "io" "testing" "time" @@ -18,10 +19,7 @@ func TestValidation(t *testing.T) { // Generate a key for signing the records r := u.NewSeededRand(15) // generate deterministic keypair - priv, pubk, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) - if err != nil { - t.Fatal(err) - } + priv, ipnsPath := genKeys(t, r) // Create entry with expiry in one hour ts := time.Now() @@ -30,64 +28,109 @@ func TestValidation(t *testing.T) { t.Fatal(err) } - // Get IPNS record path - pubkb, err := pubk.Bytes() + val, err := proto.Marshal(entry) if err != nil { t.Fatal(err) } - pubkh := u.Hash(pubkb).B58String() - ipnsPath := "/ipns/" + pubkh - val, err := proto.Marshal(entry) + // Create the record + rec, err := record.MakePutRecord(priv, ipnsPath, val, true) if err != nil { t.Fatal(err) } - // Create the record - r1, err := record.MakePutRecord(priv, ipnsPath, val, true) - // Validate the record - err = validator.VerifyRecord(r1) + err = validator.VerifyRecord(rec) if err != nil { t.Fatal(err) } + // Create IPNS record path with a different key - _, pubk2, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + _, ipnsWrongAuthor := genKeys(t, r) + wrongAuthorRec, err := record.MakePutRecord(priv, ipnsWrongAuthor, val, true) if err != nil { t.Fatal(err) } - pubkb2, err := pubk2.Bytes() + + // Record should fail validation because path doesn't match author + err = validator.VerifyRecord(wrongAuthorRec) + if err != ErrInvalidAuthor { + t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + } + + + // Create IPNS record path with extra path components after author + extraPath := ipnsPath + "/some/path" + extraPathRec, err := record.MakePutRecord(priv, extraPath, val, true) if err != nil { t.Fatal(err) } - pubkh2 := u.Hash(pubkb2).B58String() - ipnsWrongPath := "/ipns/" + pubkh2 - r2, err := record.MakePutRecord(priv, ipnsWrongPath, val, true) + // Record should fail validation because path has extra components after author + err = validator.VerifyRecord(extraPathRec) + if err != ErrInvalidAuthor { + t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + } - // Record should fail validation because path doesn't match author - err = validator.VerifyRecord(r2) + + // Create unsigned IPNS record + unsignedRec, err := record.MakePutRecord(priv, ipnsPath, val, false) + if err != nil { + t.Fatal(err) + } + + // Record should fail validation because IPNS records require signature + err = validator.VerifyRecord(unsignedRec) + if err != ErrInvalidAuthor { + t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + } + + + // Create unsigned IPNS record with no author + unsignedRecNoAuthor, err := record.MakePutRecord(priv, ipnsPath, val, false) + if err != nil { + t.Fatal(err) + } + noAuth := "" + unsignedRecNoAuthor.Author = &noAuth + + // Record should fail validation because IPNS records require author + err = validator.VerifyRecord(unsignedRecNoAuthor) if err != ErrInvalidAuthor { t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") } + // Create expired entry - expired, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(-1*time.Hour)) + expiredEntry, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(-1*time.Hour)) if err != nil { t.Fatal(err) } - valExp, err := proto.Marshal(expired) + valExp, err := proto.Marshal(expiredEntry) if err != nil { t.Fatal(err) } // Create record with the expired entry - r3, err := record.MakePutRecord(priv, ipnsPath, valExp, true) + expiredRec, err := record.MakePutRecord(priv, ipnsPath, valExp, true) // Record should fail validation because entry is expired - err = validator.VerifyRecord(r3) + err = validator.VerifyRecord(expiredRec) if err != ErrExpiredRecord { t.Fatal("ValidateIpnsRecord should have returned ErrExpiredRecord") } } + +func genKeys(t *testing.T, r io.Reader) (ci.PrivKey, string) { + priv, pubk, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + if err != nil { + t.Fatal(err) + } + pubkb, err := pubk.Bytes() + if err != nil { + t.Fatal(err) + } + p := "/ipns/" + u.Hash(pubkb).B58String() + return priv, p +} diff --git a/namesys/publisher.go b/namesys/publisher.go index 4861a1eaee..48d32bcc18 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -5,7 +5,6 @@ import ( "context" "errors" "fmt" - "strings" "time" pb "github.com/ipfs/go-ipfs/namesys/pb" @@ -319,8 +318,7 @@ func ValidateIpnsRecord(r *record.ValidationRecord) error { // need to do that here // Author in key must match author in record - parts := strings.Split(r.Key, "/") - pid, err := peer.IDB58Decode(parts[0]) + pid, err := peer.IDB58Decode(r.Key) if err != nil { return ErrInvalidAuthor } From 5e1e5f3c47e937c72b7d0435d3a2b352551240f5 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Sun, 21 Jan 2018 17:48:57 -0500 Subject: [PATCH 1840/3147] go fmt License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@4be57d9a4fe84a059451d8a1cacf79f1d868408c --- namesys/ipns_validate_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 8e9adc781c..2d46c7a82d 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -45,7 +45,6 @@ func TestValidation(t *testing.T) { t.Fatal(err) } - // Create IPNS record path with a different key _, ipnsWrongAuthor := genKeys(t, r) wrongAuthorRec, err := record.MakePutRecord(priv, ipnsWrongAuthor, val, true) @@ -59,7 +58,6 @@ func TestValidation(t *testing.T) { t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") } - // Create IPNS record path with extra path components after author extraPath := ipnsPath + "/some/path" extraPathRec, err := record.MakePutRecord(priv, extraPath, val, true) @@ -73,7 +71,6 @@ func TestValidation(t *testing.T) { t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") } - // Create unsigned IPNS record unsignedRec, err := record.MakePutRecord(priv, ipnsPath, val, false) if err != nil { @@ -86,7 +83,6 @@ func TestValidation(t *testing.T) { t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") } - // Create unsigned IPNS record with no author unsignedRecNoAuthor, err := record.MakePutRecord(priv, ipnsPath, val, false) if err != nil { @@ -101,7 +97,6 @@ func TestValidation(t *testing.T) { t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") } - // Create expired entry expiredEntry, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(-1*time.Hour)) if err != nil { From 7ed9b3c6ff4c84cdc689443b9605cdc451ca8ee8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 12:21:08 -0800 Subject: [PATCH 1841/3147] dagmodifier: remove useless offset update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@3796a7dad5bacccdabcc2f5f7342783227c20556 --- unixfs/mod/dagmodifier.go | 1 - 1 file changed, 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index b6ae06fa10..3ac7d77c0f 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -330,7 +330,6 @@ func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*c return nil, false, err } - offset += bs node.Links()[i].Cid = k // Recache serialized node From 57c918b713b7c40b90a51fc2ff12c9dc35ff8ea0 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 23 Jan 2018 08:25:40 -0500 Subject: [PATCH 1842/3147] Fix ipns validator key parsing License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@f447fab0a12625c817a83245ae2aea8ef0291eeb --- namesys/ipns_validate_test.go | 11 ++++++----- namesys/publisher.go | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 2d46c7a82d..fa78881034 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -8,6 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" ) @@ -45,7 +46,7 @@ func TestValidation(t *testing.T) { t.Fatal(err) } - // Create IPNS record path with a different key + // Create IPNS record path with a different private key _, ipnsWrongAuthor := genKeys(t, r) wrongAuthorRec, err := record.MakePutRecord(priv, ipnsWrongAuthor, val, true) if err != nil { @@ -118,14 +119,14 @@ func TestValidation(t *testing.T) { } func genKeys(t *testing.T, r io.Reader) (ci.PrivKey, string) { - priv, pubk, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) if err != nil { t.Fatal(err) } - pubkb, err := pubk.Bytes() + id, err := peer.IDFromPrivateKey(priv) if err != nil { t.Fatal(err) } - p := "/ipns/" + u.Hash(pubkb).B58String() - return priv, p + _, ipnsKey := IpnsKeysForID(id) + return priv, ipnsKey } diff --git a/namesys/publisher.go b/namesys/publisher.go index 48d32bcc18..3dc38c4d16 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -318,7 +318,7 @@ func ValidateIpnsRecord(r *record.ValidationRecord) error { // need to do that here // Author in key must match author in record - pid, err := peer.IDB58Decode(r.Key) + pid, err := peer.IDFromString(r.Key) if err != nil { return ErrInvalidAuthor } From 3103a10f1e4ae425d5719619c38c9804bbb74c2d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 12:21:51 -0800 Subject: [PATCH 1843/3147] merkledag: switch to new dag interface Also: * Update the blockstore/blockservice methods to match. * Construct a new temporary offline dag instead of having a GetOfflineLinkService method. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@3e19ae340e325f096cec1e63949c0471fae6f994 --- mfs/dir.go | 12 ++++++------ mfs/fd.go | 2 +- mfs/file.go | 4 ++-- mfs/mfs_test.go | 16 ++++++++-------- mfs/system.go | 8 ++++---- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 250219d758..5ad39d2050 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -24,7 +24,7 @@ var ErrInvalidChild = errors.New("invalid child node") var ErrDirExists = errors.New("directory already has entry by that name") type Directory struct { - dserv dag.DAGService + dserv node.DAGService parent childCloser childDirs map[string]*Directory @@ -40,7 +40,7 @@ type Directory struct { name string } -func NewDirectory(ctx context.Context, name string, node node.Node, parent childCloser, dserv dag.DAGService) (*Directory, error) { +func NewDirectory(ctx context.Context, name string, node node.Node, parent childCloser, dserv node.DAGService) (*Directory, error) { db, err := uio.NewDirectoryFromNode(dserv, node) if err != nil { return nil, err @@ -104,7 +104,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { return nil, err } - _, err = d.dserv.Add(nd) + err = d.dserv.Add(d.ctx, nd) if err != nil { return nil, err } @@ -306,7 +306,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { ndir := ft.EmptyDirNode() ndir.SetPrefix(d.GetPrefix()) - _, err = d.dserv.Add(ndir) + err = d.dserv.Add(d.ctx, ndir) if err != nil { return nil, err } @@ -354,7 +354,7 @@ func (d *Directory) AddChild(name string, nd node.Node) error { return ErrDirExists } - _, err = d.dserv.Add(nd) + err = d.dserv.Add(d.ctx, nd) if err != nil { return err } @@ -420,7 +420,7 @@ func (d *Directory) GetNode() (node.Node, error) { return nil, err } - _, err = d.dserv.Add(nd) + err = d.dserv.Add(d.ctx, nd) if err != nil { return nil, err } diff --git a/mfs/fd.go b/mfs/fd.go index 9eb3693164..a93a9bb428 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -122,7 +122,7 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { return err } - _, err = fi.inode.dserv.Add(nd) + err = fi.inode.dserv.Add(context.TODO(), nd) if err != nil { return err } diff --git a/mfs/file.go b/mfs/file.go index aa870551a5..033965fa20 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -20,7 +20,7 @@ type File struct { desclock sync.RWMutex - dserv dag.DAGService + dserv node.DAGService node node.Node nodelk sync.Mutex @@ -29,7 +29,7 @@ type File struct { // NewFile returns a NewFile object with the given parameters. If the // Cid version is non-zero RawLeaves will be enabled. -func NewFile(name string, node node.Node, parent childCloser, dserv dag.DAGService) (*File, error) { +func NewFile(name string, node node.Node, parent childCloser, dserv node.DAGService) (*File, error) { fi := &File{ dserv: dserv, parent: parent, diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index b9ec1b4e42..3745d88871 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -35,19 +35,19 @@ func emptyDirNode() *dag.ProtoNode { return dag.NodeWithData(ft.FolderPBData()) } -func getDagserv(t *testing.T) dag.DAGService { +func getDagserv(t *testing.T) node.DAGService { db := dssync.MutexWrap(ds.NewMapDatastore()) bs := bstore.NewBlockstore(db) blockserv := bserv.New(bs, offline.Exchange(bs)) return dag.NewDAGService(blockserv) } -func getRandFile(t *testing.T, ds dag.DAGService, size int64) node.Node { +func getRandFile(t *testing.T, ds node.DAGService, size int64) node.Node { r := io.LimitReader(u.NewTimeSeededRand(), size) return fileNodeFromReader(t, ds, r) } -func fileNodeFromReader(t *testing.T, ds dag.DAGService, r io.Reader) node.Node { +func fileNodeFromReader(t *testing.T, ds node.DAGService, r io.Reader) node.Node { nd, err := importer.BuildDagFromReader(ds, chunk.DefaultSplitter(r)) if err != nil { t.Fatal(err) @@ -128,7 +128,7 @@ func compStrArrs(a, b []string) bool { return true } -func assertFileAtPath(ds dag.DAGService, root *Directory, expn node.Node, pth string) error { +func assertFileAtPath(ds node.DAGService, root *Directory, expn node.Node, pth string) error { exp, ok := expn.(*dag.ProtoNode) if !ok { return dag.ErrNotProtobuf @@ -182,7 +182,7 @@ func assertFileAtPath(ds dag.DAGService, root *Directory, expn node.Node, pth st return nil } -func catNode(ds dag.DAGService, nd *dag.ProtoNode) ([]byte, error) { +func catNode(ds node.DAGService, nd *dag.ProtoNode) ([]byte, error) { r, err := uio.NewDagReader(context.TODO(), nd, ds) if err != nil { return nil, err @@ -192,7 +192,7 @@ func catNode(ds dag.DAGService, nd *dag.ProtoNode) ([]byte, error) { return ioutil.ReadAll(r) } -func setupRoot(ctx context.Context, t *testing.T) (dag.DAGService, *Root) { +func setupRoot(ctx context.Context, t *testing.T) (node.DAGService, *Root) { ds := getDagserv(t) root := emptyDirNode() @@ -284,7 +284,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { rootdir := rt.GetValue().(*Directory) nd := getRandFile(t, ds, 1000) - _, err := ds.Add(nd) + err := ds.Add(ctx, nd) if err != nil { t.Fatal(err) } @@ -292,7 +292,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { fihash := nd.Cid() dir := emptyDirNode() - _, err = ds.Add(dir) + err = ds.Add(ctx, dir) if err != nil { t.Fatal(err) } diff --git a/mfs/system.go b/mfs/system.go index 28dbe8aecb..5c30db57c1 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -58,7 +58,7 @@ type Root struct { repub *Republisher - dserv dag.DAGService + dserv node.DAGService Type string } @@ -67,7 +67,7 @@ type Root struct { type PubFunc func(context.Context, *cid.Cid) error // NewRoot creates a new Root and starts up a republisher routine for it. -func NewRoot(parent context.Context, ds dag.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { +func NewRoot(parent context.Context, ds node.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { var repub *Republisher if pf != nil { @@ -160,13 +160,13 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published. func (kr *Root) closeChild(name string, nd node.Node, sync bool) error { - c, err := kr.dserv.Add(nd) + err := kr.dserv.Add(context.TODO(), nd) if err != nil { return err } if kr.repub != nil { - kr.repub.Update(c) + kr.repub.Update(nd.Cid()) } return nil } From 948194813b89f3e6e2794c85b312da92be4415e0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 12:21:51 -0800 Subject: [PATCH 1844/3147] merkledag: switch to new dag interface Also: * Update the blockstore/blockservice methods to match. * Construct a new temporary offline dag instead of having a GetOfflineLinkService method. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@3ef1c87d92aec8afb54b1fb54138c3a83e41c9cb --- unixfs/archive/archive.go | 3 +-- unixfs/archive/tar/writer.go | 6 +++--- unixfs/hamt/hamt.go | 14 +++++++------- unixfs/hamt/hamt_stress_test.go | 9 +++++---- unixfs/hamt/hamt_test.go | 27 +++++++++++++++++---------- unixfs/io/dagreader.go | 2 +- unixfs/io/dagreader_test.go | 8 ++++---- unixfs/io/dirbuilder.go | 6 +++--- unixfs/io/dirbuilder_test.go | 4 ++-- unixfs/io/pbdagreader.go | 12 ++++++------ unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 26 +++++++++++++------------- unixfs/test/utils.go | 10 +++++----- 13 files changed, 68 insertions(+), 61 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index dc3afd0c27..2f6dc71831 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -7,7 +7,6 @@ import ( "io" "path" - mdag "github.com/ipfs/go-ipfs/merkledag" tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" @@ -31,7 +30,7 @@ func (i *identityWriteCloser) Close() error { } // DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` -func DagArchive(ctx context.Context, nd node.Node, name string, dag mdag.DAGService, archive bool, compression int) (io.Reader, error) { +func DagArchive(ctx context.Context, nd node.Node, name string, dag node.DAGService, archive bool, compression int) (io.Reader, error) { _, filename := path.Split(name) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 27372e8f84..9cd6966602 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -21,14 +21,14 @@ import ( // unixfs merkledag nodes as a tar archive format. // It wraps any io.Writer. type Writer struct { - Dag mdag.DAGService + Dag node.DAGService TarW *tar.Writer ctx context.Context } // NewWriter wraps given io.Writer. -func NewWriter(ctx context.Context, dag mdag.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { +func NewWriter(ctx context.Context, dag node.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { return &Writer{ Dag: dag, TarW: tar.NewWriter(w), @@ -41,7 +41,7 @@ func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { return err } - for i, ng := range mdag.GetDAG(w.ctx, w.Dag, nd) { + for i, ng := range node.GetDAG(w.ctx, w.Dag, nd) { child, err := ng.Get(w.ctx) if err != nil { return err diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 044017f974..2974d49280 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -57,7 +57,7 @@ type HamtShard struct { prefixPadStr string maxpadlen int - dserv dag.DAGService + dserv node.DAGService } // child can either be another shard, or a leaf node value @@ -66,7 +66,7 @@ type child interface { Label() string } -func NewHamtShard(dserv dag.DAGService, size int) (*HamtShard, error) { +func NewHamtShard(dserv node.DAGService, size int) (*HamtShard, error) { ds, err := makeHamtShard(dserv, size) if err != nil { return nil, err @@ -78,7 +78,7 @@ func NewHamtShard(dserv dag.DAGService, size int) (*HamtShard, error) { return ds, nil } -func makeHamtShard(ds dag.DAGService, size int) (*HamtShard, error) { +func makeHamtShard(ds node.DAGService, size int) (*HamtShard, error) { lg2s := int(math.Log2(float64(size))) if 1< Date: Thu, 25 Jan 2018 12:21:51 -0800 Subject: [PATCH 1845/3147] merkledag: switch to new dag interface Also: * Update the blockstore/blockservice methods to match. * Construct a new temporary offline dag instead of having a GetOfflineLinkService method. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@6aa9623d9cabfef03d7a04fdad8411ee4cc3e883 --- path/resolver.go | 8 ++++---- path/resolver_test.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 68639fbc0d..71ac52ba0f 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -35,12 +35,12 @@ func (e ErrNoLink) Error() string { // TODO: now that this is more modular, try to unify this code with the // the resolvers in namesys type Resolver struct { - DAG dag.DAGService + DAG node.DAGService - ResolveOnce func(ctx context.Context, ds dag.DAGService, nd node.Node, names []string) (*node.Link, []string, error) + ResolveOnce func(ctx context.Context, ds node.DAGService, nd node.Node, names []string) (*node.Link, []string, error) } -func NewBasicResolver(ds dag.DAGService) *Resolver { +func NewBasicResolver(ds node.DAGService) *Resolver { return &Resolver{ DAG: ds, ResolveOnce: ResolveSingle, @@ -123,7 +123,7 @@ func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, erro // ResolveSingle simply resolves one hop of a path through a graph with no // extra context (does not opaquely resolve through sharded nodes) -func ResolveSingle(ctx context.Context, ds dag.DAGService, nd node.Node, names []string) (*node.Link, []string, error) { +func ResolveSingle(ctx context.Context, ds node.DAGService, nd node.Node, names []string) (*node.Link, []string, error) { return nd.ResolveLink(names) } diff --git a/path/resolver_test.go b/path/resolver_test.go index 8347fc6023..5f5a9ee50a 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -39,7 +39,7 @@ func TestRecurivePathResolution(t *testing.T) { } for _, n := range []node.Node{a, b, c} { - _, err = dagService.Add(n) + err = dagService.Add(ctx, n) if err != nil { t.Fatal(err) } From 4d2e1b1752663b19e855beaa54db21e110ae9280 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 12:21:51 -0800 Subject: [PATCH 1846/3147] merkledag: switch to new dag interface Also: * Update the blockstore/blockservice methods to match. * Construct a new temporary offline dag instead of having a GetOfflineLinkService method. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@8fcf235b0161d7c15a66de915c5a1cd430ac7c52 --- blockservice/blockservice.go | 72 +++++++++++++++++--------------- blockservice/test/blocks_test.go | 6 +-- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 7388226054..d4f6fffade 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "io" "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" @@ -21,10 +22,27 @@ var log = logging.Logger("blockservice") var ErrNotFound = errors.New("blockservice: key not found") +type BlockGetter interface { + // GetBlock gets the requested block. + GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) + + // GetBlocks does a batch request for the given cids, returning blocks as + // they are found, in no particular order. + // + // It may not be able to find all requested blocks (or the context may + // be canceled). In that case, it will close the channel early. It is up + // to the consumer to detect this situation and keep track which blocks + // it has received and which it hasn't. + GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block +} + // BlockService is a hybrid block datastore. It stores data in a local // datastore and may retrieve data from a remote Exchange. // It uses an internal `datastore.Datastore` instance to store values. type BlockService interface { + io.Closer + BlockGetter + // Blockstore returns a reference to the underlying blockstore Blockstore() blockstore.Blockstore @@ -32,20 +50,14 @@ type BlockService interface { Exchange() exchange.Interface // AddBlock puts a given block to the underlying datastore - AddBlock(o blocks.Block) (*cid.Cid, error) + AddBlock(o blocks.Block) error // AddBlocks adds a slice of blocks at the same time using batching // capabilities of the underlying datastore whenever possible. - AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) - - GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) - DeleteBlock(o blocks.Block) error + AddBlocks(bs []blocks.Block) error - // GetBlocks does a batch request for the given cids, returning blocks as - // they are found, in no particular order. - GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block - - Close() error + // DeleteBlock deletes the given block from the blockservice. + DeleteBlock(o *cid.Cid) error } type blockService struct { @@ -110,38 +122,34 @@ func NewSession(ctx context.Context, bs BlockService) *Session { // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. -func (s *blockService) AddBlock(o blocks.Block) (*cid.Cid, error) { +func (s *blockService) AddBlock(o blocks.Block) error { c := o.Cid() if s.checkFirst { - has, err := s.blockstore.Has(c) - if err != nil { - return nil, err - } - - if has { - return c, nil + if has, err := s.blockstore.Has(c); has || err != nil { + return err } } - err := s.blockstore.Put(o) - if err != nil { - return nil, err + if err := s.blockstore.Put(o); err != nil { + return err } if err := s.exchange.HasBlock(o); err != nil { - return nil, errors.New("blockservice is closed") + // TODO(stebalien): really an error? + return errors.New("blockservice is closed") } - return c, nil + return nil } -func (s *blockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { +func (s *blockService) AddBlocks(bs []blocks.Block) error { var toput []blocks.Block if s.checkFirst { + toput = make([]blocks.Block, 0, len(bs)) for _, b := range bs { has, err := s.blockstore.Has(b.Cid()) if err != nil { - return nil, err + return err } if !has { toput = append(toput, b) @@ -153,18 +161,16 @@ func (s *blockService) AddBlocks(bs []blocks.Block) ([]*cid.Cid, error) { err := s.blockstore.PutMany(toput) if err != nil { - return nil, err + return err } - var ks []*cid.Cid for _, o := range toput { if err := s.exchange.HasBlock(o); err != nil { - return nil, fmt.Errorf("blockservice is closed (%s)", err) + // TODO(stebalien): Should this really *return*? + return fmt.Errorf("blockservice is closed (%s)", err) } - - ks = append(ks, o.Cid()) } - return ks, nil + return nil } // GetBlock retrieves a particular block from the service, @@ -256,8 +262,8 @@ func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f e } // DeleteBlock deletes a block in the blockservice from the datastore -func (s *blockService) DeleteBlock(o blocks.Block) error { - return s.blockstore.DeleteBlock(o.Cid()) +func (s *blockService) DeleteBlock(c *cid.Cid) error { + return s.blockstore.DeleteBlock(c) } func (s *blockService) Close() error { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 965327dae3..3ff25366cb 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -33,16 +33,12 @@ func TestBlocks(t *testing.T) { t.Error("Block key and data multihash key not equal") } - k, err := bs.AddBlock(o) + err := bs.AddBlock(o) if err != nil { t.Error("failed to add block to BlockService", err) return } - if !k.Equals(o.Cid()) { - t.Error("returned key is not equal to block key", err) - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() b2, err := bs.GetBlock(ctx, o.Cid()) From 4ce3ef8d3e8747a81cafd2de250f479d76d8e07e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 12:21:51 -0800 Subject: [PATCH 1847/3147] merkledag: switch to new dag interface Also: * Update the blockstore/blockservice methods to match. * Construct a new temporary offline dag instead of having a GetOfflineLinkService method. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@19fbe75ad3037d256affca05f700d4f5b44913c1 --- pinning/pinner/gc/gc.go | 17 ++++++++++------- pinning/pinner/pin.go | 26 +++++++++++++++----------- pinning/pinner/pin_test.go | 36 ++++++++++++++++++++---------------- pinning/pinner/set.go | 15 ++++++++------- 4 files changed, 53 insertions(+), 41 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 7a19b69698..c3ab3db900 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -6,6 +6,8 @@ import ( "fmt" bstore "github.com/ipfs/go-ipfs/blocks/blockstore" + bserv "github.com/ipfs/go-ipfs/blockservice" + offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" @@ -33,7 +35,7 @@ type Result struct { // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. // -func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { +func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { elock := log.EventBegin(ctx, "GC.lockWait") unlocker := bs.GCLock() @@ -41,7 +43,8 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. elock = log.EventBegin(ctx, "GC.locked") emark := log.EventBegin(ctx, "GC.mark") - ls = ls.GetOfflineLinkService() + bsrv := bserv.New(bs, offline.Exchange(bs)) + ds := dag.NewDAGService(bsrv) output := make(chan Result, 128) @@ -50,7 +53,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, ls dag.LinkService, pn pin. defer unlocker.Unlock() defer elock.Done() - gcs, err := ColoredSet(ctx, pn, ls, bestEffortRoots, output) + gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots, output) if err != nil { output <- Result{Error: err} return @@ -125,13 +128,13 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots // ColoredSet computes the set of nodes in the graph that are pinned by the // pins in the given pinner. -func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffortRoots []*cid.Cid, output chan<- Result) (*cid.Set, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ng node.NodeGetter, bestEffortRoots []*cid.Cid, output chan<- Result) (*cid.Set, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. errors := false gcs := cid.NewSet() getLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { - links, err := ls.GetLinks(ctx, cid) + links, err := node.GetLinks(ctx, ng, cid) if err != nil { errors = true output <- Result{Error: &CannotFetchLinksError{cid, err}} @@ -145,8 +148,8 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ls dag.LinkService, bestEffo } bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { - links, err := ls.GetLinks(ctx, cid) - if err != nil && err != dag.ErrNotFound { + links, err := node.GetLinks(ctx, ng, cid) + if err != nil && err != node.ErrNotFound { errors = true output <- Result{Error: &CannotFetchLinksError{cid, err}} } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index f148053ff7..9387439fb5 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -178,13 +178,13 @@ type pinner struct { // Track the keys used for storing the pinning state, so gc does // not delete them. internalPin *cid.Set - dserv mdag.DAGService - internal mdag.DAGService // dagservice used to store internal objects + dserv node.DAGService + internal node.DAGService // dagservice used to store internal objects dstore ds.Datastore } // NewPinner creates a new pinner using the given datastore as a backend -func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { +func NewPinner(dstore ds.Datastore, serv, internal node.DAGService) Pinner { rcset := cid.NewSet() dirset := cid.NewSet() @@ -203,11 +203,13 @@ func NewPinner(dstore ds.Datastore, serv, internal mdag.DAGService) Pinner { func (p *pinner) Pin(ctx context.Context, node node.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() - c, err := p.dserv.Add(node) + err := p.dserv.Add(ctx, node) if err != nil { return err } + c := node.Cid() + if recurse { if p.recursePin.Has(c) { return nil @@ -356,7 +358,7 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { // Now walk all recursive pins to check for indirect pins var checkChildren func(*cid.Cid, *cid.Cid) error checkChildren = func(rk, parentKey *cid.Cid) error { - links, err := p.dserv.GetLinks(context.Background(), parentKey) + links, err := node.GetLinks(context.TODO(), p.dserv, parentKey) if err != nil { return err } @@ -425,7 +427,7 @@ func cidSetWithValues(cids []*cid.Cid) *cid.Set { } // LoadPinner loads a pinner and its keysets from the given datastore -func LoadPinner(d ds.Datastore, dserv, internal mdag.DAGService) (Pinner, error) { +func LoadPinner(d ds.Datastore, dserv, internal node.DAGService) (Pinner, error) { p := new(pinner) rootKeyI, err := d.Get(pinDatastoreKey) @@ -550,16 +552,18 @@ func (p *pinner) Flush() error { } // add the empty node, its referenced by the pin sets but never created - _, err := p.internal.Add(new(mdag.ProtoNode)) + err := p.internal.Add(ctx, new(mdag.ProtoNode)) if err != nil { return err } - k, err := p.internal.Add(root) + err = p.internal.Add(ctx, root) if err != nil { return err } + k := root.Cid() + internalset.Add(k) if err := p.dstore.Put(pinDatastoreKey, k.Bytes()); err != nil { return fmt.Errorf("cannot store pin state: %v", err) @@ -593,8 +597,8 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { // hasChild recursively looks for a Cid among the children of a root Cid. // The visit function can be used to shortcut already-visited branches. -func hasChild(ds mdag.LinkService, root *cid.Cid, child *cid.Cid, visit func(*cid.Cid) bool) (bool, error) { - links, err := ds.GetLinks(context.Background(), root) +func hasChild(ng node.NodeGetter, root *cid.Cid, child *cid.Cid, visit func(*cid.Cid) bool) (bool, error) { + links, err := node.GetLinks(context.TODO(), ng, root) if err != nil { return false, err } @@ -604,7 +608,7 @@ func hasChild(ds mdag.LinkService, root *cid.Cid, child *cid.Cid, visit func(*ci return true, nil } if visit(c) { - has, err := hasChild(ds, c, child, visit) + has, err := hasChild(ng, c, child, visit) if err != nil { return false, err } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 7980c8dbc4..3652ef8e72 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -59,7 +59,7 @@ func TestPinnerBasic(t *testing.T) { p := NewPinner(dstore, dserv, dserv) a, ak := randNode() - _, err := dserv.Add(a) + err := dserv.Add(ctx, a) if err != nil { t.Fatal(err) } @@ -74,10 +74,11 @@ func TestPinnerBasic(t *testing.T) { // create new node c, to be indirectly pinned through b c, _ := randNode() - ck, err := dserv.Add(c) + err = dserv.Add(ctx, c) if err != nil { t.Fatal(err) } + ck := c.Cid() // Create new node b, to be parent to a and c b, _ := randNode() @@ -91,10 +92,11 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - _, err = dserv.Add(b) + err = dserv.Add(ctx, b) if err != nil { t.Fatal(err) } + bk := b.Cid() // recursively pin B{A,C} err = p.Pin(ctx, b, true) @@ -104,7 +106,6 @@ func TestPinnerBasic(t *testing.T) { assertPinned(t, p, ck, "child of recursively pinned node not found") - bk := b.Cid() assertPinned(t, p, bk, "Recursively pinned node not found..") d, _ := randNode() @@ -115,11 +116,11 @@ func TestPinnerBasic(t *testing.T) { d.AddNodeLink("e", e) // Must be in dagserv for unpin to work - _, err = dserv.Add(e) + err = dserv.Add(ctx, e) if err != nil { t.Fatal(err) } - _, err = dserv.Add(d) + err = dserv.Add(ctx, d) if err != nil { t.Fatal(err) } @@ -194,13 +195,13 @@ func TestIsPinnedLookup(t *testing.T) { } } - ak, err := dserv.Add(a) + err := dserv.Add(ctx, a) if err != nil { t.Fatal(err) } //t.Logf("a[%d] is %s", i, ak) aNodes[i] = a - aKeys[i] = ak + aKeys[i] = a.Cid() } // Pin A5 recursively @@ -222,20 +223,22 @@ func TestIsPinnedLookup(t *testing.T) { } // Add C - ck, err := dserv.Add(c) + err := dserv.Add(ctx, c) if err != nil { t.Fatal(err) } + ck := c.Cid() //t.Logf("C is %s", ck) // Add C to B and Add B if err := b.AddNodeLink("myotherchild", c); err != nil { t.Fatal(err) } - bk, err := dserv.Add(b) + err = dserv.Add(ctx, b) if err != nil { t.Fatal(err) } + bk := b.Cid() //t.Logf("B is %s", bk) // Pin C recursively @@ -284,7 +287,7 @@ func TestDuplicateSemantics(t *testing.T) { p := NewPinner(dstore, dserv, dserv) a, _ := randNode() - _, err := dserv.Add(a) + err := dserv.Add(ctx, a) if err != nil { t.Fatal(err) } @@ -349,12 +352,12 @@ func TestPinRecursiveFail(t *testing.T) { t.Fatal("should have failed to pin here") } - _, err = dserv.Add(b) + err = dserv.Add(ctx, b) if err != nil { t.Fatal(err) } - _, err = dserv.Add(a) + err = dserv.Add(ctx, a) if err != nil { t.Fatal(err) } @@ -369,6 +372,8 @@ func TestPinRecursiveFail(t *testing.T) { } func TestPinUpdate(t *testing.T) { + ctx := context.Background() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) bserv := bs.New(bstore, offline.Exchange(bstore)) @@ -378,10 +383,9 @@ func TestPinUpdate(t *testing.T) { n1, c1 := randNode() n2, c2 := randNode() - dserv.Add(n1) - dserv.Add(n2) + dserv.Add(ctx, n1) + dserv.Add(ctx, n2) - ctx := context.Background() if err := p.Pin(ctx, n1, true); err != nil { t.Fatal(err) } diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 6d4bff54b5..8778df9603 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -54,7 +54,7 @@ func (s sortByHash) Swap(a, b int) { s.links[a], s.links[b] = s.links[b], s.links[a] } -func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint64, depth uint32, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { +func storeItems(ctx context.Context, dag node.DAGService, estimatedLen uint64, depth uint32, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { links := make([]*node.Link, 0, defaultFanout+maxItems) for i := 0; i < defaultFanout; i++ { links = append(links, &node.Link{Cid: emptyKey}) @@ -139,10 +139,11 @@ func storeItems(ctx context.Context, dag merkledag.DAGService, estimatedLen uint return nil, err } - childKey, err := dag.Add(child) + err = dag.Add(ctx, child) if err != nil { return nil, err } + childKey := child.Cid() internalKeys(childKey) @@ -202,7 +203,7 @@ func writeHdr(n *merkledag.ProtoNode, hdr *pb.Set) error { type walkerFunc func(idx int, link *node.Link) error -func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.ProtoNode, fn walkerFunc, children keyObserver) error { +func walkItems(ctx context.Context, dag node.DAGService, n *merkledag.ProtoNode, fn walkerFunc, children keyObserver) error { hdr, err := readHdr(n) if err != nil { return err @@ -237,7 +238,7 @@ func walkItems(ctx context.Context, dag merkledag.DAGService, n *merkledag.Proto return nil } -func loadSet(ctx context.Context, dag merkledag.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]*cid.Cid, error) { +func loadSet(ctx context.Context, dag node.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]*cid.Cid, error) { l, err := root.GetNodeLink(name) if err != nil { return nil, err @@ -280,17 +281,17 @@ func getCidListIterator(cids []*cid.Cid) itemIterator { } } -func storeSet(ctx context.Context, dag merkledag.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { +func storeSet(ctx context.Context, dag node.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { iter := getCidListIterator(cids) n, err := storeItems(ctx, dag, uint64(len(cids)), 0, iter, internalKeys) if err != nil { return nil, err } - c, err := dag.Add(n) + err = dag.Add(ctx, n) if err != nil { return nil, err } - internalKeys(c) + internalKeys(n.Cid()) return n, nil } From de11d7a761a5c85d0f77d9c296000cfe07e40194 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 14:33:42 -0800 Subject: [PATCH 1848/3147] namesys: remove unecessary peerID cast License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@9d6564a12a71b80d9ac3a511ee61bf50ad299777 --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 3dc38c4d16..3bdca3771d 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -322,7 +322,7 @@ func ValidateIpnsRecord(r *record.ValidationRecord) error { if err != nil { return ErrInvalidAuthor } - if string(pid) != string(r.Author) { + if pid != r.Author { return ErrInvalidAuthor } From 49bab0334779d31a5eaaceebb5b52425b2bd2ffe Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 15:10:07 -0800 Subject: [PATCH 1849/3147] make code-climate happier License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@604df012abe28021cb711050051eaa99571b0f7f --- mfs/dir.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mfs/dir.go b/mfs/dir.go index 5ad39d2050..901f69952f 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -40,6 +40,10 @@ type Directory struct { name string } +// NewDirectory constructs a new MFS directory. +// +// You probably don't want to call this directly. Instead, construct a new root +// using NewRoot. func NewDirectory(ctx context.Context, name string, node node.Node, parent childCloser, dserv node.DAGService) (*Directory, error) { db, err := uio.NewDirectoryFromNode(dserv, node) if err != nil { From c099ce91547f57e738e533ad9c5fa6d8c515d866 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 15:10:07 -0800 Subject: [PATCH 1850/3147] make code-climate happier License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@e8ed89ced222f6f8e20b4af93c2876a0f1b91bd1 --- unixfs/hamt/hamt.go | 2 ++ unixfs/io/dirbuilder.go | 2 ++ unixfs/io/pbdagreader.go | 1 + unixfs/test/utils.go | 5 +++++ 4 files changed, 10 insertions(+) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 2974d49280..e0b063e4f7 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -66,6 +66,7 @@ type child interface { Label() string } +// NewHamtShard creates a new, empty HAMT shard with the given size. func NewHamtShard(dserv node.DAGService, size int) (*HamtShard, error) { ds, err := makeHamtShard(dserv, size) if err != nil { @@ -93,6 +94,7 @@ func makeHamtShard(ds node.DAGService, size int) (*HamtShard, error) { }, nil } +// NewHamtFromDag creates new a HAMT shard from the given DAG. func NewHamtFromDag(dserv node.DAGService, nd node.Node) (*HamtShard, error) { pbnd, ok := nd.(*dag.ProtoNode) if !ok { diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index bc9eb6c8e4..cc3a3905ce 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -51,6 +51,8 @@ func NewDirectory(dserv node.DAGService) *Directory { // ErrNotADir implies that the given node was not a unixfs directory var ErrNotADir = fmt.Errorf("merkledag node was not a directory or shard") +// NewDirectoryFromNode loads a unixfs directory from the given IPLD node and +// DAGService. func NewDirectoryFromNode(dserv node.DAGService, nd node.Node) (*Directory, error) { pbnd, ok := nd.(*mdag.ProtoNode) if !ok { diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 8f0f22d3b0..85cbc19688 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -50,6 +50,7 @@ type pbDagReader struct { var _ DagReader = (*pbDagReader)(nil) +// NewPBFileReader constructs a new PBFileReader. func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv node.DAGService) *pbDagReader { fctx, cancel := context.WithCancel(ctx) curLinks := getLinkCids(n) diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 8b234c9ad4..1e44b1e9c7 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -27,6 +27,7 @@ func SizeSplitterGen(size int64) chunk.SplitterGen { } } +// GetDAGServ returns a mock DAGService. func GetDAGServ() node.DAGService { return mdagmock.Mock() } @@ -51,6 +52,7 @@ func init() { UseBlake2b256.Prefix.MhLength = -1 } +// GetNode returns a unixfs file node with the specified data. func GetNode(t testing.TB, dserv node.DAGService, data []byte, opts NodeOpts) node.Node { in := bytes.NewReader(data) @@ -69,10 +71,12 @@ func GetNode(t testing.TB, dserv node.DAGService, data []byte, opts NodeOpts) no return node } +// GetEmptyNode returns an empty unixfs file node. func GetEmptyNode(t testing.TB, dserv node.DAGService, opts NodeOpts) node.Node { return GetNode(t, dserv, []byte{}, opts) } +// GetRandomNode returns a random unixfs file node. func GetRandomNode(t testing.TB, dserv node.DAGService, size int64, opts NodeOpts) ([]byte, node.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) buf, err := ioutil.ReadAll(in) @@ -96,6 +100,7 @@ func ArrComp(a, b []byte) error { return nil } +// PrintDag pretty-prints the given dag to stdout. func PrintDag(nd *mdag.ProtoNode, ds node.DAGService, indent int) { pbd, err := ft.FromBytes(nd.Data()) if err != nil { From 0a8ef98c75496ffd0eba909e0afc0a8cb7382e38 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 15:10:07 -0800 Subject: [PATCH 1851/3147] make code-climate happier License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@9d312e2f2ff7c40cbfee073dec7ed263bef9e7d5 --- path/resolver.go | 1 + 1 file changed, 1 insertion(+) diff --git a/path/resolver.go b/path/resolver.go index 71ac52ba0f..68865283ad 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -40,6 +40,7 @@ type Resolver struct { ResolveOnce func(ctx context.Context, ds node.DAGService, nd node.Node, names []string) (*node.Link, []string, error) } +// NewBasicResolver constructs a new basic resolver. func NewBasicResolver(ds node.DAGService) *Resolver { return &Resolver{ DAG: ds, From 179c418b6e5e3e30b2427b8d3003fe23afbbb50e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jan 2018 15:10:07 -0800 Subject: [PATCH 1852/3147] make code-climate happier License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@1eec61df5cd3421e485f6ff238f273696a114077 --- blockservice/blockservice.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index d4f6fffade..3969dad69b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -22,6 +22,8 @@ var log = logging.Logger("blockservice") var ErrNotFound = errors.New("blockservice: key not found") +// BlockGetter is the common interface shared between blockservice sessions and +// the blockservice. type BlockGetter interface { // GetBlock gets the requested block. GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) @@ -95,12 +97,14 @@ func NewWriteThrough(bs blockstore.Blockstore, rem exchange.Interface) BlockServ } } -func (bs *blockService) Blockstore() blockstore.Blockstore { - return bs.blockstore +// Blockstore returns the blockstore behind this blockservice. +func (s *blockService) Blockstore() blockstore.Blockstore { + return s.blockstore } -func (bs *blockService) Exchange() exchange.Interface { - return bs.exchange +// Exchange returns the exchange behind this blockservice. +func (s *blockService) Exchange() exchange.Interface { + return s.exchange } // NewSession creates a bitswap session that allows for controlled exchange of @@ -286,3 +290,5 @@ func (s *Session) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error func (s *Session) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { return getBlocks(ctx, ks, s.bs, s.ses) } + +var _ BlockGetter = (*Session)(nil) From b348fd328a98805b68218e0b5736c3927405399e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 26 Jan 2018 00:33:36 -0800 Subject: [PATCH 1853/3147] remove new DHT record author check We're going to just fix this a future commit. *This* change breaks publishing IPNS records using alternative IPNS keys (because the author signature (peer ID) differs from the record signature). We're going to fix it by validating the IPNS signature and ditching the author/signature fields. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@c0dca5d9ae5a17a49ec89cc1ed231f6155b4d248 --- namesys/ipns_validate_test.go | 4 +++- namesys/publisher.go | 33 ++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index fa78881034..82a6be2c0f 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -16,7 +16,7 @@ import ( func TestValidation(t *testing.T) { // Create a record validator validator := make(record.Validator) - validator["ipns"] = &record.ValidChecker{ValidateIpnsRecord, true} + validator["ipns"] = &record.ValidChecker{Func: ValidateIpnsRecord, Sign: true} // Generate a key for signing the records r := u.NewSeededRand(15) // generate deterministic keypair @@ -46,6 +46,7 @@ func TestValidation(t *testing.T) { t.Fatal(err) } + /* TODO(#4613) // Create IPNS record path with a different private key _, ipnsWrongAuthor := genKeys(t, r) wrongAuthorRec, err := record.MakePutRecord(priv, ipnsWrongAuthor, val, true) @@ -97,6 +98,7 @@ func TestValidation(t *testing.T) { if err != ErrInvalidAuthor { t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") } + */ // Create expired entry expiredEntry, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(-1*time.Hour)) diff --git a/namesys/publisher.go b/namesys/publisher.go index 3bdca3771d..473e9042bb 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -31,10 +31,6 @@ var ErrExpiredRecord = errors.New("expired record") // unknown validity type. var ErrUnrecognizedValidity = errors.New("unrecognized validity type") -// ErrInvalidAuthor is returned when an IpnsRecord has an -// author that does not match the IPNS path -var ErrInvalidAuthor = errors.New("author does not match path") - // ErrInvalidPath should be returned when an ipns record path // is not in a valid format var ErrInvalidPath = errors.New("record path invalid") @@ -314,17 +310,24 @@ func ValidateIpnsRecord(r *record.ValidationRecord) error { return err } - // Note: The DHT will actually check the signature so we don't - // need to do that here - - // Author in key must match author in record - pid, err := peer.IDFromString(r.Key) - if err != nil { - return ErrInvalidAuthor - } - if pid != r.Author { - return ErrInvalidAuthor - } + // NOTE/FIXME(#4613): We're not checking the DHT signature/author here. + // We're going to remove them in a followup commit and then check the + // *IPNS* signature. However, to do that, we need to ensure we *have* + // the public key and: + // + // 1. Don't want to fetch it from the network when handling PUTs. + // 2. Do want to fetch it from the network when handling GETs. + // + // Therefore, we'll need to either: + // + // 1. Pass some for of offline hint to the validator (e.g., using a context). + // 2. Ensure we pre-fetch the key when performing gets. + // + // This PR is already *way* too large so we're punting that fix to a new + // PR. + // + // This is not a regression, it just restores the current (bad) + // behavior. // Check that record has not expired switch entry.GetValidityType() { From 6a4275ac700dcfea82bcdae0acbef8055cff964a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 27 Jan 2018 18:03:59 -0800 Subject: [PATCH 1854/3147] update go-lib2p-loggables fixes a UUID bug I introduced (UUIDs were always an error value) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@8b9ea5a5b26caedf52907ea9e5b4bb4b9bfaeddb --- namesys/namesys.go | 2 +- namesys/pubsub.go | 2 +- namesys/pubsub_test.go | 4 ++-- namesys/republisher/repub_test.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index e38d58455f..673583d96b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -11,9 +11,9 @@ import ( ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + floodsub "gx/ipfs/QmSjoxpBJV71bpSojnUY1K382Ly3Up55EspnDx6EKAmQX4/go-libp2p-floodsub" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - floodsub "gx/ipfs/Qma2TkMxcFLVGkYECTo4hrQohBYPx7uhpYL9EejEi8y3Nm/go-libp2p-floodsub" peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" diff --git a/namesys/pubsub.go b/namesys/pubsub.go index c71d82a7d8..1bb45ae90d 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -16,9 +16,9 @@ import ( ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + floodsub "gx/ipfs/QmSjoxpBJV71bpSojnUY1K382Ly3Up55EspnDx6EKAmQX4/go-libp2p-floodsub" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - floodsub "gx/ipfs/Qma2TkMxcFLVGkYECTo4hrQohBYPx7uhpYL9EejEi8y3Nm/go-libp2p-floodsub" peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index abafa732b6..bda40899da 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -11,9 +11,9 @@ import ( ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - netutil "gx/ipfs/QmV1axkk86DDkYwS269AvPy9eV5h7mUyHveJkSVHPjrQtY/go-libp2p-netutil" + floodsub "gx/ipfs/QmSjoxpBJV71bpSojnUY1K382Ly3Up55EspnDx6EKAmQX4/go-libp2p-floodsub" + netutil "gx/ipfs/QmWUugnJBbcuin8qdfiCYKAsNkG8NeDLhzoBqRaqXhAHd4/go-libp2p-netutil" bhost "gx/ipfs/QmZ15dDSCo4DKn4o4GnqqLExKATBeeo3oNyQ5FBKtNjEQT/go-libp2p-blankhost" - floodsub "gx/ipfs/Qma2TkMxcFLVGkYECTo4hrQohBYPx7uhpYL9EejEi8y3Nm/go-libp2p-floodsub" peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 08bb700a39..0339572001 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -12,7 +12,7 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmNRN4eZGmY89CRC4T5PC4xDYRx6GkDKEfRnvrT65fVeio/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmPd5qhppUqewTQMfStvNNCFtcxiWGsnE6Vs3va6788gsX/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) From f3ce7f8aadb0e887a8061229134832344921c96f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 27 Jan 2018 18:59:58 -0800 Subject: [PATCH 1855/3147] handle error from changed NewFloodSub method License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@21a350c043a233a0e115df345b5f8ef190da17ac --- namesys/pubsub_test.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index bda40899da..1fe590cd1a 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -100,7 +100,11 @@ func TestPubsubPublishSubscribe(t *testing.T) { pubhost := newNetHost(ctx, t) pubmr := newMockRouting(ms, ks, pubhost) - pub := NewPubsubPublisher(ctx, pubhost, ds.NewMapDatastore(), pubmr, floodsub.NewFloodSub(ctx, pubhost)) + fs, err := floodsub.NewFloodSub(ctx, pubhost) + if err != nil { + t.Fatal(err) + } + pub := NewPubsubPublisher(ctx, pubhost, ds.NewMapDatastore(), pubmr, fs) privk := pubhost.Peerstore().PrivKey(pubhost.ID()) pubpinfo := pstore.PeerInfo{ID: pubhost.ID(), Addrs: pubhost.Addrs()} @@ -110,7 +114,13 @@ func TestPubsubPublishSubscribe(t *testing.T) { resmrs := newMockRoutingForHosts(ms, ks, reshosts) res := make([]*PubsubResolver, len(reshosts)) for i := 0; i < len(res); i++ { - res[i] = NewPubsubResolver(ctx, reshosts[i], resmrs[i], ks, floodsub.NewFloodSub(ctx, reshosts[i])) + + fs, err := floodsub.NewFloodSub(ctx, reshosts[i]) + if err != nil { + t.Fatal(err) + } + + res[i] = NewPubsubResolver(ctx, reshosts[i], resmrs[i], ks, fs) if err := reshosts[i].Connect(ctx, pubpinfo); err != nil { t.Fatal(err) } @@ -127,7 +137,7 @@ func TestPubsubPublishSubscribe(t *testing.T) { time.Sleep(time.Second * 1) val := path.Path("/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY") - err := pub.Publish(ctx, privk, val) + err = pub.Publish(ctx, privk, val) if err != nil { t.Fatal(err) } From bdd2167f12f620eac73a269f71ddb9c120eb9133 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 29 Jan 2018 11:55:34 -0800 Subject: [PATCH 1856/3147] rename import of go-ipld-format from node/format to ipld License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@8eaf9ff4d233b594fa0ce9f5a5810fc7f9518469 --- pinning/pinner/gc/gc.go | 14 +++++++------- pinning/pinner/pin.go | 20 ++++++++++---------- pinning/pinner/set.go | 24 ++++++++++++------------ 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index c3ab3db900..f48ebacb69 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -13,7 +13,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var log = logging.Logger("gc") @@ -128,13 +128,13 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots // ColoredSet computes the set of nodes in the graph that are pinned by the // pins in the given pinner. -func ColoredSet(ctx context.Context, pn pin.Pinner, ng node.NodeGetter, bestEffortRoots []*cid.Cid, output chan<- Result) (*cid.Set, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffortRoots []*cid.Cid, output chan<- Result) (*cid.Set, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. errors := false gcs := cid.NewSet() - getLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { - links, err := node.GetLinks(ctx, ng, cid) + getLinks := func(ctx context.Context, cid *cid.Cid) ([]*ipld.Link, error) { + links, err := ipld.GetLinks(ctx, ng, cid) if err != nil { errors = true output <- Result{Error: &CannotFetchLinksError{cid, err}} @@ -147,9 +147,9 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng node.NodeGetter, bestEffo output <- Result{Error: err} } - bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*node.Link, error) { - links, err := node.GetLinks(ctx, ng, cid) - if err != nil && err != node.ErrNotFound { + bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*ipld.Link, error) { + links, err := ipld.GetLinks(ctx, ng, cid) + if err != nil && err != ipld.ErrNotFound { errors = true output <- Result{Error: &CannotFetchLinksError{cid, err}} } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 9387439fb5..268d8e0049 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -15,7 +15,7 @@ import ( ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var log = logging.Logger("pin") @@ -102,7 +102,7 @@ type Pinner interface { IsPinnedWithType(*cid.Cid, PinMode) (string, bool, error) // Pin the given node, optionally recursively. - Pin(ctx context.Context, node node.Node, recursive bool) error + Pin(ctx context.Context, node ipld.Node, recursive bool) error // Unpin the given cid. If recursive is true, removes either a recursive or // a direct pin. If recursive is false, only removes a direct pin. @@ -178,13 +178,13 @@ type pinner struct { // Track the keys used for storing the pinning state, so gc does // not delete them. internalPin *cid.Set - dserv node.DAGService - internal node.DAGService // dagservice used to store internal objects + dserv ipld.DAGService + internal ipld.DAGService // dagservice used to store internal objects dstore ds.Datastore } // NewPinner creates a new pinner using the given datastore as a backend -func NewPinner(dstore ds.Datastore, serv, internal node.DAGService) Pinner { +func NewPinner(dstore ds.Datastore, serv, internal ipld.DAGService) Pinner { rcset := cid.NewSet() dirset := cid.NewSet() @@ -200,7 +200,7 @@ func NewPinner(dstore ds.Datastore, serv, internal node.DAGService) Pinner { } // Pin the given node, optionally recursive -func (p *pinner) Pin(ctx context.Context, node node.Node, recurse bool) error { +func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { p.lock.Lock() defer p.lock.Unlock() err := p.dserv.Add(ctx, node) @@ -358,7 +358,7 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { // Now walk all recursive pins to check for indirect pins var checkChildren func(*cid.Cid, *cid.Cid) error checkChildren = func(rk, parentKey *cid.Cid) error { - links, err := node.GetLinks(context.TODO(), p.dserv, parentKey) + links, err := ipld.GetLinks(context.TODO(), p.dserv, parentKey) if err != nil { return err } @@ -427,7 +427,7 @@ func cidSetWithValues(cids []*cid.Cid) *cid.Set { } // LoadPinner loads a pinner and its keysets from the given datastore -func LoadPinner(d ds.Datastore, dserv, internal node.DAGService) (Pinner, error) { +func LoadPinner(d ds.Datastore, dserv, internal ipld.DAGService) (Pinner, error) { p := new(pinner) rootKeyI, err := d.Get(pinDatastoreKey) @@ -597,8 +597,8 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { // hasChild recursively looks for a Cid among the children of a root Cid. // The visit function can be used to shortcut already-visited branches. -func hasChild(ng node.NodeGetter, root *cid.Cid, child *cid.Cid, visit func(*cid.Cid) bool) (bool, error) { - links, err := node.GetLinks(context.TODO(), ng, root) +func hasChild(ng ipld.NodeGetter, root *cid.Cid, child *cid.Cid, visit func(*cid.Cid) bool) (bool, error) { + links, err := ipld.GetLinks(context.TODO(), ng, root) if err != nil { return false, err } diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 8778df9603..e2ba3ed112 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -14,7 +14,7 @@ import ( "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) const ( @@ -39,7 +39,7 @@ type itemIterator func() (c *cid.Cid, ok bool) type keyObserver func(*cid.Cid) type sortByHash struct { - links []*node.Link + links []*ipld.Link } func (s sortByHash) Len() int { @@ -54,10 +54,10 @@ func (s sortByHash) Swap(a, b int) { s.links[a], s.links[b] = s.links[b], s.links[a] } -func storeItems(ctx context.Context, dag node.DAGService, estimatedLen uint64, depth uint32, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { - links := make([]*node.Link, 0, defaultFanout+maxItems) +func storeItems(ctx context.Context, dag ipld.DAGService, estimatedLen uint64, depth uint32, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { + links := make([]*ipld.Link, 0, defaultFanout+maxItems) for i := 0; i < defaultFanout; i++ { - links = append(links, &node.Link{Cid: emptyKey}) + links = append(links, &ipld.Link{Cid: emptyKey}) } // add emptyKey to our set of internal pinset objects @@ -85,7 +85,7 @@ func storeItems(ctx context.Context, dag node.DAGService, estimatedLen uint64, d break } - links = append(links, &node.Link{Cid: k}) + links = append(links, &ipld.Link{Cid: k}) } n.SetLinks(links) @@ -148,7 +148,7 @@ func storeItems(ctx context.Context, dag node.DAGService, estimatedLen uint64, d internalKeys(childKey) // overwrite the 'empty key' in the existing links array - n.Links()[h] = &node.Link{ + n.Links()[h] = &ipld.Link{ Cid: childKey, Size: size, } @@ -201,9 +201,9 @@ func writeHdr(n *merkledag.ProtoNode, hdr *pb.Set) error { return nil } -type walkerFunc func(idx int, link *node.Link) error +type walkerFunc func(idx int, link *ipld.Link) error -func walkItems(ctx context.Context, dag node.DAGService, n *merkledag.ProtoNode, fn walkerFunc, children keyObserver) error { +func walkItems(ctx context.Context, dag ipld.DAGService, n *merkledag.ProtoNode, fn walkerFunc, children keyObserver) error { hdr, err := readHdr(n) if err != nil { return err @@ -238,7 +238,7 @@ func walkItems(ctx context.Context, dag node.DAGService, n *merkledag.ProtoNode, return nil } -func loadSet(ctx context.Context, dag node.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]*cid.Cid, error) { +func loadSet(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]*cid.Cid, error) { l, err := root.GetNodeLink(name) if err != nil { return nil, err @@ -258,7 +258,7 @@ func loadSet(ctx context.Context, dag node.DAGService, root *merkledag.ProtoNode } var res []*cid.Cid - walk := func(idx int, link *node.Link) error { + walk := func(idx int, link *ipld.Link) error { res = append(res, link.Cid) return nil } @@ -281,7 +281,7 @@ func getCidListIterator(cids []*cid.Cid) itemIterator { } } -func storeSet(ctx context.Context, dag node.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { +func storeSet(ctx context.Context, dag ipld.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { iter := getCidListIterator(cids) n, err := storeItems(ctx, dag, uint64(len(cids)), 0, iter, internalKeys) From be5b2da9154308a4c15628a1781d661b29446ec2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 29 Jan 2018 11:55:34 -0800 Subject: [PATCH 1857/3147] rename import of go-ipld-format from node/format to ipld License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@4e431ca9c62b3a55a96e2ef0a95c17a2f9b9c7f2 --- mfs/dir.go | 24 ++++++++++++------------ mfs/file.go | 10 +++++----- mfs/mfs_test.go | 16 ++++++++-------- mfs/ops.go | 4 ++-- mfs/system.go | 12 ++++++------ 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 901f69952f..08b703fb26 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -16,7 +16,7 @@ import ( ufspb "github.com/ipfs/go-ipfs/unixfs/pb" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") @@ -24,7 +24,7 @@ var ErrInvalidChild = errors.New("invalid child node") var ErrDirExists = errors.New("directory already has entry by that name") type Directory struct { - dserv node.DAGService + dserv ipld.DAGService parent childCloser childDirs map[string]*Directory @@ -44,7 +44,7 @@ type Directory struct { // // You probably don't want to call this directly. Instead, construct a new root // using NewRoot. -func NewDirectory(ctx context.Context, name string, node node.Node, parent childCloser, dserv node.DAGService) (*Directory, error) { +func NewDirectory(ctx context.Context, name string, node ipld.Node, parent childCloser, dserv ipld.DAGService) (*Directory, error) { db, err := uio.NewDirectoryFromNode(dserv, node) if err != nil { return nil, err @@ -74,7 +74,7 @@ func (d *Directory) SetPrefix(prefix *cid.Prefix) { // closeChild updates the child by the given name to the dag node 'nd' // and changes its own dag node -func (d *Directory) closeChild(name string, nd node.Node, sync bool) error { +func (d *Directory) closeChild(name string, nd ipld.Node, sync bool) error { mynd, err := d.closeChildUpdate(name, nd, sync) if err != nil { return err @@ -87,7 +87,7 @@ func (d *Directory) closeChild(name string, nd node.Node, sync bool) error { } // closeChildUpdate is the portion of closeChild that needs to be locked around -func (d *Directory) closeChildUpdate(name string, nd node.Node, sync bool) (*dag.ProtoNode, error) { +func (d *Directory) closeChildUpdate(name string, nd ipld.Node, sync bool) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() @@ -121,7 +121,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { return pbnd.Copy().(*dag.ProtoNode), nil } -func (d *Directory) updateChild(name string, nd node.Node) error { +func (d *Directory) updateChild(name string, nd ipld.Node) error { err := d.dirbuilder.AddChild(d.ctx, name, nd) if err != nil { return err @@ -148,7 +148,7 @@ func (d *Directory) childNode(name string) (FSNode, error) { } // cacheNode caches a node into d.childDirs or d.files and returns the FSNode. -func (d *Directory) cacheNode(name string, nd node.Node) (FSNode, error) { +func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { switch nd := nd.(type) { case *dag.ProtoNode: i, err := ft.FromBytes(nd.Data()) @@ -205,7 +205,7 @@ func (d *Directory) Uncache(name string) { // childFromDag searches through this directories dag node for a child link // with the given name -func (d *Directory) childFromDag(name string) (node.Node, error) { +func (d *Directory) childFromDag(name string) (ipld.Node, error) { return d.dirbuilder.Find(d.ctx, name) } @@ -237,7 +237,7 @@ func (d *Directory) ListNames(ctx context.Context) ([]string, error) { defer d.lock.Unlock() var out []string - err := d.dirbuilder.ForEachLink(ctx, func(l *node.Link) error { + err := d.dirbuilder.ForEachLink(ctx, func(l *ipld.Link) error { out = append(out, l.Name) return nil }) @@ -262,7 +262,7 @@ func (d *Directory) List(ctx context.Context) ([]NodeListing, error) { func (d *Directory) ForEachEntry(ctx context.Context, f func(NodeListing) error) error { d.lock.Lock() defer d.lock.Unlock() - return d.dirbuilder.ForEachLink(ctx, func(l *node.Link) error { + return d.dirbuilder.ForEachLink(ctx, func(l *ipld.Link) error { c, err := d.childUnsync(l.Name) if err != nil { return err @@ -349,7 +349,7 @@ func (d *Directory) Flush() error { } // AddChild adds the node 'nd' under this directory giving it the name 'name' -func (d *Directory) AddChild(name string, nd node.Node) error { +func (d *Directory) AddChild(name string, nd ipld.Node) error { d.lock.Lock() defer d.lock.Unlock() @@ -410,7 +410,7 @@ func (d *Directory) Path() string { return out } -func (d *Directory) GetNode() (node.Node, error) { +func (d *Directory) GetNode() (ipld.Node, error) { d.lock.Lock() defer d.lock.Unlock() diff --git a/mfs/file.go b/mfs/file.go index 033965fa20..496b05d8e6 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) type File struct { @@ -20,8 +20,8 @@ type File struct { desclock sync.RWMutex - dserv node.DAGService - node node.Node + dserv ipld.DAGService + node ipld.Node nodelk sync.Mutex RawLeaves bool @@ -29,7 +29,7 @@ type File struct { // NewFile returns a NewFile object with the given parameters. If the // Cid version is non-zero RawLeaves will be enabled. -func NewFile(name string, node node.Node, parent childCloser, dserv node.DAGService) (*File, error) { +func NewFile(name string, node ipld.Node, parent childCloser, dserv ipld.DAGService) (*File, error) { fi := &File{ dserv: dserv, parent: parent, @@ -115,7 +115,7 @@ func (fi *File) Size() (int64, error) { } // GetNode returns the dag node associated with this file -func (fi *File) GetNode() (node.Node, error) { +func (fi *File) GetNode() (ipld.Node, error) { fi.nodelk.Lock() defer fi.nodelk.Unlock() return fi.node, nil diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 3745d88871..5db5d4987b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -28,26 +28,26 @@ import ( ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { return dag.NodeWithData(ft.FolderPBData()) } -func getDagserv(t *testing.T) node.DAGService { +func getDagserv(t *testing.T) ipld.DAGService { db := dssync.MutexWrap(ds.NewMapDatastore()) bs := bstore.NewBlockstore(db) blockserv := bserv.New(bs, offline.Exchange(bs)) return dag.NewDAGService(blockserv) } -func getRandFile(t *testing.T, ds node.DAGService, size int64) node.Node { +func getRandFile(t *testing.T, ds ipld.DAGService, size int64) ipld.Node { r := io.LimitReader(u.NewTimeSeededRand(), size) return fileNodeFromReader(t, ds, r) } -func fileNodeFromReader(t *testing.T, ds node.DAGService, r io.Reader) node.Node { +func fileNodeFromReader(t *testing.T, ds ipld.DAGService, r io.Reader) ipld.Node { nd, err := importer.BuildDagFromReader(ds, chunk.DefaultSplitter(r)) if err != nil { t.Fatal(err) @@ -128,7 +128,7 @@ func compStrArrs(a, b []string) bool { return true } -func assertFileAtPath(ds node.DAGService, root *Directory, expn node.Node, pth string) error { +func assertFileAtPath(ds ipld.DAGService, root *Directory, expn ipld.Node, pth string) error { exp, ok := expn.(*dag.ProtoNode) if !ok { return dag.ErrNotProtobuf @@ -182,7 +182,7 @@ func assertFileAtPath(ds node.DAGService, root *Directory, expn node.Node, pth s return nil } -func catNode(ds node.DAGService, nd *dag.ProtoNode) ([]byte, error) { +func catNode(ds ipld.DAGService, nd *dag.ProtoNode) ([]byte, error) { r, err := uio.NewDagReader(context.TODO(), nd, ds) if err != nil { return nil, err @@ -192,7 +192,7 @@ func catNode(ds node.DAGService, nd *dag.ProtoNode) ([]byte, error) { return ioutil.ReadAll(r) } -func setupRoot(ctx context.Context, t *testing.T) (node.DAGService, *Root) { +func setupRoot(ctx context.Context, t *testing.T) (ipld.DAGService, *Root) { ds := getDagserv(t) root := emptyDirNode() @@ -300,7 +300,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { dirhash := dir.Cid() top := emptyDirNode() - top.SetLinks([]*node.Link{ + top.SetLinks([]*ipld.Link{ { Name: "a", Cid: fihash, diff --git a/mfs/ops.go b/mfs/ops.go index 9d7182124d..e6ad1a3bea 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -10,7 +10,7 @@ import ( path "github.com/ipfs/go-ipfs/path" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' @@ -84,7 +84,7 @@ func lookupDir(r *Root, path string) (*Directory, error) { } // PutNode inserts 'nd' at 'path' in the given mfs -func PutNode(r *Root, path string, nd node.Node) error { +func PutNode(r *Root, path string, nd ipld.Node) error { dirp, filename := gopath.Split(path) if filename == "" { return fmt.Errorf("cannot create file with empty name") diff --git a/mfs/system.go b/mfs/system.go index 5c30db57c1..2150dc6211 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -21,7 +21,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var ErrNotExist = errors.New("no such rootfs") @@ -31,7 +31,7 @@ var log = logging.Logger("mfs") var ErrIsDirectory = errors.New("error: is a directory") type childCloser interface { - closeChild(string, node.Node, bool) error + closeChild(string, ipld.Node, bool) error } type NodeType int @@ -43,7 +43,7 @@ const ( // FSNode represents any node (directory, root, or file) in the mfs filesystem. type FSNode interface { - GetNode() (node.Node, error) + GetNode() (ipld.Node, error) Flush() error Type() NodeType } @@ -58,7 +58,7 @@ type Root struct { repub *Republisher - dserv node.DAGService + dserv ipld.DAGService Type string } @@ -67,7 +67,7 @@ type Root struct { type PubFunc func(context.Context, *cid.Cid) error // NewRoot creates a new Root and starts up a republisher routine for it. -func NewRoot(parent context.Context, ds node.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { +func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { var repub *Republisher if pf != nil { @@ -159,7 +159,7 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published. -func (kr *Root) closeChild(name string, nd node.Node, sync bool) error { +func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { err := kr.dserv.Add(context.TODO(), nd) if err != nil { return err From fbc6fdf742a94038e3b0b3538e20eeb9aaee75cb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 29 Jan 2018 11:55:34 -0800 Subject: [PATCH 1858/3147] rename import of go-ipld-format from node/format to ipld License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@93f532b6a06ea040a44a66aed8322f830546e34c --- unixfs/archive/archive.go | 4 +-- unixfs/archive/tar/writer.go | 10 ++++---- unixfs/hamt/hamt.go | 44 ++++++++++++++++----------------- unixfs/hamt/hamt_stress_test.go | 4 +-- unixfs/hamt/hamt_test.go | 10 ++++---- unixfs/io/dagreader.go | 4 +-- unixfs/io/dirbuilder.go | 18 +++++++------- unixfs/io/pbdagreader.go | 14 +++++------ unixfs/io/resolve.go | 4 +-- unixfs/mod/dagmodifier.go | 20 +++++++-------- unixfs/test/utils.go | 12 ++++----- 11 files changed, 72 insertions(+), 72 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 2f6dc71831..72b3e2dacd 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -10,7 +10,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. @@ -30,7 +30,7 @@ func (i *identityWriteCloser) Close() error { } // DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` -func DagArchive(ctx context.Context, nd node.Node, name string, dag node.DAGService, archive bool, compression int) (io.Reader, error) { +func DagArchive(ctx context.Context, nd ipld.Node, name string, dag ipld.DAGService, archive bool, compression int) (io.Reader, error) { _, filename := path.Split(name) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 9cd6966602..17614e10e6 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -14,21 +14,21 @@ import ( upb "github.com/ipfs/go-ipfs/unixfs/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // Writer is a utility structure that helps to write // unixfs merkledag nodes as a tar archive format. // It wraps any io.Writer. type Writer struct { - Dag node.DAGService + Dag ipld.DAGService TarW *tar.Writer ctx context.Context } // NewWriter wraps given io.Writer. -func NewWriter(ctx context.Context, dag node.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { +func NewWriter(ctx context.Context, dag ipld.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { return &Writer{ Dag: dag, TarW: tar.NewWriter(w), @@ -41,7 +41,7 @@ func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { return err } - for i, ng := range node.GetDAG(w.ctx, w.Dag, nd) { + for i, ng := range ipld.GetDAG(w.ctx, w.Dag, nd) { child, err := ng.Get(w.ctx) if err != nil { return err @@ -69,7 +69,7 @@ func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error return nil } -func (w *Writer) WriteNode(nd node.Node, fpath string) error { +func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { switch nd := nd.(type) { case *mdag.ProtoNode: pb := new(upb.Data) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index e0b063e4f7..80d97d8ec0 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -33,7 +33,7 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) @@ -57,17 +57,17 @@ type HamtShard struct { prefixPadStr string maxpadlen int - dserv node.DAGService + dserv ipld.DAGService } // child can either be another shard, or a leaf node value type child interface { - Link() (*node.Link, error) + Link() (*ipld.Link, error) Label() string } // NewHamtShard creates a new, empty HAMT shard with the given size. -func NewHamtShard(dserv node.DAGService, size int) (*HamtShard, error) { +func NewHamtShard(dserv ipld.DAGService, size int) (*HamtShard, error) { ds, err := makeHamtShard(dserv, size) if err != nil { return nil, err @@ -79,7 +79,7 @@ func NewHamtShard(dserv node.DAGService, size int) (*HamtShard, error) { return ds, nil } -func makeHamtShard(ds node.DAGService, size int) (*HamtShard, error) { +func makeHamtShard(ds ipld.DAGService, size int) (*HamtShard, error) { lg2s := int(math.Log2(float64(size))) if 1< Date: Mon, 29 Jan 2018 11:55:34 -0800 Subject: [PATCH 1859/3147] rename import of go-ipld-format from node/format to ipld License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@09472fc7fe0f5b3d20f3a02c8aa21286e1c01693 --- path/resolver.go | 22 +++++++++++----------- path/resolver_test.go | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 68865283ad..2609454a45 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -11,7 +11,7 @@ import ( logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) var log = logging.Logger("path") @@ -35,13 +35,13 @@ func (e ErrNoLink) Error() string { // TODO: now that this is more modular, try to unify this code with the // the resolvers in namesys type Resolver struct { - DAG node.DAGService + DAG ipld.DAGService - ResolveOnce func(ctx context.Context, ds node.DAGService, nd node.Node, names []string) (*node.Link, []string, error) + ResolveOnce func(ctx context.Context, ds ipld.DAGService, nd ipld.Node, names []string) (*ipld.Link, []string, error) } // NewBasicResolver constructs a new basic resolver. -func NewBasicResolver(ds node.DAGService) *Resolver { +func NewBasicResolver(ds ipld.DAGService) *Resolver { return &Resolver{ DAG: ds, ResolveOnce: ResolveSingle, @@ -74,7 +74,7 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { return c, parts[1:], nil } -func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (node.Node, []string, error) { +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (ipld.Node, []string, error) { c, p, err := SplitAbsPath(fpath) if err != nil { return nil, nil, err @@ -92,7 +92,7 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (node.Node } switch val := val.(type) { - case *node.Link: + case *ipld.Link: next, err := val.GetNode(ctx, r.DAG) if err != nil { return nil, nil, err @@ -109,7 +109,7 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (node.Node // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. -func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, error) { +func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (ipld.Node, error) { // validate path if err := fpath.IsValid(); err != nil { return nil, err @@ -124,14 +124,14 @@ func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, erro // ResolveSingle simply resolves one hop of a path through a graph with no // extra context (does not opaquely resolve through sharded nodes) -func ResolveSingle(ctx context.Context, ds node.DAGService, nd node.Node, names []string) (*node.Link, []string, error) { +func ResolveSingle(ctx context.Context, ds ipld.DAGService, nd ipld.Node, names []string) (*ipld.Link, []string, error) { return nd.ResolveLink(names) } // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. -func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]node.Node, error) { +func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]ipld.Node, error) { evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) defer evt.Done() @@ -158,11 +158,11 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]nod // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links -func (s *Resolver) ResolveLinks(ctx context.Context, ndd node.Node, names []string) ([]node.Node, error) { +func (s *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) defer evt.Done() - result := make([]node.Node, 0, len(names)+1) + result := make([]ipld.Node, 0, len(names)+1) result = append(result, ndd) nd := ndd // dup arg workaround diff --git a/path/resolver_test.go b/path/resolver_test.go index 5f5a9ee50a..d741bbcf1e 100644 --- a/path/resolver_test.go +++ b/path/resolver_test.go @@ -10,7 +10,7 @@ import ( path "github.com/ipfs/go-ipfs/path" util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - node "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) func randNode() *merkledag.ProtoNode { @@ -38,7 +38,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - for _, n := range []node.Node{a, b, c} { + for _, n := range []ipld.Node{a, b, c} { err = dagService.Add(ctx, n) if err != nil { t.Fatal(err) From dcec746b5fb149407e0e2bec33775e5c75a2b050 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 29 Jan 2018 15:05:57 -0800 Subject: [PATCH 1860/3147] update comment to note that we're punting on this License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@083827c9512ab1e630f1fe39da07d2880d84dc09 --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3969dad69b..0c3261daca 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -139,7 +139,7 @@ func (s *blockService) AddBlock(o blocks.Block) error { } if err := s.exchange.HasBlock(o); err != nil { - // TODO(stebalien): really an error? + // TODO(#4623): really an error? return errors.New("blockservice is closed") } @@ -170,7 +170,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { for _, o := range toput { if err := s.exchange.HasBlock(o); err != nil { - // TODO(stebalien): Should this really *return*? + // TODO(#4623): Should this really *return*? return fmt.Errorf("blockservice is closed (%s)", err) } } From 3a525b897573cdf1e8d493d004e6b9623f07527b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 5 Jan 2018 01:50:14 +0100 Subject: [PATCH 1861/3147] coreapi: draft block API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3cd2995b5bd80584d23ba16037045558a17d04b9 --- coreiface/interface.go | 18 ++++++++++++++++++ coreiface/options/block.go | 14 ++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 coreiface/options/block.go diff --git a/coreiface/interface.go b/coreiface/interface.go index ddcdc8db67..147a85412b 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -53,6 +53,11 @@ type Key interface { Path() Path } +type BlockStat interface { + Size() int + Path() Path +} + // CoreAPI defines an unified interface to IPFS for Go programs. type CoreAPI interface { // Unixfs returns an implementation of Unixfs API. @@ -87,6 +92,19 @@ type UnixfsAPI interface { Ls(context.Context, Path) ([]*Link, error) } +type BlockAPI interface { + Put(context.Context, io.Reader) (Path, error) + WithCodec(codec uint64) options.BlockPutOption + WithHash(mhType uint64, mhLen int) options.BlockPutOption + + Get(context.Context) (io.Reader, error) + + Rm(context.Context) error + WithForce(force bool) options.BlockRmOption + + Stat(context.Context) (BlockStat, error) +} + // DagAPI specifies the interface to IPLD type DagAPI interface { // Put inserts data using specified format and input encoding. diff --git a/coreiface/options/block.go b/coreiface/options/block.go new file mode 100644 index 0000000000..e2473e3f73 --- /dev/null +++ b/coreiface/options/block.go @@ -0,0 +1,14 @@ +package options + +type BlockPutSettings struct { + Codec uint64 + MhType uint64 + MhLength int +} + +type BlockRmSettings struct { + Force bool +} + +type BlockPutOption func(*BlockPutSettings) error +type BlockRmOption func(*BlockRmSettings) error From bfcc5b4d08e6efbcfb31f0551db2630613b94b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 6 Jan 2018 16:57:41 +0100 Subject: [PATCH 1862/3147] coreapi: implement block API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a7509ebfcac3b153716fc1d2cf4bf021d8ece1b5 --- coreiface/interface.go | 12 ++++---- coreiface/options/block.go | 61 +++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 147a85412b..bbe544344b 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -62,6 +62,8 @@ type BlockStat interface { type CoreAPI interface { // Unixfs returns an implementation of Unixfs API. Unixfs() UnixfsAPI + // Block returns an implementation of Block API. + Block() BlockAPI // Dag returns an implementation of Dag API. Dag() DagAPI // Name returns an implementation of Name API. @@ -93,16 +95,16 @@ type UnixfsAPI interface { } type BlockAPI interface { - Put(context.Context, io.Reader) (Path, error) - WithCodec(codec uint64) options.BlockPutOption + Put(context.Context, io.Reader, ...options.BlockPutOption) (Path, error) + WithFormat(codec string) options.BlockPutOption WithHash(mhType uint64, mhLen int) options.BlockPutOption - Get(context.Context) (io.Reader, error) + Get(context.Context, Path) (io.Reader, error) - Rm(context.Context) error + Rm(context.Context, Path, ...options.BlockRmOption) error WithForce(force bool) options.BlockRmOption - Stat(context.Context) (BlockStat, error) + Stat(context.Context, Path) (BlockStat, error) } // DagAPI specifies the interface to IPLD diff --git a/coreiface/options/block.go b/coreiface/options/block.go index e2473e3f73..7e6ad3230b 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -1,7 +1,12 @@ package options +import ( + //cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" + "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" +) + type BlockPutSettings struct { - Codec uint64 + Codec string MhType uint64 MhLength int } @@ -12,3 +17,57 @@ type BlockRmSettings struct { type BlockPutOption func(*BlockPutSettings) error type BlockRmOption func(*BlockRmSettings) error + +func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, error) { + options := &BlockPutSettings{ + Codec: "v0", + MhType: multihash.SHA2_256, + MhLength: -1, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +func BlockRmOptions(opts ...BlockRmOption) (*BlockRmSettings, error) { + options := &BlockRmSettings{ + Force: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type BlockOptions struct{} + +func (api *BlockOptions) WithFormat(codec string) BlockPutOption { + return func(settings *BlockPutSettings) error { + settings.Codec = codec + return nil + } +} + +func (api *BlockOptions) WithHash(mhType uint64, mhLen int) BlockPutOption { + return func(settings *BlockPutSettings) error { + settings.MhType = mhType + settings.MhLength = mhLen + return nil + } +} + +func (api *BlockOptions) WithForce(force bool) BlockRmOption { + return func(settings *BlockRmSettings) error { + settings.Force = force + return nil + } +} From db1f6da007f8c3d45668459b81d4b99559b0cea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 6 Jan 2018 17:13:33 +0100 Subject: [PATCH 1863/3147] corapi: block docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@1ffde91c6cc373e97ed28eb80ad3fb9ddf5103e1 --- coreiface/interface.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/coreiface/interface.go b/coreiface/interface.go index bbe544344b..2402ecf813 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -94,16 +94,35 @@ type UnixfsAPI interface { Ls(context.Context, Path) ([]*Link, error) } +// BlockAPI specifies the interface to the block layer type BlockAPI interface { + // Put imports raw block data, hashing it using specified settings. Put(context.Context, io.Reader, ...options.BlockPutOption) (Path, error) + + // WithFormat is an option for Put which specifies the multicodec to use to + // serialize the object. Default is "v0" WithFormat(codec string) options.BlockPutOption + + // WithHash is an option for Put which specifies the multihash settings to use + // when hashing the object. Default is mh.SHA2_256 (0x12). + // If mhLen is set to -1, default length for the hash will be used WithHash(mhType uint64, mhLen int) options.BlockPutOption + // Get attempts to resolve the path and return a reader for data in the block Get(context.Context, Path) (io.Reader, error) + // Rm removes the block specified by the path from local blockstore. + // By default an error will be returned if the block can't be found locally. + // + // NOTE: If the specified block is pinned it won't be removed and no error + // will be returned Rm(context.Context, Path, ...options.BlockRmOption) error + + // WithForce is an option for Rm which, when set to true, will ignore + // non-existing blocks WithForce(force bool) options.BlockRmOption + // Stat returns information on Stat(context.Context, Path) (BlockStat, error) } From 553000ad23cf89d17e0e456abd366a03f6371bc7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1864/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-chunker@4af2265b2268ad5ded9bb4a673155960c12e86c4 --- chunker/splitting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index ddd71e969c..d2eaf6fb46 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -4,7 +4,7 @@ package chunk import ( "io" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" mpool "gx/ipfs/QmWBug6eBS7AxRdCDVuSY5CnSit7cS2XnPFYJWqWDumhCG/go-msgio/mpool" ) From bc3c9d99fa267c2c7cc04fba3909cee9a7ed7198 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1865/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@1d86542e34fb1381982c6704a72f75daa8b1b2ca --- path/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver.go b/path/resolver.go index 2609454a45..edba489b5f 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -9,7 +9,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From 7d3ba7f749552a8ea596dc60902e568df410059a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1866/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-routing@62ccb5d08e2107c9047d1edf5ad2a46cb67baca1 --- routing/mock/centralized_client.go | 12 ++++++------ routing/mock/centralized_server.go | 6 +++--- routing/mock/centralized_test.go | 4 ++-- routing/mock/interface.go | 6 +++--- routing/none/none_client.go | 8 ++++---- routing/offline/offline.go | 10 +++++----- routing/offline/offline_test.go | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 683a2a8848..bc90ca6f7d 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,18 +6,18 @@ import ( "time" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" + "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" - dhtpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 6a86a6c6b9..b4263d1d2d 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,13 +6,13 @@ import ( "sync" "time" - "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" + "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 0fb7ce90fd..00ca6aec09 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,11 +6,11 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" + "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 31de6b0cc6..6306ff0606 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -8,11 +8,11 @@ import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" + "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 7d29395930..c384433625 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,11 +6,11 @@ import ( repo "github.com/ipfs/go-ipfs/repo" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" - p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) type nilclient struct { diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 46cb34adac..443d4a9ece 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -8,14 +8,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + pb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" - pb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" ) var ErrOffline = errors.New("routing system in offline mode") diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 42a8001623..66d8517006 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -6,7 +6,7 @@ import ( "testing" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" + "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ) func TestOfflineRouterStorage(t *testing.T) { From 32e0e118937bb25d6cfd289f2631d1a33234570a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1867/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@d7fe68852d0dbe754c4e0d1f8c0b12b105b8d774 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index f48ebacb69..20ed77b4e1 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -11,7 +11,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 268d8e0049..07cda7cd08 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -13,7 +13,7 @@ import ( dutils "github.com/ipfs/go-ipfs/merkledag/utils" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From a2ef7efe90ffc266ff58ed533b55d8766db455c0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1868/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@bafbd425a8b7b6acb079f0bced3d96957a27a760 --- filestore/filestore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 873ef12c3a..534d3f26dd 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -15,7 +15,7 @@ import ( "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) From 5b33bd74d022682b1f078c439edaa4d5b5c2ccc9 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1869/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@b7ae541fde07cab7ab8f23772379a2ff7db32584 --- namesys/ipns_validate_test.go | 4 ++-- namesys/namesys.go | 8 ++++---- namesys/publisher.go | 8 ++++---- namesys/publisher_test.go | 4 ++-- namesys/pubsub.go | 14 +++++++------- namesys/pubsub_test.go | 16 ++++++++-------- namesys/republisher/repub.go | 8 ++++---- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 4 ++-- 10 files changed, 37 insertions(+), 37 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 82a6be2c0f..430381cbef 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -7,10 +7,10 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" ) func TestValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 673583d96b..c654923608 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -9,14 +9,14 @@ import ( path "github.com/ipfs/go-ipfs/path" + p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - floodsub "gx/ipfs/QmSjoxpBJV71bpSojnUY1K382Ly3Up55EspnDx6EKAmQX4/go-libp2p-floodsub" + floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/publisher.go b/namesys/publisher.go index 473e9042bb..c7159036af 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -15,12 +15,12 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" - dhtpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" ) // ErrExpiredRecord should be returned when an ipns record is diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index de6a5c694c..86d4a0a411 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -12,10 +12,10 @@ import ( ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - testutil "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" ) type identity struct { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 1bb45ae90d..229b9ff427 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -13,19 +13,19 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - floodsub "gx/ipfs/QmSjoxpBJV71bpSojnUY1K382Ly3Up55EspnDx6EKAmQX4/go-libp2p-floodsub" + floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record" - dhtpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" - p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) // PubsubPublisher is a publisher that distributes IPNS records through pubsub diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index 1fe590cd1a..b8e6dbec35 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -9,16 +9,16 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" + p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - floodsub "gx/ipfs/QmSjoxpBJV71bpSojnUY1K382Ly3Up55EspnDx6EKAmQX4/go-libp2p-floodsub" - netutil "gx/ipfs/QmWUugnJBbcuin8qdfiCYKAsNkG8NeDLhzoBqRaqXhAHd4/go-libp2p-netutil" - bhost "gx/ipfs/QmZ15dDSCo4DKn4o4GnqqLExKATBeeo3oNyQ5FBKtNjEQT/go-libp2p-blankhost" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + bhost "gx/ipfs/QmQr1j6UvdhpponAaqSdswqRpdzsFwNop2N8kXLNw8afem/go-libp2p-blankhost" + floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + netutil "gx/ipfs/QmYVR3C8DWPHdHxvLtNFYfjsXgaRAdh6hPMNH3KiwCgu4o/go-libp2p-netutil" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" - testutil "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" - p2phost "gx/ipfs/QmfCtHMCd9xFvehvHeVxtKVXJTMVTuHhyPRVHEXetn87vL/go-libp2p-host" ) func newNetHost(ctx context.Context, t *testing.T) p2phost.Host { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index dc158fea62..345ba4abc3 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,14 +12,14 @@ import ( dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + recpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - recpb "gx/ipfs/QmbsY8Pr6s3uZsKg7rzBtGDKeCtdoAhNaMTCXBUbvb1eCV/go-libp2p-record/pb" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 0339572001..580b708de7 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -12,9 +12,9 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmPd5qhppUqewTQMfStvNNCFtcxiWGsnE6Vs3va6788gsX/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmNh1kGFFdsPu79KNSaL4NUKUPb4Eiz4KHdMtFY6664RDp/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmeZVQzUrXqaszo24DAoHfGzcmCptN9JyngLkGAiEfk2x7/go-libp2p-peerstore" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 2e0159860b..17dab14af6 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,11 +8,11 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil" + testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - peer "gx/ipfs/Qma7H6RW8wRrfZpNSXwxYGcd1E149s42FpWNpDNieSVrnU/go-libp2p-peer" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 7a1abbecf0..4ec68e7b62 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -10,8 +10,8 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - routing "gx/ipfs/QmRijoA6zGS98ELTDbGsLWPZbVotYsGbjp3RbXcKCYBeon/go-libp2p-routing" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" From 78ef54969aa6c13d2ae1d997639359fc54b31603 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1870/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@33437438f1e2f4c7fd8bb1b84db86f8d17a71afb --- mfs/repub_test.go | 2 +- mfs/system.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 499650d131..15400c9a3d 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" + ci "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil/ci" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ci "gx/ipfs/QmfB65MYJqaKzBiMvW47fquCRhmEeXW6AhrJSGM7TeY5eG/go-testutil/ci" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 2150dc6211..d93af7cfdc 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,7 +19,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From a4836bdfc93b10f71712a2ce179ea3b8f589ea67 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1871/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@aa6283a09e9a0b0bdbbedd206f2b18dbaaaa82ec --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0c3261daca..fb8144d884 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) From d49d1ec38db10a67f70659243dc2e4cbc7134ec6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 31 Jan 2018 18:54:57 -0800 Subject: [PATCH 1872/3147] gx: update go-log License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-blockstore@6ff6d6a46c37934c7cd739466125cb9afecdac28 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 5a37560c5d..7e5e8cbdcc 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -14,7 +14,7 @@ import ( ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" - logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) From 6bddfa5f233dce4a2a775255d2db6715dff00b65 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 1 Feb 2018 23:39:43 +0100 Subject: [PATCH 1873/3147] Docs: golint-ify "importers" module This fixes all golint warnings in the importers module, adding documentation and module descriptions. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@6f545b7e2635fdb69dd33320a17d0f7ae7b660c0 --- unixfs/format.go | 2 ++ unixfs/mod/dagmodifier.go | 2 +- unixfs/test/utils.go | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/unixfs/format.go b/unixfs/format.go index 4157ec0e57..26d4b0cc3b 100644 --- a/unixfs/format.go +++ b/unixfs/format.go @@ -174,6 +174,8 @@ func (n *FSNode) GetBytes() ([]byte, error) { return proto.Marshal(pbn) } +// FileSize returns the total size of this tree. That is, the size of +// the data in this node plus the size of all its children. func (n *FSNode) FileSize() uint64 { return uint64(len(n.Data)) + n.subtotal } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index ff2d51f252..8bf9382ddf 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -362,7 +362,7 @@ func (dm *DagModifier) appendData(nd ipld.Node, spl chunk.Splitter) (ipld.Node, Prefix: &dm.Prefix, RawLeaves: dm.RawLeaves, } - return trickle.TrickleAppend(dm.ctx, nd, dbp.New(spl)) + return trickle.Append(dm.ctx, nd, dbp.New(spl)) default: return nil, ErrNotUnixfs } diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index a50c4ecbea..5e1977ddb2 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -63,7 +63,7 @@ func GetNode(t testing.TB, dserv ipld.DAGService, data []byte, opts NodeOpts) ip RawLeaves: opts.RawLeavesUsed, } - node, err := trickle.TrickleLayout(dbp.New(SizeSplitterGen(500)(in))) + node, err := trickle.Layout(dbp.New(SizeSplitterGen(500)(in))) if err != nil { t.Fatal(err) } From 1adc3cd0933bb9c789c2794ea94b5589f4cb9743 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 1 Feb 2018 23:39:43 +0100 Subject: [PATCH 1874/3147] Docs: golint-ify "importers" module This fixes all golint warnings in the importers module, adding documentation and module descriptions. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-chunker@674ac127ee62d49a3283bc634c71dfdbf0300161 --- chunker/parse.go | 3 +++ chunker/rabin.go | 9 +++++++++ chunker/rabin_test.go | 2 +- chunker/splitting.go | 17 ++++++++++++++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/chunker/parse.go b/chunker/parse.go index f4cc562908..7d511c2170 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -8,6 +8,9 @@ import ( "strings" ) +// FromString returns a Splitter depending on the given string: +// it supports "default" (""), "size-{size}", "rabin", "rabin-{blocksize}" and +// "rabin-{min}-{avg}-{max}". func FromString(r io.Reader, chunker string) (Splitter, error) { switch { case chunker == "" || chunker == "default": diff --git a/chunker/rabin.go b/chunker/rabin.go index d2d71460d3..c3d1ebdba0 100644 --- a/chunker/rabin.go +++ b/chunker/rabin.go @@ -7,13 +7,18 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/whyrusleeping/chunker" ) +// IpfsRabinPoly is the irreducible polynomial of degree 53 used by for Rabin. var IpfsRabinPoly = chunker.Pol(17437180132763653) +// Rabin implements the Splitter interface and splits content with Rabin +// fingerprints. type Rabin struct { r *chunker.Chunker reader io.Reader } +// NewRabin creates a new Rabin splitter with the given +// average block size. func NewRabin(r io.Reader, avgBlkSize uint64) *Rabin { min := avgBlkSize / 3 max := avgBlkSize + (avgBlkSize / 2) @@ -21,6 +26,8 @@ func NewRabin(r io.Reader, avgBlkSize uint64) *Rabin { return NewRabinMinMax(r, min, avgBlkSize, max) } +// NewRabinMinMax returns a new Rabin splitter which uses +// the given min, average and max block sizes. func NewRabinMinMax(r io.Reader, min, avg, max uint64) *Rabin { h := fnv.New32a() ch := chunker.New(r, IpfsRabinPoly, h, avg, min, max) @@ -31,6 +38,7 @@ func NewRabinMinMax(r io.Reader, min, avg, max uint64) *Rabin { } } +// NextBytes reads the next bytes from the reader and returns a slice. func (r *Rabin) NextBytes() ([]byte, error) { ch, err := r.r.Next() if err != nil { @@ -40,6 +48,7 @@ func (r *Rabin) NextBytes() ([]byte, error) { return ch.Data, nil } +// Reader returns the io.Reader associated to this Splitter. func (r *Rabin) Reader() io.Reader { return r.reader } diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 1d5702e383..2f68f01c44 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -68,7 +68,7 @@ func TestRabinChunkReuse(t *testing.T) { ch2 := chunkData(t, data) var extra int - for k, _ := range ch2 { + for k := range ch2 { _, ok := ch1[k] if !ok { extra++ diff --git a/chunker/splitting.go b/chunker/splitting.go index ddd71e969c..9586df8502 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -1,4 +1,7 @@ -// package chunk implements streaming block splitters +// Package chunk implements streaming block splitters. +// Splitters read data from a reader and provide byte slices (chunks) +// The size and contents of these slices depend on the splitting method +// used. package chunk import ( @@ -10,25 +13,34 @@ import ( var log = logging.Logger("chunk") +// DefaultBlockSize is the chunk size that splitters produce (or aim to). var DefaultBlockSize int64 = 1024 * 256 +// A Splitter reads bytes from a Reader and creates "chunks" (byte slices) +// that can be used to build DAG nodes. type Splitter interface { Reader() io.Reader NextBytes() ([]byte, error) } +// SplitterGen is a splitter generator, given a reader. type SplitterGen func(r io.Reader) Splitter +// DefaultSplitter returns a SizeSplitter with the DefaultBlockSize. func DefaultSplitter(r io.Reader) Splitter { return NewSizeSplitter(r, DefaultBlockSize) } +// SizeSplitterGen returns a SplitterGen function which will create +// a splitter with the given size when called. func SizeSplitterGen(size int64) SplitterGen { return func(r io.Reader) Splitter { return NewSizeSplitter(r, size) } } +// Chan returns a channel that receives each of the chunks produced +// by a splitter, along with another one for errors. func Chan(s Splitter) (<-chan []byte, <-chan error) { out := make(chan []byte) errs := make(chan error, 1) @@ -56,6 +68,7 @@ type sizeSplitterv2 struct { err error } +// NewSizeSplitter returns a new size-based Splitter with the given block size. func NewSizeSplitter(r io.Reader, size int64) Splitter { return &sizeSplitterv2{ r: r, @@ -63,6 +76,7 @@ func NewSizeSplitter(r io.Reader, size int64) Splitter { } } +// NextBytes produces a new chunk. func (ss *sizeSplitterv2) NextBytes() ([]byte, error) { if ss.err != nil { return nil, ss.err @@ -85,6 +99,7 @@ func (ss *sizeSplitterv2) NextBytes() ([]byte, error) { } } +// Reader returns the io.Reader associated to this Splitter. func (ss *sizeSplitterv2) Reader() io.Reader { return ss.r } From e1ae80b2e143bcd35f82947064b5d7235f4615e3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Feb 2018 22:24:43 -0800 Subject: [PATCH 1875/3147] Use a bitswap session for 'Cat' License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@53bab4f9652f76c0518a3373efe1e8e9b6b7a3c0 --- unixfs/io/dagreader.go | 2 +- unixfs/io/pbdagreader.go | 4 ++-- unixfs/io/resolve.go | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index e92223230b..c6e9cf0d9b 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -34,7 +34,7 @@ type ReadSeekCloser interface { // NewDagReader creates a new reader object that reads the data represented by // the given node, using the passed in DAGService for data retreival -func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.DAGService) (DagReader, error) { +func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagReader, error) { switch n := n.(type) { case *mdag.RawNode: return NewBufDagReader(n.RawData()), nil diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 8745798a33..0c6bee8326 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -17,7 +17,7 @@ import ( // DagReader provides a way to easily read the data contained in a dag. type pbDagReader struct { - serv ipld.DAGService + serv ipld.NodeGetter // the node being read node *mdag.ProtoNode @@ -51,7 +51,7 @@ type pbDagReader struct { var _ DagReader = (*pbDagReader)(nil) // NewPBFileReader constructs a new PBFileReader. -func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv ipld.DAGService) *pbDagReader { +func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv ipld.NodeGetter) *pbDagReader { fctx, cancel := context.WithCancel(ctx) curLinks := getLinkCids(n) return &pbDagReader{ diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index a06e29ca33..26d360bb37 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -12,7 +12,7 @@ import ( // ResolveUnixfsOnce resolves a single hop of a path through a graph in a // unixfs context. This includes handling traversing sharded directories. -func ResolveUnixfsOnce(ctx context.Context, ds ipld.DAGService, nd ipld.Node, names []string) (*ipld.Link, []string, error) { +func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) { switch nd := nd.(type) { case *dag.ProtoNode: upb, err := ft.FromBytes(nd.Data()) @@ -28,7 +28,8 @@ func ResolveUnixfsOnce(ctx context.Context, ds ipld.DAGService, nd ipld.Node, na switch upb.GetType() { case ft.THAMTShard: - s, err := hamt.NewHamtFromDag(ds, nd) + rods := dag.NewReadOnlyDagService(ds) + s, err := hamt.NewHamtFromDag(rods, nd) if err != nil { return nil, nil, err } From 7647a84e18d02f6816b32a299be69925de3ee159 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Feb 2018 22:24:43 -0800 Subject: [PATCH 1876/3147] Use a bitswap session for 'Cat' License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@749e6f76d3d4e19a2536c8635141e75880b7d8b7 --- path/resolver.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/path/resolver.go b/path/resolver.go index 2609454a45..4106e87885 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -35,9 +35,9 @@ func (e ErrNoLink) Error() string { // TODO: now that this is more modular, try to unify this code with the // the resolvers in namesys type Resolver struct { - DAG ipld.DAGService + DAG ipld.NodeGetter - ResolveOnce func(ctx context.Context, ds ipld.DAGService, nd ipld.Node, names []string) (*ipld.Link, []string, error) + ResolveOnce func(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) } // NewBasicResolver constructs a new basic resolver. @@ -124,7 +124,7 @@ func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (ipld.Node, erro // ResolveSingle simply resolves one hop of a path through a graph with no // extra context (does not opaquely resolve through sharded nodes) -func ResolveSingle(ctx context.Context, ds ipld.DAGService, nd ipld.Node, names []string) (*ipld.Link, []string, error) { +func ResolveSingle(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) { return nd.ResolveLink(names) } From 72b62f5f64893169686ccb5569f41545c3ba8c67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Jan 2018 00:34:51 +0100 Subject: [PATCH 1877/3147] coreapi: update block after update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@bf7867a20c4aed75aead015b6c720b16645e9626 --- coreiface/interface.go | 4 ++++ coreiface/options/block.go | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 2402ecf813..95351e7d04 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -62,12 +62,16 @@ type BlockStat interface { type CoreAPI interface { // Unixfs returns an implementation of Unixfs API. Unixfs() UnixfsAPI + // Block returns an implementation of Block API. Block() BlockAPI + // Dag returns an implementation of Dag API. Dag() DagAPI + // Name returns an implementation of Name API. Name() NameAPI + // Key returns an implementation of Key API. Key() KeyAPI diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 7e6ad3230b..bbb14612f4 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -1,8 +1,7 @@ package options import ( - //cid "gx/ipfs/QmeSrf6pzut73u6zLQkRFQ3ygt3k6XFT2kjdYP8Tnkwwyg/go-cid" - "gx/ipfs/QmYeKnKpubCMRiq3PGZcTREErthbb5Q9cXsCoSkD9bjEBd/go-multihash" + "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" ) type BlockPutSettings struct { From 1820ac00cdfc8ead719a81ef5b08bf5744a482a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Jan 2018 15:03:22 +0100 Subject: [PATCH 1878/3147] fix pin test on windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@1bef62d6bfd7190167ce86b465298433b490afde --- pinning/pinner/pin_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 3652ef8e72..c0137a0d34 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -16,10 +16,12 @@ import ( cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) +var rand = util.NewTimeSeededRand() + func randNode() (*mdag.ProtoNode, *cid.Cid) { nd := new(mdag.ProtoNode) nd.SetData(make([]byte, 32)) - util.NewTimeSeededRand().Read(nd.Data()) + rand.Read(nd.Data()) k := nd.Cid() return nd, k } From b6b112691c550f81c6cfb31b3cab4fcf6250d62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Jan 2018 15:47:07 +0100 Subject: [PATCH 1879/3147] "fix" routing/mock tests on windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-routing@3f0bd8ab769c2f15ca6e9066bcf51af263045a80 --- routing/mock/centralized_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 00ca6aec09..8d056a139f 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -6,9 +6,9 @@ import ( "time" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) @@ -164,6 +164,8 @@ func TestValidAfter(t *testing.T) { } conf.ValueVisibility.Set(0) + time.Sleep(100 * time.Millisecond) + providersChan = rs.Client(pi).FindProvidersAsync(ctx, key, max) t.Log("providers", providers) for p := range providersChan { From 9d7df8e02a27a7b2c6e8192197bcfa8dba034c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 1 Feb 2018 13:20:14 +0100 Subject: [PATCH 1880/3147] make repo gc call CollectGarbage on datastore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@4f8b95f7f5ca4474977e60ba84c15e200a4c95f8 --- pinning/pinner/gc/gc.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 20ed77b4e1..92c8cb52a2 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -11,6 +11,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + dstore "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" @@ -35,7 +36,7 @@ type Result struct { // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. // -func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { +func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { elock := log.EventBegin(ctx, "GC.lockWait") unlocker := bs.GCLock() @@ -107,6 +108,18 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, pn pin.Pinner, bestEffortRo if errors { output <- Result{Error: ErrCannotDeleteSomeBlocks} } + + defer log.EventBegin(ctx, "GC.datastore").Done() + gds, ok := dstor.(dstore.GCDatastore) + if !ok { + return + } + + err = gds.CollectGarbage() + if err != nil { + output <- Result{Error: err} + return + } }() return output From 3c009fdf88416285baea4056a361ad1e1b764f33 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sun, 4 Feb 2018 04:28:55 +0100 Subject: [PATCH 1881/3147] blockservice: add BlockedFetched/Added/Removed events ... and remove a few log lines that don't seem terribly useful. License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-blockservice@3d6da969ea772aa4178da53e5023bd9f3e52c165 --- blockservice/blockservice.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0c3261daca..18eae3ec53 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -138,6 +138,8 @@ func (s *blockService) AddBlock(o blocks.Block) error { return err } + log.Event(context.TODO(), "BlockService.BlockAdded", c) + if err := s.exchange.HasBlock(o); err != nil { // TODO(#4623): really an error? return errors.New("blockservice is closed") @@ -169,6 +171,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { } for _, o := range toput { + log.Event(context.TODO(), "BlockService.BlockAdded", o.Cid()) if err := s.exchange.HasBlock(o); err != nil { // TODO(#4623): Should this really *return*? return fmt.Errorf("blockservice is closed (%s)", err) @@ -207,6 +210,7 @@ func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f excha } return nil, err } + log.Event(ctx, "BlockService.BlockFetched", c) return blk, nil } @@ -236,7 +240,6 @@ func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f e misses = append(misses, c) continue } - log.Debug("Blockservice: Got data in datastore") select { case out <- hit: case <-ctx.Done(): @@ -255,6 +258,7 @@ func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f e } for b := range rblocks { + log.Event(ctx, "BlockService.BlockFetched", b.Cid()) select { case out <- b: case <-ctx.Done(): @@ -267,7 +271,11 @@ func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f e // DeleteBlock deletes a block in the blockservice from the datastore func (s *blockService) DeleteBlock(c *cid.Cid) error { - return s.blockstore.DeleteBlock(c) + err := s.blockstore.DeleteBlock(c) + if err == nil { + log.Event(context.TODO(), "BlockService.BlockDeleted", c) + } + return err } func (s *blockService) Close() error { From 7b5b64eefb105adf64cc51224ea381a15239767a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 9 Jan 2018 01:10:03 +0100 Subject: [PATCH 1882/3147] coreapi: pin draft MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@b3293937f6e9b665c70038d40b304844fd015930 --- coreiface/interface.go | 44 ++++++++++++++++++++++++++++++ coreiface/options/pin.go | 58 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 coreiface/options/pin.go diff --git a/coreiface/interface.go b/coreiface/interface.go index 95351e7d04..40fa4131e4 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -58,6 +58,15 @@ type BlockStat interface { Path() Path } +// Pin holds information about pinned resource +type Pin interface { + // Path to the pinned object + Path() Path + + // Type of the pin + Type() string +} + // CoreAPI defines an unified interface to IPFS for Go programs. type CoreAPI interface { // Unixfs returns an implementation of Unixfs API. @@ -322,5 +331,40 @@ type ObjectStat struct { CumulativeSize int } +// PinAPI specifies the interface to pining +type PinAPI interface { + // Add creates new pin, be default recursive - pinning the whole referenced + // tree + Add(context.Context, Path, ...options.PinAddOption) error + + // WithRecursive is an option for Add which specifies whether to pin an entire + // object tree or just one object. Default: true + WithRecursive(bool) options.PinAddOption + + // Ls returns list of pinned objects on this node + Ls(context.Context) ([]Pin, error) + + // WithType is an option for Ls which allows to specify which pin types should + // be returned + // + // Supported values: + // * "direct" - directly pinned objects + // * "recursive" - roots of recursive pins + // * "indirect" - indirectly pinned objects (referenced by recursively pinned + // objects) + // * "all" - all pinned objects (default) + WithType(string) options.PinLsOption + + // Rm removes pin for object specified by the path + Rm(context.Context, Path) error + + // Update changes one pin to another, skipping checks for matching paths in + // the old tree + Update(ctx context.Context, from Path, to Path) error + + // Verify verifies the integrity of pinned objects + Verify(context.Context) error +} + var ErrIsDir = errors.New("object is a directory") var ErrOffline = errors.New("can't resolve, ipfs node is offline") diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go new file mode 100644 index 0000000000..4ad16d5558 --- /dev/null +++ b/coreiface/options/pin.go @@ -0,0 +1,58 @@ +package options + +type PinAddSettings struct { + Recursive bool +} + +type PinLsSettings struct { + Type string +} + +type PinAddOption func(*PinAddSettings) error +type PinLsOption func(settings *PinLsSettings) error + +func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { + options := &PinAddSettings{ + Recursive: true, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + + return options, nil +} + +func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { + options := &PinLsSettings{ + Type: "all", + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + + return options, nil +} + +type PinOptions struct{} + +func (api *PinOptions) WithRecursive(recucsive bool) PinAddOption { + return func(settings *PinAddSettings) error { + settings.Recursive = recucsive + return nil + } +} + +func (api *PinOptions) WithType(t string) PinLsOption { + return func(settings *PinLsSettings) error { + settings.Type = t + return nil + } +} From c1c32446e398484fac04c9a35c4ca92f930bbe2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 10 Jan 2018 18:41:06 +0100 Subject: [PATCH 1883/3147] coreapi: implement pin api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@4597fde83e61fa8d63fa7aef8a3118f7e441b6db --- coreiface/interface.go | 25 ++++++++++++++++++++++--- coreiface/options/pin.go | 27 +++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 40fa4131e4..75a168bf3e 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -67,6 +67,24 @@ type Pin interface { Type() string } +// PinStatus holds information about pin health +type PinStatus interface { + // Ok indicates whether the pin has been verified to be correct + Ok() bool + + // BadNodes returns any bad (usually missing) nodes from the pin + BadNodes() []BadPinNode +} + +// BadPinNode is a node that has been marked as bad by Pin.Verify +type BadPinNode interface { + // Path is the path of the node + Path() Path + + // Err is the reason why the node has been marked as bad + Err() error +} + // CoreAPI defines an unified interface to IPFS for Go programs. type CoreAPI interface { // Unixfs returns an implementation of Unixfs API. @@ -83,6 +101,7 @@ type CoreAPI interface { // Key returns an implementation of Key API. Key() KeyAPI + Pin() PinAPI // ObjectAPI returns an implementation of Object API Object() ObjectAPI @@ -342,7 +361,7 @@ type PinAPI interface { WithRecursive(bool) options.PinAddOption // Ls returns list of pinned objects on this node - Ls(context.Context) ([]Pin, error) + Ls(context.Context, ...options.PinLsOption) ([]Pin, error) // WithType is an option for Ls which allows to specify which pin types should // be returned @@ -360,10 +379,10 @@ type PinAPI interface { // Update changes one pin to another, skipping checks for matching paths in // the old tree - Update(ctx context.Context, from Path, to Path) error + Update(ctx context.Context, from Path, to Path, opts ...options.PinUpdateOption) error // Verify verifies the integrity of pinned objects - Verify(context.Context) error + Verify(context.Context) (<-chan PinStatus, error) } var ErrIsDir = errors.New("object is a directory") diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 4ad16d5558..f97f7b16ee 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -8,8 +8,13 @@ type PinLsSettings struct { Type string } +type PinUpdateSettings struct { + Unpin bool +} + type PinAddOption func(*PinAddSettings) error type PinLsOption func(settings *PinLsSettings) error +type PinUpdateOption func(*PinUpdateSettings) error func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { options := &PinAddSettings{ @@ -41,6 +46,21 @@ func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { return options, nil } +func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, error) { + options := &PinUpdateSettings{ + Unpin: true, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + + return options, nil +} + type PinOptions struct{} func (api *PinOptions) WithRecursive(recucsive bool) PinAddOption { @@ -56,3 +76,10 @@ func (api *PinOptions) WithType(t string) PinLsOption { return nil } } + +func (api *PinOptions) WithUnpin(unpin bool) PinUpdateOption { + return func(settings *PinUpdateSettings) error { + settings.Unpin = unpin + return nil + } +} From 115cc884844895575877f443f27cccacdd21f4d9 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 12:05:41 +0100 Subject: [PATCH 1884/3147] Golint: unixfs main module License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@fc05603fea3d88a86d0f0909f36b2208ed6310d1 --- unixfs/{format.go => unixfs.go} | 41 ++++++++++++++++++----- unixfs/{format_test.go => unixfs_test.go} | 0 2 files changed, 33 insertions(+), 8 deletions(-) rename unixfs/{format.go => unixfs.go} (74%) rename unixfs/{format_test.go => unixfs_test.go} (100%) diff --git a/unixfs/format.go b/unixfs/unixfs.go similarity index 74% rename from unixfs/format.go rename to unixfs/unixfs.go index 26d4b0cc3b..d04a461ed0 100644 --- a/unixfs/format.go +++ b/unixfs/unixfs.go @@ -1,4 +1,4 @@ -// Package format implements a data format for files in the IPFS filesystem It +// Package unixfs implements a data format for files in the IPFS filesystem It // is not the only format in ipfs, but it is the one that the filesystem // assumes package unixfs @@ -6,11 +6,13 @@ package unixfs import ( "errors" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/unixfs/pb" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) +// Shorthands for protobuffer types const ( TRaw = pb.Data_Raw TFile = pb.Data_File @@ -20,10 +22,14 @@ const ( THAMTShard = pb.Data_HAMTShard ) -var ErrMalformedFileFormat = errors.New("malformed data in file format") -var ErrInvalidDirLocation = errors.New("found directory node in unexpected place") -var ErrUnrecognizedType = errors.New("unrecognized node type") +// Common errors +var ( + ErrMalformedFileFormat = errors.New("malformed data in file format") + ErrInvalidDirLocation = errors.New("found directory node in unexpected place") + ErrUnrecognizedType = errors.New("unrecognized node type") +) +// FromBytes unmarshals a byte slice as protobuf Data. func FromBytes(data []byte) (*pb.Data, error) { pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) @@ -33,6 +39,8 @@ func FromBytes(data []byte) (*pb.Data, error) { return pbdata, nil } +// FilePBData creates a protobuf File with the given +// byte slice and returns the marshaled protobuf bytes representing it. func FilePBData(data []byte, totalsize uint64) []byte { pbfile := new(pb.Data) typ := pb.Data_File @@ -98,6 +106,7 @@ func SymlinkData(path string) ([]byte, error) { return out, nil } +// UnwrapData unmarshals a protobuf messages and returns the contents. func UnwrapData(data []byte) ([]byte, error) { pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) @@ -107,6 +116,10 @@ func UnwrapData(data []byte) ([]byte, error) { return pbdata.GetData(), nil } +// DataSize returns the size of the contents in protobuf wrapped slice. +// For raw data it simply provides the length of it. For Data_Files, it +// will return the associated filesize. Note that Data_Directories will +// return an error. func DataSize(data []byte) (uint64, error) { pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) @@ -116,16 +129,17 @@ func DataSize(data []byte) (uint64, error) { switch pbdata.GetType() { case pb.Data_Directory: - return 0, errors.New("Cant get data size of directory!") + return 0, errors.New("Cant get data size of directory") case pb.Data_File: return pbdata.GetFilesize(), nil case pb.Data_Raw: return uint64(len(pbdata.GetData())), nil default: - return 0, errors.New("Unrecognized node data type!") + return 0, errors.New("Unrecognized node data type") } } +// An FSNode represents a filesystem object. type FSNode struct { Data []byte @@ -139,6 +153,7 @@ type FSNode struct { Type pb.Data_DataType } +// FSNodeFromBytes unmarshal a protobuf message onto an FSNode. func FSNodeFromBytes(b []byte) (*FSNode, error) { pbn := new(pb.Data) err := proto.Unmarshal(b, pbn) @@ -160,11 +175,13 @@ func (n *FSNode) AddBlockSize(s uint64) { n.blocksizes = append(n.blocksizes, s) } +// RemoveBlockSize removes the given child block's size. func (n *FSNode) RemoveBlockSize(i int) { n.subtotal -= n.blocksizes[i] n.blocksizes = append(n.blocksizes[:i], n.blocksizes[i+1:]...) } +// GetBytes marshals this node as a protobuf message. func (n *FSNode) GetBytes() ([]byte, error) { pbn := new(pb.Data) pbn.Type = &n.Type @@ -180,16 +197,19 @@ func (n *FSNode) FileSize() uint64 { return uint64(len(n.Data)) + n.subtotal } +// NumChildren returns the number of child blocks of this node func (n *FSNode) NumChildren() int { return len(n.blocksizes) } +// Metadata is used to store additional FSNode information. type Metadata struct { MimeType string Size uint64 } -//MetadataFromBytes Unmarshals a protobuf message into Metadata. +// MetadataFromBytes Unmarshals a protobuf Data message into Metadata. +// The provided slice should have been encoded with BytesForMetadata(). func MetadataFromBytes(b []byte) (*Metadata, error) { pbd := new(pb.Data) err := proto.Unmarshal(b, pbd) @@ -210,12 +230,16 @@ func MetadataFromBytes(b []byte) (*Metadata, error) { return md, nil } +// Bytes marshals Metadata as a protobuf message of Metadata type. func (m *Metadata) Bytes() ([]byte, error) { pbm := new(pb.Metadata) pbm.MimeType = &m.MimeType return proto.Marshal(pbm) } +// BytesForMetadata wraps the given Metadata as a profobuf message of Data type, +// setting the DataType to Metadata. The wrapped bytes are itself the +// result of calling m.Bytes(). func BytesForMetadata(m *Metadata) ([]byte, error) { pbd := new(pb.Data) pbd.Filesize = proto.Uint64(m.Size) @@ -230,6 +254,7 @@ func BytesForMetadata(m *Metadata) ([]byte, error) { return proto.Marshal(pbd) } +// EmptyDirNode creates an empty folder Protonode. func EmptyDirNode() *dag.ProtoNode { return dag.NodeWithData(FolderPBData()) } diff --git a/unixfs/format_test.go b/unixfs/unixfs_test.go similarity index 100% rename from unixfs/format_test.go rename to unixfs/unixfs_test.go From 81a926ce507e66b4b88fa7598c201d1a77f7889e Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 12:43:13 +0100 Subject: [PATCH 1885/3147] Golint: unixfs/archive License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@ee06103334f5dcdda869a19b73d6ab850c86ac4d --- unixfs/archive/archive.go | 1 + unixfs/archive/tar/writer.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 72b3e2dacd..7a561992ef 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -1,3 +1,4 @@ +// Package archive provides utilities to archive and compress a [Unixfs] DAG. package archive import ( diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 17614e10e6..4503f5593b 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -1,3 +1,5 @@ +// Package tar provides functionality to write a unixfs merkledag +// as a tar archive. package tar import ( @@ -69,6 +71,7 @@ func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error return nil } +// WriteNode adds a node to the archive. func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { switch nd := nd.(type) { case *mdag.ProtoNode: @@ -106,6 +109,7 @@ func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { } } +// Close closes the tar writer. func (w *Writer) Close() error { return w.TarW.Close() } From 55e644b60c0f54359a5b3996b793853bf1f01bde Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 12:43:30 +0100 Subject: [PATCH 1886/3147] Golint: unixfs/hamt Note, stuttering required renaming of HamtShard to Shard. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@a7431628611413edab3c025dac844d6e3c9fbc89 --- unixfs/hamt/hamt.go | 70 +++++++++++++++++---------------- unixfs/hamt/hamt_stress_test.go | 12 +++--- unixfs/hamt/hamt_test.go | 24 +++++------ 3 files changed, 55 insertions(+), 51 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 80d97d8ec0..70c0b371c3 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -38,10 +38,12 @@ import ( ) const ( + // HashMurmur3 is the multiformats identifier for Murmur3 HashMurmur3 uint64 = 0x22 ) -type HamtShard struct { +// A Shard represents the HAMT. It should be initialized with NewShard(). +type Shard struct { nd *dag.ProtoNode bitfield *big.Int @@ -66,9 +68,9 @@ type child interface { Label() string } -// NewHamtShard creates a new, empty HAMT shard with the given size. -func NewHamtShard(dserv ipld.DAGService, size int) (*HamtShard, error) { - ds, err := makeHamtShard(dserv, size) +// NewShard creates a new, empty HAMT shard with the given size. +func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { + ds, err := makeShard(dserv, size) if err != nil { return nil, err } @@ -79,13 +81,13 @@ func NewHamtShard(dserv ipld.DAGService, size int) (*HamtShard, error) { return ds, nil } -func makeHamtShard(ds ipld.DAGService, size int) (*HamtShard, error) { +func makeShard(ds ipld.DAGService, size int) (*Shard, error) { lg2s := int(math.Log2(float64(size))) if 1<= len(ds.children) || i < 0 { return nil, fmt.Errorf("invalid index passed to getChild (likely corrupt bitfield)") } @@ -281,7 +283,7 @@ func (ds *HamtShard) getChild(ctx context.Context, i int) (child, error) { // loadChild reads the i'th child node of this shard from disk and returns it // as a 'child' interface -func (ds *HamtShard) loadChild(ctx context.Context, i int) (child, error) { +func (ds *Shard) loadChild(ctx context.Context, i int) (child, error) { lnk := ds.nd.Links()[i] if len(lnk.Name) < ds.maxpadlen { return nil, fmt.Errorf("invalid link name '%s'", lnk.Name) @@ -326,12 +328,12 @@ func (ds *HamtShard) loadChild(ctx context.Context, i int) (child, error) { return c, nil } -func (ds *HamtShard) setChild(i int, c child) { +func (ds *Shard) setChild(i int, c child) { ds.children[i] = c } // Link returns a merklelink to this shard node -func (ds *HamtShard) Link() (*ipld.Link, error) { +func (ds *Shard) Link() (*ipld.Link, error) { nd, err := ds.Node() if err != nil { return nil, err @@ -345,7 +347,7 @@ func (ds *HamtShard) Link() (*ipld.Link, error) { return ipld.MakeLink(nd) } -func (ds *HamtShard) insertChild(idx int, key string, lnk *ipld.Link) error { +func (ds *Shard) insertChild(idx int, key string, lnk *ipld.Link) error { if lnk == nil { return os.ErrNotExist } @@ -364,7 +366,7 @@ func (ds *HamtShard) insertChild(idx int, key string, lnk *ipld.Link) error { return nil } -func (ds *HamtShard) rmChild(i int) error { +func (ds *Shard) rmChild(i int) error { if i < 0 || i >= len(ds.children) || i >= len(ds.nd.Links()) { return fmt.Errorf("hamt: attempted to remove child with out of range index") } @@ -378,7 +380,7 @@ func (ds *HamtShard) rmChild(i int) error { return nil } -func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*shardValue) error) error { +func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*shardValue) error) error { idx := hv.Next(ds.tableSizeLg2) if ds.bitfield.Bit(int(idx)) == 1 { cindex := ds.indexForBitPos(idx) @@ -389,7 +391,7 @@ func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb } switch child := child.(type) { - case *HamtShard: + case *Shard: return child.getValue(ctx, hv, key, cb) case *shardValue: if child.key == key { @@ -401,7 +403,8 @@ func (ds *HamtShard) getValue(ctx context.Context, hv *hashBits, key string, cb return os.ErrNotExist } -func (ds *HamtShard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { +// EnumLinks collects all links in the Shard. +func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { var links []*ipld.Link err := ds.ForEachLink(ctx, func(l *ipld.Link) error { links = append(links, l) @@ -410,7 +413,8 @@ func (ds *HamtShard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { return links, err } -func (ds *HamtShard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { +// ForEachLink walks the Shard and calls the given function. +func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { return ds.walkTrie(ctx, func(sv *shardValue) error { lnk := sv.val lnk.Name = sv.key @@ -419,7 +423,7 @@ func (ds *HamtShard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) }) } -func (ds *HamtShard) walkTrie(ctx context.Context, cb func(*shardValue) error) error { +func (ds *Shard) walkTrie(ctx context.Context, cb func(*shardValue) error) error { for i := 0; i < ds.tableSize; i++ { if ds.bitfield.Bit(i) == 0 { continue @@ -440,7 +444,7 @@ func (ds *HamtShard) walkTrie(ctx context.Context, cb func(*shardValue) error) e return err } - case *HamtShard: + case *Shard: err := c.walkTrie(ctx, cb) if err != nil { return err @@ -452,7 +456,7 @@ func (ds *HamtShard) walkTrie(ctx context.Context, cb func(*shardValue) error) e return nil } -func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, val *ipld.Link) error { +func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val *ipld.Link) error { idx := hv.Next(ds.tableSizeLg2) if ds.bitfield.Bit(idx) != 1 { @@ -467,7 +471,7 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, } switch child := child.(type) { - case *HamtShard: + case *Shard: err := child.modifyValue(ctx, hv, key, val) if err != nil { return err @@ -510,7 +514,7 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, } // replace value with another shard, one level deeper - ns, err := NewHamtShard(ds.dserv, ds.tableSize) + ns, err := NewShard(ds.dserv, ds.tableSize) if err != nil { return err } @@ -540,7 +544,7 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string, // indexForBitPos returns the index within the collapsed array corresponding to // the given bit in the bitset. The collapsed array contains only one entry // per bit set in the bitfield, and this function is used to map the indices. -func (ds *HamtShard) indexForBitPos(bp int) int { +func (ds *Shard) indexForBitPos(bp int) int { // TODO: an optimization could reuse the same 'mask' here and change the size // as needed. This isnt yet done as the bitset package doesnt make it easy // to do. @@ -553,6 +557,6 @@ func (ds *HamtShard) indexForBitPos(bp int) int { } // linkNamePrefix takes in the bitfield index of an entry and returns its hex prefix -func (ds *HamtShard) linkNamePrefix(idx int) string { +func (ds *Shard) linkNamePrefix(idx int) string { return fmt.Sprintf(ds.prefixPadStr, idx) } diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go index e746a44b5b..185e385e1d 100644 --- a/unixfs/hamt/hamt_stress_test.go +++ b/unixfs/hamt/hamt_stress_test.go @@ -94,7 +94,7 @@ func TestOrderConsistency(t *testing.T) { } } -func validateOpSetCompletion(t *testing.T, s *HamtShard, keep, temp []string) error { +func validateOpSetCompletion(t *testing.T, s *Shard, keep, temp []string) error { ctx := context.TODO() for _, n := range keep { _, err := s.Find(ctx, n) @@ -113,9 +113,9 @@ func validateOpSetCompletion(t *testing.T, s *HamtShard, keep, temp []string) er return nil } -func executeOpSet(t *testing.T, ds ipld.DAGService, width int, ops []testOp) (*HamtShard, error) { +func executeOpSet(t *testing.T, ds ipld.DAGService, width int, ops []testOp) (*Shard, error) { ctx := context.TODO() - s, err := NewHamtShard(ds, width) + s, err := NewShard(ds, width) if err != nil { return nil, err } @@ -189,9 +189,9 @@ func genOpSet(seed int64, keep, temp []string) []testOp { } // executes the given op set with a repl to allow easier debugging -/*func debugExecuteOpSet(ds node.DAGService, width int, ops []testOp) (*HamtShard, error) { +/*func debugExecuteOpSet(ds node.DAGService, width int, ops []testOp) (*Shard, error) { - s, err := NewHamtShard(ds, width) + s, err := NewShard(ds, width) if err != nil { return nil, err } @@ -244,7 +244,7 @@ mainloop: } case "restart": var err error - s, err = NewHamtShard(ds, width) + s, err = NewShard(ds, width) if err != nil { panic(err) } diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index f89e9ac57a..72f74526ae 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -26,14 +26,14 @@ func shuffle(seed int64, arr []string) { } } -func makeDir(ds ipld.DAGService, size int) ([]string, *HamtShard, error) { +func makeDir(ds ipld.DAGService, size int) ([]string, *Shard, error) { return makeDirWidth(ds, size, 256) } -func makeDirWidth(ds ipld.DAGService, size, width int) ([]string, *HamtShard, error) { +func makeDirWidth(ds ipld.DAGService, size, width int) ([]string, *Shard, error) { ctx := context.Background() - s, _ := NewHamtShard(ds, width) + s, _ := NewShard(ds, width) var dirs []string for i := 0; i < size; i++ { @@ -54,7 +54,7 @@ func makeDirWidth(ds ipld.DAGService, size, width int) ([]string, *HamtShard, er return dirs, s, nil } -func assertLink(s *HamtShard, name string, found bool) error { +func assertLink(s *Shard, name string, found bool) error { _, err := s.Find(context.Background(), name) switch err { case os.ErrNotExist: @@ -74,7 +74,7 @@ func assertLink(s *HamtShard, name string, found bool) error { } } -func assertSerializationWorks(ds ipld.DAGService, s *HamtShard) error { +func assertSerializationWorks(ds ipld.DAGService, s *Shard) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() nd, err := s.Node() @@ -141,7 +141,7 @@ func TestBasicSet(t *testing.T) { func TestDirBuilding(t *testing.T) { ds := mdtest.Mock() - _, _ = NewHamtShard(ds, 256) + _, _ = NewShard(ds, 256) _, s, err := makeDir(ds, 200) if err != nil { @@ -164,7 +164,7 @@ func TestDirBuilding(t *testing.T) { func TestShardReload(t *testing.T) { ds := mdtest.Mock() - _, _ = NewHamtShard(ds, 256) + _, _ = NewShard(ds, 256) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -307,7 +307,7 @@ func TestSetAfterMarshal(t *testing.T) { func TestDuplicateAddShard(t *testing.T) { ds := mdtest.Mock() - dir, _ := NewHamtShard(ds, 256) + dir, _ := NewShard(ds, 256) nd := new(dag.ProtoNode) ctx := context.Background() @@ -430,7 +430,7 @@ func TestRemoveElemsAfterMarshal(t *testing.T) { func TestBitfieldIndexing(t *testing.T) { ds := mdtest.Mock() - s, _ := NewHamtShard(ds, 256) + s, _ := NewShard(ds, 256) set := func(i int) { s.bitfield.SetBit(s.bitfield, i, 1) @@ -466,7 +466,7 @@ func TestSetHamtChild(t *testing.T) { ctx := context.Background() ds := mdtest.Mock() - s, _ := NewHamtShard(ds, 256) + s, _ := NewShard(ds, 256) e := ft.EmptyDirNode() ds.Add(ctx, e) @@ -527,7 +527,7 @@ func BenchmarkHAMTSet(b *testing.B) { ctx := context.Background() ds := mdtest.Mock() - sh, _ := NewHamtShard(ds, 256) + sh, _ := NewShard(ds, 256) nd, err := sh.Node() if err != nil { b.Fatal(err) @@ -560,7 +560,7 @@ func BenchmarkHAMTSet(b *testing.B) { } func TestHamtBadSize(t *testing.T) { - _, err := NewHamtShard(nil, 7) + _, err := NewShard(nil, 7) if err == nil { t.Fatal("should have failed to construct hamt with bad size") } From 7ba8ec18d81d01eb24541333f8df753b702479bf Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 13:08:58 +0100 Subject: [PATCH 1887/3147] Golint: unixfs/mod unixfs/test License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@55c72fea1bef18ace94805423f8e518ae61c662a --- unixfs/mod/dagmodifier.go | 18 +++++++++++++----- unixfs/test/utils.go | 13 +++++++++---- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 8bf9382ddf..05c5c3587a 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -1,3 +1,5 @@ +// Package mod provides DAG modification utilities to, for example, +// insert additional nodes in a unixfs DAG or truncate them. package mod import ( @@ -19,8 +21,12 @@ import ( ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) -var ErrSeekFail = errors.New("failed to seek properly") -var ErrUnrecognizedWhence = errors.New("unrecognized whence") +// Common errors +var ( + ErrSeekFail = errors.New("failed to seek properly") + ErrUnrecognizedWhence = errors.New("unrecognized whence") + ErrNotUnixfs = fmt.Errorf("dagmodifier only supports unixfs nodes (proto or raw)") +) // 2MB var writebufferSize = 1 << 21 @@ -46,8 +52,6 @@ type DagModifier struct { read uio.DagReader } -var ErrNotUnixfs = fmt.Errorf("dagmodifier only supports unixfs nodes (proto or raw)") - // NewDagModifier returns a new DagModifier, the Cid prefix for newly // created nodes will be inherted from the passed in node. If the Cid // version if not 0 raw leaves will also be enabled. The Prefix and @@ -412,7 +416,7 @@ func (dm *DagModifier) readPrep() error { return nil } -// Read data from this dag starting at the current offset +// CtxReadFull reads data from this dag starting at the current offset func (dm *DagModifier) CtxReadFull(ctx context.Context, b []byte) (int, error) { err := dm.readPrep() if err != nil { @@ -438,6 +442,8 @@ func (dm *DagModifier) HasChanges() bool { return dm.wrBuf != nil } +// Seek modifies the offset according to whence. See unixfs/io for valid whence +// values. func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { err := dm.Sync() if err != nil { @@ -479,6 +485,8 @@ func (dm *DagModifier) Seek(offset int64, whence int) (int64, error) { return int64(dm.curWrOff), nil } +// Truncate truncates the current Node to 'size' and replaces it with the +// new one. func (dm *DagModifier) Truncate(size int64) error { err := dm.Sync() if err != nil { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 5e1977ddb2..0ca47c842c 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -21,6 +21,7 @@ import ( ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) +// SizeSplitterGen creates a generator. func SizeSplitterGen(size int64) chunk.SplitterGen { return func(r io.Reader) chunk.Splitter { return chunk.NewSizeSplitter(r, size) @@ -41,10 +42,13 @@ type NodeOpts struct { RawLeavesUsed bool } -var UseProtoBufLeaves = NodeOpts{Prefix: mdag.V0CidPrefix()} -var UseRawLeaves = NodeOpts{Prefix: mdag.V0CidPrefix(), ForceRawLeaves: true, RawLeavesUsed: true} -var UseCidV1 = NodeOpts{Prefix: mdag.V1CidPrefix(), RawLeavesUsed: true} -var UseBlake2b256 NodeOpts +// Some shorthands for NodeOpts. +var ( + UseProtoBufLeaves = NodeOpts{Prefix: mdag.V0CidPrefix()} + UseRawLeaves = NodeOpts{Prefix: mdag.V0CidPrefix(), ForceRawLeaves: true, RawLeavesUsed: true} + UseCidV1 = NodeOpts{Prefix: mdag.V1CidPrefix(), RawLeavesUsed: true} + UseBlake2b256 NodeOpts +) func init() { UseBlake2b256 = UseCidV1 @@ -88,6 +92,7 @@ func GetRandomNode(t testing.TB, dserv ipld.DAGService, size int64, opts NodeOpt return buf, node } +// ArrComp checks if two byte slices are the same. func ArrComp(a, b []byte) error { if len(a) != len(b) { return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) From cde1a522c783be3ab90fd3c9c83f6aae3435b5a9 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 13:48:35 +0100 Subject: [PATCH 1888/3147] Golint: unixfs/io License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@15596cf791ded4a03cc8997cf84ee3843f4f8981 --- unixfs/io/bufdagreader.go | 4 +++- unixfs/io/dagreader.go | 14 ++++++++---- unixfs/io/dagreader_test.go | 2 +- unixfs/io/dirbuilder.go | 17 +++++++++++---- unixfs/io/doc.go | 2 +- unixfs/io/pbdagreader.go | 43 ++++++++++++++++++++----------------- 6 files changed, 51 insertions(+), 31 deletions(-) diff --git a/unixfs/io/bufdagreader.go b/unixfs/io/bufdagreader.go index 2f73586407..8c6fd0cf86 100644 --- a/unixfs/io/bufdagreader.go +++ b/unixfs/io/bufdagreader.go @@ -10,7 +10,9 @@ type bufDagReader struct { *bytes.Reader } -func NewBufDagReader(b []byte) *bufDagReader { +// newBufDagReader returns a DAG reader for the given byte slice. +// BufDagReader is used to read RawNodes. +func newBufDagReader(b []byte) *bufDagReader { return &bufDagReader{bytes.NewReader(b)} } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index c6e9cf0d9b..037e0a2560 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -14,10 +14,15 @@ import ( ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) -var ErrIsDir = errors.New("this dag node is a directory") - -var ErrCantReadSymlinks = errors.New("cannot currently read symlinks") +// Common errors +var ( + ErrIsDir = errors.New("this dag node is a directory") + ErrCantReadSymlinks = errors.New("cannot currently read symlinks") +) +// A DagReader represents a ReadSeekCloser which offers additional methods +// like Size. Different implementations of readers are used for the different +// types of unixfs/protobuf-encoded nodes. type DagReader interface { ReadSeekCloser Size() uint64 @@ -25,6 +30,7 @@ type DagReader interface { Offset() int64 } +// A ReadSeekCloser implements interfaces to read, write, seek and close. type ReadSeekCloser interface { io.Reader io.Seeker @@ -37,7 +43,7 @@ type ReadSeekCloser interface { func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagReader, error) { switch n := n.(type) { case *mdag.RawNode: - return NewBufDagReader(n.RawData()), nil + return newBufDagReader(n.RawData()), nil case *mdag.ProtoNode: pb := new(ftpb.Data) if err := proto.Unmarshal(n.Data(), pb); err != nil { diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 82ff102342..e3d3d042b2 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -102,7 +102,7 @@ func TestSeekAndReadLarge(t *testing.T) { t.Fatal("seeked read failed") } - pbdr := reader.(*pbDagReader) + pbdr := reader.(*PBDagReader) var count int for i, p := range pbdr.promises { if i > 20 && i < 30 { diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 2deb4bcc8c..f2dee053c9 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -8,8 +8,8 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) @@ -25,11 +25,14 @@ var UseHAMTSharding = false // DefaultShardWidth is the default value used for hamt sharding width. var DefaultShardWidth = 256 +// Directory allows to work with UnixFS directory nodes, adding and removing +// children. It allows to work with different directory schemes, +// like the classic or the HAMT one. type Directory struct { dserv ipld.DAGService dirnode *mdag.ProtoNode - shard *hamt.HamtShard + shard *hamt.Shard } // NewDirectory returns a Directory. It needs a DAGService to add the Children @@ -37,7 +40,7 @@ func NewDirectory(dserv ipld.DAGService) *Directory { db := new(Directory) db.dserv = dserv if UseHAMTSharding { - s, err := hamt.NewHamtShard(dserv, DefaultShardWidth) + s, err := hamt.NewShard(dserv, DefaultShardWidth) if err != nil { panic(err) // will only panic if DefaultShardWidth is a bad value } @@ -113,7 +116,7 @@ func (d *Directory) AddChild(ctx context.Context, name string, nd ipld.Node) err } func (d *Directory) switchToSharding(ctx context.Context) error { - s, err := hamt.NewHamtShard(d.dserv, DefaultShardWidth) + s, err := hamt.NewShard(d.dserv, DefaultShardWidth) if err != nil { return err } @@ -136,6 +139,7 @@ func (d *Directory) switchToSharding(ctx context.Context) error { return nil } +// ForEachLink applies the given function to Links in the directory. func (d *Directory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { if d.shard == nil { for _, l := range d.dirnode.Links() { @@ -149,6 +153,7 @@ func (d *Directory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) e return d.shard.ForEachLink(ctx, f) } +// Links returns the all the links in the directory node. func (d *Directory) Links(ctx context.Context) ([]*ipld.Link, error) { if d.shard == nil { return d.dirnode.Links(), nil @@ -157,6 +162,9 @@ func (d *Directory) Links(ctx context.Context) ([]*ipld.Link, error) { return d.shard.EnumLinks(ctx) } +// Find returns the ipld.Node with the given name, if it is contained in this +// directory. Find only searches in the most inmediate links, and not +// recursively in the tree. func (d *Directory) Find(ctx context.Context, name string) (ipld.Node, error) { if d.shard == nil { lnk, err := d.dirnode.GetNodeLink(name) @@ -179,6 +187,7 @@ func (d *Directory) Find(ctx context.Context, name string) (ipld.Node, error) { return lnk.GetNode(ctx, d.dserv) } +// RemoveChild removes the child with the given name. func (d *Directory) RemoveChild(ctx context.Context, name string) error { if d.shard == nil { return d.dirnode.RemoveNodeLink(name) diff --git a/unixfs/io/doc.go b/unixfs/io/doc.go index b28755fc6a..cf844bd23a 100644 --- a/unixfs/io/doc.go +++ b/unixfs/io/doc.go @@ -1,3 +1,3 @@ -// package unixfs/io implements convenience objects for working with the ipfs +// Package io implements convenience objects for working with the ipfs // unixfs data format. package io diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 0c6bee8326..4523481b3d 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -15,8 +15,8 @@ import ( ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) -// DagReader provides a way to easily read the data contained in a dag. -type pbDagReader struct { +// PBDagReader provides a way to easily read the data contained in a dag. +type PBDagReader struct { serv ipld.NodeGetter // the node being read @@ -48,16 +48,16 @@ type pbDagReader struct { cancel func() } -var _ DagReader = (*pbDagReader)(nil) +var _ DagReader = (*PBDagReader)(nil) // NewPBFileReader constructs a new PBFileReader. -func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv ipld.NodeGetter) *pbDagReader { +func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv ipld.NodeGetter) *PBDagReader { fctx, cancel := context.WithCancel(ctx) curLinks := getLinkCids(n) - return &pbDagReader{ + return &PBDagReader{ node: n, serv: serv, - buf: NewBufDagReader(pb.GetData()), + buf: newBufDagReader(pb.GetData()), promises: make([]*ipld.NodePromise, len(curLinks)), links: curLinks, ctx: fctx, @@ -68,7 +68,7 @@ func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv const preloadSize = 10 -func (dr *pbDagReader) preloadNextNodes(ctx context.Context) { +func (dr *PBDagReader) preloadNextNodes(ctx context.Context) { beg := dr.linkPosition end := beg + preloadSize if end >= len(dr.links) { @@ -82,7 +82,7 @@ func (dr *pbDagReader) preloadNextNodes(ctx context.Context) { // precalcNextBuf follows the next link in line and loads it from the // DAGService, setting the next buffer to read from -func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { +func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { if dr.buf != nil { dr.buf.Close() // Just to make sure dr.buf = nil @@ -119,7 +119,7 @@ func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error { dr.buf = NewPBFileReader(dr.ctx, nxt, pb, dr.serv) return nil case ftpb.Data_Raw: - dr.buf = NewBufDagReader(pb.GetData()) + dr.buf = newBufDagReader(pb.GetData()) return nil case ftpb.Data_Metadata: return errors.New("shouldnt have had metadata object inside file") @@ -145,17 +145,17 @@ func getLinkCids(n ipld.Node) []*cid.Cid { } // Size return the total length of the data from the DAG structured file. -func (dr *pbDagReader) Size() uint64 { +func (dr *PBDagReader) Size() uint64 { return dr.pbdata.GetFilesize() } // Read reads data from the DAG structured file -func (dr *pbDagReader) Read(b []byte) (int, error) { +func (dr *PBDagReader) Read(b []byte) (int, error) { return dr.CtxReadFull(dr.ctx, b) } // CtxReadFull reads data from the DAG structured file -func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { +func (dr *PBDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { if dr.buf == nil { if err := dr.precalcNextBuf(ctx); err != nil { return 0, err @@ -189,7 +189,8 @@ func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { } } -func (dr *pbDagReader) WriteTo(w io.Writer) (int64, error) { +// WriteTo writes to the given writer. +func (dr *PBDagReader) WriteTo(w io.Writer) (int64, error) { if dr.buf == nil { if err := dr.precalcNextBuf(dr.ctx); err != nil { return 0, err @@ -220,12 +221,14 @@ func (dr *pbDagReader) WriteTo(w io.Writer) (int64, error) { } } -func (dr *pbDagReader) Close() error { +// Close closes the reader. +func (dr *PBDagReader) Close() error { dr.cancel() return nil } -func (dr *pbDagReader) Offset() int64 { +// Offset returns the current reader offset +func (dr *PBDagReader) Offset() int64 { return dr.offset } @@ -233,7 +236,7 @@ func (dr *pbDagReader) Offset() int64 { // interface matches standard unix seek // TODO: check if we can do relative seeks, to reduce the amount of dagreader // recreations that need to happen. -func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { +func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { switch whence { case io.SeekStart: if offset < 0 { @@ -253,17 +256,17 @@ func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) { if dr.buf != nil { dr.buf.Close() } - dr.buf = NewBufDagReader(pb.GetData()[offset:]) + dr.buf = newBufDagReader(pb.GetData()[offset:]) // start reading links from the beginning dr.linkPosition = 0 dr.offset = offset return offset, nil - } else { - // skip past root block data - left -= int64(len(pb.Data)) } + // skip past root block data + left -= int64(len(pb.Data)) + // iterate through links and find where we need to be for i := 0; i < len(pb.Blocksizes); i++ { if pb.Blocksizes[i] > uint64(left) { From 0bce0165dc25f2ad0b196a7f0740566bfe4fcb65 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 19:14:48 +0100 Subject: [PATCH 1889/3147] Golint: make BufDagReader public License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@7ab328df42d2f649cb294eb22fc940e32cf47601 --- unixfs/io/bufdagreader.go | 24 +++++++++++++++--------- unixfs/io/dagreader.go | 2 +- unixfs/io/pbdagreader.go | 6 +++--- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/unixfs/io/bufdagreader.go b/unixfs/io/bufdagreader.go index 8c6fd0cf86..6074099e83 100644 --- a/unixfs/io/bufdagreader.go +++ b/unixfs/io/bufdagreader.go @@ -6,27 +6,32 @@ import ( "io" ) -type bufDagReader struct { +// BufDagReader implements a DagReader that reads from a byte slice +// using a bytes.Reader. It is used for RawNodes. +type BufDagReader struct { *bytes.Reader } -// newBufDagReader returns a DAG reader for the given byte slice. +// NewBufDagReader returns a DAG reader for the given byte slice. // BufDagReader is used to read RawNodes. -func newBufDagReader(b []byte) *bufDagReader { - return &bufDagReader{bytes.NewReader(b)} +func NewBufDagReader(b []byte) *BufDagReader { + return &BufDagReader{bytes.NewReader(b)} } -var _ DagReader = (*bufDagReader)(nil) +var _ DagReader = (*BufDagReader)(nil) -func (*bufDagReader) Close() error { +// Close is a nop. +func (*BufDagReader) Close() error { return nil } -func (rd *bufDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { +// CtxReadFull reads the slice onto b. +func (rd *BufDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { return rd.Read(b) } -func (rd *bufDagReader) Offset() int64 { +// Offset returns the current offset. +func (rd *BufDagReader) Offset() int64 { of, err := rd.Seek(0, io.SeekCurrent) if err != nil { panic("this should never happen " + err.Error()) @@ -34,7 +39,8 @@ func (rd *bufDagReader) Offset() int64 { return of } -func (rd *bufDagReader) Size() uint64 { +// Size returns the size of the buffer. +func (rd *BufDagReader) Size() uint64 { s := rd.Reader.Size() if s < 0 { panic("size smaller than 0 (impossible!!)") diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 037e0a2560..ec3b3e0285 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -43,7 +43,7 @@ type ReadSeekCloser interface { func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagReader, error) { switch n := n.(type) { case *mdag.RawNode: - return newBufDagReader(n.RawData()), nil + return NewBufDagReader(n.RawData()), nil case *mdag.ProtoNode: pb := new(ftpb.Data) if err := proto.Unmarshal(n.Data(), pb); err != nil { diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 4523481b3d..ce3abf439f 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -57,7 +57,7 @@ func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv return &PBDagReader{ node: n, serv: serv, - buf: newBufDagReader(pb.GetData()), + buf: NewBufDagReader(pb.GetData()), promises: make([]*ipld.NodePromise, len(curLinks)), links: curLinks, ctx: fctx, @@ -119,7 +119,7 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { dr.buf = NewPBFileReader(dr.ctx, nxt, pb, dr.serv) return nil case ftpb.Data_Raw: - dr.buf = newBufDagReader(pb.GetData()) + dr.buf = NewBufDagReader(pb.GetData()) return nil case ftpb.Data_Metadata: return errors.New("shouldnt have had metadata object inside file") @@ -256,7 +256,7 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { if dr.buf != nil { dr.buf.Close() } - dr.buf = newBufDagReader(pb.GetData()[offset:]) + dr.buf = NewBufDagReader(pb.GetData()[offset:]) // start reading links from the beginning dr.linkPosition = 0 From 5ba88077e4a64897878c67888dedd1631df894c7 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 19:17:59 +0100 Subject: [PATCH 1890/3147] Golint: improve io.Find documentation per @stebalien's comment License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@e917cad093860af7f0a7000d56ef0e87ee7b4707 --- unixfs/io/dirbuilder.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index f2dee053c9..616617deed 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -162,9 +162,8 @@ func (d *Directory) Links(ctx context.Context) ([]*ipld.Link, error) { return d.shard.EnumLinks(ctx) } -// Find returns the ipld.Node with the given name, if it is contained in this -// directory. Find only searches in the most inmediate links, and not -// recursively in the tree. +// Find returns the root node of the file named 'name' within this directory. +// In the case of HAMT-directories, it will traverse the tree. func (d *Directory) Find(ctx context.Context, name string) (ipld.Node, error) { if d.shard == nil { lnk, err := d.dirnode.GetNodeLink(name) From a66b9f7f75961e2d6f26e3a45bd9b12856d92c75 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 6 Feb 2018 19:19:30 +0100 Subject: [PATCH 1891/3147] unixfs/mod: use errors.New() for all defined errors License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@e78def80a5acf767cf643aca493b27f8d6a56925 --- unixfs/mod/dagmodifier.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 05c5c3587a..dfadd778bc 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -6,7 +6,6 @@ import ( "bytes" "context" "errors" - "fmt" "io" chunk "github.com/ipfs/go-ipfs/importer/chunk" @@ -25,7 +24,7 @@ import ( var ( ErrSeekFail = errors.New("failed to seek properly") ErrUnrecognizedWhence = errors.New("unrecognized whence") - ErrNotUnixfs = fmt.Errorf("dagmodifier only supports unixfs nodes (proto or raw)") + ErrNotUnixfs = errors.New("dagmodifier only supports unixfs nodes (proto or raw)") ) // 2MB From 04864fe044c6dcca0d424b2233700bc43dc65bd0 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 7 Feb 2018 10:06:59 +0100 Subject: [PATCH 1892/3147] Golint: improve unixfs/dagreader.go comments Per @whys suggestions License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@8a5eb96c89986b3a2fb0253d80c580aca74e8789 --- unixfs/io/dagreader.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index ec3b3e0285..53e9902974 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -20,8 +20,8 @@ var ( ErrCantReadSymlinks = errors.New("cannot currently read symlinks") ) -// A DagReader represents a ReadSeekCloser which offers additional methods -// like Size. Different implementations of readers are used for the different +// // A DagReader provides read-only read and seek acess to a unixfs file. +// Different implementations of readers are used for the different // types of unixfs/protobuf-encoded nodes. type DagReader interface { ReadSeekCloser @@ -30,7 +30,7 @@ type DagReader interface { Offset() int64 } -// A ReadSeekCloser implements interfaces to read, write, seek and close. +// A ReadSeekCloser implements interfaces to read, copy, seek and close. type ReadSeekCloser interface { io.Reader io.Seeker From 840aeefeaba76e225948c5c70e97a544b1fba1ea Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 7 Feb 2018 12:33:58 +0100 Subject: [PATCH 1893/3147] Golint: remove extra // in comment License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@e8516ef5b8f65515923fe9550d2fa40e1f888ef1 --- unixfs/io/dagreader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 53e9902974..af3fbb3308 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -20,7 +20,7 @@ var ( ErrCantReadSymlinks = errors.New("cannot currently read symlinks") ) -// // A DagReader provides read-only read and seek acess to a unixfs file. +// A DagReader provides read-only read and seek acess to a unixfs file. // Different implementations of readers are used for the different // types of unixfs/protobuf-encoded nodes. type DagReader interface { From 2153cfc3cc1deca606d8b9cdb5cbc7ed7cd442d5 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 7 Feb 2018 12:44:20 +0100 Subject: [PATCH 1894/3147] Initial commit This commit was moved from ipfs/go-ipfs-posinfo@020018caceee2a6eba8745ada0de332e0346a962 --- filestore/posinfo/.gitignore | 14 ++++++++++++++ filestore/posinfo/LICENSE | 21 ++++++++++++++++++++ filestore/posinfo/Makefile | 18 ++++++++++++++++++ filestore/posinfo/README.md | 37 ++++++++++++++++++++++++++++++++++++ filestore/posinfo/posinfo.go | 23 ++++++++++++++++++++++ 5 files changed, 113 insertions(+) create mode 100644 filestore/posinfo/.gitignore create mode 100644 filestore/posinfo/LICENSE create mode 100644 filestore/posinfo/Makefile create mode 100644 filestore/posinfo/README.md create mode 100644 filestore/posinfo/posinfo.go diff --git a/filestore/posinfo/.gitignore b/filestore/posinfo/.gitignore new file mode 100644 index 0000000000..a1338d6851 --- /dev/null +++ b/filestore/posinfo/.gitignore @@ -0,0 +1,14 @@ +# Binaries for programs and plugins +*.exe +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 +.glide/ diff --git a/filestore/posinfo/LICENSE b/filestore/posinfo/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/filestore/posinfo/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/filestore/posinfo/Makefile b/filestore/posinfo/Makefile new file mode 100644 index 0000000000..24d71558e7 --- /dev/null +++ b/filestore/posinfo/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + go test -v -covermode count -coverprofile=coverage.out . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/filestore/posinfo/README.md b/filestore/posinfo/README.md new file mode 100644 index 0000000000..bd509c17e0 --- /dev/null +++ b/filestore/posinfo/README.md @@ -0,0 +1,37 @@ +# go-ipfs-posinfo + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-posinfo?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-posinfo) +[![Build Status](https://travis-ci.org/ipfs/go-ipfs-posinfo.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-posinfo) + +> Posinfo wraps offset information for ipfs filestore nodes + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +``` +go get github.com/ipfs/go-ipfs-posinfo +``` + +## Usage + +See the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-posinfo) + + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. diff --git a/filestore/posinfo/posinfo.go b/filestore/posinfo/posinfo.go new file mode 100644 index 0000000000..0b32c89da1 --- /dev/null +++ b/filestore/posinfo/posinfo.go @@ -0,0 +1,23 @@ +// Package posinfo wraps offset information used by ipfs filestore nodes +package posinfo + +import ( + "os" + + ipld "github.com/ipfs/go-ipld-format" +) + +// PosInfo stores information about the file offset, its path and +// stat. +type PosInfo struct { + Offset uint64 + FullPath string + Stat os.FileInfo // can be nil +} + +// FilestoreNode is an ipld.Node which arries PosInfo with it +// allowing to map it directly to a filesystem object. +type FilestoreNode struct { + ipld.Node + PosInfo *PosInfo +} From 1a31952b03e7d3754927c48bc7d1053f4d4a8946 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 7 Feb 2018 13:37:27 +0100 Subject: [PATCH 1895/3147] Extract posinfo package to github.com/ipfs/go-ipfs-posinfo License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@1ac2b1405dc5b905a6b3ebd598dcca36f0c52f8d --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 534d3f26dd..e7215dfccf 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,7 +11,7 @@ import ( "context" "github.com/ipfs/go-ipfs/blocks/blockstore" - posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 8021114244..883df0d769 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" dag "github.com/ipfs/go-ipfs/merkledag" - posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 603a513805..8e048fd69c 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,7 +10,7 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - posinfo "github.com/ipfs/go-ipfs/thirdparty/posinfo" + posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" From e86426aeebcc3d96b0128afa0201fa162a79e135 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 30 Jan 2018 22:32:12 -0500 Subject: [PATCH 1896/3147] namesys: verify signature in ipns validator License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@c7c1d92751b62f347bf3b697ece4b500a0d7f817 --- namesys/ipns_validate_test.go | 199 ++++++++++++++++++++++++---------- namesys/publisher.go | 124 +-------------------- namesys/routing.go | 78 +++++-------- namesys/selector.go | 65 +++++++++++ namesys/validator.go | 86 +++++++++++++++ 5 files changed, 320 insertions(+), 232 deletions(-) create mode 100644 namesys/selector.go create mode 100644 namesys/validator.go diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 430381cbef..cb7d80954d 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -1,134 +1,215 @@ package namesys import ( - "io" + "context" "testing" "time" path "github.com/ipfs/go-ipfs/path" + mockrouting "github.com/ipfs/go-ipfs/routing/mock" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + recordpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" + testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) func TestValidation(t *testing.T) { - // Create a record validator - validator := make(record.Validator) - validator["ipns"] = &record.ValidChecker{Func: ValidateIpnsRecord, Sign: true} + ctx := context.Background() + rid := testutil.RandIdentityOrFatal(t) + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + peerstore := pstore.NewPeerstore() - // Generate a key for signing the records - r := u.NewSeededRand(15) // generate deterministic keypair - priv, ipnsPath := genKeys(t, r) + vstore := newMockValueStore(rid, dstore, peerstore) + vstore.Validator["ipns"] = NewIpnsRecordValidator(peerstore) + vstore.Validator["pk"] = &record.ValidChecker{ + Func: func(r *record.ValidationRecord) error { + return nil + }, + Sign: false, + } + resolver := NewRoutingResolver(vstore, 0) // Create entry with expiry in one hour + priv, id, _, ipnsDHTPath := genKeys(t) ts := time.Now() - entry, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(time.Hour)) + p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + entry, err := CreateRoutingEntryData(priv, p, 1, ts.Add(time.Hour)) if err != nil { t.Fatal(err) } - val, err := proto.Marshal(entry) + // Make peer's public key available in peer store + err = peerstore.AddPubKey(id, priv.GetPublic()) if err != nil { t.Fatal(err) } - // Create the record - rec, err := record.MakePutRecord(priv, ipnsPath, val, true) + // Publish entry + err = PublishEntry(ctx, vstore, ipnsDHTPath, entry) if err != nil { t.Fatal(err) } - // Validate the record - err = validator.VerifyRecord(rec) + // Resolve entry + resp, err := resolver.resolveOnce(ctx, id.Pretty()) if err != nil { t.Fatal(err) } + if resp != p { + t.Fatal("Mismatch between published path %s and resolved path %s", p, resp) + } - /* TODO(#4613) - // Create IPNS record path with a different private key - _, ipnsWrongAuthor := genKeys(t, r) - wrongAuthorRec, err := record.MakePutRecord(priv, ipnsWrongAuthor, val, true) + // Create expired entry + expiredEntry, err := CreateRoutingEntryData(priv, p, 1, ts.Add(-1*time.Hour)) if err != nil { t.Fatal(err) } - // Record should fail validation because path doesn't match author - err = validator.VerifyRecord(wrongAuthorRec) - if err != ErrInvalidAuthor { - t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + // Publish entry + err = PublishEntry(ctx, vstore, ipnsDHTPath, expiredEntry) + if err != nil { + t.Fatal(err) } - // Create IPNS record path with extra path components after author - extraPath := ipnsPath + "/some/path" - extraPathRec, err := record.MakePutRecord(priv, extraPath, val, true) + // Record should fail validation because entry is expired + _, err = resolver.resolveOnce(ctx, id.Pretty()) + if err != ErrExpiredRecord { + t.Fatal("ValidateIpnsRecord should have returned ErrExpiredRecord") + } + + // Create IPNS record path with a different private key + priv2, id2, _, ipnsDHTPath2 := genKeys(t) + + // Make peer's public key available in peer store + err = peerstore.AddPubKey(id2, priv2.GetPublic()) + if err != nil { + t.Fatal(err) + } + + // Publish entry + err = PublishEntry(ctx, vstore, ipnsDHTPath2, entry) if err != nil { t.Fatal(err) } - // Record should fail validation because path has extra components after author - err = validator.VerifyRecord(extraPathRec) - if err != ErrInvalidAuthor { - t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + // Record should fail validation because public key defined by + // ipns path doesn't match record signature + _, err = resolver.resolveOnce(ctx, id2.Pretty()) + if err != ErrSignature { + t.Fatal("ValidateIpnsRecord should have failed signature verification") } - // Create unsigned IPNS record - unsignedRec, err := record.MakePutRecord(priv, ipnsPath, val, false) + // Publish entry without making public key available in peer store + priv3, id3, pubkDHTPath3, ipnsDHTPath3 := genKeys(t) + entry3, err := CreateRoutingEntryData(priv3, p, 1, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + err = PublishEntry(ctx, vstore, ipnsDHTPath3, entry3) if err != nil { t.Fatal(err) } - // Record should fail validation because IPNS records require signature - err = validator.VerifyRecord(unsignedRec) - if err != ErrInvalidAuthor { - t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + // Record should fail validation because public key is not available + // in peer store or on network + _, err = resolver.resolveOnce(ctx, id3.Pretty()) + if err == nil { + t.Fatal("ValidateIpnsRecord should have failed because public key was not found") } - // Create unsigned IPNS record with no author - unsignedRecNoAuthor, err := record.MakePutRecord(priv, ipnsPath, val, false) + // Publish public key to the network + err = PublishPublicKey(ctx, vstore, pubkDHTPath3, priv3.GetPublic()) if err != nil { t.Fatal(err) } - noAuth := "" - unsignedRecNoAuthor.Author = &noAuth - // Record should fail validation because IPNS records require author - err = validator.VerifyRecord(unsignedRecNoAuthor) - if err != ErrInvalidAuthor { - t.Fatal("ValidateIpnsRecord should have returned ErrInvalidAuthor") + // Record should now pass validation because resolver will ensure + // public key is available in the peer store by looking it up in + // the DHT, which causes the DHT to fetch it and cache it in the + // peer store + _, err = resolver.resolveOnce(ctx, id3.Pretty()) + if err != nil { + t.Fatal(err) } - */ +} - // Create expired entry - expiredEntry, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(-1*time.Hour)) +func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string, string) { + sr := u.NewTimeSeededRand() + priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, sr) if err != nil { t.Fatal(err) } - valExp, err := proto.Marshal(expiredEntry) + + // Create entry with expiry in one hour + pid, err := peer.IDFromPrivateKey(priv) if err != nil { t.Fatal(err) } + pubkDHTPath, ipnsDHTPath := IpnsKeysForID(pid) - // Create record with the expired entry - expiredRec, err := record.MakePutRecord(priv, ipnsPath, valExp, true) + return priv, pid, pubkDHTPath, ipnsDHTPath +} - // Record should fail validation because entry is expired - err = validator.VerifyRecord(expiredRec) - if err != ErrExpiredRecord { - t.Fatal("ValidateIpnsRecord should have returned ErrExpiredRecord") +type mockValueStore struct { + r routing.ValueStore + kbook pstore.KeyBook + Validator record.Validator +} + +func newMockValueStore(id testutil.Identity, dstore ds.Datastore, kbook pstore.KeyBook) *mockValueStore { + serv := mockrouting.NewServer() + r := serv.ClientWithDatastore(context.Background(), id, dstore) + return &mockValueStore{r, kbook, make(record.Validator)} +} + +func (m *mockValueStore) GetValue(ctx context.Context, k string) ([]byte, error) { + data, err := m.r.GetValue(ctx, k) + if err != nil { + return data, err + } + + rec := new(recordpb.Record) + rec.Key = proto.String(k) + rec.Value = data + if err = m.Validator.VerifyRecord(rec); err != nil { + return nil, err } + + return data, err } -func genKeys(t *testing.T, r io.Reader) (ci.PrivKey, string) { - priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) +func (m *mockValueStore) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { + pk := m.kbook.PubKey(p) + if pk != nil { + return pk, nil + } + + pkkey := routing.KeyForPublicKey(p) + val, err := m.GetValue(ctx, pkkey) if err != nil { - t.Fatal(err) + return nil, err } - id, err := peer.IDFromPrivateKey(priv) + + pk, err = ci.UnmarshalPublicKey(val) if err != nil { - t.Fatal(err) + return nil, err } - _, ipnsKey := IpnsKeysForID(id) - return priv, ipnsKey + + return pk, m.kbook.AddPubKey(p, pk) +} + +func (m *mockValueStore) GetValues(ctx context.Context, k string, count int) ([]routing.RecvdVal, error) { + return m.r.GetValues(ctx, k, count) +} + +func (m *mockValueStore) PutValue(ctx context.Context, k string, d []byte) error { + return m.r.PutValue(ctx, k, d) } diff --git a/namesys/publisher.go b/namesys/publisher.go index c7159036af..79e3168e83 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -3,7 +3,6 @@ package namesys import ( "bytes" "context" - "errors" "fmt" "time" @@ -16,25 +15,12 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) -// ErrExpiredRecord should be returned when an ipns record is -// invalid due to being too old -var ErrExpiredRecord = errors.New("expired record") - -// ErrUnrecognizedValidity is returned when an IpnsRecord has an -// unknown validity type. -var ErrUnrecognizedValidity = errors.New("unrecognized validity type") - -// ErrInvalidPath should be returned when an ipns record path -// is not in a valid format -var ErrInvalidPath = errors.New("record path invalid") - const PublishPutValTimeout = time.Minute const DefaultRecordTTL = 24 * time.Hour @@ -208,7 +194,7 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec } log.Debugf("Storing ipns entry at: %s", ipnskey) - // Store ipns entry at "/ipns/"+b58(h(pubkey)) + // Store ipns entry at "/ipns/"+h(pubkey) return r.PutValue(timectx, ipnskey, data) } @@ -238,114 +224,6 @@ func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { []byte{}) } -var IpnsRecordValidator = &record.ValidChecker{ - Func: ValidateIpnsRecord, - Sign: true, -} - -func IpnsSelectorFunc(k string, vals [][]byte) (int, error) { - var recs []*pb.IpnsEntry - for _, v := range vals { - e := new(pb.IpnsEntry) - err := proto.Unmarshal(v, e) - if err == nil { - recs = append(recs, e) - } else { - recs = append(recs, nil) - } - } - - return selectRecord(recs, vals) -} - -func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { - var best_seq uint64 - best_i := -1 - - for i, r := range recs { - if r == nil || r.GetSequence() < best_seq { - continue - } - - if best_i == -1 || r.GetSequence() > best_seq { - best_seq = r.GetSequence() - best_i = i - } else if r.GetSequence() == best_seq { - rt, err := u.ParseRFC3339(string(r.GetValidity())) - if err != nil { - continue - } - - bestt, err := u.ParseRFC3339(string(recs[best_i].GetValidity())) - if err != nil { - continue - } - - if rt.After(bestt) { - best_i = i - } else if rt == bestt { - if bytes.Compare(vals[i], vals[best_i]) > 0 { - best_i = i - } - } - } - } - if best_i == -1 { - return 0, errors.New("no usable records in given set") - } - - return best_i, nil -} - -// ValidateIpnsRecord implements ValidatorFunc and verifies that the -// given 'val' is an IpnsEntry and that that entry is valid. -func ValidateIpnsRecord(r *record.ValidationRecord) error { - if r.Namespace != "ipns" { - return ErrInvalidPath - } - - entry := new(pb.IpnsEntry) - err := proto.Unmarshal(r.Value, entry) - if err != nil { - return err - } - - // NOTE/FIXME(#4613): We're not checking the DHT signature/author here. - // We're going to remove them in a followup commit and then check the - // *IPNS* signature. However, to do that, we need to ensure we *have* - // the public key and: - // - // 1. Don't want to fetch it from the network when handling PUTs. - // 2. Do want to fetch it from the network when handling GETs. - // - // Therefore, we'll need to either: - // - // 1. Pass some for of offline hint to the validator (e.g., using a context). - // 2. Ensure we pre-fetch the key when performing gets. - // - // This PR is already *way* too large so we're punting that fix to a new - // PR. - // - // This is not a regression, it just restores the current (bad) - // behavior. - - // Check that record has not expired - switch entry.GetValidityType() { - case pb.IpnsEntry_EOL: - t, err := u.ParseRFC3339(string(entry.GetValidity())) - if err != nil { - log.Debug("failed parsing time for ipns record EOL") - return err - } - if time.Now().After(t) { - return ErrExpiredRecord - } - default: - return ErrUnrecognizedValidity - } - return nil -} - // InitializeKeyspace sets the ipns record for the given key to // point to an empty directory. // TODO: this doesnt feel like it belongs here diff --git a/namesys/routing.go b/namesys/routing.go index 4ec68e7b62..0c17ca4ffc 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -2,7 +2,6 @@ package namesys import ( "context" - "fmt" "strings" "time" @@ -15,7 +14,7 @@ import ( lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) @@ -131,58 +130,37 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa return "", err } - // use the routing system to get the name. - // /ipns/ - h := []byte("/ipns/" + string(hash)) - - var entry *pb.IpnsEntry - var pubkey ci.PubKey - - resp := make(chan error, 2) - go func() { - ipnsKey := string(h) - val, err := r.routing.GetValue(ctx, ipnsKey) - if err != nil { - log.Debugf("RoutingResolver: dht get failed: %s", err) - resp <- err - return - } - - entry = new(pb.IpnsEntry) - err = proto.Unmarshal(val, entry) - if err != nil { - resp <- err - return - } - - resp <- nil - }() - - go func() { - // name should be a public key retrievable from ipfs - pubk, err := routing.GetPublicKey(r.routing, ctx, hash) - if err != nil { - resp <- err - return - } - - pubkey = pubk - resp <- nil - }() + // Name should be the hash of a public key retrievable from ipfs. + // We retrieve the public key here to make certain that it's in the peer + // store before calling GetValue() on the DHT - the DHT will call the + // ipns validator, which in turn will get the public key from the peer + // store to verify the record signature + _, err = routing.GetPublicKey(r.routing, ctx, hash) + if err != nil { + log.Debugf("RoutingResolver: could not retrieve public key %s: %s\n", name, err) + return "", err + } - for i := 0; i < 2; i++ { - err = <-resp - if err != nil { - return "", err - } + pid, err := peer.IDFromBytes(hash) + if err != nil { + log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) + return "", err } - // check sig with pk - if ok, err := pubkey.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { - return "", fmt.Errorf("ipns entry for %s has invalid signature", h) + // use the routing system to get the name. + _, ipnsKey := IpnsKeysForID(pid) + val, err := r.routing.GetValue(ctx, ipnsKey) + if err != nil { + log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) + return "", err } - // ok sig checks out. this is a valid name. + entry := new(pb.IpnsEntry) + err = proto.Unmarshal(val, entry) + if err != nil { + log.Debugf("RoutingResolver: could not unmarshal value for name %s: %s", name, err) + return "", err + } // check for old style record: valh, err := mh.Cast(entry.GetValue()) @@ -197,7 +175,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa return p, nil } else { // Its an old style multihash record - log.Debugf("encountered CIDv0 ipns entry: %s", h) + log.Debugf("encountered CIDv0 ipns entry: %s", valh) p := path.FromCid(cid.NewCidV0(valh)) r.cacheSet(name, p, entry) return p, nil diff --git a/namesys/selector.go b/namesys/selector.go new file mode 100644 index 0000000000..6114bfccef --- /dev/null +++ b/namesys/selector.go @@ -0,0 +1,65 @@ +package namesys + +import ( + "bytes" + "errors" + + pb "github.com/ipfs/go-ipfs/namesys/pb" + + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +) + +func IpnsSelectorFunc(k string, vals [][]byte) (int, error) { + var recs []*pb.IpnsEntry + for _, v := range vals { + e := new(pb.IpnsEntry) + err := proto.Unmarshal(v, e) + if err == nil { + recs = append(recs, e) + } else { + recs = append(recs, nil) + } + } + + return selectRecord(recs, vals) +} + +func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { + var best_seq uint64 + best_i := -1 + + for i, r := range recs { + if r == nil || r.GetSequence() < best_seq { + continue + } + + if best_i == -1 || r.GetSequence() > best_seq { + best_seq = r.GetSequence() + best_i = i + } else if r.GetSequence() == best_seq { + rt, err := u.ParseRFC3339(string(r.GetValidity())) + if err != nil { + continue + } + + bestt, err := u.ParseRFC3339(string(recs[best_i].GetValidity())) + if err != nil { + continue + } + + if rt.After(bestt) { + best_i = i + } else if rt == bestt { + if bytes.Compare(vals[i], vals[best_i]) > 0 { + best_i = i + } + } + } + } + if best_i == -1 { + return 0, errors.New("no usable records in given set") + } + + return best_i, nil +} diff --git a/namesys/validator.go b/namesys/validator.go new file mode 100644 index 0000000000..3eebce7f92 --- /dev/null +++ b/namesys/validator.go @@ -0,0 +1,86 @@ +package namesys + +import ( + "errors" + "time" + + pb "github.com/ipfs/go-ipfs/namesys/pb" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" +) + +// ErrExpiredRecord should be returned when an ipns record is +// invalid due to being too old +var ErrExpiredRecord = errors.New("expired record") + +// ErrUnrecognizedValidity is returned when an IpnsRecord has an +// unknown validity type. +var ErrUnrecognizedValidity = errors.New("unrecognized validity type") + +// ErrInvalidPath should be returned when an ipns record path +// is not in a valid format +var ErrInvalidPath = errors.New("record path invalid") + +// ErrSignature should be returned when an ipns record fails +// signature verification +var ErrSignature = errors.New("record signature verification failed") + +func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { + // ValidateIpnsRecord implements ValidatorFunc and verifies that the + // given 'val' is an IpnsEntry and that that entry is valid. + ValidateIpnsRecord := func(r *record.ValidationRecord) error { + if r.Namespace != "ipns" { + return ErrInvalidPath + } + + // Parse the value into an IpnsEntry + entry := new(pb.IpnsEntry) + err := proto.Unmarshal(r.Value, entry) + if err != nil { + return err + } + + // Get the public key defined by the ipns path + pid, err := peer.IDFromString(r.Key) + if err != nil { + log.Debugf("failed to parse ipns record key %s into public key hash", r.Key) + return ErrSignature + } + pubk := kbook.PubKey(pid) + if pubk == nil { + log.Debugf("public key with hash %s not found in peer store", pid) + return ErrSignature + } + + // Check the ipns record signature with the public key + if ok, err := pubk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { + log.Debugf("failed to verify signature for ipns record %s", r.Key) + return ErrSignature + } + + // Check that record has not expired + switch entry.GetValidityType() { + case pb.IpnsEntry_EOL: + t, err := u.ParseRFC3339(string(entry.GetValidity())) + if err != nil { + log.Debugf("failed parsing time for ipns record EOL in record %s", r.Key) + return err + } + if time.Now().After(t) { + return ErrExpiredRecord + } + default: + return ErrUnrecognizedValidity + } + return nil + } + + return &record.ValidChecker{ + Func: ValidateIpnsRecord, + Sign: false, + } +} From 3d828960f86d43234fc54e04f0ff560ca3831787 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 30 Jan 2018 22:44:46 -0500 Subject: [PATCH 1897/3147] Code cleanup License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@aafdee05539091a5b32ea9f8500204fde63d7106 --- namesys/ipns_validate_test.go | 2 +- namesys/selector.go | 28 +++++++++++++++------------- namesys/validator.go | 3 +++ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index cb7d80954d..b5df33a007 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -64,7 +64,7 @@ func TestValidation(t *testing.T) { t.Fatal(err) } if resp != p { - t.Fatal("Mismatch between published path %s and resolved path %s", p, resp) + t.Fatalf("Mismatch between published path %s and resolved path %s", p, resp) } // Create expired entry diff --git a/namesys/selector.go b/namesys/selector.go index 6114bfccef..c93ddce898 100644 --- a/namesys/selector.go +++ b/namesys/selector.go @@ -10,6 +10,8 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) +// Selects best record by checking which has the highest sequence number +// and latest EOL func IpnsSelectorFunc(k string, vals [][]byte) (int, error) { var recs []*pb.IpnsEntry for _, v := range vals { @@ -26,40 +28,40 @@ func IpnsSelectorFunc(k string, vals [][]byte) (int, error) { } func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { - var best_seq uint64 - best_i := -1 + var bestSeq uint64 + besti := -1 for i, r := range recs { - if r == nil || r.GetSequence() < best_seq { + if r == nil || r.GetSequence() < bestSeq { continue } - if best_i == -1 || r.GetSequence() > best_seq { - best_seq = r.GetSequence() - best_i = i - } else if r.GetSequence() == best_seq { + if besti == -1 || r.GetSequence() > bestSeq { + bestSeq = r.GetSequence() + besti = i + } else if r.GetSequence() == bestSeq { rt, err := u.ParseRFC3339(string(r.GetValidity())) if err != nil { continue } - bestt, err := u.ParseRFC3339(string(recs[best_i].GetValidity())) + bestt, err := u.ParseRFC3339(string(recs[besti].GetValidity())) if err != nil { continue } if rt.After(bestt) { - best_i = i + besti = i } else if rt == bestt { - if bytes.Compare(vals[i], vals[best_i]) > 0 { - best_i = i + if bytes.Compare(vals[i], vals[besti]) > 0 { + besti = i } } } } - if best_i == -1 { + if besti == -1 { return 0, errors.New("no usable records in given set") } - return best_i, nil + return besti, nil } diff --git a/namesys/validator.go b/namesys/validator.go index 3eebce7f92..57924535a3 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -29,6 +29,9 @@ var ErrInvalidPath = errors.New("record path invalid") // signature verification var ErrSignature = errors.New("record signature verification failed") +// Returns a ValidChecker for IPNS records +// The validator function will get a public key from the KeyBook +// to verify the record's signature func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { // ValidateIpnsRecord implements ValidatorFunc and verifies that the // given 'val' is an IpnsEntry and that that entry is valid. From 60e4d0fdd0e1d4d0c3da86fb0a9d374dc2addb9e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 30 Jan 2018 22:47:16 -0500 Subject: [PATCH 1898/3147] Comment fixes License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@12d98f64de9c7d27f0916df55c331006a2c8a99f --- namesys/selector.go | 4 ++-- namesys/validator.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/selector.go b/namesys/selector.go index c93ddce898..296d348300 100644 --- a/namesys/selector.go +++ b/namesys/selector.go @@ -10,8 +10,8 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) -// Selects best record by checking which has the highest sequence number -// and latest EOL +// IpnsSelectorFunc selects the best record by checking which has the highest +// sequence number and latest EOL func IpnsSelectorFunc(k string, vals [][]byte) (int, error) { var recs []*pb.IpnsEntry for _, v := range vals { diff --git a/namesys/validator.go b/namesys/validator.go index 57924535a3..1466eac870 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -29,7 +29,7 @@ var ErrInvalidPath = errors.New("record path invalid") // signature verification var ErrSignature = errors.New("record signature verification failed") -// Returns a ValidChecker for IPNS records +// NewIpnsRecordValidator returns a ValidChecker for IPNS records // The validator function will get a public key from the KeyBook // to verify the record's signature func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { From c27e283932a82771e6cae37abfedd9ad96e03547 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 31 Jan 2018 00:37:39 -0500 Subject: [PATCH 1899/3147] namesys: differentiate between validation errors License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@b75e29b472765df6f72839db48fe3aac23934464 --- namesys/ipns_validate_test.go | 58 ++++++++++++++++++++++++++++++++++- namesys/routing.go | 4 ++- namesys/selector.go | 2 ++ namesys/validator.go | 20 +++++++++--- 4 files changed, 78 insertions(+), 6 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index b5df33a007..262b0711d5 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -2,6 +2,7 @@ package namesys import ( "context" + "fmt" "testing" "time" @@ -21,7 +22,62 @@ import ( ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) -func TestValidation(t *testing.T) { +func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns string, key string, val []byte, eol time.Time, exp error) { + validChecker := NewIpnsRecordValidator(kbook) + + p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + entry, err := CreateRoutingEntryData(priv, p, 1, eol) + if err != nil { + t.Fatal(err) + } + + data := val + if data == nil { + data, err = proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + } + rec := &record.ValidationRecord{ + Namespace: ns, + Key: key, + Value: data, + } + + err = validChecker.Func(rec) + if err != exp { + params := fmt.Sprintf("namespace: %s\nkey: %s\neol: %s\n", ns, key, eol) + if exp == nil { + t.Fatalf("Unexpected error %s for params %s", err, params) + } else if err == nil { + t.Fatalf("Expected error %s but there was no error for params %s", exp, params) + } else { + t.Fatalf("Expected error %s but got %s for params %s", exp, err, params) + } + } +} + +func TestValidator(t *testing.T) { + ts := time.Now() + + priv, id, _, _ := genKeys(t) + priv2, id2, _, _ := genKeys(t) + kbook := pstore.NewPeerstore() + kbook.AddPubKey(id, priv.GetPublic()) + emptyKbook := pstore.NewPeerstore() + + testValidatorCase(t, priv, kbook, "ipns", string(id), nil, ts.Add(time.Hour), nil) + testValidatorCase(t, priv, kbook, "ipns", string(id), nil, ts.Add(time.Hour*-1), ErrExpiredRecord) + testValidatorCase(t, priv, kbook, "ipns", string(id), []byte("bad data"), ts.Add(time.Hour), ErrBadRecord) + testValidatorCase(t, priv, kbook, "ipns", "bad key", nil, ts.Add(time.Hour), ErrKeyFormat) + testValidatorCase(t, priv, emptyKbook, "ipns", string(id), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) + testValidatorCase(t, priv2, kbook, "ipns", string(id2), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) + testValidatorCase(t, priv2, kbook, "ipns", string(id), nil, ts.Add(time.Hour), ErrSignature) + testValidatorCase(t, priv, kbook, "", string(id), nil, ts.Add(time.Hour), ErrInvalidPath) + testValidatorCase(t, priv, kbook, "wrong", string(id), nil, ts.Add(time.Hour), ErrInvalidPath) +} + +func TestResolverValidation(t *testing.T) { ctx := context.Background() rid := testutil.RandIdentityOrFatal(t) dstore := dssync.MutexWrap(ds.NewMapDatastore()) diff --git a/namesys/routing.go b/namesys/routing.go index 0c17ca4ffc..120fabd662 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -147,7 +147,9 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa return "", err } - // use the routing system to get the name. + // Use the routing system to get the name. + // Note that the DHT will call the ipns validator when retrieving + // the value, which in turn verifies the ipns record signature _, ipnsKey := IpnsKeysForID(pid) val, err := r.routing.GetValue(ctx, ipnsKey) if err != nil { diff --git a/namesys/selector.go b/namesys/selector.go index 296d348300..53c712d1ce 100644 --- a/namesys/selector.go +++ b/namesys/selector.go @@ -42,11 +42,13 @@ func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { } else if r.GetSequence() == bestSeq { rt, err := u.ParseRFC3339(string(r.GetValidity())) if err != nil { + log.Errorf("failed to parse ipns record EOL %s", r.GetValidity()) continue } bestt, err := u.ParseRFC3339(string(recs[besti].GetValidity())) if err != nil { + log.Errorf("failed to parse ipns record EOL %s", recs[besti].GetValidity()) continue } diff --git a/namesys/validator.go b/namesys/validator.go index 1466eac870..e9cefc562a 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -29,6 +29,18 @@ var ErrInvalidPath = errors.New("record path invalid") // signature verification var ErrSignature = errors.New("record signature verification failed") +// ErrBadRecord should be returned when an ipns record cannot be unmarshalled +var ErrBadRecord = errors.New("record could not be unmarshalled") + +// ErrKeyFormat should be returned when an ipns record key is +// incorrectly formatted (not a peer ID) +var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") + +// ErrPublicKeyNotFound should be returned when the public key +// corresponding to the ipns record path cannot be retrieved +// from the peer store +var ErrPublicKeyNotFound = errors.New("public key not found in peer store") + // NewIpnsRecordValidator returns a ValidChecker for IPNS records // The validator function will get a public key from the KeyBook // to verify the record's signature @@ -44,19 +56,19 @@ func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { entry := new(pb.IpnsEntry) err := proto.Unmarshal(r.Value, entry) if err != nil { - return err + return ErrBadRecord } // Get the public key defined by the ipns path pid, err := peer.IDFromString(r.Key) if err != nil { - log.Debugf("failed to parse ipns record key %s into public key hash", r.Key) - return ErrSignature + log.Debugf("failed to parse ipns record key %s into peer ID", r.Key) + return ErrKeyFormat } pubk := kbook.PubKey(pid) if pubk == nil { log.Debugf("public key with hash %s not found in peer store", pid) - return ErrSignature + return ErrPublicKeyNotFound } // Check the ipns record signature with the public key From fe5fdb7e50e3f7b6e3fb486baae413727f182ecf Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 31 Jan 2018 10:08:22 -0500 Subject: [PATCH 1900/3147] namesys: more comments License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@e03522f670b021444da94567a9acac0329987336 --- namesys/validator.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/namesys/validator.go b/namesys/validator.go index e9cefc562a..d7d1dc42d2 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -41,12 +41,15 @@ var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") // from the peer store var ErrPublicKeyNotFound = errors.New("public key not found in peer store") -// NewIpnsRecordValidator returns a ValidChecker for IPNS records +// NewIpnsRecordValidator returns a ValidChecker for IPNS records. // The validator function will get a public key from the KeyBook -// to verify the record's signature +// to verify the record's signature. Note that the public key must +// already have been fetched from the network and put into the KeyBook +// by the caller. func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { // ValidateIpnsRecord implements ValidatorFunc and verifies that the - // given 'val' is an IpnsEntry and that that entry is valid. + // given record's value is an IpnsEntry, that the entry has been correctly + // signed, and that the entry has not expired ValidateIpnsRecord := func(r *record.ValidationRecord) error { if r.Namespace != "ipns" { return ErrInvalidPath From 4c5e5216e2b31c02a63d801183d86d49093b3b21 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 7 Feb 2018 15:48:08 -0500 Subject: [PATCH 1901/3147] namesys: discard records with invalid EOL in record selection License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@1dc5c4406810028bc9d39d877a91e9e259eadda2 --- namesys/selector.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/namesys/selector.go b/namesys/selector.go index 53c712d1ce..aebfb1533a 100644 --- a/namesys/selector.go +++ b/namesys/selector.go @@ -35,23 +35,17 @@ func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { if r == nil || r.GetSequence() < bestSeq { continue } + rt, err := u.ParseRFC3339(string(r.GetValidity())) + if err != nil { + log.Errorf("failed to parse ipns record EOL %s", r.GetValidity()) + continue + } if besti == -1 || r.GetSequence() > bestSeq { bestSeq = r.GetSequence() besti = i } else if r.GetSequence() == bestSeq { - rt, err := u.ParseRFC3339(string(r.GetValidity())) - if err != nil { - log.Errorf("failed to parse ipns record EOL %s", r.GetValidity()) - continue - } - - bestt, err := u.ParseRFC3339(string(recs[besti].GetValidity())) - if err != nil { - log.Errorf("failed to parse ipns record EOL %s", recs[besti].GetValidity()) - continue - } - + bestt, _ := u.ParseRFC3339(string(recs[besti].GetValidity())) if rt.After(bestt) { besti = i } else if rt == bestt { From b43c29f8bcefaa51dd01482dbe79505ee8e6b308 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 7 Feb 2018 16:24:25 -0500 Subject: [PATCH 1902/3147] go fmt License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@5a1ee4e9f1019197e338b63e8535a5fd32fdfc3d --- namesys/routing.go | 2 +- namesys/validator.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index 120fabd662..effb3fa015 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -13,8 +13,8 @@ import ( routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) diff --git a/namesys/validator.go b/namesys/validator.go index d7d1dc42d2..c50da55126 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -5,12 +5,12 @@ import ( "time" pb "github.com/ipfs/go-ipfs/namesys/pb" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) // ErrExpiredRecord should be returned when an ipns record is From 3795334fa692f6b19af07867e4a3f918ef4546b9 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 8 Feb 2018 11:58:30 +0100 Subject: [PATCH 1903/3147] Export from go-ipfs/importer/chunker This commit was moved from ipfs/go-ipfs-chunker@d0125832512163708c0804a3cda060e21acddae4 --- chunker/rabin.go | 2 +- chunker/rabin_test.go | 4 ++-- chunker/splitting.go | 4 ++-- chunker/splitting_test.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/chunker/rabin.go b/chunker/rabin.go index c3d1ebdba0..4247057b2f 100644 --- a/chunker/rabin.go +++ b/chunker/rabin.go @@ -4,7 +4,7 @@ import ( "hash/fnv" "io" - "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/whyrusleeping/chunker" + "github.com/whyrusleeping/chunker" ) // IpfsRabinPoly is the irreducible polynomial of degree 53 used by for Rabin. diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 2f68f01c44..f267db41ab 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -6,8 +6,8 @@ import ( "io" "testing" - util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blocks "github.com/ipfs/go-block-format" + util "github.com/ipfs/go-ipfs-util" ) func TestRabinChunking(t *testing.T) { diff --git a/chunker/splitting.go b/chunker/splitting.go index 5be27625b9..6a10de07a9 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -7,8 +7,8 @@ package chunk import ( "io" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - mpool "gx/ipfs/QmWBug6eBS7AxRdCDVuSY5CnSit7cS2XnPFYJWqWDumhCG/go-msgio/mpool" + logging "github.com/ipfs/go-log" + mpool "github.com/libp2p/go-msgio/mpool" ) var log = logging.Logger("chunk") diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index c5ef621e04..3153427edf 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + u "github.com/ipfs/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { From 1ed47b8a06e5946959f4f61678f3945b810e8d40 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 8 Feb 2018 12:19:01 +0100 Subject: [PATCH 1904/3147] Add .travis.yml, Makefile, README This commit was moved from ipfs/go-ipfs-chunker@1e96e4c7d6cdb32d82ae5bc893abc207f1aa48c2 --- chunker/Makefile | 18 ++++++++++++++++++ chunker/README.md | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 chunker/Makefile create mode 100644 chunker/README.md diff --git a/chunker/Makefile b/chunker/Makefile new file mode 100644 index 0000000000..73f2841f61 --- /dev/null +++ b/chunker/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race -coverprofile=coverage.txt -covermode=atomic . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/chunker/README.md b/chunker/README.md new file mode 100644 index 0000000000..96faa3de31 --- /dev/null +++ b/chunker/README.md @@ -0,0 +1,48 @@ +# go-ipfs-chunker + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-chunker?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-chunker) +[![Build Status](https://travis-ci.org/ipfs/go-ipfs-chunker.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-chunker) + +> go-ipfs-chunker implements data Splitters for go-ipfs. + +`go-ipfs-chunker` provides the `Splitter` interface. IPFS splitters read data from a reader an create "chunks". These chunks are used to build the ipfs DAGs (Merkle Tree) and are the base unit to obtain the sums that ipfs uses to address content. + +The package provides a `SizeSplitter` which creates chunks of equal size and it is used by default in most cases, and a `rabin` fingerprint chunker. This chunker will attempt to split data in a way that the resulting blocks are the same when the data has repetitive patterns, thus optimizing the resulting DAGs. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-ipfs-chunker` works like a regular Go module: + +``` +> go get github.com/ipfs/go-ipfs-chunker +``` + +It uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. + +## Usage + +``` +import "github.com/ipfs/go-ipfs-chunker" +``` + +Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-chunker) + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. From 34fa9d7e73e93142c06920d25e284dc96b4870d1 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 5 Feb 2018 20:28:27 +0100 Subject: [PATCH 1905/3147] WIP: Extract: importers/chunk module as go-ipfs-chunker License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@48941d57620b0d942bce93b0558d24ec5d45a628 --- unixfs/mod/dagmodifier.go | 2 +- unixfs/test/utils.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index dfadd778bc..dbeee72665 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -8,12 +8,12 @@ import ( "errors" "io" - chunk "github.com/ipfs/go-ipfs/importer/chunk" help "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 0ca47c842c..380c74f440 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -8,12 +8,12 @@ import ( "io/ioutil" "testing" - "github.com/ipfs/go-ipfs/importer/chunk" h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" mdag "github.com/ipfs/go-ipfs/merkledag" mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" From ba3e0768520f235fad8491eb8641353a546cf524 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 5 Feb 2018 20:28:27 +0100 Subject: [PATCH 1906/3147] WIP: Extract: importers/chunk module as go-ipfs-chunker License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@4c210683b4a33c78c0febb6dbc01f26d9dee2f25 --- mfs/file.go | 2 +- mfs/mfs_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index 496b05d8e6..fc7a9ef320 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,10 +5,10 @@ import ( "fmt" "sync" - chunk "github.com/ipfs/go-ipfs/importer/chunk" dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" + chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 5db5d4987b..187481077a 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -18,11 +18,11 @@ import ( bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" importer "github.com/ipfs/go-ipfs/importer" - chunk "github.com/ipfs/go-ipfs/importer/chunk" dag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" From b467002fc0c2e1d0109ad01a7bb3883904a90528 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 5 Feb 2018 21:27:05 +0100 Subject: [PATCH 1907/3147] Fix missing rename in tests License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@34dcbba26297ebadf2728c30770c0b67cf56a377 --- unixfs/test/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 380c74f440..c0e7cd37c5 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -13,9 +13,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" From da5a0b9140fbb5a2b354f74e050304a3c5d3677a Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 7 Feb 2018 10:39:41 +0100 Subject: [PATCH 1908/3147] go-ipfs-chunker: Use the stable gx'ed release License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@bac2343b2a074eb4c4de3ff4fc130d0902525776 --- mfs/file.go | 2 +- mfs/mfs_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index fc7a9ef320..e73968c3d5 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -8,7 +8,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" + chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 187481077a..3842c65bfd 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -22,7 +22,7 @@ import ( "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" + chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" From 9f28a7b32b9786dfdf2884950e8e20822f37a393 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 7 Feb 2018 10:39:41 +0100 Subject: [PATCH 1909/3147] go-ipfs-chunker: Use the stable gx'ed release License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@4b7dace2f6e291da4e90ace622261db6348a1ede --- unixfs/mod/dagmodifier.go | 2 +- unixfs/test/utils.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index dbeee72665..4c37070642 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -13,7 +13,7 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" + chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index c0e7cd37c5..6b7c5312b4 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -15,8 +15,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - chunk "gx/ipfs/QmQXcAyrC4VBu9ZBqxoCthPot9PNhb4Uiw6iBDfQXudZJd/go-ipfs-chunker" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From bb970d335da5426808f3dc015aaf994d196272b2 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 8 Feb 2018 12:43:29 +0100 Subject: [PATCH 1910/3147] Extract chunker: Use last gx'ed go-ipfs-chunker License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@d282cb66dbf78bc001480dd8664bd40dcdce144a --- mfs/file.go | 2 +- mfs/mfs_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index e73968c3d5..50035da99f 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -8,8 +8,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" + chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 3842c65bfd..5092d45abb 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -22,11 +22,11 @@ import ( "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From bf1593f1ca5356e716e8f25e1cf70d55ea6931f5 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 8 Feb 2018 12:43:29 +0100 Subject: [PATCH 1911/3147] Extract chunker: Use last gx'ed go-ipfs-chunker License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@ac048e95ddacb849f8931f69a05faa154c305dca --- unixfs/mod/dagmodifier.go | 2 +- unixfs/test/utils.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 4c37070642..683ce056ad 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -13,8 +13,8 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" + chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 6b7c5312b4..a127c1a654 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -15,8 +15,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - chunk "gx/ipfs/QmcYFMP9mfpJ2swedZCBskeAoxGKGBGY7LaS6VZ1jEWqUs/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From a0df8e1fa7cfd835379d72324ae46f324ddcd82d Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 8 Feb 2018 12:49:39 +0100 Subject: [PATCH 1912/3147] Extract: chunker: rename "chunk" to "chunker" as it is more consistent License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@c89547ed597123ff16ebf3cbed3d842207a89fcd --- mfs/file.go | 4 ++-- mfs/mfs_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index 50035da99f..11d4a2a75e 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -9,7 +9,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" + chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) @@ -82,7 +82,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { return nil, fmt.Errorf("mode not supported") } - dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dserv, chunk.DefaultSplitter) + dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dserv, chunker.DefaultSplitter) if err != nil { return nil, err } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 5092d45abb..8a1f9ccf27 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -26,7 +26,7 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" + chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) @@ -48,7 +48,7 @@ func getRandFile(t *testing.T, ds ipld.DAGService, size int64) ipld.Node { } func fileNodeFromReader(t *testing.T, ds ipld.DAGService, r io.Reader) ipld.Node { - nd, err := importer.BuildDagFromReader(ds, chunk.DefaultSplitter(r)) + nd, err := importer.BuildDagFromReader(ds, chunker.DefaultSplitter(r)) if err != nil { t.Fatal(err) } From 0974b8d9e29f2b895e3ff86ae627c504d5372ba2 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 8 Feb 2018 12:49:39 +0100 Subject: [PATCH 1913/3147] Extract: chunker: rename "chunk" to "chunker" as it is more consistent License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@a8bd950cb77138defb0ebae2ba1e1d4dd9870354 --- unixfs/mod/dagmodifier.go | 10 +++++----- unixfs/test/utils.go | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 683ce056ad..8f2766aee0 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,7 +14,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" + chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" @@ -37,7 +37,7 @@ type DagModifier struct { dagserv ipld.DAGService curNode ipld.Node - splitter chunk.SplitterGen + splitter chunker.SplitterGen ctx context.Context readCancel func() @@ -55,7 +55,7 @@ type DagModifier struct { // created nodes will be inherted from the passed in node. If the Cid // version if not 0 raw leaves will also be enabled. The Prefix and // RawLeaves options can be overridden by changing them after the call. -func NewDagModifier(ctx context.Context, from ipld.Node, serv ipld.DAGService, spl chunk.SplitterGen) (*DagModifier, error) { +func NewDagModifier(ctx context.Context, from ipld.Node, serv ipld.DAGService, spl chunker.SplitterGen) (*DagModifier, error) { switch from.(type) { case *mdag.ProtoNode, *mdag.RawNode: // ok @@ -126,7 +126,7 @@ func (zr zeroReader) Read(b []byte) (int, error) { // A small blocksize is chosen to aid in deduplication func (dm *DagModifier) expandSparse(size int64) error { r := io.LimitReader(zeroReader{}, size) - spl := chunk.NewSizeSplitter(r, 4096) + spl := chunker.NewSizeSplitter(r, 4096) nnode, err := dm.appendData(dm.curNode, spl) if err != nil { return err @@ -356,7 +356,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c } // appendData appends the blocks from the given chan to the end of this dag -func (dm *DagModifier) appendData(nd ipld.Node, spl chunk.Splitter) (ipld.Node, error) { +func (dm *DagModifier) appendData(nd ipld.Node, spl chunker.Splitter) (ipld.Node, error) { switch nd := nd.(type) { case *mdag.ProtoNode, *mdag.RawNode: dbp := &help.DagBuilderParams{ diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index a127c1a654..f96fcfcb52 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -15,16 +15,16 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - chunk "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" + chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // SizeSplitterGen creates a generator. -func SizeSplitterGen(size int64) chunk.SplitterGen { - return func(r io.Reader) chunk.Splitter { - return chunk.NewSizeSplitter(r, size) +func SizeSplitterGen(size int64) chunker.SplitterGen { + return func(r io.Reader) chunker.Splitter { + return chunker.NewSizeSplitter(r, size) } } From aa344d7e5c0dad863115a7c64501d4016b444bd9 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 9 Feb 2018 13:10:06 +0100 Subject: [PATCH 1914/3147] Doc: golint-ify routing module License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-routing@8436b8ae9bf07f0a2f0ac8ef658d75a44e565e2c --- routing/mock/interface.go | 12 +++++++----- routing/none/none_client.go | 6 ++++-- routing/offline/offline.go | 7 +++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 6306ff0606..6f906935e3 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -1,17 +1,17 @@ -// Package mock provides a virtual routing server. To use it, create a virtual -// routing server and use the Client() method to get a routing client -// (IpfsRouting). The server quacks like a DHT but is really a local in-memory -// hash table. +// Package mockrouting provides a virtual routing server. To use it, +// create a virtual routing server and use the Client() method to get a +// routing client (IpfsRouting). The server quacks like a DHT but is +// really a local in-memory hash table. package mockrouting import ( "context" delay "github.com/ipfs/go-ipfs/thirdparty/delay" - "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ) @@ -42,6 +42,8 @@ func NewServerWithDelay(conf DelayConfig) Server { } } +// DelayConfig can be used to configured the fake delays of a mock server. +// Use with NewServerWithDelay(). type DelayConfig struct { // ValueVisibility is the time it takes for a value to be visible in the network // FIXME there _must_ be a better term for this diff --git a/routing/none/none_client.go b/routing/none/none_client.go index c384433625..aee2b281bc 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -1,3 +1,4 @@ +// Package nilrouting implements a routing client that does nothing. package nilrouting import ( @@ -21,11 +22,11 @@ func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte) error { } func (c *nilclient) GetValue(_ context.Context, _ string) ([]byte, error) { - return nil, errors.New("Tried GetValue from nil routing.") + return nil, errors.New("tried GetValue from nil routing") } func (c *nilclient) GetValues(_ context.Context, _ string, _ int) ([]routing.RecvdVal, error) { - return nil, errors.New("Tried GetValues from nil routing.") + return nil, errors.New("tried GetValues from nil routing") } func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, error) { @@ -46,6 +47,7 @@ func (c *nilclient) Bootstrap(_ context.Context) error { return nil } +// ConstructNilRouting creates an IpfsRouting client which does nothing. func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ repo.Datastore) (routing.IpfsRouting, error) { return &nilclient{}, nil } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 443d4a9ece..84b52950fc 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -1,3 +1,5 @@ +// Package offline implements IpfsRouting with a client which +// is only able to perform offline operations. package offline import ( @@ -18,8 +20,13 @@ import ( cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) +// ErrOffline is returned when trying to perform operations that +// require connectivity. var ErrOffline = errors.New("routing system in offline mode") +// NewOfflineRouter returns an IpfsRouting implementation which only performs +// offline operations. It allows to Put and Get signed dht +// records to and from the local datastore. func NewOfflineRouter(dstore ds.Datastore, privkey ci.PrivKey) routing.IpfsRouting { return &offlineRouting{ datastore: dstore, From 7abe2e7f10119df50a38a100219924a992de9ba2 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 9 Feb 2018 13:35:20 +0100 Subject: [PATCH 1915/3147] Add LICENSE This commit was moved from ipfs/go-ipfs-chunker@a4b89204c7352f2d8cc900463025fc4198233aa6 --- chunker/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 chunker/LICENSE diff --git a/chunker/LICENSE b/chunker/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/chunker/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From a0b042755fc564097b15a51e67e082fedc15b94c Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 11:31:15 +0100 Subject: [PATCH 1916/3147] Extract from go-ipfs: readme, travis, golint, makefile, tests... This commit was moved from ipfs/go-ipfs-ds-help@1c74d493369298b09646db74be972505b137d27e --- datastore/dshelp/LICENSE | 21 +++++++++++++++++ datastore/dshelp/Makefile | 18 +++++++++++++++ datastore/dshelp/README.md | 44 ++++++++++++++++++++++++++++++++++++ datastore/dshelp/key.go | 24 ++++++++++++-------- datastore/dshelp/key_test.go | 19 ++++++++++++++++ 5 files changed, 116 insertions(+), 10 deletions(-) create mode 100644 datastore/dshelp/LICENSE create mode 100644 datastore/dshelp/Makefile create mode 100644 datastore/dshelp/README.md create mode 100644 datastore/dshelp/key_test.go diff --git a/datastore/dshelp/LICENSE b/datastore/dshelp/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/datastore/dshelp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/datastore/dshelp/Makefile b/datastore/dshelp/Makefile new file mode 100644 index 0000000000..73f2841f61 --- /dev/null +++ b/datastore/dshelp/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race -coverprofile=coverage.txt -covermode=atomic . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/datastore/dshelp/README.md b/datastore/dshelp/README.md new file mode 100644 index 0000000000..2af3bff469 --- /dev/null +++ b/datastore/dshelp/README.md @@ -0,0 +1,44 @@ +# go-ipfs-ds-help + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-ds-help?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-ds-help) +[![Build Status](https://travis-ci.org/ipfs/go-ipfs-ds-help.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-ds-help) + +> go-ipfs-ds-help provides utilities for parsing and creating datastore keys used by go-ipfs. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-ipfs-ds-help` works like a regular Go module: + +``` +> go get github.com/ipfs/go-ipfs-ds-help +``` + +## Usage + +``` +import "github.com/ipfs/go-ipfs-ds-help" +``` + +Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-ds-help) + +This module uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index c1cf2c4847..b4ee6743c7 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -1,29 +1,33 @@ +// Package dshelp provides utilities for parsing and creating +// datastore keys used by go-ipfs package dshelp import ( - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" + cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + "github.com/whyrusleeping/base32" ) -// TODO: put this code into the go-datastore itself - -func NewKeyFromBinary(rawKey []byte) ds.Key { +// NewKeyFromBinary creates a new key from a byte slice. +func NewKeyFromBinary(rawKey []byte) datastore.Key { buf := make([]byte, 1+base32.RawStdEncoding.EncodedLen(len(rawKey))) buf[0] = '/' base32.RawStdEncoding.Encode(buf[1:], rawKey) - return ds.RawKey(string(buf)) + return datastore.RawKey(string(buf)) } -func BinaryFromDsKey(k ds.Key) ([]byte, error) { +// BinaryFromDsKey returns the byte slice corresponding to the given Key. +func BinaryFromDsKey(k datastore.Key) ([]byte, error) { return base32.RawStdEncoding.DecodeString(k.String()[1:]) } -func CidToDsKey(k *cid.Cid) ds.Key { +// CidToDsKey creates a Key from the given Cid. +func CidToDsKey(k *cid.Cid) datastore.Key { return NewKeyFromBinary(k.Bytes()) } -func DsKeyToCid(dsKey ds.Key) (*cid.Cid, error) { +// DsKeyToCid converts the given Key to its corresponding Cid. +func DsKeyToCid(dsKey datastore.Key) (*cid.Cid, error) { kb, err := BinaryFromDsKey(dsKey) if err != nil { return nil, err diff --git a/datastore/dshelp/key_test.go b/datastore/dshelp/key_test.go new file mode 100644 index 0000000000..1f739bf8be --- /dev/null +++ b/datastore/dshelp/key_test.go @@ -0,0 +1,19 @@ +package dshelp + +import ( + "testing" + + cid "github.com/ipfs/go-cid" +) + +func TestKey(t *testing.T) { + c, _ := cid.Decode("QmP63DkAFEnDYNjDYBpyNDfttu1fvUw99x1brscPzpqmmq") + dsKey := CidToDsKey(c) + c2, err := DsKeyToCid(dsKey) + if err != nil { + t.Fatal(err) + } + if c.String() != c2.String() { + t.Fatal("should have parsed the same key") + } +} From 160c4e0baf9161a5079eb7457db0adab0822be1f Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 22:18:18 +0100 Subject: [PATCH 1917/3147] Doc: golint-ify path package. This removes all go-lint warnings in the path package. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-path@9d2e89e3c330c58d444c86a812c19bb75a2799bc --- path/path.go | 29 +++++++++++++++++++++++++---- path/resolver.go | 23 ++++++++++++++--------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/path/path.go b/path/path.go index decf289048..aeaeb5c7a2 100644 --- a/path/path.go +++ b/path/path.go @@ -1,3 +1,4 @@ +// Package path contains utilities to work with ipfs paths. package path import ( @@ -11,20 +12,29 @@ import ( // ErrBadPath is returned when a given path is incorrectly formatted var ErrBadPath = errors.New("invalid 'ipfs ref' path") +// A Path represents an ipfs content path: +// * //path/to/file +// * /ipfs/ +// * /ipns//path/to/folder +// * etc +type Path string + +// ^^^ // TODO: debate making this a private struct wrapped in a public interface // would allow us to control creation, and cache segments. -type Path string -// FromString safely converts a string type to a Path type +// FromString safely converts a string type to a Path type. func FromString(s string) Path { return Path(s) } -// FromCid safely converts a cid.Cid type to a Path type +// FromCid safely converts a cid.Cid type to a Path type. func FromCid(c *cid.Cid) Path { return Path("/ipfs/" + c.String()) } +// Segments returns the different elements of a path +// (elements are delimited by a /). func (p Path) Segments() []string { cleaned := path.Clean(string(p)) segments := strings.Split(cleaned, "/") @@ -37,6 +47,7 @@ func (p Path) Segments() []string { return segments } +// String converts a path to string. func (p Path) String() string { return string(p) } @@ -65,10 +76,16 @@ func (p Path) PopLastSegment() (Path, string, error) { return newPath, segs[len(segs)-1], nil } +// FromSegments returns a path given its different segments. func FromSegments(prefix string, seg ...string) (Path, error) { return ParsePath(prefix + strings.Join(seg, "/")) } +// ParsePath returns a well-formed ipfs Path. +// The returned path will always be prefixed with /ipfs/ or /ipns/. +// The prefix will be added if not present in the given string. +// This function will return an error when the given string is +// not a valid ipfs path. func ParsePath(txt string) (Path, error) { parts := strings.Split(txt, "/") if len(parts) == 1 { @@ -78,7 +95,7 @@ func ParsePath(txt string) (Path, error) { } } - // if the path doesnt being with a '/' + // if the path doesnt begin with a '/' // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { if _, err := ParseCidToPath(parts[0]); err != nil { @@ -103,6 +120,7 @@ func ParsePath(txt string) (Path, error) { return Path(txt), nil } +// ParseCidToPath takes a CID in string form and returns a valid ipfs Path. func ParseCidToPath(txt string) (Path, error) { if txt == "" { return "", ErrNoComponents @@ -116,15 +134,18 @@ func ParseCidToPath(txt string) (Path, error) { return FromCid(c), nil } +// IsValid checks if a path is a valid ipfs Path. func (p *Path) IsValid() error { _, err := ParsePath(p.String()) return err } +// Join joins strings slices using / func Join(pths []string) string { return strings.Join(pths, "/") } +// SplitList splits strings usings / func SplitList(pth string) []string { return strings.Split(pth, "/") } diff --git a/path/resolver.go b/path/resolver.go index 30c249d452..64bdbf7525 100644 --- a/path/resolver.go +++ b/path/resolver.go @@ -16,7 +16,8 @@ import ( var log = logging.Logger("path") -// Paths after a protocol must contain at least one component +// ErrNoComponents is used when Paths after a protocol +// do not contain at least one component var ErrNoComponents = errors.New( "path must contain at least one component") @@ -26,6 +27,8 @@ type ErrNoLink struct { Node *cid.Cid } +// Error implements the Error interface for ErrNoLink with a useful +// human readable message. func (e ErrNoLink) Error() string { return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.String()) } @@ -74,6 +77,8 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { return c, parts[1:], nil } +// ResolveToLastNode walks the given path and returns the ipld.Node +// referenced by the last element in it. func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (ipld.Node, []string, error) { c, p, err := SplitAbsPath(fpath) if err != nil { @@ -109,13 +114,13 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (ipld.Node // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. -func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (ipld.Node, error) { +func (r *Resolver) ResolvePath(ctx context.Context, fpath Path) (ipld.Node, error) { // validate path if err := fpath.IsValid(); err != nil { return nil, err } - nodes, err := s.ResolvePathComponents(ctx, fpath) + nodes, err := r.ResolvePathComponents(ctx, fpath) if err != nil || nodes == nil { return nil, err } @@ -131,7 +136,7 @@ func ResolveSingle(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. -func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]ipld.Node, error) { +func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]ipld.Node, error) { evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) defer evt.Done() @@ -142,13 +147,13 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]ipl } log.Debug("resolve dag get") - nd, err := s.DAG.Get(ctx, h) + nd, err := r.DAG.Get(ctx, h) if err != nil { evt.Append(logging.LoggableMap{"error": err.Error()}) return nil, err } - return s.ResolveLinks(ctx, nd, parts) + return r.ResolveLinks(ctx, nd, parts) } // ResolveLinks iteratively resolves names by walking the link hierarchy. @@ -158,7 +163,7 @@ func (s *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]ipl // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links -func (s *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { +func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) defer evt.Done() @@ -172,7 +177,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []stri ctx, cancel = context.WithTimeout(ctx, time.Minute) defer cancel() - lnk, rest, err := s.ResolveOnce(ctx, s.DAG, nd, names) + lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, names) if err == dag.ErrLinkNotFound { evt.Append(logging.LoggableMap{"error": err.Error()}) return result, ErrNoLink{Name: names[0], Node: nd.Cid()} @@ -181,7 +186,7 @@ func (s *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []stri return result, err } - nextnode, err := lnk.GetNode(ctx, s.DAG) + nextnode, err := lnk.GetNode(ctx, r.DAG) if err != nil { evt.Append(logging.LoggableMap{"error": err.Error()}) return result, err From 5da5eb3293a672babc092da5ec3015cbb18522f7 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 9 Feb 2018 14:36:19 +0100 Subject: [PATCH 1918/3147] Extract: flags and thirdparty/delay submodules They have been moved to their own repositories: * github.com/ipfs/go-ipfs-delay * github.com/ipfs/go-ipfs-flags History has been preserved. They have been published with gx'ed. Imports have been updated and re-ordered accordingly. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-routing@fe2bf7957948c303687de319de220fbee904e16f --- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 8d056a139f..b2de10140e 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - delay "github.com/ipfs/go-ipfs/thirdparty/delay" + delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 6f906935e3..a4b1981156 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -7,9 +7,8 @@ package mockrouting import ( "context" - delay "github.com/ipfs/go-ipfs/thirdparty/delay" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" From 31f674e6930f298abc4e013f1640d46a10cff355 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 11:46:32 +0100 Subject: [PATCH 1919/3147] Extract: thirdparty/ds-help submodule It has been moved to its own repository: * github.com/ipfs/go-ipfs-ds-help History has been preserved. It has been published with gx. Imports have been updated and re-ordered accordingly. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-routing@50155e2ea53c49566ef88474c30815235681cb7c --- routing/mock/centralized_client.go | 5 ++--- routing/offline/offline.go | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index bc90ca6f7d..985eb2814a 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -5,19 +5,18 @@ import ( "errors" "time" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" + "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) var log = logging.Logger("mockrouter") diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 84b52950fc..cc525a06d4 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,8 +7,6 @@ import ( "errors" "time" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" @@ -18,6 +16,7 @@ import ( "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) // ErrOffline is returned when trying to perform operations that From ed3f969b41956a84e67e090e1727b8f5f6d4cf70 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 9 Feb 2018 14:36:19 +0100 Subject: [PATCH 1920/3147] Extract: flags and thirdparty/delay submodules They have been moved to their own repositories: * github.com/ipfs/go-ipfs-delay * github.com/ipfs/go-ipfs-flags History has been preserved. They have been published with gx'ed. Imports have been updated and re-ordered accordingly. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@e240865f3e4900791a5febafba88a142fd711af7 --- blockservice/test/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 622d1c8d68..42eb97ba37 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,7 +5,7 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - delay "github.com/ipfs/go-ipfs/thirdparty/delay" + delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" ) // Mocks returns |n| connected mock Blockservices From f49f4162fab2e441a69851b8150f5088bb50b18a Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 11:46:32 +0100 Subject: [PATCH 1921/3147] Extract: thirdparty/ds-help submodule It has been moved to its own repository: * github.com/ipfs/go-ipfs-ds-help History has been preserved. It has been published with gx. Imports have been updated and re-ordered accordingly. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@9beea522bdee86a0c32d59b6bdf1736e7011517f --- filestore/fsrefstore.go | 6 +++--- filestore/util.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 8e048fd69c..c4a35a5fe3 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -9,15 +9,15 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" + posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" + "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 35a640b68f..98463271ca 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) // Status is used to identify the state of the block data referenced From 290f41ba93e5f502707daf40bcd9d8038b1a3fd4 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 11:46:32 +0100 Subject: [PATCH 1922/3147] Extract: thirdparty/ds-help submodule It has been moved to its own repository: * github.com/ipfs/go-ipfs-ds-help History has been preserved. It has been published with gx. Imports have been updated and re-ordered accordingly. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@78135537446aa1f85505ce9c34f175305c9051a1 --- namesys/publisher.go | 2 +- namesys/publisher_test.go | 2 +- namesys/pubsub.go | 2 +- namesys/republisher/repub.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 79e3168e83..12c10f7529 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -9,7 +9,6 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" @@ -19,6 +18,7 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) const PublishPutValTimeout = time.Minute diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 86d4a0a411..7e28179bf5 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,7 +8,6 @@ import ( path "github.com/ipfs/go-ipfs/path" mockrouting "github.com/ipfs/go-ipfs/routing/mock" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" @@ -16,6 +15,7 @@ import ( ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) type identity struct { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 229b9ff427..20052cd78b 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -10,7 +10,6 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" @@ -26,6 +25,7 @@ import ( mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) // PubsubPublisher is a publisher that distributes IPNS records through pubsub diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 345ba4abc3..7bb54fcd4c 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -9,7 +9,6 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" @@ -20,6 +19,7 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) var errNoEntry = errors.New("no previous entry") From 0f39cfcbef6bf9f397feb1563fbe589d8cb5e0a6 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 11:46:32 +0100 Subject: [PATCH 1923/3147] Extract: thirdparty/ds-help submodule It has been moved to its own repository: * github.com/ipfs/go-ipfs-ds-help History has been preserved. It has been published with gx. Imports have been updated and re-ordered accordingly. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-blockstore@d427bf1af8b267b4ab79ff8722f0c082c360b26b --- blockstore/blockstore.go | 5 ++--- blockstore/blockstore_test.go | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 7e5e8cbdcc..f5bbb826a7 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -8,14 +8,13 @@ import ( "sync" "sync/atomic" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 2b0366096c..757aa67e12 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -6,14 +6,13 @@ import ( "fmt" "testing" - dshelp "github.com/ipfs/go-ipfs/thirdparty/ds-help" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" ds_sync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) func TestGetWhenKeyNotPresent(t *testing.T) { From 5828abc587445e7dbcf6420ea76c19d54564a624 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 11:55:03 +0100 Subject: [PATCH 1924/3147] Import re-ordering License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-routing@a2716d727f04007374a1c4d1e471bd705b7772d7 --- routing/mock/centralized_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index b2de10140e..b3f6c29262 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -5,9 +5,8 @@ import ( "testing" "time" - delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" From d18cb72e076fb786f6ad128d01218809c2de7e09 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 12 Feb 2018 11:55:03 +0100 Subject: [PATCH 1925/3147] Import re-ordering License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@e2f33c199a2638385521f060c97fbb35e399a171 --- blockservice/test/mock.go | 1 + 1 file changed, 1 insertion(+) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 42eb97ba37..c76c4d025b 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,6 +5,7 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" mockrouting "github.com/ipfs/go-ipfs/routing/mock" + delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" ) From 08744ade4c21f22fc2f5b5020542624eaa9d2e26 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 13 Feb 2018 11:29:32 +0100 Subject: [PATCH 1926/3147] More consistency in imports Per @magik6k comments. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@3030c6acfa87419cb640e8873d684abdd735f0f2 --- filestore/filestore.go | 4 ++-- filestore/fsrefstore.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index e7215dfccf..69fb720140 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,12 +11,12 @@ import ( "context" "github.com/ipfs/go-ipfs/blocks/blockstore" - posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) var log = logging.Logger("filestore") diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index c4a35a5fe3..0f08771bf4 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -17,7 +17,7 @@ import ( posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) // FilestorePrefix identifies the key prefix for FileManager blocks. From ab321f577c7b22fb847a65dad8f88bb16f205c16 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 13 Feb 2018 12:53:20 +0100 Subject: [PATCH 1927/3147] Docs: golint-ify pin package License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@a8e7138215fc76656db4961e61886c464086e546 --- pinning/pinner/gc/gc.go | 19 ++++++++++++++++++- pinning/pinner/pin.go | 26 ++++++++++++++++++-------- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 92c8cb52a2..1ed5f16723 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -1,3 +1,4 @@ +// Package gc provides garbage collection for go-ipfs. package gc import ( @@ -35,7 +36,6 @@ type Result struct { // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -// func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { elock := log.EventBegin(ctx, "GC.lockWait") @@ -125,6 +125,9 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn return output } +// Descendants recursively finds all the descendants of the given roots and +// adds them to the given cid.Set, using the provided dag.GetLinks function +// to walk the tree. func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { for _, c := range roots { set.Add(c) @@ -191,24 +194,38 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo return gcs, nil } +// ErrCannotFetchAllLinks is returned as the last Result in the GC output +// channel when there was a error creating the marked set because of a +// problem when finding descendants. var ErrCannotFetchAllLinks = errors.New("garbage collection aborted: could not retrieve some links") +// ErrCannotDeleteSomeBlocks is returned when removing blocks marked for +// deletion fails as the last Result in GC output channel. var ErrCannotDeleteSomeBlocks = errors.New("garbage collection incomplete: could not delete some blocks") +// CannotFetchLinksError provides detailed information about which links +// could not be fetched and can appear as a Result in the GC output channel. type CannotFetchLinksError struct { Key *cid.Cid Err error } +// Error implements the error interface for this type with a useful +// message. func (e *CannotFetchLinksError) Error() string { return fmt.Sprintf("could not retrieve links for %s: %s", e.Key, e.Err) } +// CannotDeleteBlockError provides detailed information about which +// blocks could not be deleted and can appear as a Result in the GC output +// channel. type CannotDeleteBlockError struct { Key *cid.Cid Err error } +// Error implements the error interface for this type with a +// useful message. func (e *CannotDeleteBlockError) Error() string { return fmt.Sprintf("could not remove %s: %s", e.Key, e.Err) } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 07cda7cd08..ded36900a2 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -1,4 +1,4 @@ -// package pin implements structures and methods to keep track of +// Package pin implements structures and methods to keep track of // which objects a user wants to keep stored locally. package pin @@ -43,8 +43,11 @@ const ( linkAll = "all" ) +// PinMode allows to specify different types of pin (recursive, direct etc.). +// See the Pin Modes constants for a full list. type PinMode int +// Pin Modes const ( // Recursive pins pin the target cids along with any reachable children. Recursive PinMode = iota @@ -65,6 +68,7 @@ const ( Any ) +// PinModeToString returns a human-readable name for the PinMode. func PinModeToString(mode PinMode) (string, bool) { m := map[PinMode]string{ Recursive: linkRecursive, @@ -78,6 +82,8 @@ func PinModeToString(mode PinMode) (string, bool) { return s, ok } +// StringToPinMode parses the result of PinModeToString() back to a PinMode. +// It returns a boolean which is set to false if the mode is unknown. func StringToPinMode(s string) (PinMode, bool) { m := map[string]PinMode{ linkRecursive: Recursive, @@ -92,6 +98,10 @@ func StringToPinMode(s string) (PinMode, bool) { return mode, ok } +// A Pinner provides the necessary methods to keep track of Nodes which are +// to be kept locally, according to a pin mode. In practice, a Pinner is in +// in charge of keeping the list of items from the local storage that should +// not be garbaged-collected. type Pinner interface { // IsPinned returns whether or not the given cid is pinned // and an explanation of why its pinned @@ -141,6 +151,10 @@ type Pinner interface { InternalPins() []*cid.Cid } +// Pinned represents CID which has been pinned with a pinning strategy. +// The Via field allows to identify the pinning parent of this CID, in the +// case that the item is not pinned directly (but rather pinned recursively +// by some ascendant). type Pinned struct { Key *cid.Cid Mode PinMode @@ -149,11 +163,7 @@ type Pinned struct { // Pinned returns whether or not the given cid is pinned func (p Pinned) Pinned() bool { - if p.Mode == NotPinned { - return false - } else { - return true - } + return p.Mode != NotPinned } // String Returns pin status as string @@ -240,6 +250,7 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { return nil } +// ErrNotPinned is returned when trying to unpin items which are not pinned. var ErrNotPinned = fmt.Errorf("not pinned") // Unpin a given key @@ -258,9 +269,8 @@ func (p *pinner) Unpin(ctx context.Context, c *cid.Cid, recursive bool) error { if recursive { p.recursePin.Remove(c) return nil - } else { - return fmt.Errorf("%s is pinned recursively", c) } + return fmt.Errorf("%s is pinned recursively", c) case "direct": p.directPin.Remove(c) return nil From 2098ed2b4559e869f4c8b28e90a37ee6e1fc0e10 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 13 Feb 2018 13:00:48 +0100 Subject: [PATCH 1928/3147] Doc: golint: remove stuttering in pin package License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@12448909d819e86b464c049b1b63382712450a52 --- pinning/pinner/pin.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ded36900a2..685f8cf655 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -43,14 +43,14 @@ const ( linkAll = "all" ) -// PinMode allows to specify different types of pin (recursive, direct etc.). +// Mode allows to specify different types of pin (recursive, direct etc.). // See the Pin Modes constants for a full list. -type PinMode int +type Mode int // Pin Modes const ( // Recursive pins pin the target cids along with any reachable children. - Recursive PinMode = iota + Recursive Mode = iota // Direct pins pin just the target cid. Direct @@ -68,9 +68,9 @@ const ( Any ) -// PinModeToString returns a human-readable name for the PinMode. -func PinModeToString(mode PinMode) (string, bool) { - m := map[PinMode]string{ +// ModeToString returns a human-readable name for the Mode. +func ModeToString(mode Mode) (string, bool) { + m := map[Mode]string{ Recursive: linkRecursive, Direct: linkDirect, Indirect: linkIndirect, @@ -82,10 +82,10 @@ func PinModeToString(mode PinMode) (string, bool) { return s, ok } -// StringToPinMode parses the result of PinModeToString() back to a PinMode. +// StringToMode parses the result of ModeToString() back to a Mode. // It returns a boolean which is set to false if the mode is unknown. -func StringToPinMode(s string) (PinMode, bool) { - m := map[string]PinMode{ +func StringToMode(s string) (Mode, bool) { + m := map[string]Mode{ linkRecursive: Recursive, linkDirect: Direct, linkIndirect: Indirect, @@ -109,7 +109,7 @@ type Pinner interface { // IsPinnedWithType returns whether or not the given cid is pinned with the // given pin type, as well as returning the type of pin its pinned with. - IsPinnedWithType(*cid.Cid, PinMode) (string, bool, error) + IsPinnedWithType(*cid.Cid, Mode) (string, bool, error) // Pin the given node, optionally recursively. Pin(ctx context.Context, node ipld.Node, recursive bool) error @@ -130,12 +130,12 @@ type Pinner interface { // PinWithMode is for manually editing the pin structure. Use with // care! If used improperly, garbage collection may not be // successful. - PinWithMode(*cid.Cid, PinMode) + PinWithMode(*cid.Cid, Mode) // RemovePinWithMode is for manually editing the pin structure. // Use with care! If used improperly, garbage collection may not // be successful. - RemovePinWithMode(*cid.Cid, PinMode) + RemovePinWithMode(*cid.Cid, Mode) // Flush writes the pin state to the backing datastore Flush() error @@ -157,7 +157,7 @@ type Pinner interface { // by some ascendant). type Pinned struct { Key *cid.Cid - Mode PinMode + Mode Mode Via *cid.Cid } @@ -174,7 +174,7 @@ func (p Pinned) String() string { case Indirect: return fmt.Sprintf("pinned via %s", p.Via) default: - modeStr, _ := PinModeToString(p.Mode) + modeStr, _ := ModeToString(p.Mode) return fmt.Sprintf("pinned: %s", modeStr) } } @@ -293,7 +293,7 @@ func (p *pinner) IsPinned(c *cid.Cid) (string, bool, error) { // IsPinnedWithType returns whether or not the given cid is pinned with the // given pin type, as well as returning the type of pin its pinned with. -func (p *pinner) IsPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { +func (p *pinner) IsPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() return p.isPinnedWithType(c, mode) @@ -301,7 +301,7 @@ func (p *pinner) IsPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error // isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // intended for use by other pinned methods that already take locks -func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { +func (p *pinner) isPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) { switch mode { case Any, Direct, Indirect, Recursive, Internal: default: @@ -414,7 +414,7 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { // RemovePinWithMode is for manually editing the pin structure. // Use with care! If used improperly, garbage collection may not // be successful. -func (p *pinner) RemovePinWithMode(c *cid.Cid, mode PinMode) { +func (p *pinner) RemovePinWithMode(c *cid.Cid, mode Mode) { p.lock.Lock() defer p.lock.Unlock() switch mode { @@ -594,7 +594,7 @@ func (p *pinner) InternalPins() []*cid.Cid { // PinWithMode allows the user to have fine grained control over pin // counts -func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { +func (p *pinner) PinWithMode(c *cid.Cid, mode Mode) { p.lock.Lock() defer p.lock.Unlock() switch mode { From b1cc9b6e67092724926611225cecfd249584989a Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 14 Feb 2018 17:59:52 +0100 Subject: [PATCH 1929/3147] Extract from go-ipfs: gxify, license, readme, travis, makefile This commit was moved from ipfs/go-ipfs-routing@a32f8f983edcb78fc1f410308953b3fa64d9c4b1 --- routing/LICENSE | 21 ++++++++++++++ routing/Makefile | 18 ++++++++++++ routing/README.md | 44 ++++++++++++++++++++++++++++++ routing/mock/centralized_client.go | 24 ++++++++-------- routing/mock/centralized_server.go | 13 ++++----- routing/mock/centralized_test.go | 10 +++---- routing/mock/interface.go | 10 +++---- routing/none/none_client.go | 11 ++++---- routing/offline/offline.go | 20 +++++++------- routing/offline/offline_test.go | 4 +-- 10 files changed, 128 insertions(+), 47 deletions(-) create mode 100644 routing/LICENSE create mode 100644 routing/Makefile create mode 100644 routing/README.md diff --git a/routing/LICENSE b/routing/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/routing/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/routing/Makefile b/routing/Makefile new file mode 100644 index 0000000000..c12161c961 --- /dev/null +++ b/routing/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race ./... +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/routing/README.md b/routing/README.md new file mode 100644 index 0000000000..636148909f --- /dev/null +++ b/routing/README.md @@ -0,0 +1,44 @@ +# go-ipfs-routing + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-routing?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-routing) +[![Build Status](https://travis-ci.org/ipfs/go-ipfs-routing.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-routing) + +> go-ipfs-routing provides go-libp2p-routing implementations used in go-ipfs. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-ipfs-routing` works like a regular Go module: + +``` +> go get github.com/ipfs/go-ipfs-routing +``` + +This module uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. + +## Usage + +``` +import "github.com/ipfs/go-ipfs-routing" +``` + +Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-routing) + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 985eb2814a..f00f11a09d 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -5,18 +5,18 @@ import ( "errors" "time" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" - "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" + proto "github.com/gogo/protobuf/proto" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dshelp "github.com/ipfs/go-ipfs-ds-help" + u "github.com/ipfs/go-ipfs-util" + logging "github.com/ipfs/go-log" + peer "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + dhtpb "github.com/libp2p/go-libp2p-record/pb" + routing "github.com/libp2p/go-libp2p-routing" + "github.com/libp2p/go-testutil" + ma "github.com/multiformats/go-multiaddr" ) var log = logging.Logger("mockrouter") diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index b4263d1d2d..ab1a985fdf 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,13 +6,12 @@ import ( "sync" "time" - "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + peer "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-testutil" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index b3f6c29262..704557a664 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -5,11 +5,11 @@ import ( "testing" "time" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + cid "github.com/ipfs/go-cid" + delay "github.com/ipfs/go-ipfs-delay" + u "github.com/ipfs/go-ipfs-util" + pstore "github.com/libp2p/go-libp2p-peerstore" + testutil "github.com/libp2p/go-testutil" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index a4b1981156..c14a7763f3 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -7,11 +7,11 @@ package mockrouting import ( "context" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + ds "github.com/ipfs/go-datastore" + delay "github.com/ipfs/go-ipfs-delay" + peer "github.com/libp2p/go-libp2p-peer" + routing "github.com/libp2p/go-libp2p-routing" + "github.com/libp2p/go-testutil" ) // Server provides mockrouting Clients diff --git a/routing/none/none_client.go b/routing/none/none_client.go index aee2b281bc..e5d00b0e3c 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -5,13 +5,12 @@ import ( "context" "errors" + cid "github.com/ipfs/go-cid" repo "github.com/ipfs/go-ipfs/repo" - - p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + p2phost "github.com/libp2p/go-libp2p-host" + peer "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + routing "github.com/libp2p/go-libp2p-routing" ) type nilclient struct { diff --git a/routing/offline/offline.go b/routing/offline/offline.go index cc525a06d4..7384c6d79d 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -7,16 +7,16 @@ import ( "errors" "time" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" - pb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" + proto "github.com/gogo/protobuf/proto" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dshelp "github.com/ipfs/go-ipfs-ds-help" + ci "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + record "github.com/libp2p/go-libp2p-record" + pb "github.com/libp2p/go-libp2p-record/pb" + routing "github.com/libp2p/go-libp2p-routing" ) // ErrOffline is returned when trying to perform operations that diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 66d8517006..a685dcab8f 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -5,8 +5,8 @@ import ( "context" "testing" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" + ds "github.com/ipfs/go-datastore" + "github.com/libp2p/go-testutil" ) func TestOfflineRouterStorage(t *testing.T) { From 78943a135a21d59ea4f763f01c2f93088af70aa6 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 14 Feb 2018 18:05:01 +0100 Subject: [PATCH 1930/3147] Replace go-ipfs repo dependency with datastore.Batching interface. This commit was moved from ipfs/go-ipfs-routing@9fa690cf15b917d27a51e9b3cee974b3e3075bf0 --- routing/none/none_client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index e5d00b0e3c..8935708d1b 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -6,7 +6,7 @@ import ( "errors" cid "github.com/ipfs/go-cid" - repo "github.com/ipfs/go-ipfs/repo" + ds "github.com/ipfs/go-datastore" p2phost "github.com/libp2p/go-libp2p-host" peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" @@ -47,7 +47,7 @@ func (c *nilclient) Bootstrap(_ context.Context) error { } // ConstructNilRouting creates an IpfsRouting client which does nothing. -func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ repo.Datastore) (routing.IpfsRouting, error) { +func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.Batching) (routing.IpfsRouting, error) { return &nilclient{}, nil } From d5ee4420c20f1ee7092dfad35825227ecb5f9194 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 9 Feb 2018 15:06:31 +0100 Subject: [PATCH 1931/3147] Extract: routing package to github.com/ipfs/go-ipfs-routing This extracts the routing package to its own repository (https://github.com/ipfs/go-ipfs-routing). History has been preserved. The new module has been gx'ed and published. Imports have been rewritten and re-ordered accordingly. An internal dependency to go-ipfs/repo has been removed by substituting it with the go-datastore.Batching interface. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@06a91e4a35ffabab45cc33aff73641e21d0859a5 --- blockservice/test/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index c76c4d025b..06d8e65ad2 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -4,9 +4,9 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" - mockrouting "github.com/ipfs/go-ipfs/routing/mock" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" + mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 7bc813bc0c5ef09ea06921cd8f7c10125d1f26e2 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 9 Feb 2018 15:06:31 +0100 Subject: [PATCH 1932/3147] Extract: routing package to github.com/ipfs/go-ipfs-routing This extracts the routing package to its own repository (https://github.com/ipfs/go-ipfs-routing). History has been preserved. The new module has been gx'ed and published. Imports have been rewritten and re-ordered accordingly. An internal dependency to go-ipfs/repo has been removed by substituting it with the go-datastore.Batching interface. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@e82a7a15cbfce030cd04d23991ceb3c74eb7a749 --- namesys/ipns_validate_test.go | 2 +- namesys/namesys_test.go | 2 +- namesys/publisher_test.go | 2 +- namesys/pubsub_test.go | 2 +- namesys/resolve_test.go | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 262b0711d5..559a1b78af 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -7,7 +7,6 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - mockrouting "github.com/ipfs/go-ipfs/routing/mock" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" @@ -18,6 +17,7 @@ import ( testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 2cd91c79f8..e4f7af196d 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,11 +7,11 @@ import ( context "context" path "github.com/ipfs/go-ipfs/path" - offroute "github.com/ipfs/go-ipfs/routing/offline" "github.com/ipfs/go-ipfs/unixfs" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + offroute "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 7e28179bf5..e7d2dd686f 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -7,12 +7,12 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - mockrouting "github.com/ipfs/go-ipfs/routing/mock" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" + mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index b8e6dbec35..e2cf15b5d9 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -7,7 +7,6 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - mockrouting "github.com/ipfs/go-ipfs/routing/mock" p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" @@ -17,6 +16,7 @@ import ( testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" netutil "gx/ipfs/QmYVR3C8DWPHdHxvLtNFYfjsXgaRAdh6hPMNH3KiwCgu4o/go-libp2p-netutil" + mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 17dab14af6..a55d5a4d4f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -7,11 +7,11 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - mockrouting "github.com/ipfs/go-ipfs/routing/mock" - testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" + mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ) From 69610ff207876e3aefab8576da397f5929b4fc0f Mon Sep 17 00:00:00 2001 From: matrushka Date: Wed, 14 Feb 2018 12:31:57 +0100 Subject: [PATCH 1933/3147] Modified keystore to ignore invalid key files inside the keystore directory. * Has calls the validateName function before checking if we have the file * List filters the returned list of file names by validateName. License: MIT Signed-off-by: matrushka This commit was moved from ipfs/go-ipfs-keystore@03d905ad9b8c228dd43b65ef194057311e8c394a --- keystore/keystore.go | 20 +++++++++++++- keystore/keystore_test.go | 57 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 56dfd1b013..2db9a9b920 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -77,6 +77,10 @@ func (ks *FSKeystore) Has(name string) (bool, error) { return false, err } + if err := validateName(name); err != nil { + return false, err + } + return true, nil } @@ -149,5 +153,19 @@ func (ks *FSKeystore) List() ([]string, error) { return nil, err } - return dir.Readdirnames(0) + dirs, err := dir.Readdirnames(0) + if err != nil { + return nil, err + } + + var list []string + + for _, name := range dirs { + err := validateName(name) + if err == nil { + list = append(list, name) + } + } + + return list, err } diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index cf6281be20..f0c1b31054 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "math/rand" + "path/filepath" "sort" "testing" @@ -143,6 +144,62 @@ func TestKeystoreBasics(t *testing.T) { } } +func TestInvalidKeyFiles(t *testing.T) { + tdir, err := ioutil.TempDir("", "keystore-test") + + if err != nil { + t.Fatal(err) + } + + ks, err := NewFSKeystore(tdir) + if err != nil { + t.Fatal(err) + } + + key := privKeyOrFatal(t) + + bytes, err := key.Bytes() + if err != nil { + t.Fatal(err) + } + + err = ioutil.WriteFile(filepath.Join(ks.dir, "valid"), bytes, 0644) + if err != nil { + t.Fatal(err) + } + + err = ioutil.WriteFile(filepath.Join(ks.dir, ".invalid"), bytes, 0644) + if err != nil { + t.Fatal(err) + } + + l, err := ks.List() + if err != nil { + t.Fatal(err) + } + + sort.Strings(l) + if len(l) != 1 { + t.Fatal("wrong entry count") + } + + if l[0] != "valid" { + t.Fatal("wrong entries listed") + } + + exist, err := ks.Has("valid") + if !exist { + t.Fatal("should know it has a key named valid") + } + if err != nil { + t.Fatal(err) + } + + if exist, err = ks.Has(".invalid"); err == nil { + t.Fatal("shouldnt be able to put a key with a 'hidden' name") + } +} + func TestNonExistingKey(t *testing.T) { tdir, err := ioutil.TempDir("", "keystore-test") if err != nil { From 44c951bc50f1e7a381be40e95a912ef84678b923 Mon Sep 17 00:00:00 2001 From: matrushka Date: Wed, 14 Feb 2018 15:15:25 +0100 Subject: [PATCH 1934/3147] Removing the tmp directory after the TestInvalidKeyFiles test. License: MIT Signed-off-by: matrushka This commit was moved from ipfs/go-ipfs-keystore@fecc54b15b47300c7aa83575141a713e25168f11 --- keystore/keystore_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index f0c1b31054..0731f252bb 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "math/rand" + "os" "path/filepath" "sort" "testing" @@ -151,6 +152,8 @@ func TestInvalidKeyFiles(t *testing.T) { t.Fatal(err) } + defer os.RemoveAll(tdir) + ks, err := NewFSKeystore(tdir) if err != nil { t.Fatal(err) From efdb6ad4e234b3daf6acd4ff9fdf1a1a7199f774 Mon Sep 17 00:00:00 2001 From: matrushka Date: Wed, 14 Feb 2018 18:16:29 +0100 Subject: [PATCH 1935/3147] Added logging for ignored keyfiles in keystore.List and minor improvements. License: MIT Signed-off-by: matrushka This commit was moved from ipfs/go-ipfs-keystore@c7dda3d68c8bf842f5614341c09d73fc7654433a --- keystore/keystore.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 2db9a9b920..1f95d2e4f5 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,9 +7,12 @@ import ( "path/filepath" "strings" + logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) +var log = logging.Logger("keystore") + // Keystore provides a key management interface type Keystore interface { // Has returns whether or not a key exist in the Keystore @@ -158,14 +161,16 @@ func (ks *FSKeystore) List() ([]string, error) { return nil, err } - var list []string + list := make([]string, 0) for _, name := range dirs { err := validateName(name) if err == nil { list = append(list, name) + } else { + log.Warningf("Ignoring the invalid keyfile: %s", name) } } - return list, err + return list, nil } From 00269014f66eae2dbd1406340686cea60ae6b366 Mon Sep 17 00:00:00 2001 From: matrushka Date: Wed, 14 Feb 2018 19:40:05 +0100 Subject: [PATCH 1936/3147] Handling requested changes. License: MIT Signed-off-by: matrushka This commit was moved from ipfs/go-ipfs-keystore@9b52e3f303aebf193a9ff15b489dc31d311223a5 --- keystore/keystore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 1f95d2e4f5..5dd4338528 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -161,7 +161,7 @@ func (ks *FSKeystore) List() ([]string, error) { return nil, err } - list := make([]string, 0) + list := make([]string, 0, len(dirs)) for _, name := range dirs { err := validateName(name) From daac18ab25d00192d6bf0aa0e067f910ab0407bf Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 17:36:55 +0100 Subject: [PATCH 1937/3147] Extract from go-ipfs: readme, travis, gx, license etc. This commit was moved from ipfs/go-ipfs-blockstore@b9697beb4525ca5161b3fc396863b460a00fefb9 --- blockstore/LICENSE | 21 ++++++ blockstore/Makefile | 18 ++++++ blockstore/README.md | 44 +++++++++++++ blockstore/arc_cache.go | 11 ++-- blockstore/arc_cache_test.go | 9 ++- blockstore/blockstore.go | 14 ++-- blockstore/blockstore_test.go | 14 ++-- blockstore/bloom_cache.go | 9 ++- blockstore/bloom_cache_test.go | 11 ++-- blockstore/caching.go | 5 +- blockstore/util/remove.go | 113 --------------------------------- 11 files changed, 117 insertions(+), 152 deletions(-) create mode 100644 blockstore/LICENSE create mode 100644 blockstore/Makefile create mode 100644 blockstore/README.md delete mode 100644 blockstore/util/remove.go diff --git a/blockstore/LICENSE b/blockstore/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/blockstore/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/blockstore/Makefile b/blockstore/Makefile new file mode 100644 index 0000000000..73f2841f61 --- /dev/null +++ b/blockstore/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race -coverprofile=coverage.txt -covermode=atomic . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/blockstore/README.md b/blockstore/README.md new file mode 100644 index 0000000000..446a95e257 --- /dev/null +++ b/blockstore/README.md @@ -0,0 +1,44 @@ +# go-ipfs-blockstore + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-blockstore?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-blockstore) +[![Build Status](https://travis-ci.org/ipfs/go-ipfs-blockstore.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-blockstore) + +> go-ipfs-blockstore implements a thin wrapper over a datastore, giving a clean interface for Getting and Putting block objects. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-ipfs-blockstore` works like a regular Go module: + +``` +> go get github.com/ipfs/go-ipfs-blockstore +``` + +## Usage + +``` +import "github.com/ipfs/go-ipfs-blockstore" +``` + +Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-blockstore) + +This module uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index e403bb96c2..3a79c4e592 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -3,12 +3,11 @@ package blockstore import ( "context" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + lru "github.com/hashicorp/golang-lru" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + metrics "github.com/ipfs/go-metrics-interface" ) // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 5a160d72b0..84789e7e80 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,11 +4,10 @@ import ( "context" "testing" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - syncds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + syncds "github.com/ipfs/go-datastore/sync" ) var exampleBlock = blocks.NewBlock([]byte("foo")) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f5bbb826a7..748387c005 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -8,13 +8,13 @@ import ( "sync" "sync/atomic" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dsns "github.com/ipfs/go-datastore/namespace" + dsq "github.com/ipfs/go-datastore/query" + dshelp "github.com/ipfs/go-ipfs-ds-help" + logging "github.com/ipfs/go-log" ) var log = logging.Logger("blockstore") diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 757aa67e12..7def52eb07 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -6,13 +6,13 @@ import ( "fmt" "testing" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" - ds_sync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-datastore/query" + ds_sync "github.com/ipfs/go-datastore/sync" + dshelp "github.com/ipfs/go-ipfs-ds-help" + u "github.com/ipfs/go-ipfs-util" ) func TestGetWhenKeyNotPresent(t *testing.T) { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 5c2366207b..7dd0bbe9fa 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,11 +5,10 @@ import ( "sync/atomic" "time" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - - "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" - bloom "gx/ipfs/QmXqKGu7QzfRzFC4yd5aL9sThYx22vY163VGwmxfp5qGHk/bbloom" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + bloom "github.com/gxed/bbloom" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + metrics "github.com/ipfs/go-metrics-interface" ) // bloomCached returns a Blockstore that caches Has requests using a Bloom diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index a0385a99c4..c165eee6e4 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -1,17 +1,16 @@ package blockstore import ( + "context" "fmt" "sync" "testing" "time" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - - context "context" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" - syncds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + blocks "github.com/ipfs/go-block-format" + ds "github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-datastore/query" + syncds "github.com/ipfs/go-datastore/sync" ) func testBloomCached(ctx context.Context, bs Blockstore) (*bloomcache, error) { diff --git a/blockstore/caching.go b/blockstore/caching.go index 5d6f3bc85c..798b84ce2b 100644 --- a/blockstore/caching.go +++ b/blockstore/caching.go @@ -1,11 +1,10 @@ package blockstore import ( + "context" "errors" - context "context" - - "gx/ipfs/QmRg1gKTHzc3CZXSKzem8aR4E3TubFhbgXwfVuWnSK5CC5/go-metrics-interface" + metrics "github.com/ipfs/go-metrics-interface" ) // CacheOpts wraps options for CachedBlockStore(). diff --git a/blockstore/util/remove.go b/blockstore/util/remove.go deleted file mode 100644 index 0ce2b3feab..0000000000 --- a/blockstore/util/remove.go +++ /dev/null @@ -1,113 +0,0 @@ -// Package blockstoreutil provides utility functions for Blockstores. -package blockstoreutil - -import ( - "fmt" - "io" - - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - - bs "github.com/ipfs/go-ipfs/blocks/blockstore" - "github.com/ipfs/go-ipfs/pin" -) - -// RemovedBlock is used to respresent the result of removing a block. -// If a block was removed successfully than the Error string will be -// empty. If a block could not be removed than Error will contain the -// reason the block could not be removed. If the removal was aborted -// due to a fatal error Hash will be be empty, Error will contain the -// reason, and no more results will be sent. -type RemovedBlock struct { - Hash string `json:",omitempty"` - Error string `json:",omitempty"` -} - -// RmBlocksOpts is used to wrap options for RmBlocks(). -type RmBlocksOpts struct { - Prefix string - Quiet bool - Force bool -} - -// RmBlocks removes the blocks provided in the cids slice. -// It returns a channel where objects of type RemovedBlock are placed, when -// not using the Quiet option. Block removal is asynchronous and will -// skip any pinned blocks. -func RmBlocks(blocks bs.GCBlockstore, pins pin.Pinner, cids []*cid.Cid, opts RmBlocksOpts) (<-chan interface{}, error) { - // make the channel large enough to hold any result to avoid - // blocking while holding the GCLock - out := make(chan interface{}, len(cids)) - go func() { - defer close(out) - - unlocker := blocks.GCLock() - defer unlocker.Unlock() - - stillOkay := FilterPinned(pins, out, cids) - - for _, c := range stillOkay { - err := blocks.DeleteBlock(c) - if err != nil && opts.Force && (err == bs.ErrNotFound || err == ds.ErrNotFound) { - // ignore non-existent blocks - } else if err != nil { - out <- &RemovedBlock{Hash: c.String(), Error: err.Error()} - } else if !opts.Quiet { - out <- &RemovedBlock{Hash: c.String()} - } - } - }() - return out, nil -} - -// FilterPinned takes a slice of Cids and returns it with the pinned Cids -// removed. If a Cid is pinned, it will place RemovedBlock objects in the given -// out channel, with an error which indicates that the Cid is pinned. -// This function is used in RmBlocks to filter out any blocks which are not -// to be removed (because they are pinned). -func FilterPinned(pins pin.Pinner, out chan<- interface{}, cids []*cid.Cid) []*cid.Cid { - stillOkay := make([]*cid.Cid, 0, len(cids)) - res, err := pins.CheckIfPinned(cids...) - if err != nil { - out <- &RemovedBlock{Error: fmt.Sprintf("pin check failed: %s", err)} - return nil - } - for _, r := range res { - if !r.Pinned() { - stillOkay = append(stillOkay, r.Key) - } else { - out <- &RemovedBlock{ - Hash: r.Key.String(), - Error: r.String(), - } - } - } - return stillOkay -} - -// ProcRmOutput takes a function which returns a result from RmBlocks or EOF if there is no input. -// It then writes to stdout/stderr according to the RemovedBlock object returned from the function. -func ProcRmOutput(next func() (interface{}, error), sout io.Writer, serr io.Writer) error { - someFailed := false - for { - res, err := next() - if err == io.EOF { - break - } else if err != nil { - return err - } - r := res.(*RemovedBlock) - if r.Hash == "" && r.Error != "" { - return fmt.Errorf("aborted: %s", r.Error) - } else if r.Error != "" { - someFailed = true - fmt.Fprintf(serr, "cannot remove %s: %s\n", r.Hash, r.Error) - } else { - fmt.Fprintf(sout, "removed %s\n", r.Hash) - } - } - if someFailed { - return fmt.Errorf("some blocks not removed") - } - return nil -} From 62f6f6d28517b253f2abc2a09dee8d78466b11ba Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 18:03:41 +0100 Subject: [PATCH 1938/3147] Extract blocks/blockstore package to go-ipfs-blockstore This extracts the blocks/blockstore package and renames the blocks/blockstore/util package to /blocks/blockstoreutil (because util depends on Pin and I don't plan to extract Pin and its depedencies). The history of blocks/blockstore has been preserved. It has been gx'ed and imported. Imports have been rewritten accordingly and re-ordered. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@993a75e9d0e6ee747da14aca145ab7a3640dfe81 --- blockservice/blockservice.go | 2 +- blockservice/blockservice_test.go | 4 ++-- blockservice/test/blocks_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index fb8144d884..a016a777d7 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -9,11 +9,11 @@ import ( "fmt" "io" - "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index c7ed02dc01..6407949c74 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,13 +3,13 @@ package blockservice import ( "testing" - "github.com/ipfs/go-ipfs/blocks/blockstore" butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 3ff25366cb..44d4d3ca0f 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -7,15 +7,15 @@ import ( "testing" "time" - blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" . "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) func newObject(data []byte) blocks.Block { From 3ce59956f5fd3011a251220be832055d783c51ae Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 18:03:41 +0100 Subject: [PATCH 1939/3147] Extract blocks/blockstore package to go-ipfs-blockstore This extracts the blocks/blockstore package and renames the blocks/blockstore/util package to /blocks/blockstoreutil (because util depends on Pin and I don't plan to extract Pin and its depedencies). The history of blocks/blockstore has been preserved. It has been gx'ed and imported. Imports have been rewritten accordingly and re-ordered. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@28826e121688b8729f16f9a458beda7c01ad45dd --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 1ed5f16723..c665e355e1 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" - bstore "github.com/ipfs/go-ipfs/blocks/blockstore" bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" @@ -14,6 +13,7 @@ import ( dstore "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + bstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index c0137a0d34..874689dd8b 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,14 +5,14 @@ import ( "testing" "time" - "github.com/ipfs/go-ipfs/blocks/blockstore" bs "github.com/ipfs/go-ipfs/blockservice" "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" - "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 0eab73b354..e058067884 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,13 +5,13 @@ import ( "encoding/binary" "testing" - blockstore "github.com/ipfs/go-ipfs/blocks/blockstore" bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) From 7f0542a51f224c24896e8e3235cc9ac2523532da Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 18:03:41 +0100 Subject: [PATCH 1940/3147] Extract blocks/blockstore package to go-ipfs-blockstore This extracts the blocks/blockstore package and renames the blocks/blockstore/util package to /blocks/blockstoreutil (because util depends on Pin and I don't plan to extract Pin and its depedencies). The history of blocks/blockstore has been preserved. It has been gx'ed and imported. Imports have been rewritten accordingly and re-ordered. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@362efc4892194e896249a3bcd21a9cb63d12777c --- mfs/mfs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 8a1f9ccf27..d7124bdf10 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,7 +14,6 @@ import ( "testing" "time" - bstore "github.com/ipfs/go-ipfs/blocks/blockstore" bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" importer "github.com/ipfs/go-ipfs/importer" @@ -26,6 +25,7 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + bstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" From 28266fef50774305bde6426f3e4a4e79e034080b Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 18:03:41 +0100 Subject: [PATCH 1941/3147] Extract blocks/blockstore package to go-ipfs-blockstore This extracts the blocks/blockstore package and renames the blocks/blockstore/util package to /blocks/blockstoreutil (because util depends on Pin and I don't plan to extract Pin and its depedencies). The history of blocks/blockstore has been preserved. It has been gx'ed and imported. Imports have been rewritten accordingly and re-ordered. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@9eab397f590adef739bce3093aaeb0f6e96e97d1 --- filestore/filestore.go | 3 +-- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 2 +- filestore/util.go | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 69fb720140..f781d5262f 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -10,10 +10,9 @@ package filestore import ( "context" - "github.com/ipfs/go-ipfs/blocks/blockstore" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 883df0d769..6b4065471f 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,11 +7,11 @@ import ( "math/rand" "testing" - "github.com/ipfs/go-ipfs/blocks/blockstore" dag "github.com/ipfs/go-ipfs/merkledag" - posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 0f08771bf4..84a02d4262 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -7,13 +7,13 @@ import ( "os" "path/filepath" - "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" diff --git a/filestore/util.go b/filestore/util.go index 98463271ca..f923ec5635 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -4,11 +4,11 @@ import ( "fmt" "sort" - "github.com/ipfs/go-ipfs/blocks/blockstore" pb "github.com/ipfs/go-ipfs/filestore/pb" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) From 8ece45053a9e89f3b859926f6b92e935b19fd419 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 18:03:41 +0100 Subject: [PATCH 1942/3147] Extract blocks/blockstore package to go-ipfs-blockstore This extracts the blocks/blockstore package and renames the blocks/blockstore/util package to /blocks/blockstoreutil (because util depends on Pin and I don't plan to extract Pin and its depedencies). The history of blocks/blockstore has been preserved. It has been gx'ed and imported. Imports have been rewritten accordingly and re-ordered. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-exchange-offline@a259bbeff3771a15308e9ff969110bfbb745cb54 --- exchange/offline/offline.go | 4 ++-- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 35c38887f3..4ed7d7dc3f 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -5,11 +5,11 @@ package offline import ( "context" - "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 5bc2926c10..6535cd6398 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -4,14 +4,14 @@ import ( "context" "testing" - "github.com/ipfs/go-ipfs/blocks/blockstore" "github.com/ipfs/go-ipfs/blocks/blocksutil" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" ds_sync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) func TestBlockReturnsErr(t *testing.T) { From ea900e4b6bd0ca65325a30c7f473e2b3db109611 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 21:11:21 +0100 Subject: [PATCH 1943/3147] Add exchange.SessionExchange interface for exchanges that support sessions. Blockservice has an explicit dependency on bitswap so it can call NewSession. It should rely on the exchange interfaces though, not on specific implementations. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@649e876d72284c90d6346b16921b061406f22dd7 --- blockservice/blockservice.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index fb8144d884..c4bedb7acd 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,7 +11,6 @@ import ( "github.com/ipfs/go-ipfs/blocks/blockstore" exchange "github.com/ipfs/go-ipfs/exchange" - bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" @@ -107,19 +106,22 @@ func (s *blockService) Exchange() exchange.Interface { return s.exchange } -// NewSession creates a bitswap session that allows for controlled exchange of -// wantlists to decrease the bandwidth overhead. +// NewSession creates a new session that allows for +// controlled exchange of wantlists to decrease the bandwidth overhead. +// If the current exchange is a SessionExchange, a new exchange +// session will be created. Otherwise, the current exchange will be used +// directly. func NewSession(ctx context.Context, bs BlockService) *Session { - exchange := bs.Exchange() - if bswap, ok := exchange.(*bitswap.Bitswap); ok { - ses := bswap.NewSession(ctx) + exch := bs.Exchange() + if sessEx, ok := exch.(exchange.SessionExchange); ok { + ses := sessEx.NewSession(ctx) return &Session{ ses: ses, bs: bs.Blockstore(), } } return &Session{ - ses: exchange, + ses: exch, bs: bs.Blockstore(), } } From 4851ffc75b5cefadbd58e7c3830e0076b51a22e8 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 15 Feb 2018 21:11:21 +0100 Subject: [PATCH 1944/3147] Add exchange.SessionExchange interface for exchanges that support sessions. Blockservice has an explicit dependency on bitswap so it can call NewSession. It should rely on the exchange interfaces though, not on specific implementations. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-exchange-interface@c4b9a06e0ac8dc92b3f7676e2f077ec786268504 --- exchange/interface.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index c1dd116244..e3971d06c3 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -1,4 +1,4 @@ -// package exchange defines the IPFS exchange interface +// Package exchange defines the IPFS exchange interface package exchange import ( @@ -10,8 +10,7 @@ import ( cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) -// Any type that implements exchange.Interface may be used as an IPFS block -// exchange protocol. +// Interface defines the functionality of the IPFS block exchange protocol. type Interface interface { // type Exchanger interface Fetcher @@ -30,3 +29,10 @@ type Fetcher interface { GetBlock(context.Context, *cid.Cid) (blocks.Block, error) GetBlocks(context.Context, []*cid.Cid) (<-chan blocks.Block, error) } + +// SessionExchange is an exchange.Interface which supports +// sessions. +type SessionExchange interface { + Interface + NewSession(context.Context) Interface +} From bb9ff320cb705fc8e21cab32c9bd97fe0a38adb8 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 16 Feb 2018 00:09:50 +0100 Subject: [PATCH 1945/3147] Feat: Separate "path" from "path/resolver" Currently the "path" module does two very different things: * Defines how ipfs paths look like and provides tools to parse/split etc. * Provides a resolver to resolve paths. This moves the resolver stuff to `path/resolver` and leaves the path utilities in `path`. The result is that now the IPFS `path` package just defines what a path looks like and becomes a module that can be exported/re-used without problems. Currently there are circular dependency cycles (resolve_test -> merkledag/utils, merkledag->path), which the prevent the export of merkledag itself. License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-path@4dac8e9a4520f37964e9b649dabf66af2687c918 --- path/path.go | 33 +++++++++++++++++++-- path/{ => resolver}/resolver.go | 43 ++++++---------------------- path/{ => resolver}/resolver_test.go | 5 ++-- 3 files changed, 43 insertions(+), 38 deletions(-) rename path/{ => resolver}/resolver.go (83%) rename path/{ => resolver}/resolver_test.go (92%) diff --git a/path/path.go b/path/path.go index aeaeb5c7a2..924aa5dc10 100644 --- a/path/path.go +++ b/path/path.go @@ -9,8 +9,15 @@ import ( cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) -// ErrBadPath is returned when a given path is incorrectly formatted -var ErrBadPath = errors.New("invalid 'ipfs ref' path") +var ( + // ErrBadPath is returned when a given path is incorrectly formatted + ErrBadPath = errors.New("invalid 'ipfs ref' path") + + // ErrNoComponents is used when Paths after a protocol + // do not contain at least one component + ErrNoComponents = errors.New( + "path must contain at least one component") +) // A Path represents an ipfs content path: // * //path/to/file @@ -149,3 +156,25 @@ func Join(pths []string) string { func SplitList(pth string) []string { return strings.Split(pth, "/") } + +// SplitAbsPath clean up and split fpath. It extracts the first component (which +// must be a Multihash) and return it separately. +func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { + parts := fpath.Segments() + if parts[0] == "ipfs" { + parts = parts[1:] + } + + // if nothing, bail. + if len(parts) == 0 { + return nil, nil, ErrNoComponents + } + + c, err := cid.Decode(parts[0]) + // first element in the path is a cid + if err != nil { + return nil, nil, err + } + + return c, parts[1:], nil +} diff --git a/path/resolver.go b/path/resolver/resolver.go similarity index 83% rename from path/resolver.go rename to path/resolver/resolver.go index 64bdbf7525..203fe9ce95 100644 --- a/path/resolver.go +++ b/path/resolver/resolver.go @@ -1,5 +1,5 @@ -// Package path implements utilities for resolving paths within ipfs. -package path +// Package resolver implements utilities for resolving paths within ipfs. +package resolver import ( "context" @@ -8,13 +8,14 @@ import ( "time" dag "github.com/ipfs/go-ipfs/merkledag" + path "github.com/ipfs/go-ipfs/path" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) -var log = logging.Logger("path") +var log = logging.Logger("pathresolv") // ErrNoComponents is used when Paths after a protocol // do not contain at least one component @@ -51,36 +52,10 @@ func NewBasicResolver(ds ipld.DAGService) *Resolver { } } -// SplitAbsPath clean up and split fpath. It extracts the first component (which -// must be a Multihash) and return it separately. -func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { - - log.Debugf("Resolve: '%s'", fpath) - - parts := fpath.Segments() - if parts[0] == "ipfs" { - parts = parts[1:] - } - - // if nothing, bail. - if len(parts) == 0 { - return nil, nil, ErrNoComponents - } - - c, err := cid.Decode(parts[0]) - // first element in the path is a cid - if err != nil { - log.Debug("given path element is not a cid.\n") - return nil, nil, err - } - - return c, parts[1:], nil -} - // ResolveToLastNode walks the given path and returns the ipld.Node // referenced by the last element in it. -func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (ipld.Node, []string, error) { - c, p, err := SplitAbsPath(fpath) +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld.Node, []string, error) { + c, p, err := path.SplitAbsPath(fpath) if err != nil { return nil, nil, err } @@ -114,7 +89,7 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (ipld.Node // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents. -func (r *Resolver) ResolvePath(ctx context.Context, fpath Path) (ipld.Node, error) { +func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, error) { // validate path if err := fpath.IsValid(); err != nil { return nil, err @@ -136,11 +111,11 @@ func ResolveSingle(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links, with ResolveLinks. -func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath Path) ([]ipld.Node, error) { +func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) defer evt.Done() - h, parts, err := SplitAbsPath(fpath) + h, parts, err := path.SplitAbsPath(fpath) if err != nil { evt.Append(logging.LoggableMap{"error": err.Error()}) return nil, err diff --git a/path/resolver_test.go b/path/resolver/resolver_test.go similarity index 92% rename from path/resolver_test.go rename to path/resolver/resolver_test.go index d741bbcf1e..79a857cb6c 100644 --- a/path/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -1,4 +1,4 @@ -package path_test +package resolver_test import ( "context" @@ -8,6 +8,7 @@ import ( merkledag "github.com/ipfs/go-ipfs/merkledag" dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" + "github.com/ipfs/go-ipfs/path/resolver" util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" @@ -53,7 +54,7 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - resolver := path.NewBasicResolver(dagService) + resolver := resolver.NewBasicResolver(dagService) node, err := resolver.ResolvePath(ctx, p) if err != nil { t.Fatal(err) From e6484bcbc01de843df102d60f3ab06c3482815c5 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 23 Feb 2018 11:47:30 -0500 Subject: [PATCH 1946/3147] Add options for record count and timeout for resolving DHT paths License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@c488b3da68614c23a00f9a1a5eea31f43b458361 --- namesys/base.go | 7 +++-- namesys/dns.go | 11 ++----- namesys/interface.go | 13 ++------ namesys/ipns_validate_test.go | 31 +++++++++++++------ namesys/namesys.go | 19 +++++------- namesys/namesys_test.go | 8 +++-- namesys/opts.go | 29 ++++++++++++++++++ namesys/proquint.go | 11 ++----- namesys/pubsub.go | 11 ++----- namesys/pubsub_test.go | 4 +-- namesys/republisher/repub_test.go | 4 +-- namesys/resolve_test.go | 4 +-- namesys/routing.go | 49 +++++++++++++++++++++++++------ 13 files changed, 124 insertions(+), 77 deletions(-) create mode 100644 namesys/opts.go diff --git a/namesys/base.go b/namesys/base.go index 9953eddc58..574de9b7a2 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -10,13 +10,14 @@ import ( type resolver interface { // resolveOnce looks up a name once (without recursion). - resolveOnce(ctx context.Context, name string) (value path.Path, err error) + resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (value path.Path, err error) } // resolve is a helper for implementing Resolver.ResolveN using resolveOnce. -func resolve(ctx context.Context, r resolver, name string, depth int, prefixes ...string) (path.Path, error) { +func resolve(ctx context.Context, r resolver, name string, opts *ResolveOpts, prefixes ...string) (path.Path, error) { + depth := opts.Depth for { - p, err := r.resolveOnce(ctx, name) + p, err := r.resolveOnce(ctx, name, opts) if err != nil { return "", err } diff --git a/namesys/dns.go b/namesys/dns.go index de5c98fdbe..c58f0ea249 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -31,13 +31,8 @@ func newDNSResolver() resolver { } // Resolve implements Resolver. -func (r *DNSResolver) Resolve(ctx context.Context, name string) (path.Path, error) { - return r.ResolveN(ctx, name, DefaultDepthLimit) -} - -// ResolveN implements Resolver. -func (r *DNSResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { - return resolve(ctx, r, name, depth, "/ipns/") +func (r *DNSResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { + return resolve(ctx, r, name, opts, "/ipns/") } type lookupRes struct { @@ -48,7 +43,7 @@ type lookupRes struct { // resolveOnce implements resolver. // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { +func (r *DNSResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { segments := strings.SplitN(name, "/", 2) domain := segments[0] diff --git a/namesys/interface.go b/namesys/interface.go index 8097ac6162..8ad84e57fd 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -89,17 +89,8 @@ type Resolver interface { // // There is a default depth-limit to avoid infinite recursion. Most // users will be fine with this default limit, but if you need to - // adjust the limit you can use ResolveN. - Resolve(ctx context.Context, name string) (value path.Path, err error) - - // ResolveN performs a recursive lookup, returning the dereferenced - // path. The only difference from Resolve is that the depth limit - // is configurable. You can use DefaultDepthLimit, UnlimitedDepth, - // or a depth limit of your own choosing. - // - // Most users should use Resolve, since the default limit works well - // in most real-world situations. - ResolveN(ctx context.Context, name string, depth int) (value path.Path, err error) + // adjust the limit you can specify it as an option. + Resolve(ctx context.Context, name string, opts *ResolveOpts) (value path.Path, err error) } // Publisher is an object capable of publishing particular names. diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 559a1b78af..7e3c285bc4 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -115,7 +115,7 @@ func TestResolverValidation(t *testing.T) { } // Resolve entry - resp, err := resolver.resolveOnce(ctx, id.Pretty()) + resp, err := resolver.resolveOnce(ctx, id.Pretty(), DefaultResolveOpts()) if err != nil { t.Fatal(err) } @@ -136,9 +136,9 @@ func TestResolverValidation(t *testing.T) { } // Record should fail validation because entry is expired - _, err = resolver.resolveOnce(ctx, id.Pretty()) - if err != ErrExpiredRecord { - t.Fatal("ValidateIpnsRecord should have returned ErrExpiredRecord") + _, err = resolver.resolveOnce(ctx, id.Pretty(), DefaultResolveOpts()) + if err == nil { + t.Fatal("ValidateIpnsRecord should have returned error") } // Create IPNS record path with a different private key @@ -158,8 +158,8 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key defined by // ipns path doesn't match record signature - _, err = resolver.resolveOnce(ctx, id2.Pretty()) - if err != ErrSignature { + _, err = resolver.resolveOnce(ctx, id2.Pretty(), DefaultResolveOpts()) + if err == nil { t.Fatal("ValidateIpnsRecord should have failed signature verification") } @@ -176,7 +176,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key is not available // in peer store or on network - _, err = resolver.resolveOnce(ctx, id3.Pretty()) + _, err = resolver.resolveOnce(ctx, id3.Pretty(), DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have failed because public key was not found") } @@ -191,7 +191,7 @@ func TestResolverValidation(t *testing.T) { // public key is available in the peer store by looking it up in // the DHT, which causes the DHT to fetch it and cache it in the // peer store - _, err = resolver.resolveOnce(ctx, id3.Pretty()) + _, err = resolver.resolveOnce(ctx, id3.Pretty(), DefaultResolveOpts()) if err != nil { t.Fatal(err) } @@ -263,7 +263,20 @@ func (m *mockValueStore) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey } func (m *mockValueStore) GetValues(ctx context.Context, k string, count int) ([]routing.RecvdVal, error) { - return m.r.GetValues(ctx, k, count) + vals, err := m.r.GetValues(ctx, k, count) + if err != nil { + return nil, err + } + valid := make([]routing.RecvdVal, 0, len(vals)) + for _, v := range vals { + rec := new(recordpb.Record) + rec.Key = proto.String(k) + rec.Value = v.Val + if err = m.Validator.VerifyRecord(rec); err == nil { + valid = append(valid, v) + } + } + return valid, nil } func (m *mockValueStore) PutValue(ctx context.Context, k string, d []byte) error { diff --git a/namesys/namesys.go b/namesys/namesys.go index c654923608..0a9cb52834 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -67,12 +67,7 @@ func AddPubsubNameSystem(ctx context.Context, ns NameSystem, host p2phost.Host, const DefaultResolverCacheTTL = time.Minute // Resolve implements Resolver. -func (ns *mpns) Resolve(ctx context.Context, name string) (path.Path, error) { - return ns.ResolveN(ctx, name, DefaultDepthLimit) -} - -// ResolveN implements Resolver. -func (ns *mpns) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { +func (ns *mpns) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { if strings.HasPrefix(name, "/ipfs/") { return path.ParsePath(name) } @@ -81,11 +76,11 @@ func (ns *mpns) ResolveN(ctx context.Context, name string, depth int) (path.Path return path.ParsePath("/ipfs/" + name) } - return resolve(ctx, ns, name, depth, "/ipns/") + return resolve(ctx, ns, name, opts, "/ipns/") } // resolveOnce implements resolver. -func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) { +func (ns *mpns) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { if !strings.HasPrefix(name, "/ipns/") { name = "/ipns/" + name } @@ -114,7 +109,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) if err == nil { res, ok := ns.resolvers["pubsub"] if ok { - p, err := res.resolveOnce(ctx, key) + p, err := res.resolveOnce(ctx, key, opts) if err == nil { return makePath(p) } @@ -122,7 +117,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) res, ok = ns.resolvers["dht"] if ok { - p, err := res.resolveOnce(ctx, key) + p, err := res.resolveOnce(ctx, key, opts) if err == nil { return makePath(p) } @@ -134,7 +129,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) if isd.IsDomain(key) { res, ok := ns.resolvers["dns"] if ok { - p, err := res.resolveOnce(ctx, key) + p, err := res.resolveOnce(ctx, key, opts) if err == nil { return makePath(p) } @@ -145,7 +140,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) res, ok := ns.resolvers["proquint"] if ok { - p, err := res.resolveOnce(ctx, key) + p, err := res.resolveOnce(ctx, key, opts) if err == nil { return makePath(p) } diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index e4f7af196d..59d544fd88 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -19,8 +19,10 @@ type mockResolver struct { entries map[string]string } -func testResolution(t *testing.T, resolver Resolver, name string, depth int, expected string, expError error) { - p, err := resolver.ResolveN(context.Background(), name, depth) +func testResolution(t *testing.T, resolver Resolver, name string, depth uint, expected string, expError error) { + opts := DefaultResolveOpts() + opts.Depth = depth + p, err := resolver.Resolve(context.Background(), name, opts) if err != expError { t.Fatal(fmt.Errorf( "Expected %s with a depth of %d to have a '%s' error, but got '%s'", @@ -33,7 +35,7 @@ func testResolution(t *testing.T, resolver Resolver, name string, depth int, exp } } -func (r *mockResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { +func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { return path.ParsePath(r.entries[name]) } diff --git a/namesys/opts.go b/namesys/opts.go new file mode 100644 index 0000000000..2807eecef4 --- /dev/null +++ b/namesys/opts.go @@ -0,0 +1,29 @@ +package namesys + +import ( + "time" +) + +// ResolveOpts specifies options for resolving an IPNS path +type ResolveOpts struct { + // Recursion depth limit + Depth uint + // The number of IPNS records to retrieve from the DHT + // (the best record is selected from this set) + DhtRecordCount uint + // The amount of time to wait for DHT records to be fetched + // and verified. A zero value indicates that there is no explicit + // timeout (although there is an implicit timeout due to dial + // timeouts within the DHT) + DhtTimeout time.Duration +} + +// DefaultResolveOpts returns the default options for resolving +// an IPNS path +func DefaultResolveOpts() *ResolveOpts { + return &ResolveOpts{ + Depth: DefaultDepthLimit, + DhtRecordCount: 16, + DhtTimeout: time.Minute, + } +} diff --git a/namesys/proquint.go b/namesys/proquint.go index 3a842f97ae..48cb4013d7 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -12,17 +12,12 @@ import ( type ProquintResolver struct{} // Resolve implements Resolver. -func (r *ProquintResolver) Resolve(ctx context.Context, name string) (path.Path, error) { - return r.ResolveN(ctx, name, DefaultDepthLimit) -} - -// ResolveN implements Resolver. -func (r *ProquintResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { - return resolve(ctx, r, name, depth, "/ipns/") +func (r *ProquintResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { + return resolve(ctx, r, name, opts, "/ipns/") } // resolveOnce implements resolver. Decodes the proquint string. -func (r *ProquintResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { +func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { ok, err := proquint.IsProquint(name) if err != nil || !ok { return "", errors.New("not a valid proquint string") diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 20052cd78b..856d0ff70b 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -185,16 +185,11 @@ func (p *PubsubPublisher) publishRecord(ctx context.Context, k ci.PrivKey, value } // Resolve resolves a name through pubsub and default depth limit -func (r *PubsubResolver) Resolve(ctx context.Context, name string) (path.Path, error) { - return r.ResolveN(ctx, name, DefaultDepthLimit) +func (r *PubsubResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { + return resolve(ctx, r, name, opts, "/ipns/") } -// ResolveN resolves a name through pubsub with the specified depth limit -func (r *PubsubResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { - return resolve(ctx, r, name, depth, "/ipns/") -} - -func (r *PubsubResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { +func (r *PubsubResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { log.Debugf("PubsubResolve: resolve '%s'", name) // retrieve the public key once (for verifying messages) diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index e2cf15b5d9..1d9873ccd2 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -180,14 +180,14 @@ func TestPubsubPublishSubscribe(t *testing.T) { } func checkResolveNotFound(ctx context.Context, t *testing.T, i int, resolver Resolver, name string) { - _, err := resolver.Resolve(ctx, name) + _, err := resolver.Resolve(ctx, name, DefaultResolveOpts()) if err != ErrResolveFailed { t.Fatalf("[resolver %d] unexpected error: %s", i, err.Error()) } } func checkResolve(ctx context.Context, t *testing.T, i int, resolver Resolver, name string, val path.Path) { - xval, err := resolver.Resolve(ctx, name) + xval, err := resolver.Resolve(ctx, name, DefaultResolveOpts()) if err != nil { t.Fatalf("[resolver %d] resolve failed: %s", i, err.Error()) } diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 580b708de7..3b20a9a53c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -98,7 +98,7 @@ func verifyResolution(nodes []*core.IpfsNode, key string, exp path.Path) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() for _, n := range nodes { - val, err := n.Namesys.Resolve(ctx, key) + val, err := n.Namesys.Resolve(ctx, key, namesys.DefaultResolveOpts()) if err != nil { return err } @@ -114,7 +114,7 @@ func verifyResolutionFails(nodes []*core.IpfsNode, key string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() for _, n := range nodes { - _, err := n.Namesys.Resolve(ctx, key) + _, err := n.Namesys.Resolve(ctx, key, namesys.DefaultResolveOpts()) if err == nil { return errors.New("expected resolution to fail") } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index a55d5a4d4f..28e9c80bb6 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -40,7 +40,7 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - res, err := resolver.Resolve(context.Background(), pid.Pretty()) + res, err := resolver.Resolve(context.Background(), pid.Pretty(), DefaultResolveOpts()) if err != nil { t.Fatal(err) } @@ -125,7 +125,7 @@ func TestPrexistingRecord(t *testing.T) { } func verifyCanResolve(r Resolver, name string, exp path.Path) error { - res, err := r.Resolve(context.Background(), name) + res, err := r.Resolve(context.Background(), name, DefaultResolveOpts()) if err != nil { return err } diff --git a/namesys/routing.go b/namesys/routing.go index effb3fa015..ca87292d7b 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -104,24 +104,26 @@ func NewRoutingResolver(route routing.ValueStore, cachesize int) *routingResolve } // Resolve implements Resolver. -func (r *routingResolver) Resolve(ctx context.Context, name string) (path.Path, error) { - return r.ResolveN(ctx, name, DefaultDepthLimit) -} - -// ResolveN implements Resolver. -func (r *routingResolver) ResolveN(ctx context.Context, name string, depth int) (path.Path, error) { - return resolve(ctx, r, name, depth, "/ipns/") +func (r *routingResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { + return resolve(ctx, r, name, opts, "/ipns/") } // resolveOnce implements resolver. Uses the IPFS routing system to // resolve SFS-like names. -func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) { +func (r *routingResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { log.Debugf("RoutingResolver resolving %s", name) cached, ok := r.cacheGet(name) if ok { return cached, nil } + if opts.DhtTimeout != 0 { + // Resolution must complete within the timeout + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, opts.DhtTimeout) + defer cancel() + } + name = strings.TrimPrefix(name, "/ipns/") hash, err := mh.FromB58String(name) if err != nil { @@ -151,7 +153,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa // Note that the DHT will call the ipns validator when retrieving // the value, which in turn verifies the ipns record signature _, ipnsKey := IpnsKeysForID(pid) - val, err := r.routing.GetValue(ctx, ipnsKey) + val, err := r.getValue(ctx, ipnsKey, opts) if err != nil { log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) return "", err @@ -184,6 +186,35 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa } } +func (r *routingResolver) getValue(ctx context.Context, ipnsKey string, opts *ResolveOpts) ([]byte, error) { + // Get specified number of values from the DHT + vals, err := r.routing.GetValues(ctx, ipnsKey, int(opts.DhtRecordCount)) + if err != nil { + return nil, err + } + + // Select the best value + recs := make([][]byte, 0, len(vals)) + for _, v := range vals { + if v.Val != nil { + recs = append(recs, v.Val) + } + } + + i, err := IpnsSelectorFunc(ipnsKey, recs) + if err != nil { + return nil, err + } + + best := recs[i] + if best == nil { + log.Errorf("GetValues %s yielded record with nil value", ipnsKey) + return nil, routing.ErrNotFound + } + + return best, nil +} + func checkEOL(e *pb.IpnsEntry) (time.Time, bool) { if e.GetValidityType() == pb.IpnsEntry_EOL { eol, err := u.ParseRFC3339(string(e.GetValidity())) From c736a67e3b561a8a63df741cc976ef407af1ca22 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 26 Feb 2018 10:27:06 -0800 Subject: [PATCH 1947/3147] remove a spurious debug message License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@46ed36bea8fddedb806dafeeba3ca6a916d6bd08 --- namesys/republisher/repub.go | 1 - 1 file changed, 1 deletion(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 7bb54fcd4c..ae8c5e8d1a 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -138,7 +138,6 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro eol := time.Now().Add(rp.RecordLifetime) err = namesys.PutRecordToRouting(ctx, priv, p, seq, eol, rp.r, id) if err != nil { - println("put record to routing error: " + err.Error()) return err } From 73a4a60693d3a9baad33ddb60e437c3aec396625 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 27 Feb 2018 20:38:49 +0100 Subject: [PATCH 1948/3147] fix with newer go-libp2p-record This commit was moved from ipfs/go-ipfs-routing@a60359e9107664fd2380211544160f35be180f7a --- routing/offline/offline.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 7384c6d79d..f008e25292 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -42,10 +42,7 @@ type offlineRouting struct { } func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte) error { - rec, err := record.MakePutRecord(c.sk, key, val, false) - if err != nil { - return err - } + rec := record.MakePutRecord(key, val) data, err := proto.Marshal(rec) if err != nil { return err From cd0aeff717b341b50b959af9123077cf5098bac1 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 28 Feb 2018 16:57:24 -0500 Subject: [PATCH 1949/3147] Use variadic options License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@2e2974541ea1a61d97d1712705758dfd80690d5f --- namesys/base.go | 9 ++-- namesys/dns.go | 7 ++-- namesys/dns_test.go | 38 +++++++++-------- namesys/interface.go | 14 +------ namesys/ipns_validate_test.go | 11 ++--- namesys/namesys.go | 15 +++---- namesys/namesys_test.go | 17 ++++---- namesys/opts.go | 29 ------------- namesys/opts/opts.go | 68 +++++++++++++++++++++++++++++++ namesys/proquint.go | 7 ++-- namesys/pubsub.go | 7 ++-- namesys/pubsub_test.go | 4 +- namesys/republisher/repub_test.go | 4 +- namesys/resolve_test.go | 4 +- namesys/routing.go | 17 ++++---- 15 files changed, 144 insertions(+), 107 deletions(-) delete mode 100644 namesys/opts.go create mode 100644 namesys/opts/opts.go diff --git a/namesys/base.go b/namesys/base.go index 574de9b7a2..a301a5a612 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,19 +5,20 @@ import ( context "context" + opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" ) type resolver interface { // resolveOnce looks up a name once (without recursion). - resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (value path.Path, err error) + resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (value path.Path, err error) } // resolve is a helper for implementing Resolver.ResolveN using resolveOnce. -func resolve(ctx context.Context, r resolver, name string, opts *ResolveOpts, prefixes ...string) (path.Path, error) { - depth := opts.Depth +func resolve(ctx context.Context, r resolver, name string, options *opts.ResolveOpts, prefixes ...string) (path.Path, error) { + depth := options.Depth for { - p, err := r.resolveOnce(ctx, name, opts) + p, err := r.resolveOnce(ctx, name, options) if err != nil { return "", err } diff --git a/namesys/dns.go b/namesys/dns.go index c58f0ea249..6d74e52216 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,6 +6,7 @@ import ( "net" "strings" + opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) @@ -31,8 +32,8 @@ func newDNSResolver() resolver { } // Resolve implements Resolver. -func (r *DNSResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { - return resolve(ctx, r, name, opts, "/ipns/") +func (r *DNSResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { + return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } type lookupRes struct { @@ -43,7 +44,7 @@ type lookupRes struct { // resolveOnce implements resolver. // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { +func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { segments := strings.SplitN(name, "/", 2) domain := segments[0] diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 9b11845ac1..1a3110c9bc 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -3,6 +3,8 @@ package namesys import ( "fmt" "testing" + + opts "github.com/ipfs/go-ipfs/namesys/opts" ) type mockDNS struct { @@ -128,33 +130,33 @@ func newMockDNS() *mockDNS { func TestDNSResolution(t *testing.T) { mock := newMockDNS() r := &DNSResolver{lookupTXT: mock.lookupTXT} - testResolution(t, r, "multihash.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) - testResolution(t, r, "ipfs.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) - testResolution(t, r, "dipfs.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) - testResolution(t, r, "dns1.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "multihash.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "ipfs.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "dipfs.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "dns1.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "dns1.example.com", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) - testResolution(t, r, "dns2.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "dns2.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "dns2.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion) testResolution(t, r, "dns2.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion) - testResolution(t, r, "multi.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "multi.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "multi.example.com", 1, "/ipns/dns1.example.com", ErrResolveRecursion) testResolution(t, r, "multi.example.com", 2, "/ipns/ipfs.example.com", ErrResolveRecursion) - testResolution(t, r, "equals.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", nil) + testResolution(t, r, "equals.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", nil) testResolution(t, r, "loop1.example.com", 1, "/ipns/loop2.example.com", ErrResolveRecursion) testResolution(t, r, "loop1.example.com", 2, "/ipns/loop1.example.com", ErrResolveRecursion) testResolution(t, r, "loop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion) - testResolution(t, r, "loop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) + testResolution(t, r, "loop1.example.com", opts.DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) testResolution(t, r, "dloop1.example.com", 1, "/ipns/loop2.example.com", ErrResolveRecursion) testResolution(t, r, "dloop1.example.com", 2, "/ipns/loop1.example.com", ErrResolveRecursion) testResolution(t, r, "dloop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion) - testResolution(t, r, "dloop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) - testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed) - testResolution(t, r, "withsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", nil) - testResolution(t, r, "withrecsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub", nil) - testResolution(t, r, "withsegment.example.com/test1", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/test1", nil) - testResolution(t, r, "withrecsegment.example.com/test2", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test2", nil) - testResolution(t, r, "withrecsegment.example.com/test3/", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test3/", nil) - testResolution(t, r, "withtrailingrec.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/", nil) - testResolution(t, r, "double.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) - testResolution(t, r, "conflict.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", nil) + testResolution(t, r, "dloop1.example.com", opts.DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion) + testResolution(t, r, "bad.example.com", opts.DefaultDepthLimit, "", ErrResolveFailed) + testResolution(t, r, "withsegment.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", nil) + testResolution(t, r, "withrecsegment.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub", nil) + testResolution(t, r, "withsegment.example.com/test1", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/test1", nil) + testResolution(t, r, "withrecsegment.example.com/test2", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test2", nil) + testResolution(t, r, "withrecsegment.example.com/test3/", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub/test3/", nil) + testResolution(t, r, "withtrailingrec.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/", nil) + testResolution(t, r, "double.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "conflict.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", nil) } diff --git a/namesys/interface.go b/namesys/interface.go index 8ad84e57fd..db2aa0a22e 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,21 +35,11 @@ import ( context "context" + opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) -const ( - // DefaultDepthLimit is the default depth limit used by Resolve. - DefaultDepthLimit = 32 - - // UnlimitedDepth allows infinite recursion in ResolveN. You - // probably don't want to use this, but it's here if you absolutely - // trust resolution to eventually complete and can't put an upper - // limit on how many steps it will take. - UnlimitedDepth = 0 -) - // ErrResolveFailed signals an error when attempting to resolve. var ErrResolveFailed = errors.New("Could not resolve name.") @@ -90,7 +80,7 @@ type Resolver interface { // There is a default depth-limit to avoid infinite recursion. Most // users will be fine with this default limit, but if you need to // adjust the limit you can specify it as an option. - Resolve(ctx context.Context, name string, opts *ResolveOpts) (value path.Path, err error) + Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (value path.Path, err error) } // Publisher is an object capable of publishing particular names. diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 7e3c285bc4..9e72b9fe53 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" @@ -115,7 +116,7 @@ func TestResolverValidation(t *testing.T) { } // Resolve entry - resp, err := resolver.resolveOnce(ctx, id.Pretty(), DefaultResolveOpts()) + resp, err := resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) if err != nil { t.Fatal(err) } @@ -136,7 +137,7 @@ func TestResolverValidation(t *testing.T) { } // Record should fail validation because entry is expired - _, err = resolver.resolveOnce(ctx, id.Pretty(), DefaultResolveOpts()) + _, err = resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have returned error") } @@ -158,7 +159,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key defined by // ipns path doesn't match record signature - _, err = resolver.resolveOnce(ctx, id2.Pretty(), DefaultResolveOpts()) + _, err = resolver.resolveOnce(ctx, id2.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have failed signature verification") } @@ -176,7 +177,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key is not available // in peer store or on network - _, err = resolver.resolveOnce(ctx, id3.Pretty(), DefaultResolveOpts()) + _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have failed because public key was not found") } @@ -191,7 +192,7 @@ func TestResolverValidation(t *testing.T) { // public key is available in the peer store by looking it up in // the DHT, which causes the DHT to fetch it and cache it in the // peer store - _, err = resolver.resolveOnce(ctx, id3.Pretty(), DefaultResolveOpts()) + _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) if err != nil { t.Fatal(err) } diff --git a/namesys/namesys.go b/namesys/namesys.go index 0a9cb52834..e47d433a38 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,6 +7,7 @@ import ( "sync" "time" + opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" @@ -67,7 +68,7 @@ func AddPubsubNameSystem(ctx context.Context, ns NameSystem, host p2phost.Host, const DefaultResolverCacheTTL = time.Minute // Resolve implements Resolver. -func (ns *mpns) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { +func (ns *mpns) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { if strings.HasPrefix(name, "/ipfs/") { return path.ParsePath(name) } @@ -76,11 +77,11 @@ func (ns *mpns) Resolve(ctx context.Context, name string, opts *ResolveOpts) (pa return path.ParsePath("/ipfs/" + name) } - return resolve(ctx, ns, name, opts, "/ipns/") + return resolve(ctx, ns, name, opts.ProcessOpts(options), "/ipns/") } // resolveOnce implements resolver. -func (ns *mpns) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { +func (ns *mpns) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { if !strings.HasPrefix(name, "/ipns/") { name = "/ipns/" + name } @@ -109,7 +110,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) if err == nil { res, ok := ns.resolvers["pubsub"] if ok { - p, err := res.resolveOnce(ctx, key, opts) + p, err := res.resolveOnce(ctx, key, options) if err == nil { return makePath(p) } @@ -117,7 +118,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) res, ok = ns.resolvers["dht"] if ok { - p, err := res.resolveOnce(ctx, key, opts) + p, err := res.resolveOnce(ctx, key, options) if err == nil { return makePath(p) } @@ -129,7 +130,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) if isd.IsDomain(key) { res, ok := ns.resolvers["dns"] if ok { - p, err := res.resolveOnce(ctx, key, opts) + p, err := res.resolveOnce(ctx, key, options) if err == nil { return makePath(p) } @@ -140,7 +141,7 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) res, ok := ns.resolvers["proquint"] if ok { - p, err := res.resolveOnce(ctx, key, opts) + p, err := res.resolveOnce(ctx, key, options) if err == nil { return makePath(p) } diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 59d544fd88..7cc4b780c2 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -6,6 +6,7 @@ import ( context "context" + opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" @@ -20,9 +21,7 @@ type mockResolver struct { } func testResolution(t *testing.T, resolver Resolver, name string, depth uint, expected string, expError error) { - opts := DefaultResolveOpts() - opts.Depth = depth - p, err := resolver.Resolve(context.Background(), name, opts) + p, err := resolver.Resolve(context.Background(), name, opts.Depth(depth)) if err != expError { t.Fatal(fmt.Errorf( "Expected %s with a depth of %d to have a '%s' error, but got '%s'", @@ -35,7 +34,7 @@ func testResolution(t *testing.T, resolver Resolver, name string, depth uint, ex } } -func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { +func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts *opts.ResolveOpts) (path.Path, error) { return path.ParsePath(r.entries[name]) } @@ -65,14 +64,14 @@ func TestNamesysResolution(t *testing.T) { }, } - testResolution(t, r, "Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) - testResolution(t, r, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) - testResolution(t, r, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", opts.DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", opts.DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", opts.DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) testResolution(t, r, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", 1, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) - testResolution(t, r, "/ipns/ipfs.io", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/ipfs.io", opts.DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) testResolution(t, r, "/ipns/ipfs.io", 1, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) testResolution(t, r, "/ipns/ipfs.io", 2, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) - testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) + testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", opts.DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 1, "/ipns/ipfs.io", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 2, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 3, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) diff --git a/namesys/opts.go b/namesys/opts.go deleted file mode 100644 index 2807eecef4..0000000000 --- a/namesys/opts.go +++ /dev/null @@ -1,29 +0,0 @@ -package namesys - -import ( - "time" -) - -// ResolveOpts specifies options for resolving an IPNS path -type ResolveOpts struct { - // Recursion depth limit - Depth uint - // The number of IPNS records to retrieve from the DHT - // (the best record is selected from this set) - DhtRecordCount uint - // The amount of time to wait for DHT records to be fetched - // and verified. A zero value indicates that there is no explicit - // timeout (although there is an implicit timeout due to dial - // timeouts within the DHT) - DhtTimeout time.Duration -} - -// DefaultResolveOpts returns the default options for resolving -// an IPNS path -func DefaultResolveOpts() *ResolveOpts { - return &ResolveOpts{ - Depth: DefaultDepthLimit, - DhtRecordCount: 16, - DhtTimeout: time.Minute, - } -} diff --git a/namesys/opts/opts.go b/namesys/opts/opts.go new file mode 100644 index 0000000000..ff7b44c518 --- /dev/null +++ b/namesys/opts/opts.go @@ -0,0 +1,68 @@ +package namesys_opts + +import ( + "time" +) + +const ( + // DefaultDepthLimit is the default depth limit used by Resolve. + DefaultDepthLimit = 32 + + // UnlimitedDepth allows infinite recursion in Resolve. You + // probably don't want to use this, but it's here if you absolutely + // trust resolution to eventually complete and can't put an upper + // limit on how many steps it will take. + UnlimitedDepth = 0 +) + +// ResolveOpts specifies options for resolving an IPNS path +type ResolveOpts struct { + // Recursion depth limit + Depth uint + // The number of IPNS records to retrieve from the DHT + // (the best record is selected from this set) + DhtRecordCount uint + // The amount of time to wait for DHT records to be fetched + // and verified. A zero value indicates that there is no explicit + // timeout (although there is an implicit timeout due to dial + // timeouts within the DHT) + DhtTimeout time.Duration +} + +// DefaultResolveOpts returns the default options for resolving +// an IPNS path +func DefaultResolveOpts() *ResolveOpts { + return &ResolveOpts{ + Depth: DefaultDepthLimit, + DhtRecordCount: 16, + DhtTimeout: time.Minute, + } +} + +type ResolveOpt func(*ResolveOpts) + +func Depth(depth uint) ResolveOpt { + return func(o *ResolveOpts) { + o.Depth = depth + } +} + +func DhtRecordCount(count uint) ResolveOpt { + return func(o *ResolveOpts) { + o.DhtRecordCount = count + } +} + +func DhtTimeout(timeout time.Duration) ResolveOpt { + return func(o *ResolveOpts) { + o.DhtTimeout = timeout + } +} + +func ProcessOpts(opts []ResolveOpt) *ResolveOpts { + rsopts := DefaultResolveOpts() + for _, option := range opts { + option(rsopts) + } + return rsopts +} diff --git a/namesys/proquint.go b/namesys/proquint.go index 48cb4013d7..2c61c98d3a 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -5,6 +5,7 @@ import ( context "context" + opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) @@ -12,12 +13,12 @@ import ( type ProquintResolver struct{} // Resolve implements Resolver. -func (r *ProquintResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { - return resolve(ctx, r, name, opts, "/ipns/") +func (r *ProquintResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { + return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } // resolveOnce implements resolver. Decodes the proquint string. -func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { +func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { ok, err := proquint.IsProquint(name) if err != nil || !ok { return "", errors.New("not a valid proquint string") diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 856d0ff70b..abbf8f0cc0 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -8,6 +8,7 @@ import ( "sync" "time" + opts "github.com/ipfs/go-ipfs/namesys/opts" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" @@ -185,11 +186,11 @@ func (p *PubsubPublisher) publishRecord(ctx context.Context, k ci.PrivKey, value } // Resolve resolves a name through pubsub and default depth limit -func (r *PubsubResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { - return resolve(ctx, r, name, opts, "/ipns/") +func (r *PubsubResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { + return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } -func (r *PubsubResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { +func (r *PubsubResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { log.Debugf("PubsubResolve: resolve '%s'", name) // retrieve the public key once (for verifying messages) diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index 1d9873ccd2..e2cf15b5d9 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -180,14 +180,14 @@ func TestPubsubPublishSubscribe(t *testing.T) { } func checkResolveNotFound(ctx context.Context, t *testing.T, i int, resolver Resolver, name string) { - _, err := resolver.Resolve(ctx, name, DefaultResolveOpts()) + _, err := resolver.Resolve(ctx, name) if err != ErrResolveFailed { t.Fatalf("[resolver %d] unexpected error: %s", i, err.Error()) } } func checkResolve(ctx context.Context, t *testing.T, i int, resolver Resolver, name string, val path.Path) { - xval, err := resolver.Resolve(ctx, name, DefaultResolveOpts()) + xval, err := resolver.Resolve(ctx, name) if err != nil { t.Fatalf("[resolver %d] resolve failed: %s", i, err.Error()) } diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 3b20a9a53c..580b708de7 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -98,7 +98,7 @@ func verifyResolution(nodes []*core.IpfsNode, key string, exp path.Path) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() for _, n := range nodes { - val, err := n.Namesys.Resolve(ctx, key, namesys.DefaultResolveOpts()) + val, err := n.Namesys.Resolve(ctx, key) if err != nil { return err } @@ -114,7 +114,7 @@ func verifyResolutionFails(nodes []*core.IpfsNode, key string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() for _, n := range nodes { - _, err := n.Namesys.Resolve(ctx, key, namesys.DefaultResolveOpts()) + _, err := n.Namesys.Resolve(ctx, key) if err == nil { return errors.New("expected resolution to fail") } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 28e9c80bb6..a55d5a4d4f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -40,7 +40,7 @@ func TestRoutingResolve(t *testing.T) { t.Fatal(err) } - res, err := resolver.Resolve(context.Background(), pid.Pretty(), DefaultResolveOpts()) + res, err := resolver.Resolve(context.Background(), pid.Pretty()) if err != nil { t.Fatal(err) } @@ -125,7 +125,7 @@ func TestPrexistingRecord(t *testing.T) { } func verifyCanResolve(r Resolver, name string, exp path.Path) error { - res, err := r.Resolve(context.Background(), name, DefaultResolveOpts()) + res, err := r.Resolve(context.Background(), name) if err != nil { return err } diff --git a/namesys/routing.go b/namesys/routing.go index ca87292d7b..29b26cdbd7 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,6 +5,7 @@ import ( "strings" "time" + opts "github.com/ipfs/go-ipfs/namesys/opts" pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" @@ -104,23 +105,23 @@ func NewRoutingResolver(route routing.ValueStore, cachesize int) *routingResolve } // Resolve implements Resolver. -func (r *routingResolver) Resolve(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { - return resolve(ctx, r, name, opts, "/ipns/") +func (r *routingResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { + return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } // resolveOnce implements resolver. Uses the IPFS routing system to // resolve SFS-like names. -func (r *routingResolver) resolveOnce(ctx context.Context, name string, opts *ResolveOpts) (path.Path, error) { +func (r *routingResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { log.Debugf("RoutingResolver resolving %s", name) cached, ok := r.cacheGet(name) if ok { return cached, nil } - if opts.DhtTimeout != 0 { + if options.DhtTimeout != 0 { // Resolution must complete within the timeout var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, opts.DhtTimeout) + ctx, cancel = context.WithTimeout(ctx, options.DhtTimeout) defer cancel() } @@ -153,7 +154,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, opts *Re // Note that the DHT will call the ipns validator when retrieving // the value, which in turn verifies the ipns record signature _, ipnsKey := IpnsKeysForID(pid) - val, err := r.getValue(ctx, ipnsKey, opts) + val, err := r.getValue(ctx, ipnsKey, options) if err != nil { log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) return "", err @@ -186,9 +187,9 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, opts *Re } } -func (r *routingResolver) getValue(ctx context.Context, ipnsKey string, opts *ResolveOpts) ([]byte, error) { +func (r *routingResolver) getValue(ctx context.Context, ipnsKey string, options *opts.ResolveOpts) ([]byte, error) { // Get specified number of values from the DHT - vals, err := r.routing.GetValues(ctx, ipnsKey, int(opts.DhtRecordCount)) + vals, err := r.routing.GetValues(ctx, ipnsKey, int(options.DhtRecordCount)) if err != nil { return nil, err } From 709dc3c7e131c62f9e35615919792a0265b4d0ff Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 28 Feb 2018 17:06:31 -0500 Subject: [PATCH 1950/3147] Document namesys options License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@06de6509d0ceb9177e77e3b50e57d6e3d6b018b9 --- namesys/opts/opts.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/namesys/opts/opts.go b/namesys/opts/opts.go index ff7b44c518..63491d6832 100644 --- a/namesys/opts/opts.go +++ b/namesys/opts/opts.go @@ -39,26 +39,32 @@ func DefaultResolveOpts() *ResolveOpts { } } +// ResolveOpt is used to set an option type ResolveOpt func(*ResolveOpts) +// Depth is the recursion depth limit func Depth(depth uint) ResolveOpt { return func(o *ResolveOpts) { o.Depth = depth } } +// DhtRecordCount is the number of IPNS records to retrieve from the DHT func DhtRecordCount(count uint) ResolveOpt { return func(o *ResolveOpts) { o.DhtRecordCount = count } } +// DhtTimeout is the amount of time to wait for DHT records to be fetched +// and verified. A zero value indicates that there is no explicit timeout func DhtTimeout(timeout time.Duration) ResolveOpt { return func(o *ResolveOpts) { o.DhtTimeout = timeout } } +// ProcessOpts converts an array of ResolveOpt into a ResolveOpts object func ProcessOpts(opts []ResolveOpt) *ResolveOpts { rsopts := DefaultResolveOpts() for _, option := range opts { From d2519604341a0580b6703abc1ad27be26c72eb8e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 28 Feb 2018 17:11:46 -0500 Subject: [PATCH 1951/3147] Fix namesys opts package name License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@0592a715746bb66f9fef2d388cbbdc767a9e6073 --- namesys/opts/opts.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/opts/opts.go b/namesys/opts/opts.go index 63491d6832..6690cf7794 100644 --- a/namesys/opts/opts.go +++ b/namesys/opts/opts.go @@ -1,4 +1,4 @@ -package namesys_opts +package nsopts import ( "time" From 06fa6953a16ef6796249d497763a69b3d7fe04dd Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 1 Mar 2018 21:21:11 +0100 Subject: [PATCH 1952/3147] Enforce Cid security rules for getting and adding blocks License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@1492bf6e0dcdd593a53ad5661f2b7516675185df --- blockservice/blockservice.go | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index c6d99c97d4..db7aad5154 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,6 +10,7 @@ import ( "io" exchange "github.com/ipfs/go-ipfs/exchange" + "github.com/ipfs/go-ipfs/removeme/verifcid" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" @@ -130,6 +131,11 @@ func NewSession(ctx context.Context, bs BlockService) *Session { // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *blockService) AddBlock(o blocks.Block) error { c := o.Cid() + // hash security + err := verifcid.ValidateCid(c) + if err != nil { + return err + } if s.checkFirst { if has, err := s.blockstore.Has(c); has || err != nil { return err @@ -149,6 +155,13 @@ func (s *blockService) AddBlock(o blocks.Block) error { } func (s *blockService) AddBlocks(bs []blocks.Block) error { + //hash security + for _, b := range bs { + err := verifcid.ValidateCid(b.Cid()) + if err != nil { + return err + } + } var toput []blocks.Block if s.checkFirst { toput = make([]blocks.Block, 0, len(bs)) @@ -189,10 +202,15 @@ func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, f = s.exchange } - return getBlock(ctx, c, s.blockstore, f) + return getBlock(ctx, c, s.blockstore, f) //hash security } func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) (blocks.Block, error) { + err := verifcid.ValidateCid(c) + if err != nil { + return nil, err + } + block, err := bs.Get(c) if err == nil { return block, nil @@ -224,11 +242,18 @@ func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f excha // the returned channel. // NB: No guarantees are made about order. func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { - return getBlocks(ctx, ks, s.blockstore, s.exchange) + return getBlocks(ctx, ks, s.blockstore, s.exchange) //hash security } func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) <-chan blocks.Block { out := make(chan blocks.Block) + for _, c := range ks { + // hash security + if err := verifcid.ValidateCid(c); err != nil { + log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) + } + } + go func() { defer close(out) var misses []*cid.Cid @@ -285,12 +310,12 @@ type Session struct { // GetBlock gets a block in the context of a request session func (s *Session) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { - return getBlock(ctx, c, s.bs, s.ses) + return getBlock(ctx, c, s.bs, s.ses) // hash security } // GetBlocks gets blocks in the context of a request session func (s *Session) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { - return getBlocks(ctx, ks, s.bs, s.ses) + return getBlocks(ctx, ks, s.bs, s.ses) // hash security } var _ BlockGetter = (*Session)(nil) From c6be2f337d85387833bc194bde005246e0666886 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 1 Mar 2018 23:31:12 +0100 Subject: [PATCH 1953/3147] Move the temporary packages to thirdparty License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@48e84b32f0afbb77890c649806e349fcec2f8276 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index db7aad5154..2d1bc6cbb5 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -10,7 +10,7 @@ import ( "io" exchange "github.com/ipfs/go-ipfs/exchange" - "github.com/ipfs/go-ipfs/removeme/verifcid" + "github.com/ipfs/go-ipfs/thirdparty/verifcid" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" From 149b4687dd3f139b272e862627b246dcff36ad24 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 1 Mar 2018 23:41:17 +0100 Subject: [PATCH 1954/3147] //hash -> // hash License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@e7295a1b6b02334f29410c9b401062e9354022ef --- blockservice/blockservice.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 2d1bc6cbb5..9864dcb2fa 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -155,7 +155,7 @@ func (s *blockService) AddBlock(o blocks.Block) error { } func (s *blockService) AddBlocks(bs []blocks.Block) error { - //hash security + // hash security for _, b := range bs { err := verifcid.ValidateCid(b.Cid()) if err != nil { @@ -202,7 +202,7 @@ func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, f = s.exchange } - return getBlock(ctx, c, s.blockstore, f) //hash security + return getBlock(ctx, c, s.blockstore, f) // hash security } func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) (blocks.Block, error) { @@ -242,7 +242,7 @@ func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f excha // the returned channel. // NB: No guarantees are made about order. func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { - return getBlocks(ctx, ks, s.blockstore, s.exchange) //hash security + return getBlocks(ctx, ks, s.blockstore, s.exchange) // hash security } func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) <-chan blocks.Block { From 9a60c754f89f0c8af493b781c369eb1f8f31d64d Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 2 Mar 2018 23:54:33 +0100 Subject: [PATCH 1955/3147] add hash security note License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@9764858ee2bd30376d746c3f85e7db979c3e5a94 --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 9864dcb2fa..cbabbd4e42 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -206,7 +206,7 @@ func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, } func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) (blocks.Block, error) { - err := verifcid.ValidateCid(c) + err := verifcid.ValidateCid(c) // hash security if err != nil { return nil, err } From 1108b08f0636e0520cb8485e117044fccb7cbd10 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 1 Mar 2018 23:31:12 +0100 Subject: [PATCH 1956/3147] Move the temporary packages to thirdparty License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-verifcid@a82b5fb80c15b2171f545ab8624a56df8f6f2acd --- verifcid/validate.go | 62 +++++++++++++++++++++++++++++++++++++++ verifcid/validate_test.go | 59 +++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 verifcid/validate.go create mode 100644 verifcid/validate_test.go diff --git a/verifcid/validate.go b/verifcid/validate.go new file mode 100644 index 0000000000..4af24b4c43 --- /dev/null +++ b/verifcid/validate.go @@ -0,0 +1,62 @@ +package verifcid + +import ( + "fmt" + + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" +) + +var ErrPossiblyInsecureHashFunction = fmt.Errorf("potentially insecure hash functions not allowed") +var ErrBelowMinimumHashLength = fmt.Errorf("hashes must be at %d least bytes long", minimumHashLength) + +const minimumHashLength = 20 + +var goodset = map[uint64]bool{ + mh.SHA2_256: true, + mh.SHA2_512: true, + mh.SHA3_224: true, + mh.SHA3_256: true, + mh.SHA3_384: true, + mh.SHA3_512: true, + mh.SHAKE_256: true, + mh.DBL_SHA2_256: true, + mh.KECCAK_224: true, + mh.KECCAK_256: true, + mh.KECCAK_384: true, + mh.KECCAK_512: true, + mh.ID: true, + + mh.SHA1: true, // not really secure but still useful +} + +func IsGoodHash(code uint64) bool { + good, found := goodset[code] + if good { + return true + } + + if !found { + if code >= mh.BLAKE2B_MIN+19 && code <= mh.BLAKE2B_MAX { + return true + } + if code >= mh.BLAKE2S_MIN+19 && code <= mh.BLAKE2S_MAX { + return true + } + } + + return false +} + +func ValidateCid(c *cid.Cid) error { + pref := c.Prefix() + if !IsGoodHash(pref.MhType) { + return ErrPossiblyInsecureHashFunction + } + + if pref.MhType != mh.ID && pref.MhLength < minimumHashLength { + return ErrBelowMinimumHashLength + } + + return nil +} diff --git a/verifcid/validate_test.go b/verifcid/validate_test.go new file mode 100644 index 0000000000..21ab090215 --- /dev/null +++ b/verifcid/validate_test.go @@ -0,0 +1,59 @@ +package verifcid + +import ( + "testing" + + mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" +) + +func TestValidateCids(t *testing.T) { + assertTrue := func(v bool) { + t.Helper() + if !v { + t.Fatal("expected success") + } + } + assertFalse := func(v bool) { + t.Helper() + if v { + t.Fatal("expected failure") + } + } + + assertTrue(IsGoodHash(mh.SHA2_256)) + assertTrue(IsGoodHash(mh.BLAKE2B_MIN + 32)) + assertTrue(IsGoodHash(mh.DBL_SHA2_256)) + assertTrue(IsGoodHash(mh.KECCAK_256)) + assertTrue(IsGoodHash(mh.SHA3)) + + assertTrue(IsGoodHash(mh.SHA1)) + + assertFalse(IsGoodHash(mh.BLAKE2B_MIN + 5)) + + mhcid := func(code uint64, length int) *cid.Cid { + mhash, err := mh.Sum([]byte{}, code, length) + if err != nil { + t.Fatal(err) + } + return cid.NewCidV1(cid.DagCBOR, mhash) + } + + cases := []struct { + cid *cid.Cid + err error + }{ + {mhcid(mh.SHA2_256, 32), nil}, + {mhcid(mh.SHA2_256, 16), ErrBelowMinimumHashLength}, + {mhcid(mh.MURMUR3, 4), ErrPossiblyInsecureHashFunction}, + } + + for i, cas := range cases { + if ValidateCid(cas.cid) != cas.err { + t.Errorf("wrong result in case of %s (index %d). Expected: %s, got %s", + cas.cid, i, cas.err, ValidateCid(cas.cid)) + } + } + +} From 3e8d35ca2e8fa93d366b13641cf2613bdd05a9cb Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 4 Mar 2018 01:29:24 +0100 Subject: [PATCH 1957/3147] Significanly improve GC UX with verifcid License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@9f4a5307f2393b0eb81bfb53e2ef1693fbe1a74a --- pinning/pinner/gc/gc.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index c665e355e1..6c3f438c69 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -5,11 +5,13 @@ import ( "context" "errors" "fmt" + "strings" bserv "github.com/ipfs/go-ipfs/blockservice" offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" + "github.com/ipfs/go-ipfs/thirdparty/verifcid" dstore "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" @@ -129,12 +131,34 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn // adds them to the given cid.Set, using the provided dag.GetLinks function // to walk the tree. func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { + verifyGetLinks := func(ctx context.Context, c *cid.Cid) ([]*ipld.Link, error) { + err := verifcid.ValidateCid(c) + if err != nil { + return nil, err + } + + return getLinks(ctx, c) + } + + verboseCidError := func(err error) error { + if strings.Contains(err.Error(), verifcid.ErrBelowMinimumHashLength.Error()) || + strings.Contains(err.Error(), verifcid.ErrPossiblyInsecureHashFunction.Error()) { + err = fmt.Errorf("\"%s\"\nPlease run 'ipfs pin verify'"+ + " to list insecure hashes. If you want to read them,"+ + " please downgrade your go-ipfs to 0.4.13\n", err) + log.Error(err) + } + return err + } + for _, c := range roots { set.Add(c) // EnumerateChildren recursively walks the dag and adds the keys to the given set - err := dag.EnumerateChildren(ctx, getLinks, c, set.Visit) + err := dag.EnumerateChildren(ctx, verifyGetLinks, c, set.Visit) + if err != nil { + err = verboseCidError(err) return err } } From 1f78b9c083643a85176c3902e825eb1d2a221e13 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 28 Feb 2018 10:29:18 -0300 Subject: [PATCH 1958/3147] unixfs: clean path in DagArchive Fixes #4720. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@9d25153a7ae2f351eb3a3d232f770dbdf982c5b3 --- unixfs/archive/archive.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 7a561992ef..4aecb186f5 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -33,7 +33,8 @@ func (i *identityWriteCloser) Close() error { // DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` func DagArchive(ctx context.Context, nd ipld.Node, name string, dag ipld.DAGService, archive bool, compression int) (io.Reader, error) { - _, filename := path.Split(name) + cleaned := path.Clean(name) + _, filename := path.Split(cleaned) // need to connect a writer to a reader piper, pipew := io.Pipe() From 963f83df40b7e960430e8da91aef942e58278acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 17:59:43 +0100 Subject: [PATCH 1959/3147] coreapi: move unixfs errors to the top MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@848f12365b041d32adfa2ba7d5e3b30a1bc4233b --- coreiface/interface.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 75a168bf3e..4d68b5f4be 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -14,6 +14,9 @@ import ( ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) +var ErrIsDir = errors.New("object is a directory") +var ErrOffline = errors.New("can't resolve, ipfs node is offline") + // Path is a generic wrapper for paths used in the API. A path can be resolved // to a CID using one of Resolve functions in the API. type Path interface { @@ -384,6 +387,3 @@ type PinAPI interface { // Verify verifies the integrity of pinned objects Verify(context.Context) (<-chan PinStatus, error) } - -var ErrIsDir = errors.New("object is a directory") -var ErrOffline = errors.New("can't resolve, ipfs node is offline") From 222c7a617e1ee17ba106b5e5279c15931138abc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 18:31:28 +0100 Subject: [PATCH 1960/3147] coreapi: don't alias ipld types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@ab9053378b45e67758591727b9140366d4874fc9 --- coreiface/interface.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/coreiface/interface.go b/coreiface/interface.go index 4d68b5f4be..02525c0d2b 100644 --- a/coreiface/interface.go +++ b/coreiface/interface.go @@ -30,11 +30,6 @@ type Path interface { Resolved() bool } -// TODO: should we really copy these? -// if we didn't, godoc would generate nice links straight to go-ipld-format -type Node ipld.Node -type Link ipld.Link - type Reader interface { io.ReadSeeker io.Closer @@ -114,7 +109,7 @@ type CoreAPI interface { // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node - ResolveNode(context.Context, Path) (Node, error) + ResolveNode(context.Context, Path) (ipld.Node, error) } // UnixfsAPI is the basic interface to immutable files in IPFS @@ -126,7 +121,7 @@ type UnixfsAPI interface { Cat(context.Context, Path) (Reader, error) // Ls returns the list of links in a directory - Ls(context.Context, Path) ([]*Link, error) + Ls(context.Context, Path) ([]*ipld.Link, error) } // BlockAPI specifies the interface to the block layer @@ -183,7 +178,7 @@ type DagAPI interface { WithHash(mhType uint64, mhLen int) options.DagPutOption // Get attempts to resolve and get the node specified by the path - Get(ctx context.Context, path Path) (Node, error) + Get(ctx context.Context, path Path) (ipld.Node, error) // Tree returns list of paths within a node specified by the path. Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) @@ -272,7 +267,7 @@ type KeyAPI interface { // for manipulating MerkleDAG data structures. type ObjectAPI interface { // New creates new, empty (by default) dag-node. - New(context.Context, ...options.ObjectNewOption) (Node, error) + New(context.Context, ...options.ObjectNewOption) (ipld.Node, error) // WithType is an option for New which allows to change the type of created // dag node. @@ -302,13 +297,13 @@ type ObjectAPI interface { WithDataType(t string) options.ObjectPutOption // Get returns the node for the path - Get(context.Context, Path) (Node, error) + Get(context.Context, Path) (ipld.Node, error) // Data returns reader for data of the node Data(context.Context, Path) (io.Reader, error) // Links returns lint or links the node contains - Links(context.Context, Path) ([]*Link, error) + Links(context.Context, Path) ([]*ipld.Link, error) // Stat returns information about the node Stat(context.Context, Path) (*ObjectStat, error) From a05b8c4e76d49997baeb11f87f247965fe2b33ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 18:46:45 +0100 Subject: [PATCH 1961/3147] coreapi: split the interface into multiple files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@d4077754e8de62308542ca3838c8f280ca4aad22 --- coreiface/block.go | 49 ++++++ coreiface/coreapi.go | 38 ++++ coreiface/dag.go | 42 +++++ coreiface/errors.go | 6 + coreiface/interface.go | 384 ----------------------------------------- coreiface/key.go | 51 ++++++ coreiface/name.go | 55 ++++++ coreiface/object.go | 96 +++++++++++ coreiface/path.go | 18 ++ coreiface/pin.go | 69 ++++++++ coreiface/unixfs.go | 20 +++ coreiface/util.go | 10 ++ 12 files changed, 454 insertions(+), 384 deletions(-) create mode 100644 coreiface/block.go create mode 100644 coreiface/coreapi.go create mode 100644 coreiface/dag.go create mode 100644 coreiface/errors.go delete mode 100644 coreiface/interface.go create mode 100644 coreiface/key.go create mode 100644 coreiface/name.go create mode 100644 coreiface/object.go create mode 100644 coreiface/path.go create mode 100644 coreiface/pin.go create mode 100644 coreiface/unixfs.go create mode 100644 coreiface/util.go diff --git a/coreiface/block.go b/coreiface/block.go new file mode 100644 index 0000000000..f38a664c30 --- /dev/null +++ b/coreiface/block.go @@ -0,0 +1,49 @@ +package iface + +import ( + "context" + "io" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +// BlockStat contains information about a block +type BlockStat interface { + // Size is the size of a block + Size() int + + // Path returns path to the block + Path() Path +} + +// BlockAPI specifies the interface to the block layer +type BlockAPI interface { + // Put imports raw block data, hashing it using specified settings. + Put(context.Context, io.Reader, ...options.BlockPutOption) (Path, error) + + // WithFormat is an option for Put which specifies the multicodec to use to + // serialize the object. Default is "v0" + WithFormat(codec string) options.BlockPutOption + + // WithHash is an option for Put which specifies the multihash settings to use + // when hashing the object. Default is mh.SHA2_256 (0x12). + // If mhLen is set to -1, default length for the hash will be used + WithHash(mhType uint64, mhLen int) options.BlockPutOption + + // Get attempts to resolve the path and return a reader for data in the block + Get(context.Context, Path) (io.Reader, error) + + // Rm removes the block specified by the path from local blockstore. + // By default an error will be returned if the block can't be found locally. + // + // NOTE: If the specified block is pinned it won't be removed and no error + // will be returned + Rm(context.Context, Path, ...options.BlockRmOption) error + + // WithForce is an option for Rm which, when set to true, will ignore + // non-existing blocks + WithForce(force bool) options.BlockRmOption + + // Stat returns information on + Stat(context.Context, Path) (BlockStat, error) +} diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go new file mode 100644 index 0000000000..f1388e5bcd --- /dev/null +++ b/coreiface/coreapi.go @@ -0,0 +1,38 @@ +// Package iface defines IPFS Core API which is a set of interfaces used to +// interact with IPFS nodes. +package iface + +import ( + "context" + + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" +) + +// CoreAPI defines an unified interface to IPFS for Go programs. +type CoreAPI interface { + // Unixfs returns an implementation of Unixfs API. + Unixfs() UnixfsAPI + + // Block returns an implementation of Block API. + Block() BlockAPI + + // Dag returns an implementation of Dag API. + Dag() DagAPI + + // Name returns an implementation of Name API. + Name() NameAPI + + // Key returns an implementation of Key API. + Key() KeyAPI + Pin() PinAPI + + // ObjectAPI returns an implementation of Object API + Object() ObjectAPI + + // ResolvePath resolves the path using Unixfs resolver + ResolvePath(context.Context, Path) (Path, error) + + // ResolveNode resolves the path (if not resolved already) using Unixfs + // resolver, gets and returns the resolved Node + ResolveNode(context.Context, Path) (ipld.Node, error) +} diff --git a/coreiface/dag.go b/coreiface/dag.go new file mode 100644 index 0000000000..1635d71b1c --- /dev/null +++ b/coreiface/dag.go @@ -0,0 +1,42 @@ +package iface + +import ( + "context" + "io" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" +) + +// DagAPI specifies the interface to IPLD +type DagAPI interface { + // Put inserts data using specified format and input encoding. + // Unless used with WithCodec or WithHash, the defaults "dag-cbor" and + // "sha256" are used. + Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (Path, error) + + // WithInputEnc is an option for Put which specifies the input encoding of the + // data. Default is "json", most formats/codecs support "raw" + WithInputEnc(enc string) options.DagPutOption + + // WithCodec is an option for Put which specifies the multicodec to use to + // serialize the object. Default is cid.DagCBOR (0x71) + WithCodec(codec uint64) options.DagPutOption + + // WithHash is an option for Put which specifies the multihash settings to use + // when hashing the object. Default is based on the codec used + // (mh.SHA2_256 (0x12) for DagCBOR). If mhLen is set to -1, default length for + // the hash will be used + WithHash(mhType uint64, mhLen int) options.DagPutOption + + // Get attempts to resolve and get the node specified by the path + Get(ctx context.Context, path Path) (ipld.Node, error) + + // Tree returns list of paths within a node specified by the path. + Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) + + // WithDepth is an option for Tree which specifies maximum depth of the + // returned tree. Default is -1 (no depth limit) + WithDepth(depth int) options.DagTreeOption +} diff --git a/coreiface/errors.go b/coreiface/errors.go new file mode 100644 index 0000000000..73442be11a --- /dev/null +++ b/coreiface/errors.go @@ -0,0 +1,6 @@ +package iface + +import "errors" + +var ErrIsDir = errors.New("object is a directory") +var ErrOffline = errors.New("can't resolve, ipfs node is offline") diff --git a/coreiface/interface.go b/coreiface/interface.go deleted file mode 100644 index 02525c0d2b..0000000000 --- a/coreiface/interface.go +++ /dev/null @@ -1,384 +0,0 @@ -// Package iface defines IPFS Core API which is a set of interfaces used to -// interact with IPFS nodes. -package iface - -import ( - "context" - "errors" - "io" - "time" - - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" -) - -var ErrIsDir = errors.New("object is a directory") -var ErrOffline = errors.New("can't resolve, ipfs node is offline") - -// Path is a generic wrapper for paths used in the API. A path can be resolved -// to a CID using one of Resolve functions in the API. -type Path interface { - // String returns the path as a string. - String() string - // Cid returns cid referred to by path - Cid() *cid.Cid - // Root returns cid of root path - Root() *cid.Cid - // Resolved returns whether path has been fully resolved - Resolved() bool -} - -type Reader interface { - io.ReadSeeker - io.Closer -} - -// IpnsEntry specifies the interface to IpnsEntries -type IpnsEntry interface { - // Name returns IpnsEntry name - Name() string - // Value returns IpnsEntry value - Value() Path -} - -// Key specifies the interface to Keys in KeyAPI Keystore -type Key interface { - // Key returns key name - Name() string - // Path returns key path - Path() Path -} - -type BlockStat interface { - Size() int - Path() Path -} - -// Pin holds information about pinned resource -type Pin interface { - // Path to the pinned object - Path() Path - - // Type of the pin - Type() string -} - -// PinStatus holds information about pin health -type PinStatus interface { - // Ok indicates whether the pin has been verified to be correct - Ok() bool - - // BadNodes returns any bad (usually missing) nodes from the pin - BadNodes() []BadPinNode -} - -// BadPinNode is a node that has been marked as bad by Pin.Verify -type BadPinNode interface { - // Path is the path of the node - Path() Path - - // Err is the reason why the node has been marked as bad - Err() error -} - -// CoreAPI defines an unified interface to IPFS for Go programs. -type CoreAPI interface { - // Unixfs returns an implementation of Unixfs API. - Unixfs() UnixfsAPI - - // Block returns an implementation of Block API. - Block() BlockAPI - - // Dag returns an implementation of Dag API. - Dag() DagAPI - - // Name returns an implementation of Name API. - Name() NameAPI - - // Key returns an implementation of Key API. - Key() KeyAPI - Pin() PinAPI - - // ObjectAPI returns an implementation of Object API - Object() ObjectAPI - - // ResolvePath resolves the path using Unixfs resolver - ResolvePath(context.Context, Path) (Path, error) - - // ResolveNode resolves the path (if not resolved already) using Unixfs - // resolver, gets and returns the resolved Node - ResolveNode(context.Context, Path) (ipld.Node, error) -} - -// UnixfsAPI is the basic interface to immutable files in IPFS -type UnixfsAPI interface { - // Add imports the data from the reader into merkledag file - Add(context.Context, io.Reader) (Path, error) - - // Cat returns a reader for the file - Cat(context.Context, Path) (Reader, error) - - // Ls returns the list of links in a directory - Ls(context.Context, Path) ([]*ipld.Link, error) -} - -// BlockAPI specifies the interface to the block layer -type BlockAPI interface { - // Put imports raw block data, hashing it using specified settings. - Put(context.Context, io.Reader, ...options.BlockPutOption) (Path, error) - - // WithFormat is an option for Put which specifies the multicodec to use to - // serialize the object. Default is "v0" - WithFormat(codec string) options.BlockPutOption - - // WithHash is an option for Put which specifies the multihash settings to use - // when hashing the object. Default is mh.SHA2_256 (0x12). - // If mhLen is set to -1, default length for the hash will be used - WithHash(mhType uint64, mhLen int) options.BlockPutOption - - // Get attempts to resolve the path and return a reader for data in the block - Get(context.Context, Path) (io.Reader, error) - - // Rm removes the block specified by the path from local blockstore. - // By default an error will be returned if the block can't be found locally. - // - // NOTE: If the specified block is pinned it won't be removed and no error - // will be returned - Rm(context.Context, Path, ...options.BlockRmOption) error - - // WithForce is an option for Rm which, when set to true, will ignore - // non-existing blocks - WithForce(force bool) options.BlockRmOption - - // Stat returns information on - Stat(context.Context, Path) (BlockStat, error) -} - -// DagAPI specifies the interface to IPLD -type DagAPI interface { - // Put inserts data using specified format and input encoding. - // Unless used with WithCodec or WithHash, the defaults "dag-cbor" and - // "sha256" are used. - Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (Path, error) - - // WithInputEnc is an option for Put which specifies the input encoding of the - // data. Default is "json", most formats/codecs support "raw" - WithInputEnc(enc string) options.DagPutOption - - // WithCodec is an option for Put which specifies the multicodec to use to - // serialize the object. Default is cid.DagCBOR (0x71) - WithCodec(codec uint64) options.DagPutOption - - // WithHash is an option for Put which specifies the multihash settings to use - // when hashing the object. Default is based on the codec used - // (mh.SHA2_256 (0x12) for DagCBOR). If mhLen is set to -1, default length for - // the hash will be used - WithHash(mhType uint64, mhLen int) options.DagPutOption - - // Get attempts to resolve and get the node specified by the path - Get(ctx context.Context, path Path) (ipld.Node, error) - - // Tree returns list of paths within a node specified by the path. - Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) - - // WithDepth is an option for Tree which specifies maximum depth of the - // returned tree. Default is -1 (no depth limit) - WithDepth(depth int) options.DagTreeOption -} - -// NameAPI specifies the interface to IPNS. -// -// IPNS is a PKI namespace, where names are the hashes of public keys, and the -// private key enables publishing new (signed) values. In both publish and -// resolve, the default name used is the node's own PeerID, which is the hash of -// its public key. -// -// You can use .Key API to list and generate more names and their respective keys. -type NameAPI interface { - // Publish announces new IPNS name - Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (IpnsEntry, error) - - // WithValidTime is an option for Publish which specifies for how long the - // entry will remain valid. Default value is 24h - WithValidTime(validTime time.Duration) options.NamePublishOption - - // WithKey is an option for Publish which specifies the key to use for - // publishing. Default value is "self" which is the node's own PeerID. - // The key parameter must be either PeerID or keystore key alias. - // - // You can use KeyAPI to list and generate more names and their respective keys. - WithKey(key string) options.NamePublishOption - - // Resolve attempts to resolve the newest version of the specified name - Resolve(ctx context.Context, name string, opts ...options.NameResolveOption) (Path, error) - - // WithRecursive is an option for Resolve which specifies whether to perform a - // recursive lookup. Default value is false - WithRecursive(recursive bool) options.NameResolveOption - - // WithLocal is an option for Resolve which specifies if the lookup should be - // offline. Default value is false - WithLocal(local bool) options.NameResolveOption - - // WithCache is an option for Resolve which specifies if cache should be used. - // Default value is true - WithCache(cache bool) options.NameResolveOption -} - -// KeyAPI specifies the interface to Keystore -type KeyAPI interface { - // Generate generates new key, stores it in the keystore under the specified - // name and returns a base58 encoded multihash of it's public key - Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (Key, error) - - // WithType is an option for Generate which specifies which algorithm - // should be used for the key. Default is options.RSAKey - // - // Supported key types: - // * options.RSAKey - // * options.Ed25519Key - WithType(algorithm string) options.KeyGenerateOption - - // WithSize is an option for Generate which specifies the size of the key to - // generated. Default is -1 - // - // value of -1 means 'use default size for key type': - // * 2048 for RSA - WithSize(size int) options.KeyGenerateOption - - // Rename renames oldName key to newName. Returns the key and whether another - // key was overwritten, or an error - Rename(ctx context.Context, oldName string, newName string, opts ...options.KeyRenameOption) (Key, bool, error) - - // WithForce is an option for Rename which specifies whether to allow to - // replace existing keys. - WithForce(force bool) options.KeyRenameOption - - // List lists keys stored in keystore - List(ctx context.Context) ([]Key, error) - - // Remove removes keys from keystore. Returns ipns path of the removed key - Remove(ctx context.Context, name string) (Path, error) -} - -// ObjectAPI specifies the interface to MerkleDAG and contains useful utilities -// for manipulating MerkleDAG data structures. -type ObjectAPI interface { - // New creates new, empty (by default) dag-node. - New(context.Context, ...options.ObjectNewOption) (ipld.Node, error) - - // WithType is an option for New which allows to change the type of created - // dag node. - // - // Supported types: - // * 'empty' - Empty node - // * 'unixfs-dir' - Empty UnixFS directory - WithType(string) options.ObjectNewOption - - // Put imports the data into merkledag - Put(context.Context, io.Reader, ...options.ObjectPutOption) (Path, error) - - // WithInputEnc is an option for Put which specifies the input encoding of the - // data. Default is "json". - // - // Supported encodings: - // * "protobuf" - // * "json" - WithInputEnc(e string) options.ObjectPutOption - - // WithDataType specifies the encoding of data field when using Josn or XML - // input encoding. - // - // Supported types: - // * "text" (default) - // * "base64" - WithDataType(t string) options.ObjectPutOption - - // Get returns the node for the path - Get(context.Context, Path) (ipld.Node, error) - - // Data returns reader for data of the node - Data(context.Context, Path) (io.Reader, error) - - // Links returns lint or links the node contains - Links(context.Context, Path) ([]*ipld.Link, error) - - // Stat returns information about the node - Stat(context.Context, Path) (*ObjectStat, error) - - // AddLink adds a link under the specified path. child path can point to a - // subdirectory within the patent which must be present (can be overridden - // with WithCreate option). - AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Path, error) - - // WithCreate is an option for AddLink which specifies whether create required - // directories for the child - WithCreate(create bool) options.ObjectAddLinkOption - - // RmLink removes a link from the node - RmLink(ctx context.Context, base Path, link string) (Path, error) - - // AppendData appends data to the node - AppendData(context.Context, Path, io.Reader) (Path, error) - - // SetData sets the data contained in the node - SetData(context.Context, Path, io.Reader) (Path, error) -} - -// ObjectStat provides information about dag nodes -type ObjectStat struct { - // Cid is the CID of the node - Cid *cid.Cid - - // NumLinks is number of links the node contains - NumLinks int - - // BlockSize is size of the raw serialized node - BlockSize int - - // LinksSize is size of the links block section - LinksSize int - - // DataSize is the size of data block section - DataSize int - - // CumulativeSize is size of the tree (BlockSize + link sizes) - CumulativeSize int -} - -// PinAPI specifies the interface to pining -type PinAPI interface { - // Add creates new pin, be default recursive - pinning the whole referenced - // tree - Add(context.Context, Path, ...options.PinAddOption) error - - // WithRecursive is an option for Add which specifies whether to pin an entire - // object tree or just one object. Default: true - WithRecursive(bool) options.PinAddOption - - // Ls returns list of pinned objects on this node - Ls(context.Context, ...options.PinLsOption) ([]Pin, error) - - // WithType is an option for Ls which allows to specify which pin types should - // be returned - // - // Supported values: - // * "direct" - directly pinned objects - // * "recursive" - roots of recursive pins - // * "indirect" - indirectly pinned objects (referenced by recursively pinned - // objects) - // * "all" - all pinned objects (default) - WithType(string) options.PinLsOption - - // Rm removes pin for object specified by the path - Rm(context.Context, Path) error - - // Update changes one pin to another, skipping checks for matching paths in - // the old tree - Update(ctx context.Context, from Path, to Path, opts ...options.PinUpdateOption) error - - // Verify verifies the integrity of pinned objects - Verify(context.Context) (<-chan PinStatus, error) -} diff --git a/coreiface/key.go b/coreiface/key.go new file mode 100644 index 0000000000..730e855d78 --- /dev/null +++ b/coreiface/key.go @@ -0,0 +1,51 @@ +package iface + +import ( + "context" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +// Key specifies the interface to Keys in KeyAPI Keystore +type Key interface { + // Key returns key name + Name() string + // Path returns key path + Path() Path +} + +// KeyAPI specifies the interface to Keystore +type KeyAPI interface { + // Generate generates new key, stores it in the keystore under the specified + // name and returns a base58 encoded multihash of it's public key + Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (Key, error) + + // WithType is an option for Generate which specifies which algorithm + // should be used for the key. Default is options.RSAKey + // + // Supported key types: + // * options.RSAKey + // * options.Ed25519Key + WithType(algorithm string) options.KeyGenerateOption + + // WithSize is an option for Generate which specifies the size of the key to + // generated. Default is -1 + // + // value of -1 means 'use default size for key type': + // * 2048 for RSA + WithSize(size int) options.KeyGenerateOption + + // Rename renames oldName key to newName. Returns the key and whether another + // key was overwritten, or an error + Rename(ctx context.Context, oldName string, newName string, opts ...options.KeyRenameOption) (Key, bool, error) + + // WithForce is an option for Rename which specifies whether to allow to + // replace existing keys. + WithForce(force bool) options.KeyRenameOption + + // List lists keys stored in keystore + List(ctx context.Context) ([]Key, error) + + // Remove removes keys from keystore. Returns ipns path of the removed key + Remove(ctx context.Context, name string) (Path, error) +} diff --git a/coreiface/name.go b/coreiface/name.go new file mode 100644 index 0000000000..6d17d840ad --- /dev/null +++ b/coreiface/name.go @@ -0,0 +1,55 @@ +package iface + +import ( + "context" + "time" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +// IpnsEntry specifies the interface to IpnsEntries +type IpnsEntry interface { + // Name returns IpnsEntry name + Name() string + // Value returns IpnsEntry value + Value() Path +} + +// NameAPI specifies the interface to IPNS. +// +// IPNS is a PKI namespace, where names are the hashes of public keys, and the +// private key enables publishing new (signed) values. In both publish and +// resolve, the default name used is the node's own PeerID, which is the hash of +// its public key. +// +// You can use .Key API to list and generate more names and their respective keys. +type NameAPI interface { + // Publish announces new IPNS name + Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (IpnsEntry, error) + + // WithValidTime is an option for Publish which specifies for how long the + // entry will remain valid. Default value is 24h + WithValidTime(validTime time.Duration) options.NamePublishOption + + // WithKey is an option for Publish which specifies the key to use for + // publishing. Default value is "self" which is the node's own PeerID. + // The key parameter must be either PeerID or keystore key alias. + // + // You can use KeyAPI to list and generate more names and their respective keys. + WithKey(key string) options.NamePublishOption + + // Resolve attempts to resolve the newest version of the specified name + Resolve(ctx context.Context, name string, opts ...options.NameResolveOption) (Path, error) + + // WithRecursive is an option for Resolve which specifies whether to perform a + // recursive lookup. Default value is false + WithRecursive(recursive bool) options.NameResolveOption + + // WithLocal is an option for Resolve which specifies if the lookup should be + // offline. Default value is false + WithLocal(local bool) options.NameResolveOption + + // WithCache is an option for Resolve which specifies if cache should be used. + // Default value is true + WithCache(cache bool) options.NameResolveOption +} diff --git a/coreiface/object.go b/coreiface/object.go new file mode 100644 index 0000000000..75837f93ec --- /dev/null +++ b/coreiface/object.go @@ -0,0 +1,96 @@ +package iface + +import ( + "context" + "io" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" +) + +// ObjectStat provides information about dag nodes +type ObjectStat struct { + // Cid is the CID of the node + Cid *cid.Cid + + // NumLinks is number of links the node contains + NumLinks int + + // BlockSize is size of the raw serialized node + BlockSize int + + // LinksSize is size of the links block section + LinksSize int + + // DataSize is the size of data block section + DataSize int + + // CumulativeSize is size of the tree (BlockSize + link sizes) + CumulativeSize int +} + +// ObjectAPI specifies the interface to MerkleDAG and contains useful utilities +// for manipulating MerkleDAG data structures. +type ObjectAPI interface { + // New creates new, empty (by default) dag-node. + New(context.Context, ...options.ObjectNewOption) (ipld.Node, error) + + // WithType is an option for New which allows to change the type of created + // dag node. + // + // Supported types: + // * 'empty' - Empty node + // * 'unixfs-dir' - Empty UnixFS directory + WithType(string) options.ObjectNewOption + + // Put imports the data into merkledag + Put(context.Context, io.Reader, ...options.ObjectPutOption) (Path, error) + + // WithInputEnc is an option for Put which specifies the input encoding of the + // data. Default is "json". + // + // Supported encodings: + // * "protobuf" + // * "json" + WithInputEnc(e string) options.ObjectPutOption + + // WithDataType specifies the encoding of data field when using Josn or XML + // input encoding. + // + // Supported types: + // * "text" (default) + // * "base64" + WithDataType(t string) options.ObjectPutOption + + // Get returns the node for the path + Get(context.Context, Path) (ipld.Node, error) + + // Data returns reader for data of the node + Data(context.Context, Path) (io.Reader, error) + + // Links returns lint or links the node contains + Links(context.Context, Path) ([]*ipld.Link, error) + + // Stat returns information about the node + Stat(context.Context, Path) (*ObjectStat, error) + + // AddLink adds a link under the specified path. child path can point to a + // subdirectory within the patent which must be present (can be overridden + // with WithCreate option). + AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Path, error) + + // WithCreate is an option for AddLink which specifies whether create required + // directories for the child + WithCreate(create bool) options.ObjectAddLinkOption + + // RmLink removes a link from the node + RmLink(ctx context.Context, base Path, link string) (Path, error) + + // AppendData appends data to the node + AppendData(context.Context, Path, io.Reader) (Path, error) + + // SetData sets the data contained in the node + SetData(context.Context, Path, io.Reader) (Path, error) +} diff --git a/coreiface/path.go b/coreiface/path.go new file mode 100644 index 0000000000..b2160b9426 --- /dev/null +++ b/coreiface/path.go @@ -0,0 +1,18 @@ +package iface + +import ( + cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" +) + +// Path is a generic wrapper for paths used in the API. A path can be resolved +// to a CID using one of Resolve functions in the API. +type Path interface { + // String returns the path as a string. + String() string + // Cid returns cid referred to by path + Cid() *cid.Cid + // Root returns cid of root path + Root() *cid.Cid + // Resolved returns whether path has been fully resolved + Resolved() bool +} diff --git a/coreiface/pin.go b/coreiface/pin.go new file mode 100644 index 0000000000..47a5a0bb28 --- /dev/null +++ b/coreiface/pin.go @@ -0,0 +1,69 @@ +package iface + +import ( + "context" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +// Pin holds information about pinned resource +type Pin interface { + // Path to the pinned object + Path() Path + + // Type of the pin + Type() string +} + +// PinStatus holds information about pin health +type PinStatus interface { + // Ok indicates whether the pin has been verified to be correct + Ok() bool + + // BadNodes returns any bad (usually missing) nodes from the pin + BadNodes() []BadPinNode +} + +// BadPinNode is a node that has been marked as bad by Pin.Verify +type BadPinNode interface { + // Path is the path of the node + Path() Path + + // Err is the reason why the node has been marked as bad + Err() error +} + +// PinAPI specifies the interface to pining +type PinAPI interface { + // Add creates new pin, be default recursive - pinning the whole referenced + // tree + Add(context.Context, Path, ...options.PinAddOption) error + + // WithRecursive is an option for Add which specifies whether to pin an entire + // object tree or just one object. Default: true + WithRecursive(bool) options.PinAddOption + + // Ls returns list of pinned objects on this node + Ls(context.Context, ...options.PinLsOption) ([]Pin, error) + + // WithType is an option for Ls which allows to specify which pin types should + // be returned + // + // Supported values: + // * "direct" - directly pinned objects + // * "recursive" - roots of recursive pins + // * "indirect" - indirectly pinned objects (referenced by recursively pinned + // objects) + // * "all" - all pinned objects (default) + WithType(string) options.PinLsOption + + // Rm removes pin for object specified by the path + Rm(context.Context, Path) error + + // Update changes one pin to another, skipping checks for matching paths in + // the old tree + Update(ctx context.Context, from Path, to Path, opts ...options.PinUpdateOption) error + + // Verify verifies the integrity of pinned objects + Verify(context.Context) (<-chan PinStatus, error) +} diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go new file mode 100644 index 0000000000..c1b4efa432 --- /dev/null +++ b/coreiface/unixfs.go @@ -0,0 +1,20 @@ +package iface + +import ( + "context" + "io" + + ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" +) + +// UnixfsAPI is the basic interface to immutable files in IPFS +type UnixfsAPI interface { + // Add imports the data from the reader into merkledag file + Add(context.Context, io.Reader) (Path, error) + + // Cat returns a reader for the file + Cat(context.Context, Path) (Reader, error) + + // Ls returns the list of links in a directory + Ls(context.Context, Path) ([]*ipld.Link, error) +} diff --git a/coreiface/util.go b/coreiface/util.go new file mode 100644 index 0000000000..8fd3e058fa --- /dev/null +++ b/coreiface/util.go @@ -0,0 +1,10 @@ +package iface + +import ( + "io" +) + +type Reader interface { + io.ReadSeeker + io.Closer +} From 64d53e28ce0e428dadef3a318a1f44eb983376e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 18:52:10 +0100 Subject: [PATCH 1962/3147] coreapi: minor doc fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@dba6c1b7a33059613de8019eafb527031e52e61d --- coreiface/coreapi.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index f1388e5bcd..9428b3b634 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -8,22 +8,24 @@ import ( ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) -// CoreAPI defines an unified interface to IPFS for Go programs. +// CoreAPI defines an unified interface to IPFS for Go programs type CoreAPI interface { - // Unixfs returns an implementation of Unixfs API. + // Unixfs returns an implementation of Unixfs API Unixfs() UnixfsAPI - // Block returns an implementation of Block API. + // Block returns an implementation of Block API Block() BlockAPI - // Dag returns an implementation of Dag API. + // Dag returns an implementation of Dag API Dag() DagAPI - // Name returns an implementation of Name API. + // Name returns an implementation of Name API Name() NameAPI - // Key returns an implementation of Key API. + // Key returns an implementation of Key API Key() KeyAPI + + // Pin returns an implementation of Pin API Pin() PinAPI // ObjectAPI returns an implementation of Object API From 5de1a8368e0d7b6abe9226f7e789ab8a521fb886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 22:17:27 +0100 Subject: [PATCH 1963/3147] coreapi: var block for errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@60fc569676d93341f657737a221de2228a178183 --- coreiface/errors.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/coreiface/errors.go b/coreiface/errors.go index 73442be11a..81f978971d 100644 --- a/coreiface/errors.go +++ b/coreiface/errors.go @@ -2,5 +2,7 @@ package iface import "errors" -var ErrIsDir = errors.New("object is a directory") -var ErrOffline = errors.New("can't resolve, ipfs node is offline") +var ( + ErrIsDir = errors.New("object is a directory") + ErrOffline = errors.New("can't resolve, ipfs node is offline") +) From bd72b23c7576074a08776640c57a122551b255e4 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 15 Mar 2018 21:07:22 +0100 Subject: [PATCH 1964/3147] misc: spelling of retrieval License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@5b0247a27d031233182796eb28c2585871a0be88 --- unixfs/io/dagreader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index af3fbb3308..b1841bd74e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -39,7 +39,7 @@ type ReadSeekCloser interface { } // NewDagReader creates a new reader object that reads the data represented by -// the given node, using the passed in DAGService for data retreival +// the given node, using the passed in DAGService for data retrieval func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagReader, error) { switch n := n.(type) { case *mdag.RawNode: From 684f89bd6a458a5ed5fdaf50943028eaf1a64c9a Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Tue, 20 Mar 2018 13:55:52 +0100 Subject: [PATCH 1965/3147] fix(mfs): Directory.Path not working, add test Credit goes to @ridewindx License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-mfs@70a8736e5907c93ea48eca9f31ee6110283440cf --- mfs/dir.go | 11 +++++++++-- mfs/mfs_test.go | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 08b703fb26..0cc6e6568c 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -404,8 +404,15 @@ func (d *Directory) Path() string { cur := d var out string for cur != nil { - out = path.Join(cur.name, out) - cur = cur.parent.(*Directory) + switch parent := cur.parent.(type) { + case *Directory: + out = path.Join(cur.name, out) + cur = parent + case *Root: + return "/" + out + default: + panic("directory parent neither a directory nor a root") + } } return out } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index d7124bdf10..25e61854b8 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -324,6 +324,11 @@ func TestDirectoryLoadFromDag(t *testing.T) { topd := topi.(*Directory) + path := topd.Path() + if path != "/foo" { + t.Fatalf("Expected path '/foo', got '%s'", path) + } + // mkdir over existing but unloaded child file should fail _, err = topd.Mkdir("a") if err == nil { From 138ada16076a6697e5986d8873678da6eb02e022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Mar 2018 02:09:29 +0100 Subject: [PATCH 1966/3147] misc: Remove some dead code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-unixfs@d87b75ccf159a1f8018d90b82801d171291e9301 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 7a561992ef..aeaffe78e7 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -81,7 +81,7 @@ func DagArchive(ctx context.Context, nd ipld.Node, name string, dag ipld.DAGServ // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format // construct the tar writer - w, err := tar.NewWriter(ctx, dag, archive, compression, maybeGzw) + w, err := tar.NewWriter(ctx, dag, maybeGzw) if checkErrAndClosePipe(err) { return nil, err } diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 4503f5593b..eddb44673a 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -30,7 +30,7 @@ type Writer struct { } // NewWriter wraps given io.Writer. -func NewWriter(ctx context.Context, dag ipld.DAGService, archive bool, compression int, w io.Writer) (*Writer, error) { +func NewWriter(ctx context.Context, dag ipld.DAGService, w io.Writer) (*Writer, error) { return &Writer{ Dag: dag, TarW: tar.NewWriter(w), From c5a04a72619b4b79d409699ece319d5cbbe1659e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Mar 2018 02:09:29 +0100 Subject: [PATCH 1967/3147] misc: Remove some dead code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@2b1ce8e93ea3d515d8311de1cbb6f69a26919a4d --- path/path.go | 2 +- path/path_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 924aa5dc10..ac9348b560 100644 --- a/path/path.go +++ b/path/path.go @@ -62,7 +62,7 @@ func (p Path) String() string { // IsJustAKey returns true if the path is of the form or /ipfs/. func (p Path) IsJustAKey() bool { parts := p.Segments() - return (len(parts) == 2 && parts[0] == "ipfs") + return len(parts) == 2 && parts[0] == "ipfs" } // PopLastSegment returns a new Path without its final segment, and the final diff --git a/path/path_test.go b/path/path_test.go index c3bdcd59ef..b095ffd98e 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -22,7 +22,7 @@ func TestPathParsing(t *testing.T) { for p, expected := range cases { _, err := ParsePath(p) - valid := (err == nil) + valid := err == nil if valid != expected { t.Fatalf("expected %s to have valid == %t", p, expected) } From e2c06e292e9a43d83997121555991d3e24d2c0de Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 21 Mar 2018 22:58:32 -0400 Subject: [PATCH 1968/3147] Return ErrNotFound when zero values are returned from DHT namesys resolve License: MIT Signed-off-by: Dirk McCormick This commit was moved from ipfs/go-namesys@32e77f935ee01070806fa8fe6823175b509509c8 --- namesys/routing.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/namesys/routing.go b/namesys/routing.go index 29b26cdbd7..ccf3050667 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -202,6 +202,10 @@ func (r *routingResolver) getValue(ctx context.Context, ipnsKey string, options } } + if len(recs) == 0 { + return nil, routing.ErrNotFound + } + i, err := IpnsSelectorFunc(ipnsKey, recs) if err != nil { return nil, err From fbeb8ead4e2f9a387afe83e56fe5d1c4b7108c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 22 Mar 2018 04:01:13 +0100 Subject: [PATCH 1969/3147] fix govet warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-filestore@8390183529a95abcd0521da2fe46aa242d1300ef --- filestore/fsrefstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 84a02d4262..9e8ff73e49 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -77,7 +77,7 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) k := ds.RawKey(v.Key) c, err := dshelp.DsKeyToCid(k) if err != nil { - log.Error("decoding cid from filestore: %s", err) + log.Errorf("decoding cid from filestore: %s", err) continue } From 856dcd082eda0136a1c5907da9183f66659c2ac6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 7 Mar 2018 18:25:42 -0800 Subject: [PATCH 1970/3147] don't make assumptions about readers in the dagmodifier The dagmodifier *only* works because we're using a bytes.Buffer. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@72e35de5164bb7ad3f4754737f0b819a40f62293 --- unixfs/mod/dagmodifier.go | 63 +++++++++++++++------------------------ 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 8f2766aee0..0fe9df1e4e 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -202,7 +202,7 @@ func (dm *DagModifier) Sync() error { buflen := dm.wrBuf.Len() // overwrite existing dag nodes - thisc, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf) + thisc, err := dm.modifyDag(dm.curNode, dm.writeStart) if err != nil { return err } @@ -213,7 +213,7 @@ func (dm *DagModifier) Sync() error { } // need to write past end of current dag - if !done { + if dm.wrBuf.Len() > 0 { dm.curNode, err = dm.appendData(dm.curNode, dm.splitter(dm.wrBuf)) if err != nil { return err @@ -231,28 +231,27 @@ func (dm *DagModifier) Sync() error { return nil } -// modifyDag writes the data in 'data' over the data in 'node' starting at 'offset' -// returns the new key of the passed in node and whether or not all the data in the reader -// has been consumed. -func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) { +// modifyDag writes the data in 'dm.wrBuf' over the data in 'node' starting at 'offset' +// returns the new key of the passed in node. +func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { // If we've reached a leaf node. if len(n.Links()) == 0 { switch nd0 := n.(type) { case *mdag.ProtoNode: f, err := ft.FromBytes(nd0.Data()) if err != nil { - return nil, false, err + return nil, err } - n, err := data.Read(f.Data[offset:]) + _, err = dm.wrBuf.Read(f.Data[offset:]) if err != nil && err != io.EOF { - return nil, false, err + return nil, err } // Update newly written node.. b, err := proto.Marshal(f) if err != nil { - return nil, false, err + return nil, err } nd := new(mdag.ProtoNode) @@ -260,16 +259,10 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c nd.SetPrefix(&nd0.Prefix) err = dm.dagserv.Add(dm.ctx, nd) if err != nil { - return nil, false, err - } - - // Hey look! we're done! - var done bool - if n < len(f.Data[offset:]) { - done = true + return nil, err } - return nd.Cid(), done, nil + return nd.Cid(), nil case *mdag.RawNode: origData := nd0.RawData() bytes := make([]byte, len(origData)) @@ -278,9 +271,9 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c copy(bytes, origData[:offset]) // copy in new data - n, err := data.Read(bytes[offset:]) + n, err := dm.wrBuf.Read(bytes[offset:]) if err != nil && err != io.EOF { - return nil, false, err + return nil, err } // copy remaining data @@ -291,46 +284,39 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c nd, err := mdag.NewRawNodeWPrefix(bytes, nd0.Cid().Prefix()) if err != nil { - return nil, false, err + return nil, err } err = dm.dagserv.Add(dm.ctx, nd) if err != nil { - return nil, false, err - } - - // Hey look! we're done! - var done bool - if n < len(bytes[offset:]) { - done = true + return nil, err } - return nd.Cid(), done, nil + return nd.Cid(), nil } } node, ok := n.(*mdag.ProtoNode) if !ok { - return nil, false, ErrNotUnixfs + return nil, ErrNotUnixfs } f, err := ft.FromBytes(node.Data()) if err != nil { - return nil, false, err + return nil, err } var cur uint64 - var done bool for i, bs := range f.GetBlocksizes() { // We found the correct child to write into if cur+bs > offset { child, err := node.Links()[i].GetNode(dm.ctx, dm.dagserv) if err != nil { - return nil, false, err + return nil, err } - k, sdone, err := dm.modifyDag(child, offset-cur, data) + k, err := dm.modifyDag(child, offset-cur) if err != nil { - return nil, false, err + return nil, err } node.Links()[i].Cid = k @@ -338,12 +324,11 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c // Recache serialized node _, err = node.EncodeProtobuf(true) if err != nil { - return nil, false, err + return nil, err } - if sdone { + if dm.wrBuf.Len() == 0 { // No more bytes to write! - done = true break } offset = cur + bs @@ -352,7 +337,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c } err = dm.dagserv.Add(dm.ctx, node) - return node.Cid(), done, err + return node.Cid(), err } // appendData appends the blocks from the given chan to the end of this dag From 53687fd540d218d0b07ddce802e19002e6f23610 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 7 Mar 2018 18:30:00 -0800 Subject: [PATCH 1971/3147] don't assume that Read reads all available bytes in pbdagreader License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@433814ad75922f8e42038977e63bb260084d847d --- unixfs/io/pbdagreader.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index ce3abf439f..e5fbaa928e 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -181,6 +181,11 @@ func (dr *PBDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { return total, nil } + // We haven't hit the end yet. + if err != io.EOF { + continue + } + // Otherwise, load up the next block err = dr.precalcNextBuf(ctx) if err != nil { From 9799ff64c5aa4b087c8b9f59c04cedc411c146be Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 8 Mar 2018 23:16:31 +0100 Subject: [PATCH 1972/3147] pbreader: use ReadFull instead of reimplementing it License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-unixfs@f6d577e22f3b9c9078d120e96ced6ebf33303c19 --- unixfs/io/pbdagreader.go | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index e5fbaa928e..5be60bd8e1 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -166,27 +166,20 @@ func (dr *PBDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { total := 0 for { // Attempt to fill bytes from cached buffer - n, err := dr.buf.Read(b[total:]) + n, err := io.ReadFull(dr.buf, b[total:]) total += n dr.offset += int64(n) - if err != nil { - // EOF is expected - if err != io.EOF { - return total, err - } - } - - // If weve read enough bytes, return - if total == len(b) { + switch err { + // io.EOF will happen is dr.buf had noting more to read (n == 0) + case io.EOF, io.ErrUnexpectedEOF: + // do nothing + case nil: return total, nil + default: + return total, err } - // We haven't hit the end yet. - if err != io.EOF { - continue - } - - // Otherwise, load up the next block + // if we are not done with the output buffer load next block err = dr.precalcNextBuf(ctx) if err != nil { return total, err From fb44c18e78886b3d99be1c60c5399c7e46d198cc Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 23 Mar 2018 15:56:57 -0700 Subject: [PATCH 1973/3147] make the tar writer handle sharded ipfs directories makes ipfs get work on sharded directories fixes #4871 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@da35c8e47c49e36bec032f6b9059e3826db0ef1c --- unixfs/archive/tar/writer.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 4503f5593b..7e6f138944 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -39,23 +39,25 @@ func NewWriter(ctx context.Context, dag ipld.DAGService, archive bool, compressi } func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { + dir, err := uio.NewDirectoryFromNode(w.Dag, nd) + if err != nil { + return err + } if err := writeDirHeader(w.TarW, fpath); err != nil { return err } - for i, ng := range ipld.GetDAG(w.ctx, w.Dag, nd) { - child, err := ng.Get(w.ctx) + return dir.ForEachLink(w.ctx, func(l *ipld.Link) error { + child, err := w.Dag.Get(w.ctx, l.Cid) if err != nil { return err } - - npath := path.Join(fpath, nd.Links()[i].Name) + npath := path.Join(fpath, l.Name) if err := w.WriteNode(child, npath); err != nil { return err } - } - - return nil + return nil + }) } func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error { @@ -83,7 +85,7 @@ func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { switch pb.GetType() { case upb.Data_Metadata: fallthrough - case upb.Data_Directory: + case upb.Data_Directory, upb.Data_HAMTShard: return w.writeDir(nd, fpath) case upb.Data_Raw: fallthrough From 56f7d2f492b5a1638d90c702f3915b629df777ac Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 23 Mar 2018 15:59:21 -0700 Subject: [PATCH 1974/3147] fix error when encountering a sharded directory when expecting a file License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@178c24af3deafa32564f960e4e21472f708eea56 --- unixfs/io/pbdagreader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 5be60bd8e1..ac08fade81 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -112,7 +112,7 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { } switch pb.GetType() { - case ftpb.Data_Directory: + case ftpb.Data_Directory, ftpb.Data_HAMTShard: // A directory should not exist within a file return ft.ErrInvalidDirLocation case ftpb.Data_File: From 23177c7b3decb426c21b7a02fb6b76da1e1d6d29 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 23 Mar 2018 18:02:02 -0700 Subject: [PATCH 1975/3147] appease go lint License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@d1ae33783af51cefc48d2bf62665b4a5e0890ddb --- unixfs/archive/tar/writer.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 7e6f138944..04f5bc4cc6 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -53,10 +53,7 @@ func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { return err } npath := path.Join(fpath, l.Name) - if err := w.WriteNode(child, npath); err != nil { - return err - } - return nil + return w.WriteNode(child, npath) }) } From 595afb8260f48d77dfff80a7d4a191f185adfb87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 11 Mar 2018 18:55:35 +0100 Subject: [PATCH 1976/3147] coreapi: remove options from interfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@38ccf0555876033759418de2c43b5d9c727b2c19 --- coreiface/block.go | 13 ------------- coreiface/dag.go | 18 ------------------ coreiface/key.go | 19 ------------------- coreiface/name.go | 24 ------------------------ coreiface/object.go | 28 ---------------------------- coreiface/options/block.go | 17 +++++++++++++---- coreiface/options/dag.go | 22 +++++++++++++++++----- coreiface/options/key.go | 23 +++++++++++++++++++---- coreiface/options/name.go | 27 +++++++++++++++++++++------ coreiface/options/object.go | 32 +++++++++++++++++++++++++++----- coreiface/options/pin.go | 23 +++++++++++++++++++---- coreiface/pin.go | 15 --------------- 12 files changed, 116 insertions(+), 145 deletions(-) diff --git a/coreiface/block.go b/coreiface/block.go index f38a664c30..a9e577d765 100644 --- a/coreiface/block.go +++ b/coreiface/block.go @@ -21,15 +21,6 @@ type BlockAPI interface { // Put imports raw block data, hashing it using specified settings. Put(context.Context, io.Reader, ...options.BlockPutOption) (Path, error) - // WithFormat is an option for Put which specifies the multicodec to use to - // serialize the object. Default is "v0" - WithFormat(codec string) options.BlockPutOption - - // WithHash is an option for Put which specifies the multihash settings to use - // when hashing the object. Default is mh.SHA2_256 (0x12). - // If mhLen is set to -1, default length for the hash will be used - WithHash(mhType uint64, mhLen int) options.BlockPutOption - // Get attempts to resolve the path and return a reader for data in the block Get(context.Context, Path) (io.Reader, error) @@ -40,10 +31,6 @@ type BlockAPI interface { // will be returned Rm(context.Context, Path, ...options.BlockRmOption) error - // WithForce is an option for Rm which, when set to true, will ignore - // non-existing blocks - WithForce(force bool) options.BlockRmOption - // Stat returns information on Stat(context.Context, Path) (BlockStat, error) } diff --git a/coreiface/dag.go b/coreiface/dag.go index 1635d71b1c..f20c88f25a 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -16,27 +16,9 @@ type DagAPI interface { // "sha256" are used. Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (Path, error) - // WithInputEnc is an option for Put which specifies the input encoding of the - // data. Default is "json", most formats/codecs support "raw" - WithInputEnc(enc string) options.DagPutOption - - // WithCodec is an option for Put which specifies the multicodec to use to - // serialize the object. Default is cid.DagCBOR (0x71) - WithCodec(codec uint64) options.DagPutOption - - // WithHash is an option for Put which specifies the multihash settings to use - // when hashing the object. Default is based on the codec used - // (mh.SHA2_256 (0x12) for DagCBOR). If mhLen is set to -1, default length for - // the hash will be used - WithHash(mhType uint64, mhLen int) options.DagPutOption - // Get attempts to resolve and get the node specified by the path Get(ctx context.Context, path Path) (ipld.Node, error) // Tree returns list of paths within a node specified by the path. Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) - - // WithDepth is an option for Tree which specifies maximum depth of the - // returned tree. Default is -1 (no depth limit) - WithDepth(depth int) options.DagTreeOption } diff --git a/coreiface/key.go b/coreiface/key.go index 730e855d78..928aa265f8 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -20,29 +20,10 @@ type KeyAPI interface { // name and returns a base58 encoded multihash of it's public key Generate(ctx context.Context, name string, opts ...options.KeyGenerateOption) (Key, error) - // WithType is an option for Generate which specifies which algorithm - // should be used for the key. Default is options.RSAKey - // - // Supported key types: - // * options.RSAKey - // * options.Ed25519Key - WithType(algorithm string) options.KeyGenerateOption - - // WithSize is an option for Generate which specifies the size of the key to - // generated. Default is -1 - // - // value of -1 means 'use default size for key type': - // * 2048 for RSA - WithSize(size int) options.KeyGenerateOption - // Rename renames oldName key to newName. Returns the key and whether another // key was overwritten, or an error Rename(ctx context.Context, oldName string, newName string, opts ...options.KeyRenameOption) (Key, bool, error) - // WithForce is an option for Rename which specifies whether to allow to - // replace existing keys. - WithForce(force bool) options.KeyRenameOption - // List lists keys stored in keystore List(ctx context.Context) ([]Key, error) diff --git a/coreiface/name.go b/coreiface/name.go index 6d17d840ad..a6aad0c3e6 100644 --- a/coreiface/name.go +++ b/coreiface/name.go @@ -2,7 +2,6 @@ package iface import ( "context" - "time" options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) @@ -27,29 +26,6 @@ type NameAPI interface { // Publish announces new IPNS name Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (IpnsEntry, error) - // WithValidTime is an option for Publish which specifies for how long the - // entry will remain valid. Default value is 24h - WithValidTime(validTime time.Duration) options.NamePublishOption - - // WithKey is an option for Publish which specifies the key to use for - // publishing. Default value is "self" which is the node's own PeerID. - // The key parameter must be either PeerID or keystore key alias. - // - // You can use KeyAPI to list and generate more names and their respective keys. - WithKey(key string) options.NamePublishOption - // Resolve attempts to resolve the newest version of the specified name Resolve(ctx context.Context, name string, opts ...options.NameResolveOption) (Path, error) - - // WithRecursive is an option for Resolve which specifies whether to perform a - // recursive lookup. Default value is false - WithRecursive(recursive bool) options.NameResolveOption - - // WithLocal is an option for Resolve which specifies if the lookup should be - // offline. Default value is false - WithLocal(local bool) options.NameResolveOption - - // WithCache is an option for Resolve which specifies if cache should be used. - // Default value is true - WithCache(cache bool) options.NameResolveOption } diff --git a/coreiface/object.go b/coreiface/object.go index 75837f93ec..548b15a736 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -37,33 +37,9 @@ type ObjectAPI interface { // New creates new, empty (by default) dag-node. New(context.Context, ...options.ObjectNewOption) (ipld.Node, error) - // WithType is an option for New which allows to change the type of created - // dag node. - // - // Supported types: - // * 'empty' - Empty node - // * 'unixfs-dir' - Empty UnixFS directory - WithType(string) options.ObjectNewOption - // Put imports the data into merkledag Put(context.Context, io.Reader, ...options.ObjectPutOption) (Path, error) - // WithInputEnc is an option for Put which specifies the input encoding of the - // data. Default is "json". - // - // Supported encodings: - // * "protobuf" - // * "json" - WithInputEnc(e string) options.ObjectPutOption - - // WithDataType specifies the encoding of data field when using Josn or XML - // input encoding. - // - // Supported types: - // * "text" (default) - // * "base64" - WithDataType(t string) options.ObjectPutOption - // Get returns the node for the path Get(context.Context, Path) (ipld.Node, error) @@ -81,10 +57,6 @@ type ObjectAPI interface { // with WithCreate option). AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Path, error) - // WithCreate is an option for AddLink which specifies whether create required - // directories for the child - WithCreate(create bool) options.ObjectAddLinkOption - // RmLink removes a link from the node RmLink(ctx context.Context, base Path, link string) (Path, error) diff --git a/coreiface/options/block.go b/coreiface/options/block.go index bbb14612f4..20320705e9 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -47,16 +47,23 @@ func BlockRmOptions(opts ...BlockRmOption) (*BlockRmSettings, error) { return options, nil } -type BlockOptions struct{} +type blockOpts struct{} -func (api *BlockOptions) WithFormat(codec string) BlockPutOption { +var Block blockOpts + +// Format is an option for Block.Put which specifies the multicodec to use to +// serialize the object. Default is "v0" +func (_ blockOpts) Format(codec string) BlockPutOption { return func(settings *BlockPutSettings) error { settings.Codec = codec return nil } } -func (api *BlockOptions) WithHash(mhType uint64, mhLen int) BlockPutOption { +// Hash is an option for Block.Put which specifies the multihash settings to use +// when hashing the object. Default is mh.SHA2_256 (0x12). +// If mhLen is set to -1, default length for the hash will be used +func (_ blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption { return func(settings *BlockPutSettings) error { settings.MhType = mhType settings.MhLength = mhLen @@ -64,7 +71,9 @@ func (api *BlockOptions) WithHash(mhType uint64, mhLen int) BlockPutOption { } } -func (api *BlockOptions) WithForce(force bool) BlockRmOption { +// Force is an option for Block.Rm which, when set to true, will ignore +// non-existing blocks +func (_ blockOpts) Force(force bool) BlockRmOption { return func(settings *BlockRmSettings) error { settings.Force = force return nil diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index b56fcd81a6..ec258cf95f 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -51,23 +51,33 @@ func DagTreeOptions(opts ...DagTreeOption) (*DagTreeSettings, error) { return options, nil } -type DagOptions struct{} +type dagOpts struct{} -func (api *DagOptions) WithInputEnc(enc string) DagPutOption { +var Dag dagOpts + +// InputEnc is an option for Dag.Put which specifies the input encoding of the +// data. Default is "json", most formats/codecs support "raw" +func (_ dagOpts) InputEnc(enc string) DagPutOption { return func(settings *DagPutSettings) error { settings.InputEnc = enc return nil } } -func (api *DagOptions) WithCodec(codec uint64) DagPutOption { +// Codec is an option for Dag.Put which specifies the multicodec to use to +// serialize the object. Default is cid.DagCBOR (0x71) +func (_ dagOpts) Codec(codec uint64) DagPutOption { return func(settings *DagPutSettings) error { settings.Codec = codec return nil } } -func (api *DagOptions) WithHash(mhType uint64, mhLen int) DagPutOption { +// Hash is an option for Dag.Put which specifies the multihash settings to use +// when hashing the object. Default is based on the codec used +// (mh.SHA2_256 (0x12) for DagCBOR). If mhLen is set to -1, default length for +// the hash will be used +func (_ dagOpts) Hash(mhType uint64, mhLen int) DagPutOption { return func(settings *DagPutSettings) error { settings.MhType = mhType settings.MhLength = mhLen @@ -75,7 +85,9 @@ func (api *DagOptions) WithHash(mhType uint64, mhLen int) DagPutOption { } } -func (api *DagOptions) WithDepth(depth int) DagTreeOption { +// Depth is an option for Dag.Tree which specifies maximum depth of the +// returned tree. Default is -1 (no depth limit) +func (_ dagOpts) Depth(depth int) DagTreeOption { return func(settings *DagTreeSettings) error { settings.Depth = depth return nil diff --git a/coreiface/options/key.go b/coreiface/options/key.go index 114361875a..a29261d144 100644 --- a/coreiface/options/key.go +++ b/coreiface/options/key.go @@ -48,23 +48,38 @@ func KeyRenameOptions(opts ...KeyRenameOption) (*KeyRenameSettings, error) { return options, nil } -type KeyOptions struct{} +type keyOpts struct{} -func (api *KeyOptions) WithType(algorithm string) KeyGenerateOption { +var Key keyOpts + +// Type is an option for Key.Generate which specifies which algorithm +// should be used for the key. Default is options.RSAKey +// +// Supported key types: +// * options.RSAKey +// * options.Ed25519Key +func (_ keyOpts) Type(algorithm string) KeyGenerateOption { return func(settings *KeyGenerateSettings) error { settings.Algorithm = algorithm return nil } } -func (api *KeyOptions) WithSize(size int) KeyGenerateOption { +// Size is an option for Key.Generate which specifies the size of the key to +// generated. Default is -1 +// +// value of -1 means 'use default size for key type': +// * 2048 for RSA +func (_ keyOpts) Size(size int) KeyGenerateOption { return func(settings *KeyGenerateSettings) error { settings.Size = size return nil } } -func (api *KeyOptions) WithForce(force bool) KeyRenameOption { +// Force is an option for Key.Rename which specifies whether to allow to +// replace existing keys. +func (_ keyOpts) Force(force bool) KeyRenameOption { return func(settings *KeyRenameSettings) error { settings.Force = force return nil diff --git a/coreiface/options/name.go b/coreiface/options/name.go index 9f8aaafc83..1f6de0ee32 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -55,37 +55,52 @@ func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings, error) return options, nil } -type NameOptions struct{} +type nameOpts struct{} -func (api *NameOptions) WithValidTime(validTime time.Duration) NamePublishOption { +var Name nameOpts + +// ValidTime is an option for Name.Publish which specifies for how long the +// entry will remain valid. Default value is 24h +func (_ nameOpts) ValidTime(validTime time.Duration) NamePublishOption { return func(settings *NamePublishSettings) error { settings.ValidTime = validTime return nil } } -func (api *NameOptions) WithKey(key string) NamePublishOption { +// Key is an option for Name.Publish which specifies the key to use for +// publishing. Default value is "self" which is the node's own PeerID. +// The key parameter must be either PeerID or keystore key alias. +// +// You can use KeyAPI to list and generate more names and their respective keys. +func (_ nameOpts) Key(key string) NamePublishOption { return func(settings *NamePublishSettings) error { settings.Key = key return nil } } -func (api *NameOptions) WithRecursive(recursive bool) NameResolveOption { +// Recursive is an option for Name.Resolve which specifies whether to perform a +// recursive lookup. Default value is false +func (_ nameOpts) Recursive(recursive bool) NameResolveOption { return func(settings *NameResolveSettings) error { settings.Recursive = recursive return nil } } -func (api *NameOptions) WithLocal(local bool) NameResolveOption { +// Local is an option for Name.Resolve which specifies if the lookup should be +// offline. Default value is false +func (_ nameOpts) Local(local bool) NameResolveOption { return func(settings *NameResolveSettings) error { settings.Local = local return nil } } -func (api *NameOptions) WithCache(cache bool) NameResolveOption { +// Cache is an option for Name.Resolve which specifies if cache should be used. +// Default value is true +func (_ nameOpts) Cache(cache bool) NameResolveOption { return func(settings *NameResolveSettings) error { settings.Cache = cache return nil diff --git a/coreiface/options/object.go b/coreiface/options/object.go index 9c8c9a9ddd..00e41d28b0 100644 --- a/coreiface/options/object.go +++ b/coreiface/options/object.go @@ -60,30 +60,52 @@ func ObjectAddLinkOptions(opts ...ObjectAddLinkOption) (*ObjectAddLinkSettings, return options, nil } -type ObjectOptions struct{} +type objectOpts struct{} -func (api *ObjectOptions) WithType(t string) ObjectNewOption { +var Object objectOpts + +// Type is an option for Object.New which allows to change the type of created +// dag node. +// +// Supported types: +// * 'empty' - Empty node +// * 'unixfs-dir' - Empty UnixFS directory +func (_ objectOpts) Type(t string) ObjectNewOption { return func(settings *ObjectNewSettings) error { settings.Type = t return nil } } -func (api *ObjectOptions) WithInputEnc(e string) ObjectPutOption { +// InputEnc is an option for Object.Put which specifies the input encoding of the +// data. Default is "json". +// +// Supported encodings: +// * "protobuf" +// * "json" +func (_ objectOpts) InputEnc(e string) ObjectPutOption { return func(settings *ObjectPutSettings) error { settings.InputEnc = e return nil } } -func (api *ObjectOptions) WithDataType(t string) ObjectPutOption { +// DataType is an option for Object.Put which specifies the encoding of data +// field when using Json or XML input encoding. +// +// Supported types: +// * "text" (default) +// * "base64" +func (_ objectOpts) DataType(t string) ObjectPutOption { return func(settings *ObjectPutSettings) error { settings.DataType = t return nil } } -func (api *ObjectOptions) WithCreate(create bool) ObjectAddLinkOption { +// Create is an option for Object.AddLink which specifies whether create required +// directories for the child +func (_ objectOpts) Create(create bool) ObjectAddLinkOption { return func(settings *ObjectAddLinkSettings) error { settings.Create = create return nil diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index f97f7b16ee..680ed391d3 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -61,23 +61,38 @@ func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, error) { return options, nil } -type PinOptions struct{} +type pinOpts struct{} -func (api *PinOptions) WithRecursive(recucsive bool) PinAddOption { +var Pin pinOpts + +// Recursive is an option for Pin.Add which specifies whether to pin an entire +// object tree or just one object. Default: true +func (_ pinOpts) Recursive(recucsive bool) PinAddOption { return func(settings *PinAddSettings) error { settings.Recursive = recucsive return nil } } -func (api *PinOptions) WithType(t string) PinLsOption { +// Type is an option for Pin.Ls which allows to specify which pin types should +// be returned +// +// Supported values: +// * "direct" - directly pinned objects +// * "recursive" - roots of recursive pins +// * "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// * "all" - all pinned objects (default) +func (_ pinOpts) Type(t string) PinLsOption { return func(settings *PinLsSettings) error { settings.Type = t return nil } } -func (api *PinOptions) WithUnpin(unpin bool) PinUpdateOption { +// Unpin is an option for Pin.Update which specifies whether to remove the old pin. +// Default is true. +func (_ pinOpts) Unpin(unpin bool) PinUpdateOption { return func(settings *PinUpdateSettings) error { settings.Unpin = unpin return nil diff --git a/coreiface/pin.go b/coreiface/pin.go index 47a5a0bb28..5994c75868 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -39,24 +39,9 @@ type PinAPI interface { // tree Add(context.Context, Path, ...options.PinAddOption) error - // WithRecursive is an option for Add which specifies whether to pin an entire - // object tree or just one object. Default: true - WithRecursive(bool) options.PinAddOption - // Ls returns list of pinned objects on this node Ls(context.Context, ...options.PinLsOption) ([]Pin, error) - // WithType is an option for Ls which allows to specify which pin types should - // be returned - // - // Supported values: - // * "direct" - directly pinned objects - // * "recursive" - roots of recursive pins - // * "indirect" - indirectly pinned objects (referenced by recursively pinned - // objects) - // * "all" - all pinned objects (default) - WithType(string) options.PinLsOption - // Rm removes pin for object specified by the path Rm(context.Context, Path) error From 8a0f4029598ebf3be0d56e91fe07675702349a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 25 Mar 2018 13:58:29 +0200 Subject: [PATCH 1977/3147] coreapi: use defined functions for pin type option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@2e3f9758c88ce4572922c3fd4e8ef51c703e183d --- coreiface/options/pin.go | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 680ed391d3..7cb4d09d26 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -61,10 +61,38 @@ func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, error) { return options, nil } -type pinOpts struct{} +type pinType struct{} + +type pinOpts struct { + Type pinType +} var Pin pinOpts +// All is an option for Pin.Ls which will make it return all pins. It is +// the default +func (_ pinType) All() PinLsOption { + return Pin.pinType("all") +} + +// Recursive is an option for Pin.Ls which will make it only return recursive +// pins +func (_ pinType) Recursive() PinLsOption { + return Pin.pinType("recursive") +} + +// Direct is an option for Pin.Ls which will make it only return direct (non +// recursive) pins +func (_ pinType) Direct() PinLsOption { + return Pin.pinType("direct") +} + +// Indirect is an option for Pin.Ls which will make it only return indirect pins +// (objects referenced by other recursively pinned objects) +func (_ pinType) Indirect() PinLsOption { + return Pin.pinType("indirect") +} + // Recursive is an option for Pin.Add which specifies whether to pin an entire // object tree or just one object. Default: true func (_ pinOpts) Recursive(recucsive bool) PinAddOption { @@ -83,7 +111,7 @@ func (_ pinOpts) Recursive(recucsive bool) PinAddOption { // * "indirect" - indirectly pinned objects (referenced by recursively pinned // objects) // * "all" - all pinned objects (default) -func (_ pinOpts) Type(t string) PinLsOption { +func (_ pinOpts) pinType(t string) PinLsOption { return func(settings *PinLsSettings) error { settings.Type = t return nil From 6bd3ea5ab8c0df771963b4f8a9f5cfdc18a95b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 25 Mar 2018 14:09:59 +0200 Subject: [PATCH 1978/3147] coreapi: don't use underscores in opt reciever funcs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@8b65fc5e1ed16902cda0e3e36fe624b01856b182 --- coreiface/options/block.go | 6 +++--- coreiface/options/dag.go | 8 ++++---- coreiface/options/key.go | 6 +++--- coreiface/options/name.go | 10 +++++----- coreiface/options/object.go | 8 ++++---- coreiface/options/pin.go | 14 +++++++------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 20320705e9..55964b2b71 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -53,7 +53,7 @@ var Block blockOpts // Format is an option for Block.Put which specifies the multicodec to use to // serialize the object. Default is "v0" -func (_ blockOpts) Format(codec string) BlockPutOption { +func (blockOpts) Format(codec string) BlockPutOption { return func(settings *BlockPutSettings) error { settings.Codec = codec return nil @@ -63,7 +63,7 @@ func (_ blockOpts) Format(codec string) BlockPutOption { // Hash is an option for Block.Put which specifies the multihash settings to use // when hashing the object. Default is mh.SHA2_256 (0x12). // If mhLen is set to -1, default length for the hash will be used -func (_ blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption { +func (blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption { return func(settings *BlockPutSettings) error { settings.MhType = mhType settings.MhLength = mhLen @@ -73,7 +73,7 @@ func (_ blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption { // Force is an option for Block.Rm which, when set to true, will ignore // non-existing blocks -func (_ blockOpts) Force(force bool) BlockRmOption { +func (blockOpts) Force(force bool) BlockRmOption { return func(settings *BlockRmSettings) error { settings.Force = force return nil diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index ec258cf95f..96eea5b460 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -57,7 +57,7 @@ var Dag dagOpts // InputEnc is an option for Dag.Put which specifies the input encoding of the // data. Default is "json", most formats/codecs support "raw" -func (_ dagOpts) InputEnc(enc string) DagPutOption { +func (dagOpts) InputEnc(enc string) DagPutOption { return func(settings *DagPutSettings) error { settings.InputEnc = enc return nil @@ -66,7 +66,7 @@ func (_ dagOpts) InputEnc(enc string) DagPutOption { // Codec is an option for Dag.Put which specifies the multicodec to use to // serialize the object. Default is cid.DagCBOR (0x71) -func (_ dagOpts) Codec(codec uint64) DagPutOption { +func (dagOpts) Codec(codec uint64) DagPutOption { return func(settings *DagPutSettings) error { settings.Codec = codec return nil @@ -77,7 +77,7 @@ func (_ dagOpts) Codec(codec uint64) DagPutOption { // when hashing the object. Default is based on the codec used // (mh.SHA2_256 (0x12) for DagCBOR). If mhLen is set to -1, default length for // the hash will be used -func (_ dagOpts) Hash(mhType uint64, mhLen int) DagPutOption { +func (dagOpts) Hash(mhType uint64, mhLen int) DagPutOption { return func(settings *DagPutSettings) error { settings.MhType = mhType settings.MhLength = mhLen @@ -87,7 +87,7 @@ func (_ dagOpts) Hash(mhType uint64, mhLen int) DagPutOption { // Depth is an option for Dag.Tree which specifies maximum depth of the // returned tree. Default is -1 (no depth limit) -func (_ dagOpts) Depth(depth int) DagTreeOption { +func (dagOpts) Depth(depth int) DagTreeOption { return func(settings *DagTreeSettings) error { settings.Depth = depth return nil diff --git a/coreiface/options/key.go b/coreiface/options/key.go index a29261d144..80beea3529 100644 --- a/coreiface/options/key.go +++ b/coreiface/options/key.go @@ -58,7 +58,7 @@ var Key keyOpts // Supported key types: // * options.RSAKey // * options.Ed25519Key -func (_ keyOpts) Type(algorithm string) KeyGenerateOption { +func (keyOpts) Type(algorithm string) KeyGenerateOption { return func(settings *KeyGenerateSettings) error { settings.Algorithm = algorithm return nil @@ -70,7 +70,7 @@ func (_ keyOpts) Type(algorithm string) KeyGenerateOption { // // value of -1 means 'use default size for key type': // * 2048 for RSA -func (_ keyOpts) Size(size int) KeyGenerateOption { +func (keyOpts) Size(size int) KeyGenerateOption { return func(settings *KeyGenerateSettings) error { settings.Size = size return nil @@ -79,7 +79,7 @@ func (_ keyOpts) Size(size int) KeyGenerateOption { // Force is an option for Key.Rename which specifies whether to allow to // replace existing keys. -func (_ keyOpts) Force(force bool) KeyRenameOption { +func (keyOpts) Force(force bool) KeyRenameOption { return func(settings *KeyRenameSettings) error { settings.Force = force return nil diff --git a/coreiface/options/name.go b/coreiface/options/name.go index 1f6de0ee32..48aecf18ba 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -61,7 +61,7 @@ var Name nameOpts // ValidTime is an option for Name.Publish which specifies for how long the // entry will remain valid. Default value is 24h -func (_ nameOpts) ValidTime(validTime time.Duration) NamePublishOption { +func (nameOpts) ValidTime(validTime time.Duration) NamePublishOption { return func(settings *NamePublishSettings) error { settings.ValidTime = validTime return nil @@ -73,7 +73,7 @@ func (_ nameOpts) ValidTime(validTime time.Duration) NamePublishOption { // The key parameter must be either PeerID or keystore key alias. // // You can use KeyAPI to list and generate more names and their respective keys. -func (_ nameOpts) Key(key string) NamePublishOption { +func (nameOpts) Key(key string) NamePublishOption { return func(settings *NamePublishSettings) error { settings.Key = key return nil @@ -82,7 +82,7 @@ func (_ nameOpts) Key(key string) NamePublishOption { // Recursive is an option for Name.Resolve which specifies whether to perform a // recursive lookup. Default value is false -func (_ nameOpts) Recursive(recursive bool) NameResolveOption { +func (nameOpts) Recursive(recursive bool) NameResolveOption { return func(settings *NameResolveSettings) error { settings.Recursive = recursive return nil @@ -91,7 +91,7 @@ func (_ nameOpts) Recursive(recursive bool) NameResolveOption { // Local is an option for Name.Resolve which specifies if the lookup should be // offline. Default value is false -func (_ nameOpts) Local(local bool) NameResolveOption { +func (nameOpts) Local(local bool) NameResolveOption { return func(settings *NameResolveSettings) error { settings.Local = local return nil @@ -100,7 +100,7 @@ func (_ nameOpts) Local(local bool) NameResolveOption { // Cache is an option for Name.Resolve which specifies if cache should be used. // Default value is true -func (_ nameOpts) Cache(cache bool) NameResolveOption { +func (nameOpts) Cache(cache bool) NameResolveOption { return func(settings *NameResolveSettings) error { settings.Cache = cache return nil diff --git a/coreiface/options/object.go b/coreiface/options/object.go index 00e41d28b0..aca02d6726 100644 --- a/coreiface/options/object.go +++ b/coreiface/options/object.go @@ -70,7 +70,7 @@ var Object objectOpts // Supported types: // * 'empty' - Empty node // * 'unixfs-dir' - Empty UnixFS directory -func (_ objectOpts) Type(t string) ObjectNewOption { +func (objectOpts) Type(t string) ObjectNewOption { return func(settings *ObjectNewSettings) error { settings.Type = t return nil @@ -83,7 +83,7 @@ func (_ objectOpts) Type(t string) ObjectNewOption { // Supported encodings: // * "protobuf" // * "json" -func (_ objectOpts) InputEnc(e string) ObjectPutOption { +func (objectOpts) InputEnc(e string) ObjectPutOption { return func(settings *ObjectPutSettings) error { settings.InputEnc = e return nil @@ -96,7 +96,7 @@ func (_ objectOpts) InputEnc(e string) ObjectPutOption { // Supported types: // * "text" (default) // * "base64" -func (_ objectOpts) DataType(t string) ObjectPutOption { +func (objectOpts) DataType(t string) ObjectPutOption { return func(settings *ObjectPutSettings) error { settings.DataType = t return nil @@ -105,7 +105,7 @@ func (_ objectOpts) DataType(t string) ObjectPutOption { // Create is an option for Object.AddLink which specifies whether create required // directories for the child -func (_ objectOpts) Create(create bool) ObjectAddLinkOption { +func (objectOpts) Create(create bool) ObjectAddLinkOption { return func(settings *ObjectAddLinkSettings) error { settings.Create = create return nil diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 7cb4d09d26..e46c27246a 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -71,31 +71,31 @@ var Pin pinOpts // All is an option for Pin.Ls which will make it return all pins. It is // the default -func (_ pinType) All() PinLsOption { +func (pinType) All() PinLsOption { return Pin.pinType("all") } // Recursive is an option for Pin.Ls which will make it only return recursive // pins -func (_ pinType) Recursive() PinLsOption { +func (pinType) Recursive() PinLsOption { return Pin.pinType("recursive") } // Direct is an option for Pin.Ls which will make it only return direct (non // recursive) pins -func (_ pinType) Direct() PinLsOption { +func (pinType) Direct() PinLsOption { return Pin.pinType("direct") } // Indirect is an option for Pin.Ls which will make it only return indirect pins // (objects referenced by other recursively pinned objects) -func (_ pinType) Indirect() PinLsOption { +func (pinType) Indirect() PinLsOption { return Pin.pinType("indirect") } // Recursive is an option for Pin.Add which specifies whether to pin an entire // object tree or just one object. Default: true -func (_ pinOpts) Recursive(recucsive bool) PinAddOption { +func (pinOpts) Recursive(recucsive bool) PinAddOption { return func(settings *PinAddSettings) error { settings.Recursive = recucsive return nil @@ -111,7 +111,7 @@ func (_ pinOpts) Recursive(recucsive bool) PinAddOption { // * "indirect" - indirectly pinned objects (referenced by recursively pinned // objects) // * "all" - all pinned objects (default) -func (_ pinOpts) pinType(t string) PinLsOption { +func (pinOpts) pinType(t string) PinLsOption { return func(settings *PinLsSettings) error { settings.Type = t return nil @@ -120,7 +120,7 @@ func (_ pinOpts) pinType(t string) PinLsOption { // Unpin is an option for Pin.Update which specifies whether to remove the old pin. // Default is true. -func (_ pinOpts) Unpin(unpin bool) PinUpdateOption { +func (pinOpts) Unpin(unpin bool) PinUpdateOption { return func(settings *PinUpdateSettings) error { settings.Unpin = unpin return nil From b7cfddfa735b41458abfeb32b165749aea3c6683 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 27 Feb 2018 21:03:55 +0100 Subject: [PATCH 1979/3147] Update to latest go-datastore License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@7d6df3815dcdb177408f441d01b5837de02b4d5f --- namesys/ipns_validate_test.go | 21 +++++++++------------ namesys/namesys.go | 2 +- namesys/namesys_test.go | 6 +++--- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 8 ++++---- namesys/pubsub.go | 15 ++++++--------- namesys/pubsub_test.go | 4 ++-- namesys/republisher/repub.go | 6 +++--- namesys/resolve_test.go | 6 +++--- namesys/validator.go | 18 +++++++----------- 10 files changed, 41 insertions(+), 51 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 9e72b9fe53..c62d5e2f56 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -10,21 +10,21 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" - recordpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + record "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record" + recordpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" ) func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns string, key string, val []byte, eol time.Time, exp error) { - validChecker := NewIpnsRecordValidator(kbook) + validFunc := NewIpnsRecordValidator(kbook) p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") entry, err := CreateRoutingEntryData(priv, p, 1, eol) @@ -45,7 +45,7 @@ func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns s Value: data, } - err = validChecker.Func(rec) + err = validFunc(rec) if err != exp { params := fmt.Sprintf("namespace: %s\nkey: %s\neol: %s\n", ns, key, eol) if exp == nil { @@ -86,11 +86,8 @@ func TestResolverValidation(t *testing.T) { vstore := newMockValueStore(rid, dstore, peerstore) vstore.Validator["ipns"] = NewIpnsRecordValidator(peerstore) - vstore.Validator["pk"] = &record.ValidChecker{ - Func: func(r *record.ValidationRecord) error { - return nil - }, - Sign: false, + vstore.Validator["pk"] = func(r *record.ValidationRecord) error { + return nil } resolver := NewRoutingResolver(vstore, 0) diff --git a/namesys/namesys.go b/namesys/namesys.go index e47d433a38..9b4cdf3f72 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -11,9 +11,9 @@ import ( path "github.com/ipfs/go-ipfs/path" p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 7cc4b780c2..06d9e1e6d9 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,9 +10,9 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - offroute "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline" + offroute "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/offline" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 12c10f7529..83b7a23005 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -12,13 +12,13 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" + dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" + dhtpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" ) const PublishPutValTimeout = time.Minute diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index e7d2dd686f..c2670f985e 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,14 +8,14 @@ import ( path "github.com/ipfs/go-ipfs/path" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" + dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" - mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) type identity struct { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index abbf8f0cc0..5859fd2c6f 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -14,19 +14,19 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" - dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" + dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + record "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record" + dhtpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) // PubsubPublisher is a publisher that distributes IPNS records through pubsub @@ -151,10 +151,7 @@ func (p *PubsubPublisher) publishRecord(ctx context.Context, k ci.PrivKey, value // the datastore is shared with the routing publisher to properly increment and persist // ipns record sequence numbers; so we need to Record our new entry in the datastore - dsrec, err := record.MakePutRecord(k, ipnskey, data, true) - if err != nil { - return err - } + dsrec := record.MakePutRecord(ipnskey, data) dsdata, err := proto.Marshal(dsrec) if err != nil { diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index e2cf15b5d9..b9cd40842a 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -9,14 +9,14 @@ import ( path "github.com/ipfs/go-ipfs/path" p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" bhost "gx/ipfs/QmQr1j6UvdhpponAaqSdswqRpdzsFwNop2N8kXLNw8afem/go-libp2p-blankhost" floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" + mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" netutil "gx/ipfs/QmYVR3C8DWPHdHxvLtNFYfjsXgaRAdh6hPMNH3KiwCgu4o/go-libp2p-netutil" - mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index ae8c5e8d1a..33be2349c1 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -10,16 +10,16 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - recpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" + dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" + recpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index a55d5a4d4f..6efb9d6a94 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,10 +8,10 @@ import ( path "github.com/ipfs/go-ipfs/path" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" + mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ) diff --git a/namesys/validator.go b/namesys/validator.go index c50da55126..3c6cc8bb64 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -4,13 +4,14 @@ import ( "errors" "time" - pb "github.com/ipfs/go-ipfs/namesys/pb" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + pb "github.com/ipfs/go-ipfs/namesys/pb" + u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + record "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record" ) // ErrExpiredRecord should be returned when an ipns record is @@ -41,16 +42,16 @@ var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") // from the peer store var ErrPublicKeyNotFound = errors.New("public key not found in peer store") -// NewIpnsRecordValidator returns a ValidChecker for IPNS records. +// NewIpnsRecordValidator returns a record.ValidatorFunc for IPNS records. // The validator function will get a public key from the KeyBook // to verify the record's signature. Note that the public key must // already have been fetched from the network and put into the KeyBook // by the caller. -func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { - // ValidateIpnsRecord implements ValidatorFunc and verifies that the +func NewIpnsRecordValidator(kbook pstore.KeyBook) record.ValidatorFunc { + // This provides a ValidatorFunc which verifies that the // given record's value is an IpnsEntry, that the entry has been correctly // signed, and that the entry has not expired - ValidateIpnsRecord := func(r *record.ValidationRecord) error { + return func(r *record.ValidationRecord) error { if r.Namespace != "ipns" { return ErrInvalidPath } @@ -96,9 +97,4 @@ func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { } return nil } - - return &record.ValidChecker{ - Func: ValidateIpnsRecord, - Sign: false, - } } From 3e0de5076a3025f886fed4a4543478b676fa2f80 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 27 Feb 2018 21:03:55 +0100 Subject: [PATCH 1980/3147] Update to latest go-datastore License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@b4a5068ac65297b6b3b68238a817b55b5b4e5131 --- blockservice/blockservice.go | 2 +- blockservice/blockservice_test.go | 6 +++--- blockservice/test/blocks_test.go | 6 +++--- blockservice/test/mock.go | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index f77e248d89..a54c0ff2ba 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/verifcid" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 6407949c74..edcd4cd985 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -6,9 +6,9 @@ import ( butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 44d4d3ca0f..2a56afeb7e 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -11,9 +11,9 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 06d8e65ad2..a70eb06e0d 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -6,7 +6,7 @@ import ( tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 0bf74fa13bdb7401bc3579e78f525f8df40fd3e5 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 27 Feb 2018 21:03:55 +0100 Subject: [PATCH 1981/3147] Update to latest go-datastore License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@107a720cc3a7ade83dd5c08acfaaf6ec7a1e5bfd --- mfs/mfs_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 25e61854b8..ce82082937 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -23,10 +23,10 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - bstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + bstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From 54d168ac8d0563071aa7426e0281c62fb6171460 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 2 Mar 2018 15:01:12 +0100 Subject: [PATCH 1982/3147] Revert go-libp2p-kad-dht and related changes to a working version This uses a working libp2p-kad-dht and libp2p-record libraries, reverts the changes that were introduced to support the newer versions License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@4028e8123474c310ec3c13d9050fad1665c86d82 --- namesys/ipns_validate_test.go | 17 ++++++++++------- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- namesys/publisher_test.go | 2 +- namesys/pubsub.go | 9 ++++++--- namesys/pubsub_test.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 2 +- namesys/validator.go | 18 +++++++++++------- 9 files changed, 33 insertions(+), 23 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index c62d5e2f56..ac3fb84701 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -10,21 +10,21 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + recordpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record" - recordpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" ) func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns string, key string, val []byte, eol time.Time, exp error) { - validFunc := NewIpnsRecordValidator(kbook) + validChecker := NewIpnsRecordValidator(kbook) p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") entry, err := CreateRoutingEntryData(priv, p, 1, eol) @@ -45,7 +45,7 @@ func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns s Value: data, } - err = validFunc(rec) + err = validChecker.Func(rec) if err != exp { params := fmt.Sprintf("namespace: %s\nkey: %s\neol: %s\n", ns, key, eol) if exp == nil { @@ -86,8 +86,11 @@ func TestResolverValidation(t *testing.T) { vstore := newMockValueStore(rid, dstore, peerstore) vstore.Validator["ipns"] = NewIpnsRecordValidator(peerstore) - vstore.Validator["pk"] = func(r *record.ValidationRecord) error { - return nil + vstore.Validator["pk"] = &record.ValidChecker{ + Func: func(r *record.ValidationRecord) error { + return nil + }, + Sign: false, } resolver := NewRoutingResolver(vstore, 0) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 06d9e1e6d9..e0d9ecf082 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,9 +10,9 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - offroute "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/offline" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + offroute "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/offline" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 83b7a23005..b485b24b21 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,11 +14,11 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - dhtpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" ) const PublishPutValTimeout = time.Minute diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index c2670f985e..20f774fa3c 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,12 +8,12 @@ import ( path "github.com/ipfs/go-ipfs/path" - mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 5859fd2c6f..8f87227211 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -17,6 +17,8 @@ import ( floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" @@ -24,8 +26,6 @@ import ( peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - record "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record" - dhtpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) @@ -151,7 +151,10 @@ func (p *PubsubPublisher) publishRecord(ctx context.Context, k ci.PrivKey, value // the datastore is shared with the routing publisher to properly increment and persist // ipns record sequence numbers; so we need to Record our new entry in the datastore - dsrec := record.MakePutRecord(ipnskey, data) + dsrec, err := record.MakePutRecord(k, ipnskey, data, true) + if err != nil { + return err + } dsdata, err := proto.Marshal(dsrec) if err != nil { diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index b9cd40842a..16dae39fc9 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -11,11 +11,11 @@ import ( p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" bhost "gx/ipfs/QmQr1j6UvdhpponAaqSdswqRpdzsFwNop2N8kXLNw8afem/go-libp2p-blankhost" floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" - mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" netutil "gx/ipfs/QmYVR3C8DWPHdHxvLtNFYfjsXgaRAdh6hPMNH3KiwCgu4o/go-libp2p-netutil" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 33be2349c1..0aabf37382 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -15,11 +15,11 @@ import ( gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + recpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" - recpb "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record/pb" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 6efb9d6a94..31bfd49568 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,10 +8,10 @@ import ( path "github.com/ipfs/go-ipfs/path" - mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ) diff --git a/namesys/validator.go b/namesys/validator.go index 3c6cc8bb64..c50da55126 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -4,14 +4,13 @@ import ( "errors" "time" + pb "github.com/ipfs/go-ipfs/namesys/pb" pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - pb "github.com/ipfs/go-ipfs/namesys/pb" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - record "gx/ipfs/QmcBSi3Zxa6ytDQxig2iMv4VMfiKKy7v4tibi1Sq6Z5u2x/go-libp2p-record" ) // ErrExpiredRecord should be returned when an ipns record is @@ -42,16 +41,16 @@ var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") // from the peer store var ErrPublicKeyNotFound = errors.New("public key not found in peer store") -// NewIpnsRecordValidator returns a record.ValidatorFunc for IPNS records. +// NewIpnsRecordValidator returns a ValidChecker for IPNS records. // The validator function will get a public key from the KeyBook // to verify the record's signature. Note that the public key must // already have been fetched from the network and put into the KeyBook // by the caller. -func NewIpnsRecordValidator(kbook pstore.KeyBook) record.ValidatorFunc { - // This provides a ValidatorFunc which verifies that the +func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { + // ValidateIpnsRecord implements ValidatorFunc and verifies that the // given record's value is an IpnsEntry, that the entry has been correctly // signed, and that the entry has not expired - return func(r *record.ValidationRecord) error { + ValidateIpnsRecord := func(r *record.ValidationRecord) error { if r.Namespace != "ipns" { return ErrInvalidPath } @@ -97,4 +96,9 @@ func NewIpnsRecordValidator(kbook pstore.KeyBook) record.ValidatorFunc { } return nil } + + return &record.ValidChecker{ + Func: ValidateIpnsRecord, + Sign: false, + } } From 70cb8f60050a1c3e5af9de3d2cd9e566940a59ec Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 27 Feb 2018 21:03:55 +0100 Subject: [PATCH 1983/3147] Update to latest go-datastore License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@79bfbbf6bcf9fe56a10db95dde9d886c5aaba977 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 6 +++--- pinning/pinner/set_test.go | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 6c3f438c69..8769db8e1c 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -13,9 +13,9 @@ import ( pin "github.com/ipfs/go-ipfs/pin" "github.com/ipfs/go-ipfs/thirdparty/verifcid" - dstore "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - bstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + dstore "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + bstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 685f8cf655..08eed36fe1 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,8 +12,8 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 874689dd8b..94da70ed32 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -10,9 +10,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e058067884..8153227963 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -9,9 +9,9 @@ import ( offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) From e57196a2fb978b47fb7bf4a25474e5755eaeb8e7 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 27 Feb 2018 21:03:55 +0100 Subject: [PATCH 1984/3147] Update to latest go-datastore License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-exchange-offline@87106931300b0625c10c9b6aa822538e39736dd3 --- exchange/offline/offline.go | 2 +- exchange/offline/offline_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 4ed7d7dc3f..5b4ad1685e 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -7,7 +7,7 @@ import ( exchange "github.com/ipfs/go-ipfs/exchange" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 6535cd6398..19f2d77ae9 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -7,9 +7,9 @@ import ( "github.com/ipfs/go-ipfs/blocks/blocksutil" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - ds_sync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + ds_sync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) From f6e4038ce1469682aab35c55e7e13f8e0811df97 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 2 Mar 2018 15:01:12 +0100 Subject: [PATCH 1985/3147] Revert go-libp2p-kad-dht and related changes to a working version This uses a working libp2p-kad-dht and libp2p-record libraries, reverts the changes that were introduced to support the newer versions License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@94b32079f49123c571ffeaea6e1571a3d42e0c3d --- blockservice/test/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index a70eb06e0d..a9c34d42d7 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -6,7 +6,7 @@ import ( tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - mockrouting "gx/ipfs/QmT51m6og9tmYo8FdaYin3zk1R7vA6ek5WYoHYEiMorfon/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From d3f84d5479a223839d71d41dcb92a2851fde38d5 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 27 Feb 2018 21:03:55 +0100 Subject: [PATCH 1986/3147] Update to latest go-datastore License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@f11275a4f607c72f569e876e51d2e8a173326562 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index f781d5262f..87819e8311 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -10,9 +10,9 @@ package filestore import ( "context" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 6b4065471f..4bb8bfa04f 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,8 +9,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 9e8ff73e49..dbdb8396f3 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dsns "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/namespace" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dsns "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/namespace" + dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/filestore/util.go b/filestore/util.go index f923ec5635..ce03ba9270 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore" - dsq "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/query" - blockstore "gx/ipfs/QmTVDM4LCSUMFNQzbDLL9zQwp8usE6QHymFdh3h8vL9v6b/go-ipfs-blockstore" + dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" + ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" + blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help" ) // Status is used to identify the state of the block data referenced From b1ea2816ebb03b974154fa4d8138c11452dc5de5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 27 Mar 2018 15:01:32 -0700 Subject: [PATCH 1987/3147] don't resolve children unnecessarily when listing a sharded directory We only need to get the child if it's a shard. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@cb89bd3d4e37b565560cd329a05024818504e73e --- unixfs/hamt/hamt.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 70c0b371c3..72a0080668 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -289,13 +289,13 @@ func (ds *Shard) loadChild(ctx context.Context, i int) (child, error) { return nil, fmt.Errorf("invalid link name '%s'", lnk.Name) } - nd, err := lnk.GetNode(ctx, ds.dserv) - if err != nil { - return nil, err - } - var c child if len(lnk.Name) == ds.maxpadlen { + nd, err := lnk.GetNode(ctx, ds.dserv) + if err != nil { + return nil, err + } + pbnd, ok := nd.(*dag.ProtoNode) if !ok { return nil, dag.ErrNotProtobuf From 01b7c69b2e48ed906bb9e179980537b9d0426d41 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 28 Mar 2018 15:11:49 -0700 Subject: [PATCH 1988/3147] fix hamt node not protobuf error License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@4632d49fedcbabf36144c41491342bcc0771aee2 --- unixfs/hamt/hamt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 72a0080668..77ce9ceffb 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -100,7 +100,7 @@ func makeShard(ds ipld.DAGService, size int) (*Shard, error) { func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { pbnd, ok := nd.(*dag.ProtoNode) if !ok { - return nil, dag.ErrLinkNotFound + return nil, dag.ErrNotProtobuf } pbd, err := format.FromBytes(pbnd.Data()) From a882c108023b807ee011c1e6eed098603d12f6d4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 28 Mar 2018 15:12:04 -0700 Subject: [PATCH 1989/3147] remove redundant validation logic License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@0d57297715fe828c46c92389567e1c3375027bd9 --- unixfs/hamt/hamt.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 77ce9ceffb..09bbb24e43 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -295,21 +295,6 @@ func (ds *Shard) loadChild(ctx context.Context, i int) (child, error) { if err != nil { return nil, err } - - pbnd, ok := nd.(*dag.ProtoNode) - if !ok { - return nil, dag.ErrNotProtobuf - } - - pbd, err := format.FromBytes(pbnd.Data()) - if err != nil { - return nil, err - } - - if pbd.GetType() != format.THAMTShard { - return nil, fmt.Errorf("HAMT entries must have non-zero length name") - } - cds, err := NewHamtFromDag(ds.dserv, nd) if err != nil { return nil, err From 8ca1b20596e90a9cc29d634eb1c7867a71c62984 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 28 Mar 2018 17:41:28 -0700 Subject: [PATCH 1990/3147] faster hamt logic 1. Use a custom bitfield type instead of bigints. 2. Make iterating over a hamt *significantly* faster. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@5e52afed5b3c8f05cf1b783f37a6ec47f28a68bf --- unixfs/hamt/hamt.go | 55 ++++++++++++++-------------------------- unixfs/hamt/hamt_test.go | 2 +- unixfs/hamt/util.go | 15 ++++++----- unixfs/hamt/util_test.go | 13 ---------- 4 files changed, 29 insertions(+), 56 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 09bbb24e43..c83ec1ceaf 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -23,14 +23,13 @@ package hamt import ( "context" "fmt" - "math" - "math/big" "os" dag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" + bitfield "gx/ipfs/QmTbBs3Y3u5F69XNJzdnnc6SP5GKgcXxCDzx6w8m6piVRT/go-bitfield" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" @@ -46,7 +45,7 @@ const ( type Shard struct { nd *dag.ProtoNode - bitfield *big.Int + bitfield bitfield.Bitfield children []child @@ -75,22 +74,22 @@ func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { return nil, err } - ds.bitfield = big.NewInt(0) ds.nd = new(dag.ProtoNode) ds.hashFunc = HashMurmur3 return ds, nil } func makeShard(ds ipld.DAGService, size int) (*Shard, error) { - lg2s := int(math.Log2(float64(size))) - if 1< Date: Wed, 28 Mar 2018 17:53:42 -0700 Subject: [PATCH 1991/3147] add benchmark for hamt walking License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@06d3ab218bf5b8613722c23fcfcfc4b6f837d263 --- unixfs/hamt/hamt_test.go | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 224ff8c3a8..9a0e172aca 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -523,6 +523,49 @@ func printDiff(ds ipld.DAGService, a, b *dag.ProtoNode) { } } +func BenchmarkHAMTWalk(b *testing.B) { + ctx := context.Background() + + ds := mdtest.Mock() + sh, _ := NewShard(ds, 256) + nd, err := sh.Node() + if err != nil { + b.Fatal(err) + } + + err = ds.Add(ctx, nd) + if err != nil { + b.Fatal(err) + } + ds.Add(ctx, ft.EmptyDirNode()) + + s, err := NewHamtFromDag(ds, nd) + if err != nil { + b.Fatal(err) + } + + for j := 0; j < 1000; j++ { + err = s.Set(ctx, fmt.Sprintf("%d", j), ft.EmptyDirNode()) + if err != nil { + b.Fatal(err) + } + } + + for i := 0; i < b.N; i++ { + cnt := 0 + err = s.ForEachLink(ctx, func(l *ipld.Link) error { + cnt++ + return nil + }) + if err != nil { + b.Fatal(err) + } + if cnt < 1000 { + b.Fatal("expected 100 children") + } + } +} + func BenchmarkHAMTSet(b *testing.B) { ctx := context.Background() From 19767fcca8c847c36dc6e47fe456f97ace925b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 18 Mar 2018 19:54:46 +0100 Subject: [PATCH 1992/3147] fix error style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-unixfs@283f5df37fccc3f653328bc8920d73d3be0f3847 --- unixfs/io/pbdagreader.go | 2 +- unixfs/test/utils.go | 4 ++-- unixfs/unixfs.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index ac08fade81..a194dccf43 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -238,7 +238,7 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { switch whence { case io.SeekStart: if offset < 0 { - return -1, errors.New("Invalid offset") + return -1, errors.New("invalid offset") } if offset == dr.offset { return offset, nil diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index f96fcfcb52..574b7ec972 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -95,11 +95,11 @@ func GetRandomNode(t testing.TB, dserv ipld.DAGService, size int64, opts NodeOpt // ArrComp checks if two byte slices are the same. func ArrComp(a, b []byte) error { if len(a) != len(b) { - return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b)) + return fmt.Errorf("arrays differ in length. %d != %d", len(a), len(b)) } for i, v := range a { if v != b[i] { - return fmt.Errorf("Arrays differ at index: %d", i) + return fmt.Errorf("arrays differ at index: %d", i) } } return nil diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index d04a461ed0..654de7ff82 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -129,13 +129,13 @@ func DataSize(data []byte) (uint64, error) { switch pbdata.GetType() { case pb.Data_Directory: - return 0, errors.New("Cant get data size of directory") + return 0, errors.New("can't get data size of directory") case pb.Data_File: return pbdata.GetFilesize(), nil case pb.Data_Raw: return uint64(len(pbdata.GetData())), nil default: - return 0, errors.New("Unrecognized node data type") + return 0, errors.New("unrecognized node data type") } } From 6c0f7f09f6bff811122abd0ad5c5ce1dcb058fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 18 Mar 2018 19:54:46 +0100 Subject: [PATCH 1993/3147] fix error style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@ced44557acfcec2e3cb10ca8a3989b6591f2be0c --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 08eed36fe1..8b6eb0aefe 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -305,7 +305,7 @@ func (p *pinner) isPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) { switch mode { case Any, Direct, Indirect, Recursive, Internal: default: - err := fmt.Errorf("Invalid Pin Mode '%d', must be one of {%d, %d, %d, %d, %d}", + err := fmt.Errorf("invalid Pin Mode '%d', must be one of {%d, %d, %d, %d, %d}", mode, Direct, Indirect, Recursive, Internal, Any) return "", false, err } From 03506fcd068272c49a13ffba62504a2906882c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 18 Mar 2018 19:54:46 +0100 Subject: [PATCH 1994/3147] fix error style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-mfs@9df1d72924be4765a8e87d6e40e59847a06aab03 --- mfs/mfs_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index ce82082937..6255c90c47 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -108,7 +108,7 @@ func assertDirAtPath(root *Directory, pth string, children []string) error { sort.Strings(children) sort.Strings(names) if !compStrArrs(children, names) { - return errors.New("directories children did not match!") + return errors.New("directories children did not match") } return nil @@ -158,7 +158,7 @@ func assertFileAtPath(ds ipld.DAGService, root *Directory, expn ipld.Node, pth s file, ok := finaln.(*File) if !ok { - return fmt.Errorf("%s was not a file!", pth) + return fmt.Errorf("%s was not a file", pth) } rfd, err := file.Open(OpenReadOnly, false) @@ -177,7 +177,7 @@ func assertFileAtPath(ds ipld.DAGService, root *Directory, expn ipld.Node, pth s } if !bytes.Equal(out, expbytes) { - return fmt.Errorf("Incorrect data at path!") + return fmt.Errorf("incorrect data at path") } return nil } @@ -616,7 +616,7 @@ func randomFile(d *Directory) (*File, error) { fi, ok := fsn.(*File) if !ok { - return nil, errors.New("file wasnt a file, race?") + return nil, errors.New("file wasn't a file, race?") } return fi, nil @@ -889,7 +889,7 @@ func readFile(rt *Root, path string, offset int64, buf []byte) error { return err } if nread != len(buf) { - return fmt.Errorf("didnt read enough!") + return fmt.Errorf("didn't read enough") } return fd.Close() From 31bdf01fd8aa911df28a1ef3b2f7578251114b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 18 Mar 2018 19:54:46 +0100 Subject: [PATCH 1995/3147] fix error style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@2ba277657c1ff7fc7eb4b14d183748dcfcddf704 --- namesys/dns_test.go | 2 +- namesys/interface.go | 7 ++++--- namesys/namesys_test.go | 2 +- namesys/pubsub.go | 2 +- namesys/resolve_test.go | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 1a3110c9bc..2a58124ed4 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -14,7 +14,7 @@ type mockDNS struct { func (m *mockDNS) lookupTXT(name string) (txt []string, err error) { txt, ok := m.entries[name] if !ok { - return nil, fmt.Errorf("No TXT entry for %s", name) + return nil, fmt.Errorf("no TXT entry for %s", name) } return txt, nil } diff --git a/namesys/interface.go b/namesys/interface.go index db2aa0a22e..4def9b1d71 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -37,18 +37,19 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" + ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" ) // ErrResolveFailed signals an error when attempting to resolve. -var ErrResolveFailed = errors.New("Could not resolve name.") +var ErrResolveFailed = errors.New("could not resolve name") // ErrResolveRecursion signals a recursion-depth limit. var ErrResolveRecursion = errors.New( - "Could not resolve name (recursion limit exceeded).") + "could not resolve name (recursion limit exceeded)") // ErrPublishFailed signals an error when attempting to publish. -var ErrPublishFailed = errors.New("Could not publish name.") +var ErrPublishFailed = errors.New("could not publish name") // Namesys represents a cohesive name publishing and resolving system. // diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index e0d9ecf082..9b27cf3220 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -24,7 +24,7 @@ func testResolution(t *testing.T, resolver Resolver, name string, depth uint, ex p, err := resolver.Resolve(context.Background(), name, opts.Depth(depth)) if err != expError { t.Fatal(fmt.Errorf( - "Expected %s with a depth of %d to have a '%s' error, but got '%s'", + "expected %s with a depth of %d to have a '%s' error, but got '%s'", name, depth, expError, err)) } if p.String() != expected { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 8f87227211..4173fb6e85 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -203,7 +203,7 @@ func (r *PubsubResolver) resolveOnce(ctx context.Context, name string, options * id := peer.ID(hash) if r.host.Peerstore().PrivKey(id) != nil { - return "", errors.New("Cannot resolve own name through pubsub") + return "", errors.New("cannot resolve own name through pubsub") } pubk := id.ExtractPublicKey() diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 31bfd49568..9999801e40 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -131,7 +131,7 @@ func verifyCanResolve(r Resolver, name string, exp path.Path) error { } if res != exp { - return errors.New("got back wrong record!") + return errors.New("got back wrong record") } return nil From 4e88bd13e311dc3f57282a9144e619080a23bb90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 18 Mar 2018 19:54:46 +0100 Subject: [PATCH 1996/3147] fix error style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-keystore@47fd52f3015fc18cb58864222ff3d0905e34698d --- keystore/keystore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 0731f252bb..5058964f86 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -250,7 +250,7 @@ func assertDirContents(dir string, exp []string) error { } if len(finfos) != len(exp) { - return fmt.Errorf("Expected %d directory entries", len(exp)) + return fmt.Errorf("expected %d directory entries", len(exp)) } var names []string From 57491c2b51bcb6116730fa5f53b868d6e6271892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Mar 2018 03:41:28 +0100 Subject: [PATCH 1997/3147] misc: Fix a few typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-unixfs@c81738582a1ddb1a297ac2a80b2df1fe1a8f5c97 --- unixfs/mod/dagmodifier.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0fe9df1e4e..289d727787 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -52,7 +52,7 @@ type DagModifier struct { } // NewDagModifier returns a new DagModifier, the Cid prefix for newly -// created nodes will be inherted from the passed in node. If the Cid +// created nodes will be inhered from the passed in node. If the Cid // version if not 0 raw leaves will also be enabled. The Prefix and // RawLeaves options can be overridden by changing them after the call. func NewDagModifier(ctx context.Context, from ipld.Node, serv ipld.DAGService, spl chunker.SplitterGen) (*DagModifier, error) { @@ -82,7 +82,7 @@ func NewDagModifier(ctx context.Context, from ipld.Node, serv ipld.DAGService, s // WriteAt will modify a dag file in place func (dm *DagModifier) WriteAt(b []byte, offset int64) (int, error) { - // TODO: this is currently VERY inneficient + // TODO: this is currently VERY inefficient // each write that happens at an offset other than the current one causes a // flush to disk, and dag rewrite if offset == int64(dm.writeStart) && dm.wrBuf != nil { From bf4aee0e8f6dfa35e009b57c7295881a52006215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Mar 2018 03:41:28 +0100 Subject: [PATCH 1998/3147] misc: Fix a few typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@d7943a912758b36ebf4f0357b522aece0867f13c --- namesys/pubsub.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 8f87227211..808e2c5c07 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -315,7 +315,7 @@ func (r *PubsubResolver) handleSubscription(sub *floodsub.Subscription, name str err = r.receive(msg, name, pubk) if err != nil { - log.Warningf("PubsubResolve: error proessing update for %s: %s", name, err.Error()) + log.Warningf("PubsubResolve: error processing update for %s: %s", name, err.Error()) } } } @@ -369,7 +369,7 @@ func (r *PubsubResolver) receive(msg *floodsub.Message, name string, pubk ci.Pub } // rendezvous with peers in the name topic through provider records -// Note: rendezbous/boostrap should really be handled by the pubsub implementation itself! +// Note: rendezvous/boostrap should really be handled by the pubsub implementation itself! func bootstrapPubsub(ctx context.Context, cr routing.ContentRouting, host p2phost.Host, name string) { topic := "floodsub:" + name hash := u.Hash([]byte(topic)) From 9c617548f5ca8fc1ff845ec5609016cb8f07c67a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Mar 2018 03:41:28 +0100 Subject: [PATCH 1999/3147] misc: Fix a few typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@5dcb944b8a37d7caad2a642e1f37c159355171c3 --- pinning/pinner/pin.go | 2 +- pinning/pinner/set.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 08eed36fe1..d89704a5de 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -101,7 +101,7 @@ func StringToMode(s string) (Mode, bool) { // A Pinner provides the necessary methods to keep track of Nodes which are // to be kept locally, according to a pin mode. In practice, a Pinner is in // in charge of keeping the list of items from the local storage that should -// not be garbaged-collected. +// not be garbage-collected. type Pinner interface { // IsPinned returns whether or not the given cid is pinned // and an explanation of why its pinned diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index e2ba3ed112..d239859eac 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -188,7 +188,7 @@ func writeHdr(n *merkledag.ProtoNode, hdr *pb.Set) error { return err } - // make enough space for the length prefix and the marshalled header data + // make enough space for the length prefix and the marshaled header data data := make([]byte, binary.MaxVarintLen64, binary.MaxVarintLen64+len(hdrData)) // write the uvarint length of the header data From 76ac2a8842d68a73acece177235ec746ca637793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Mar 2018 03:41:28 +0100 Subject: [PATCH 2000/3147] misc: Fix a few typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@646b14412abd5b2382fc11f37e40ef592c557fcb --- coreiface/options/pin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index e46c27246a..9d1107f927 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -95,9 +95,9 @@ func (pinType) Indirect() PinLsOption { // Recursive is an option for Pin.Add which specifies whether to pin an entire // object tree or just one object. Default: true -func (pinOpts) Recursive(recucsive bool) PinAddOption { +func (pinOpts) Recursive(recursive bool) PinAddOption { return func(settings *PinAddSettings) error { - settings.Recursive = recucsive + settings.Recursive = recursive return nil } } From fd2bbc831d85cf3d6c95b81df7614ac80220f418 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 14:29:49 +0200 Subject: [PATCH 2001/3147] Extract: gx, travis, readme, license, makefile This commit was moved from ipfs/go-ipfs-exchange-interface@6e91bf9ba223bd8a03a82f0f9ae23fe6707aea07 --- exchange/LICENSE | 21 +++++++++++++++++++++ exchange/Makefile | 18 ++++++++++++++++++ exchange/README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ exchange/interface.go | 5 ++--- 4 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 exchange/LICENSE create mode 100644 exchange/Makefile create mode 100644 exchange/README.md diff --git a/exchange/LICENSE b/exchange/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/exchange/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/exchange/Makefile b/exchange/Makefile new file mode 100644 index 0000000000..73f2841f61 --- /dev/null +++ b/exchange/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race -coverprofile=coverage.txt -covermode=atomic . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/exchange/README.md b/exchange/README.md new file mode 100644 index 0000000000..8dbcfe1c3b --- /dev/null +++ b/exchange/README.md @@ -0,0 +1,42 @@ +# go-ipfs-exchange-interface + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-exchange-interface?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-exchange-interface) +[![Build Status](https://travis-ci.org/ipfs/go-ipfs-exchange-interface.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-exchange-interface) + +> go-ipfs-exchange-interface defines the IPFS exchange interface + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-ipfs-exchange-interface` works like a regular Go module: + +``` +> go get github.com/ipfs/go-ipfs-exchange-interface +``` + +## Usage + +``` +import "github.com/ipfs/go-ipfs-exchange-interface" +``` + +Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-exchange-interface) + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. diff --git a/exchange/interface.go b/exchange/interface.go index e3971d06c3..675592ffdf 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -5,9 +5,8 @@ import ( "context" "io" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" ) // Interface defines the functionality of the IPFS block exchange protocol. From bc86309c243894c6b2593eac93b2dee35685ddaa Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 14:39:17 +0200 Subject: [PATCH 2002/3147] Extract: exchange/interface.go to go-ipfs-exchange-interface License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-exchange-offline@5f28f67ed156cd53bdadfe0bdf6b138b9b164467 --- exchange/offline/offline.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 5b4ad1685e..ffeafd5d92 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -5,10 +5,9 @@ package offline import ( "context" - exchange "github.com/ipfs/go-ipfs/exchange" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + exchange "gx/ipfs/QmdcAXgEHUueP4A7b5hjabKn2EooeHgMreMvFC249dGCgc/go-ipfs-exchange-interface" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) From a5d4f04b28a29a76419c36dbb7cd99369536740d Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 15:00:12 +0200 Subject: [PATCH 2003/3147] Extract: blocks/blocksutil to go-ipfs-blocksutil License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-exchange-offline@7c27fa9c3adb3d7b155c842c911aa97b69e1c9a4 --- exchange/offline/offline_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 19f2d77ae9..487d188a07 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -4,14 +4,13 @@ import ( "context" "testing" - "github.com/ipfs/go-ipfs/blocks/blocksutil" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" ds_sync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blocksutil "gx/ipfs/Qmf951DP11mCoctpyF3ZppPZdo2oAxuNi2vnkVDgHJ8Fqk/go-ipfs-blocksutil" ) func TestBlockReturnsErr(t *testing.T) { From 138b175ba11c507a8cbb79f21290a77acd210588 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 16:24:13 +0200 Subject: [PATCH 2004/3147] Extract: gx, readme, license, travis This commit was moved from ipfs/go-ipfs-exchange-offline@19894bd93a6f19c7e72617b2e0a3e5dca1f83772 --- exchange/offline/LICENSE | 21 +++++++++++++++ exchange/offline/Makefile | 18 +++++++++++++ exchange/offline/README.md | 46 ++++++++++++++++++++++++++++++++ exchange/offline/offline.go | 8 +++--- exchange/offline/offline_test.go | 14 +++++----- 5 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 exchange/offline/LICENSE create mode 100644 exchange/offline/Makefile create mode 100644 exchange/offline/README.md diff --git a/exchange/offline/LICENSE b/exchange/offline/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/exchange/offline/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/exchange/offline/Makefile b/exchange/offline/Makefile new file mode 100644 index 0000000000..73f2841f61 --- /dev/null +++ b/exchange/offline/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race -coverprofile=coverage.txt -covermode=atomic . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/exchange/offline/README.md b/exchange/offline/README.md new file mode 100644 index 0000000000..707099e9a8 --- /dev/null +++ b/exchange/offline/README.md @@ -0,0 +1,46 @@ +# go-ipfs-exchange-offline + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-exchange-offline?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-exchange-offline) +[![Build Status](https://travis-ci.org/ipfs/go-ipfs-exchange-offline.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-exchange-offline) + +> go-ipfs-exchange-offline implements the go-ipfs-exchange-interface + +This is an offline exchange implementation which will not perform any request. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-ipfs-exchange-offline` works like a regular Go module: + +``` +> go get github.com/ipfs/go-ipfs-exchange-offline +``` + +It uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. + +## Usage + +``` +import "github.com/ipfs/go-ipfs-exchange-offline" +``` + +Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-exchange-offline) + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index ffeafd5d92..c3a284c7e4 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -5,10 +5,10 @@ package offline import ( "context" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - exchange "gx/ipfs/QmdcAXgEHUueP4A7b5hjabKn2EooeHgMreMvFC249dGCgc/go-ipfs-exchange-interface" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + blockstore "github.com/ipfs/go-ipfs-blockstore" + exchange "github.com/ipfs/go-ipfs-exchange-interface" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 487d188a07..1592086216 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -4,13 +4,13 @@ import ( "context" "testing" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - ds_sync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - blocksutil "gx/ipfs/Qmf951DP11mCoctpyF3ZppPZdo2oAxuNi2vnkVDgHJ8Fqk/go-ipfs-blocksutil" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + ds_sync "github.com/ipfs/go-datastore/sync" + blockstore "github.com/ipfs/go-ipfs-blockstore" + blocksutil "github.com/ipfs/go-ipfs-blocksutil" + u "github.com/ipfs/go-ipfs-util" ) func TestBlockReturnsErr(t *testing.T) { From ba030c237a97bf6e3991831dd2122442a21b77c1 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 16 Apr 2018 17:49:54 -0300 Subject: [PATCH 2005/3147] dag: deduplicate AddNodeLinkClean into AddNodeLink `AddNodeLink` used to cache the linked node whereas `AddNodeLinkClean` did not, however, at some point the former was changed to do the same thing as the latter (i.e., not cache the linked node). That is, they now do the same thing so there's no reason to have both. The name `AddNodeLink` is preserved, even though it used to imply the cache functionality contrasting with the `Clean` suffix of `AddNodeLinkClean`, with this function removed the cache connotation doesn't hold anymore. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-ipfs-pinner@af580ea1b13624df041f48ab3be39e9fb36a45ea --- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 94da70ed32..e6a8a0850e 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -340,7 +340,7 @@ func TestPinRecursiveFail(t *testing.T) { a, _ := randNode() b, _ := randNode() - err := a.AddNodeLinkClean("child", b) + err := a.AddNodeLink("child", b) if err != nil { t.Fatal(err) } diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 8153227963..4fea86bd2a 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -74,7 +74,7 @@ func TestSet(t *testing.T) { // weird wrapper node because loadSet expects us to pass an // object pointing to multiple named sets setroot := &dag.ProtoNode{} - err = setroot.AddNodeLinkClean("foo", out) + err = setroot.AddNodeLink("foo", out) if err != nil { t.Fatal(err) } From d2d9783165ae4085cc7d0adbc7d7d1b6d6f77bec Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 16 Apr 2018 17:49:54 -0300 Subject: [PATCH 2006/3147] dag: deduplicate AddNodeLinkClean into AddNodeLink `AddNodeLink` used to cache the linked node whereas `AddNodeLinkClean` did not, however, at some point the former was changed to do the same thing as the latter (i.e., not cache the linked node). That is, they now do the same thing so there's no reason to have both. The name `AddNodeLink` is preserved, even though it used to imply the cache functionality contrasting with the `Clean` suffix of `AddNodeLinkClean`, with this function removed the cache connotation doesn't hold anymore. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@165433d217b834ba9673a73435e718c265770454 --- unixfs/io/dirbuilder.go | 2 +- unixfs/mod/dagmodifier.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 616617deed..e8cbff52d2 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -103,7 +103,7 @@ func (d *Directory) AddChild(ctx context.Context, name string, nd ipld.Node) err if d.shard == nil { if !UseHAMTSharding { _ = d.dirnode.RemoveNodeLink(name) - return d.dirnode.AddNodeLinkClean(name, nd) + return d.dirnode.AddNodeLink(name, nd) } err := d.switchToSharding(ctx) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0fe9df1e4e..edf05ecbad 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -561,7 +561,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi } nd.SetLinks(nd.Links()[:end]) - err = nd.AddNodeLinkClean("", modified) + err = nd.AddNodeLink("", modified) if err != nil { return nil, err } From 5e8974368d0e6ec6c09d77321f45b9d25ac74fec Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 14:39:17 +0200 Subject: [PATCH 2007/3147] Extract: exchange/interface.go to go-ipfs-exchange-interface License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@65f110bb15016b9520877d7c35266b37d0fde4ac --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index a54c0ff2ba..3b9f203eb0 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -9,12 +9,12 @@ import ( "fmt" "io" - exchange "github.com/ipfs/go-ipfs/exchange" "github.com/ipfs/go-ipfs/thirdparty/verifcid" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + exchange "gx/ipfs/QmdcAXgEHUueP4A7b5hjabKn2EooeHgMreMvFC249dGCgc/go-ipfs-exchange-interface" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) From e790fc7669289e6dd898400453822658e42f9095 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 15:00:12 +0200 Subject: [PATCH 2008/3147] Extract: blocks/blocksutil to go-ipfs-blocksutil License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@72a2ce66ee277cf3fff87dc5b9bd63d8faadd4e8 --- blockservice/blockservice_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index edcd4cd985..77e6645683 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,13 +3,13 @@ package blockservice import ( "testing" - butil "github.com/ipfs/go-ipfs/blocks/blocksutil" offline "github.com/ipfs/go-ipfs/exchange/offline" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + butil "gx/ipfs/Qmf951DP11mCoctpyF3ZppPZdo2oAxuNi2vnkVDgHJ8Fqk/go-ipfs-blocksutil" ) func TestWriteThroughWorks(t *testing.T) { From d752b9835c69b49d02a975a7b71e752c91b0e9da Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 16:30:32 +0200 Subject: [PATCH 2009/3147] Extract exchange/offline to go-ipfs-exchange offline License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@c5d98d7a764e6803a74334ac3a11c2f1d33ba3d6 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 8769db8e1c..1606a01799 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,12 +8,12 @@ import ( "strings" bserv "github.com/ipfs/go-ipfs/blockservice" - offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" "github.com/ipfs/go-ipfs/thirdparty/verifcid" logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" dstore "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" bstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 94da70ed32..69169c1746 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -6,10 +6,10 @@ import ( "time" bs "github.com/ipfs/go-ipfs/blockservice" - "github.com/ipfs/go-ipfs/exchange/offline" mdag "github.com/ipfs/go-ipfs/merkledag" util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 8153227963..3a266ecaa8 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -6,9 +6,9 @@ import ( "testing" bserv "github.com/ipfs/go-ipfs/blockservice" - offline "github.com/ipfs/go-ipfs/exchange/offline" dag "github.com/ipfs/go-ipfs/merkledag" + offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" From f7d9d0112b04149506c336594113b1c8cae5a92f Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 16:30:32 +0200 Subject: [PATCH 2010/3147] Extract exchange/offline to go-ipfs-exchange offline License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-blockservice@1793868c5ea62c5dae68540506e84ee0d573069a --- blockservice/blockservice_test.go | 3 +-- blockservice/test/blocks_test.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 77e6645683..eda9497c13 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,8 +3,7 @@ package blockservice import ( "testing" - offline "github.com/ipfs/go-ipfs/exchange/offline" - + offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 2a56afeb7e..978bc8658c 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -8,9 +8,9 @@ import ( "time" . "github.com/ipfs/go-ipfs/blockservice" - offline "github.com/ipfs/go-ipfs/exchange/offline" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" From 8b738d27b70819ca5bf77182e1bf098bce3c5864 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 3 Apr 2018 16:30:32 +0200 Subject: [PATCH 2011/3147] Extract exchange/offline to go-ipfs-exchange offline License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-mfs@f2a77a13453793425719daac03417efbd7d86786 --- mfs/mfs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 6255c90c47..f7f8c877bc 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -15,7 +15,6 @@ import ( "time" bserv "github.com/ipfs/go-ipfs/blockservice" - offline "github.com/ipfs/go-ipfs/exchange/offline" importer "github.com/ipfs/go-ipfs/importer" dag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/path" @@ -23,6 +22,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" From 54c696a60dc8c73b4fdf27bfb9ed9e23f4216ae6 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 19 Apr 2018 12:13:33 +0200 Subject: [PATCH 2012/3147] fix json License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@7cfca5e39ac19a7da8d506df2aa04e476fc92625 --- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 69169c1746..e65f8b63eb 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -340,7 +340,7 @@ func TestPinRecursiveFail(t *testing.T) { a, _ := randNode() b, _ := randNode() - err := a.AddNodeLinkClean("child", b) + err := a.AddNodeLink("child", b) if err != nil { t.Fatal(err) } diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 3a266ecaa8..f7d6d0ede4 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -74,7 +74,7 @@ func TestSet(t *testing.T) { // weird wrapper node because loadSet expects us to pass an // object pointing to multiple named sets setroot := &dag.ProtoNode{} - err = setroot.AddNodeLinkClean("foo", out) + err = setroot.AddNodeLink("foo", out) if err != nil { t.Fatal(err) } From 5a72bc2a21ca56fc4f0a3001cae5e22915d64e10 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 19 Apr 2018 12:13:33 +0200 Subject: [PATCH 2013/3147] fix json License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-unixfs@6facbb3a060d2b55d458048e8fdccac9bde26c9d --- unixfs/io/dirbuilder.go | 2 +- unixfs/mod/dagmodifier.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index 616617deed..e8cbff52d2 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -103,7 +103,7 @@ func (d *Directory) AddChild(ctx context.Context, name string, nd ipld.Node) err if d.shard == nil { if !UseHAMTSharding { _ = d.dirnode.RemoveNodeLink(name) - return d.dirnode.AddNodeLinkClean(name, nd) + return d.dirnode.AddNodeLink(name, nd) } err := d.switchToSharding(ctx) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0fe9df1e4e..edf05ecbad 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -561,7 +561,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi } nd.SetLinks(nd.Links()[:end]) - err = nd.AddNodeLinkClean("", modified) + err = nd.AddNodeLink("", modified) if err != nil { return nil, err } From 7e82d94fe773f4e069c6b798ce3eb0fa88e4e6f9 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 18 Apr 2018 16:43:20 +0200 Subject: [PATCH 2014/3147] cid-sec: fix bitswap strom caused by insecure CIDs When we introduced CID security we didn't take into account that bitswap might repeatly try getting the objects from the network if it fails putting them into the blockstore. Solution from this is not requesting those objects from bitswap. The proper solution of failing at CID creation will make in much more cleaner in future. License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@fab4b5edc46f95cab94297cd6bee6ce10e0cb2f2 --- blockservice/blockservice.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3b9f203eb0..b40c664734 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -251,15 +251,22 @@ func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan bloc func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) <-chan blocks.Block { out := make(chan blocks.Block) - for _, c := range ks { - // hash security - if err := verifcid.ValidateCid(c); err != nil { - log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) - } - } go func() { defer close(out) + + k := 0 + for _, c := range ks { + // hash security + if err := verifcid.ValidateCid(c); err == nil { + ks[k] = c + k++ + } else { + log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) + } + } + ks = ks[:k] + var misses []*cid.Cid for _, c := range ks { hit, err := bs.Get(c) From 2e85217a048994843c9ceeb776b74bc42f4ae67f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 20:53:45 -0700 Subject: [PATCH 2015/3147] gx update deps This commit was moved from ipfs/go-ipfs-routing@92235eb8773d209cf169403b969f2226f9183586 --- routing/offline/offline_test.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index a685dcab8f..548822b6a5 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -5,8 +5,10 @@ import ( "context" "testing" + cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" - "github.com/libp2p/go-testutil" + testutil "github.com/libp2p/go-testutil" + mh "github.com/multiformats/go-multihash" ) func TestOfflineRouterStorage(t *testing.T) { @@ -62,15 +64,17 @@ func TestOfflineRouterLocal(t *testing.T) { t.Fatal("OfflineRouting should alert that its offline") } - cid, _ := testutil.RandCidV0() - pChan := offline.FindProvidersAsync(ctx, cid, 1) + h, _ := mh.Sum([]byte("test data1"), mh.SHA2_256, -1) + c1 := cid.NewCidV0(h) + pChan := offline.FindProvidersAsync(ctx, c1, 1) p, ok := <-pChan if ok { t.Fatalf("FindProvidersAsync did not return a closed channel. Instead we got %+v !", p) } - cid, _ = testutil.RandCidV0() - err = offline.Provide(ctx, cid, true) + h2, _ := mh.Sum([]byte("test data1"), mh.SHA2_256, -1) + c2 := cid.NewCidV0(h2) + err = offline.Provide(ctx, c2, true) if err != ErrOffline { t.Fatal("OfflineRouting should alert that its offline") } From 3e90aa8079be712214517738384a50924c7148a8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 4 May 2018 18:06:17 -0700 Subject: [PATCH 2016/3147] fix the documentation This repo actually has 3 different packages which are documented independently. fixes #3 This commit was moved from ipfs/go-ipfs-routing@21c5e942ab4d78634d2e7e4727526f98480ad5fd --- routing/README.md | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/routing/README.md b/routing/README.md index 636148909f..b2b7a96d4e 100644 --- a/routing/README.md +++ b/routing/README.md @@ -3,7 +3,6 @@ [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-routing?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-routing) [![Build Status](https://travis-ci.org/ipfs/go-ipfs-routing.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-routing) > go-ipfs-routing provides go-libp2p-routing implementations used in go-ipfs. @@ -17,27 +16,60 @@ ## Install -`go-ipfs-routing` works like a regular Go module: +`go-ipfs-routing` works like a set of regular Go packages: ``` -> go get github.com/ipfs/go-ipfs-routing +> go get github.com/ipfs/go-ipfs-routing/... ``` -This module uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. +This module uses [Gx](https://github.com/whyrusleeping/gx) to manage +dependencies. You can use `make all` to build it with the `gx` dependencies. ## Usage +This repo contains 3 different packages. + +### Mock + +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-routing/mock?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-routing/mock) + +``` +import "github.com/ipfs/go-ipfs-routing/mock" +``` + +Mock is a fake router useful for tests. It provides a mock client that +implements the `IpfsRouting` interface and a mock server from which the client +retrieves routing records. + + +### Offline + +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-routing/offline?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-routing/offline) + +``` +import "github.com/ipfs/go-ipfs-routing/offline" +``` + +Offline is an offline router that can put and get records to and from a local +`Datastore` but can't retrieve them from the network. + +### None + +[![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-routing/none?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-routing/none) + ``` -import "github.com/ipfs/go-ipfs-routing" +import "github.com/ipfs/go-ipfs-routing/none" ``` -Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-routing) +None is a router no-op router that doesn't do anything. Puts always succeed and +lookups always fail. ## Contribute PRs accepted. -Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. +Small note: If editing the README, please conform to the +[standard-readme](https://github.com/RichardLitt/standard-readme) specification. ## License From 91879c039d477d46fe5e0aba58fa4bf7c675db62 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:04:12 -0700 Subject: [PATCH 2017/3147] update for routing interface changes Specifically, remove GetValues This commit was moved from ipfs/go-ipfs-routing@cc777593c6159ad81c0a2ed21c4af9ef0598a6e4 --- routing/mock/centralized_client.go | 15 +++------------ routing/none/none_client.go | 12 +++++------- routing/offline/offline.go | 26 +++----------------------- routing/offline/offline_test.go | 6 +++--- 4 files changed, 14 insertions(+), 45 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index f00f11a09d..c0d70f94a3 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -15,6 +15,7 @@ import ( pstore "github.com/libp2p/go-libp2p-peerstore" dhtpb "github.com/libp2p/go-libp2p-record/pb" routing "github.com/libp2p/go-libp2p-routing" + ropts "github.com/libp2p/go-libp2p-routing/options" "github.com/libp2p/go-testutil" ma "github.com/multiformats/go-multiaddr" ) @@ -28,7 +29,7 @@ type client struct { } // FIXME(brian): is this method meant to simulate putting a value into the network? -func (c *client) PutValue(ctx context.Context, key string, val []byte) error { +func (c *client) PutValue(ctx context.Context, key string, val []byte, opts ...ropts.Option) error { log.Debugf("PutValue: %s", key) rec := new(dhtpb.Record) rec.Value = val @@ -43,7 +44,7 @@ func (c *client) PutValue(ctx context.Context, key string, val []byte) error { } // FIXME(brian): is this method meant to simulate getting a value from the network? -func (c *client) GetValue(ctx context.Context, key string) ([]byte, error) { +func (c *client) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { log.Debugf("GetValue: %s", key) v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { @@ -64,16 +65,6 @@ func (c *client) GetValue(ctx context.Context, key string) ([]byte, error) { return rec.GetValue(), nil } -func (c *client) GetValues(ctx context.Context, key string, count int) ([]routing.RecvdVal, error) { - log.Debugf("GetValues: %s", key) - data, err := c.GetValue(ctx, key) - if err != nil { - return nil, err - } - - return []routing.RecvdVal{{Val: data, From: c.peer.ID()}}, nil -} - func (c *client) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { return c.server.Providers(key), nil } diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 8935708d1b..a7c1f8fc95 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -10,24 +10,22 @@ import ( p2phost "github.com/libp2p/go-libp2p-host" peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" + record "github.com/libp2p/go-libp2p-record" routing "github.com/libp2p/go-libp2p-routing" + ropts "github.com/libp2p/go-libp2p-routing/options" ) type nilclient struct { } -func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte) error { +func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte, _ ...ropts.Option) error { return nil } -func (c *nilclient) GetValue(_ context.Context, _ string) ([]byte, error) { +func (c *nilclient) GetValue(_ context.Context, _ string, _ ...ropts.Option) ([]byte, error) { return nil, errors.New("tried GetValue from nil routing") } -func (c *nilclient) GetValues(_ context.Context, _ string, _ int) ([]routing.RecvdVal, error) { - return nil, errors.New("tried GetValues from nil routing") -} - func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, error) { return pstore.PeerInfo{}, nil } @@ -47,7 +45,7 @@ func (c *nilclient) Bootstrap(_ context.Context) error { } // ConstructNilRouting creates an IpfsRouting client which does nothing. -func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.Batching) (routing.IpfsRouting, error) { +func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.Batching, _ record.Validator) (routing.IpfsRouting, error) { return &nilclient{}, nil } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index f008e25292..422af8d61e 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -17,6 +17,7 @@ import ( record "github.com/libp2p/go-libp2p-record" pb "github.com/libp2p/go-libp2p-record/pb" routing "github.com/libp2p/go-libp2p-routing" + ropts "github.com/libp2p/go-libp2p-routing/options" ) // ErrOffline is returned when trying to perform operations that @@ -41,7 +42,7 @@ type offlineRouting struct { sk ci.PrivKey } -func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte) error { +func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ ...ropts.Option) error { rec := record.MakePutRecord(key, val) data, err := proto.Marshal(rec) if err != nil { @@ -51,7 +52,7 @@ func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte) e return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data) } -func (c *offlineRouting) GetValue(ctx context.Context, key string) ([]byte, error) { +func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Option) ([]byte, error) { v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err @@ -70,27 +71,6 @@ func (c *offlineRouting) GetValue(ctx context.Context, key string) ([]byte, erro return rec.GetValue(), nil } -func (c *offlineRouting) GetValues(ctx context.Context, key string, _ int) ([]routing.RecvdVal, error) { - v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) - if err != nil { - return nil, err - } - - byt, ok := v.([]byte) - if !ok { - return nil, errors.New("value stored in datastore not []byte") - } - rec := new(pb.Record) - err = proto.Unmarshal(byt, rec) - if err != nil { - return nil, err - } - - return []routing.RecvdVal{ - {Val: rec.GetValue()}, - }, nil -} - func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { return pstore.PeerInfo{}, ErrOffline } diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 548822b6a5..61670f442c 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -7,6 +7,7 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" + ropt "github.com/libp2p/go-libp2p-routing/options" testutil "github.com/libp2p/go-testutil" mh "github.com/multiformats/go-multihash" ) @@ -35,17 +36,16 @@ func TestOfflineRouterStorage(t *testing.T) { t.Fatal("Router should throw errors for unfound records") } - recVal, err := offline.GetValues(ctx, "key", 0) + local, err := offline.GetValue(ctx, "key", ropt.Offline) if err != nil { t.Fatal(err) } - _, err = offline.GetValues(ctx, "notHere", 0) + _, err = offline.GetValue(ctx, "notHere", ropt.Offline) if err == nil { t.Fatal("Router should throw errors for unfound records") } - local := recVal[0].Val if !bytes.Equal([]byte("testing 1 2 3"), local) { t.Fatal("OfflineRouter does not properly store") } From cd66f5d11e53811eb676e16b956f90c3492e32ab Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2018/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@2d4a451ff32beb43c365eeae1f1ade3aa9990850 --- namesys/interface.go | 2 +- namesys/ipns_select_test.go | 2 +- namesys/ipns_validate_test.go | 20 ++++++++++---------- namesys/namesys.go | 12 ++++++------ namesys/namesys_test.go | 8 ++++---- namesys/publisher.go | 12 ++++++------ namesys/publisher_test.go | 14 +++++++------- namesys/pubsub.go | 22 +++++++++++----------- namesys/pubsub_test.go | 22 +++++++++++----------- namesys/republisher/repub.go | 14 +++++++------- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 6 +++--- namesys/validator.go | 6 +++--- 14 files changed, 77 insertions(+), 77 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 4def9b1d71..fcd619b49f 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -38,7 +38,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 7489f139b1..9ba39ce7f3 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -11,7 +11,7 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index ac3fb84701..44149180e9 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -10,17 +10,17 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" - recordpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" - testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" + record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" + recordpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" + routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns string, key string, val []byte, eol time.Time, exp error) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 9b4cdf3f72..47e1f874fa 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -10,14 +10,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" - p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" - floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + floodsub "gx/ipfs/QmVKrsEgixRtMWcMd6WQzuwqCUC3jfLf7Q7xcjnKoMMikS/go-libp2p-floodsub" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + p2phost "gx/ipfs/QmfZTdmunzKzAGJrSvXXQbQ5kLLUiEMX5vdwux7iXkdk7D/go-libp2p-host" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 9b27cf3220..03ba60ed05 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,10 +10,10 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - offroute "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/offline" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + offroute "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/offline" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index b485b24b21..d75a4e5cfb 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -12,13 +12,13 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" - dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + dhtpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" + routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) const PublishPutValTimeout = time.Minute diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 20f774fa3c..e4ad1fa694 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,14 +8,14 @@ import ( path "github.com/ipfs/go-ipfs/path" - dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" - testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" + mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" + testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) type identity struct { diff --git a/namesys/pubsub.go b/namesys/pubsub.go index 9171b16ccf..ba4a73f660 100644 --- a/namesys/pubsub.go +++ b/namesys/pubsub.go @@ -13,20 +13,20 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" - floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" - dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" + dhtpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" + routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + floodsub "gx/ipfs/QmVKrsEgixRtMWcMd6WQzuwqCUC3jfLf7Q7xcjnKoMMikS/go-libp2p-floodsub" + dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" + p2phost "gx/ipfs/QmfZTdmunzKzAGJrSvXXQbQ5kLLUiEMX5vdwux7iXkdk7D/go-libp2p-host" ) // PubsubPublisher is a publisher that distributes IPNS records through pubsub diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go index 16dae39fc9..46e414b9dd 100644 --- a/namesys/pubsub_test.go +++ b/namesys/pubsub_test.go @@ -8,17 +8,17 @@ import ( path "github.com/ipfs/go-ipfs/path" - p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host" - bhost "gx/ipfs/QmQr1j6UvdhpponAaqSdswqRpdzsFwNop2N8kXLNw8afem/go-libp2p-blankhost" - floodsub "gx/ipfs/QmSFihvoND3eDaAYRCeLgLPt62yCPgMZs1NSZmKFEtJQQw/go-libp2p-floodsub" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" - netutil "gx/ipfs/QmYVR3C8DWPHdHxvLtNFYfjsXgaRAdh6hPMNH3KiwCgu4o/go-libp2p-netutil" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" + routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" + floodsub "gx/ipfs/QmVKrsEgixRtMWcMd6WQzuwqCUC3jfLf7Q7xcjnKoMMikS/go-libp2p-floodsub" + netutil "gx/ipfs/Qmb6BsZf6Y3kxffXMNTubGPF1w1bkHtpvhfYbmnwP3NQyw/go-libp2p-netutil" + bhost "gx/ipfs/Qmc64U41EEB4nPG7wxjEqFwKJajS2f8kk5q2TvUrQf78Xu/go-libp2p-blankhost" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + p2phost "gx/ipfs/QmfZTdmunzKzAGJrSvXXQbQ5kLLUiEMX5vdwux7iXkdk7D/go-libp2p-host" ) func newNetHost(ctx context.Context, t *testing.T) p2phost.Host { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 0aabf37382..db7ae590e6 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -10,16 +10,16 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" - dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" - recpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + recpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" + routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" - ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 580b708de7..f47df4696e 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -12,9 +12,9 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmNh1kGFFdsPu79KNSaL4NUKUPb4Eiz4KHdMtFY6664RDp/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" + mocknet "gx/ipfs/QmWsV6kzPaYGBDVyuUfWBvyQygEc9Qrv9vzo8vZ7X4mdLN/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 9999801e40..39a6700880 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,11 +8,11 @@ import ( path "github.com/ipfs/go-ipfs/path" - testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" + testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index ccf3050667..5831e3ea6d 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -10,12 +10,12 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) diff --git a/namesys/validator.go b/namesys/validator.go index c50da55126..cde4e92ed4 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -5,11 +5,11 @@ import ( "time" pb "github.com/ipfs/go-ipfs/namesys/pb" - pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record" + record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) From 65edf608a326ace0c73657ec98ccb81c1cac2f94 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2019/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@a6bfe5b679e3ea0cfb216541184fff6a007749d3 --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 8 ++++---- blockservice/test/blocks_test.go | 8 ++++---- blockservice/test/mock.go | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index b40c664734..c913d1c58c 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,8 +11,8 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/verifcid" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" exchange "gx/ipfs/QmdcAXgEHUueP4A7b5hjabKn2EooeHgMreMvFC249dGCgc/go-ipfs-exchange-interface" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index eda9497c13..af9cbe8b51 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,10 +3,10 @@ package blockservice import ( "testing" - offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" butil "gx/ipfs/Qmf951DP11mCoctpyF3ZppPZdo2oAxuNi2vnkVDgHJ8Fqk/go-ipfs-blocksutil" ) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 978bc8658c..2ba4450791 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,11 +10,11 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index a9c34d42d7..5fe23cb848 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,8 +5,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" + mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - mockrouting "gx/ipfs/QmXtoXbu9ReyV6Q4kDQ5CF9wXQNDY1PdHc4HhfxRR5AHB3/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 85774db2adeb04f5ee6b21397203a84fae421876 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2020/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@fc412d643afb03d5e3c143074cd7d7991ac30be8 --- filestore/filestore.go | 6 +++--- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 87819e8311..5342cfa172 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -10,11 +10,11 @@ package filestore import ( "context" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 4bb8bfa04f..3a67dba1ea 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,10 +9,10 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index dbdb8396f3..c5e255c6cb 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,13 +10,13 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dsns "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/namespace" - dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" + dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) diff --git a/filestore/util.go b/filestore/util.go index ce03ba9270..e09b69744c 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmTmqJGRQfuH8eKWD1FjThwPRipt1QhqJQNZ8MpzmfAAxo/go-ipfs-ds-help" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) // Status is used to identify the state of the block data referenced From b5c18b01c6494492636a82a08ffe428a1b4346c9 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2021/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@f120e1b035b406450f6cd096c4b3598adaac21fa --- path/resolver/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 203fe9ce95..d4e0588296 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -10,7 +10,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From ca880060536149e4179f2d2fa07539075c736ec6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2022/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@a7fcad1350d93f711f96bfc20b2e3e4d220e1377 --- pinning/pinner/gc/gc.go | 8 ++++---- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 8 ++++---- pinning/pinner/set_test.go | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 1606a01799..95e706dbcb 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -12,12 +12,12 @@ import ( pin "github.com/ipfs/go-ipfs/pin" "github.com/ipfs/go-ipfs/thirdparty/verifcid" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" - dstore "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - bstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" + bstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ce77798835..f4024f0c01 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,10 +12,10 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index e65f8b63eb..27963c371e 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -9,11 +9,11 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index f7d6d0ede4..a54dd84fce 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -8,11 +8,11 @@ import ( bserv "github.com/ipfs/go-ipfs/blockservice" dag "github.com/ipfs/go-ipfs/merkledag" - offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dsq "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/query" - blockstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) func ignoreCids(_ *cid.Cid) {} From 409ef18c182e709408cd171c8391feffd14b2636 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2023/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-keystore@432500c60b199219faf5620dda08b08175d61ef9 --- keystore/keystore.go | 4 ++-- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 5dd4338528..a11b5d5f35 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,8 +7,8 @@ import ( "path/filepath" "strings" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) var log = logging.Logger("keystore") diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 5058964f86..f8ef62f49f 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" + ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 6d07f6dc37..4a525ce590 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto" +import ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. From 28060cf31c15ceebd6b4fde229cd1fd0741f0a99 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2024/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@5c2e2438ca5cdf1747e654045e7f10c56c0d3ec6 --- unixfs/mod/dagmodifier.go | 2 +- unixfs/test/utils.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index f8a616ddae..12781b2196 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,8 +14,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 574b7ec972..046384679d 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -15,8 +15,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From 25e387edabb92544b8a019bae7b025653dbb107f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:39:52 -0700 Subject: [PATCH 2025/3147] update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@4a937c2edd295a80bb0adfc68ca15ae80e43332e --- mfs/file.go | 2 +- mfs/mfs_test.go | 10 +++++----- mfs/repub_test.go | 2 +- mfs/system.go | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index 11d4a2a75e..3839a279d9 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -9,7 +9,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" + chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index f7f8c877bc..0fdeed8e56 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -22,13 +22,13 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - offline "gx/ipfs/QmWM5HhdG5ZQNyHQ5XhMdGmV9CvLpFynQfGpTxN2MEM7Lc/go-ipfs-exchange-offline" - chunker "gx/ipfs/QmWo8jYc19ppG7YoTsrr2kEtLRbARTJho5oNXFTR6B7Peq/go-ipfs-chunker" - ds "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore" - dssync "gx/ipfs/QmXRKBQA4wXP7xWbFiZsR1GP4HV6wMDQ1aWFxZZ4uBcPX9/go-datastore/sync" - bstore "gx/ipfs/QmaG4DZ4JaqEfvPWt5nPPgoTzhc1tr1T3f4Nu9Jpdm8ymY/go-ipfs-blockstore" + offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" + bstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" + chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 15400c9a3d..14eaa30012 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - ci "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil/ci" + ci "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil/ci" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ) diff --git a/mfs/system.go b/mfs/system.go index d93af7cfdc..a86ecf735a 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,7 +19,7 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log" + logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) From a9927d7ff2dfe30c18078a293f04be844c22dbeb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 3 May 2018 21:55:38 -0700 Subject: [PATCH 2026/3147] extract IPNS over pubsub as a ValueStore And: * Update for DHT changes. * Switch to the new record validation system. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@2c8314dee1bf1e4abaa683486382869fd87aa419 --- namesys/interface.go | 8 - namesys/ipns_validate_test.go | 78 ++----- namesys/namesys.go | 33 --- namesys/publisher.go | 2 +- namesys/publisher_test.go | 9 +- namesys/pubsub.go | 426 ---------------------------------- namesys/pubsub_test.go | 197 ---------------- namesys/routing.go | 50 +--- namesys/selector.go | 63 ----- namesys/validator.go | 139 +++++++---- 10 files changed, 127 insertions(+), 878 deletions(-) delete mode 100644 namesys/pubsub.go delete mode 100644 namesys/pubsub_test.go delete mode 100644 namesys/selector.go diff --git a/namesys/interface.go b/namesys/interface.go index fcd619b49f..6536ac7121 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -61,7 +61,6 @@ var ErrPublishFailed = errors.New("could not publish name") type NameSystem interface { Resolver Publisher - ResolverLookup } // Resolver is an object capable of resolving names. @@ -95,10 +94,3 @@ type Publisher interface { // call once the records spec is implemented PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error } - -// ResolverLookup is an object capable of finding resolvers for a subsystem -type ResolverLookup interface { - - // GetResolver retrieves a resolver associated with a subsystem - GetResolver(subs string) (Resolver, bool) -} diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 44149180e9..bcffcc5e61 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -12,8 +12,8 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" - recordpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + ropts "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing/options" testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" @@ -23,8 +23,10 @@ import ( dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) -func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns string, key string, val []byte, eol time.Time, exp error) { - validChecker := NewIpnsRecordValidator(kbook) +func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { + t.Helper() + + validator := IpnsValidator{kbook} p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") entry, err := CreateRoutingEntryData(priv, p, 1, eol) @@ -39,15 +41,9 @@ func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, ns s t.Fatal(err) } } - rec := &record.ValidationRecord{ - Namespace: ns, - Key: key, - Value: data, - } - - err = validChecker.Func(rec) + err = validator.Validate(key, data) if err != exp { - params := fmt.Sprintf("namespace: %s\nkey: %s\neol: %s\n", ns, key, eol) + params := fmt.Sprintf("key: %s\neol: %s\n", key, eol) if exp == nil { t.Fatalf("Unexpected error %s for params %s", err, params) } else if err == nil { @@ -67,15 +63,15 @@ func TestValidator(t *testing.T) { kbook.AddPubKey(id, priv.GetPublic()) emptyKbook := pstore.NewPeerstore() - testValidatorCase(t, priv, kbook, "ipns", string(id), nil, ts.Add(time.Hour), nil) - testValidatorCase(t, priv, kbook, "ipns", string(id), nil, ts.Add(time.Hour*-1), ErrExpiredRecord) - testValidatorCase(t, priv, kbook, "ipns", string(id), []byte("bad data"), ts.Add(time.Hour), ErrBadRecord) - testValidatorCase(t, priv, kbook, "ipns", "bad key", nil, ts.Add(time.Hour), ErrKeyFormat) - testValidatorCase(t, priv, emptyKbook, "ipns", string(id), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) - testValidatorCase(t, priv2, kbook, "ipns", string(id2), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) - testValidatorCase(t, priv2, kbook, "ipns", string(id), nil, ts.Add(time.Hour), ErrSignature) - testValidatorCase(t, priv, kbook, "", string(id), nil, ts.Add(time.Hour), ErrInvalidPath) - testValidatorCase(t, priv, kbook, "wrong", string(id), nil, ts.Add(time.Hour), ErrInvalidPath) + testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), nil) + testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour*-1), ErrExpiredRecord) + testValidatorCase(t, priv, kbook, "/ipns/"+string(id), []byte("bad data"), ts.Add(time.Hour), ErrBadRecord) + testValidatorCase(t, priv, kbook, "/ipns/"+"bad key", nil, ts.Add(time.Hour), ErrKeyFormat) + testValidatorCase(t, priv, emptyKbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) + testValidatorCase(t, priv2, kbook, "/ipns/"+string(id2), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) + testValidatorCase(t, priv2, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), ErrSignature) + testValidatorCase(t, priv, kbook, "//"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) + testValidatorCase(t, priv, kbook, "/wrong/"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) } func TestResolverValidation(t *testing.T) { @@ -85,13 +81,6 @@ func TestResolverValidation(t *testing.T) { peerstore := pstore.NewPeerstore() vstore := newMockValueStore(rid, dstore, peerstore) - vstore.Validator["ipns"] = NewIpnsRecordValidator(peerstore) - vstore.Validator["pk"] = &record.ValidChecker{ - Func: func(r *record.ValidationRecord) error { - return nil - }, - Sign: false, - } resolver := NewRoutingResolver(vstore, 0) // Create entry with expiry in one hour @@ -224,19 +213,19 @@ type mockValueStore struct { func newMockValueStore(id testutil.Identity, dstore ds.Datastore, kbook pstore.KeyBook) *mockValueStore { serv := mockrouting.NewServer() r := serv.ClientWithDatastore(context.Background(), id, dstore) - return &mockValueStore{r, kbook, make(record.Validator)} + return &mockValueStore{r, kbook, record.NamespacedValidator{ + "ipns": IpnsValidator{kbook}, + "pk": record.PublicKeyValidator{}, + }} } -func (m *mockValueStore) GetValue(ctx context.Context, k string) ([]byte, error) { - data, err := m.r.GetValue(ctx, k) +func (m *mockValueStore) GetValue(ctx context.Context, k string, opts ...ropts.Option) ([]byte, error) { + data, err := m.r.GetValue(ctx, k, opts...) if err != nil { return data, err } - rec := new(recordpb.Record) - rec.Key = proto.String(k) - rec.Value = data - if err = m.Validator.VerifyRecord(rec); err != nil { + if err = m.Validator.Validate(k, data); err != nil { return nil, err } @@ -263,23 +252,6 @@ func (m *mockValueStore) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey return pk, m.kbook.AddPubKey(p, pk) } -func (m *mockValueStore) GetValues(ctx context.Context, k string, count int) ([]routing.RecvdVal, error) { - vals, err := m.r.GetValues(ctx, k, count) - if err != nil { - return nil, err - } - valid := make([]routing.RecvdVal, 0, len(vals)) - for _, v := range vals { - rec := new(recordpb.Record) - rec.Key = proto.String(k) - rec.Value = v.Val - if err = m.Validator.VerifyRecord(rec); err == nil { - valid = append(valid, v) - } - } - return valid, nil -} - -func (m *mockValueStore) PutValue(ctx context.Context, k string, d []byte) error { - return m.r.PutValue(ctx, k, d) +func (m *mockValueStore) PutValue(ctx context.Context, k string, d []byte, opts ...ropts.Option) error { + return m.r.PutValue(ctx, k, d, opts...) } diff --git a/namesys/namesys.go b/namesys/namesys.go index 47e1f874fa..6e37d1c6fa 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -2,7 +2,6 @@ package namesys import ( "context" - "errors" "strings" "sync" "time" @@ -11,13 +10,11 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" - floodsub "gx/ipfs/QmVKrsEgixRtMWcMd6WQzuwqCUC3jfLf7Q7xcjnKoMMikS/go-libp2p-floodsub" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - p2phost "gx/ipfs/QmfZTdmunzKzAGJrSvXXQbQ5kLLUiEMX5vdwux7iXkdk7D/go-libp2p-host" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. @@ -48,23 +45,6 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSys } } -// AddPubsubNameSystem adds the pubsub publisher and resolver to the namesystem -func AddPubsubNameSystem(ctx context.Context, ns NameSystem, host p2phost.Host, r routing.IpfsRouting, ds ds.Datastore, ps *floodsub.PubSub) error { - mpns, ok := ns.(*mpns) - if !ok { - return errors.New("unexpected NameSystem; not an mpns instance") - } - - pkf, ok := r.(routing.PubKeyFetcher) - if !ok { - return errors.New("unexpected IpfsRouting; not a PubKeyFetcher instance") - } - - mpns.resolvers["pubsub"] = NewPubsubResolver(ctx, host, r, pkf, ps) - mpns.publishers["pubsub"] = NewPubsubPublisher(ctx, host, ds, r, ps) - return nil -} - const DefaultResolverCacheTTL = time.Minute // Resolve implements Resolver. @@ -219,16 +199,3 @@ func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { eol: eol, }) } - -// GetResolver implements ResolverLookup -func (ns *mpns) GetResolver(subs string) (Resolver, bool) { - res, ok := ns.resolvers[subs] - if ok { - ires, ok := res.(Resolver) - if ok { - return ires, true - } - } - - return nil, false -} diff --git a/namesys/publisher.go b/namesys/publisher.go index d75a4e5cfb..2e470d66b3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -142,7 +142,7 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn errs := make(chan error, 2) // At most two errors (IPNS, and public key) // Attempt to extract the public key from the ID - extractedPublicKey := id.ExtractPublicKey() + extractedPublicKey, _ := id.ExtractPublicKey() go func() { errs <- PublishEntry(ctx, r, ipnskey, entry) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index e4ad1fa694..39a9753329 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -49,14 +49,7 @@ func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expected } // ID - var id peer.ID - switch keyType { - case ci.Ed25519: - id, err = peer.IDFromEd25519PublicKey(pubKey) - default: - id, err = peer.IDFromPublicKey(pubKey) - } - + id, err := peer.IDFromPublicKey(pubKey) if err != nil { t.Fatal(err) } diff --git a/namesys/pubsub.go b/namesys/pubsub.go deleted file mode 100644 index ba4a73f660..0000000000 --- a/namesys/pubsub.go +++ /dev/null @@ -1,426 +0,0 @@ -package namesys - -import ( - "context" - "errors" - "fmt" - "strings" - "sync" - "time" - - opts "github.com/ipfs/go-ipfs/namesys/opts" - pb "github.com/ipfs/go-ipfs/namesys/pb" - path "github.com/ipfs/go-ipfs/path" - - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" - dhtpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" - routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" - floodsub "gx/ipfs/QmVKrsEgixRtMWcMd6WQzuwqCUC3jfLf7Q7xcjnKoMMikS/go-libp2p-floodsub" - dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" - p2phost "gx/ipfs/QmfZTdmunzKzAGJrSvXXQbQ5kLLUiEMX5vdwux7iXkdk7D/go-libp2p-host" -) - -// PubsubPublisher is a publisher that distributes IPNS records through pubsub -type PubsubPublisher struct { - ctx context.Context - ds ds.Datastore - host p2phost.Host - cr routing.ContentRouting - ps *floodsub.PubSub - - mx sync.Mutex - subs map[string]struct{} -} - -// PubsubResolver is a resolver that receives IPNS records through pubsub -type PubsubResolver struct { - ctx context.Context - ds ds.Datastore - host p2phost.Host - cr routing.ContentRouting - pkf routing.PubKeyFetcher - ps *floodsub.PubSub - - mx sync.Mutex - subs map[string]*floodsub.Subscription -} - -// NewPubsubPublisher constructs a new Publisher that publishes IPNS records through pubsub. -// The constructor interface is complicated by the need to bootstrap the pubsub topic. -// This could be greatly simplified if the pubsub implementation handled bootstrap itself -func NewPubsubPublisher(ctx context.Context, host p2phost.Host, ds ds.Datastore, cr routing.ContentRouting, ps *floodsub.PubSub) *PubsubPublisher { - return &PubsubPublisher{ - ctx: ctx, - ds: ds, - host: host, // needed for pubsub bootstrap - cr: cr, // needed for pubsub bootstrap - ps: ps, - subs: make(map[string]struct{}), - } -} - -// NewPubsubResolver constructs a new Resolver that resolves IPNS records through pubsub. -// same as above for pubsub bootstrap dependencies -func NewPubsubResolver(ctx context.Context, host p2phost.Host, cr routing.ContentRouting, pkf routing.PubKeyFetcher, ps *floodsub.PubSub) *PubsubResolver { - return &PubsubResolver{ - ctx: ctx, - ds: dssync.MutexWrap(ds.NewMapDatastore()), - host: host, // needed for pubsub bootstrap - cr: cr, // needed for pubsub bootstrap - pkf: pkf, - ps: ps, - subs: make(map[string]*floodsub.Subscription), - } -} - -// Publish publishes an IPNS record through pubsub with default TTL -func (p *PubsubPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { - return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordTTL)) -} - -// PublishWithEOL publishes an IPNS record through pubsub -func (p *PubsubPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { - id, err := peer.IDFromPrivateKey(k) - if err != nil { - return err - } - - _, ipnskey := IpnsKeysForID(id) - - seqno, err := p.getPreviousSeqNo(ctx, ipnskey) - if err != nil { - return err - } - - seqno++ - - return p.publishRecord(ctx, k, value, seqno, eol, ipnskey, id) -} - -func (p *PubsubPublisher) getPreviousSeqNo(ctx context.Context, ipnskey string) (uint64, error) { - // the datastore is shared with the routing publisher to properly increment and persist - // ipns record sequence numbers. - prevrec, err := p.ds.Get(dshelp.NewKeyFromBinary([]byte(ipnskey))) - if err != nil { - if err == ds.ErrNotFound { - // None found, lets start at zero! - return 0, nil - } - return 0, err - } - - prbytes, ok := prevrec.([]byte) - if !ok { - return 0, fmt.Errorf("unexpected type returned from datastore: %#v", prevrec) - } - - var dsrec dhtpb.Record - err = proto.Unmarshal(prbytes, &dsrec) - if err != nil { - return 0, err - } - - var entry pb.IpnsEntry - err = proto.Unmarshal(dsrec.GetValue(), &entry) - if err != nil { - return 0, err - } - - return entry.GetSequence(), nil -} - -func (p *PubsubPublisher) publishRecord(ctx context.Context, k ci.PrivKey, value path.Path, seqno uint64, eol time.Time, ipnskey string, ID peer.ID) error { - entry, err := CreateRoutingEntryData(k, value, seqno, eol) - if err != nil { - return err - } - - data, err := proto.Marshal(entry) - if err != nil { - return err - } - - // the datastore is shared with the routing publisher to properly increment and persist - // ipns record sequence numbers; so we need to Record our new entry in the datastore - dsrec, err := record.MakePutRecord(k, ipnskey, data, true) - if err != nil { - return err - } - - dsdata, err := proto.Marshal(dsrec) - if err != nil { - return err - } - - err = p.ds.Put(dshelp.NewKeyFromBinary([]byte(ipnskey)), dsdata) - if err != nil { - return err - } - - // now we publish, but we also need to bootstrap pubsub for our messages to propagate - topic := "/ipns/" + ID.Pretty() - - p.mx.Lock() - _, ok := p.subs[topic] - - if !ok { - p.subs[topic] = struct{}{} - p.mx.Unlock() - - bootstrapPubsub(p.ctx, p.cr, p.host, topic) - } else { - p.mx.Unlock() - } - - log.Debugf("PubsubPublish: publish IPNS record for %s (%d)", topic, seqno) - return p.ps.Publish(topic, data) -} - -// Resolve resolves a name through pubsub and default depth limit -func (r *PubsubResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { - return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") -} - -func (r *PubsubResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { - log.Debugf("PubsubResolve: resolve '%s'", name) - - // retrieve the public key once (for verifying messages) - xname := strings.TrimPrefix(name, "/ipns/") - hash, err := mh.FromB58String(xname) - if err != nil { - log.Warningf("PubsubResolve: bad input hash: [%s]", xname) - return "", err - } - - id := peer.ID(hash) - if r.host.Peerstore().PrivKey(id) != nil { - return "", errors.New("cannot resolve own name through pubsub") - } - - pubk := id.ExtractPublicKey() - if pubk == nil { - pubk, err = r.pkf.GetPublicKey(ctx, id) - if err != nil { - log.Warningf("PubsubResolve: error fetching public key: %s [%s]", err.Error(), xname) - return "", err - } - } - - // the topic is /ipns/Qmhash - if !strings.HasPrefix(name, "/ipns/") { - name = "/ipns/" + name - } - - r.mx.Lock() - // see if we already have a pubsub subscription; if not, subscribe - sub, ok := r.subs[name] - if !ok { - sub, err = r.ps.Subscribe(name) - if err != nil { - r.mx.Unlock() - return "", err - } - - log.Debugf("PubsubResolve: subscribed to %s", name) - - r.subs[name] = sub - - ctx, cancel := context.WithCancel(r.ctx) - go r.handleSubscription(sub, name, pubk, cancel) - go bootstrapPubsub(ctx, r.cr, r.host, name) - } - r.mx.Unlock() - - // resolve to what we may already have in the datastore - dsval, err := r.ds.Get(dshelp.NewKeyFromBinary([]byte(name))) - if err != nil { - if err == ds.ErrNotFound { - return "", ErrResolveFailed - } - return "", err - } - - data := dsval.([]byte) - entry := new(pb.IpnsEntry) - - err = proto.Unmarshal(data, entry) - if err != nil { - return "", err - } - - // check EOL; if the entry has expired, delete from datastore and return ds.ErrNotFound - eol, ok := checkEOL(entry) - if ok && eol.Before(time.Now()) { - err = r.ds.Delete(dshelp.NewKeyFromBinary([]byte(name))) - if err != nil { - log.Warningf("PubsubResolve: error deleting stale value for %s: %s", name, err.Error()) - } - - return "", ErrResolveFailed - } - - value, err := path.ParsePath(string(entry.GetValue())) - return value, err -} - -// GetSubscriptions retrieves a list of active topic subscriptions -func (r *PubsubResolver) GetSubscriptions() []string { - r.mx.Lock() - defer r.mx.Unlock() - - var res []string - for sub := range r.subs { - res = append(res, sub) - } - - return res -} - -// Cancel cancels a topic subscription; returns true if an active -// subscription was canceled -func (r *PubsubResolver) Cancel(name string) bool { - r.mx.Lock() - defer r.mx.Unlock() - - sub, ok := r.subs[name] - if ok { - sub.Cancel() - delete(r.subs, name) - } - - return ok -} - -func (r *PubsubResolver) handleSubscription(sub *floodsub.Subscription, name string, pubk ci.PubKey, cancel func()) { - defer sub.Cancel() - defer cancel() - - for { - msg, err := sub.Next(r.ctx) - if err != nil { - if err != context.Canceled { - log.Warningf("PubsubResolve: subscription error in %s: %s", name, err.Error()) - } - return - } - - err = r.receive(msg, name, pubk) - if err != nil { - log.Warningf("PubsubResolve: error processing update for %s: %s", name, err.Error()) - } - } -} - -func (r *PubsubResolver) receive(msg *floodsub.Message, name string, pubk ci.PubKey) error { - data := msg.GetData() - if data == nil { - return errors.New("empty message") - } - - entry := new(pb.IpnsEntry) - err := proto.Unmarshal(data, entry) - if err != nil { - return err - } - - ok, err := pubk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()) - if err != nil || !ok { - return errors.New("signature verification failed") - } - - _, err = path.ParsePath(string(entry.GetValue())) - if err != nil { - return err - } - - eol, ok := checkEOL(entry) - if ok && eol.Before(time.Now()) { - return errors.New("stale update; EOL exceeded") - } - - // check the sequence number against what we may already have in our datastore - oval, err := r.ds.Get(dshelp.NewKeyFromBinary([]byte(name))) - if err == nil { - odata := oval.([]byte) - oentry := new(pb.IpnsEntry) - - err = proto.Unmarshal(odata, oentry) - if err != nil { - return err - } - - if entry.GetSequence() <= oentry.GetSequence() { - return errors.New("stale update; sequence number too small") - } - } - - log.Debugf("PubsubResolve: receive IPNS record for %s", name) - - return r.ds.Put(dshelp.NewKeyFromBinary([]byte(name)), data) -} - -// rendezvous with peers in the name topic through provider records -// Note: rendezvous/boostrap should really be handled by the pubsub implementation itself! -func bootstrapPubsub(ctx context.Context, cr routing.ContentRouting, host p2phost.Host, name string) { - topic := "floodsub:" + name - hash := u.Hash([]byte(topic)) - rz := cid.NewCidV1(cid.Raw, hash) - - err := cr.Provide(ctx, rz, true) - if err != nil { - log.Warningf("bootstrapPubsub: error providing rendezvous for %s: %s", topic, err.Error()) - } - - go func() { - for { - select { - case <-time.After(8 * time.Hour): - err := cr.Provide(ctx, rz, true) - if err != nil { - log.Warningf("bootstrapPubsub: error providing rendezvous for %s: %s", topic, err.Error()) - } - case <-ctx.Done(): - return - } - } - }() - - rzctx, cancel := context.WithTimeout(ctx, time.Second*10) - defer cancel() - - wg := &sync.WaitGroup{} - for pi := range cr.FindProvidersAsync(rzctx, rz, 10) { - if pi.ID == host.ID() { - continue - } - wg.Add(1) - go func(pi pstore.PeerInfo) { - defer wg.Done() - - ctx, cancel := context.WithTimeout(ctx, time.Second*10) - defer cancel() - - err := host.Connect(ctx, pi) - if err != nil { - log.Debugf("Error connecting to pubsub peer %s: %s", pi.ID, err.Error()) - return - } - - // delay to let pubsub perform its handshake - time.Sleep(time.Millisecond * 250) - - log.Debugf("Connected to pubsub peer %s", pi.ID) - }(pi) - } - - wg.Wait() -} diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go deleted file mode 100644 index 46e414b9dd..0000000000 --- a/namesys/pubsub_test.go +++ /dev/null @@ -1,197 +0,0 @@ -package namesys - -import ( - "context" - "sync" - "testing" - "time" - - path "github.com/ipfs/go-ipfs/path" - - mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" - routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" - testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" - floodsub "gx/ipfs/QmVKrsEgixRtMWcMd6WQzuwqCUC3jfLf7Q7xcjnKoMMikS/go-libp2p-floodsub" - netutil "gx/ipfs/Qmb6BsZf6Y3kxffXMNTubGPF1w1bkHtpvhfYbmnwP3NQyw/go-libp2p-netutil" - bhost "gx/ipfs/Qmc64U41EEB4nPG7wxjEqFwKJajS2f8kk5q2TvUrQf78Xu/go-libp2p-blankhost" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" - pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - p2phost "gx/ipfs/QmfZTdmunzKzAGJrSvXXQbQ5kLLUiEMX5vdwux7iXkdk7D/go-libp2p-host" -) - -func newNetHost(ctx context.Context, t *testing.T) p2phost.Host { - netw := netutil.GenSwarmNetwork(t, ctx) - return bhost.NewBlankHost(netw) -} - -func newNetHosts(ctx context.Context, t *testing.T, n int) []p2phost.Host { - var out []p2phost.Host - - for i := 0; i < n; i++ { - h := newNetHost(ctx, t) - out = append(out, h) - } - - return out -} - -// PubKeyFetcher implementation with a global key store -type mockKeyStore struct { - keys map[peer.ID]ci.PubKey - mx sync.Mutex -} - -func (m *mockKeyStore) addPubKey(id peer.ID, pkey ci.PubKey) { - m.mx.Lock() - defer m.mx.Unlock() - m.keys[id] = pkey -} - -func (m *mockKeyStore) getPubKey(id peer.ID) (ci.PubKey, error) { - m.mx.Lock() - defer m.mx.Unlock() - pkey, ok := m.keys[id] - if ok { - return pkey, nil - } - - return nil, routing.ErrNotFound -} - -func (m *mockKeyStore) GetPublicKey(ctx context.Context, id peer.ID) (ci.PubKey, error) { - return m.getPubKey(id) -} - -func newMockKeyStore() *mockKeyStore { - return &mockKeyStore{ - keys: make(map[peer.ID]ci.PubKey), - } -} - -// ConentRouting mock -func newMockRouting(ms mockrouting.Server, ks *mockKeyStore, host p2phost.Host) routing.ContentRouting { - id := host.ID() - - privk := host.Peerstore().PrivKey(id) - pubk := host.Peerstore().PubKey(id) - pi := host.Peerstore().PeerInfo(id) - - ks.addPubKey(id, pubk) - return ms.Client(testutil.NewIdentity(id, pi.Addrs[0], privk, pubk)) -} - -func newMockRoutingForHosts(ms mockrouting.Server, ks *mockKeyStore, hosts []p2phost.Host) []routing.ContentRouting { - rs := make([]routing.ContentRouting, len(hosts)) - for i := 0; i < len(hosts); i++ { - rs[i] = newMockRouting(ms, ks, hosts[i]) - } - return rs -} - -// tests -func TestPubsubPublishSubscribe(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - ms := mockrouting.NewServer() - ks := newMockKeyStore() - - pubhost := newNetHost(ctx, t) - pubmr := newMockRouting(ms, ks, pubhost) - fs, err := floodsub.NewFloodSub(ctx, pubhost) - if err != nil { - t.Fatal(err) - } - pub := NewPubsubPublisher(ctx, pubhost, ds.NewMapDatastore(), pubmr, fs) - privk := pubhost.Peerstore().PrivKey(pubhost.ID()) - pubpinfo := pstore.PeerInfo{ID: pubhost.ID(), Addrs: pubhost.Addrs()} - - name := "/ipns/" + pubhost.ID().Pretty() - - reshosts := newNetHosts(ctx, t, 5) - resmrs := newMockRoutingForHosts(ms, ks, reshosts) - res := make([]*PubsubResolver, len(reshosts)) - for i := 0; i < len(res); i++ { - - fs, err := floodsub.NewFloodSub(ctx, reshosts[i]) - if err != nil { - t.Fatal(err) - } - - res[i] = NewPubsubResolver(ctx, reshosts[i], resmrs[i], ks, fs) - if err := reshosts[i].Connect(ctx, pubpinfo); err != nil { - t.Fatal(err) - } - } - - time.Sleep(time.Millisecond * 100) - for i := 0; i < len(res); i++ { - checkResolveNotFound(ctx, t, i, res[i], name) - // delay to avoid connection storms - time.Sleep(time.Millisecond * 100) - } - - // let the bootstrap finish - time.Sleep(time.Second * 1) - - val := path.Path("/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY") - err = pub.Publish(ctx, privk, val) - if err != nil { - t.Fatal(err) - } - - // let the flood propagate - time.Sleep(time.Second * 1) - for i := 0; i < len(res); i++ { - checkResolve(ctx, t, i, res[i], name, val) - } - - val = path.Path("/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD") - err = pub.Publish(ctx, privk, val) - if err != nil { - t.Fatal(err) - } - - // let the flood propagate - time.Sleep(time.Second * 1) - for i := 0; i < len(res); i++ { - checkResolve(ctx, t, i, res[i], name, val) - } - - // cancel subscriptions - for i := 0; i < len(res); i++ { - res[i].Cancel(name) - } - time.Sleep(time.Millisecond * 100) - - nval := path.Path("/ipfs/QmPgDWmTmuzvP7QE5zwo1TmjbJme9pmZHNujB2453jkCTr") - err = pub.Publish(ctx, privk, nval) - if err != nil { - t.Fatal(err) - } - - // check we still have the old value in the resolver - time.Sleep(time.Second * 1) - for i := 0; i < len(res); i++ { - checkResolve(ctx, t, i, res[i], name, val) - } -} - -func checkResolveNotFound(ctx context.Context, t *testing.T, i int, resolver Resolver, name string) { - _, err := resolver.Resolve(ctx, name) - if err != ErrResolveFailed { - t.Fatalf("[resolver %d] unexpected error: %s", i, err.Error()) - } -} - -func checkResolve(ctx context.Context, t *testing.T, i int, resolver Resolver, name string, val path.Path) { - xval, err := resolver.Resolve(ctx, name) - if err != nil { - t.Fatalf("[resolver %d] resolve failed: %s", i, err.Error()) - } - if xval != val { - t.Fatalf("[resolver %d] unexpected value: %s %s", i, val, xval) - } -} diff --git a/namesys/routing.go b/namesys/routing.go index 5831e3ea6d..73670145e6 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -17,6 +17,7 @@ import ( mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dht "gx/ipfs/Qmd3jqhBQFvhfBNTSJMQL15GgyVMpdxKTta69Napvx6Myd/go-libp2p-kad-dht" ) var log = logging.Logger("namesys") @@ -133,28 +134,28 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, options return "", err } + pid, err := peer.IDFromBytes(hash) + if err != nil { + log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) + return "", err + } + // Name should be the hash of a public key retrievable from ipfs. // We retrieve the public key here to make certain that it's in the peer // store before calling GetValue() on the DHT - the DHT will call the // ipns validator, which in turn will get the public key from the peer // store to verify the record signature - _, err = routing.GetPublicKey(r.routing, ctx, hash) + _, err = routing.GetPublicKey(r.routing, ctx, pid) if err != nil { log.Debugf("RoutingResolver: could not retrieve public key %s: %s\n", name, err) return "", err } - pid, err := peer.IDFromBytes(hash) - if err != nil { - log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) - return "", err - } - // Use the routing system to get the name. // Note that the DHT will call the ipns validator when retrieving // the value, which in turn verifies the ipns record signature _, ipnsKey := IpnsKeysForID(pid) - val, err := r.getValue(ctx, ipnsKey, options) + val, err := r.routing.GetValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) if err != nil { log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) return "", err @@ -187,39 +188,6 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, options } } -func (r *routingResolver) getValue(ctx context.Context, ipnsKey string, options *opts.ResolveOpts) ([]byte, error) { - // Get specified number of values from the DHT - vals, err := r.routing.GetValues(ctx, ipnsKey, int(options.DhtRecordCount)) - if err != nil { - return nil, err - } - - // Select the best value - recs := make([][]byte, 0, len(vals)) - for _, v := range vals { - if v.Val != nil { - recs = append(recs, v.Val) - } - } - - if len(recs) == 0 { - return nil, routing.ErrNotFound - } - - i, err := IpnsSelectorFunc(ipnsKey, recs) - if err != nil { - return nil, err - } - - best := recs[i] - if best == nil { - log.Errorf("GetValues %s yielded record with nil value", ipnsKey) - return nil, routing.ErrNotFound - } - - return best, nil -} - func checkEOL(e *pb.IpnsEntry) (time.Time, bool) { if e.GetValidityType() == pb.IpnsEntry_EOL { eol, err := u.ParseRFC3339(string(e.GetValidity())) diff --git a/namesys/selector.go b/namesys/selector.go deleted file mode 100644 index aebfb1533a..0000000000 --- a/namesys/selector.go +++ /dev/null @@ -1,63 +0,0 @@ -package namesys - -import ( - "bytes" - "errors" - - pb "github.com/ipfs/go-ipfs/namesys/pb" - - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" -) - -// IpnsSelectorFunc selects the best record by checking which has the highest -// sequence number and latest EOL -func IpnsSelectorFunc(k string, vals [][]byte) (int, error) { - var recs []*pb.IpnsEntry - for _, v := range vals { - e := new(pb.IpnsEntry) - err := proto.Unmarshal(v, e) - if err == nil { - recs = append(recs, e) - } else { - recs = append(recs, nil) - } - } - - return selectRecord(recs, vals) -} - -func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { - var bestSeq uint64 - besti := -1 - - for i, r := range recs { - if r == nil || r.GetSequence() < bestSeq { - continue - } - rt, err := u.ParseRFC3339(string(r.GetValidity())) - if err != nil { - log.Errorf("failed to parse ipns record EOL %s", r.GetValidity()) - continue - } - - if besti == -1 || r.GetSequence() > bestSeq { - bestSeq = r.GetSequence() - besti = i - } else if r.GetSequence() == bestSeq { - bestt, _ := u.ParseRFC3339(string(recs[besti].GetValidity())) - if rt.After(bestt) { - besti = i - } else if rt == bestt { - if bytes.Compare(vals[i], vals[besti]) > 0 { - besti = i - } - } - } - } - if besti == -1 { - return 0, errors.New("no usable records in given set") - } - - return besti, nil -} diff --git a/namesys/validator.go b/namesys/validator.go index cde4e92ed4..941d6a6678 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -1,6 +1,7 @@ package namesys import ( + "bytes" "errors" "time" @@ -41,64 +42,106 @@ var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") // from the peer store var ErrPublicKeyNotFound = errors.New("public key not found in peer store") -// NewIpnsRecordValidator returns a ValidChecker for IPNS records. -// The validator function will get a public key from the KeyBook -// to verify the record's signature. Note that the public key must -// already have been fetched from the network and put into the KeyBook -// by the caller. -func NewIpnsRecordValidator(kbook pstore.KeyBook) *record.ValidChecker { - // ValidateIpnsRecord implements ValidatorFunc and verifies that the - // given record's value is an IpnsEntry, that the entry has been correctly - // signed, and that the entry has not expired - ValidateIpnsRecord := func(r *record.ValidationRecord) error { - if r.Namespace != "ipns" { - return ErrInvalidPath - } +type IpnsValidator struct { + KeyBook pstore.KeyBook +} - // Parse the value into an IpnsEntry - entry := new(pb.IpnsEntry) - err := proto.Unmarshal(r.Value, entry) - if err != nil { - return ErrBadRecord - } +func (v IpnsValidator) Validate(key string, value []byte) error { + ns, pidString, err := record.SplitKey(key) + if err != nil || ns != "ipns" { + return ErrInvalidPath + } + + // Parse the value into an IpnsEntry + entry := new(pb.IpnsEntry) + err = proto.Unmarshal(value, entry) + if err != nil { + return ErrBadRecord + } - // Get the public key defined by the ipns path - pid, err := peer.IDFromString(r.Key) + // Get the public key defined by the ipns path + pid, err := peer.IDFromString(pidString) + if err != nil { + log.Debugf("failed to parse ipns record key %s into peer ID", pidString) + return ErrKeyFormat + } + pubk := v.KeyBook.PubKey(pid) + if pubk == nil { + log.Debugf("public key with hash %s not found in peer store", pid) + return ErrPublicKeyNotFound + } + + // Check the ipns record signature with the public key + if ok, err := pubk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { + log.Debugf("failed to verify signature for ipns record %s", pidString) + return ErrSignature + } + + // Check that record has not expired + switch entry.GetValidityType() { + case pb.IpnsEntry_EOL: + t, err := u.ParseRFC3339(string(entry.GetValidity())) if err != nil { - log.Debugf("failed to parse ipns record key %s into peer ID", r.Key) - return ErrKeyFormat + log.Debugf("failed parsing time for ipns record EOL in record %s", pidString) + return err } - pubk := kbook.PubKey(pid) - if pubk == nil { - log.Debugf("public key with hash %s not found in peer store", pid) - return ErrPublicKeyNotFound + if time.Now().After(t) { + return ErrExpiredRecord } + default: + return ErrUnrecognizedValidity + } + return nil +} - // Check the ipns record signature with the public key - if ok, err := pubk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { - log.Debugf("failed to verify signature for ipns record %s", r.Key) - return ErrSignature +// IpnsSelectorFunc selects the best record by checking which has the highest +// sequence number and latest EOL +func (v IpnsValidator) Select(k string, vals [][]byte) (int, error) { + var recs []*pb.IpnsEntry + for _, v := range vals { + e := new(pb.IpnsEntry) + err := proto.Unmarshal(v, e) + if err == nil { + recs = append(recs, e) + } else { + recs = append(recs, nil) } + } - // Check that record has not expired - switch entry.GetValidityType() { - case pb.IpnsEntry_EOL: - t, err := u.ParseRFC3339(string(entry.GetValidity())) - if err != nil { - log.Debugf("failed parsing time for ipns record EOL in record %s", r.Key) - return err - } - if time.Now().After(t) { - return ErrExpiredRecord + return selectRecord(recs, vals) +} + +func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { + var bestSeq uint64 + besti := -1 + + for i, r := range recs { + if r == nil || r.GetSequence() < bestSeq { + continue + } + rt, err := u.ParseRFC3339(string(r.GetValidity())) + if err != nil { + log.Errorf("failed to parse ipns record EOL %s", r.GetValidity()) + continue + } + + if besti == -1 || r.GetSequence() > bestSeq { + bestSeq = r.GetSequence() + besti = i + } else if r.GetSequence() == bestSeq { + bestt, _ := u.ParseRFC3339(string(recs[besti].GetValidity())) + if rt.After(bestt) { + besti = i + } else if rt == bestt { + if bytes.Compare(vals[i], vals[besti]) > 0 { + besti = i + } } - default: - return ErrUnrecognizedValidity } - return nil } - - return &record.ValidChecker{ - Func: ValidateIpnsRecord, - Sign: false, + if besti == -1 { + return 0, errors.New("no usable records in given set") } + + return besti, nil } From 5850aa046795eb5fa1285db51e01f237334540e0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 7 May 2018 21:34:36 -0700 Subject: [PATCH 2027/3147] simplify routing resolution a bit License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@dcf4e313f9a0352de3d36cdd4e8f8aef4c713514 --- namesys/routing.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index 73670145e6..4a1668c31f 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -168,24 +168,22 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, options return "", err } + var p path.Path // check for old style record: - valh, err := mh.Cast(entry.GetValue()) - if err != nil { + if valh, err := mh.Cast(entry.GetValue()); err == nil { + // Its an old style multihash record + log.Debugf("encountered CIDv0 ipns entry: %s", valh) + p = path.FromCid(cid.NewCidV0(valh)) + } else { // Not a multihash, probably a new record - p, err := path.ParsePath(string(entry.GetValue())) + p, err = path.ParsePath(string(entry.GetValue())) if err != nil { return "", err } - - r.cacheSet(name, p, entry) - return p, nil - } else { - // Its an old style multihash record - log.Debugf("encountered CIDv0 ipns entry: %s", valh) - p := path.FromCid(cid.NewCidV0(valh)) - r.cacheSet(name, p, entry) - return p, nil } + + r.cacheSet(name, p, entry) + return p, nil } func checkEOL(e *pb.IpnsEntry) (time.Time, bool) { From a6eefc7352495af00403c51acad0af635e7fef17 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 9 May 2018 08:14:01 +0100 Subject: [PATCH 2028/3147] consolidate dns resolver constructors The current convention is to return the concrete type instead of an interface so let's go with that and have one constructor. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@93822e8bc76559dccc03139ef46f6d895031d2b5 --- namesys/dns.go | 8 +------- namesys/namesys.go | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 6d74e52216..de1d7cb490 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -21,13 +21,7 @@ type DNSResolver struct { } // NewDNSResolver constructs a name resolver using DNS TXT records. -func NewDNSResolver() Resolver { - return &DNSResolver{lookupTXT: net.LookupTXT} -} - -// newDNSResolver constructs a name resolver using DNS TXT records, -// returning a resolver instead of NewDNSResolver's Resolver. -func newDNSResolver() resolver { +func NewDNSResolver() *DNSResolver { return &DNSResolver{lookupTXT: net.LookupTXT} } diff --git a/namesys/namesys.go b/namesys/namesys.go index 6e37d1c6fa..c1f3f7c6d7 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -35,7 +35,7 @@ type mpns struct { func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSystem { return &mpns{ resolvers: map[string]resolver{ - "dns": newDNSResolver(), + "dns": NewDNSResolver(), "proquint": new(ProquintResolver), "dht": NewRoutingResolver(r, cachesize), }, From 8b31b88d0b7c3efe2c7c88c7208f5e4133945256 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 9 May 2018 09:21:55 +0100 Subject: [PATCH 2029/3147] store IPNS records *outside* of the DHT fixes #4749 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@8643e1c1bd087e53e4eb901ab8180066e16b9a43 --- namesys/namesys.go | 111 +++++----------- namesys/namesys_test.go | 4 +- namesys/publisher.go | 206 ++++++++++++++++++++++-------- namesys/publisher_test.go | 7 +- namesys/republisher/repub.go | 52 ++++---- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 13 +- 7 files changed, 222 insertions(+), 173 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index c1f3f7c6d7..afd264ac12 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -3,7 +3,6 @@ package namesys import ( "context" "strings" - "sync" "time" opts "github.com/ipfs/go-ipfs/namesys/opts" @@ -37,10 +36,10 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSys resolvers: map[string]resolver{ "dns": NewDNSResolver(), "proquint": new(ProquintResolver), - "dht": NewRoutingResolver(r, cachesize), + "ipns": NewRoutingResolver(r, cachesize), }, publishers: map[string]Publisher{ - "dht": NewRoutingPublisher(r, ds), + "ipns": NewRoutingPublisher(r, ds), }, } } @@ -71,66 +70,32 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string, options *opts.Reso return "", ErrResolveFailed } - makePath := func(p path.Path) (path.Path, error) { - if len(segments) > 3 { - return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) - } else { - return p, nil - } - } - // Resolver selection: - // 1. if it is a multihash resolve through "pubsub" (if available), - // with fallback to "dht" + // 1. if it is a multihash resolve through "ipns". // 2. if it is a domain name, resolve through "dns" // 3. otherwise resolve through the "proquint" resolver key := segments[2] - - _, err := mh.FromB58String(key) - if err == nil { - res, ok := ns.resolvers["pubsub"] - if ok { - p, err := res.resolveOnce(ctx, key, options) - if err == nil { - return makePath(p) - } - } - - res, ok = ns.resolvers["dht"] - if ok { - p, err := res.resolveOnce(ctx, key, options) - if err == nil { - return makePath(p) - } - } - - return "", ErrResolveFailed + resName := "proquint" + if _, err := mh.FromB58String(key); err == nil { + resName = "ipns" + } else if isd.IsDomain(key) { + resName = "dns" } - if isd.IsDomain(key) { - res, ok := ns.resolvers["dns"] - if ok { - p, err := res.resolveOnce(ctx, key, options) - if err == nil { - return makePath(p) - } - } - + res, ok := ns.resolvers[resName] + if !ok { + log.Debugf("no resolver found for %s", name) return "", ErrResolveFailed } - - res, ok := ns.resolvers["proquint"] - if ok { - p, err := res.resolveOnce(ctx, key, options) - if err == nil { - return makePath(p) - } - + p, err := res.resolveOnce(ctx, key, options) + if err != nil { return "", ErrResolveFailed } - log.Debugf("no resolver found for %s", name) - return "", ErrResolveFailed + if len(segments) > 3 { + return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + } + return p, nil } // Publish implements Publisher @@ -139,39 +104,23 @@ func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) e } func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { - var dhtErr error - - wg := &sync.WaitGroup{} - wg.Add(1) - go func() { - dhtErr = ns.publishers["dht"].PublishWithEOL(ctx, name, value, eol) - if dhtErr == nil { - ns.addToDHTCache(name, value, eol) - } - wg.Done() - }() - - pub, ok := ns.publishers["pubsub"] - if ok { - wg.Add(1) - go func() { - err := pub.PublishWithEOL(ctx, name, value, eol) - if err != nil { - log.Warningf("error publishing %s with pubsub: %s", name, err.Error()) - } - wg.Done() - }() - } - - wg.Wait() - return dhtErr + pub, ok := ns.publishers["ipns"] + if !ok { + return ErrPublishFailed + } + if err := pub.PublishWithEOL(ctx, name, value, eol); err != nil { + return err + } + ns.addToIpnsCache(name, value, eol) + return nil + } -func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { - rr, ok := ns.resolvers["dht"].(*routingResolver) +func (ns *mpns) addToIpnsCache(key ci.PrivKey, value path.Path, eol time.Time) { + rr, ok := ns.resolvers["ipns"].(*routingResolver) if !ok { // should never happen, purely for sanity - log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["dht"]) + log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["ipns"]) } if rr.cache == nil { // resolver has no caching diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 03ba60ed05..7662172961 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -59,8 +59,8 @@ func mockResolverTwo() *mockResolver { func TestNamesysResolution(t *testing.T) { r := &mpns{ resolvers: map[string]resolver{ - "dht": mockResolverOne(), - "dns": mockResolverTwo(), + "ipns": mockResolverOne(), + "dns": mockResolverTwo(), }, } diff --git a/namesys/publisher.go b/namesys/publisher.go index 2e470d66b3..8c376d1aff 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -4,6 +4,8 @@ import ( "bytes" "context" "fmt" + "strings" + "sync" "time" pb "github.com/ipfs/go-ipfs/namesys/pb" @@ -12,15 +14,17 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - dhtpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" - dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + dsquery "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" + base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) +const ipnsPrefix = "/ipns/" + const PublishPutValTimeout = time.Minute const DefaultRecordTTL = 24 * time.Hour @@ -29,6 +33,9 @@ const DefaultRecordTTL = 24 * time.Hour type ipnsPublisher struct { routing routing.ValueStore ds ds.Datastore + + // Used to ensure we assign IPNS records *sequential* sequence numbers. + mu sync.Mutex } // NewRoutingPublisher constructs a publisher for the IPFS Routing name system. @@ -46,69 +53,157 @@ func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordTTL)) } -// PublishWithEOL is a temporary stand in for the ipns records implementation -// see here for more details: https://github.com/ipfs/specs/tree/master/records -func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { +func IpnsDsKey(id peer.ID) ds.Key { + return ds.NewKey("/ipns/" + base32.RawStdEncoding.EncodeToString([]byte(id))) +} + +// PublishedNames returns the latest IPNS records published by this node and +// their expiration times. +// +// This method will not search the routing system for records published by other +// nodes. +func (p *ipnsPublisher) ListPublished(ctx context.Context) (map[peer.ID]*pb.IpnsEntry, error) { + query, err := p.ds.Query(dsquery.Query{ + Prefix: ipnsPrefix, + }) + if err != nil { + return nil, err + } + defer query.Close() + + records := make(map[peer.ID]*pb.IpnsEntry) + for { + select { + case result, ok := <-query.Next(): + if !ok { + return records, nil + } + if result.Error != nil { + return nil, result.Error + } + value, ok := result.Value.([]byte) + if !ok { + log.Error("found ipns record that we couldn't convert to a value") + continue + } + e := new(pb.IpnsEntry) + if err := proto.Unmarshal(value, e); err != nil { + // Might as well return what we can. + log.Error("found an invalid IPNS entry:", err) + continue + } + if !strings.HasPrefix(result.Key, ipnsPrefix) { + log.Errorf("datastore query for keys with prefix %s returned a key: %s", ipnsPrefix, result.Key) + continue + } + k := result.Key[len(ipnsPrefix):] + pid, err := base32.RawStdEncoding.DecodeString(k) + if err != nil { + log.Errorf("ipns ds key invalid: %s", result.Key) + continue + } + records[peer.ID(pid)] = e + case <-ctx.Done(): + return nil, ctx.Err() + } + } +} +// GetPublished returns the record this node has published corresponding to the +// given peer ID. +// +// If `checkRouting` is true and we have no existing record, this method will +// check the routing system for any existing records. +func (p *ipnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouting bool) (*pb.IpnsEntry, error) { + ctx, cancel := context.WithTimeout(ctx, time.Second*30) + defer cancel() + + dsVal, err := p.ds.Get(IpnsDsKey(id)) + var value []byte + switch err { + case nil: + var ok bool + value, ok = dsVal.([]byte) + if !ok { + return nil, fmt.Errorf("found ipns record that we couldn't convert to a value") + } + case ds.ErrNotFound: + if !checkRouting { + return nil, nil + } + _, ipnskey := IpnsKeysForID(id) + value, err = p.routing.GetValue(ctx, ipnskey) + if err != nil { + // Not found or other network issue. Can't really do + // anything about this case. + return nil, nil + } + default: + return nil, err + } + e := new(pb.IpnsEntry) + if err := proto.Unmarshal(value, e); err != nil { + return nil, err + } + return e, nil +} + +func (p *ipnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) (*pb.IpnsEntry, error) { id, err := peer.IDFromPrivateKey(k) if err != nil { - return err + return nil, err } - _, ipnskey := IpnsKeysForID(id) + p.mu.Lock() + defer p.mu.Unlock() // get previous records sequence number - seqnum, err := p.getPreviousSeqNo(ctx, ipnskey) + rec, err := p.GetPublished(ctx, id, true) if err != nil { - return err + return nil, err } - // increment it - seqnum++ - - return PutRecordToRouting(ctx, k, value, seqnum, eol, p.routing, id) -} + seqno := rec.GetSequence() // returns 0 if rec is nil + if rec != nil && value != path.Path(rec.GetValue()) { + // Don't bother incrementing the sequence number unless the + // value changes. + seqno++ + } -func (p *ipnsPublisher) getPreviousSeqNo(ctx context.Context, ipnskey string) (uint64, error) { - prevrec, err := p.ds.Get(dshelp.NewKeyFromBinary([]byte(ipnskey))) - if err != nil && err != ds.ErrNotFound { - // None found, lets start at zero! - return 0, err + // Create record + entry, err := CreateRoutingEntryData(k, value, seqno, eol) + if err != nil { + return nil, err } - var val []byte - if err == nil { - prbytes, ok := prevrec.([]byte) - if !ok { - return 0, fmt.Errorf("unexpected type returned from datastore: %#v", prevrec) - } - dhtrec := new(dhtpb.Record) - err := proto.Unmarshal(prbytes, dhtrec) - if err != nil { - return 0, err - } - val = dhtrec.GetValue() - } else { - // try and check the dht for a record - ctx, cancel := context.WithTimeout(ctx, time.Second*30) - defer cancel() + // Set the TTL + // TODO: Make this less hacky. + ttl, ok := checkCtxTTL(ctx) + if ok { + entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) + } - rv, err := p.routing.GetValue(ctx, ipnskey) - if err != nil { - // no such record found, start at zero! - return 0, nil - } + data, err := proto.Marshal(entry) + if err != nil { + return nil, err + } - val = rv + // Put the new record. + if err := p.ds.Put(IpnsDsKey(id), data); err != nil { + return nil, err } + return entry, nil +} - e := new(pb.IpnsEntry) - err = proto.Unmarshal(val, e) +// PublishWithEOL is a temporary stand in for the ipns records implementation +// see here for more details: https://github.com/ipfs/specs/tree/master/records +func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { + record, err := p.updateRecord(ctx, k, value, eol) if err != nil { - return 0, err + return err } - return e.GetSequence(), nil + return PutRecordToRouting(ctx, p.routing, k.GetPublic(), record) } // setting the TTL on published records is an experimental feature. @@ -124,25 +219,24 @@ func checkCtxTTL(ctx context.Context) (time.Duration, bool) { return d, ok } -func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqnum uint64, eol time.Time, r routing.ValueStore, id peer.ID) error { +func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k ci.PubKey, entry *pb.IpnsEntry) error { ctx, cancel := context.WithCancel(ctx) defer cancel() - namekey, ipnskey := IpnsKeysForID(id) - entry, err := CreateRoutingEntryData(k, value, seqnum, eol) + errs := make(chan error, 2) // At most two errors (IPNS, and public key) + + id, err := peer.IDFromPublicKey(k) if err != nil { return err } - ttl, ok := checkCtxTTL(ctx) - if ok { - entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) + // Attempt to extract the public key from the ID + extractedPublicKey, err := id.ExtractPublicKey() + if err != nil { + return err } - errs := make(chan error, 2) // At most two errors (IPNS, and public key) - - // Attempt to extract the public key from the ID - extractedPublicKey, _ := id.ExtractPublicKey() + namekey, ipnskey := IpnsKeysForID(id) go func() { errs <- PublishEntry(ctx, r, ipnskey, entry) @@ -151,7 +245,7 @@ func PutRecordToRouting(ctx context.Context, k ci.PrivKey, value path.Path, seqn // Publish the public key if a public key cannot be extracted from the ID if extractedPublicKey == nil { go func() { - errs <- PublishPublicKey(ctx, r, namekey, k.GetPublic()) + errs <- PublishPublicKey(ctx, r, namekey, k) }() if err := waitOnErrChan(ctx, errs); err != nil { diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 39a9753329..8f544d0c1e 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -75,7 +75,12 @@ func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expected serv := mockrouting.NewServer() r := serv.ClientWithDatastore(context.Background(), &identity{p}, dstore) - err = PutRecordToRouting(ctx, privKey, value, seqnum, eol, r, id) + entry, err := CreateRoutingEntryData(privKey, value, seqnum, eol) + if err != nil { + t.Fatal(err) + } + + err = PutRecordToRouting(ctx, r, pubKey, entry) if err != nil { t.Fatal(err) } diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index db7ae590e6..aa1f85647d 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -13,9 +13,6 @@ import ( goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - recpb "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record/pb" - routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" - dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" @@ -39,7 +36,7 @@ var FailureRetryInterval = time.Minute * 5 const DefaultRecordLifetime = time.Hour * 24 type Republisher struct { - r routing.ValueStore + ns namesys.Publisher ds ds.Datastore self ic.PrivKey ks keystore.Keystore @@ -51,9 +48,9 @@ type Republisher struct { } // NewRepublisher creates a new Republisher -func NewRepublisher(r routing.ValueStore, ds ds.Datastore, self ic.PrivKey, ks keystore.Keystore) *Republisher { +func NewRepublisher(ns namesys.Publisher, ds ds.Datastore, self ic.PrivKey, ks keystore.Keystore) *Republisher { return &Republisher{ - r: r, + ns: ns, ds: ds, self: self, ks: ks, @@ -90,6 +87,10 @@ func (rp *Republisher) republishEntries(p goprocess.Process) error { ctx, cancel := context.WithCancel(gpctx.OnClosingContext(p)) defer cancel() + // TODO: Use rp.ipns.ListPublished(). We can't currently *do* that + // because: + // 1. There's no way to get keys from the keystore by ID. + // 2. We don't actually have access to the IPNS publisher. err := rp.republishEntry(ctx, rp.self) if err != nil { return err @@ -125,8 +126,7 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro log.Debugf("republishing ipns entry for %s", id) // Look for it locally only - _, ipnskey := namesys.IpnsKeysForID(id) - p, seq, err := rp.getLastVal(ipnskey) + p, err := rp.getLastVal(id) if err != nil { if err == errNoEntry { return nil @@ -136,33 +136,25 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro // update record with same sequence number eol := time.Now().Add(rp.RecordLifetime) - err = namesys.PutRecordToRouting(ctx, priv, p, seq, eol, rp.r, id) - if err != nil { - return err - } - - return nil + return rp.ns.PublishWithEOL(ctx, priv, p, eol) } -func (rp *Republisher) getLastVal(k string) (path.Path, uint64, error) { - ival, err := rp.ds.Get(dshelp.NewKeyFromBinary([]byte(k))) - if err != nil { - // not found means we dont have a previously published entry - return "", 0, errNoEntry +func (rp *Republisher) getLastVal(id peer.ID) (path.Path, error) { + // Look for it locally only + vali, err := rp.ds.Get(namesys.IpnsDsKey(id)) + switch err { + case nil: + case ds.ErrNotFound: + return "", errNoEntry + default: + return "", err } - val := ival.([]byte) - dhtrec := new(recpb.Record) - err = proto.Unmarshal(val, dhtrec) - if err != nil { - return "", 0, err - } + val := vali.([]byte) - // extract published data from record e := new(pb.IpnsEntry) - err = proto.Unmarshal(dhtrec.GetValue(), e) - if err != nil { - return "", 0, err + if err := proto.Unmarshal(val, e); err != nil { + return "", err } - return path.Path(e.Value), e.GetSequence(), nil + return path.Path(e.Value), nil } diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index f47df4696e..8a9ab366ff 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -78,7 +78,7 @@ func TestRepublish(t *testing.T) { // The republishers that are contained within the nodes have their timeout set // to 12 hours. Instead of trying to tweak those, we're just going to pretend // they dont exist and make our own. - repub := NewRepublisher(publisher.Routing, publisher.Repo.Datastore(), publisher.PrivateKey, publisher.Repo.Keystore()) + repub := NewRepublisher(rp, publisher.Repo.Datastore(), publisher.PrivateKey, publisher.Repo.Keystore()) repub.Interval = time.Second repub.RecordLifetime = time.Second * 5 diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 39a6700880..2063296670 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -70,7 +70,12 @@ func TestPrexistingExpiredRecord(t *testing.T) { // Make an expired record and put it in the datastore h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour * -1) - err = PutRecordToRouting(context.Background(), privk, h, 0, eol, d, id) + + entry, err := CreateRoutingEntryData(privk, h, 0, eol) + if err != nil { + t.Fatal(err) + } + err = PutRecordToRouting(context.Background(), d, pubk, entry) if err != nil { t.Fatal(err) } @@ -107,7 +112,11 @@ func TestPrexistingRecord(t *testing.T) { // Make a good record and put it in the datastore h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour) - err = PutRecordToRouting(context.Background(), privk, h, 0, eol, d, id) + entry, err := CreateRoutingEntryData(privk, h, 0, eol) + if err != nil { + t.Fatal(err) + } + err = PutRecordToRouting(context.Background(), d, pubk, entry) if err != nil { t.Fatal(err) } From 4a8b66fab275c7f5c6a69694b705877e82459453 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 9 May 2018 13:55:58 +0100 Subject: [PATCH 2030/3147] cleanup namesys a bit Remove ~50 lines of code, some casting, and a superfluous map (when go starts looking like python, something's wrong). License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@ad1299864f29181b29db24403dfb265a9eb4063c --- namesys/base.go | 5 +- namesys/cache.go | 47 ++++++++++++ namesys/dns.go | 17 +++-- namesys/ipns_validate_test.go | 12 +-- namesys/namesys.go | 119 ++++++++++++------------------ namesys/namesys_test.go | 16 ++-- namesys/proquint.go | 8 +- namesys/publisher.go | 20 ++--- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 12 +-- namesys/routing.go | 115 +++++++---------------------- 11 files changed, 172 insertions(+), 201 deletions(-) create mode 100644 namesys/cache.go diff --git a/namesys/base.go b/namesys/base.go index a301a5a612..525a9afb00 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -2,6 +2,7 @@ package namesys import ( "strings" + "time" context "context" @@ -11,14 +12,14 @@ import ( type resolver interface { // resolveOnce looks up a name once (without recursion). - resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (value path.Path, err error) + resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (value path.Path, ttl time.Duration, err error) } // resolve is a helper for implementing Resolver.ResolveN using resolveOnce. func resolve(ctx context.Context, r resolver, name string, options *opts.ResolveOpts, prefixes ...string) (path.Path, error) { depth := options.Depth for { - p, err := r.resolveOnce(ctx, name, options) + p, _, err := r.resolveOnce(ctx, name, options) if err != nil { return "", err } diff --git a/namesys/cache.go b/namesys/cache.go new file mode 100644 index 0000000000..8249fea141 --- /dev/null +++ b/namesys/cache.go @@ -0,0 +1,47 @@ +package namesys + +import ( + "time" + + path "github.com/ipfs/go-ipfs/path" +) + +func (ns *mpns) cacheGet(name string) (path.Path, bool) { + if ns.cache == nil { + return "", false + } + + ientry, ok := ns.cache.Get(name) + if !ok { + return "", false + } + + entry, ok := ientry.(cacheEntry) + if !ok { + // should never happen, purely for sanity + log.Panicf("unexpected type %T in cache for %q.", ientry, name) + } + + if time.Now().Before(entry.eol) { + return entry.val, true + } + + ns.cache.Remove(name) + + return "", false +} + +func (ns *mpns) cacheSet(name string, val path.Path, ttl time.Duration) { + if ns.cache == nil || ttl <= 0 { + return + } + ns.cache.Add(name, cacheEntry{ + val: val, + eol: time.Now().Add(ttl), + }) +} + +type cacheEntry struct { + val path.Path + eol time.Time +} diff --git a/namesys/dns.go b/namesys/dns.go index de1d7cb490..1591f16e41 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -5,6 +5,7 @@ import ( "errors" "net" "strings" + "time" opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" @@ -38,12 +39,12 @@ type lookupRes struct { // resolveOnce implements resolver. // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { +func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { segments := strings.SplitN(name, "/", 2) domain := segments[0] if !isd.IsDomain(domain) { - return "", errors.New("not a valid domain name") + return "", 0, errors.New("not a valid domain name") } log.Debugf("DNSResolver resolving %s", domain) @@ -57,7 +58,7 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options *opt select { case subRes = <-subChan: case <-ctx.Done(): - return "", ctx.Err() + return "", 0, ctx.Err() } var p path.Path @@ -68,19 +69,19 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options *opt select { case rootRes = <-rootChan: case <-ctx.Done(): - return "", ctx.Err() + return "", 0, ctx.Err() } if rootRes.error == nil { p = rootRes.path } else { - return "", ErrResolveFailed + return "", 0, ErrResolveFailed } } + var err error if len(segments) > 1 { - return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[1]) - } else { - return p, nil + p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[1]) } + return p, 0, err } func workDomain(r *DNSResolver, name string, res chan lookupRes) { diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index bcffcc5e61..f9cdf024a6 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -81,7 +81,7 @@ func TestResolverValidation(t *testing.T) { peerstore := pstore.NewPeerstore() vstore := newMockValueStore(rid, dstore, peerstore) - resolver := NewRoutingResolver(vstore, 0) + resolver := NewIpnsResolver(vstore) // Create entry with expiry in one hour priv, id, _, ipnsDHTPath := genKeys(t) @@ -105,7 +105,7 @@ func TestResolverValidation(t *testing.T) { } // Resolve entry - resp, err := resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) + resp, _, err := resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) if err != nil { t.Fatal(err) } @@ -126,7 +126,7 @@ func TestResolverValidation(t *testing.T) { } // Record should fail validation because entry is expired - _, err = resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) + _, _, err = resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have returned error") } @@ -148,7 +148,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key defined by // ipns path doesn't match record signature - _, err = resolver.resolveOnce(ctx, id2.Pretty(), opts.DefaultResolveOpts()) + _, _, err = resolver.resolveOnce(ctx, id2.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have failed signature verification") } @@ -166,7 +166,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key is not available // in peer store or on network - _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) + _, _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have failed because public key was not found") } @@ -181,7 +181,7 @@ func TestResolverValidation(t *testing.T) { // public key is available in the peer store by looking it up in // the DHT, which causes the DHT to fetch it and cache it in the // peer store - _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) + _, _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) if err != nil { t.Fatal(err) } diff --git a/namesys/namesys.go b/namesys/namesys.go index afd264ac12..bbdeb9b861 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -9,6 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" @@ -26,21 +27,25 @@ import ( // It can only publish to: (a) IPFS routing naming. // type mpns struct { - resolvers map[string]resolver - publishers map[string]Publisher + dnsResolver, proquintResolver, ipnsResolver resolver + ipnsPublisher Publisher + + cache *lru.Cache } // NewNameSystem will construct the IPFS naming system based on Routing func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSystem { + var cache *lru.Cache + if cachesize > 0 { + cache, _ = lru.New(cachesize) + } + return &mpns{ - resolvers: map[string]resolver{ - "dns": NewDNSResolver(), - "proquint": new(ProquintResolver), - "ipns": NewRoutingResolver(r, cachesize), - }, - publishers: map[string]Publisher{ - "ipns": NewRoutingPublisher(r, ds), - }, + dnsResolver: NewDNSResolver(), + proquintResolver: new(ProquintResolver), + ipnsResolver: NewIpnsResolver(r), + ipnsPublisher: NewIpnsPublisher(r, ds), + cache: cache, } } @@ -60,42 +65,46 @@ func (ns *mpns) Resolve(ctx context.Context, name string, options ...opts.Resolv } // resolveOnce implements resolver. -func (ns *mpns) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { +func (ns *mpns) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { if !strings.HasPrefix(name, "/ipns/") { name = "/ipns/" + name } segments := strings.SplitN(name, "/", 4) if len(segments) < 3 || segments[0] != "" { log.Debugf("invalid name syntax for %s", name) - return "", ErrResolveFailed + return "", 0, ErrResolveFailed } - // Resolver selection: - // 1. if it is a multihash resolve through "ipns". - // 2. if it is a domain name, resolve through "dns" - // 3. otherwise resolve through the "proquint" resolver key := segments[2] - resName := "proquint" - if _, err := mh.FromB58String(key); err == nil { - resName = "ipns" - } else if isd.IsDomain(key) { - resName = "dns" - } - res, ok := ns.resolvers[resName] + p, ok := ns.cacheGet(key) + var err error if !ok { - log.Debugf("no resolver found for %s", name) - return "", ErrResolveFailed - } - p, err := res.resolveOnce(ctx, key, options) - if err != nil { - return "", ErrResolveFailed + // Resolver selection: + // 1. if it is a multihash resolve through "ipns". + // 2. if it is a domain name, resolve through "dns" + // 3. otherwise resolve through the "proquint" resolver + var res resolver + if _, err := mh.FromB58String(key); err == nil { + res = ns.ipnsResolver + } else if isd.IsDomain(key) { + res = ns.dnsResolver + } else { + res = ns.proquintResolver + } + + var ttl time.Duration + p, ttl, err = res.resolveOnce(ctx, key, options) + if err != nil { + return "", 0, ErrResolveFailed + } + ns.cacheSet(key, p, ttl) } if len(segments) > 3 { - return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) } - return p, nil + return p, 0, err } // Publish implements Publisher @@ -104,47 +113,17 @@ func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) e } func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { - pub, ok := ns.publishers["ipns"] - if !ok { - return ErrPublishFailed - } - if err := pub.PublishWithEOL(ctx, name, value, eol); err != nil { - return err - } - ns.addToIpnsCache(name, value, eol) - return nil - -} - -func (ns *mpns) addToIpnsCache(key ci.PrivKey, value path.Path, eol time.Time) { - rr, ok := ns.resolvers["ipns"].(*routingResolver) - if !ok { - // should never happen, purely for sanity - log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["ipns"]) - } - if rr.cache == nil { - // resolver has no caching - return - } - - var err error - value, err = path.ParsePath(value.String()) + id, err := peer.IDFromPrivateKey(name) if err != nil { - log.Error("could not parse path") - return + return err } - - name, err := peer.IDFromPrivateKey(key) - if err != nil { - log.Error("while adding to cache, could not get peerid from private key") - return + if err := ns.ipnsPublisher.PublishWithEOL(ctx, name, value, eol); err != nil { + return err } - - if time.Now().Add(DefaultResolverCacheTTL).Before(eol) { - eol = time.Now().Add(DefaultResolverCacheTTL) + ttl := DefaultResolverCacheTTL + if ttEol := eol.Sub(time.Now()); ttEol < ttl { + ttl = ttEol } - rr.cache.Add(name.Pretty(), cacheEntry{ - val: value, - eol: eol, - }) + ns.cacheSet(peer.IDB58Encode(id), value, ttl) + return nil } diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 7662172961..9cf41aea09 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -1,10 +1,10 @@ package namesys import ( + "context" "fmt" "testing" - - context "context" + "time" opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" @@ -21,6 +21,7 @@ type mockResolver struct { } func testResolution(t *testing.T, resolver Resolver, name string, depth uint, expected string, expError error) { + t.Helper() p, err := resolver.Resolve(context.Background(), name, opts.Depth(depth)) if err != expError { t.Fatal(fmt.Errorf( @@ -34,8 +35,9 @@ func testResolution(t *testing.T, resolver Resolver, name string, depth uint, ex } } -func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts *opts.ResolveOpts) (path.Path, error) { - return path.ParsePath(r.entries[name]) +func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts *opts.ResolveOpts) (path.Path, time.Duration, error) { + p, err := path.ParsePath(r.entries[name]) + return p, 0, err } func mockResolverOne() *mockResolver { @@ -58,10 +60,8 @@ func mockResolverTwo() *mockResolver { func TestNamesysResolution(t *testing.T) { r := &mpns{ - resolvers: map[string]resolver{ - "ipns": mockResolverOne(), - "dns": mockResolverTwo(), - }, + ipnsResolver: mockResolverOne(), + dnsResolver: mockResolverTwo(), } testResolution(t, r, "Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", opts.DefaultDepthLimit, "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", nil) diff --git a/namesys/proquint.go b/namesys/proquint.go index 2c61c98d3a..c065db2d70 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -2,6 +2,7 @@ package namesys import ( "errors" + "time" context "context" @@ -18,10 +19,11 @@ func (r *ProquintResolver) Resolve(ctx context.Context, name string, options ... } // resolveOnce implements resolver. Decodes the proquint string. -func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { +func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { ok, err := proquint.IsProquint(name) if err != nil || !ok { - return "", errors.New("not a valid proquint string") + return "", 0, errors.New("not a valid proquint string") } - return path.FromString(string(proquint.Decode(name))), nil + // Return a 0 TTL as caching this result is pointless. + return path.FromString(string(proquint.Decode(name))), 0, nil } diff --git a/namesys/publisher.go b/namesys/publisher.go index 8c376d1aff..4fe15ca68c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -28,9 +28,9 @@ const ipnsPrefix = "/ipns/" const PublishPutValTimeout = time.Minute const DefaultRecordTTL = 24 * time.Hour -// ipnsPublisher is capable of publishing and resolving names to the IPFS +// IpnsPublisher is capable of publishing and resolving names to the IPFS // routing system. -type ipnsPublisher struct { +type IpnsPublisher struct { routing routing.ValueStore ds ds.Datastore @@ -38,17 +38,17 @@ type ipnsPublisher struct { mu sync.Mutex } -// NewRoutingPublisher constructs a publisher for the IPFS Routing name system. -func NewRoutingPublisher(route routing.ValueStore, ds ds.Datastore) *ipnsPublisher { +// NewIpnsPublisher constructs a publisher for the IPFS Routing name system. +func NewIpnsPublisher(route routing.ValueStore, ds ds.Datastore) *IpnsPublisher { if ds == nil { panic("nil datastore") } - return &ipnsPublisher{routing: route, ds: ds} + return &IpnsPublisher{routing: route, ds: ds} } // Publish implements Publisher. Accepts a keypair and a value, // and publishes it out to the routing system -func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { +func (p *IpnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordTTL)) } @@ -62,7 +62,7 @@ func IpnsDsKey(id peer.ID) ds.Key { // // This method will not search the routing system for records published by other // nodes. -func (p *ipnsPublisher) ListPublished(ctx context.Context) (map[peer.ID]*pb.IpnsEntry, error) { +func (p *IpnsPublisher) ListPublished(ctx context.Context) (map[peer.ID]*pb.IpnsEntry, error) { query, err := p.ds.Query(dsquery.Query{ Prefix: ipnsPrefix, }) @@ -114,7 +114,7 @@ func (p *ipnsPublisher) ListPublished(ctx context.Context) (map[peer.ID]*pb.Ipns // // If `checkRouting` is true and we have no existing record, this method will // check the routing system for any existing records. -func (p *ipnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouting bool) (*pb.IpnsEntry, error) { +func (p *IpnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouting bool) (*pb.IpnsEntry, error) { ctx, cancel := context.WithTimeout(ctx, time.Second*30) defer cancel() @@ -148,7 +148,7 @@ func (p *ipnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouti return e, nil } -func (p *ipnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) (*pb.IpnsEntry, error) { +func (p *IpnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) (*pb.IpnsEntry, error) { id, err := peer.IDFromPrivateKey(k) if err != nil { return nil, err @@ -197,7 +197,7 @@ func (p *ipnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value pa // PublishWithEOL is a temporary stand in for the ipns records implementation // see here for more details: https://github.com/ipfs/specs/tree/master/records -func (p *ipnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { +func (p *IpnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { record, err := p.updateRecord(ctx, k, value, eol) if err != nil { return err diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 8a9ab366ff..0878cb13f5 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -58,7 +58,7 @@ func TestRepublish(t *testing.T) { // have one node publish a record that is valid for 1 second publisher := nodes[3] p := path.FromString("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") // does not need to be valid - rp := namesys.NewRoutingPublisher(publisher.Routing, publisher.Repo.Datastore()) + rp := namesys.NewIpnsPublisher(publisher.Routing, publisher.Repo.Datastore()) err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, time.Now().Add(time.Second)) if err != nil { t.Fatal(err) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 2063296670..c3f7fbde1d 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -21,8 +21,8 @@ func TestRoutingResolve(t *testing.T) { id := testutil.RandIdentityOrFatal(t) d := serv.ClientWithDatastore(context.Background(), id, dstore) - resolver := NewRoutingResolver(d, 0) - publisher := NewRoutingPublisher(d, dstore) + resolver := NewIpnsResolver(d) + publisher := NewIpnsPublisher(d, dstore) privk, pubk, err := testutil.RandTestKeyPair(512) if err != nil { @@ -54,8 +54,8 @@ func TestPrexistingExpiredRecord(t *testing.T) { dstore := dssync.MutexWrap(ds.NewMapDatastore()) d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) - resolver := NewRoutingResolver(d, 0) - publisher := NewRoutingPublisher(d, dstore) + resolver := NewIpnsResolver(d) + publisher := NewIpnsPublisher(d, dstore) privk, pubk, err := testutil.RandTestKeyPair(512) if err != nil { @@ -96,8 +96,8 @@ func TestPrexistingRecord(t *testing.T) { dstore := dssync.MutexWrap(ds.NewMapDatastore()) d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) - resolver := NewRoutingResolver(d, 0) - publisher := NewRoutingPublisher(d, dstore) + resolver := NewIpnsResolver(d) + publisher := NewIpnsPublisher(d, dstore) privk, pubk, err := testutil.RandTestKeyPair(512) if err != nil { diff --git a/namesys/routing.go b/namesys/routing.go index 4a1668c31f..3e9c6ecae8 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -12,7 +12,6 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" - lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" @@ -22,102 +21,31 @@ import ( var log = logging.Logger("namesys") -// routingResolver implements NSResolver for the main IPFS SFS-like naming -type routingResolver struct { +// IpnsResolver implements NSResolver for the main IPFS SFS-like naming +type IpnsResolver struct { routing routing.ValueStore - - cache *lru.Cache -} - -func (r *routingResolver) cacheGet(name string) (path.Path, bool) { - if r.cache == nil { - return "", false - } - - ientry, ok := r.cache.Get(name) - if !ok { - return "", false - } - - entry, ok := ientry.(cacheEntry) - if !ok { - // should never happen, purely for sanity - log.Panicf("unexpected type %T in cache for %q.", ientry, name) - } - - if time.Now().Before(entry.eol) { - return entry.val, true - } - - r.cache.Remove(name) - - return "", false -} - -func (r *routingResolver) cacheSet(name string, val path.Path, rec *pb.IpnsEntry) { - if r.cache == nil { - return - } - - // if completely unspecified, just use one minute - ttl := DefaultResolverCacheTTL - if rec.Ttl != nil { - recttl := time.Duration(rec.GetTtl()) - if recttl >= 0 { - ttl = recttl - } - } - - cacheTil := time.Now().Add(ttl) - eol, ok := checkEOL(rec) - if ok && eol.Before(cacheTil) { - cacheTil = eol - } - - r.cache.Add(name, cacheEntry{ - val: val, - eol: cacheTil, - }) -} - -type cacheEntry struct { - val path.Path - eol time.Time } -// NewRoutingResolver constructs a name resolver using the IPFS Routing system +// NewIpnsResolver constructs a name resolver using the IPFS Routing system // to implement SFS-like naming on top. -// cachesize is the limit of the number of entries in the lru cache. Setting it -// to '0' will disable caching. -func NewRoutingResolver(route routing.ValueStore, cachesize int) *routingResolver { +func NewIpnsResolver(route routing.ValueStore) *IpnsResolver { if route == nil { panic("attempt to create resolver with nil routing system") } - - var cache *lru.Cache - if cachesize > 0 { - cache, _ = lru.New(cachesize) - } - - return &routingResolver{ + return &IpnsResolver{ routing: route, - cache: cache, } } // Resolve implements Resolver. -func (r *routingResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { +func (r *IpnsResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } // resolveOnce implements resolver. Uses the IPFS routing system to // resolve SFS-like names. -func (r *routingResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, error) { +func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { log.Debugf("RoutingResolver resolving %s", name) - cached, ok := r.cacheGet(name) - if ok { - return cached, nil - } if options.DhtTimeout != 0 { // Resolution must complete within the timeout @@ -131,13 +59,13 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, options if err != nil { // name should be a multihash. if it isn't, error out here. log.Debugf("RoutingResolver: bad input hash: [%s]\n", name) - return "", err + return "", 0, err } pid, err := peer.IDFromBytes(hash) if err != nil { log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) - return "", err + return "", 0, err } // Name should be the hash of a public key retrievable from ipfs. @@ -148,7 +76,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, options _, err = routing.GetPublicKey(r.routing, ctx, pid) if err != nil { log.Debugf("RoutingResolver: could not retrieve public key %s: %s\n", name, err) - return "", err + return "", 0, err } // Use the routing system to get the name. @@ -158,14 +86,14 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, options val, err := r.routing.GetValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) if err != nil { log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) - return "", err + return "", 0, err } entry := new(pb.IpnsEntry) err = proto.Unmarshal(val, entry) if err != nil { log.Debugf("RoutingResolver: could not unmarshal value for name %s: %s", name, err) - return "", err + return "", 0, err } var p path.Path @@ -178,12 +106,25 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string, options // Not a multihash, probably a new record p, err = path.ParsePath(string(entry.GetValue())) if err != nil { - return "", err + return "", 0, err + } + } + + ttl := DefaultResolverCacheTTL + if entry.Ttl != nil { + ttl = time.Duration(*entry.Ttl) + } + if eol, ok := checkEOL(entry); ok { + ttEol := eol.Sub(time.Now()) + if ttEol < 0 { + // It *was* valid when we first resolved it. + ttl = 0 + } else if ttEol < ttl { + ttl = ttEol } } - r.cacheSet(name, p, entry) - return p, nil + return p, ttl, nil } func checkEOL(e *pb.IpnsEntry) (time.Time, bool) { From 5786f02bfba5eba63d9693859864d70e99e69593 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 2 Jun 2018 00:38:00 -0700 Subject: [PATCH 2031/3147] log on network error when resolving the last published IPNS record License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@071c54772b243f5b06b4144254f77c808a723504 --- namesys/publisher.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/namesys/publisher.go b/namesys/publisher.go index 4fe15ca68c..f5f7d3695f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -136,6 +136,10 @@ func (p *IpnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouti if err != nil { // Not found or other network issue. Can't really do // anything about this case. + if err != routing.ErrNotFound { + log.Debugf("error when determining the last published IPNS record for %s: %s", id, err) + } + return nil, nil } default: From f8b077ad538f40047673ce20bb5756869ca7b4fa Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 4 Jun 2018 09:53:40 -0700 Subject: [PATCH 2032/3147] update multiplexers License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@66c0bcdc68b7e69e1ed4a58fccd02eea2706e7f7 --- namesys/ipns_validate_test.go | 2 +- namesys/namesys_test.go | 2 +- namesys/publisher_test.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index f9cdf024a6..5fc713bf38 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -10,12 +10,12 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" ropts "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing/options" testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 9cf41aea09..a2d8bd01f0 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,7 +10,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - offroute "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/offline" + offroute "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/offline" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 8f544d0c1e..67ed6471cc 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,10 +8,10 @@ import ( path "github.com/ipfs/go-ipfs/path" - mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" + mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 0878cb13f5..0d927f1ef1 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( path "github.com/ipfs/go-ipfs/path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmWsV6kzPaYGBDVyuUfWBvyQygEc9Qrv9vzo8vZ7X4mdLN/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmY6iAoG9DVgZwh5ZRcQEpa2uErAe1Hbei8qXPCjpDS9Ge/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index c3f7fbde1d..45609e95dc 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,8 +8,8 @@ import ( path "github.com/ipfs/go-ipfs/path" - mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" + mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/routing.go b/namesys/routing.go index 3e9c6ecae8..e399b19369 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -16,7 +16,7 @@ import ( mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dht "gx/ipfs/Qmd3jqhBQFvhfBNTSJMQL15GgyVMpdxKTta69Napvx6Myd/go-libp2p-kad-dht" + dht "gx/ipfs/Qme6C1xZFKUQVxvj8Sb7afWiQxzkQt67gq5V2o85pivCjV/go-libp2p-kad-dht" ) var log = logging.Logger("namesys") From 6d5f3eb89e17759cf18eb4a7df68429d2aa5f4d9 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 4 Jun 2018 09:53:40 -0700 Subject: [PATCH 2033/3147] update multiplexers License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@f227461b6ab84f9287d68e12783c9ec6384eceab --- blockservice/test/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 5fe23cb848..dd458b807b 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,8 +5,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" - mockrouting "gx/ipfs/QmPuPdzoG4b5uyYSQCjLEHB8NM593m3BW19UHX2jZ6Wzfm/go-ipfs-routing/mock" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" + mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 9bde23e78c50f3411258ae5e563a5a0289dda552 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Jun 2018 02:01:18 -0700 Subject: [PATCH 2034/3147] embed public keys inside ipns records, use for validation License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@5d8148222cc17389d8ed71cee6a7a99ead571fe6 --- namesys/pb/namesys.pb.go | 33 ++++++++++++++++++++++++--------- namesys/pb/namesys.proto | 6 ++++++ namesys/publisher.go | 13 +++++++++++++ namesys/validator.go | 38 ++++++++++++++++++++++++++++++++++---- 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/namesys/pb/namesys.pb.go b/namesys/pb/namesys.pb.go index 31e6355d7d..66626ca7db 100644 --- a/namesys/pb/namesys.pb.go +++ b/namesys/pb/namesys.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. -// source: namesys.proto +// source: namesys/pb/namesys.proto // DO NOT EDIT! /* Package namesys_pb is a generated protocol buffer package. It is generated from these files: - namesys.proto + namesys/pb/namesys.proto It has these top-level messages: IpnsEntry @@ -14,10 +14,12 @@ It has these top-level messages: package namesys_pb import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +import fmt "fmt" import math "math" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal +var _ = fmt.Errorf var _ = math.Inf type IpnsEntry_ValidityType int32 @@ -52,13 +54,18 @@ func (x *IpnsEntry_ValidityType) UnmarshalJSON(data []byte) error { } type IpnsEntry struct { - Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` - ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=namesys.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` - Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` - Sequence *uint64 `protobuf:"varint,5,opt,name=sequence" json:"sequence,omitempty"` - Ttl *uint64 `protobuf:"varint,6,opt,name=ttl" json:"ttl,omitempty"` - XXX_unrecognized []byte `json:"-"` + Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` + ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=namesys.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` + Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` + Sequence *uint64 `protobuf:"varint,5,opt,name=sequence" json:"sequence,omitempty"` + Ttl *uint64 `protobuf:"varint,6,opt,name=ttl" json:"ttl,omitempty"` + // in order for nodes to properly validate a record upon receipt, they need the public + // key associated with it. For old RSA keys, its easiest if we just send this as part of + // the record itself. For newer ed25519 keys, the public key can be embedded in the + // peerID, making this field unnecessary. + PubKey []byte `protobuf:"bytes,7,opt,name=pubKey" json:"pubKey,omitempty"` + XXX_unrecognized []byte `json:"-"` } func (m *IpnsEntry) Reset() { *m = IpnsEntry{} } @@ -107,6 +114,14 @@ func (m *IpnsEntry) GetTtl() uint64 { return 0 } +func (m *IpnsEntry) GetPubKey() []byte { + if m != nil { + return m.PubKey + } + return nil +} + func init() { + proto.RegisterType((*IpnsEntry)(nil), "namesys.pb.IpnsEntry") proto.RegisterEnum("namesys.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) } diff --git a/namesys/pb/namesys.proto b/namesys/pb/namesys.proto index d6eaf3243f..b72d498438 100644 --- a/namesys/pb/namesys.proto +++ b/namesys/pb/namesys.proto @@ -14,4 +14,10 @@ message IpnsEntry { optional uint64 sequence = 5; optional uint64 ttl = 6; + + // in order for nodes to properly validate a record upon receipt, they need the public + // key associated with it. For old RSA keys, its easiest if we just send this as part of + // the record itself. For newer ed25519 keys, the public key can be embedded in the + // peerID, making this field unnecessary. + optional bytes pubKey = 7; } diff --git a/namesys/publisher.go b/namesys/publisher.go index f5f7d3695f..80bc10d477 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -240,6 +240,17 @@ func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k ci.PubKey, return err } + // if we can't derive the public key from the peerID, embed the entire pubkey in + // the record to make the verifiers job easier + if extractedPublicKey == nil { + pubkeyBytes, err := k.Bytes() + if err != nil { + return err + } + + entry.PubKey = pubkeyBytes + } + namekey, ipnskey := IpnsKeysForID(id) go func() { @@ -247,6 +258,8 @@ func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k ci.PubKey, }() // Publish the public key if a public key cannot be extracted from the ID + // TODO: once v0.4.16 is widespread enough, we can stop doing this + // and at that point we can even deprecate the /pk/ namespace in the dht if extractedPublicKey == nil { go func() { errs <- PublishPublicKey(ctx, r, namekey, k) diff --git a/namesys/validator.go b/namesys/validator.go index 941d6a6678..852276f17b 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -3,11 +3,13 @@ package namesys import ( "bytes" "errors" + "fmt" "time" pb "github.com/ipfs/go-ipfs/namesys/pb" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" + ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" @@ -65,10 +67,10 @@ func (v IpnsValidator) Validate(key string, value []byte) error { log.Debugf("failed to parse ipns record key %s into peer ID", pidString) return ErrKeyFormat } - pubk := v.KeyBook.PubKey(pid) - if pubk == nil { - log.Debugf("public key with hash %s not found in peer store", pid) - return ErrPublicKeyNotFound + + pubk, err := v.getPublicKey(pid, entry) + if err != nil { + return fmt.Errorf("getting public key failed: %s", err) } // Check the ipns record signature with the public key @@ -94,6 +96,34 @@ func (v IpnsValidator) Validate(key string, value []byte) error { return nil } +func (v IpnsValidator) getPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey, error) { + if entry.PubKey != nil { + pk, err := ic.UnmarshalPublicKey(entry.PubKey) + if err != nil { + // TODO: i think this counts as a 'malformed record' and should be discarded + log.Debugf("public key in ipns record failed to parse: ", err) + return nil, err + } + expPid, err := peer.IDFromPublicKey(pk) + if err != nil { + return nil, fmt.Errorf("could not regenerate peerID from pubkey: %s", err) + } + + if pid != expPid { + return nil, fmt.Errorf("pubkey in record did not match expected pubkey") + } + + return pk, nil + } + + pubk := v.KeyBook.PubKey(pid) + if pubk == nil { + log.Debugf("public key with hash %s not found in peer store", pid) + return nil, ErrPublicKeyNotFound + } + return pubk, nil +} + // IpnsSelectorFunc selects the best record by checking which has the highest // sequence number and latest EOL func (v IpnsValidator) Select(k string, vals [][]byte) (int, error) { From 2cfa5c07573adef8fa7a30a4b125d85c2491f7d7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Jun 2018 04:52:17 -0700 Subject: [PATCH 2035/3147] test to ensure embedding the key in the record works License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@1bbdd92db6a35e7d12e9a8d57f195de5429834bc --- namesys/ipns_validate_test.go | 82 ++++++++++++++++++++++++++++++++--- namesys/validator.go | 4 +- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index f9cdf024a6..606c5944d6 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -3,6 +3,7 @@ package namesys import ( "context" "fmt" + "math/rand" "testing" "time" @@ -28,20 +29,21 @@ func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key validator := IpnsValidator{kbook} - p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - entry, err := CreateRoutingEntryData(priv, p, 1, eol) - if err != nil { - t.Fatal(err) - } - data := val if data == nil { + p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + entry, err := CreateRoutingEntryData(priv, p, 1, eol) + if err != nil { + t.Fatal(err) + } + data, err = proto.Marshal(entry) if err != nil { t.Fatal(err) } } - err = validator.Validate(key, data) + + err := validator.Validate(key, data) if err != exp { params := fmt.Sprintf("key: %s\neol: %s\n", key, eol) if exp == nil { @@ -74,6 +76,72 @@ func TestValidator(t *testing.T) { testValidatorCase(t, priv, kbook, "/wrong/"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) } +func TestEmbeddedPubKeyValidate(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + kbook := pstore.NewPeerstore() + + pth := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + + priv, _, _, ipnsk := genKeys(t) + + entry, err := CreateRoutingEntryData(priv, pth, 1, goodeol) + if err != nil { + t.Fatal(err) + } + + dataNoKey, err := proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + + testValidatorCase(t, priv, kbook, ipnsk, dataNoKey, goodeol, ErrPublicKeyNotFound) + + pubkb, err := priv.GetPublic().Bytes() + if err != nil { + t.Fatal(err) + } + + entry.PubKey = pubkb + + dataWithKey, err := proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + + testValidatorCase(t, priv, kbook, ipnsk, dataWithKey, goodeol, nil) +} + +func TestPeerIDPubKeyValidate(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + kbook := pstore.NewPeerstore() + + pth := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + + sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + if err != nil { + t.Fatal(err) + } + + pid, err := peer.IDFromPublicKey(pk) + if err != nil { + t.Fatal(err) + } + + ipnsk := "/ipns/" + string(pid) + + entry, err := CreateRoutingEntryData(sk, pth, 1, goodeol) + if err != nil { + t.Fatal(err) + } + + dataNoKey, err := proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + + testValidatorCase(t, sk, kbook, ipnsk, dataNoKey, goodeol, nil) +} + func TestResolverValidation(t *testing.T) { ctx := context.Background() rid := testutil.RandIdentityOrFatal(t) diff --git a/namesys/validator.go b/namesys/validator.go index 852276f17b..9d1e65e91b 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -70,7 +70,7 @@ func (v IpnsValidator) Validate(key string, value []byte) error { pubk, err := v.getPublicKey(pid, entry) if err != nil { - return fmt.Errorf("getting public key failed: %s", err) + return err } // Check the ipns record signature with the public key @@ -102,7 +102,7 @@ func (v IpnsValidator) getPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey if err != nil { // TODO: i think this counts as a 'malformed record' and should be discarded log.Debugf("public key in ipns record failed to parse: ", err) - return nil, err + return nil, fmt.Errorf("unmarshaling pubkey in record: %s", err) } expPid, err := peer.IDFromPublicKey(pk) if err != nil { From a07ec595788b2ad539e8ea2ea2603770e8b4442f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Jun 2018 07:51:46 -0700 Subject: [PATCH 2036/3147] add tests for pubkey mismatch and bad pubkey License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@3e1116b843a2631086893e668e02a9189b812e62 --- namesys/ipns_validate_test.go | 63 ++++++++++++++++++++++++----------- namesys/validator.go | 5 ++- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 606c5944d6..d7e46f3285 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -4,10 +4,12 @@ import ( "context" "fmt" "math/rand" + "strings" "testing" "time" opts "github.com/ipfs/go-ipfs/namesys/opts" + pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" @@ -27,6 +29,25 @@ import ( func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { t.Helper() + match := func(t *testing.T, err error) { + t.Helper() + if err != exp { + params := fmt.Sprintf("key: %s\neol: %s\n", key, eol) + if exp == nil { + t.Fatalf("Unexpected error %s for params %s", err, params) + } else if err == nil { + t.Fatalf("Expected error %s but there was no error for params %s", exp, params) + } else { + t.Fatalf("Expected error %s but got %s for params %s", exp, err, params) + } + } + } + + testValidatorCaseMatchFunc(t, priv, kbook, key, val, eol, match) +} + +func testValidatorCaseMatchFunc(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, matchf func(*testing.T, error)) { + t.Helper() validator := IpnsValidator{kbook} data := val @@ -43,17 +64,7 @@ func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key } } - err := validator.Validate(key, data) - if err != exp { - params := fmt.Sprintf("key: %s\neol: %s\n", key, eol) - if exp == nil { - t.Fatalf("Unexpected error %s for params %s", err, params) - } else if err == nil { - t.Fatalf("Expected error %s but there was no error for params %s", exp, params) - } else { - t.Fatalf("Expected error %s but got %s for params %s", exp, err, params) - } - } + matchf(t, validator.Validate(key, data)) } func TestValidator(t *testing.T) { @@ -76,6 +87,15 @@ func TestValidator(t *testing.T) { testValidatorCase(t, priv, kbook, "/wrong/"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) } +func mustMarshal(t *testing.T, entry *pb.IpnsEntry) []byte { + t.Helper() + data, err := proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + return data +} + func TestEmbeddedPubKeyValidate(t *testing.T) { goodeol := time.Now().Add(time.Hour) kbook := pstore.NewPeerstore() @@ -89,12 +109,7 @@ func TestEmbeddedPubKeyValidate(t *testing.T) { t.Fatal(err) } - dataNoKey, err := proto.Marshal(entry) - if err != nil { - t.Fatal(err) - } - - testValidatorCase(t, priv, kbook, ipnsk, dataNoKey, goodeol, ErrPublicKeyNotFound) + testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, ErrPublicKeyNotFound) pubkb, err := priv.GetPublic().Bytes() if err != nil { @@ -102,13 +117,23 @@ func TestEmbeddedPubKeyValidate(t *testing.T) { } entry.PubKey = pubkb + testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, nil) + + entry.PubKey = []byte("probably not a public key") + testValidatorCaseMatchFunc(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, func(t *testing.T, err error) { + if !strings.Contains(err.Error(), "unmarshaling pubkey in record:") { + t.Fatal("expected pubkey unmarshaling to fail") + } + }) - dataWithKey, err := proto.Marshal(entry) + opriv, _, _, _ := genKeys(t) + wrongkeydata, err := opriv.GetPublic().Bytes() if err != nil { t.Fatal(err) } - testValidatorCase(t, priv, kbook, ipnsk, dataWithKey, goodeol, nil) + entry.PubKey = wrongkeydata + testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, ErrPublicKeyMismatch) } func TestPeerIDPubKeyValidate(t *testing.T) { diff --git a/namesys/validator.go b/namesys/validator.go index 9d1e65e91b..ff9cc99eec 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -44,6 +44,8 @@ var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") // from the peer store var ErrPublicKeyNotFound = errors.New("public key not found in peer store") +var ErrPublicKeyMismatch = errors.New("public key in record did not match expected pubkey") + type IpnsValidator struct { KeyBook pstore.KeyBook } @@ -104,13 +106,14 @@ func (v IpnsValidator) getPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey log.Debugf("public key in ipns record failed to parse: ", err) return nil, fmt.Errorf("unmarshaling pubkey in record: %s", err) } + expPid, err := peer.IDFromPublicKey(pk) if err != nil { return nil, fmt.Errorf("could not regenerate peerID from pubkey: %s", err) } if pid != expPid { - return nil, fmt.Errorf("pubkey in record did not match expected pubkey") + return nil, ErrPublicKeyMismatch } return pk, nil From 005043b600bf74345a0a4e7347cba5533513f16c Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 5 Jun 2018 08:37:21 -0700 Subject: [PATCH 2037/3147] drop review TODO comment License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@9109ad4921b66dcec79e4877c5b6c5af159eb795 --- namesys/validator.go | 1 - 1 file changed, 1 deletion(-) diff --git a/namesys/validator.go b/namesys/validator.go index ff9cc99eec..94eb912b6b 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -102,7 +102,6 @@ func (v IpnsValidator) getPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey if entry.PubKey != nil { pk, err := ic.UnmarshalPublicKey(entry.PubKey) if err != nil { - // TODO: i think this counts as a 'malformed record' and should be discarded log.Debugf("public key in ipns record failed to parse: ", err) return nil, fmt.Errorf("unmarshaling pubkey in record: %s", err) } From 1d22da9f7e9cf6c1e43ea5aa9d0eb9a55bf7b6f3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 5 Jun 2018 23:55:08 -0700 Subject: [PATCH 2038/3147] update gx imports License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@38509122c60bb6e6cc2622b82500491b4258b34c --- namesys/ipns_validate_test.go | 8 ++++---- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- namesys/publisher_test.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- namesys/validator.go | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 687642b80e..546e270698 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -13,14 +13,14 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" - routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" - ropts "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing/options" testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" + routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" + ropts "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing/options" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" + pstore "gx/ipfs/QmZb7hAgQEhW9dBbzBudU39gCeD4zbe6xafD52LUuF4cUN/go-libp2p-peerstore" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" - pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/namesys.go b/namesys/namesys.go index bbdeb9b861..5f0065396b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -8,8 +8,8 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" - routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index a2d8bd01f0..922b2342d1 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,7 +10,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - offroute "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/offline" + offroute "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/offline" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/publisher.go b/namesys/publisher.go index 80bc10d477..df09e6d401 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,7 +14,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 67ed6471cc..8f625bb8fc 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,10 +8,10 @@ import ( path "github.com/ipfs/go-ipfs/path" + mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" - mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 0d927f1ef1..b5d1dc4741 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -12,9 +12,9 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" + mocknet "gx/ipfs/QmRvoAami8AAf5Yy6jcPq5KqQT1ZCaoi9dF1vdKAghmq9X/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmY6iAoG9DVgZwh5ZRcQEpa2uErAe1Hbei8qXPCjpDS9Ge/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" + pstore "gx/ipfs/QmZb7hAgQEhW9dBbzBudU39gCeD4zbe6xafD52LUuF4cUN/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 45609e95dc..8d700378b9 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,8 +8,8 @@ import ( path "github.com/ipfs/go-ipfs/path" + mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" - mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/routing.go b/namesys/routing.go index e399b19369..1373d50ce0 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -11,12 +11,12 @@ import ( u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - routing "gx/ipfs/QmUHRKTeaoASDvDj7cTAXsmjAY7KQ13ErtzkQHZQq6uFUz/go-libp2p-routing" + routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" + dht "gx/ipfs/QmYyonQoGb5Gw5VnGqgjKPPm1x3rY9QSquWCZqGKdiwuTw/go-libp2p-kad-dht" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - dht "gx/ipfs/Qme6C1xZFKUQVxvj8Sb7afWiQxzkQt67gq5V2o85pivCjV/go-libp2p-kad-dht" ) var log = logging.Logger("namesys") diff --git a/namesys/validator.go b/namesys/validator.go index 94eb912b6b..6a9c330a86 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -7,8 +7,8 @@ import ( "time" pb "github.com/ipfs/go-ipfs/namesys/pb" + pstore "gx/ipfs/QmZb7hAgQEhW9dBbzBudU39gCeD4zbe6xafD52LUuF4cUN/go-libp2p-peerstore" peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" - pstore "gx/ipfs/QmdeiKhUy1TVGBaKxt7y1QmBDLBdisSrLJ1x58Eoj4PXUh/go-libp2p-peerstore" ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" From 77dda61231923bbc4607fb8adf77835016f3c6c1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 5 Jun 2018 23:55:08 -0700 Subject: [PATCH 2039/3147] update gx imports License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@0668c2e1550acbca488c67056143dd4b93a91659 --- blockservice/test/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index dd458b807b..ee093fd368 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,8 +5,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" + mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - mockrouting "gx/ipfs/QmcE3B6ittYBmctva8Q155LPa1YPcVqg8N7pPcgt9i7iAQ/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 516946b7d4f26c79bfd3d94ecbf7c8b57754d43e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 6 Jun 2018 21:36:30 -0700 Subject: [PATCH 2040/3147] reduce log level when we can't republish This is almost never an error, it just means we don't have any connections. We could leave this at Warning but we'd like to be able to turn those on by default at some point. fixes #5029 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@6dc859f10251feb3ceabdc3c2688715fe88a1769 --- namesys/republisher/repub.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index aa1f85647d..3e731fbf98 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -72,7 +72,7 @@ func (rp *Republisher) Run(proc goprocess.Process) { timer.Reset(rp.Interval) err := rp.republishEntries(proc) if err != nil { - log.Error("Republisher failed to republish: ", err) + log.Info("republisher failed to republish: ", err) if FailureRetryInterval < rp.Interval { timer.Reset(FailureRetryInterval) } From 0aaacf840917934de1584c22fb3496f4f0b8019e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2041/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@a36fd94d3804ea04e45738ee84529200330d6f44 --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/hamt/hamt_stress_test.go | 2 +- unixfs/hamt/hamt_test.go | 2 +- unixfs/io/dagreader.go | 2 +- unixfs/io/dirbuilder.go | 4 ++-- unixfs/io/pbdagreader.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 6 +++--- unixfs/mod/dagmodifier_test.go | 2 +- unixfs/test/utils.go | 10 +++++----- 12 files changed, 21 insertions(+), 21 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 936b7b8c2a..c32715e270 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 1c00ce6742..61ceb2e982 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // Writer is a utility structure that helps to write diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index c83ec1ceaf..9d6c00f622 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -30,9 +30,9 @@ import ( upb "github.com/ipfs/go-ipfs/unixfs/pb" bitfield "gx/ipfs/QmTbBs3Y3u5F69XNJzdnnc6SP5GKgcXxCDzx6w8m6piVRT/go-bitfield" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go index 185e385e1d..c5a4fef9bd 100644 --- a/unixfs/hamt/hamt_stress_test.go +++ b/unixfs/hamt/hamt_stress_test.go @@ -11,7 +11,7 @@ import ( mdtest "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) func getNames(prefix string, count int) []string { diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 9a0e172aca..48a45c49da 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -14,7 +14,7 @@ import ( dagutils "github.com/ipfs/go-ipfs/merkledag/utils" ft "github.com/ipfs/go-ipfs/unixfs" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) func shuffle(seed int64, arr []string) { diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index b1841bd74e..e3f7957321 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,8 +10,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" ) // Common errors diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go index e8cbff52d2..3a36fe535e 100644 --- a/unixfs/io/dirbuilder.go +++ b/unixfs/io/dirbuilder.go @@ -9,8 +9,8 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // ShardSplitThreshold specifies how large of an unsharded directory diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index a194dccf43..ce53d67118 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -10,9 +10,9 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // PBDagReader provides a way to easily read the data contained in a dag. diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 26d360bb37..087d1b12fa 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 12781b2196..83caf64080 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,10 +14,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // Common errors diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 41979c613b..731322db19 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -13,7 +13,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" testu "github.com/ipfs/go-ipfs/unixfs/test" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ) func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, opts testu.NodeOpts) []byte { diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 046384679d..d92547e9fd 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -14,11 +14,11 @@ import ( mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // SizeSplitterGen creates a generator. From d75b6f012a7b24857b3ffe8adcf41f45bcf7a8ba Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2042/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@9621fbb7298259a3a7601fb30eb823aa8586b98b --- mfs/dir.go | 4 ++-- mfs/file.go | 4 ++-- mfs/mfs_test.go | 12 ++++++------ mfs/ops.go | 4 ++-- mfs/repub_test.go | 4 ++-- mfs/system.go | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 0cc6e6568c..17f09356f1 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 3839a279d9..403042b148 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -9,8 +9,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 0fdeed8e56..b051086b0b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -21,12 +21,12 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" - bstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - chunker "gx/ipfs/QmbGDSVKnYJZrtUnyxwsUpCeuigshNuVFxXCpv13jXecq1/go-ipfs-chunker" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + bstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/mfs/ops.go b/mfs/ops.go index e6ad1a3bea..6ade2bee0d 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -9,8 +9,8 @@ import ( path "github.com/ipfs/go-ipfs/path" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 14eaa30012..cec6f699de 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - ci "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil/ci" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + ci "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil/ci" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index a86ecf735a..975d3da67e 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,9 +19,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ) var ErrNotExist = errors.New("no such rootfs") From fbbfef87078eb5741c7db405194c7a096876a822 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2043/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@e27fc14bb163e1c20c77be3bd28683b5cbed61dc --- namesys/ipns_select_test.go | 2 +- namesys/ipns_validate_test.go | 16 ++++++++-------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 2 +- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 6 +++--- namesys/routing.go | 14 +++++++------- namesys/validator.go | 8 ++++---- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go index 9ba39ce7f3..a0067ada61 100644 --- a/namesys/ipns_select_test.go +++ b/namesys/ipns_select_test.go @@ -9,7 +9,7 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go index 546e270698..c1ea788991 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_validate_test.go @@ -12,15 +12,15 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" - record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" - testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" - routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" - ropts "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing/options" + record "gx/ipfs/QmPWjVzxHeJdrjp4Jr2R2sPxBrMbBgGPWQtKwCKHHCBF7x/go-libp2p-record" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" + routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" + ropts "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing/options" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pstore "gx/ipfs/QmZb7hAgQEhW9dBbzBudU39gCeD4zbe6xafD52LUuF4cUN/go-libp2p-peerstore" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" + mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/namesys.go b/namesys/namesys.go index 5f0065396b..99780cc888 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -8,11 +8,11 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 922b2342d1..b4f35c0de5 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,7 +10,7 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - offroute "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/offline" + offroute "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/offline" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/publisher.go b/namesys/publisher.go index df09e6d401..344004f244 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -13,10 +13,10 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsquery "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 8f625bb8fc..67f6be3223 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,11 +8,11 @@ import ( path "github.com/ipfs/go-ipfs/path" - mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" - testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" - ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" - dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" + testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" + ma "gx/ipfs/QmUxSEGbv2nmYNnfXi7839wwQqTN3kwQeUxe8dTjZWZs7J/go-multiaddr" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" + mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index aa1f85647d..a0286f3453 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -12,9 +12,9 @@ import ( goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index b5d1dc4741..9cc5a940eb 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -12,9 +12,9 @@ import ( . "github.com/ipfs/go-ipfs/namesys/republisher" path "github.com/ipfs/go-ipfs/path" - mocknet "gx/ipfs/QmRvoAami8AAf5Yy6jcPq5KqQT1ZCaoi9dF1vdKAghmq9X/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmZb7hAgQEhW9dBbzBudU39gCeD4zbe6xafD52LUuF4cUN/go-libp2p-peerstore" + mocknet "gx/ipfs/QmUEAR2pS7fP1GPseS3i8MWFyENs7oDp4CZrgn8FCjbsBu/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 8d700378b9..9dd5664042 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,9 +8,9 @@ import ( path "github.com/ipfs/go-ipfs/path" - mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" - testutil "gx/ipfs/QmUJzxQQ2kzwQubsMqBTr1NGDpLfh7pGA2E1oaJULcKDPq/go-testutil" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" + mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 1373d50ce0..c10464a1b4 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,14 +9,14 @@ import ( pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - routing "gx/ipfs/QmXijJ3T9MjB2v8xpFDoEX6FqR9u8PkJkzu49TgwJ8Ndr5/go-libp2p-routing" - dht "gx/ipfs/QmYyonQoGb5Gw5VnGqgjKPPm1x3rY9QSquWCZqGKdiwuTw/go-libp2p-kad-dht" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dht "gx/ipfs/QmagBkuFfySAMouyXeiy8XjV1GyfNAgTCuVYGF9z3Z4Vvc/go-libp2p-kad-dht" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ) var log = logging.Logger("namesys") diff --git a/namesys/validator.go b/namesys/validator.go index 6a9c330a86..f947ef0469 100644 --- a/namesys/validator.go +++ b/namesys/validator.go @@ -7,12 +7,12 @@ import ( "time" pb "github.com/ipfs/go-ipfs/namesys/pb" - pstore "gx/ipfs/QmZb7hAgQEhW9dBbzBudU39gCeD4zbe6xafD52LUuF4cUN/go-libp2p-peerstore" - peer "gx/ipfs/QmcJukH2sAFjY3HdBKq35WDzWoL3UUu2gt9wdfqZTUyM74/go-libp2p-peer" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" + pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - record "gx/ipfs/QmTUyK82BVPA6LmSzEJpfEunk9uBaQzWtMsNP917tVj4sT/go-libp2p-record" + record "gx/ipfs/QmPWjVzxHeJdrjp4Jr2R2sPxBrMbBgGPWQtKwCKHHCBF7x/go-libp2p-record" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) From 15ff99015bce734a73dc680ce7e8e4c8a7d450be Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2044/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@9b835a79efaecc288a4898e0d3a704a0cd62a7e0 --- blockservice/blockservice.go | 10 +++++----- blockservice/blockservice_test.go | 8 ++++---- blockservice/test/blocks_test.go | 10 +++++----- blockservice/test/mock.go | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index c913d1c58c..c39b36d256 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,11 +11,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/verifcid" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - exchange "gx/ipfs/QmdcAXgEHUueP4A7b5hjabKn2EooeHgMreMvFC249dGCgc/go-ipfs-exchange-interface" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" + blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" + exchange "gx/ipfs/QmVSe7YJbPnEmkSUKD3HxSvp8HJoyCU55hQoCMRq7N1jaK/go-ipfs-exchange-interface" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index af9cbe8b51..d3c0bb1e60 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,12 +3,12 @@ package blockservice import ( "testing" - offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" + offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" + butil "gx/ipfs/QmYmE4kxv6uFGaWkeBAFYDuNcxzCn87pzwm6CkBkM9C8BM/go-ipfs-blocksutil" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" - butil "gx/ipfs/Qmf951DP11mCoctpyF3ZppPZdo2oAxuNi2vnkVDgHJ8Fqk/go-ipfs-blocksutil" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 2ba4450791..745a1c7276 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -9,13 +9,13 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" - u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) func newObject(data []byte) blocks.Block { diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index ee093fd368..5018a6c8d8 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,8 +5,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" - mockrouting "gx/ipfs/QmPFAxh9UwfqwseVcWkj1Lz1gCHyQ6QuCk5m5XUp6vifkL/go-ipfs-routing/mock" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" + mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 73b43b2101329201f0f2eff4c49be8ba6064ad5a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2045/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@8c558a85cc4e2ed3dc2ee903906069c236f6b61c --- filestore/filestore.go | 10 +++++----- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 5342cfa172..0df41aafb3 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -10,12 +10,12 @@ package filestore import ( "context" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" + posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 3a67dba1ea..43fa263b8a 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index c5e255c6cb..1b1b94ea79 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -9,15 +9,15 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - posinfo "gx/ipfs/Qmb3jLEFAQrqdVgWUajqEyuuDoavkSq1XQXz6tWdFWF995/go-ipfs-posinfo" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" + posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" - blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index e09b69744c..8af7d860b2 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,9 +6,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmYJgz1Z5PbBGP7n2XA8uv5sF1EKLfYUjL7kFemVAjMNqC/go-ipfs-ds-help" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From 8c9a3e0f95214b2411ed8d7588b8d63b818ea167 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2046/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@f9ff47a1e5d33513e88b532b94c45f2b969c1df6 --- path/path.go | 2 +- path/resolver/resolver.go | 6 +++--- path/resolver/resolver_test.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/path/path.go b/path/path.go index ac9348b560..c1b7de2a37 100644 --- a/path/path.go +++ b/path/path.go @@ -6,7 +6,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) var ( diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index d4e0588296..a263f11504 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -10,9 +10,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ) var log = logging.Logger("pathresolv") diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 79a857cb6c..1c2e0e6b93 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -10,8 +10,8 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/path/resolver" - util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From 9dfce0ee52ff5df85f14926afb214a41800fee7f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2047/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@7185d0db5b5ab07eda6b9b44b0f00e2f1d9d7f89 --- pinning/pinner/gc/gc.go | 10 +++++----- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 8 ++++---- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 6 +++--- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 95e706dbcb..69ca731d17 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -12,11 +12,11 @@ import ( pin "github.com/ipfs/go-ipfs/pin" "github.com/ipfs/go-ipfs/thirdparty/verifcid" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" - bstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + bstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index f4024f0c01..348ead7bf1 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,9 +12,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 27963c371e..0a0f652065 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -8,10 +8,10 @@ import ( bs "github.com/ipfs/go-ipfs/blockservice" mdag "github.com/ipfs/go-ipfs/merkledag" - util "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util" - offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index d239859eac..67d3c345ab 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index a54dd84fce..221487173e 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -8,9 +8,9 @@ import ( bserv "github.com/ipfs/go-ipfs/blockservice" dag "github.com/ipfs/go-ipfs/merkledag" - offline "gx/ipfs/QmYk9mQ4iByLLFzZPGWMnjJof3DQ3QneFFR6ZtNAXd8UvS/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmayRSLCiM2gWR7Kay8vqu3Yy5mf7yPqocF9ZRgDUPYMcc/go-ipfs-blockstore" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From e5476a562dd62ec1df38b5c71ebb649f78b57dbc Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2048/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-keystore@becc82c9adc2368499b35caae3313cbc2df036ed --- keystore/keystore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index a11b5d5f35..78bca6ecd1 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - logging "gx/ipfs/QmTG23dvpBCBjqQwyDxV8CQT6jmS4PSftNr1VqHhE3MLy7/go-log" + logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) From 724c6143570accc8e163cc355b46eff0338f52e5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2049/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@0e613d93eacb5247a4ca23790a5fe82dde8917dc --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/object.go | 4 ++-- coreiface/options/block.go | 2 +- coreiface/options/dag.go | 2 +- coreiface/path.go | 2 +- coreiface/unixfs.go | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 9428b3b634..220f8df503 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index f20c88f25a..3c4dc0c3ab 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) // DagAPI specifies the interface to IPLD diff --git a/coreiface/object.go b/coreiface/object.go index 548b15a736..d53f4d2142 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 55964b2b71..d6da99774c 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -1,7 +1,7 @@ package options import ( - "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ) type BlockPutSettings struct { diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index 96eea5b460..b5e6dcea12 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) type DagPutSettings struct { diff --git a/coreiface/path.go b/coreiface/path.go index b2160b9426..929b97bcd9 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // Path is a generic wrapper for paths used in the API. A path can be resolved diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index c1b4efa432..11e14cc849 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,7 +4,7 @@ import ( "context" "io" - ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format" + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" ) // UnixfsAPI is the basic interface to immutable files in IPFS From 1e5b96437fba9155461a75b8a50aa109e52aee11 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 8 Jun 2018 22:01:00 -0700 Subject: [PATCH 2050/3147] gx update go-log, sys, go-crypto * go-log * sys * go-crypto License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-verifcid@e76065d6e0bb78d7f20c5918af335c0374cc78d2 --- verifcid/validate.go | 4 ++-- verifcid/validate_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/verifcid/validate.go b/verifcid/validate.go index 4af24b4c43..cc4a761bce 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -3,8 +3,8 @@ package verifcid import ( "fmt" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) var ErrPossiblyInsecureHashFunction = fmt.Errorf("potentially insecure hash functions not allowed") diff --git a/verifcid/validate_test.go b/verifcid/validate_test.go index 21ab090215..7407075937 100644 --- a/verifcid/validate_test.go +++ b/verifcid/validate_test.go @@ -3,9 +3,9 @@ package verifcid import ( "testing" - mh "gx/ipfs/QmZyZDi491cCNTLfAhwcaDii2Kg4pwKRkhqQzURGDvY6ua/go-multihash" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) func TestValidateCids(t *testing.T) { From 4a1bb6990fccac58f695c82938b4406c488b09c1 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 8 Jun 2018 12:21:32 -0300 Subject: [PATCH 2051/3147] unixfs: integrate `pb.Data` into `FSNode` To avoid duplicating fields and making the code easier to follow. Remove all of `FSNode` previous fields in favor on a single `pb.Data` structure that is not exported. Accessor methods are added only for the necessary internal fields. This takes up more memory, `pb.Data` is always created inside `FSNode` and it stays there instead of just being created and destroyed during the (un)marshal operations. The removed fields `Data`, `blocksizes` and `Type` had a direct counterpart in the embedded `pb.Data` structure, in contrast (only) the `subtotal` field doesn't have one, it was used as a temporary accumulator to track the `Filesize`, which is now being kept updated on every modification (to ensure the entire `FSNode` is always at a valid state), so `subtotal` could just be removed without the addition of any other field (this temporary accumulator was obscuring how `Filesize` was computed). To keep `Filesize` up to date a method was added (`UpdateFilesize()`) to adjust its value in the two places where the file size could be modified, when changing its data (in `SetData()`, accessor method added) and when adding or removing child nodes (in `AddBlockSize()` and `RemoveBlockSize()`). A constructor method was added (`NewFSNode()`) to initialize the required fields, like `Type` which is explicitly set, this deprecates the previous methodology of just calling `new(FSNode)` and relying in the default value of `pb.Data_DataType` (`Data_Raw`) to avoid an explicit assignment. Also, `Filesize` is initialized to avoid being left with a `nil` value before marshaling empty nodes, which would result in a different hash from previous versions, to be backwards compatible. Previous versions of `GetBytes()` always set the `Filesize` value, even though it is reflected as an `optional` field in the `.proto` file (this may be an inaccurate field rule). Without the duplicated fields the functions `GetBytes()` and `FSNodeFromBytes()` are now reduced to simple `Marshal()` and `Unmarshal()` operations respectively. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@3c982f0b2a8481b5d31c474df0ffdc6f7197ffb6 --- unixfs/mod/dagmodifier.go | 2 +- unixfs/unixfs.go | 92 +++++++++++++++++++++++++++------------ unixfs/unixfs_test.go | 5 +-- 3 files changed, 66 insertions(+), 33 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 12781b2196..f308982958 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -526,7 +526,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi var cur uint64 end := 0 var modified ipld.Node - ndata := new(ft.FSNode) + ndata := ft.NewFSNode(ft.TRaw) for i, lnk := range nd.Links() { child, err := lnk.GetNode(ctx, ds) if err != nil { diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 654de7ff82..3ba01fb0fc 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -139,67 +139,101 @@ func DataSize(data []byte) (uint64, error) { } } -// An FSNode represents a filesystem object. +// An FSNode represents a filesystem object using the UnixFS specification. +// +// The `NewFSNode` constructor should be used instead of just calling `new(FSNode)` +// to guarantee that the required (`Type` and `Filesize`) fields in the `format` +// structure are initialized before marshaling (in `GetBytes()`). type FSNode struct { - Data []byte - // total data size for each child - blocksizes []uint64 - - // running sum of blocksizes - subtotal uint64 - - // node type of this node - Type pb.Data_DataType + // UnixFS format defined as a protocol buffers message. + format pb.Data } // FSNodeFromBytes unmarshal a protobuf message onto an FSNode. func FSNodeFromBytes(b []byte) (*FSNode, error) { - pbn := new(pb.Data) - err := proto.Unmarshal(b, pbn) + n := new(FSNode) + err := proto.Unmarshal(b, &n.format) if err != nil { return nil, err } - n := new(FSNode) - n.Data = pbn.Data - n.blocksizes = pbn.Blocksizes - n.subtotal = pbn.GetFilesize() - uint64(len(n.Data)) - n.Type = pbn.GetType() return n, nil } +// NewFSNode creates a new FSNode structure with the given `dataType`. +// +// It initializes the (required) `Type` field (that doesn't have a `Set()` +// accessor so it must be specified at creation), otherwise the `Marshal()` +// method in `GetBytes()` would fail (`required field "Type" not set`). +// +// It also initializes the `Filesize` pointer field to ensure its value +// is never nil before marshaling, this is not a required field but it is +// done to be backwards compatible with previous `go-ipfs` versions hash. +// (If it wasn't initialized there could be cases where `Filesize` could +// have been left at nil, when the `FSNode` was created but no data or +// child nodes were set to adjust it, as is the case in `NewLeaf()`.) +func NewFSNode(dataType pb.Data_DataType) *FSNode { + n := new(FSNode) + n.format.Type = &dataType + + // Initialize by `Filesize` by updating it with a dummy (zero) value. + n.UpdateFilesize(0) + + return n +} + // AddBlockSize adds the size of the next child block of this node func (n *FSNode) AddBlockSize(s uint64) { - n.subtotal += s - n.blocksizes = append(n.blocksizes, s) + n.UpdateFilesize(int64(s)) + n.format.Blocksizes = append(n.format.Blocksizes, s) } // RemoveBlockSize removes the given child block's size. func (n *FSNode) RemoveBlockSize(i int) { - n.subtotal -= n.blocksizes[i] - n.blocksizes = append(n.blocksizes[:i], n.blocksizes[i+1:]...) + n.UpdateFilesize(-int64(n.format.Blocksizes[i])) + n.format.Blocksizes = append(n.format.Blocksizes[:i], n.format.Blocksizes[i+1:]...) } // GetBytes marshals this node as a protobuf message. func (n *FSNode) GetBytes() ([]byte, error) { - pbn := new(pb.Data) - pbn.Type = &n.Type - pbn.Filesize = proto.Uint64(uint64(len(n.Data)) + n.subtotal) - pbn.Blocksizes = n.blocksizes - pbn.Data = n.Data - return proto.Marshal(pbn) + return proto.Marshal(&n.format) } // FileSize returns the total size of this tree. That is, the size of // the data in this node plus the size of all its children. func (n *FSNode) FileSize() uint64 { - return uint64(len(n.Data)) + n.subtotal + return n.format.GetFilesize() } // NumChildren returns the number of child blocks of this node func (n *FSNode) NumChildren() int { - return len(n.blocksizes) + return len(n.format.Blocksizes) +} + +// GetData retrieves the `Data` field from the internal `format`. +func (n *FSNode) GetData() []byte { + return n.format.GetData() +} + +// SetData sets the `Data` field from the internal `format` +// updating its `Filesize`. +func (n *FSNode) SetData(newData []byte) { + n.UpdateFilesize(int64(len(newData) - len(n.GetData()))) + n.format.Data = newData +} + +// UpdateFilesize updates the `Filesize` field from the internal `format` +// by a signed difference (`filesizeDiff`). +// TODO: Add assert to check for `Filesize` > 0? +func (n *FSNode) UpdateFilesize(filesizeDiff int64) { + n.format.Filesize = proto.Uint64(uint64( + int64(n.format.GetFilesize()) + filesizeDiff)) +} + +// GetType retrieves the `Type` field from the internal `format`. +func (n *FSNode) GetType() pb.Data_DataType { + return n.format.GetType() } // Metadata is used to store additional FSNode information. diff --git a/unixfs/unixfs_test.go b/unixfs/unixfs_test.go index 6edc2ca0bb..967ee0ca87 100644 --- a/unixfs/unixfs_test.go +++ b/unixfs/unixfs_test.go @@ -10,14 +10,13 @@ import ( ) func TestFSNode(t *testing.T) { - fsn := new(FSNode) - fsn.Type = TFile + fsn := NewFSNode(TFile) for i := 0; i < 16; i++ { fsn.AddBlockSize(100) } fsn.RemoveBlockSize(15) - fsn.Data = make([]byte, 128) + fsn.SetData(make([]byte, 128)) b, err := fsn.GetBytes() if err != nil { From 52e64d8b7c2da43f8a30335764c6b1aa7b27b666 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 8 Jun 2018 12:21:32 -0300 Subject: [PATCH 2052/3147] unixfs: integrate `pb.Data` into `FSNode` To avoid duplicating fields and making the code easier to follow. Remove all of `FSNode` previous fields in favor on a single `pb.Data` structure that is not exported. Accessor methods are added only for the necessary internal fields. This takes up more memory, `pb.Data` is always created inside `FSNode` and it stays there instead of just being created and destroyed during the (un)marshal operations. The removed fields `Data`, `blocksizes` and `Type` had a direct counterpart in the embedded `pb.Data` structure, in contrast (only) the `subtotal` field doesn't have one, it was used as a temporary accumulator to track the `Filesize`, which is now being kept updated on every modification (to ensure the entire `FSNode` is always at a valid state), so `subtotal` could just be removed without the addition of any other field (this temporary accumulator was obscuring how `Filesize` was computed). To keep `Filesize` up to date a method was added (`UpdateFilesize()`) to adjust its value in the two places where the file size could be modified, when changing its data (in `SetData()`, accessor method added) and when adding or removing child nodes (in `AddBlockSize()` and `RemoveBlockSize()`). A constructor method was added (`NewFSNode()`) to initialize the required fields, like `Type` which is explicitly set, this deprecates the previous methodology of just calling `new(FSNode)` and relying in the default value of `pb.Data_DataType` (`Data_Raw`) to avoid an explicit assignment. Also, `Filesize` is initialized to avoid being left with a `nil` value before marshaling empty nodes, which would result in a different hash from previous versions, to be backwards compatible. Previous versions of `GetBytes()` always set the `Filesize` value, even though it is reflected as an `optional` field in the `.proto` file (this may be an inaccurate field rule). Without the duplicated fields the functions `GetBytes()` and `FSNodeFromBytes()` are now reduced to simple `Marshal()` and `Unmarshal()` operations respectively. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@27b9ea0211399e073586d9b87b4714ee4d0da639 --- mfs/file.go | 2 +- mfs/mfs_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index 3839a279d9..14b0a65db1 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -60,7 +60,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { return nil, err } - switch fsn.Type { + switch fsn.GetType() { default: return nil, fmt.Errorf("unsupported fsnode type for 'file'") case ft.TSymlink: diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 0fdeed8e56..6ea8cd7caf 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -852,7 +852,7 @@ func TestFlushing(t *testing.T) { t.Fatal(err) } - if fsnode.Type != ft.TDirectory { + if fsnode.GetType() != ft.TDirectory { t.Fatal("root wasnt a directory") } From 08b564ca962f26cd6dbc3d1832f09d88f3c5413a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 13 Jun 2018 18:12:02 -0700 Subject: [PATCH 2053/3147] implement record validation we should be doing this in the offline router This commit was moved from ipfs/go-ipfs-routing@4a8cbbce65f0ea6d3e6ce99cc4486cb86490f59c --- routing/mock/centralized_client.go | 41 ++++-------------------------- routing/mock/centralized_server.go | 8 +++--- routing/mock/interface.go | 6 +++++ routing/offline/offline.go | 33 ++++++++++++++++++++---- routing/offline/offline_test.go | 11 +++++--- 5 files changed, 51 insertions(+), 48 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index c0d70f94a3..e3d488240b 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -2,18 +2,12 @@ package mockrouting import ( "context" - "errors" "time" - proto "github.com/gogo/protobuf/proto" cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - dshelp "github.com/ipfs/go-ipfs-ds-help" - u "github.com/ipfs/go-ipfs-util" logging "github.com/ipfs/go-log" peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" - dhtpb "github.com/libp2p/go-libp2p-record/pb" routing "github.com/libp2p/go-libp2p-routing" ropts "github.com/libp2p/go-libp2p-routing/options" "github.com/libp2p/go-testutil" @@ -23,46 +17,21 @@ import ( var log = logging.Logger("mockrouter") type client struct { - datastore ds.Datastore - server server - peer testutil.Identity + vs routing.ValueStore + server server + peer testutil.Identity } // FIXME(brian): is this method meant to simulate putting a value into the network? func (c *client) PutValue(ctx context.Context, key string, val []byte, opts ...ropts.Option) error { log.Debugf("PutValue: %s", key) - rec := new(dhtpb.Record) - rec.Value = val - rec.Key = proto.String(string(key)) - rec.TimeReceived = proto.String(u.FormatRFC3339(time.Now())) - data, err := proto.Marshal(rec) - if err != nil { - return err - } - - return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data) + return c.vs.PutValue(ctx, key, val, opts...) } // FIXME(brian): is this method meant to simulate getting a value from the network? func (c *client) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { log.Debugf("GetValue: %s", key) - v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) - if err != nil { - return nil, err - } - - data, ok := v.([]byte) - if !ok { - return nil, errors.New("could not cast value from datastore") - } - - rec := new(dhtpb.Record) - err = proto.Unmarshal(data, rec) - if err != nil { - return nil, err - } - - return rec.GetValue(), nil + return c.vs.GetValue(ctx, key, opts...) } func (c *client) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index ab1a985fdf..b869a4f439 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -12,6 +12,8 @@ import ( peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-testutil" + + offline "github.com/ipfs/go-ipfs-routing/offline" ) // server is the mockrouting.Client's private interface to the routing server @@ -84,8 +86,8 @@ func (rs *s) Client(p testutil.Identity) Client { func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Identity, datastore ds.Datastore) Client { return &client{ - peer: p, - datastore: datastore, - server: rs, + peer: p, + vs: offline.NewOfflineRouter(datastore, MockValidator{}), + server: rs, } } diff --git a/routing/mock/interface.go b/routing/mock/interface.go index c14a7763f3..5d4e9f9aa6 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -14,6 +14,12 @@ import ( "github.com/libp2p/go-testutil" ) +// MockValidator is a record validator that always returns success. +type MockValidator struct{} + +func (MockValidator) Validate(_ string, _ []byte) error { return nil } +func (MockValidator) Select(_ string, _ [][]byte) (int, error) { return 0, nil } + // Server provides mockrouting Clients type Server interface { Client(p testutil.Identity) Client diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 422af8d61e..1be28bcf40 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -3,6 +3,7 @@ package offline import ( + "bytes" "context" "errors" "time" @@ -11,7 +12,6 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dshelp "github.com/ipfs/go-ipfs-ds-help" - ci "github.com/libp2p/go-libp2p-crypto" "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" record "github.com/libp2p/go-libp2p-record" @@ -27,10 +27,10 @@ var ErrOffline = errors.New("routing system in offline mode") // NewOfflineRouter returns an IpfsRouting implementation which only performs // offline operations. It allows to Put and Get signed dht // records to and from the local datastore. -func NewOfflineRouter(dstore ds.Datastore, privkey ci.PrivKey) routing.IpfsRouting { +func NewOfflineRouter(dstore ds.Datastore, validator record.Validator) routing.IpfsRouting { return &offlineRouting{ datastore: dstore, - sk: privkey, + validator: validator, } } @@ -39,10 +39,28 @@ func NewOfflineRouter(dstore ds.Datastore, privkey ci.PrivKey) routing.IpfsRouti // records to and from the local datastore. type offlineRouting struct { datastore ds.Datastore - sk ci.PrivKey + validator record.Validator } func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ ...ropts.Option) error { + if err := c.validator.Validate(key, val); err != nil { + return err + } + if old, err := c.GetValue(ctx, key); err == nil { + // be idempotent to be nice. + if bytes.Equal(old, val) { + return nil + } + // check to see if the older record is better + i, err := c.validator.Select(key, [][]byte{val, old}) + if err != nil { + // this shouldn't happen for validated records. + return err + } + if i != 0 { + return errors.New("can't replace a newer record with an older one") + } + } rec := record.MakePutRecord(key, val) data, err := proto.Marshal(rec) if err != nil { @@ -67,8 +85,13 @@ func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Op if err != nil { return nil, err } + val := rec.GetValue() - return rec.GetValue(), nil + err = c.validator.Validate(key, val) + if err != nil { + return nil, err + } + return val, nil } func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 61670f442c..9703bac573 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -12,12 +12,16 @@ import ( mh "github.com/multiformats/go-multihash" ) +type blankValidator struct{} + +func (blankValidator) Validate(_ string, _ []byte) error { return nil } +func (blankValidator) Select(_ string, _ [][]byte) (int, error) { return 0, nil } + func TestOfflineRouterStorage(t *testing.T) { ctx := context.Background() nds := ds.NewMapDatastore() - privkey, _, _ := testutil.RandTestKeyPair(128) - offline := NewOfflineRouter(nds, privkey) + offline := NewOfflineRouter(nds, blankValidator{}) if err := offline.PutValue(ctx, "key", []byte("testing 1 2 3")); err != nil { t.Fatal(err) @@ -55,8 +59,7 @@ func TestOfflineRouterLocal(t *testing.T) { ctx := context.Background() nds := ds.NewMapDatastore() - privkey, _, _ := testutil.RandTestKeyPair(128) - offline := NewOfflineRouter(nds, privkey) + offline := NewOfflineRouter(nds, blankValidator{}) id, _ := testutil.RandPeerID() _, err := offline.FindPeer(ctx, id) From f99530f37a0195f72acaba1fc59fe5f21ad6b731 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 5 Jun 2018 21:24:31 -0400 Subject: [PATCH 2054/3147] Add a special blockstore to support identity hashes. This commit was moved from ipfs/go-ipfs-blockstore@7ba147892bc451221adf2429b79e7b4a2b103917 --- blockstore/idstore.go | 78 +++++++++++++++++++++++ blockstore/idstore_test.go | 127 +++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 blockstore/idstore.go create mode 100644 blockstore/idstore_test.go diff --git a/blockstore/idstore.go b/blockstore/idstore.go new file mode 100644 index 0000000000..e86db2a65c --- /dev/null +++ b/blockstore/idstore.go @@ -0,0 +1,78 @@ +package blockstore + +import ( + "context" + + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + mh "github.com/multiformats/go-multihash" +) + +// idstore wraps a BlockStore to add support for identity hashes +type idstore struct { + bs Blockstore +} + +func IdStore(bs Blockstore) Blockstore { + return &idstore{bs} +} + +func extractContents(k *cid.Cid) (bool, []byte) { + dmh, err := mh.Decode(k.Hash()) + if err != nil || dmh.Code != mh.ID { + return false, nil + } + return true, dmh.Digest +} + +func (b *idstore) DeleteBlock(k *cid.Cid) error { + isId, _ := extractContents(k) + if isId { + return nil + } + return b.bs.DeleteBlock(k) +} + +func (b *idstore) Has(k *cid.Cid) (bool, error) { + isId, _ := extractContents(k) + if isId { + return true, nil + } + return b.bs.Has(k) +} + +func (b *idstore) Get(k *cid.Cid) (blocks.Block, error) { + isId, bdata := extractContents(k) + if isId { + return blocks.NewBlockWithCid(bdata, k) + } + return b.bs.Get(k) +} + +func (b *idstore) Put(bl blocks.Block) error { + isId, _ := extractContents(bl.Cid()) + if isId { + return nil + } + return b.bs.Put(bl) +} + +func (b *idstore) PutMany(bs []blocks.Block) error { + toPut := make([]blocks.Block, 0, len(bs)) + for _, bl := range bs { + isId, _ := extractContents(bl.Cid()) + if isId { + continue + } + toPut = append(toPut, bl) + } + return b.bs.PutMany(toPut) +} + +func (b *idstore) HashOnRead(enabled bool) { + b.bs.HashOnRead(enabled) +} + +func (b *idstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { + return b.bs.AllKeysChan(ctx) +} diff --git a/blockstore/idstore_test.go b/blockstore/idstore_test.go new file mode 100644 index 0000000000..6fe0a5e1ef --- /dev/null +++ b/blockstore/idstore_test.go @@ -0,0 +1,127 @@ +package blockstore + +import ( + "context" + "testing" + + blk "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + mh "github.com/multiformats/go-multihash" +) + +func createTestStores() (Blockstore, *callbackDatastore) { + cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} + ids := IdStore(NewBlockstore(cd)) + return ids, cd +} + +func TestIdStore(t *testing.T) { + idhash1, _ := cid.NewPrefixV1(cid.Raw, mh.ID).Sum([]byte("idhash1")) + idblock1, _ := blk.NewBlockWithCid([]byte("idhash1"), idhash1) + hash1, _ := cid.NewPrefixV1(cid.Raw, mh.SHA2_256).Sum([]byte("hash1")) + block1, _ := blk.NewBlockWithCid([]byte("hash1"), hash1) + + ids, cb := createTestStores() + + have, _ := ids.Has(idhash1) + if !have { + t.Fatal("Has() failed on idhash") + } + + _, err := ids.Get(idhash1) + if err != nil { + t.Fatalf("Get() failed on idhash: %v", err) + } + + noop := func() {} + failIfPassThough := func() { + t.Fatal("operation on identity hash passed though to datastore") + } + + cb.f = failIfPassThough + err = ids.Put(idblock1) + if err != nil { + t.Fatal(err) + } + + cb.f = noop + err = ids.Put(block1) + if err != nil { + t.Fatalf("Put() failed on normal block: %v", err) + } + + have, _ = ids.Has(hash1) + if !have { + t.Fatal("normal block not added to datastore") + } + + _, err = ids.Get(hash1) + if err != nil { + t.Fatal(err) + } + + cb.f = failIfPassThough + err = ids.DeleteBlock(idhash1) + if err != nil { + t.Fatal(err) + } + + cb.f = noop + err = ids.DeleteBlock(hash1) + if err != nil { + t.Fatal(err) + } + + have, _ = ids.Has(hash1) + if have { + t.Fatal("normal block not deleted from datastore") + } + + idhash2, _ := cid.NewPrefixV1(cid.Raw, mh.ID).Sum([]byte("idhash2")) + idblock2, _ := blk.NewBlockWithCid([]byte("idhash2"), idhash2) + hash2, _ := cid.NewPrefixV1(cid.Raw, mh.SHA2_256).Sum([]byte("hash2")) + block2, _ := blk.NewBlockWithCid([]byte("hash2"), hash2) + + cb.f = failIfPassThough + err = ids.PutMany([]blk.Block{idblock1, idblock2}) + if err != nil { + t.Fatal(err) + } + + opCount := 0 + cb.f = func() { + opCount++ + } + + err = ids.PutMany([]blk.Block{block1, block2}) + if err != nil { + t.Fatal(err) + } + if opCount != 4 { + // one call to Has and Put for each Cid + t.Fatalf("expected exactly 4 operations got %d", opCount) + } + + opCount = 0 + err = ids.PutMany([]blk.Block{idblock1, block1}) + if err != nil { + t.Fatal(err) + } + if opCount != 1 { + // just one call to Put from the normal (non-id) block + t.Fatalf("expected exactly 1 operations got %d", opCount) + } + + ch, err := ids.AllKeysChan(context.TODO()) + cnt := 0 + for c := range ch { + cnt++ + if c.Prefix().MhType == mh.ID { + t.Fatalf("block with identity hash found in blockstore") + } + } + if cnt != 2 { + t.Fatalf("expected exactly two keys returned by AllKeysChan got %d", cnt) + } +} From 18cbdf84fcf365b9cabf174b3f8199fe41099b33 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 5 Jun 2018 22:01:52 -0400 Subject: [PATCH 2055/3147] IdStore => NewIdStore This commit was moved from ipfs/go-ipfs-blockstore@4da9b7e9a9dc0f8c2d9dd729a4876cb4b82e7433 --- blockstore/idstore.go | 2 +- blockstore/idstore_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blockstore/idstore.go b/blockstore/idstore.go index e86db2a65c..5b31b3f8bf 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -13,7 +13,7 @@ type idstore struct { bs Blockstore } -func IdStore(bs Blockstore) Blockstore { +func NewIdStore(bs Blockstore) Blockstore { return &idstore{bs} } diff --git a/blockstore/idstore_test.go b/blockstore/idstore_test.go index 6fe0a5e1ef..5a8861990a 100644 --- a/blockstore/idstore_test.go +++ b/blockstore/idstore_test.go @@ -12,7 +12,7 @@ import ( func createTestStores() (Blockstore, *callbackDatastore) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} - ids := IdStore(NewBlockstore(cd)) + ids := NewIdStore(NewBlockstore(cd)) return ids, cd } From f7b51203e7926328c17ea1aea93185cbc0e34922 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 15 Jun 2018 12:37:58 -0700 Subject: [PATCH 2056/3147] initial commit This commit was moved from ipfs/go-ipns@37f90cd1ed9ffa74c5af1e766bd3415f139f10dd --- ipns/Makefile | 9 +++ ipns/README.md | 31 ++++++++ ipns/errors.go | 37 +++++++++ ipns/ipns.go | 162 ++++++++++++++++++++++++++++++++++++++ ipns/pb/ipns.pb.go | 127 ++++++++++++++++++++++++++++++ ipns/pb/ipns.proto | 23 ++++++ ipns/record.go | 126 ++++++++++++++++++++++++++++++ ipns/select_test.go | 126 ++++++++++++++++++++++++++++++ ipns/validate_test.go | 175 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 816 insertions(+) create mode 100644 ipns/Makefile create mode 100644 ipns/README.md create mode 100644 ipns/errors.go create mode 100644 ipns/ipns.go create mode 100644 ipns/pb/ipns.pb.go create mode 100644 ipns/pb/ipns.proto create mode 100644 ipns/record.go create mode 100644 ipns/select_test.go create mode 100644 ipns/validate_test.go diff --git a/ipns/Makefile b/ipns/Makefile new file mode 100644 index 0000000000..54152565e9 --- /dev/null +++ b/ipns/Makefile @@ -0,0 +1,9 @@ +export IPFS_API ?= v04x.ipfs.io + +gx: + go get -u github.com/whyrusleeping/gx + go get -u github.com/whyrusleeping/gx-go + +deps: gx + gx --verbose install --global + gx-go rewrite diff --git a/ipns/README.md b/ipns/README.md new file mode 100644 index 0000000000..ca2dbd7eac --- /dev/null +++ b/ipns/README.md @@ -0,0 +1,31 @@ +# go-ipns + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-datastore?status.svg)](https://godoc.org/github.com/ipfs/go-ipns) + +> ipns record definitions + +This package contains all of components necessary to create, understand, and +validate IPNS records. + +## Documentation + +https://godoc.org/github.com/ipfs/go-ipns + +## Contribute + +Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/go-ipns/issues)! + +This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). + +### Want to hack on IPFS? + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) + +## License + +MIT + diff --git a/ipns/errors.go b/ipns/errors.go new file mode 100644 index 0000000000..ebcd4e263f --- /dev/null +++ b/ipns/errors.go @@ -0,0 +1,37 @@ +package ipns + +import ( + "errors" +) + +// ErrExpiredRecord should be returned when an ipns record is +// invalid due to being too old +var ErrExpiredRecord = errors.New("expired record") + +// ErrUnrecognizedValidity is returned when an IpnsRecord has an +// unknown validity type. +var ErrUnrecognizedValidity = errors.New("unrecognized validity type") + +// ErrInvalidPath should be returned when an ipns record path +// is not in a valid format +var ErrInvalidPath = errors.New("record path invalid") + +// ErrSignature should be returned when an ipns record fails +// signature verification +var ErrSignature = errors.New("record signature verification failed") + +// ErrKeyFormat should be returned when an ipns record key is +// incorrectly formatted (not a peer ID) +var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") + +// ErrPublicKeyNotFound should be returned when the public key +// corresponding to the ipns record path cannot be retrieved +// from the peer store +var ErrPublicKeyNotFound = errors.New("public key not found in peer store") + +// ErrPublicKeyMismatch should be returned when the public key embedded in the +// record doesn't match the expected public key. +var ErrPublicKeyMismatch = errors.New("public key in record did not match expected pubkey") + +// ErrBadRecord should be returned when an ipns record cannot be unmarshalled +var ErrBadRecord = errors.New("record could not be unmarshalled") diff --git a/ipns/ipns.go b/ipns/ipns.go new file mode 100644 index 0000000000..b3d374abf6 --- /dev/null +++ b/ipns/ipns.go @@ -0,0 +1,162 @@ +package ipns + +import ( + "bytes" + "fmt" + "time" + + proto "github.com/gogo/protobuf/proto" + u "github.com/ipfs/go-ipfs-util" + ic "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + + pb "github.com/ipfs/go-ipns/pb" +) + +// Create creates a new IPNS entry and signs it with the given private key. +// +// This function does not embed the public key. If you want to do that, use +// `EmbedPublicKey`. +func Create(sk ic.PrivKey, val []byte, seq uint64, eol time.Time) (*pb.IpnsEntry, error) { + entry := new(pb.IpnsEntry) + + entry.Value = val + typ := pb.IpnsEntry_EOL + entry.ValidityType = &typ + entry.Sequence = proto.Uint64(seq) + entry.Validity = []byte(u.FormatRFC3339(eol)) + + sig, err := sk.Sign(ipnsEntryDataForSig(entry)) + if err != nil { + return nil, err + } + entry.Signature = sig + + return entry, nil +} + +// Validates validates the given IPNS entry against the given public key. +func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { + // Check the ipns record signature with the public key + if ok, err := pk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { + return ErrSignature + } + + // Check that record has not expired + switch entry.GetValidityType() { + case pb.IpnsEntry_EOL: + t, err := u.ParseRFC3339(string(entry.GetValidity())) + if err != nil { + return err + } + if time.Now().After(t) { + return ErrExpiredRecord + } + default: + return ErrUnrecognizedValidity + } + return nil +} + +// EmbedPublicKey embeds the given public key in the given ipns entry. While not +// strictly required, some nodes (e.g., DHT servers) may reject IPNS entries +// that don't embed their public keys as they may not be able to validate them +// efficiently. +func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { + id, err := peer.IDFromPublicKey(pk) + if err != nil { + return err + } + extraced, err := id.ExtractPublicKey() + if err != nil { + return err + } + if extraced != nil { + return nil + } + pkBytes, err := pk.Bytes() + if err != nil { + return err + } + entry.PubKey = pkBytes + return nil +} + +// ExtractPublicKey extracts a public key matching `pid` from the IPNS record, +// if possible. +// +// This function returns (nil, nil) when no public key can be extracted and +// nothing is malformed. +func ExtractPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey, error) { + if entry.PubKey != nil { + pk, err := ic.UnmarshalPublicKey(entry.PubKey) + if err != nil { + return nil, fmt.Errorf("unmarshaling pubkey in record: %s", err) + } + + expPid, err := peer.IDFromPublicKey(pk) + if err != nil { + return nil, fmt.Errorf("could not regenerate peerID from pubkey: %s", err) + } + + if pid != expPid { + return nil, ErrPublicKeyMismatch + } + return pk, nil + } + + return pid.ExtractPublicKey() +} + +// Compare compares two IPNS entries. It returns: +// +// * -1 if a is older than b +// * 0 if a and b cannot be ordered (this doesn't mean that they are equal) +// * +1 if a is newer than b +// +// It returns an error when either a or b are malformed. +// +// NOTE: It *does not* validate the records, the caller is responsible for calling +// `Validate` first. +// +// NOTE: If a and b cannot be ordered by this function, you can determine their +// order by comparing their serialized byte representations (using +// `bytes.Compare`). You must do this if you are implementing a libp2p record +// validator (or you can just use the one provided for you by this package). +func Compare(a, b *pb.IpnsEntry) (int, error) { + as := a.GetSequence() + bs := b.GetSequence() + + if as > bs { + return 1, nil + } else if as < bs { + return -1, nil + } + + at, err := u.ParseRFC3339(string(a.GetValidity())) + if err != nil { + return 0, err + } + + bt, err := u.ParseRFC3339(string(b.GetValidity())) + if err != nil { + return 0, err + } + + if at.After(bt) { + return 1, nil + } else if bt.After(at) { + return -1, nil + } + + return 0, nil +} + +func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { + return bytes.Join([][]byte{ + e.Value, + e.Validity, + []byte(fmt.Sprint(e.GetValidityType())), + }, + []byte{}) +} diff --git a/ipns/pb/ipns.pb.go b/ipns/pb/ipns.pb.go new file mode 100644 index 0000000000..692ba564c2 --- /dev/null +++ b/ipns/pb/ipns.pb.go @@ -0,0 +1,127 @@ +// Code generated by protoc-gen-gogo. +// source: pb/ipns.proto +// DO NOT EDIT! + +/* +Package ipns_pb is a generated protocol buffer package. + +It is generated from these files: + pb/ipns.proto + +It has these top-level messages: + IpnsEntry +*/ +package ipns_pb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type IpnsEntry_ValidityType int32 + +const ( + // setting an EOL says "this record is valid until..." + IpnsEntry_EOL IpnsEntry_ValidityType = 0 +) + +var IpnsEntry_ValidityType_name = map[int32]string{ + 0: "EOL", +} +var IpnsEntry_ValidityType_value = map[string]int32{ + "EOL": 0, +} + +func (x IpnsEntry_ValidityType) Enum() *IpnsEntry_ValidityType { + p := new(IpnsEntry_ValidityType) + *p = x + return p +} +func (x IpnsEntry_ValidityType) String() string { + return proto.EnumName(IpnsEntry_ValidityType_name, int32(x)) +} +func (x *IpnsEntry_ValidityType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(IpnsEntry_ValidityType_value, data, "IpnsEntry_ValidityType") + if err != nil { + return err + } + *x = IpnsEntry_ValidityType(value) + return nil +} + +type IpnsEntry struct { + Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` + ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=ipns.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` + Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` + Sequence *uint64 `protobuf:"varint,5,opt,name=sequence" json:"sequence,omitempty"` + Ttl *uint64 `protobuf:"varint,6,opt,name=ttl" json:"ttl,omitempty"` + // in order for nodes to properly validate a record upon receipt, they need the public + // key associated with it. For old RSA keys, its easiest if we just send this as part of + // the record itself. For newer ed25519 keys, the public key can be embedded in the + // peerID, making this field unnecessary. + PubKey []byte `protobuf:"bytes,7,opt,name=pubKey" json:"pubKey,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IpnsEntry) Reset() { *m = IpnsEntry{} } +func (m *IpnsEntry) String() string { return proto.CompactTextString(m) } +func (*IpnsEntry) ProtoMessage() {} + +func (m *IpnsEntry) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *IpnsEntry) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *IpnsEntry) GetValidityType() IpnsEntry_ValidityType { + if m != nil && m.ValidityType != nil { + return *m.ValidityType + } + return IpnsEntry_EOL +} + +func (m *IpnsEntry) GetValidity() []byte { + if m != nil { + return m.Validity + } + return nil +} + +func (m *IpnsEntry) GetSequence() uint64 { + if m != nil && m.Sequence != nil { + return *m.Sequence + } + return 0 +} + +func (m *IpnsEntry) GetTtl() uint64 { + if m != nil && m.Ttl != nil { + return *m.Ttl + } + return 0 +} + +func (m *IpnsEntry) GetPubKey() []byte { + if m != nil { + return m.PubKey + } + return nil +} + +func init() { + proto.RegisterType((*IpnsEntry)(nil), "ipns.pb.IpnsEntry") + proto.RegisterEnum("ipns.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) +} diff --git a/ipns/pb/ipns.proto b/ipns/pb/ipns.proto new file mode 100644 index 0000000000..a59cfcf29c --- /dev/null +++ b/ipns/pb/ipns.proto @@ -0,0 +1,23 @@ +package ipns.pb; + +message IpnsEntry { + enum ValidityType { + // setting an EOL says "this record is valid until..." + EOL = 0; + } + required bytes value = 1; + required bytes signature = 2; + + optional ValidityType validityType = 3; + optional bytes validity = 4; + + optional uint64 sequence = 5; + + optional uint64 ttl = 6; + + // in order for nodes to properly validate a record upon receipt, they need the public + // key associated with it. For old RSA keys, its easiest if we just send this as part of + // the record itself. For newer ed25519 keys, the public key can be embedded in the + // peerID, making this field unnecessary. + optional bytes pubKey = 7; +} diff --git a/ipns/record.go b/ipns/record.go new file mode 100644 index 0000000000..24a75dacf7 --- /dev/null +++ b/ipns/record.go @@ -0,0 +1,126 @@ +package ipns + +import ( + "bytes" + "errors" + + proto "github.com/gogo/protobuf/proto" + logging "github.com/ipfs/go-log" + ic "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + record "github.com/libp2p/go-libp2p-record" + + pb "github.com/ipfs/go-ipns/pb" +) + +var log = logging.Logger("ipns") + +var _ record.Validator = Validator{} + +// RecordKey returns the libp2p record key for a given peer ID. +func RecordKey(pid peer.ID) string { + return "/ipns/" + string(pid) +} + +// Validator is an IPNS record validator that satisfies the libp2p record +// validator interface. +type Validator struct { + // KeyBook, if non-nil, will be used to lookup keys for validating IPNS + // records. + KeyBook pstore.KeyBook +} + +// Validate validates an IPNS record. +func (v Validator) Validate(key string, value []byte) error { + ns, pidString, err := record.SplitKey(key) + if err != nil || ns != "ipns" { + return ErrInvalidPath + } + + // Parse the value into an IpnsEntry + entry := new(pb.IpnsEntry) + err = proto.Unmarshal(value, entry) + if err != nil { + return ErrBadRecord + } + + // Get the public key defined by the ipns path + pid, err := peer.IDFromString(pidString) + if err != nil { + log.Debugf("failed to parse ipns record key %s into peer ID", pidString) + return ErrKeyFormat + } + + pubk, err := v.getPublicKey(pid, entry) + if err != nil { + return err + } + + return Validate(pubk, entry) +} + +func (v Validator) getPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey, error) { + pk, err := ExtractPublicKey(pid, entry) + if err != nil { + return nil, err + } + if pk != nil { + return pk, nil + } + + if v.KeyBook == nil { + log.Debugf("public key with hash %s not found in IPNS record and no peer store provided", pid) + return nil, ErrPublicKeyNotFound + } + + pubk := v.KeyBook.PubKey(pid) + if pubk == nil { + log.Debugf("public key with hash %s not found in peer store", pid) + return nil, ErrPublicKeyNotFound + } + return pubk, nil +} + +// Select selects the best record by checking which has the highest sequence +// number and latest EOL. +// +// This function returns an error if any of the records fail to parse. Validate +// your records first! +func (v Validator) Select(k string, vals [][]byte) (int, error) { + var recs []*pb.IpnsEntry + for _, v := range vals { + e := new(pb.IpnsEntry) + if err := proto.Unmarshal(v, e); err != nil { + return -1, err + } + recs = append(recs, e) + } + + return selectRecord(recs, vals) +} + +func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { + switch len(recs) { + case 0: + return -1, errors.New("no usable records in given set") + case 1: + return 0, nil + } + + var i int + for j := 1; j < len(recs); j++ { + cmp, err := Compare(recs[i], recs[j]) + if err != nil { + return -1, err + } + if cmp == 0 { + cmp = bytes.Compare(vals[i], vals[j]) + } + if cmp < 0 { + i = j + } + } + + return i, nil +} diff --git a/ipns/select_test.go b/ipns/select_test.go new file mode 100644 index 0000000000..83405345ab --- /dev/null +++ b/ipns/select_test.go @@ -0,0 +1,126 @@ +package ipns + +import ( + "fmt" + "math/rand" + "testing" + "time" + + proto "github.com/gogo/protobuf/proto" + u "github.com/ipfs/go-ipfs-util" + ci "github.com/libp2p/go-libp2p-crypto" + + pb "github.com/ipfs/go-ipns/pb" +) + +func shuffle(a []*pb.IpnsEntry) { + for n := 0; n < 5; n++ { + for i, _ := range a { + j := rand.Intn(len(a)) + a[i], a[j] = a[j], a[i] + } + } +} + +func AssertSelected(r *pb.IpnsEntry, from ...*pb.IpnsEntry) error { + shuffle(from) + var vals [][]byte + for _, r := range from { + data, err := proto.Marshal(r) + if err != nil { + return err + } + vals = append(vals, data) + } + + i, err := selectRecord(from, vals) + if err != nil { + return err + } + + if from[i] != r { + return fmt.Errorf("selected incorrect record %d", i) + } + + return nil +} + +func TestOrdering(t *testing.T) { + // select timestamp so selection is deterministic + ts := time.Unix(1000000, 0) + + // generate a key for signing the records + r := u.NewSeededRand(15) // generate deterministic keypair + priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + if err != nil { + t.Fatal(err) + } + + e1, err := Create(priv, []byte("foo"), 1, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + + e2, err := Create(priv, []byte("bar"), 2, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + + e3, err := Create(priv, []byte("baz"), 3, ts.Add(time.Hour)) + if err != nil { + t.Fatal(err) + } + + e4, err := Create(priv, []byte("cat"), 3, ts.Add(time.Hour*2)) + if err != nil { + t.Fatal(err) + } + + e5, err := Create(priv, []byte("dog"), 4, ts.Add(time.Hour*3)) + if err != nil { + t.Fatal(err) + } + + e6, err := Create(priv, []byte("fish"), 4, ts.Add(time.Hour*3)) + if err != nil { + t.Fatal(err) + } + + // e1 is the only record, i hope it gets this right + err = AssertSelected(e1, e1) + if err != nil { + t.Fatal(err) + } + + // e2 has the highest sequence number + err = AssertSelected(e2, e1, e2) + if err != nil { + t.Fatal(err) + } + + // e3 has the highest sequence number + err = AssertSelected(e3, e1, e2, e3) + if err != nil { + t.Fatal(err) + } + + // e4 has a higher timeout + err = AssertSelected(e4, e1, e2, e3, e4) + if err != nil { + t.Fatal(err) + } + + // e5 has the highest sequence number + err = AssertSelected(e5, e1, e2, e3, e4, e5) + if err != nil { + t.Fatal(err) + } + + // e6 should be selected as its signauture will win in the comparison + err = AssertSelected(e6, e1, e2, e3, e4, e5, e6) + if err != nil { + t.Fatal(err) + } + + _ = []interface{}{e1, e2, e3, e4, e5, e6} +} diff --git a/ipns/validate_test.go b/ipns/validate_test.go new file mode 100644 index 0000000000..634636844a --- /dev/null +++ b/ipns/validate_test.go @@ -0,0 +1,175 @@ +package ipns + +import ( + "fmt" + "math/rand" + "strings" + "testing" + "time" + + pb "github.com/ipfs/go-ipns/pb" + + proto "github.com/gogo/protobuf/proto" + u "github.com/ipfs/go-ipfs-util" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" +) + +func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { + t.Helper() + + match := func(t *testing.T, err error) { + t.Helper() + if err != exp { + params := fmt.Sprintf("key: %s\neol: %s\n", key, eol) + if exp == nil { + t.Fatalf("Unexpected error %s for params %s", err, params) + } else if err == nil { + t.Fatalf("Expected error %s but there was no error for params %s", exp, params) + } else { + t.Fatalf("Expected error %s but got %s for params %s", exp, err, params) + } + } + } + + testValidatorCaseMatchFunc(t, priv, kbook, key, val, eol, match) +} + +func testValidatorCaseMatchFunc(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, matchf func(*testing.T, error)) { + t.Helper() + validator := Validator{kbook} + + data := val + if data == nil { + p := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + entry, err := Create(priv, p, 1, eol) + if err != nil { + t.Fatal(err) + } + + data, err = proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + } + + matchf(t, validator.Validate(key, data)) +} + +func TestValidator(t *testing.T) { + ts := time.Now() + + priv, id, _ := genKeys(t) + priv2, id2, _ := genKeys(t) + kbook := pstore.NewPeerstore() + kbook.AddPubKey(id, priv.GetPublic()) + emptyKbook := pstore.NewPeerstore() + + testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), nil) + testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour*-1), ErrExpiredRecord) + testValidatorCase(t, priv, kbook, "/ipns/"+string(id), []byte("bad data"), ts.Add(time.Hour), ErrBadRecord) + testValidatorCase(t, priv, kbook, "/ipns/"+"bad key", nil, ts.Add(time.Hour), ErrKeyFormat) + testValidatorCase(t, priv, emptyKbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) + testValidatorCase(t, priv2, kbook, "/ipns/"+string(id2), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) + testValidatorCase(t, priv2, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), ErrSignature) + testValidatorCase(t, priv, kbook, "//"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) + testValidatorCase(t, priv, kbook, "/wrong/"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) +} + +func mustMarshal(t *testing.T, entry *pb.IpnsEntry) []byte { + t.Helper() + data, err := proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + return data +} + +func TestEmbeddedPubKeyValidate(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + kbook := pstore.NewPeerstore() + + pth := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + + priv, _, ipnsk := genKeys(t) + + entry, err := Create(priv, pth, 1, goodeol) + if err != nil { + t.Fatal(err) + } + + testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, ErrPublicKeyNotFound) + + pubkb, err := priv.GetPublic().Bytes() + if err != nil { + t.Fatal(err) + } + + entry.PubKey = pubkb + testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, nil) + + entry.PubKey = []byte("probably not a public key") + testValidatorCaseMatchFunc(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, func(t *testing.T, err error) { + if !strings.Contains(err.Error(), "unmarshaling pubkey in record:") { + t.Fatal("expected pubkey unmarshaling to fail") + } + }) + + opriv, _, _ := genKeys(t) + wrongkeydata, err := opriv.GetPublic().Bytes() + if err != nil { + t.Fatal(err) + } + + entry.PubKey = wrongkeydata + testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, ErrPublicKeyMismatch) +} + +func TestPeerIDPubKeyValidate(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + kbook := pstore.NewPeerstore() + + pth := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + + sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + if err != nil { + t.Fatal(err) + } + + pid, err := peer.IDFromPublicKey(pk) + if err != nil { + t.Fatal(err) + } + + ipnsk := "/ipns/" + string(pid) + + entry, err := Create(sk, pth, 1, goodeol) + if err != nil { + t.Fatal(err) + } + + dataNoKey, err := proto.Marshal(entry) + if err != nil { + t.Fatal(err) + } + + testValidatorCase(t, sk, kbook, ipnsk, dataNoKey, goodeol, nil) +} + +func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string) { + sr := u.NewTimeSeededRand() + priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, sr) + if err != nil { + t.Fatal(err) + } + + // Create entry with expiry in one hour + pid, err := peer.IDFromPrivateKey(priv) + if err != nil { + t.Fatal(err) + } + ipnsKey := RecordKey(pid) + + return priv, pid, ipnsKey +} From 9ee7f48c51bb26b33afe68654cdeda27abbbab38 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 15 Jun 2018 12:50:32 -0700 Subject: [PATCH 2057/3147] fix import order This commit was moved from ipfs/go-ipns@abf430262ce6777d56db37b50e7aa5d0be1d73bb --- ipns/ipns.go | 4 ++-- ipns/record.go | 4 ++-- ipns/select_test.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ipns/ipns.go b/ipns/ipns.go index b3d374abf6..46c9fab67a 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -5,12 +5,12 @@ import ( "fmt" "time" + pb "github.com/ipfs/go-ipns/pb" + proto "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" ic "github.com/libp2p/go-libp2p-crypto" peer "github.com/libp2p/go-libp2p-peer" - - pb "github.com/ipfs/go-ipns/pb" ) // Create creates a new IPNS entry and signs it with the given private key. diff --git a/ipns/record.go b/ipns/record.go index 24a75dacf7..56e2219486 100644 --- a/ipns/record.go +++ b/ipns/record.go @@ -4,14 +4,14 @@ import ( "bytes" "errors" + pb "github.com/ipfs/go-ipns/pb" + proto "github.com/gogo/protobuf/proto" logging "github.com/ipfs/go-log" ic "github.com/libp2p/go-libp2p-crypto" peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" record "github.com/libp2p/go-libp2p-record" - - pb "github.com/ipfs/go-ipns/pb" ) var log = logging.Logger("ipns") diff --git a/ipns/select_test.go b/ipns/select_test.go index 83405345ab..a9a34a91db 100644 --- a/ipns/select_test.go +++ b/ipns/select_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" + pb "github.com/ipfs/go-ipns/pb" + proto "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" ci "github.com/libp2p/go-libp2p-crypto" - - pb "github.com/ipfs/go-ipns/pb" ) func shuffle(a []*pb.IpnsEntry) { From 721caad3c5ae15b008a4cda65afe6b8ca729cc08 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 15 Jun 2018 14:57:16 -0700 Subject: [PATCH 2058/3147] add a helper function for getting the EOL of a record Useful for caching. This commit was moved from ipfs/go-ipns@697df1a9ea91addb8d693e645a79e44179262eab --- ipns/ipns.go | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ipns/ipns.go b/ipns/ipns.go index 46c9fab67a..2d67945e52 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -42,22 +42,27 @@ func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { return ErrSignature } - // Check that record has not expired - switch entry.GetValidityType() { - case pb.IpnsEntry_EOL: - t, err := u.ParseRFC3339(string(entry.GetValidity())) - if err != nil { - return err - } - if time.Now().After(t) { - return ErrExpiredRecord - } - default: - return ErrUnrecognizedValidity + eol, err := GetEOL(entry) + if err != nil { + return err + } + if time.Now().After(eol) { + return ErrExpiredRecord } return nil } +// GetEOL returns the EOL of this IPNS entry +// +// This function returns ErrUnrecognizedValidity if the validity type of the +// record isn't EOL. Otherwise, it returns an error if it can't parse the EOL. +func GetEOL(entry *pb.IpnsEntry) (time.Time, error) { + if entry.GetValidityType() != pb.IpnsEntry_EOL { + return time.Time{}, ErrUnrecognizedValidity + } + return u.ParseRFC3339(string(entry.GetValidity())) +} + // EmbedPublicKey embeds the given public key in the given ipns entry. While not // strictly required, some nodes (e.g., DHT servers) may reject IPNS entries // that don't embed their public keys as they may not be able to validate them From c6fd683f52f04fe3413fdc28fc6e788dfa45bff5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 15 Jun 2018 20:06:44 -0700 Subject: [PATCH 2059/3147] make republisher test robust against timing issues retry publishing with a longer EOL if the first attempt fails due to a timeout. fixes #5099 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@e57d1900d14fbb8361f62ab10965137af560843b --- namesys/republisher/repub_test.go | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 9cc5a940eb..8a76cbcc12 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -59,18 +59,33 @@ func TestRepublish(t *testing.T) { publisher := nodes[3] p := path.FromString("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") // does not need to be valid rp := namesys.NewIpnsPublisher(publisher.Routing, publisher.Repo.Datastore()) - err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, time.Now().Add(time.Second)) - if err != nil { - t.Fatal(err) - } - name := "/ipns/" + publisher.Identity.Pretty() - if err := verifyResolution(nodes, name, p); err != nil { + + // Retry in case the record expires before we can fetch it. This can + // happen when running the test on a slow machine. + var expiration time.Time + timeout := time.Second + for { + expiration = time.Now().Add(time.Second) + err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, expiration) + if err != nil { + t.Fatal(err) + } + + err = verifyResolution(nodes, name, p) + if err == nil { + break + } + + if time.Now().After(expiration) { + timeout *= 2 + continue + } t.Fatal(err) } // Now wait a second, the records will be invalid and we should fail to resolve - time.Sleep(time.Second) + time.Sleep(timeout) if err := verifyResolutionFails(nodes, name); err != nil { t.Fatal(err) } From d80b2330f7666cab334bee9a4f7ee1c3011337da Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 15 Jun 2018 16:53:47 -0700 Subject: [PATCH 2060/3147] extract ipns record logic to go-ipns License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@8e0233c48f3724f5a52aca8652e07c991f9545af --- ...st.go => ipns_resolver_validation_test.go} | 162 +--------------- namesys/ipns_select_test.go | 127 ------------- namesys/pb/namesys.pb.go | 127 ------------- namesys/pb/namesys.proto | 23 --- namesys/publisher.go | 72 ++----- namesys/publisher_test.go | 9 +- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 5 +- namesys/routing.go | 25 +-- namesys/validator.go | 179 ------------------ 10 files changed, 42 insertions(+), 689 deletions(-) rename namesys/{ipns_validate_test.go => ipns_resolver_validation_test.go} (53%) delete mode 100644 namesys/ipns_select_test.go delete mode 100644 namesys/pb/namesys.pb.go delete mode 100644 namesys/pb/namesys.proto delete mode 100644 namesys/validator.go diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_resolver_validation_test.go similarity index 53% rename from namesys/ipns_validate_test.go rename to namesys/ipns_resolver_validation_test.go index c1ea788991..864aa443a8 100644 --- a/namesys/ipns_validate_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -2,23 +2,19 @@ package namesys import ( "context" - "fmt" - "math/rand" - "strings" "testing" "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" record "gx/ipfs/QmPWjVzxHeJdrjp4Jr2R2sPxBrMbBgGPWQtKwCKHHCBF7x/go-libp2p-record" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" + ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" ropts "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing/options" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" @@ -26,147 +22,6 @@ import ( dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) -func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { - t.Helper() - - match := func(t *testing.T, err error) { - t.Helper() - if err != exp { - params := fmt.Sprintf("key: %s\neol: %s\n", key, eol) - if exp == nil { - t.Fatalf("Unexpected error %s for params %s", err, params) - } else if err == nil { - t.Fatalf("Expected error %s but there was no error for params %s", exp, params) - } else { - t.Fatalf("Expected error %s but got %s for params %s", exp, err, params) - } - } - } - - testValidatorCaseMatchFunc(t, priv, kbook, key, val, eol, match) -} - -func testValidatorCaseMatchFunc(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, matchf func(*testing.T, error)) { - t.Helper() - validator := IpnsValidator{kbook} - - data := val - if data == nil { - p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - entry, err := CreateRoutingEntryData(priv, p, 1, eol) - if err != nil { - t.Fatal(err) - } - - data, err = proto.Marshal(entry) - if err != nil { - t.Fatal(err) - } - } - - matchf(t, validator.Validate(key, data)) -} - -func TestValidator(t *testing.T) { - ts := time.Now() - - priv, id, _, _ := genKeys(t) - priv2, id2, _, _ := genKeys(t) - kbook := pstore.NewPeerstore() - kbook.AddPubKey(id, priv.GetPublic()) - emptyKbook := pstore.NewPeerstore() - - testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), nil) - testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour*-1), ErrExpiredRecord) - testValidatorCase(t, priv, kbook, "/ipns/"+string(id), []byte("bad data"), ts.Add(time.Hour), ErrBadRecord) - testValidatorCase(t, priv, kbook, "/ipns/"+"bad key", nil, ts.Add(time.Hour), ErrKeyFormat) - testValidatorCase(t, priv, emptyKbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) - testValidatorCase(t, priv2, kbook, "/ipns/"+string(id2), nil, ts.Add(time.Hour), ErrPublicKeyNotFound) - testValidatorCase(t, priv2, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), ErrSignature) - testValidatorCase(t, priv, kbook, "//"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) - testValidatorCase(t, priv, kbook, "/wrong/"+string(id), nil, ts.Add(time.Hour), ErrInvalidPath) -} - -func mustMarshal(t *testing.T, entry *pb.IpnsEntry) []byte { - t.Helper() - data, err := proto.Marshal(entry) - if err != nil { - t.Fatal(err) - } - return data -} - -func TestEmbeddedPubKeyValidate(t *testing.T) { - goodeol := time.Now().Add(time.Hour) - kbook := pstore.NewPeerstore() - - pth := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - - priv, _, _, ipnsk := genKeys(t) - - entry, err := CreateRoutingEntryData(priv, pth, 1, goodeol) - if err != nil { - t.Fatal(err) - } - - testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, ErrPublicKeyNotFound) - - pubkb, err := priv.GetPublic().Bytes() - if err != nil { - t.Fatal(err) - } - - entry.PubKey = pubkb - testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, nil) - - entry.PubKey = []byte("probably not a public key") - testValidatorCaseMatchFunc(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, func(t *testing.T, err error) { - if !strings.Contains(err.Error(), "unmarshaling pubkey in record:") { - t.Fatal("expected pubkey unmarshaling to fail") - } - }) - - opriv, _, _, _ := genKeys(t) - wrongkeydata, err := opriv.GetPublic().Bytes() - if err != nil { - t.Fatal(err) - } - - entry.PubKey = wrongkeydata - testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, ErrPublicKeyMismatch) -} - -func TestPeerIDPubKeyValidate(t *testing.T) { - goodeol := time.Now().Add(time.Hour) - kbook := pstore.NewPeerstore() - - pth := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - - sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) - if err != nil { - t.Fatal(err) - } - - pid, err := peer.IDFromPublicKey(pk) - if err != nil { - t.Fatal(err) - } - - ipnsk := "/ipns/" + string(pid) - - entry, err := CreateRoutingEntryData(sk, pth, 1, goodeol) - if err != nil { - t.Fatal(err) - } - - dataNoKey, err := proto.Marshal(entry) - if err != nil { - t.Fatal(err) - } - - testValidatorCase(t, sk, kbook, ipnsk, dataNoKey, goodeol, nil) -} - func TestResolverValidation(t *testing.T) { ctx := context.Background() rid := testutil.RandIdentityOrFatal(t) @@ -179,8 +34,8 @@ func TestResolverValidation(t *testing.T) { // Create entry with expiry in one hour priv, id, _, ipnsDHTPath := genKeys(t) ts := time.Now() - p := path.Path("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - entry, err := CreateRoutingEntryData(priv, p, 1, ts.Add(time.Hour)) + p := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") + entry, err := ipns.Create(priv, p, 1, ts.Add(time.Hour)) if err != nil { t.Fatal(err) } @@ -202,12 +57,12 @@ func TestResolverValidation(t *testing.T) { if err != nil { t.Fatal(err) } - if resp != p { + if resp != path.Path(p) { t.Fatalf("Mismatch between published path %s and resolved path %s", p, resp) } // Create expired entry - expiredEntry, err := CreateRoutingEntryData(priv, p, 1, ts.Add(-1*time.Hour)) + expiredEntry, err := ipns.Create(priv, p, 1, ts.Add(-1*time.Hour)) if err != nil { t.Fatal(err) } @@ -248,7 +103,7 @@ func TestResolverValidation(t *testing.T) { // Publish entry without making public key available in peer store priv3, id3, pubkDHTPath3, ipnsDHTPath3 := genKeys(t) - entry3, err := CreateRoutingEntryData(priv3, p, 1, ts.Add(time.Hour)) + entry3, err := ipns.Create(priv3, p, 1, ts.Add(time.Hour)) if err != nil { t.Fatal(err) } @@ -292,9 +147,8 @@ func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string, string) { if err != nil { t.Fatal(err) } - pubkDHTPath, ipnsDHTPath := IpnsKeysForID(pid) - return priv, pid, pubkDHTPath, ipnsDHTPath + return priv, pid, PkKeyForID(pid), ipns.RecordKey(pid) } type mockValueStore struct { @@ -307,7 +161,7 @@ func newMockValueStore(id testutil.Identity, dstore ds.Datastore, kbook pstore.K serv := mockrouting.NewServer() r := serv.ClientWithDatastore(context.Background(), id, dstore) return &mockValueStore{r, kbook, record.NamespacedValidator{ - "ipns": IpnsValidator{kbook}, + "ipns": ipns.Validator{KeyBook: kbook}, "pk": record.PublicKeyValidator{}, }} } diff --git a/namesys/ipns_select_test.go b/namesys/ipns_select_test.go deleted file mode 100644 index a0067ada61..0000000000 --- a/namesys/ipns_select_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package namesys - -import ( - "fmt" - "math/rand" - "testing" - "time" - - pb "github.com/ipfs/go-ipfs/namesys/pb" - path "github.com/ipfs/go-ipfs/path" - - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" -) - -func shuffle(a []*pb.IpnsEntry) { - for n := 0; n < 5; n++ { - for i, _ := range a { - j := rand.Intn(len(a)) - a[i], a[j] = a[j], a[i] - } - } -} - -func AssertSelected(r *pb.IpnsEntry, from ...*pb.IpnsEntry) error { - shuffle(from) - var vals [][]byte - for _, r := range from { - data, err := proto.Marshal(r) - if err != nil { - return err - } - vals = append(vals, data) - } - - i, err := selectRecord(from, vals) - if err != nil { - return err - } - - if from[i] != r { - return fmt.Errorf("selected incorrect record %d", i) - } - - return nil -} - -func TestOrdering(t *testing.T) { - // select timestamp so selection is deterministic - ts := time.Unix(1000000, 0) - - // generate a key for signing the records - r := u.NewSeededRand(15) // generate deterministic keypair - priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) - if err != nil { - t.Fatal(err) - } - - e1, err := CreateRoutingEntryData(priv, path.Path("foo"), 1, ts.Add(time.Hour)) - if err != nil { - t.Fatal(err) - } - - e2, err := CreateRoutingEntryData(priv, path.Path("bar"), 2, ts.Add(time.Hour)) - if err != nil { - t.Fatal(err) - } - - e3, err := CreateRoutingEntryData(priv, path.Path("baz"), 3, ts.Add(time.Hour)) - if err != nil { - t.Fatal(err) - } - - e4, err := CreateRoutingEntryData(priv, path.Path("cat"), 3, ts.Add(time.Hour*2)) - if err != nil { - t.Fatal(err) - } - - e5, err := CreateRoutingEntryData(priv, path.Path("dog"), 4, ts.Add(time.Hour*3)) - if err != nil { - t.Fatal(err) - } - - e6, err := CreateRoutingEntryData(priv, path.Path("fish"), 4, ts.Add(time.Hour*3)) - if err != nil { - t.Fatal(err) - } - - // e1 is the only record, i hope it gets this right - err = AssertSelected(e1, e1) - if err != nil { - t.Fatal(err) - } - - // e2 has the highest sequence number - err = AssertSelected(e2, e1, e2) - if err != nil { - t.Fatal(err) - } - - // e3 has the highest sequence number - err = AssertSelected(e3, e1, e2, e3) - if err != nil { - t.Fatal(err) - } - - // e4 has a higher timeout - err = AssertSelected(e4, e1, e2, e3, e4) - if err != nil { - t.Fatal(err) - } - - // e5 has the highest sequence number - err = AssertSelected(e5, e1, e2, e3, e4, e5) - if err != nil { - t.Fatal(err) - } - - // e6 should be selected as its signauture will win in the comparison - err = AssertSelected(e6, e1, e2, e3, e4, e5, e6) - if err != nil { - t.Fatal(err) - } - - _ = []interface{}{e1, e2, e3, e4, e5, e6} -} diff --git a/namesys/pb/namesys.pb.go b/namesys/pb/namesys.pb.go deleted file mode 100644 index 66626ca7db..0000000000 --- a/namesys/pb/namesys.pb.go +++ /dev/null @@ -1,127 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: namesys/pb/namesys.proto -// DO NOT EDIT! - -/* -Package namesys_pb is a generated protocol buffer package. - -It is generated from these files: - namesys/pb/namesys.proto - -It has these top-level messages: - IpnsEntry -*/ -package namesys_pb - -import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -type IpnsEntry_ValidityType int32 - -const ( - // setting an EOL says "this record is valid until..." - IpnsEntry_EOL IpnsEntry_ValidityType = 0 -) - -var IpnsEntry_ValidityType_name = map[int32]string{ - 0: "EOL", -} -var IpnsEntry_ValidityType_value = map[string]int32{ - "EOL": 0, -} - -func (x IpnsEntry_ValidityType) Enum() *IpnsEntry_ValidityType { - p := new(IpnsEntry_ValidityType) - *p = x - return p -} -func (x IpnsEntry_ValidityType) String() string { - return proto.EnumName(IpnsEntry_ValidityType_name, int32(x)) -} -func (x *IpnsEntry_ValidityType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(IpnsEntry_ValidityType_value, data, "IpnsEntry_ValidityType") - if err != nil { - return err - } - *x = IpnsEntry_ValidityType(value) - return nil -} - -type IpnsEntry struct { - Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` - ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=namesys.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` - Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` - Sequence *uint64 `protobuf:"varint,5,opt,name=sequence" json:"sequence,omitempty"` - Ttl *uint64 `protobuf:"varint,6,opt,name=ttl" json:"ttl,omitempty"` - // in order for nodes to properly validate a record upon receipt, they need the public - // key associated with it. For old RSA keys, its easiest if we just send this as part of - // the record itself. For newer ed25519 keys, the public key can be embedded in the - // peerID, making this field unnecessary. - PubKey []byte `protobuf:"bytes,7,opt,name=pubKey" json:"pubKey,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *IpnsEntry) Reset() { *m = IpnsEntry{} } -func (m *IpnsEntry) String() string { return proto.CompactTextString(m) } -func (*IpnsEntry) ProtoMessage() {} - -func (m *IpnsEntry) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *IpnsEntry) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *IpnsEntry) GetValidityType() IpnsEntry_ValidityType { - if m != nil && m.ValidityType != nil { - return *m.ValidityType - } - return IpnsEntry_EOL -} - -func (m *IpnsEntry) GetValidity() []byte { - if m != nil { - return m.Validity - } - return nil -} - -func (m *IpnsEntry) GetSequence() uint64 { - if m != nil && m.Sequence != nil { - return *m.Sequence - } - return 0 -} - -func (m *IpnsEntry) GetTtl() uint64 { - if m != nil && m.Ttl != nil { - return *m.Ttl - } - return 0 -} - -func (m *IpnsEntry) GetPubKey() []byte { - if m != nil { - return m.PubKey - } - return nil -} - -func init() { - proto.RegisterType((*IpnsEntry)(nil), "namesys.pb.IpnsEntry") - proto.RegisterEnum("namesys.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) -} diff --git a/namesys/pb/namesys.proto b/namesys/pb/namesys.proto deleted file mode 100644 index b72d498438..0000000000 --- a/namesys/pb/namesys.proto +++ /dev/null @@ -1,23 +0,0 @@ -package namesys.pb; - -message IpnsEntry { - enum ValidityType { - // setting an EOL says "this record is valid until..." - EOL = 0; - } - required bytes value = 1; - required bytes signature = 2; - - optional ValidityType validityType = 3; - optional bytes validity = 4; - - optional uint64 sequence = 5; - - optional uint64 ttl = 6; - - // in order for nodes to properly validate a record upon receipt, they need the public - // key associated with it. For old RSA keys, its easiest if we just send this as part of - // the record itself. For newer ed25519 keys, the public key can be embedded in the - // peerID, making this field unnecessary. - optional bytes pubKey = 7; -} diff --git a/namesys/publisher.go b/namesys/publisher.go index 344004f244..7eb5483950 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -1,19 +1,18 @@ package namesys import ( - "bytes" "context" "fmt" "strings" "sync" "time" - pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" + pb "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns/pb" routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" @@ -131,7 +130,7 @@ func (p *IpnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouti if !checkRouting { return nil, nil } - _, ipnskey := IpnsKeysForID(id) + ipnskey := ipns.RecordKey(id) value, err = p.routing.GetValue(ctx, ipnskey) if err != nil { // Not found or other network issue. Can't really do @@ -175,7 +174,7 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value pa } // Create record - entry, err := CreateRoutingEntryData(k, value, seqno, eol) + entry, err := ipns.Create(k, []byte(value), seqno, eol) if err != nil { return nil, err } @@ -229,40 +228,29 @@ func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k ci.PubKey, errs := make(chan error, 2) // At most two errors (IPNS, and public key) - id, err := peer.IDFromPublicKey(k) - if err != nil { + if err := ipns.EmbedPublicKey(k, entry); err != nil { return err } - // Attempt to extract the public key from the ID - extractedPublicKey, err := id.ExtractPublicKey() + id, err := peer.IDFromPublicKey(k) if err != nil { return err } - // if we can't derive the public key from the peerID, embed the entire pubkey in - // the record to make the verifiers job easier - if extractedPublicKey == nil { - pubkeyBytes, err := k.Bytes() - if err != nil { - return err - } - - entry.PubKey = pubkeyBytes - } - - namekey, ipnskey := IpnsKeysForID(id) - go func() { - errs <- PublishEntry(ctx, r, ipnskey, entry) + errs <- PublishEntry(ctx, r, ipns.RecordKey(id), entry) }() // Publish the public key if a public key cannot be extracted from the ID // TODO: once v0.4.16 is widespread enough, we can stop doing this // and at that point we can even deprecate the /pk/ namespace in the dht - if extractedPublicKey == nil { + // + // NOTE: This check actually checks if the public key has been embedded + // in the IPNS entry. This check is sufficient because we embed the + // public key in the IPNS entry if it can't be extracted from the ID. + if entry.PubKey != nil { go func() { - errs <- PublishPublicKey(ctx, r, namekey, k) + errs <- PublishPublicKey(ctx, r, PkKeyForID(id), k) }() if err := waitOnErrChan(ctx, errs); err != nil { @@ -309,32 +297,6 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec return r.PutValue(timectx, ipnskey, data) } -func CreateRoutingEntryData(pk ci.PrivKey, val path.Path, seq uint64, eol time.Time) (*pb.IpnsEntry, error) { - entry := new(pb.IpnsEntry) - - entry.Value = []byte(val) - typ := pb.IpnsEntry_EOL - entry.ValidityType = &typ - entry.Sequence = proto.Uint64(seq) - entry.Validity = []byte(u.FormatRFC3339(eol)) - - sig, err := pk.Sign(ipnsEntryDataForSig(entry)) - if err != nil { - return nil, err - } - entry.Signature = sig - return entry, nil -} - -func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { - return bytes.Join([][]byte{ - e.Value, - e.Validity, - []byte(fmt.Sprint(e.GetValidityType())), - }, - []byte{}) -} - // InitializeKeyspace sets the ipns record for the given key to // point to an empty directory. // TODO: this doesnt feel like it belongs here @@ -356,9 +318,7 @@ func InitializeKeyspace(ctx context.Context, pub Publisher, pins pin.Pinner, key return pub.Publish(ctx, key, path.FromCid(emptyDir.Cid())) } -func IpnsKeysForID(id peer.ID) (name, ipns string) { - namekey := "/pk/" + string(id) - ipnskey := "/ipns/" + string(id) - - return namekey, ipnskey +// PkKeyForID returns the public key routing key for the given peer ID. +func PkKeyForID(id peer.ID) string { + return "/pk/" + string(id) } diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 67f6be3223..a79492c3d5 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,10 +6,9 @@ import ( "testing" "time" - path "github.com/ipfs/go-ipfs/path" - dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" + ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" ma "gx/ipfs/QmUxSEGbv2nmYNnfXi7839wwQqTN3kwQeUxe8dTjZWZs7J/go-multiaddr" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" @@ -55,7 +54,7 @@ func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expected } // Value - value := path.Path("ipfs/TESTING") + value := []byte("ipfs/TESTING") // Seqnum seqnum := uint64(0) @@ -75,7 +74,7 @@ func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expected serv := mockrouting.NewServer() r := serv.ClientWithDatastore(context.Background(), &identity{p}, dstore) - entry, err := CreateRoutingEntryData(privKey, value, seqnum, eol) + entry, err := ipns.Create(privKey, value, seqnum, eol) if err != nil { t.Fatal(err) } @@ -86,7 +85,7 @@ func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expected } // Check for namekey existence in value store - namekey, _ := IpnsKeysForID(id) + namekey := PkKeyForID(id) _, err = r.GetValue(ctx, namekey) if err != expectedErr { t.Fatal(err) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 1864174c03..fb90ccbc2d 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,9 +7,9 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" + pb "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns/pb" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 9dd5664042..a930eb4e7a 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -9,6 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" + ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" @@ -71,7 +72,7 @@ func TestPrexistingExpiredRecord(t *testing.T) { h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour * -1) - entry, err := CreateRoutingEntryData(privk, h, 0, eol) + entry, err := ipns.Create(privk, []byte(h), 0, eol) if err != nil { t.Fatal(err) } @@ -112,7 +113,7 @@ func TestPrexistingRecord(t *testing.T) { // Make a good record and put it in the datastore h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour) - entry, err := CreateRoutingEntryData(privk, h, 0, eol) + entry, err := ipns.Create(privk, []byte(h), 0, eol) if err != nil { t.Fatal(err) } diff --git a/namesys/routing.go b/namesys/routing.go index c10464a1b4..22209e8f0e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,11 +6,11 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - pb "github.com/ipfs/go-ipfs/namesys/pb" path "github.com/ipfs/go-ipfs/path" - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" + pb "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns/pb" routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" @@ -82,7 +82,7 @@ func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *op // Use the routing system to get the name. // Note that the DHT will call the ipns validator when retrieving // the value, which in turn verifies the ipns record signature - _, ipnsKey := IpnsKeysForID(pid) + ipnsKey := ipns.RecordKey(pid) val, err := r.routing.GetValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) if err != nil { log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) @@ -114,7 +114,10 @@ func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *op if entry.Ttl != nil { ttl = time.Duration(*entry.Ttl) } - if eol, ok := checkEOL(entry); ok { + switch eol, err := ipns.GetEOL(entry); err { + case ipns.ErrUnrecognizedValidity: + // No EOL. + case nil: ttEol := eol.Sub(time.Now()) if ttEol < 0 { // It *was* valid when we first resolved it. @@ -122,18 +125,10 @@ func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *op } else if ttEol < ttl { ttl = ttEol } + default: + log.Errorf("encountered error when parsing EOL: %s", err) + return "", 0, err } return p, ttl, nil } - -func checkEOL(e *pb.IpnsEntry) (time.Time, bool) { - if e.GetValidityType() == pb.IpnsEntry_EOL { - eol, err := u.ParseRFC3339(string(e.GetValidity())) - if err != nil { - return time.Time{}, false - } - return eol, true - } - return time.Time{}, false -} diff --git a/namesys/validator.go b/namesys/validator.go deleted file mode 100644 index f947ef0469..0000000000 --- a/namesys/validator.go +++ /dev/null @@ -1,179 +0,0 @@ -package namesys - -import ( - "bytes" - "errors" - "fmt" - "time" - - pb "github.com/ipfs/go-ipfs/namesys/pb" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" - ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" - - record "gx/ipfs/QmPWjVzxHeJdrjp4Jr2R2sPxBrMbBgGPWQtKwCKHHCBF7x/go-libp2p-record" - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" -) - -// ErrExpiredRecord should be returned when an ipns record is -// invalid due to being too old -var ErrExpiredRecord = errors.New("expired record") - -// ErrUnrecognizedValidity is returned when an IpnsRecord has an -// unknown validity type. -var ErrUnrecognizedValidity = errors.New("unrecognized validity type") - -// ErrInvalidPath should be returned when an ipns record path -// is not in a valid format -var ErrInvalidPath = errors.New("record path invalid") - -// ErrSignature should be returned when an ipns record fails -// signature verification -var ErrSignature = errors.New("record signature verification failed") - -// ErrBadRecord should be returned when an ipns record cannot be unmarshalled -var ErrBadRecord = errors.New("record could not be unmarshalled") - -// ErrKeyFormat should be returned when an ipns record key is -// incorrectly formatted (not a peer ID) -var ErrKeyFormat = errors.New("record key could not be parsed into peer ID") - -// ErrPublicKeyNotFound should be returned when the public key -// corresponding to the ipns record path cannot be retrieved -// from the peer store -var ErrPublicKeyNotFound = errors.New("public key not found in peer store") - -var ErrPublicKeyMismatch = errors.New("public key in record did not match expected pubkey") - -type IpnsValidator struct { - KeyBook pstore.KeyBook -} - -func (v IpnsValidator) Validate(key string, value []byte) error { - ns, pidString, err := record.SplitKey(key) - if err != nil || ns != "ipns" { - return ErrInvalidPath - } - - // Parse the value into an IpnsEntry - entry := new(pb.IpnsEntry) - err = proto.Unmarshal(value, entry) - if err != nil { - return ErrBadRecord - } - - // Get the public key defined by the ipns path - pid, err := peer.IDFromString(pidString) - if err != nil { - log.Debugf("failed to parse ipns record key %s into peer ID", pidString) - return ErrKeyFormat - } - - pubk, err := v.getPublicKey(pid, entry) - if err != nil { - return err - } - - // Check the ipns record signature with the public key - if ok, err := pubk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { - log.Debugf("failed to verify signature for ipns record %s", pidString) - return ErrSignature - } - - // Check that record has not expired - switch entry.GetValidityType() { - case pb.IpnsEntry_EOL: - t, err := u.ParseRFC3339(string(entry.GetValidity())) - if err != nil { - log.Debugf("failed parsing time for ipns record EOL in record %s", pidString) - return err - } - if time.Now().After(t) { - return ErrExpiredRecord - } - default: - return ErrUnrecognizedValidity - } - return nil -} - -func (v IpnsValidator) getPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey, error) { - if entry.PubKey != nil { - pk, err := ic.UnmarshalPublicKey(entry.PubKey) - if err != nil { - log.Debugf("public key in ipns record failed to parse: ", err) - return nil, fmt.Errorf("unmarshaling pubkey in record: %s", err) - } - - expPid, err := peer.IDFromPublicKey(pk) - if err != nil { - return nil, fmt.Errorf("could not regenerate peerID from pubkey: %s", err) - } - - if pid != expPid { - return nil, ErrPublicKeyMismatch - } - - return pk, nil - } - - pubk := v.KeyBook.PubKey(pid) - if pubk == nil { - log.Debugf("public key with hash %s not found in peer store", pid) - return nil, ErrPublicKeyNotFound - } - return pubk, nil -} - -// IpnsSelectorFunc selects the best record by checking which has the highest -// sequence number and latest EOL -func (v IpnsValidator) Select(k string, vals [][]byte) (int, error) { - var recs []*pb.IpnsEntry - for _, v := range vals { - e := new(pb.IpnsEntry) - err := proto.Unmarshal(v, e) - if err == nil { - recs = append(recs, e) - } else { - recs = append(recs, nil) - } - } - - return selectRecord(recs, vals) -} - -func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) { - var bestSeq uint64 - besti := -1 - - for i, r := range recs { - if r == nil || r.GetSequence() < bestSeq { - continue - } - rt, err := u.ParseRFC3339(string(r.GetValidity())) - if err != nil { - log.Errorf("failed to parse ipns record EOL %s", r.GetValidity()) - continue - } - - if besti == -1 || r.GetSequence() > bestSeq { - bestSeq = r.GetSequence() - besti = i - } else if r.GetSequence() == bestSeq { - bestt, _ := u.ParseRFC3339(string(recs[besti].GetValidity())) - if rt.After(bestt) { - besti = i - } else if rt == bestt { - if bytes.Compare(vals[i], vals[besti]) > 0 { - besti = i - } - } - } - } - if besti == -1 { - return 0, errors.New("no usable records in given set") - } - - return besti, nil -} From 9d70b77085e67e3e9b22dbe16a427d2ded30f68e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 17 Jun 2018 15:16:42 -0700 Subject: [PATCH 2061/3147] add an explicit test case for the EmbedPublicKey function This commit was moved from ipfs/go-ipns@d7779be9f3d26474e8aab64d2afe4fb0391af53f --- ipns/ipns.go | 5 +++++ ipns/ipns_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 ipns/ipns_test.go diff --git a/ipns/ipns.go b/ipns/ipns.go index 2d67945e52..be71edb723 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -68,6 +68,8 @@ func GetEOL(entry *pb.IpnsEntry) (time.Time, error) { // that don't embed their public keys as they may not be able to validate them // efficiently. func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { + // Try extracting the public key from the ID. If we can, *don't* embed + // it. id, err := peer.IDFromPublicKey(pk) if err != nil { return err @@ -79,6 +81,9 @@ func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { if extraced != nil { return nil } + + // We failed to extract the public key from the peer ID, embed it in the + // record. pkBytes, err := pk.Bytes() if err != nil { return err diff --git a/ipns/ipns_test.go b/ipns/ipns_test.go new file mode 100644 index 0000000000..d46423fefd --- /dev/null +++ b/ipns/ipns_test.go @@ -0,0 +1,43 @@ +package ipns + +import ( + "testing" + "time" + + u "github.com/ipfs/go-ipfs-util" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" +) + +func TestEmbedPublicKey(t *testing.T) { + + sr := u.NewTimeSeededRand() + priv, pub, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, sr) + if err != nil { + t.Fatal(err) + } + + pid, err := peer.IDFromPublicKey(pub) + if err != nil { + t.Fatal(err) + } + + e, err := Create(priv, []byte("/a/b"), 0, time.Now().Add(1*time.Hour)) + if err != nil { + t.Fatal(err) + } + if err := EmbedPublicKey(pub, e); err != nil { + t.Fatal(err) + } + embeddedPk, err := ci.UnmarshalPublicKey(e.PubKey) + if err != nil { + t.Fatal(err) + } + embeddedPid, err := peer.IDFromPublicKey(embeddedPk) + if err != nil { + t.Fatal(err) + } + if embeddedPid != pid { + t.Fatalf("pid mismatch: %s != %s", pid, embeddedPid) + } +} From 86391e59a559c332e8d3948e65ab92362222eeac Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 17 Jun 2018 15:18:15 -0700 Subject: [PATCH 2062/3147] fix typo This commit was moved from ipfs/go-ipns@0264a049adee7628c91a9b47e710e9b37cde99a3 --- ipns/ipns.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipns/ipns.go b/ipns/ipns.go index be71edb723..38b50764bd 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -74,11 +74,11 @@ func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { if err != nil { return err } - extraced, err := id.ExtractPublicKey() + extracted, err := id.ExtractPublicKey() if err != nil { return err } - if extraced != nil { + if extracted != nil { return nil } From c01ef070cb9792efcb9e0751de979bcd0f0daf8f Mon Sep 17 00:00:00 2001 From: Rob Brackett Date: Mon, 18 Jun 2018 13:46:40 -0700 Subject: [PATCH 2063/3147] Add a usage example to the README, fixes #9 We could still use some more examples of other operations, but this should be a good start. License: MIT Signed-off-by: Rob Brackett This commit was moved from ipfs/go-ipns@6e1876c2d81b48a80ede344b3d90f80495b237b2 --- ipns/README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/ipns/README.md b/ipns/README.md index ca2dbd7eac..75d7ca3f9f 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -11,6 +11,35 @@ This package contains all of components necessary to create, understand, and validate IPNS records. +## Usage + +To create a new IPNS record: + +```go +import ( + "time" + + ipns "github.com/ipfs/go-ipns" + crypto "github.com/libp2p/go-libp2p-crypto" +) + +// Generate a private key to sign the IPNS record with. Most of the time, +// however, you'll want to retrieve an already-existing key from IPFS using the +// go-ipfs/core/coreapi CoreAPI.KeyAPI() interface. +privateKey, publicKey, err := crypto.GenerateKeyPair(crypto.RSA, 2048) + +// Create an IPNS record that expires in one hour and points to the IPFS address +// /ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5 +ipnsRecord, err := ipns.Create(privateKey, []byte("/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5"), 0, time.Now().Add(1*time.Hour)) +if err != nil { + panic(err) +} +``` + +Once you have the record, you’ll need to use IPFS to *publish* it. + +There are several other major operations you can do with `go-ipns`. Check out the [API docs](https://godoc.org/github.com/ipfs/go-ipns) or look at the tests in this repo for examples. + ## Documentation https://godoc.org/github.com/ipfs/go-ipns From f706aa07d6f6b70b75a74c1a2f3005f979946a0a Mon Sep 17 00:00:00 2001 From: Rob Brackett Date: Mon, 18 Jun 2018 14:11:11 -0700 Subject: [PATCH 2064/3147] Add `Create` example to godoc License: MIT Signed-off-by: Rob Brackett This commit was moved from ipfs/go-ipns@fa15ed2ecc1a7b2d198f160fcc6d5e94ad87e1c7 --- ipns/ipns_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ipns/ipns_test.go b/ipns/ipns_test.go index d46423fefd..426a431019 100644 --- a/ipns/ipns_test.go +++ b/ipns/ipns_test.go @@ -41,3 +41,17 @@ func TestEmbedPublicKey(t *testing.T) { t.Fatalf("pid mismatch: %s != %s", pid, embeddedPid) } } + +func ExampleCreate() { + // Generate a private key to sign the IPNS record with. Most of the time, + // however, you'll want to retrieve an already-existing key from IPFS using + // go-ipfs/core/coreapi CoreAPI.KeyAPI() interface. + privateKey, publicKey, err := ic.GenerateKeyPair(ic.RSA, 2048) + + // Create an IPNS record that expires in one hour and points to the IPFS address + // /ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5 + ipnsRecord, err := Create(privateKey, []byte("/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5"), 0, time.Now().Add(1*time.Hour)) + if err != nil { + panic(err) + } +} From 3209a0c783c927e27ea876a2439077dcc55af1de Mon Sep 17 00:00:00 2001 From: Rob Brackett Date: Mon, 18 Jun 2018 14:48:04 -0700 Subject: [PATCH 2065/3147] Add note about what this package does *not* do This is based on a note in #1, which seems like an important and useful clarification :) License: MIT Signed-off-by: Rob Brackett This commit was moved from ipfs/go-ipns@a52d149c80aa8720c10f0e563cc95362ddc62d09 --- ipns/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ipns/README.md b/ipns/README.md index 75d7ca3f9f..edc5e5e63b 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -8,8 +8,7 @@ > ipns record definitions -This package contains all of components necessary to create, understand, and -validate IPNS records. +This package contains all of components necessary to create, understand, and validate IPNS records. It does *not* publish or resolve those records. [`go-ipfs`](https://github.com/ipfs/go-ipfs) uses this package internally to manipulate records. ## Usage From 86d38fa20b7f21eb67d2049870b1dbb31945a573 Mon Sep 17 00:00:00 2001 From: Rob Brackett Date: Mon, 18 Jun 2018 14:57:42 -0700 Subject: [PATCH 2066/3147] Follow Protocol Labs licensing policy Update the README and add a LICENSE file to follow our licensing policy: https://github.com/ipfs/community/blob/68f2fc02c4384eeb765ebc7547ea07f3aa2268c1/docs/licensing-policy.md License: MIT Signed-off-by: Rob Brackett This commit was moved from ipfs/go-ipns@8a9a5c36889b73e48667556589d5511af91c1089 --- ipns/LICENSE | 21 +++++++++++++++++++++ ipns/README.md | 3 +-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 ipns/LICENSE diff --git a/ipns/LICENSE b/ipns/LICENSE new file mode 100644 index 0000000000..8ce028785b --- /dev/null +++ b/ipns/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Protocol Labs, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/ipns/README.md b/ipns/README.md index ca2dbd7eac..f1af2dd873 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -27,5 +27,4 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License -MIT - +Copyright (c) Protocol Labs, Inc. under the **MIT license**. See [LICENSE file](./LICENSE) for details. From 78976bfb69d14f0561d6c4ffc2ccaddb972b29fa Mon Sep 17 00:00:00 2001 From: Rob Brackett Date: Mon, 18 Jun 2018 15:07:36 -0700 Subject: [PATCH 2067/3147] Satisfy `go vet` License: MIT Signed-off-by: Rob Brackett This commit was moved from ipfs/go-ipns@9d17206712ec41333c75cea41498a88c7b83a81d --- ipns/README.md | 3 +++ ipns/ipns_test.go | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ipns/README.md b/ipns/README.md index edc5e5e63b..966cce93b9 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -26,6 +26,9 @@ import ( // however, you'll want to retrieve an already-existing key from IPFS using the // go-ipfs/core/coreapi CoreAPI.KeyAPI() interface. privateKey, publicKey, err := crypto.GenerateKeyPair(crypto.RSA, 2048) +if err != nil { + panic(err) +} // Create an IPNS record that expires in one hour and points to the IPFS address // /ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5 diff --git a/ipns/ipns_test.go b/ipns/ipns_test.go index 426a431019..0f2e30d794 100644 --- a/ipns/ipns_test.go +++ b/ipns/ipns_test.go @@ -1,6 +1,7 @@ package ipns import ( + "fmt" "testing" "time" @@ -46,7 +47,10 @@ func ExampleCreate() { // Generate a private key to sign the IPNS record with. Most of the time, // however, you'll want to retrieve an already-existing key from IPFS using // go-ipfs/core/coreapi CoreAPI.KeyAPI() interface. - privateKey, publicKey, err := ic.GenerateKeyPair(ic.RSA, 2048) + privateKey, _, err := ci.GenerateKeyPair(ci.RSA, 2048) + if err != nil { + panic(err) + } // Create an IPNS record that expires in one hour and points to the IPFS address // /ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5 @@ -54,4 +58,6 @@ func ExampleCreate() { if err != nil { panic(err) } + + fmt.Println(ipnsRecord) } From 722ab70d3a9c9f418bafb311e8a5ae1849efc6c2 Mon Sep 17 00:00:00 2001 From: potsables Date: Mon, 18 Jun 2018 20:59:26 -0700 Subject: [PATCH 2068/3147] added examples This commit was moved from ipfs/go-ipns@7651b3ea93b1a0adaa5deb7fc65a65631b98f3cf --- ipns/examples/embed.go | 27 +++++++++++++++ ipns/examples/examples_test.go | 63 ++++++++++++++++++++++++++++++++++ ipns/examples/key.go | 35 +++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 ipns/examples/embed.go create mode 100644 ipns/examples/examples_test.go create mode 100644 ipns/examples/key.go diff --git a/ipns/examples/embed.go b/ipns/examples/embed.go new file mode 100644 index 0000000000..c9d196789f --- /dev/null +++ b/ipns/examples/embed.go @@ -0,0 +1,27 @@ +package examples + +import ( + "time" + + pb "github.com/ipfs/go-ipns/pb" + + ipns "github.com/ipfs/go-ipns" + crypto "github.com/libp2p/go-libp2p-crypto" +) + +// CreateEntryWithEmbed shows how you can create an IPNS entry +// and embed it with a public key. For ed25519 keys this is not needed +// so attempting to embed with an ed25519 key, will not actually embed the key +func CreateEntryWithEmbed(ipfsPath string, publicKey crypto.PubKey, privateKey crypto.PrivKey) (*pb.IpnsEntry, error) { + ipfsPathByte := []byte(ipfsPath) + eol := time.Now().Add(time.Hour * 48) + entry, err := ipns.Create(privateKey, ipfsPathByte, 1, eol) + if err != nil { + return nil, err + } + err = ipns.EmbedPublicKey(publicKey, entry) + if err != nil { + return nil, nil + } + return entry, nil +} diff --git a/ipns/examples/examples_test.go b/ipns/examples/examples_test.go new file mode 100644 index 0000000000..f51c8c624b --- /dev/null +++ b/ipns/examples/examples_test.go @@ -0,0 +1,63 @@ +package examples_test + +import ( + "testing" + + "github.com/ipfs/go-ipns/examples" +) + +var testPath = "/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5" + +func TestKeyGeneration(t *testing.T) { + _, err := generateRSAKey() + if err != nil { + t.Error(err) + } + + _, err = generateEDKey() + if err != nil { + t.Error(err) + } +} + +func TestEmbeddedEntryCreation(t *testing.T) { + rk, err := generateRSAKey() + if err != nil { + t.Fatal(err) + } + + ek, err := generateEDKey() + if err != nil { + t.Fatal(err) + } + + _, err = examples.CreateEntryWithEmbed(testPath, rk.Public, rk.Private) + if err != nil { + t.Error(err) + } + + _, err = examples.CreateEntryWithEmbed(testPath, ek.Public, ek.Private) + if err != nil { + t.Error(err) + } + +} +func generateRSAKey() (*examples.KeyPair, error) { + // DO NOT USE 1024 BITS IN PRODUCTION + // THIS IS ONLY FOR TESTING PURPOSES + kp, err := examples.GenerateRSAKeyPair(1024) + if err != nil { + return nil, err + } + return kp, nil +} + +func generateEDKey() (*examples.KeyPair, error) { + // DO NOT USE 1024 BITS IN PRODUCTION + // THIS IS ONLY FOR TESTING PURPOSES + kp, err := examples.GenerateEDKeyPair(1024) + if err != nil { + return nil, err + } + return kp, nil +} diff --git a/ipns/examples/key.go b/ipns/examples/key.go new file mode 100644 index 0000000000..1433f00791 --- /dev/null +++ b/ipns/examples/key.go @@ -0,0 +1,35 @@ +package examples + +import ( + crypto "github.com/libp2p/go-libp2p-crypto" +) + +// KeyPair is a helper struct used to contain the parts of a key +type KeyPair struct { + Private crypto.PrivKey + Public crypto.PubKey +} + +// GenerateRSAKeyPair is used to generate an RSA key pair +func GenerateRSAKeyPair(bits int) (*KeyPair, error) { + var kp KeyPair + priv, pub, err := crypto.GenerateKeyPair(crypto.RSA, bits) + if err != nil { + return nil, err + } + kp.Private = priv + kp.Public = pub + return &kp, nil +} + +// GenerateEDKeyPair is used to generate an ED25519 keypair +func GenerateEDKeyPair(bits int) (*KeyPair, error) { + var kp KeyPair + priv, pub, err := crypto.GenerateKeyPair(crypto.Ed25519, bits) + if err != nil { + return nil, err + } + kp.Private = priv + kp.Public = pub + return &kp, nil +} From 78b8172fc6905d7f5f0b1b30f14fe4db58e2e90f Mon Sep 17 00:00:00 2001 From: potsables Date: Mon, 18 Jun 2018 21:02:57 -0700 Subject: [PATCH 2069/3147] Had a small typo return nil,nil instead of nil,err This commit was moved from ipfs/go-ipns@5e4b85a466c9134ba30860053768ec2c32d110c6 --- ipns/examples/embed.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipns/examples/embed.go b/ipns/examples/embed.go index c9d196789f..ffc635eafc 100644 --- a/ipns/examples/embed.go +++ b/ipns/examples/embed.go @@ -21,7 +21,7 @@ func CreateEntryWithEmbed(ipfsPath string, publicKey crypto.PubKey, privateKey c } err = ipns.EmbedPublicKey(publicKey, entry) if err != nil { - return nil, nil + return nil, err } return entry, nil } From cbb60852e88bea1c92a41f6562ef11cc472088fa Mon Sep 17 00:00:00 2001 From: potsables Date: Mon, 18 Jun 2018 21:51:29 -0700 Subject: [PATCH 2070/3147] updates tests and examples as per Stebalien's comment This commit was moved from ipfs/go-ipns@3b408d34642bf02231833fce0dbde14e1fa15060 --- ipns/examples/examples_test.go | 23 +++++++++++------------ ipns/examples/key.go | 25 +++++++------------------ 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/ipns/examples/examples_test.go b/ipns/examples/examples_test.go index f51c8c624b..eb67d7a07f 100644 --- a/ipns/examples/examples_test.go +++ b/ipns/examples/examples_test.go @@ -3,7 +3,8 @@ package examples_test import ( "testing" - "github.com/ipfs/go-ipns/examples" + "github.com/RTradeLtd/go-ipns/examples" + crypto "github.com/libp2p/go-libp2p-crypto" ) var testPath = "/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5" @@ -30,34 +31,32 @@ func TestEmbeddedEntryCreation(t *testing.T) { if err != nil { t.Fatal(err) } - - _, err = examples.CreateEntryWithEmbed(testPath, rk.Public, rk.Private) + _, err = examples.CreateEntryWithEmbed(testPath, rk.GetPublic(), rk) if err != nil { t.Error(err) } - _, err = examples.CreateEntryWithEmbed(testPath, ek.Public, ek.Private) + _, err = examples.CreateEntryWithEmbed(testPath, ek.GetPublic(), ek) if err != nil { t.Error(err) } } -func generateRSAKey() (*examples.KeyPair, error) { +func generateRSAKey() (crypto.PrivKey, error) { // DO NOT USE 1024 BITS IN PRODUCTION // THIS IS ONLY FOR TESTING PURPOSES - kp, err := examples.GenerateRSAKeyPair(1024) + k, err := examples.GenerateRSAKeyPair(1024) if err != nil { return nil, err } - return kp, nil + return k, nil } -func generateEDKey() (*examples.KeyPair, error) { - // DO NOT USE 1024 BITS IN PRODUCTION - // THIS IS ONLY FOR TESTING PURPOSES - kp, err := examples.GenerateEDKeyPair(1024) +func generateEDKey() (crypto.PrivKey, error) { + // ED25519 uses 256bit keys, and ignore the bit param + k, err := examples.GenerateEDKeyPair() if err != nil { return nil, err } - return kp, nil + return k, nil } diff --git a/ipns/examples/key.go b/ipns/examples/key.go index 1433f00791..408e3da80b 100644 --- a/ipns/examples/key.go +++ b/ipns/examples/key.go @@ -4,32 +4,21 @@ import ( crypto "github.com/libp2p/go-libp2p-crypto" ) -// KeyPair is a helper struct used to contain the parts of a key -type KeyPair struct { - Private crypto.PrivKey - Public crypto.PubKey -} - // GenerateRSAKeyPair is used to generate an RSA key pair -func GenerateRSAKeyPair(bits int) (*KeyPair, error) { - var kp KeyPair - priv, pub, err := crypto.GenerateKeyPair(crypto.RSA, bits) +func GenerateRSAKeyPair(bits int) (crypto.PrivKey, error) { + priv, _, err := crypto.GenerateKeyPair(crypto.RSA, bits) if err != nil { return nil, err } - kp.Private = priv - kp.Public = pub - return &kp, nil + return priv, nil } // GenerateEDKeyPair is used to generate an ED25519 keypair -func GenerateEDKeyPair(bits int) (*KeyPair, error) { - var kp KeyPair - priv, pub, err := crypto.GenerateKeyPair(crypto.Ed25519, bits) +func GenerateEDKeyPair() (crypto.PrivKey, error) { + // ED25519 ignores the bit param and uses 256bit keys + priv, _, err := crypto.GenerateKeyPair(crypto.Ed25519, 256) if err != nil { return nil, err } - kp.Private = priv - kp.Public = pub - return &kp, nil + return priv, nil } From 55d9ae443575e7ca7e24ed2cd452a5330d3356ff Mon Sep 17 00:00:00 2001 From: potsables Date: Mon, 18 Jun 2018 21:52:26 -0700 Subject: [PATCH 2071/3147] changed import path to use ipfs repo This commit was moved from ipfs/go-ipns@cbfa50ea5dce40724a6ee84dad062608e37e1448 --- ipns/examples/examples_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipns/examples/examples_test.go b/ipns/examples/examples_test.go index eb67d7a07f..af765f9f97 100644 --- a/ipns/examples/examples_test.go +++ b/ipns/examples/examples_test.go @@ -3,7 +3,7 @@ package examples_test import ( "testing" - "github.com/RTradeLtd/go-ipns/examples" + "github.com/ipfs/go-ipns/examples" crypto "github.com/libp2p/go-libp2p-crypto" ) From 1e4c83d145f4276d0d54f05804202b206dbec8e0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 13 Jun 2018 20:04:48 -0700 Subject: [PATCH 2072/3147] add record validation to offline routing fixes #5115 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@80b447da71616c176aa55e448b9f5e22111bc99f --- blockservice/test/mock.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 5018a6c8d8..bc6a668358 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,8 +5,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" + mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 637e58ed0e01d90f51136bc0a2b524413909ddd0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 13 Jun 2018 20:04:48 -0700 Subject: [PATCH 2073/3147] add record validation to offline routing fixes #5115 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@7e0fe91fc0d80e6239af995bd0e270c68b8a92ad --- namesys/ipns_resolver_validation_test.go | 42 ++++++++++-------------- namesys/namesys_test.go | 17 ++++++++-- namesys/publisher.go | 4 +-- namesys/publisher_test.go | 4 +-- namesys/republisher/repub.go | 2 +- namesys/resolve_test.go | 4 +-- namesys/routing.go | 4 +-- 7 files changed, 42 insertions(+), 35 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 864aa443a8..5a3150f05a 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -11,12 +11,13 @@ import ( record "gx/ipfs/QmPWjVzxHeJdrjp4Jr2R2sPxBrMbBgGPWQtKwCKHHCBF7x/go-libp2p-record" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" - ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" + mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" + offline "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/offline" routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" ropts "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing/options" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" - mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" + ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" @@ -31,6 +32,8 @@ func TestResolverValidation(t *testing.T) { vstore := newMockValueStore(rid, dstore, peerstore) resolver := NewIpnsResolver(vstore) + nvVstore := offline.NewOfflineRouter(dstore, mockrouting.MockValidator{}) + // Create entry with expiry in one hour priv, id, _, ipnsDHTPath := genKeys(t) ts := time.Now() @@ -68,7 +71,7 @@ func TestResolverValidation(t *testing.T) { } // Publish entry - err = PublishEntry(ctx, vstore, ipnsDHTPath, expiredEntry) + err = PublishEntry(ctx, nvVstore, ipnsDHTPath, expiredEntry) if err != nil { t.Fatal(err) } @@ -89,7 +92,7 @@ func TestResolverValidation(t *testing.T) { } // Publish entry - err = PublishEntry(ctx, vstore, ipnsDHTPath2, entry) + err = PublishEntry(ctx, nvVstore, ipnsDHTPath2, entry) if err != nil { t.Fatal(err) } @@ -107,7 +110,7 @@ func TestResolverValidation(t *testing.T) { if err != nil { t.Fatal(err) } - err = PublishEntry(ctx, vstore, ipnsDHTPath3, entry3) + err = PublishEntry(ctx, nvVstore, ipnsDHTPath3, entry3) if err != nil { t.Fatal(err) } @@ -152,31 +155,22 @@ func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string, string) { } type mockValueStore struct { - r routing.ValueStore - kbook pstore.KeyBook - Validator record.Validator + r routing.ValueStore + kbook pstore.KeyBook } func newMockValueStore(id testutil.Identity, dstore ds.Datastore, kbook pstore.KeyBook) *mockValueStore { - serv := mockrouting.NewServer() - r := serv.ClientWithDatastore(context.Background(), id, dstore) - return &mockValueStore{r, kbook, record.NamespacedValidator{ - "ipns": ipns.Validator{KeyBook: kbook}, - "pk": record.PublicKeyValidator{}, - }} + return &mockValueStore{ + r: offline.NewOfflineRouter(dstore, record.NamespacedValidator{ + "ipns": ipns.Validator{KeyBook: kbook}, + "pk": record.PublicKeyValidator{}, + }), + kbook: kbook, + } } func (m *mockValueStore) GetValue(ctx context.Context, k string, opts ...ropts.Option) ([]byte, error) { - data, err := m.r.GetValue(ctx, k, opts...) - if err != nil { - return data, err - } - - if err = m.Validator.Validate(k, data); err != nil { - return nil, err - } - - return data, err + return m.r.GetValue(ctx, k, opts...) } func (m *mockValueStore) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index b4f35c0de5..cdd8c51f69 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,7 +10,10 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - offroute "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/offline" + offroute "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/offline" + peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" + pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" + ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" @@ -83,7 +86,17 @@ func TestPublishWithCache0(t *testing.T) { if err != nil { t.Fatal(err) } - routing := offroute.NewOfflineRouter(dst, priv) + ps := pstore.NewPeerstore() + pid, err := peer.IDFromPrivateKey(priv) + if err != nil { + t.Fatal(err) + } + err = ps.AddPrivKey(pid, priv) + if err != nil { + t.Fatal(err) + } + + routing := offroute.NewOfflineRouter(dst, ipns.Validator{KeyBook: ps}) nsys := NewNameSystem(routing, dst, 0) p, err := path.ParsePath(unixfs.EmptyDirNode().Cid().String()) diff --git a/namesys/publisher.go b/namesys/publisher.go index 7eb5483950..393e3181fc 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -11,11 +11,11 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" - ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" - pb "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns/pb" routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" + pb "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns/pb" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsquery "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index a79492c3d5..74e4339a50 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,10 +8,10 @@ import ( dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" - ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" + mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" ma "gx/ipfs/QmUxSEGbv2nmYNnfXi7839wwQqTN3kwQeUxe8dTjZWZs7J/go-multiaddr" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" + ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index fb90ccbc2d..5f22547475 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -9,11 +9,11 @@ import ( namesys "github.com/ipfs/go-ipfs/namesys" path "github.com/ipfs/go-ipfs/path" - pb "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns/pb" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + pb "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns/pb" logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index a930eb4e7a..58ea5b400e 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -9,9 +9,9 @@ import ( path "github.com/ipfs/go-ipfs/path" testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" - ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" + mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - mockrouting "gx/ipfs/Qmb1N7zdjG2FexpzWNj8T289u9QnQLEiSsTRadDGQxX32D/go-ipfs-routing/mock" + ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 22209e8f0e..05110eba55 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,13 +9,13 @@ import ( path "github.com/ipfs/go-ipfs/path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - ipns "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns" - pb "gx/ipfs/QmRAPFFaF7nrezCZQaLihyp2qbAXqSJU5WpvSpwroMv1Xt/go-ipns/pb" routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" dht "gx/ipfs/QmagBkuFfySAMouyXeiy8XjV1GyfNAgTCuVYGF9z3Z4Vvc/go-libp2p-kad-dht" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" + pb "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns/pb" logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" ) From 0d85bd2de98acd5f8c7b93cfdc83f765da58c722 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2074/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@afe71e4b0597f42a403da021fc1d8c22cc987973 --- unixfs/mod/dagmodifier.go | 2 +- unixfs/test/utils.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index c6648b9abb..adc1724281 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,8 +14,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index d92547e9fd..a59aeaea58 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -16,8 +16,8 @@ import ( u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) From 4114369421714ed6a7fe80462a4c8186c14ef2b5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2075/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@b5d3b18b7aed70e1e74b363e50ff24f5c8cac4fe --- mfs/file.go | 2 +- mfs/mfs_test.go | 6 +++--- mfs/repub_test.go | 2 +- mfs/system.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index 7ced25eedd..f28cf79f83 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -9,8 +9,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 9d03b45f22..7088c8c9cc 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -22,11 +22,11 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" - chunker "gx/ipfs/QmR4G4WBNGA5S5pvjFiTkuehstC9769sLAHei8vZernhYR/go-ipfs-chunker" + offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - bstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + bstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index cec6f699de..0782d50c8f 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - ci "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil/ci" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + ci "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil/ci" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 975d3da67e..67f60d5d98 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -21,7 +21,7 @@ import ( ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ) var ErrNotExist = errors.New("no such rootfs") From 371adcd86156d09c59608bf140672882d97b1c0f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2076/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@1e6bfc7a62bf7b978e7a69e915e2651424969f60 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 2 +- filestore/util.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 0df41aafb3..66289b0686 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -13,8 +13,8 @@ import ( blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 43fa263b8a..9589c3dd5f 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -11,7 +11,7 @@ import ( posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 1b1b94ea79..2e481ade90 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -14,7 +14,7 @@ import ( blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" diff --git a/filestore/util.go b/filestore/util.go index 8af7d860b2..55a0998591 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -8,7 +8,7 @@ import ( dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From 5eff93470b291e7bc6388cf9ec77eefc12494863 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2077/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@b501bd66c4faab2c9e13bb2141095024ae3958d3 --- path/resolver/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index a263f11504..73ac3fa234 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -12,7 +12,7 @@ import ( ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ) var log = logging.Logger("pathresolv") From bd3961e6e3e84f8b332c94017173bf9cacd93bd7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2078/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@7479955c0624bd6eac5b5325d48e11c7a7ec496f --- blockservice/blockservice.go | 4 ++-- blockservice/blockservice_test.go | 4 ++-- blockservice/test/blocks_test.go | 4 ++-- blockservice/test/mock.go | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index c39b36d256..38c67bbd34 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -14,8 +14,8 @@ import ( blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" exchange "gx/ipfs/QmVSe7YJbPnEmkSUKD3HxSvp8HJoyCU55hQoCMRq7N1jaK/go-ipfs-exchange-interface" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index d3c0bb1e60..d8bdaa9b17 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,10 +3,10 @@ package blockservice import ( "testing" - offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" butil "gx/ipfs/QmYmE4kxv6uFGaWkeBAFYDuNcxzCn87pzwm6CkBkM9C8BM/go-ipfs-blocksutil" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 745a1c7276..ee63050db1 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,10 +10,10 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index bc6a668358..425cf76596 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -5,8 +5,8 @@ import ( bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" - mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" + mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 2b830fb307e89f1b85a56738bcdf60f203dd2831 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2079/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@b8056e418facbf951985601e323b9b1701b1f881 --- pinning/pinner/gc/gc.go | 6 +++--- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 69ca731d17..d1dd9a6d9e 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -12,11 +12,11 @@ import ( pin "github.com/ipfs/go-ipfs/pin" "github.com/ipfs/go-ipfs/thirdparty/verifcid" - offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - bstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + bstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 348ead7bf1..3bf114bd62 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -14,7 +14,7 @@ import ( ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 0a0f652065..9f4a397f2a 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -9,9 +9,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 221487173e..fefda87d99 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -8,9 +8,9 @@ import ( bserv "github.com/ipfs/go-ipfs/blockservice" dag "github.com/ipfs/go-ipfs/merkledag" - offline "gx/ipfs/QmPf114DXfa6TqGKYhBGR7EtXRho4rCJgwyA1xkuMY5vwF/go-ipfs-exchange-offline" + offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmbaPGg81pvQiC5vTXtC9Jo8rdrWUjRaugH71WYNsgi6Ev/go-ipfs-blockstore" + blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From b69c4796e2fd40bce19f9c1db8bec5600c771ee0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2080/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@d8f4e9f24d974cfa5f4a483418406cf6aa4143b3 --- namesys/ipns_resolver_validation_test.go | 18 +++++++++--------- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 8 ++++---- namesys/publisher.go | 8 ++++---- namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 8 ++++---- namesys/routing.go | 12 ++++++------ 9 files changed, 39 insertions(+), 39 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 5a3150f05a..faf9d3e3b0 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -8,16 +8,16 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" - record "gx/ipfs/QmPWjVzxHeJdrjp4Jr2R2sPxBrMbBgGPWQtKwCKHHCBF7x/go-libp2p-record" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" - mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" - offline "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/offline" - routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" - ropts "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing/options" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" - ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" + routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" + ropts "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing/options" + record "gx/ipfs/QmVsp2KdPYE6M8ryzCk5KHLo3zprcY5hBDaYx6uPCFUdxA/go-libp2p-record" + mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" + offline "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/offline" + pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" + testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/namesys.go b/namesys/namesys.go index 99780cc888..06bd212fe5 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -9,10 +9,10 @@ import ( path "github.com/ipfs/go-ipfs/path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" + routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index cdd8c51f69..c6584e8fcb 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,10 +10,10 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - offroute "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/offline" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" - ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" + offroute "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/offline" + pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/publisher.go b/namesys/publisher.go index 393e3181fc..d057dba76a 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -11,11 +11,11 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" + routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" - pb "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns/pb" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" + pb "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns/pb" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsquery "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 74e4339a50..c96f38039c 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -7,11 +7,11 @@ import ( "time" dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" - testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" - mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" - ma "gx/ipfs/QmUxSEGbv2nmYNnfXi7839wwQqTN3kwQeUxe8dTjZWZs7J/go-multiaddr" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" + mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 5f22547475..abfb283dd1 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,10 +11,10 @@ import ( goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - pb "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns/pb" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + pb "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns/pb" ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 8a76cbcc12..623a1b1e04 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,8 +13,8 @@ import ( path "github.com/ipfs/go-ipfs/path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmUEAR2pS7fP1GPseS3i8MWFyENs7oDp4CZrgn8FCjbsBu/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmZhsmorLpD9kmQ4ynbAu4vbKv2goMUnXazwGA4gnWHDjB/go-libp2p-peerstore" + mocknet "gx/ipfs/QmZ86eLPtXkQ1Dfa992Q8NpXArUoWWh3y728JDcWvzRrvC/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 58ea5b400e..19c5443b3a 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,10 +8,10 @@ import ( path "github.com/ipfs/go-ipfs/path" - testutil "gx/ipfs/QmPdxCaVp4jZ9RbxqZADvKH6kiCR5jHvdR5f2ycjAY6T2a/go-testutil" - mockrouting "gx/ipfs/QmQUPmFYZBSWn4mtX1YwYkSaMoWVore7tCiSetr6k8JW21/go-ipfs-routing/mock" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" - ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" + mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" + testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 05110eba55..0851aaa4fc 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -8,15 +8,15 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" + dht "gx/ipfs/QmNg6M98bwS97SL9ArvrRxKujFps3eV6XvmKgduiYga8Bn/go-libp2p-kad-dht" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - routing "gx/ipfs/QmUV9hDAAyjeGbxbXkJ2sYqZ6dTd1DXJ2REhYEkRm178Tg/go-libp2p-routing" - peer "gx/ipfs/QmVf8hTAsLLFtn4WPCRNdnaF2Eag2qTBS6uR8AiHPZARXy/go-libp2p-peer" + routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dht "gx/ipfs/QmagBkuFfySAMouyXeiy8XjV1GyfNAgTCuVYGF9z3Z4Vvc/go-libp2p-kad-dht" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - ipns "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns" - pb "gx/ipfs/Qmb7iqDPPNogT8fJeYoLavoKhnp41tpoMPJ9D5qZVYynNQ/go-ipns/pb" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" + pb "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns/pb" ) var log = logging.Logger("namesys") From 22e9bd86393d38d078c473fd2c0bfe3a374acffa Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 25 Jun 2018 20:41:25 -0700 Subject: [PATCH 2081/3147] gx update Updates: * go-kad-dht: Query performance improvements, DHT client fixes, validates records on *local* put. * go-libp2p-swarm/go-libp2p-transport: Timeout improvements. * go-multiaddr-net: Exposes useful Conn methods (CloseWrite, CloseRead, etc.) * go-log: fixes possible panic when enabling/disabling events. * go-multiaddr: fixes possible panic when stringifying malformed multiaddrs, adds support for consuming /p2p/ multiaddrs. fixes #5113 unblocks #4895 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-keystore@95a5cd3ebde8d58c5a2a8965e6c37ff5ab955e37 --- keystore/keystore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 78bca6ecd1..e16dc265e4 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,7 +7,7 @@ import ( "path/filepath" "strings" - logging "gx/ipfs/Qmbi1CTJsbnBZjCEgc2otwu8cUFPsGpzWXG7edVCLZ7Gvk/go-log" + logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) From 7c862dc96516290977feabb97ca033e4841dc2b4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Jun 2018 16:52:57 -0700 Subject: [PATCH 2082/3147] use `copy` instead of looping License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@b5263d6ae25657dbd787590689c06973bca6c976 --- unixfs/io/pbdagreader.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index ce53d67118..8c357fb8ca 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -75,9 +75,7 @@ func (dr *PBDagReader) preloadNextNodes(ctx context.Context) { end = len(dr.links) } - for i, p := range ipld.GetNodes(ctx, dr.serv, dr.links[beg:end]) { - dr.promises[beg+i] = p - } + copy(dr.promises[beg:], ipld.GetNodes(ctx, dr.serv, dr.links[beg:end])) } // precalcNextBuf follows the next link in line and loads it from the From a9d34b38022bab235803ad902c107111f18469f8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Jun 2018 17:06:30 -0700 Subject: [PATCH 2083/3147] better handle context cancellations in the PBDagReader Good: If a previous read is canceled, we cancel the preloads that the read triggered. Bad: Future reads at that point will fail. This fixes that issue. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@f191b87344d01f6437d31ce620f297605e528089 --- unixfs/io/pbdagreader.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 8c357fb8ca..8d21f8da3f 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -95,10 +95,27 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { } nxt, err := dr.promises[dr.linkPosition].Get(ctx) - if err != nil { + dr.promises[dr.linkPosition] = nil + switch err { + case nil: + case context.DeadlineExceeded, context.Canceled: + err = ctx.Err() + if err != nil { + return ctx.Err() + } + // In this case, the context used to *preload* the node has been canceled. + // We need to retry the load with our context and we might as + // well preload some extra nodes while we're at it. + dr.preload(ctx, dr.linkPosition) + nxt, err = dr.promises[dr.linkPosition].Get(ctx) + dr.promises[dr.linkPosition] = nil + if err != nil { + return err + } + default: return err } - dr.promises[dr.linkPosition] = nil + dr.linkPosition++ switch nxt := nxt.(type) { From f92d7d47787cbc6201acf7153302afbf6dbfac51 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Jun 2018 17:08:50 -0700 Subject: [PATCH 2084/3147] always prefetch at least 5 blocks ahead This should reduce stuttering when streaming. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@cd315c81737f0694cddcfed1ab1621d418599017 --- unixfs/io/pbdagreader.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 8d21f8da3f..9c3909577f 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -68,8 +68,7 @@ func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv const preloadSize = 10 -func (dr *PBDagReader) preloadNextNodes(ctx context.Context) { - beg := dr.linkPosition +func (dr *PBDagReader) preload(ctx context.Context, beg int) { end := beg + preloadSize if end >= len(dr.links) { end = len(dr.links) @@ -90,8 +89,13 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { return io.EOF } - if dr.promises[dr.linkPosition] == nil { - dr.preloadNextNodes(ctx) + // If we drop to <= preloadSize/2 preloading nodes, preload the next 10. + for i := dr.linkPosition; i < dr.linkPosition+preloadSize/2 && i < len(dr.promises); i++ { + // TODO: check if canceled. + if dr.promises[i] == nil { + dr.preload(ctx, i) + break + } } nxt, err := dr.promises[dr.linkPosition].Get(ctx) From 8d57640596e64b602af4abb9f5894e32f2ec6ba2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Jun 2018 17:51:26 -0700 Subject: [PATCH 2085/3147] test dag reader context cancellation License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@5901259ccd9898fb9653d7075859172a27ff74a8 --- unixfs/io/dagreader_test.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index e3d3d042b2..7cbe35bb5f 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -122,6 +122,41 @@ func TestSeekAndReadLarge(t *testing.T) { } } +func TestReadAndCancel(t *testing.T) { + dserv := testu.GetDAGServ() + inbuf := make([]byte, 20000) + rand.Read(inbuf) + + node := testu.GetNode(t, dserv, inbuf, testu.UseProtoBufLeaves) + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + ctx, cancel := context.WithCancel(context.Background()) + buf := make([]byte, 100) + _, err = reader.CtxReadFull(ctx, buf) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(buf, inbuf[0:100]) { + t.Fatal("read failed") + } + cancel() + + b, err := ioutil.ReadAll(reader) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(inbuf[100:], b) { + t.Fatal("buffers not equal") + } +} + func TestRelativeSeek(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) From 807e8d344c4c5b2730f93774b62c787d7053b9f1 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 29 Jun 2018 10:57:34 -0300 Subject: [PATCH 2086/3147] mfs: make `Root` value a `Directory` Make `Root` value explicitly a `Directory` structure instead of the `FSNode` interface (which also allowed the `File` type). This helps to make the code easier to reason about: the root of an MFS layout is always a directory, not a (single) file. Rename `GetValue()` to `GetDirectory()` to also make it more explicit, the renamed function now returns a `Directory` so there is no need for type assertions that were previously done on the `FSNode` interface to check that it was actually a `Directory`. `NewRoot()` now doesn't allow to create `Root` structures from DAG nodes that contain UnixFS files. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@09d6e80111f1450b8f1da0e12600cf0faf0ccd48 --- mfs/mfs_test.go | 22 +++++++++++----------- mfs/ops.go | 12 +++++------- mfs/system.go | 29 +++++++++++------------------ 3 files changed, 27 insertions(+), 36 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 9d03b45f22..85ac54d039 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -213,7 +213,7 @@ func TestBasic(t *testing.T) { defer cancel() ds, rt := setupRoot(ctx, t) - rootdir := rt.GetValue().(*Directory) + rootdir := rt.GetDirectory() // test making a basic dir _, err := rootdir.Mkdir("a") @@ -243,7 +243,7 @@ func TestMkdir(t *testing.T) { defer cancel() _, rt := setupRoot(ctx, t) - rootdir := rt.GetValue().(*Directory) + rootdir := rt.GetDirectory() dirsToMake := []string{"a", "B", "foo", "bar", "cats", "fish"} sort.Strings(dirsToMake) // sort for easy comparing later @@ -281,7 +281,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { defer cancel() ds, rt := setupRoot(ctx, t) - rootdir := rt.GetValue().(*Directory) + rootdir := rt.GetDirectory() nd := getRandFile(t, ds, 1000) err := ds.Add(ctx, nd) @@ -373,7 +373,7 @@ func TestMfsFile(t *testing.T) { defer cancel() ds, rt := setupRoot(ctx, t) - rootdir := rt.GetValue().(*Directory) + rootdir := rt.GetDirectory() fisize := 1000 nd := getRandFile(t, ds, 1000) @@ -686,7 +686,7 @@ func actorReadFile(d *Directory) error { } func testActor(rt *Root, iterations int, errs chan error) { - d := rt.GetValue().(*Directory) + d := rt.GetDirectory() for i := 0; i < iterations; i++ { switch rand.Intn(5) { case 0: @@ -763,7 +763,7 @@ func TestConcurrentWriteAndFlush(t *testing.T) { defer cancel() ds, rt := setupRoot(ctx, t) - d := mkdirP(t, rt.GetValue().(*Directory), "foo/bar/baz") + d := mkdirP(t, rt.GetDirectory(), "foo/bar/baz") fn := fileNodeFromReader(t, ds, bytes.NewBuffer(nil)) err := d.AddChild("file", fn) if err != nil { @@ -786,7 +786,7 @@ func TestConcurrentWriteAndFlush(t *testing.T) { }() for i := 0; i < nloops; i++ { - _, err := rt.GetValue().GetNode() + _, err := rt.GetDirectory().GetNode() if err != nil { t.Fatal(err) } @@ -800,7 +800,7 @@ func TestFlushing(t *testing.T) { defer cancel() _, rt := setupRoot(ctx, t) - dir := rt.GetValue().(*Directory) + dir := rt.GetDirectory() c := mkdirP(t, dir, "a/b/c") d := mkdirP(t, dir, "a/b/d") e := mkdirP(t, dir, "a/b/e") @@ -901,7 +901,7 @@ func TestConcurrentReads(t *testing.T) { ds, rt := setupRoot(ctx, t) - rootdir := rt.GetValue().(*Directory) + rootdir := rt.GetDirectory() path := "a/b/c" d := mkdirP(t, rootdir, path) @@ -976,7 +976,7 @@ func TestConcurrentWrites(t *testing.T) { ds, rt := setupRoot(ctx, t) - rootdir := rt.GetValue().(*Directory) + rootdir := rt.GetDirectory() path := "a/b/c" d := mkdirP(t, rootdir, path) @@ -1011,7 +1011,7 @@ func TestFileDescriptors(t *testing.T) { defer cancel() ds, rt := setupRoot(ctx, t) - dir := rt.GetValue().(*Directory) + dir := rt.GetDirectory() nd := dag.NodeWithData(ft.FilePBData(nil, 0)) fi, err := NewFile("test", nd, dir, ds) diff --git a/mfs/ops.go b/mfs/ops.go index 6ade2bee0d..20d2c5e749 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -1,7 +1,6 @@ package mfs import ( - "errors" "fmt" "os" gopath "path" @@ -129,7 +128,7 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error { return fmt.Errorf("cannot create directory '/': Already exists") } - cur := r.GetValue().(*Directory) + cur := r.GetDirectory() for i, d := range parts[:len(parts)-1] { fsn, err := cur.Child(d) if err == os.ErrNotExist && opts.Mkparents { @@ -172,12 +171,11 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error { return nil } +// Lookup extracts the root directory and performs a lookup under it. +// TODO: Now that the root is always a directory, can this function +// be collapsed with `DirLookup`? Or at least be made a method of `Root`? func Lookup(r *Root, path string) (FSNode, error) { - dir, ok := r.GetValue().(*Directory) - if !ok { - log.Errorf("root not a dir: %#v", r.GetValue()) - return nil, errors.New("root was not a directory") - } + dir := r.GetDirectory() return DirLookup(dir, path) } diff --git a/mfs/system.go b/mfs/system.go index 975d3da67e..6f3e10badc 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -53,8 +53,8 @@ type Root struct { // node is the merkledag root. node *dag.ProtoNode - // val represents the node. It can either be a File or a Directory. - val FSNode + // Root directory of the MFS layout. + dir *Directory repub *Republisher @@ -90,33 +90,29 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf switch pbn.GetType() { case ft.TDirectory, ft.THAMTShard: - rval, err := NewDirectory(parent, node.String(), node, root, ds) + newDir, err := NewDirectory(parent, node.String(), node, root, ds) if err != nil { return nil, err } - root.val = rval + root.dir = newDir case ft.TFile, ft.TMetadata, ft.TRaw: - fi, err := NewFile(node.String(), node, root, ds) - if err != nil { - return nil, err - } - root.val = fi + return nil, fmt.Errorf("root can't be a file (unixfs type: %s)", pbn.GetType()) default: return nil, fmt.Errorf("unrecognized unixfs type: %s", pbn.GetType()) } return root, nil } -// GetValue returns the value of Root. -func (kr *Root) GetValue() FSNode { - return kr.val +// GetDirectory returns the root directory. +func (kr *Root) GetDirectory() *Directory { + return kr.dir } // Flush signals that an update has occurred since the last publish, // and updates the Root republisher. func (kr *Root) Flush() error { - nd, err := kr.GetValue().GetNode() + nd, err := kr.GetDirectory().GetNode() if err != nil { return err } @@ -136,10 +132,7 @@ func (kr *Root) Flush() error { // A better implemented mfs system (one that does smarter internal caching and // refcounting) shouldnt need this method. func (kr *Root) FlushMemFree(ctx context.Context) error { - dir, ok := kr.GetValue().(*Directory) - if !ok { - return fmt.Errorf("invalid mfs structure, root should be a directory") - } + dir := kr.GetDirectory() if err := dir.Flush(); err != nil { return err @@ -172,7 +165,7 @@ func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { } func (kr *Root) Close() error { - nd, err := kr.GetValue().GetNode() + nd, err := kr.GetDirectory().GetNode() if err != nil { return err } From 741dc7d187fa57ef9b07947866773a22d9cf460d Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 29 Jun 2018 11:51:26 -0300 Subject: [PATCH 2087/3147] mfs: remove unused `Root` variables `node` and `Type` License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@f7f899d6dc8c28753ca0d054bd7666ded4356a42 --- mfs/system.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mfs/system.go b/mfs/system.go index 6f3e10badc..d92d55a2b4 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -50,8 +50,6 @@ type FSNode interface { // Root represents the root of a filesystem tree. type Root struct { - // node is the merkledag root. - node *dag.ProtoNode // Root directory of the MFS layout. dir *Directory @@ -59,8 +57,6 @@ type Root struct { repub *Republisher dserv ipld.DAGService - - Type string } // PubFunc is the function used by the `publish()` method. @@ -77,7 +73,6 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf } root := &Root{ - node: node, repub: repub, dserv: ds, } From 0ea8b158cfd3c8c1f71cc6deb395973fa97323b8 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 29 Jun 2018 12:04:48 -0300 Subject: [PATCH 2088/3147] mfs: remove `DAGService` from `Root` The `Root` structure now explicitly contains a `Directory` (instead of an `FSNode` interface), use that `Directory`'s `DAGService` instead of its own `dserv` variable (which was used only once in `closeChild()`). The `DAGService` in the `Root` and the `Directory` was the same (passed as an argument in the `NewRoot` initializer function). This leaves the `Root` structure with only a `Directory` and a `Republisher` and allows to better rethink its role and whether if those two structures should be grouped together (and if that group's name should be `Root`). License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@b7cf40115a605e4ddbf9867aa3e5af70e099ec28 --- mfs/system.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mfs/system.go b/mfs/system.go index d92d55a2b4..5324b8bf8d 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -55,8 +55,6 @@ type Root struct { dir *Directory repub *Republisher - - dserv ipld.DAGService } // PubFunc is the function used by the `publish()` method. @@ -74,7 +72,6 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf root := &Root{ repub: repub, - dserv: ds, } pbn, err := ft.FromBytes(node.Data()) @@ -148,7 +145,7 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published. func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { - err := kr.dserv.Add(context.TODO(), nd) + err := kr.GetDirectory().dserv.Add(context.TODO(), nd) if err != nil { return err } From 055dfeb9d8d401629f1089108947d9143227aecc Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 4 Jul 2018 23:51:10 -0300 Subject: [PATCH 2089/3147] dagreader: remove `Offset()` method Remove `Offset()` from the `DagReader` interface. It's not part of the Unix API and it wasn't used anywhere except for the tests (a helper function was added to replace it). License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@513c0689ab0f79a8dfe2eb619f6e54b755bda941 --- unixfs/io/bufdagreader.go | 10 ---------- unixfs/io/dagreader.go | 1 - unixfs/io/dagreader_test.go | 24 ++++++++++++++++-------- unixfs/io/pbdagreader.go | 5 ----- unixfs/mod/dagmodifier_test.go | 10 +++++++++- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/unixfs/io/bufdagreader.go b/unixfs/io/bufdagreader.go index 6074099e83..48efe98ad2 100644 --- a/unixfs/io/bufdagreader.go +++ b/unixfs/io/bufdagreader.go @@ -3,7 +3,6 @@ package io import ( "bytes" "context" - "io" ) // BufDagReader implements a DagReader that reads from a byte slice @@ -30,15 +29,6 @@ func (rd *BufDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) return rd.Read(b) } -// Offset returns the current offset. -func (rd *BufDagReader) Offset() int64 { - of, err := rd.Seek(0, io.SeekCurrent) - if err != nil { - panic("this should never happen " + err.Error()) - } - return of -} - // Size returns the size of the buffer. func (rd *BufDagReader) Size() uint64 { s := rd.Reader.Size() diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index e3f7957321..37b9e4e6b6 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -27,7 +27,6 @@ type DagReader interface { ReadSeekCloser Size() uint64 CtxReadFull(context.Context, []byte) (int, error) - Offset() int64 } // A ReadSeekCloser implements interfaces to read, copy, seek and close. diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index e3d3d042b2..99973f7dc0 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -57,7 +57,7 @@ func TestSeekAndRead(t *testing.T) { for i := 255; i >= 0; i-- { reader.Seek(int64(i), io.SeekStart) - if reader.Offset() != int64(i) { + if getOffset(reader) != int64(i) { t.Fatal("expected offset to be increased by one after read") } @@ -67,7 +67,7 @@ func TestSeekAndRead(t *testing.T) { t.Fatalf("read %d at index %d, expected %d", out, i, i) } - if reader.Offset() != int64(i+1) { + if getOffset(reader) != int64(i+1) { t.Fatal("expected offset to be increased by one after read") } } @@ -142,12 +142,12 @@ func TestRelativeSeek(t *testing.T) { } for i := 0; i < 256; i++ { - if reader.Offset() != int64(i*4) { - t.Fatalf("offset should be %d, was %d", i*4, reader.Offset()) + if getOffset(reader) != int64(i*4) { + t.Fatalf("offset should be %d, was %d", i*4, getOffset(reader)) } out := readByte(t, reader) if int(out) != i { - t.Fatalf("expected to read: %d at %d, read %d", i, reader.Offset()-1, out) + t.Fatalf("expected to read: %d at %d, read %d", i, getOffset(reader)-1, out) } if i != 255 { _, err := reader.Seek(3, io.SeekCurrent) @@ -163,12 +163,12 @@ func TestRelativeSeek(t *testing.T) { } for i := 0; i < 256; i++ { - if reader.Offset() != int64(1020-i*4) { - t.Fatalf("offset should be %d, was %d", 1020-i*4, reader.Offset()) + if getOffset(reader) != int64(1020-i*4) { + t.Fatalf("offset should be %d, was %d", 1020-i*4, getOffset(reader)) } out := readByte(t, reader) if int(out) != 255-i { - t.Fatalf("expected to read: %d at %d, read %d", 255-i, reader.Offset()-1, out) + t.Fatalf("expected to read: %d at %d, read %d", 255-i, getOffset(reader)-1, out) } reader.Seek(-5, io.SeekCurrent) // seek 4 bytes but we read one byte every time so 5 bytes } @@ -302,3 +302,11 @@ func readByte(t testing.TB, reader DagReader) byte { return out[0] } + +func getOffset(reader DagReader) int64 { + offset, err := reader.Seek(0, io.SeekCurrent) + if err != nil { + panic("failed to retrieve offset: " + err.Error()) + } + return offset +} diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index ce53d67118..f832334092 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -225,11 +225,6 @@ func (dr *PBDagReader) Close() error { return nil } -// Offset returns the current reader offset -func (dr *PBDagReader) Offset() int64 { - return dr.offset -} - // Seek implements io.Seeker, and will seek to a given offset in the file // interface matches standard unix seek // TODO: check if we can do relative seeks, to reduce the amount of dagreader diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 731322db19..92e4ce2d6e 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -663,7 +663,7 @@ func testReadAndSeek(t *testing.T, opts testu.NodeOpts) { // skip 4 _, err = dagmod.Seek(1, io.SeekCurrent) if err != nil { - t.Fatalf("error: %s, offset %d, reader offset %d", err, dagmod.curWrOff, dagmod.read.Offset()) + t.Fatalf("error: %s, offset %d, reader offset %d", err, dagmod.curWrOff, getOffset(dagmod.read)) } //read 5,6,7 @@ -750,3 +750,11 @@ func BenchmarkDagmodWrite(b *testing.B) { } } } + +func getOffset(reader uio.DagReader) int64 { + offset, err := reader.Seek(0, io.SeekCurrent) + if err != nil { + panic("failed to retrieve offset: " + err.Error()) + } + return offset +} From d53cfdfdba8143dc13a4f20833e05ed78d69d150 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 5 Jul 2018 17:06:50 -0700 Subject: [PATCH 2090/3147] explain when a promise can be canceled in pbdagreader License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@5d60ef5eedb22a0087d25e27747e1b11bb58e575 --- unixfs/io/pbdagreader.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 9c3909577f..42d903aac2 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -110,6 +110,11 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { // In this case, the context used to *preload* the node has been canceled. // We need to retry the load with our context and we might as // well preload some extra nodes while we're at it. + // + // Note: When using `Read`, this code will never execute as + // `Read` will use the global context. It only runs if the user + // explicitly reads with a custom context (e.g., by calling + // `CtxReadFull`). dr.preload(ctx, dr.linkPosition) nxt, err = dr.promises[dr.linkPosition].Get(ctx) dr.promises[dr.linkPosition] = nil From f7b80bbbadeb97d2a9f9a4a6d93fbb3d6c607797 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 4 Jul 2018 23:12:12 -0300 Subject: [PATCH 2091/3147] pbdagreader: use FSNode instead of protobuf structure Focus on the UnixFS layer and avoid explicit references to protocol buffers format (used to serialize objects of that layer). Use the `unixfs.FSNode` structure which it abstracts from the `unixfs.pb.Data` format. Replace `PBDagReader` field `ftpb.Data` with `ft.FSNode`, renaming it to `file` (which is the type of UnixFS object represented in the reader) and changing its comment removing the "cached" reference, as this structure is not used here as a cache (`PBDagReader` doesn't modify the DAG, it's read-only). Also, removed unused `ProtoNode` field to avoid confusions, as it would normally be present if the `FSNode` was in fact used as a cache of the contents of the `ProtoNode`. An example of the advantage of shifting the focus from the format to the UnixFS layer is dropping the of use `len(pb.Blocksizes)` in favor of the more clear `NumChildren()` abstraction. Added `BlockSize()` accessor. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@c847ff39b473987b91d218dc92dfdf687e40ac70 --- unixfs/archive/tar/writer.go | 17 +++++++------- unixfs/io/dagreader.go | 9 ++++---- unixfs/io/pbdagreader.go | 45 +++++++++++++++--------------------- unixfs/unixfs.go | 6 +++++ 4 files changed, 36 insertions(+), 41 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 61ceb2e982..04eda65d49 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -16,7 +16,6 @@ import ( upb "github.com/ipfs/go-ipfs/unixfs/pb" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) // Writer is a utility structure that helps to write @@ -57,12 +56,12 @@ func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { }) } -func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error { - if err := writeFileHeader(w.TarW, fpath, pb.GetFilesize()); err != nil { +func (w *Writer) writeFile(nd *mdag.ProtoNode, fsNode *ft.FSNode, fpath string) error { + if err := writeFileHeader(w.TarW, fpath, fsNode.FileSize()); err != nil { return err } - dagr := uio.NewPBFileReader(w.ctx, nd, pb, w.Dag) + dagr := uio.NewPBFileReader(w.ctx, nd, fsNode, w.Dag) if _, err := dagr.WriteTo(w.TarW); err != nil { return err } @@ -74,12 +73,12 @@ func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { switch nd := nd.(type) { case *mdag.ProtoNode: - pb := new(upb.Data) - if err := proto.Unmarshal(nd.Data(), pb); err != nil { + fsNode, err := ft.FSNodeFromBytes(nd.Data()) + if err != nil { return err } - switch pb.GetType() { + switch fsNode.GetType() { case upb.Data_Metadata: fallthrough case upb.Data_Directory, upb.Data_HAMTShard: @@ -87,9 +86,9 @@ func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { case upb.Data_Raw: fallthrough case upb.Data_File: - return w.writeFile(nd, pb, fpath) + return w.writeFile(nd, fsNode, fpath) case upb.Data_Symlink: - return writeSymlinkHeader(w.TarW, string(pb.GetData()), fpath) + return writeSymlinkHeader(w.TarW, string(fsNode.GetData()), fpath) default: return ft.ErrUnrecognizedType } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index e3f7957321..1b4c48571a 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -11,7 +11,6 @@ import ( ftpb "github.com/ipfs/go-ipfs/unixfs/pb" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ) // Common errors @@ -45,17 +44,17 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe case *mdag.RawNode: return NewBufDagReader(n.RawData()), nil case *mdag.ProtoNode: - pb := new(ftpb.Data) - if err := proto.Unmarshal(n.Data(), pb); err != nil { + fsNode, err := ft.FSNodeFromBytes(n.Data()) + if err != nil { return nil, err } - switch pb.GetType() { + switch fsNode.GetType() { case ftpb.Data_Directory, ftpb.Data_HAMTShard: // Dont allow reading directories return nil, ErrIsDir case ftpb.Data_File, ftpb.Data_Raw: - return NewPBFileReader(ctx, n, pb, serv), nil + return NewPBFileReader(ctx, n, fsNode, serv), nil case ftpb.Data_Metadata: if len(n.Links()) == 0 { return nil, errors.New("incorrectly formatted metadata object") diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index ce53d67118..84cef04dcc 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -11,7 +11,6 @@ import ( ftpb "github.com/ipfs/go-ipfs/unixfs/pb" ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) @@ -19,11 +18,8 @@ import ( type PBDagReader struct { serv ipld.NodeGetter - // the node being read - node *mdag.ProtoNode - - // cached protobuf structure from node.Data - pbdata *ftpb.Data + // UnixFS file (it should be of type `Data_File` or `Data_Raw` only). + file *ft.FSNode // the current data buffer to be read from // will either be a bytes.Reader or a child DagReader @@ -51,18 +47,17 @@ type PBDagReader struct { var _ DagReader = (*PBDagReader)(nil) // NewPBFileReader constructs a new PBFileReader. -func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv ipld.NodeGetter) *PBDagReader { +func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, file *ft.FSNode, serv ipld.NodeGetter) *PBDagReader { fctx, cancel := context.WithCancel(ctx) curLinks := getLinkCids(n) return &PBDagReader{ - node: n, serv: serv, - buf: NewBufDagReader(pb.GetData()), + buf: NewBufDagReader(file.GetData()), promises: make([]*ipld.NodePromise, len(curLinks)), links: curLinks, ctx: fctx, cancel: cancel, - pbdata: pb, + file: file, } } @@ -105,21 +100,20 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { switch nxt := nxt.(type) { case *mdag.ProtoNode: - pb := new(ftpb.Data) - err = proto.Unmarshal(nxt.Data(), pb) + fsNode, err := ft.FSNodeFromBytes(nxt.Data()) if err != nil { return fmt.Errorf("incorrectly formatted protobuf: %s", err) } - switch pb.GetType() { + switch fsNode.GetType() { case ftpb.Data_Directory, ftpb.Data_HAMTShard: // A directory should not exist within a file return ft.ErrInvalidDirLocation case ftpb.Data_File: - dr.buf = NewPBFileReader(dr.ctx, nxt, pb, dr.serv) + dr.buf = NewPBFileReader(dr.ctx, nxt, fsNode, dr.serv) return nil case ftpb.Data_Raw: - dr.buf = NewBufDagReader(pb.GetData()) + dr.buf = NewBufDagReader(fsNode.GetData()) return nil case ftpb.Data_Metadata: return errors.New("shouldnt have had metadata object inside file") @@ -146,7 +140,7 @@ func getLinkCids(n ipld.Node) []*cid.Cid { // Size return the total length of the data from the DAG structured file. func (dr *PBDagReader) Size() uint64 { - return dr.pbdata.GetFilesize() + return dr.file.FileSize() } // Read reads data from the DAG structured file @@ -244,17 +238,14 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { return offset, nil } - // Grab cached protobuf object (solely to make code look cleaner) - pb := dr.pbdata - // left represents the number of bytes remaining to seek to (from beginning) left := offset - if int64(len(pb.Data)) >= offset { + if int64(len(dr.file.GetData())) >= offset { // Close current buf to close potential child dagreader if dr.buf != nil { dr.buf.Close() } - dr.buf = NewBufDagReader(pb.GetData()[offset:]) + dr.buf = NewBufDagReader(dr.file.GetData()[offset:]) // start reading links from the beginning dr.linkPosition = 0 @@ -263,15 +254,15 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { } // skip past root block data - left -= int64(len(pb.Data)) + left -= int64(len(dr.file.GetData())) // iterate through links and find where we need to be - for i := 0; i < len(pb.Blocksizes); i++ { - if pb.Blocksizes[i] > uint64(left) { + for i := 0; i < dr.file.NumChildren(); i++ { + if dr.file.BlockSize(i) > uint64(left) { dr.linkPosition = i break } else { - left -= int64(pb.Blocksizes[i]) + left -= int64(dr.file.BlockSize(i)) } } @@ -303,14 +294,14 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { noffset := dr.offset + offset return dr.Seek(noffset, io.SeekStart) case io.SeekEnd: - noffset := int64(dr.pbdata.GetFilesize()) - offset + noffset := int64(dr.file.FileSize()) - offset n, err := dr.Seek(noffset, io.SeekStart) // Return negative number if we can't figure out the file size. Using io.EOF // for this seems to be good(-enough) solution as it's only returned by // precalcNextBuf when we step out of file range. // This is needed for gateway to function properly - if err == io.EOF && *dr.pbdata.Type == ftpb.Data_File { + if err == io.EOF && dr.file.GetType() == ftpb.Data_File { return -1, nil } return n, err diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 3ba01fb0fc..f08da94151 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -195,6 +195,12 @@ func (n *FSNode) RemoveBlockSize(i int) { n.format.Blocksizes = append(n.format.Blocksizes[:i], n.format.Blocksizes[i+1:]...) } +// BlockSize returns the block size indexed by `i`. +// TODO: Evaluate if this function should be bounds checking. +func (n *FSNode) BlockSize(i int) uint64 { + return n.format.Blocksizes[i] +} + // GetBytes marshals this node as a protobuf message. func (n *FSNode) GetBytes() ([]byte, error) { return proto.Marshal(&n.format) From 4fe08e799b80e48006e073709789179a527349ef Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 6 Jul 2018 13:22:19 -0300 Subject: [PATCH 2092/3147] unixfs: remove `Get` prefix from `FSNode` accessors See https://golang.org/doc/effective_go.html#Getters. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@cf2e4238c9df639b533fc654aa1f863bf7372c37 --- unixfs/archive/tar/writer.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/pbdagreader.go | 14 +++++++------- unixfs/unixfs.go | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 04eda65d49..0c2df9fb1e 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -78,7 +78,7 @@ func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { return err } - switch fsNode.GetType() { + switch fsNode.Type() { case upb.Data_Metadata: fallthrough case upb.Data_Directory, upb.Data_HAMTShard: @@ -88,7 +88,7 @@ func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { case upb.Data_File: return w.writeFile(nd, fsNode, fpath) case upb.Data_Symlink: - return writeSymlinkHeader(w.TarW, string(fsNode.GetData()), fpath) + return writeSymlinkHeader(w.TarW, string(fsNode.Data()), fpath) default: return ft.ErrUnrecognizedType } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 1b4c48571a..504c0b6f09 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -49,7 +49,7 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe return nil, err } - switch fsNode.GetType() { + switch fsNode.Type() { case ftpb.Data_Directory, ftpb.Data_HAMTShard: // Dont allow reading directories return nil, ErrIsDir diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 84cef04dcc..c0aa90922c 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -52,7 +52,7 @@ func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, file *ft.FSNode, se curLinks := getLinkCids(n) return &PBDagReader{ serv: serv, - buf: NewBufDagReader(file.GetData()), + buf: NewBufDagReader(file.Data()), promises: make([]*ipld.NodePromise, len(curLinks)), links: curLinks, ctx: fctx, @@ -105,7 +105,7 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { return fmt.Errorf("incorrectly formatted protobuf: %s", err) } - switch fsNode.GetType() { + switch fsNode.Type() { case ftpb.Data_Directory, ftpb.Data_HAMTShard: // A directory should not exist within a file return ft.ErrInvalidDirLocation @@ -113,7 +113,7 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { dr.buf = NewPBFileReader(dr.ctx, nxt, fsNode, dr.serv) return nil case ftpb.Data_Raw: - dr.buf = NewBufDagReader(fsNode.GetData()) + dr.buf = NewBufDagReader(fsNode.Data()) return nil case ftpb.Data_Metadata: return errors.New("shouldnt have had metadata object inside file") @@ -240,12 +240,12 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { // left represents the number of bytes remaining to seek to (from beginning) left := offset - if int64(len(dr.file.GetData())) >= offset { + if int64(len(dr.file.Data())) >= offset { // Close current buf to close potential child dagreader if dr.buf != nil { dr.buf.Close() } - dr.buf = NewBufDagReader(dr.file.GetData()[offset:]) + dr.buf = NewBufDagReader(dr.file.Data()[offset:]) // start reading links from the beginning dr.linkPosition = 0 @@ -254,7 +254,7 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { } // skip past root block data - left -= int64(len(dr.file.GetData())) + left -= int64(len(dr.file.Data())) // iterate through links and find where we need to be for i := 0; i < dr.file.NumChildren(); i++ { @@ -301,7 +301,7 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { // for this seems to be good(-enough) solution as it's only returned by // precalcNextBuf when we step out of file range. // This is needed for gateway to function properly - if err == io.EOF && dr.file.GetType() == ftpb.Data_File { + if err == io.EOF && dr.file.Type() == ftpb.Data_File { return -1, nil } return n, err diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index f08da94151..9cd9731ed9 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -217,15 +217,15 @@ func (n *FSNode) NumChildren() int { return len(n.format.Blocksizes) } -// GetData retrieves the `Data` field from the internal `format`. -func (n *FSNode) GetData() []byte { +// Data retrieves the `Data` field from the internal `format`. +func (n *FSNode) Data() []byte { return n.format.GetData() } // SetData sets the `Data` field from the internal `format` // updating its `Filesize`. func (n *FSNode) SetData(newData []byte) { - n.UpdateFilesize(int64(len(newData) - len(n.GetData()))) + n.UpdateFilesize(int64(len(newData) - len(n.Data()))) n.format.Data = newData } @@ -237,8 +237,8 @@ func (n *FSNode) UpdateFilesize(filesizeDiff int64) { int64(n.format.GetFilesize()) + filesizeDiff)) } -// GetType retrieves the `Type` field from the internal `format`. -func (n *FSNode) GetType() pb.Data_DataType { +// Type retrieves the `Type` field from the internal `format`. +func (n *FSNode) Type() pb.Data_DataType { return n.format.GetType() } From 0b0c11a02c2f6776fc21d99aaaa926fa111af22d Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 6 Jul 2018 13:22:19 -0300 Subject: [PATCH 2093/3147] unixfs: remove `Get` prefix from `FSNode` accessors See https://golang.org/doc/effective_go.html#Getters. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@fe3a1ee72e161b07b87a46db8b34737e1e8a72c6 --- mfs/file.go | 2 +- mfs/mfs_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index f28cf79f83..40106d1daf 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -60,7 +60,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { return nil, err } - switch fsn.GetType() { + switch fsn.Type() { default: return nil, fmt.Errorf("unsupported fsnode type for 'file'") case ft.TSymlink: diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 7088c8c9cc..1d9aee46f8 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -852,7 +852,7 @@ func TestFlushing(t *testing.T) { t.Fatal(err) } - if fsnode.GetType() != ft.TDirectory { + if fsnode.Type() != ft.TDirectory { t.Fatal("root wasnt a directory") } From 52baed290a6983dcbd8b5e0ec35ec952943961b1 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 27 Jun 2018 10:29:03 -0300 Subject: [PATCH 2094/3147] unixfs: add a directory interface Add a UnixFS `Directory` that hides implementation details and helps to distinguish *what* is a UnixFS directory. Replace the `unixfs.io.Directory` structure that contained the HAMT and basic directory implementations (through inner pointers) with an interface containing the same methods. Implement those methods in two clearly distinct structures for each implementation (`BasicDirectory` and `HAMTDirectory`) avoiding pointer logic and clearly differentiating which implementation does what. The potential basic to HAMT transition was being hidden behind the `AddChild` call at the UnixFS layer (changing one implementation pointer with the other one), it is now being explicitly done at the MFS layer. Rename the `dirbuilder.go` file to `directory.go` and change the `Directory` MFS attribute `dirbuilder` to `unixfsDir` to be consistent. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@842c17b93f8829ad5a38def3daf38cf81b39d05c --- unixfs/io/dirbuilder.go | 214 -------------- unixfs/io/directory.go | 262 ++++++++++++++++++ .../{dirbuilder_test.go => directory_test.go} | 0 3 files changed, 262 insertions(+), 214 deletions(-) delete mode 100644 unixfs/io/dirbuilder.go create mode 100644 unixfs/io/directory.go rename unixfs/io/{dirbuilder_test.go => directory_test.go} (100%) diff --git a/unixfs/io/dirbuilder.go b/unixfs/io/dirbuilder.go deleted file mode 100644 index 3a36fe535e..0000000000 --- a/unixfs/io/dirbuilder.go +++ /dev/null @@ -1,214 +0,0 @@ -package io - -import ( - "context" - "fmt" - "os" - - mdag "github.com/ipfs/go-ipfs/merkledag" - format "github.com/ipfs/go-ipfs/unixfs" - hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" -) - -// ShardSplitThreshold specifies how large of an unsharded directory -// the Directory code will generate. Adding entries over this value will -// result in the node being restructured into a sharded object. -var ShardSplitThreshold = 1000 - -// UseHAMTSharding is a global flag that signifies whether or not to use the -// HAMT sharding scheme for directory creation -var UseHAMTSharding = false - -// DefaultShardWidth is the default value used for hamt sharding width. -var DefaultShardWidth = 256 - -// Directory allows to work with UnixFS directory nodes, adding and removing -// children. It allows to work with different directory schemes, -// like the classic or the HAMT one. -type Directory struct { - dserv ipld.DAGService - dirnode *mdag.ProtoNode - - shard *hamt.Shard -} - -// NewDirectory returns a Directory. It needs a DAGService to add the Children -func NewDirectory(dserv ipld.DAGService) *Directory { - db := new(Directory) - db.dserv = dserv - if UseHAMTSharding { - s, err := hamt.NewShard(dserv, DefaultShardWidth) - if err != nil { - panic(err) // will only panic if DefaultShardWidth is a bad value - } - db.shard = s - } else { - db.dirnode = format.EmptyDirNode() - } - return db -} - -// ErrNotADir implies that the given node was not a unixfs directory -var ErrNotADir = fmt.Errorf("merkledag node was not a directory or shard") - -// NewDirectoryFromNode loads a unixfs directory from the given IPLD node and -// DAGService. -func NewDirectoryFromNode(dserv ipld.DAGService, nd ipld.Node) (*Directory, error) { - pbnd, ok := nd.(*mdag.ProtoNode) - if !ok { - return nil, ErrNotADir - } - - pbd, err := format.FromBytes(pbnd.Data()) - if err != nil { - return nil, err - } - - switch pbd.GetType() { - case format.TDirectory: - return &Directory{ - dserv: dserv, - dirnode: pbnd.Copy().(*mdag.ProtoNode), - }, nil - case format.THAMTShard: - shard, err := hamt.NewHamtFromDag(dserv, nd) - if err != nil { - return nil, err - } - - return &Directory{ - dserv: dserv, - shard: shard, - }, nil - default: - return nil, ErrNotADir - } -} - -// SetPrefix sets the prefix of the root node -func (d *Directory) SetPrefix(prefix *cid.Prefix) { - if d.dirnode != nil { - d.dirnode.SetPrefix(prefix) - } - if d.shard != nil { - d.shard.SetPrefix(prefix) - } -} - -// AddChild adds a (name, key)-pair to the root node. -func (d *Directory) AddChild(ctx context.Context, name string, nd ipld.Node) error { - if d.shard == nil { - if !UseHAMTSharding { - _ = d.dirnode.RemoveNodeLink(name) - return d.dirnode.AddNodeLink(name, nd) - } - - err := d.switchToSharding(ctx) - if err != nil { - return err - } - } - - return d.shard.Set(ctx, name, nd) -} - -func (d *Directory) switchToSharding(ctx context.Context) error { - s, err := hamt.NewShard(d.dserv, DefaultShardWidth) - if err != nil { - return err - } - s.SetPrefix(&d.dirnode.Prefix) - - d.shard = s - for _, lnk := range d.dirnode.Links() { - cnd, err := d.dserv.Get(ctx, lnk.Cid) - if err != nil { - return err - } - - err = d.shard.Set(ctx, lnk.Name, cnd) - if err != nil { - return err - } - } - - d.dirnode = nil - return nil -} - -// ForEachLink applies the given function to Links in the directory. -func (d *Directory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { - if d.shard == nil { - for _, l := range d.dirnode.Links() { - if err := f(l); err != nil { - return err - } - } - return nil - } - - return d.shard.ForEachLink(ctx, f) -} - -// Links returns the all the links in the directory node. -func (d *Directory) Links(ctx context.Context) ([]*ipld.Link, error) { - if d.shard == nil { - return d.dirnode.Links(), nil - } - - return d.shard.EnumLinks(ctx) -} - -// Find returns the root node of the file named 'name' within this directory. -// In the case of HAMT-directories, it will traverse the tree. -func (d *Directory) Find(ctx context.Context, name string) (ipld.Node, error) { - if d.shard == nil { - lnk, err := d.dirnode.GetNodeLink(name) - switch err { - case mdag.ErrLinkNotFound: - return nil, os.ErrNotExist - default: - return nil, err - case nil: - } - - return d.dserv.Get(ctx, lnk.Cid) - } - - lnk, err := d.shard.Find(ctx, name) - if err != nil { - return nil, err - } - - return lnk.GetNode(ctx, d.dserv) -} - -// RemoveChild removes the child with the given name. -func (d *Directory) RemoveChild(ctx context.Context, name string) error { - if d.shard == nil { - return d.dirnode.RemoveNodeLink(name) - } - - return d.shard.Remove(ctx, name) -} - -// GetNode returns the root of this Directory -func (d *Directory) GetNode() (ipld.Node, error) { - if d.shard == nil { - return d.dirnode, nil - } - - return d.shard.Node() -} - -// GetPrefix returns the CID Prefix used -func (d *Directory) GetPrefix() *cid.Prefix { - if d.shard == nil { - return &d.dirnode.Prefix - } - - return d.shard.Prefix() -} diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go new file mode 100644 index 0000000000..31b2846ac7 --- /dev/null +++ b/unixfs/io/directory.go @@ -0,0 +1,262 @@ +package io + +import ( + "context" + "fmt" + "os" + + mdag "github.com/ipfs/go-ipfs/merkledag" + format "github.com/ipfs/go-ipfs/unixfs" + hamt "github.com/ipfs/go-ipfs/unixfs/hamt" + + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" +) + +// ShardSplitThreshold specifies how large of an unsharded directory +// the Directory code will generate. Adding entries over this value will +// result in the node being restructured into a sharded object. +var ShardSplitThreshold = 1000 + +// UseHAMTSharding is a global flag that signifies whether or not to use the +// HAMT sharding scheme for directory creation +var UseHAMTSharding = false + +// DefaultShardWidth is the default value used for hamt sharding width. +var DefaultShardWidth = 256 + +// Directory defines a UnixFS directory. It is used for creating, reading and +// editing directories. It allows to work with different directory schemes, +// like the basic or the HAMT implementation. +// +// It just allows to perform explicit edits on a single directory, working with +// directory trees is out of its scope, they are managed by the MFS layer +// (which is the main consumer of this interface). +type Directory interface { + + // SetPrefix sets the CID prefix of the root node. + SetPrefix(*cid.Prefix) + + // AddChild adds a (name, key) pair to the root node. + AddChild(context.Context, string, ipld.Node) error + + // ForEachLink applies the given function to Links in the directory. + ForEachLink(context.Context, func(*ipld.Link) error) error + + // Links returns the all the links in the directory node. + Links(context.Context) ([]*ipld.Link, error) + + // Find returns the root node of the file named 'name' within this directory. + // In the case of HAMT-directories, it will traverse the tree. + Find(context.Context, string) (ipld.Node, error) + + // RemoveChild removes the child with the given name. + RemoveChild(context.Context, string) error + + // GetNode returns the root of this directory. + GetNode() (ipld.Node, error) + + // GetPrefix returns the CID Prefix used. + GetPrefix() *cid.Prefix +} + +// TODO: Evaluate removing `dserv` from this layer and providing it in MFS. +// (The functions should in that case add a `DAGService` argument.) + +// BasicDirectory is the basic implementation of `Directory`. All the entries +// are stored in a single node. +type BasicDirectory struct { + node *mdag.ProtoNode + dserv ipld.DAGService +} + +// HAMTDirectory is the HAMT implementation of `Directory`. +// (See package `hamt` for more information.) +type HAMTDirectory struct { + shard *hamt.Shard + dserv ipld.DAGService +} + +// NewDirectory returns a Directory. It needs a `DAGService` to add the children. +func NewDirectory(dserv ipld.DAGService) Directory { + if UseHAMTSharding { + dir := new(HAMTDirectory) + s, err := hamt.NewShard(dserv, DefaultShardWidth) + if err != nil { + panic(err) // will only panic if DefaultShardWidth is a bad value + } + dir.shard = s + dir.dserv = dserv + return dir + } + + dir := new(BasicDirectory) + dir.node = format.EmptyDirNode() + dir.dserv = dserv + return dir +} + +// ErrNotADir implies that the given node was not a unixfs directory +var ErrNotADir = fmt.Errorf("merkledag node was not a directory or shard") + +// NewDirectoryFromNode loads a unixfs directory from the given IPLD node and +// DAGService. +func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, error) { + protoBufNode, ok := node.(*mdag.ProtoNode) + if !ok { + return nil, ErrNotADir + } + + fsNode, err := format.FSNodeFromBytes(protoBufNode.Data()) + if err != nil { + return nil, err + } + + switch fsNode.GetType() { + case format.TDirectory: + return &BasicDirectory{ + dserv: dserv, + node: protoBufNode.Copy().(*mdag.ProtoNode), + }, nil + case format.THAMTShard: + shard, err := hamt.NewHamtFromDag(dserv, node) + if err != nil { + return nil, err + } + return &HAMTDirectory{ + dserv: dserv, + shard: shard, + }, nil + } + + return nil, ErrNotADir +} + +// SetPrefix implements the `Directory` interface. +func (d *BasicDirectory) SetPrefix(prefix *cid.Prefix) { + d.node.SetPrefix(prefix) +} + +// AddChild implements the `Directory` interface. It adds (or replaces) +// a link to the given `node` under `name`. +func (d *BasicDirectory) AddChild(ctx context.Context, name string, node ipld.Node) error { + d.node.RemoveNodeLink(name) + // Remove old link (if it existed), don't check a potential `ErrNotFound`. + + return d.node.AddNodeLink(name, node) +} + +// ForEachLink implements the `Directory` interface. +func (d *BasicDirectory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { + for _, l := range d.node.Links() { + if err := f(l); err != nil { + return err + } + } + return nil +} + +// Links implements the `Directory` interface. +func (d *BasicDirectory) Links(ctx context.Context) ([]*ipld.Link, error) { + return d.node.Links(), nil +} + +// Find implements the `Directory` interface. +func (d *BasicDirectory) Find(ctx context.Context, name string) (ipld.Node, error) { + lnk, err := d.node.GetNodeLink(name) + if err == mdag.ErrLinkNotFound { + err = os.ErrNotExist + } + if err != nil { + return nil, err + } + + return d.dserv.Get(ctx, lnk.Cid) +} + +// RemoveChild implements the `Directory` interface. +func (d *BasicDirectory) RemoveChild(ctx context.Context, name string) error { + return d.node.RemoveNodeLink(name) +} + +// GetNode implements the `Directory` interface. +func (d *BasicDirectory) GetNode() (ipld.Node, error) { + return d.node, nil +} + +// GetPrefix implements the `Directory` interface. +func (d *BasicDirectory) GetPrefix() *cid.Prefix { + return &d.node.Prefix +} + +// SwitchToSharding returns a HAMT implementation of this directory. +func (d *BasicDirectory) SwitchToSharding(ctx context.Context) (Directory, error) { + hamtDir := new(HAMTDirectory) + hamtDir.dserv = d.dserv + + shard, err := hamt.NewShard(d.dserv, DefaultShardWidth) + if err != nil { + return nil, err + } + shard.SetPrefix(&d.node.Prefix) + hamtDir.shard = shard + + for _, lnk := range d.node.Links() { + node, err := d.dserv.Get(ctx, lnk.Cid) + if err != nil { + return nil, err + } + + err = hamtDir.shard.Set(ctx, lnk.Name, node) + if err != nil { + return nil, err + } + } + + return hamtDir, nil +} + +// SetPrefix implements the `Directory` interface. +func (d *HAMTDirectory) SetPrefix(prefix *cid.Prefix) { + d.shard.SetPrefix(prefix) +} + +// AddChild implements the `Directory` interface. +func (d *HAMTDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { + return d.shard.Set(ctx, name, nd) +} + +// ForEachLink implements the `Directory` interface. +func (d *HAMTDirectory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { + return d.shard.ForEachLink(ctx, f) +} + +// Links implements the `Directory` interface. +func (d *HAMTDirectory) Links(ctx context.Context) ([]*ipld.Link, error) { + return d.shard.EnumLinks(ctx) +} + +// Find implements the `Directory` interface. It will traverse the tree. +func (d *HAMTDirectory) Find(ctx context.Context, name string) (ipld.Node, error) { + lnk, err := d.shard.Find(ctx, name) + if err != nil { + return nil, err + } + + return lnk.GetNode(ctx, d.dserv) +} + +// RemoveChild implements the `Directory` interface. +func (d *HAMTDirectory) RemoveChild(ctx context.Context, name string) error { + return d.shard.Remove(ctx, name) +} + +// GetNode implements the `Directory` interface. +func (d *HAMTDirectory) GetNode() (ipld.Node, error) { + return d.shard.Node() +} + +// GetPrefix implements the `Directory` interface. +func (d *HAMTDirectory) GetPrefix() *cid.Prefix { + return d.shard.Prefix() +} diff --git a/unixfs/io/dirbuilder_test.go b/unixfs/io/directory_test.go similarity index 100% rename from unixfs/io/dirbuilder_test.go rename to unixfs/io/directory_test.go From 1446df77d1dd56f12280103ef1966ca284387a4b Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 27 Jun 2018 10:29:03 -0300 Subject: [PATCH 2095/3147] unixfs: add a directory interface Add a UnixFS `Directory` that hides implementation details and helps to distinguish *what* is a UnixFS directory. Replace the `unixfs.io.Directory` structure that contained the HAMT and basic directory implementations (through inner pointers) with an interface containing the same methods. Implement those methods in two clearly distinct structures for each implementation (`BasicDirectory` and `HAMTDirectory`) avoiding pointer logic and clearly differentiating which implementation does what. The potential basic to HAMT transition was being hidden behind the `AddChild` call at the UnixFS layer (changing one implementation pointer with the other one), it is now being explicitly done at the MFS layer. Rename the `dirbuilder.go` file to `directory.go` and change the `Directory` MFS attribute `dirbuilder` to `unixfsDir` to be consistent. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@c82aac7acc1a326d6917a9f3c5d249d7c55d1e58 --- mfs/dir.go | 65 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 17f09356f1..643b024d70 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -33,7 +33,9 @@ type Directory struct { lock sync.Mutex ctx context.Context - dirbuilder *uio.Directory + // UnixFS directory implementation used for creating, + // reading and editing directories. + unixfsDir uio.Directory modTime time.Time @@ -51,25 +53,25 @@ func NewDirectory(ctx context.Context, name string, node ipld.Node, parent child } return &Directory{ - dserv: dserv, - ctx: ctx, - name: name, - dirbuilder: db, - parent: parent, - childDirs: make(map[string]*Directory), - files: make(map[string]*File), - modTime: time.Now(), + dserv: dserv, + ctx: ctx, + name: name, + unixfsDir: db, + parent: parent, + childDirs: make(map[string]*Directory), + files: make(map[string]*File), + modTime: time.Now(), }, nil } // GetPrefix gets the CID prefix of the root node func (d *Directory) GetPrefix() *cid.Prefix { - return d.dirbuilder.GetPrefix() + return d.unixfsDir.GetPrefix() } // SetPrefix sets the CID prefix func (d *Directory) SetPrefix(prefix *cid.Prefix) { - d.dirbuilder.SetPrefix(prefix) + d.unixfsDir.SetPrefix(prefix) } // closeChild updates the child by the given name to the dag node 'nd' @@ -103,7 +105,7 @@ func (d *Directory) closeChildUpdate(name string, nd ipld.Node, sync bool) (*dag } func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { - nd, err := d.dirbuilder.GetNode() + nd, err := d.unixfsDir.GetNode() if err != nil { return nil, err } @@ -122,7 +124,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { } func (d *Directory) updateChild(name string, nd ipld.Node) error { - err := d.dirbuilder.AddChild(d.ctx, name, nd) + err := d.AddUnixFSChild(name, nd) if err != nil { return err } @@ -206,7 +208,7 @@ func (d *Directory) Uncache(name string) { // childFromDag searches through this directories dag node for a child link // with the given name func (d *Directory) childFromDag(name string) (ipld.Node, error) { - return d.dirbuilder.Find(d.ctx, name) + return d.unixfsDir.Find(d.ctx, name) } // childUnsync returns the child under this directory by the given name @@ -237,7 +239,7 @@ func (d *Directory) ListNames(ctx context.Context) ([]string, error) { defer d.lock.Unlock() var out []string - err := d.dirbuilder.ForEachLink(ctx, func(l *ipld.Link) error { + err := d.unixfsDir.ForEachLink(ctx, func(l *ipld.Link) error { out = append(out, l.Name) return nil }) @@ -262,7 +264,7 @@ func (d *Directory) List(ctx context.Context) ([]NodeListing, error) { func (d *Directory) ForEachEntry(ctx context.Context, f func(NodeListing) error) error { d.lock.Lock() defer d.lock.Unlock() - return d.dirbuilder.ForEachLink(ctx, func(l *ipld.Link) error { + return d.unixfsDir.ForEachLink(ctx, func(l *ipld.Link) error { c, err := d.childUnsync(l.Name) if err != nil { return err @@ -315,7 +317,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - err = d.dirbuilder.AddChild(d.ctx, name, ndir) + err = d.AddUnixFSChild(name, ndir) if err != nil { return nil, err } @@ -336,7 +338,7 @@ func (d *Directory) Unlink(name string) error { delete(d.childDirs, name) delete(d.files, name) - return d.dirbuilder.RemoveChild(d.ctx, name) + return d.unixfsDir.RemoveChild(d.ctx, name) } func (d *Directory) Flush() error { @@ -363,7 +365,7 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return err } - err = d.dirbuilder.AddChild(d.ctx, name, nd) + err = d.AddUnixFSChild(name, nd) if err != nil { return err } @@ -372,6 +374,29 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return nil } +// AddUnixFSChild adds a child to the inner UnixFS directory +// and transitions to a HAMT implementation if needed. +func (d *Directory) AddUnixFSChild(name string, node ipld.Node) error { + if uio.UseHAMTSharding { + // If the directory HAMT implementation is being used and this + // directory is actually a basic implementation switch it to HAMT. + if basicDir, ok := d.unixfsDir.(*uio.BasicDirectory); ok { + hamtDir, err := basicDir.SwitchToSharding(d.ctx) + if err != nil { + return err + } + d.unixfsDir = hamtDir + } + } + + err := d.unixfsDir.AddChild(d.ctx, name, node) + if err != nil { + return err + } + + return nil +} + func (d *Directory) sync() error { for name, dir := range d.childDirs { nd, err := dir.GetNode() @@ -426,7 +451,7 @@ func (d *Directory) GetNode() (ipld.Node, error) { return nil, err } - nd, err := d.dirbuilder.GetNode() + nd, err := d.unixfsDir.GetNode() if err != nil { return nil, err } From 747a93727c0df3c01867edfd47ae716996a8653c Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 9 Jul 2018 12:02:47 -0300 Subject: [PATCH 2096/3147] unixfs: remove unused `ShardSplitThreshold` variable License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@ba02f3faa68678b2f22f54d0b93e68e63d62c359 --- unixfs/io/directory.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 31b2846ac7..dd13e6604f 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -13,11 +13,6 @@ import ( cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) -// ShardSplitThreshold specifies how large of an unsharded directory -// the Directory code will generate. Adding entries over this value will -// result in the node being restructured into a sharded object. -var ShardSplitThreshold = 1000 - // UseHAMTSharding is a global flag that signifies whether or not to use the // HAMT sharding scheme for directory creation var UseHAMTSharding = false From 931a15e4f50736034ca8e240cfad5368ba25c3bc Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Thu, 12 Jul 2018 11:05:56 -0300 Subject: [PATCH 2097/3147] mfs: remove `sort` from `ListNames()` License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@7343516356ccd99e6d27c9c8b30dfc2c5285c2cf --- mfs/dir.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 17f09356f1..d599158128 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -6,7 +6,6 @@ import ( "fmt" "os" "path" - "sort" "sync" "time" @@ -245,8 +244,6 @@ func (d *Directory) ListNames(ctx context.Context) ([]string, error) { return nil, err } - sort.Strings(out) - return out, nil } From 9bfba3507d9e19cfdd78941deb09c5622a5927df Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 6 Oct 2017 14:17:30 +0300 Subject: [PATCH 2098/3147] filestore: add URLStore License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-filestore@9a4b9875928f566dbacc0b3ac4d6148c3d1e94c5 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 76 +++++++++++++++++++++++++++++++------ filestore/pb/Makefile | 12 +++--- filestore/pb/dataobj.pb.go | 12 +++++- filestore/pb/dataobj.proto | 1 + 6 files changed, 82 insertions(+), 23 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 66289b0686..6140451ed2 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,9 +11,9 @@ import ( "context" blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" - posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + posinfo "gx/ipfs/QmdGSfmN4wWNXVs2XiwHbpjnUikJ7HyrTJNHyYGdodyJDC/go-ipfs-posinfo" blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 9589c3dd5f..6323f49c87 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,8 +9,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + posinfo "gx/ipfs/QmdGSfmN4wWNXVs2XiwHbpjnUikJ7HyrTJNHyYGdodyJDC/go-ipfs-posinfo" blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 2e481ade90..6d4509876f 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "net/http" "os" "path/filepath" @@ -12,8 +13,8 @@ import ( dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" - posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + posinfo "gx/ipfs/QmdGSfmN4wWNXVs2XiwHbpjnUikJ7HyrTJNHyYGdodyJDC/go-ipfs-posinfo" blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" @@ -111,7 +112,6 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { if err != nil { return nil, err } - out, err := f.readDataObj(c, dobj) if err != nil { return nil, err @@ -120,6 +120,14 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(out, c) } +func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { + if !d.GetURL() { + return f.readFileDataObj(c, d) + } else { + return f.readURLDataObj(c, d) + } +} + func (f *FileManager) getDataObj(c *cid.Cid) (*pb.DataObj, error) { o, err := f.ds.Get(dshelp.CidToDsKey(c)) switch err { @@ -148,8 +156,7 @@ func unmarshalDataObj(o interface{}) (*pb.DataObj, error) { return &dobj, nil } -// reads and verifies the block -func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readFileDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { p := filepath.FromSlash(d.GetFilePath()) abspath := filepath.Join(f.root, p) @@ -187,6 +194,46 @@ func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { return outbuf, nil } +// reads and verifies the block from URL +func (f *FileManager) readURLDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { + + req, err := http.NewRequest("GET", d.GetFilePath(), nil) + if err != nil { + return nil, err + } + + req.Header.Add("Range", fmt.Sprintf("bytes=%d-%d", d.GetOffset(), d.GetOffset()+d.GetSize_()-1)) + + res, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + if res.StatusCode != http.StatusPartialContent { + return nil, fmt.Errorf("expected HTTP 206 got %d", res.StatusCode) + } + + outbuf := make([]byte, d.GetSize_()) + _, err = io.ReadFull(res.Body, outbuf) + if err == io.EOF || err == io.ErrUnexpectedEOF { + return nil, &CorruptReferenceError{StatusFileChanged, err} + } else if err != nil { + return nil, &CorruptReferenceError{StatusFileError, err} + } + res.Body.Close() + + outcid, err := c.Prefix().Sum(outbuf) + if err != nil { + return nil, err + } + + if !c.Equals(outcid) { + return nil, &CorruptReferenceError{StatusFileChanged, + fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())} + } + + return outbuf, nil +} + // Has returns if the FileManager is storing a block reference. It does not // validate the data, nor checks if the reference is valid. func (f *FileManager) Has(c *cid.Cid) (bool, error) { @@ -209,16 +256,21 @@ func (f *FileManager) Put(b *posinfo.FilestoreNode) error { func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { var dobj pb.DataObj - if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { - return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) - } + if !b.PosInfo.IsURL { + if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { + return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) + } - p, err := filepath.Rel(f.root, b.PosInfo.FullPath) - if err != nil { - return err - } + p, err := filepath.Rel(f.root, b.PosInfo.FullPath) + if err != nil { + return err + } - dobj.FilePath = proto.String(filepath.ToSlash(p)) + dobj.FilePath = proto.String(filepath.ToSlash(p)) + } else { + dobj.FilePath = proto.String(b.PosInfo.FullPath) + dobj.URL = proto.Bool(true) + } dobj.Offset = proto.Uint64(b.PosInfo.Offset) dobj.Size_ = proto.Uint64(uint64(len(b.RawData()))) diff --git a/filestore/pb/Makefile b/filestore/pb/Makefile index 5101a482d2..505f70e754 100644 --- a/filestore/pb/Makefile +++ b/filestore/pb/Makefile @@ -1,10 +1,8 @@ -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) +include mk/header.mk -all: $(GO) +PB_$(d) = $(wildcard $(d)/*.proto) +TGTS_$(d) = $(PB_$(d):.proto=.pb.go) -%.pb.go: %.proto - protoc --gogo_out=. $< +#DEPS_GO += $(TGTS_$(d)) -clean: - rm *.pb.go +include mk/footer.mk diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index fadd40c1a4..517ae1b7f5 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. -// source: dataobj.proto +// source: filestore/pb/dataobj.proto // DO NOT EDIT! /* Package datastore_pb is a generated protocol buffer package. It is generated from these files: - dataobj.proto + filestore/pb/dataobj.proto It has these top-level messages: DataObj @@ -26,6 +26,7 @@ type DataObj struct { FilePath *string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath,omitempty"` Offset *uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset,omitempty"` Size_ *uint64 `protobuf:"varint,3,opt,name=Size" json:"Size,omitempty"` + URL *bool `protobuf:"varint,4,opt,name=URL" json:"URL,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -54,6 +55,13 @@ func (m *DataObj) GetSize_() uint64 { return 0 } +func (m *DataObj) GetURL() bool { + if m != nil && m.URL != nil { + return *m.URL + } + return false +} + func init() { proto.RegisterType((*DataObj)(nil), "datastore.pb.DataObj") } diff --git a/filestore/pb/dataobj.proto b/filestore/pb/dataobj.proto index c7d7f0eea8..311042a0ed 100644 --- a/filestore/pb/dataobj.proto +++ b/filestore/pb/dataobj.proto @@ -4,4 +4,5 @@ message DataObj { optional string FilePath = 1; optional uint64 Offset = 2; optional uint64 Size = 3; + optional bool URL = 4; } From 8a95c61a8914f66d9e5a0c22c7f822b333e101d9 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 22 Jun 2018 21:39:15 -0400 Subject: [PATCH 2099/3147] Simplify code: use prefix instead of flag to determine if a url License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@6e1e3f1fd4a921d1c6d6361aee1f8c41301f0eb8 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 14 +++++++++++++- filestore/fsrefstore.go | 13 +++++++++---- filestore/pb/Makefile | 12 +++++++----- filestore/pb/dataobj.pb.go | 12 ++---------- filestore/pb/dataobj.proto | 1 - 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 6140451ed2..66289b0686 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,9 +11,9 @@ import ( "context" blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" + posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" - posinfo "gx/ipfs/QmdGSfmN4wWNXVs2XiwHbpjnUikJ7HyrTJNHyYGdodyJDC/go-ipfs-posinfo" blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 6323f49c87..8336010e55 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,8 +9,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" + posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - posinfo "gx/ipfs/QmdGSfmN4wWNXVs2XiwHbpjnUikJ7HyrTJNHyYGdodyJDC/go-ipfs-posinfo" blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) @@ -162,3 +162,15 @@ func TestDeletes(t *testing.T) { } } } + +func TestIsURL(t *testing.T) { + if !IsURL("http://www.example.com") { + t.Fatal("IsURL failed: http://www.example.com") + } + if !IsURL("https://www.example.com") { + t.Fatal("IsURL failed: https://www.example.com") + } + if IsURL("adir/afile") { + t.Fatal("IsURL recognized non-url") + } +} diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 6d4509876f..d51139536c 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -13,8 +13,8 @@ import ( dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" + posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - posinfo "gx/ipfs/QmdGSfmN4wWNXVs2XiwHbpjnUikJ7HyrTJNHyYGdodyJDC/go-ipfs-posinfo" blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" @@ -121,7 +121,7 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { } func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { - if !d.GetURL() { + if !IsURL(d.GetFilePath()) { return f.readFileDataObj(c, d) } else { return f.readURLDataObj(c, d) @@ -256,7 +256,7 @@ func (f *FileManager) Put(b *posinfo.FilestoreNode) error { func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { var dobj pb.DataObj - if !b.PosInfo.IsURL { + if !IsURL(b.PosInfo.FullPath) { if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) } @@ -269,7 +269,6 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { dobj.FilePath = proto.String(filepath.ToSlash(p)) } else { dobj.FilePath = proto.String(b.PosInfo.FullPath) - dobj.URL = proto.Bool(true) } dobj.Offset = proto.Uint64(b.PosInfo.Offset) dobj.Size_ = proto.Uint64(uint64(len(b.RawData()))) @@ -298,3 +297,9 @@ func (f *FileManager) PutMany(bs []*posinfo.FilestoreNode) error { return batch.Commit() } + +func IsURL(str string) bool { + return (len(str) > 7 && str[0] == 'h' && str[1] == 't' && str[2] == 't' && str[3] == 'p') && + ((len(str) > 8 && str[4] == 's' && str[5] == ':' && str[6] == '/' && str[7] == '/') || + (str[4] == ':' && str[5] == '/' && str[6] == '/')) +} diff --git a/filestore/pb/Makefile b/filestore/pb/Makefile index 505f70e754..5101a482d2 100644 --- a/filestore/pb/Makefile +++ b/filestore/pb/Makefile @@ -1,8 +1,10 @@ -include mk/header.mk +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) -PB_$(d) = $(wildcard $(d)/*.proto) -TGTS_$(d) = $(PB_$(d):.proto=.pb.go) +all: $(GO) -#DEPS_GO += $(TGTS_$(d)) +%.pb.go: %.proto + protoc --gogo_out=. $< -include mk/footer.mk +clean: + rm *.pb.go diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index 517ae1b7f5..fadd40c1a4 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. -// source: filestore/pb/dataobj.proto +// source: dataobj.proto // DO NOT EDIT! /* Package datastore_pb is a generated protocol buffer package. It is generated from these files: - filestore/pb/dataobj.proto + dataobj.proto It has these top-level messages: DataObj @@ -26,7 +26,6 @@ type DataObj struct { FilePath *string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath,omitempty"` Offset *uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset,omitempty"` Size_ *uint64 `protobuf:"varint,3,opt,name=Size" json:"Size,omitempty"` - URL *bool `protobuf:"varint,4,opt,name=URL" json:"URL,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -55,13 +54,6 @@ func (m *DataObj) GetSize_() uint64 { return 0 } -func (m *DataObj) GetURL() bool { - if m != nil && m.URL != nil { - return *m.URL - } - return false -} - func init() { proto.RegisterType((*DataObj)(nil), "datastore.pb.DataObj") } diff --git a/filestore/pb/dataobj.proto b/filestore/pb/dataobj.proto index 311042a0ed..c7d7f0eea8 100644 --- a/filestore/pb/dataobj.proto +++ b/filestore/pb/dataobj.proto @@ -4,5 +4,4 @@ message DataObj { optional string FilePath = 1; optional uint64 Offset = 2; optional uint64 Size = 3; - optional bool URL = 4; } From 790940edf22b24941886ea512b96d1ff57eee608 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sat, 23 Jun 2018 17:03:57 -0400 Subject: [PATCH 2100/3147] Add config option to enable urlstore. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@70bef7e2eb7bedce266eed9ea6f94366c1b58e5a --- filestore/filestore_test.go | 1 + filestore/fsrefstore.go | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 8336010e55..7f15e90097 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -23,6 +23,7 @@ func newTestFilestore(t *testing.T) (string, *Filestore) { t.Fatal(err) } fm := NewFileManager(mds, testdir) + fm.AllowFiles = true bs := blockstore.NewBlockstore(mds) fstore := NewFilestore(bs, fm) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index d51139536c..02770eee75 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -29,8 +29,10 @@ var FilestorePrefix = ds.NewKey("filestore") // to the actual location of the block data in the filesystem // (a path and an offset). type FileManager struct { - ds ds.Batching - root string + AllowFiles bool + AllowUrls bool + ds ds.Batching + root string } // CorruptReferenceError implements the error interface. @@ -52,7 +54,7 @@ func (c CorruptReferenceError) Error() string { // datastore and root. All FilestoreNodes paths are relative to the // root path given here, which is prepended for any operations. func NewFileManager(ds ds.Batching, root string) *FileManager { - return &FileManager{dsns.Wrap(ds, FilestorePrefix), root} + return &FileManager{ds: dsns.Wrap(ds, FilestorePrefix), root: root} } // AllKeysChan returns a channel from which to read the keys stored in @@ -157,6 +159,10 @@ func unmarshalDataObj(o interface{}) (*pb.DataObj, error) { } func (f *FileManager) readFileDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { + if !f.AllowFiles { + return nil, fmt.Errorf("filestore not enabled") + } + p := filepath.FromSlash(d.GetFilePath()) abspath := filepath.Join(f.root, p) @@ -196,6 +202,9 @@ func (f *FileManager) readFileDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) // reads and verifies the block from URL func (f *FileManager) readURLDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { + if !f.AllowUrls { + return nil, fmt.Errorf("urlstore not enabled") + } req, err := http.NewRequest("GET", d.GetFilePath(), nil) if err != nil { @@ -257,6 +266,9 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { var dobj pb.DataObj if !IsURL(b.PosInfo.FullPath) { + if !f.AllowFiles { + return fmt.Errorf("filestore not enabled") + } if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) } @@ -268,6 +280,9 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { dobj.FilePath = proto.String(filepath.ToSlash(p)) } else { + if !f.AllowUrls { + return fmt.Errorf("urlstore not enabled") + } dobj.FilePath = proto.String(b.PosInfo.FullPath) } dobj.Offset = proto.Uint64(b.PosInfo.Offset) From ad14507527c1e52be42bfd6c1d3b90f4dbdc3037 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 26 Jun 2018 04:56:03 -0400 Subject: [PATCH 2101/3147] Return better error code when an http request failed. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@d47eee957bb5a6f57010c8f0bc0ab27b047f85c5 --- filestore/fsrefstore.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 02770eee75..710deac032 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -215,10 +215,11 @@ func (f *FileManager) readURLDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) res, err := http.DefaultClient.Do(req) if err != nil { - return nil, err + return nil, &CorruptReferenceError{StatusFileError, err} } if res.StatusCode != http.StatusPartialContent { - return nil, fmt.Errorf("expected HTTP 206 got %d", res.StatusCode) + return nil, &CorruptReferenceError{StatusFileError, + fmt.Errorf("expected HTTP 206 got %d", res.StatusCode)} } outbuf := make([]byte, d.GetSize_()) From 2ff9b7525cb159c94fa83119e04af5f843ef7b4d Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 26 Jun 2018 15:55:36 -0400 Subject: [PATCH 2102/3147] Code cleanups to make code climate happy. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@67b4db46e3c4f0c46289fd41365eb7d4532348a1 --- filestore/fsrefstore.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 710deac032..be0be92c7d 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -123,11 +123,10 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { } func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { - if !IsURL(d.GetFilePath()) { - return f.readFileDataObj(c, d) - } else { + if IsURL(d.GetFilePath()) { return f.readURLDataObj(c, d) } + return f.readFileDataObj(c, d) } func (f *FileManager) getDataObj(c *cid.Cid) (*pb.DataObj, error) { @@ -266,7 +265,12 @@ func (f *FileManager) Put(b *posinfo.FilestoreNode) error { func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { var dobj pb.DataObj - if !IsURL(b.PosInfo.FullPath) { + if IsURL(b.PosInfo.FullPath) { + if !f.AllowUrls { + return fmt.Errorf("urlstore not enabled") + } + dobj.FilePath = proto.String(b.PosInfo.FullPath) + } else { if !f.AllowFiles { return fmt.Errorf("filestore not enabled") } @@ -280,11 +284,6 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { } dobj.FilePath = proto.String(filepath.ToSlash(p)) - } else { - if !f.AllowUrls { - return fmt.Errorf("urlstore not enabled") - } - dobj.FilePath = proto.String(b.PosInfo.FullPath) } dobj.Offset = proto.Uint64(b.PosInfo.Offset) dobj.Size_ = proto.Uint64(uint64(len(b.RawData()))) @@ -314,6 +313,8 @@ func (f *FileManager) PutMany(bs []*posinfo.FilestoreNode) error { return batch.Commit() } +// IsURL returns true if the string represents a valid URL that the +// urlstore can handle. func IsURL(str string) bool { return (len(str) > 7 && str[0] == 'h' && str[1] == 't' && str[2] == 't' && str[3] == 'p') && ((len(str) > 8 && str[4] == 's' && str[5] == ':' && str[6] == '/' && str[7] == '/') || From 330b3f760c7ae55baf9c6b81d9ec4ca3ba3fb1f9 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 26 Jun 2018 22:30:15 -0400 Subject: [PATCH 2103/3147] filestore: Return consistent err msg. when file/urlstore is not enabled. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@5d1049a8eb14fde4aa7350706603dd996b89ce11 --- filestore/filestore.go | 4 ++++ filestore/fsrefstore.go | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 66289b0686..0c80fb1d59 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -9,6 +9,7 @@ package filestore import ( "context" + "errors" blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" @@ -20,6 +21,9 @@ import ( var log = logging.Logger("filestore") +var ErrFilestoreNotEnabled = errors.New("filestore is not enabled, see https://git.io/vNItf") +var ErrUrlstoreNotEnabled = errors.New("urlstore is not enabled") + // Filestore implements a Blockstore by combining a standard Blockstore // to store regular blocks and a special Blockstore called // FileManager to store blocks which data exists in an external file. diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index be0be92c7d..98255caa78 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -159,7 +159,7 @@ func unmarshalDataObj(o interface{}) (*pb.DataObj, error) { func (f *FileManager) readFileDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { if !f.AllowFiles { - return nil, fmt.Errorf("filestore not enabled") + return nil, ErrFilestoreNotEnabled } p := filepath.FromSlash(d.GetFilePath()) @@ -202,7 +202,7 @@ func (f *FileManager) readFileDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) // reads and verifies the block from URL func (f *FileManager) readURLDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { if !f.AllowUrls { - return nil, fmt.Errorf("urlstore not enabled") + return nil, ErrUrlstoreNotEnabled } req, err := http.NewRequest("GET", d.GetFilePath(), nil) @@ -267,12 +267,12 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { if IsURL(b.PosInfo.FullPath) { if !f.AllowUrls { - return fmt.Errorf("urlstore not enabled") + return ErrUrlstoreNotEnabled } dobj.FilePath = proto.String(b.PosInfo.FullPath) } else { if !f.AllowFiles { - return fmt.Errorf("filestore not enabled") + return ErrFilestoreNotEnabled } if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) From a7ca17b2959b960399c2c4c514b2d9ae619e3855 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 29 Jun 2018 23:03:51 -0400 Subject: [PATCH 2104/3147] Address c.r. and additional tweaks. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@5693b30379c630eff9e81278e253e7b80b9548c0 --- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 7f15e90097..279a2bc821 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -171,7 +171,7 @@ func TestIsURL(t *testing.T) { if !IsURL("https://www.example.com") { t.Fatal("IsURL failed: https://www.example.com") } - if IsURL("adir/afile") { + if IsURL("adir/afile") || IsURL("http:/ /afile") || IsURL("http:/a/file") { t.Fatal("IsURL recognized non-url") } } diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 98255caa78..960fc93e83 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -314,7 +314,8 @@ func (f *FileManager) PutMany(bs []*posinfo.FilestoreNode) error { } // IsURL returns true if the string represents a valid URL that the -// urlstore can handle. +// urlstore can handle. More specifically it returns true if a string +// begins with 'http://' or 'https://'. func IsURL(str string) bool { return (len(str) > 7 && str[0] == 'h' && str[1] == 't' && str[2] == 't' && str[3] == 'p') && ((len(str) > 8 && str[4] == 's' && str[5] == ':' && str[6] == '/' && str[7] == '/') || From f6810ece90d6b0fc8d8ae2928fd6b3ce45351c1b Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 16 Jul 2018 12:27:43 -0300 Subject: [PATCH 2105/3147] unixfs: fix `FSNode` accessor in `NewDirectoryFromNode` License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@a64b190a9ae05e5639048cbdcd18952971174e72 --- unixfs/io/directory.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index dd13e6604f..5dfa1dfd01 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -107,7 +107,7 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err return nil, err } - switch fsNode.GetType() { + switch fsNode.Type() { case format.TDirectory: return &BasicDirectory{ dserv: dserv, From 3b9442bc263ec28d0058bb9bb493092371d7218f Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 16 Jul 2018 10:54:17 -0300 Subject: [PATCH 2106/3147] unixfs: refactor switch in `precalcNextBuf` Do not use `NewDagReader` just for the `RawNode` case. Treat invalid UnixFS types in the same case. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@5d5060ddffaa89464c6bd8b45bbdeca76bd962c5 --- unixfs/io/dagreader.go | 4 ++-- unixfs/io/pbdagreader.go | 16 +++++----------- unixfs/unixfs.go | 1 - 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 79cf387b24..867c4b1d9e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -3,7 +3,6 @@ package io import ( "context" "errors" - "fmt" "io" mdag "github.com/ipfs/go-ipfs/merkledag" @@ -17,6 +16,7 @@ import ( var ( ErrIsDir = errors.New("this dag node is a directory") ErrCantReadSymlinks = errors.New("cannot currently read symlinks") + ErrUnkownNodeType = errors.New("unknown node type") ) // A DagReader provides read-only read and seek acess to a unixfs file. @@ -74,6 +74,6 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe return nil, ft.ErrUnrecognizedType } default: - return nil, fmt.Errorf("unrecognized node type") + return nil, ErrUnkownNodeType } } diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 5ce2cc3bf7..5b7bceb9e6 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -106,26 +106,20 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { } switch fsNode.Type() { - case ftpb.Data_Directory, ftpb.Data_HAMTShard: - // A directory should not exist within a file - return ft.ErrInvalidDirLocation case ftpb.Data_File: dr.buf = NewPBFileReader(dr.ctx, nxt, fsNode, dr.serv) return nil case ftpb.Data_Raw: dr.buf = NewBufDagReader(fsNode.Data()) return nil - case ftpb.Data_Metadata: - return errors.New("shouldnt have had metadata object inside file") - case ftpb.Data_Symlink: - return errors.New("shouldnt have had symlink inside file") default: - return ft.ErrUnrecognizedType + return fmt.Errorf("found %s node in unexpected place", fsNode.Type().String()) } + case *mdag.RawNode: + dr.buf = NewBufDagReader(nxt.RawData()) + return nil default: - var err error - dr.buf, err = NewDagReader(ctx, nxt, dr.serv) - return err + return ErrUnkownNodeType } } diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 9cd9731ed9..bec222f0c8 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -25,7 +25,6 @@ const ( // Common errors var ( ErrMalformedFileFormat = errors.New("malformed data in file format") - ErrInvalidDirLocation = errors.New("found directory node in unexpected place") ErrUnrecognizedType = errors.New("unrecognized node type") ) From 11c54768a3a4661b3b8528b0e78221d2b673d19f Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 16 Jul 2018 11:14:27 -0300 Subject: [PATCH 2107/3147] unixfs: split `precalcNextBuf` Create new `loadBufNode` function to handle the `buf` logic which is unrelated to the main `precalcNextBuf` logic of processing promises to fetch nodes. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@0271059bc30a2f778ed9fdae7455a3a5f34185fa --- unixfs/io/pbdagreader.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 5b7bceb9e6..53d85c796b 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -98,16 +98,20 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { dr.promises[dr.linkPosition] = nil dr.linkPosition++ - switch nxt := nxt.(type) { + return dr.loadBufNode(nxt) +} + +func (dr *PBDagReader) loadBufNode(node ipld.Node) error { + switch node := node.(type) { case *mdag.ProtoNode: - fsNode, err := ft.FSNodeFromBytes(nxt.Data()) + fsNode, err := ft.FSNodeFromBytes(node.Data()) if err != nil { return fmt.Errorf("incorrectly formatted protobuf: %s", err) } switch fsNode.Type() { case ftpb.Data_File: - dr.buf = NewPBFileReader(dr.ctx, nxt, fsNode, dr.serv) + dr.buf = NewPBFileReader(dr.ctx, node, fsNode, dr.serv) return nil case ftpb.Data_Raw: dr.buf = NewBufDagReader(fsNode.Data()) @@ -116,7 +120,7 @@ func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { return fmt.Errorf("found %s node in unexpected place", fsNode.Type().String()) } case *mdag.RawNode: - dr.buf = NewBufDagReader(nxt.RawData()) + dr.buf = NewBufDagReader(node.RawData()) return nil default: return ErrUnkownNodeType From c77bbc913a81e623157de152f1cd155321c1b092 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2108/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@2c11b74e30ce605de87ce6521e48cfff6100a5ac --- unixfs/archive/archive.go | 2 +- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 4 ++-- unixfs/hamt/hamt_stress_test.go | 2 +- unixfs/hamt/hamt_test.go | 2 +- unixfs/io/dagreader.go | 2 +- unixfs/io/directory.go | 4 ++-- unixfs/io/pbdagreader.go | 4 ++-- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 6 +++--- unixfs/test/utils.go | 6 +++--- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index c32715e270..96c12f6823 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -11,7 +11,7 @@ import ( tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" uio "github.com/ipfs/go-ipfs/unixfs/io" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 0c2df9fb1e..fe5982ff4f 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -15,7 +15,7 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // Writer is a utility structure that helps to write diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 9d6c00f622..37f0fd78bf 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -30,9 +30,9 @@ import ( upb "github.com/ipfs/go-ipfs/unixfs/pb" bitfield "gx/ipfs/QmTbBs3Y3u5F69XNJzdnnc6SP5GKgcXxCDzx6w8m6piVRT/go-bitfield" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" ) diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go index c5a4fef9bd..a9361e2c22 100644 --- a/unixfs/hamt/hamt_stress_test.go +++ b/unixfs/hamt/hamt_stress_test.go @@ -11,7 +11,7 @@ import ( mdtest "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) func getNames(prefix string, count int) []string { diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 48a45c49da..4cad058bad 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -14,7 +14,7 @@ import ( dagutils "github.com/ipfs/go-ipfs/merkledag/utils" ft "github.com/ipfs/go-ipfs/unixfs" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) func shuffle(seed int64, arr []string) { diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 79cf387b24..1039f694f2 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -10,7 +10,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // Common errors diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 5dfa1dfd01..c9aaa00aaa 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -9,8 +9,8 @@ import ( format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // UseHAMTSharding is a global flag that signifies whether or not to use the diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 5ce2cc3bf7..6e74c6a5dd 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -10,8 +10,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // PBDagReader provides a way to easily read the data contained in a dag. diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 087d1b12fa..b1e574ae9e 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -7,7 +7,7 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index adc1724281..0a1ae0a964 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -14,10 +14,10 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // Common errors diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index a59aeaea58..05d66756e1 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -16,9 +16,9 @@ import ( u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // SizeSplitterGen creates a generator. From c77c8df70d4c804e1f3acd068a8ef58937e7ef9e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2109/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@2c9291a232cb0febaf3bb029694ce2fb3155d3f9 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/object.go | 4 ++-- coreiface/options/dag.go | 2 +- coreiface/path.go | 2 +- coreiface/unixfs.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 220f8df503..a77ad63672 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index 3c4dc0c3ab..158db7419d 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // DagAPI specifies the interface to IPLD diff --git a/coreiface/object.go b/coreiface/object.go index d53f4d2142..a18a38ebe5 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index b5e6dcea12..57465deee9 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) type DagPutSettings struct { diff --git a/coreiface/path.go b/coreiface/path.go index 929b97bcd9..51513772fd 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) // Path is a generic wrapper for paths used in the API. A path can be resolved diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 11e14cc849..c59451d002 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,7 +4,7 @@ import ( "context" "io" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // UnixfsAPI is the basic interface to immutable files in IPFS From 811843b35a38608328d446a9e41d20a2f0339f10 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2110/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-path@d1e9c97f47bd19d6f7ee5110f758261b68f3d75a --- path/path.go | 2 +- path/resolver/resolver.go | 4 ++-- path/resolver/resolver_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index c1b7de2a37..5622a6d051 100644 --- a/path/path.go +++ b/path/path.go @@ -6,7 +6,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) var ( diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 73ac3fa234..8c7b28b1c0 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -10,8 +10,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 1c2e0e6b93..1490681204 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -11,7 +11,7 @@ import ( "github.com/ipfs/go-ipfs/path/resolver" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From 9a31c53cd54528847ffe0593788c29aa9a1a966f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2111/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@1eddb2253315cb2444d4f953d4114098d21119b8 --- mfs/dir.go | 4 ++-- mfs/file.go | 4 ++-- mfs/mfs_test.go | 10 +++++----- mfs/ops.go | 4 ++-- mfs/repub_test.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 643b024d70..9796591d98 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -15,8 +15,8 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/file.go b/mfs/file.go index 40106d1daf..4ef16ff5d5 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -9,8 +9,8 @@ import ( ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 9ba806a03a..228c5bdc03 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -22,11 +22,11 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - chunker "gx/ipfs/QmXnzH7wowyLZy8XJxxaQCVTgLMcDXdMBznmsrmQWCyiQV/go-ipfs-chunker" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - bstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + bstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/mfs/ops.go b/mfs/ops.go index 20d2c5e749..5ae1956516 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -8,8 +8,8 @@ import ( path "github.com/ipfs/go-ipfs/path" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 0782d50c8f..bfd21deab6 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ci "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil/ci" ) diff --git a/mfs/system.go b/mfs/system.go index f87d2cb757..53a1b9eb30 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -19,8 +19,8 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ) From a777ccb8b6f6be3cf4b038f5965f89423c4d296e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2112/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@79fd48a96b34828bec0d93892d1dea4ec212f68f --- blockservice/blockservice.go | 8 ++++---- blockservice/blockservice_test.go | 8 ++++---- blockservice/test/blocks_test.go | 8 ++++---- blockservice/test/mock.go | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 38c67bbd34..6a1e5ee058 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,11 +11,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/verifcid" - blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" - exchange "gx/ipfs/QmVSe7YJbPnEmkSUKD3HxSvp8HJoyCU55hQoCMRq7N1jaK/go-ipfs-exchange-interface" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + exchange "gx/ipfs/Qmc2faLf7URkHpsbfYM4EMbr8iSAcGAe8VPgVi64HVnwji/go-ipfs-exchange-interface" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index d8bdaa9b17..e9fcfe2be6 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,10 +3,10 @@ package blockservice import ( "testing" - offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" - blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" - butil "gx/ipfs/QmYmE4kxv6uFGaWkeBAFYDuNcxzCn87pzwm6CkBkM9C8BM/go-ipfs-blocksutil" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" + butil "gx/ipfs/QmYqPGpZ9Yemr55xus9DiEztkns6Jti5XJ7hC94JbvkdqZ/go-ipfs-blocksutil" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index ee63050db1..162d573a0a 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,10 +10,10 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" - blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 425cf76596..436fe7d34e 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -6,7 +6,7 @@ import ( tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From 1b24f4c9f9444b374c2326858d7440b316a69517 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2113/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@65b6015f6d17e9d09102cc8bf81174471bc5ad29 --- pinning/pinner/gc/gc.go | 8 ++++---- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 6 +++--- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index d1dd9a6d9e..5c4ce2dee4 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -12,11 +12,11 @@ import ( pin "github.com/ipfs/go-ipfs/pin" "github.com/ipfs/go-ipfs/thirdparty/verifcid" - offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + bstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" - bstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 3bf114bd62..d29c0eb8eb 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -12,8 +12,8 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" dutils "github.com/ipfs/go-ipfs/merkledag/utils" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 9f4a397f2a..dfd5f31d45 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -9,9 +9,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 67d3c345ab..31ea21bd8e 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -12,9 +12,9 @@ import ( "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" - ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index fefda87d99..1dbc82092b 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -8,9 +8,9 @@ import ( bserv "github.com/ipfs/go-ipfs/blockservice" dag "github.com/ipfs/go-ipfs/merkledag" - offline "gx/ipfs/QmRCgkkCmf1nMrW2BLZZtjP3Xyw3GfZVYRLix9wrnW4NoR/go-ipfs-exchange-offline" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From 894663564bb892042b7419d29c2725b88f8a3849 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2114/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@8ace587362904dde87cd0d1ac7a821b661af2d4a --- namesys/ipns_resolver_validation_test.go | 8 ++++---- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- namesys/publisher_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 6 +++--- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index faf9d3e3b0..fd91af9aa2 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -9,12 +9,12 @@ import ( path "github.com/ipfs/go-ipfs/path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" - ropts "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing/options" record "gx/ipfs/QmVsp2KdPYE6M8ryzCk5KHLo3zprcY5hBDaYx6uPCFUdxA/go-libp2p-record" - mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" - offline "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/offline" + routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" + ropts "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing/options" pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" + mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" + offline "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/offline" testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" diff --git a/namesys/namesys.go b/namesys/namesys.go index 06bd212fe5..6f4b9cf4bd 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -9,8 +9,8 @@ import ( path "github.com/ipfs/go-ipfs/path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index c6584e8fcb..76573d6d6b 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,8 +10,8 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" - offroute "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/offline" pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" + offroute "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/offline" peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" diff --git a/namesys/publisher.go b/namesys/publisher.go index d057dba76a..77d593a595 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -11,7 +11,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" - routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" + routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index c96f38039c..7926fd67ee 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,10 +6,10 @@ import ( "testing" "time" - dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" - mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" + dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 19c5443b3a..2809afd357 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -8,7 +8,7 @@ import ( path "github.com/ipfs/go-ipfs/path" - mockrouting "gx/ipfs/QmWLQyLU7yopJnwMvpHM5VSMG4xmbKgcq6P246mDy9xy5E/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" diff --git a/namesys/routing.go b/namesys/routing.go index 0851aaa4fc..4598898d2a 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -8,11 +8,11 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "github.com/ipfs/go-ipfs/path" - dht "gx/ipfs/QmNg6M98bwS97SL9ArvrRxKujFps3eV6XvmKgduiYga8Bn/go-libp2p-kad-dht" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - routing "gx/ipfs/QmPpdpS9fknTBM3qHDcpayU6nYPZQeVjia2fbNrD8YWDe6/go-libp2p-routing" + dht "gx/ipfs/QmQYwRL1T9dJtdCScoeRQwwvScbJTcWqnXhq4dYQ6Cu5vX/go-libp2p-kad-dht" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" From 2719ed63ce66a637d543ac23d0befa4c50a46552 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2115/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@db42708627dd1e4dc85a214c626212bc92ecea90 --- filestore/filestore.go | 8 ++++---- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 0c80fb1d59..bdb893a5a6 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,11 +11,11 @@ import ( "context" "errors" - blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" - posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" + blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 279a2bc821..dbd384cf14 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 960fc93e83..34ddfdec9a 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,12 +10,12 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" - blocks "gx/ipfs/QmTRCUvZLiir12Qr6MV3HKfKMHX8Nf1Vddn6t2g5nsQSb9/go-block-format" - posinfo "gx/ipfs/QmUWsXLvYYDAaoAt9TPZpFX4ffHHMg46AHrz1ZLTN5ABbe/go-ipfs-posinfo" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" diff --git a/filestore/util.go b/filestore/util.go index 55a0998591..3827e2ec56 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,9 +6,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmNP2u7bofwUQptHQGPfabGWtTCbxhNLSZKqbf1uzsup9V/go-ipfs-ds-help" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" - blockstore "gx/ipfs/QmdpuJBPBZ6sLPj9BQpn3Rpi38BT2cF1QMiUfyzNWeySW4/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From e825caa2c4ddc242a12613cf6b22a56b72929c2b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 16 Jul 2018 15:16:49 -0700 Subject: [PATCH 2116/3147] update go-cid alternative to #5243 that updates go-cid and all packages that depend on it License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-verifcid@00af99ed88676bf0d3dd1c3dd74a13f24103712d --- verifcid/validate.go | 2 +- verifcid/validate_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/verifcid/validate.go b/verifcid/validate.go index cc4a761bce..6e4c80d619 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -4,7 +4,7 @@ import ( "fmt" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) var ErrPossiblyInsecureHashFunction = fmt.Errorf("potentially insecure hash functions not allowed") diff --git a/verifcid/validate_test.go b/verifcid/validate_test.go index 7407075937..a058f312cc 100644 --- a/verifcid/validate_test.go +++ b/verifcid/validate_test.go @@ -5,7 +5,7 @@ import ( mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) func TestValidateCids(t *testing.T) { From 3b1cf7aed3af88561e5b851f79d4b480c59d1ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 2 Feb 2018 16:00:37 +0100 Subject: [PATCH 2117/3147] coreapi: expand public path api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@ad6db2fc4cff3178bb50aacbe30559078661907b --- coreiface/coreapi.go | 13 +++++++++++++ coreiface/options/path.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 coreiface/options/path.go diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index a77ad63672..179531352d 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,6 +5,9 @@ package iface import ( "context" + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) @@ -37,4 +40,14 @@ type CoreAPI interface { // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node ResolveNode(context.Context, Path) (ipld.Node, error) + + // ParsePath parses string path to a Path + ParsePath(context.Context, string, ...options.ParsePathOption) (Path, error) + + // WithResolve is an option for ParsePath which when set to true tells + // ParsePath to also resolve the path + WithResolve(bool) options.ParsePathOption + + // ParseCid creates new path from the provided CID + ParseCid(*cid.Cid) Path } diff --git a/coreiface/options/path.go b/coreiface/options/path.go new file mode 100644 index 0000000000..bf6eed65b8 --- /dev/null +++ b/coreiface/options/path.go @@ -0,0 +1,30 @@ +package options + +type ParsePathSettings struct { + Resolve bool +} + +type ParsePathOption func(*ParsePathSettings) error + +func ParsePathOptions(opts ...ParsePathOption) (*ParsePathSettings, error) { + options := &ParsePathSettings{ + Resolve: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type ApiOptions struct{} + +func (api *ApiOptions) WithResolve(r bool) ParsePathOption { + return func(settings *ParsePathSettings) error { + settings.Resolve = r + return nil + } +} From 5a61226d830993d09c7d76d970b1c5a9de94f834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 8 Feb 2018 17:39:05 +0100 Subject: [PATCH 2118/3147] coreapi: separate path into two types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@79875b01300b77c8437ec0ca1b22d497edb79cd9 --- coreiface/block.go | 4 ++-- coreiface/coreapi.go | 14 ++++---------- coreiface/dag.go | 2 +- coreiface/object.go | 10 +++++----- coreiface/options/path.go | 30 ------------------------------ coreiface/path.go | 15 +++++++++++++-- coreiface/pin.go | 4 ++-- coreiface/unixfs.go | 2 +- 8 files changed, 28 insertions(+), 53 deletions(-) delete mode 100644 coreiface/options/path.go diff --git a/coreiface/block.go b/coreiface/block.go index a9e577d765..468c009478 100644 --- a/coreiface/block.go +++ b/coreiface/block.go @@ -13,13 +13,13 @@ type BlockStat interface { Size() int // Path returns path to the block - Path() Path + Path() ResolvedPath } // BlockAPI specifies the interface to the block layer type BlockAPI interface { // Put imports raw block data, hashing it using specified settings. - Put(context.Context, io.Reader, ...options.BlockPutOption) (Path, error) + Put(context.Context, io.Reader, ...options.BlockPutOption) (ResolvedPath, error) // Get attempts to resolve the path and return a reader for data in the block Get(context.Context, Path) (io.Reader, error) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 179531352d..615b039b31 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,10 +5,8 @@ package iface import ( "context" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // CoreAPI defines an unified interface to IPFS for Go programs @@ -35,19 +33,15 @@ type CoreAPI interface { Object() ObjectAPI // ResolvePath resolves the path using Unixfs resolver - ResolvePath(context.Context, Path) (Path, error) + ResolvePath(context.Context, Path) (ResolvedPath, error) // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node ResolveNode(context.Context, Path) (ipld.Node, error) // ParsePath parses string path to a Path - ParsePath(context.Context, string, ...options.ParsePathOption) (Path, error) - - // WithResolve is an option for ParsePath which when set to true tells - // ParsePath to also resolve the path - WithResolve(bool) options.ParsePathOption + ParsePath(context.Context, string) (Path, error) // ParseCid creates new path from the provided CID - ParseCid(*cid.Cid) Path + ParseCid(*cid.Cid) ResolvedPath } diff --git a/coreiface/dag.go b/coreiface/dag.go index 158db7419d..3f92ebab34 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -14,7 +14,7 @@ type DagAPI interface { // Put inserts data using specified format and input encoding. // Unless used with WithCodec or WithHash, the defaults "dag-cbor" and // "sha256" are used. - Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (Path, error) + Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (ResolvedPath, error) // Get attempts to resolve and get the node specified by the path Get(ctx context.Context, path Path) (ipld.Node, error) diff --git a/coreiface/object.go b/coreiface/object.go index a18a38ebe5..ea9aa59480 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -38,7 +38,7 @@ type ObjectAPI interface { New(context.Context, ...options.ObjectNewOption) (ipld.Node, error) // Put imports the data into merkledag - Put(context.Context, io.Reader, ...options.ObjectPutOption) (Path, error) + Put(context.Context, io.Reader, ...options.ObjectPutOption) (ResolvedPath, error) // Get returns the node for the path Get(context.Context, Path) (ipld.Node, error) @@ -55,14 +55,14 @@ type ObjectAPI interface { // AddLink adds a link under the specified path. child path can point to a // subdirectory within the patent which must be present (can be overridden // with WithCreate option). - AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (Path, error) + AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (ResolvedPath, error) // RmLink removes a link from the node - RmLink(ctx context.Context, base Path, link string) (Path, error) + RmLink(ctx context.Context, base Path, link string) (ResolvedPath, error) // AppendData appends data to the node - AppendData(context.Context, Path, io.Reader) (Path, error) + AppendData(context.Context, Path, io.Reader) (ResolvedPath, error) // SetData sets the data contained in the node - SetData(context.Context, Path, io.Reader) (Path, error) + SetData(context.Context, Path, io.Reader) (ResolvedPath, error) } diff --git a/coreiface/options/path.go b/coreiface/options/path.go deleted file mode 100644 index bf6eed65b8..0000000000 --- a/coreiface/options/path.go +++ /dev/null @@ -1,30 +0,0 @@ -package options - -type ParsePathSettings struct { - Resolve bool -} - -type ParsePathOption func(*ParsePathSettings) error - -func ParsePathOptions(opts ...ParsePathOption) (*ParsePathSettings, error) { - options := &ParsePathSettings{ - Resolve: false, - } - - for _, opt := range opts { - err := opt(options) - if err != nil { - return nil, err - } - } - return options, nil -} - -type ApiOptions struct{} - -func (api *ApiOptions) WithResolve(r bool) ParsePathOption { - return func(settings *ParsePathSettings) error { - settings.Resolve = r - return nil - } -} diff --git a/coreiface/path.go b/coreiface/path.go index 51513772fd..4cfd916deb 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -6,13 +6,24 @@ import ( // Path is a generic wrapper for paths used in the API. A path can be resolved // to a CID using one of Resolve functions in the API. +// TODO: figure out/explain namespaces type Path interface { // String returns the path as a string. String() string + + // Namespace returns the first component of the path + Namespace() string +} + +// ResolvedPath is a resolved Path +type ResolvedPath interface { // Cid returns cid referred to by path Cid() *cid.Cid + // Root returns cid of root path Root() *cid.Cid - // Resolved returns whether path has been fully resolved - Resolved() bool + + //TODO: Path remainder + + Path } diff --git a/coreiface/pin.go b/coreiface/pin.go index 5994c75868..2e119cbeae 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -9,7 +9,7 @@ import ( // Pin holds information about pinned resource type Pin interface { // Path to the pinned object - Path() Path + Path() ResolvedPath // Type of the pin Type() string @@ -27,7 +27,7 @@ type PinStatus interface { // BadPinNode is a node that has been marked as bad by Pin.Verify type BadPinNode interface { // Path is the path of the node - Path() Path + Path() ResolvedPath // Err is the reason why the node has been marked as bad Err() error diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index c59451d002..1ddc206744 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -10,7 +10,7 @@ import ( // UnixfsAPI is the basic interface to immutable files in IPFS type UnixfsAPI interface { // Add imports the data from the reader into merkledag file - Add(context.Context, io.Reader) (Path, error) + Add(context.Context, io.Reader) (ResolvedPath, error) // Cat returns a reader for the file Cat(context.Context, Path) (Reader, error) From 38520ef87802adf0c77aaece8cc9d203b65461d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 30 Mar 2018 22:21:57 +0200 Subject: [PATCH 2119/3147] coreapi: remove ctx from ParsePath, split ParseCid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@e4a333226c4cff7d76082700c14391133af6a7e5 --- coreiface/coreapi.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 615b039b31..f5e81adce6 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -40,8 +40,11 @@ type CoreAPI interface { ResolveNode(context.Context, Path) (ipld.Node, error) // ParsePath parses string path to a Path - ParsePath(context.Context, string) (Path, error) + ParsePath(string) (Path, error) - // ParseCid creates new path from the provided CID - ParseCid(*cid.Cid) ResolvedPath + // IpfsPath creates new /ipfs path from the provided CID + IpfsPath(*cid.Cid) ResolvedPath + + // IpldPath creates new /ipld path from the provided CID + IpldPath(*cid.Cid) ResolvedPath } From 620bec8b444b2c41107a2aa8a0ed39062be3b877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 30 Mar 2018 22:44:23 +0200 Subject: [PATCH 2120/3147] coreapi: path.Mutable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@bbff408d0ee7a756bce56956d0e72f0a3df6bbbc --- coreiface/path.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 4cfd916deb..bb87a6b3bc 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -6,13 +6,25 @@ import ( // Path is a generic wrapper for paths used in the API. A path can be resolved // to a CID using one of Resolve functions in the API. -// TODO: figure out/explain namespaces +// +// Paths must be prefixed with a valid prefix: +// +// * /ipfs - Immutable unixfs path (files) +// * /ipld - Immutable ipld path (data) +// * /ipns - Mutable names. Usually resolves to one of the immutable paths +//TODO: /local (MFS) type Path interface { // String returns the path as a string. String() string // Namespace returns the first component of the path Namespace() string + + // Mutable returns false if the data pointed to by this path in guaranteed + // to not change. + // + // Note that resolved mutable path can be immutable. + Mutable() bool } // ResolvedPath is a resolved Path From fcfaea81b0b6d78930617e2aea8f67935feb8fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 8 Feb 2018 17:39:05 +0100 Subject: [PATCH 2121/3147] coreapi: separate path into two types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@4a6bdd829f772fd51052d778aecc7865cd89938e --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index 5622a6d051..cc0ec31b2f 100644 --- a/path/path.go +++ b/path/path.go @@ -120,7 +120,7 @@ func ParsePath(txt string) (Path, error) { if _, err := ParseCidToPath(parts[2]); err != nil { return "", err } - } else if parts[1] != "ipns" { + } else if parts[1] != "ipns" && parts[1] != "ipld" { //TODO: make this smarter return "", ErrBadPath } From d0da662cf78f21d6e3d170b11e33da14444f838b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 3 Apr 2018 14:49:33 +0200 Subject: [PATCH 2122/3147] coreapi: path remainders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a6d0272a575722dbaef8c21c869e7625692fe7f6 --- coreiface/path.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/coreiface/path.go b/coreiface/path.go index bb87a6b3bc..b4a9f0dbd9 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -29,13 +29,14 @@ type Path interface { // ResolvedPath is a resolved Path type ResolvedPath interface { - // Cid returns cid referred to by path + // Cid returns the CID referred to by path Cid() *cid.Cid - // Root returns cid of root path + // Root returns the CID of root path Root() *cid.Cid - //TODO: Path remainder + // Remainder returns unresolved part of the path + Remainder() string Path } From 6f777edd18d4e9b990b6c449fa1b79a53acef7fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 3 Apr 2018 14:49:33 +0200 Subject: [PATCH 2123/3147] coreapi: path remainders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@e0565d2f57ad539632d63f422d657c5ddd6d1c2a --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index cc0ec31b2f..1c2bd2fe60 100644 --- a/path/path.go +++ b/path/path.go @@ -161,7 +161,7 @@ func SplitList(pth string) []string { // must be a Multihash) and return it separately. func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { parts := fpath.Segments() - if parts[0] == "ipfs" { + if parts[0] == "ipfs" || parts[0] == "ipld" { parts = parts[1:] } From d1d67409e744a2a697a3c05de0eb34b0bfbed175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 20 Apr 2018 13:56:33 +0200 Subject: [PATCH 2124/3147] coreapi: add more docs for path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@5abaad9e8573557e0bd7f3b1b45838053a85ffd7 --- coreiface/path.go | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/coreiface/path.go b/coreiface/path.go index b4a9f0dbd9..d233afae53 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -17,7 +17,9 @@ type Path interface { // String returns the path as a string. String() string - // Namespace returns the first component of the path + // Namespace returns the first component of the path. + // + // For example path "/ipfs/QmHash", calling Namespace() will return "ipfs" Namespace() string // Mutable returns false if the data pointed to by this path in guaranteed @@ -29,13 +31,29 @@ type Path interface { // ResolvedPath is a resolved Path type ResolvedPath interface { - // Cid returns the CID referred to by path + // Cid returns the CID of the object referenced by the path. + // + // Example: + // If you have 3 linked objects: QmRoot -> A -> B, and resolve path + // "/ipfs/QmRoot/A/B", the Cid method will return the CID of object B Cid() *cid.Cid - // Root returns the CID of root path + // Root returns the CID of the root object of the path + // + // Example: + // If you have 3 linked objects: QmRoot -> A -> B, and resolve path + // "/ipfs/QmRoot/A/B", the Root method will return the CID of object QmRoot Root() *cid.Cid // Remainder returns unresolved part of the path + // + // Example: + // If you have 2 linked objects: QmRoot -> A, where A is a CBOR node + // containing the following data: + // + // {"foo": {"bar": 42}} + // + // When resolving "/ipld/QmRoot/A/foo/bar", Remainder will return "foo/bar" Remainder() string Path From 26bcf6458dc875f4f89137e10a3c42efe14ecd18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 20 Apr 2018 13:31:05 +0200 Subject: [PATCH 2125/3147] coreapi: path review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@16bf087f856eda0e5ea85e871cc76d5ab47b8bb3 --- path/resolver/resolver.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 8c7b28b1c0..05341655a3 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -34,6 +34,9 @@ func (e ErrNoLink) Error() string { return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.String()) } +// ResolveOnce resolves path through a single node +type ResolveOnce func(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) + // Resolver provides path resolution to IPFS // It has a pointer to a DAGService, which is uses to resolve nodes. // TODO: now that this is more modular, try to unify this code with the @@ -41,7 +44,7 @@ func (e ErrNoLink) Error() string { type Resolver struct { DAG ipld.NodeGetter - ResolveOnce func(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) + ResolveOnce ResolveOnce } // NewBasicResolver constructs a new basic resolver. From 88c3a9e6cc05757813f6a3266244543529c58cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 12 Jun 2018 02:57:57 +0200 Subject: [PATCH 2126/3147] coreapi: more docs for ResolvedPath MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@1806f0f94a444c88f0c842e03a454619e6d42e56 --- coreiface/path.go | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/coreiface/path.go b/coreiface/path.go index d233afae53..acdcd85da7 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -29,13 +29,38 @@ type Path interface { Mutable() bool } -// ResolvedPath is a resolved Path +// ResolvedPath is a path which was resolved to the last resolvable node type ResolvedPath interface { - // Cid returns the CID of the object referenced by the path. + // Cid returns the CID of the node referenced by the path. Remainder of the + // path is guaranteed to be within the node. // - // Example: - // If you have 3 linked objects: QmRoot -> A -> B, and resolve path - // "/ipfs/QmRoot/A/B", the Cid method will return the CID of object B + // Examples: + // If you have 3 linked objects: QmRoot -> A -> B: + // + // cidB := {"foo": {"bar": 42 }} + // cidA := {"B": {"/": cidB }} + // cidRoot := {"A": {"/": cidA }} + // + // And resolve paths: + // * "/ipfs/${cidRoot}" + // * Calling Cid() will return `cidRoot` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `` + // + // * "/ipfs/${cidRoot}/A" + // * Calling Cid() will return `cidA` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `` + // + // * "/ipfs/${cidRoot}/A/B/foo" + // * Calling Cid() will return `cidB` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `foo` + // + // * "/ipfs/${cidRoot}/A/B/foo/bar" + // * Calling Cid() will return `cidB` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `foo/bar` Cid() *cid.Cid // Root returns the CID of the root object of the path @@ -43,6 +68,8 @@ type ResolvedPath interface { // Example: // If you have 3 linked objects: QmRoot -> A -> B, and resolve path // "/ipfs/QmRoot/A/B", the Root method will return the CID of object QmRoot + // + // For more examples see the documentation of Cid() method Root() *cid.Cid // Remainder returns unresolved part of the path @@ -51,9 +78,11 @@ type ResolvedPath interface { // If you have 2 linked objects: QmRoot -> A, where A is a CBOR node // containing the following data: // - // {"foo": {"bar": 42}} + // {"foo": {"bar": 42 }} // // When resolving "/ipld/QmRoot/A/foo/bar", Remainder will return "foo/bar" + // + // For more examples see the documentation of Cid() method Remainder() string Path From dad6a0d08af3a2bbca414a1ea450f760f65831f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 24 Apr 2018 02:11:46 +0200 Subject: [PATCH 2127/3147] path: add tests for ipld paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@eb2707ce812eb362b9b1942c3ca8bd6ca06c154c --- path/path.go | 5 +++-- path/path_test.go | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/path/path.go b/path/path.go index 1c2bd2fe60..1608b6ca3c 100644 --- a/path/path.go +++ b/path/path.go @@ -59,10 +59,11 @@ func (p Path) String() string { return string(p) } -// IsJustAKey returns true if the path is of the form or /ipfs/. +// IsJustAKey returns true if the path is of the form or /ipfs/, or +// /ipld/ func (p Path) IsJustAKey() bool { parts := p.Segments() - return len(parts) == 2 && parts[0] == "ipfs" + return len(parts) == 2 && (parts[0] == "ipfs" || parts[0] == "ipld") } // PopLastSegment returns a new Path without its final segment, and the final diff --git a/path/path_test.go b/path/path_test.go index b095ffd98e..db28193c8d 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -9,6 +9,9 @@ func TestPathParsing(t *testing.T) { "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": true, "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b/c/d/e/f": true, + "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, + "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": true, + "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b/c/d/e/f": true, "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b/c/d/e/f": true, "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b/c/d/e/f": true, @@ -36,6 +39,8 @@ func TestIsJustAKey(t *testing.T) { "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": false, "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": false, "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": false, + "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": false, + "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, } for p, expected := range cases { @@ -57,6 +62,7 @@ func TestPopLastSegment(t *testing.T) { "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", "a"}, "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a", "b"}, "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y/z": []string{"/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y", "z"}, + "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y/z": []string{"/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y", "z"}, } for p, expected := range cases { From 92ebd6eb7be417dec28e3c8fbc0f0bb4db65d268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 12 Jun 2018 03:52:26 +0200 Subject: [PATCH 2128/3147] coreapi: move path utils to interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@0a0e69cc424e6136e8f0a1fecabda94e7854bc7f --- coreiface/coreapi.go | 10 ----- coreiface/path.go | 87 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index f5e81adce6..82a2ebf4e3 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -6,7 +6,6 @@ import ( "context" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" ) // CoreAPI defines an unified interface to IPFS for Go programs @@ -38,13 +37,4 @@ type CoreAPI interface { // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node ResolveNode(context.Context, Path) (ipld.Node, error) - - // ParsePath parses string path to a Path - ParsePath(string) (Path, error) - - // IpfsPath creates new /ipfs path from the provided CID - IpfsPath(*cid.Cid) ResolvedPath - - // IpldPath creates new /ipld path from the provided CID - IpldPath(*cid.Cid) ResolvedPath } diff --git a/coreiface/path.go b/coreiface/path.go index acdcd85da7..e097ea3b69 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,9 +1,13 @@ package iface import ( + ipfspath "github.com/ipfs/go-ipfs/path" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) +//TODO: merge with ipfspath so we don't depend on it + // Path is a generic wrapper for paths used in the API. A path can be resolved // to a CID using one of Resolve functions in the API. // @@ -87,3 +91,86 @@ type ResolvedPath interface { Path } + +// path implements coreiface.Path +type path struct { + path ipfspath.Path +} + +// resolvedPath implements coreiface.resolvedPath +type resolvedPath struct { + path + cid *cid.Cid + root *cid.Cid + remainder string +} + +// IpfsPath creates new /ipfs path from the provided CID +func IpfsPath(c *cid.Cid) ResolvedPath { + return &resolvedPath{ + path: path{ipfspath.Path("/ipfs/" + c.String())}, + cid: c, + root: c, + remainder: "", + } +} + +// IpldPath creates new /ipld path from the provided CID +func IpldPath(c *cid.Cid) ResolvedPath { + return &resolvedPath{ + path: path{ipfspath.Path("/ipld/" + c.String())}, + cid: c, + root: c, + remainder: "", + } +} + +// ParsePath parses string path to a Path +func ParsePath(p string) (Path, error) { + pp, err := ipfspath.ParsePath(p) + if err != nil { + return nil, err + } + + return &path{path: pp}, nil +} + +// NewResolvedPath creates new ResolvedPath. This function performs no checks +// and is intended to be used by resolver implementations. Incorrect inputs may +// cause panics. Handle with care. +func NewResolvedPath(ipath ipfspath.Path, c *cid.Cid, root *cid.Cid, remainder string) ResolvedPath { + return &resolvedPath{ + path: path{ipath}, + cid: c, + root: root, + remainder: remainder, + } +} + +func (p *path) String() string { + return p.path.String() +} + +func (p *path) Namespace() string { + if len(p.path.Segments()) < 1 { + panic("path without namespace") //this shouldn't happen under any scenario + } + return p.path.Segments()[0] +} + +func (p *path) Mutable() bool { + //TODO: MFS: check for /local + return p.Namespace() == "ipns" +} + +func (p *resolvedPath) Cid() *cid.Cid { + return p.cid +} + +func (p *resolvedPath) Root() *cid.Cid { + return p.root +} + +func (p *resolvedPath) Remainder() string { + return p.remainder +} From e1fc0b91f50a5e707119bf5ca1ef71cbd452b160 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 21 Dec 2017 17:33:27 -0800 Subject: [PATCH 2129/3147] fix truncating when already at the correct size fixes #4518 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-unixfs@c543a5808437fbff3d727f648dafd294f02d477b --- unixfs/mod/dagmodifier.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0a1ae0a964..28de7228d6 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -481,6 +481,9 @@ func (dm *DagModifier) Truncate(size int64) error { if err != nil { return err } + if size == int64(realSize) { + return nil + } // Truncate can also be used to expand the file if size > int64(realSize) { From 1a7b5666f6d9d3a5584b4f7b998396d6049bb801 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 21 Dec 2017 17:33:27 -0800 Subject: [PATCH 2130/3147] fix truncating when already at the correct size fixes #4518 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@ba1bf6d729479d44ff26e9ed476dcf4372f1ab32 --- mfs/mfs_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 228c5bdc03..42a87fde46 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -1111,3 +1111,28 @@ func TestFileDescriptors(t *testing.T) { t.Fatal(err) } } + +func TestTruncateAtSize(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + dir := rt.GetDirectory() + + nd := dag.NodeWithData(ft.FilePBData(nil, 0)) + fi, err := NewFile("test", nd, dir, ds) + if err != nil { + t.Fatal(err) + } + + fd, err := fi.Open(OpenReadWrite, true) + if err != nil { + t.Fatal(err) + } + defer fd.Close() + _, err = fd.Write([]byte("test")) + if err != nil { + t.Fatal(err) + } + fd.Truncate(4) +} From 3de8b168f7d29d364b48cb0f90d8365c2acf040e Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 11 Jul 2018 12:24:37 -0300 Subject: [PATCH 2131/3147] unixfs: fix `dagTruncate` to preserve node type Extract the original `FSNode` passed inside the `ipld.Node` argument and modify its `Blocksizes` (removing all of them and re-adding the ones that were not truncated). In contrast, the replaced code was creating a new `FSNode` that was not preserving some of the features of the original one. Change `TRUNC_HASH` values in `sharness` that were created with the bug to the correct values. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@8e9a367f3200229523ddb08436a97226ad7705bb --- unixfs/mod/dagmodifier.go | 12 +++++++++--- unixfs/unixfs.go | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 28de7228d6..f8aa5ce636 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -529,7 +529,13 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi var cur uint64 end := 0 var modified ipld.Node - ndata := ft.NewFSNode(ft.TRaw) + ndata, err := ft.FSNodeFromBytes(nd.Data()) + if err != nil { + return nil, err + } + // Reset the block sizes of the node to adjust them + // with the new values of the truncated children. + ndata.RemoveAllBlockSizes() for i, lnk := range nd.Links() { child, err := lnk.GetNode(ctx, ds) if err != nil { @@ -558,7 +564,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi ndata.AddBlockSize(childsize) } - err := ds.Add(ctx, modified) + err = ds.Add(ctx, modified) if err != nil { return nil, err } @@ -573,7 +579,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi if err != nil { return nil, err } - + // Save the new block sizes to the original node. nd.SetData(d) // invalidate cache and recompute serialized data diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 9cd9731ed9..d048c422b8 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -201,6 +201,12 @@ func (n *FSNode) BlockSize(i int) uint64 { return n.format.Blocksizes[i] } +// RemoveAllBlockSizes removes all the child block sizes of this node. +func (n *FSNode) RemoveAllBlockSizes() { + n.format.Blocksizes = []uint64{} + n.format.Filesize = proto.Uint64(uint64(len(n.Data()))) +} + // GetBytes marshals this node as a protobuf message. func (n *FSNode) GetBytes() ([]byte, error) { return proto.Marshal(&n.format) From a5d1ddc7ff9a84593afb7b315e09722c70a40c09 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 11 Jul 2018 12:36:10 -0300 Subject: [PATCH 2132/3147] mfs: add test case for MFS repeated truncation failure License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@81936112ddd623a9721ac756a06790902010a631 --- mfs/mfs_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 42a87fde46..c91d77168b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -1136,3 +1136,43 @@ func TestTruncateAtSize(t *testing.T) { } fd.Truncate(4) } + +func TestTruncateAndWrite(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + dir := rt.GetDirectory() + + nd := dag.NodeWithData(ft.FilePBData(nil, 0)) + fi, err := NewFile("test", nd, dir, ds) + if err != nil { + t.Fatal(err) + } + + fd, err := fi.Open(OpenReadWrite, true) + defer fd.Close() + if err != nil { + t.Fatal(err) + } + for i := 0; i < 200; i++ { + err = fd.Truncate(0) + if err != nil { + t.Fatal(err) + } + l, err := fd.Write([]byte("test")) + if err != nil { + t.Fatal(err) + } + if l != len("test") { + t.Fatal("incorrect write length") + } + data, err := ioutil.ReadAll(fd) + if err != nil { + t.Fatal(err) + } + if string(data) != "test" { + t.Errorf("read error at read %d, read: %v", i, data) + } + } +} From 705e48b6ce9277e2c460f6f52b5c2f1797fac4d8 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 18 Jul 2018 11:07:52 -0300 Subject: [PATCH 2133/3147] unixfs/mod: add test to `Truncate` to the same size License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@999c66862f8edded0d2d8698fd9150db31f255a2 --- unixfs/mod/dagmodifier_test.go | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 92e4ce2d6e..0a5c5a74f3 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -406,6 +406,44 @@ func testDagTruncate(t *testing.T, opts testu.NodeOpts) { } } +// TestDagTruncateSameSize tests that a DAG truncated +// to the same size (i.e., doing nothing) doesn't modify +// the DAG (its hash). +func TestDagTruncateSameSize(t *testing.T) { + runAllSubtests(t, testDagTruncateSameSize) +} +func testDagTruncateSameSize(t *testing.T, opts testu.NodeOpts) { + dserv := testu.GetDAGServ() + _, n := testu.GetRandomNode(t, dserv, 50000, opts) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + // Copied from `TestDagTruncate`. + + size, err := dagmod.Size() + if err != nil { + t.Fatal(err) + } + + err = dagmod.Truncate(size) + if err != nil { + t.Fatal(err) + } + + modifiedNode, err := dagmod.GetNode() + if err != nil { + t.Fatal(err) + } + + if modifiedNode.Cid().Equals(n.Cid()) == false { + t.Fatal("the node has been modified!") + } +} + func TestSparseWrite(t *testing.T) { runAllSubtests(t, testSparseWrite) } From 6fe2ecdbdb06e38cb66705da1fc60970463dcfc2 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Thu, 19 Jul 2018 00:18:00 -0300 Subject: [PATCH 2134/3147] mfs: seek to 0 before reading in `TestTruncateAndWrite` License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-mfs@44c3f289034d6aa6b3391a747a8e04d6b284c06a --- mfs/mfs_test.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index c91d77168b..6950d927a1 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -1167,12 +1167,18 @@ func TestTruncateAndWrite(t *testing.T) { if l != len("test") { t.Fatal("incorrect write length") } + + _, err = fd.Seek(0, io.SeekStart) + if err != nil { + t.Fatal(err) + } + data, err := ioutil.ReadAll(fd) if err != nil { t.Fatal(err) } if string(data) != "test" { - t.Errorf("read error at read %d, read: %v", i, data) + t.Fatalf("read error at read %d, read: %v", i, data) } } } From 3c2847dd5407669207a145493cb8020486bbe5c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 21 Jul 2018 14:58:16 +0200 Subject: [PATCH 2135/3147] Fix resolving links in sharded directories on gateway MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@cfe5d61c926324e0e06f7e452c5268e87e180e2e --- path/resolver/resolver.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 05341655a3..2aa247645d 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -69,19 +69,25 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld } for len(p) > 0 { - val, rest, err := nd.Resolve(p) + lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) if err != nil { return nil, nil, err } - switch val := val.(type) { - case *ipld.Link: - next, err := val.GetNode(ctx, r.DAG) + if lnk != nil { + next, err := lnk.GetNode(ctx, r.DAG) if err != nil { return nil, nil, err } nd = next p = rest + continue + } + + val, rest, err := nd.Resolve(p) + switch val.(type) { + case *ipld.Link: + return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") default: return nd, p, nil } From f78c2183b20eb2363faf63ee542615c90271e0ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 21 Jul 2018 17:29:18 +0200 Subject: [PATCH 2136/3147] path: fix dag tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@53c234382a1591917281ad7167bf775192ab4607 --- path/resolver/resolver.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 2aa247645d..e7a95a83e0 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -70,11 +70,11 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld for len(p) > 0 { lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) - if err != nil { - return nil, nil, err - } - if lnk != nil { + if err != nil { + return nil, nil, err + } + next, err := lnk.GetNode(ctx, r.DAG) if err != nil { return nil, nil, err @@ -85,6 +85,9 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld } val, rest, err := nd.Resolve(p) + if err != nil { + return nil, nil, err + } switch val.(type) { case *ipld.Link: return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") From f79cb379904debf7f4f1600e5503d8fd0638041b Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 22 Jul 2018 23:02:19 -0300 Subject: [PATCH 2137/3147] test: testLargeWriteChunks: seek before reading License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@07e655d8d25637a2bbd700486baa7977628dd529 --- unixfs/mod/dagmodifier_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 0a5c5a74f3..3e460aec51 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -323,6 +323,11 @@ func testLargeWriteChunks(t *testing.T, opts testu.NodeOpts) { } } + _, err = dagmod.Seek(0, io.SeekStart) + if err != nil { + t.Fatal(err) + } + out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) From dd26bd965008263ee60b4bc4690ad56d5ab98213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 23 Jul 2018 17:37:33 +0200 Subject: [PATCH 2138/3147] path: simplify ResolveToLastNode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@797c0c4f99cf6e81d18aa2f3fd144307ee6c24ec --- path/resolver/resolver.go | 46 +++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index e7a95a83e0..7bd8caff9a 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -70,33 +70,41 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld for len(p) > 0 { lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) - if lnk != nil { - if err != nil { - return nil, nil, err - } - - next, err := lnk.GetNode(ctx, r.DAG) - if err != nil { - return nil, nil, err - } - nd = next - p = rest - continue + if lnk == nil { + break } - val, rest, err := nd.Resolve(p) if err != nil { return nil, nil, err } - switch val.(type) { - case *ipld.Link: - return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") - default: - return nd, p, nil + + next, err := lnk.GetNode(ctx, r.DAG) + if err != nil { + return nil, nil, err } + nd = next + p = rest } - return nd, nil, nil + if len(p) == 0 { + return nd, nil, nil + } + + // Confirm the path exists within the object + val, rest, err := nd.Resolve(p) + if err != nil { + return nil, nil, err + } + + if len(rest) > 0 { + return nil, nil, errors.New("path failed to resolve fully") + } + switch val.(type) { + case *ipld.Link: + return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") + default: + return nd, p, nil + } } // ResolvePath fetches the node for given path. It returns the last item From 2ba993c8367e25823638587c2a12aebcd7547710 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 23 Jul 2018 11:17:49 -0700 Subject: [PATCH 2139/3147] use ipfs/bbloom gxed is for gxed packages, not full forks This commit was moved from ipfs/go-ipfs-blockstore@480752aa6678f6023e0c5f6633b110a87fbb774f --- blockstore/bloom_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 7dd0bbe9fa..927ad1204d 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -5,7 +5,7 @@ import ( "sync/atomic" "time" - bloom "github.com/gxed/bbloom" + bloom "github.com/ipfs/bbloom" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" metrics "github.com/ipfs/go-metrics-interface" From ddd029560a8e3061cffb465ed9789e6cd14438f3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 20 Jul 2018 21:07:58 -0700 Subject: [PATCH 2140/3147] gx update deps Updates: * go-net * go-text * dns * prometheus * protobuf (golang, not gogo) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@ba23147771e5b9769f0ff077d9f29892c40ae929 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 2 +- filestore/fsrefstore.go | 4 ++-- filestore/util.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index bdb893a5a6..61562cd125 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,10 +11,10 @@ import ( "context" "errors" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index dbd384cf14..de7cf87dd9 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -9,9 +9,9 @@ import ( dag "github.com/ipfs/go-ipfs/merkledag" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 34ddfdec9a..1ea0f359c5 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,11 +10,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - proto "gx/ipfs/QmT6n4mspWYEya864BhCUJEgyxiRfmiSY9ruQwTUNpRKaM/protobuf/proto" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + proto "gx/ipfs/QmZHU2gx42NPTYXzw6pJkuX6xCE7bKECp6e8QcPdoLx8sx/protobuf/proto" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" diff --git a/filestore/util.go b/filestore/util.go index 3827e2ec56..96acd28521 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,8 +6,8 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" From 6972bc843e553428e4531c331c24400cf9b091f4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 20 Jul 2018 21:07:58 -0700 Subject: [PATCH 2141/3147] gx update deps Updates: * go-net * go-text * dns * prometheus * protobuf (golang, not gogo) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-blockservice@f18ba427ca96f0db93d1be8dd47017ac3fe2378b --- blockservice/blockservice.go | 2 +- blockservice/blockservice_test.go | 4 ++-- blockservice/test/blocks_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 6a1e5ee058..c4502c9754 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,9 +11,9 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/verifcid" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" exchange "gx/ipfs/Qmc2faLf7URkHpsbfYM4EMbr8iSAcGAe8VPgVi64HVnwji/go-ipfs-exchange-interface" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index e9fcfe2be6..e94f4a3fe8 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,10 +3,10 @@ package blockservice import ( "testing" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" - offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" butil "gx/ipfs/QmYqPGpZ9Yemr55xus9DiEztkns6Jti5XJ7hC94JbvkdqZ/go-ipfs-blocksutil" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 162d573a0a..19a2e54f04 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -10,10 +10,10 @@ import ( . "github.com/ipfs/go-ipfs/blockservice" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" - offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) From 1a9ed1ec26a7fcd8341e94b448c343517173abcd Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 20 Jul 2018 21:07:58 -0700 Subject: [PATCH 2142/3147] gx update deps Updates: * go-net * go-text * dns * prometheus * protobuf (golang, not gogo) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@c74ffe1726e8d3125b987554f1b0a877de4614e1 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 5c4ce2dee4..e01321c657 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -12,10 +12,10 @@ import ( pin "github.com/ipfs/go-ipfs/pin" "github.com/ipfs/go-ipfs/thirdparty/verifcid" - bstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" - offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + bstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index dfd5f31d45..f832e0a72c 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -9,9 +9,9 @@ import ( mdag "github.com/ipfs/go-ipfs/merkledag" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" - offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 1dbc82092b..b2fe149a48 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -8,9 +8,9 @@ import ( bserv "github.com/ipfs/go-ipfs/blockservice" dag "github.com/ipfs/go-ipfs/merkledag" - blockstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" - offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From 37d0438b958107cd5d4823d9c70ca78b889c80e8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 20 Jul 2018 21:07:58 -0700 Subject: [PATCH 2143/3147] gx update deps Updates: * go-net * go-text * dns * prometheus * protobuf (golang, not gogo) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@d482cfb062eef3ad7cab264cae5ab8603e4bf08f --- mfs/mfs_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 6950d927a1..d2f22bcd4c 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -22,11 +22,11 @@ import ( uio "github.com/ipfs/go-ipfs/unixfs/io" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - bstore "gx/ipfs/QmRatnbGjPcoyzVjfixMZnuT1xQbjM7FgnL6FX4CKJeDE2/go-ipfs-blockstore" - offline "gx/ipfs/QmShbyKV9P7QuFecDHXsgrQ4rxxm71MUkGVpwedT4VQ8Bf/go-ipfs-exchange-offline" + offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + bstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) From 2cd26284a6dbb2677dadbf12b1c55ef5d23dd481 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 20 Jul 2018 21:07:58 -0700 Subject: [PATCH 2144/3147] gx update deps Updates: * go-net * go-text * dns * prometheus * protobuf (golang, not gogo) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@fb4197fd6a50c341b5a225a8e44db0c49300d267 --- namesys/republisher/repub_test.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 623a1b1e04..d26cccb66b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -13,7 +13,7 @@ import ( path "github.com/ipfs/go-ipfs/path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmZ86eLPtXkQ1Dfa992Q8NpXArUoWWh3y728JDcWvzRrvC/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmY51bqSM5XgxQZqsBrQcRkKTnCb8EKpJpR9K6Qax7Njco/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" ) diff --git a/namesys/routing.go b/namesys/routing.go index 4598898d2a..4204ddcdee 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,7 +9,7 @@ import ( path "github.com/ipfs/go-ipfs/path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dht "gx/ipfs/QmQYwRL1T9dJtdCScoeRQwwvScbJTcWqnXhq4dYQ6Cu5vX/go-libp2p-kad-dht" + dht "gx/ipfs/QmTktQYCKzQjhxF6dk5xJPRuhHn3JBiKGvMLoiDy1mYmxC/go-libp2p-kad-dht" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" From 9b211137457cf4fd72846380bcde7990a8456c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 23 Jul 2018 21:29:09 +0200 Subject: [PATCH 2145/3147] path: add a comment on dropping error in ResolveToLastNode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-path@55d55685ab606642e44b3f5c21ab1677532bd104 --- path/resolver/resolver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 7bd8caff9a..af6b8628cf 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -70,6 +70,10 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld for len(p) > 0 { lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) + + // Note: have to drop the error here as `ResolveOnce` doesn't handle 'leaf' + // paths (so e.g. for `echo '{"foo":123}' | ipfs dag put` we wouldn't be + // able to resolve `zdpu[...]/foo`) if lnk == nil { break } From 63954a0cb8837c2a523dfd39c48d0def4d0e70d9 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 25 Jul 2018 14:51:49 -0400 Subject: [PATCH 2146/3147] urlstore: Accept "200 OK" in addition to "206 Partial Content". Some servers seem to return 200 OK when range header covers entire file. If the content is wrong we will detect later so there is no harm in accepting either response. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@e0c9aaba529ad36279d108c7c04cf7cc340191c2 --- filestore/fsrefstore.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 34ddfdec9a..82922450d7 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -216,9 +216,9 @@ func (f *FileManager) readURLDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) if err != nil { return nil, &CorruptReferenceError{StatusFileError, err} } - if res.StatusCode != http.StatusPartialContent { + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusPartialContent { return nil, &CorruptReferenceError{StatusFileError, - fmt.Errorf("expected HTTP 206 got %d", res.StatusCode)} + fmt.Errorf("expected HTTP 200 or 206 got %d", res.StatusCode)} } outbuf := make([]byte, d.GetSize_()) From 0d5a02940e34b5644f801f73e86ccfc3e41ebeb9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jul 2018 17:48:49 -0700 Subject: [PATCH 2147/3147] gx deps This commit was moved from ipfs/go-verifcid@3bed62765519ddd6b623f3d927817b0740edf89c --- verifcid/validate.go | 4 ++-- verifcid/validate_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/verifcid/validate.go b/verifcid/validate.go index 6e4c80d619..34db44ffc6 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -3,8 +3,8 @@ package verifcid import ( "fmt" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + cid "github.com/ipfs/go-cid" + mh "github.com/multiformats/go-multihash" ) var ErrPossiblyInsecureHashFunction = fmt.Errorf("potentially insecure hash functions not allowed") diff --git a/verifcid/validate_test.go b/verifcid/validate_test.go index a058f312cc..4b53ce183a 100644 --- a/verifcid/validate_test.go +++ b/verifcid/validate_test.go @@ -3,9 +3,9 @@ package verifcid import ( "testing" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + mh "github.com/multiformats/go-multihash" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + cid "github.com/ipfs/go-cid" ) func TestValidateCids(t *testing.T) { From d2d8182055284e9de14ef9447bf2dfb06bc01731 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jul 2018 18:15:35 -0700 Subject: [PATCH 2148/3147] packageify This commit was moved from ipfs/go-blockservice@1f90737285921227dce9f78b0b9a386182fb5fa3 --- blockservice/LICENSE | 21 ++++++++++++++++++++ blockservice/README.md | 33 +++++++++++++++++++++++++++++++ blockservice/blockservice.go | 10 +++++----- blockservice/blockservice_test.go | 12 +++++------ blockservice/test/blocks_test.go | 16 +++++++-------- blockservice/test/mock.go | 10 +++++----- 6 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 blockservice/LICENSE create mode 100644 blockservice/README.md diff --git a/blockservice/LICENSE b/blockservice/LICENSE new file mode 100644 index 0000000000..7d5dcac4d2 --- /dev/null +++ b/blockservice/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Juan Batiz-Benet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/blockservice/README.md b/blockservice/README.md new file mode 100644 index 0000000000..0ec2aef878 --- /dev/null +++ b/blockservice/README.md @@ -0,0 +1,33 @@ +go-blockservice +================== + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![Coverage Status](https://codecov.io/gh/ipfs/go-block-format/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-block-format/branch/master) +[![Travis CI](https://travis-ci.org/ipfs/go-block-format.svg?branch=master)](https://travis-ci.org/ipfs/go-block-format) + +> go-blockservice provides a seamless interface to both local and remote storage backends. + + +## Table of Contents + +- [TODO](#todo) +- [Contribute](#contribute) +- [License](#license) + +## TODO + +The interfaces here really would like to be merged with the blockstore interfaces. +The 'dagservice' constructor currently takes a blockservice, but it would be really nice +if it could just take a blockstore, and have this package implement a blockstore. + +## Contribute + +PRs are welcome! + +Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Juan Batiz-Benet diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index c4502c9754..818b44827d 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -11,11 +11,11 @@ import ( "github.com/ipfs/go-ipfs/thirdparty/verifcid" - blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" - exchange "gx/ipfs/Qmc2faLf7URkHpsbfYM4EMbr8iSAcGAe8VPgVi64HVnwji/go-ipfs-exchange-interface" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + blockstore "github.com/ipfs/go-ipfs-blockstore" + exchange "github.com/ipfs/go-ipfs-exchange-interface" + logging "github.com/ipfs/go-log" ) var log = logging.Logger("blockservice") diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index e94f4a3fe8..fd64eb60ca 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -3,12 +3,12 @@ package blockservice import ( "testing" - offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" - blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" - butil "gx/ipfs/QmYqPGpZ9Yemr55xus9DiEztkns6Jti5XJ7hC94JbvkdqZ/go-ipfs-blocksutil" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" + blocks "github.com/ipfs/go-block-format" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + blockstore "github.com/ipfs/go-ipfs-blockstore" + butil "github.com/ipfs/go-ipfs-blocksutil" + offline "github.com/ipfs/go-ipfs-exchange-offline" ) func TestWriteThroughWorks(t *testing.T) { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 19a2e54f04..c3faa02c32 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -7,15 +7,15 @@ import ( "testing" "time" - . "github.com/ipfs/go-ipfs/blockservice" + . "github.com/ipfs/go-blockservice" - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" - blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + blockstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" + u "github.com/ipfs/go-ipfs-util" ) func newObject(data []byte) blocks.Block { diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 436fe7d34e..9638f3cb3c 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -1,12 +1,12 @@ package bstest import ( - . "github.com/ipfs/go-ipfs/blockservice" - bitswap "github.com/ipfs/go-ipfs/exchange/bitswap" - tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet" + . "github.com/ipfs/go-blockservice" - delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay" - mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" + bitswap "github.com/ipfs/go-bitswap" + tn "github.com/ipfs/go-bitswap/testnet" + delay "github.com/ipfs/go-ipfs-delay" + mockrouting "github.com/ipfs/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices From fe29b758a7aebda5840b9dd6482540cc22119b95 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jul 2018 18:17:40 -0700 Subject: [PATCH 2149/3147] fix import This commit was moved from ipfs/go-blockservice@e843ff02576f4b9506b28151f970d266054799ec --- blockservice/blockservice.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 818b44827d..d5c18824ab 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -9,13 +9,12 @@ import ( "fmt" "io" - "github.com/ipfs/go-ipfs/thirdparty/verifcid" - blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" logging "github.com/ipfs/go-log" + "github.com/ipfs/go-verifcid" ) var log = logging.Logger("blockservice") From b476542bc131d8a52e1a80e94b481a26b1371627 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jul 2018 18:21:06 -0700 Subject: [PATCH 2150/3147] Extract blockservice and verifcid License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@9ec1c02f6731ea52ea137447b6247bf580e8480f --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index e01321c657..eb30016eee 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -7,11 +7,11 @@ import ( "fmt" "strings" - bserv "github.com/ipfs/go-ipfs/blockservice" dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" - "github.com/ipfs/go-ipfs/thirdparty/verifcid" + bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" + "gx/ipfs/QmQwgv79RHrRnoXmhnpC1BPtY55HHeneGMpPwmmBU1fUAG/go-verifcid" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index f832e0a72c..ae6ace111e 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "github.com/ipfs/go-ipfs/blockservice" mdag "github.com/ipfs/go-ipfs/merkledag" + bs "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index b2fe149a48..c477a71d7a 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "github.com/ipfs/go-ipfs/blockservice" dag "github.com/ipfs/go-ipfs/merkledag" + bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" From b00462ee170142ad305da15bb3c200f9f0202e4b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jul 2018 18:21:06 -0700 Subject: [PATCH 2151/3147] Extract blockservice and verifcid License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@a53d46f644a2d95db67ce1161c29b49f720efcae --- mfs/mfs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index d2f22bcd4c..e1af70d158 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,12 +14,12 @@ import ( "testing" "time" - bserv "github.com/ipfs/go-ipfs/blockservice" importer "github.com/ipfs/go-ipfs/importer" dag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" From c56e4bf63aa342de8146d56cb926f72453ed9fbe Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jul 2018 13:12:13 -0700 Subject: [PATCH 2152/3147] move dagutils package to top level in preparation for merkledag extraction License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@a5958d1b3604afded9ee5256cc32e84906a3fa2e --- unixfs/hamt/hamt_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 4cad058bad..4265170ef5 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -9,9 +9,9 @@ import ( "testing" "time" + "github.com/ipfs/go-ipfs/dagutils" dag "github.com/ipfs/go-ipfs/merkledag" mdtest "github.com/ipfs/go-ipfs/merkledag/test" - dagutils "github.com/ipfs/go-ipfs/merkledag/utils" ft "github.com/ipfs/go-ipfs/unixfs" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" From bf9473ac8dedff247cd6085c64ff195c3d14c773 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 27 Jul 2018 13:12:13 -0700 Subject: [PATCH 2153/3147] move dagutils package to top level in preparation for merkledag extraction License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@a33b22a8440b08e8a23d9abfb36fd0f4ddea9319 --- pinning/pinner/pin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d29c0eb8eb..faa6e1f9d7 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -9,8 +9,8 @@ import ( "sync" "time" + "github.com/ipfs/go-ipfs/dagutils" mdag "github.com/ipfs/go-ipfs/merkledag" - dutils "github.com/ipfs/go-ipfs/merkledag/utils" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" @@ -518,7 +518,7 @@ func (p *pinner) Update(ctx context.Context, from, to *cid.Cid, unpin bool) erro return fmt.Errorf("'from' cid was not recursively pinned already") } - err := dutils.DiffEnumerate(ctx, p.dserv, from, to) + err := dagutils.DiffEnumerate(ctx, p.dserv, from, to) if err != nil { return err } From 949f541960afb20258c72e10ed229bb3b0f615ba Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 00:50:53 -0700 Subject: [PATCH 2154/3147] Extract dagservice, move dagutils to top level License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-path@d0099ffab2e5aac820dec085fa4cf0debf1b2ebe --- path/resolver/resolver.go | 2 +- path/resolver/resolver_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index af6b8628cf..252fd48ac8 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -7,8 +7,8 @@ import ( "fmt" "time" - dag "github.com/ipfs/go-ipfs/merkledag" path "github.com/ipfs/go-ipfs/path" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 1490681204..ccf00a4e31 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" - merkledag "github.com/ipfs/go-ipfs/merkledag" - dagmock "github.com/ipfs/go-ipfs/merkledag/test" path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/path/resolver" + merkledag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dagmock "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" From d993ebc06ae990b35610fe09107c20798c6fbaa7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 00:50:53 -0700 Subject: [PATCH 2155/3147] Extract dagservice, move dagutils to top level License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@063b6bd4a7f0028ff8f9a97bc78248307da25f82 --- mfs/dir.go | 2 +- mfs/file.go | 2 +- mfs/mfs_test.go | 2 +- mfs/system.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index a98ce859ec..b2f9f5dffa 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,10 +9,10 @@ import ( "sync" "time" - dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" ufspb "github.com/ipfs/go-ipfs/unixfs/pb" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/file.go b/mfs/file.go index 4ef16ff5d5..41bd1f2ede 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,9 +5,9 @@ import ( "fmt" "sync" - dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" mod "github.com/ipfs/go-ipfs/unixfs/mod" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index e1af70d158..eeef69a58a 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -15,11 +15,11 @@ import ( "time" importer "github.com/ipfs/go-ipfs/importer" - dag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/mfs/system.go b/mfs/system.go index 53a1b9eb30..8fe8f32212 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,8 +16,8 @@ import ( "sync" "time" - dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" From 0109685612153edb4d0d148145cb3cb96da6fe6f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 00:50:53 -0700 Subject: [PATCH 2156/3147] Extract dagservice, move dagutils to top level License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@c008ff3d33c775ed673ef4d0d12949c761289749 --- unixfs/archive/tar/writer.go | 2 +- unixfs/hamt/hamt.go | 2 +- unixfs/hamt/hamt_stress_test.go | 2 +- unixfs/hamt/hamt_test.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/dagreader_test.go | 2 +- unixfs/io/directory.go | 2 +- unixfs/io/directory_test.go | 2 +- unixfs/io/pbdagreader.go | 2 +- unixfs/io/resolve.go | 2 +- unixfs/mod/dagmodifier.go | 2 +- unixfs/test/utils.go | 4 ++-- unixfs/unixfs.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index fe5982ff4f..d0a30c0d6d 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -10,10 +10,10 @@ import ( "path" "time" - mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" upb "github.com/ipfs/go-ipfs/unixfs/pb" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 37f0fd78bf..f4013884c8 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -25,9 +25,9 @@ import ( "fmt" "os" - dag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" upb "github.com/ipfs/go-ipfs/unixfs/pb" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" bitfield "gx/ipfs/QmTbBs3Y3u5F69XNJzdnnc6SP5GKgcXxCDzx6w8m6piVRT/go-bitfield" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go index a9361e2c22..311f6f0d35 100644 --- a/unixfs/hamt/hamt_stress_test.go +++ b/unixfs/hamt/hamt_stress_test.go @@ -8,8 +8,8 @@ import ( "testing" "time" - mdtest "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 4265170ef5..ed6eaf70db 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -10,9 +10,9 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - dag "github.com/ipfs/go-ipfs/merkledag" - mdtest "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8a43fc981c..0ef962f51f 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -5,9 +5,9 @@ import ( "errors" "io" - mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 8c73b1948b..f2b0b0af66 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - mdag "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/unixfs" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" context "context" diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index c9aaa00aaa..6f07aff045 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -5,9 +5,9 @@ import ( "fmt" "os" - mdag "github.com/ipfs/go-ipfs/merkledag" format "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 3518972968..4df5a031bc 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" - mdtest "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" ) func TestEmptyNode(t *testing.T) { diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 3860b7c961..93c852e624 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -6,9 +6,9 @@ import ( "fmt" "io" - mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" ftpb "github.com/ipfs/go-ipfs/unixfs/pb" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index b1e574ae9e..68476d9ed3 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -3,9 +3,9 @@ package io import ( "context" - dag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" hamt "github.com/ipfs/go-ipfs/unixfs/hamt" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index f8aa5ce636..f87e355342 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -10,9 +10,9 @@ import ( help "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" - mdag "github.com/ipfs/go-ipfs/merkledag" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 05d66756e1..b5e243f3a1 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -10,9 +10,9 @@ import ( h "github.com/ipfs/go-ipfs/importer/helpers" trickle "github.com/ipfs/go-ipfs/importer/trickle" - mdag "github.com/ipfs/go-ipfs/merkledag" - mdagmock "github.com/ipfs/go-ipfs/merkledag/test" ft "github.com/ipfs/go-ipfs/unixfs" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdagmock "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 3e3344af35..cbae3ea0f5 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -8,8 +8,8 @@ import ( proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - dag "github.com/ipfs/go-ipfs/merkledag" pb "github.com/ipfs/go-ipfs/unixfs/pb" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" ) // Shorthands for protobuffer types From b93c24d251ed3f08af48c5a6897555b6fbf8a3f7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 00:50:53 -0700 Subject: [PATCH 2157/3147] Extract dagservice, move dagutils to top level License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@b48dc8421e69a281c48a416ebd0d1b9031b73bd5 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index de7cf87dd9..596b9ac471 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "github.com/ipfs/go-ipfs/merkledag" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" From fb1f729d4d7c4e1b1c053488c76fdc7479a066f7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 00:50:53 -0700 Subject: [PATCH 2158/3147] Extract dagservice, move dagutils to top level License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@b1b6ab54c0212722dbe69a13012196e7f1e31c27 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index eb30016eee..abf644a098 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -7,9 +7,9 @@ import ( "fmt" "strings" - dag "github.com/ipfs/go-ipfs/merkledag" pin "github.com/ipfs/go-ipfs/pin" bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" "gx/ipfs/QmQwgv79RHrRnoXmhnpC1BPtY55HHeneGMpPwmmBU1fUAG/go-verifcid" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index faa6e1f9d7..72407b984f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "github.com/ipfs/go-ipfs/merkledag" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index ae6ace111e..9e43f5dcf4 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "github.com/ipfs/go-ipfs/merkledag" bs "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" + mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 31ea21bd8e..a205a4e7e5 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -9,8 +9,8 @@ import ( "hash/fnv" "sort" - "github.com/ipfs/go-ipfs/merkledag" "github.com/ipfs/go-ipfs/pin/internal/pb" + "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index c477a71d7a..eeb453a199 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "github.com/ipfs/go-ipfs/merkledag" bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" From c0127306b8eff01fc2073e1dfd144773777e6f07 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 23:37:36 -0700 Subject: [PATCH 2159/3147] extractify This commit was moved from ipfs/go-path@a1a3981476082cc67ebce25af853ee767f3dfc04 --- path/LICENSE | 21 +++++++++++++++++++++ path/README.md | 32 ++++++++++++++++++++++++++++++++ path/resolver/resolver_test.go | 6 ++++-- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 path/LICENSE create mode 100644 path/README.md diff --git a/path/LICENSE b/path/LICENSE new file mode 100644 index 0000000000..7d5dcac4d2 --- /dev/null +++ b/path/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Juan Batiz-Benet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/path/README.md b/path/README.md new file mode 100644 index 0000000000..79dd928929 --- /dev/null +++ b/path/README.md @@ -0,0 +1,32 @@ +go-path +================== + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![Coverage Status](https://codecov.io/gh/ipfs/go-path/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-path/branch/master) +[![Travis CI](https://travis-ci.org/ipfs/go-path.svg?branch=master)](https://travis-ci.org/ipfs/go-path) + +> go-path is a helper package that provides utilities for parsing and using ipfs paths + + +## Table of Contents + +- [API](#api) +- [Contribute](#contribute) +- [License](#license) + +## TODO + +This package could probably be merged into go-ipld, or something along those lines. It +doesnt really make sense as its own standalone thing. + +## Contribute + +PRs are welcome! + +Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Juan Batiz-Benet diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index ccf00a4e31..fb2406c333 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -3,21 +3,23 @@ package resolver_test import ( "context" "fmt" + "math/rand" "testing" + "time" path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/path/resolver" merkledag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" dagmock "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" - util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) func randNode() *merkledag.ProtoNode { node := new(merkledag.ProtoNode) node.SetData(make([]byte, 32)) - util.NewTimeSeededRand().Read(node.Data()) + r := rand.New(rand.NewSource(time.Now().UnixNano())) + r.Read(node.Data()) return node } From 0be95a15c101a9272418c871b4a00d623dda2196 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 23:37:46 -0700 Subject: [PATCH 2160/3147] unrewrite deps This commit was moved from ipfs/go-path@e6bfb99959d58db0db6b4ff78ddf0f1855ffaad3 --- path/path.go | 2 +- path/resolver/resolver.go | 8 ++++---- path/resolver/resolver_test.go | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/path/path.go b/path/path.go index 1608b6ca3c..18c187bf0b 100644 --- a/path/path.go +++ b/path/path.go @@ -6,7 +6,7 @@ import ( "path" "strings" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + cid "github.com/ipfs/go-cid" ) var ( diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 252fd48ac8..05f86b57d5 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -8,11 +8,11 @@ import ( "time" path "github.com/ipfs/go-ipfs/path" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dag "github.com/ipfs/go-merkledag" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" ) var log = logging.Logger("pathresolv") diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index fb2406c333..81179e2d37 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -9,10 +9,10 @@ import ( path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/path/resolver" - merkledag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - dagmock "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + merkledag "github.com/ipfs/go-merkledag" + dagmock "github.com/ipfs/go-merkledag/test" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) func randNode() *merkledag.ProtoNode { From 475ee982fb2ba2bf4cc13e649206133f07ccc275 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 23:53:38 -0700 Subject: [PATCH 2161/3147] fix paths This commit was moved from ipfs/go-path@881f9a3edc388404b0921de9075375ba350f7901 --- path/resolver/resolver.go | 4 ++-- path/resolver/resolver_test.go | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 05f86b57d5..f96c791740 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -7,12 +7,12 @@ import ( "fmt" "time" - path "github.com/ipfs/go-ipfs/path" - dag "github.com/ipfs/go-merkledag" + path "github.com/ipfs/go-path" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + dag "github.com/ipfs/go-merkledag" ) var log = logging.Logger("pathresolv") diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 81179e2d37..99e26801d1 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -7,12 +7,12 @@ import ( "testing" "time" - path "github.com/ipfs/go-ipfs/path" - "github.com/ipfs/go-ipfs/path/resolver" - merkledag "github.com/ipfs/go-merkledag" - dagmock "github.com/ipfs/go-merkledag/test" + path "github.com/ipfs/go-path" + "github.com/ipfs/go-path/resolver" ipld "github.com/ipfs/go-ipld-format" + merkledag "github.com/ipfs/go-merkledag" + dagmock "github.com/ipfs/go-merkledag/test" ) func randNode() *merkledag.ProtoNode { From 0844abfc8673796a6b3ec03c1d393ccf96558fe8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 23:57:42 -0700 Subject: [PATCH 2162/3147] Extract path and resolver License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@f9c0c50fc7d59a53a86cb9c5e572a1ca8389d9ae --- mfs/mfs_test.go | 2 +- mfs/ops.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index eeef69a58a..40124b91ca 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -15,11 +15,11 @@ import ( "time" importer "github.com/ipfs/go-ipfs/importer" - "github.com/ipfs/go-ipfs/path" ft "github.com/ipfs/go-ipfs/unixfs" uio "github.com/ipfs/go-ipfs/unixfs/io" bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/mfs/ops.go b/mfs/ops.go index 5ae1956516..3ae84058a0 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,7 +6,7 @@ import ( gopath "path" "strings" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" From 2f0067fcfccab00cb8634e8161e964b63c38f5d1 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 23:57:42 -0700 Subject: [PATCH 2163/3147] Extract path and resolver License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@8bda85c77054b5e375669d063bce55ef6de033d9 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/proquint.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 525a9afb00..61b788d59b 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 8249fea141..02d0aa928d 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 1591f16e41..0f8933ab3c 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 6536ac7121..39bbc6e032 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index fd91af9aa2..8dd2ab9ecf 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" record "gx/ipfs/QmVsp2KdPYE6M8ryzCk5KHLo3zprcY5hBDaYx6uPCFUdxA/go-libp2p-record" diff --git a/namesys/namesys.go b/namesys/namesys.go index 6f4b9cf4bd..8dc7d146b5 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 76573d6d6b..19280408af 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,8 +7,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" "github.com/ipfs/go-ipfs/unixfs" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" offroute "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/offline" diff --git a/namesys/proquint.go b/namesys/proquint.go index c065db2d70..31fdb77536 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 77d593a595..a0da61fee6 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,9 +7,9 @@ import ( "sync" "time" - path "github.com/ipfs/go-ipfs/path" pin "github.com/ipfs/go-ipfs/pin" ft "github.com/ipfs/go-ipfs/unixfs" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index abfb283dd1..88038d66d9 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index d26cccb66b..7c2455b600 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmY51bqSM5XgxQZqsBrQcRkKTnCb8EKpJpR9K6Qax7Njco/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 2809afd357..ac3b656d2c 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index 4204ddcdee..3a355ddf21 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "github.com/ipfs/go-ipfs/path" + path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" dht "gx/ipfs/QmTktQYCKzQjhxF6dk5xJPRuhHn3JBiKGvMLoiDy1mYmxC/go-libp2p-kad-dht" From 069cd0e0d729e11cf7d9a4374b004e528fca18de Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 28 Jul 2018 23:57:42 -0700 Subject: [PATCH 2164/3147] Extract path and resolver License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/interface-go-ipfs-core@ebc2b3570f9c962cc9b9a8440fe1a88fea42628f --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index e097ea3b69..49b8cc5ea7 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "github.com/ipfs/go-ipfs/path" + ipfspath "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) From 85e4d20277e5eab84bcccd65faa3ab419d15b82b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Jul 2018 13:38:28 -0700 Subject: [PATCH 2165/3147] move importers to unixfs directory License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-unixfs@b0eb151c7204da06ba01c245384c1917a7bdc01a --- unixfs/importer/balanced/balanced_test.go | 334 +++++++++++ unixfs/importer/balanced/builder.go | 255 +++++++++ unixfs/importer/helpers/dagbuilder.go | 458 ++++++++++++++++ unixfs/importer/helpers/helpers.go | 173 ++++++ unixfs/importer/importer.go | 34 ++ unixfs/importer/importer_test.go | 118 ++++ unixfs/importer/trickle/trickle_test.go | 640 ++++++++++++++++++++++ unixfs/importer/trickle/trickledag.go | 366 +++++++++++++ 8 files changed, 2378 insertions(+) create mode 100644 unixfs/importer/balanced/balanced_test.go create mode 100644 unixfs/importer/balanced/builder.go create mode 100644 unixfs/importer/helpers/dagbuilder.go create mode 100644 unixfs/importer/helpers/helpers.go create mode 100644 unixfs/importer/importer.go create mode 100644 unixfs/importer/importer_test.go create mode 100644 unixfs/importer/trickle/trickle_test.go create mode 100644 unixfs/importer/trickle/trickledag.go diff --git a/unixfs/importer/balanced/balanced_test.go b/unixfs/importer/balanced/balanced_test.go new file mode 100644 index 0000000000..f1f636e565 --- /dev/null +++ b/unixfs/importer/balanced/balanced_test.go @@ -0,0 +1,334 @@ +package balanced + +import ( + "bytes" + "context" + "fmt" + "io" + "io/ioutil" + mrand "math/rand" + "testing" + + h "github.com/ipfs/go-ipfs/importer/helpers" + uio "github.com/ipfs/go-ipfs/unixfs/io" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" +) + +// TODO: extract these tests and more as a generic layout test suite + +func buildTestDag(ds ipld.DAGService, spl chunker.Splitter) (*dag.ProtoNode, error) { + dbp := h.DagBuilderParams{ + Dagserv: ds, + Maxlinks: h.DefaultLinksPerBlock, + } + + nd, err := Layout(dbp.New(spl)) + if err != nil { + return nil, err + } + + return nd.(*dag.ProtoNode), nil +} + +func getTestDag(t *testing.T, ds ipld.DAGService, size int64, blksize int64) (*dag.ProtoNode, []byte) { + data := make([]byte, size) + u.NewTimeSeededRand().Read(data) + r := bytes.NewReader(data) + + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(r, blksize)) + if err != nil { + t.Fatal(err) + } + + return nd, data +} + +//Test where calls to read are smaller than the chunk size +func TestSizeBasedSplit(t *testing.T) { + if testing.Short() { + t.SkipNow() + } + + testFileConsistency(t, 32*512, 512) + testFileConsistency(t, 32*4096, 4096) + + // Uneven offset + testFileConsistency(t, 31*4095, 4096) +} + +func testFileConsistency(t *testing.T, nbytes int64, blksize int64) { + ds := mdtest.Mock() + nd, should := getTestDag(t, ds, nbytes, blksize) + + r, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + dagrArrComp(t, r, should) +} + +func TestBuilderConsistency(t *testing.T) { + testFileConsistency(t, 100000, chunker.DefaultBlockSize) +} + +func TestNoChunking(t *testing.T) { + ds := mdtest.Mock() + + nd, should := getTestDag(t, ds, 1000, 2000) + r, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + dagrArrComp(t, r, should) +} + +func TestTwoChunks(t *testing.T) { + ds := mdtest.Mock() + + nd, should := getTestDag(t, ds, 2000, 1000) + r, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + dagrArrComp(t, r, should) +} + +func arrComp(a, b []byte) error { + if len(a) != len(b) { + return fmt.Errorf("arrays differ in length. %d != %d", len(a), len(b)) + } + for i, v := range a { + if v != b[i] { + return fmt.Errorf("arrays differ at index: %d", i) + } + } + return nil +} + +func dagrArrComp(t *testing.T, r io.Reader, should []byte) { + out, err := ioutil.ReadAll(r) + if err != nil { + t.Fatal(err) + } + + if err := arrComp(out, should); err != nil { + t.Fatal(err) + } +} + +func TestIndirectBlocks(t *testing.T) { + ds := mdtest.Mock() + dag, buf := getTestDag(t, ds, 1024*1024, 512) + + reader, err := uio.NewDagReader(context.Background(), dag, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(reader) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(out, buf) { + t.Fatal("Not equal!") + } +} + +func TestSeekingBasic(t *testing.T) { + nbytes := int64(10 * 1024) + ds := mdtest.Mock() + nd, should := getTestDag(t, ds, nbytes, 500) + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + start := int64(4000) + n, err := rs.Seek(start, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if n != start { + t.Fatal("Failed to seek to correct offset") + } + + dagrArrComp(t, rs, should[start:]) +} + +func TestSeekToBegin(t *testing.T) { + ds := mdtest.Mock() + nd, should := getTestDag(t, ds, 10*1024, 500) + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + if err != nil { + t.Fatal(err) + } + if n != 4096 { + t.Fatal("Copy didnt copy enough bytes") + } + + seeked, err := rs.Seek(0, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if seeked != 0 { + t.Fatal("Failed to seek to beginning") + } + + dagrArrComp(t, rs, should) +} + +func TestSeekToAlmostBegin(t *testing.T) { + ds := mdtest.Mock() + nd, should := getTestDag(t, ds, 10*1024, 500) + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + if err != nil { + t.Fatal(err) + } + if n != 4096 { + t.Fatal("Copy didnt copy enough bytes") + } + + seeked, err := rs.Seek(1, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if seeked != 1 { + t.Fatal("Failed to seek to almost beginning") + } + + dagrArrComp(t, rs, should[1:]) +} + +func TestSeekEnd(t *testing.T) { + nbytes := int64(50 * 1024) + ds := mdtest.Mock() + nd, _ := getTestDag(t, ds, nbytes, 500) + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + seeked, err := rs.Seek(0, io.SeekEnd) + if err != nil { + t.Fatal(err) + } + if seeked != nbytes { + t.Fatal("Failed to seek to end") + } +} + +func TestSeekEndSingleBlockFile(t *testing.T) { + nbytes := int64(100) + ds := mdtest.Mock() + nd, _ := getTestDag(t, ds, nbytes, 5000) + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + seeked, err := rs.Seek(0, io.SeekEnd) + if err != nil { + t.Fatal(err) + } + if seeked != nbytes { + t.Fatal("Failed to seek to end") + } +} + +func TestSeekingStress(t *testing.T) { + nbytes := int64(1024 * 1024) + ds := mdtest.Mock() + nd, should := getTestDag(t, ds, nbytes, 1000) + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + testbuf := make([]byte, nbytes) + for i := 0; i < 50; i++ { + offset := mrand.Intn(int(nbytes)) + l := int(nbytes) - offset + n, err := rs.Seek(int64(offset), io.SeekStart) + if err != nil { + t.Fatal(err) + } + if n != int64(offset) { + t.Fatal("Seek failed to move to correct position") + } + + nread, err := rs.Read(testbuf[:l]) + if err != nil { + t.Fatal(err) + } + if nread != l { + t.Fatal("Failed to read enough bytes") + } + + err = arrComp(testbuf[:l], should[offset:offset+l]) + if err != nil { + t.Fatal(err) + } + } + +} + +func TestSeekingConsistency(t *testing.T) { + nbytes := int64(128 * 1024) + ds := mdtest.Mock() + nd, should := getTestDag(t, ds, nbytes, 500) + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + out := make([]byte, nbytes) + + for coff := nbytes - 4096; coff >= 0; coff -= 4096 { + t.Log(coff) + n, err := rs.Seek(coff, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if n != coff { + t.Fatal("wasnt able to seek to the right position") + } + nread, err := rs.Read(out[coff : coff+4096]) + if err != nil { + t.Fatal(err) + } + if nread != 4096 { + t.Fatal("didnt read the correct number of bytes") + } + } + + err = arrComp(out, should) + if err != nil { + t.Fatal(err) + } +} diff --git a/unixfs/importer/balanced/builder.go b/unixfs/importer/balanced/builder.go new file mode 100644 index 0000000000..feab6cf50d --- /dev/null +++ b/unixfs/importer/balanced/builder.go @@ -0,0 +1,255 @@ +// Package balanced provides methods to build balanced DAGs, which are generalistic +// DAGs in which all leaves (nodes representing chunks of data) are at the same +// distance from the root. Nodes can have only a maximum number of children; to be +// able to store more leaf data nodes balanced DAGs are extended by increasing its +// depth (and having more intermediary nodes). +// +// Internal nodes are always represented by UnixFS nodes (of type `File`) encoded +// inside DAG nodes (see the `go-ipfs/unixfs` package for details of UnixFS). In +// contrast, leaf nodes with data have multiple possible representations: UnixFS +// nodes as above, raw nodes with just the file data (no format) and Filestore +// nodes (that directly link to the file on disk using a format stored on a raw +// node, see the `go-ipfs/filestore` package for details of Filestore.) +// +// In the case the entire file fits into just one node it will be formatted as a +// (single) leaf node (without parent) with the possible representations already +// mentioned. This is the only scenario where the root can be of a type different +// that the UnixFS node. +// +// +-------------+ +// | Root 4 | +// +-------------+ +// | +// +--------------------------+----------------------------+ +// | | +// +-------------+ +-------------+ +// | Node 2 | | Node 5 | +// +-------------+ +-------------+ +// | | +// +-------------+-------------+ +-------------+ +// | | | +// +-------------+ +-------------+ +-------------+ +// | Node 1 | | Node 3 | | Node 6 | +// +-------------+ +-------------+ +-------------+ +// | | | +// +------+------+ +------+------+ +------+ +// | | | | | +// +=========+ +=========+ +=========+ +=========+ +=========+ +// | Chunk 1 | | Chunk 2 | | Chunk 3 | | Chunk 4 | | Chunk 5 | +// +=========+ +=========+ +=========+ +=========+ +=========+ +// +package balanced + +import ( + "errors" + + h "github.com/ipfs/go-ipfs/importer/helpers" + ft "github.com/ipfs/go-ipfs/unixfs" + + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" +) + +// Layout builds a balanced DAG layout. In a balanced DAG of depth 1, leaf nodes +// with data are added to a single `root` until the maximum number of links is +// reached. Then, to continue adding more data leaf nodes, a `newRoot` is created +// pointing to the old `root` (which will now become and intermediary node), +// increasing the depth of the DAG to 2. This will increase the maximum number of +// data leaf nodes the DAG can have (`Maxlinks() ^ depth`). The `fillNodeRec` +// function will add more intermediary child nodes to `newRoot` (which already has +// `root` as child) that in turn will have leaf nodes with data added to them. +// After that process is completed (the maximum number of links is reached), +// `fillNodeRec` will return and the loop will be repeated: the `newRoot` created +// will become the old `root` and a new root will be created again to increase the +// depth of the DAG. The process is repeated until there is no more data to add +// (i.e. the DagBuilderHelper’s Done() function returns true). +// +// The nodes are filled recursively, so the DAG is built from the bottom up. Leaf +// nodes are created first using the chunked file data and its size. The size is +// then bubbled up to the parent (internal) node, which aggregates all the sizes of +// its children and bubbles that combined size up to its parent, and so on up to +// the root. This way, a balanced DAG acts like a B-tree when seeking to a byte +// offset in the file the graph represents: each internal node uses the file size +// of its children as an index when seeking. +// +// `Layout` creates a root and hands it off to be filled: +// +// +-------------+ +// | Root 1 | +// +-------------+ +// | +// ( fillNodeRec fills in the ) +// ( chunks on the root. ) +// | +// +------+------+ +// | | +// + - - - - + + - - - - + +// | Chunk 1 | | Chunk 2 | +// + - - - - + + - - - - + +// +// ↓ +// When the root is full but there's more data... +// ↓ +// +// +-------------+ +// | Root 1 | +// +-------------+ +// | +// +------+------+ +// | | +// +=========+ +=========+ + - - - - + +// | Chunk 1 | | Chunk 2 | | Chunk 3 | +// +=========+ +=========+ + - - - - + +// +// ↓ +// ...Layout's job is to create a new root. +// ↓ +// +// +-------------+ +// | Root 2 | +// +-------------+ +// | +// +-------------+ - - - - - - - - + +// | | +// +-------------+ ( fillNodeRec creates the ) +// | Node 1 | ( branch that connects ) +// +-------------+ ( "Root 2" to "Chunk 3." ) +// | | +// +------+------+ + - - - - -+ +// | | | +// +=========+ +=========+ + - - - - + +// | Chunk 1 | | Chunk 2 | | Chunk 3 | +// +=========+ +=========+ + - - - - + +// +func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { + if db.Done() { + // No data, return just an empty node. + root, err := db.NewLeafNode(nil) + if err != nil { + return nil, err + } + // This works without Filestore support (`ProcessFileStore`). + // TODO: Why? Is there a test case missing? + + return db.AddNodeAndClose(root) + } + + // The first `root` will be a single leaf node with data + // (corner case), after that subsequent `root` nodes will + // always be internal nodes (with a depth > 0) that can + // be handled by the loop. + root, fileSize, err := db.NewLeafDataNode() + if err != nil { + return nil, err + } + + // Each time a DAG of a certain `depth` is filled (because it + // has reached its maximum capacity of `db.Maxlinks()` per node) + // extend it by making it a sub-DAG of a bigger DAG with `depth+1`. + for depth := 1; !db.Done(); depth++ { + + // Add the old `root` as a child of the `newRoot`. + newRoot := db.NewFSNodeOverDag(ft.TFile) + newRoot.AddChild(root, fileSize, db) + + // Fill the `newRoot` (that has the old `root` already as child) + // and make it the current `root` for the next iteration (when + // it will become "old"). + root, fileSize, err = fillNodeRec(db, newRoot, depth) + if err != nil { + return nil, err + } + } + + return db.AddNodeAndClose(root) +} + +// fillNodeRec will "fill" the given internal (non-leaf) `node` with data by +// adding child nodes to it, either leaf data nodes (if `depth` is 1) or more +// internal nodes with higher depth (and calling itself recursively on them +// until *they* are filled with data). The data to fill the node with is +// provided by DagBuilderHelper. +// +// `node` represents a (sub-)DAG root that is being filled. If called recursively, +// it is `nil`, a new node is created. If it has been called from `Layout` (see +// diagram below) it points to the new root (that increases the depth of the DAG), +// it already has a child (the old root). New children will be added to this new +// root, and those children will in turn be filled (calling `fillNodeRec` +// recursively). +// +// +-------------+ +// | `node` | +// | (new root) | +// +-------------+ +// | +// +-------------+ - - - - - - + - - - - - - - - - - - + +// | | | +// +--------------+ + - - - - - + + - - - - - + +// | (old root) | | new child | | | +// +--------------+ + - - - - - + + - - - - - + +// | | | +// +------+------+ + - - + - - - + +// | | | | +// +=========+ +=========+ + - - - - + + - - - - + +// | Chunk 1 | | Chunk 2 | | Chunk 3 | | Chunk 4 | +// +=========+ +=========+ + - - - - + + - - - - + +// +// The `node` to be filled uses the `FSNodeOverDag` abstraction that allows adding +// child nodes without packing/unpacking the UnixFS layer node (having an internal +// `ft.FSNode` cache). +// +// It returns the `ipld.Node` representation of the passed `node` filled with +// children and the `nodeFileSize` with the total size of the file chunk (leaf) +// nodes stored under this node (parent nodes store this to enable efficient +// seeking through the DAG when reading data later). +// +// warning: **children** pinned indirectly, but input node IS NOT pinned. +func fillNodeRec(db *h.DagBuilderHelper, node *h.FSNodeOverDag, depth int) (filledNode ipld.Node, nodeFileSize uint64, err error) { + if depth < 1 { + return nil, 0, errors.New("attempt to fillNode at depth < 1") + } + + if node == nil { + node = db.NewFSNodeOverDag(ft.TFile) + } + + // Child node created on every iteration to add to parent `node`. + // It can be a leaf node or another internal node. + var childNode ipld.Node + // File size from the child node needed to update the `FSNode` + // in `node` when adding the child. + var childFileSize uint64 + + // While we have room and there is data available to be added. + for node.NumChildren() < db.Maxlinks() && !db.Done() { + + if depth == 1 { + // Base case: add leaf node with data. + childNode, childFileSize, err = db.NewLeafDataNode() + if err != nil { + return nil, 0, err + } + } else { + // Recursion case: create an internal node to in turn keep + // descending in the DAG and adding child nodes to it. + childNode, childFileSize, err = fillNodeRec(db, nil, depth-1) + if err != nil { + return nil, 0, err + } + } + + err = node.AddChild(childNode, childFileSize, db) + if err != nil { + return nil, 0, err + } + } + + nodeFileSize = node.FileSize() + + // Get the final `dag.ProtoNode` with the `FSNode` data encoded inside. + filledNode, err = node.Commit() + if err != nil { + return nil, 0, err + } + + return filledNode, nodeFileSize, nil +} diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go new file mode 100644 index 0000000000..4b37a7f032 --- /dev/null +++ b/unixfs/importer/helpers/dagbuilder.go @@ -0,0 +1,458 @@ +package helpers + +import ( + "context" + "io" + "os" + + ft "github.com/ipfs/go-ipfs/unixfs" + pb "github.com/ipfs/go-ipfs/unixfs/pb" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + + pi "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + files "gx/ipfs/QmdE4gMduCKCGAcczM2F5ioYDfdeKuPix138wrES1YSr7f/go-ipfs-cmdkit/files" +) + +// DagBuilderHelper wraps together a bunch of objects needed to +// efficiently create unixfs dag trees +type DagBuilderHelper struct { + dserv ipld.DAGService + spl chunker.Splitter + recvdErr error + rawLeaves bool + nextData []byte // the next item to return. + maxlinks int + batch *ipld.Batch + prefix *cid.Prefix + + // Filestore support variables. + // ---------------------------- + // TODO: Encapsulate in `FilestoreNode` (which is basically what they are). + // + // Besides having the path this variable (if set) is used as a flag + // to indicate that Filestore should be used. + fullPath string + stat os.FileInfo + // Keeps track of the current file size added to the DAG (used in + // the balanced builder). It is assumed that the `DagBuilderHelper` + // is not reused to construct another DAG, but a new one (with a + // zero `offset`) is created. + offset uint64 +} + +// DagBuilderParams wraps configuration options to create a DagBuilderHelper +// from a chunker.Splitter. +type DagBuilderParams struct { + // Maximum number of links per intermediate node + Maxlinks int + + // RawLeaves signifies that the importer should use raw ipld nodes as leaves + // instead of using the unixfs TRaw type + RawLeaves bool + + // CID Prefix to use if set + Prefix *cid.Prefix + + // DAGService to write blocks to (required) + Dagserv ipld.DAGService + + // NoCopy signals to the chunker that it should track fileinfo for + // filestore adds + NoCopy bool + + // URL if non-empty (and NoCopy is also true) indicates that the + // file will not be stored in the datastore but instead retrieved + // from this location via the urlstore. + URL string +} + +// New generates a new DagBuilderHelper from the given params and a given +// chunker.Splitter as data source. +func (dbp *DagBuilderParams) New(spl chunker.Splitter) *DagBuilderHelper { + db := &DagBuilderHelper{ + dserv: dbp.Dagserv, + spl: spl, + rawLeaves: dbp.RawLeaves, + prefix: dbp.Prefix, + maxlinks: dbp.Maxlinks, + batch: ipld.NewBatch(context.TODO(), dbp.Dagserv), + } + if fi, ok := spl.Reader().(files.FileInfo); dbp.NoCopy && ok { + db.fullPath = fi.AbsPath() + db.stat = fi.Stat() + } + + if dbp.URL != "" && dbp.NoCopy { + db.fullPath = dbp.URL + } + return db +} + +// prepareNext consumes the next item from the splitter and puts it +// in the nextData field. it is idempotent-- if nextData is full +// it will do nothing. +func (db *DagBuilderHelper) prepareNext() { + // if we already have data waiting to be consumed, we're ready + if db.nextData != nil || db.recvdErr != nil { + return + } + + db.nextData, db.recvdErr = db.spl.NextBytes() + if db.recvdErr == io.EOF { + db.recvdErr = nil + } +} + +// Done returns whether or not we're done consuming the incoming data. +func (db *DagBuilderHelper) Done() bool { + // ensure we have an accurate perspective on data + // as `done` this may be called before `next`. + db.prepareNext() // idempotent + if db.recvdErr != nil { + return false + } + return db.nextData == nil +} + +// Next returns the next chunk of data to be inserted into the dag +// if it returns nil, that signifies that the stream is at an end, and +// that the current building operation should finish. +func (db *DagBuilderHelper) Next() ([]byte, error) { + db.prepareNext() // idempotent + d := db.nextData + db.nextData = nil // signal we've consumed it + if db.recvdErr != nil { + return nil, db.recvdErr + } + return d, nil +} + +// GetDagServ returns the dagservice object this Helper is using +func (db *DagBuilderHelper) GetDagServ() ipld.DAGService { + return db.dserv +} + +// NewUnixfsNode creates a new Unixfs node to represent a file. +func (db *DagBuilderHelper) NewUnixfsNode() *UnixfsNode { + n := &UnixfsNode{ + node: new(dag.ProtoNode), + ufmt: ft.NewFSNode(ft.TFile), + } + n.SetPrefix(db.prefix) + return n +} + +// GetPrefix returns the internal `cid.Prefix` set in the builder. +func (db *DagBuilderHelper) GetPrefix() *cid.Prefix { + return db.prefix +} + +// NewLeaf creates a leaf node filled with data. If rawLeaves is +// defined than a raw leaf will be returned. Otherwise, if data is +// nil the type field will be TRaw (for backwards compatibility), if +// data is defined (but possibly empty) the type field will be TRaw. +func (db *DagBuilderHelper) NewLeaf(data []byte) (*UnixfsNode, error) { + if len(data) > BlockSizeLimit { + return nil, ErrSizeLimitExceeded + } + + if db.rawLeaves { + if db.prefix == nil { + return &UnixfsNode{ + rawnode: dag.NewRawNode(data), + raw: true, + }, nil + } + rawnode, err := dag.NewRawNodeWPrefix(data, *db.prefix) + if err != nil { + return nil, err + } + return &UnixfsNode{ + rawnode: rawnode, + raw: true, + }, nil + } + + if data == nil { + return db.NewUnixfsNode(), nil + } + + blk := db.newUnixfsBlock() + blk.SetData(data) + return blk, nil +} + +// NewLeafNode is a variation from `NewLeaf` (see its description) that +// returns an `ipld.Node` instead. +func (db *DagBuilderHelper) NewLeafNode(data []byte) (ipld.Node, error) { + if len(data) > BlockSizeLimit { + return nil, ErrSizeLimitExceeded + } + + if db.rawLeaves { + // Encapsulate the data in a raw node. + if db.prefix == nil { + return dag.NewRawNode(data), nil + } + rawnode, err := dag.NewRawNodeWPrefix(data, *db.prefix) + if err != nil { + return nil, err + } + return rawnode, nil + } + + // Encapsulate the data in UnixFS node (instead of a raw node). + fsNodeOverDag := db.NewFSNodeOverDag(ft.TFile) + fsNodeOverDag.SetFileData(data) + node, err := fsNodeOverDag.Commit() + if err != nil { + return nil, err + } + // TODO: Encapsulate this sequence of calls into a function that + // just returns the final `ipld.Node` avoiding going through + // `FSNodeOverDag`. + // TODO: Using `TFile` for backwards-compatibility, a bug in the + // balanced builder was causing the leaf nodes to be generated + // with this type instead of `TRaw`, the one that should be used + // (like the trickle builder does). + // (See https://github.com/ipfs/go-ipfs/pull/5120.) + + return node, nil +} + +// newUnixfsBlock creates a new Unixfs node to represent a raw data block +func (db *DagBuilderHelper) newUnixfsBlock() *UnixfsNode { + n := &UnixfsNode{ + node: new(dag.ProtoNode), + ufmt: ft.NewFSNode(ft.TRaw), + } + n.SetPrefix(db.prefix) + return n +} + +// FillNodeLayer will add datanodes as children to the give node until +// at most db.indirSize nodes are added. +func (db *DagBuilderHelper) FillNodeLayer(node *UnixfsNode) error { + + // while we have room AND we're not done + for node.NumChildren() < db.maxlinks && !db.Done() { + child, err := db.GetNextDataNode() + if err != nil { + return err + } + + if err := node.AddChild(child, db); err != nil { + return err + } + } + + return nil +} + +// GetNextDataNode builds a UnixFsNode with the data obtained from the +// Splitter, given the constraints (BlockSizeLimit, RawLeaves) specified +// when creating the DagBuilderHelper. +func (db *DagBuilderHelper) GetNextDataNode() (*UnixfsNode, error) { + data, err := db.Next() + if err != nil { + return nil, err + } + + if data == nil { // we're done! + return nil, nil + } + + return db.NewLeaf(data) +} + +// NewLeafDataNode is a variation of `GetNextDataNode` that returns +// an `ipld.Node` instead. It builds the `node` with the data obtained +// from the Splitter and returns it with the `dataSize` (that will be +// used to keep track of the DAG file size). The size of the data is +// computed here because after that it will be hidden by `NewLeafNode` +// inside a generic `ipld.Node` representation. +func (db *DagBuilderHelper) NewLeafDataNode() (node ipld.Node, dataSize uint64, err error) { + fileData, err := db.Next() + if err != nil { + return nil, 0, err + } + dataSize = uint64(len(fileData)) + + // Create a new leaf node containing the file chunk data. + node, err = db.NewLeafNode(fileData) + if err != nil { + return nil, 0, err + } + + // Convert this leaf to a `FilestoreNode` if needed. + node = db.ProcessFileStore(node, dataSize) + + return node, dataSize, nil +} + +// ProcessFileStore generates, if Filestore is being used, the +// `FilestoreNode` representation of the `ipld.Node` that +// contains the file data. If Filestore is not being used just +// return the same node to continue with its addition to the DAG. +// +// The `db.offset` is updated at this point (instead of when +// `NewLeafDataNode` is called, both work in tandem but the +// offset is more related to this function). +func (db *DagBuilderHelper) ProcessFileStore(node ipld.Node, dataSize uint64) ipld.Node { + // Check if Filestore is being used. + if db.fullPath != "" { + // Check if the node is actually a raw node (needed for + // Filestore support). + if _, ok := node.(*dag.RawNode); ok { + fn := &pi.FilestoreNode{ + Node: node, + PosInfo: &pi.PosInfo{ + Offset: db.offset, + FullPath: db.fullPath, + Stat: db.stat, + }, + } + + // Update `offset` with the size of the data generated by `db.Next`. + db.offset += dataSize + + return fn + } + } + + // Filestore is not used, return the same `node` argument. + return node +} + +// Add sends a node to the DAGService, and returns it. +func (db *DagBuilderHelper) Add(node *UnixfsNode) (ipld.Node, error) { + dn, err := node.GetDagNode() + if err != nil { + return nil, err + } + + err = db.dserv.Add(context.TODO(), dn) + if err != nil { + return nil, err + } + + return dn, nil +} + +// Maxlinks returns the configured maximum number for links +// for nodes built with this helper. +func (db *DagBuilderHelper) Maxlinks() int { + return db.maxlinks +} + +// Close has the DAGService perform a batch Commit operation. +// It should be called at the end of the building process to make +// sure all data is persisted. +func (db *DagBuilderHelper) Close() error { + return db.batch.Commit() +} + +// AddNodeAndClose adds the last `ipld.Node` from the DAG and +// closes the builder. It returns the same `node` passed as +// argument. +func (db *DagBuilderHelper) AddNodeAndClose(node ipld.Node) (ipld.Node, error) { + err := db.batch.Add(node) + if err != nil { + return nil, err + } + + err = db.Close() + if err != nil { + return nil, err + } + + return node, nil +} + +// FSNodeOverDag encapsulates an `unixfs.FSNode` that will be stored in a +// `dag.ProtoNode`. Instead of just having a single `ipld.Node` that +// would need to be constantly (un)packed to access and modify its +// internal `FSNode` in the process of creating a UnixFS DAG, this +// structure stores an `FSNode` cache to manipulate it (add child nodes) +// directly , and only when the node has reached its final (immutable) state +// (signaled by calling `Commit()`) is it committed to a single (indivisible) +// `ipld.Node`. +// +// It is used mainly for internal (non-leaf) nodes, and for some +// representations of data leaf nodes (that don't use raw nodes or +// Filestore). +// +// It aims to replace the `UnixfsNode` structure which encapsulated too +// many possible node state combinations. +// +// TODO: Revisit the name. +type FSNodeOverDag struct { + dag *dag.ProtoNode + file *ft.FSNode +} + +// NewFSNodeOverDag creates a new `dag.ProtoNode` and `ft.FSNode` +// decoupled from one onther (and will continue in that way until +// `Commit` is called), with `fsNodeType` specifying the type of +// the UnixFS layer node (either `File` or `Raw`). +func (db *DagBuilderHelper) NewFSNodeOverDag(fsNodeType pb.Data_DataType) *FSNodeOverDag { + node := new(FSNodeOverDag) + node.dag = new(dag.ProtoNode) + node.dag.SetPrefix(db.GetPrefix()) + + node.file = ft.NewFSNode(fsNodeType) + + return node +} + +// AddChild adds a `child` `ipld.Node` to both node layers. The +// `dag.ProtoNode` creates a link to the child node while the +// `ft.FSNode` stores its file size (that is, not the size of the +// node but the size of the file data that it is storing at the +// UnixFS layer). The child is also stored in the `DAGService`. +func (n *FSNodeOverDag) AddChild(child ipld.Node, fileSize uint64, db *DagBuilderHelper) error { + err := n.dag.AddNodeLink("", child) + if err != nil { + return err + } + + n.file.AddBlockSize(fileSize) + + return db.batch.Add(child) +} + +// Commit unifies (resolves) the cache nodes into a single `ipld.Node` +// that represents them: the `ft.FSNode` is encoded inside the +// `dag.ProtoNode`. +// +// TODO: Evaluate making it read-only after committing. +func (n *FSNodeOverDag) Commit() (ipld.Node, error) { + fileData, err := n.file.GetBytes() + if err != nil { + return nil, err + } + n.dag.SetData(fileData) + + return n.dag, nil +} + +// NumChildren returns the number of children of the `ft.FSNode`. +func (n *FSNodeOverDag) NumChildren() int { + return n.file.NumChildren() +} + +// FileSize returns the `Filesize` attribute from the underlying +// representation of the `ft.FSNode`. +func (n *FSNodeOverDag) FileSize() uint64 { + return n.file.FileSize() +} + +// SetFileData stores the `fileData` in the `ft.FSNode`. It +// should be used only when `FSNodeOverDag` represents a leaf +// node (internal nodes don't carry data, just file sizes). +func (n *FSNodeOverDag) SetFileData(fileData []byte) { + n.file.SetData(fileData) +} diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go new file mode 100644 index 0000000000..462dc1dcf1 --- /dev/null +++ b/unixfs/importer/helpers/helpers.go @@ -0,0 +1,173 @@ +package helpers + +import ( + "context" + "fmt" + "os" + + ft "github.com/ipfs/go-ipfs/unixfs" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + + pi "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" +) + +// BlockSizeLimit specifies the maximum size an imported block can have. +var BlockSizeLimit = 1048576 // 1 MB + +// rough estimates on expected sizes +var roughLinkBlockSize = 1 << 13 // 8KB +var roughLinkSize = 34 + 8 + 5 // sha256 multihash + size + no name + protobuf framing + +// DefaultLinksPerBlock governs how the importer decides how many links there +// will be per block. This calculation is based on expected distributions of: +// * the expected distribution of block sizes +// * the expected distribution of link sizes +// * desired access speed +// For now, we use: +// +// var roughLinkBlockSize = 1 << 13 // 8KB +// var roughLinkSize = 288 // sha256 + framing + name +// var DefaultLinksPerBlock = (roughLinkBlockSize / roughLinkSize) +// +// See calc_test.go +var DefaultLinksPerBlock = roughLinkBlockSize / roughLinkSize + +// ErrSizeLimitExceeded signals that a block is larger than BlockSizeLimit. +var ErrSizeLimitExceeded = fmt.Errorf("object size limit exceeded") + +// UnixfsNode is a struct created to aid in the generation +// of unixfs DAG trees +type UnixfsNode struct { + raw bool + rawnode *dag.RawNode + node *dag.ProtoNode + ufmt *ft.FSNode + posInfo *pi.PosInfo +} + +// NewUnixfsNodeFromDag reconstructs a Unixfs node from a given dag node +func NewUnixfsNodeFromDag(nd *dag.ProtoNode) (*UnixfsNode, error) { + mb, err := ft.FSNodeFromBytes(nd.Data()) + if err != nil { + return nil, err + } + + return &UnixfsNode{ + node: nd, + ufmt: mb, + }, nil +} + +// SetPrefix sets the CID Prefix +func (n *UnixfsNode) SetPrefix(prefix *cid.Prefix) { + n.node.SetPrefix(prefix) +} + +// NumChildren returns the number of children referenced by this UnixfsNode. +func (n *UnixfsNode) NumChildren() int { + return n.ufmt.NumChildren() +} + +// GetChild gets the ith child of this node from the given DAGService. +func (n *UnixfsNode) GetChild(ctx context.Context, i int, ds ipld.DAGService) (*UnixfsNode, error) { + nd, err := n.node.Links()[i].GetNode(ctx, ds) + if err != nil { + return nil, err + } + + pbn, ok := nd.(*dag.ProtoNode) + if !ok { + return nil, dag.ErrNotProtobuf + } + + return NewUnixfsNodeFromDag(pbn) +} + +// AddChild adds the given UnixfsNode as a child of the receiver. +// The passed in DagBuilderHelper is used to store the child node an +// pin it locally so it doesnt get lost. +func (n *UnixfsNode) AddChild(child *UnixfsNode, db *DagBuilderHelper) error { + n.ufmt.AddBlockSize(child.FileSize()) + + childnode, err := child.GetDagNode() + if err != nil { + return err + } + + // Add a link to this node without storing a reference to the memory + // This way, we avoid nodes building up and consuming all of our RAM + err = n.node.AddNodeLink("", childnode) + if err != nil { + return err + } + + err = db.batch.Add(childnode) + + return err +} + +// RemoveChild deletes the child node at the given index. +func (n *UnixfsNode) RemoveChild(index int, dbh *DagBuilderHelper) { + n.ufmt.RemoveBlockSize(index) + n.node.SetLinks(append(n.node.Links()[:index], n.node.Links()[index+1:]...)) +} + +// SetData stores data in this node. +func (n *UnixfsNode) SetData(data []byte) { + n.ufmt.SetData(data) +} + +// FileSize returns the total file size of this tree (including children) +// In the case of raw nodes, it returns the length of the +// raw data. +func (n *UnixfsNode) FileSize() uint64 { + if n.raw { + return uint64(len(n.rawnode.RawData())) + } + return n.ufmt.FileSize() +} + +// SetPosInfo sets information about the offset of the data of this node in a +// filesystem file. +func (n *UnixfsNode) SetPosInfo(offset uint64, fullPath string, stat os.FileInfo) { + n.posInfo = &pi.PosInfo{ + Offset: offset, + FullPath: fullPath, + Stat: stat, + } +} + +// GetDagNode fills out the proper formatting for the unixfs node +// inside of a DAG node and returns the dag node. +func (n *UnixfsNode) GetDagNode() (ipld.Node, error) { + nd, err := n.getBaseDagNode() + if err != nil { + return nil, err + } + + if n.posInfo != nil { + if rn, ok := nd.(*dag.RawNode); ok { + return &pi.FilestoreNode{ + Node: rn, + PosInfo: n.posInfo, + }, nil + } + } + + return nd, nil +} + +func (n *UnixfsNode) getBaseDagNode() (ipld.Node, error) { + if n.raw { + return n.rawnode, nil + } + + data, err := n.ufmt.GetBytes() + if err != nil { + return nil, err + } + n.node.SetData(data) + return n.node, nil +} diff --git a/unixfs/importer/importer.go b/unixfs/importer/importer.go new file mode 100644 index 0000000000..cc5028ee2f --- /dev/null +++ b/unixfs/importer/importer.go @@ -0,0 +1,34 @@ +// Package importer implements utilities used to create IPFS DAGs from files +// and readers. +package importer + +import ( + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + + bal "github.com/ipfs/go-ipfs/importer/balanced" + h "github.com/ipfs/go-ipfs/importer/helpers" + trickle "github.com/ipfs/go-ipfs/importer/trickle" +) + +// BuildDagFromReader creates a DAG given a DAGService and a Splitter +// implementation (Splitters are io.Readers), using a Balanced layout. +func BuildDagFromReader(ds ipld.DAGService, spl chunker.Splitter) (ipld.Node, error) { + dbp := h.DagBuilderParams{ + Dagserv: ds, + Maxlinks: h.DefaultLinksPerBlock, + } + + return bal.Layout(dbp.New(spl)) +} + +// BuildTrickleDagFromReader creates a DAG given a DAGService and a Splitter +// implementation (Splitters are io.Readers), using a Trickle Layout. +func BuildTrickleDagFromReader(ds ipld.DAGService, spl chunker.Splitter) (ipld.Node, error) { + dbp := h.DagBuilderParams{ + Dagserv: ds, + Maxlinks: h.DefaultLinksPerBlock, + } + + return trickle.Layout(dbp.New(spl)) +} diff --git a/unixfs/importer/importer_test.go b/unixfs/importer/importer_test.go new file mode 100644 index 0000000000..0b9c75ce89 --- /dev/null +++ b/unixfs/importer/importer_test.go @@ -0,0 +1,118 @@ +package importer + +import ( + "bytes" + "context" + "io" + "io/ioutil" + "testing" + + uio "github.com/ipfs/go-ipfs/unixfs/io" + mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" +) + +func getBalancedDag(t testing.TB, size int64, blksize int64) (ipld.Node, ipld.DAGService) { + ds := mdtest.Mock() + r := io.LimitReader(u.NewTimeSeededRand(), size) + nd, err := BuildDagFromReader(ds, chunker.NewSizeSplitter(r, blksize)) + if err != nil { + t.Fatal(err) + } + return nd, ds +} + +func getTrickleDag(t testing.TB, size int64, blksize int64) (ipld.Node, ipld.DAGService) { + ds := mdtest.Mock() + r := io.LimitReader(u.NewTimeSeededRand(), size) + nd, err := BuildTrickleDagFromReader(ds, chunker.NewSizeSplitter(r, blksize)) + if err != nil { + t.Fatal(err) + } + return nd, ds +} + +func TestBalancedDag(t *testing.T) { + ds := mdtest.Mock() + buf := make([]byte, 10000) + u.NewTimeSeededRand().Read(buf) + r := bytes.NewReader(buf) + + nd, err := BuildDagFromReader(ds, chunker.DefaultSplitter(r)) + if err != nil { + t.Fatal(err) + } + + dr, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(dr) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(out, buf) { + t.Fatal("bad read") + } +} + +func BenchmarkBalancedReadSmallBlock(b *testing.B) { + b.StopTimer() + nbytes := int64(10000000) + nd, ds := getBalancedDag(b, nbytes, 4096) + + b.SetBytes(nbytes) + b.StartTimer() + runReadBench(b, nd, ds) +} + +func BenchmarkTrickleReadSmallBlock(b *testing.B) { + b.StopTimer() + nbytes := int64(10000000) + nd, ds := getTrickleDag(b, nbytes, 4096) + + b.SetBytes(nbytes) + b.StartTimer() + runReadBench(b, nd, ds) +} + +func BenchmarkBalancedReadFull(b *testing.B) { + b.StopTimer() + nbytes := int64(10000000) + nd, ds := getBalancedDag(b, nbytes, chunker.DefaultBlockSize) + + b.SetBytes(nbytes) + b.StartTimer() + runReadBench(b, nd, ds) +} + +func BenchmarkTrickleReadFull(b *testing.B) { + b.StopTimer() + nbytes := int64(10000000) + nd, ds := getTrickleDag(b, nbytes, chunker.DefaultBlockSize) + + b.SetBytes(nbytes) + b.StartTimer() + runReadBench(b, nd, ds) +} + +func runReadBench(b *testing.B, nd ipld.Node, ds ipld.DAGService) { + for i := 0; i < b.N; i++ { + ctx, cancel := context.WithCancel(context.Background()) + read, err := uio.NewDagReader(ctx, nd, ds) + if err != nil { + b.Fatal(err) + } + + _, err = read.WriteTo(ioutil.Discard) + if err != nil && err != io.EOF { + b.Fatal(err) + } + cancel() + } +} diff --git a/unixfs/importer/trickle/trickle_test.go b/unixfs/importer/trickle/trickle_test.go new file mode 100644 index 0000000000..097ae32e9a --- /dev/null +++ b/unixfs/importer/trickle/trickle_test.go @@ -0,0 +1,640 @@ +package trickle + +import ( + "bytes" + "context" + "fmt" + "io" + "io/ioutil" + mrand "math/rand" + "testing" + + h "github.com/ipfs/go-ipfs/importer/helpers" + ft "github.com/ipfs/go-ipfs/unixfs" + uio "github.com/ipfs/go-ipfs/unixfs/io" + merkledag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" +) + +type UseRawLeaves bool + +const ( + ProtoBufLeaves UseRawLeaves = false + RawLeaves UseRawLeaves = true +) + +func runBothSubtests(t *testing.T, tfunc func(*testing.T, UseRawLeaves)) { + t.Run("leaves=ProtoBuf", func(t *testing.T) { tfunc(t, ProtoBufLeaves) }) + t.Run("leaves=Raw", func(t *testing.T) { tfunc(t, RawLeaves) }) +} + +func buildTestDag(ds ipld.DAGService, spl chunker.Splitter, rawLeaves UseRawLeaves) (*merkledag.ProtoNode, error) { + dbp := h.DagBuilderParams{ + Dagserv: ds, + Maxlinks: h.DefaultLinksPerBlock, + RawLeaves: bool(rawLeaves), + } + + nd, err := Layout(dbp.New(spl)) + if err != nil { + return nil, err + } + + pbnd, ok := nd.(*merkledag.ProtoNode) + if !ok { + return nil, merkledag.ErrNotProtobuf + } + + return pbnd, VerifyTrickleDagStructure(pbnd, VerifyParams{ + Getter: ds, + Direct: dbp.Maxlinks, + LayerRepeat: layerRepeat, + RawLeaves: bool(rawLeaves), + }) +} + +//Test where calls to read are smaller than the chunk size +func TestSizeBasedSplit(t *testing.T) { + runBothSubtests(t, testSizeBasedSplit) +} + +func testSizeBasedSplit(t *testing.T, rawLeaves UseRawLeaves) { + if testing.Short() { + t.SkipNow() + } + bs := chunker.SizeSplitterGen(512) + testFileConsistency(t, bs, 32*512, rawLeaves) + + bs = chunker.SizeSplitterGen(4096) + testFileConsistency(t, bs, 32*4096, rawLeaves) + + // Uneven offset + testFileConsistency(t, bs, 31*4095, rawLeaves) +} + +func dup(b []byte) []byte { + o := make([]byte, len(b)) + copy(o, b) + return o +} + +func testFileConsistency(t *testing.T, bs chunker.SplitterGen, nbytes int, rawLeaves UseRawLeaves) { + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, bs(read), rawLeaves) + if err != nil { + t.Fatal(err) + } + + r, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(r) + if err != nil { + t.Fatal(err) + } + + err = arrComp(out, should) + if err != nil { + t.Fatal(err) + } +} + +func TestBuilderConsistency(t *testing.T) { + runBothSubtests(t, testBuilderConsistency) +} + +func testBuilderConsistency(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := 100000 + buf := new(bytes.Buffer) + io.CopyN(buf, u.NewTimeSeededRand(), int64(nbytes)) + should := dup(buf.Bytes()) + dagserv := mdtest.Mock() + nd, err := buildTestDag(dagserv, chunker.DefaultSplitter(buf), rawLeaves) + if err != nil { + t.Fatal(err) + } + r, err := uio.NewDagReader(context.Background(), nd, dagserv) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(r) + if err != nil { + t.Fatal(err) + } + + err = arrComp(out, should) + if err != nil { + t.Fatal(err) + } +} + +func arrComp(a, b []byte) error { + if len(a) != len(b) { + return fmt.Errorf("arrays differ in length. %d != %d", len(a), len(b)) + } + for i, v := range a { + if v != b[i] { + return fmt.Errorf("arrays differ at index: %d", i) + } + } + return nil +} + +func TestIndirectBlocks(t *testing.T) { + runBothSubtests(t, testIndirectBlocks) +} + +func testIndirectBlocks(t *testing.T, rawLeaves UseRawLeaves) { + splitter := chunker.SizeSplitterGen(512) + nbytes := 1024 * 1024 + buf := make([]byte, nbytes) + u.NewTimeSeededRand().Read(buf) + + read := bytes.NewReader(buf) + + ds := mdtest.Mock() + dag, err := buildTestDag(ds, splitter(read), rawLeaves) + if err != nil { + t.Fatal(err) + } + + reader, err := uio.NewDagReader(context.Background(), dag, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(reader) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(out, buf) { + t.Fatal("Not equal!") + } +} + +func TestSeekingBasic(t *testing.T) { + runBothSubtests(t, testSeekingBasic) +} + +func testSeekingBasic(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(10 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 512), rawLeaves) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + start := int64(4000) + n, err := rs.Seek(start, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if n != start { + t.Fatal("Failed to seek to correct offset") + } + + out, err := ioutil.ReadAll(rs) + if err != nil { + t.Fatal(err) + } + + err = arrComp(out, should[start:]) + if err != nil { + t.Fatal(err) + } +} + +func TestSeekToBegin(t *testing.T) { + runBothSubtests(t, testSeekToBegin) +} + +func testSeekToBegin(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(10 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 500), rawLeaves) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + if err != nil { + t.Fatal(err) + } + if n != 4096 { + t.Fatal("Copy didnt copy enough bytes") + } + + seeked, err := rs.Seek(0, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if seeked != 0 { + t.Fatal("Failed to seek to beginning") + } + + out, err := ioutil.ReadAll(rs) + if err != nil { + t.Fatal(err) + } + + err = arrComp(out, should) + if err != nil { + t.Fatal(err) + } +} + +func TestSeekToAlmostBegin(t *testing.T) { + runBothSubtests(t, testSeekToAlmostBegin) +} + +func testSeekToAlmostBegin(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(10 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 500), rawLeaves) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + if err != nil { + t.Fatal(err) + } + if n != 4096 { + t.Fatal("Copy didnt copy enough bytes") + } + + seeked, err := rs.Seek(1, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if seeked != 1 { + t.Fatal("Failed to seek to almost beginning") + } + + out, err := ioutil.ReadAll(rs) + if err != nil { + t.Fatal(err) + } + + err = arrComp(out, should[1:]) + if err != nil { + t.Fatal(err) + } +} + +func TestSeekEnd(t *testing.T) { + runBothSubtests(t, testSeekEnd) +} + +func testSeekEnd(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(50 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 500), rawLeaves) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + seeked, err := rs.Seek(0, io.SeekEnd) + if err != nil { + t.Fatal(err) + } + if seeked != nbytes { + t.Fatal("Failed to seek to end") + } +} + +func TestSeekEndSingleBlockFile(t *testing.T) { + runBothSubtests(t, testSeekEndSingleBlockFile) +} + +func testSeekEndSingleBlockFile(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(100) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 5000), rawLeaves) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + seeked, err := rs.Seek(0, io.SeekEnd) + if err != nil { + t.Fatal(err) + } + if seeked != nbytes { + t.Fatal("Failed to seek to end") + } +} + +func TestSeekingStress(t *testing.T) { + runBothSubtests(t, testSeekingStress) +} + +func testSeekingStress(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(1024 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 1000), rawLeaves) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + testbuf := make([]byte, nbytes) + for i := 0; i < 50; i++ { + offset := mrand.Intn(int(nbytes)) + l := int(nbytes) - offset + n, err := rs.Seek(int64(offset), io.SeekStart) + if err != nil { + t.Fatal(err) + } + if n != int64(offset) { + t.Fatal("Seek failed to move to correct position") + } + + nread, err := rs.Read(testbuf[:l]) + if err != nil { + t.Fatal(err) + } + if nread != l { + t.Fatal("Failed to read enough bytes") + } + + err = arrComp(testbuf[:l], should[offset:offset+l]) + if err != nil { + t.Fatal(err) + } + } + +} + +func TestSeekingConsistency(t *testing.T) { + runBothSubtests(t, testSeekingConsistency) +} + +func testSeekingConsistency(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(128 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 500), rawLeaves) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + out := make([]byte, nbytes) + + for coff := nbytes - 4096; coff >= 0; coff -= 4096 { + t.Log(coff) + n, err := rs.Seek(coff, io.SeekStart) + if err != nil { + t.Fatal(err) + } + if n != coff { + t.Fatal("wasnt able to seek to the right position") + } + nread, err := rs.Read(out[coff : coff+4096]) + if err != nil { + t.Fatal(err) + } + if nread != 4096 { + t.Fatal("didnt read the correct number of bytes") + } + } + + err = arrComp(out, should) + if err != nil { + t.Fatal(err) + } +} + +func TestAppend(t *testing.T) { + runBothSubtests(t, testAppend) +} + +func testAppend(t *testing.T, rawLeaves UseRawLeaves) { + nbytes := int64(128 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + // Reader for half the bytes + read := bytes.NewReader(should[:nbytes/2]) + ds := mdtest.Mock() + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 500), rawLeaves) + if err != nil { + t.Fatal(err) + } + + dbp := &h.DagBuilderParams{ + Dagserv: ds, + Maxlinks: h.DefaultLinksPerBlock, + RawLeaves: bool(rawLeaves), + } + + r := bytes.NewReader(should[nbytes/2:]) + + ctx := context.Background() + nnode, err := Append(ctx, nd, dbp.New(chunker.NewSizeSplitter(r, 500))) + if err != nil { + t.Fatal(err) + } + + err = VerifyTrickleDagStructure(nnode, VerifyParams{ + Getter: ds, + Direct: dbp.Maxlinks, + LayerRepeat: layerRepeat, + RawLeaves: bool(rawLeaves), + }) + if err != nil { + t.Fatal(err) + } + + fread, err := uio.NewDagReader(ctx, nnode, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(fread) + if err != nil { + t.Fatal(err) + } + + err = arrComp(out, should) + if err != nil { + t.Fatal(err) + } +} + +// This test appends one byte at a time to an empty file +func TestMultipleAppends(t *testing.T) { + runBothSubtests(t, testMultipleAppends) +} + +func testMultipleAppends(t *testing.T, rawLeaves UseRawLeaves) { + ds := mdtest.Mock() + + // TODO: fix small size appends and make this number bigger + nbytes := int64(1000) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(nil) + nd, err := buildTestDag(ds, chunker.NewSizeSplitter(read, 500), rawLeaves) + if err != nil { + t.Fatal(err) + } + + dbp := &h.DagBuilderParams{ + Dagserv: ds, + Maxlinks: 4, + RawLeaves: bool(rawLeaves), + } + + spl := chunker.SizeSplitterGen(500) + + ctx := context.Background() + for i := 0; i < len(should); i++ { + + nnode, err := Append(ctx, nd, dbp.New(spl(bytes.NewReader(should[i:i+1])))) + if err != nil { + t.Fatal(err) + } + + err = VerifyTrickleDagStructure(nnode, VerifyParams{ + Getter: ds, + Direct: dbp.Maxlinks, + LayerRepeat: layerRepeat, + RawLeaves: bool(rawLeaves), + }) + if err != nil { + t.Fatal(err) + } + + fread, err := uio.NewDagReader(ctx, nnode, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(fread) + if err != nil { + t.Fatal(err) + } + + err = arrComp(out, should[:i+1]) + if err != nil { + t.Fatal(err) + } + } +} + +func TestAppendSingleBytesToEmpty(t *testing.T) { + ds := mdtest.Mock() + + data := []byte("AB") + + nd := new(merkledag.ProtoNode) + nd.SetData(ft.FilePBData(nil, 0)) + + dbp := &h.DagBuilderParams{ + Dagserv: ds, + Maxlinks: 4, + } + + spl := chunker.SizeSplitterGen(500) + + ctx := context.Background() + nnode, err := Append(ctx, nd, dbp.New(spl(bytes.NewReader(data[:1])))) + if err != nil { + t.Fatal(err) + } + + nnode, err = Append(ctx, nnode, dbp.New(spl(bytes.NewReader(data[1:])))) + if err != nil { + t.Fatal(err) + } + + fread, err := uio.NewDagReader(ctx, nnode, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(fread) + if err != nil { + t.Fatal(err) + } + + fmt.Println(out, data) + err = arrComp(out, data) + if err != nil { + t.Fatal(err) + } +} diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go new file mode 100644 index 0000000000..1bba05f716 --- /dev/null +++ b/unixfs/importer/trickle/trickledag.go @@ -0,0 +1,366 @@ +// Package trickle allows to build trickle DAGs. +// In this type of DAG, non-leave nodes are first filled +// with data leaves, and then incorporate "layers" of subtrees +// as additional links. +// +// Each layer is a trickle sub-tree and is limited by an increasing +// maximum depth. Thus, the nodes first layer +// can only hold leaves (depth 1) but subsequent layers can grow deeper. +// By default, this module places 4 nodes per layer (that is, 4 subtrees +// of the same maximum depth before increasing it). +// +// Trickle DAGs are very good for sequentially reading data, as the +// first data leaves are directly reachable from the root and those +// coming next are always nearby. They are +// suited for things like streaming applications. +package trickle + +import ( + "context" + "errors" + "fmt" + + h "github.com/ipfs/go-ipfs/importer/helpers" + ft "github.com/ipfs/go-ipfs/unixfs" + dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + + cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" +) + +// layerRepeat specifies how many times to append a child tree of a +// given depth. Higher values increase the width of a given node, which +// improves seek speeds. +const layerRepeat = 4 + +// Layout builds a new DAG with the trickle format using the provided +// DagBuilderHelper. See the module's description for a more detailed +// explanation. +func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { + root := db.NewUnixfsNode() + if err := fillTrickleRec(db, root, -1); err != nil { + return nil, err + } + + out, err := db.Add(root) + if err != nil { + return nil, err + } + + if err := db.Close(); err != nil { + return nil, err + } + + return out, nil +} + +// fillTrickleRec creates a trickle (sub-)tree with an optional maximum specified depth +// in the case maxDepth is greater than zero, or with unlimited depth otherwise +// (where the DAG builder will signal the end of data to end the function). +func fillTrickleRec(db *h.DagBuilderHelper, node *h.UnixfsNode, maxDepth int) error { + // Always do this, even in the base case + if err := db.FillNodeLayer(node); err != nil { + return err + } + + for depth := 1; ; depth++ { + // Apply depth limit only if the parameter is set (> 0). + if maxDepth > 0 && depth == maxDepth { + return nil + } + for layer := 0; layer < layerRepeat; layer++ { + if db.Done() { + return nil + } + + nextChild := db.NewUnixfsNode() + if err := fillTrickleRec(db, nextChild, depth); err != nil { + return err + } + + if err := node.AddChild(nextChild, db); err != nil { + return err + } + } + } +} + +// Append appends the data in `db` to the dag, using the Trickledag format +func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out ipld.Node, errOut error) { + base, ok := basen.(*dag.ProtoNode) + if !ok { + return nil, dag.ErrNotProtobuf + } + + defer func() { + if errOut == nil { + if err := db.Close(); err != nil { + errOut = err + } + } + }() + + // Convert to unixfs node for working with easily + ufsn, err := h.NewUnixfsNodeFromDag(base) + if err != nil { + return nil, err + } + + // Get depth of this 'tree' + n, layerProgress := trickleDepthInfo(ufsn, db.Maxlinks()) + if n == 0 { + // If direct blocks not filled... + if err := db.FillNodeLayer(ufsn); err != nil { + return nil, err + } + + if db.Done() { + return ufsn.GetDagNode() + } + + // If continuing, our depth has increased by one + n++ + } + + // Last child in this node may not be a full tree, lets file it up + if err := appendFillLastChild(ctx, ufsn, n-1, layerProgress, db); err != nil { + return nil, err + } + + // after appendFillLastChild, our depth is now increased by one + if !db.Done() { + n++ + } + + // Now, continue filling out tree like normal + for i := n; !db.Done(); i++ { + for j := 0; j < layerRepeat && !db.Done(); j++ { + next := db.NewUnixfsNode() + err := fillTrickleRec(db, next, i) + if err != nil { + return nil, err + } + + err = ufsn.AddChild(next, db) + if err != nil { + return nil, err + } + } + } + + return ufsn.GetDagNode() +} + +// appendFillLastChild will take in an incomplete trickledag node (uncomplete meaning, not full) and +// fill it out to the specified depth with blocks from the given DagBuilderHelper +func appendFillLastChild(ctx context.Context, ufsn *h.UnixfsNode, depth int, layerFill int, db *h.DagBuilderHelper) error { + if ufsn.NumChildren() <= db.Maxlinks() { + return nil + } + // Recursive step, grab last child + last := ufsn.NumChildren() - 1 + lastChild, err := ufsn.GetChild(ctx, last, db.GetDagServ()) + if err != nil { + return err + } + + // Fill out last child (may not be full tree) + nchild, err := appendRec(ctx, lastChild, db, depth-1) + if err != nil { + return err + } + + // Update changed child in parent node + ufsn.RemoveChild(last, db) + err = ufsn.AddChild(nchild, db) + if err != nil { + return err + } + + // Partially filled depth layer + if layerFill != 0 { + for ; layerFill < layerRepeat && !db.Done(); layerFill++ { + next := db.NewUnixfsNode() + err := fillTrickleRec(db, next, depth) + if err != nil { + return err + } + + err = ufsn.AddChild(next, db) + if err != nil { + return err + } + } + } + + return nil +} + +// recursive call for Append +func appendRec(ctx context.Context, ufsn *h.UnixfsNode, db *h.DagBuilderHelper, depth int) (*h.UnixfsNode, error) { + if depth == 0 || db.Done() { + return ufsn, nil + } + + // Get depth of this 'tree' + n, layerProgress := trickleDepthInfo(ufsn, db.Maxlinks()) + if n == 0 { + // If direct blocks not filled... + if err := db.FillNodeLayer(ufsn); err != nil { + return nil, err + } + n++ + } + + // If at correct depth, no need to continue + if n == depth { + return ufsn, nil + } + + if err := appendFillLastChild(ctx, ufsn, n, layerProgress, db); err != nil { + return nil, err + } + + // after appendFillLastChild, our depth is now increased by one + if !db.Done() { + n++ + } + + // Now, continue filling out tree like normal + for i := n; i < depth && !db.Done(); i++ { + for j := 0; j < layerRepeat && !db.Done(); j++ { + next := db.NewUnixfsNode() + if err := fillTrickleRec(db, next, i); err != nil { + return nil, err + } + + if err := ufsn.AddChild(next, db); err != nil { + return nil, err + } + } + } + + return ufsn, nil +} + +func trickleDepthInfo(node *h.UnixfsNode, maxlinks int) (int, int) { + n := node.NumChildren() + if n < maxlinks { + return 0, 0 + } + + return ((n - maxlinks) / layerRepeat) + 1, (n - maxlinks) % layerRepeat +} + +// VerifyParams is used by VerifyTrickleDagStructure +type VerifyParams struct { + Getter ipld.NodeGetter + Direct int + LayerRepeat int + Prefix *cid.Prefix + RawLeaves bool +} + +// VerifyTrickleDagStructure checks that the given dag matches exactly the trickle dag datastructure +// layout +func VerifyTrickleDagStructure(nd ipld.Node, p VerifyParams) error { + return verifyTDagRec(nd, -1, p) +} + +// Recursive call for verifying the structure of a trickledag +func verifyTDagRec(n ipld.Node, depth int, p VerifyParams) error { + codec := cid.DagProtobuf + if depth == 0 { + if len(n.Links()) > 0 { + return errors.New("expected direct block") + } + // zero depth dag is raw data block + switch nd := n.(type) { + case *dag.ProtoNode: + pbn, err := ft.FromBytes(nd.Data()) + if err != nil { + return err + } + + if pbn.GetType() != ft.TRaw { + return errors.New("expected raw block") + } + + if p.RawLeaves { + return errors.New("expected raw leaf, got a protobuf node") + } + case *dag.RawNode: + if !p.RawLeaves { + return errors.New("expected protobuf node as leaf") + } + codec = cid.Raw + default: + return errors.New("expected ProtoNode or RawNode") + } + } + + // verify prefix + if p.Prefix != nil { + prefix := n.Cid().Prefix() + expect := *p.Prefix // make a copy + expect.Codec = uint64(codec) + if codec == cid.Raw && expect.Version == 0 { + expect.Version = 1 + } + if expect.MhLength == -1 { + expect.MhLength = prefix.MhLength + } + if prefix != expect { + return fmt.Errorf("unexpected cid prefix: expected: %v; got %v", expect, prefix) + } + } + + if depth == 0 { + return nil + } + + nd, ok := n.(*dag.ProtoNode) + if !ok { + return errors.New("expected ProtoNode") + } + + // Verify this is a branch node + pbn, err := ft.FromBytes(nd.Data()) + if err != nil { + return err + } + + if pbn.GetType() != ft.TFile { + return fmt.Errorf("expected file as branch node, got: %s", pbn.GetType()) + } + + if len(pbn.Data) > 0 { + return errors.New("branch node should not have data") + } + + for i := 0; i < len(nd.Links()); i++ { + child, err := nd.Links()[i].GetNode(context.TODO(), p.Getter) + if err != nil { + return err + } + + if i < p.Direct { + // Direct blocks + err := verifyTDagRec(child, 0, p) + if err != nil { + return err + } + } else { + // Recursive trickle dags + rdepth := ((i - p.Direct) / p.LayerRepeat) + 1 + if rdepth >= depth && depth > 0 { + return errors.New("child dag was too deep") + } + err := verifyTDagRec(child, rdepth, p) + if err != nil { + return err + } + } + } + return nil +} From ece006dc44a122bf762187c57b1a9db0f2a25fcb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Jul 2018 14:08:11 -0700 Subject: [PATCH 2166/3147] packageify This commit was moved from ipfs/go-unixfs@827e1b6e1cbeaa83ea98fa4ff657909df7acc2db --- unixfs/LICENSE | 21 ++++++++ unixfs/README.md | 63 +++++++++++++++++++++++ unixfs/archive/archive.go | 6 +-- unixfs/archive/tar/writer.go | 10 ++-- unixfs/hamt/hamt.go | 18 +++---- unixfs/hamt/hamt_stress_test.go | 6 +-- unixfs/hamt/hamt_test.go | 8 +-- unixfs/importer/balanced/balanced_test.go | 16 +++--- unixfs/importer/balanced/builder.go | 8 +-- unixfs/importer/helpers/dagbuilder.go | 18 +++---- unixfs/importer/helpers/helpers.go | 10 ++-- unixfs/importer/importer.go | 10 ++-- unixfs/importer/importer_test.go | 10 ++-- unixfs/importer/trickle/trickle_test.go | 18 +++---- unixfs/importer/trickle/trickledag.go | 10 ++-- unixfs/io/dagreader.go | 8 +-- unixfs/io/dagreader_test.go | 6 +-- unixfs/io/directory.go | 10 ++-- unixfs/io/directory_test.go | 4 +- unixfs/io/pbdagreader.go | 10 ++-- unixfs/io/resolve.go | 8 +-- unixfs/mod/dagmodifier.go | 20 +++---- unixfs/mod/dagmodifier_test.go | 11 ++-- unixfs/pb/unixfs.pb.go | 2 +- unixfs/test/utils.go | 22 ++++---- unixfs/unixfs.go | 6 +-- unixfs/unixfs_test.go | 4 +- 27 files changed, 213 insertions(+), 130 deletions(-) create mode 100644 unixfs/LICENSE create mode 100644 unixfs/README.md diff --git a/unixfs/LICENSE b/unixfs/LICENSE new file mode 100644 index 0000000000..7d5dcac4d2 --- /dev/null +++ b/unixfs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Juan Batiz-Benet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/unixfs/README.md b/unixfs/README.md new file mode 100644 index 0000000000..9a22fbd3af --- /dev/null +++ b/unixfs/README.md @@ -0,0 +1,63 @@ +go-unixfs +================== + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![Coverage Status](https://codecov.io/gh/ipfs/go-unixfs/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-unixfs/branch/master) +[![Travis CI](https://travis-ci.org/ipfs/go-unixfs.svg?branch=master)](https://travis-ci.org/ipfs/go-unixfs) + +> go-unixfs implements unix-like filesystem utilities on top of an ipld merkledag + + +## Table of Contents + +- [Directory](#directory) +- [Install](#install) +- [Contribute](#contribute) +- [License](#license) + +## Package Directory +This package contains many subpackages, each of which can be very large on its own. + +### Top Level +The top level unixfs package defines the unixfs format datastructures, and some helper methods around it. + +### importers +The `importer` subpackage is what you'll use when you want to turn a normal file into a unixfs file. + +### io +The `io` subpackage provides helpers for reading files and manipulating directories. The `DagReader` takes a +reference to a unixfs file and returns a file handle that can be read from and seeked through. The `Directory` +interface allows you to easily read items in a directory, add items to a directory, and do lookups. + +### mod +The `mod` subpackage implements a `DagModifier` type that can be used to write to an existing unixfs file, or +create a new one. The logic for this is significantly more complicated than for the dagreader, so its a separate +type. (TODO: maybe it still belongs in the `io` subpackage though?) + +### hamt +The `hamt` subpackage implements a CHAMP hamt that is used in unixfs directory sharding. + +### archive +The `archive` subpackage implements a `tar` importer and exporter. The objects created here are not officially unixfs, +but in the future, this may be integrated more directly. + +### test +The `test` subpackage provides several utilities to make testing unixfs related things easier. + +## Install + +```sh +go get github.com/ipfs/go-unixfs +``` + +## Contribute + +PRs are welcome! + +Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Juan Batiz-Benet diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 96c12f6823..6396ca0aee 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -8,10 +8,10 @@ import ( "io" "path" - tar "github.com/ipfs/go-ipfs/unixfs/archive/tar" - uio "github.com/ipfs/go-ipfs/unixfs/io" + tar "github.com/ipfs/go-unixfs/archive/tar" + uio "github.com/ipfs/go-unixfs/io" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index d0a30c0d6d..7e20e6d773 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -10,12 +10,12 @@ import ( "path" "time" - ft "github.com/ipfs/go-ipfs/unixfs" - uio "github.com/ipfs/go-ipfs/unixfs/io" - upb "github.com/ipfs/go-ipfs/unixfs/pb" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" + uio "github.com/ipfs/go-unixfs/io" + upb "github.com/ipfs/go-unixfs/pb" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) // Writer is a utility structure that helps to write diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index f4013884c8..6887a148d0 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -25,15 +25,15 @@ import ( "fmt" "os" - format "github.com/ipfs/go-ipfs/unixfs" - upb "github.com/ipfs/go-ipfs/unixfs/pb" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - - bitfield "gx/ipfs/QmTbBs3Y3u5F69XNJzdnnc6SP5GKgcXxCDzx6w8m6piVRT/go-bitfield" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - "gx/ipfs/QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx/murmur3" + dag "github.com/ipfs/go-merkledag" + format "github.com/ipfs/go-unixfs" + upb "github.com/ipfs/go-unixfs/pb" + + bitfield "github.com/Stebalien/go-bitfield" + proto "github.com/gogo/protobuf/proto" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" + "github.com/spaolacci/murmur3" ) const ( diff --git a/unixfs/hamt/hamt_stress_test.go b/unixfs/hamt/hamt_stress_test.go index 311f6f0d35..10eb15281d 100644 --- a/unixfs/hamt/hamt_stress_test.go +++ b/unixfs/hamt/hamt_stress_test.go @@ -8,10 +8,10 @@ import ( "testing" "time" - ft "github.com/ipfs/go-ipfs/unixfs" - mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + mdtest "github.com/ipfs/go-merkledag/test" + ft "github.com/ipfs/go-unixfs" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) func getNames(prefix string, count int) []string { diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index ed6eaf70db..655365261e 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -10,11 +10,11 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - ft "github.com/ipfs/go-ipfs/unixfs" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + dag "github.com/ipfs/go-merkledag" + mdtest "github.com/ipfs/go-merkledag/test" + ft "github.com/ipfs/go-unixfs" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) func shuffle(seed int64, arr []string) { diff --git a/unixfs/importer/balanced/balanced_test.go b/unixfs/importer/balanced/balanced_test.go index f1f636e565..1f135b781b 100644 --- a/unixfs/importer/balanced/balanced_test.go +++ b/unixfs/importer/balanced/balanced_test.go @@ -9,14 +9,14 @@ import ( mrand "math/rand" "testing" - h "github.com/ipfs/go-ipfs/importer/helpers" - uio "github.com/ipfs/go-ipfs/unixfs/io" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" - - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + h "github.com/ipfs/go-unixfs/importer/helpers" + uio "github.com/ipfs/go-unixfs/io" + + chunker "github.com/ipfs/go-ipfs-chunker" + u "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" + dag "github.com/ipfs/go-merkledag" + mdtest "github.com/ipfs/go-merkledag/test" ) // TODO: extract these tests and more as a generic layout test suite diff --git a/unixfs/importer/balanced/builder.go b/unixfs/importer/balanced/builder.go index feab6cf50d..55b9ccb365 100644 --- a/unixfs/importer/balanced/builder.go +++ b/unixfs/importer/balanced/builder.go @@ -5,7 +5,7 @@ // depth (and having more intermediary nodes). // // Internal nodes are always represented by UnixFS nodes (of type `File`) encoded -// inside DAG nodes (see the `go-ipfs/unixfs` package for details of UnixFS). In +// inside DAG nodes (see the `go-unixfs` package for details of UnixFS). In // contrast, leaf nodes with data have multiple possible representations: UnixFS // nodes as above, raw nodes with just the file data (no format) and Filestore // nodes (that directly link to the file on disk using a format stored on a raw @@ -43,10 +43,10 @@ package balanced import ( "errors" - h "github.com/ipfs/go-ipfs/importer/helpers" - ft "github.com/ipfs/go-ipfs/unixfs" + ft "github.com/ipfs/go-unixfs" + h "github.com/ipfs/go-unixfs/importer/helpers" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) // Layout builds a balanced DAG layout. In a balanced DAG of depth 1, leaf nodes diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 4b37a7f032..387b263047 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -5,15 +5,15 @@ import ( "io" "os" - ft "github.com/ipfs/go-ipfs/unixfs" - pb "github.com/ipfs/go-ipfs/unixfs/pb" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - - pi "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - files "gx/ipfs/QmdE4gMduCKCGAcczM2F5ioYDfdeKuPix138wrES1YSr7f/go-ipfs-cmdkit/files" + dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" + pb "github.com/ipfs/go-unixfs/pb" + + cid "github.com/ipfs/go-cid" + chunker "github.com/ipfs/go-ipfs-chunker" + files "github.com/ipfs/go-ipfs-cmdkit/files" + pi "github.com/ipfs/go-ipfs-posinfo" + ipld "github.com/ipfs/go-ipld-format" ) // DagBuilderHelper wraps together a bunch of objects needed to diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index 462dc1dcf1..6fb0f83c8d 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -5,12 +5,12 @@ import ( "fmt" "os" - ft "github.com/ipfs/go-ipfs/unixfs" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" - pi "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + cid "github.com/ipfs/go-cid" + pi "github.com/ipfs/go-ipfs-posinfo" + ipld "github.com/ipfs/go-ipld-format" ) // BlockSizeLimit specifies the maximum size an imported block can have. diff --git a/unixfs/importer/importer.go b/unixfs/importer/importer.go index cc5028ee2f..ecf016854d 100644 --- a/unixfs/importer/importer.go +++ b/unixfs/importer/importer.go @@ -3,12 +3,12 @@ package importer import ( - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + bal "github.com/ipfs/go-unixfs/importer/balanced" + h "github.com/ipfs/go-unixfs/importer/helpers" + trickle "github.com/ipfs/go-unixfs/importer/trickle" - bal "github.com/ipfs/go-ipfs/importer/balanced" - h "github.com/ipfs/go-ipfs/importer/helpers" - trickle "github.com/ipfs/go-ipfs/importer/trickle" + chunker "github.com/ipfs/go-ipfs-chunker" + ipld "github.com/ipfs/go-ipld-format" ) // BuildDagFromReader creates a DAG given a DAGService and a Splitter diff --git a/unixfs/importer/importer_test.go b/unixfs/importer/importer_test.go index 0b9c75ce89..55f8a9480a 100644 --- a/unixfs/importer/importer_test.go +++ b/unixfs/importer/importer_test.go @@ -7,12 +7,12 @@ import ( "io/ioutil" "testing" - uio "github.com/ipfs/go-ipfs/unixfs/io" - mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + mdtest "github.com/ipfs/go-merkledag/test" + uio "github.com/ipfs/go-unixfs/io" - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + chunker "github.com/ipfs/go-ipfs-chunker" + u "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" ) func getBalancedDag(t testing.TB, size int64, blksize int64) (ipld.Node, ipld.DAGService) { diff --git a/unixfs/importer/trickle/trickle_test.go b/unixfs/importer/trickle/trickle_test.go index 097ae32e9a..9c568c9865 100644 --- a/unixfs/importer/trickle/trickle_test.go +++ b/unixfs/importer/trickle/trickle_test.go @@ -9,15 +9,15 @@ import ( mrand "math/rand" "testing" - h "github.com/ipfs/go-ipfs/importer/helpers" - ft "github.com/ipfs/go-ipfs/unixfs" - uio "github.com/ipfs/go-ipfs/unixfs/io" - merkledag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" - - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ft "github.com/ipfs/go-unixfs" + h "github.com/ipfs/go-unixfs/importer/helpers" + uio "github.com/ipfs/go-unixfs/io" + + chunker "github.com/ipfs/go-ipfs-chunker" + u "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" + merkledag "github.com/ipfs/go-merkledag" + mdtest "github.com/ipfs/go-merkledag/test" ) type UseRawLeaves bool diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 1bba05f716..30c9618618 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -20,12 +20,12 @@ import ( "errors" "fmt" - h "github.com/ipfs/go-ipfs/importer/helpers" - ft "github.com/ipfs/go-ipfs/unixfs" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + ft "github.com/ipfs/go-unixfs" + h "github.com/ipfs/go-unixfs/importer/helpers" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" + dag "github.com/ipfs/go-merkledag" ) // layerRepeat specifies how many times to append a child tree of a diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 0ef962f51f..02bb64afde 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -5,11 +5,11 @@ import ( "errors" "io" - ft "github.com/ipfs/go-ipfs/unixfs" - ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" + ftpb "github.com/ipfs/go-unixfs/pb" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) // Common errors diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index f2b0b0af66..6e1fef8d04 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -8,12 +8,12 @@ import ( "strings" "testing" - "github.com/ipfs/go-ipfs/unixfs" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdag "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-unixfs" context "context" - testu "github.com/ipfs/go-ipfs/unixfs/test" + testu "github.com/ipfs/go-unixfs/test" ) func TestBasicRead(t *testing.T) { diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 6f07aff045..89864566ee 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -5,12 +5,12 @@ import ( "fmt" "os" - format "github.com/ipfs/go-ipfs/unixfs" - hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdag "github.com/ipfs/go-merkledag" + format "github.com/ipfs/go-unixfs" + hamt "github.com/ipfs/go-unixfs/hamt" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" ) // UseHAMTSharding is a global flag that signifies whether or not to use the diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 4df5a031bc..64a1ef2c61 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -5,8 +5,8 @@ import ( "fmt" "testing" - ft "github.com/ipfs/go-ipfs/unixfs" - mdtest "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" + mdtest "github.com/ipfs/go-merkledag/test" + ft "github.com/ipfs/go-unixfs" ) func TestEmptyNode(t *testing.T) { diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 93c852e624..8e7872e8e6 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -6,12 +6,12 @@ import ( "fmt" "io" - ft "github.com/ipfs/go-ipfs/unixfs" - ftpb "github.com/ipfs/go-ipfs/unixfs/pb" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" + ftpb "github.com/ipfs/go-unixfs/pb" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" ) // PBDagReader provides a way to easily read the data contained in a dag. diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 68476d9ed3..5b0e6783a1 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -3,11 +3,11 @@ package io import ( "context" - ft "github.com/ipfs/go-ipfs/unixfs" - hamt "github.com/ipfs/go-ipfs/unixfs/hamt" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" + hamt "github.com/ipfs/go-unixfs/hamt" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) // ResolveUnixfsOnce resolves a single hop of a path through a graph in a diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index f87e355342..09665b80ca 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -8,16 +8,16 @@ import ( "errors" "io" - help "github.com/ipfs/go-ipfs/importer/helpers" - trickle "github.com/ipfs/go-ipfs/importer/trickle" - ft "github.com/ipfs/go-ipfs/unixfs" - uio "github.com/ipfs/go-ipfs/unixfs/io" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ft "github.com/ipfs/go-unixfs" + help "github.com/ipfs/go-unixfs/importer/helpers" + trickle "github.com/ipfs/go-unixfs/importer/trickle" + uio "github.com/ipfs/go-unixfs/io" + + proto "github.com/gogo/protobuf/proto" + cid "github.com/ipfs/go-cid" + chunker "github.com/ipfs/go-ipfs-chunker" + ipld "github.com/ipfs/go-ipld-format" + mdag "github.com/ipfs/go-merkledag" ) // Common errors diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 3e460aec51..f9e302ee81 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -7,13 +7,12 @@ import ( "io/ioutil" "testing" - h "github.com/ipfs/go-ipfs/importer/helpers" - trickle "github.com/ipfs/go-ipfs/importer/trickle" + h "github.com/ipfs/go-unixfs/importer/helpers" + trickle "github.com/ipfs/go-unixfs/importer/trickle" + uio "github.com/ipfs/go-unixfs/io" + testu "github.com/ipfs/go-unixfs/test" - uio "github.com/ipfs/go-ipfs/unixfs/io" - testu "github.com/ipfs/go-ipfs/unixfs/test" - - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + u "github.com/ipfs/go-ipfs-util" ) func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, opts testu.NodeOpts) []byte { diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index e280530319..648b107160 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -14,7 +14,7 @@ It has these top-level messages: */ package unixfs_pb -import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index b5e243f3a1..cc8fe4dd00 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -8,17 +8,17 @@ import ( "io/ioutil" "testing" - h "github.com/ipfs/go-ipfs/importer/helpers" - trickle "github.com/ipfs/go-ipfs/importer/trickle" - ft "github.com/ipfs/go-ipfs/unixfs" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - mdagmock "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag/test" - - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ft "github.com/ipfs/go-unixfs" + h "github.com/ipfs/go-unixfs/importer/helpers" + trickle "github.com/ipfs/go-unixfs/importer/trickle" + + cid "github.com/ipfs/go-cid" + chunker "github.com/ipfs/go-ipfs-chunker" + u "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" + mdag "github.com/ipfs/go-merkledag" + mdagmock "github.com/ipfs/go-merkledag/test" + mh "github.com/multiformats/go-multihash" ) // SizeSplitterGen creates a generator. diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index cbae3ea0f5..21f643520d 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -6,10 +6,10 @@ package unixfs import ( "errors" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + proto "github.com/gogo/protobuf/proto" - pb "github.com/ipfs/go-ipfs/unixfs/pb" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dag "github.com/ipfs/go-merkledag" + pb "github.com/ipfs/go-unixfs/pb" ) // Shorthands for protobuffer types diff --git a/unixfs/unixfs_test.go b/unixfs/unixfs_test.go index 967ee0ca87..e046828641 100644 --- a/unixfs/unixfs_test.go +++ b/unixfs/unixfs_test.go @@ -4,9 +4,9 @@ import ( "bytes" "testing" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" + proto "github.com/gogo/protobuf/proto" - pb "github.com/ipfs/go-ipfs/unixfs/pb" + pb "github.com/ipfs/go-unixfs/pb" ) func TestFSNode(t *testing.T) { From 12003c11b12283ef5739ba7e35b5a7400a5f6a7f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Jul 2018 14:09:25 -0700 Subject: [PATCH 2167/3147] fix import in test This commit was moved from ipfs/go-unixfs@d9052086a249eaf276edfaa687b76bf590732810 --- unixfs/hamt/hamt_test.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 655365261e..e56d9363c0 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -9,7 +9,6 @@ import ( "testing" "time" - "github.com/ipfs/go-ipfs/dagutils" dag "github.com/ipfs/go-merkledag" mdtest "github.com/ipfs/go-merkledag/test" ft "github.com/ipfs/go-unixfs" @@ -213,7 +212,6 @@ func TestShardReload(t *testing.T) { ndk := nd.Cid() if !outk.Equals(ndk) { - printDiff(ds, nd.(*dag.ProtoNode), ond.(*dag.ProtoNode)) t.Fatal("roundtrip serialization failed") } } @@ -512,17 +510,6 @@ func TestSetHamtChild(t *testing.T) { } } -func printDiff(ds ipld.DAGService, a, b *dag.ProtoNode) { - diff, err := dagutils.Diff(context.TODO(), ds, a, b) - if err != nil { - panic(err) - } - - for _, d := range diff { - fmt.Println(d) - } -} - func BenchmarkHAMTWalk(b *testing.B) { ctx := context.Background() From 18972c643f1c9e89479d5607668c172f571eaa39 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Jul 2018 14:35:15 -0700 Subject: [PATCH 2168/3147] extract go-unixfs (importers and unixfs) License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@9be67fa391514813f8e3668af9370e5269bba490 --- mfs/dir.go | 6 +++--- mfs/fd.go | 2 +- mfs/file.go | 4 ++-- mfs/mfs_test.go | 6 +++--- mfs/system.go | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index b2f9f5dffa..c73fbd3c48 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,10 +9,10 @@ import ( "sync" "time" - ft "github.com/ipfs/go-ipfs/unixfs" - uio "github.com/ipfs/go-ipfs/unixfs/io" - ufspb "github.com/ipfs/go-ipfs/unixfs/pb" dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" + uio "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/io" + ufspb "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/pb" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/fd.go b/mfs/fd.go index a93a9bb428..e77ccca555 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "github.com/ipfs/go-ipfs/unixfs/mod" + mod "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index 41bd1f2ede..6cbff01821 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,9 +5,9 @@ import ( "fmt" "sync" - ft "github.com/ipfs/go-ipfs/unixfs" - mod "github.com/ipfs/go-ipfs/unixfs/mod" dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" + mod "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/mod" chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 40124b91ca..c5fca3ee9c 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,11 +14,11 @@ import ( "testing" "time" - importer "github.com/ipfs/go-ipfs/importer" - ft "github.com/ipfs/go-ipfs/unixfs" - uio "github.com/ipfs/go-ipfs/unixfs/io" bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" + importer "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/importer" + uio "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/io" "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/mfs/system.go b/mfs/system.go index 8fe8f32212..c67192de4d 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,8 +16,8 @@ import ( "sync" "time" - ft "github.com/ipfs/go-ipfs/unixfs" dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" From 559e22355b593605eaebfd21079c2147b342fceb Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 Jul 2018 14:35:15 -0700 Subject: [PATCH 2169/3147] extract go-unixfs (importers and unixfs) License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@7cf4d7d9019a59b6bc8721cb6d357e631ac53672 --- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 19280408af..ee9a0b868d 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,7 +7,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "github.com/ipfs/go-ipfs/unixfs" + "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" diff --git a/namesys/publisher.go b/namesys/publisher.go index a0da61fee6..0ab935c929 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,7 +8,7 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "github.com/ipfs/go-ipfs/unixfs" + ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" From 8fa8a1e440ea9d280b5c2b717f1de35602f83f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 2 Feb 2018 16:28:02 +0100 Subject: [PATCH 2170/3147] coreapi: Pin option for Object.Put MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@ca13e9b2ef673c3eb63baecc0cf840036405e214 --- coreiface/options/object.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/coreiface/options/object.go b/coreiface/options/object.go index aca02d6726..9257ea6077 100644 --- a/coreiface/options/object.go +++ b/coreiface/options/object.go @@ -7,6 +7,7 @@ type ObjectNewSettings struct { type ObjectPutSettings struct { InputEnc string DataType string + Pin bool } type ObjectAddLinkSettings struct { @@ -35,6 +36,7 @@ func ObjectPutOptions(opts ...ObjectPutOption) (*ObjectPutSettings, error) { options := &ObjectPutSettings{ InputEnc: "json", DataType: "text", + Pin: false, } for _, opt := range opts { @@ -103,6 +105,15 @@ func (objectOpts) DataType(t string) ObjectPutOption { } } +// WithPin is an option for Object.Put which specifies whether to pin the added +// objects, default is false +func (objectOpts) WithPin(pin bool) ObjectPutOption { + return func(settings *ObjectPutSettings) error { + settings.Pin = pin + return nil + } +} + // Create is an option for Object.AddLink which specifies whether create required // directories for the child func (objectOpts) Create(create bool) ObjectAddLinkOption { From 83c279f0be6bbc7a498345e8b82b7331b8fb356c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 2 Feb 2018 21:50:22 +0100 Subject: [PATCH 2171/3147] coreapi: implement Object.Diff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@00f6430f32022c0038bb4407cca5d9f136b0ee24 --- coreiface/object.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/coreiface/object.go b/coreiface/object.go index ea9aa59480..0a716dc97e 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -31,6 +31,39 @@ type ObjectStat struct { CumulativeSize int } + +const ( + // DiffAdd is a Type of ObjectChange where a link was added to the graph + DiffAdd = iota + + // DiffRemove is a Type of ObjectChange where a link was removed from the graph + DiffRemove + + // DiffMod is a Type of ObjectChange where a link was changed in the graph + DiffMod +) + +// ObjectChange represents a change ia a graph +// TODO: do we want this to be an interface? +type ObjectChange struct { + // Type of the change, either: + // * DiffAdd - Added a link + // * DiffRemove - Removed a link + // * DiffMod - Modified a link + Type int + + // Path to the changed link + Path string + + // Before holds the link path before the change. Note that when a link is + // added, this will be nil. + Before Path + + // After holds the link path after the change. Note that when a link is + // removed, this will be nil. + After Path +} + // ObjectAPI specifies the interface to MerkleDAG and contains useful utilities // for manipulating MerkleDAG data structures. type ObjectAPI interface { @@ -65,4 +98,8 @@ type ObjectAPI interface { // SetData sets the data contained in the node SetData(context.Context, Path, io.Reader) (ResolvedPath, error) + + // Diff returns a set of changes needed to transform the first object into the + // second. + Diff(context.Context, Path, Path) ([]ObjectChange, error) } From 157bb70fa94828c5c37466e6cc75e2058454ed2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 2 Feb 2018 22:36:01 +0100 Subject: [PATCH 2172/3147] commands: switch object commands to CoreAPI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@9fe2a845730cb243ba72ceb3a1be7871467b416b --- coreiface/object.go | 5 ++--- coreiface/options/object.go | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/coreiface/object.go b/coreiface/object.go index 0a716dc97e..1c7caeb77b 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -31,7 +31,6 @@ type ObjectStat struct { CumulativeSize int } - const ( // DiffAdd is a Type of ObjectChange where a link was added to the graph DiffAdd = iota @@ -57,11 +56,11 @@ type ObjectChange struct { // Before holds the link path before the change. Note that when a link is // added, this will be nil. - Before Path + Before ResolvedPath // After holds the link path after the change. Note that when a link is // removed, this will be nil. - After Path + After ResolvedPath } // ObjectAPI specifies the interface to MerkleDAG and contains useful utilities diff --git a/coreiface/options/object.go b/coreiface/options/object.go index 9257ea6077..e484a9f363 100644 --- a/coreiface/options/object.go +++ b/coreiface/options/object.go @@ -105,9 +105,9 @@ func (objectOpts) DataType(t string) ObjectPutOption { } } -// WithPin is an option for Object.Put which specifies whether to pin the added +// Pin is an option for Object.Put which specifies whether to pin the added // objects, default is false -func (objectOpts) WithPin(pin bool) ObjectPutOption { +func (objectOpts) Pin(pin bool) ObjectPutOption { return func(settings *ObjectPutSettings) error { settings.Pin = pin return nil From c1cdbfdc59df5b72610ae52ff80a44cb81f679c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 25 Jul 2018 22:49:17 +0200 Subject: [PATCH 2173/3147] object coreapi: Address review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@af43bf0a5b8a8eb409dc5e3731cf86afd5b67304 --- coreiface/object.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/coreiface/object.go b/coreiface/object.go index 1c7caeb77b..3eb0ea9ef3 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -31,25 +31,27 @@ type ObjectStat struct { CumulativeSize int } +// ChangeType denotes type of change in ObjectChange +type ChangeType int + const ( - // DiffAdd is a Type of ObjectChange where a link was added to the graph - DiffAdd = iota + // DiffAdd is set when a link was added to the graph + DiffAdd ChangeType = iota - // DiffRemove is a Type of ObjectChange where a link was removed from the graph + // DiffRemove is set when a link was removed from the graph DiffRemove - // DiffMod is a Type of ObjectChange where a link was changed in the graph + // DiffMod is set when a link was changed in the graph DiffMod ) // ObjectChange represents a change ia a graph -// TODO: do we want this to be an interface? type ObjectChange struct { // Type of the change, either: // * DiffAdd - Added a link // * DiffRemove - Removed a link // * DiffMod - Modified a link - Type int + Type ChangeType // Path to the changed link Path string From 022346517979b347d5e63be3ac101fbd48ce17e4 Mon Sep 17 00:00:00 2001 From: taylor Date: Thu, 2 Aug 2018 00:29:31 -0400 Subject: [PATCH 2174/3147] blockstore: Adding GetSize method to map from Cid to BlockSize Performant way to map from Cid to BlockSize. License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-blockstore@d021381f9a85cb0ac23c5ca617d0b2efd0d5b2f3 --- blockstore/arc_cache.go | 55 +++++++++++++++++++++------------- blockstore/arc_cache_test.go | 45 +++++++++++++++++++++++++++- blockstore/blockstore.go | 15 ++++++++++ blockstore/blockstore_test.go | 33 ++++++++++++++++++++ blockstore/bloom_cache.go | 4 +++ blockstore/bloom_cache_test.go | 27 +++++++++++++++-- blockstore/idstore.go | 8 +++++ blockstore/idstore_test.go | 32 ++++++++++++++++++++ 8 files changed, 194 insertions(+), 25 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 3a79c4e592..d8e7180825 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -34,7 +34,7 @@ func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, } func (b *arccache) DeleteBlock(k *cid.Cid) error { - if has, ok := b.hasCached(k); ok && !has { + if has, _, ok := b.hasCached(k); ok && !has { return ErrNotFound } @@ -42,7 +42,7 @@ func (b *arccache) DeleteBlock(k *cid.Cid) error { err := b.blockstore.DeleteBlock(k) switch err { case nil, ds.ErrNotFound, ErrNotFound: - b.addCache(k, false) + b.addCache(k, -1) return err default: return err @@ -51,33 +51,46 @@ func (b *arccache) DeleteBlock(k *cid.Cid) error { // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained -func (b *arccache) hasCached(k *cid.Cid) (has bool, ok bool) { +func (b *arccache) hasCached(k *cid.Cid) (has bool, size int, ok bool) { b.total.Inc() if k == nil { log.Error("nil cid in arccache") // Return cache invalid so the call to blockstore happens // in case of invalid key and correct error is created. - return false, false + return false, -1, false } h, ok := b.arc.Get(k.KeyString()) if ok { b.hits.Inc() - return h.(bool), true + if h.(int) > -1 { + return true, h.(int), true + } else { + return false, h.(int), true + } } - return false, false + return false, -1, false } func (b *arccache) Has(k *cid.Cid) (bool, error) { - if has, ok := b.hasCached(k); ok { - return has, nil + blockSize, err := b.GetSize(k) + if err == ds.ErrNotFound { + return false, nil } + return blockSize > -1, err +} - res, err := b.blockstore.Has(k) - if err == nil { - b.addCache(k, res) +func (b *arccache) GetSize(k *cid.Cid) (int, error) { + if _, blockSize, ok := b.hasCached(k); ok { + return blockSize, nil + } + blockSize, err := b.blockstore.GetSize(k) + if err == ds.ErrNotFound { + b.addCache(k, -1) + } else if err == nil { + b.addCache(k, blockSize) } - return res, err + return blockSize, err } func (b *arccache) Get(k *cid.Cid) (blocks.Block, error) { @@ -86,27 +99,27 @@ func (b *arccache) Get(k *cid.Cid) (blocks.Block, error) { return nil, ErrNotFound } - if has, ok := b.hasCached(k); ok && !has { + if has, _, ok := b.hasCached(k); ok && !has { return nil, ErrNotFound } bl, err := b.blockstore.Get(k) if bl == nil && err == ErrNotFound { - b.addCache(k, false) + b.addCache(k, -1) } else if bl != nil { - b.addCache(k, true) + b.addCache(k, len(bl.RawData())) } return bl, err } func (b *arccache) Put(bl blocks.Block) error { - if has, ok := b.hasCached(bl.Cid()); ok && has { + if has, _, ok := b.hasCached(bl.Cid()); ok && has { return nil } err := b.blockstore.Put(bl) if err == nil { - b.addCache(bl.Cid(), true) + b.addCache(bl.Cid(), len(bl.RawData())) } return err } @@ -116,7 +129,7 @@ func (b *arccache) PutMany(bs []blocks.Block) error { for _, block := range bs { // call put on block if result is inconclusive or we are sure that // the block isn't in storage - if has, ok := b.hasCached(block.Cid()); !ok || (ok && !has) { + if has, _, ok := b.hasCached(block.Cid()); !ok || (ok && !has) { good = append(good, block) } } @@ -125,7 +138,7 @@ func (b *arccache) PutMany(bs []blocks.Block) error { return err } for _, block := range good { - b.addCache(block.Cid(), true) + b.addCache(block.Cid(), len(block.RawData())) } return nil } @@ -134,8 +147,8 @@ func (b *arccache) HashOnRead(enabled bool) { b.blockstore.HashOnRead(enabled) } -func (b *arccache) addCache(c *cid.Cid, has bool) { - b.arc.Add(c.KeyString(), has) +func (b *arccache) addCache(c *cid.Cid, blockSize int) { + b.arc.Add(c.KeyString(), blockSize) } func (b *arccache) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 84789e7e80..2f8081957a 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/ipfs/go-block-format" + blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" syncds "github.com/ipfs/go-datastore/sync" @@ -107,6 +107,9 @@ func TestGetFillsCache(t *testing.T) { if has, err := arc.Has(exampleBlock.Cid()); has || err != nil { t.Fatal("has was true but there is no such block") } + if blockSize, err := arc.GetSize(exampleBlock.Cid()); blockSize > -1 || err != nil { + t.Fatal("getsize was true but there is no such block") + } untrap(cd) @@ -119,12 +122,16 @@ func TestGetFillsCache(t *testing.T) { if has, err := arc.Has(exampleBlock.Cid()); !has || err != nil { t.Fatal("has returned invalid result") } + if blockSize, err := arc.GetSize(exampleBlock.Cid()); blockSize == -1 || err != nil { + t.Fatal("getsize returned invalid result") + } } func TestGetAndDeleteFalseShortCircuit(t *testing.T) { arc, _, cd := createStores(t) arc.Has(exampleBlock.Cid()) + arc.GetSize(exampleBlock.Cid()) trap("get hit datastore", cd, t) @@ -167,6 +174,41 @@ func TestHasAfterSucessfulGetIsCached(t *testing.T) { arc.Has(exampleBlock.Cid()) } +func TestGetSizeAfterSucessfulGetIsCached(t *testing.T) { + arc, bs, cd := createStores(t) + + bs.Put(exampleBlock) + + arc.Get(exampleBlock.Cid()) + + trap("has hit datastore", cd, t) + arc.GetSize(exampleBlock.Cid()) +} + +func TestGetSizeMissingZeroSizeBlock(t *testing.T) { + arc, bs, cd := createStores(t) + emptyBlock := blocks.NewBlock([]byte{}) + missingBlock := blocks.NewBlock([]byte("missingBlock")) + + bs.Put(emptyBlock) + + arc.Get(emptyBlock.Cid()) + + trap("has hit datastore", cd, t) + if blockSize, err := arc.GetSize(emptyBlock.Cid()); blockSize != 0 || err != nil { + t.Fatal("getsize returned invalid result") + } + untrap(cd) + + arc.Get(missingBlock.Cid()) + + trap("has hit datastore", cd, t) + if blockSize, err := arc.GetSize(missingBlock.Cid()); blockSize != -1 || err != nil { + t.Fatal("getsize returned invalid result") + } +} + + func TestDifferentKeyObjectsWork(t *testing.T) { arc, bs, cd := createStores(t) @@ -191,6 +233,7 @@ func TestPutManyCaches(t *testing.T) { trap("has hit datastore", cd, t) arc.Has(exampleBlock.Cid()) + arc.GetSize(exampleBlock.Cid()) untrap(cd) arc.DeleteBlock(exampleBlock.Cid()) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 748387c005..521e82dd71 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -40,6 +40,9 @@ type Blockstore interface { Has(*cid.Cid) (bool, error) Get(*cid.Cid) (blocks.Block, error) + // GetSize returns the CIDs mapped BlockSize + GetSize(*cid.Cid) (int, error) + // Put puts a given block to the underlying datastore Put(blocks.Block) error @@ -183,6 +186,18 @@ func (bs *blockstore) Has(k *cid.Cid) (bool, error) { return bs.datastore.Has(dshelp.CidToDsKey(k)) } +func (bs *blockstore) GetSize(k *cid.Cid) (int, error) { + maybeData, err := bs.datastore.Get(dshelp.CidToDsKey(k)) + if err != nil { + return -1, err + } + bdata, ok := maybeData.([]byte) + if !ok { + return -1, ErrValueTypeMismatch + } + return len(bdata), nil +} + func (bs *blockstore) DeleteBlock(k *cid.Cid) error { err := bs.datastore.Delete(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 7def52eb07..2fc1c94529 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -54,6 +54,39 @@ func TestPutThenGetBlock(t *testing.T) { } } +func TestPutThenGetSizeBlock(t *testing.T) { + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) + block := blocks.NewBlock([]byte("some data")) + missingBlock := blocks.NewBlock([]byte("missingBlock")) + emptyBlock := blocks.NewBlock([]byte{}) + + err := bs.Put(block) + if err != nil { + t.Fatal(err) + } + + blockSize, err := bs.GetSize(block.Cid()) + if err != nil { + t.Fatal(err) + } + if len(block.RawData()) != blockSize { + t.Fail() + } + + err = bs.Put(emptyBlock) + if err != nil { + t.Fatal(err) + } + + if blockSize, err := bs.GetSize(emptyBlock.Cid()); blockSize != 0 || err != nil { + t.Fatal(err) + } + + if blockSize, err := bs.GetSize(missingBlock.Cid()); blockSize != -1 || err == nil { + t.Fatal("getsize returned invalid result") + } +} + func TestHashOnRead(t *testing.T) { orginalDebug := u.Debug defer (func() { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 7dd0bbe9fa..403fd6d142 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -133,6 +133,10 @@ func (b *bloomcache) Has(k *cid.Cid) (bool, error) { return b.blockstore.Has(k) } +func (b *bloomcache) GetSize(k *cid.Cid) (int, error) { + return b.blockstore.GetSize(k) +} + func (b *bloomcache) Get(k *cid.Cid) (blocks.Block, error) { if has, ok := b.hasCached(k); ok && !has { return nil, ErrNotFound diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index c165eee6e4..a452e049de 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -45,13 +45,18 @@ func TestPutManyAddsToBloom(t *testing.T) { block1 := blocks.NewBlock([]byte("foo")) block2 := blocks.NewBlock([]byte("bar")) + emptyBlock := blocks.NewBlock([]byte{}) - cachedbs.PutMany([]blocks.Block{block1}) + cachedbs.PutMany([]blocks.Block{block1, emptyBlock}) has, err := cachedbs.Has(block1.Cid()) if err != nil { t.Fatal(err) } - if !has { + blockSize, err := cachedbs.GetSize(block1.Cid()) + if err != nil { + t.Fatal(err) + } + if blockSize == -1 || !has { t.Fatal("added block is reported missing") } @@ -59,9 +64,25 @@ func TestPutManyAddsToBloom(t *testing.T) { if err != nil { t.Fatal(err) } - if has { + blockSize, err = cachedbs.GetSize(block2.Cid()) + if err != nil && err != ds.ErrNotFound { + t.Fatal(err) + } + if blockSize > -1 || has { t.Fatal("not added block is reported to be in blockstore") } + + has, err = cachedbs.Has(emptyBlock.Cid()) + if err != nil { + t.Fatal(err) + } + blockSize, err = cachedbs.GetSize(emptyBlock.Cid()) + if err != nil { + t.Fatal(err) + } + if blockSize != 0 || !has { + t.Fatal("added block is reported missing") + } } func TestReturnsErrorWhenSizeNegative(t *testing.T) { diff --git a/blockstore/idstore.go b/blockstore/idstore.go index 5b31b3f8bf..a1ef4d60bf 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -41,6 +41,14 @@ func (b *idstore) Has(k *cid.Cid) (bool, error) { return b.bs.Has(k) } +func (b *idstore) GetSize(k *cid.Cid) (int, error) { + isId, bdata := extractContents(k) + if isId { + return len(bdata), nil + } + return b.bs.GetSize(k) +} + func (b *idstore) Get(k *cid.Cid) (blocks.Block, error) { isId, bdata := extractContents(k) if isId { diff --git a/blockstore/idstore_test.go b/blockstore/idstore_test.go index 5a8861990a..321d5ec779 100644 --- a/blockstore/idstore_test.go +++ b/blockstore/idstore_test.go @@ -21,6 +21,8 @@ func TestIdStore(t *testing.T) { idblock1, _ := blk.NewBlockWithCid([]byte("idhash1"), idhash1) hash1, _ := cid.NewPrefixV1(cid.Raw, mh.SHA2_256).Sum([]byte("hash1")) block1, _ := blk.NewBlockWithCid([]byte("hash1"), hash1) + emptyHash, _ := cid.NewPrefixV1(cid.Raw, mh.SHA2_256).Sum([]byte("emptyHash")) + emptyBlock, _ := blk.NewBlockWithCid([]byte{}, emptyHash) ids, cb := createTestStores() @@ -56,11 +58,31 @@ func TestIdStore(t *testing.T) { t.Fatal("normal block not added to datastore") } + blockSize, _ := ids.GetSize(hash1) + if blockSize == -1 { + t.Fatal("normal block not added to datastore") + } + _, err = ids.Get(hash1) if err != nil { t.Fatal(err) } + err = ids.Put(emptyBlock) + if err != nil { + t.Fatalf("Put() failed on normal block: %v", err) + } + + have, _ = ids.Has(emptyHash) + if !have { + t.Fatal("normal block not added to datastore") + } + + blockSize, _ = ids.GetSize(emptyHash) + if blockSize != 0 { + t.Fatal("normal block not added to datastore") + } + cb.f = failIfPassThough err = ids.DeleteBlock(idhash1) if err != nil { @@ -78,6 +100,16 @@ func TestIdStore(t *testing.T) { t.Fatal("normal block not deleted from datastore") } + blockSize, _ = ids.GetSize(hash1) + if blockSize > -1 { + t.Fatal("normal block not deleted from datastore") + } + + err = ids.DeleteBlock(emptyHash) + if err != nil { + t.Fatal(err) + } + idhash2, _ := cid.NewPrefixV1(cid.Raw, mh.ID).Sum([]byte("idhash2")) idblock2, _ := blk.NewBlockWithCid([]byte("idhash2"), idhash2) hash2, _ := cid.NewPrefixV1(cid.Raw, mh.SHA2_256).Sum([]byte("hash2")) From 83081a0c1b91bb9554d56ea074ef28ca02b38ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Aug 2018 18:06:57 +0200 Subject: [PATCH 2175/3147] coreapi: dag: Batching interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@f4b74679d1eb5597e430a52f4cca826d511898c3 --- coreiface/dag.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/coreiface/dag.go b/coreiface/dag.go index 3f92ebab34..a128e97c5b 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -4,21 +4,36 @@ import ( "context" "io" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) -// DagAPI specifies the interface to IPLD -type DagAPI interface { +// DagOps groups operations that can be batched together +type DagOps interface { // Put inserts data using specified format and input encoding. // Unless used with WithCodec or WithHash, the defaults "dag-cbor" and // "sha256" are used. Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (ResolvedPath, error) +} + +// DagBatch is the batching version of DagAPI. All implementations of DagBatch +// should be threadsafe +type DagBatch interface { + DagOps + + Commit(ctx context.Context) error +} + +// DagAPI specifies the interface to IPLD +type DagAPI interface { + DagOps // Get attempts to resolve and get the node specified by the path Get(ctx context.Context, path Path) (ipld.Node, error) // Tree returns list of paths within a node specified by the path. Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) + + Batch(ctx context.Context) DagBatch } From de98b9bd4549e5e475d3d096c519ae685ac008cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Aug 2018 18:19:45 +0200 Subject: [PATCH 2176/3147] coreapi: dag: Missing batch docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@77b458e7426ae384692ed7c70a3a6179f4adc1b3 --- coreiface/dag.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coreiface/dag.go b/coreiface/dag.go index a128e97c5b..01d6112e74 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -22,6 +22,7 @@ type DagOps interface { type DagBatch interface { DagOps + // Commit commits nodes to the datastore and announces them to the network Commit(ctx context.Context) error } @@ -35,5 +36,6 @@ type DagAPI interface { // Tree returns list of paths within a node specified by the path. Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) + // Batch creates new DagBatch Batch(ctx context.Context) DagBatch } From 3bb8c057c6fe89c2bcc4824581cb3e444f0459c8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Aug 2018 13:22:51 -0700 Subject: [PATCH 2177/3147] Update bitswap deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/interface-go-ipfs-core@24dde48825577a7f5e052be01025f22a413cc57b --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 49b8cc5ea7..069474c23c 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + ipfspath "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) From aca64d670ba3338b7a21c393f18d7b9514ada884 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Aug 2018 13:22:51 -0700 Subject: [PATCH 2178/3147] Update bitswap deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-filestore@75aaa7f39e17ebde68ca12afc14c6fdb6f63b412 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 596b9ac471..12c5a4df36 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" From 3813eb45f4cc5f42f53ecdaa8ddb6bbb73ed1d83 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Aug 2018 13:22:51 -0700 Subject: [PATCH 2179/3147] Update bitswap deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-mfs@b07cd2729e0d4c539e490b93368503a154012bc4 --- mfs/dir.go | 8 ++++---- mfs/fd.go | 2 +- mfs/file.go | 6 +++--- mfs/mfs_test.go | 12 ++++++------ mfs/ops.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index c73fbd3c48..f110cec56d 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,10 +9,10 @@ import ( "sync" "time" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" - uio "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/io" - ufspb "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/pb" + ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" + uio "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/io" + ufspb "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/pb" + dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/fd.go b/mfs/fd.go index e77ccca555..263bc4d48b 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/mod" + mod "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index 6cbff01821..44efc447f0 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,9 +5,9 @@ import ( "fmt" "sync" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" - mod "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/mod" + ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" + mod "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/mod" + dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index c5fca3ee9c..38401e4df0 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,12 +14,12 @@ import ( "testing" "time" - bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" - importer "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/importer" - uio "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs/io" - "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" + importer "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/importer" + uio "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/io" + dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + bserv "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/mfs/ops.go b/mfs/ops.go index 3ae84058a0..01d291f8a4 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,7 +6,7 @@ import ( gopath "path" "strings" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/system.go b/mfs/system.go index c67192de4d..069cefbfe4 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,8 +16,8 @@ import ( "sync" "time" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" - ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" + ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" + dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" From 317d1a293b256726ba9ff253bdb78aa64a489ced Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Aug 2018 13:22:51 -0700 Subject: [PATCH 2180/3147] Update bitswap deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-namesys@f073cbcb306eed92eb2eed6f9ff71c29d433b5bf --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 61b788d59b..4bb96b3a6d 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 02d0aa928d..bb877be66d 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 0f8933ab3c..4cea9162a4 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index 39bbc6e032..739fbafb9b 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 8dd2ab9ecf..2f7f09f414 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" record "gx/ipfs/QmVsp2KdPYE6M8ryzCk5KHLo3zprcY5hBDaYx6uPCFUdxA/go-libp2p-record" diff --git a/namesys/namesys.go b/namesys/namesys.go index 8dc7d146b5..0487cbcec9 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index ee9a0b868d..d4956aed4f 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,8 +7,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" offroute "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/offline" diff --git a/namesys/proquint.go b/namesys/proquint.go index 31fdb77536..ea97c7a992 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,8 +7,8 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 0ab935c929..e5b0fa51f9 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,8 +8,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmSaz8Qg77gGqvDvLKeSAY7ivDEnramSWF6T7TcRwFpHtP/go-unixfs" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 88038d66d9..5755e3f717 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 7c2455b600..eb11da5e76 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmY51bqSM5XgxQZqsBrQcRkKTnCb8EKpJpR9K6Qax7Njco/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index ac3b656d2c..93b1fd0b2a 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index 3a355ddf21..aa9924644e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYKNMEUK7nCVAefgXF1LVtZEZg3uRmBqiae4FJRXDNAyJ/go-path" + path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" dht "gx/ipfs/QmTktQYCKzQjhxF6dk5xJPRuhHn3JBiKGvMLoiDy1mYmxC/go-libp2p-kad-dht" From a496d8e584578d5f8cdaebb0bf850339b1eecf60 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 5 Aug 2018 13:22:51 -0700 Subject: [PATCH 2181/3147] Update bitswap deps License: MIT Signed-off-by: Jeromy This commit was moved from ipfs/go-ipfs-pinner@ec377733e157528c694c7ffda8825c62718be99d --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index abf644a098..90321cc4e7 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + bserv "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" "gx/ipfs/QmQwgv79RHrRnoXmhnpC1BPtY55HHeneGMpPwmmBU1fUAG/go-verifcid" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 72407b984f..d05a7730ab 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 9e43f5dcf4..7db07915d3 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" - mdag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + mdag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + bs "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index a205a4e7e5..36180b4d93 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index eeb453a199..b6a651bd1f 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmNqRBAhovtf4jVd5cF7YvHaFSsQHHZBaUFwGQWPM2CV7R/go-blockservice" - dag "gx/ipfs/QmRy4Qk9hbgFX9NGJRm8rBThrA8PZhNCitMgeRYyZ67s59/go-merkledag" + dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + bserv "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" From 4112eb16cb9491820a00d18bc9a287e5cfc77472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 2 Aug 2018 10:47:12 +0200 Subject: [PATCH 2182/3147] fix: don't dag.Get in ResolveToLastNode when not needed This commit was moved from ipfs/go-path@29e9e4c0a9e3d4df4ec26f0c68a54ce8ca7c73e3 --- path/resolver/resolver.go | 14 ++++++++----- path/resolver/resolver_test.go | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index f96c791740..f5e3862a67 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -55,14 +55,18 @@ func NewBasicResolver(ds ipld.DAGService) *Resolver { } } -// ResolveToLastNode walks the given path and returns the ipld.Node -// referenced by the last element in it. -func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld.Node, []string, error) { +// ResolveToLastNode walks the given path and returns the cid of the last node +// referenced by the path +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (*cid.Cid, []string, error) { c, p, err := path.SplitAbsPath(fpath) if err != nil { return nil, nil, err } + if len(p) == 0 { + return c, nil, nil + } + nd, err := r.DAG.Get(ctx, c) if err != nil { return nil, nil, err @@ -91,7 +95,7 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld } if len(p) == 0 { - return nd, nil, nil + return nd.Cid(), nil, nil } // Confirm the path exists within the object @@ -107,7 +111,7 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld case *ipld.Link: return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") default: - return nd, p, nil + return nd.Cid(), p, nil } } diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 99e26801d1..cec160fe75 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -69,4 +69,40 @@ func TestRecurivePathResolution(t *testing.T) { "recursive path resolution failed for %s: %s != %s", p.String(), key.String(), cKey.String())) } + + rCid, rest, err := resolver.ResolveToLastNode(ctx, p) + if err != nil { + t.Fatal(err) + } + + if len(rest) != 0 { + t.Error("expected rest to be empty") + } + + if rCid.String() != cKey.String() { + t.Fatal(fmt.Errorf( + "ResolveToLastNode failed for %s: %s != %s", + p.String(), rCid.String(), cKey.String())) + } + + p2, err := path.FromSegments("/ipfs/", aKey.String()) + if err != nil { + t.Fatal(err) + } + + rCid, rest, err = resolver.ResolveToLastNode(ctx, p2) + if err != nil { + t.Fatal(err) + } + + + if len(rest) != 0 { + t.Error("expected rest to be empty") + } + + if rCid.String() != aKey.String() { + t.Fatal(fmt.Errorf( + "ResolveToLastNode failed for %s: %s != %s", + p.String(), rCid.String(), cKey.String())) + } } From fb6331dda4838b7598b72348fc6ed9dff82dd502 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 11:53:05 -0700 Subject: [PATCH 2183/3147] fix test race condition Also stop exposing functions that don't do what they claim to do: * Invalidate does, technically invalidate. However, it's not threadsafe. * Rebuild doesn't *clear* the filter so it's only useful for the initial build. It's also not threadsafe. We can restore these functions later if we need them (but we'll have to change a few things to make them work properly). Also adds a `Wait` function to allow waiting for the bloom filter to finish building. fixes #6 This commit was moved from ipfs/go-ipfs-blockstore@5e44d7b4d329486dd147a63fa5e957121ec655ed --- blockstore/bloom_cache.go | 88 ++++++++++++++++++++-------------- blockstore/bloom_cache_test.go | 14 ++---- 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 927ad1204d..86c0190ed4 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -2,6 +2,7 @@ package blockstore import ( "context" + "fmt" "sync/atomic" "time" @@ -19,82 +20,95 @@ func bloomCached(ctx context.Context, bs Blockstore, bloomSize, hashCount int) ( if err != nil { return nil, err } - bc := &bloomcache{blockstore: bs, bloom: bl} - bc.hits = metrics.NewCtx(ctx, "bloom.hits_total", - "Number of cache hits in bloom cache").Counter() - bc.total = metrics.NewCtx(ctx, "bloom_total", - "Total number of requests to bloom cache").Counter() - - bc.Invalidate() - go bc.Rebuild(ctx) - if metrics.Active() { - go func() { + bc := &bloomcache{ + blockstore: bs, + bloom: bl, + hits: metrics.NewCtx(ctx, "bloom.hits_total", + "Number of cache hits in bloom cache").Counter(), + total: metrics.NewCtx(ctx, "bloom_total", + "Total number of requests to bloom cache").Counter(), + buildChan: make(chan struct{}), + } + go func() { + err := bc.build(ctx) + if err != nil { + select { + case <-ctx.Done(): + log.Warning("Cache rebuild closed by context finishing: ", err) + default: + log.Error(err) + } + return + } + if metrics.Active() { fill := metrics.NewCtx(ctx, "bloom_fill_ratio", "Ratio of bloom filter fullnes, (updated once a minute)").Gauge() - <-bc.rebuildChan t := time.NewTicker(1 * time.Minute) + defer t.Stop() for { select { case <-ctx.Done(): - t.Stop() return case <-t.C: fill.Set(bc.bloom.FillRatio()) } } - }() - } + } + }() return bc, nil } type bloomcache struct { - bloom *bloom.Bloom active int32 - // This chan is only used for testing to wait for bloom to enable - rebuildChan chan struct{} - blockstore Blockstore + bloom *bloom.Bloom + buildErr error + + buildChan chan struct{} + blockstore Blockstore // Statistics hits metrics.Counter total metrics.Counter } -func (b *bloomcache) Invalidate() { - b.rebuildChan = make(chan struct{}) - atomic.StoreInt32(&b.active, 0) -} - func (b *bloomcache) BloomActive() bool { return atomic.LoadInt32(&b.active) != 0 } -func (b *bloomcache) Rebuild(ctx context.Context) { - evt := log.EventBegin(ctx, "bloomcache.Rebuild") +func (b *bloomcache) Wait(ctx context.Context) error { + select { + case <-ctx.Done(): + return ctx.Err() + case <-b.buildChan: + return b.buildErr + } +} + +func (b *bloomcache) build(ctx context.Context) error { + evt := log.EventBegin(ctx, "bloomcache.build") defer evt.Done() + defer close(b.buildChan) ch, err := b.blockstore.AllKeysChan(ctx) if err != nil { - log.Errorf("AllKeysChan failed in bloomcache rebuild with: %v", err) - return + b.buildErr = fmt.Errorf("AllKeysChan failed in bloomcache rebuild with: %v", err) + return b.buildErr } - finish := false - for !finish { + for { select { case key, ok := <-ch: - if ok { - b.bloom.AddTS(key.Bytes()) // Use binary key, the more compact the better - } else { - finish = true + if !ok { + atomic.StoreInt32(&b.active, 1) + return nil } + b.bloom.AddTS(key.Bytes()) // Use binary key, the more compact the better case <-ctx.Done(): - log.Warning("Cache rebuild closed by context finishing.") - return + b.buildErr = ctx.Err() + return b.buildErr } } - close(b.rebuildChan) - atomic.StoreInt32(&b.active, 1) } func (b *bloomcache) DeleteBlock(k *cid.Cid) error { diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index c165eee6e4..86c6d794cb 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -37,10 +37,8 @@ func TestPutManyAddsToBloom(t *testing.T) { t.Fatal(err) } - select { - case <-cachedbs.rebuildChan: - case <-ctx.Done(): - t.Fatalf("Timeout wating for rebuild: %d", cachedbs.bloom.ElementsAdded()) + if err := cachedbs.Wait(ctx); err != nil { + t.Fatalf("Failed while waiting for the filter to build: %d", cachedbs.bloom.ElementsAdded()) } block1 := blocks.NewBlock([]byte("foo")) @@ -86,10 +84,8 @@ func TestHasIsBloomCached(t *testing.T) { t.Fatal(err) } - select { - case <-cachedbs.rebuildChan: - case <-ctx.Done(): - t.Fatalf("Timeout wating for rebuild: %d", cachedbs.bloom.ElementsAdded()) + if err := cachedbs.Wait(ctx); err != nil { + t.Fatalf("Failed while waiting for the filter to build: %d", cachedbs.bloom.ElementsAdded()) } cacheFails := 0 @@ -102,7 +98,7 @@ func TestHasIsBloomCached(t *testing.T) { } if float64(cacheFails)/float64(1000) > float64(0.05) { - t.Fatal("Bloom filter has cache miss rate of more than 5%") + t.Fatalf("Bloom filter has cache miss rate of more than 5%%") } cacheFails = 0 From f9afe981175685c29705b480a2a68688d14c3a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Aug 2018 16:46:25 +0200 Subject: [PATCH 2184/3147] coreapi: key: some changes to match command functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@12537a60f5318fec2fdf2c02a3afd3786b673f07 --- coreiface/key.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/coreiface/key.go b/coreiface/key.go index 928aa265f8..9e9c7e4002 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -4,14 +4,20 @@ import ( "context" options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore type Key interface { // Key returns key name Name() string + // Path returns key path Path() Path + + // Id returns key PeerID + Id() peer.ID } // KeyAPI specifies the interface to Keystore @@ -28,5 +34,5 @@ type KeyAPI interface { List(ctx context.Context) ([]Key, error) // Remove removes keys from keystore. Returns ipns path of the removed key - Remove(ctx context.Context, name string) (Path, error) + Remove(ctx context.Context, name string) (Key, error) } From 257b7bd3172adb6368a0fe2e404651d1a8d8d99b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 22:49:31 -0700 Subject: [PATCH 2185/3147] correctly convert the datastore not found errors This commit was moved from ipfs/go-ipfs-blockstore@0d5887bd3d11fbb593f89cac0d5760d08e2e9af3 --- blockstore/arc_cache.go | 7 +++---- blockstore/blockstore.go | 3 +++ blockstore/bloom_cache_test.go | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index d8e7180825..0d4fbcbedd 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -6,7 +6,6 @@ import ( lru "github.com/hashicorp/golang-lru" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" metrics "github.com/ipfs/go-metrics-interface" ) @@ -41,7 +40,7 @@ func (b *arccache) DeleteBlock(k *cid.Cid) error { b.arc.Remove(k) // Invalidate cache before deleting. err := b.blockstore.DeleteBlock(k) switch err { - case nil, ds.ErrNotFound, ErrNotFound: + case nil, ErrNotFound: b.addCache(k, -1) return err default: @@ -74,7 +73,7 @@ func (b *arccache) hasCached(k *cid.Cid) (has bool, size int, ok bool) { func (b *arccache) Has(k *cid.Cid) (bool, error) { blockSize, err := b.GetSize(k) - if err == ds.ErrNotFound { + if err == ErrNotFound { return false, nil } return blockSize > -1, err @@ -85,7 +84,7 @@ func (b *arccache) GetSize(k *cid.Cid) (int, error) { return blockSize, nil } blockSize, err := b.blockstore.GetSize(k) - if err == ds.ErrNotFound { + if err == ErrNotFound { b.addCache(k, -1) } else if err == nil { b.addCache(k, blockSize) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 521e82dd71..c4475da9aa 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -188,6 +188,9 @@ func (bs *blockstore) Has(k *cid.Cid) (bool, error) { func (bs *blockstore) GetSize(k *cid.Cid) (int, error) { maybeData, err := bs.datastore.Get(dshelp.CidToDsKey(k)) + if err == ds.ErrNotFound { + return -1, ErrNotFound + } if err != nil { return -1, err } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index a452e049de..5fc831ec6c 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -65,7 +65,7 @@ func TestPutManyAddsToBloom(t *testing.T) { t.Fatal(err) } blockSize, err = cachedbs.GetSize(block2.Cid()) - if err != nil && err != ds.ErrNotFound { + if err != nil && err != ErrNotFound { t.Fatal(err) } if blockSize > -1 || has { From 5db7e835214806092af065be6e3f306c70215edb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 23:31:01 -0700 Subject: [PATCH 2186/3147] avoid fetching the size when not requested This commit was moved from ipfs/go-ipfs-blockstore@5d1a33c542e43d8e3f04dfe6d0ce22f667aa7450 --- blockstore/arc_cache.go | 46 ++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 0d4fbcbedd..4339bb51fa 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -9,6 +9,9 @@ import ( metrics "github.com/ipfs/go-metrics-interface" ) +type cacheHave bool +type cacheSize int + // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for // block Cids. This provides block access-time improvements, allowing // to short-cut many searches without query-ing the underlying datastore. @@ -41,7 +44,7 @@ func (b *arccache) DeleteBlock(k *cid.Cid) error { err := b.blockstore.DeleteBlock(k) switch err { case nil, ErrNotFound: - b.addCache(k, -1) + b.cacheHave(k, false) return err default: return err @@ -62,21 +65,26 @@ func (b *arccache) hasCached(k *cid.Cid) (has bool, size int, ok bool) { h, ok := b.arc.Get(k.KeyString()) if ok { b.hits.Inc() - if h.(int) > -1 { - return true, h.(int), true - } else { - return false, h.(int), true + switch h := h.(type) { + case cacheHave: + return bool(h), -1, true + case cacheSize: + return true, int(h), true } } return false, -1, false } func (b *arccache) Has(k *cid.Cid) (bool, error) { - blockSize, err := b.GetSize(k) - if err == ErrNotFound { - return false, nil + if has, _, ok := b.hasCached(k); ok { + return has, nil + } + has, err := b.blockstore.Has(k) + if err != nil { + return false, err } - return blockSize > -1, err + b.cacheHave(k, has) + return has, nil } func (b *arccache) GetSize(k *cid.Cid) (int, error) { @@ -85,9 +93,9 @@ func (b *arccache) GetSize(k *cid.Cid) (int, error) { } blockSize, err := b.blockstore.GetSize(k) if err == ErrNotFound { - b.addCache(k, -1) + b.cacheHave(k, false) } else if err == nil { - b.addCache(k, blockSize) + b.cacheSize(k, blockSize) } return blockSize, err } @@ -104,9 +112,9 @@ func (b *arccache) Get(k *cid.Cid) (blocks.Block, error) { bl, err := b.blockstore.Get(k) if bl == nil && err == ErrNotFound { - b.addCache(k, -1) + b.cacheHave(k, false) } else if bl != nil { - b.addCache(k, len(bl.RawData())) + b.cacheSize(k, len(bl.RawData())) } return bl, err } @@ -118,7 +126,7 @@ func (b *arccache) Put(bl blocks.Block) error { err := b.blockstore.Put(bl) if err == nil { - b.addCache(bl.Cid(), len(bl.RawData())) + b.cacheSize(bl.Cid(), len(bl.RawData())) } return err } @@ -137,7 +145,7 @@ func (b *arccache) PutMany(bs []blocks.Block) error { return err } for _, block := range good { - b.addCache(block.Cid(), len(block.RawData())) + b.cacheSize(block.Cid(), len(block.RawData())) } return nil } @@ -146,8 +154,12 @@ func (b *arccache) HashOnRead(enabled bool) { b.blockstore.HashOnRead(enabled) } -func (b *arccache) addCache(c *cid.Cid, blockSize int) { - b.arc.Add(c.KeyString(), blockSize) +func (b *arccache) cacheHave(c *cid.Cid, have bool) { + b.arc.Add(c.KeyString(), cacheHave(have)) +} + +func (b *arccache) cacheSize(c *cid.Cid, blockSize int) { + b.arc.Add(c.KeyString(), cacheSize(blockSize)) } func (b *arccache) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { From 55223e9427daacfa41800357a551aad8bce06ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 7 Aug 2018 15:10:34 +0200 Subject: [PATCH 2187/3147] key cmd: fix codeclimate warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@814f82cf806d4fefc9f5158e85807b4c96751637 --- coreiface/key.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/key.go b/coreiface/key.go index 9e9c7e4002..2abf3559b7 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -16,8 +16,8 @@ type Key interface { // Path returns key path Path() Path - // Id returns key PeerID - Id() peer.ID + // ID returns key PeerID + ID() peer.ID } // KeyAPI specifies the interface to Keystore From f7eaccb941c88c64af08e1196c7fcd7decef2f61 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 22:10:53 -0700 Subject: [PATCH 2188/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@8897b2812f25c973c2e10a277248a594df8dd0f2 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 2 +- filestore/util.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 61562cd125..e15d9acca6 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,9 +12,9 @@ import ( "errors" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" + blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 12c5a4df36..bc5322ad03 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,11 +7,11 @@ import ( "math/rand" "testing" - dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" + blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 5301eab0c3..2b1698c7e3 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,10 +11,10 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" + blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" proto "gx/ipfs/QmZHU2gx42NPTYXzw6pJkuX6xCE7bKECp6e8QcPdoLx8sx/protobuf/proto" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" diff --git a/filestore/util.go b/filestore/util.go index 96acd28521..1d6b723e84 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,8 +6,8 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" From aa067a121b31b26ae87a5a2494f574c55e2e7edc Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 22:10:53 -0700 Subject: [PATCH 2189/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@365f5eb472016cac6e893ccd44a114eb9b8cfcd5 --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 069474c23c..4c4c515328 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + ipfspath "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) From a84b72e49f8f039b47db86a8b3ac5e1a8298a4c1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 22:10:53 -0700 Subject: [PATCH 2190/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@db692243ad75fb856a52443b4b1bb2024963b377 --- mfs/dir.go | 8 ++++---- mfs/fd.go | 2 +- mfs/file.go | 6 +++--- mfs/mfs_test.go | 18 +++++++++--------- mfs/ops.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index f110cec56d..8d1e0069f7 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,10 +9,10 @@ import ( "sync" "time" - ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" - uio "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/io" - ufspb "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/pb" - dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" + uio "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/io" + ufspb "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/pb" + dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/fd.go b/mfs/fd.go index 263bc4d48b..b2975d7ea4 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/mod" + mod "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index 44efc447f0..424a6f1c38 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,9 +5,9 @@ import ( "fmt" "sync" - ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" - mod "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/mod" - dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" + mod "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/mod" + dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 38401e4df0..7230391eee 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,19 +14,19 @@ import ( "testing" "time" - ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" - importer "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/importer" - uio "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs/io" - dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" - "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" - bserv "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" - + bserv "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" + ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" + importer "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/importer" + uio "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/io" + "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + + offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" + bstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - bstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/mfs/ops.go b/mfs/ops.go index 01d291f8a4..eff8b30327 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,7 +6,7 @@ import ( gopath "path" "strings" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/system.go b/mfs/system.go index 069cefbfe4..520fecda3e 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,8 +16,8 @@ import ( "sync" "time" - ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" - dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" + dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" From 2b17ca2859975ff118f6b7bd5a48574e5e6a7bf6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 22:10:53 -0700 Subject: [PATCH 2191/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@9ead3b049e72967f7e3ab36cde6191bc0c060fb2 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 4bb96b3a6d..96bcea7966 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index bb877be66d..b93562cf86 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 4cea9162a4..8b9aa530f1 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index 739fbafb9b..ac99ad49ed 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 2f7f09f414..60b5c9e0e3 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" record "gx/ipfs/QmVsp2KdPYE6M8ryzCk5KHLo3zprcY5hBDaYx6uPCFUdxA/go-libp2p-record" diff --git a/namesys/namesys.go b/namesys/namesys.go index 0487cbcec9..4585885a68 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index d4956aed4f..092f3629a2 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,8 +7,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" offroute "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/offline" diff --git a/namesys/proquint.go b/namesys/proquint.go index ea97c7a992..4ed5a79bf9 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,8 +7,8 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index e5b0fa51f9..ae6669becc 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,8 +8,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmWdTRLi3H7ZJQ8s7NYo8oitz5JHEEPKLn1QPMsJVWg2Ew/go-unixfs" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 5755e3f717..9eadcd92a6 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index eb11da5e76..dd17661204 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmY51bqSM5XgxQZqsBrQcRkKTnCb8EKpJpR9K6Qax7Njco/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 93b1fd0b2a..a60e6d67e4 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index aa9924644e..1bc5c813ca 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qme34dT9spiPgunbueNtziRX4SvfLHDFZQvmTBVK8p4qNT/go-path" + path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" dht "gx/ipfs/QmTktQYCKzQjhxF6dk5xJPRuhHn3JBiKGvMLoiDy1mYmxC/go-libp2p-kad-dht" From 280e76ac5540f3d2cdfac68f7d2b2eaa669a1c91 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 22:10:53 -0700 Subject: [PATCH 2192/3147] gx: update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@2f20e4f2e763016e8b7b1a2e6f30bdc1d12a3d5f --- pinning/pinner/gc/gc.go | 8 ++++---- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 8 ++++---- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 8 ++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 90321cc4e7..6b19d0e40a 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,14 +8,14 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" - bserv "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" + bserv "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" + dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" "gx/ipfs/QmQwgv79RHrRnoXmhnpC1BPtY55HHeneGMpPwmmBU1fUAG/go-verifcid" - offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" + bstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - bstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d05a7730ab..77c9d6b1fa 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + mdag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 7db07915d3..51795a50f9 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,13 +5,13 @@ import ( "testing" "time" - mdag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" - bs "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" + bs "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" + mdag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 36180b4d93..c2c111c15c 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" + "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index b6a651bd1f..ef0cbe9d00 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,12 +5,12 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/Qma2BR57Wqp8w9vPreK4dEzoXXk8DFFRL3LresMZg4QpzN/go-merkledag" - bserv "gx/ipfs/QmfZ5oGGgsx71QcHb6junfFCMGhYWkK8VV61nkCFyt8e5Q/go-blockservice" + bserv "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" + dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" - offline "gx/ipfs/QmS6mo1dPpHdYsVkm27BRZDLxpKBCiJKUH8fHX15XFfMez/go-ipfs-exchange-offline" + offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - blockstore "gx/ipfs/QmadMhXJLHMFjpRmh85XjpmVDkEtQpNYEZNRpWRvYVLrvb/go-ipfs-blockstore" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From 4f9100b14eceee106d457ef953e4f813f1ac3b16 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Aug 2018 22:12:45 -0700 Subject: [PATCH 2193/3147] implement the new GetSize methods for the filestore blockservices License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@8f4f71d79beef9603d1ea696951ffbef8e8173a9 --- filestore/filestore.go | 16 ++++++++++++++++ filestore/fsrefstore.go | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/filestore/filestore.go b/filestore/filestore.go index e15d9acca6..f0d26259a6 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -154,6 +154,22 @@ func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { return f.fm.Get(c) } +// GetSize returns the size of the requested block. It may return ErrNotFound +// when the block is not stored. +func (f *Filestore) GetSize(c *cid.Cid) (int, error) { + size, err := f.bs.GetSize(c) + switch err { + default: + return -1, err + case nil: + return size, nil + case blockstore.ErrNotFound: + // try filestore + } + + return f.fm.GetSize(c) +} + // Has returns true if the block with the given Cid is // stored in the Filestore. func (f *Filestore) Has(c *cid.Cid) (bool, error) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 2b1698c7e3..146d018b9c 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -122,6 +122,18 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(out, c) } +// GetSize gets the size of the block from the datastore. +// +// This method may successfully return the size even if returning the block +// would fail because the associated file is no longer available. +func (f *FileManager) GetSize(c *cid.Cid) (int, error) { + dobj, err := f.getDataObj(c) + if err != nil { + return -1, err + } + return int(dobj.GetSize_()), nil +} + func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { if IsURL(d.GetFilePath()) { return f.readURLDataObj(c, d) From 30d9c52111e8ff3821bc73af601de3267d802cab Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 7 Aug 2018 13:25:07 -0700 Subject: [PATCH 2194/3147] cleanup filestore switch statements (address CR) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@5f3615d9bf85406a61d4dd2ecd9a765119b3e27a --- filestore/filestore.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index f0d26259a6..f1cd4a4f77 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -143,15 +143,13 @@ func (f *Filestore) DeleteBlock(c *cid.Cid) error { func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { blk, err := f.bs.Get(c) switch err { - default: - return nil, err case nil: return blk, nil case blockstore.ErrNotFound: - // try filestore + return f.fm.Get(c) + default: + return nil, err } - - return f.fm.Get(c) } // GetSize returns the size of the requested block. It may return ErrNotFound @@ -159,15 +157,13 @@ func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { func (f *Filestore) GetSize(c *cid.Cid) (int, error) { size, err := f.bs.GetSize(c) switch err { - default: - return -1, err case nil: return size, nil case blockstore.ErrNotFound: - // try filestore + return f.fm.GetSize(c) + default: + return -1, err } - - return f.fm.GetSize(c) } // Has returns true if the block with the given Cid is From eb119d4942ab6615504a5dc5da7eb464d411dc56 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 7 Aug 2018 18:21:41 -0700 Subject: [PATCH 2195/3147] update gogo protobuf This commit was moved from ipfs/go-unixfs@1000cfd8959cc21b553b44c8e41abc8d21a9ee08 --- unixfs/pb/Makefile | 11 +++++ unixfs/pb/unixfs.pb.go | 106 +++++++++++++++++++++++++++++++++-------- unixfs/pb/unixfs.proto | 2 + 3 files changed, 98 insertions(+), 21 deletions(-) create mode 100644 unixfs/pb/Makefile diff --git a/unixfs/pb/Makefile b/unixfs/pb/Makefile new file mode 100644 index 0000000000..51552a0961 --- /dev/null +++ b/unixfs/pb/Makefile @@ -0,0 +1,11 @@ +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --proto_path=$(GOPATH)/src:. --gogo_out=. $< + +clean: + rm -f *.pb.go + rm -f *.go diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 648b107160..0ec0617e7e 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -1,17 +1,6 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: unixfs.proto -// DO NOT EDIT! -/* -Package unixfs_pb is a generated protocol buffer package. - -It is generated from these files: - unixfs.proto - -It has these top-level messages: - Data - Metadata -*/ package unixfs_pb import proto "github.com/gogo/protobuf/proto" @@ -23,6 +12,12 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + type Data_DataType int32 const ( @@ -67,20 +62,45 @@ func (x *Data_DataType) UnmarshalJSON(data []byte) error { *x = Data_DataType(value) return nil } +func (Data_DataType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_unixfs_768dd0381a72e0c6, []int{0, 0} +} type Data struct { - Type *Data_DataType `protobuf:"varint,1,req,name=Type,enum=unixfs.pb.Data_DataType" json:"Type,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=Data" json:"Data,omitempty"` - Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` - Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` - HashType *uint64 `protobuf:"varint,5,opt,name=hashType" json:"hashType,omitempty"` - Fanout *uint64 `protobuf:"varint,6,opt,name=fanout" json:"fanout,omitempty"` - XXX_unrecognized []byte `json:"-"` + Type *Data_DataType `protobuf:"varint,1,req,name=Type,enum=unixfs.pb.Data_DataType" json:"Type,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=Data" json:"Data,omitempty"` + Filesize *uint64 `protobuf:"varint,3,opt,name=filesize" json:"filesize,omitempty"` + Blocksizes []uint64 `protobuf:"varint,4,rep,name=blocksizes" json:"blocksizes,omitempty"` + HashType *uint64 `protobuf:"varint,5,opt,name=hashType" json:"hashType,omitempty"` + Fanout *uint64 `protobuf:"varint,6,opt,name=fanout" json:"fanout,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Data) Reset() { *m = Data{} } func (m *Data) String() string { return proto.CompactTextString(m) } func (*Data) ProtoMessage() {} +func (*Data) Descriptor() ([]byte, []int) { + return fileDescriptor_unixfs_768dd0381a72e0c6, []int{0} +} +func (m *Data) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Data.Unmarshal(m, b) +} +func (m *Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Data.Marshal(b, m, deterministic) +} +func (dst *Data) XXX_Merge(src proto.Message) { + xxx_messageInfo_Data.Merge(dst, src) +} +func (m *Data) XXX_Size() int { + return xxx_messageInfo_Data.Size(m) +} +func (m *Data) XXX_DiscardUnknown() { + xxx_messageInfo_Data.DiscardUnknown(m) +} + +var xxx_messageInfo_Data proto.InternalMessageInfo func (m *Data) GetType() Data_DataType { if m != nil && m.Type != nil { @@ -125,13 +145,35 @@ func (m *Data) GetFanout() uint64 { } type Metadata struct { - MimeType *string `protobuf:"bytes,1,opt,name=MimeType" json:"MimeType,omitempty"` - XXX_unrecognized []byte `json:"-"` + MimeType *string `protobuf:"bytes,1,opt,name=MimeType" json:"MimeType,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Metadata) Reset() { *m = Metadata{} } func (m *Metadata) String() string { return proto.CompactTextString(m) } func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { + return fileDescriptor_unixfs_768dd0381a72e0c6, []int{1} +} +func (m *Metadata) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Metadata.Unmarshal(m, b) +} +func (m *Metadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Metadata.Marshal(b, m, deterministic) +} +func (dst *Metadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metadata.Merge(dst, src) +} +func (m *Metadata) XXX_Size() int { + return xxx_messageInfo_Metadata.Size(m) +} +func (m *Metadata) XXX_DiscardUnknown() { + xxx_messageInfo_Metadata.DiscardUnknown(m) +} + +var xxx_messageInfo_Metadata proto.InternalMessageInfo func (m *Metadata) GetMimeType() string { if m != nil && m.MimeType != nil { @@ -145,3 +187,25 @@ func init() { proto.RegisterType((*Metadata)(nil), "unixfs.pb.Metadata") proto.RegisterEnum("unixfs.pb.Data_DataType", Data_DataType_name, Data_DataType_value) } + +func init() { proto.RegisterFile("unixfs.proto", fileDescriptor_unixfs_768dd0381a72e0c6) } + +var fileDescriptor_unixfs_768dd0381a72e0c6 = []byte{ + // 254 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x90, 0xb1, 0x6a, 0xeb, 0x30, + 0x18, 0x85, 0xaf, 0x6c, 0x25, 0xb1, 0xff, 0xeb, 0x16, 0xf1, 0x0f, 0x45, 0x74, 0x28, 0xc6, 0x43, + 0xd1, 0x50, 0x3c, 0xf4, 0x0d, 0x0a, 0xa1, 0x74, 0xf1, 0xa2, 0x84, 0xee, 0x4a, 0x22, 0x63, 0x11, + 0xc7, 0x0a, 0xb6, 0x42, 0xeb, 0x3e, 0x45, 0x1f, 0xb9, 0xc8, 0x8e, 0xdd, 0x2e, 0x82, 0x4f, 0xe7, + 0x7c, 0xe2, 0x20, 0x48, 0x2e, 0x8d, 0xf9, 0x2c, 0xbb, 0xfc, 0xdc, 0x5a, 0x67, 0x31, 0x9e, 0x68, + 0x97, 0x7d, 0x07, 0x40, 0xd7, 0xca, 0x29, 0x7c, 0x02, 0xba, 0xed, 0xcf, 0x9a, 0x93, 0x34, 0x10, + 0xb7, 0xcf, 0x3c, 0x9f, 0x2b, 0xb9, 0x8f, 0x87, 0xc3, 0xe7, 0x72, 0x68, 0x21, 0x8e, 0x16, 0x0f, + 0x52, 0x22, 0x12, 0x39, 0xbe, 0x70, 0x0f, 0x51, 0x69, 0x6a, 0xdd, 0x99, 0x2f, 0xcd, 0xc3, 0x94, + 0x08, 0x2a, 0x67, 0xc6, 0x07, 0x80, 0x5d, 0x6d, 0xf7, 0x47, 0x0f, 0x1d, 0xa7, 0x69, 0x28, 0xa8, + 0xfc, 0x73, 0xe3, 0xdd, 0x4a, 0x75, 0xd5, 0xb0, 0x60, 0x31, 0xba, 0x13, 0xe3, 0x1d, 0x2c, 0x4b, + 0xd5, 0xd8, 0x8b, 0xe3, 0xcb, 0x21, 0xb9, 0x52, 0xf6, 0x0e, 0xd1, 0xb4, 0x0a, 0x57, 0x10, 0x4a, + 0xf5, 0xc1, 0xfe, 0xe1, 0x0d, 0xc4, 0x6b, 0xd3, 0xea, 0xbd, 0xb3, 0x6d, 0xcf, 0x08, 0x46, 0x40, + 0x5f, 0x4d, 0xad, 0x59, 0x80, 0x09, 0x44, 0x85, 0x76, 0xea, 0xa0, 0x9c, 0x62, 0x21, 0xfe, 0x87, + 0xd5, 0xa6, 0x3f, 0xd5, 0xa6, 0x39, 0x32, 0xea, 0x9d, 0xb7, 0x97, 0x62, 0xbb, 0xa9, 0x54, 0x7b, + 0x60, 0x8b, 0xec, 0xf1, 0xb7, 0xe9, 0x77, 0x15, 0xe6, 0xa4, 0xaf, 0x3f, 0x43, 0x44, 0x2c, 0x67, + 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0xe9, 0xa0, 0x51, 0x10, 0x54, 0x01, 0x00, 0x00, +} diff --git a/unixfs/pb/unixfs.proto b/unixfs/pb/unixfs.proto index 6feb7aad65..ffc059e8be 100644 --- a/unixfs/pb/unixfs.proto +++ b/unixfs/pb/unixfs.proto @@ -1,3 +1,5 @@ +syntax = "proto2"; + package unixfs.pb; message Data { From 80723b2b339c90d1f4f4dd0035aa6f6c31ed9fd2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 7 Aug 2018 18:26:33 -0700 Subject: [PATCH 2196/3147] add stablecid test This commit was moved from ipfs/go-unixfs@8ec3fa71923aa65bcc604025882a52260e41778d --- unixfs/importer/importer_test.go | 37 +++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/unixfs/importer/importer_test.go b/unixfs/importer/importer_test.go index 55f8a9480a..823abaa4b2 100644 --- a/unixfs/importer/importer_test.go +++ b/unixfs/importer/importer_test.go @@ -7,12 +7,13 @@ import ( "io/ioutil" "testing" - mdtest "github.com/ipfs/go-merkledag/test" uio "github.com/ipfs/go-unixfs/io" + cid "github.com/ipfs/go-cid" chunker "github.com/ipfs/go-ipfs-chunker" u "github.com/ipfs/go-ipfs-util" ipld "github.com/ipfs/go-ipld-format" + mdtest "github.com/ipfs/go-merkledag/test" ) func getBalancedDag(t testing.TB, size int64, blksize int64) (ipld.Node, ipld.DAGService) { @@ -35,6 +36,40 @@ func getTrickleDag(t testing.TB, size int64, blksize int64) (ipld.Node, ipld.DAG return nd, ds } +func TestStableCid(t *testing.T) { + ds := mdtest.Mock() + buf := make([]byte, 10 * 1024 * 1024) + u.NewSeededRand(0xdeadbeef).Read(buf) + r := bytes.NewReader(buf) + + nd, err := BuildDagFromReader(ds, chunker.DefaultSplitter(r)) + if err != nil { + t.Fatal(err) + } + + expected, err := cid.Decode("QmZN1qquw84zhV4j6vT56tCcmFxaDaySL1ezTXFvMdNmrK") + if err != nil { + t.Fatal(err) + } + if !expected.Equals(nd.Cid()) { + t.Fatalf("expected CID %s, got CID %s", expected, nd) + } + + dr, err := uio.NewDagReader(context.Background(), nd, ds) + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(dr) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(out, buf) { + t.Fatal("bad read") + } +} + func TestBalancedDag(t *testing.T) { ds := mdtest.Mock() buf := make([]byte, 10000) From 24dc2c1d02fb8ec5f0eb66d8156f8d4e79a98069 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 7 Aug 2018 17:53:20 -0700 Subject: [PATCH 2197/3147] update gogo protobuf And regenerate the protobuf definitions. This commit was moved from ipfs/go-ipns@1f0ee15d7416522f55b7731c556fec128378ddd6 --- ipns/ipns.go | 3 +- ipns/pb/Makefile | 11 + ipns/pb/ipns.pb.go | 550 +++++++++++++++++++++++++++++++++++++++++++-- ipns/pb/ipns.proto | 2 + 4 files changed, 550 insertions(+), 16 deletions(-) create mode 100644 ipns/pb/Makefile diff --git a/ipns/ipns.go b/ipns/ipns.go index 38b50764bd..7bab52478d 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -7,7 +7,6 @@ import ( pb "github.com/ipfs/go-ipns/pb" - proto "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" ic "github.com/libp2p/go-libp2p-crypto" peer "github.com/libp2p/go-libp2p-peer" @@ -23,7 +22,7 @@ func Create(sk ic.PrivKey, val []byte, seq uint64, eol time.Time) (*pb.IpnsEntry entry.Value = val typ := pb.IpnsEntry_EOL entry.ValidityType = &typ - entry.Sequence = proto.Uint64(seq) + entry.Sequence = &seq entry.Validity = []byte(u.FormatRFC3339(eol)) sig, err := sk.Sign(ipnsEntryDataForSig(entry)) diff --git a/ipns/pb/Makefile b/ipns/pb/Makefile new file mode 100644 index 0000000000..eb14b5768a --- /dev/null +++ b/ipns/pb/Makefile @@ -0,0 +1,11 @@ +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --proto_path=$(GOPATH)/src:. --gogofast_out=. $< + +clean: + rm -f *.pb.go + rm -f *.go diff --git a/ipns/pb/ipns.pb.go b/ipns/pb/ipns.pb.go index 692ba564c2..5a6a0bebba 100644 --- a/ipns/pb/ipns.pb.go +++ b/ipns/pb/ipns.pb.go @@ -1,27 +1,27 @@ -// Code generated by protoc-gen-gogo. -// source: pb/ipns.proto -// DO NOT EDIT! +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: ipns.proto -/* -Package ipns_pb is a generated protocol buffer package. - -It is generated from these files: - pb/ipns.proto - -It has these top-level messages: - IpnsEntry -*/ package ipns_pb import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + +import io "io" + // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + type IpnsEntry_ValidityType int32 const ( @@ -52,6 +52,9 @@ func (x *IpnsEntry_ValidityType) UnmarshalJSON(data []byte) error { *x = IpnsEntry_ValidityType(value) return nil } +func (IpnsEntry_ValidityType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_ipns_02f6be73595bcc54, []int{0, 0} +} type IpnsEntry struct { Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` @@ -64,13 +67,44 @@ type IpnsEntry struct { // key associated with it. For old RSA keys, its easiest if we just send this as part of // the record itself. For newer ed25519 keys, the public key can be embedded in the // peerID, making this field unnecessary. - PubKey []byte `protobuf:"bytes,7,opt,name=pubKey" json:"pubKey,omitempty"` - XXX_unrecognized []byte `json:"-"` + PubKey []byte `protobuf:"bytes,7,opt,name=pubKey" json:"pubKey,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *IpnsEntry) Reset() { *m = IpnsEntry{} } func (m *IpnsEntry) String() string { return proto.CompactTextString(m) } func (*IpnsEntry) ProtoMessage() {} +func (*IpnsEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_ipns_02f6be73595bcc54, []int{0} +} +func (m *IpnsEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IpnsEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IpnsEntry.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *IpnsEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_IpnsEntry.Merge(dst, src) +} +func (m *IpnsEntry) XXX_Size() int { + return m.Size() +} +func (m *IpnsEntry) XXX_DiscardUnknown() { + xxx_messageInfo_IpnsEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_IpnsEntry proto.InternalMessageInfo func (m *IpnsEntry) GetValue() []byte { if m != nil { @@ -125,3 +159,491 @@ func init() { proto.RegisterType((*IpnsEntry)(nil), "ipns.pb.IpnsEntry") proto.RegisterEnum("ipns.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) } +func (m *IpnsEntry) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IpnsEntry) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Value == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintIpns(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if m.Signature == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") + } else { + dAtA[i] = 0x12 + i++ + i = encodeVarintIpns(dAtA, i, uint64(len(m.Signature))) + i += copy(dAtA[i:], m.Signature) + } + if m.ValidityType != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintIpns(dAtA, i, uint64(*m.ValidityType)) + } + if m.Validity != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintIpns(dAtA, i, uint64(len(m.Validity))) + i += copy(dAtA[i:], m.Validity) + } + if m.Sequence != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintIpns(dAtA, i, uint64(*m.Sequence)) + } + if m.Ttl != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintIpns(dAtA, i, uint64(*m.Ttl)) + } + if m.PubKey != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintIpns(dAtA, i, uint64(len(m.PubKey))) + i += copy(dAtA[i:], m.PubKey) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func encodeVarintIpns(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *IpnsEntry) Size() (n int) { + var l int + _ = l + if m.Value != nil { + l = len(m.Value) + n += 1 + l + sovIpns(uint64(l)) + } + if m.Signature != nil { + l = len(m.Signature) + n += 1 + l + sovIpns(uint64(l)) + } + if m.ValidityType != nil { + n += 1 + sovIpns(uint64(*m.ValidityType)) + } + if m.Validity != nil { + l = len(m.Validity) + n += 1 + l + sovIpns(uint64(l)) + } + if m.Sequence != nil { + n += 1 + sovIpns(uint64(*m.Sequence)) + } + if m.Ttl != nil { + n += 1 + sovIpns(uint64(*m.Ttl)) + } + if m.PubKey != nil { + l = len(m.PubKey) + n += 1 + l + sovIpns(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovIpns(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozIpns(x uint64) (n int) { + return sovIpns(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *IpnsEntry) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IpnsEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IpnsEntry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidityType", wireType) + } + var v IpnsEntry_ValidityType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (IpnsEntry_ValidityType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ValidityType = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validity = append(m.Validity[:0], dAtA[iNdEx:postIndex]...) + if m.Validity == nil { + m.Validity = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Sequence = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ttl", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Ttl = &v + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PubKey = append(m.PubKey[:0], dAtA[iNdEx:postIndex]...) + if m.PubKey == nil { + m.PubKey = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipIpns(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthIpns + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipIpns(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIpns + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIpns + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIpns + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthIpns + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIpns + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipIpns(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthIpns = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowIpns = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("ipns.proto", fileDescriptor_ipns_02f6be73595bcc54) } + +var fileDescriptor_ipns_02f6be73595bcc54 = []byte{ + // 221 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xca, 0x2c, 0xc8, 0x2b, + 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0xb0, 0x93, 0x94, 0xfe, 0x33, 0x72, 0x71, + 0x7a, 0x16, 0xe4, 0x15, 0xbb, 0xe6, 0x95, 0x14, 0x55, 0x0a, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, + 0x94, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x69, 0xf0, 0x04, 0x41, 0x38, 0x42, 0x32, 0x5c, 0x9c, 0xc5, + 0x99, 0xe9, 0x79, 0x89, 0x25, 0xa5, 0x45, 0xa9, 0x12, 0x4c, 0x60, 0x19, 0x84, 0x80, 0x90, 0x33, + 0x17, 0x4f, 0x59, 0x62, 0x4e, 0x66, 0x4a, 0x66, 0x49, 0x65, 0x48, 0x65, 0x41, 0xaa, 0x04, 0xb3, + 0x02, 0xa3, 0x06, 0x9f, 0x91, 0xbc, 0x1e, 0xd4, 0x06, 0x3d, 0xb8, 0xe9, 0x7a, 0x61, 0x48, 0xca, + 0x82, 0x50, 0x34, 0x09, 0x49, 0x71, 0x71, 0xc0, 0xf8, 0x12, 0x2c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, + 0x70, 0x3e, 0x48, 0xae, 0x38, 0xb5, 0xb0, 0x34, 0x35, 0x2f, 0x39, 0x55, 0x82, 0x55, 0x81, 0x51, + 0x83, 0x25, 0x08, 0xce, 0x17, 0x12, 0xe0, 0x62, 0x2e, 0x29, 0xc9, 0x91, 0x60, 0x03, 0x0b, 0x83, + 0x98, 0x42, 0x62, 0x5c, 0x6c, 0x05, 0xa5, 0x49, 0xde, 0xa9, 0x95, 0x12, 0xec, 0x60, 0x73, 0xa0, + 0x3c, 0x25, 0x71, 0x2e, 0x1e, 0x64, 0xfb, 0x85, 0xd8, 0xb9, 0x98, 0x5d, 0xfd, 0x7d, 0x04, 0x18, + 0x9c, 0x78, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0x46, 0x40, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x32, 0x35, 0xc7, 0xf2, 0x25, 0x01, 0x00, 0x00, +} diff --git a/ipns/pb/ipns.proto b/ipns/pb/ipns.proto index a59cfcf29c..f2e79feff4 100644 --- a/ipns/pb/ipns.proto +++ b/ipns/pb/ipns.proto @@ -1,3 +1,5 @@ +syntax = "proto2"; + package ipns.pb; message IpnsEntry { From 9657a72c82daf4c056f084b1539076bf1adb6b06 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 18:51:17 -0700 Subject: [PATCH 2198/3147] update gogo-protobuf fixes #3214 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@efaa955240090becba324ed8c87feadc275a6fb5 --- mfs/dir.go | 8 ++++---- mfs/fd.go | 2 +- mfs/file.go | 8 ++++---- mfs/mfs_test.go | 20 ++++++++++---------- mfs/ops.go | 2 +- mfs/repub_test.go | 2 +- mfs/system.go | 6 +++--- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 8d1e0069f7..00133a2b80 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,10 +9,10 @@ import ( "sync" "time" - ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" - uio "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/io" - ufspb "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/pb" - dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" + uio "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/io" + ufspb "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/pb" + dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/fd.go b/mfs/fd.go index b2975d7ea4..c7a795c075 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/mod" + mod "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index 424a6f1c38..422de66cc0 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" - ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" - mod "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/mod" - dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" + mod "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/mod" + dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + chunker "gx/ipfs/Qmc3UwSvJkntxu2gKDPCqJEzmhqVeJtTbrVxJm6tsdmMF1/go-ipfs-chunker" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 7230391eee..e4da56d571 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,19 +14,19 @@ import ( "testing" "time" - bserv "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" - ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" - importer "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/importer" - uio "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs/io" - "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" - dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" - - offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" + "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" + importer "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/importer" + uio "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/io" + dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + bserv "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - bstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" - chunker "gx/ipfs/QmVDjhUMtkRskBFAVNwyXuLSKbeAya7JKPnzAxMKDaK4x4/go-ipfs-chunker" + bstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" + offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + chunker "gx/ipfs/Qmc3UwSvJkntxu2gKDPCqJEzmhqVeJtTbrVxJm6tsdmMF1/go-ipfs-chunker" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/mfs/ops.go b/mfs/ops.go index eff8b30327..c2c2d0e547 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,7 +6,7 @@ import ( gopath "path" "strings" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/repub_test.go b/mfs/repub_test.go index bfd21deab6..cb1e4437fe 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" + ci "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil/ci" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ci "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil/ci" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 520fecda3e..33845c302a 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,12 +16,12 @@ import ( "sync" "time" - ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" - dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" + dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ) var ErrNotExist = errors.New("no such rootfs") From 7e6bd471cf38959b5b2a4c4302415d71e46053db Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 18:51:17 -0700 Subject: [PATCH 2199/3147] update gogo-protobuf fixes #3214 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@7af80f20fb728a0550b7e5f11877fb697cb6a03a --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 22 +++++++++++----------- namesys/namesys.go | 8 ++++---- namesys/namesys_test.go | 14 +++++++------- namesys/proquint.go | 2 +- namesys/publisher.go | 18 +++++++++--------- namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 12 ++++++------ namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 16 ++++++++-------- 14 files changed, 64 insertions(+), 64 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 96bcea7966..96f10c80f1 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index b93562cf86..154c629c3a 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 8b9aa530f1..05e93c1ef0 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index ac99ad49ed..1e0c083ce8 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,9 +36,9 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 60b5c9e0e3..3b5194a23b 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,21 +6,21 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - record "gx/ipfs/QmVsp2KdPYE6M8ryzCk5KHLo3zprcY5hBDaYx6uPCFUdxA/go-libp2p-record" - routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" - ropts "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing/options" - pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" - mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" - offline "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/offline" - testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + record "gx/ipfs/QmUTQSGgjs8CHm9yBcUHicpRs7C9abhyZiBwjzCUp1pNgX/go-libp2p-record" + ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" + pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" + mockrouting "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/mock" + offline "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/offline" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" + routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" + ropts "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing/options" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 4585885a68..216525ee3a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" - routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 092f3629a2..25d07976e5 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,14 +7,14 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" - pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" - offroute "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/offline" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" + offroute "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/offline" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index 4ed5a79bf9..7e571b42b0 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index ae6669becc..df47a15011 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,17 +8,17 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmVxjT67BU1QZUPzSLNZT6DkDzVNfPfkzqNyJYFXxSH2hA/go-unixfs" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" - - routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" - pb "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns/pb" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" + + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsquery "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" + routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 7926fd67ee..42cb859737 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,13 +6,13 @@ import ( "testing" "time" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" - testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" + mockrouting "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/mock" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 9eadcd92a6..57be87ae94 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - pb "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns/pb" - ic "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index dd17661204..b51bbcdc84 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmY51bqSM5XgxQZqsBrQcRkKTnCb8EKpJpR9K6Qax7Njco/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore" + mocknet "gx/ipfs/QmUDzeFgYrRmHL2hUB6NZmqcBVQtUzETwmFRUc9onfSSHr/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index a60e6d67e4..623f6213d1 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - mockrouting "gx/ipfs/QmbFRJeEmEU16y3BmKKaD4a9fm5oHsEAMHe2vSB1UnfLMi/go-ipfs-routing/mock" - testutil "gx/ipfs/QmcW4FGAt24fdK1jBgWQn3yP4R9ZLyWQqjozv9QK7epRhL/go-testutil" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" + ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" + mockrouting "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/mock" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 1bc5c813ca..3a4711af46 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,17 +6,17 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dht "gx/ipfs/QmTktQYCKzQjhxF6dk5xJPRuhHn3JBiKGvMLoiDy1mYmxC/go-libp2p-kad-dht" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - routing "gx/ipfs/QmZ383TySJVeZWzGnWui6pRcKyYZk9VkKTuW7tmKRWk5au/go-libp2p-routing" - proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" - peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" - ipns "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns" - pb "gx/ipfs/Qmdue1XShFNi3mpizGx9NR9hyNEj6U2wEW93yGhKqKCFGN/go-ipns/pb" + dht "gx/ipfs/QmZAsayEQakfFbHyakgHRKHwBTWrwuSBTfaMyxJZUG97VC/go-libp2p-kad-dht" + peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" ) var log = logging.Logger("namesys") From a4e11c495ba27b3258d914374998bb860293a3d1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 18:51:17 -0700 Subject: [PATCH 2200/3147] update gogo-protobuf fixes #3214 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@14e074fe622e697fcd93f3853d01c6b2a5df96a1 --- pinning/pinner/gc/gc.go | 10 +++++----- pinning/pinner/internal/pb/header.pb.go | 2 +- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 8 ++++---- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 8 ++++---- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 6b19d0e40a..a785d07763 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,15 +8,15 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" - dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + bserv "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" - offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" "gx/ipfs/QmQwgv79RHrRnoXmhnpC1BPtY55HHeneGMpPwmmBU1fUAG/go-verifcid" - bstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" + bstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go index b77d37743e..6a620c9e72 100644 --- a/pinning/pinner/internal/pb/header.pb.go +++ b/pinning/pinner/internal/pb/header.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package pb -import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +import proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" import math "math" // Reference imports to suppress errors if they are not otherwise used. diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 77c9d6b1fa..e60c80eee5 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,11 +10,11 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + mdag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 51795a50f9..dfb6b75eb3 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,12 +5,12 @@ import ( "testing" "time" - bs "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" - mdag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + mdag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + bs "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" - offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" + offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index c2c111c15c..d3b57e818b 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,11 +10,11 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index ef0cbe9d00..3b095c4cc8 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,11 +5,11 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmPkMDBc7pSitAf2uixsNyZ53uheBjcwFTGLtXKpgdNcP4/go-blockservice" - dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + bserv "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" - offline "gx/ipfs/QmP9jV1GQzpEhLScrYZ1YWHnZMfdc7x13TwybM73FcuN8k/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" + offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" From f6cac1c4f16f90c59d123296bb820fa0faa8e9fa Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 18:51:17 -0700 Subject: [PATCH 2201/3147] update gogo-protobuf fixes #3214 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@2d4003fdec14cc4bfb89247f2557a7723efa0f18 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 2 +- filestore/pb/dataobj.pb.go | 2 +- filestore/util.go | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index f1cd4a4f77..29e966491f 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,11 +11,11 @@ import ( "context" "errors" + blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index bc5322ad03..77ed25a4aa 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,10 +7,10 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmfKKGzisaoP4oiHQSHz1zLbXDCTeXe7NVfX1FAMKzcHmt/go-merkledag" + dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 146d018b9c..67d657a8c0 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" proto "gx/ipfs/QmZHU2gx42NPTYXzw6pJkuX6xCE7bKECp6e8QcPdoLx8sx/protobuf/proto" diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index fadd40c1a4..3ddf730810 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package datastore_pb -import proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto" +import proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" import fmt "fmt" import math "math" diff --git a/filestore/util.go b/filestore/util.go index 1d6b723e84..3eed174c5b 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,7 +6,7 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - blockstore "gx/ipfs/QmTCHqj6s51pDu1GaPGyBW2VdmCUvtzLCF6nWykfX9ZYRt/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" From e415aa12146cdbaffdc1619687c307cd9de09842 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 18:51:17 -0700 Subject: [PATCH 2202/3147] update gogo-protobuf fixes #3214 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@1ef16343d8d91bd685c8b4dc6554fda5e4531b36 --- coreiface/key.go | 2 +- coreiface/path.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/key.go b/coreiface/key.go index 2abf3559b7..3730f35924 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer" + "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/path.go b/coreiface/path.go index 4c4c515328..c51d316454 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmY2QaawxgJw2rn7WsFNkWEYph3z2azpyYdrhAc1JctDmE/go-path" + ipfspath "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ) From 0911f2f1a0aa8c9253ed10e1178259a91ba6dcd5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 18:51:17 -0700 Subject: [PATCH 2203/3147] update gogo-protobuf fixes #3214 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-keystore@f71e2d9b0da189872d7528337c3d48c26b231c0c --- keystore/keystore.go | 4 ++-- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index e16dc265e4..38c0869ef1 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,8 +7,8 @@ import ( "path/filepath" "strings" - logging "gx/ipfs/QmcVVHfdyv15GVPk7NrxdWjh2hLVccXnoD8j2tyQShiXJb/go-log" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ) var log = logging.Logger("keystore") diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index f8ef62f49f..751a2e39d2 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 4a525ce590..a89a1ae7f1 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5/go-libp2p-crypto" +import ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. From 7de2f3a66ad8ef3ad575391f66d08bbce9b8159a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Aug 2018 17:21:28 -0700 Subject: [PATCH 2204/3147] update cmdkit to fix the progress bar The progressbar should now correctly calculate the size of a directory (by ignoring the directory sizes). fixes #5288 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@252006ff2334b98b0d085e249f3005277544655a --- mfs/dir.go | 6 +++--- mfs/fd.go | 2 +- mfs/file.go | 4 ++-- mfs/mfs_test.go | 6 +++--- mfs/system.go | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 00133a2b80..37d88620a3 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,10 +9,10 @@ import ( "sync" "time" - ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" - uio "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/io" - ufspb "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/pb" dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" + uio "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/io" + ufspb "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/pb" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" diff --git a/mfs/fd.go b/mfs/fd.go index c7a795c075..1298c618cd 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/mod" + mod "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index 422de66cc0..f577e11de9 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,9 +5,9 @@ import ( "fmt" "sync" - ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" - mod "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/mod" dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" + mod "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/mod" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" chunker "gx/ipfs/Qmc3UwSvJkntxu2gKDPCqJEzmhqVeJtTbrVxJm6tsdmMF1/go-ipfs-chunker" diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index e4da56d571..a8aa809812 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -15,10 +15,10 @@ import ( "time" "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" - importer "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/importer" - uio "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs/io" dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" + importer "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/importer" + uio "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/io" bserv "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/mfs/system.go b/mfs/system.go index 33845c302a..cbeac035ef 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,8 +16,8 @@ import ( "sync" "time" - ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" From 588995f705d3fbdadcd6cf9a4ab7adffdba79600 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 Aug 2018 17:21:28 -0700 Subject: [PATCH 2205/3147] update cmdkit to fix the progress bar The progressbar should now correctly calculate the size of a directory (by ignoring the directory sizes). fixes #5288 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@51021785d8c0db8304e1a5e0c95fa3186812b8ed --- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 25d07976e5..3ab9bd49b0 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" + "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" diff --git a/namesys/publisher.go b/namesys/publisher.go index df47a15011..b50f54185b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -9,7 +9,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - ft "gx/ipfs/QmWJRM6rLjXGEXb5JkKu17Y68eJtCFcKPyRhb8JH2ELZ2Q/go-unixfs" + ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" From 4d34e888043cb79f78513a3c090934cc16231c61 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 10 Aug 2018 16:09:09 -0400 Subject: [PATCH 2206/3147] gx updates This commit was moved from ipfs/go-unixfs@f84f499c6ef52e9c5c788626747c1e8e08ed5c1d --- unixfs/importer/importer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/importer/importer_test.go b/unixfs/importer/importer_test.go index 823abaa4b2..b39aff57d7 100644 --- a/unixfs/importer/importer_test.go +++ b/unixfs/importer/importer_test.go @@ -38,7 +38,7 @@ func getTrickleDag(t testing.TB, size int64, blksize int64) (ipld.Node, ipld.DAG func TestStableCid(t *testing.T) { ds := mdtest.Mock() - buf := make([]byte, 10 * 1024 * 1024) + buf := make([]byte, 10*1024*1024) u.NewSeededRand(0xdeadbeef).Read(buf) r := bytes.NewReader(buf) From dd6b99bf49a7a8c833904ca1f43b138a1d1949ae Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 10 Aug 2018 23:43:14 -0400 Subject: [PATCH 2207/3147] Update to use new Builder interface for creating CIDs. This commit was moved from ipfs/go-unixfs@dc95f6c3f0ac4ab13ebbbae213d3334ce9c23c13 --- unixfs/hamt/hamt.go | 10 +++++----- unixfs/importer/helpers/dagbuilder.go | 12 ++++++------ unixfs/importer/helpers/helpers.go | 4 ++-- unixfs/io/directory.go | 18 +++++++++--------- unixfs/mod/dagmodifier.go | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 6887a148d0..a28bf07251 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -52,7 +52,7 @@ type Shard struct { tableSize int tableSizeLg2 int - prefix *cid.Prefix + prefix cid.Builder hashFunc uint64 prefixPadStr string @@ -124,25 +124,25 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { ds.children = make([]child, len(pbnd.Links())) ds.bitfield.SetBytes(pbd.GetData()) ds.hashFunc = pbd.GetHashType() - ds.prefix = &ds.nd.Prefix + ds.prefix = ds.nd.CidBuilder() return ds, nil } // SetPrefix sets the CID Prefix -func (ds *Shard) SetPrefix(prefix *cid.Prefix) { +func (ds *Shard) SetPrefix(prefix cid.Builder) { ds.prefix = prefix } // Prefix gets the CID Prefix, may be nil if unset -func (ds *Shard) Prefix() *cid.Prefix { +func (ds *Shard) Prefix() cid.Builder { return ds.prefix } // Node serializes the HAMT structure into a merkledag node with unixfs formatting func (ds *Shard) Node() (ipld.Node, error) { out := new(dag.ProtoNode) - out.SetPrefix(ds.prefix) + out.SetCidBuilder(ds.prefix) cindex := 0 // TODO: optimized 'for each set bit' diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 387b263047..1331ddbfaa 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -26,7 +26,7 @@ type DagBuilderHelper struct { nextData []byte // the next item to return. maxlinks int batch *ipld.Batch - prefix *cid.Prefix + prefix cid.Builder // Filestore support variables. // ---------------------------- @@ -54,7 +54,7 @@ type DagBuilderParams struct { RawLeaves bool // CID Prefix to use if set - Prefix *cid.Prefix + Prefix cid.Builder // DAGService to write blocks to (required) Dagserv ipld.DAGService @@ -146,7 +146,7 @@ func (db *DagBuilderHelper) NewUnixfsNode() *UnixfsNode { } // GetPrefix returns the internal `cid.Prefix` set in the builder. -func (db *DagBuilderHelper) GetPrefix() *cid.Prefix { +func (db *DagBuilderHelper) GetPrefix() cid.Builder { return db.prefix } @@ -166,7 +166,7 @@ func (db *DagBuilderHelper) NewLeaf(data []byte) (*UnixfsNode, error) { raw: true, }, nil } - rawnode, err := dag.NewRawNodeWPrefix(data, *db.prefix) + rawnode, err := dag.NewRawNodeWPrefix(data, db.prefix) if err != nil { return nil, err } @@ -197,7 +197,7 @@ func (db *DagBuilderHelper) NewLeafNode(data []byte) (ipld.Node, error) { if db.prefix == nil { return dag.NewRawNode(data), nil } - rawnode, err := dag.NewRawNodeWPrefix(data, *db.prefix) + rawnode, err := dag.NewRawNodeWPrefix(data, db.prefix) if err != nil { return nil, err } @@ -401,7 +401,7 @@ type FSNodeOverDag struct { func (db *DagBuilderHelper) NewFSNodeOverDag(fsNodeType pb.Data_DataType) *FSNodeOverDag { node := new(FSNodeOverDag) node.dag = new(dag.ProtoNode) - node.dag.SetPrefix(db.GetPrefix()) + node.dag.SetCidBuilder(db.GetPrefix()) node.file = ft.NewFSNode(fsNodeType) diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index 6fb0f83c8d..c8aca63d15 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -61,8 +61,8 @@ func NewUnixfsNodeFromDag(nd *dag.ProtoNode) (*UnixfsNode, error) { } // SetPrefix sets the CID Prefix -func (n *UnixfsNode) SetPrefix(prefix *cid.Prefix) { - n.node.SetPrefix(prefix) +func (n *UnixfsNode) SetPrefix(prefix cid.Builder) { + n.node.SetCidBuilder(prefix) } // NumChildren returns the number of children referenced by this UnixfsNode. diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 89864566ee..64960531f5 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -30,7 +30,7 @@ var DefaultShardWidth = 256 type Directory interface { // SetPrefix sets the CID prefix of the root node. - SetPrefix(*cid.Prefix) + SetPrefix(cid.Builder) // AddChild adds a (name, key) pair to the root node. AddChild(context.Context, string, ipld.Node) error @@ -52,7 +52,7 @@ type Directory interface { GetNode() (ipld.Node, error) // GetPrefix returns the CID Prefix used. - GetPrefix() *cid.Prefix + GetPrefix() cid.Builder } // TODO: Evaluate removing `dserv` from this layer and providing it in MFS. @@ -128,8 +128,8 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err } // SetPrefix implements the `Directory` interface. -func (d *BasicDirectory) SetPrefix(prefix *cid.Prefix) { - d.node.SetPrefix(prefix) +func (d *BasicDirectory) SetPrefix(prefix cid.Builder) { + d.node.SetCidBuilder(prefix) } // AddChild implements the `Directory` interface. It adds (or replaces) @@ -180,8 +180,8 @@ func (d *BasicDirectory) GetNode() (ipld.Node, error) { } // GetPrefix implements the `Directory` interface. -func (d *BasicDirectory) GetPrefix() *cid.Prefix { - return &d.node.Prefix +func (d *BasicDirectory) GetPrefix() cid.Builder { + return d.node.CidBuilder() } // SwitchToSharding returns a HAMT implementation of this directory. @@ -193,7 +193,7 @@ func (d *BasicDirectory) SwitchToSharding(ctx context.Context) (Directory, error if err != nil { return nil, err } - shard.SetPrefix(&d.node.Prefix) + shard.SetPrefix(d.node.CidBuilder()) hamtDir.shard = shard for _, lnk := range d.node.Links() { @@ -212,7 +212,7 @@ func (d *BasicDirectory) SwitchToSharding(ctx context.Context) (Directory, error } // SetPrefix implements the `Directory` interface. -func (d *HAMTDirectory) SetPrefix(prefix *cid.Prefix) { +func (d *HAMTDirectory) SetPrefix(prefix cid.Builder) { d.shard.SetPrefix(prefix) } @@ -252,6 +252,6 @@ func (d *HAMTDirectory) GetNode() (ipld.Node, error) { } // GetPrefix implements the `Directory` interface. -func (d *HAMTDirectory) GetPrefix() *cid.Prefix { +func (d *HAMTDirectory) GetPrefix() cid.Builder { return d.shard.Prefix() } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 09665b80ca..509b3cc81f 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -256,7 +256,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { nd := new(mdag.ProtoNode) nd.SetData(b) - nd.SetPrefix(&nd0.Prefix) + nd.SetCidBuilder(nd0.CidBuilder()) err = dm.dagserv.Add(dm.ctx, nd) if err != nil { return nil, err From ebe84ceeef20365248dd74cd605fdc39da1a962e Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sat, 11 Aug 2018 00:13:57 -0400 Subject: [PATCH 2208/3147] Rename Prefix in names to CidBuilder when a builder is used. This commit was moved from ipfs/go-unixfs@b12f2d836ee0ad9bc8b4b80fa15e1a8fc561a0ca --- unixfs/hamt/hamt.go | 20 +++++------ unixfs/importer/helpers/dagbuilder.go | 52 +++++++++++++-------------- unixfs/importer/helpers/helpers.go | 6 ++-- unixfs/io/directory.go | 32 ++++++++--------- unixfs/mod/dagmodifier.go | 8 ++--- unixfs/test/utils.go | 8 ++--- 6 files changed, 63 insertions(+), 63 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index a28bf07251..4d3bd3b8e7 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -52,7 +52,7 @@ type Shard struct { tableSize int tableSizeLg2 int - prefix cid.Builder + builder cid.Builder hashFunc uint64 prefixPadStr string @@ -124,25 +124,25 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { ds.children = make([]child, len(pbnd.Links())) ds.bitfield.SetBytes(pbd.GetData()) ds.hashFunc = pbd.GetHashType() - ds.prefix = ds.nd.CidBuilder() + ds.builder = ds.nd.CidBuilder() return ds, nil } -// SetPrefix sets the CID Prefix -func (ds *Shard) SetPrefix(prefix cid.Builder) { - ds.prefix = prefix +// SetCidBuilder sets the CID Builder +func (ds *Shard) SetCidBuilder(builder cid.Builder) { + ds.builder = builder } -// Prefix gets the CID Prefix, may be nil if unset -func (ds *Shard) Prefix() cid.Builder { - return ds.prefix +// CidBuilder gets the CID Builder, may be nil if unset +func (ds *Shard) CidBuilder() cid.Builder { + return ds.builder } // Node serializes the HAMT structure into a merkledag node with unixfs formatting func (ds *Shard) Node() (ipld.Node, error) { out := new(dag.ProtoNode) - out.SetCidBuilder(ds.prefix) + out.SetCidBuilder(ds.builder) cindex := 0 // TODO: optimized 'for each set bit' @@ -494,7 +494,7 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val if err != nil { return err } - ns.prefix = ds.prefix + ns.builder = ds.builder chhv := &hashBits{ b: hash([]byte(child.key)), consumed: hv.consumed, diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 1331ddbfaa..4c897fd482 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -19,14 +19,14 @@ import ( // DagBuilderHelper wraps together a bunch of objects needed to // efficiently create unixfs dag trees type DagBuilderHelper struct { - dserv ipld.DAGService - spl chunker.Splitter - recvdErr error - rawLeaves bool - nextData []byte // the next item to return. - maxlinks int - batch *ipld.Batch - prefix cid.Builder + dserv ipld.DAGService + spl chunker.Splitter + recvdErr error + rawLeaves bool + nextData []byte // the next item to return. + maxlinks int + batch *ipld.Batch + cidBuilder cid.Builder // Filestore support variables. // ---------------------------- @@ -53,8 +53,8 @@ type DagBuilderParams struct { // instead of using the unixfs TRaw type RawLeaves bool - // CID Prefix to use if set - Prefix cid.Builder + // CID Builder to use if set + CidBuilder cid.Builder // DAGService to write blocks to (required) Dagserv ipld.DAGService @@ -73,12 +73,12 @@ type DagBuilderParams struct { // chunker.Splitter as data source. func (dbp *DagBuilderParams) New(spl chunker.Splitter) *DagBuilderHelper { db := &DagBuilderHelper{ - dserv: dbp.Dagserv, - spl: spl, - rawLeaves: dbp.RawLeaves, - prefix: dbp.Prefix, - maxlinks: dbp.Maxlinks, - batch: ipld.NewBatch(context.TODO(), dbp.Dagserv), + dserv: dbp.Dagserv, + spl: spl, + rawLeaves: dbp.RawLeaves, + cidBuilder: dbp.CidBuilder, + maxlinks: dbp.Maxlinks, + batch: ipld.NewBatch(context.TODO(), dbp.Dagserv), } if fi, ok := spl.Reader().(files.FileInfo); dbp.NoCopy && ok { db.fullPath = fi.AbsPath() @@ -141,13 +141,13 @@ func (db *DagBuilderHelper) NewUnixfsNode() *UnixfsNode { node: new(dag.ProtoNode), ufmt: ft.NewFSNode(ft.TFile), } - n.SetPrefix(db.prefix) + n.SetCidBuilder(db.cidBuilder) return n } -// GetPrefix returns the internal `cid.Prefix` set in the builder. -func (db *DagBuilderHelper) GetPrefix() cid.Builder { - return db.prefix +// GetCidBuilder returns the internal `cid.CidBuilder` set in the builder. +func (db *DagBuilderHelper) GetCidBuilder() cid.Builder { + return db.cidBuilder } // NewLeaf creates a leaf node filled with data. If rawLeaves is @@ -160,13 +160,13 @@ func (db *DagBuilderHelper) NewLeaf(data []byte) (*UnixfsNode, error) { } if db.rawLeaves { - if db.prefix == nil { + if db.cidBuilder == nil { return &UnixfsNode{ rawnode: dag.NewRawNode(data), raw: true, }, nil } - rawnode, err := dag.NewRawNodeWPrefix(data, db.prefix) + rawnode, err := dag.NewRawNodeWPrefix(data, db.cidBuilder) if err != nil { return nil, err } @@ -194,10 +194,10 @@ func (db *DagBuilderHelper) NewLeafNode(data []byte) (ipld.Node, error) { if db.rawLeaves { // Encapsulate the data in a raw node. - if db.prefix == nil { + if db.cidBuilder == nil { return dag.NewRawNode(data), nil } - rawnode, err := dag.NewRawNodeWPrefix(data, db.prefix) + rawnode, err := dag.NewRawNodeWPrefix(data, db.cidBuilder) if err != nil { return nil, err } @@ -229,7 +229,7 @@ func (db *DagBuilderHelper) newUnixfsBlock() *UnixfsNode { node: new(dag.ProtoNode), ufmt: ft.NewFSNode(ft.TRaw), } - n.SetPrefix(db.prefix) + n.SetCidBuilder(db.cidBuilder) return n } @@ -401,7 +401,7 @@ type FSNodeOverDag struct { func (db *DagBuilderHelper) NewFSNodeOverDag(fsNodeType pb.Data_DataType) *FSNodeOverDag { node := new(FSNodeOverDag) node.dag = new(dag.ProtoNode) - node.dag.SetCidBuilder(db.GetPrefix()) + node.dag.SetCidBuilder(db.GetCidBuilder()) node.file = ft.NewFSNode(fsNodeType) diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index c8aca63d15..a2e443ea34 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -60,9 +60,9 @@ func NewUnixfsNodeFromDag(nd *dag.ProtoNode) (*UnixfsNode, error) { }, nil } -// SetPrefix sets the CID Prefix -func (n *UnixfsNode) SetPrefix(prefix cid.Builder) { - n.node.SetCidBuilder(prefix) +// SetCidBuilder sets the CID Builder +func (n *UnixfsNode) SetCidBuilder(builder cid.Builder) { + n.node.SetCidBuilder(builder) } // NumChildren returns the number of children referenced by this UnixfsNode. diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 64960531f5..aa1ec8de7b 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -29,8 +29,8 @@ var DefaultShardWidth = 256 // (which is the main consumer of this interface). type Directory interface { - // SetPrefix sets the CID prefix of the root node. - SetPrefix(cid.Builder) + // SetCidBuilder sets the CID Builder of the root node. + SetCidBuilder(cid.Builder) // AddChild adds a (name, key) pair to the root node. AddChild(context.Context, string, ipld.Node) error @@ -51,8 +51,8 @@ type Directory interface { // GetNode returns the root of this directory. GetNode() (ipld.Node, error) - // GetPrefix returns the CID Prefix used. - GetPrefix() cid.Builder + // GetCidBuilder returns the CID Builder used. + GetCidBuilder() cid.Builder } // TODO: Evaluate removing `dserv` from this layer and providing it in MFS. @@ -127,9 +127,9 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err return nil, ErrNotADir } -// SetPrefix implements the `Directory` interface. -func (d *BasicDirectory) SetPrefix(prefix cid.Builder) { - d.node.SetCidBuilder(prefix) +// SetCidBuilder implements the `Directory` interface. +func (d *BasicDirectory) SetCidBuilder(builder cid.Builder) { + d.node.SetCidBuilder(builder) } // AddChild implements the `Directory` interface. It adds (or replaces) @@ -179,8 +179,8 @@ func (d *BasicDirectory) GetNode() (ipld.Node, error) { return d.node, nil } -// GetPrefix implements the `Directory` interface. -func (d *BasicDirectory) GetPrefix() cid.Builder { +// GetCidBuilder implements the `Directory` interface. +func (d *BasicDirectory) GetCidBuilder() cid.Builder { return d.node.CidBuilder() } @@ -193,7 +193,7 @@ func (d *BasicDirectory) SwitchToSharding(ctx context.Context) (Directory, error if err != nil { return nil, err } - shard.SetPrefix(d.node.CidBuilder()) + shard.SetCidBuilder(d.node.CidBuilder()) hamtDir.shard = shard for _, lnk := range d.node.Links() { @@ -211,9 +211,9 @@ func (d *BasicDirectory) SwitchToSharding(ctx context.Context) (Directory, error return hamtDir, nil } -// SetPrefix implements the `Directory` interface. -func (d *HAMTDirectory) SetPrefix(prefix cid.Builder) { - d.shard.SetPrefix(prefix) +// SetCidBuilder implements the `Directory` interface. +func (d *HAMTDirectory) SetCidBuilder(builder cid.Builder) { + d.shard.SetCidBuilder(builder) } // AddChild implements the `Directory` interface. @@ -251,7 +251,7 @@ func (d *HAMTDirectory) GetNode() (ipld.Node, error) { return d.shard.Node() } -// GetPrefix implements the `Directory` interface. -func (d *HAMTDirectory) GetPrefix() cid.Builder { - return d.shard.Prefix() +// GetCidBuilder implements the `Directory` interface. +func (d *HAMTDirectory) GetCidBuilder() cid.Builder { + return d.shard.CidBuilder() } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 509b3cc81f..f6e5f48200 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -345,10 +345,10 @@ func (dm *DagModifier) appendData(nd ipld.Node, spl chunker.Splitter) (ipld.Node switch nd := nd.(type) { case *mdag.ProtoNode, *mdag.RawNode: dbp := &help.DagBuilderParams{ - Dagserv: dm.dagserv, - Maxlinks: help.DefaultLinksPerBlock, - Prefix: &dm.Prefix, - RawLeaves: dm.RawLeaves, + Dagserv: dm.dagserv, + Maxlinks: help.DefaultLinksPerBlock, + CidBuilder: dm.Prefix, + RawLeaves: dm.RawLeaves, } return trickle.Append(dm.ctx, nd, dbp.New(spl)) default: diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index cc8fe4dd00..fdd307c565 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -61,10 +61,10 @@ func GetNode(t testing.TB, dserv ipld.DAGService, data []byte, opts NodeOpts) ip in := bytes.NewReader(data) dbp := h.DagBuilderParams{ - Dagserv: dserv, - Maxlinks: h.DefaultLinksPerBlock, - Prefix: &opts.Prefix, - RawLeaves: opts.RawLeavesUsed, + Dagserv: dserv, + Maxlinks: h.DefaultLinksPerBlock, + CidBuilder: opts.Prefix, + RawLeaves: opts.RawLeavesUsed, } node, err := trickle.Layout(dbp.New(SizeSplitterGen(500)(in))) From 1750c87f90ea50ee435f24b3d16a263ce67da2ca Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 12 Aug 2018 19:15:07 -0400 Subject: [PATCH 2209/3147] Gx updates and fixes to use new cid.Builder interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@3c4ed3ae040c6f05c5510d4e93ce48a325f06550 --- mfs/dir.go | 22 +++++++++++----------- mfs/fd.go | 2 +- mfs/file.go | 10 +++++----- mfs/mfs_test.go | 24 ++++++++++++------------ mfs/ops.go | 8 ++++---- mfs/repub_test.go | 2 +- mfs/system.go | 8 ++++---- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 37d88620a3..eafff388dc 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,13 +9,13 @@ import ( "sync" "time" - dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" - uio "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/io" - ufspb "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/pb" + ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" + uio "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/io" + ufspb "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/pb" + dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) var ErrNotYetImplemented = errors.New("not yet implemented") @@ -64,13 +64,13 @@ func NewDirectory(ctx context.Context, name string, node ipld.Node, parent child } // GetPrefix gets the CID prefix of the root node -func (d *Directory) GetPrefix() *cid.Prefix { - return d.unixfsDir.GetPrefix() +func (d *Directory) GetPrefix() cid.Builder { + return d.unixfsDir.GetCidBuilder() } // SetPrefix sets the CID prefix -func (d *Directory) SetPrefix(prefix *cid.Prefix) { - d.unixfsDir.SetPrefix(prefix) +func (d *Directory) SetPrefix(prefix cid.Builder) { + d.unixfsDir.SetCidBuilder(prefix) } // closeChild updates the child by the given name to the dag node 'nd' @@ -307,7 +307,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { } ndir := ft.EmptyDirNode() - ndir.SetPrefix(d.GetPrefix()) + ndir.SetCidBuilder(d.GetPrefix()) err = d.dserv.Add(d.ctx, ndir) if err != nil { diff --git a/mfs/fd.go b/mfs/fd.go index 1298c618cd..114314adc0 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/mod" + mod "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index f577e11de9..f680a58c1e 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" - dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" - mod "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/mod" + ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" + mod "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/mod" + dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - chunker "gx/ipfs/Qmc3UwSvJkntxu2gKDPCqJEzmhqVeJtTbrVxJm6tsdmMF1/go-ipfs-chunker" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + chunker "gx/ipfs/Qme4ThG6LN6EMrMYyf2AMywAZaGbTYxQu4njfcSSkcisLi/go-ipfs-chunker" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index a8aa809812..3f94577c83 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,19 +14,19 @@ import ( "testing" "time" - "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" - importer "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/importer" - uio "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/io" - bserv "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" - + bserv "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" + "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" + importer "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/importer" + uio "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/io" + dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + + offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - bstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" - offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" - chunker "gx/ipfs/Qmc3UwSvJkntxu2gKDPCqJEzmhqVeJtTbrVxJm6tsdmMF1/go-ipfs-chunker" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + bstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + chunker "gx/ipfs/Qme4ThG6LN6EMrMYyf2AMywAZaGbTYxQu4njfcSSkcisLi/go-ipfs-chunker" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/mfs/ops.go b/mfs/ops.go index c2c2d0e547..4bed33ed03 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,10 +6,10 @@ import ( gopath "path" "strings" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) // Mv moves the file or directory at 'src' to 'dst' @@ -101,7 +101,7 @@ func PutNode(r *Root, path string, nd ipld.Node) error { type MkdirOpts struct { Mkparents bool Flush bool - Prefix *cid.Prefix + Prefix cid.Builder } // Mkdir creates a directory at 'path' under the directory 'd', creating diff --git a/mfs/repub_test.go b/mfs/repub_test.go index cb1e4437fe..106de1b2f7 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -6,7 +6,7 @@ import ( "time" ci "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil/ci" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index cbeac035ef..c8792a3bec 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,12 +16,12 @@ import ( "sync" "time" - dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" + ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" + dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) var ErrNotExist = errors.New("no such rootfs") From 2f477f93e968fcf885fd51f9a109ac184f650a51 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 12 Aug 2018 19:15:07 -0400 Subject: [PATCH 2210/3147] Gx updates and fixes to use new cid.Builder interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@7ea841164baf1b0a3d951332fabfd0b52b2c8d03 --- pinning/pinner/gc/gc.go | 14 +++++++------- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 10 +++++----- pinning/pinner/set.go | 6 +++--- pinning/pinner/set_test.go | 10 +++++----- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index a785d07763..ba031f90bf 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,15 +8,15 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - bserv "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" + bserv "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" + dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" - "gx/ipfs/QmQwgv79RHrRnoXmhnpC1BPtY55HHeneGMpPwmmBU1fUAG/go-verifcid" - bstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" + offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + "gx/ipfs/QmV1pEFHk8ijeessqG52SjHuxuehahbeHrxXk4QEkgfPHj/go-verifcid" + bstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index e60c80eee5..28401ea8d1 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,11 +10,11 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + mdag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index dfb6b75eb3..96110530ef 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,13 +5,13 @@ import ( "testing" "time" - mdag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - bs "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" + bs "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" + mdag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" - offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index d3b57e818b..6a293d60b9 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 3b095c4cc8..8911f9f3ca 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,12 +5,12 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" - bserv "gx/ipfs/QmeZMtdkNG7u2CohGSL8mzAdZY2c3B1coYE91wvbzip1pF/go-blockservice" + bserv "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" + dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" - blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" - offline "gx/ipfs/QmWURzU3XRY4wYBsu2LHukKKHp5skkYB1K357nzpbEvRY4/go-ipfs-exchange-offline" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From d4d147327462b157f9ec3854038363e196cc1bc1 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 12 Aug 2018 19:15:07 -0400 Subject: [PATCH 2211/3147] Gx updates and fixes to use new cid.Builder interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@7dc90915bc611f90e1ade9ef64640bc3ec0b6402 --- filestore/filestore.go | 8 ++++---- filestore/filestore_test.go | 8 ++++---- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 29e966491f..a571e7eec3 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,11 +11,11 @@ import ( "context" "errors" - blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" + blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + blocks "gx/ipfs/QmZXvzTJTiN6p469osBUtEwm4WwhXXoWcHC8aTS1cAJkjy/go-block-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 77ed25a4aa..5df2496ec5 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,11 +7,11 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmXkZeJmx4c3ddjw81DQMUpM1e5LjAack5idzZYWUb2qAJ/go-merkledag" + dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" - blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" - posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" + blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 67d657a8c0..5866d82869 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,12 +10,12 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" - posinfo "gx/ipfs/QmSHjPDw8yNgLZ7cBfX7w3Smn7PHwYhNEpd4LHQQxUg35L/go-ipfs-posinfo" - blocks "gx/ipfs/QmVzK524a2VWLqyvtBeiHKsUAWYgeAk4DBeZoY7vpNPNRx/go-block-format" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + dshelp "gx/ipfs/QmWf5idGZ55KWUUo2EKM3BTeunjSiSgWbo4bLpYafENBgp/go-ipfs-ds-help" + posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" + blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" proto "gx/ipfs/QmZHU2gx42NPTYXzw6pJkuX6xCE7bKECp6e8QcPdoLx8sx/protobuf/proto" - dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" + blocks "gx/ipfs/QmZXvzTJTiN6p469osBUtEwm4WwhXXoWcHC8aTS1cAJkjy/go-block-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" diff --git a/filestore/util.go b/filestore/util.go index 3eed174c5b..2529a6c3d1 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,9 +6,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - blockstore "gx/ipfs/QmRNFh4wm6FgTDrtsWmnvEP9NTuEa3Ykf72y1LXCyevbGW/go-ipfs-blockstore" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" + dshelp "gx/ipfs/QmWf5idGZ55KWUUo2EKM3BTeunjSiSgWbo4bLpYafENBgp/go-ipfs-ds-help" + blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" ) From d62606c1628b0835394ea936033895f9a128b3f4 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 12 Aug 2018 19:15:07 -0400 Subject: [PATCH 2212/3147] Gx updates and fixes to use new cid.Builder interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@467c63e7d5058ffb40a496e5def50a284701a828 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 10 +++++----- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 2 +- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 8 ++++---- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 96f10c80f1..46f2953c34 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 154c629c3a..f424de7f89 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 05e93c1ef0..fa9ad29b08 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 1e0c083ce8..0d771e7083 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 3b5194a23b..ca280ac567 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,21 +6,21 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" record "gx/ipfs/QmUTQSGgjs8CHm9yBcUHicpRs7C9abhyZiBwjzCUp1pNgX/go-libp2p-record" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" + mockrouting "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/mock" + offline "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/offline" pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" - mockrouting "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/mock" - offline "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/offline" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" - routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" - ropts "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing/options" + routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" + ropts "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing/options" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 216525ee3a..b523908361 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" @@ -14,7 +14,7 @@ import ( isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" + routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 3ab9bd49b0..9e6e7fd0f2 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,13 +7,13 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + offroute "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/offline" pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" - offroute "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/offline" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/proquint.go b/namesys/proquint.go index 7e571b42b0..d0a488636a 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index b50f54185b..04d57c19cf 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,8 +8,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" - ft "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" @@ -18,7 +18,7 @@ import ( proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dsquery "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" - routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" + routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 42cb859737..e40d9be5ee 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,11 +8,11 @@ import ( ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" + dshelp "gx/ipfs/QmWf5idGZ55KWUUo2EKM3BTeunjSiSgWbo4bLpYafENBgp/go-ipfs-ds-help" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" + mockrouting "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/mock" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - mockrouting "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/mock" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - dshelp "gx/ipfs/Qmd8UZEDddMaCnQ1G5eSrUhN3coX19V7SyXNQGWnAvUsnT/go-ipfs-ds-help" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 57be87ae94..1b221df11d 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index b51bbcdc84..82b60b36ae 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmUDzeFgYrRmHL2hUB6NZmqcBVQtUzETwmFRUc9onfSSHr/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 623f6213d1..906ecac04b 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - mockrouting "gx/ipfs/Qma19TdQ7W26jbfuPgdo9Zi4qtjks1zeXzX86mtEYWYCiw/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/mock" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" diff --git a/namesys/routing.go b/namesys/routing.go index 3a4711af46..5af625b8e6 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,17 +6,17 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + dht "gx/ipfs/QmSRMxYCadAPQrCT38qFttGvE77bXYZfkQK7vLAgzj8r9K/go-libp2p-kad-dht" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - dht "gx/ipfs/QmZAsayEQakfFbHyakgHRKHwBTWrwuSBTfaMyxJZUG97VC/go-libp2p-kad-dht" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - routing "gx/ipfs/QmewrvpGvgK9qkCtXsGNwXiQzyux4jcHNjoyVrGdsgtNK5/go-libp2p-routing" + routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" ) var log = logging.Logger("namesys") From d91c0d7ac499f29b5b49219df4c1fdbf2e222bcd Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 12 Aug 2018 19:15:07 -0400 Subject: [PATCH 2213/3147] Gx updates and fixes to use new cid.Builder interface. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/interface-go-ipfs-core@05f527a4ab81c36f8965de35bdb8352a92a61718 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/object.go | 4 ++-- coreiface/options/dag.go | 2 +- coreiface/path.go | 4 ++-- coreiface/unixfs.go | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 82a2ebf4e3..d7614f01de 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index 01d6112e74..77577d0fce 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" ) // DagOps groups operations that can be batched together diff --git a/coreiface/object.go b/coreiface/object.go index 3eb0ea9ef3..dc86f46c1c 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index 57465deee9..a43a144fc9 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) type DagPutSettings struct { diff --git a/coreiface/path.go b/coreiface/path.go index c51d316454..28e0f431c0 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,9 +1,9 @@ package iface import ( - ipfspath "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" + ipfspath "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" + cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 1ddc206744..0ec63d5163 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,7 +4,7 @@ import ( "context" "io" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" + ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" ) // UnixfsAPI is the basic interface to immutable files in IPFS From 3bac30d60d41143a515fcac2711143200cb0d994 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Sun, 12 Aug 2018 20:49:49 -0400 Subject: [PATCH 2214/3147] Rename prefix to CidBuilder in names when a cid.Builder is used. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-mfs@81cd16a2854aef3b830924e1d2e19ff7fc1991f9 --- mfs/dir.go | 12 ++++++------ mfs/ops.go | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index eafff388dc..ea5e9c8476 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -63,14 +63,14 @@ func NewDirectory(ctx context.Context, name string, node ipld.Node, parent child }, nil } -// GetPrefix gets the CID prefix of the root node -func (d *Directory) GetPrefix() cid.Builder { +// GetCidBuilder gets the CID builder of the root node +func (d *Directory) GetCidBuilder() cid.Builder { return d.unixfsDir.GetCidBuilder() } -// SetPrefix sets the CID prefix -func (d *Directory) SetPrefix(prefix cid.Builder) { - d.unixfsDir.SetCidBuilder(prefix) +// SetCidBuilder sets the CID builder +func (d *Directory) SetCidBuilder(b cid.Builder) { + d.unixfsDir.SetCidBuilder(b) } // closeChild updates the child by the given name to the dag node 'nd' @@ -307,7 +307,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { } ndir := ft.EmptyDirNode() - ndir.SetCidBuilder(d.GetPrefix()) + ndir.SetCidBuilder(d.GetCidBuilder()) err = d.dserv.Add(d.ctx, ndir) if err != nil { diff --git a/mfs/ops.go b/mfs/ops.go index 4bed33ed03..8b14abc8d1 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -99,9 +99,9 @@ func PutNode(r *Root, path string, nd ipld.Node) error { // MkdirOpts is used by Mkdir type MkdirOpts struct { - Mkparents bool - Flush bool - Prefix cid.Builder + Mkparents bool + Flush bool + CidBuilder cid.Builder } // Mkdir creates a directory at 'path' under the directory 'd', creating @@ -136,8 +136,8 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error { if err != nil { return err } - if opts.Prefix != nil { - mkd.SetPrefix(opts.Prefix) + if opts.CidBuilder != nil { + mkd.SetCidBuilder(opts.CidBuilder) } fsn = mkd } else if err != nil { @@ -157,8 +157,8 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error { return err } } - if opts.Prefix != nil { - final.SetPrefix(opts.Prefix) + if opts.CidBuilder != nil { + final.SetCidBuilder(opts.CidBuilder) } if opts.Flush { From a3a153ab6a86b463168faf8818082c81a8f9132a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Aug 2018 14:05:49 -0700 Subject: [PATCH 2215/3147] use the new datastore interface This commit was moved from ipfs/go-ipfs-routing@6488c6d5d70030b7baee95428efd155d896b1229 --- routing/offline/offline.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 1be28bcf40..ebc96ef203 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -71,17 +71,13 @@ func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ } func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Option) ([]byte, error) { - v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) + buf, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err } - byt, ok := v.([]byte) - if !ok { - return nil, errors.New("value stored in datastore not []byte") - } rec := new(pb.Record) - err = proto.Unmarshal(byt, rec) + err = proto.Unmarshal(buf, rec) if err != nil { return nil, err } From 3eb2bddf2378fdcae037fea39276596780e1f5a7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Aug 2018 14:10:21 -0700 Subject: [PATCH 2216/3147] update to the new datastore interface This commit was moved from ipfs/go-ipfs-blockstore@bae26a9594c68b7c7de558fe0ac51e51b9ed8c6d --- blockstore/blockstore.go | 17 ++--------------- blockstore/blockstore_test.go | 20 ++------------------ blockstore/bloom_cache_test.go | 4 ++-- 3 files changed, 6 insertions(+), 35 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index c4475da9aa..f5cbc4c0f3 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -22,10 +22,6 @@ var log = logging.Logger("blockstore") // BlockPrefix namespaces blockstore datastores var BlockPrefix = ds.NewKey("blocks") -// ErrValueTypeMismatch is an error returned when the item retrieved from -// the datatstore is not a block. -var ErrValueTypeMismatch = errors.New("the retrieved value is not a Block") - // ErrHashMismatch is an error returned when the hash of a block // is different than expected. var ErrHashMismatch = errors.New("block in storage has different hash than requested") @@ -124,18 +120,13 @@ func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { return nil, ErrNotFound } - maybeData, err := bs.datastore.Get(dshelp.CidToDsKey(k)) + bdata, err := bs.datastore.Get(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { return nil, ErrNotFound } if err != nil { return nil, err } - bdata, ok := maybeData.([]byte) - if !ok { - return nil, ErrValueTypeMismatch - } - if bs.rehash { rbcid, err := k.Prefix().Sum(bdata) if err != nil { @@ -187,17 +178,13 @@ func (bs *blockstore) Has(k *cid.Cid) (bool, error) { } func (bs *blockstore) GetSize(k *cid.Cid) (int, error) { - maybeData, err := bs.datastore.Get(dshelp.CidToDsKey(k)) + bdata, err := bs.datastore.Get(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { return -1, ErrNotFound } if err != nil { return -1, err } - bdata, ok := maybeData.([]byte) - if !ok { - return -1, ErrValueTypeMismatch - } return len(bdata), nil } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 2fc1c94529..ae71b541ae 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -11,7 +11,6 @@ import ( ds "github.com/ipfs/go-datastore" dsq "github.com/ipfs/go-datastore/query" ds_sync "github.com/ipfs/go-datastore/sync" - dshelp "github.com/ipfs/go-ipfs-ds-help" u "github.com/ipfs/go-ipfs-util" ) @@ -218,21 +217,6 @@ func TestAllKeysRespectsContext(t *testing.T) { } -func TestErrValueTypeMismatch(t *testing.T) { - block := blocks.NewBlock([]byte("some data")) - - datastore := ds.NewMapDatastore() - k := BlockPrefix.Child(dshelp.CidToDsKey(block.Cid())) - datastore.Put(k, "data that isn't a block!") - - blockstore := NewBlockstore(ds_sync.MutexWrap(datastore)) - - _, err := blockstore.Get(block.Cid()) - if err != ErrValueTypeMismatch { - t.Fatal(err) - } -} - func expectMatches(t *testing.T, expect, actual []*cid.Cid) { if len(expect) != len(actual) { @@ -258,11 +242,11 @@ type queryTestDS struct { func (c *queryTestDS) SetFunc(f func(dsq.Query) (dsq.Results, error)) { c.cb = f } -func (c *queryTestDS) Put(key ds.Key, value interface{}) (err error) { +func (c *queryTestDS) Put(key ds.Key, value []byte) (err error) { return c.ds.Put(key, value) } -func (c *queryTestDS) Get(key ds.Key) (value interface{}, err error) { +func (c *queryTestDS) Get(key ds.Key) (value []byte, err error) { return c.ds.Get(key) } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 5fc831ec6c..514ae82cd6 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -170,12 +170,12 @@ func (c *callbackDatastore) CallF() { c.f() } -func (c *callbackDatastore) Put(key ds.Key, value interface{}) (err error) { +func (c *callbackDatastore) Put(key ds.Key, value []byte) (err error) { c.CallF() return c.ds.Put(key, value) } -func (c *callbackDatastore) Get(key ds.Key) (value interface{}, err error) { +func (c *callbackDatastore) Get(key ds.Key) (value []byte, err error) { c.CallF() return c.ds.Get(key) } From fba432804354fed60017ac0916f06eb7e3a96250 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Aug 2018 14:29:22 -0700 Subject: [PATCH 2217/3147] update go-datastore to use []byte values instead of {}interface values * Most of our datastores barf on non []byte values. * We have to have a bunch of "is this a []byte" checks. * Saves some allocations. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@737db43c5002726c676dc8a0285fb6db74a222a9 --- pinning/pinner/gc/gc.go | 10 +++++----- pinning/pinner/pin.go | 13 ++++--------- pinning/pinner/pin_test.go | 12 ++++++------ pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 12 ++++++------ 5 files changed, 22 insertions(+), 27 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ba031f90bf..03e156e031 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" - dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + bserv "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" + dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" - offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" "gx/ipfs/QmV1pEFHk8ijeessqG52SjHuxuehahbeHrxXk4QEkgfPHj/go-verifcid" - bstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + dstore "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - dstore "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + bstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 28401ea8d1..d2dea5767f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + mdag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) var log = logging.Logger("pin") @@ -440,16 +440,11 @@ func cidSetWithValues(cids []*cid.Cid) *cid.Set { func LoadPinner(d ds.Datastore, dserv, internal ipld.DAGService) (Pinner, error) { p := new(pinner) - rootKeyI, err := d.Get(pinDatastoreKey) + rootKey, err := d.Get(pinDatastoreKey) if err != nil { return nil, fmt.Errorf("cannot load pin state: %v", err) } - rootKeyBytes, ok := rootKeyI.([]byte) - if !ok { - return nil, fmt.Errorf("cannot load pin state: %s was not bytes", pinDatastoreKey) - } - - rootCid, err := cid.Cast(rootKeyBytes) + rootCid, err := cid.Cast(rootKey) if err != nil { return nil, err } diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 96110530ef..7d3a87e3e5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - bs "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" - mdag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + bs "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" + mdag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" - offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" + blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 6a293d60b9..83c940fc27 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 8911f9f3ca..6b80d2d7d6 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" - dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + bserv "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" + dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" - offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" + blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" ) func ignoreCids(_ *cid.Cid) {} From 7c98289de98b37e52521cff6bbc238eb5a0e0d67 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Aug 2018 14:29:22 -0700 Subject: [PATCH 2218/3147] update go-datastore to use []byte values instead of {}interface values * Most of our datastores barf on non []byte values. * We have to have a bunch of "is this a []byte" checks. * Saves some allocations. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@e65a11245b87a543faa4ef9eff9ac9e556e93d28 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 19 +++++++------------ filestore/util.go | 8 ++++---- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index a571e7eec3..f48fa77dd6 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,11 +12,11 @@ import ( "errors" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" - blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" blocks "gx/ipfs/QmZXvzTJTiN6p469osBUtEwm4WwhXXoWcHC8aTS1cAJkjy/go-block-format" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" + blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 5df2496ec5..76f1dc359c 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" - blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" + blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 5866d82869..658ec0ceef 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,15 +10,15 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmWf5idGZ55KWUUo2EKM3BTeunjSiSgWbo4bLpYafENBgp/go-ipfs-ds-help" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dsns "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/namespace" + dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" - blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" proto "gx/ipfs/QmZHU2gx42NPTYXzw6pJkuX6xCE7bKECp6e8QcPdoLx8sx/protobuf/proto" blocks "gx/ipfs/QmZXvzTJTiN6p469osBUtEwm4WwhXXoWcHC8aTS1cAJkjy/go-block-format" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dsns "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/namespace" - dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" + blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + dshelp "gx/ipfs/Qmeuoyt6qXqqaPeuZJwExzQzFTLC6epTAz3wFUK6jGbJjP/go-ipfs-ds-help" ) // FilestorePrefix identifies the key prefix for FileManager blocks. @@ -155,12 +155,7 @@ func (f *FileManager) getDataObj(c *cid.Cid) (*pb.DataObj, error) { return unmarshalDataObj(o) } -func unmarshalDataObj(o interface{}) (*pb.DataObj, error) { - data, ok := o.([]byte) - if !ok { - return nil, fmt.Errorf("stored filestore dataobj was not a []byte") - } - +func unmarshalDataObj(data []byte) (*pb.DataObj, error) { var dobj pb.DataObj if err := proto.Unmarshal(data, &dobj); err != nil { return nil, err @@ -265,7 +260,7 @@ func (f *FileManager) Has(c *cid.Cid) (bool, error) { } type putter interface { - Put(ds.Key, interface{}) error + Put(ds.Key, []byte) error } // Put adds a new reference block to the FileManager. It does not check diff --git a/filestore/util.go b/filestore/util.go index 2529a6c3d1..051cdf5685 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmWf5idGZ55KWUUo2EKM3BTeunjSiSgWbo4bLpYafENBgp/go-ipfs-ds-help" - blockstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dsq "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" + blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + dshelp "gx/ipfs/Qmeuoyt6qXqqaPeuZJwExzQzFTLC6epTAz3wFUK6jGbJjP/go-ipfs-ds-help" ) // Status is used to identify the state of the block data referenced From 88487701db3d228e830b0b673967f411c55b01eb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Aug 2018 14:29:22 -0700 Subject: [PATCH 2219/3147] update go-datastore to use []byte values instead of {}interface values * Most of our datastores barf on non []byte values. * We have to have a bunch of "is this a []byte" checks. * Saves some allocations. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@d7f784454a891c5347e5f7c0bf311e049d896798 --- mfs/dir.go | 8 ++++---- mfs/fd.go | 2 +- mfs/file.go | 6 +++--- mfs/mfs_test.go | 22 +++++++++++----------- mfs/ops.go | 2 +- mfs/system.go | 4 ++-- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index ea5e9c8476..0b304f8cbc 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,10 +9,10 @@ import ( "sync" "time" - ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" - uio "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/io" - ufspb "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/pb" - dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" + uio "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/io" + ufspb "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/pb" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" diff --git a/mfs/fd.go b/mfs/fd.go index 114314adc0..cfb233ed6f 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/mod" + mod "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index f680a58c1e..e851f7c6ce 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,9 +5,9 @@ import ( "fmt" "sync" - ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" - mod "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/mod" - dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" + mod "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/mod" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" chunker "gx/ipfs/Qme4ThG6LN6EMrMYyf2AMywAZaGbTYxQu4njfcSSkcisLi/go-ipfs-chunker" diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 3f94577c83..1cd1e1da1c 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,21 +14,21 @@ import ( "testing" "time" - bserv "gx/ipfs/QmSQDddUJRZCBEcEKp3icdiRUrVofvMSWmGyMXSysqjNCL/go-blockservice" - "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" - ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" - importer "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/importer" - uio "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs/io" - dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" - - offline "gx/ipfs/QmNxamk8jB6saNF5G37Tiipf2JEnxt7qvesbngPMe24wMS/go-ipfs-exchange-offline" + bserv "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" + "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" + importer "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/importer" + uio "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/io" + u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - bstore "gx/ipfs/QmYir8arYJK1RMzDBZU1dqscLorWvthWU8aStL4xhxdYeT/go-ipfs-blockstore" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" chunker "gx/ipfs/Qme4ThG6LN6EMrMYyf2AMywAZaGbTYxQu4njfcSSkcisLi/go-ipfs-chunker" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" + bstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index 8b14abc8d1..dbb8b1e447 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,7 +6,7 @@ import ( gopath "path" "strings" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" diff --git a/mfs/system.go b/mfs/system.go index c8792a3bec..69a863b69f 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,8 +16,8 @@ import ( "sync" "time" - ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" - dag "gx/ipfs/QmXhrNaxjxNLwAHnWQScc6GxvpJMyn8wfdRmGDbUQwpfth/go-merkledag" + dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" From cf393a59a74c806621cc10ccef216eb1e22c3d74 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Aug 2018 14:29:22 -0700 Subject: [PATCH 2220/3147] update go-datastore to use []byte values instead of {}interface values * Most of our datastores barf on non []byte values. * We have to have a bunch of "is this a []byte" checks. * Saves some allocations. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@754c3c5432a4ae8dfaf59410bc01dcdd947ab7f2 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 10 +++++----- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 10 +++++----- namesys/proquint.go | 2 +- namesys/publisher.go | 24 ++++++------------------ namesys/publisher_test.go | 8 ++++---- namesys/republisher/repub.go | 8 +++----- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 8 ++++---- namesys/routing.go | 4 ++-- 14 files changed, 37 insertions(+), 51 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 46f2953c34..ebab2ecb1a 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index f424de7f89..286801f76c 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index fa9ad29b08..7cf0ecbdc0 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 0d771e7083..e81e516210 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index ca280ac567..127e76fc31 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,19 +6,19 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" record "gx/ipfs/QmUTQSGgjs8CHm9yBcUHicpRs7C9abhyZiBwjzCUp1pNgX/go-libp2p-record" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - mockrouting "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/mock" - offline "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/offline" pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" + mockrouting "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/mock" + offline "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/offline" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" ropts "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing/options" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index b523908361..9d267e6c02 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,14 +6,14 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 9e6e7fd0f2..7eff60a508 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,16 +7,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" - "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - offroute "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/offline" pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" + offroute "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/offline" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index d0a488636a..7ab74be357 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 04d57c19cf..0299614b60 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -2,22 +2,21 @@ package namesys import ( "context" - "fmt" "strings" "sync" "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" - ft "gx/ipfs/QmTbas51oodp3ZJrqsWYs1yqSxcD7LEJBv4djRV2VrY8wv/go-unixfs" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dsquery "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dsquery "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/query" routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) @@ -80,13 +79,8 @@ func (p *IpnsPublisher) ListPublished(ctx context.Context) (map[peer.ID]*pb.Ipns if result.Error != nil { return nil, result.Error } - value, ok := result.Value.([]byte) - if !ok { - log.Error("found ipns record that we couldn't convert to a value") - continue - } e := new(pb.IpnsEntry) - if err := proto.Unmarshal(value, e); err != nil { + if err := proto.Unmarshal(result.Value, e); err != nil { // Might as well return what we can. log.Error("found an invalid IPNS entry:", err) continue @@ -117,15 +111,9 @@ func (p *IpnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouti ctx, cancel := context.WithTimeout(ctx, time.Second*30) defer cancel() - dsVal, err := p.ds.Get(IpnsDsKey(id)) - var value []byte + value, err := p.ds.Get(IpnsDsKey(id)) switch err { case nil: - var ok bool - value, ok = dsVal.([]byte) - if !ok { - return nil, fmt.Errorf("found ipns record that we couldn't convert to a value") - } case ds.ErrNotFound: if !checkRouting { return nil, nil diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index e40d9be5ee..2e6b9b4486 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -7,14 +7,14 @@ import ( "time" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - dshelp "gx/ipfs/QmWf5idGZ55KWUUo2EKM3BTeunjSiSgWbo4bLpYafENBgp/go-ipfs-ds-help" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - mockrouting "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/mock" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" + dshelp "gx/ipfs/Qmeuoyt6qXqqaPeuZJwExzQzFTLC6epTAz3wFUK6jGbJjP/go-ipfs-ds-help" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 1b221df11d..b9851875b7 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,16 +7,16 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" ) var errNoEntry = errors.New("no previous entry") @@ -141,7 +141,7 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro func (rp *Republisher) getLastVal(id peer.ID) (path.Path, error) { // Look for it locally only - vali, err := rp.ds.Get(namesys.IpnsDsKey(id)) + val, err := rp.ds.Get(namesys.IpnsDsKey(id)) switch err { case nil: case ds.ErrNotFound: @@ -150,8 +150,6 @@ func (rp *Republisher) getLastVal(id peer.ID) (path.Path, error) { return "", err } - val := vali.([]byte) - e := new(pb.IpnsEntry) if err := proto.Unmarshal(val, e); err != nil { return "", err diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 82b60b36ae..1425f88489 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmUDzeFgYrRmHL2hUB6NZmqcBVQtUzETwmFRUc9onfSSHr/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 906ecac04b..26aa297863 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - mockrouting "gx/ipfs/QmYAC1wnzfs7LwgrNU5K5MK2rnisjF7kAxWrwzZTLNNjVe/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/mock" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - ds "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore" - dssync "gx/ipfs/QmeiCcJfDW1GJnWUArudsv5rQsihpi4oyddPhdqo3CfX6i/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 5af625b8e6..ea6cb16f8b 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,11 +6,11 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - dht "gx/ipfs/QmSRMxYCadAPQrCT38qFttGvE77bXYZfkQK7vLAgzj8r9K/go-libp2p-kad-dht" + dht "gx/ipfs/QmRcGfNWgt1tEbRosuQZ5DXkgG4UPSZGuE5ZiohEW47TFU/go-libp2p-kad-dht" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" From 454f0f425c406d96427b7e0a262a33081c308dbf Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Aug 2018 14:29:22 -0700 Subject: [PATCH 2221/3147] update go-datastore to use []byte values instead of {}interface values * Most of our datastores barf on non []byte values. * We have to have a bunch of "is this a []byte" checks. * Saves some allocations. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@bb2d55c26ae125a50a6250df13479d70a84e4073 --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 28e0f431c0..d2933ece58 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmTG5WFmAM4uAnqGskeAPijdpTmmNDLJNCQ71NqfdvC6hV/go-path" + ipfspath "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" ) From 0b65bd825890b06ebb4693026ead177a00b2b15d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 15 Aug 2018 08:30:22 -0700 Subject: [PATCH 2222/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@b5d2df24d80a657b3db1ef8528c41cc03815ee6e --- pinning/pinner/gc/gc.go | 14 +++++++------- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 10 +++++----- pinning/pinner/set.go | 6 +++--- pinning/pinner/set_test.go | 10 +++++----- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 03e156e031..456aca9ba1 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" - dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + bserv "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - "gx/ipfs/QmV1pEFHk8ijeessqG52SjHuxuehahbeHrxXk4QEkgfPHj/go-verifcid" dstore "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - bstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" + bstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + "gx/ipfs/QmfMirfpEKQFctVpBYTvETxxLoU5q4ZJWsAMrtwSSE2bkn/go-verifcid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d2dea5767f..effb0f10f8 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + mdag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 7d3a87e3e5..a715b79f81 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - bs "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" - mdag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + mdag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + bs "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 83c940fc27..19accabe62 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 6b80d2d7d6..62a8a9a254 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" - dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + bserv "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" - offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" ) func ignoreCids(_ *cid.Cid) {} From a99b0fd37147e4b3659ac696771af58a5d415550 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 15 Aug 2018 08:30:22 -0700 Subject: [PATCH 2223/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@788f9e916ad482e47405641dcd934c18d934e411 --- filestore/filestore.go | 8 ++++---- filestore/filestore_test.go | 8 ++++---- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index f48fa77dd6..4a1f66df68 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,12 +11,12 @@ import ( "context" "errors" + blocks "gx/ipfs/QmR54CzE4UcdFAZDehj6HFyy3eSHhVsJUpjfnhCmscuStS/go-block-format" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" - blocks "gx/ipfs/QmZXvzTJTiN6p469osBUtEwm4WwhXXoWcHC8aTS1cAJkjy/go-block-format" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + posinfo "gx/ipfs/QmdBpJ5VTfL79VwKDU93z7fyZJ3mm4UaBHrE73CWRw2Bjd/go-ipfs-posinfo" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 76f1dc359c..bb72786207 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" + dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + posinfo "gx/ipfs/QmdBpJ5VTfL79VwKDU93z7fyZJ3mm4UaBHrE73CWRw2Bjd/go-ipfs-posinfo" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 658ec0ceef..eb9c7d7e16 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,15 +10,15 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + blocks "gx/ipfs/QmR54CzE4UcdFAZDehj6HFyy3eSHhVsJUpjfnhCmscuStS/go-block-format" + dshelp "gx/ipfs/QmSLS8mMWsm54vdQuwgde9wBgLg5usVQY4i9r8kXhfje8g/go-ipfs-ds-help" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsns "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/namespace" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - posinfo "gx/ipfs/QmWjvVuzD3Dqf3VznGAXUs1VqpG4dd35ounVCnLam8v7Xt/go-ipfs-posinfo" + blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" proto "gx/ipfs/QmZHU2gx42NPTYXzw6pJkuX6xCE7bKECp6e8QcPdoLx8sx/protobuf/proto" - blocks "gx/ipfs/QmZXvzTJTiN6p469osBUtEwm4WwhXXoWcHC8aTS1cAJkjy/go-block-format" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" - dshelp "gx/ipfs/Qmeuoyt6qXqqaPeuZJwExzQzFTLC6epTAz3wFUK6jGbJjP/go-ipfs-ds-help" + posinfo "gx/ipfs/QmdBpJ5VTfL79VwKDU93z7fyZJ3mm4UaBHrE73CWRw2Bjd/go-ipfs-posinfo" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 051cdf5685..0cdbad8de8 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + dshelp "gx/ipfs/QmSLS8mMWsm54vdQuwgde9wBgLg5usVQY4i9r8kXhfje8g/go-ipfs-ds-help" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - blockstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" - dshelp "gx/ipfs/Qmeuoyt6qXqqaPeuZJwExzQzFTLC6epTAz3wFUK6jGbJjP/go-ipfs-ds-help" + blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" ) // Status is used to identify the state of the block data referenced From cc621da776c69db472ebc1534b6741865d438e5c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 15 Aug 2018 08:30:22 -0700 Subject: [PATCH 2224/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-mfs@8de082c4fa06c42025d0b0b10f7f21bb35a4f25d --- mfs/dir.go | 12 ++++++------ mfs/fd.go | 2 +- mfs/file.go | 10 +++++----- mfs/mfs_test.go | 22 +++++++++++----------- mfs/ops.go | 6 +++--- mfs/repub_test.go | 2 +- mfs/system.go | 8 ++++---- 7 files changed, 31 insertions(+), 31 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 0b304f8cbc..50d3747c73 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,13 +9,13 @@ import ( "sync" "time" - dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" - ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" - uio "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/io" - ufspb "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/pb" + dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" + uio "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/io" + ufspb "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/pb" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/fd.go b/mfs/fd.go index cfb233ed6f..8b84000fd4 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/mod" + mod "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index e851f7c6ce..fec9c21256 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" - dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" - ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" - mod "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/mod" + dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" + mod "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/mod" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - chunker "gx/ipfs/Qme4ThG6LN6EMrMYyf2AMywAZaGbTYxQu4njfcSSkcisLi/go-ipfs-chunker" + chunker "gx/ipfs/QmWbCAB5f3LDumj4ncz1UCHSiyXrXxkMxZB6Wv35xi4P8z/go-ipfs-chunker" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 1cd1e1da1c..524732f2cc 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,21 +14,21 @@ import ( "testing" "time" - bserv "gx/ipfs/QmQrLuAVriwcPQpqn15GU7gjZGKKa45Hmdj9JCG3Cc45CC/go-blockservice" - "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" - dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" - ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" - importer "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/importer" - uio "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs/io" + dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + bserv "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" + "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" + importer "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/importer" + uio "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/io" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmTMhpt5sH5yup2RU5qeFDMZcDf4RaHqba4ztEp7yrzese/go-ipfs-exchange-offline" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" - chunker "gx/ipfs/Qme4ThG6LN6EMrMYyf2AMywAZaGbTYxQu4njfcSSkcisLi/go-ipfs-chunker" - bstore "gx/ipfs/QmeFZ47hGe5T8nSUjwd6zf6ikzFWYEzWsb1e4Q2r6n1w9z/go-ipfs-blockstore" + offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" + chunker "gx/ipfs/QmWbCAB5f3LDumj4ncz1UCHSiyXrXxkMxZB6Wv35xi4P8z/go-ipfs-chunker" + bstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index dbb8b1e447..c90071fb86 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,10 +6,10 @@ import ( gopath "path" "strings" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 106de1b2f7..123c20859b 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -6,7 +6,7 @@ import ( "time" ci "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil/ci" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 69a863b69f..2e7c400c94 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,12 +16,12 @@ import ( "sync" "time" - dag "gx/ipfs/QmYxX4VfVcxmfsj8U6T5kVtFvHsSidy9tmPyPTW5fy7H3q/go-merkledag" - ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" + dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) var ErrNotExist = errors.New("no such rootfs") From 1306564b6d6dafdc38235c925b3f0261ce77eb81 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 15 Aug 2018 08:30:22 -0700 Subject: [PATCH 2225/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@fb68517642db3052d32d30b3f5f784a6d2a5c77e --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 10 +++++----- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 2 +- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 8 ++++---- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index ebab2ecb1a..7ac2f9e06e 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 286801f76c..2d2e829b90 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 7cf0ecbdc0..5541f191ca 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index e81e516210..48333e7f24 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 127e76fc31..187daeefba 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,21 +6,21 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + mockrouting "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/mock" + offline "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/offline" + routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" + ropts "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing/options" record "gx/ipfs/QmUTQSGgjs8CHm9yBcUHicpRs7C9abhyZiBwjzCUp1pNgX/go-libp2p-record" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" - mockrouting "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/mock" - offline "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/offline" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" - ropts "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing/options" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 9d267e6c02..d733b8db3f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 7eff60a508..25c2bc72b3 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,15 +7,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" - "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + offroute "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/offline" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" - offroute "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/offline" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index 7ab74be357..eb8ae36211 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 0299614b60..4d3c7abd4a 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,17 +7,17 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" - ft "gx/ipfs/QmagwbbPqiN1oa3SDMZvpTFE5tNuegF1ULtuJvA9EVzsJv/go-unixfs" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsquery "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 2e6b9b4486..98f17b74f3 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -7,14 +7,14 @@ import ( "time" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + mockrouting "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/mock" + dshelp "gx/ipfs/QmSLS8mMWsm54vdQuwgde9wBgLg5usVQY4i9r8kXhfje8g/go-ipfs-ds-help" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - mockrouting "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/mock" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - dshelp "gx/ipfs/Qmeuoyt6qXqqaPeuZJwExzQzFTLC6epTAz3wFUK6jGbJjP/go-ipfs-ds-help" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index b9851875b7..4adbcb3085 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 1425f88489..1aa3d9f851 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmUDzeFgYrRmHL2hUB6NZmqcBVQtUzETwmFRUc9onfSSHr/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 26aa297863..27e3b5fcab 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,13 +6,13 @@ import ( "testing" "time" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + mockrouting "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/mock" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - mockrouting "gx/ipfs/QmYey7kzAAqmXXbr38qH4oGGkB5m5swJeJCQfHgt8nrDES/go-ipfs-routing/mock" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ) diff --git a/namesys/routing.go b/namesys/routing.go index ea6cb16f8b..5bdd67efd6 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,17 +6,17 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - dht "gx/ipfs/QmRcGfNWgt1tEbRosuQZ5DXkgG4UPSZGuE5ZiohEW47TFU/go-libp2p-kad-dht" + routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + dht "gx/ipfs/QmdP3wKxB6x6vJ57tDrewAJF2qv4ULejCZ6dspJRnk3993/go-libp2p-kad-dht" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - routing "gx/ipfs/QmfGeECX7CxJAFXwGKx2cn7csnxAtwJw8e3XtoNVf6bqcv/go-libp2p-routing" ) var log = logging.Logger("namesys") From aac8a89a8ac8584416db46bc1968cd3e185241db Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 15 Aug 2018 08:30:22 -0700 Subject: [PATCH 2226/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@9d5772a1cf4ffcf6d9c7717e074d30540d36f263 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/object.go | 4 ++-- coreiface/options/dag.go | 2 +- coreiface/path.go | 4 ++-- coreiface/unixfs.go | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index d7614f01de..ab53740697 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index 77577d0fce..d547e8531d 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) // DagOps groups operations that can be batched together diff --git a/coreiface/object.go b/coreiface/object.go index dc86f46c1c..812b69a647 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index a43a144fc9..e89e4d707b 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" ) type DagPutSettings struct { diff --git a/coreiface/path.go b/coreiface/path.go index d2933ece58..49cea48ccd 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,9 +1,9 @@ package iface import ( - ipfspath "gx/ipfs/QmV1W98rBAovVJGkeYHfqJ19JdT9dQbbWsCq9zPaMyrxYx/go-path" + ipfspath "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" - cid "gx/ipfs/Qmdu2AYUV7yMoVBQPxXNfe7FJcdx16kYtsx6jAPKWQYF1y/go-cid" + cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 0ec63d5163..b42f56ba83 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,7 +4,7 @@ import ( "context" "io" - ipld "gx/ipfs/QmUSyMZ8Vt4vTZr5HdDEgEfpwAXfQRuDdfCFTt7XBzhxpQ/go-ipld-format" + ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" ) // UnixfsAPI is the basic interface to immutable files in IPFS From 55671e1d5ad94123f55d3bab19e1b3596f166878 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 20:14:18 -0700 Subject: [PATCH 2227/3147] update protobuf files in go-ipfs Also: * Switch to gogo for filestore for consistency. * Use the "faster" codegen for fewer allocations. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@74d8b04cf8e1ccdcd9ba8949da5d58fd1b07e8cb --- pinning/pinner/internal/pb/header.pb.go | 356 ++++++++++++++++++++++-- pinning/pinner/set.go | 6 +- 2 files changed, 337 insertions(+), 25 deletions(-) diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go index 6a620c9e72..ca4173c3ea 100644 --- a/pinning/pinner/internal/pb/header.pb.go +++ b/pinning/pinner/internal/pb/header.pb.go @@ -1,59 +1,371 @@ -// Code generated by protoc-gen-gogo. -// source: header.proto -// DO NOT EDIT! +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: pin/internal/pb/header.proto -/* -Package pb is a generated protocol buffer package. - -It is generated from these files: - header.proto - -It has these top-level messages: - Set -*/ package pb import proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" +import fmt "fmt" import math "math" +import encoding_binary "encoding/binary" + +import io "io" + // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal +var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + type Set struct { // 1 for now, library will refuse to handle entries with an unrecognized version. - Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` + Version uint32 `protobuf:"varint,1,opt,name=version" json:"version"` // how many of the links are subtrees - Fanout *uint32 `protobuf:"varint,2,opt,name=fanout" json:"fanout,omitempty"` + Fanout uint32 `protobuf:"varint,2,opt,name=fanout" json:"fanout"` // hash seed for subtree selection, a random number - Seed *uint32 `protobuf:"fixed32,3,opt,name=seed" json:"seed,omitempty"` - XXX_unrecognized []byte `json:"-"` + Seed uint32 `protobuf:"fixed32,3,opt,name=seed" json:"seed"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Set) Reset() { *m = Set{} } func (m *Set) String() string { return proto.CompactTextString(m) } func (*Set) ProtoMessage() {} +func (*Set) Descriptor() ([]byte, []int) { + return fileDescriptor_header_778100e52d428560, []int{0} +} +func (m *Set) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Set) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Set.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Set) XXX_Merge(src proto.Message) { + xxx_messageInfo_Set.Merge(dst, src) +} +func (m *Set) XXX_Size() int { + return m.Size() +} +func (m *Set) XXX_DiscardUnknown() { + xxx_messageInfo_Set.DiscardUnknown(m) +} + +var xxx_messageInfo_Set proto.InternalMessageInfo func (m *Set) GetVersion() uint32 { - if m != nil && m.Version != nil { - return *m.Version + if m != nil { + return m.Version } return 0 } func (m *Set) GetFanout() uint32 { - if m != nil && m.Fanout != nil { - return *m.Fanout + if m != nil { + return m.Fanout } return 0 } func (m *Set) GetSeed() uint32 { - if m != nil && m.Seed != nil { - return *m.Seed + if m != nil { + return m.Seed } return 0 } func init() { + proto.RegisterType((*Set)(nil), "ipfs.pin.Set") +} +func (m *Set) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Set) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintHeader(dAtA, i, uint64(m.Version)) + dAtA[i] = 0x10 + i++ + i = encodeVarintHeader(dAtA, i, uint64(m.Fanout)) + dAtA[i] = 0x1d + i++ + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(m.Seed)) + i += 4 + return i, nil +} + +func encodeVarintHeader(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Set) Size() (n int) { + var l int + _ = l + n += 1 + sovHeader(uint64(m.Version)) + n += 1 + sovHeader(uint64(m.Fanout)) + n += 5 + return n +} + +func sovHeader(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozHeader(x uint64) (n int) { + return sovHeader(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Set) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowHeader + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Set: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Set: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowHeader + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Fanout", wireType) + } + m.Fanout = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowHeader + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Fanout |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 5 { + return fmt.Errorf("proto: wrong wireType = %d for field Seed", wireType) + } + m.Seed = 0 + if (iNdEx + 4) > l { + return io.ErrUnexpectedEOF + } + m.Seed = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + default: + iNdEx = preIndex + skippy, err := skipHeader(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthHeader + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipHeader(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowHeader + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowHeader + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowHeader + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthHeader + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowHeader + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipHeader(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthHeader = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowHeader = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("pin/internal/pb/header.proto", fileDescriptor_header_778100e52d428560) +} + +var fileDescriptor_header_778100e52d428560 = []byte{ + // 154 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x29, 0xc8, 0xcc, 0xd3, + 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0xcc, 0xd1, 0x2f, 0x48, 0xd2, 0xcf, 0x48, 0x4d, 0x4c, + 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xc8, 0x2c, 0x48, 0x2b, 0xd6, 0x2b, + 0xc8, 0xcc, 0x53, 0x8a, 0xe5, 0x62, 0x0e, 0x4e, 0x2d, 0x11, 0x92, 0xe3, 0x62, 0x2f, 0x4b, 0x2d, + 0x2a, 0xce, 0xcc, 0xcf, 0x93, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x75, 0x62, 0x39, 0x71, 0x4f, 0x9e, + 0x21, 0x08, 0x26, 0x28, 0x24, 0xc3, 0xc5, 0x96, 0x96, 0x98, 0x97, 0x5f, 0x5a, 0x22, 0xc1, 0x84, + 0x24, 0x0d, 0x15, 0x13, 0x92, 0xe0, 0x62, 0x29, 0x4e, 0x4d, 0x4d, 0x91, 0x60, 0x56, 0x60, 0xd4, + 0x60, 0x87, 0xca, 0x81, 0x45, 0x9c, 0x44, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, + 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0xa2, 0x98, 0x0a, 0x92, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xc3, 0xf9, 0x7f, 0x24, 0x9d, 0x00, 0x00, 0x00, } diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 19accabe62..a95978f98f 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -67,9 +67,9 @@ func storeItems(ctx context.Context, dag ipld.DAGService, estimatedLen uint64, d internalKeys(emptyKey) hdr := &pb.Set{ - Version: proto.Uint32(1), - Fanout: proto.Uint32(defaultFanout), - Seed: proto.Uint32(depth), + Version: 1, + Fanout: defaultFanout, + Seed: depth, } if err := writeHdr(n, hdr); err != nil { return nil, err From 4181a888e63f202af6fe8e139b5cc4b30067a090 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 Aug 2018 20:14:18 -0700 Subject: [PATCH 2228/3147] update protobuf files in go-ipfs Also: * Switch to gogo for filestore for consistency. * Use the "faster" codegen for fewer allocations. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@38adf1202dbbdd600bfd65b659fc6ce0e6325d71 --- filestore/fsrefstore.go | 10 +- filestore/pb/Makefile | 10 - filestore/pb/dataobj.pb.go | 369 ++++++++++++++++++++++++++++++++++--- filestore/pb/dataobj.proto | 2 + filestore/util.go | 12 +- 5 files changed, 360 insertions(+), 43 deletions(-) delete mode 100644 filestore/pb/Makefile diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index eb9c7d7e16..81b6875379 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -17,8 +17,8 @@ import ( dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - proto "gx/ipfs/QmZHU2gx42NPTYXzw6pJkuX6xCE7bKECp6e8QcPdoLx8sx/protobuf/proto" posinfo "gx/ipfs/QmdBpJ5VTfL79VwKDU93z7fyZJ3mm4UaBHrE73CWRw2Bjd/go-ipfs-posinfo" + proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) // FilestorePrefix identifies the key prefix for FileManager blocks. @@ -276,7 +276,7 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { if !f.AllowUrls { return ErrUrlstoreNotEnabled } - dobj.FilePath = proto.String(b.PosInfo.FullPath) + dobj.FilePath = b.PosInfo.FullPath } else { if !f.AllowFiles { return ErrFilestoreNotEnabled @@ -290,10 +290,10 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { return err } - dobj.FilePath = proto.String(filepath.ToSlash(p)) + dobj.FilePath = filepath.ToSlash(p) } - dobj.Offset = proto.Uint64(b.PosInfo.Offset) - dobj.Size_ = proto.Uint64(uint64(len(b.RawData()))) + dobj.Offset = b.PosInfo.Offset + dobj.Size_ = uint64(len(b.RawData())) data, err := proto.Marshal(&dobj) if err != nil { diff --git a/filestore/pb/Makefile b/filestore/pb/Makefile deleted file mode 100644 index 5101a482d2..0000000000 --- a/filestore/pb/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --gogo_out=. $< - -clean: - rm *.pb.go diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index 3ddf730810..6046acbd62 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -1,55 +1,83 @@ -// Code generated by protoc-gen-gogo. -// source: dataobj.proto -// DO NOT EDIT! +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: filestore/pb/dataobj.proto -/* -Package datastore_pb is a generated protocol buffer package. - -It is generated from these files: - dataobj.proto - -It has these top-level messages: - DataObj -*/ package datastore_pb import proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" import fmt "fmt" import math "math" +import io "io" + // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + type DataObj struct { - FilePath *string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath,omitempty"` - Offset *uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset,omitempty"` - Size_ *uint64 `protobuf:"varint,3,opt,name=Size" json:"Size,omitempty"` - XXX_unrecognized []byte `json:"-"` + FilePath string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath"` + Offset uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset"` + Size_ uint64 `protobuf:"varint,3,opt,name=Size" json:"Size"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *DataObj) Reset() { *m = DataObj{} } func (m *DataObj) String() string { return proto.CompactTextString(m) } func (*DataObj) ProtoMessage() {} +func (*DataObj) Descriptor() ([]byte, []int) { + return fileDescriptor_dataobj_216c555249812eeb, []int{0} +} +func (m *DataObj) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DataObj) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DataObj.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *DataObj) XXX_Merge(src proto.Message) { + xxx_messageInfo_DataObj.Merge(dst, src) +} +func (m *DataObj) XXX_Size() int { + return m.Size() +} +func (m *DataObj) XXX_DiscardUnknown() { + xxx_messageInfo_DataObj.DiscardUnknown(m) +} + +var xxx_messageInfo_DataObj proto.InternalMessageInfo func (m *DataObj) GetFilePath() string { - if m != nil && m.FilePath != nil { - return *m.FilePath + if m != nil { + return m.FilePath } return "" } func (m *DataObj) GetOffset() uint64 { - if m != nil && m.Offset != nil { - return *m.Offset + if m != nil { + return m.Offset } return 0 } func (m *DataObj) GetSize_() uint64 { - if m != nil && m.Size_ != nil { - return *m.Size_ + if m != nil { + return m.Size_ } return 0 } @@ -57,3 +85,300 @@ func (m *DataObj) GetSize_() uint64 { func init() { proto.RegisterType((*DataObj)(nil), "datastore.pb.DataObj") } +func (m *DataObj) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DataObj) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintDataobj(dAtA, i, uint64(len(m.FilePath))) + i += copy(dAtA[i:], m.FilePath) + dAtA[i] = 0x10 + i++ + i = encodeVarintDataobj(dAtA, i, uint64(m.Offset)) + dAtA[i] = 0x18 + i++ + i = encodeVarintDataobj(dAtA, i, uint64(m.Size_)) + return i, nil +} + +func encodeVarintDataobj(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *DataObj) Size() (n int) { + var l int + _ = l + l = len(m.FilePath) + n += 1 + l + sovDataobj(uint64(l)) + n += 1 + sovDataobj(uint64(m.Offset)) + n += 1 + sovDataobj(uint64(m.Size_)) + return n +} + +func sovDataobj(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozDataobj(x uint64) (n int) { + return sovDataobj(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *DataObj) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDataobj + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DataObj: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DataObj: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FilePath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDataobj + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDataobj + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FilePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Offset", wireType) + } + m.Offset = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDataobj + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Offset |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) + } + m.Size_ = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDataobj + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Size_ |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipDataobj(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthDataobj + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipDataobj(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDataobj + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDataobj + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDataobj + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthDataobj + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDataobj + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipDataobj(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthDataobj = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowDataobj = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("filestore/pb/dataobj.proto", fileDescriptor_dataobj_216c555249812eeb) } + +var fileDescriptor_dataobj_216c555249812eeb = []byte{ + // 151 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xcb, 0xcc, 0x49, + 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0xd5, 0x2f, 0x48, 0xd2, 0x4f, 0x49, 0x2c, 0x49, 0xcc, 0x4f, 0xca, + 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x01, 0x71, 0xc1, 0x72, 0x7a, 0x05, 0x49, 0x4a, + 0xc9, 0x5c, 0xec, 0x2e, 0x89, 0x25, 0x89, 0xfe, 0x49, 0x59, 0x42, 0x0a, 0x5c, 0x1c, 0x6e, 0x99, + 0x39, 0xa9, 0x01, 0x89, 0x25, 0x19, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x4e, 0x2c, 0x27, 0xee, + 0xc9, 0x33, 0x04, 0xc1, 0x45, 0x85, 0x64, 0xb8, 0xd8, 0xfc, 0xd3, 0xd2, 0x8a, 0x53, 0x4b, 0x24, + 0x98, 0x14, 0x18, 0x35, 0x58, 0xa0, 0xf2, 0x50, 0x31, 0x21, 0x09, 0x2e, 0x96, 0xe0, 0xcc, 0xaa, + 0x54, 0x09, 0x66, 0x24, 0x39, 0xb0, 0x88, 0x93, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, + 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0x03, 0x20, 0x00, 0x00, 0xff, 0xff, 0x8c, + 0xe7, 0x83, 0xa2, 0xa1, 0x00, 0x00, 0x00, +} diff --git a/filestore/pb/dataobj.proto b/filestore/pb/dataobj.proto index c7d7f0eea8..909d22b77f 100644 --- a/filestore/pb/dataobj.proto +++ b/filestore/pb/dataobj.proto @@ -1,3 +1,5 @@ +syntax = "proto2"; + package datastore.pb; message DataObj { diff --git a/filestore/util.go b/filestore/util.go index 0cdbad8de8..d0e25c8d44 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -212,9 +212,9 @@ func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { } // now reconstruct the DataObj dobj := pb.DataObj{ - FilePath: &v.filePath, - Offset: &v.offset, - Size_: &v.size, + FilePath: v.filePath, + Offset: v.offset, + Size_: v.size, } // now if we could not convert the datastore key return that // error @@ -277,8 +277,8 @@ func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { Status: status, ErrorMsg: errorMsg, Key: c, - FilePath: *d.FilePath, - Size: *d.Size_, - Offset: *d.Offset, + FilePath: d.FilePath, + Size: d.Size_, + Offset: d.Offset, } } From 1b26542344b174050f520426fc8ed5dca898f548 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 20 Aug 2018 15:18:20 +0200 Subject: [PATCH 2229/3147] Extract from go-ipfs. Add README, LICENSE, ci. This commit was moved from ipfs/go-mfs@c3b2cc4c04dab696bbaef7a2215b3444477039b6 --- mfs/LICENSE | 21 +++++++++++++++++++++ mfs/Makefile | 18 ++++++++++++++++++ mfs/README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 mfs/LICENSE create mode 100644 mfs/Makefile create mode 100644 mfs/README.md diff --git a/mfs/LICENSE b/mfs/LICENSE new file mode 100644 index 0000000000..e4224df5b7 --- /dev/null +++ b/mfs/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mfs/Makefile b/mfs/Makefile new file mode 100644 index 0000000000..73f2841f61 --- /dev/null +++ b/mfs/Makefile @@ -0,0 +1,18 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race -coverprofile=coverage.txt -covermode=atomic . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish + + diff --git a/mfs/README.md b/mfs/README.md new file mode 100644 index 0000000000..d8247a5b6e --- /dev/null +++ b/mfs/README.md @@ -0,0 +1,44 @@ +# go-mfs + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-mfs?status.svg)](https://godoc.org/github.com/ipfs/go-mfs) +[![Build Status](https://travis-ci.org/ipfs/go-mfs.svg?branch=master)](https://travis-ci.org/ipfs/go-mfs) + +> go-mfs implements an in-memory model of a mutable IPFS filesystem. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-mfs` works like a regular Go module: + +``` +> go get github.com/ipfs/go-mfs +``` + +It uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. + +## Usage + +``` +import "github.com/ipfs/go-mfs" +``` + +Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-mfs) + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs, Inc. From 09c10efc44df4d479ca787e522940e858225194d Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 20 Aug 2018 15:23:31 +0200 Subject: [PATCH 2230/3147] gx publish 0.0.1 This commit was moved from ipfs/go-mfs@9ee29333acb16626c0e69b85521b76f5bc5eb1a8 --- mfs/dir.go | 12 ++++++------ mfs/fd.go | 2 +- mfs/file.go | 10 +++++----- mfs/mfs_test.go | 30 +++++++++++++++--------------- mfs/ops.go | 6 +++--- mfs/repub_test.go | 4 ++-- mfs/system.go | 10 +++++----- 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 50d3747c73..676bf97d6c 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -9,13 +9,13 @@ import ( "sync" "time" - dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" - uio "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/io" - ufspb "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/pb" + dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" + uio "github.com/ipfs/go-unixfs/io" + ufspb "github.com/ipfs/go-unixfs/pb" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" ) var ErrNotYetImplemented = errors.New("not yet implemented") diff --git a/mfs/fd.go b/mfs/fd.go index 8b84000fd4..0f0d3d4269 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - mod "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/mod" + mod "github.com/ipfs/go-unixfs/mod" context "context" ) diff --git a/mfs/file.go b/mfs/file.go index fec9c21256..00c70ae4b9 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -5,12 +5,12 @@ import ( "fmt" "sync" - dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" - mod "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/mod" + dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" + mod "github.com/ipfs/go-unixfs/mod" - chunker "gx/ipfs/QmWbCAB5f3LDumj4ncz1UCHSiyXrXxkMxZB6Wv35xi4P8z/go-ipfs-chunker" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + chunker "github.com/ipfs/go-ipfs-chunker" + ipld "github.com/ipfs/go-ipld-format" ) type File struct { diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 524732f2cc..63c9bff630 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,21 +14,21 @@ import ( "testing" "time" - dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - bserv "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" - "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" - ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" - importer "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/importer" - uio "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs/io" - - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" - chunker "gx/ipfs/QmWbCAB5f3LDumj4ncz1UCHSiyXrXxkMxZB6Wv35xi4P8z/go-ipfs-chunker" - bstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + bserv "github.com/ipfs/go-blockservice" + dag "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-path" + ft "github.com/ipfs/go-unixfs" + importer "github.com/ipfs/go-unixfs/importer" + uio "github.com/ipfs/go-unixfs/io" + + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + bstore "github.com/ipfs/go-ipfs-blockstore" + chunker "github.com/ipfs/go-ipfs-chunker" + offline "github.com/ipfs/go-ipfs-exchange-offline" + u "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" ) func emptyDirNode() *dag.ProtoNode { diff --git a/mfs/ops.go b/mfs/ops.go index c90071fb86..656b8dff91 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -6,10 +6,10 @@ import ( gopath "path" "strings" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "github.com/ipfs/go-path" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" ) // Mv moves the file or directory at 'src' to 'dst' diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 123c20859b..cfc056a598 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - ci "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil/ci" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + cid "github.com/ipfs/go-cid" + ci "github.com/libp2p/go-testutil/ci" ) func TestRepublisher(t *testing.T) { diff --git a/mfs/system.go b/mfs/system.go index 2e7c400c94..bd799880e9 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -16,12 +16,12 @@ import ( "sync" "time" - dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" + dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" ) var ErrNotExist = errors.New("no such rootfs") From ea07441966a85162c95835a20b06a1825d9e51b9 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 21 Aug 2018 17:10:11 -0700 Subject: [PATCH 2231/3147] gx: update go-cid, go-libp2p-peer, go-ipfs-cmds, go-ipfs-cmdkit License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@77f5c2bef18eed346196081226b440f8d3f9f266 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 20 ++++++++++---------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 12 ++++++------ namesys/proquint.go | 2 +- namesys/publisher.go | 12 ++++++------ namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 14 +++++++------- 14 files changed, 53 insertions(+), 53 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 7ac2f9e06e..b88668dccb 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 2d2e829b90..3d7fc51e65 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 5541f191ca..d329875a14 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index 48333e7f24..f2a2c868bf 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 187daeefba..dd84308f2d 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,21 +6,21 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/mock" - offline "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/offline" - routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" - ropts "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing/options" - record "gx/ipfs/QmUTQSGgjs8CHm9yBcUHicpRs7C9abhyZiBwjzCUp1pNgX/go-libp2p-record" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" + routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" + ropts "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing/options" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + mockrouting "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/mock" + offline "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/offline" + record "gx/ipfs/QmdHb9aBELnQKTVhvvA3hsQbRgUAwsWUzBP2vZ6Y5FBYvE/go-libp2p-record" + pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index d733b8db3f..ac5faeaeb6 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 25c2bc72b3..f1cfa4d480 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,16 +7,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" - "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" + "gx/ipfs/QmQjEpRiwVvtowhq69dAtB4jhioPVFXiCcWZm9Sfgn7eqc/go-unixfs" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - offroute "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/offline" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + offroute "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/offline" + pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index eb8ae36211..d869ce01e6 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,8 +7,8 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 4d3c7abd4a..8a4c4002ac 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" - ft "gx/ipfs/QmWv8MYwgPK4zXYv1et1snWJ6FWGqaL6xY2y9X1bRSKBxk/go-unixfs" + ft "gx/ipfs/QmQjEpRiwVvtowhq69dAtB4jhioPVFXiCcWZm9Sfgn7eqc/go-unixfs" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" + pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsquery "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 98f17b74f3..5b33940f36 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" + ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/mock" - dshelp "gx/ipfs/QmSLS8mMWsm54vdQuwgde9wBgLg5usVQY4i9r8kXhfje8g/go-ipfs-ds-help" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + dshelp "gx/ipfs/Qmd39D2vUhmPKQA2fgykjo2JXwekHKeJUggmGRpYuVMA2Z/go-ipfs-ds-help" + mockrouting "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/mock" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4adbcb3085..90fab3f23a 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 1aa3d9f851..387db7f90c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + mocknet "gx/ipfs/QmQiaskfWpdRJ4x2spEQjPFTUkEB87KDYu91qnNYBqvvcX/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmUDzeFgYrRmHL2hUB6NZmqcBVQtUzETwmFRUc9onfSSHr/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmYLXCWN2myozZpx8Wx4UjrRuQuhY3YtWoMi6SHaXii6aM/go-libp2p-peerstore" + pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 27e3b5fcab..b2a4e23ac8 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" - mockrouting "gx/ipfs/QmRr8DpNhQMzsoqAitUrw43D82pyPXZkyUqarhSAfkrdaQ/go-ipfs-routing/mock" + ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - testutil "gx/ipfs/QmXG74iiKQnDstVQq9fPFQEB6JTNSWBbAWE1qsq6L4E5sR/go-testutil" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + mockrouting "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/mock" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 5bdd67efd6..c533daada2 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,16 +6,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" + pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - routing "gx/ipfs/QmSD6bSPcXaaR7LpQHjytLWQD7DrCsb415CWfpbd9Szemb/go-libp2p-routing" - ipns "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns" - pb "gx/ipfs/QmVHij7PuWUFeLcmRbD1ykDwB1WZMYP8yixo9bprUb3QHG/go-ipns/pb" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - peer "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" - dht "gx/ipfs/QmdP3wKxB6x6vJ57tDrewAJF2qv4ULejCZ6dspJRnk3993/go-libp2p-kad-dht" + routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" + dht "gx/ipfs/QmTRj8mj6X5LtjVochPPSNX6MTbJ6iVojcfakWJKG13re7/go-libp2p-kad-dht" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From 66c959b336ec55e8b2f9fbb8bd17f0922fdc0473 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 21 Aug 2018 17:10:11 -0700 Subject: [PATCH 2232/3147] gx: update go-cid, go-libp2p-peer, go-ipfs-cmds, go-ipfs-cmdkit License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@14b366d332ad7524863889d6eddc696b550c57dd --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/key.go | 2 +- coreiface/object.go | 4 ++-- coreiface/options/dag.go | 2 +- coreiface/path.go | 4 ++-- coreiface/unixfs.go | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index ab53740697..696eefbaf1 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index d547e8531d..d3270928c0 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" ) // DagOps groups operations that can be batched together diff --git a/coreiface/key.go b/coreiface/key.go index 3730f35924..cc7c409fd0 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmcZSzKEM5yDfpZbeEEZaVmaZ1zXm6JWTbrQZSB8hCVPzk/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/object.go b/coreiface/object.go index 812b69a647..750638a332 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index e89e4d707b..689bb5c532 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) type DagPutSettings struct { diff --git a/coreiface/path.go b/coreiface/path.go index 49cea48ccd..25b09f4863 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,9 +1,9 @@ package iface import ( - ipfspath "gx/ipfs/QmWMcvZbNvk5codeqbm7L89C9kqSwka4KaHnDb8HRnxsSL/go-path" + ipfspath "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index b42f56ba83..80f7ba3960 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,7 +4,7 @@ import ( "context" "io" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" ) // UnixfsAPI is the basic interface to immutable files in IPFS From 84a85aade52c72deb3769a5de206c8308a5e5cb5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 21 Aug 2018 17:10:11 -0700 Subject: [PATCH 2233/3147] gx: update go-cid, go-libp2p-peer, go-ipfs-cmds, go-ipfs-cmdkit License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@ec65f27baef1c7ba3db7213f08f2f46885067f28 --- pinning/pinner/gc/gc.go | 14 +++++++------- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 10 +++++----- pinning/pinner/set.go | 6 +++--- pinning/pinner/set_test.go | 10 +++++----- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 456aca9ba1..30fe9de949 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - bserv "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" + dag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" + bserv "gx/ipfs/QmbSB9Uh3wVgmiCb1fAb8zuC3qAE6un4kd1jvatUurfAmB/go-blockservice" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" dstore "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" - bstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" - "gx/ipfs/QmfMirfpEKQFctVpBYTvETxxLoU5q4ZJWsAMrtwSSE2bkn/go-verifcid" + "gx/ipfs/QmVUhfewLZpSaAiBYCpw2krYMaiVmFuhr2iurQLuRoU6sD/go-verifcid" + ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + offline "gx/ipfs/QmZxjqR9Qgompju73kakSoUj3rbVndAzky3oCDiBNCxPs1/go-ipfs-exchange-offline" + bstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index effb0f10f8..3a36946c7d 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + mdag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index a715b79f81..590a2e0691 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - mdag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - bs "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" + mdag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" + bs "gx/ipfs/QmbSB9Uh3wVgmiCb1fAb8zuC3qAE6un4kd1jvatUurfAmB/go-blockservice" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + offline "gx/ipfs/QmZxjqR9Qgompju73kakSoUj3rbVndAzky3oCDiBNCxPs1/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index a95978f98f..27c5a9271c 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - ipld "gx/ipfs/QmaA8GkXUYinkkndvg7T6Tx7gYXemhxjaxLisEPes7Rf1P/go-ipld-format" + ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 62a8a9a254..cc0bfcb4a9 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" - bserv "gx/ipfs/QmTZZrpd9o4vpYr9TEADW2EoJ9fzUtAgpXqjxZHbKR2T15/go-blockservice" + dag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" + bserv "gx/ipfs/QmbSB9Uh3wVgmiCb1fAb8zuC3qAE6un4kd1jvatUurfAmB/go-blockservice" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - offline "gx/ipfs/QmVozMmsgK2PYyaHQsrcWLBYigb1m6mW8YhCBG2Cb4Uxq9/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + offline "gx/ipfs/QmZxjqR9Qgompju73kakSoUj3rbVndAzky3oCDiBNCxPs1/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" ) func ignoreCids(_ *cid.Cid) {} From 153c2ced3e698282fe64ca349e9bbec8c7c9b24d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 21 Aug 2018 17:10:11 -0700 Subject: [PATCH 2234/3147] gx: update go-cid, go-libp2p-peer, go-ipfs-cmds, go-ipfs-cmdkit License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@5b958477f9f38aec44ee660309904f2e234450b5 --- filestore/filestore.go | 8 ++++---- filestore/filestore_test.go | 8 ++++---- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 4a1f66df68..dfbcf9ed66 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,12 +11,12 @@ import ( "context" "errors" - blocks "gx/ipfs/QmR54CzE4UcdFAZDehj6HFyy3eSHhVsJUpjfnhCmscuStS/go-block-format" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - posinfo "gx/ipfs/QmdBpJ5VTfL79VwKDU93z7fyZJ3mm4UaBHrE73CWRw2Bjd/go-ipfs-posinfo" + blocks "gx/ipfs/QmWAzSEoqZ6xU6pu8yL8e5WaMb7wtbfbhhN4p1DknUPtr3/go-block-format" + posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index bb72786207..e7c362f49f 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmQzSpSjkdGHW6WFBhUG6P3t9K8yv7iucucT1cQaqJ6tgd/go-merkledag" + dag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - posinfo "gx/ipfs/QmdBpJ5VTfL79VwKDU93z7fyZJ3mm4UaBHrE73CWRw2Bjd/go-ipfs-posinfo" + posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 81b6875379..265874be06 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,14 +10,14 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - blocks "gx/ipfs/QmR54CzE4UcdFAZDehj6HFyy3eSHhVsJUpjfnhCmscuStS/go-block-format" - dshelp "gx/ipfs/QmSLS8mMWsm54vdQuwgde9wBgLg5usVQY4i9r8kXhfje8g/go-ipfs-ds-help" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsns "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/namespace" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" - posinfo "gx/ipfs/QmdBpJ5VTfL79VwKDU93z7fyZJ3mm4UaBHrE73CWRw2Bjd/go-ipfs-posinfo" + blocks "gx/ipfs/QmWAzSEoqZ6xU6pu8yL8e5WaMb7wtbfbhhN4p1DknUPtr3/go-block-format" + posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" + dshelp "gx/ipfs/Qmd39D2vUhmPKQA2fgykjo2JXwekHKeJUggmGRpYuVMA2Z/go-ipfs-ds-help" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/filestore/util.go b/filestore/util.go index d0e25c8d44..fa81127d83 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmSLS8mMWsm54vdQuwgde9wBgLg5usVQY4i9r8kXhfje8g/go-ipfs-ds-help" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" - blockstore "gx/ipfs/QmYBEfMSquSGnuxBthUoBJNs3F6p4VAPPvAgxq6XXGvTPh/go-ipfs-blockstore" - cid "gx/ipfs/QmYjnkEL7i731PirfVH1sis89evN7jt4otSHw5D2xXXwUV/go-cid" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" + dshelp "gx/ipfs/Qmd39D2vUhmPKQA2fgykjo2JXwekHKeJUggmGRpYuVMA2Z/go-ipfs-ds-help" ) // Status is used to identify the state of the block data referenced From e0f2bd3ae8cc797a0cdb789d8d7166b21d0264e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 2 Aug 2018 09:48:52 +0200 Subject: [PATCH 2235/3147] block cmd: use coreapi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@f4e38c0970c260e17d89348001eb15769e4650d8 --- coreiface/block.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/block.go b/coreiface/block.go index 468c009478..b99b05fdb7 100644 --- a/coreiface/block.go +++ b/coreiface/block.go @@ -19,7 +19,7 @@ type BlockStat interface { // BlockAPI specifies the interface to the block layer type BlockAPI interface { // Put imports raw block data, hashing it using specified settings. - Put(context.Context, io.Reader, ...options.BlockPutOption) (ResolvedPath, error) + Put(context.Context, io.Reader, ...options.BlockPutOption) (BlockStat, error) // Get attempts to resolve the path and return a reader for data in the block Get(context.Context, Path) (io.Reader, error) From 1c96fc32d211d18837b63a3befd65a24c600e430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 13 Aug 2018 21:39:41 +0200 Subject: [PATCH 2236/3147] coreapi: block: don't allow creation of invalid cidv0s MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@f9d6dcc420879110f6d332e3de5a2048c07497e9 --- coreiface/options/block.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/options/block.go b/coreiface/options/block.go index d6da99774c..99445cca3e 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -19,7 +19,7 @@ type BlockRmOption func(*BlockRmSettings) error func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, error) { options := &BlockPutSettings{ - Codec: "v0", + Codec: "", MhType: multihash.SHA2_256, MhLength: -1, } From 571c6def44851832a3617c699f1b166d1c9dc959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 15 Aug 2018 14:01:19 +0200 Subject: [PATCH 2237/3147] coreapi: block: move option logic to options package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@68340710253f13b5c5376a9f882608cb0ab17f8c --- coreiface/options/block.go | 44 +++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 99445cca3e..36b3baa0eb 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -1,7 +1,9 @@ package options import ( - "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + "fmt" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) type BlockPutSettings struct { @@ -17,20 +19,52 @@ type BlockRmSettings struct { type BlockPutOption func(*BlockPutSettings) error type BlockRmOption func(*BlockRmSettings) error -func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, error) { +func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, cid.Prefix, error) { options := &BlockPutSettings{ Codec: "", - MhType: multihash.SHA2_256, + MhType: mh.SHA2_256, MhLength: -1, } for _, opt := range opts { err := opt(options) if err != nil { - return nil, err + return nil, cid.Prefix{}, err } } - return options, nil + + var pref cid.Prefix + pref.Version = 1 + + if options.Codec == "" { + if options.MhType != mh.SHA2_256 || (options.MhLength != -1 && options.MhLength != 32) { + options.Codec = "protobuf" + } else { + options.Codec = "v0" + } + } + + if options.Codec == "v0" && options.MhType == mh.SHA2_256 { + pref.Version = 0 + } + + formatval, ok := cid.Codecs[options.Codec] + if !ok { + return nil, cid.Prefix{}, fmt.Errorf("unrecognized format: %s", options.Codec) + } + + if options.Codec == "v0" { + if options.MhType != mh.SHA2_256 || (options.MhLength != -1 && options.MhLength != 32) { + return nil, cid.Prefix{}, fmt.Errorf("only sha2-255-32 is allowed with CIDv0") + } + } + + pref.Codec = formatval + + pref.MhType = options.MhType + pref.MhLength = options.MhLength + + return options, pref, nil } func BlockRmOptions(opts ...BlockRmOption) (*BlockRmSettings, error) { From 8f9f6a12e56ac2b203c71f843ba4c2feb02c34e3 Mon Sep 17 00:00:00 2001 From: Shaoxiong Li Date: Tue, 28 Aug 2018 10:25:42 +0800 Subject: [PATCH 2238/3147] Fix typo: Change 'should not' to 'should' This commit was moved from ipfs/go-ipfs-blockstore@2c327f3fa3892e63814117c14167a0053c354709 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f5cbc4c0f3..4dd670c9a1 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -66,7 +66,7 @@ type GCLocker interface { // PinLock locks the blockstore for sequences of puts expected to finish // with a pin (before GC). Multiple put->pin sequences can write through - // at the same time, but no GC should not happen simulatenously. + // at the same time, but no GC should happen simulatenously. // Reading during Pinning is safe, and requires no lock. PinLock() Unlocker From a44b59e236dd8d95c3342e9c745669ba3a5fd67c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Aug 2018 16:08:25 -0700 Subject: [PATCH 2239/3147] directly parse peer IDs as peer IDs No need to parse it as a hash first. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@c11cb0f591519b9a7611b5c8a3dbaffd88eb8081 --- namesys/routing.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index c533daada2..65da47a2f5 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -55,19 +55,13 @@ func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *op } name = strings.TrimPrefix(name, "/ipns/") - hash, err := mh.FromB58String(name) + pid, err := peer.IDB58Decode(name) if err != nil { // name should be a multihash. if it isn't, error out here. log.Debugf("RoutingResolver: bad input hash: [%s]\n", name) return "", 0, err } - pid, err := peer.IDFromBytes(hash) - if err != nil { - log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) - return "", 0, err - } - // Name should be the hash of a public key retrievable from ipfs. // We retrieve the public key here to make certain that it's in the peer // store before calling GetValue() on the DHT - the DHT will call the From 3f8b3c1e9456b22d73e787051648378368bdfd94 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Aug 2018 18:30:46 -0700 Subject: [PATCH 2240/3147] namesys: fix debug message License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@d4bb442dc39bcec1a977b843d96bf86f602c74cc --- namesys/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/routing.go b/namesys/routing.go index 65da47a2f5..4c1ce80b40 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -58,7 +58,7 @@ func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *op pid, err := peer.IDB58Decode(name) if err != nil { // name should be a multihash. if it isn't, error out here. - log.Debugf("RoutingResolver: bad input hash: [%s]\n", name) + log.Debugf("RoutingResolver: IPNS address not a valid peer ID: [%s]\n", name) return "", 0, err } From 8202290be000a922507bd9b834bd0366b8d2263f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 30 Aug 2018 18:51:18 -0700 Subject: [PATCH 2241/3147] nit: make dagTruncate a method on DagModifier This commit was moved from ipfs/go-unixfs@9e50901d14e46535eea7b00f3868ed90130930a1 --- unixfs/mod/dagmodifier.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index f6e5f48200..0f03cb6d3c 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -490,7 +490,7 @@ func (dm *DagModifier) Truncate(size int64) error { return dm.expandSparse(int64(size) - realSize) } - nnode, err := dagTruncate(dm.ctx, dm.curNode, uint64(size), dm.dagserv) + nnode, err := dm.dagTruncate(dm.ctx, dm.curNode, uint64(size)) if err != nil { return err } @@ -505,7 +505,7 @@ func (dm *DagModifier) Truncate(size int64) error { } // dagTruncate truncates the given node to 'size' and returns the modified Node -func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGService) (ipld.Node, error) { +func (dm *DagModifier) dagTruncate(ctx context.Context, n ipld.Node, size uint64) (ipld.Node, error) { if len(n.Links()) == 0 { switch nd := n.(type) { case *mdag.ProtoNode: @@ -537,7 +537,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi // with the new values of the truncated children. ndata.RemoveAllBlockSizes() for i, lnk := range nd.Links() { - child, err := lnk.GetNode(ctx, ds) + child, err := lnk.GetNode(ctx, dm.dagserv) if err != nil { return nil, err } @@ -549,7 +549,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi // found the child we want to cut if size < cur+childsize { - nchild, err := dagTruncate(ctx, child, size-cur, ds) + nchild, err := dm.dagTruncate(ctx, child, size-cur) if err != nil { return nil, err } @@ -564,7 +564,7 @@ func dagTruncate(ctx context.Context, n ipld.Node, size uint64, ds ipld.DAGServi ndata.AddBlockSize(childsize) } - err = ds.Add(ctx, modified) + err = dm.dagserv.Add(ctx, modified) if err != nil { return nil, err } From 5e6e8bb19504af02a1539ea8258566d5b6d6fa7a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Aug 2018 21:04:56 -0700 Subject: [PATCH 2242/3147] gx update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@f239caf86096752f443bb0a7100fc8a653ade4ed --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 6 +++--- namesys/namesys.go | 2 +- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/publisher_test.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 4 ++-- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index b88668dccb..0ba9fc1306 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 3d7fc51e65..dcbb0f966e 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index d329875a14..6d454f70f9 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index f2a2c868bf..8602aa381d 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index dd84308f2d..79901c48b7 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" @@ -17,8 +17,8 @@ import ( ropts "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing/options" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - mockrouting "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/mock" - offline "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/offline" + mockrouting "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/mock" + offline "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/offline" record "gx/ipfs/QmdHb9aBELnQKTVhvvA3hsQbRgUAwsWUzBP2vZ6Y5FBYvE/go-libp2p-record" pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index ac5faeaeb6..eef05a1987 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index f1cfa4d480..ab099f2678 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,15 +7,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmQjEpRiwVvtowhq69dAtB4jhioPVFXiCcWZm9Sfgn7eqc/go-unixfs" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + "gx/ipfs/QmVNEJ5Vk1e2G5kHMiuVbpD6VQZiK1oS6aWZKjcUQW7hEy/go-unixfs" ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - offroute "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/offline" + offroute "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/offline" pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index d869ce01e6..ba57915cc0 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,8 +7,8 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 8a4c4002ac..9acab73907 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmQjEpRiwVvtowhq69dAtB4jhioPVFXiCcWZm9Sfgn7eqc/go-unixfs" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + ft "gx/ipfs/QmVNEJ5Vk1e2G5kHMiuVbpD6VQZiK1oS6aWZKjcUQW7hEy/go-unixfs" ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 5b33940f36..44009dda50 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -13,8 +13,8 @@ import ( ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + mockrouting "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/mock" dshelp "gx/ipfs/Qmd39D2vUhmPKQA2fgykjo2JXwekHKeJUggmGRpYuVMA2Z/go-ipfs-ds-help" - mockrouting "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/mock" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 90fab3f23a..2196e989be 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 387db7f90c..e35ba40280 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" - mocknet "gx/ipfs/QmQiaskfWpdRJ4x2spEQjPFTUkEB87KDYu91qnNYBqvvcX/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" + mocknet "gx/ipfs/Qmf1u2efhjXYtuyP8SMHYtw4dCkbghnniex2PSp7baA7FP/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index b2a4e23ac8..90d22d48e7 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - mockrouting "gx/ipfs/Qmd45r5jHr1PKMNQqifnbZy1ZQwHdtXUDJFamUEvUJE544/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/mock" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index c533daada2..e0817517de 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + dht "gx/ipfs/QmNesMxTot4Spt6qZkT45DWMSniPJgUfc4BprhbCpPi6Qk/go-libp2p-kad-dht" ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" - dht "gx/ipfs/QmTRj8mj6X5LtjVochPPSNX6MTbJ6iVojcfakWJKG13re7/go-libp2p-kad-dht" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From 15e2043dc4f58e44d5676386753c2b8ec5be5229 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Aug 2018 21:04:56 -0700 Subject: [PATCH 2243/3147] gx update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@db3f7c2c47e384fabdc30a1b9141b92f56375f5d --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 25b09f4863..7873fe2bf7 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmdMPBephdLYNESkruDX2hcDTgFYhoCt4LimWhgnomSdV2/go-path" + ipfspath "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) From b0fc9ff1437db91a331d17186261d6aa5c04f656 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Aug 2018 21:04:56 -0700 Subject: [PATCH 2244/3147] gx update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@39e67f1dcbfeb90f0cbcbba74e5ae24f2ef30b08 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 30fe9de949..672b6a5560 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" - bserv "gx/ipfs/QmbSB9Uh3wVgmiCb1fAb8zuC3qAE6un4kd1jvatUurfAmB/go-blockservice" + dag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" + bserv "gx/ipfs/QmdHqV7L4bpmMtEXVCrgn8RN6CXqMr3aUeogSkXbJGRtwk/go-blockservice" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" dstore "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 3a36946c7d..11a61292db 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" + mdag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 590a2e0691..64fd44a0a5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" - bs "gx/ipfs/QmbSB9Uh3wVgmiCb1fAb8zuC3qAE6un4kd1jvatUurfAmB/go-blockservice" + mdag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" + bs "gx/ipfs/QmdHqV7L4bpmMtEXVCrgn8RN6CXqMr3aUeogSkXbJGRtwk/go-blockservice" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 27c5a9271c..5b8889ee53 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" + "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index cc0bfcb4a9..69724f4cd3 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" - bserv "gx/ipfs/QmbSB9Uh3wVgmiCb1fAb8zuC3qAE6un4kd1jvatUurfAmB/go-blockservice" + dag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" + bserv "gx/ipfs/QmdHqV7L4bpmMtEXVCrgn8RN6CXqMr3aUeogSkXbJGRtwk/go-blockservice" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" From 7bd1b46b9b33be615a21089f05819c527fc2ee86 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 29 Aug 2018 21:04:56 -0700 Subject: [PATCH 2245/3147] gx update deps License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@62ab85e8674135e44ef0a2f7caf8afc67228d9cf --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index e7c362f49f..0ae740982c 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmRiQCJZ91B7VNmLvA6sxzDuBJGSojS3uXHHVuNr3iueNZ/go-merkledag" + dag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" From c195c52ee9be357b800089917e0189b608f7883c Mon Sep 17 00:00:00 2001 From: Kejie Zhang Date: Fri, 7 Sep 2018 13:49:21 +0800 Subject: [PATCH 2246/3147] return error if rabin min is less than 16 This commit was moved from ipfs/go-ipfs-chunker@f4ac7aefc4551ca96e5aff464c4a3ff3a1f84801 --- chunker/parse.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/chunker/parse.go b/chunker/parse.go index 7d511c2170..6c725bf929 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -49,13 +49,15 @@ func parseRabinString(r io.Reader, chunker string) (Splitter, error) { return nil, errors.New("first label must be min") } min, err := strconv.Atoi(sub[len(sub)-1]) - if err != nil { + if err != nil || min < 16{ return nil, err } - + if min < 16 { + return nil,errors.New("the rabin min should not less not 16") + } sub = strings.Split(parts[2], ":") if len(sub) > 1 && sub[0] != "avg" { - log.Error("sub == ", sub) + //log.Error("sub == ", sub) return nil, errors.New("second label must be avg") } avg, err := strconv.Atoi(sub[len(sub)-1]) From b2593d444d46abe87ebbc7070a4caf7ed91f93f6 Mon Sep 17 00:00:00 2001 From: Kejie Zhang Date: Fri, 7 Sep 2018 14:15:54 +0800 Subject: [PATCH 2247/3147] add parse test in chunkers This commit was moved from ipfs/go-ipfs-chunker@56321ac98c7264d429a6d06ff2e68f4cf9c6190c --- chunker/parse.go | 8 +++++--- chunker/parse_test.go | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 chunker/parse_test.go diff --git a/chunker/parse.go b/chunker/parse.go index 6c725bf929..2adf64c7a9 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -8,6 +8,8 @@ import ( "strings" ) +var ErrRabinMin = errors.New("the rabin min should not less not 16") + // FromString returns a Splitter depending on the given string: // it supports "default" (""), "size-{size}", "rabin", "rabin-{blocksize}" and // "rabin-{min}-{avg}-{max}". @@ -49,15 +51,15 @@ func parseRabinString(r io.Reader, chunker string) (Splitter, error) { return nil, errors.New("first label must be min") } min, err := strconv.Atoi(sub[len(sub)-1]) - if err != nil || min < 16{ + if err != nil { return nil, err } if min < 16 { - return nil,errors.New("the rabin min should not less not 16") + return nil,ErrRabinMin } sub = strings.Split(parts[2], ":") if len(sub) > 1 && sub[0] != "avg" { - //log.Error("sub == ", sub) + log.Error("sub == ", sub) return nil, errors.New("second label must be avg") } avg, err := strconv.Atoi(sub[len(sub)-1]) diff --git a/chunker/parse_test.go b/chunker/parse_test.go new file mode 100644 index 0000000000..ab2cb1e78c --- /dev/null +++ b/chunker/parse_test.go @@ -0,0 +1,21 @@ +package chunk + +import ( + "testing" + "bytes" +) + +func TestParse(t *testing.T) { + max := 1000 + r := bytes.NewReader(randBuf(t, max)) + chk1 := "rabin-18-25-32" + chk2 := "rabin-15-23-31" + _, err := parseRabinString(r, chk1) + if err != nil { + t.Errorf(err.Error()) + } + _, err = parseRabinString(r, chk2) + if err == nil || err.Error() != ErrRabinMin.Error() { + t.Errorf("it should be a ErrRabinMin here.") + } +} \ No newline at end of file From e7910f1e715ee9f85f95f3b2a583fdade9c15f77 Mon Sep 17 00:00:00 2001 From: Kejie Zhang Date: Fri, 7 Sep 2018 18:03:09 +0800 Subject: [PATCH 2248/3147] update test and fmt code This commit was moved from ipfs/go-ipfs-chunker@0bee44abde34bb7f6b58e1a66bfe5e3aab8bc740 --- chunker/parse.go | 2 +- chunker/parse_test.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/chunker/parse.go b/chunker/parse.go index 2adf64c7a9..d69da1681c 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -55,7 +55,7 @@ func parseRabinString(r io.Reader, chunker string) (Splitter, error) { return nil, err } if min < 16 { - return nil,ErrRabinMin + return nil, ErrRabinMin } sub = strings.Split(parts[2], ":") if len(sub) > 1 && sub[0] != "avg" { diff --git a/chunker/parse_test.go b/chunker/parse_test.go index ab2cb1e78c..4dd8afc2df 100644 --- a/chunker/parse_test.go +++ b/chunker/parse_test.go @@ -1,8 +1,8 @@ package chunk import ( - "testing" "bytes" + "testing" ) func TestParse(t *testing.T) { @@ -15,7 +15,7 @@ func TestParse(t *testing.T) { t.Errorf(err.Error()) } _, err = parseRabinString(r, chk2) - if err == nil || err.Error() != ErrRabinMin.Error() { - t.Errorf("it should be a ErrRabinMin here.") + if err == ErrRabinMin { + t.Log("it should be ErrRabinMin here.") } -} \ No newline at end of file +} From 42685aa018f60874753a0a9148a0e7e03c01d03b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 23:05:23 +0000 Subject: [PATCH 2249/3147] improve error message and fix grammar In general, it's easier for people to parse positive statements. This commit was moved from ipfs/go-ipfs-chunker@b18fd483cd016514a93cbb5662b0c6f1a6fecfe2 --- chunker/parse.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chunker/parse.go b/chunker/parse.go index d69da1681c..d7764d7b41 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -8,7 +8,7 @@ import ( "strings" ) -var ErrRabinMin = errors.New("the rabin min should not less not 16") +var ErrRabinMin = errors.New("rabin min must be greater than 16") // FromString returns a Splitter depending on the given string: // it supports "default" (""), "size-{size}", "rabin", "rabin-{blocksize}" and From 093d964389cd95c2b48e5f1dd9864654725817f7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 22:17:09 -0700 Subject: [PATCH 2250/3147] gx: update go-peerstore This commit was moved from ipfs/go-ipns@caf9f8b789d8aa348eb9b6e7d47f26f14b5a1b0b --- ipns/validate_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ipns/validate_test.go b/ipns/validate_test.go index 634636844a..0ef9d00c5f 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -14,6 +14,7 @@ import ( ci "github.com/libp2p/go-libp2p-crypto" peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" + pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" ) func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { @@ -62,9 +63,9 @@ func TestValidator(t *testing.T) { priv, id, _ := genKeys(t) priv2, id2, _ := genKeys(t) - kbook := pstore.NewPeerstore() + kbook := pstoremem.NewPeerstore() kbook.AddPubKey(id, priv.GetPublic()) - emptyKbook := pstore.NewPeerstore() + emptyKbook := pstoremem.NewPeerstore() testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), nil) testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour*-1), ErrExpiredRecord) @@ -88,7 +89,7 @@ func mustMarshal(t *testing.T, entry *pb.IpnsEntry) []byte { func TestEmbeddedPubKeyValidate(t *testing.T) { goodeol := time.Now().Add(time.Hour) - kbook := pstore.NewPeerstore() + kbook := pstoremem.NewPeerstore() pth := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") @@ -128,7 +129,7 @@ func TestEmbeddedPubKeyValidate(t *testing.T) { func TestPeerIDPubKeyValidate(t *testing.T) { goodeol := time.Now().Add(time.Hour) - kbook := pstore.NewPeerstore() + kbook := pstoremem.NewPeerstore() pth := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") From a7890b7bc7a84c7ef18ea7a979928432ef6ee800 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 23:40:08 -0700 Subject: [PATCH 2251/3147] gx: update peerstore Also: * Updates go-floodsub to fix a data race. * Updates golang-lru License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@745b4d2660cde7d5f54b86035bbaebf6b710561f --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 18 +++++++++--------- namesys/namesys.go | 8 ++++---- namesys/namesys_test.go | 14 +++++++------- namesys/proquint.go | 2 +- namesys/publisher.go | 14 +++++++------- namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 10 +++++----- 14 files changed, 53 insertions(+), 53 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 0ba9fc1306..0047b434e3 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index dcbb0f966e..451521be42 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 6d454f70f9..4961c72d9c 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 8602aa381d..a638b5f817 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 79901c48b7..bfa3cdc8df 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,21 +6,21 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" - ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" - ropts "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing/options" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - mockrouting "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/mock" - offline "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/offline" + mockrouting "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/mock" + offline "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/offline" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" + routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" + ropts "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing/options" + ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" record "gx/ipfs/QmdHb9aBELnQKTVhvvA3hsQbRgUAwsWUzBP2vZ6Y5FBYvE/go-libp2p-record" - pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" + pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index eef05a1987..9b8e6bff62 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,14 +6,14 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - lru "gx/ipfs/QmVYxfoJQiZijTgPNHCHgHELvQpbsJNTg6Crmc3dQkj3yy/golang-lru" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index ab099f2678..a4011795b8 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,16 +7,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" - "gx/ipfs/QmVNEJ5Vk1e2G5kHMiuVbpD6VQZiK1oS6aWZKjcUQW7hEy/go-unixfs" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + "gx/ipfs/QmWAfTyD6KEBm7bzqNRBPvqKrZCDtn5PGbs9V1DKfnVK59/go-unixfs" - ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - offroute "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/offline" - pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" + offroute "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/offline" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" + ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" + pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index ba57915cc0..2778590e59 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 9acab73907..79be29e0d8 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" - ft "gx/ipfs/QmVNEJ5Vk1e2G5kHMiuVbpD6VQZiK1oS6aWZKjcUQW7hEy/go-unixfs" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + ft "gx/ipfs/QmWAfTyD6KEBm7bzqNRBPvqKrZCDtn5PGbs9V1DKfnVK59/go-unixfs" - ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" - pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dsquery "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dsquery "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" + routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" + ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" + pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 44009dda50..5df344af92 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" - ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" + mockrouting "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/mock" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - mockrouting "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/mock" - dshelp "gx/ipfs/Qmd39D2vUhmPKQA2fgykjo2JXwekHKeJUggmGRpYuVMA2Z/go-ipfs-ds-help" + ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" + dshelp "gx/ipfs/Qmf1xGr3SyBpiPp3ZDuKkYMh4gnRk9K4QnbL17kstnf35h/go-ipfs-ds-help" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 2196e989be..29a5fa745b 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" - pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index e35ba40280..be62d10cb6 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmeKD8YT7887Xu6Z86iZmpYNxrLogJexqxEugSmaf14k64/go-libp2p-peerstore" - mocknet "gx/ipfs/Qmf1u2efhjXYtuyP8SMHYtw4dCkbghnniex2PSp7baA7FP/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmUEqyXr97aUbNmQADHYNknjwjjdVpJXEt1UZXmSG81EV4/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 90d22d48e7..b865988277 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" - ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" - mockrouting "gx/ipfs/QmZdn8S4FLTfDrmLZb7JoLkrRvTYnyuMWEG6ZGZ3YKwEiK/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/mock" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" + ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index f759546d2b..4936572813 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,16 +6,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" - dht "gx/ipfs/QmNesMxTot4Spt6qZkT45DWMSniPJgUfc4BprhbCpPi6Qk/go-libp2p-kad-dht" - ipns "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns" - pb "gx/ipfs/QmNqBhXpBKa5jcjoUZHfxDgAFxtqK3rDA5jtW811GBvVob/go-ipns/pb" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + dht "gx/ipfs/QmRNxiPpZf3skMAtmDJpgHuW9uj1ukqV1zjANj9d6bmHfE/go-libp2p-kad-dht" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - routing "gx/ipfs/QmS4niovD1U6pRjUBXivr1zvvLBqiTKbERjFo994JU7oQS/go-libp2p-routing" + routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" + pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From 55f24526833cddd68b49a7858a48d8019b00a617 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 23:40:08 -0700 Subject: [PATCH 2252/3147] gx: update peerstore Also: * Updates go-floodsub to fix a data race. * Updates golang-lru License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@618aaa45543916248c209032a2e0309793666dd3 --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 7873fe2bf7..c2b4cd8697 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmTKaiDxQqVxmA1bRipSuP7hnTSgnMSmEa98NYeS6fcoiv/go-path" + ipfspath "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) From 4b07f99c07d30b9537c6f6a9bec6df489e318a56 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 23:40:08 -0700 Subject: [PATCH 2253/3147] gx: update peerstore Also: * Updates go-floodsub to fix a data race. * Updates golang-lru License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@1002faaa0560848a359837619cc76a4bcff0341f --- pinning/pinner/gc/gc.go | 10 +++++----- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 12 ++++++------ pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 12 ++++++------ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 672b6a5560..9628f7ad70 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" - bserv "gx/ipfs/QmdHqV7L4bpmMtEXVCrgn8RN6CXqMr3aUeogSkXbJGRtwk/go-blockservice" + dag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" + bserv "gx/ipfs/QmQLG22wSEStiociTSKQpZAuuaaWoF1B3iKyjPFvWiTQ77/go-blockservice" + offline "gx/ipfs/QmPuLWvxK1vg6ckKUpT53Dow9VLCcQGdL5Trwxa8PTLp7r/go-ipfs-exchange-offline" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - dstore "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + dstore "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" "gx/ipfs/QmVUhfewLZpSaAiBYCpw2krYMaiVmFuhr2iurQLuRoU6sD/go-verifcid" ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - offline "gx/ipfs/QmZxjqR9Qgompju73kakSoUj3rbVndAzky3oCDiBNCxPs1/go-ipfs-exchange-offline" - bstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" + bstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 11a61292db..cff9e4ae5b 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,10 +10,10 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" + mdag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 64fd44a0a5..4dc5e3565e 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - mdag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" - bs "gx/ipfs/QmdHqV7L4bpmMtEXVCrgn8RN6CXqMr3aUeogSkXbJGRtwk/go-blockservice" + mdag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" + bs "gx/ipfs/QmQLG22wSEStiociTSKQpZAuuaaWoF1B3iKyjPFvWiTQ77/go-blockservice" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dssync "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/sync" + offline "gx/ipfs/QmPuLWvxK1vg6ckKUpT53Dow9VLCcQGdL5Trwxa8PTLp7r/go-ipfs-exchange-offline" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - offline "gx/ipfs/QmZxjqR9Qgompju73kakSoUj3rbVndAzky3oCDiBNCxPs1/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" + blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 5b8889ee53..f0853d53a5 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" + "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 69724f4cd3..e98025ed19 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" - bserv "gx/ipfs/QmdHqV7L4bpmMtEXVCrgn8RN6CXqMr3aUeogSkXbJGRtwk/go-blockservice" + dag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" + bserv "gx/ipfs/QmQLG22wSEStiociTSKQpZAuuaaWoF1B3iKyjPFvWiTQ77/go-blockservice" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" + offline "gx/ipfs/QmPuLWvxK1vg6ckKUpT53Dow9VLCcQGdL5Trwxa8PTLp7r/go-ipfs-exchange-offline" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - offline "gx/ipfs/QmZxjqR9Qgompju73kakSoUj3rbVndAzky3oCDiBNCxPs1/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" + blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" ) func ignoreCids(_ *cid.Cid) {} From a5268fe78463e5cb1ef9febe0638d36d81fd72ef Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 23:40:08 -0700 Subject: [PATCH 2254/3147] gx: update peerstore Also: * Updates go-floodsub to fix a data race. * Updates golang-lru License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@3e3f82a754830ada6b84e5740c7ebf91c765e989 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index dfbcf9ed66..a24839d2ed 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,11 +12,11 @@ import ( "errors" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" + dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" blocks "gx/ipfs/QmWAzSEoqZ6xU6pu8yL8e5WaMb7wtbfbhhN4p1DknUPtr3/go-block-format" posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" + blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 0ae740982c..83eeb69b9f 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmRDaC5z6yXkXTTSWzaxs2sSVBon5RRCN6eNtMmpuHtKCr/go-merkledag" + dag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" + blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 265874be06..87ceda15d9 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,15 +10,15 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dsns "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/namespace" - dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dsns "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/namespace" + dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" blocks "gx/ipfs/QmWAzSEoqZ6xU6pu8yL8e5WaMb7wtbfbhhN4p1DknUPtr3/go-block-format" posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" - dshelp "gx/ipfs/Qmd39D2vUhmPKQA2fgykjo2JXwekHKeJUggmGRpYuVMA2Z/go-ipfs-ds-help" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" + dshelp "gx/ipfs/Qmf1xGr3SyBpiPp3ZDuKkYMh4gnRk9K4QnbL17kstnf35h/go-ipfs-ds-help" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index fa81127d83..ea7f06ff03 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - ds "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore" - dsq "gx/ipfs/QmVG5gxteQNEMhrS8prJSmU2C9rebtFuTd3SYZ5kE3YZ5k/go-datastore/query" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/QmcmpX42gtDv1fz24kau4wjS9hfwWj5VexWBKgGnWzsyag/go-ipfs-blockstore" - dshelp "gx/ipfs/Qmd39D2vUhmPKQA2fgykjo2JXwekHKeJUggmGRpYuVMA2Z/go-ipfs-ds-help" + blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" + dshelp "gx/ipfs/Qmf1xGr3SyBpiPp3ZDuKkYMh4gnRk9K4QnbL17kstnf35h/go-ipfs-ds-help" ) // Status is used to identify the state of the block data referenced From 7e2429da1b34da9ae3a4607b1960fb5cb7b28e2c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 23:46:12 -0700 Subject: [PATCH 2255/3147] fix peerstore constructor calls License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@984e3c40bc6785ec67455512634a941ec8f69c35 --- namesys/ipns_resolver_validation_test.go | 3 ++- namesys/namesys_test.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index bfa3cdc8df..c5eda17378 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -21,13 +21,14 @@ import ( ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" record "gx/ipfs/QmdHb9aBELnQKTVhvvA3hsQbRgUAwsWUzBP2vZ6Y5FBYvE/go-libp2p-record" pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" + pstoremem "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore/pstoremem" ) func TestResolverValidation(t *testing.T) { ctx := context.Background() rid := testutil.RandIdentityOrFatal(t) dstore := dssync.MutexWrap(ds.NewMapDatastore()) - peerstore := pstore.NewPeerstore() + peerstore := pstoremem.NewPeerstore() vstore := newMockValueStore(rid, dstore, peerstore) resolver := NewIpnsResolver(vstore) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index a4011795b8..cc213c9c5c 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -16,7 +16,7 @@ import ( ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" - pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" + pstoremem "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore/pstoremem" ) type mockResolver struct { @@ -86,7 +86,7 @@ func TestPublishWithCache0(t *testing.T) { if err != nil { t.Fatal(err) } - ps := pstore.NewPeerstore() + ps := pstoremem.NewPeerstore() pid, err := peer.IDFromPrivateKey(priv) if err != nil { t.Fatal(err) From 6c40247cc1931a891782c579d48f517a7945569b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 19:07:50 +0100 Subject: [PATCH 2256/3147] coreapi: dht interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@bbd736fdecec3e18d61e72b5a4beb9234f66c1ec --- coreiface/dht.go | 28 ++++++++++++++++++++++++++++ coreiface/options/dht.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 coreiface/dht.go create mode 100644 coreiface/options/dht.go diff --git a/coreiface/dht.go b/coreiface/dht.go new file mode 100644 index 0000000000..1c8e68bd16 --- /dev/null +++ b/coreiface/dht.go @@ -0,0 +1,28 @@ +package iface + +import ( + "context" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" +) + +// DhtAPI specifies the interface to the DHT +type DhtAPI interface { + // FindPeer queries the DHT for all of the multiaddresses associated with a + // Peer ID + FindPeer(context.Context, peer.ID) (<-chan ma.Multiaddr, error) + + // FindProviders finds peers in the DHT who can provide a specific value + // given a key. + FindProviders(context.Context, Path) (<-chan peer.ID, error) //TODO: is path the right choice here? + + // Provide announces to the network that you are providing given values + Provide(context.Context, Path, ...options.DhtProvideOption) error + + // WithRecursive is an option for Provide which specifies whether to provide + // the given path recursively + WithRecursive(recursive bool) options.DhtProvideOption +} diff --git a/coreiface/options/dht.go b/coreiface/options/dht.go new file mode 100644 index 0000000000..92fd14f4aa --- /dev/null +++ b/coreiface/options/dht.go @@ -0,0 +1,30 @@ +package options + +type DhtProvideSettings struct { + Recursive bool +} + +type DhtProvideOption func(*DhtProvideSettings) error + +func DhtProvideOptions(opts ...DhtProvideOption) (*DhtProvideSettings, error) { + options := &DhtProvideSettings{ + Recursive: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type DhtOptions struct{} + +func (api *DhtOptions) WithRecursive(recursive bool) DhtProvideOption { + return func(settings *DhtProvideSettings) error { + settings.Recursive = recursive + return nil + } +} From 1ca0f8b291354c50b54f51c7afd42bafcee8a0a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 19:12:54 +0100 Subject: [PATCH 2257/3147] coreapi: implement dht api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@db9865b9ee918e7db54e6cffa41a0e8950b3e170 --- coreiface/coreapi.go | 3 +++ coreiface/dht.go | 6 +++++- coreiface/options/dht.go | 26 ++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 696eefbaf1..9811b75be8 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -31,6 +31,9 @@ type CoreAPI interface { // ObjectAPI returns an implementation of Object API Object() ObjectAPI + // Dht returns an implementation of Dht API + Dht() DhtAPI + // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (ResolvedPath, error) diff --git a/coreiface/dht.go b/coreiface/dht.go index 1c8e68bd16..ce8509e01a 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -17,7 +17,11 @@ type DhtAPI interface { // FindProviders finds peers in the DHT who can provide a specific value // given a key. - FindProviders(context.Context, Path) (<-chan peer.ID, error) //TODO: is path the right choice here? + FindProviders(context.Context, Path, ...options.DhtFindProvidersOption) (<-chan peer.ID, error) //TODO: is path the right choice here? + + // WithNumProviders is an option for FindProviders which specifies the + // number of peers to look for. Default is 20 + WithNumProviders(numProviders int) options.DhtFindProvidersOption // Provide announces to the network that you are providing given values Provide(context.Context, Path, ...options.DhtProvideOption) error diff --git a/coreiface/options/dht.go b/coreiface/options/dht.go index 92fd14f4aa..3867e32c07 100644 --- a/coreiface/options/dht.go +++ b/coreiface/options/dht.go @@ -4,7 +4,12 @@ type DhtProvideSettings struct { Recursive bool } +type DhtFindProvidersSettings struct { + NumProviders int +} + type DhtProvideOption func(*DhtProvideSettings) error +type DhtFindProvidersOption func(*DhtFindProvidersSettings) error func DhtProvideOptions(opts ...DhtProvideOption) (*DhtProvideSettings, error) { options := &DhtProvideSettings{ @@ -20,6 +25,20 @@ func DhtProvideOptions(opts ...DhtProvideOption) (*DhtProvideSettings, error) { return options, nil } +func DhtFindProvidersOptions(opts ...DhtFindProvidersOption) (*DhtFindProvidersSettings, error) { + options := &DhtFindProvidersSettings{ + NumProviders: 20, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + type DhtOptions struct{} func (api *DhtOptions) WithRecursive(recursive bool) DhtProvideOption { @@ -28,3 +47,10 @@ func (api *DhtOptions) WithRecursive(recursive bool) DhtProvideOption { return nil } } + +func (api *DhtOptions) WithNumProviders(numProviders int) DhtFindProvidersOption { + return func(settings *DhtFindProvidersSettings) error { + settings.NumProviders = numProviders + return nil + } +} From 0e411a61d02330a3b2544fb300e4577c1e0a1087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 19:17:30 +0100 Subject: [PATCH 2258/3147] coreapi: test using mock swarm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@db721461cc7c24fba56f74cfd6eb9c8064d0f8c5 --- coreiface/dht.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index ce8509e01a..1d23ece1f0 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) // DhtAPI specifies the interface to the DHT From 78b1cf5653e1cc2d8192db2b541fa09e2dbb2c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 19 Jul 2018 13:18:05 +0200 Subject: [PATCH 2259/3147] coreapi: dht: simplify the implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@22a12c2c233473aafa66ced10e222162a7711868 --- coreiface/dht.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 1d23ece1f0..01b7d7367a 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -3,21 +3,21 @@ package iface import ( "context" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT type DhtAPI interface { // FindPeer queries the DHT for all of the multiaddresses associated with a // Peer ID - FindPeer(context.Context, peer.ID) (<-chan ma.Multiaddr, error) + FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) // FindProviders finds peers in the DHT who can provide a specific value // given a key. - FindProviders(context.Context, Path, ...options.DhtFindProvidersOption) (<-chan peer.ID, error) //TODO: is path the right choice here? + FindProviders(context.Context, Path, ...options.DhtFindProvidersOption) (<-chan pstore.PeerInfo, error) // WithNumProviders is an option for FindProviders which specifies the // number of peers to look for. Default is 20 From 2bef47921404e491af08c3f66fc8475f53526685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 19 Jul 2018 13:27:06 +0200 Subject: [PATCH 2260/3147] coreapi: dht: refactor options after rebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@656fc75b6f65435e224b7bd1e392ee8daf90f9b2 --- coreiface/dht.go | 8 -------- coreiface/options/dht.go | 12 +++++++++--- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 01b7d7367a..f9a08df342 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -19,14 +19,6 @@ type DhtAPI interface { // given a key. FindProviders(context.Context, Path, ...options.DhtFindProvidersOption) (<-chan pstore.PeerInfo, error) - // WithNumProviders is an option for FindProviders which specifies the - // number of peers to look for. Default is 20 - WithNumProviders(numProviders int) options.DhtFindProvidersOption - // Provide announces to the network that you are providing given values Provide(context.Context, Path, ...options.DhtProvideOption) error - - // WithRecursive is an option for Provide which specifies whether to provide - // the given path recursively - WithRecursive(recursive bool) options.DhtProvideOption } diff --git a/coreiface/options/dht.go b/coreiface/options/dht.go index 3867e32c07..f989fa5e78 100644 --- a/coreiface/options/dht.go +++ b/coreiface/options/dht.go @@ -39,16 +39,22 @@ func DhtFindProvidersOptions(opts ...DhtFindProvidersOption) (*DhtFindProvidersS return options, nil } -type DhtOptions struct{} +type dhtOpts struct{} -func (api *DhtOptions) WithRecursive(recursive bool) DhtProvideOption { +var Dht dhtOpts + +// WithRecursive is an option for Dht.Provide which specifies whether to provide +// the given path recursively +func (dhtOpts) WithRecursive(recursive bool) DhtProvideOption { return func(settings *DhtProvideSettings) error { settings.Recursive = recursive return nil } } -func (api *DhtOptions) WithNumProviders(numProviders int) DhtFindProvidersOption { +// WithNumProviders is an option for Dht.FindProviders which specifies the +// number of peers to look for. Default is 20 +func (dhtOpts) WithNumProviders(numProviders int) DhtFindProvidersOption { return func(settings *DhtFindProvidersSettings) error { settings.NumProviders = numProviders return nil From 1ee72b14142c20703fe9bd9690543d42491b5a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 26 Jul 2018 15:09:26 +0200 Subject: [PATCH 2261/3147] coreapi dht: add a note on name change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@da52b4bfdb425964a3b5909bdbeacdfdb57cef40 --- coreiface/dht.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coreiface/dht.go b/coreiface/dht.go index f9a08df342..cd704c3e37 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -10,6 +10,8 @@ import ( ) // DhtAPI specifies the interface to the DHT +// Note: This API will likely get renamed in near future, see +// https://github.com/ipfs/interface-ipfs-core/issues/249 for more context. type DhtAPI interface { // FindPeer queries the DHT for all of the multiaddresses associated with a // Peer ID From 8de59ef7854d5f337c333acc9902715e274cf2dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 10 Aug 2018 13:24:33 +0200 Subject: [PATCH 2262/3147] move streaming set to thirdparty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@03a210bb130d8d46bc9d8c8bbac953edff53f32f --- coreiface/dht.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index cd704c3e37..7b8119e449 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -10,7 +10,7 @@ import ( ) // DhtAPI specifies the interface to the DHT -// Note: This API will likely get renamed in near future, see +// Note: This API will likely get deprecated in near future, see // https://github.com/ipfs/interface-ipfs-core/issues/249 for more context. type DhtAPI interface { // FindPeer queries the DHT for all of the multiaddresses associated with a From 4390a24ff2b4e85d7c999f3a1066c55bb2fa1cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 28 Aug 2018 02:22:09 +0200 Subject: [PATCH 2263/3147] coreapi: dht: remove option prefix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a288d2c93dd22c48050ffb8cadce259377fd2125 --- coreiface/options/dht.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/coreiface/options/dht.go b/coreiface/options/dht.go index f989fa5e78..e13e160200 100644 --- a/coreiface/options/dht.go +++ b/coreiface/options/dht.go @@ -43,18 +43,18 @@ type dhtOpts struct{} var Dht dhtOpts -// WithRecursive is an option for Dht.Provide which specifies whether to provide +// Recursive is an option for Dht.Provide which specifies whether to provide // the given path recursively -func (dhtOpts) WithRecursive(recursive bool) DhtProvideOption { +func (dhtOpts) Recursive(recursive bool) DhtProvideOption { return func(settings *DhtProvideSettings) error { settings.Recursive = recursive return nil } } -// WithNumProviders is an option for Dht.FindProviders which specifies the +// NumProviders is an option for Dht.FindProviders which specifies the // number of peers to look for. Default is 20 -func (dhtOpts) WithNumProviders(numProviders int) DhtFindProvidersOption { +func (dhtOpts) NumProviders(numProviders int) DhtFindProvidersOption { return func(settings *DhtFindProvidersSettings) error { settings.NumProviders = numProviders return nil From 1a84075e8fd665ea8211b6d31bc90ecbfddc8718 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Sep 2018 15:01:40 -0700 Subject: [PATCH 2264/3147] remove Godeps fixes #2722 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@00d1e8df514cd3582fde66485d10190032be2ec9 --- pinning/pinner/internal/pb/doc.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pinning/pinner/internal/pb/doc.go b/pinning/pinner/internal/pb/doc.go index 1143a4d83f..95d4afe671 100644 --- a/pinning/pinner/internal/pb/doc.go +++ b/pinning/pinner/internal/pb/doc.go @@ -1,6 +1,3 @@ package pb //go:generate protoc --gogo_out=. header.proto - -// kludge to get vendoring right in protobuf output -//go:generate sed -i s,github.com/,github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/,g header.pb.go From 1afc5947f42b15f69855412884d87806bd014764 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 5 Sep 2018 01:59:19 -0400 Subject: [PATCH 2265/3147] gx update go-cid and fix code to use new Cid type This commit was moved from ipfs/go-verifcid@280ec1f79326f5f215afc8f5cec1061189ee9107 --- verifcid/validate.go | 2 +- verifcid/validate_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/verifcid/validate.go b/verifcid/validate.go index 34db44ffc6..8a76e4933e 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -48,7 +48,7 @@ func IsGoodHash(code uint64) bool { return false } -func ValidateCid(c *cid.Cid) error { +func ValidateCid(c cid.Cid) error { pref := c.Prefix() if !IsGoodHash(pref.MhType) { return ErrPossiblyInsecureHashFunction diff --git a/verifcid/validate_test.go b/verifcid/validate_test.go index 4b53ce183a..1d31e54648 100644 --- a/verifcid/validate_test.go +++ b/verifcid/validate_test.go @@ -32,7 +32,7 @@ func TestValidateCids(t *testing.T) { assertFalse(IsGoodHash(mh.BLAKE2B_MIN + 5)) - mhcid := func(code uint64, length int) *cid.Cid { + mhcid := func(code uint64, length int) cid.Cid { mhash, err := mh.Sum([]byte{}, code, length) if err != nil { t.Fatal(err) @@ -41,7 +41,7 @@ func TestValidateCids(t *testing.T) { } cases := []struct { - cid *cid.Cid + cid cid.Cid err error }{ {mhcid(mh.SHA2_256, 32), nil}, From 8870fa2f6cffc1e05b610495ca87c4b740a59856 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 5 Sep 2018 02:22:06 -0400 Subject: [PATCH 2266/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-ipfs-exchange-interface@91dc3c5ff63431d23400cd98b7130fec86c7011d --- exchange/interface.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 675592ffdf..42fe6a80b8 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -25,8 +25,8 @@ type Interface interface { // type Exchanger interface // Fetcher is an object that can be used to retrieve blocks type Fetcher interface { // GetBlock returns the block associated with a given key. - GetBlock(context.Context, *cid.Cid) (blocks.Block, error) - GetBlocks(context.Context, []*cid.Cid) (<-chan blocks.Block, error) + GetBlock(context.Context, cid.Cid) (blocks.Block, error) + GetBlocks(context.Context, []cid.Cid) (<-chan blocks.Block, error) } // SessionExchange is an exchange.Interface which supports From 436182628bf7237738f96b956a7e62ad07271cd3 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 6 Sep 2018 07:50:35 -0400 Subject: [PATCH 2267/3147] gx update go-cid and fix code to use new Cid type This commit was moved from ipfs/go-ipfs-ds-help@d7a1220589d9e516524318594c57fccb682e5e25 --- datastore/dshelp/key.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index b4ee6743c7..b4fff9891e 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -22,15 +22,15 @@ func BinaryFromDsKey(k datastore.Key) ([]byte, error) { } // CidToDsKey creates a Key from the given Cid. -func CidToDsKey(k *cid.Cid) datastore.Key { +func CidToDsKey(k cid.Cid) datastore.Key { return NewKeyFromBinary(k.Bytes()) } // DsKeyToCid converts the given Key to its corresponding Cid. -func DsKeyToCid(dsKey datastore.Key) (*cid.Cid, error) { +func DsKeyToCid(dsKey datastore.Key) (cid.Cid, error) { kb, err := BinaryFromDsKey(dsKey) if err != nil { - return nil, err + return cid.Cid{}, err } return cid.Cast(kb) } From aa38d5382e4849e10d4fce530ee5a0feda1e3c4f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 5 Sep 2018 02:54:36 -0400 Subject: [PATCH 2268/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-ipfs-blockstore@3666fad3f1e86477e13b7daf1ebe46e458e61d96 --- blockstore/arc_cache.go | 24 ++++++++++++------------ blockstore/arc_cache_test.go | 2 +- blockstore/blockstore.go | 26 +++++++++++++------------- blockstore/blockstore_test.go | 12 ++++++------ blockstore/bloom_cache.go | 16 ++++++++-------- blockstore/idstore.go | 12 ++++++------ 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 4339bb51fa..78e3135124 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -35,7 +35,7 @@ func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, return c, nil } -func (b *arccache) DeleteBlock(k *cid.Cid) error { +func (b *arccache) DeleteBlock(k cid.Cid) error { if has, _, ok := b.hasCached(k); ok && !has { return ErrNotFound } @@ -53,10 +53,10 @@ func (b *arccache) DeleteBlock(k *cid.Cid) error { // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained -func (b *arccache) hasCached(k *cid.Cid) (has bool, size int, ok bool) { +func (b *arccache) hasCached(k cid.Cid) (has bool, size int, ok bool) { b.total.Inc() - if k == nil { - log.Error("nil cid in arccache") + if !k.Defined() { + log.Error("undefined cid in arccache") // Return cache invalid so the call to blockstore happens // in case of invalid key and correct error is created. return false, -1, false @@ -75,7 +75,7 @@ func (b *arccache) hasCached(k *cid.Cid) (has bool, size int, ok bool) { return false, -1, false } -func (b *arccache) Has(k *cid.Cid) (bool, error) { +func (b *arccache) Has(k cid.Cid) (bool, error) { if has, _, ok := b.hasCached(k); ok { return has, nil } @@ -87,7 +87,7 @@ func (b *arccache) Has(k *cid.Cid) (bool, error) { return has, nil } -func (b *arccache) GetSize(k *cid.Cid) (int, error) { +func (b *arccache) GetSize(k cid.Cid) (int, error) { if _, blockSize, ok := b.hasCached(k); ok { return blockSize, nil } @@ -100,9 +100,9 @@ func (b *arccache) GetSize(k *cid.Cid) (int, error) { return blockSize, err } -func (b *arccache) Get(k *cid.Cid) (blocks.Block, error) { - if k == nil { - log.Error("nil cid in arc cache") +func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { + if !k.Defined() { + log.Error("undefined cid in arc cache") return nil, ErrNotFound } @@ -154,15 +154,15 @@ func (b *arccache) HashOnRead(enabled bool) { b.blockstore.HashOnRead(enabled) } -func (b *arccache) cacheHave(c *cid.Cid, have bool) { +func (b *arccache) cacheHave(c cid.Cid, have bool) { b.arc.Add(c.KeyString(), cacheHave(have)) } -func (b *arccache) cacheSize(c *cid.Cid, blockSize int) { +func (b *arccache) cacheSize(c cid.Cid, blockSize int) { b.arc.Add(c.KeyString(), cacheSize(blockSize)) } -func (b *arccache) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { +func (b *arccache) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.blockstore.AllKeysChan(ctx) } diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 2f8081957a..facbf3473e 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -153,7 +153,7 @@ func TestArcCreationFailure(t *testing.T) { func TestInvalidKey(t *testing.T) { arc, _, _ := createStores(t) - bl, err := arc.Get(nil) + bl, err := arc.Get(cid.Cid{}) if bl != nil { t.Fatal("blocks should be nil") diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 4dd670c9a1..6bb8e399d4 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -32,12 +32,12 @@ var ErrNotFound = errors.New("blockstore: block not found") // Blockstore wraps a Datastore block-centered methods and provides a layer // of abstraction which allows to add different caching strategies. type Blockstore interface { - DeleteBlock(*cid.Cid) error - Has(*cid.Cid) (bool, error) - Get(*cid.Cid) (blocks.Block, error) + DeleteBlock(cid.Cid) error + Has(cid.Cid) (bool, error) + Get(cid.Cid) (blocks.Block, error) // GetSize returns the CIDs mapped BlockSize - GetSize(*cid.Cid) (int, error) + GetSize(cid.Cid) (int, error) // Put puts a given block to the underlying datastore Put(blocks.Block) error @@ -49,7 +49,7 @@ type Blockstore interface { // AllKeysChan returns a channel from which // the CIDs in the Blockstore can be read. It should respect // the given context, closing the channel if it becomes Done. - AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) + AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. @@ -114,9 +114,9 @@ func (bs *blockstore) HashOnRead(enabled bool) { bs.rehash = enabled } -func (bs *blockstore) Get(k *cid.Cid) (blocks.Block, error) { - if k == nil { - log.Error("nil cid in blockstore") +func (bs *blockstore) Get(k cid.Cid) (blocks.Block, error) { + if !k.Defined() { + log.Error("undefined cid in blockstore") return nil, ErrNotFound } @@ -173,11 +173,11 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { return t.Commit() } -func (bs *blockstore) Has(k *cid.Cid) (bool, error) { +func (bs *blockstore) Has(k cid.Cid) (bool, error) { return bs.datastore.Has(dshelp.CidToDsKey(k)) } -func (bs *blockstore) GetSize(k *cid.Cid) (int, error) { +func (bs *blockstore) GetSize(k cid.Cid) (int, error) { bdata, err := bs.datastore.Get(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { return -1, ErrNotFound @@ -188,7 +188,7 @@ func (bs *blockstore) GetSize(k *cid.Cid) (int, error) { return len(bdata), nil } -func (bs *blockstore) DeleteBlock(k *cid.Cid) error { +func (bs *blockstore) DeleteBlock(k cid.Cid) error { err := bs.datastore.Delete(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { return ErrNotFound @@ -200,7 +200,7 @@ func (bs *blockstore) DeleteBlock(k *cid.Cid) error { // this is very simplistic, in the future, take dsq.Query as a param? // // AllKeysChan respects context. -func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { +func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true} @@ -209,7 +209,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return nil, err } - output := make(chan *cid.Cid, dsq.KeysOnlyBufSize) + output := make(chan cid.Cid, dsq.KeysOnlyBufSize) go func() { defer func() { res.Close() // ensure exit (signals early exit, too) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index ae71b541ae..d0fa739c25 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -29,7 +29,7 @@ func TestGetWhenKeyNotPresent(t *testing.T) { func TestGetWhenKeyIsNil(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) - _, err := bs.Get(nil) + _, err := bs.Get(cid.Cid{}) if err != ErrNotFound { t.Fail() } @@ -113,13 +113,13 @@ func TestHashOnRead(t *testing.T) { } } -func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []*cid.Cid) { +func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []cid.Cid) { if d == nil { d = ds.NewMapDatastore() } bs := NewBlockstore(ds_sync.MutexWrap(d)) - keys := make([]*cid.Cid, N) + keys := make([]cid.Cid, N) for i := 0; i < N; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) err := bs.Put(block) @@ -131,8 +131,8 @@ func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []* return bs, keys } -func collect(ch <-chan *cid.Cid) []*cid.Cid { - var keys []*cid.Cid +func collect(ch <-chan cid.Cid) []cid.Cid { + var keys []cid.Cid for k := range ch { keys = append(keys, k) } @@ -217,7 +217,7 @@ func TestAllKeysRespectsContext(t *testing.T) { } -func expectMatches(t *testing.T, expect, actual []*cid.Cid) { +func expectMatches(t *testing.T, expect, actual []cid.Cid) { if len(expect) != len(actual) { t.Errorf("expect and actual differ: %d != %d", len(expect), len(actual)) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 7e116890a4..c58120c362 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -97,7 +97,7 @@ func (b *bloomcache) Rebuild(ctx context.Context) { atomic.StoreInt32(&b.active, 1) } -func (b *bloomcache) DeleteBlock(k *cid.Cid) error { +func (b *bloomcache) DeleteBlock(k cid.Cid) error { if has, ok := b.hasCached(k); ok && !has { return ErrNotFound } @@ -107,10 +107,10 @@ func (b *bloomcache) DeleteBlock(k *cid.Cid) error { // if ok == false has is inconclusive // if ok == true then has respons to question: is it contained -func (b *bloomcache) hasCached(k *cid.Cid) (has bool, ok bool) { +func (b *bloomcache) hasCached(k cid.Cid) (has bool, ok bool) { b.total.Inc() - if k == nil { - log.Error("nil cid in bloom cache") + if !k.Defined() { + log.Error("undefined in bloom cache") // Return cache invalid so call to blockstore // in case of invalid key is forwarded deeper return false, false @@ -125,7 +125,7 @@ func (b *bloomcache) hasCached(k *cid.Cid) (has bool, ok bool) { return false, false } -func (b *bloomcache) Has(k *cid.Cid) (bool, error) { +func (b *bloomcache) Has(k cid.Cid) (bool, error) { if has, ok := b.hasCached(k); ok { return has, nil } @@ -133,11 +133,11 @@ func (b *bloomcache) Has(k *cid.Cid) (bool, error) { return b.blockstore.Has(k) } -func (b *bloomcache) GetSize(k *cid.Cid) (int, error) { +func (b *bloomcache) GetSize(k cid.Cid) (int, error) { return b.blockstore.GetSize(k) } -func (b *bloomcache) Get(k *cid.Cid) (blocks.Block, error) { +func (b *bloomcache) Get(k cid.Cid) (blocks.Block, error) { if has, ok := b.hasCached(k); ok && !has { return nil, ErrNotFound } @@ -173,7 +173,7 @@ func (b *bloomcache) HashOnRead(enabled bool) { b.blockstore.HashOnRead(enabled) } -func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { +func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.blockstore.AllKeysChan(ctx) } diff --git a/blockstore/idstore.go b/blockstore/idstore.go index a1ef4d60bf..2a5bf84156 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -17,7 +17,7 @@ func NewIdStore(bs Blockstore) Blockstore { return &idstore{bs} } -func extractContents(k *cid.Cid) (bool, []byte) { +func extractContents(k cid.Cid) (bool, []byte) { dmh, err := mh.Decode(k.Hash()) if err != nil || dmh.Code != mh.ID { return false, nil @@ -25,7 +25,7 @@ func extractContents(k *cid.Cid) (bool, []byte) { return true, dmh.Digest } -func (b *idstore) DeleteBlock(k *cid.Cid) error { +func (b *idstore) DeleteBlock(k cid.Cid) error { isId, _ := extractContents(k) if isId { return nil @@ -33,7 +33,7 @@ func (b *idstore) DeleteBlock(k *cid.Cid) error { return b.bs.DeleteBlock(k) } -func (b *idstore) Has(k *cid.Cid) (bool, error) { +func (b *idstore) Has(k cid.Cid) (bool, error) { isId, _ := extractContents(k) if isId { return true, nil @@ -41,7 +41,7 @@ func (b *idstore) Has(k *cid.Cid) (bool, error) { return b.bs.Has(k) } -func (b *idstore) GetSize(k *cid.Cid) (int, error) { +func (b *idstore) GetSize(k cid.Cid) (int, error) { isId, bdata := extractContents(k) if isId { return len(bdata), nil @@ -49,7 +49,7 @@ func (b *idstore) GetSize(k *cid.Cid) (int, error) { return b.bs.GetSize(k) } -func (b *idstore) Get(k *cid.Cid) (blocks.Block, error) { +func (b *idstore) Get(k cid.Cid) (blocks.Block, error) { isId, bdata := extractContents(k) if isId { return blocks.NewBlockWithCid(bdata, k) @@ -81,6 +81,6 @@ func (b *idstore) HashOnRead(enabled bool) { b.bs.HashOnRead(enabled) } -func (b *idstore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { +func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.bs.AllKeysChan(ctx) } From 6eda42b200bd4634e48eda602d64277c5d7febe1 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 5 Sep 2018 03:06:35 -0400 Subject: [PATCH 2269/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-ipfs-routing@4570f1ef2fd8509405ec81482927e3defb497b2a --- routing/mock/centralized_client.go | 6 +++--- routing/mock/centralized_server.go | 8 ++++---- routing/none/none_client.go | 4 ++-- routing/offline/offline.go | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index e3d488240b..49a3633000 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -34,7 +34,7 @@ func (c *client) GetValue(ctx context.Context, key string, opts ...ropts.Option) return c.vs.GetValue(ctx, key, opts...) } -func (c *client) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { +func (c *client) FindProviders(ctx context.Context, key cid.Cid) ([]pstore.PeerInfo, error) { return c.server.Providers(key), nil } @@ -43,7 +43,7 @@ func (c *client) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, er return pstore.PeerInfo{}, nil } -func (c *client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo { +func (c *client) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan pstore.PeerInfo { out := make(chan pstore.PeerInfo) go func() { defer close(out) @@ -63,7 +63,7 @@ func (c *client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <- // Provide returns once the message is on the network. Value is not necessarily // visible yet. -func (c *client) Provide(_ context.Context, key *cid.Cid, brd bool) error { +func (c *client) Provide(_ context.Context, key cid.Cid, brd bool) error { if !brd { return nil } diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index b869a4f439..a223f911b5 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -18,8 +18,8 @@ import ( // server is the mockrouting.Client's private interface to the routing server type server interface { - Announce(pstore.PeerInfo, *cid.Cid) error - Providers(*cid.Cid) []pstore.PeerInfo + Announce(pstore.PeerInfo, cid.Cid) error + Providers(cid.Cid) []pstore.PeerInfo Server } @@ -37,7 +37,7 @@ type providerRecord struct { Created time.Time } -func (rs *s) Announce(p pstore.PeerInfo, c *cid.Cid) error { +func (rs *s) Announce(p pstore.PeerInfo, c cid.Cid) error { rs.lock.Lock() defer rs.lock.Unlock() @@ -54,7 +54,7 @@ func (rs *s) Announce(p pstore.PeerInfo, c *cid.Cid) error { return nil } -func (rs *s) Providers(c *cid.Cid) []pstore.PeerInfo { +func (rs *s) Providers(c cid.Cid) []pstore.PeerInfo { rs.delayConf.Query.Wait() // before locking rs.lock.RLock() diff --git a/routing/none/none_client.go b/routing/none/none_client.go index a7c1f8fc95..e29ef36af7 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -30,13 +30,13 @@ func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, err return pstore.PeerInfo{}, nil } -func (c *nilclient) FindProvidersAsync(_ context.Context, _ *cid.Cid, _ int) <-chan pstore.PeerInfo { +func (c *nilclient) FindProvidersAsync(_ context.Context, _ cid.Cid, _ int) <-chan pstore.PeerInfo { out := make(chan pstore.PeerInfo) defer close(out) return out } -func (c *nilclient) Provide(_ context.Context, _ *cid.Cid, _ bool) error { +func (c *nilclient) Provide(_ context.Context, _ cid.Cid, _ bool) error { return nil } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index ebc96ef203..9b94176ccb 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -94,13 +94,13 @@ func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.Peer return pstore.PeerInfo{}, ErrOffline } -func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo { +func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan pstore.PeerInfo { out := make(chan pstore.PeerInfo) close(out) return out } -func (c *offlineRouting) Provide(_ context.Context, k *cid.Cid, _ bool) error { +func (c *offlineRouting) Provide(_ context.Context, k cid.Cid, _ bool) error { return ErrOffline } From dac30f5abb5428d69c1505c8ec20df0495683c6c Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 5 Sep 2018 03:10:18 -0400 Subject: [PATCH 2270/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-ipfs-exchange-offline@8704c1c197cf00bc5c2ecdef45307331001d8ad3 --- exchange/offline/offline.go | 6 +++--- exchange/offline/offline_test.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index c3a284c7e4..cb82b8a0a2 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -24,7 +24,7 @@ type offlineExchange struct { // GetBlock returns nil to signal that a block could not be retrieved for the // given key. // NB: This function may return before the timeout expires. -func (e *offlineExchange) GetBlock(_ context.Context, k *cid.Cid) (blocks.Block, error) { +func (e *offlineExchange) GetBlock(_ context.Context, k cid.Cid) (blocks.Block, error) { return e.bs.Get(k) } @@ -40,11 +40,11 @@ func (_ *offlineExchange) Close() error { return nil } -func (e *offlineExchange) GetBlocks(ctx context.Context, ks []*cid.Cid) (<-chan blocks.Block, error) { +func (e *offlineExchange) GetBlocks(ctx context.Context, ks []cid.Cid) (<-chan blocks.Block, error) { out := make(chan blocks.Block) go func() { defer close(out) - var misses []*cid.Cid + var misses []cid.Cid for _, k := range ks { hit, err := e.bs.Get(k) if err != nil { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 1592086216..3b84b8c1ee 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -51,8 +51,8 @@ func TestGetBlocks(t *testing.T) { } } - request := func() []*cid.Cid { - var ks []*cid.Cid + request := func() []cid.Cid { + var ks []cid.Cid for _, b := range expected { ks = append(ks, b.Cid()) From 0f8e872f07b7b8a0aa03b9d626ea026b9edf6e54 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 5 Sep 2018 03:12:54 -0400 Subject: [PATCH 2271/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-blockservice@4ba51bde1832b5a073f32a3438b4fc26eedf229c --- blockservice/blockservice.go | 22 +++++++++++----------- blockservice/test/blocks_test.go | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index d5c18824ab..a8d72e0d99 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -25,7 +25,7 @@ var ErrNotFound = errors.New("blockservice: key not found") // the blockservice. type BlockGetter interface { // GetBlock gets the requested block. - GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) + GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) // GetBlocks does a batch request for the given cids, returning blocks as // they are found, in no particular order. @@ -34,7 +34,7 @@ type BlockGetter interface { // be canceled). In that case, it will close the channel early. It is up // to the consumer to detect this situation and keep track which blocks // it has received and which it hasn't. - GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block + GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block } // BlockService is a hybrid block datastore. It stores data in a local @@ -58,7 +58,7 @@ type BlockService interface { AddBlocks(bs []blocks.Block) error // DeleteBlock deletes the given block from the blockservice. - DeleteBlock(o *cid.Cid) error + DeleteBlock(o cid.Cid) error } type blockService struct { @@ -196,7 +196,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). -func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { +func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", c) var f exchange.Fetcher @@ -207,7 +207,7 @@ func (s *blockService) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, return getBlock(ctx, c, s.blockstore, f) // hash security } -func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) (blocks.Block, error) { +func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) (blocks.Block, error) { err := verifcid.ValidateCid(c) // hash security if err != nil { return nil, err @@ -244,11 +244,11 @@ func getBlock(ctx context.Context, c *cid.Cid, bs blockstore.Blockstore, f excha // GetBlocks gets a list of blocks asynchronously and returns through // the returned channel. // NB: No guarantees are made about order. -func (s *blockService) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { +func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { return getBlocks(ctx, ks, s.blockstore, s.exchange) // hash security } -func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) <-chan blocks.Block { +func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) <-chan blocks.Block { out := make(chan blocks.Block) go func() { @@ -266,7 +266,7 @@ func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f e } ks = ks[:k] - var misses []*cid.Cid + var misses []cid.Cid for _, c := range ks { hit, err := bs.Get(c) if err != nil { @@ -303,7 +303,7 @@ func getBlocks(ctx context.Context, ks []*cid.Cid, bs blockstore.Blockstore, f e } // DeleteBlock deletes a block in the blockservice from the datastore -func (s *blockService) DeleteBlock(c *cid.Cid) error { +func (s *blockService) DeleteBlock(c cid.Cid) error { err := s.blockstore.DeleteBlock(c) if err == nil { log.Event(context.TODO(), "BlockService.BlockDeleted", c) @@ -323,12 +323,12 @@ type Session struct { } // GetBlock gets a block in the context of a request session -func (s *Session) GetBlock(ctx context.Context, c *cid.Cid) (blocks.Block, error) { +func (s *Session) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { return getBlock(ctx, c, s.bs, s.ses) // hash security } // GetBlocks gets blocks in the context of a request session -func (s *Session) GetBlocks(ctx context.Context, ks []*cid.Cid) <-chan blocks.Block { +func (s *Session) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { return getBlocks(ctx, ks, s.bs, s.ses) // hash security } diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index c3faa02c32..95f552d21e 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -71,7 +71,7 @@ func TestGetBlocksSequential(t *testing.T) { } objs := makeObjects(50) - var cids []*cid.Cid + var cids []cid.Cid for _, o := range objs { cids = append(cids, o.Cid()) servs[0].AddBlock(o) From d0d8aabc09a4de680b8f7ae00dd0fabdf164d295 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 7 Sep 2018 14:53:33 -0400 Subject: [PATCH 2272/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-path@5b015d978be6dc402ea14ba8e58a3f7547780f03 --- path/path.go | 8 ++++---- path/resolver/resolver.go | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/path/path.go b/path/path.go index 18c187bf0b..7754ef1ea4 100644 --- a/path/path.go +++ b/path/path.go @@ -36,7 +36,7 @@ func FromString(s string) Path { } // FromCid safely converts a cid.Cid type to a Path type. -func FromCid(c *cid.Cid) Path { +func FromCid(c cid.Cid) Path { return Path("/ipfs/" + c.String()) } @@ -160,7 +160,7 @@ func SplitList(pth string) []string { // SplitAbsPath clean up and split fpath. It extracts the first component (which // must be a Multihash) and return it separately. -func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { +func SplitAbsPath(fpath Path) (cid.Cid, []string, error) { parts := fpath.Segments() if parts[0] == "ipfs" || parts[0] == "ipld" { parts = parts[1:] @@ -168,13 +168,13 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) { // if nothing, bail. if len(parts) == 0 { - return nil, nil, ErrNoComponents + return cid.Cid{}, nil, ErrNoComponents } c, err := cid.Decode(parts[0]) // first element in the path is a cid if err != nil { - return nil, nil, err + return cid.Cid{}, nil, err } return c, parts[1:], nil diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index f5e3862a67..352004f52c 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -25,7 +25,7 @@ var ErrNoComponents = errors.New( // ErrNoLink is returned when a link is not found in a path type ErrNoLink struct { Name string - Node *cid.Cid + Node cid.Cid } // Error implements the Error interface for ErrNoLink with a useful @@ -57,10 +57,10 @@ func NewBasicResolver(ds ipld.DAGService) *Resolver { // ResolveToLastNode walks the given path and returns the cid of the last node // referenced by the path -func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (*cid.Cid, []string, error) { +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { c, p, err := path.SplitAbsPath(fpath) if err != nil { - return nil, nil, err + return cid.Cid{}, nil, err } if len(p) == 0 { @@ -69,7 +69,7 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (*cid nd, err := r.DAG.Get(ctx, c) if err != nil { - return nil, nil, err + return cid.Cid{}, nil, err } for len(p) > 0 { @@ -83,12 +83,12 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (*cid } if err != nil { - return nil, nil, err + return cid.Cid{}, nil, err } next, err := lnk.GetNode(ctx, r.DAG) if err != nil { - return nil, nil, err + return cid.Cid{}, nil, err } nd = next p = rest @@ -101,15 +101,15 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (*cid // Confirm the path exists within the object val, rest, err := nd.Resolve(p) if err != nil { - return nil, nil, err + return cid.Cid{}, nil, err } if len(rest) > 0 { - return nil, nil, errors.New("path failed to resolve fully") + return cid.Cid{}, nil, errors.New("path failed to resolve fully") } switch val.(type) { case *ipld.Link: - return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") + return cid.Cid{}, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") default: return nd.Cid(), p, nil } From 6df2631e8d955c0d977b246d8034ce62c0f0546e Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 7 Sep 2018 14:56:35 -0400 Subject: [PATCH 2273/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-unixfs@ba2e130f78a97b0f27f55758c4a75f4fb05d907d --- unixfs/io/pbdagreader.go | 6 +++--- unixfs/mod/dagmodifier.go | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 8e7872e8e6..5c44628505 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -29,7 +29,7 @@ type PBDagReader struct { promises []*ipld.NodePromise // the cid of each child of the current node - links []*cid.Cid + links []cid.Cid // the index of the child link currently being read from linkPosition int @@ -151,9 +151,9 @@ func (dr *PBDagReader) loadBufNode(node ipld.Node) error { } } -func getLinkCids(n ipld.Node) []*cid.Cid { +func getLinkCids(n ipld.Node) []cid.Cid { links := n.Links() - out := make([]*cid.Cid, 0, len(links)) + out := make([]cid.Cid, 0, len(links)) for _, l := range links { out = append(out, l.Cid) } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index 0f03cb6d3c..c217be5531 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -233,25 +233,25 @@ func (dm *DagModifier) Sync() error { // modifyDag writes the data in 'dm.wrBuf' over the data in 'node' starting at 'offset' // returns the new key of the passed in node. -func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { +func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (cid.Cid, error) { // If we've reached a leaf node. if len(n.Links()) == 0 { switch nd0 := n.(type) { case *mdag.ProtoNode: f, err := ft.FromBytes(nd0.Data()) if err != nil { - return nil, err + return cid.Cid{}, err } _, err = dm.wrBuf.Read(f.Data[offset:]) if err != nil && err != io.EOF { - return nil, err + return cid.Cid{}, err } // Update newly written node.. b, err := proto.Marshal(f) if err != nil { - return nil, err + return cid.Cid{}, err } nd := new(mdag.ProtoNode) @@ -259,7 +259,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { nd.SetCidBuilder(nd0.CidBuilder()) err = dm.dagserv.Add(dm.ctx, nd) if err != nil { - return nil, err + return cid.Cid{}, err } return nd.Cid(), nil @@ -273,7 +273,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { // copy in new data n, err := dm.wrBuf.Read(bytes[offset:]) if err != nil && err != io.EOF { - return nil, err + return cid.Cid{}, err } // copy remaining data @@ -284,11 +284,11 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { nd, err := mdag.NewRawNodeWPrefix(bytes, nd0.Cid().Prefix()) if err != nil { - return nil, err + return cid.Cid{}, err } err = dm.dagserv.Add(dm.ctx, nd) if err != nil { - return nil, err + return cid.Cid{}, err } return nd.Cid(), nil @@ -297,12 +297,12 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { node, ok := n.(*mdag.ProtoNode) if !ok { - return nil, ErrNotUnixfs + return cid.Cid{}, ErrNotUnixfs } f, err := ft.FromBytes(node.Data()) if err != nil { - return nil, err + return cid.Cid{}, err } var cur uint64 @@ -311,12 +311,12 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { if cur+bs > offset { child, err := node.Links()[i].GetNode(dm.ctx, dm.dagserv) if err != nil { - return nil, err + return cid.Cid{}, err } k, err := dm.modifyDag(child, offset-cur) if err != nil { - return nil, err + return cid.Cid{}, err } node.Links()[i].Cid = k @@ -324,7 +324,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) { // Recache serialized node _, err = node.EncodeProtobuf(true) if err != nil { - return nil, err + return cid.Cid{}, err } if dm.wrBuf.Len() == 0 { From bdc5f751aefcd5da3f0f80cd126c21a3bbeabf54 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Fri, 7 Sep 2018 15:00:42 -0400 Subject: [PATCH 2274/3147] gx update and fix code to use new Cid type This commit was moved from ipfs/go-mfs@8f366a5bd91f4ee9af08a5065fec5be704e388c2 --- mfs/mfs_test.go | 2 +- mfs/repub_test.go | 6 +++--- mfs/system.go | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 63c9bff630..e840f6c066 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -196,7 +196,7 @@ func setupRoot(ctx context.Context, t *testing.T) (ipld.DAGService, *Root) { ds := getDagserv(t) root := emptyDirNode() - rt, err := NewRoot(ctx, ds, root, func(ctx context.Context, c *cid.Cid) error { + rt, err := NewRoot(ctx, ds, root, func(ctx context.Context, c cid.Cid) error { fmt.Println("PUBLISHED: ", c) return nil }) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index cfc056a598..d81ffd04ef 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -18,7 +18,7 @@ func TestRepublisher(t *testing.T) { pub := make(chan struct{}) - pf := func(ctx context.Context, c *cid.Cid) error { + pf := func(ctx context.Context, c cid.Cid) error { pub <- struct{}{} return nil } @@ -29,7 +29,7 @@ func TestRepublisher(t *testing.T) { rp := NewRepublisher(ctx, pf, tshort, tlong) go rp.Run() - rp.Update(nil) + rp.Update(cid.Undef) // should hit short timeout select { @@ -42,7 +42,7 @@ func TestRepublisher(t *testing.T) { go func() { for { - rp.Update(nil) + rp.Update(cid.Undef) time.Sleep(time.Millisecond * 10) select { case <-cctx.Done(): diff --git a/mfs/system.go b/mfs/system.go index bd799880e9..100cfa4128 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -58,7 +58,7 @@ type Root struct { } // PubFunc is the function used by the `publish()` method. -type PubFunc func(context.Context, *cid.Cid) error +type PubFunc func(context.Context, cid.Cid) error // NewRoot creates a new Root and starts up a republisher routine for it. func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { @@ -182,8 +182,8 @@ type Republisher struct { cancel func() lk sync.Mutex - val *cid.Cid - lastpub *cid.Cid + val cid.Cid + lastpub cid.Cid } // NewRepublisher creates a new Republisher object to republish the given root @@ -201,7 +201,7 @@ func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration } } -func (p *Republisher) setVal(c *cid.Cid) { +func (p *Republisher) setVal(c cid.Cid) { p.lk.Lock() defer p.lk.Unlock() p.val = c @@ -231,7 +231,7 @@ func (p *Republisher) Close() error { // Touch signals that an update has occurred since the last publish. // Multiple consecutive touches may extend the time period before // the next Publish occurs in order to more efficiently batch updates. -func (np *Republisher) Update(c *cid.Cid) { +func (np *Republisher) Update(c cid.Cid) { np.setVal(c) select { case np.Publish <- struct{}{}: From ad5f80b075dabfcbe5d6949626c9e0e7b1e0563f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 11 Sep 2018 22:19:44 -0400 Subject: [PATCH 2275/3147] gx update and fix code to use new Cid type License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@e6e069367f018770ecaa997ba0d5f34e6c362319 --- pinning/pinner/gc/gc.go | 32 +++++++++--------- pinning/pinner/pin.go | 66 +++++++++++++++++++------------------- pinning/pinner/pin_test.go | 18 +++++------ pinning/pinner/set.go | 26 +++++++-------- pinning/pinner/set_test.go | 14 ++++---- 5 files changed, 78 insertions(+), 78 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 9628f7ad70..abb05f93c6 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" - bserv "gx/ipfs/QmQLG22wSEStiociTSKQpZAuuaaWoF1B3iKyjPFvWiTQ77/go-blockservice" + dag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + bserv "gx/ipfs/QmYHXfGs5GVxXN233aFr5Jenvd7NG4qZ7pmjfyz7yvG93m/go-blockservice" - offline "gx/ipfs/QmPuLWvxK1vg6ckKUpT53Dow9VLCcQGdL5Trwxa8PTLp7r/go-ipfs-exchange-offline" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" dstore "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - "gx/ipfs/QmVUhfewLZpSaAiBYCpw2krYMaiVmFuhr2iurQLuRoU6sD/go-verifcid" - ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - bstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" + "gx/ipfs/QmVkMRSkXrpjqrroEXWuYBvDBnXCdMMY6gsKicBGVGUqKT/go-verifcid" + offline "gx/ipfs/QmXHsHBveZF6ueKzDJbUg476gmrbzoR1yijiyH5SZAEuDT/go-ipfs-exchange-offline" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" + bstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" ) var log = logging.Logger("gc") @@ -25,7 +25,7 @@ var log = logging.Logger("gc") // Result represents an incremental output from a garbage collection // run. It contains either an error, or the cid of a removed object. type Result struct { - KeyRemoved *cid.Cid + KeyRemoved cid.Cid Error error } @@ -38,7 +38,7 @@ type Result struct { // // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { +func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []cid.Cid) <-chan Result { elock := log.EventBegin(ctx, "GC.lockWait") unlocker := bs.GCLock() @@ -130,8 +130,8 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn // Descendants recursively finds all the descendants of the given roots and // adds them to the given cid.Set, using the provided dag.GetLinks function // to walk the tree. -func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error { - verifyGetLinks := func(ctx context.Context, c *cid.Cid) ([]*ipld.Link, error) { +func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []cid.Cid) error { + verifyGetLinks := func(ctx context.Context, c cid.Cid) ([]*ipld.Link, error) { err := verifcid.ValidateCid(c) if err != nil { return nil, err @@ -168,12 +168,12 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots // ColoredSet computes the set of nodes in the graph that are pinned by the // pins in the given pinner. -func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffortRoots []*cid.Cid, output chan<- Result) (*cid.Set, error) { +func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffortRoots []cid.Cid, output chan<- Result) (*cid.Set, error) { // KeySet currently implemented in memory, in the future, may be bloom filter or // disk backed to conserve memory. errors := false gcs := cid.NewSet() - getLinks := func(ctx context.Context, cid *cid.Cid) ([]*ipld.Link, error) { + getLinks := func(ctx context.Context, cid cid.Cid) ([]*ipld.Link, error) { links, err := ipld.GetLinks(ctx, ng, cid) if err != nil { errors = true @@ -187,7 +187,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo output <- Result{Error: err} } - bestEffortGetLinks := func(ctx context.Context, cid *cid.Cid) ([]*ipld.Link, error) { + bestEffortGetLinks := func(ctx context.Context, cid cid.Cid) ([]*ipld.Link, error) { links, err := ipld.GetLinks(ctx, ng, cid) if err != nil && err != ipld.ErrNotFound { errors = true @@ -230,7 +230,7 @@ var ErrCannotDeleteSomeBlocks = errors.New("garbage collection incomplete: could // CannotFetchLinksError provides detailed information about which links // could not be fetched and can appear as a Result in the GC output channel. type CannotFetchLinksError struct { - Key *cid.Cid + Key cid.Cid Err error } @@ -244,7 +244,7 @@ func (e *CannotFetchLinksError) Error() string { // blocks could not be deleted and can appear as a Result in the GC output // channel. type CannotDeleteBlockError struct { - Key *cid.Cid + Key cid.Cid Err error } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index cff9e4ae5b..f4281667e6 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,19 +10,19 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" + mdag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) var log = logging.Logger("pin") var pinDatastoreKey = ds.NewKey("/local/pins") -var emptyKey *cid.Cid +var emptyKey cid.Cid func init() { e, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") @@ -105,50 +105,50 @@ func StringToMode(s string) (Mode, bool) { type Pinner interface { // IsPinned returns whether or not the given cid is pinned // and an explanation of why its pinned - IsPinned(*cid.Cid) (string, bool, error) + IsPinned(cid.Cid) (string, bool, error) // IsPinnedWithType returns whether or not the given cid is pinned with the // given pin type, as well as returning the type of pin its pinned with. - IsPinnedWithType(*cid.Cid, Mode) (string, bool, error) + IsPinnedWithType(cid.Cid, Mode) (string, bool, error) // Pin the given node, optionally recursively. Pin(ctx context.Context, node ipld.Node, recursive bool) error // Unpin the given cid. If recursive is true, removes either a recursive or // a direct pin. If recursive is false, only removes a direct pin. - Unpin(ctx context.Context, cid *cid.Cid, recursive bool) error + Unpin(ctx context.Context, cid cid.Cid, recursive bool) error // Update updates a recursive pin from one cid to another // this is more efficient than simply pinning the new one and unpinning the // old one - Update(ctx context.Context, from, to *cid.Cid, unpin bool) error + Update(ctx context.Context, from, to cid.Cid, unpin bool) error // Check if a set of keys are pinned, more efficient than // calling IsPinned for each key - CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) + CheckIfPinned(cids ...cid.Cid) ([]Pinned, error) // PinWithMode is for manually editing the pin structure. Use with // care! If used improperly, garbage collection may not be // successful. - PinWithMode(*cid.Cid, Mode) + PinWithMode(cid.Cid, Mode) // RemovePinWithMode is for manually editing the pin structure. // Use with care! If used improperly, garbage collection may not // be successful. - RemovePinWithMode(*cid.Cid, Mode) + RemovePinWithMode(cid.Cid, Mode) // Flush writes the pin state to the backing datastore Flush() error // DirectKeys returns all directly pinned cids - DirectKeys() []*cid.Cid + DirectKeys() []cid.Cid // DirectKeys returns all recursively pinned cids - RecursiveKeys() []*cid.Cid + RecursiveKeys() []cid.Cid // InternalPins returns all cids kept pinned for the internal state of the // pinner - InternalPins() []*cid.Cid + InternalPins() []cid.Cid } // Pinned represents CID which has been pinned with a pinning strategy. @@ -156,9 +156,9 @@ type Pinner interface { // case that the item is not pinned directly (but rather pinned recursively // by some ascendant). type Pinned struct { - Key *cid.Cid + Key cid.Cid Mode Mode - Via *cid.Cid + Via cid.Cid } // Pinned returns whether or not the given cid is pinned @@ -254,7 +254,7 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { var ErrNotPinned = fmt.Errorf("not pinned") // Unpin a given key -func (p *pinner) Unpin(ctx context.Context, c *cid.Cid, recursive bool) error { +func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() reason, pinned, err := p.isPinnedWithType(c, Any) @@ -279,13 +279,13 @@ func (p *pinner) Unpin(ctx context.Context, c *cid.Cid, recursive bool) error { } } -func (p *pinner) isInternalPin(c *cid.Cid) bool { +func (p *pinner) isInternalPin(c cid.Cid) bool { return p.internalPin.Has(c) } // IsPinned returns whether or not the given key is pinned // and an explanation of why its pinned -func (p *pinner) IsPinned(c *cid.Cid) (string, bool, error) { +func (p *pinner) IsPinned(c cid.Cid) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() return p.isPinnedWithType(c, Any) @@ -293,7 +293,7 @@ func (p *pinner) IsPinned(c *cid.Cid) (string, bool, error) { // IsPinnedWithType returns whether or not the given cid is pinned with the // given pin type, as well as returning the type of pin its pinned with. -func (p *pinner) IsPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) { +func (p *pinner) IsPinnedWithType(c cid.Cid, mode Mode) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() return p.isPinnedWithType(c, mode) @@ -301,7 +301,7 @@ func (p *pinner) IsPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) { // isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // intended for use by other pinned methods that already take locks -func (p *pinner) isPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) { +func (p *pinner) isPinnedWithType(c cid.Cid, mode Mode) (string, bool, error) { switch mode { case Any, Direct, Indirect, Recursive, Internal: default: @@ -346,7 +346,7 @@ func (p *pinner) isPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) { // CheckIfPinned Checks if a set of keys are pinned, more efficient than // calling IsPinned for each key, returns the pinned status of cid(s) -func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { +func (p *pinner) CheckIfPinned(cids ...cid.Cid) ([]Pinned, error) { p.lock.RLock() defer p.lock.RUnlock() pinned := make([]Pinned, 0, len(cids)) @@ -366,8 +366,8 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { } // Now walk all recursive pins to check for indirect pins - var checkChildren func(*cid.Cid, *cid.Cid) error - checkChildren = func(rk, parentKey *cid.Cid) error { + var checkChildren func(cid.Cid, cid.Cid) error + checkChildren = func(rk, parentKey cid.Cid) error { links, err := ipld.GetLinks(context.TODO(), p.dserv, parentKey) if err != nil { return err @@ -414,7 +414,7 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) { // RemovePinWithMode is for manually editing the pin structure. // Use with care! If used improperly, garbage collection may not // be successful. -func (p *pinner) RemovePinWithMode(c *cid.Cid, mode Mode) { +func (p *pinner) RemovePinWithMode(c cid.Cid, mode Mode) { p.lock.Lock() defer p.lock.Unlock() switch mode { @@ -428,7 +428,7 @@ func (p *pinner) RemovePinWithMode(c *cid.Cid, mode Mode) { } } -func cidSetWithValues(cids []*cid.Cid) *cid.Set { +func cidSetWithValues(cids []cid.Cid) *cid.Set { out := cid.NewSet() for _, c := range cids { out.Add(c) @@ -493,19 +493,19 @@ func LoadPinner(d ds.Datastore, dserv, internal ipld.DAGService) (Pinner, error) } // DirectKeys returns a slice containing the directly pinned keys -func (p *pinner) DirectKeys() []*cid.Cid { +func (p *pinner) DirectKeys() []cid.Cid { return p.directPin.Keys() } // RecursiveKeys returns a slice containing the recursively pinned keys -func (p *pinner) RecursiveKeys() []*cid.Cid { +func (p *pinner) RecursiveKeys() []cid.Cid { return p.recursePin.Keys() } // Update updates a recursive pin from one cid to another // this is more efficient than simply pinning the new one and unpinning the // old one -func (p *pinner) Update(ctx context.Context, from, to *cid.Cid, unpin bool) error { +func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error { p.lock.Lock() defer p.lock.Unlock() @@ -579,17 +579,17 @@ func (p *pinner) Flush() error { // InternalPins returns all cids kept pinned for the internal state of the // pinner -func (p *pinner) InternalPins() []*cid.Cid { +func (p *pinner) InternalPins() []cid.Cid { p.lock.Lock() defer p.lock.Unlock() - var out []*cid.Cid + var out []cid.Cid out = append(out, p.internalPin.Keys()...) return out } // PinWithMode allows the user to have fine grained control over pin // counts -func (p *pinner) PinWithMode(c *cid.Cid, mode Mode) { +func (p *pinner) PinWithMode(c cid.Cid, mode Mode) { p.lock.Lock() defer p.lock.Unlock() switch mode { @@ -602,7 +602,7 @@ func (p *pinner) PinWithMode(c *cid.Cid, mode Mode) { // hasChild recursively looks for a Cid among the children of a root Cid. // The visit function can be used to shortcut already-visited branches. -func hasChild(ng ipld.NodeGetter, root *cid.Cid, child *cid.Cid, visit func(*cid.Cid) bool) (bool, error) { +func hasChild(ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Cid) bool) (bool, error) { links, err := ipld.GetLinks(context.TODO(), ng, root) if err != nil { return false, err diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 4dc5e3565e..70bcd722b4 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,20 +5,20 @@ import ( "testing" "time" - mdag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" - bs "gx/ipfs/QmQLG22wSEStiociTSKQpZAuuaaWoF1B3iKyjPFvWiTQ77/go-blockservice" + mdag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + bs "gx/ipfs/QmYHXfGs5GVxXN233aFr5Jenvd7NG4qZ7pmjfyz7yvG93m/go-blockservice" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmPuLWvxK1vg6ckKUpT53Dow9VLCcQGdL5Trwxa8PTLp7r/go-ipfs-exchange-offline" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" + offline "gx/ipfs/QmXHsHBveZF6ueKzDJbUg476gmrbzoR1yijiyH5SZAEuDT/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() -func randNode() (*mdag.ProtoNode, *cid.Cid) { +func randNode() (*mdag.ProtoNode, cid.Cid) { nd := new(mdag.ProtoNode) nd.SetData(make([]byte, 32)) rand.Read(nd.Data()) @@ -26,7 +26,7 @@ func randNode() (*mdag.ProtoNode, *cid.Cid) { return nd, k } -func assertPinned(t *testing.T, p Pinner, c *cid.Cid, failmsg string) { +func assertPinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { _, pinned, err := p.IsPinned(c) if err != nil { t.Fatal(err) @@ -37,7 +37,7 @@ func assertPinned(t *testing.T, p Pinner, c *cid.Cid, failmsg string) { } } -func assertUnpinned(t *testing.T, p Pinner, c *cid.Cid, failmsg string) { +func assertUnpinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { _, pinned, err := p.IsPinned(c) if err != nil { t.Fatal(err) @@ -187,7 +187,7 @@ func TestIsPinnedLookup(t *testing.T) { p := NewPinner(dstore, dserv, dserv) aNodes := make([]*mdag.ProtoNode, aBranchLen) - aKeys := make([]*cid.Cid, aBranchLen) + aKeys := make([]cid.Cid, aBranchLen) for i := 0; i < aBranchLen; i++ { a, _ := randNode() if i >= 1 { diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index f0853d53a5..53d51d156c 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" + "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" - ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) @@ -25,7 +25,7 @@ const ( maxItems = 8192 ) -func hash(seed uint32, c *cid.Cid) uint32 { +func hash(seed uint32, c cid.Cid) uint32 { var buf [4]byte binary.LittleEndian.PutUint32(buf[:], seed) h := fnv.New32a() @@ -34,9 +34,9 @@ func hash(seed uint32, c *cid.Cid) uint32 { return h.Sum32() } -type itemIterator func() (c *cid.Cid, ok bool) +type itemIterator func() (c cid.Cid, ok bool) -type keyObserver func(*cid.Cid) +type keyObserver func(cid.Cid) type sortByHash struct { links []*ipld.Link @@ -97,7 +97,7 @@ func storeItems(ctx context.Context, dag ipld.DAGService, estimatedLen uint64, d sort.Stable(s) } - hashed := make([][]*cid.Cid, defaultFanout) + hashed := make([][]cid.Cid, defaultFanout) for { // This loop essentially enumerates every single item in the set // and maps them all into a set of buckets. Each bucket will be recursively @@ -238,7 +238,7 @@ func walkItems(ctx context.Context, dag ipld.DAGService, n *merkledag.ProtoNode, return nil } -func loadSet(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]*cid.Cid, error) { +func loadSet(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]cid.Cid, error) { l, err := root.GetNodeLink(name) if err != nil { return nil, err @@ -257,7 +257,7 @@ func loadSet(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode return nil, merkledag.ErrNotProtobuf } - var res []*cid.Cid + var res []cid.Cid walk := func(idx int, link *ipld.Link) error { res = append(res, link.Cid) return nil @@ -269,10 +269,10 @@ func loadSet(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode return res, nil } -func getCidListIterator(cids []*cid.Cid) itemIterator { - return func() (c *cid.Cid, ok bool) { +func getCidListIterator(cids []cid.Cid) itemIterator { + return func() (c cid.Cid, ok bool) { if len(cids) == 0 { - return nil, false + return cid.Cid{}, false } first := cids[0] @@ -281,7 +281,7 @@ func getCidListIterator(cids []*cid.Cid) itemIterator { } } -func storeSet(ctx context.Context, dag ipld.DAGService, cids []*cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { +func storeSet(ctx context.Context, dag ipld.DAGService, cids []cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { iter := getCidListIterator(cids) n, err := storeItems(ctx, dag, uint64(len(cids)), 0, iter, internalKeys) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e98025ed19..4a9f66d9cd 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,17 +5,17 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" - bserv "gx/ipfs/QmQLG22wSEStiociTSKQpZAuuaaWoF1B3iKyjPFvWiTQ77/go-blockservice" + dag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + bserv "gx/ipfs/QmYHXfGs5GVxXN233aFr5Jenvd7NG4qZ7pmjfyz7yvG93m/go-blockservice" - offline "gx/ipfs/QmPuLWvxK1vg6ckKUpT53Dow9VLCcQGdL5Trwxa8PTLp7r/go-ipfs-exchange-offline" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" + offline "gx/ipfs/QmXHsHBveZF6ueKzDJbUg476gmrbzoR1yijiyH5SZAEuDT/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" ) -func ignoreCids(_ *cid.Cid) {} +func ignoreCids(_ cid.Cid) {} func objCount(d ds.Datastore) int { q := dsq.Query{KeysOnly: true} @@ -46,7 +46,7 @@ func TestSet(t *testing.T) { // an infinite recursion and crash (OOM) limit := uint32((defaultFanout * maxItems) + 1) - var inputs []*cid.Cid + var inputs []cid.Cid buf := make([]byte, 4) for i := uint32(0); i < limit; i++ { binary.BigEndian.PutUint32(buf, i) From a48e694f9d8c710e4354c9818c46ae76d5fece00 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 11 Sep 2018 22:19:44 -0400 Subject: [PATCH 2276/3147] gx update and fix code to use new Cid type License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/interface-go-ipfs-core@bdbcb4cff02fb5502fc59563e5cb51c641261390 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/object.go | 6 +++--- coreiface/options/block.go | 2 +- coreiface/options/dag.go | 2 +- coreiface/path.go | 22 +++++++++++----------- coreiface/unixfs.go | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 9811b75be8..0053d472e6 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index d3270928c0..06bb91dce8 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) // DagOps groups operations that can be batched together diff --git a/coreiface/object.go b/coreiface/object.go index 750638a332..6b355a302a 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,14 +6,14 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) // ObjectStat provides information about dag nodes type ObjectStat struct { // Cid is the CID of the node - Cid *cid.Cid + Cid cid.Cid // NumLinks is number of links the node contains NumLinks int diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 36b3baa0eb..6603136f30 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -2,8 +2,8 @@ package options import ( "fmt" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" ) type BlockPutSettings struct { diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index 689bb5c532..4fdff0489c 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) type DagPutSettings struct { diff --git a/coreiface/path.go b/coreiface/path.go index c2b4cd8697..e11e20cf0a 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,9 +1,9 @@ package iface import ( - ipfspath "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + ipfspath "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) //TODO: merge with ipfspath so we don't depend on it @@ -65,7 +65,7 @@ type ResolvedPath interface { // * Calling Cid() will return `cidB` // * Calling Root() will return `cidRoot` // * Calling Remainder() will return `foo/bar` - Cid() *cid.Cid + Cid() cid.Cid // Root returns the CID of the root object of the path // @@ -74,7 +74,7 @@ type ResolvedPath interface { // "/ipfs/QmRoot/A/B", the Root method will return the CID of object QmRoot // // For more examples see the documentation of Cid() method - Root() *cid.Cid + Root() cid.Cid // Remainder returns unresolved part of the path // @@ -100,13 +100,13 @@ type path struct { // resolvedPath implements coreiface.resolvedPath type resolvedPath struct { path - cid *cid.Cid - root *cid.Cid + cid cid.Cid + root cid.Cid remainder string } // IpfsPath creates new /ipfs path from the provided CID -func IpfsPath(c *cid.Cid) ResolvedPath { +func IpfsPath(c cid.Cid) ResolvedPath { return &resolvedPath{ path: path{ipfspath.Path("/ipfs/" + c.String())}, cid: c, @@ -116,7 +116,7 @@ func IpfsPath(c *cid.Cid) ResolvedPath { } // IpldPath creates new /ipld path from the provided CID -func IpldPath(c *cid.Cid) ResolvedPath { +func IpldPath(c cid.Cid) ResolvedPath { return &resolvedPath{ path: path{ipfspath.Path("/ipld/" + c.String())}, cid: c, @@ -138,7 +138,7 @@ func ParsePath(p string) (Path, error) { // NewResolvedPath creates new ResolvedPath. This function performs no checks // and is intended to be used by resolver implementations. Incorrect inputs may // cause panics. Handle with care. -func NewResolvedPath(ipath ipfspath.Path, c *cid.Cid, root *cid.Cid, remainder string) ResolvedPath { +func NewResolvedPath(ipath ipfspath.Path, c cid.Cid, root cid.Cid, remainder string) ResolvedPath { return &resolvedPath{ path: path{ipath}, cid: c, @@ -163,11 +163,11 @@ func (p *path) Mutable() bool { return p.Namespace() == "ipns" } -func (p *resolvedPath) Cid() *cid.Cid { +func (p *resolvedPath) Cid() cid.Cid { return p.cid } -func (p *resolvedPath) Root() *cid.Cid { +func (p *resolvedPath) Root() cid.Cid { return p.root } diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 80f7ba3960..4a3aff6fc5 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,7 +4,7 @@ import ( "context" "io" - ipld "gx/ipfs/QmX5CsuHyVZeTLxgRSYkgLSDQKb9UjE8xnhQzCEJWWWFsC/go-ipld-format" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) // UnixfsAPI is the basic interface to immutable files in IPFS From 5507f3210c0b78dce571d0a0b9b20011bfd8c77a Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 11 Sep 2018 22:19:44 -0400 Subject: [PATCH 2277/3147] gx update and fix code to use new Cid type License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@0d3a5189bb9a920740be4b94201a5165c8670131 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 10 +++++----- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 2 +- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 8 ++++---- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 0047b434e3..fe044ffb4d 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 451521be42..9151ed64a8 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 4961c72d9c..e5e2ea1599 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index a638b5f817..221500e1cf 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index c5eda17378..7da72593c3 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,20 +6,20 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/mock" - offline "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/offline" + mockrouting "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/mock" + offline "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/offline" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" - ropts "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing/options" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" record "gx/ipfs/QmdHb9aBELnQKTVhvvA3hsQbRgUAwsWUzBP2vZ6Y5FBYvE/go-libp2p-record" + routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" + ropts "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing/options" pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" pstoremem "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore/pstoremem" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index 9b8e6bff62..410c7e65c8 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index cc213c9c5c..ac4887e366 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,12 +7,12 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" - "gx/ipfs/QmWAfTyD6KEBm7bzqNRBPvqKrZCDtn5PGbs9V1DKfnVK59/go-unixfs" + "gx/ipfs/QmPXzQ9LAFGZjcifFANCQFQiYt5SXgJziGoxUfJULVpHyA/go-unixfs" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - offroute "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/offline" + offroute "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/offline" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" diff --git a/namesys/proquint.go b/namesys/proquint.go index 2778590e59..dc2f8c2871 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 79be29e0d8..850f0bc94c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" - ft "gx/ipfs/QmWAfTyD6KEBm7bzqNRBPvqKrZCDtn5PGbs9V1DKfnVK59/go-unixfs" + ft "gx/ipfs/QmPXzQ9LAFGZjcifFANCQFQiYt5SXgJziGoxUfJULVpHyA/go-unixfs" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsquery "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" + routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 5df344af92..268a228930 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -9,12 +9,12 @@ import ( ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/mock" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" + dshelp "gx/ipfs/QmXejiSr776HgKLEGSs7unW7GT82AgfMbQX5crfSybGU8b/go-ipfs-ds-help" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" - dshelp "gx/ipfs/Qmf1xGr3SyBpiPp3ZDuKkYMh4gnRk9K4QnbL17kstnf35h/go-ipfs-ds-help" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 29a5fa745b..17f5c5d30b 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index be62d10cb6..83e294d897 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmUEqyXr97aUbNmQADHYNknjwjjdVpJXEt1UZXmSG81EV4/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index b865988277..41821a2bff 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmRuUsZEg2WLCuidJGHVmE1NreHDmXWKLS466PKyDpXMhN/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/mock" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" diff --git a/namesys/routing.go b/namesys/routing.go index 4936572813..b02ffc155a 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,16 +6,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNgXoHgXU1HzNb2HEZmRww9fDKE9NfDsvQwWLHiKHpvKM/go-path" + path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - dht "gx/ipfs/QmRNxiPpZf3skMAtmDJpgHuW9uj1ukqV1zjANj9d6bmHfE/go-libp2p-kad-dht" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - routing "gx/ipfs/QmY9JUvS8kbgao3XbPh6WAV3ChE2nxGKhcGTHiwMC4gmcU/go-libp2p-routing" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + dht "gx/ipfs/QmaXYSwxqJsX3EoGb1ZV2toZ9fXc8hWJPaBW1XAp1h2Tsp/go-libp2p-kad-dht" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" + routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From 749717e16376ae14c664b7468fb0138a21ae81f6 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Tue, 11 Sep 2018 22:19:44 -0400 Subject: [PATCH 2278/3147] gx update and fix code to use new Cid type License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@4baf8a5628fdacb38b57678326aa434c1de0f279 --- filestore/filestore.go | 20 ++++++++++---------- filestore/filestore_test.go | 14 +++++++------- filestore/fsrefstore.go | 30 +++++++++++++++--------------- filestore/util.go | 24 ++++++++++++------------ 4 files changed, 44 insertions(+), 44 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index a24839d2ed..345aaa2bc3 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,12 +11,12 @@ import ( "context" "errors" + posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - blocks "gx/ipfs/QmWAzSEoqZ6xU6pu8yL8e5WaMb7wtbfbhhN4p1DknUPtr3/go-block-format" - posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" + blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" ) var log = logging.Logger("filestore") @@ -49,7 +49,7 @@ func NewFilestore(bs blockstore.Blockstore, fm *FileManager) *Filestore { // AllKeysChan returns a channel from which to read the keys stored in // the blockstore. If the given context is cancelled the channel will be closed. -func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { +func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { ctx, cancel := context.WithCancel(ctx) a, err := f.bs.AllKeysChan(ctx) @@ -58,7 +58,7 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { return nil, err } - out := make(chan *cid.Cid, dsq.KeysOnlyBufSize) + out := make(chan cid.Cid, dsq.KeysOnlyBufSize) go func() { defer cancel() defer close(out) @@ -115,7 +115,7 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { // blockstore. As expected, in the case of FileManager blocks, only the // reference is deleted, not its contents. It may return // ErrNotFound when the block is not stored. -func (f *Filestore) DeleteBlock(c *cid.Cid) error { +func (f *Filestore) DeleteBlock(c cid.Cid) error { err1 := f.bs.DeleteBlock(c) if err1 != nil && err1 != blockstore.ErrNotFound { return err1 @@ -140,7 +140,7 @@ func (f *Filestore) DeleteBlock(c *cid.Cid) error { // Get retrieves the block with the given Cid. It may return // ErrNotFound when the block is not stored. -func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { +func (f *Filestore) Get(c cid.Cid) (blocks.Block, error) { blk, err := f.bs.Get(c) switch err { case nil: @@ -154,7 +154,7 @@ func (f *Filestore) Get(c *cid.Cid) (blocks.Block, error) { // GetSize returns the size of the requested block. It may return ErrNotFound // when the block is not stored. -func (f *Filestore) GetSize(c *cid.Cid) (int, error) { +func (f *Filestore) GetSize(c cid.Cid) (int, error) { size, err := f.bs.GetSize(c) switch err { case nil: @@ -168,7 +168,7 @@ func (f *Filestore) GetSize(c *cid.Cid) (int, error) { // Has returns true if the block with the given Cid is // stored in the Filestore. -func (f *Filestore) Has(c *cid.Cid) (bool, error) { +func (f *Filestore) Has(c cid.Cid) (bool, error) { has, err := f.bs.Has(c) if err != nil { return false, err diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 83eeb69b9f..4c1e3f5c12 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmNr4E8z9bGTztvHJktp7uQaMdx9p3r9Asrq6eYk7iCh4a/go-merkledag" + dag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" + blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { @@ -55,7 +55,7 @@ func TestBasicFilestore(t *testing.T) { t.Fatal(err) } - var cids []*cid.Cid + var cids []cid.Cid for i := 0; i < 100; i++ { n := &posinfo.FilestoreNode{ PosInfo: &posinfo.PosInfo{ @@ -104,7 +104,7 @@ func TestBasicFilestore(t *testing.T) { } } -func randomFileAdd(t *testing.T, fs *Filestore, dir string, size int) (string, []*cid.Cid) { +func randomFileAdd(t *testing.T, fs *Filestore, dir string, size int) (string, []cid.Cid) { buf := make([]byte, size) rand.Read(buf) @@ -113,7 +113,7 @@ func randomFileAdd(t *testing.T, fs *Filestore, dir string, size int) (string, [ t.Fatal(err) } - var out []*cid.Cid + var out []cid.Cid for i := 0; i < size/10; i++ { n := &posinfo.FilestoreNode{ PosInfo: &posinfo.PosInfo{ diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 87ceda15d9..9608e3af02 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,15 +10,15 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsns "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/namespace" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - blocks "gx/ipfs/QmWAzSEoqZ6xU6pu8yL8e5WaMb7wtbfbhhN4p1DknUPtr3/go-block-format" - posinfo "gx/ipfs/QmXD4grfThQ4LwVoEEfe4dgR7ukmbV9TppM5Q4SPowp7hU/go-ipfs-posinfo" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" + dshelp "gx/ipfs/QmXejiSr776HgKLEGSs7unW7GT82AgfMbQX5crfSybGU8b/go-ipfs-ds-help" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" - dshelp "gx/ipfs/Qmf1xGr3SyBpiPp3ZDuKkYMh4gnRk9K4QnbL17kstnf35h/go-ipfs-ds-help" + blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" ) // FilestorePrefix identifies the key prefix for FileManager blocks. @@ -60,7 +60,7 @@ func NewFileManager(ds ds.Batching, root string) *FileManager { // AllKeysChan returns a channel from which to read the keys stored in // the FileManager. If the given context is cancelled the channel will be // closed. -func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) { +func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { q := dsq.Query{KeysOnly: true} res, err := f.ds.Query(q) @@ -68,7 +68,7 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) return nil, err } - out := make(chan *cid.Cid, dsq.KeysOnlyBufSize) + out := make(chan cid.Cid, dsq.KeysOnlyBufSize) go func() { defer close(out) for { @@ -97,7 +97,7 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan *cid.Cid, error) // DeleteBlock deletes the reference-block from the underlying // datastore. It does not touch the referenced data. -func (f *FileManager) DeleteBlock(c *cid.Cid) error { +func (f *FileManager) DeleteBlock(c cid.Cid) error { err := f.ds.Delete(dshelp.CidToDsKey(c)) if err == ds.ErrNotFound { return blockstore.ErrNotFound @@ -109,7 +109,7 @@ func (f *FileManager) DeleteBlock(c *cid.Cid) error { // is done in two steps: the first step retrieves the reference // block from the datastore. The second step uses the stored // path and offsets to read the raw block data directly from disk. -func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { +func (f *FileManager) Get(c cid.Cid) (blocks.Block, error) { dobj, err := f.getDataObj(c) if err != nil { return nil, err @@ -126,7 +126,7 @@ func (f *FileManager) Get(c *cid.Cid) (blocks.Block, error) { // // This method may successfully return the size even if returning the block // would fail because the associated file is no longer available. -func (f *FileManager) GetSize(c *cid.Cid) (int, error) { +func (f *FileManager) GetSize(c cid.Cid) (int, error) { dobj, err := f.getDataObj(c) if err != nil { return -1, err @@ -134,14 +134,14 @@ func (f *FileManager) GetSize(c *cid.Cid) (int, error) { return int(dobj.GetSize_()), nil } -func (f *FileManager) readDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { if IsURL(d.GetFilePath()) { return f.readURLDataObj(c, d) } return f.readFileDataObj(c, d) } -func (f *FileManager) getDataObj(c *cid.Cid) (*pb.DataObj, error) { +func (f *FileManager) getDataObj(c cid.Cid) (*pb.DataObj, error) { o, err := f.ds.Get(dshelp.CidToDsKey(c)) switch err { case ds.ErrNotFound: @@ -164,7 +164,7 @@ func unmarshalDataObj(data []byte) (*pb.DataObj, error) { return &dobj, nil } -func (f *FileManager) readFileDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readFileDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { if !f.AllowFiles { return nil, ErrFilestoreNotEnabled } @@ -207,7 +207,7 @@ func (f *FileManager) readFileDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) } // reads and verifies the block from URL -func (f *FileManager) readURLDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readURLDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { if !f.AllowUrls { return nil, ErrUrlstoreNotEnabled } @@ -252,7 +252,7 @@ func (f *FileManager) readURLDataObj(c *cid.Cid, d *pb.DataObj) ([]byte, error) // Has returns if the FileManager is storing a block reference. It does not // validate the data, nor checks if the reference is valid. -func (f *FileManager) Has(c *cid.Cid) (bool, error) { +func (f *FileManager) Has(c cid.Cid) (bool, error) { // NOTE: interesting thing to consider. Has doesnt validate the data. // So the data on disk could be invalid, and we could think we have it. dsk := dshelp.CidToDsKey(c) diff --git a/filestore/util.go b/filestore/util.go index ea7f06ff03..8defb2c04e 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - cid "gx/ipfs/QmZFbDTY9jfSBms2MchvYM9oYRbAF19K7Pby47yDBfpPrb/go-cid" - blockstore "gx/ipfs/Qmeg56ecxRnVv7VWViMrDeEMoBHaNFMs4vQnyQrJ79Zz7i/go-ipfs-blockstore" - dshelp "gx/ipfs/Qmf1xGr3SyBpiPp3ZDuKkYMh4gnRk9K4QnbL17kstnf35h/go-ipfs-ds-help" + dshelp "gx/ipfs/QmXejiSr776HgKLEGSs7unW7GT82AgfMbQX5crfSybGU8b/go-ipfs-ds-help" + blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" ) // Status is used to identify the state of the block data referenced @@ -60,7 +60,7 @@ func (s Status) Format() string { type ListRes struct { Status Status ErrorMsg string - Key *cid.Cid + Key cid.Cid FilePath string Offset uint64 Size uint64 @@ -69,7 +69,7 @@ type ListRes struct { // FormatLong returns a human readable string for a ListRes object. func (r *ListRes) FormatLong() string { switch { - case r.Key == nil: + case !r.Key.Defined(): return "" case r.FilePath == "": return r.Key.String() @@ -82,7 +82,7 @@ func (r *ListRes) FormatLong() string { // of the given Filestore and returns a ListRes object with the information. // List does not verify that the reference is valid or whether the // raw data is accesible. See Verify(). -func List(fs *Filestore, key *cid.Cid) *ListRes { +func List(fs *Filestore, key cid.Cid) *ListRes { return list(fs, false, key) } @@ -101,7 +101,7 @@ func ListAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { // of the given Filestore and returns a ListRes object with the information. // Verify makes sure that the reference is valid and the block data can be // read. -func Verify(fs *Filestore, key *cid.Cid) *ListRes { +func Verify(fs *Filestore, key cid.Cid) *ListRes { return list(fs, true, key) } @@ -116,7 +116,7 @@ func VerifyAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { return listAll(fs, true) } -func list(fs *Filestore, verify bool, key *cid.Cid) *ListRes { +func list(fs *Filestore, verify bool, key cid.Cid) *ListRes { dobj, err := fs.fm.getDataObj(key) if err != nil { return mkListRes(key, nil, err) @@ -145,16 +145,16 @@ func listAll(fs *Filestore, verify bool) (func() *ListRes, error) { }, nil } -func next(qr dsq.Results) (*cid.Cid, *pb.DataObj, error) { +func next(qr dsq.Results) (cid.Cid, *pb.DataObj, error) { v, ok := qr.NextSync() if !ok { - return nil, nil, nil + return cid.Cid{}, nil, nil } k := ds.RawKey(v.Key) c, err := dshelp.DsKeyToCid(k) if err != nil { - return nil, nil, fmt.Errorf("decoding cid from filestore: %s", err) + return cid.Cid{}, nil, fmt.Errorf("decoding cid from filestore: %s", err) } dobj, err := unmarshalDataObj(v.Value) @@ -252,7 +252,7 @@ func (l listEntries) Less(i, j int) bool { return l[i].filePath < l[j].filePath } -func mkListRes(c *cid.Cid, d *pb.DataObj, err error) *ListRes { +func mkListRes(c cid.Cid, d *pb.DataObj, err error) *ListRes { status := StatusOk errorMsg := "" if err != nil { From 5051644a10e53ba10a145b6dc513433aaab62102 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 11 Sep 2018 20:34:52 -0700 Subject: [PATCH 2279/3147] gx: fix hashes (some extra files got committed) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@1390dbff290f62170fac61abe78094383ec27c22 --- pinning/pinner/gc/gc.go | 8 ++++---- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 8 ++++---- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 8 ++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index abb05f93c6..f79d11ebd5 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" - bserv "gx/ipfs/QmYHXfGs5GVxXN233aFr5Jenvd7NG4qZ7pmjfyz7yvG93m/go-blockservice" + dag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" + bserv "gx/ipfs/Qma2KhbQarYTkmSJAeaMGRAg8HAXAhEWK8ge4SReG7ZSD3/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" dstore "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" "gx/ipfs/QmVkMRSkXrpjqrroEXWuYBvDBnXCdMMY6gsKicBGVGUqKT/go-verifcid" - offline "gx/ipfs/QmXHsHBveZF6ueKzDJbUg476gmrbzoR1yijiyH5SZAEuDT/go-ipfs-exchange-offline" + offline "gx/ipfs/QmcRC35JF2pJQneAxa5LdQBQRumWggccWErogSrCkS1h8T/go-ipfs-exchange-offline" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" - bstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" + bstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index f4281667e6..692ae24d70 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + mdag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 70bcd722b4..b54f8a1326 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - mdag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" - bs "gx/ipfs/QmYHXfGs5GVxXN233aFr5Jenvd7NG4qZ7pmjfyz7yvG93m/go-blockservice" + mdag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" + bs "gx/ipfs/Qma2KhbQarYTkmSJAeaMGRAg8HAXAhEWK8ge4SReG7ZSD3/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - offline "gx/ipfs/QmXHsHBveZF6ueKzDJbUg476gmrbzoR1yijiyH5SZAEuDT/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" + offline "gx/ipfs/QmcRC35JF2pJQneAxa5LdQBQRumWggccWErogSrCkS1h8T/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 53d51d156c..9d76177c76 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 4a9f66d9cd..e9aacf6aa5 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" - bserv "gx/ipfs/QmYHXfGs5GVxXN233aFr5Jenvd7NG4qZ7pmjfyz7yvG93m/go-blockservice" + dag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" + bserv "gx/ipfs/Qma2KhbQarYTkmSJAeaMGRAg8HAXAhEWK8ge4SReG7ZSD3/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - offline "gx/ipfs/QmXHsHBveZF6ueKzDJbUg476gmrbzoR1yijiyH5SZAEuDT/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" + offline "gx/ipfs/QmcRC35JF2pJQneAxa5LdQBQRumWggccWErogSrCkS1h8T/go-ipfs-exchange-offline" + blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) func ignoreCids(_ cid.Cid) {} From 91297a54c6b70a51fdea8f98c646e4191fc5d9ae Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 11 Sep 2018 20:34:52 -0700 Subject: [PATCH 2280/3147] gx: fix hashes (some extra files got committed) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@dec563d93e818189ec52f7eeeb70128c1c62deae --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index e11e20cf0a..c61b335337 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + ipfspath "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From b34ab7a8f20637097a5387924e1114e523d3b534 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 11 Sep 2018 20:34:52 -0700 Subject: [PATCH 2281/3147] gx: fix hashes (some extra files got committed) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@973f7804e616373794f97793a397714ffb3627e5 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 6 +++--- namesys/namesys.go | 2 +- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/publisher_test.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 2 +- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index fe044ffb4d..d7b87b36a5 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 9151ed64a8..f908270914 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index e5e2ea1599..ec36b7f1a9 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 221500e1cf..87e0f1abfd 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 7da72593c3..f796f7ac22 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,14 +6,14 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/mock" - offline "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/offline" + mockrouting "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/mock" + offline "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/offline" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" diff --git a/namesys/namesys.go b/namesys/namesys.go index 410c7e65c8..1b9a1574e5 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index ac4887e366..e4ee7b2d33 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,12 +7,12 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmPXzQ9LAFGZjcifFANCQFQiYt5SXgJziGoxUfJULVpHyA/go-unixfs" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + "gx/ipfs/QmPL8bYtbACcSFFiSr4s2du7Na382NxRADR8hC7D9FkEA2/go-unixfs" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - offroute "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/offline" + offroute "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/offline" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" diff --git a/namesys/proquint.go b/namesys/proquint.go index dc2f8c2871..a0ad3ce656 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 850f0bc94c..8655d4ac75 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmPXzQ9LAFGZjcifFANCQFQiYt5SXgJziGoxUfJULVpHyA/go-unixfs" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + ft "gx/ipfs/QmPL8bYtbACcSFFiSr4s2du7Na382NxRADR8hC7D9FkEA2/go-unixfs" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 268a228930..3b444cab9a 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,13 +6,13 @@ import ( "testing" "time" + dshelp "gx/ipfs/QmPQ7bVbZAbGaJkBVJeTkkKXvLLZeN9CLWTf5fzUQ8yeWs/go-ipfs-ds-help" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/mock" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - dshelp "gx/ipfs/QmXejiSr776HgKLEGSs7unW7GT82AgfMbQX5crfSybGU8b/go-ipfs-ds-help" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 17f5c5d30b..8ee200295c 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 83e294d897..babdd9d548 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmUEqyXr97aUbNmQADHYNknjwjjdVpJXEt1UZXmSG81EV4/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 41821a2bff..b0351214b6 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmSbZCrt5cSiCNcXFZKoGjukcEf4DRdTzexqzEWATZDdz6/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/mock" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" diff --git a/namesys/routing.go b/namesys/routing.go index b02ffc155a..8d78617997 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRYx6fJzTWFoeTo3qQn64iDrVC154Gy9waQDhvKRr2ND3/go-path" + path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" From bcd6c971f9fd61568aea1b7fa49d5e514cb14de6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 11 Sep 2018 20:34:52 -0700 Subject: [PATCH 2282/3147] gx: fix hashes (some extra files got committed) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@131564f7eba468da4e1658bac299c1a9252ac602 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 4 ++-- filestore/util.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 345aaa2bc3..596e2b4887 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -16,7 +16,7 @@ import ( logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" + blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 4c1e3f5c12..425bbf5549 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmURqt1jB9Yu3X4Tr9WQJf36QGN7vi8mGTzjnX2ij1CJwC/go-merkledag" + dag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" + blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 9608e3af02..8bf001af94 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,14 +11,14 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" + dshelp "gx/ipfs/QmPQ7bVbZAbGaJkBVJeTkkKXvLLZeN9CLWTf5fzUQ8yeWs/go-ipfs-ds-help" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsns "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/namespace" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - dshelp "gx/ipfs/QmXejiSr776HgKLEGSs7unW7GT82AgfMbQX5crfSybGU8b/go-ipfs-ds-help" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" + blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 8defb2c04e..60a2a72d76 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" + dshelp "gx/ipfs/QmPQ7bVbZAbGaJkBVJeTkkKXvLLZeN9CLWTf5fzUQ8yeWs/go-ipfs-ds-help" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - dshelp "gx/ipfs/QmXejiSr776HgKLEGSs7unW7GT82AgfMbQX5crfSybGU8b/go-ipfs-ds-help" - blockstore "gx/ipfs/QmeMussyD8s3fQ3pM19ZsfbxvomEqPV9FvczLMWyBDYSnS/go-ipfs-blockstore" + blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) // Status is used to identify the state of the block data referenced From 2274369ddc5a1637c99e46b563d047dc3491dd6b Mon Sep 17 00:00:00 2001 From: Overbool Date: Thu, 13 Sep 2018 13:53:08 +0800 Subject: [PATCH 2283/3147] fix(pin): goroutine leaks License: MIT Signed-off-by: Overbool This commit was moved from ipfs/go-ipfs-pinner@b451f6fa3ad78821564fdf94135f11d600f85645 --- pinning/pinner/gc/gc.go | 46 +++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index f79d11ebd5..d3c8d40f25 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -58,7 +58,10 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots, output) if err != nil { - output <- Result{Error: err} + select { + case output <- Result{Error: err}: + case <-ctx.Done(): + } return } emark.Append(logging.LoggableMap{ @@ -69,7 +72,10 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn keychan, err := bs.AllKeysChan(ctx) if err != nil { - output <- Result{Error: err} + select { + case output <- Result{Error: err}: + case <-ctx.Done(): + } return } @@ -108,7 +114,11 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn }) esweep.Done() if errors { - output <- Result{Error: ErrCannotDeleteSomeBlocks} + select { + case output <- Result{Error: ErrCannotDeleteSomeBlocks}: + case <-ctx.Done(): + return + } } defer log.EventBegin(ctx, "GC.datastore").Done() @@ -119,7 +129,10 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn err = gds.CollectGarbage() if err != nil { - output <- Result{Error: err} + select { + case output <- Result{Error: err}: + case <-ctx.Done(): + } return } }() @@ -177,28 +190,40 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo links, err := ipld.GetLinks(ctx, ng, cid) if err != nil { errors = true - output <- Result{Error: &CannotFetchLinksError{cid, err}} + select { + case output <- Result{Error: &CannotFetchLinksError{cid, err}}: + case <-ctx.Done(): + } } return links, nil } err := Descendants(ctx, getLinks, gcs, pn.RecursiveKeys()) if err != nil { errors = true - output <- Result{Error: err} + select { + case output <- Result{Error: err}: + case <-ctx.Done(): + } } bestEffortGetLinks := func(ctx context.Context, cid cid.Cid) ([]*ipld.Link, error) { links, err := ipld.GetLinks(ctx, ng, cid) if err != nil && err != ipld.ErrNotFound { errors = true - output <- Result{Error: &CannotFetchLinksError{cid, err}} + select { + case output <- Result{Error: &CannotFetchLinksError{cid, err}}: + case <-ctx.Done(): + } } return links, nil } err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) if err != nil { errors = true - output <- Result{Error: err} + select { + case output <- Result{Error: err}: + case <-ctx.Done(): + } } for _, k := range pn.DirectKeys() { @@ -208,7 +233,10 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo err = Descendants(ctx, getLinks, gcs, pn.InternalPins()) if err != nil { errors = true - output <- Result{Error: err} + select { + case output <- Result{Error: err}: + case <-ctx.Done(): + } } if errors { From 01423f6df03c1418e758da67d4658d42830b0c09 Mon Sep 17 00:00:00 2001 From: Overbool Date: Fri, 14 Sep 2018 09:07:14 +0800 Subject: [PATCH 2284/3147] feat(pin): return err when ctx.Done License: MIT Signed-off-by: Overbool This commit was moved from ipfs/go-ipfs-pinner@303cae9acea6685b7f73f8d651ff413a0ece197b --- pinning/pinner/gc/gc.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index d3c8d40f25..7c196009fa 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -193,6 +193,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo select { case output <- Result{Error: &CannotFetchLinksError{cid, err}}: case <-ctx.Done(): + return nil, ctx.Err() } } return links, nil @@ -203,6 +204,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo select { case output <- Result{Error: err}: case <-ctx.Done(): + return nil, ctx.Err() } } @@ -213,6 +215,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo select { case output <- Result{Error: &CannotFetchLinksError{cid, err}}: case <-ctx.Done(): + return nil, ctx.Err() } } return links, nil @@ -223,6 +226,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo select { case output <- Result{Error: err}: case <-ctx.Done(): + return nil, ctx.Err() } } @@ -236,6 +240,7 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo select { case output <- Result{Error: err}: case <-ctx.Done(): + return nil, ctx.Err() } } From c717873fb58d91ac1fb4665628f351092d7c6675 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 16 Sep 2018 00:11:00 -0700 Subject: [PATCH 2285/3147] Avoid allocating a session unless we need it This commit was moved from ipfs/go-blockservice@8819f05e9f18ea89cf7f125edac566529d76f703 --- blockservice/blockservice.go | 46 ++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index a8d72e0d99..2e1de3f7a1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "io" + "sync" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" @@ -116,8 +117,9 @@ func NewSession(ctx context.Context, bs BlockService) *Session { if sessEx, ok := exch.(exchange.SessionExchange); ok { ses := sessEx.NewSession(ctx) return &Session{ - ses: ses, - bs: bs.Blockstore(), + ses: ses, + sessEx: sessEx, + bs: bs.Blockstore(), } } return &Session{ @@ -199,15 +201,19 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { log.Debugf("BlockService GetBlock: '%s'", c) - var f exchange.Fetcher + var f func() exchange.Fetcher if s.exchange != nil { - f = s.exchange + f = s.getExchange } return getBlock(ctx, c, s.blockstore, f) // hash security } -func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) (blocks.Block, error) { +func (s *blockService) getExchange() exchange.Fetcher { + return s.exchange +} + +func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) (blocks.Block, error) { err := verifcid.ValidateCid(c) // hash security if err != nil { return nil, err @@ -218,7 +224,9 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, f exchan return block, nil } - if err == blockstore.ErrNotFound && f != nil { + if err == blockstore.ErrNotFound && fget != nil { + f := fget() // Don't load the exchange until we have to + // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. log.Debug("Blockservice: Searching bitswap") @@ -245,10 +253,10 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, f exchan // the returned channel. // NB: No guarantees are made about order. func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { - return getBlocks(ctx, ks, s.blockstore, s.exchange) // hash security + return getBlocks(ctx, ks, s.blockstore, s.getExchange) // hash security } -func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, f exchange.Fetcher) <-chan blocks.Block { +func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) <-chan blocks.Block { out := make(chan blocks.Block) go func() { @@ -284,6 +292,7 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, f ex return } + f := fget() // don't load exchange unless we have to rblocks, err := f.GetBlocks(ctx, misses) if err != nil { log.Debugf("Error with GetBlocks: %s", err) @@ -318,18 +327,31 @@ func (s *blockService) Close() error { // Session is a helper type to provide higher level access to bitswap sessions type Session struct { - bs blockstore.Blockstore - ses exchange.Fetcher + bs blockstore.Blockstore + ses exchange.Fetcher + sessEx exchange.SessionExchange + sessCtx context.Context + lk sync.Mutex +} + +func (s *Session) getSession() exchange.Fetcher { + s.lk.Lock() + defer s.lk.Unlock() + if s.ses == nil { + s.ses = s.sessEx.NewSession(s.sessCtx) + } + + return s.ses } // GetBlock gets a block in the context of a request session func (s *Session) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { - return getBlock(ctx, c, s.bs, s.ses) // hash security + return getBlock(ctx, c, s.bs, s.getSession) // hash security } // GetBlocks gets blocks in the context of a request session func (s *Session) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { - return getBlocks(ctx, ks, s.bs, s.ses) // hash security + return getBlocks(ctx, ks, s.bs, s.getSession) // hash security } var _ BlockGetter = (*Session)(nil) From 28fe139695b6494eb257aca0d7e21741497a640a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 18 Sep 2018 04:30:33 +0200 Subject: [PATCH 2286/3147] resolve cmd: use coreapi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@c3053e816481188f8b20f1d56c3cfa648d4f39c8 --- coreiface/options/name.go | 43 +++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/coreiface/options/name.go b/coreiface/options/name.go index 48aecf18ba..9ba4a8770e 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -14,9 +14,12 @@ type NamePublishSettings struct { } type NameResolveSettings struct { - Recursive bool - Local bool - Cache bool + Depth int + Local bool + Cache bool + + DhtRecordCount int + DhtTimeout time.Duration } type NamePublishOption func(*NamePublishSettings) error @@ -40,9 +43,12 @@ func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings, error) func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings, error) { options := &NameResolveSettings{ - Recursive: false, - Local: false, - Cache: true, + Depth: 1, + Local: false, + Cache: true, + + DhtRecordCount: 16, + DhtTimeout: time.Minute, } for _, opt := range opts { @@ -80,11 +86,11 @@ func (nameOpts) Key(key string) NamePublishOption { } } -// Recursive is an option for Name.Resolve which specifies whether to perform a +// Depth is an option for Name.Resolve which specifies the maximum depth of a // recursive lookup. Default value is false -func (nameOpts) Recursive(recursive bool) NameResolveOption { +func (nameOpts) Depth(depth int) NameResolveOption { return func(settings *NameResolveSettings) error { - settings.Recursive = recursive + settings.Depth = depth return nil } } @@ -106,3 +112,22 @@ func (nameOpts) Cache(cache bool) NameResolveOption { return nil } } + +// DhtRecordCount is an option for Name.Resolve which specifies how many records +// we want to validate before selecting the best one (newest). Note that setting +// this value too low will have security implications +func (nameOpts) DhtRecordCount(rc int) NameResolveOption { + return func(settings *NameResolveSettings) error { + settings.DhtRecordCount = rc + return nil + } +} + +// DhtTimeout is an option for Name.Resolve which specifies timeout for +// DHT lookup +func (nameOpts) DhtTimeout(timeout time.Duration) NameResolveOption { + return func(settings *NameResolveSettings) error { + settings.DhtTimeout = timeout + return nil + } +} From cd88b19ccb6d4ff617ea5e4c329c284315fc8707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 19 Sep 2018 11:51:42 +0200 Subject: [PATCH 2287/3147] coreapi name: accept namesys options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@ca81d824222df0ed2c1ede6a3e166f7aa420b4f7 --- coreiface/options/name.go | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/coreiface/options/name.go b/coreiface/options/name.go index 9ba4a8770e..ba3691b03c 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -2,6 +2,8 @@ package options import ( "time" + + ropts "github.com/ipfs/go-ipfs/namesys/opts" ) const ( @@ -14,12 +16,10 @@ type NamePublishSettings struct { } type NameResolveSettings struct { - Depth int Local bool Cache bool - DhtRecordCount int - DhtTimeout time.Duration + ResolveOpts []ropts.ResolveOpt } type NamePublishOption func(*NamePublishSettings) error @@ -43,12 +43,8 @@ func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings, error) func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings, error) { options := &NameResolveSettings{ - Depth: 1, Local: false, Cache: true, - - DhtRecordCount: 16, - DhtTimeout: time.Minute, } for _, opt := range opts { @@ -86,15 +82,6 @@ func (nameOpts) Key(key string) NamePublishOption { } } -// Depth is an option for Name.Resolve which specifies the maximum depth of a -// recursive lookup. Default value is false -func (nameOpts) Depth(depth int) NameResolveOption { - return func(settings *NameResolveSettings) error { - settings.Depth = depth - return nil - } -} - // Local is an option for Name.Resolve which specifies if the lookup should be // offline. Default value is false func (nameOpts) Local(local bool) NameResolveOption { @@ -113,21 +100,10 @@ func (nameOpts) Cache(cache bool) NameResolveOption { } } -// DhtRecordCount is an option for Name.Resolve which specifies how many records -// we want to validate before selecting the best one (newest). Note that setting -// this value too low will have security implications -func (nameOpts) DhtRecordCount(rc int) NameResolveOption { - return func(settings *NameResolveSettings) error { - settings.DhtRecordCount = rc - return nil - } -} - -// DhtTimeout is an option for Name.Resolve which specifies timeout for -// DHT lookup -func (nameOpts) DhtTimeout(timeout time.Duration) NameResolveOption { +// +func (nameOpts) ResolveOption(opt ropts.ResolveOpt) NameResolveOption { return func(settings *NameResolveSettings) error { - settings.DhtTimeout = timeout + settings.ResolveOpts = append(settings.ResolveOpts, opt) return nil } } From 9ebf36799e947803b77b11a58799bc25055ea3b6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 19 Sep 2018 14:35:16 -0700 Subject: [PATCH 2288/3147] gx publish 0.1.1 This commit was moved from ipfs/go-ipfs-exchange-interface@615ac03eb55d9595690c78799641d8f2c9a6c16f --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 42fe6a80b8..c3032b2350 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -33,5 +33,5 @@ type Fetcher interface { // sessions. type SessionExchange interface { Interface - NewSession(context.Context) Interface + NewSession(context.Context) Fetcher } From b9a81c74dba6085872473642a4ee273bba1bee31 Mon Sep 17 00:00:00 2001 From: Overbool Date: Fri, 21 Sep 2018 15:57:11 +0800 Subject: [PATCH 2289/3147] fix(unixfs): issue #6 This commit was moved from ipfs/go-mfs@820510f794b9c570993802203c62dfa322e10111 --- mfs/dir.go | 4 ++-- mfs/file.go | 4 ++-- mfs/system.go | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 676bf97d6c..5a1161c22d 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -152,12 +152,12 @@ func (d *Directory) childNode(name string) (FSNode, error) { func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { switch nd := nd.(type) { case *dag.ProtoNode: - i, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { return nil, err } - switch i.GetType() { + switch fsn.Type() { case ufspb.Data_Directory, ufspb.Data_HAMTShard: ndir, err := NewDirectory(d.ctx, name, nd, d, d.dserv) if err != nil { diff --git a/mfs/file.go b/mfs/file.go index 00c70ae4b9..0a49646fd2 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -102,11 +102,11 @@ func (fi *File) Size() (int64, error) { defer fi.nodelk.Unlock() switch nd := fi.node.(type) { case *dag.ProtoNode: - pbd, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { return 0, err } - return int64(pbd.GetFilesize()), nil + return int64(fsn.FileSize()), nil case *dag.RawNode: return int64(len(nd.RawData())), nil default: diff --git a/mfs/system.go b/mfs/system.go index 100cfa4128..cc7e65d3aa 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -74,13 +74,13 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf repub: repub, } - pbn, err := ft.FromBytes(node.Data()) + fsn, err := ft.FSNodeFromBytes(node.Data()) if err != nil { log.Error("IPNS pointer was not unixfs node") return nil, err } - switch pbn.GetType() { + switch fsn.Type() { case ft.TDirectory, ft.THAMTShard: newDir, err := NewDirectory(parent, node.String(), node, root, ds) if err != nil { @@ -89,9 +89,9 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf root.dir = newDir case ft.TFile, ft.TMetadata, ft.TRaw: - return nil, fmt.Errorf("root can't be a file (unixfs type: %s)", pbn.GetType()) + return nil, fmt.Errorf("root can't be a file (unixfs type: %s)", fsn.Type()) default: - return nil, fmt.Errorf("unrecognized unixfs type: %s", pbn.GetType()) + return nil, fmt.Errorf("unrecognized unixfs type: %s", fsn.Type()) } return root, nil } From e146ae1219c27b524cbe95286f9cd210994803fa Mon Sep 17 00:00:00 2001 From: Overbool Date: Thu, 20 Sep 2018 09:12:10 +0800 Subject: [PATCH 2290/3147] feat(io): add IsDir function This commit was moved from ipfs/go-unixfs@087af1f883fe820b40078f5ac3db97f80b0ccddc --- unixfs/unixfs.go | 10 ++++++++++ unixfs/unixfs_test.go | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 21f643520d..1263d82a6f 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -247,6 +247,16 @@ func (n *FSNode) Type() pb.Data_DataType { return n.format.GetType() } +// IsDir checks whether the node represents a directory +func (n *FSNode) IsDir() bool { + switch n.Type() { + case pb.Data_Directory, pb.Data_HAMTShard: + return true + default: + return false + } +} + // Metadata is used to store additional FSNode information. type Metadata struct { MimeType string diff --git a/unixfs/unixfs_test.go b/unixfs/unixfs_test.go index e046828641..ef0b6be974 100644 --- a/unixfs/unixfs_test.go +++ b/unixfs/unixfs_test.go @@ -158,3 +158,20 @@ func TestMetadata(t *testing.T) { } } + +func TestIsDir(t *testing.T) { + prepares := map[pb.Data_DataType]bool{ + TDirectory: true, + THAMTShard: true, + TFile: false, + TMetadata: false, + TRaw: false, + TSymlink: false, + } + for typ, v := range prepares { + fsn := NewFSNode(typ) + if fsn.IsDir() != v { + t.Fatalf("type %v, IsDir() should be %v, but %v", typ, v, fsn.IsDir()) + } + } +} From d909a8ea01d60b69082352a21c5b822cf9106b34 Mon Sep 17 00:00:00 2001 From: Overbool Date: Fri, 21 Sep 2018 07:00:55 +0800 Subject: [PATCH 2291/3147] fix(fsnode): issue #17 This commit was moved from ipfs/go-unixfs@8bea61e6e6681700f08291282d2b37517f5225c5 --- unixfs/hamt/hamt.go | 13 +++++++------ unixfs/importer/trickle/trickledag.go | 12 ++++++------ unixfs/io/resolve.go | 4 ++-- unixfs/mod/dagmodifier.go | 19 +++++++++---------- unixfs/test/utils.go | 4 ++-- unixfs/unixfs.go | 16 ++++++++++++++++ unixfs/unixfs_test.go | 12 ++++++------ 7 files changed, 48 insertions(+), 32 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 4d3bd3b8e7..bd2144214d 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -102,28 +102,29 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { return nil, dag.ErrNotProtobuf } - pbd, err := format.FromBytes(pbnd.Data()) + fsn, err := format.FSNodeFromBytes(pbnd.Data()) if err != nil { return nil, err } - if pbd.GetType() != upb.Data_HAMTShard { + + if fsn.Type() != upb.Data_HAMTShard { return nil, fmt.Errorf("node was not a dir shard") } - if pbd.GetHashType() != HashMurmur3 { + if fsn.HashType() != HashMurmur3 { return nil, fmt.Errorf("only murmur3 supported as hash function") } - ds, err := makeShard(dserv, int(pbd.GetFanout())) + ds, err := makeShard(dserv, int(fsn.Fanout())) if err != nil { return nil, err } ds.nd = pbnd.Copy().(*dag.ProtoNode) ds.children = make([]child, len(pbnd.Links())) - ds.bitfield.SetBytes(pbd.GetData()) - ds.hashFunc = pbd.GetHashType() + ds.bitfield.SetBytes(fsn.Data()) + ds.hashFunc = fsn.HashType() ds.builder = ds.nd.CidBuilder() return ds, nil diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 30c9618618..bdc72e8bfe 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -277,12 +277,12 @@ func verifyTDagRec(n ipld.Node, depth int, p VerifyParams) error { // zero depth dag is raw data block switch nd := n.(type) { case *dag.ProtoNode: - pbn, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { return err } - if pbn.GetType() != ft.TRaw { + if fsn.Type() != ft.TRaw { return errors.New("expected raw block") } @@ -325,16 +325,16 @@ func verifyTDagRec(n ipld.Node, depth int, p VerifyParams) error { } // Verify this is a branch node - pbn, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { return err } - if pbn.GetType() != ft.TFile { - return fmt.Errorf("expected file as branch node, got: %s", pbn.GetType()) + if fsn.Type() != ft.TFile { + return fmt.Errorf("expected file as branch node, got: %s", fsn.Type()) } - if len(pbn.Data) > 0 { + if len(fsn.Data()) > 0 { return errors.New("branch node should not have data") } diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 5b0e6783a1..3181097f39 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -15,7 +15,7 @@ import ( func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) { switch nd := nd.(type) { case *dag.ProtoNode: - upb, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { // Not a unixfs node, use standard object traversal code lnk, err := nd.GetNodeLink(names[0]) @@ -26,7 +26,7 @@ func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, na return lnk, names[1:], nil } - switch upb.GetType() { + switch fsn.Type() { case ft.THAMTShard: rods := dag.NewReadOnlyDagService(ds) s, err := hamt.NewHamtFromDag(rods, nd) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index c217be5531..be9b07ea73 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -13,7 +13,6 @@ import ( trickle "github.com/ipfs/go-unixfs/importer/trickle" uio "github.com/ipfs/go-unixfs/io" - proto "github.com/gogo/protobuf/proto" cid "github.com/ipfs/go-cid" chunker "github.com/ipfs/go-ipfs-chunker" ipld "github.com/ipfs/go-ipld-format" @@ -173,11 +172,11 @@ func (dm *DagModifier) Size() (int64, error) { func fileSize(n ipld.Node) (uint64, error) { switch nd := n.(type) { case *mdag.ProtoNode: - f, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { return 0, err } - return f.GetFilesize(), nil + return fsn.FileSize(), nil case *mdag.RawNode: return uint64(len(nd.RawData())), nil default: @@ -238,18 +237,18 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (cid.Cid, error) { if len(n.Links()) == 0 { switch nd0 := n.(type) { case *mdag.ProtoNode: - f, err := ft.FromBytes(nd0.Data()) + fsn, err := ft.FSNodeFromBytes(nd0.Data()) if err != nil { return cid.Cid{}, err } - _, err = dm.wrBuf.Read(f.Data[offset:]) + _, err = dm.wrBuf.Read(fsn.Data()[offset:]) if err != nil && err != io.EOF { return cid.Cid{}, err } // Update newly written node.. - b, err := proto.Marshal(f) + b, err := fsn.GetBytes() if err != nil { return cid.Cid{}, err } @@ -300,13 +299,13 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (cid.Cid, error) { return cid.Cid{}, ErrNotUnixfs } - f, err := ft.FromBytes(node.Data()) + fsn, err := ft.FSNodeFromBytes(node.Data()) if err != nil { return cid.Cid{}, err } var cur uint64 - for i, bs := range f.GetBlocksizes() { + for i, bs := range fsn.BlockSizes() { // We found the correct child to write into if cur+bs > offset { child, err := node.Links()[i].GetNode(dm.ctx, dm.dagserv) @@ -510,11 +509,11 @@ func (dm *DagModifier) dagTruncate(ctx context.Context, n ipld.Node, size uint64 switch nd := n.(type) { case *mdag.ProtoNode: // TODO: this can likely be done without marshaling and remarshaling - pbn, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { return nil, err } - nd.SetData(ft.WrapData(pbn.Data[:size])) + nd.SetData(ft.WrapData(fsn.Data()[:size])) return nd, nil case *mdag.RawNode: return mdag.NewRawNodeWPrefix(nd.RawData()[:size], nd.Cid().Prefix()) diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index fdd307c565..98bce14cf4 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -107,7 +107,7 @@ func ArrComp(a, b []byte) error { // PrintDag pretty-prints the given dag to stdout. func PrintDag(nd *mdag.ProtoNode, ds ipld.DAGService, indent int) { - pbd, err := ft.FromBytes(nd.Data()) + fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { panic(err) } @@ -115,7 +115,7 @@ func PrintDag(nd *mdag.ProtoNode, ds ipld.DAGService, indent int) { for i := 0; i < indent; i++ { fmt.Print(" ") } - fmt.Printf("{size = %d, type = %s, children = %d", pbd.GetFilesize(), pbd.GetType().String(), len(pbd.GetBlocksizes())) + fmt.Printf("{size = %d, type = %s, children = %d", fsn.FileSize(), fsn.Type().String(), fsn.NumChildren()) if len(nd.Links()) > 0 { fmt.Println() } diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 21f643520d..db5b72f3e5 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -29,6 +29,7 @@ var ( ) // FromBytes unmarshals a byte slice as protobuf Data. +// Deprecated: Use `FSNodeFromBytes` instead to avoid direct manipulation of `pb.Data`. func FromBytes(data []byte) (*pb.Data, error) { pbdata := new(pb.Data) err := proto.Unmarshal(data, pbdata) @@ -182,6 +183,16 @@ func NewFSNode(dataType pb.Data_DataType) *FSNode { return n } +// HashType gets hash type of format +func (n *FSNode) HashType() uint64 { + return n.format.GetHashType() +} + +// Fanout gets fanout of format +func (n *FSNode) Fanout() uint64 { + return n.format.GetFanout() +} + // AddBlockSize adds the size of the next child block of this node func (n *FSNode) AddBlockSize(s uint64) { n.UpdateFilesize(int64(s)) @@ -200,6 +211,11 @@ func (n *FSNode) BlockSize(i int) uint64 { return n.format.Blocksizes[i] } +// BlockSizes gets blocksizes of format +func (n *FSNode) BlockSizes() []uint64 { + return n.format.GetBlocksizes() +} + // RemoveAllBlockSizes removes all the child block sizes of this node. func (n *FSNode) RemoveAllBlockSizes() { n.format.Blocksizes = []uint64{} diff --git a/unixfs/unixfs_test.go b/unixfs/unixfs_test.go index e046828641..11fa918ff8 100644 --- a/unixfs/unixfs_test.go +++ b/unixfs/unixfs_test.go @@ -76,12 +76,12 @@ func TestPBdataTools(t *testing.T) { t.Fatal("Unwrap failed to produce the correct wrapped data.") } - rawPBdata, err := FromBytes(rawPB) + rawPBdata, err := FSNodeFromBytes(rawPB) if err != nil { t.Fatal(err) } - isRaw := rawPBdata.GetType() == TRaw + isRaw := rawPBdata.Type() == TRaw if !isRaw { t.Fatal("WrapData does not create pb.Data_Raw!") } @@ -97,8 +97,8 @@ func TestPBdataTools(t *testing.T) { } dirPB := FolderPBData() - dir, err := FromBytes(dirPB) - isDir := dir.GetType() == TDirectory + dir, err := FSNodeFromBytes(dirPB) + isDir := dir.Type() == TDirectory if !isDir { t.Fatal("FolderPBData does not create a directory!") } @@ -115,8 +115,8 @@ func TestPBdataTools(t *testing.T) { t.Fatal(err) } - catSymPB, err := FromBytes(catSym) - isSym := catSymPB.GetType() == TSymlink + catSymPB, err := FSNodeFromBytes(catSym) + isSym := catSymPB.Type() == TSymlink if !isSym { t.Fatal("Failed to make a Symlink.") } From 25706d9f80ba3782c6957e31e71da20e3696fb32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 31 Aug 2018 14:46:09 +0200 Subject: [PATCH 2292/3147] Implement SearchValue This commit was moved from ipfs/go-ipfs-routing@991f2c382b451e5335fcdfdfbfe7fcac3b0dde2e --- routing/mock/centralized_client.go | 7 ++++++- routing/none/none_client.go | 4 ++++ routing/offline/offline.go | 13 +++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 49a3633000..7faad9ab1d 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -34,7 +34,12 @@ func (c *client) GetValue(ctx context.Context, key string, opts ...ropts.Option) return c.vs.GetValue(ctx, key, opts...) } -func (c *client) FindProviders(ctx context.Context, key cid.Cid) ([]pstore.PeerInfo, error) { +func (c *client) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { + log.Debugf("SearchValue: %s", key) + return c.vs.SearchValue(ctx, key, opts...) +} + +func (c *client) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { return c.server.Providers(key), nil } diff --git a/routing/none/none_client.go b/routing/none/none_client.go index e29ef36af7..45febc554e 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -26,6 +26,10 @@ func (c *nilclient) GetValue(_ context.Context, _ string, _ ...ropts.Option) ([] return nil, errors.New("tried GetValue from nil routing") } +func (c *nilclient) SearchValue(_ context.Context, _ string, _ ...ropts.Option) (<-chan []byte, error) { + return nil, errors.New("tried SearchValue from nil routing") +} + func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, error) { return pstore.PeerInfo{}, nil } diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 9b94176ccb..d2011fdaa0 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -90,6 +90,19 @@ func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Op return val, nil } +func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...ropts.Option) (<-chan []byte, error) { + out := make(chan []byte) + go func() { + defer close(out) + v, _ := c.GetValue(ctx, key) + select { + case out <- v: + case <-ctx.Done(): + } + }() + return out, nil +} + func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { return pstore.PeerInfo{}, ErrOffline } From 235b4322bf682212ad4daf9cd8faa24ee8097ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 1 Sep 2018 14:07:40 +0200 Subject: [PATCH 2293/3147] Optimize offline SearchValue slightly This commit was moved from ipfs/go-ipfs-routing@25a826923088dc4ac7b1143c807f5186af70f2f2 --- routing/offline/offline.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index d2011fdaa0..1627490c23 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -91,13 +91,12 @@ func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Op } func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...ropts.Option) (<-chan []byte, error) { - out := make(chan []byte) + out := make(chan []byte, 1) go func() { defer close(out) - v, _ := c.GetValue(ctx, key) - select { - case out <- v: - case <-ctx.Done(): + v, err := c.GetValue(ctx, key) + if err == nil { + out <- v } }() return out, nil From 1c6f3dc18081a12be6f880da798403977a8da8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 24 Sep 2018 13:10:35 +0200 Subject: [PATCH 2294/3147] Fix cid after rebase This commit was moved from ipfs/go-ipfs-routing@f18df505124381d560ed8764b84e4549b9c52369 --- routing/mock/centralized_client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 7faad9ab1d..e09350da5b 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -39,7 +39,7 @@ func (c *client) SearchValue(ctx context.Context, key string, opts ...ropts.Opti return c.vs.SearchValue(ctx, key, opts...) } -func (c *client) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) { +func (c *client) FindProviders(ctx context.Context, key cid.Cid) ([]pstore.PeerInfo, error) { return c.server.Providers(key), nil } From a45848c57216369dfac2a17e81aa8b717bf8745b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 24 Sep 2018 14:03:57 +0200 Subject: [PATCH 2295/3147] gx: update go-libp2p-routing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@d37dcabfb128deb0ac57d7320ca827e37dcd28f8 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 10 +++++----- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 2 +- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 6 +++--- 14 files changed, 26 insertions(+), 26 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index d7b87b36a5..1ffa3f8c62 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index f908270914..4d79e68d3d 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index ec36b7f1a9..f102e36f91 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index 87e0f1abfd..fede7005c1 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index f796f7ac22..0ad2e922ca 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,20 +6,20 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + mockrouting "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/mock" + offline "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/offline" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/mock" - offline "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/offline" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" + routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" + ropts "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing/options" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" record "gx/ipfs/QmdHb9aBELnQKTVhvvA3hsQbRgUAwsWUzBP2vZ6Y5FBYvE/go-libp2p-record" - routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" - ropts "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing/options" pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" pstoremem "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore/pstoremem" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index 1b9a1574e5..99a9bf4410 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" @@ -14,7 +14,7 @@ import ( peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" + routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index e4ee7b2d33..ab71026a95 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,12 +7,12 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmPL8bYtbACcSFFiSr4s2du7Na382NxRADR8hC7D9FkEA2/go-unixfs" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + "gx/ipfs/QmWqiuwk7ZzUFQvfBuQDwxPxyAQtNMxGYwZkjJuF6GgWQk/go-unixfs" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + offroute "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/offline" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - offroute "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/offline" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" diff --git a/namesys/proquint.go b/namesys/proquint.go index a0ad3ce656..2fa85b8d2a 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,8 +7,8 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 8655d4ac75..8cb54921d0 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmPL8bYtbACcSFFiSr4s2du7Na382NxRADR8hC7D9FkEA2/go-unixfs" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + ft "gx/ipfs/QmWqiuwk7ZzUFQvfBuQDwxPxyAQtNMxGYwZkjJuF6GgWQk/go-unixfs" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dsquery "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" + routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" - routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 3b444cab9a..37af07af30 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" + mockrouting "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/mock" dshelp "gx/ipfs/QmPQ7bVbZAbGaJkBVJeTkkKXvLLZeN9CLWTf5fzUQ8yeWs/go-ipfs-ds-help" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/mock" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 8ee200295c..10c58b2da5 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index babdd9d548..b2f006ee7c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" mocknet "gx/ipfs/QmUEqyXr97aUbNmQADHYNknjwjjdVpJXEt1UZXmSG81EV4/go-libp2p/p2p/net/mock" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index b0351214b6..38b6c5c788 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + mockrouting "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/mock" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - mockrouting "gx/ipfs/QmSNe4MWVxZWk6UxxW2z2EKofFo4GdFzud1vfn1iVby3mj/go-ipfs-routing/mock" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" diff --git a/namesys/routing.go b/namesys/routing.go index 8d78617997..0a24122d56 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,16 +6,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - dht "gx/ipfs/QmaXYSwxqJsX3EoGb1ZV2toZ9fXc8hWJPaBW1XAp1h2Tsp/go-libp2p-kad-dht" + routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" - routing "gx/ipfs/QmdKS5YtmuSWKuLLgbHG176mS3VX3AKiyVmaaiAfvgcuch/go-libp2p-routing" + dht "gx/ipfs/QmdB3eTAndZ1rqGTtUVwVmxdctb46C1hLfgdsbLHzJRDSr/go-libp2p-kad-dht" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From da192643fa1850d58894f2f967d8cf4d1815e209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 24 Sep 2018 14:03:57 +0200 Subject: [PATCH 2296/3147] gx: update go-libp2p-routing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@d25fb74fa9641f306898689e6abbb5d041e5a63c --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 7c196009fa..523430909e 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" - bserv "gx/ipfs/Qma2KhbQarYTkmSJAeaMGRAg8HAXAhEWK8ge4SReG7ZSD3/go-blockservice" + dag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" + bserv "gx/ipfs/QmWAU1Etv448cx9GLohtr27vnVC87amqE7fN4Hf4hcLDQY/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 692ae24d70..6b5ef60192 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" + mdag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index b54f8a1326..6d8f2ecb69 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" - bs "gx/ipfs/Qma2KhbQarYTkmSJAeaMGRAg8HAXAhEWK8ge4SReG7ZSD3/go-blockservice" + mdag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" + bs "gx/ipfs/QmWAU1Etv448cx9GLohtr27vnVC87amqE7fN4Hf4hcLDQY/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 9d76177c76..1a96037bbb 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" + "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e9aacf6aa5..d3776444ff 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" - bserv "gx/ipfs/Qma2KhbQarYTkmSJAeaMGRAg8HAXAhEWK8ge4SReG7ZSD3/go-blockservice" + dag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" + bserv "gx/ipfs/QmWAU1Etv448cx9GLohtr27vnVC87amqE7fN4Hf4hcLDQY/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" From 8e4bc5a6889bab0dacad05807d617347d4c52e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 24 Sep 2018 14:03:57 +0200 Subject: [PATCH 2297/3147] gx: update go-libp2p-routing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-filestore@c2396f24fbf5a9d6e1623f1a31a88d8769e11268 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 425bbf5549..37ca215ab5 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmXv5mwmQ74r4aiHcNeQ4GAmfB3aWJuqaE4WyDfDfvkgLM/go-merkledag" + dag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From fdaee8e479945dfe29bec1b56e575b5c9622a454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 24 Sep 2018 14:03:57 +0200 Subject: [PATCH 2298/3147] gx: update go-libp2p-routing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@143c911f1528ad45768b9ea1dd180b865c229fd1 --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index c61b335337..75901eaa4c 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmX7uSbkNz76yNwBhuwYwRbhihLnJqM73VTCjS3UMJud9A/go-path" + ipfspath "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From 102bddb39cf0a630fdfe98b4e683f4e287e477c6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 24 Sep 2018 05:24:30 -0700 Subject: [PATCH 2299/3147] update for interface changes License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@ad3f9825dcd86d53bbc2e5c56fe335c6a30d9a96 --- namesys/ipns_resolver_validation_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 0ad2e922ca..c97432c6ce 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -174,6 +174,10 @@ func (m *mockValueStore) GetValue(ctx context.Context, k string, opts ...ropts.O return m.r.GetValue(ctx, k, opts...) } +func (m *mockValueStore) SearchValue(ctx context.Context, k string, opts ...ropts.Option) (<-chan []byte, error) { + return m.r.SearchValue(ctx, k, opts...) +} + func (m *mockValueStore) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { pk := m.kbook.PubKey(p) if pk != nil { From e35a0499f345067d363d2068f82c078834e09708 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 24 Sep 2018 05:36:29 -0700 Subject: [PATCH 2300/3147] gx: update go-log go-ipld-cbor (and friends) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@801e10810b0e22872c11733e5838c7b6b9a88908 --- pinning/pinner/gc/gc.go | 12 ++++++------ pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 12 ++++++------ pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 12 ++++++------ 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 523430909e..f5ca725475 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" - bserv "gx/ipfs/QmWAU1Etv448cx9GLohtr27vnVC87amqE7fN4Hf4hcLDQY/go-blockservice" + dag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" + bserv "gx/ipfs/QmcRecCZWM2NZfCQrCe97Ch3Givv8KKEP82tGUDntzdLFe/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - dstore "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + offline "gx/ipfs/QmR5miWuikPxWyUrzMYJVmFUcD44pGdtc98h9Qsbp4YcJw/go-ipfs-exchange-offline" + dstore "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" "gx/ipfs/QmVkMRSkXrpjqrroEXWuYBvDBnXCdMMY6gsKicBGVGUqKT/go-verifcid" - offline "gx/ipfs/QmcRC35JF2pJQneAxa5LdQBQRumWggccWErogSrCkS1h8T/go-ipfs-exchange-offline" + logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" - bstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" + bstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 6b5ef60192..cadc4530a3 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,11 +10,11 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" + mdag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 6d8f2ecb69..2549084f5e 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - mdag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" - bs "gx/ipfs/QmWAU1Etv448cx9GLohtr27vnVC87amqE7fN4Hf4hcLDQY/go-blockservice" + mdag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" + bs "gx/ipfs/QmcRecCZWM2NZfCQrCe97Ch3Givv8KKEP82tGUDntzdLFe/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - offline "gx/ipfs/QmcRC35JF2pJQneAxa5LdQBQRumWggccWErogSrCkS1h8T/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" + offline "gx/ipfs/QmR5miWuikPxWyUrzMYJVmFUcD44pGdtc98h9Qsbp4YcJw/go-ipfs-exchange-offline" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" + blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 1a96037bbb..9b4446e378 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" + "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index d3776444ff..e366eac703 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" - bserv "gx/ipfs/QmWAU1Etv448cx9GLohtr27vnVC87amqE7fN4Hf4hcLDQY/go-blockservice" + dag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" + bserv "gx/ipfs/QmcRecCZWM2NZfCQrCe97Ch3Givv8KKEP82tGUDntzdLFe/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - offline "gx/ipfs/QmcRC35JF2pJQneAxa5LdQBQRumWggccWErogSrCkS1h8T/go-ipfs-exchange-offline" - blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" + offline "gx/ipfs/QmR5miWuikPxWyUrzMYJVmFUcD44pGdtc98h9Qsbp4YcJw/go-ipfs-exchange-offline" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" + blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" ) func ignoreCids(_ cid.Cid) {} From 59fe7844a9b7a03c04e58dd0ab74c16b9cc24f3d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 24 Sep 2018 05:36:29 -0700 Subject: [PATCH 2301/3147] gx: update go-log go-ipld-cbor (and friends) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@c96a43ec6e904a78eb6a7e6ff2b105e2d9ae3289 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 26 ++++++++++++------------ namesys/namesys.go | 8 ++++---- namesys/namesys_test.go | 16 +++++++-------- namesys/proquint.go | 2 +- namesys/publisher.go | 16 +++++++-------- namesys/publisher_test.go | 14 ++++++------- namesys/republisher/repub.go | 10 ++++----- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 16 +++++++-------- namesys/routing.go | 14 ++++++------- 14 files changed, 68 insertions(+), 68 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 1ffa3f8c62..afdc0a468d 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 4d79e68d3d..f18c6e8aa8 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index f102e36f91..5ca7323a96 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -9,7 +9,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index fede7005c1..fcc956cb14 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index c97432c6ce..cc99bf1d7b 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,22 +6,22 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" - mockrouting "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/mock" - offline "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/offline" + testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" - ropts "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing/options" - ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" - record "gx/ipfs/QmdHb9aBELnQKTVhvvA3hsQbRgUAwsWUzBP2vZ6Y5FBYvE/go-libp2p-record" - pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" - pstoremem "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore/pstoremem" + record "gx/ipfs/QmSb4B8ZAAj5ALe9LjfzPyF8Ma6ezC1NTnDF2JQPUJxEXb/go-libp2p-record" + mockrouting "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/mock" + offline "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/offline" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" + routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" + ropts "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing/options" + ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore/pstoremem" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 99a9bf4410..054a51bbd4 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index ab71026a95..c2a530c26c 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,16 +7,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmWqiuwk7ZzUFQvfBuQDwxPxyAQtNMxGYwZkjJuF6GgWQk/go-unixfs" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" - offroute "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/offline" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" - pstoremem "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore/pstoremem" + offroute "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/offline" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" + ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + pstoremem "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore/pstoremem" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 2fa85b8d2a..4ba505dc88 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 8cb54921d0..b854206754 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmWqiuwk7ZzUFQvfBuQDwxPxyAQtNMxGYwZkjJuF6GgWQk/go-unixfs" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + ft "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dsquery "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" - ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" - pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dsquery "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" + routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" + ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + pb "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns/pb" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 37af07af30..3f6e6f02e8 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" - mockrouting "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/mock" - dshelp "gx/ipfs/QmPQ7bVbZAbGaJkBVJeTkkKXvLLZeN9CLWTf5fzUQ8yeWs/go-ipfs-ds-help" + testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" + mockrouting "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/mock" + dshelp "gx/ipfs/QmUDTSi6zJ6ACyQaKtxscCUxrg5DaXs9r4RQUPFQXGPHpo/go-ipfs-ds-help" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" + ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 10c58b2da5..ebe17c7761 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + pb "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns/pb" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index b2f006ee7c..dd8693965c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmUEqyXr97aUbNmQADHYNknjwjjdVpJXEt1UZXmSG81EV4/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" + mocknet "gx/ipfs/QmVsVARb86uSe1qYouewFMNd2p2sp2NGWm1JGPReVDWchW/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 38b6c5c788..82e3f06da2 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" - - mockrouting "gx/ipfs/QmPKLDMELt3Z1g4fHZoE8HEj3THpTnpynHUQDjW1gDMUdk/go-ipfs-routing/mock" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - testutil "gx/ipfs/QmRNhSdqzMcuRxX9A1egBeQ3BhDTguDV5HPwi8wRykkPU8/go-testutil" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dssync "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/sync" - ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + + testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" + mockrouting "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/mock" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" + ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 0a24122d56..dc53868ad7 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,16 +6,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - routing "gx/ipfs/QmaM261ArNTmKMybV4LKy68JTZrf5CkCbRGDxsZwYHgqDS/go-libp2p-routing" - ipns "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns" - pb "gx/ipfs/QmbUUxB9ErnEQdwTzy6HTxucnBvAH4am6vsfbD8CiqKhi9/go-ipns/pb" - dht "gx/ipfs/QmdB3eTAndZ1rqGTtUVwVmxdctb46C1hLfgdsbLHzJRDSr/go-libp2p-kad-dht" + routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" + logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + dht "gx/ipfs/QmZVakpN44VAUxs9eXAuUGLFYTCGmSyqSy6hyEKfMv68ME/go-libp2p-kad-dht" + ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + pb "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns/pb" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From 57e242bc65e0b3bb7f88ee65b74be7c085f4a84c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 24 Sep 2018 05:36:29 -0700 Subject: [PATCH 2302/3147] gx: update go-log go-ipld-cbor (and friends) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@88c0e44182776acd62e3ad3ec2a726ccc7721b71 --- filestore/filestore.go | 6 +++--- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 596e2b4887..b7dad3c557 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -13,10 +13,10 @@ import ( posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" - dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" + dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" + logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 37ca215ab5..42681c64af 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmVB15p7qNVQQGC5RQcAQAovDFaQpRNqorbRwpvdNjHmVC/go-merkledag" + dag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 8bf001af94..5e8bf6396e 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,14 +11,14 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" - dshelp "gx/ipfs/QmPQ7bVbZAbGaJkBVJeTkkKXvLLZeN9CLWTf5fzUQ8yeWs/go-ipfs-ds-help" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dsns "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/namespace" - dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" + dshelp "gx/ipfs/QmUDTSi6zJ6ACyQaKtxscCUxrg5DaXs9r4RQUPFQXGPHpo/go-ipfs-ds-help" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dsns "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/namespace" + dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" + blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 60a2a72d76..6213b0f104 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - dshelp "gx/ipfs/QmPQ7bVbZAbGaJkBVJeTkkKXvLLZeN9CLWTf5fzUQ8yeWs/go-ipfs-ds-help" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - dsq "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - blockstore "gx/ipfs/QmegPGspn3RpTMQ23Fd3GVVMopo1zsEMurudbFMZ5UXBLH/go-ipfs-blockstore" + dshelp "gx/ipfs/QmUDTSi6zJ6ACyQaKtxscCUxrg5DaXs9r4RQUPFQXGPHpo/go-ipfs-ds-help" + ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" + blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" ) // Status is used to identify the state of the block data referenced From 3bff21ef38fb40c5920de6e475607cd6e31bf0e5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 24 Sep 2018 05:36:29 -0700 Subject: [PATCH 2303/3147] gx: update go-log go-ipld-cbor (and friends) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@c1e241f73b853d5b8626125d24f8346c6331622b --- coreiface/dht.go | 4 ++-- coreiface/key.go | 2 +- coreiface/path.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 7b8119e449..2309ceb905 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - pstore "gx/ipfs/Qmda4cPRvSRyox3SqgJN6DfSZGU5TtHufPTp9uXjFj71X6/go-libp2p-peerstore" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/key.go b/coreiface/key.go index cc7c409fd0..4305ae20d2 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/path.go b/coreiface/path.go index 75901eaa4c..0beab06639 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/Qmc17MNY1xUgiE2nopbi6KATWau9qcGZtdmKKuXvFMVUgc/go-path" + ipfspath "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From 61fe74f129def8c38c1f8e8ab50f941f30736c6a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 24 Sep 2018 05:36:29 -0700 Subject: [PATCH 2304/3147] gx: update go-log go-ipld-cbor (and friends) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-keystore@049e8aa8c3b7ca0dc069c6072fb83359a8b6d6fd --- keystore/keystore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 38c0869ef1..ba43da47fa 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -8,7 +8,7 @@ import ( "strings" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" ) var log = logging.Logger("keystore") From 451aabcb39147615261f83f1bfca711812188875 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 25 Sep 2018 15:56:40 -0700 Subject: [PATCH 2305/3147] switch to go-buffer-pool It has a nicer interface and we don't even need the rest of the msgio Prereq for: https://github.com/libp2p/go-msgio/pull/9 This commit was moved from ipfs/go-ipfs-chunker@c10b0781c1d4e7026ddaa22a2f7c4e2416156bce --- chunker/splitting.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chunker/splitting.go b/chunker/splitting.go index 6a10de07a9..2b2373992d 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -8,7 +8,7 @@ import ( "io" logging "github.com/ipfs/go-log" - mpool "github.com/libp2p/go-msgio/mpool" + pool "github.com/libp2p/go-buffer-pool" ) var log = logging.Logger("chunk") @@ -82,19 +82,19 @@ func (ss *sizeSplitterv2) NextBytes() ([]byte, error) { return nil, ss.err } - full := mpool.ByteSlicePool.Get(ss.size).([]byte)[:ss.size] + full := pool.Get(int(ss.size)) n, err := io.ReadFull(ss.r, full) switch err { case io.ErrUnexpectedEOF: ss.err = io.EOF small := make([]byte, n) copy(small, full) - mpool.ByteSlicePool.Put(ss.size, full) + pool.Put(full) return small, nil case nil: return full, nil default: - mpool.ByteSlicePool.Put(ss.size, full) + pool.Put(full) return nil, err } } From 17066a977e973631cc233abc4b2ce2105bd193d8 Mon Sep 17 00:00:00 2001 From: Overbool Date: Wed, 26 Sep 2018 18:26:50 +0800 Subject: [PATCH 2306/3147] fix(type): issue #13 This commit was moved from ipfs/go-mfs@3365c5172fb2b9dcc76aadcfa7bc99b8fdfdf345 --- mfs/dir.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 5a1161c22d..f26b136016 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -12,7 +12,6 @@ import ( dag "github.com/ipfs/go-merkledag" ft "github.com/ipfs/go-unixfs" uio "github.com/ipfs/go-unixfs/io" - ufspb "github.com/ipfs/go-unixfs/pb" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" @@ -158,7 +157,7 @@ func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { } switch fsn.Type() { - case ufspb.Data_Directory, ufspb.Data_HAMTShard: + case ft.TDirectory, ft.THAMTShard: ndir, err := NewDirectory(d.ctx, name, nd, d, d.dserv) if err != nil { return nil, err @@ -166,14 +165,14 @@ func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { d.childDirs[name] = ndir return ndir, nil - case ufspb.Data_File, ufspb.Data_Raw, ufspb.Data_Symlink: + case ft.TFile, ft.TRaw, ft.TSymlink: nfi, err := NewFile(name, nd, d, d.dserv) if err != nil { return nil, err } d.files[name] = nfi return nfi, nil - case ufspb.Data_Metadata: + case ft.TMetadata: return nil, ErrNotYetImplemented default: return nil, ErrInvalidChild From e6145cab9b5c6f9595b22797d813db25275d88fc Mon Sep 17 00:00:00 2001 From: Overbool Date: Wed, 26 Sep 2018 15:03:08 +0800 Subject: [PATCH 2307/3147] fix(type): issue #23 This commit was moved from ipfs/go-unixfs@06009a2f87105928776bc9994cd712b034df01bd --- unixfs/archive/tar/writer.go | 11 +++++------ unixfs/hamt/hamt.go | 13 ++----------- unixfs/io/dagreader.go | 10 ++++------ unixfs/io/pbdagreader.go | 8 +++----- unixfs/unixfs.go | 17 +++++++++++++++++ 5 files changed, 31 insertions(+), 28 deletions(-) diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index 7e20e6d773..bc1253d3d7 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -13,7 +13,6 @@ import ( mdag "github.com/ipfs/go-merkledag" ft "github.com/ipfs/go-unixfs" uio "github.com/ipfs/go-unixfs/io" - upb "github.com/ipfs/go-unixfs/pb" ipld "github.com/ipfs/go-ipld-format" ) @@ -79,15 +78,15 @@ func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { } switch fsNode.Type() { - case upb.Data_Metadata: + case ft.TMetadata: fallthrough - case upb.Data_Directory, upb.Data_HAMTShard: + case ft.TDirectory, ft.THAMTShard: return w.writeDir(nd, fpath) - case upb.Data_Raw: + case ft.TRaw: fallthrough - case upb.Data_File: + case ft.TFile: return w.writeFile(nd, fsNode, fpath) - case upb.Data_Symlink: + case ft.TSymlink: return writeSymlinkHeader(w.TarW, string(fsNode.Data()), fpath) default: return ft.ErrUnrecognizedType diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index bd2144214d..3239299973 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -27,10 +27,7 @@ import ( dag "github.com/ipfs/go-merkledag" format "github.com/ipfs/go-unixfs" - upb "github.com/ipfs/go-unixfs/pb" - bitfield "github.com/Stebalien/go-bitfield" - proto "github.com/gogo/protobuf/proto" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" "github.com/spaolacci/murmur3" @@ -108,7 +105,7 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { } - if fsn.Type() != upb.Data_HAMTShard { + if fsn.Type() != format.THAMTShard { return nil, fmt.Errorf("node was not a dir shard") } @@ -176,13 +173,7 @@ func (ds *Shard) Node() (ipld.Node, error) { cindex++ } - typ := upb.Data_HAMTShard - data, err := proto.Marshal(&upb.Data{ - Type: &typ, - Fanout: proto.Uint64(uint64(ds.tableSize)), - HashType: proto.Uint64(HashMurmur3), - Data: ds.bitfield.Bytes(), - }) + data, err := format.HAMTShardData(ds.bitfield.Bytes(), uint64(ds.tableSize), HashMurmur3) if err != nil { return nil, err } diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 02bb64afde..8d491db1ba 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -7,8 +7,6 @@ import ( mdag "github.com/ipfs/go-merkledag" ft "github.com/ipfs/go-unixfs" - ftpb "github.com/ipfs/go-unixfs/pb" - ipld "github.com/ipfs/go-ipld-format" ) @@ -49,12 +47,12 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe } switch fsNode.Type() { - case ftpb.Data_Directory, ftpb.Data_HAMTShard: + case ft.TDirectory, ft.THAMTShard: // Dont allow reading directories return nil, ErrIsDir - case ftpb.Data_File, ftpb.Data_Raw: + case ft.TFile, ft.TRaw: return NewPBFileReader(ctx, n, fsNode, serv), nil - case ftpb.Data_Metadata: + case ft.TMetadata: if len(n.Links()) == 0 { return nil, errors.New("incorrectly formatted metadata object") } @@ -68,7 +66,7 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe return nil, mdag.ErrNotProtobuf } return NewDagReader(ctx, childpb, serv) - case ftpb.Data_Symlink: + case ft.TSymlink: return nil, ErrCantReadSymlinks default: return nil, ft.ErrUnrecognizedType diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index 5c44628505..a84f239ff6 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -8,8 +8,6 @@ import ( mdag "github.com/ipfs/go-merkledag" ft "github.com/ipfs/go-unixfs" - ftpb "github.com/ipfs/go-unixfs/pb" - cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" ) @@ -134,10 +132,10 @@ func (dr *PBDagReader) loadBufNode(node ipld.Node) error { } switch fsNode.Type() { - case ftpb.Data_File: + case ft.TFile: dr.buf = NewPBFileReader(dr.ctx, node, fsNode, dr.serv) return nil - case ftpb.Data_Raw: + case ft.TRaw: dr.buf = NewBufDagReader(fsNode.Data()) return nil default: @@ -318,7 +316,7 @@ func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { // for this seems to be good(-enough) solution as it's only returned by // precalcNextBuf when we step out of file range. // This is needed for gateway to function properly - if err == io.EOF && dr.file.Type() == ftpb.Data_File { + if err == io.EOF && dr.file.Type() == ft.TFile { return -1, nil } return n, err diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index db05fcc2f0..7b41891538 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -106,6 +106,23 @@ func SymlinkData(path string) ([]byte, error) { return out, nil } +// HAMTShardData return a `Data_HAMTShard` protobuf message +func HAMTShardData(data []byte, fanout uint64, hashType uint64) ([]byte, error) { + pbdata := new(pb.Data) + typ := pb.Data_HAMTShard + pbdata.Type = &typ + pbdata.HashType = proto.Uint64(hashType) + pbdata.Data = data + pbdata.Fanout = proto.Uint64(fanout) + + out, err := proto.Marshal(pbdata) + if err != nil { + return nil, err + } + + return out, nil +} + // UnwrapData unmarshals a protobuf messages and returns the contents. func UnwrapData(data []byte) ([]byte, error) { pbdata := new(pb.Data) From 398a8ffdf544dac64be994ce4a34ef3013d9d584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 18:54:58 +0100 Subject: [PATCH 2308/3147] coreapi: swarm interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@bc2ae0a441ed2da875bf2d815766e90b2c2a4d9f --- coreiface/swarm.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 coreiface/swarm.go diff --git a/coreiface/swarm.go b/coreiface/swarm.go new file mode 100644 index 0000000000..1ec260e07a --- /dev/null +++ b/coreiface/swarm.go @@ -0,0 +1,37 @@ +package iface + +import ( + "time" + + "context" + ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" +) + +// PeerInfo contains information about a peer +type PeerInfo interface { + // ID returns PeerID + ID() peer.ID + + // Address returns the multiaddress via which we are connected with the peer + Address() ma.Multiaddr + + // Latency returns last known round trip time to the peer + Latency() time.Duration + + // Streams returns list of streams established with the peer + // TODO: should this return multicodecs? + Streams() []string +} + +// SwarmAPI specifies the interface to libp2p swarm +type SwarmAPI interface { + // Connect to a given address + Connect(context.Context, ma.Multiaddr) error + + // Disconnect from a given address + Disconnect(context.Context, ma.Multiaddr) error + + // Peers returns the list of peers we are connected to + Peers(context.Context) ([]PeerInfo, error) +} From 81615a9f48e0bba90d04b4ac389948124aeff053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 19:02:57 +0100 Subject: [PATCH 2309/3147] coreapi: implement swarm api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3ab7f14240700d0e64e011e5fca7c847afc9ce9e --- coreiface/coreapi.go | 3 +++ coreiface/swarm.go | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 0053d472e6..0b153b6f9a 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -34,6 +34,9 @@ type CoreAPI interface { // Dht returns an implementation of Dht API Dht() DhtAPI + // Swarm returns an implementation of Swarm API + Swarm() SwarmAPI + // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (ResolvedPath, error) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 1ec260e07a..1f0b1216f6 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -1,9 +1,9 @@ package iface import ( + "context" "time" - "context" ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" ) @@ -17,11 +17,11 @@ type PeerInfo interface { Address() ma.Multiaddr // Latency returns last known round trip time to the peer - Latency() time.Duration + Latency(context.Context) (time.Duration, error) // Streams returns list of streams established with the peer // TODO: should this return multicodecs? - Streams() []string + Streams(context.Context) ([]string, error) } // SwarmAPI specifies the interface to libp2p swarm From 7e79c2365ce422f3c26401f2a0c8e1da99515aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 5 Apr 2018 20:22:49 +0200 Subject: [PATCH 2310/3147] fix infinite loop in connInfo.ID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@89ce6041ad9b851959cdd2434d4f7ab375459599 --- coreiface/swarm.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 1f0b1216f6..92817e6f4e 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -4,8 +4,8 @@ import ( "context" "time" - ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) // PeerInfo contains information about a peer From 6e9149c6f900ec598b0345cc97b0979b53ba8cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 11 Sep 2018 20:50:15 +0200 Subject: [PATCH 2311/3147] swarm cmd: port to new cmd lib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@59f549fe3aa60f48303f6283e09ae05c9224a84c --- coreiface/swarm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 92817e6f4e..2492f26967 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -4,8 +4,8 @@ import ( "context" "time" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) // PeerInfo contains information about a peer From 0f6f6ec8a4e5b41f01c658bf46f4d30b69a7ade5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 17 Sep 2018 16:45:59 +0200 Subject: [PATCH 2312/3147] coreapi swarm: rewire connect/disconnect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a48b2a807b98f5fe7eb4c1148bf938498a4836ce --- coreiface/swarm.go | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 2492f26967..7bd009f16f 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -2,14 +2,22 @@ package iface import ( "context" + "errors" "time" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" + "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" ) -// PeerInfo contains information about a peer -type PeerInfo interface { +var ( + ErrNotConnected = errors.New("not connected") + ErrConnNotFound = errors.New("conn not found") + ) + +// ConnectionInfo contains information about a peer +type ConnectionInfo interface { // ID returns PeerID ID() peer.ID @@ -20,18 +28,17 @@ type PeerInfo interface { Latency(context.Context) (time.Duration, error) // Streams returns list of streams established with the peer - // TODO: should this return multicodecs? - Streams(context.Context) ([]string, error) + Streams(context.Context) ([]protocol.ID, error) } // SwarmAPI specifies the interface to libp2p swarm type SwarmAPI interface { - // Connect to a given address - Connect(context.Context, ma.Multiaddr) error + // Connect to a given peer + Connect(context.Context, pstore.PeerInfo) error // Disconnect from a given address Disconnect(context.Context, ma.Multiaddr) error // Peers returns the list of peers we are connected to - Peers(context.Context) ([]PeerInfo, error) + Peers(context.Context) ([]ConnectionInfo, error) } From 4020059a81eb3f31fec83c825d6ce4d9dd8c65c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 17 Sep 2018 19:53:15 +0200 Subject: [PATCH 2313/3147] coreapi swarm: rewire address listing cmds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@8c35696f74f086858b6acaf8ee6a0ffe570e46cb --- coreiface/key.go | 3 +++ coreiface/swarm.go | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/coreiface/key.go b/coreiface/key.go index 4305ae20d2..cc6dc89004 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -33,6 +33,9 @@ type KeyAPI interface { // List lists keys stored in keystore List(ctx context.Context) ([]Key, error) + // Self returns the 'main' node key + Self(ctx context.Context) (Key, error) + // Remove removes keys from keystore. Returns ipns path of the removed key Remove(ctx context.Context, name string) (Key, error) } diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 7bd009f16f..caa6a70e32 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -9,12 +9,13 @@ import ( "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" + net "gx/ipfs/QmfDPh144WGBqRxZb1TGDHerbMnZATrHZggAPw7putNnBq/go-libp2p-net" ) var ( ErrNotConnected = errors.New("not connected") ErrConnNotFound = errors.New("conn not found") - ) +) // ConnectionInfo contains information about a peer type ConnectionInfo interface { @@ -24,6 +25,9 @@ type ConnectionInfo interface { // Address returns the multiaddress via which we are connected with the peer Address() ma.Multiaddr + // Direction returns which way the connection was established + Direction() net.Direction + // Latency returns last known round trip time to the peer Latency(context.Context) (time.Duration, error) @@ -41,4 +45,8 @@ type SwarmAPI interface { // Peers returns the list of peers we are connected to Peers(context.Context) ([]ConnectionInfo, error) + + KnownAddrs(context.Context) (map[peer.ID][]ma.Multiaddr, error) + LocalAddrs(context.Context) ([]ma.Multiaddr, error) + ListenAddrs(context.Context) ([]ma.Multiaddr, error) } From ed664f50df387068ee2582e24c8682877e62d4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 28 Aug 2018 00:44:51 +0200 Subject: [PATCH 2314/3147] namesys: Implement async methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@25d4dea9e0aa21895e388e5e7510c5e1ecac9e0c --- namesys/base.go | 95 +++++++++++++++++++++++++----- namesys/dns.go | 57 +++++++++++++++++- namesys/interface.go | 11 ++++ namesys/namesys.go | 88 +++++++++++++++++++++++++++- namesys/opts/opts.go | 8 +-- namesys/proquint.go | 16 ++++- namesys/routing.go | 135 ++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 388 insertions(+), 22 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index afdc0a468d..6e5dc70e07 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -10,13 +10,21 @@ import ( path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ) +type onceResult struct { + value path.Path + ttl time.Duration + err error +} + type resolver interface { // resolveOnce looks up a name once (without recursion). - resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (value path.Path, ttl time.Duration, err error) + resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (value path.Path, ttl time.Duration, err error) + + resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult } // resolve is a helper for implementing Resolver.ResolveN using resolveOnce. -func resolve(ctx context.Context, r resolver, name string, options *opts.ResolveOpts, prefixes ...string) (path.Path, error) { +func resolve(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) (path.Path, error) { depth := options.Depth for { p, _, err := r.resolveOnce(ctx, name, options) @@ -34,23 +42,82 @@ func resolve(ctx context.Context, r resolver, name string, options *opts.Resolve return p, ErrResolveRecursion } - matched := false - for _, prefix := range prefixes { - if strings.HasPrefix(p.String(), prefix) { - matched = true - if len(prefixes) == 1 { - name = strings.TrimPrefix(p.String(), prefix) - } - break - } - } - - if !matched { + if !strings.HasPrefix(p.String(), prefix) { return p, nil } + name = strings.TrimPrefix(p.String(), prefix) if depth > 1 { depth-- } } } + +//TODO: +// - better error handling +func resolveAsyncDo(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) <-chan Result { + resCh := r.resolveOnceAsync(ctx, name, options) + depth := options.Depth + outCh := make(chan Result) + + go func() { + defer close(outCh) + var subCh <-chan Result + var cancelSub context.CancelFunc + + for { + select { + case res, ok := <-resCh: + if res.err != nil { + outCh <- Result{err: res.err} + return + } + if !ok { + resCh = nil + continue + } + log.Debugf("resolved %s to %s", name, res.value.String()) + if strings.HasPrefix(res.value.String(), "/ipfs/") { + outCh <- Result{err: res.err} + continue + } + p := strings.TrimPrefix(res.value.String(), prefix) + + if depth == 1 { + outCh <- Result{err: ErrResolveRecursion} + continue + } + + subopts := options + if subopts.Depth > 1 { + subopts.Depth-- + } + + var subCtx context.Context + if subCh != nil { + // Cancel previous recursive resolve since it won't be used anyways + cancelSub() + } + subCtx, cancelSub = context.WithCancel(ctx) + + subCh = resolveAsyncDo(subCtx, r, p, subopts, prefix) + case res, ok := <-subCh: + if res.err != nil { + outCh <- Result{err: res.err} + return + } + if !ok { + subCh = nil + continue + } + outCh <- res + case <-ctx.Done(): + } + } + }() + return outCh +} + +func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) <-chan Result { + return resolveAsyncDo(ctx, r, name, options, prefix) +} diff --git a/namesys/dns.go b/namesys/dns.go index 5ca7323a96..a8e0b0fc2b 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -39,7 +39,7 @@ type lookupRes struct { // resolveOnce implements resolver. // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { +func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { segments := strings.SplitN(name, "/", 2) domain := segments[0] @@ -84,6 +84,61 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options *opt return p, 0, err } +func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + out := make(chan onceResult, 1) + segments := strings.SplitN(name, "/", 2) + domain := segments[0] + + if !isd.IsDomain(domain) { + out <- onceResult{err: errors.New("not a valid domain name")} + close(out) + return out + } + log.Debugf("DNSResolver resolving %s", domain) + + rootChan := make(chan lookupRes, 1) + go workDomain(r, domain, rootChan) + + subChan := make(chan lookupRes, 1) + go workDomain(r, "_dnslink."+domain, subChan) + + go func() { + defer close(out) + for { + select { + case subRes, ok := <-subChan: + if !ok { + subChan = nil + } + if subRes.error == nil { + select { + case out <- onceResult{value: subRes.path}: + case <-ctx.Done(): + } + return + } + case rootRes, ok := <-rootChan: + if !ok { + subChan = nil + } + if rootRes.error == nil { + select { + case out <- onceResult{value: rootRes.path}: + case <-ctx.Done(): + } + } + case <-ctx.Done(): + return + } + if subChan == nil && rootChan == nil { + return + } + } + }() + + return out +} + func workDomain(r *DNSResolver, name string, res chan lookupRes) { txt, err := r.lookupTXT(name) diff --git a/namesys/interface.go b/namesys/interface.go index fcc956cb14..aac3f324a5 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -63,6 +63,12 @@ type NameSystem interface { Publisher } +// Result is the return type for Resolver.ResolveAsync. +type Result struct { + path path.Path + err error +} + // Resolver is an object capable of resolving names. type Resolver interface { @@ -81,6 +87,11 @@ type Resolver interface { // users will be fine with this default limit, but if you need to // adjust the limit you can specify it as an option. Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (value path.Path, err error) + + // ResolveAsync performs recursive name lookup, like Resolve, but it returns + // entries as they are discovered in the DHT. Each returned result is guaranteed + // to be "better" (which usually means newer) than the previous one. + ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result } // Publisher is an object capable of publishing particular names. diff --git a/namesys/namesys.go b/namesys/namesys.go index 054a51bbd4..0842486ea1 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -64,8 +64,25 @@ func (ns *mpns) Resolve(ctx context.Context, name string, options ...opts.Resolv return resolve(ctx, ns, name, opts.ProcessOpts(options), "/ipns/") } +func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { + res := make(chan Result, 1) + if strings.HasPrefix(name, "/ipfs/") { + p, err := path.ParsePath(name) + res <- Result{p, err} + return res + } + + if !strings.HasPrefix(name, "/") { + p, err := path.ParsePath("/ipfs/" + name) + res <- Result{p, err} + return res + } + + return resolveAsync(ctx, ns, name, opts.ProcessOpts(options), "/ipns/") +} + // resolveOnce implements resolver. -func (ns *mpns) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { +func (ns *mpns) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { if !strings.HasPrefix(name, "/ipns/") { name = "/ipns/" + name } @@ -107,6 +124,75 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string, options *opts.Reso return p, 0, err } +func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + out := make(chan onceResult, 1) + + if !strings.HasPrefix(name, "/ipns/") { + name = "/ipns/" + name + } + segments := strings.SplitN(name, "/", 4) + if len(segments) < 3 || segments[0] != "" { + log.Debugf("invalid name syntax for %s", name) + out <- onceResult{err: ErrResolveFailed} + close(out) + return out + } + + key := segments[2] + + if p, ok := ns.cacheGet(key); ok { + out <- onceResult{value: p} + close(out) + return out + } + + // Resolver selection: + // 1. if it is a multihash resolve through "ipns". + // 2. if it is a domain name, resolve through "dns" + // 3. otherwise resolve through the "proquint" resolver + + var res resolver + if _, err := mh.FromB58String(key); err == nil { + res = ns.ipnsResolver + } else if isd.IsDomain(key) { + res = ns.dnsResolver + } else { + res = ns.proquintResolver + } + + resCh := res.resolveOnceAsync(ctx, key, options) + var best onceResult + go func() { + defer close(out) + for { + select { + case res, ok := <-resCh: + if !ok { + if best != (onceResult{}) { + ns.cacheSet(key, best.value, best.ttl) + } + return + } + if res.err == nil { + best = res + } + p := res.value + + // Attach rest of the path + if len(segments) > 3 { + p, _ = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + } + + out <- onceResult{value: p, err: res.err} + case <-ctx.Done(): + return + } + } + }() + + return out +} + // Publish implements Publisher func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { return ns.PublishWithEOL(ctx, name, value, time.Now().Add(DefaultRecordTTL)) diff --git a/namesys/opts/opts.go b/namesys/opts/opts.go index 6690cf7794..ee2bd5ac2a 100644 --- a/namesys/opts/opts.go +++ b/namesys/opts/opts.go @@ -31,8 +31,8 @@ type ResolveOpts struct { // DefaultResolveOpts returns the default options for resolving // an IPNS path -func DefaultResolveOpts() *ResolveOpts { - return &ResolveOpts{ +func DefaultResolveOpts() ResolveOpts { + return ResolveOpts{ Depth: DefaultDepthLimit, DhtRecordCount: 16, DhtTimeout: time.Minute, @@ -65,10 +65,10 @@ func DhtTimeout(timeout time.Duration) ResolveOpt { } // ProcessOpts converts an array of ResolveOpt into a ResolveOpts object -func ProcessOpts(opts []ResolveOpt) *ResolveOpts { +func ProcessOpts(opts []ResolveOpt) ResolveOpts { rsopts := DefaultResolveOpts() for _, option := range opts { - option(rsopts) + option(&rsopts) } return rsopts } diff --git a/namesys/proquint.go b/namesys/proquint.go index 4ba505dc88..279c361fdd 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -19,7 +19,7 @@ func (r *ProquintResolver) Resolve(ctx context.Context, name string, options ... } // resolveOnce implements resolver. Decodes the proquint string. -func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { +func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { ok, err := proquint.IsProquint(name) if err != nil || !ok { return "", 0, errors.New("not a valid proquint string") @@ -27,3 +27,17 @@ func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, options // Return a 0 TTL as caching this result is pointless. return path.FromString(string(proquint.Decode(name))), 0, nil } + +func (r *ProquintResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + out := make(chan onceResult, 1) + defer close(out) + + ok, err := proquint.IsProquint(name) + if err != nil || !ok { + out <- onceResult{err: errors.New("not a valid proquint string")} + return out + } + // Return a 0 TTL as caching this result is pointless. + out <- onceResult{value: path.FromString(string(proquint.Decode(name)))} + return out +} diff --git a/namesys/routing.go b/namesys/routing.go index dc53868ad7..d633c2d8dc 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -42,9 +42,13 @@ func (r *IpnsResolver) Resolve(ctx context.Context, name string, options ...opts return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } +func (r *IpnsResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { + return resolveAsync(ctx, r, name, opts.ProcessOpts(options), "/ipns/") +} + // resolveOnce implements resolver. Uses the IPFS routing system to // resolve SFS-like names. -func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *opts.ResolveOpts) (path.Path, time.Duration, error) { +func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { log.Debugf("RoutingResolver resolving %s", name) if options.DhtTimeout != 0 { @@ -126,3 +130,132 @@ func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options *op return p, ttl, nil } + +func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + out := make(chan onceResult, 1) + log.Debugf("RoutingResolver resolving %s", name) + if options.DhtTimeout != 0 { + // Resolution must complete within the timeout + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, options.DhtTimeout) + defer cancel() + } + + name = strings.TrimPrefix(name, "/ipns/") + hash, err := mh.FromB58String(name) + if err != nil { + // name should be a multihash. if it isn't, error out here. + log.Debugf("RoutingResolver: bad input hash: [%s]\n", name) + out <- onceResult{err: err} + close(out) + return out + } + + pid, err := peer.IDFromBytes(hash) + if err != nil { + log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) + out <- onceResult{err: err} + close(out) + return out + } + + // Name should be the hash of a public key retrievable from ipfs. + // We retrieve the public key here to make certain that it's in the peer + // store before calling GetValue() on the DHT - the DHT will call the + // ipns validator, which in turn will get the public key from the peer + // store to verify the record signature + _, err = routing.GetPublicKey(r.routing, ctx, pid) + if err != nil { + log.Debugf("RoutingResolver: could not retrieve public key %s: %s\n", name, err) + out <- onceResult{err: err} + close(out) + return out + } + + // Use the routing system to get the name. + // Note that the DHT will call the ipns validator when retrieving + // the value, which in turn verifies the ipns record signature + ipnsKey := ipns.RecordKey(pid) + + vals, err := r.routing.(*dht.IpfsDHT).SearchValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) + if err != nil { + log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) + out <- onceResult{err: err} + close(out) + return out + } + + go func() { + defer close(out) + for { + select { + case val, ok := <-vals: + if !ok { + return + } + + entry := new(pb.IpnsEntry) + err = proto.Unmarshal(val, entry) + if err != nil { + log.Debugf("RoutingResolver: could not unmarshal value for name %s: %s", name, err) + select { + case out <- onceResult{err: err}: + case <-ctx.Done(): + } + return + } + + var p path.Path + // check for old style record: + if valh, err := mh.Cast(entry.GetValue()); err == nil { + // Its an old style multihash record + log.Debugf("encountered CIDv0 ipns entry: %s", valh) + p = path.FromCid(cid.NewCidV0(valh)) + } else { + // Not a multihash, probably a new style record + p, err = path.ParsePath(string(entry.GetValue())) + if err != nil { + select { + case out <- onceResult{err: err}: + case <-ctx.Done(): + } + return + } + } + + ttl := DefaultResolverCacheTTL + if entry.Ttl != nil { + ttl = time.Duration(*entry.Ttl) + } + switch eol, err := ipns.GetEOL(entry); err { + case ipns.ErrUnrecognizedValidity: + // No EOL. + case nil: + ttEol := eol.Sub(time.Now()) + if ttEol < 0 { + // It *was* valid when we first resolved it. + ttl = 0 + } else if ttEol < ttl { + ttl = ttEol + } + default: + log.Errorf("encountered error when parsing EOL: %s", err) + select { + case out <- onceResult{err: err}: + case <-ctx.Done(): + } + return + } + + select { + case out <- onceResult{value: p, ttl: ttl}: + case <-ctx.Done(): + } + case <-ctx.Done(): + return + } + } + }() + + return out +} From 0fda20a6c294db3ec3d7447a040cf4d5846be8e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 28 Aug 2018 01:06:12 +0200 Subject: [PATCH 2315/3147] namesys: async: go vet fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@e848eb7e776f179c27930488b20534c19dddacf1 --- namesys/base.go | 24 ++++++++++++++---------- namesys/dns.go | 8 ++++++-- namesys/interface.go | 4 ++-- namesys/namesys_test.go | 6 +++++- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 6e5dc70e07..b3610cc0d5 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -68,23 +68,24 @@ func resolveAsyncDo(ctx context.Context, r resolver, name string, options opts.R for { select { case res, ok := <-resCh: - if res.err != nil { - outCh <- Result{err: res.err} - return - } if !ok { resCh = nil continue } + + if res.err != nil { + outCh <- Result{Err: res.err} + return + } log.Debugf("resolved %s to %s", name, res.value.String()) if strings.HasPrefix(res.value.String(), "/ipfs/") { - outCh <- Result{err: res.err} + outCh <- Result{Err: res.err} continue } p := strings.TrimPrefix(res.value.String(), prefix) if depth == 1 { - outCh <- Result{err: ErrResolveRecursion} + outCh <- Result{Err: ErrResolveRecursion} continue } @@ -99,17 +100,20 @@ func resolveAsyncDo(ctx context.Context, r resolver, name string, options opts.R cancelSub() } subCtx, cancelSub = context.WithCancel(ctx) + defer cancelSub() subCh = resolveAsyncDo(subCtx, r, p, subopts, prefix) case res, ok := <-subCh: - if res.err != nil { - outCh <- Result{err: res.err} - return - } if !ok { subCh = nil continue } + + if res.Err != nil { + outCh <- Result{Err: res.Err} + return + } + outCh <- res case <-ctx.Done(): } diff --git a/namesys/dns.go b/namesys/dns.go index a8e0b0fc2b..d92ce8fa7b 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -31,6 +31,10 @@ func (r *DNSResolver) Resolve(ctx context.Context, name string, options ...opts. return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } +func (r *DNSResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { + return resolveAsync(ctx, r, name, opts.ProcessOpts(options), "/ipns/") +} + type lookupRes struct { path path.Path error error @@ -112,8 +116,8 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options } if subRes.error == nil { select { - case out <- onceResult{value: subRes.path}: - case <-ctx.Done(): + case out <- onceResult{value: subRes.path}: + case <-ctx.Done(): } return } diff --git a/namesys/interface.go b/namesys/interface.go index aac3f324a5..dd195cc9ab 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -65,8 +65,8 @@ type NameSystem interface { // Result is the return type for Resolver.ResolveAsync. type Result struct { - path path.Path - err error + Path path.Path + Err error } // Resolver is an object capable of resolving names. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index c2a530c26c..23a1852f84 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -38,11 +38,15 @@ func testResolution(t *testing.T, resolver Resolver, name string, depth uint, ex } } -func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts *opts.ResolveOpts) (path.Path, time.Duration, error) { +func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts opts.ResolveOpts) (path.Path, time.Duration, error) { p, err := path.ParsePath(r.entries[name]) return p, 0, err } +func (r *mockResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + panic("stub") +} + func mockResolverOne() *mockResolver { return &mockResolver{ entries: map[string]string{ From 98a9b5448695c282b7278aac2f98477c3f35977c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 28 Aug 2018 15:37:12 +0200 Subject: [PATCH 2316/3147] namesys: switch to async code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@314cdfecb6942f50ec0772c932b8d9736ed98a54 --- namesys/base.go | 66 +++++-------- namesys/dns.go | 67 ++++--------- namesys/ipns_resolver_validation_test.go | 11 +-- namesys/namesys.go | 42 -------- namesys/namesys_test.go | 14 ++- namesys/proquint.go | 13 +-- namesys/routing.go | 117 ++++------------------- 7 files changed, 74 insertions(+), 256 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index b3610cc0d5..c248327995 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -17,45 +17,33 @@ type onceResult struct { } type resolver interface { - // resolveOnce looks up a name once (without recursion). - resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (value path.Path, ttl time.Duration, err error) - resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult } // resolve is a helper for implementing Resolver.ResolveN using resolveOnce. func resolve(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) (path.Path, error) { - depth := options.Depth - for { - p, _, err := r.resolveOnce(ctx, name, options) - if err != nil { - return "", err - } - log.Debugf("resolved %s to %s", name, p.String()) + ctx, cancel := context.WithCancel(ctx) + defer cancel() - if strings.HasPrefix(p.String(), "/ipfs/") { - // we've bottomed out with an IPFS path - return p, nil - } + err := ErrResolveFailed + var p path.Path - if depth == 1 { - return p, ErrResolveRecursion - } + resCh := resolveAsync(ctx, r, name, options, prefix) - if !strings.HasPrefix(p.String(), prefix) { - return p, nil - } - name = strings.TrimPrefix(p.String(), prefix) - - if depth > 1 { - depth-- + for res := range resCh { + p, err = res.Path, res.Err + if err != nil { + break } } + + return p, err } //TODO: // - better error handling -func resolveAsyncDo(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) <-chan Result { +// - select on writes +func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) <-chan Result { resCh := r.resolveOnceAsync(ctx, name, options) depth := options.Depth outCh := make(chan Result) @@ -70,7 +58,7 @@ func resolveAsyncDo(ctx context.Context, r resolver, name string, options opts.R case res, ok := <-resCh: if !ok { resCh = nil - continue + break } if res.err != nil { @@ -79,14 +67,13 @@ func resolveAsyncDo(ctx context.Context, r resolver, name string, options opts.R } log.Debugf("resolved %s to %s", name, res.value.String()) if strings.HasPrefix(res.value.String(), "/ipfs/") { - outCh <- Result{Err: res.err} - continue + outCh <- Result{Path: res.value} + break } - p := strings.TrimPrefix(res.value.String(), prefix) if depth == 1 { - outCh <- Result{Err: ErrResolveRecursion} - continue + outCh <- Result{Path: res.value, Err: ErrResolveRecursion} + break } subopts := options @@ -102,26 +89,21 @@ func resolveAsyncDo(ctx context.Context, r resolver, name string, options opts.R subCtx, cancelSub = context.WithCancel(ctx) defer cancelSub() - subCh = resolveAsyncDo(subCtx, r, p, subopts, prefix) + p := strings.TrimPrefix(res.value.String(), prefix) + subCh = resolveAsync(subCtx, r, p, subopts, prefix) case res, ok := <-subCh: if !ok { subCh = nil - continue - } - - if res.Err != nil { - outCh <- Result{Err: res.Err} - return + break } outCh <- res case <-ctx.Done(): } + if resCh == nil && subCh == nil { + return + } } }() return outCh } - -func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) <-chan Result { - return resolveAsyncDo(ctx, r, name, options, prefix) -} diff --git a/namesys/dns.go b/namesys/dns.go index d92ce8fa7b..f90880de9a 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -5,7 +5,6 @@ import ( "errors" "net" "strings" - "time" opts "github.com/ipfs/go-ipfs/namesys/opts" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" @@ -31,6 +30,7 @@ func (r *DNSResolver) Resolve(ctx context.Context, name string, options ...opts. return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } +// ResolveAsync implements Resolver. func (r *DNSResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { return resolveAsync(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } @@ -43,51 +43,6 @@ type lookupRes struct { // resolveOnce implements resolver. // TXT records for a given domain name should contain a b58 // encoded multihash. -func (r *DNSResolver) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { - segments := strings.SplitN(name, "/", 2) - domain := segments[0] - - if !isd.IsDomain(domain) { - return "", 0, errors.New("not a valid domain name") - } - log.Debugf("DNSResolver resolving %s", domain) - - rootChan := make(chan lookupRes, 1) - go workDomain(r, domain, rootChan) - - subChan := make(chan lookupRes, 1) - go workDomain(r, "_dnslink."+domain, subChan) - - var subRes lookupRes - select { - case subRes = <-subChan: - case <-ctx.Done(): - return "", 0, ctx.Err() - } - - var p path.Path - if subRes.error == nil { - p = subRes.path - } else { - var rootRes lookupRes - select { - case rootRes = <-rootChan: - case <-ctx.Done(): - return "", 0, ctx.Err() - } - if rootRes.error == nil { - p = rootRes.path - } else { - return "", 0, ErrResolveFailed - } - } - var err error - if len(segments) > 1 { - p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[1]) - } - return p, 0, err -} - func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { out := make(chan onceResult, 1) segments := strings.SplitN(name, "/", 2) @@ -106,6 +61,13 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options subChan := make(chan lookupRes, 1) go workDomain(r, "_dnslink."+domain, subChan) + appendPath := func(p path.Path) (path.Path, error) { + if len(segments) > 1 { + return path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[1]) + } + return p, nil + } + go func() { defer close(out) for { @@ -113,21 +75,25 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options case subRes, ok := <-subChan: if !ok { subChan = nil + break } if subRes.error == nil { + p, err := appendPath(subRes.path) select { - case out <- onceResult{value: subRes.path}: + case out <- onceResult{value: p, err: err}: case <-ctx.Done(): } return } case rootRes, ok := <-rootChan: if !ok { - subChan = nil + rootChan = nil + break } if rootRes.error == nil { + p, err := appendPath(rootRes.path) select { - case out <- onceResult{value: rootRes.path}: + case out <- onceResult{value: p, err: err}: case <-ctx.Done(): } } @@ -144,8 +110,9 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options } func workDomain(r *DNSResolver, name string, res chan lookupRes) { - txt, err := r.lookupTXT(name) + defer close(res) + txt, err := r.lookupTXT(name) if err != nil { // Error is != nil res <- lookupRes{"", err} diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index cc99bf1d7b..36e5fdc67a 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -57,14 +57,13 @@ func TestResolverValidation(t *testing.T) { } // Resolve entry - resp, _, err := resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) + resp, err := resolve(ctx, resolver, id.Pretty(), opts.DefaultResolveOpts(), "/ipns/") if err != nil { t.Fatal(err) } if resp != path.Path(p) { t.Fatalf("Mismatch between published path %s and resolved path %s", p, resp) } - // Create expired entry expiredEntry, err := ipns.Create(priv, p, 1, ts.Add(-1*time.Hour)) if err != nil { @@ -78,7 +77,7 @@ func TestResolverValidation(t *testing.T) { } // Record should fail validation because entry is expired - _, _, err = resolver.resolveOnce(ctx, id.Pretty(), opts.DefaultResolveOpts()) + _, err = resolve(ctx, resolver, id.Pretty(), opts.DefaultResolveOpts(), "/ipns/") if err == nil { t.Fatal("ValidateIpnsRecord should have returned error") } @@ -100,7 +99,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key defined by // ipns path doesn't match record signature - _, _, err = resolver.resolveOnce(ctx, id2.Pretty(), opts.DefaultResolveOpts()) + _, err = resolve(ctx, resolver, id2.Pretty(), opts.DefaultResolveOpts(), "/ipns/") if err == nil { t.Fatal("ValidateIpnsRecord should have failed signature verification") } @@ -118,7 +117,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key is not available // in peer store or on network - _, _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) + _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts(), "/ipns/") if err == nil { t.Fatal("ValidateIpnsRecord should have failed because public key was not found") } @@ -133,7 +132,7 @@ func TestResolverValidation(t *testing.T) { // public key is available in the peer store by looking it up in // the DHT, which causes the DHT to fetch it and cache it in the // peer store - _, _, err = resolver.resolveOnce(ctx, id3.Pretty(), opts.DefaultResolveOpts()) + _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts(), "/ipns/") if err != nil { t.Fatal(err) } diff --git a/namesys/namesys.go b/namesys/namesys.go index 0842486ea1..1099997b23 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -82,48 +82,6 @@ func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.R } // resolveOnce implements resolver. -func (ns *mpns) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { - if !strings.HasPrefix(name, "/ipns/") { - name = "/ipns/" + name - } - segments := strings.SplitN(name, "/", 4) - if len(segments) < 3 || segments[0] != "" { - log.Debugf("invalid name syntax for %s", name) - return "", 0, ErrResolveFailed - } - - key := segments[2] - - p, ok := ns.cacheGet(key) - var err error - if !ok { - // Resolver selection: - // 1. if it is a multihash resolve through "ipns". - // 2. if it is a domain name, resolve through "dns" - // 3. otherwise resolve through the "proquint" resolver - var res resolver - if _, err := mh.FromB58String(key); err == nil { - res = ns.ipnsResolver - } else if isd.IsDomain(key) { - res = ns.dnsResolver - } else { - res = ns.proquintResolver - } - - var ttl time.Duration - p, ttl, err = res.resolveOnce(ctx, key, options) - if err != nil { - return "", 0, ErrResolveFailed - } - ns.cacheSet(key, p, ttl) - } - - if len(segments) > 3 { - p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) - } - return p, 0, err -} - func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { out := make(chan onceResult, 1) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 23a1852f84..09d5cf81e4 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -4,12 +4,11 @@ import ( "context" "fmt" "testing" - "time" opts "github.com/ipfs/go-ipfs/namesys/opts" + "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" offroute "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/offline" ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" @@ -38,13 +37,12 @@ func testResolution(t *testing.T, resolver Resolver, name string, depth uint, ex } } -func (r *mockResolver) resolveOnce(ctx context.Context, name string, opts opts.ResolveOpts) (path.Path, time.Duration, error) { - p, err := path.ParsePath(r.entries[name]) - return p, 0, err -} - func (r *mockResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { - panic("stub") + p, err := path.ParsePath(r.entries[name]) + out := make(chan onceResult, 1) + out <- onceResult{value: p, err: err} + close(out) + return out } func mockResolverOne() *mockResolver { diff --git a/namesys/proquint.go b/namesys/proquint.go index 279c361fdd..ad09fd48c2 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -1,10 +1,8 @@ package namesys import ( + "context" "errors" - "time" - - context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" @@ -19,15 +17,6 @@ func (r *ProquintResolver) Resolve(ctx context.Context, name string, options ... } // resolveOnce implements resolver. Decodes the proquint string. -func (r *ProquintResolver) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { - ok, err := proquint.IsProquint(name) - if err != nil || !ok { - return "", 0, errors.New("not a valid proquint string") - } - // Return a 0 TTL as caching this result is pointless. - return path.FromString(string(proquint.Decode(name))), 0, nil -} - func (r *ProquintResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { out := make(chan onceResult, 1) defer close(out) diff --git a/namesys/routing.go b/namesys/routing.go index d633c2d8dc..c591d5662e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -11,6 +11,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" + ropts "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing/options" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" dht "gx/ipfs/QmZVakpN44VAUxs9eXAuUGLFYTCGmSyqSy6hyEKfMv68ME/go-libp2p-kad-dht" ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" @@ -42,120 +43,30 @@ func (r *IpnsResolver) Resolve(ctx context.Context, name string, options ...opts return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } +// ResolveAsync implements Resolver. func (r *IpnsResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { return resolveAsync(ctx, r, name, opts.ProcessOpts(options), "/ipns/") } // resolveOnce implements resolver. Uses the IPFS routing system to // resolve SFS-like names. -func (r *IpnsResolver) resolveOnce(ctx context.Context, name string, options opts.ResolveOpts) (path.Path, time.Duration, error) { - log.Debugf("RoutingResolver resolving %s", name) - - if options.DhtTimeout != 0 { - // Resolution must complete within the timeout - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, options.DhtTimeout) - defer cancel() - } - - name = strings.TrimPrefix(name, "/ipns/") - pid, err := peer.IDB58Decode(name) - if err != nil { - // name should be a multihash. if it isn't, error out here. - log.Debugf("RoutingResolver: IPNS address not a valid peer ID: [%s]\n", name) - return "", 0, err - } - - // Name should be the hash of a public key retrievable from ipfs. - // We retrieve the public key here to make certain that it's in the peer - // store before calling GetValue() on the DHT - the DHT will call the - // ipns validator, which in turn will get the public key from the peer - // store to verify the record signature - _, err = routing.GetPublicKey(r.routing, ctx, pid) - if err != nil { - log.Debugf("RoutingResolver: could not retrieve public key %s: %s\n", name, err) - return "", 0, err - } - - // Use the routing system to get the name. - // Note that the DHT will call the ipns validator when retrieving - // the value, which in turn verifies the ipns record signature - ipnsKey := ipns.RecordKey(pid) - val, err := r.routing.GetValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) - if err != nil { - log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) - return "", 0, err - } - - entry := new(pb.IpnsEntry) - err = proto.Unmarshal(val, entry) - if err != nil { - log.Debugf("RoutingResolver: could not unmarshal value for name %s: %s", name, err) - return "", 0, err - } - - var p path.Path - // check for old style record: - if valh, err := mh.Cast(entry.GetValue()); err == nil { - // Its an old style multihash record - log.Debugf("encountered CIDv0 ipns entry: %s", valh) - p = path.FromCid(cid.NewCidV0(valh)) - } else { - // Not a multihash, probably a new record - p, err = path.ParsePath(string(entry.GetValue())) - if err != nil { - return "", 0, err - } - } - - ttl := DefaultResolverCacheTTL - if entry.Ttl != nil { - ttl = time.Duration(*entry.Ttl) - } - switch eol, err := ipns.GetEOL(entry); err { - case ipns.ErrUnrecognizedValidity: - // No EOL. - case nil: - ttEol := eol.Sub(time.Now()) - if ttEol < 0 { - // It *was* valid when we first resolved it. - ttl = 0 - } else if ttEol < ttl { - ttl = ttEol - } - default: - log.Errorf("encountered error when parsing EOL: %s", err) - return "", 0, err - } - - return p, ttl, nil -} - func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { out := make(chan onceResult, 1) log.Debugf("RoutingResolver resolving %s", name) + cancel := func() {} + if options.DhtTimeout != 0 { // Resolution must complete within the timeout - var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, options.DhtTimeout) - defer cancel() } name = strings.TrimPrefix(name, "/ipns/") - hash, err := mh.FromB58String(name) - if err != nil { - // name should be a multihash. if it isn't, error out here. - log.Debugf("RoutingResolver: bad input hash: [%s]\n", name) - out <- onceResult{err: err} - close(out) - return out - } - - pid, err := peer.IDFromBytes(hash) + pid, err := peer.IDB58Decode(name) if err != nil { log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) out <- onceResult{err: err} close(out) + cancel() return out } @@ -169,6 +80,7 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option log.Debugf("RoutingResolver: could not retrieve public key %s: %s\n", name, err) out <- onceResult{err: err} close(out) + cancel() return out } @@ -177,15 +89,17 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option // the value, which in turn verifies the ipns record signature ipnsKey := ipns.RecordKey(pid) - vals, err := r.routing.(*dht.IpfsDHT).SearchValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) + vals, err := r.searchValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) if err != nil { log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) out <- onceResult{err: err} close(out) + cancel() return out } go func() { + defer cancel() defer close(out) for { select { @@ -259,3 +173,14 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option return out } + +func (r *IpnsResolver) searchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { + if ir, ok := r.routing.(*dht.IpfsDHT); ok { + return ir.SearchValue(ctx, key, opts...) + } + out := make(chan []byte, 1) + val, err := r.routing.GetValue(ctx, key, opts...) + out <- val + close(out) + return out, err +} From 5956870df8f178cbd4e67a4751c45ae99c352b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 29 Aug 2018 01:03:56 +0200 Subject: [PATCH 2317/3147] ipfs name resolve --stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@0a8d77f746f8a2cdcb54aa8232cbc31c1fca32e0 --- namesys/namesys_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 09d5cf81e4..301c98a5f6 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,14 +7,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" offroute "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/offline" + "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" pstoremem "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore/pstoremem" ) From f7d2c1743e944c95c5b7b47cc23fcc191abd5779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 24 Sep 2018 16:12:47 +0200 Subject: [PATCH 2318/3147] namesys: use routing.SearchValue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@c4dd494eed5de7a93bf091ef31e83ffaa125e3d4 --- namesys/routing.go | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/namesys/routing.go b/namesys/routing.go index c591d5662e..6ac9f081a4 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -11,7 +11,6 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" - ropts "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing/options" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" dht "gx/ipfs/QmZVakpN44VAUxs9eXAuUGLFYTCGmSyqSy6hyEKfMv68ME/go-libp2p-kad-dht" ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" @@ -89,7 +88,7 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option // the value, which in turn verifies the ipns record signature ipnsKey := ipns.RecordKey(pid) - vals, err := r.searchValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) + vals, err := r.routing.SearchValue(ctx, ipnsKey, dht.Quorum(int(options.DhtRecordCount))) if err != nil { log.Debugf("RoutingResolver: dht get for name %s failed: %s", name, err) out <- onceResult{err: err} @@ -173,14 +172,3 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option return out } - -func (r *IpnsResolver) searchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { - if ir, ok := r.routing.(*dht.IpfsDHT); ok { - return ir.SearchValue(ctx, key, opts...) - } - out := make(chan []byte, 1) - val, err := r.routing.GetValue(ctx, key, opts...) - out <- val - close(out) - return out, err -} From c7ea08749d5f72a135c0dadced5e10bf7d25798d Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Sat, 22 Sep 2018 17:36:14 -0700 Subject: [PATCH 2319/3147] Fix inability to pin two things at once License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-pinner@b252b7c8ed8bcbcbf4ff9da591a9b321d00218f5 --- pinning/pinner/pin.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index cadc4530a3..233e99623b 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -228,16 +228,20 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { if p.directPin.Has(c) { p.directPin.Remove(c) } - + p.lock.Unlock() // fetch entire graph err := mdag.FetchGraph(ctx, c, p.dserv) + p.lock.Lock() if err != nil { return err } p.recursePin.Add(c) } else { - if _, err := p.dserv.Get(ctx, c); err != nil { + p.lock.Unlock() + _, err := p.dserv.Get(ctx, c) + p.lock.Lock() + if err != nil { return err } From 4a2dcd53eb1ce42345c8fe39a2ecc9ccfe736a91 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Sun, 23 Sep 2018 09:29:00 -0700 Subject: [PATCH 2320/3147] Repeat recurse/direct pin checks since they could have changed License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-pinner@56bb470b00e4ef486874c45fc939f2363bcec110 --- pinning/pinner/pin.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 233e99623b..f6100749ff 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -236,6 +236,14 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { return err } + if p.recursePin.Has(c) { + return nil + } + + if p.directPin.Has(c) { + p.directPin.Remove(c) + } + p.recursePin.Add(c) } else { p.lock.Unlock() From 9576321a91091b921b67af6ce21dcfa0130b2ca4 Mon Sep 17 00:00:00 2001 From: Kejie Zhang Date: Sat, 29 Sep 2018 13:48:30 +0800 Subject: [PATCH 2321/3147] add check chunker size This commit was moved from ipfs/go-ipfs-chunker@449ca4407c2086378566610ff4e81d9c3d297fe3 --- chunker/parse.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/chunker/parse.go b/chunker/parse.go index d7764d7b41..af0a31e80c 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -8,7 +8,10 @@ import ( "strings" ) -var ErrRabinMin = errors.New("rabin min must be greater than 16") +var ( + ErrRabinMin = errors.New("rabin min must be greater than 16") + ErrSize = errors.New("chunker size muster greater than 0") +) // FromString returns a Splitter depending on the given string: // it supports "default" (""), "size-{size}", "rabin", "rabin-{blocksize}" and @@ -23,6 +26,8 @@ func FromString(r io.Reader, chunker string) (Splitter, error) { size, err := strconv.Atoi(sizeStr) if err != nil { return nil, err + } else if size <= 0 { + return nil, ErrSize } return NewSizeSplitter(r, int64(size)), nil From 113a55fc341560ded8620c02c7f634c2a44bc29c Mon Sep 17 00:00:00 2001 From: Kejie Zhang Date: Sat, 29 Sep 2018 13:53:07 +0800 Subject: [PATCH 2322/3147] update parse test This commit was moved from ipfs/go-ipfs-chunker@4a54cc588f3c7ce3ec0e5bc4c78e9f5d5a8618b2 --- chunker/parse_test.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/chunker/parse_test.go b/chunker/parse_test.go index 4dd8afc2df..f82aba5f2c 100644 --- a/chunker/parse_test.go +++ b/chunker/parse_test.go @@ -5,7 +5,7 @@ import ( "testing" ) -func TestParse(t *testing.T) { +func TestParseRabin(t *testing.T) { max := 1000 r := bytes.NewReader(randBuf(t, max)) chk1 := "rabin-18-25-32" @@ -19,3 +19,18 @@ func TestParse(t *testing.T) { t.Log("it should be ErrRabinMin here.") } } + +func TestParseSize(t *testing.T) { + max := 1000 + r := bytes.NewReader(randBuf(t, max)) + size1 := "size-0" + size2 := "size-32" + _, err := FromString(r, size1) + if err == ErrSize { + t.Log("it should be ErrSize here.") + } + _, err = FromString(r, size2) + if err == ErrSize { + t.Fatal(err) + } +} From 9df903d67183fbb9c9ae66de11a4c62f92f7c1ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Oct 2018 12:31:50 +0200 Subject: [PATCH 2323/3147] coreapi swarm: missing docs, review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@162cac0144b96596576bc9ec7389afaa8eb56135 --- coreiface/swarm.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index caa6a70e32..8b464e5c1f 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -29,10 +29,10 @@ type ConnectionInfo interface { Direction() net.Direction // Latency returns last known round trip time to the peer - Latency(context.Context) (time.Duration, error) + Latency() (time.Duration, error) // Streams returns list of streams established with the peer - Streams(context.Context) ([]protocol.ID, error) + Streams() ([]protocol.ID, error) } // SwarmAPI specifies the interface to libp2p swarm @@ -46,7 +46,12 @@ type SwarmAPI interface { // Peers returns the list of peers we are connected to Peers(context.Context) ([]ConnectionInfo, error) + // KnownAddrs returns the list of all addresses this node is aware of KnownAddrs(context.Context) (map[peer.ID][]ma.Multiaddr, error) + + // LocalAddrs returns the list of announced listening addresses LocalAddrs(context.Context) ([]ma.Multiaddr, error) + + // ListenAddrs returns the list of all listening addresses ListenAddrs(context.Context) ([]ma.Multiaddr, error) } From b7e28a936c5c9edee31e262c366c30fde7d872ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 19 Sep 2018 23:40:45 +0200 Subject: [PATCH 2324/3147] Cleanup instances of manual resolver construction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@47db102ccd13e62f40e7372b56b33dcf33e63c60 --- coreiface/util.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/coreiface/util.go b/coreiface/util.go index 8fd3e058fa..6d58bf40d2 100644 --- a/coreiface/util.go +++ b/coreiface/util.go @@ -1,10 +1,20 @@ package iface import ( + "context" "io" ) type Reader interface { - io.ReadSeeker + ReadSeekCloser + Size() uint64 + CtxReadFull(context.Context, []byte) (int, error) +} + +// A ReadSeekCloser implements interfaces to read, copy, seek and close. +type ReadSeekCloser interface { + io.Reader + io.Seeker io.Closer + io.WriterTo } From 60c358b08ca8bbb2773d19533ddd9b9864f3d360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Sep 2018 15:00:51 +0200 Subject: [PATCH 2325/3147] coreapi unixfs: use fileAdder directly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@78136afef00445d43c96ec7c66249b881dcf95ff --- coreiface/options/unixfs.go | 50 +++++++++++++++++++++++++++++++++++++ coreiface/unixfs.go | 4 ++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 coreiface/options/unixfs.go diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go new file mode 100644 index 0000000000..8dc9806a77 --- /dev/null +++ b/coreiface/options/unixfs.go @@ -0,0 +1,50 @@ +package options + +import ( + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" +) + +type UnixfsAddSettings struct { + CidVersion int + MhType uint64 + + InlineLimit int +} + +type UnixfsAddOption func(*UnixfsAddSettings) error + +func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, error) { + options := &UnixfsAddSettings{ + CidVersion: -1, + MhType: mh.SHA2_256, + + InlineLimit: 0, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + + return options, nil +} + +type unixfsOpts struct{} + +var Unixfs unixfsOpts + +func (unixfsOpts) CidVersion(version int) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.CidVersion = version + return nil + } +} + +func (unixfsOpts) Hash(mhtype uint64) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.MhType = mhtype + return nil + } +} diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 4a3aff6fc5..10febd9faa 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,13 +4,15 @@ import ( "context" "io" + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) // UnixfsAPI is the basic interface to immutable files in IPFS type UnixfsAPI interface { // Add imports the data from the reader into merkledag file - Add(context.Context, io.Reader) (ResolvedPath, error) + Add(context.Context, io.ReadCloser, ...options.UnixfsAddOption) (ResolvedPath, error) // Cat returns a reader for the file Cat(context.Context, Path) (Reader, error) From 0df36df660ece10808c7af055b59cd7052aaa7cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Sep 2018 15:59:53 +0200 Subject: [PATCH 2326/3147] coreapi unixfs: cid prefix options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@6c7f760b5d8ae479518992b322a7bd1ccc406247 --- coreiface/options/unixfs.go | 8 ++++++-- coreiface/unixfs.go | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 8dc9806a77..ffed75577e 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -8,7 +8,9 @@ type UnixfsAddSettings struct { CidVersion int MhType uint64 - InlineLimit int + InlineLimit int + RawLeaves bool + RawLeavesSet bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -18,7 +20,9 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, error) { CidVersion: -1, MhType: mh.SHA2_256, - InlineLimit: 0, + InlineLimit: 0, + RawLeaves: false, + RawLeavesSet: false, } for _, opt := range opts { diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 10febd9faa..acc3b960ce 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -10,6 +10,7 @@ import ( ) // UnixfsAPI is the basic interface to immutable files in IPFS +// NOTE: This API is heavily WIP, things are guaranteed to break frequently type UnixfsAPI interface { // Add imports the data from the reader into merkledag file Add(context.Context, io.ReadCloser, ...options.UnixfsAddOption) (ResolvedPath, error) From 6a3bc40fc4c131b19837c1007ba3e65a51de6ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Sep 2018 16:19:32 +0200 Subject: [PATCH 2327/3147] coreapi unixfs: options for RawLeaves / Inline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@dbdf6fd63ad66e3b5e5649a349ee9ba9534590a0 --- coreiface/options/unixfs.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index ffed75577e..3c46ed086e 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -52,3 +52,18 @@ func (unixfsOpts) Hash(mhtype uint64) UnixfsAddOption { return nil } } + +func (unixfsOpts) RawLeaves(enable bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.RawLeaves = enable + settings.RawLeavesSet = true + return nil + } +} + +func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.InlineLimit = limit + return nil + } +} From f858a5213f527b1ff67c45692c9e481301678398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Sep 2018 16:40:31 +0200 Subject: [PATCH 2328/3147] coreapi unixfs: layout/chunker options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@ee22ac438536720b2646e6071ecc6519f4161a0c --- coreiface/options/unixfs.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 3c46ed086e..fe41af9a80 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -4,6 +4,13 @@ import ( mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ) +type Layout int + +const ( + BalancedLayout Layout = iota + TrickleLeyout +) + type UnixfsAddSettings struct { CidVersion int MhType uint64 @@ -11,6 +18,9 @@ type UnixfsAddSettings struct { InlineLimit int RawLeaves bool RawLeavesSet bool + + Chunker string + Layout Layout } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -23,6 +33,9 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, error) { InlineLimit: 0, RawLeaves: false, RawLeavesSet: false, + + Chunker: "size-262144", + Layout: BalancedLayout, } for _, opt := range opts { @@ -67,3 +80,17 @@ func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption { return nil } } + +func (unixfsOpts) Chunker(chunker string) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Chunker = chunker + return nil + } +} + +func (unixfsOpts) Layout(layout Layout) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Layout = layout + return nil + } +} From 27ded0dea2d8b2ee4c115c9cd40c2d1514927162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Sep 2018 23:05:22 +0200 Subject: [PATCH 2329/3147] coreapi unixfs: pin/local/hash-only options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@8521907e1a8ac009252669ad3e40be2d93438ad3 --- coreiface/options/unixfs.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index fe41af9a80..6012ce77b2 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -21,6 +21,10 @@ type UnixfsAddSettings struct { Chunker string Layout Layout + + Pin bool + OnlyHash bool + Local bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -36,6 +40,10 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, error) { Chunker: "size-262144", Layout: BalancedLayout, + + Pin: false, + OnlyHash: false, + Local: false, } for _, opt := range opts { @@ -94,3 +102,24 @@ func (unixfsOpts) Layout(layout Layout) UnixfsAddOption { return nil } } + +func (unixfsOpts) Pin(pin bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Pin = pin + return nil + } +} + +func (unixfsOpts) HashOnly(hashOnly bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.OnlyHash = hashOnly + return nil + } +} + +func (unixfsOpts) Local(local bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Local = local + return nil + } +} From c3289a5e7d437768d5f1ea158a9e093034097c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Sep 2018 23:15:07 +0200 Subject: [PATCH 2330/3147] coreapi unixfs: cleanup options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@e62f26507f22f00426172384461c53c7d14b702f --- coreiface/options/unixfs.go | 41 ++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 6012ce77b2..6abfd9622a 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -1,7 +1,12 @@ package options import ( + "errors" + "fmt" + + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + dag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" ) type Layout int @@ -29,7 +34,7 @@ type UnixfsAddSettings struct { type UnixfsAddOption func(*UnixfsAddSettings) error -func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, error) { +func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, error) { options := &UnixfsAddSettings{ CidVersion: -1, MhType: mh.SHA2_256, @@ -49,11 +54,41 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, error) { for _, opt := range opts { err := opt(options) if err != nil { - return nil, err + return nil, cid.Prefix{}, err + } + } + + // (hash != "sha2-256") -> CIDv1 + if options.MhType != mh.SHA2_256 { + switch options.CidVersion { + case 0: + return nil, cid.Prefix{}, errors.New("CIDv0 only supports sha2-256") + case 1, -1: + options.CidVersion = 1 + default: + return nil, cid.Prefix{}, fmt.Errorf("unknown CID version: %d", options.CidVersion) + } + } else { + if options.CidVersion < 0 { + // Default to CIDv0 + options.CidVersion = 0 } } - return options, nil + // cidV1 -> raw blocks (by default) + if options.CidVersion > 0 && !options.RawLeavesSet { + options.RawLeaves = true + } + + prefix, err := dag.PrefixForCidVersion(options.CidVersion) + if err != nil { + return nil, cid.Prefix{}, err + } + + prefix.MhType = options.MhType + prefix.MhLength = -1 + + return options, prefix, nil } type unixfsOpts struct{} From 0039c7d460983de5c06f86459a0fb00b81ed0505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Sep 2018 23:44:49 +0200 Subject: [PATCH 2331/3147] coreapi unixfs: docs on options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@eeb50d8e478fbaff90d4ef5a434834abfff408ad --- coreiface/options/unixfs.go | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 6abfd9622a..9b003e1aff 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -13,7 +13,7 @@ type Layout int const ( BalancedLayout Layout = iota - TrickleLeyout + TrickleLayout ) type UnixfsAddSettings struct { @@ -95,6 +95,8 @@ type unixfsOpts struct{} var Unixfs unixfsOpts +// CidVersion specifies which CID version to use. Defaults to 0 unless an option +// that depends on CIDv1 is passed. func (unixfsOpts) CidVersion(version int) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.CidVersion = version @@ -102,6 +104,9 @@ func (unixfsOpts) CidVersion(version int) UnixfsAddOption { } } +// Hash function to use. Implies CIDv1 if not set to sha2-256 (default). +// +// Table of functions is declared in https://github.com/multiformats/go-multihash/blob/master/multihash.go func (unixfsOpts) Hash(mhtype uint64) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.MhType = mhtype @@ -109,6 +114,8 @@ func (unixfsOpts) Hash(mhtype uint64) UnixfsAddOption { } } +// RawLeaves specifies whether to use raw blocks for leaves (data nodes with no +// links) instead of wrapping them with unixfs structures. func (unixfsOpts) RawLeaves(enable bool) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.RawLeaves = enable @@ -117,6 +124,11 @@ func (unixfsOpts) RawLeaves(enable bool) UnixfsAddOption { } } +// InlineLimit sets the amount of bytes below which blocks will be encoded +// directly into CID instead of being stored and addressed by it's hash +// +// Note that while there is no hard limit on the number of bytes here, it should +// be kept at something reasonably low like 32b (default for 'ipfs add') func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.InlineLimit = limit @@ -124,6 +136,11 @@ func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption { } } +// Chunker specifies settings for the chunking algorithm to use. +// +// Default: size-262144, formats: +// size-[bytes] - Simple chunker splitting data into blocks of n bytes +// rabin-[min]-[avg]-[max] - Rabin chunker func (unixfsOpts) Chunker(chunker string) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.Chunker = chunker @@ -131,6 +148,10 @@ func (unixfsOpts) Chunker(chunker string) UnixfsAddOption { } } +// Layout tells the adder how to balance data between leaves. +// options.BalancedLayout is the default, it's optimized for static seekable +// files. +// options.TrickleLayout is optimized for streaming data, func (unixfsOpts) Layout(layout Layout) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.Layout = layout @@ -138,6 +159,7 @@ func (unixfsOpts) Layout(layout Layout) UnixfsAddOption { } } +// Pin tells the adder to pin the file root recursively after adding func (unixfsOpts) Pin(pin bool) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.Pin = pin @@ -145,6 +167,8 @@ func (unixfsOpts) Pin(pin bool) UnixfsAddOption { } } +// HashOnly will make the adder calculate data hash without storing it in the +// blockstore or announcing it to the network func (unixfsOpts) HashOnly(hashOnly bool) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.OnlyHash = hashOnly @@ -152,6 +176,9 @@ func (unixfsOpts) HashOnly(hashOnly bool) UnixfsAddOption { } } +// Local will add the data to blockstore without announcing it to the network +// +// Note that this doesn't prevent other nodes from getting this data func (unixfsOpts) Local(local bool) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.Local = local From 80a937abb79a84f303465f05d86b206e1e90ff75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Oct 2018 09:42:50 +0200 Subject: [PATCH 2332/3147] coreapi unixfs: separate option to enable inlining MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@88ca0a07599ddd51c3db3864b99c1da87bf87eee --- coreiface/options/unixfs.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 9b003e1aff..df6f4fc711 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -20,6 +20,7 @@ type UnixfsAddSettings struct { CidVersion int MhType uint64 + Inline bool InlineLimit int RawLeaves bool RawLeavesSet bool @@ -39,7 +40,8 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, CidVersion: -1, MhType: mh.SHA2_256, - InlineLimit: 0, + Inline: false, + InlineLimit: 32, RawLeaves: false, RawLeavesSet: false, @@ -124,11 +126,26 @@ func (unixfsOpts) RawLeaves(enable bool) UnixfsAddOption { } } +// Inline tells the adder to inline small blocks into CIDs +func (unixfsOpts) Inline(enable bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Inline = enable + return nil + } +} + // InlineLimit sets the amount of bytes below which blocks will be encoded -// directly into CID instead of being stored and addressed by it's hash +// directly into CID instead of being stored and addressed by it's hash. +// Specifying this option won't enable block inlining. For that use `Inline` +// option. Default: 32 bytes +// +// Note that while there is no hard limit on the number of bytes, it should +// be kept at a reasonably low value, like 64 bytes if you intend to display +// these hashes. Larger values like 256 bytes will work fine, but may affect +// de-duplication of smaller blocks. // -// Note that while there is no hard limit on the number of bytes here, it should -// be kept at something reasonably low like 32b (default for 'ipfs add') +// Setting this value too high may cause various problems, such as render some +// blocks unfetchable func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.InlineLimit = limit From e50aac4cc71c5272b5a53994e958198286a585bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Oct 2018 15:05:46 +0200 Subject: [PATCH 2333/3147] coreapi unixfs: multi file support in unixfs coreapi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@9a760d89b5db34fa0fb7be8c71876e2f18dd8fa2 --- coreiface/unixfs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index acc3b960ce..92168503ec 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -2,10 +2,10 @@ package iface import ( "context" - "io" options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + files "gx/ipfs/QmSP88ryZkHSRn1fnngAaV2Vcn63WUJzAavnRM9CVdU1Ky/go-ipfs-cmdkit/files" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) @@ -13,7 +13,7 @@ import ( // NOTE: This API is heavily WIP, things are guaranteed to break frequently type UnixfsAPI interface { // Add imports the data from the reader into merkledag file - Add(context.Context, io.ReadCloser, ...options.UnixfsAddOption) (ResolvedPath, error) + Add(context.Context, files.File, ...options.UnixfsAddOption) (ResolvedPath, error) // Cat returns a reader for the file Cat(context.Context, Path) (Reader, error) From 15a4331a185c812bab3e229758bcfc79d682ac5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Oct 2018 17:21:07 +0200 Subject: [PATCH 2334/3147] coreapi unixfs: unixfs.Get MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@7b2fdc90ee0528d4c0a437d95b1cb0d10c3e8aa5 --- coreiface/unixfs.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 92168503ec..69e7318226 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -13,8 +13,16 @@ import ( // NOTE: This API is heavily WIP, things are guaranteed to break frequently type UnixfsAPI interface { // Add imports the data from the reader into merkledag file + // + // TODO: a long useful comment on how to use this for many different scenarios Add(context.Context, files.File, ...options.UnixfsAddOption) (ResolvedPath, error) + // Get returns a read-only handle to a file tree referenced by a path + // + // Note that some implementations of this API may apply the specified context + // to operations performed on the returned file + Get(context.Context, Path) (files.File, error) + // Cat returns a reader for the file Cat(context.Context, Path) (Reader, error) From 59fd418b398d9011c79167b82af869751acf2640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Oct 2018 22:30:45 +0200 Subject: [PATCH 2335/3147] coreapi unixfs: wrap option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@b977abfc696b22775fa68736c144760113b27af4 --- coreiface/options/unixfs.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index df6f4fc711..abbea96819 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -31,6 +31,8 @@ type UnixfsAddSettings struct { Pin bool OnlyHash bool Local bool + + Wrap bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -51,6 +53,8 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, Pin: false, OnlyHash: false, Local: false, + + Wrap: false, } for _, opt := range opts { @@ -202,3 +206,12 @@ func (unixfsOpts) Local(local bool) UnixfsAddOption { return nil } } + +// Wrap tells the adder to wrap the added file structure with an additional +// directory. +func (unixfsOpts) Wrap(wrap bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Wrap = wrap + return nil + } +} From 1019fcea4b88f3a45cf81429f81066db1918771f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Oct 2018 22:49:42 +0200 Subject: [PATCH 2336/3147] coreapi unixfs: hidden opiton MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@cb84af4b44e4660029e87a1c82a3d2ab35acb2cd --- coreiface/options/unixfs.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index abbea96819..7d7af5b818 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -32,7 +32,8 @@ type UnixfsAddSettings struct { OnlyHash bool Local bool - Wrap bool + Wrap bool + Hidden bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -54,7 +55,8 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, OnlyHash: false, Local: false, - Wrap: false, + Wrap: false, + Hidden: false, } for _, opt := range opts { @@ -215,3 +217,11 @@ func (unixfsOpts) Wrap(wrap bool) UnixfsAddOption { return nil } } + +// Hidden enables adding of hidden files (files prefixed with '.') +func (unixfsOpts) Hidden(hidden bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Hidden = hidden + return nil + } +} From 907d2f239738971d246b9ff9ce5add004adad2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Oct 2018 23:17:18 +0200 Subject: [PATCH 2337/3147] coreapi unixfs: stdin-name option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@aa7a877686c76f0767fa6fb618972b25f1545bb6 --- coreiface/options/unixfs.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 7d7af5b818..90ad53e9ea 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -32,8 +32,9 @@ type UnixfsAddSettings struct { OnlyHash bool Local bool - Wrap bool - Hidden bool + Wrap bool + Hidden bool + StdinName string } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -55,8 +56,9 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, OnlyHash: false, Local: false, - Wrap: false, - Hidden: false, + Wrap: false, + Hidden: false, + StdinName: "", } for _, opt := range opts { @@ -225,3 +227,12 @@ func (unixfsOpts) Hidden(hidden bool) UnixfsAddOption { return nil } } + +// StdinName is the name set for files which don specify FilePath as +// os.Stdin.Name() +func (unixfsOpts) StdinName(name string) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.StdinName = name + return nil + } +} From 56ef5340a321a06604f4f98efcba4da03b6a4358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Oct 2018 01:00:26 +0200 Subject: [PATCH 2338/3147] coreapi unixfs: progress events MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@df1797113e1dc062a9e53af11b8ea4268c855ef9 --- coreiface/options/unixfs.go | 35 +++++++++++++++++++++++++++++++++++ coreiface/unixfs.go | 9 +++++++++ 2 files changed, 44 insertions(+) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 90ad53e9ea..da99b42f66 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -35,6 +35,10 @@ type UnixfsAddSettings struct { Wrap bool Hidden bool StdinName string + + Events chan<- interface{} + Silent bool + Progress bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -59,6 +63,10 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, Wrap: false, Hidden: false, StdinName: "", + + Events: nil, + Silent: false, + Progress: false, } for _, opt := range opts { @@ -236,3 +244,30 @@ func (unixfsOpts) StdinName(name string) UnixfsAddOption { return nil } } + +// Events specifies channel which will be used to report events about ongoing +// Add operation. +// +// Note that if this channel blocks it may slowdown the adder +func (unixfsOpts) Events(sink chan<- interface{}) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Events = sink + return nil + } +} + +// Silent reduces event output +func (unixfsOpts) Silent(silent bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Silent = silent + return nil + } +} + +// Progress tells the adder whether to enable progress events +func (unixfsOpts) Progress(enable bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.Progress = enable + return nil + } +} diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 69e7318226..c622e210e5 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -9,6 +9,14 @@ import ( ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) +// TODO: ideas on making this more coreapi-ish without breaking the http API? +type AddEvent struct { + Name string + Hash string `json:",omitempty"` + Bytes int64 `json:",omitempty"` + Size string `json:",omitempty"` +} + // UnixfsAPI is the basic interface to immutable files in IPFS // NOTE: This API is heavily WIP, things are guaranteed to break frequently type UnixfsAPI interface { @@ -24,6 +32,7 @@ type UnixfsAPI interface { Get(context.Context, Path) (files.File, error) // Cat returns a reader for the file + // TODO: Remove in favour of Get (if we use Get on a file we still have reader directly, so..) Cat(context.Context, Path) (Reader, error) // Ls returns the list of links in a directory From 90e8604702cde52200882080a6a8b5b3e0818d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Oct 2018 01:24:57 +0200 Subject: [PATCH 2339/3147] coreapi unixfs: filestore opts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@97fb3e4d819ee3ee511a719da6d1bef4695a2dad --- coreiface/options/unixfs.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index da99b42f66..810e3c6e84 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -31,6 +31,8 @@ type UnixfsAddSettings struct { Pin bool OnlyHash bool Local bool + FsCache bool + NoCopy bool Wrap bool Hidden bool @@ -59,6 +61,8 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, Pin: false, OnlyHash: false, Local: false, + FsCache: false, + NoCopy: false, Wrap: false, Hidden: false, @@ -76,6 +80,17 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, } } + // nocopy -> rawblocks + if options.NoCopy && !options.RawLeaves { + // fixed? + if options.RawLeavesSet { + return nil, cid.Prefix{}, fmt.Errorf("nocopy option requires '--raw-leaves' to be enabled as well") + } + + // No, satisfy mandatory constraint. + options.RawLeaves = true + } + // (hash != "sha2-256") -> CIDv1 if options.MhType != mh.SHA2_256 { switch options.CidVersion { @@ -271,3 +286,23 @@ func (unixfsOpts) Progress(enable bool) UnixfsAddOption { return nil } } + +// FsCache tells the adder to check the filestore for pre-existing blocks +// +// Experimental +func (unixfsOpts) FsCache(enable bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.FsCache = enable + return nil + } +} + +// NoCopy tells the adder to add the files using filestore. Implies RawLeaves. +// +// Experimental +func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.NoCopy = enable + return nil + } +} From e69f95f43aaaf9dca795d0ada51a76a6158c78e4 Mon Sep 17 00:00:00 2001 From: Overbool Date: Tue, 25 Sep 2018 16:35:08 +0800 Subject: [PATCH 2340/3147] feat(inode): add inode struct This commit was moved from ipfs/go-mfs@90acd8823e6b4f093c1fbed00eb61dd28cac61df --- mfs/dir.go | 25 ++++++++++--------------- mfs/fd.go | 2 +- mfs/file.go | 13 ++++--------- mfs/inode.go | 30 ++++++++++++++++++++++++++++++ mfs/mfs_test.go | 2 +- mfs/system.go | 2 +- 6 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 mfs/inode.go diff --git a/mfs/dir.go b/mfs/dir.go index f26b136016..2532b861b9 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -22,8 +22,7 @@ var ErrInvalidChild = errors.New("invalid child node") var ErrDirExists = errors.New("directory already has entry by that name") type Directory struct { - dserv ipld.DAGService - parent childCloser + *inode childDirs map[string]*Directory files map[string]*File @@ -36,8 +35,6 @@ type Directory struct { unixfsDir uio.Directory modTime time.Time - - name string } // NewDirectory constructs a new MFS directory. @@ -51,11 +48,9 @@ func NewDirectory(ctx context.Context, name string, node ipld.Node, parent child } return &Directory{ - dserv: dserv, + inode: NewInode(name, parent, dserv), ctx: ctx, - name: name, unixfsDir: db, - parent: parent, childDirs: make(map[string]*Directory), files: make(map[string]*File), modTime: time.Now(), @@ -108,7 +103,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { return nil, err } - err = d.dserv.Add(d.ctx, nd) + err = d.dagService.Add(d.ctx, nd) if err != nil { return nil, err } @@ -158,7 +153,7 @@ func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { switch fsn.Type() { case ft.TDirectory, ft.THAMTShard: - ndir, err := NewDirectory(d.ctx, name, nd, d, d.dserv) + ndir, err := NewDirectory(d.ctx, name, nd, d, d.dagService) if err != nil { return nil, err } @@ -166,7 +161,7 @@ func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { d.childDirs[name] = ndir return ndir, nil case ft.TFile, ft.TRaw, ft.TSymlink: - nfi, err := NewFile(name, nd, d, d.dserv) + nfi, err := NewFile(name, nd, d, d.dagService) if err != nil { return nil, err } @@ -178,7 +173,7 @@ func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { return nil, ErrInvalidChild } case *dag.RawNode: - nfi, err := NewFile(name, nd, d, d.dserv) + nfi, err := NewFile(name, nd, d, d.dagService) if err != nil { return nil, err } @@ -308,7 +303,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { ndir := ft.EmptyDirNode() ndir.SetCidBuilder(d.GetCidBuilder()) - err = d.dserv.Add(d.ctx, ndir) + err = d.dagService.Add(d.ctx, ndir) if err != nil { return nil, err } @@ -318,7 +313,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - dirobj, err := NewDirectory(d.ctx, name, ndir, d, d.dserv) + dirobj, err := NewDirectory(d.ctx, name, ndir, d, d.dagService) if err != nil { return nil, err } @@ -356,7 +351,7 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return ErrDirExists } - err = d.dserv.Add(d.ctx, nd) + err = d.dagService.Add(d.ctx, nd) if err != nil { return err } @@ -452,7 +447,7 @@ func (d *Directory) GetNode() (ipld.Node, error) { return nil, err } - err = d.dserv.Add(d.ctx, nd) + err = d.dagService.Add(d.ctx, nd) if err != nil { return nil, err } diff --git a/mfs/fd.go b/mfs/fd.go index 0f0d3d4269..fd4351b1a5 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -122,7 +122,7 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { return err } - err = fi.inode.dserv.Add(context.TODO(), nd) + err = fi.inode.dagService.Add(context.TODO(), nd) if err != nil { return err } diff --git a/mfs/file.go b/mfs/file.go index 0a49646fd2..86e00713b4 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -14,13 +14,10 @@ import ( ) type File struct { - parent childCloser - - name string + *inode desclock sync.RWMutex - dserv ipld.DAGService node ipld.Node nodelk sync.Mutex @@ -31,10 +28,8 @@ type File struct { // Cid version is non-zero RawLeaves will be enabled. func NewFile(name string, node ipld.Node, parent childCloser, dserv ipld.DAGService) (*File, error) { fi := &File{ - dserv: dserv, - parent: parent, - name: name, - node: node, + inode: NewInode(name, parent, dserv), + node: node, } if node.Cid().Prefix().Version > 0 { fi.RawLeaves = true @@ -82,7 +77,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { return nil, fmt.Errorf("mode not supported") } - dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dserv, chunker.DefaultSplitter) + dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dagService, chunker.DefaultSplitter) if err != nil { return nil, err } diff --git a/mfs/inode.go b/mfs/inode.go new file mode 100644 index 0000000000..54f064c7b9 --- /dev/null +++ b/mfs/inode.go @@ -0,0 +1,30 @@ +package mfs + +import ( + ipld "github.com/ipfs/go-ipld-format" +) + +// inode abstracts the common characteristics of the MFS `File` +// and `Directory`. All of its attributes are initialized at +// creation. +type inode struct { + // name of this `inode` in the MFS path (the same value + // is also stored as the name of the DAG link). + name string + + // parent directory of this `inode` (which may be the `Root`). + parent childCloser + + // dagService used to store modifications made to the contents + // of the file or directory the `inode` belongs to. + dagService ipld.DAGService +} + +// NewInode creates a new `inode` structure and return it's pointer. +func NewInode(name string, parent childCloser, dagService ipld.DAGService) *inode { + return &inode{ + name: name, + parent: parent, + dagService: dagService, + } +} diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index e840f6c066..456d00505a 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -555,7 +555,7 @@ func actorMakeFile(d *Directory) error { } name := randomName() - f, err := NewFile(name, dag.NodeWithData(ft.FilePBData(nil, 0)), d, d.dserv) + f, err := NewFile(name, dag.NodeWithData(ft.FilePBData(nil, 0)), d, d.dagService) if err != nil { return err } diff --git a/mfs/system.go b/mfs/system.go index cc7e65d3aa..bc0bafa5d5 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -145,7 +145,7 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published. func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { - err := kr.GetDirectory().dserv.Add(context.TODO(), nd) + err := kr.GetDirectory().dagService.Add(context.TODO(), nd) if err != nil { return err } From 8020a00a75371a2ea3919d53d30b4c4e27f14898 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 4 Oct 2018 10:03:38 -0700 Subject: [PATCH 2341/3147] make arccache.GetSize return ErrNotFound when not found (and fix the tests) The semantics were changed during PR review but the test never got updated. This commit was moved from ipfs/go-ipfs-blockstore@79b1edf413189c02d08a3692a1f5ceecb5aad42c --- blockstore/arc_cache.go | 7 +++++-- blockstore/arc_cache_test.go | 5 ++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 78e3135124..231fd8555a 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -88,8 +88,11 @@ func (b *arccache) Has(k cid.Cid) (bool, error) { } func (b *arccache) GetSize(k cid.Cid) (int, error) { - if _, blockSize, ok := b.hasCached(k); ok { - return blockSize, nil + if has, blockSize, ok := b.hasCached(k); ok { + if has { + return blockSize, nil + } + return -1, ErrNotFound } blockSize, err := b.blockstore.GetSize(k) if err == ErrNotFound { diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index facbf3473e..6911db769c 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -107,7 +107,7 @@ func TestGetFillsCache(t *testing.T) { if has, err := arc.Has(exampleBlock.Cid()); has || err != nil { t.Fatal("has was true but there is no such block") } - if blockSize, err := arc.GetSize(exampleBlock.Cid()); blockSize > -1 || err != nil { + if _, err := arc.GetSize(exampleBlock.Cid()); err != ErrNotFound { t.Fatal("getsize was true but there is no such block") } @@ -203,12 +203,11 @@ func TestGetSizeMissingZeroSizeBlock(t *testing.T) { arc.Get(missingBlock.Cid()) trap("has hit datastore", cd, t) - if blockSize, err := arc.GetSize(missingBlock.Cid()); blockSize != -1 || err != nil { + if _, err := arc.GetSize(missingBlock.Cid()); err != ErrNotFound { t.Fatal("getsize returned invalid result") } } - func TestDifferentKeyObjectsWork(t *testing.T) { arc, bs, cd := createStores(t) From f46082072957d0f4634a70baec4f0ef573c89408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Oct 2018 20:39:43 +0200 Subject: [PATCH 2342/3147] coreapi unixfs: fix inline doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@641542e1596817f70eeac14f87b3c49ef2d5e80a --- coreiface/options/unixfs.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 810e3c6e84..9249af8953 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -170,13 +170,10 @@ func (unixfsOpts) Inline(enable bool) UnixfsAddOption { // Specifying this option won't enable block inlining. For that use `Inline` // option. Default: 32 bytes // -// Note that while there is no hard limit on the number of bytes, it should -// be kept at a reasonably low value, like 64 bytes if you intend to display -// these hashes. Larger values like 256 bytes will work fine, but may affect -// de-duplication of smaller blocks. -// -// Setting this value too high may cause various problems, such as render some -// blocks unfetchable +// Note that while there is no hard limit on the number of bytes, it should be +// kept at a reasonably low value, such as 64 and no more than 1k. Setting this +// value too high may cause various problems, such as render some +// blocks unfetchable. func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.InlineLimit = limit From 34497dfcf9b4083f51925ee9e7b9ccd14c8f69ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 4 Oct 2018 22:11:17 +0200 Subject: [PATCH 2343/3147] coreapi name: add some missing options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@0ad4722d65f9b8a3021320835291d2161091fd63 --- coreiface/options/name.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/coreiface/options/name.go b/coreiface/options/name.go index ba3691b03c..c614db3abc 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -13,6 +13,10 @@ const ( type NamePublishSettings struct { ValidTime time.Duration Key string + + TTL *time.Duration + + AllowOffline bool } type NameResolveSettings struct { @@ -29,6 +33,8 @@ func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings, error) options := &NamePublishSettings{ ValidTime: DefaultNameValidTime, Key: "self", + + AllowOffline: false, } for _, opt := range opts { @@ -82,6 +88,24 @@ func (nameOpts) Key(key string) NamePublishOption { } } +// AllowOffline is an option for Name.Publish which specifies whether to allow +// publishing when the node is offline. Default value is false +func (nameOpts) AllowOffline(allow bool) NamePublishOption { + return func(settings *NamePublishSettings) error { + settings.AllowOffline = allow + return nil + } +} + +// TTL is an option for Name.Publish which specifies the time duration the +// published record should be cached for (caution: experimental). +func (nameOpts) TTL(ttl time.Duration) NamePublishOption { + return func(settings *NamePublishSettings) error { + settings.TTL = &ttl + return nil + } +} + // Local is an option for Name.Resolve which specifies if the lookup should be // offline. Default value is false func (nameOpts) Local(local bool) NameResolveOption { From 37b8aefc423bb9aa2f21007f76bb9749dfdaec46 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:08:29 -0400 Subject: [PATCH 2344/3147] gx publish 1.1.4 This commit was moved from ipfs/go-unixfs@5d8e6747b5c4d81de36dd5939963f0912997a3ae --- unixfs/hamt/hamt.go | 4 ++-- unixfs/io/dagreader.go | 2 +- unixfs/io/pbdagreader.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 3239299973..0b49e96961 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -25,11 +25,11 @@ import ( "fmt" "os" - dag "github.com/ipfs/go-merkledag" - format "github.com/ipfs/go-unixfs" bitfield "github.com/Stebalien/go-bitfield" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + dag "github.com/ipfs/go-merkledag" + format "github.com/ipfs/go-unixfs" "github.com/spaolacci/murmur3" ) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8d491db1ba..cf980d2be3 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -5,9 +5,9 @@ import ( "errors" "io" + ipld "github.com/ipfs/go-ipld-format" mdag "github.com/ipfs/go-merkledag" ft "github.com/ipfs/go-unixfs" - ipld "github.com/ipfs/go-ipld-format" ) // Common errors diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go index a84f239ff6..bea5f496e9 100644 --- a/unixfs/io/pbdagreader.go +++ b/unixfs/io/pbdagreader.go @@ -6,10 +6,10 @@ import ( "fmt" "io" - mdag "github.com/ipfs/go-merkledag" - ft "github.com/ipfs/go-unixfs" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + mdag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" ) // PBDagReader provides a way to easily read the data contained in a dag. From 35d120747487987f474b02cba3b7232729263947 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 21 Sep 2018 13:11:54 -0700 Subject: [PATCH 2345/3147] Use EnumerateChildrenAsync in EnumLinks - makeAsyncTrieGetLinks -- returns a function that can be used as a GetLinks function with EnumerateChildrenAsyc - Mutex on appending links in EnumLinks This commit was moved from ipfs/go-unixfs@edbb7a341212cae92ec93ae0e8dac0e2b7b7aef6 --- unixfs/hamt/hamt.go | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 0b49e96961..8b240b8763 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -24,6 +24,7 @@ import ( "context" "fmt" "os" + "sync" bitfield "github.com/Stebalien/go-bitfield" cid "github.com/ipfs/go-cid" @@ -383,10 +384,16 @@ func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func // EnumLinks collects all links in the Shard. func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { var links []*ipld.Link - err := ds.ForEachLink(ctx, func(l *ipld.Link) error { + var setlk sync.Mutex + + getLinks := ds.makeAsyncTrieGetLinks(func(l *ipld.Link) error { + setlk.Lock() links = append(links, l) + setlk.Unlock() return nil }) + + err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), func(c cid.Cid) bool { return true }) return links, err } @@ -400,6 +407,35 @@ func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) erro }) } +func (ds *Shard) makeAsyncTrieGetLinks(cb func(*ipld.Link) error) dag.GetLinks { + + return func(ctx context.Context, c cid.Cid) ([]*ipld.Link, error) { + node, err := ds.dserv.Get(ctx, c) + if err != nil { + return nil, err + } + cds, err := NewHamtFromDag(ds.dserv, node) + if err != nil { + return nil, err + } + + childShards := make([]*ipld.Link, 0, len(cds.children)) + for idx := range cds.children { + lnk := cds.nd.Links()[idx] + + if len(lnk.Name) < cds.maxpadlen { + return nil, fmt.Errorf("invalid link name '%s'", lnk.Name) + } + if len(lnk.Name) == cds.maxpadlen { + childShards = append(childShards, lnk) + } else { + cb(lnk) + } + } + return childShards, nil + } +} + func (ds *Shard) walkTrie(ctx context.Context, cb func(*shardValue) error) error { for idx := range ds.children { c, err := ds.getChild(ctx, idx) From 9a2296f4956e469b22316433fe2ee20d95c3a917 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Thu, 27 Sep 2018 11:30:21 -0700 Subject: [PATCH 2346/3147] Fix tests to pass Due to new architecture of EnumLinks, remove order concerns and prevent crashes on calls to fetch CID This commit was moved from ipfs/go-unixfs@ed9d23b6bd5fb9964aab066e0b3e55e7b5f0bad5 --- unixfs/hamt/hamt_test.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index e56d9363c0..ffbb676ebe 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -11,6 +11,7 @@ import ( dag "github.com/ipfs/go-merkledag" mdtest "github.com/ipfs/go-merkledag/test" + ft "github.com/ipfs/go-unixfs" ipld "github.com/ipfs/go-ipld-format" @@ -100,6 +101,8 @@ func assertSerializationWorks(ds ipld.DAGService, s *Shard) error { return fmt.Errorf("links arrays are different sizes") } + sort.Stable(dag.LinkSlice(linksA)) + sort.Stable(dag.LinkSlice(linksB)) for i, a := range linksA { b := linksB[i] if a.Name != b.Name { @@ -280,14 +283,17 @@ func TestSetAfterMarshal(t *testing.T) { t.Fatal(err) } - empty := ft.EmptyDirNode() for i := 0; i < 100; i++ { + empty := ft.EmptyDirNode() err := nds.Set(ctx, fmt.Sprintf("moredirs%d", i), empty) if err != nil { t.Fatal(err) } } + nd, err = nds.Node() + nds, err = NewHamtFromDag(ds, nd) + links, err := nds.EnumLinks(ctx) if err != nil { t.Fatal(err) @@ -319,6 +325,9 @@ func TestDuplicateAddShard(t *testing.T) { t.Fatal(err) } + node, err := dir.Node() + dir, err = NewHamtFromDag(ds, node) + lnks, err := dir.EnumLinks(ctx) if err != nil { t.Fatal(err) @@ -411,6 +420,9 @@ func TestRemoveElemsAfterMarshal(t *testing.T) { } } + nd, err = nds.Node() + nds, err = NewHamtFromDag(ds, nd) + links, err := nds.EnumLinks(ctx) if err != nil { t.Fatal(err) From 994ad13f2c12105af0f5f50f61a2d393fa87c637 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 1 Oct 2018 16:31:35 -0700 Subject: [PATCH 2347/3147] Add CID set tracking to shard enumeration This commit was moved from ipfs/go-unixfs@ddf48b0c75e58de4043e3d84910255f3c1898e9c --- unixfs/hamt/hamt.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 8b240b8763..f1a6729db3 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -393,7 +393,9 @@ func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { return nil }) - err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), func(c cid.Cid) bool { return true }) + cset := cid.NewSet() + + err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), cset.Visit) return links, err } From 12154d9d59ae924b8fd6d09878424f03bea940b9 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Tue, 2 Oct 2018 16:04:23 -0700 Subject: [PATCH 2348/3147] Refactor for readability, consistency This commit was moved from ipfs/go-unixfs@3844b681096b78dfa24e44741199bc51c7891615 --- unixfs/hamt/hamt.go | 73 +++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index f1a6729db3..f68b802b49 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -105,7 +105,6 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { return nil, err } - if fsn.Type() != format.THAMTShard { return nil, fmt.Errorf("node was not a dir shard") } @@ -203,6 +202,14 @@ func (sv *shardValue) Label() string { return sv.key } +func (ds *Shard) makeShardValue(lnk *ipld.Link) *shardValue { + lnk2 := *lnk + return &shardValue{ + key: lnk.Name[ds.maxpadlen:], + val: &lnk2, + } +} + func hash(val []byte) []byte { h := murmur3.New64() h.Write(val) @@ -254,6 +261,24 @@ func (ds *Shard) Find(ctx context.Context, name string) (*ipld.Link, error) { return out, nil } +type linkType int + +const ( + invalidLink linkType = iota + shardLink + shardValueLink +) + +func (ds *Shard) childLinkType(lnk *ipld.Link) (linkType, error) { + if len(lnk.Name) < ds.maxpadlen { + return invalidLink, fmt.Errorf("invalid link name '%s'", lnk.Name) + } + if len(lnk.Name) == ds.maxpadlen { + return shardLink, nil + } + return shardValueLink, nil +} + // getChild returns the i'th child of this shard. If it is cached in the // children array, it will return it from there. Otherwise, it loads the child // node from disk. @@ -278,12 +303,13 @@ func (ds *Shard) getChild(ctx context.Context, i int) (child, error) { // as a 'child' interface func (ds *Shard) loadChild(ctx context.Context, i int) (child, error) { lnk := ds.nd.Links()[i] - if len(lnk.Name) < ds.maxpadlen { - return nil, fmt.Errorf("invalid link name '%s'", lnk.Name) + lnkLinkType, err := ds.childLinkType(lnk) + if err != nil { + return nil, err } var c child - if len(lnk.Name) == ds.maxpadlen { + if lnkLinkType == shardLink { nd, err := lnk.GetNode(ctx, ds.dserv) if err != nil { return nil, err @@ -295,11 +321,7 @@ func (ds *Shard) loadChild(ctx context.Context, i int) (child, error) { c = cds } else { - lnk2 := *lnk - c = &shardValue{ - key: lnk.Name[ds.maxpadlen:], - val: &lnk2, - } + c = ds.makeShardValue(lnk) } ds.children[i] = c @@ -386,9 +408,11 @@ func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { var links []*ipld.Link var setlk sync.Mutex - getLinks := ds.makeAsyncTrieGetLinks(func(l *ipld.Link) error { + getLinks := makeAsyncTrieGetLinks(ds.dserv, func(sv *shardValue) error { + lnk := sv.val + lnk.Name = sv.key setlk.Lock() - links = append(links, l) + links = append(links, lnk) setlk.Unlock() return nil }) @@ -409,29 +433,34 @@ func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) erro }) } -func (ds *Shard) makeAsyncTrieGetLinks(cb func(*ipld.Link) error) dag.GetLinks { +// makeAsyncTrieGetLinks builds a getLinks function that can be used with EnumerateChildrenAsync +// to iterate a HAMT shard. It takes an IPLD Dag Service to fetch nodes, and a call back that will get called +// on all links to leaf nodes in a HAMT tree, so they can be collected for an EnumLinks operation +func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(*shardValue) error) dag.GetLinks { - return func(ctx context.Context, c cid.Cid) ([]*ipld.Link, error) { - node, err := ds.dserv.Get(ctx, c) + return func(ctx context.Context, currentCid cid.Cid) ([]*ipld.Link, error) { + node, err := dagService.Get(ctx, currentCid) if err != nil { return nil, err } - cds, err := NewHamtFromDag(ds.dserv, node) + directoryShard, err := NewHamtFromDag(dagService, node) if err != nil { return nil, err } - childShards := make([]*ipld.Link, 0, len(cds.children)) - for idx := range cds.children { - lnk := cds.nd.Links()[idx] + childShards := make([]*ipld.Link, 0, len(directoryShard.children)) + for idx := range directoryShard.children { + lnk := directoryShard.nd.Links()[idx] + lnkLinkType, err := directoryShard.childLinkType(lnk) - if len(lnk.Name) < cds.maxpadlen { - return nil, fmt.Errorf("invalid link name '%s'", lnk.Name) + if err != nil { + return nil, err } - if len(lnk.Name) == cds.maxpadlen { + if lnkLinkType == shardLink { childShards = append(childShards, lnk) } else { - cb(lnk) + sv := directoryShard.makeShardValue(lnk) + onShardValue(sv) } } return childShards, nil From e35e15a1fd1e005bc2e8409320b384a79a40756c Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 3 Oct 2018 17:41:41 -0700 Subject: [PATCH 2349/3147] Minor optimizations and error checks This commit was moved from ipfs/go-unixfs@94b01349973005cf777911a9c51026a182d1f46f --- unixfs/hamt/hamt.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index f68b802b49..b7ac0a2f48 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -449,8 +449,9 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(*shardV } childShards := make([]*ipld.Link, 0, len(directoryShard.children)) + links := directoryShard.nd.Links() for idx := range directoryShard.children { - lnk := directoryShard.nd.Links()[idx] + lnk := links[idx] lnkLinkType, err := directoryShard.childLinkType(lnk) if err != nil { @@ -460,7 +461,10 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(*shardV childShards = append(childShards, lnk) } else { sv := directoryShard.makeShardValue(lnk) - onShardValue(sv) + err := onShardValue(sv) + if err != nil { + return nil, err + } } } return childShards, nil From b00a9c91219246fb5cb954b1a50578eeb009dcae Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Wed, 3 Oct 2018 07:35:57 +0200 Subject: [PATCH 2350/3147] gx: update go-datastore, go-libp2p-swarm License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/interface-go-ipfs-core@b9309ab1a51ec1b68e8c5561b0f02a610fd93f97 --- coreiface/dht.go | 2 +- coreiface/path.go | 2 +- coreiface/swarm.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 2309ceb905..4a76f4d392 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/path.go b/coreiface/path.go index 0beab06639..0f06e8cc23 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + ipfspath "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 8b464e5c1f..58caf6759f 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,11 +5,11 @@ import ( "errors" "time" + net "gx/ipfs/QmQdLcvoy3JuSqhV6iwQ9T6Cv7hWLAdzob4jUZRPqFL67Z/go-libp2p-net" + pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" - net "gx/ipfs/QmfDPh144WGBqRxZb1TGDHerbMnZATrHZggAPw7putNnBq/go-libp2p-net" ) var ( From 3e36d074884b63fca53070bfcdfbb8a8d2f6d601 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Wed, 3 Oct 2018 07:35:57 +0200 Subject: [PATCH 2351/3147] gx: update go-datastore, go-libp2p-swarm License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-namesys@6ec50cb952f4d4e7f1ea669c2930ea2ea6b2a1f9 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 20 ++++++++++---------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 14 +++++++------- namesys/proquint.go | 2 +- namesys/publisher.go | 14 +++++++------- namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 10 +++++----- 14 files changed, 53 insertions(+), 53 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index afdc0a468d..20e0356506 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index f18c6e8aa8..bc34266efe 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 5ca7323a96..29d90497b3 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -9,7 +9,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index fcc956cb14..d3a2bf980f 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index cc99bf1d7b..58f0fd21a3 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,22 +6,22 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" + ropts "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing/options" + pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore/pstoremem" record "gx/ipfs/QmSb4B8ZAAj5ALe9LjfzPyF8Ma6ezC1NTnDF2JQPUJxEXb/go-libp2p-record" - mockrouting "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/mock" - offline "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/offline" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" - routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" - ropts "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing/options" - ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" + offline "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/offline" + ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore/pstoremem" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 054a51bbd4..c7a37f850f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index c2a530c26c..3584ae0a5b 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,16 +7,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + "gx/ipfs/QmXYXeWXMa6XaqLthwc9gYzBdobRGBemWNv228XnAwqW9q/go-unixfs" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - offroute "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/offline" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" - ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + pstoremem "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore/pstoremem" + offroute "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/offline" + ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - pstoremem "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore/pstoremem" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 4ba505dc88..7519770983 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index b854206754..9519745153 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmU4x3742bvgfxJsByEDpBnifJqjJdV6x528co4hwKCn46/go-unixfs" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + ft "gx/ipfs/QmXYXeWXMa6XaqLthwc9gYzBdobRGBemWNv228XnAwqW9q/go-unixfs" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dsquery "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" - routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" - ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" - pb "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns/pb" + routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" + ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" + pb "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns/pb" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dsquery "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 3f6e6f02e8..a95867d8ce 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,13 +8,13 @@ import ( testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/mock" - dshelp "gx/ipfs/QmUDTSi6zJ6ACyQaKtxscCUxrg5DaXs9r4RQUPFQXGPHpo/go-ipfs-ds-help" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" + mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" + ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + dshelp "gx/ipfs/QmafbjCxKZEU87RYYCHX2pFP9Q6uLSLAScLr2VUErNTH1f/go-ipfs-ds-help" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index ebe17c7761..ae1e3ef59f 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + pb "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - pb "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns/pb" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index dd8693965c..4cd43e710c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmVsVARb86uSe1qYouewFMNd2p2sp2NGWm1JGPReVDWchW/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmfAQMFpgDU2U4BXG64qVr8HSiictfWvkSBz7Y2oDj65st/go-libp2p-peerstore" + pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" + mocknet "gx/ipfs/Qmd9zWxAeeDJoLdxqvaDXAGtoafX5cc9Tp25DNm9W7fVnB/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 82e3f06da2..32728128f1 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" - mockrouting "gx/ipfs/QmScZySgru9jaoDa12sSfvh21sWbqF5eXkieTmJzAHJXkQ/go-ipfs-routing/mock" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" - ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" + mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" + ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index dc53868ad7..4d12c2713b 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmcjwUb36Z16NJkvDX6ccXPqsFswo6AsRXynyXcLLCphV2/go-path" + path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - routing "gx/ipfs/QmVBnJDKhtFXTRVjXKinqpwGu8t1DyNqPKan2iGX8PR8xG/go-libp2p-routing" + routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" + dht "gx/ipfs/QmXBVGodwBx38Pvx6x8nt9mtCWbiDcNv7XWDGuvkajELvK/go-libp2p-kad-dht" + ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" + pb "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - dht "gx/ipfs/QmZVakpN44VAUxs9eXAuUGLFYTCGmSyqSy6hyEKfMv68ME/go-libp2p-kad-dht" - ipns "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns" - pb "gx/ipfs/QmZrmn2BPZbSviQAWeyY2iXkCukmJHv9n7zrLgWU5KgbTb/go-ipns/pb" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From 3861b47fe9a0ff2723540066f4db41a9c382402d Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Wed, 3 Oct 2018 07:35:57 +0200 Subject: [PATCH 2352/3147] gx: update go-datastore, go-libp2p-swarm License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-filestore@df5b402ad81e07835fb6254415d8b1d0af5635d4 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index b7dad3c557..d1e9ee9bfd 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -14,9 +14,9 @@ import ( posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" - dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" + dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" + blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 42681c64af..e65bbf3104 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" + dag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 5e8bf6396e..1f5baf24e7 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -13,12 +13,12 @@ import ( posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" - dshelp "gx/ipfs/QmUDTSi6zJ6ACyQaKtxscCUxrg5DaXs9r4RQUPFQXGPHpo/go-ipfs-ds-help" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dsns "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/namespace" - dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" - blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" + dshelp "gx/ipfs/QmafbjCxKZEU87RYYCHX2pFP9Q6uLSLAScLr2VUErNTH1f/go-ipfs-ds-help" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dsns "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/namespace" + dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 6213b0f104..ddc3c225e1 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -7,10 +7,10 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - dshelp "gx/ipfs/QmUDTSi6zJ6ACyQaKtxscCUxrg5DaXs9r4RQUPFQXGPHpo/go-ipfs-ds-help" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" - blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" + dshelp "gx/ipfs/QmafbjCxKZEU87RYYCHX2pFP9Q6uLSLAScLr2VUErNTH1f/go-ipfs-ds-help" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" + blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) // Status is used to identify the state of the block data referenced From cd64a76e71c2edb1809a7201994ffb816aa1d67c Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Wed, 3 Oct 2018 07:35:57 +0200 Subject: [PATCH 2353/3147] gx: update go-datastore, go-libp2p-swarm License: MIT Signed-off-by: Lars Gierth This commit was moved from ipfs/go-ipfs-pinner@ee102bdb042c59c83c1bd77339fa09334f929b75 --- pinning/pinner/gc/gc.go | 10 +++++----- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 12 ++++++------ pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 12 ++++++------ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index f5ca725475..bb55de95cb 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" - bserv "gx/ipfs/QmcRecCZWM2NZfCQrCe97Ch3Givv8KKEP82tGUDntzdLFe/go-blockservice" + bserv "gx/ipfs/QmQPHB5JqEtHV819eBL8dX2uDfxpCz27oEEEsfUnFpfEdF/go-blockservice" + dag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - offline "gx/ipfs/QmR5miWuikPxWyUrzMYJVmFUcD44pGdtc98h9Qsbp4YcJw/go-ipfs-exchange-offline" - dstore "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" + offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" "gx/ipfs/QmVkMRSkXrpjqrroEXWuYBvDBnXCdMMY6gsKicBGVGUqKT/go-verifcid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + dstore "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" - bstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" + bstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index f6100749ff..033f469898 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,11 +10,11 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" + mdag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 2549084f5e..9917d35cab 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - mdag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" - bs "gx/ipfs/QmcRecCZWM2NZfCQrCe97Ch3Givv8KKEP82tGUDntzdLFe/go-blockservice" + bs "gx/ipfs/QmQPHB5JqEtHV819eBL8dX2uDfxpCz27oEEEsfUnFpfEdF/go-blockservice" + mdag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmR5miWuikPxWyUrzMYJVmFUcD44pGdtc98h9Qsbp4YcJw/go-ipfs-exchange-offline" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dssync "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/sync" - blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" + blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 9b4446e378..1e5bcfe427 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" + "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index e366eac703..a1dc36f3be 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmcBoNcAP6qDjgRBew7yjvCqHq7p5jMstE44jPUBWBxzsV/go-merkledag" - bserv "gx/ipfs/QmcRecCZWM2NZfCQrCe97Ch3Givv8KKEP82tGUDntzdLFe/go-blockservice" + bserv "gx/ipfs/QmQPHB5JqEtHV819eBL8dX2uDfxpCz27oEEEsfUnFpfEdF/go-blockservice" + dag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - offline "gx/ipfs/QmR5miWuikPxWyUrzMYJVmFUcD44pGdtc98h9Qsbp4YcJw/go-ipfs-exchange-offline" - ds "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore" - dsq "gx/ipfs/QmUyz7JTJzgegC6tiJrfby3mPhzcdswVtG4x58TQ6pq8jV/go-datastore/query" - blockstore "gx/ipfs/QmdriVJgKx4JADRgh3cYPXqXmsa1A45SvFki1nDWHhQNtC/go-ipfs-blockstore" + offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" + ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" + blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) func ignoreCids(_ cid.Cid) {} From 0ef081eae1b8bdaf52870fe9f483ba05c7ca69ef Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:11:27 -0400 Subject: [PATCH 2354/3147] gx update go-libp2p-peerstore License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/interface-go-ipfs-core@c8a6219cf25b4dfc1208523ec0bb2ee2efc2d85d --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 0f06e8cc23..5748bf4653 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + ipfspath "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From 3c1dfb400bb099a94a29290a0a4aa69ee831a79d Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:11:27 -0400 Subject: [PATCH 2355/3147] gx update go-libp2p-peerstore License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@7422b4a10070877e87596e243123b149f6e71f3d --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 20e0356506..d77ca168d8 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index bc34266efe..85784238a8 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 29d90497b3..b4e3111d40 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index d3a2bf980f..eb82f1860f 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 58f0fd21a3..9c3bf72272 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/namesys/namesys.go b/namesys/namesys.go index c7a37f850f..1d38ac6dae 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 3584ae0a5b..7bb60170ef 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,8 +7,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmXYXeWXMa6XaqLthwc9gYzBdobRGBemWNv228XnAwqW9q/go-unixfs" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + "gx/ipfs/QmdF8ovKr2zNMWi2hiDMqQAQeNw35xwytb1W7Ydwsf1ufx/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" pstoremem "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore/pstoremem" diff --git a/namesys/proquint.go b/namesys/proquint.go index 7519770983..051f616e1e 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,8 +7,8 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 9519745153..39ba878a59 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmXYXeWXMa6XaqLthwc9gYzBdobRGBemWNv228XnAwqW9q/go-unixfs" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + ft "gx/ipfs/QmdF8ovKr2zNMWi2hiDMqQAQeNw35xwytb1W7Ydwsf1ufx/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index ae1e3ef59f..4cb5830f0f 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 4cd43e710c..399aadea8f 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 32728128f1..9983bb8e57 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" diff --git a/namesys/routing.go b/namesys/routing.go index 4d12c2713b..788bbc60e4 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmbE9gr6c2FomTgc2pRZRTooHpchJ1uaZKremypyWJMV4t/go-path" + path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" From 2d6cfbf64037fc43a5e9a8343e765f53a7aca796 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:11:27 -0400 Subject: [PATCH 2356/3147] gx update go-libp2p-peerstore License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@758ac4ba2e6a3ec6575f65493b7545ed9f2b9912 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index e65bbf3104..e9d017a4df 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" + dag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From ea46d80c33802c4ad173b16d6afe1ce35c8a2cf6 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:11:27 -0400 Subject: [PATCH 2357/3147] gx update go-libp2p-peerstore License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@b87157487dc18fc97a538261e3f7a6d0ed9daf59 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index bb55de95cb..e396d40740 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmQPHB5JqEtHV819eBL8dX2uDfxpCz27oEEEsfUnFpfEdF/go-blockservice" - dag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" + dag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" + bserv "gx/ipfs/QmewCqLsNJ2j7xrbEk8nYoCCMtBMSK3Eq6pdNdNPogdehi/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 033f469898..a466c788d5 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" + mdag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 9917d35cab..8014958b2a 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmQPHB5JqEtHV819eBL8dX2uDfxpCz27oEEEsfUnFpfEdF/go-blockservice" - mdag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" + mdag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" + bs "gx/ipfs/QmewCqLsNJ2j7xrbEk8nYoCCMtBMSK3Eq6pdNdNPogdehi/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 1e5bcfe427..c71c284f06 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" + "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index a1dc36f3be..6d33a5cbb2 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmQPHB5JqEtHV819eBL8dX2uDfxpCz27oEEEsfUnFpfEdF/go-blockservice" - dag "gx/ipfs/QmRfWhkc5eHLzZ1FActaXNeThijM2CY6JWc2qynQExFFJm/go-merkledag" + dag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" + bserv "gx/ipfs/QmewCqLsNJ2j7xrbEk8nYoCCMtBMSK3Eq6pdNdNPogdehi/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" From 3f8596df8b398139db13cb06f2c55c6738fc6528 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:32:33 -0400 Subject: [PATCH 2358/3147] gx update libp2p/go-buffer-pool License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/interface-go-ipfs-core@349cbd1463198c9a811b6cc3c09c44608cdd486d --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 5748bf4653..63b15fb501 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + ipfspath "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From fad379d726947e062c6518f9ec2de58112b6d261 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:32:33 -0400 Subject: [PATCH 2359/3147] gx update libp2p/go-buffer-pool License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@69b1f2324bda8d0bc1cd5782069734fc44aeefe1 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 13 files changed, 17 insertions(+), 17 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index d77ca168d8..5db5948aeb 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 85784238a8..6e23458765 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index b4e3111d40..9696136d2f 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index eb82f1860f..aad69952c9 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 9c3bf72272..eddd64da98 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/namesys/namesys.go b/namesys/namesys.go index 1d38ac6dae..0371174fed 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 7bb60170ef..a77306a401 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,8 +7,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" - "gx/ipfs/QmdF8ovKr2zNMWi2hiDMqQAQeNw35xwytb1W7Ydwsf1ufx/go-unixfs" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + "gx/ipfs/QmavvHwEZTkNShKWK1jRejv2Y8oF6ZYxdGxytL3Mwvices/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" pstoremem "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore/pstoremem" diff --git a/namesys/proquint.go b/namesys/proquint.go index 051f616e1e..cd29bff254 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 39ba878a59..412b65dbb3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" - ft "gx/ipfs/QmdF8ovKr2zNMWi2hiDMqQAQeNw35xwytb1W7Ydwsf1ufx/go-unixfs" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + ft "gx/ipfs/QmavvHwEZTkNShKWK1jRejv2Y8oF6ZYxdGxytL3Mwvices/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4cb5830f0f..8124ec3ad4 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 399aadea8f..54ec416fcf 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + mocknet "gx/ipfs/QmNmj2AeM46ZQqHARnWidb5qqHoZJFeYWzmG65jviJDRQY/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" - mocknet "gx/ipfs/Qmd9zWxAeeDJoLdxqvaDXAGtoafX5cc9Tp25DNm9W7fVnB/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 9983bb8e57..5e7feb9edf 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" diff --git a/namesys/routing.go b/namesys/routing.go index 788bbc60e4..f7b7c9e9a6 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,12 +6,12 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmYh33CFYYEgQNSZ9PEP7ZN57dhErRZ7NfLS1BUA9GBBRk/go-path" + path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" - dht "gx/ipfs/QmXBVGodwBx38Pvx6x8nt9mtCWbiDcNv7XWDGuvkajELvK/go-libp2p-kad-dht" + dht "gx/ipfs/QmXKSnQHAihkcGgk8ZXz7FgZgHboXeRduuEz9FkAddJK6P/go-libp2p-kad-dht" ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" pb "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" From c7981f31fd6b60e9a10ccc989bf661bec39faa7f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:32:33 -0400 Subject: [PATCH 2360/3147] gx update libp2p/go-buffer-pool License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@cf4176704f499b9350e793ef42193a1fb424e885 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index e9d017a4df..72f159fc98 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" + dag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From 8468a34d9148f0ca5f72d3aa6f0a3751154dcfab Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 4 Oct 2018 19:32:33 -0400 Subject: [PATCH 2361/3147] gx update libp2p/go-buffer-pool License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@4cd7edc1cbae9c004d2ac8c6671f05fef26a9b9b --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index e396d40740..2be1333d5d 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" - bserv "gx/ipfs/QmewCqLsNJ2j7xrbEk8nYoCCMtBMSK3Eq6pdNdNPogdehi/go-blockservice" + bserv "gx/ipfs/QmNozJswSuwiZspexEHcQo5GMqpzM5exUGjNW6s4AAipUX/go-blockservice" + dag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index a466c788d5..2ed476414c 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" + mdag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 8014958b2a..4890872abe 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" - bs "gx/ipfs/QmewCqLsNJ2j7xrbEk8nYoCCMtBMSK3Eq6pdNdNPogdehi/go-blockservice" + bs "gx/ipfs/QmNozJswSuwiZspexEHcQo5GMqpzM5exUGjNW6s4AAipUX/go-blockservice" + mdag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index c71c284f06..8bccc85034 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" + "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 6d33a5cbb2..0502880ff8 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/Qmb5kvkvMyuaJ9e58vLh3TdRWgH9CCQPLJD4BgvNQvQFwf/go-merkledag" - bserv "gx/ipfs/QmewCqLsNJ2j7xrbEk8nYoCCMtBMSK3Eq6pdNdNPogdehi/go-blockservice" + bserv "gx/ipfs/QmNozJswSuwiZspexEHcQo5GMqpzM5exUGjNW6s4AAipUX/go-blockservice" + dag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" From b06611e7da0ebaef24e0b3db614716c940882793 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 4 Oct 2018 21:12:53 -0700 Subject: [PATCH 2362/3147] update unixfs inline option comment to give us room to change things (addressing CR) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@7d577641499b51b4d98ae7e10fed2fd5bf9d516a --- coreiface/options/unixfs.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 9249af8953..d486981c3a 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -171,9 +171,8 @@ func (unixfsOpts) Inline(enable bool) UnixfsAddOption { // option. Default: 32 bytes // // Note that while there is no hard limit on the number of bytes, it should be -// kept at a reasonably low value, such as 64 and no more than 1k. Setting this -// value too high may cause various problems, such as render some -// blocks unfetchable. +// kept at a reasonably low value, such as 64; implementations may choose to +// reject anything larger. func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption { return func(settings *UnixfsAddSettings) error { settings.InlineLimit = limit From f06c01e06b04ec7a27b0738f984e0f30b005c711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 19:23:38 +0100 Subject: [PATCH 2363/3147] coreapi: pubsub interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@ccaec46f3deaf46e20f9c265d5920f68251e4da4 --- coreiface/options/pubsub.go | 56 +++++++++++++++++++++++++++++++++++++ coreiface/pubsub.go | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 coreiface/options/pubsub.go create mode 100644 coreiface/pubsub.go diff --git a/coreiface/options/pubsub.go b/coreiface/options/pubsub.go new file mode 100644 index 0000000000..e276d7e4a1 --- /dev/null +++ b/coreiface/options/pubsub.go @@ -0,0 +1,56 @@ +package options + +type PubSubPeersSettings struct { + Topic string +} + +type PubSubSubscribeSettings struct { + Discover bool +} + +type PubSubPeersOption func(*PubSubPeersSettings) error +type PubSubSubscribeOption func(*PubSubSubscribeSettings) error + +func PubSubPeersOptions(opts ...PubSubPeersOption) (*PubSubPeersSettings, error) { + options := &PubSubPeersSettings{ + Topic: "", + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +func PubSubSubscribeOptions(opts ...PubSubSubscribeOption) (*PubSubSubscribeSettings, error) { + options := &PubSubSubscribeSettings{ + Discover: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type PubSubOptions struct{} + +func (api *PubSubOptions) WithTopic(topic string) PubSubPeersOption { + return func(settings *PubSubPeersSettings) error { + settings.Topic = topic + return nil + } +} + +func (api *PubSubOptions) WithDiscover(discover bool) PubSubSubscribeOption { + return func(settings *PubSubSubscribeSettings) error { + settings.Discover = discover + return nil + } +} diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go new file mode 100644 index 0000000000..f78734a090 --- /dev/null +++ b/coreiface/pubsub.go @@ -0,0 +1,51 @@ +package iface + +import ( + "context" + "io" + + options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" +) + +// PubSubSubscription is an active PubSub subscription +type PubSubSubscription interface { + io.Closer + + // Chan return incoming message channel + Chan(context.Context) <-chan PubSubMessage +} + +// PubSubMessage is a single PubSub message +type PubSubMessage interface { + // From returns id of a peer from which the message has arrived + From() peer.ID + + // Data returns the message body + Data() []byte +} + +// PubSubAPI specifies the interface to PubSub +type PubSubAPI interface { + // Ls lists subscribed topics by name + Ls(context.Context) ([]string, error) + + // Peers list peers we are currently pubsubbing with + // TODO: WithTopic + Peers(context.Context, ...options.PubSubPeersOption) ([]peer.ID, error) + + // WithTopic is an option for peers which specifies a topic filter for the + // function + WithTopic(topic string) options.PubSubPeersOption + + // Publish a message to a given pubsub topic + Publish(context.Context, string, []byte) error + + // Subscribe to messages on a given topic + Subscribe(context.Context, string) (PubSubSubscription, error) + + // WithDiscover is an option for Subscribe which specifies whether to try to + // discover other peers subscribed to the same topic + WithDiscover(discover bool) options.PubSubSubscribeOption +} From 1b8732304c12b825e9a8fd69b51494c9c67f39d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 10 Mar 2018 19:28:22 +0100 Subject: [PATCH 2364/3147] coreapi: implement pubsub api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@0d0069ff23a4dd26fa62fd91e5875b2526742da5 --- coreiface/coreapi.go | 3 +++ coreiface/errors.go | 2 +- coreiface/options/pubsub.go | 8 +++++--- coreiface/pubsub.go | 16 ++++------------ 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 0b153b6f9a..bc889237b3 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -37,6 +37,9 @@ type CoreAPI interface { // Swarm returns an implementation of Swarm API Swarm() SwarmAPI + // PubSub returns an implementation of PubSub API + PubSub() PubSubAPI + // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, Path) (ResolvedPath, error) diff --git a/coreiface/errors.go b/coreiface/errors.go index 81f978971d..072275409e 100644 --- a/coreiface/errors.go +++ b/coreiface/errors.go @@ -4,5 +4,5 @@ import "errors" var ( ErrIsDir = errors.New("object is a directory") - ErrOffline = errors.New("can't resolve, ipfs node is offline") + ErrOffline = errors.New("this action must be run in online mode, try running 'ipfs daemon' first") ) diff --git a/coreiface/options/pubsub.go b/coreiface/options/pubsub.go index e276d7e4a1..f0a614d580 100644 --- a/coreiface/options/pubsub.go +++ b/coreiface/options/pubsub.go @@ -39,16 +39,18 @@ func PubSubSubscribeOptions(opts ...PubSubSubscribeOption) (*PubSubSubscribeSett return options, nil } -type PubSubOptions struct{} +type pubsubOpts struct{} -func (api *PubSubOptions) WithTopic(topic string) PubSubPeersOption { +var PubBub nameOpts + +func (pubsubOpts) Topic(topic string) PubSubPeersOption { return func(settings *PubSubPeersSettings) error { settings.Topic = topic return nil } } -func (api *PubSubOptions) WithDiscover(discover bool) PubSubSubscribeOption { +func (pubsubOpts) Discover(discover bool) PubSubSubscribeOption { return func(settings *PubSubSubscribeSettings) error { settings.Discover = discover return nil diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index f78734a090..4b52ed6d64 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,15 +6,15 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) // PubSubSubscription is an active PubSub subscription type PubSubSubscription interface { io.Closer - // Chan return incoming message channel - Chan(context.Context) <-chan PubSubMessage + // Next return the next incoming message + Next(context.Context) (PubSubMessage, error) } // PubSubMessage is a single PubSub message @@ -35,17 +35,9 @@ type PubSubAPI interface { // TODO: WithTopic Peers(context.Context, ...options.PubSubPeersOption) ([]peer.ID, error) - // WithTopic is an option for peers which specifies a topic filter for the - // function - WithTopic(topic string) options.PubSubPeersOption - // Publish a message to a given pubsub topic Publish(context.Context, string, []byte) error // Subscribe to messages on a given topic - Subscribe(context.Context, string) (PubSubSubscription, error) - - // WithDiscover is an option for Subscribe which specifies whether to try to - // discover other peers subscribed to the same topic - WithDiscover(discover bool) options.PubSubSubscribeOption + Subscribe(context.Context, string, ...options.PubSubSubscribeOption) (PubSubSubscription, error) } From d23f749f57daa3b22c91036530b9430bfebec610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 11 Sep 2018 05:43:54 +0200 Subject: [PATCH 2365/3147] coreapi pubsub: add tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3f9a6ce3446d2d5746c6d9976c9325f1673c8e99 --- coreiface/options/pubsub.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/options/pubsub.go b/coreiface/options/pubsub.go index f0a614d580..c387d613db 100644 --- a/coreiface/options/pubsub.go +++ b/coreiface/options/pubsub.go @@ -41,7 +41,7 @@ func PubSubSubscribeOptions(opts ...PubSubSubscribeOption) (*PubSubSubscribeSett type pubsubOpts struct{} -var PubBub nameOpts +var PubSub pubsubOpts func (pubsubOpts) Topic(topic string) PubSubPeersOption { return func(settings *PubSubPeersSettings) error { From add2ae0705df01044239e9ed5691974847332408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 11 Sep 2018 12:52:40 +0200 Subject: [PATCH 2366/3147] pubsub cmd: switch to coreapi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@706e552037bd75687b5ff0cedb9802bc7f2d4617 --- coreiface/pubsub.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index 4b52ed6d64..4c9a1d73e5 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) // PubSubSubscription is an active PubSub subscription @@ -24,6 +24,12 @@ type PubSubMessage interface { // Data returns the message body Data() []byte + + // Seq returns message identifier + Seq() []byte + + // Topics returns list of topics this message was set to + Topics() []string } // PubSubAPI specifies the interface to PubSub From 0373c3c9aee429624a99c6a1c080027923ec6e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 26 Sep 2018 18:24:35 +0200 Subject: [PATCH 2367/3147] coreapi pubsub: fix review nits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@162e182a2c2f67c227b7dd4b3d661d3b15ca1d7b --- coreiface/pubsub.go | 1 - 1 file changed, 1 deletion(-) diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index 4c9a1d73e5..d7a21e02f1 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -38,7 +38,6 @@ type PubSubAPI interface { Ls(context.Context) ([]string, error) // Peers list peers we are currently pubsubbing with - // TODO: WithTopic Peers(context.Context, ...options.PubSubPeersOption) ([]peer.ID, error) // Publish a message to a given pubsub topic From 8c4523ce0bbc6ce3cd779bdaae5450ffd039c295 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 5 Oct 2018 13:01:55 -0700 Subject: [PATCH 2368/3147] gx: update go-datastore This commit was moved from ipfs/go-ipfs-blockstore@09cd28eb268c46a70a1118c72072e8536f0fd212 --- blockstore/blockstore_test.go | 4 ++++ blockstore/bloom_cache_test.go | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index d0fa739c25..50b8ae0558 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -254,6 +254,10 @@ func (c *queryTestDS) Has(key ds.Key) (exists bool, err error) { return c.ds.Has(key) } +func (c *queryTestDS) GetSize(key ds.Key) (size int, err error) { + return c.ds.GetSize(key) +} + func (c *queryTestDS) Delete(key ds.Key) (err error) { return c.ds.Delete(key) } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 7c61ac1813..d9474ada19 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -181,6 +181,11 @@ func (c *callbackDatastore) Has(key ds.Key) (exists bool, err error) { return c.ds.Has(key) } +func (c *callbackDatastore) GetSize(key ds.Key) (size int, err error) { + c.CallF() + return c.ds.GetSize(key) +} + func (c *callbackDatastore) Delete(key ds.Key) (err error) { c.CallF() return c.ds.Delete(key) From db833c767c14389f8f12a8f29877d9d1f9045f2a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 5 Oct 2018 13:03:48 -0700 Subject: [PATCH 2369/3147] use datastore.GetSize This commit was moved from ipfs/go-ipfs-blockstore@a11eacf44448935286565c3cc822e671d2b2f011 --- blockstore/blockstore.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 6bb8e399d4..f57a90af63 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -178,14 +178,11 @@ func (bs *blockstore) Has(k cid.Cid) (bool, error) { } func (bs *blockstore) GetSize(k cid.Cid) (int, error) { - bdata, err := bs.datastore.Get(dshelp.CidToDsKey(k)) + size, err := bs.datastore.GetSize(dshelp.CidToDsKey(k)) if err == ds.ErrNotFound { return -1, ErrNotFound } - if err != nil { - return -1, err - } - return len(bdata), nil + return size, err } func (bs *blockstore) DeleteBlock(k cid.Cid) error { From 8c56ae47a347f4f0ae28786eb3176e3d29566718 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 5 Oct 2018 14:11:56 -0700 Subject: [PATCH 2370/3147] gx: update stuff * go-datastore and friends: GetSize * badger: new release, fewer allocations * go-mplex: send fewer packets * go-bitswap: pack multiple blocks in a single message, fewer allocations * go-buffer-pool: replace the buffer pool from go-msgio * yamux: fixed data race and uses go-buffer-pool for stream read-buffers to reduce memory and allocations. * go-libp2p-secio: get rid of a hot-spot allocation * go-libp2p-peerstore: reduced allocations (at the cost of some memory) More? License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@505067f9e4e7bad7a5f4c0eeb76becd205be4fde --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 20 ++++++++++---------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 14 +++++++------- namesys/proquint.go | 2 +- namesys/publisher.go | 14 +++++++------- namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 10 +++++----- 14 files changed, 53 insertions(+), 53 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 5db5948aeb..705cf9fae5 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 6e23458765..8272c2bdbf 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 9696136d2f..247ea97b12 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index aad69952c9..142dfea9c1 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index eddd64da98..23a069569e 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,22 +6,22 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" - ropts "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing/options" - pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore/pstoremem" + mockrouting "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/mock" + offline "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/offline" record "gx/ipfs/QmSb4B8ZAAj5ALe9LjfzPyF8Ma6ezC1NTnDF2JQPUJxEXb/go-libp2p-record" - mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" - offline "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/offline" - ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" + routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" + ropts "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing/options" + ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" + pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore/pstoremem" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 0371174fed..7da1f4c712 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,15 +6,15 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" + routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index a77306a401..5ee9ebeb66 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,16 +7,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" - "gx/ipfs/QmavvHwEZTkNShKWK1jRejv2Y8oF6ZYxdGxytL3Mwvices/go-unixfs" + "gx/ipfs/QmQDcPcBH8nfz3JB4K4oEvxhRmBwCrMgvG966XpExEWexf/go-unixfs" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - pstoremem "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore/pstoremem" - offroute "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/offline" - ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" + offroute "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/offline" + ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" + pstoremem "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore/pstoremem" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index cd29bff254..9647f8152e 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 412b65dbb3..a5e2eae7e7 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" - ft "gx/ipfs/QmavvHwEZTkNShKWK1jRejv2Y8oF6ZYxdGxytL3Mwvices/go-unixfs" + ft "gx/ipfs/QmQDcPcBH8nfz3JB4K4oEvxhRmBwCrMgvG966XpExEWexf/go-unixfs" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" - ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" - pb "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns/pb" + routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" + ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" + pb "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns/pb" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dsquery "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dsquery "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index a95867d8ce..b55742e14e 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,13 +8,13 @@ import ( testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" - ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" + mockrouting "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/mock" + dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" + ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" - dshelp "gx/ipfs/QmafbjCxKZEU87RYYCHX2pFP9Q6uLSLAScLr2VUErNTH1f/go-ipfs-ds-help" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 8124ec3ad4..e2e650c46b 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pb "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns/pb" + pb "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 54ec416fcf..0a3afbf0bb 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" - mocknet "gx/ipfs/QmNmj2AeM46ZQqHARnWidb5qqHoZJFeYWzmG65jviJDRQY/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" + mocknet "gx/ipfs/QmU9Cf9q5TBCAC3kg74Fqr6K7DQTwa41C44YypYqB2GfR8/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 5e7feb9edf..18abb6897e 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" - mockrouting "gx/ipfs/QmYKPBQpSSWwmgNTvVE3vQdPoeqxwudPQnXJ4hU383RsSA/go-ipfs-routing/mock" - ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" + mockrouting "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/mock" + ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index f7b7c9e9a6..b65c0fa593 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,14 +6,14 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - routing "gx/ipfs/QmQRfifvvbJ8xTKj4KX1VvGWK26hnPiy8eQvW1hmjc82nD/go-libp2p-routing" - dht "gx/ipfs/QmXKSnQHAihkcGgk8ZXz7FgZgHboXeRduuEz9FkAddJK6P/go-libp2p-kad-dht" - ipns "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns" - pb "gx/ipfs/QmYZdD9dRfHtoYt4qAFgtKoiPBAoXntmM3ZcktZVvAgB4s/go-ipns/pb" + dht "gx/ipfs/QmTdMq4uYZXmGW3u6KgnpCRWjo1Y7dWjRuAaGPw7Qxqr1s/go-libp2p-kad-dht" + routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" + ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" + pb "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" From b77e7021ee4b2093d2e2a98f5274ace254a537e1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 5 Oct 2018 14:11:56 -0700 Subject: [PATCH 2371/3147] gx: update stuff * go-datastore and friends: GetSize * badger: new release, fewer allocations * go-mplex: send fewer packets * go-bitswap: pack multiple blocks in a single message, fewer allocations * go-buffer-pool: replace the buffer pool from go-msgio * yamux: fixed data race and uses go-buffer-pool for stream read-buffers to reduce memory and allocations. * go-libp2p-secio: get rid of a hot-spot allocation * go-libp2p-peerstore: reduced allocations (at the cost of some memory) More? License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@144aa5240ff7e379b34dd0e1adf9f8c1e991b3cc --- coreiface/dht.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/swarm.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 4a76f4d392..3096c8fb7e 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,7 +5,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" + pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 6a54b2d399..b4661b793f 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" + dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index 63b15fb501..9bb46b4b47 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmV4QxScV9Y7LbaWhHazFfRd8uyeUd4pAH8a7fFFbi5odJ/go-path" + ipfspath "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 58caf6759f..d8bca395c3 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,8 +5,8 @@ import ( "errors" "time" - net "gx/ipfs/QmQdLcvoy3JuSqhV6iwQ9T6Cv7hWLAdzob4jUZRPqFL67Z/go-libp2p-net" - pstore "gx/ipfs/QmSJ36wcYQyEViJUWUEhJU81tw1KdakTKqLLHbvYbA9zDv/go-libp2p-peerstore" + net "gx/ipfs/QmWUPYHpNv4YahaBYXovuEJttgfqcNcN9Gg4arhQYcRoqa/go-libp2p-net" + pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" From b2c8ae0a97d26c1a7da4e1c7e8e58f65729014db Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 5 Oct 2018 14:11:56 -0700 Subject: [PATCH 2372/3147] gx: update stuff * go-datastore and friends: GetSize * badger: new release, fewer allocations * go-mplex: send fewer packets * go-bitswap: pack multiple blocks in a single message, fewer allocations * go-buffer-pool: replace the buffer pool from go-msgio * yamux: fixed data race and uses go-buffer-pool for stream read-buffers to reduce memory and allocations. * go-libp2p-secio: get rid of a hot-spot allocation * go-libp2p-peerstore: reduced allocations (at the cost of some memory) More? License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@d721b445f8339be1eb4f65df1c312342a1268094 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index d1e9ee9bfd..1ad7471fbc 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -15,8 +15,8 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" - blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" + dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 72f159fc98..98861cf3fc 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" + dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 1f5baf24e7..7ecfaae8c5 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -13,12 +13,12 @@ import ( posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" - dshelp "gx/ipfs/QmafbjCxKZEU87RYYCHX2pFP9Q6uLSLAScLr2VUErNTH1f/go-ipfs-ds-help" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dsns "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/namespace" - dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" + dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dsns "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/namespace" + dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index ddc3c225e1..39df78c6f3 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -7,10 +7,10 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - dshelp "gx/ipfs/QmafbjCxKZEU87RYYCHX2pFP9Q6uLSLAScLr2VUErNTH1f/go-ipfs-ds-help" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" - blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" + dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) // Status is used to identify the state of the block data referenced From 71601211f4d4499181b721737c0756ec159a40a7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 5 Oct 2018 14:11:56 -0700 Subject: [PATCH 2373/3147] gx: update stuff * go-datastore and friends: GetSize * badger: new release, fewer allocations * go-mplex: send fewer packets * go-bitswap: pack multiple blocks in a single message, fewer allocations * go-buffer-pool: replace the buffer pool from go-msgio * yamux: fixed data race and uses go-buffer-pool for stream read-buffers to reduce memory and allocations. * go-libp2p-secio: get rid of a hot-spot allocation * go-libp2p-peerstore: reduced allocations (at the cost of some memory) More? License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@395dd6a582d8b71decf2a4c4835df778857e15df --- pinning/pinner/gc/gc.go | 10 +++++----- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 12 ++++++------ pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 12 ++++++------ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 2be1333d5d..c392eee9d7 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmNozJswSuwiZspexEHcQo5GMqpzM5exUGjNW6s4AAipUX/go-blockservice" - dag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" + dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" + bserv "gx/ipfs/QmY1fUNoXjC8sH86kyaK8BWFGaU6MmH4AJfF1w4sKjmtRZ/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" + offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" "gx/ipfs/QmVkMRSkXrpjqrroEXWuYBvDBnXCdMMY6gsKicBGVGUqKT/go-verifcid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - dstore "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + dstore "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + bstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" - bstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 2ed476414c..4b91fa4072 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,11 +10,11 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" + mdag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 4890872abe..91efc24b66 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - bs "gx/ipfs/QmNozJswSuwiZspexEHcQo5GMqpzM5exUGjNW6s4AAipUX/go-blockservice" - mdag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" + mdag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" + bs "gx/ipfs/QmY1fUNoXjC8sH86kyaK8BWFGaU6MmH4AJfF1w4sKjmtRZ/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dssync "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/sync" - blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" + offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" + blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 8bccc85034..0b50c23a06 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" + "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 0502880ff8..1fcfb1ad12 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmNozJswSuwiZspexEHcQo5GMqpzM5exUGjNW6s4AAipUX/go-blockservice" - dag "gx/ipfs/QmTGpm48qm4fUZ9E5hMXy4ZngJUYCMKu15rTMVR3BSEnPm/go-merkledag" + dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" + bserv "gx/ipfs/QmY1fUNoXjC8sH86kyaK8BWFGaU6MmH4AJfF1w4sKjmtRZ/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - offline "gx/ipfs/QmPXcrGQQEEPswwg6YiE2WLk8qkmvncZ7zphMKKP8bXqY3/go-ipfs-exchange-offline" - ds "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore" - dsq "gx/ipfs/QmbQshXLNcCPRUGZv4sBGxnZNAHREA6MKeomkwihNXPZWP/go-datastore/query" - blockstore "gx/ipfs/QmfUhZX9KpvJiuiziUzP2cjhRAyqHJURsPgRKn1cdDZMKa/go-ipfs-blockstore" + offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" + ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) func ignoreCids(_ cid.Cid) {} From 27097d47b308f4dd810a1f3f7b06d4133999eb13 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 10 Oct 2018 14:06:57 +0100 Subject: [PATCH 2374/3147] gx: update go-buffer-pool Turns out that `pool.Put(buf)` had to *allocate* because we needed to turn `[]byte` into `interface{}`. Apparently, we've never done this correctly we just never noticed because we never really used buffer pools extensively. However, since migrating yamux to a buffer-pool backed buffer, this started showing up in allocation profiles. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@a043e5a8d0e8b8445a6e711faa593c2cee911632 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 16 ++++++++-------- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 10 +++++----- namesys/proquint.go | 2 +- namesys/publisher.go | 10 +++++----- namesys/publisher_test.go | 4 ++-- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 6 +++--- namesys/routing.go | 10 +++++----- 14 files changed, 40 insertions(+), 40 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 705cf9fae5..0b6e7840b3 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index 8272c2bdbf..d187021a4c 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 247ea97b12..9c64ab913f 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 142dfea9c1..2dae7d0f9d 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 23a069569e..50c0bfa90f 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,19 +6,19 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" + routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" + ropts "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing/options" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/mock" - offline "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/offline" + mockrouting "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/mock" + offline "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/offline" record "gx/ipfs/QmSb4B8ZAAj5ALe9LjfzPyF8Ma6ezC1NTnDF2JQPUJxEXb/go-libp2p-record" - routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" - ropts "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing/options" - ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" - pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore/pstoremem" + pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore/pstoremem" + ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" diff --git a/namesys/namesys.go b/namesys/namesys.go index 7da1f4c712..45dfe66e0f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,12 +6,12 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 5ee9ebeb66..f42477d469 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,13 +7,13 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmQDcPcBH8nfz3JB4K4oEvxhRmBwCrMgvG966XpExEWexf/go-unixfs" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + "gx/ipfs/QmNWmxWDZjv1dMUvz3sgThydJfeNUxxXaaZptF6E9b59vQ/go-unixfs" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - offroute "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/offline" - ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" - pstoremem "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore/pstoremem" + offroute "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/offline" + pstoremem "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore/pstoremem" + ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" diff --git a/namesys/proquint.go b/namesys/proquint.go index 9647f8152e..6aa38b4c7c 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index a5e2eae7e7..94ea8fd07d 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,13 +7,13 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmQDcPcBH8nfz3JB4K4oEvxhRmBwCrMgvG966XpExEWexf/go-unixfs" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + ft "gx/ipfs/QmNWmxWDZjv1dMUvz3sgThydJfeNUxxXaaZptF6E9b59vQ/go-unixfs" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" - ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" - pb "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns/pb" + ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" + pb "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns/pb" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dsquery "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index b55742e14e..e298810046 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,9 +8,9 @@ import ( testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/mock" dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" - ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" + ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index e2e650c46b..5adaa62dbc 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,12 +7,12 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pb "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns/pb" + pb "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 0a3afbf0bb..40ec6d910d 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmU9Cf9q5TBCAC3kg74Fqr6K7DQTwa41C44YypYqB2GfR8/go-libp2p/p2p/net/mock" - pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" + pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" + mocknet "gx/ipfs/QmcmNfbQznhk66ipFiaRHmZU8DVpvDKFfHrRo9q5wsHzZP/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 18abb6897e..6ed4613b8f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" - mockrouting "gx/ipfs/QmQqPdGQfsfQTpRUUzgD3d2RzWHJffZsSqwopnZ2BkiezW/go-ipfs-routing/mock" - ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" + mockrouting "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/mock" + ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" diff --git a/namesys/routing.go b/namesys/routing.go index b65c0fa593..d61fdb9c66 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,16 +6,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dht "gx/ipfs/QmTdMq4uYZXmGW3u6KgnpCRWjo1Y7dWjRuAaGPw7Qxqr1s/go-libp2p-kad-dht" - routing "gx/ipfs/QmVQPj6rHdqz6dDQrjcdP36zDYLaoB7xwqRg39kx2PqqKU/go-libp2p-routing" - ipns "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns" - pb "gx/ipfs/QmWhm9qS3NZdvTgAsB1cX4q9UbNu8yFybCcAMchCN88w7o/go-ipns/pb" + ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" + pb "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + dht "gx/ipfs/QmcZE4Q9J9YXhmKcweaMtxoLVzGSoySqLd88m6qBKFRiNy/go-libp2p-kad-dht" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From 2bda31a93a5070433a41cff4799c0012f4d69460 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 10 Oct 2018 14:06:57 +0100 Subject: [PATCH 2375/3147] gx: update go-buffer-pool Turns out that `pool.Put(buf)` had to *allocate* because we needed to turn `[]byte` into `interface{}`. Apparently, we've never done this correctly we just never noticed because we never really used buffer pools extensively. However, since migrating yamux to a buffer-pool backed buffer, this started showing up in allocation profiles. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@54fd5775db59e6c0113851fb7556dd09adac4215 --- coreiface/dht.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/swarm.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 3096c8fb7e..cb3362bb96 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,7 +5,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" + pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index b4661b793f..aaed6024ed 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" + dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index 9bb46b4b47..a11a463246 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmQmMu1vsgsjxyB8tzrA6ZTCTCLDLVaXMb4Q57r2v886Sx/go-path" + ipfspath "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index d8bca395c3..ba1a556981 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,8 +5,8 @@ import ( "errors" "time" - net "gx/ipfs/QmWUPYHpNv4YahaBYXovuEJttgfqcNcN9Gg4arhQYcRoqa/go-libp2p-net" - pstore "gx/ipfs/QmXEyLwySuDMXejWBu8XwdkX2WuGKk8x9jFwz8js7j72UX/go-libp2p-peerstore" + net "gx/ipfs/QmSTaEYUgDe1r581hxyd2u9582Hgp3KX4wGwYbRqz2u9Qh/go-libp2p-net" + pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" From 0c8d7140d9120dc15bbab647b57678018689d62e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 10 Oct 2018 14:06:57 +0100 Subject: [PATCH 2376/3147] gx: update go-buffer-pool Turns out that `pool.Put(buf)` had to *allocate* because we needed to turn `[]byte` into `interface{}`. Apparently, we've never done this correctly we just never noticed because we never really used buffer pools extensively. However, since migrating yamux to a buffer-pool backed buffer, this started showing up in allocation profiles. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@68253f6178b62f30ef9cba9683a0be65961e847e --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 98861cf3fc..994d358bf8 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" + dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From 3ba7edf7d01d8f387122c1d0bf124ea6bfdd39ad Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 10 Oct 2018 14:06:57 +0100 Subject: [PATCH 2377/3147] gx: update go-buffer-pool Turns out that `pool.Put(buf)` had to *allocate* because we needed to turn `[]byte` into `interface{}`. Apparently, we've never done this correctly we just never noticed because we never really used buffer pools extensively. However, since migrating yamux to a buffer-pool backed buffer, this started showing up in allocation profiles. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@843897ca7c48ce43846957ac676c0ef7d4c11e6b --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index c392eee9d7..76ea2a7d8f 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" - bserv "gx/ipfs/QmY1fUNoXjC8sH86kyaK8BWFGaU6MmH4AJfF1w4sKjmtRZ/go-blockservice" + dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" + bserv "gx/ipfs/QmVgTAMesq25DK9JuPVZAohx2aRkx1s7n8obmDsA2ipd1u/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 4b91fa4072..3987a2dfd7 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" + mdag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 91efc24b66..3cd02b3075 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" - bs "gx/ipfs/QmY1fUNoXjC8sH86kyaK8BWFGaU6MmH4AJfF1w4sKjmtRZ/go-blockservice" + mdag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" + bs "gx/ipfs/QmVgTAMesq25DK9JuPVZAohx2aRkx1s7n8obmDsA2ipd1u/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 0b50c23a06..c60f18f9b1 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" + "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 1fcfb1ad12..1e49392b0d 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmXTw4By9FMZAt7qJm4JoJuNBrBgqMMzkS4AjKc4zqTUVd/go-merkledag" - bserv "gx/ipfs/QmY1fUNoXjC8sH86kyaK8BWFGaU6MmH4AJfF1w4sKjmtRZ/go-blockservice" + dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" + bserv "gx/ipfs/QmVgTAMesq25DK9JuPVZAohx2aRkx1s7n8obmDsA2ipd1u/go-blockservice" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" From 89d1401a99a9a5179f26b02d9be255974b34cee0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 12 Oct 2018 16:15:40 +0100 Subject: [PATCH 2378/3147] gx: update yamux and refmt * yamux: fix memory leak. * refmt: obey the "empty" tag. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@7fa3f8c8d6978540c53b5b3d54a40e88ce1c525f --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 13 files changed, 17 insertions(+), 17 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 0b6e7840b3..a650f094af 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ) type resolver interface { diff --git a/namesys/cache.go b/namesys/cache.go index d187021a4c..8a96d90fd2 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 9c64ab913f..7aa4e24d2f 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index 2dae7d0f9d..c8413fbcec 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 50c0bfa90f..5504bdea1b 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/namesys/namesys.go b/namesys/namesys.go index 45dfe66e0f..fd3853371e 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,7 +6,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index f42477d469..30e13c72dd 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,8 +7,8 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmNWmxWDZjv1dMUvz3sgThydJfeNUxxXaaZptF6E9b59vQ/go-unixfs" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + "gx/ipfs/QmRX6WZhMinQrQhyuwaqNHYQtNPhtBwzxKFySzNMaJmW9v/go-unixfs" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" offroute "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/offline" diff --git a/namesys/proquint.go b/namesys/proquint.go index 6aa38b4c7c..c382d8a26b 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,8 +7,8 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 94ea8fd07d..684caa6557 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmNWmxWDZjv1dMUvz3sgThydJfeNUxxXaaZptF6E9b59vQ/go-unixfs" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + ft "gx/ipfs/QmRX6WZhMinQrQhyuwaqNHYQtNPhtBwzxKFySzNMaJmW9v/go-unixfs" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 5adaa62dbc..2ea8d46330 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 40ec6d910d..a982b2df13 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + mocknet "gx/ipfs/QmPL3AKtiaQyYpchZceXBZhZ3MSnoGqJvLZrc7fzDTTQdJ/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" - mocknet "gx/ipfs/QmcmNfbQznhk66ipFiaRHmZU8DVpvDKFfHrRo9q5wsHzZP/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 6ed4613b8f..3fd8f2c973 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" mockrouting "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/mock" diff --git a/namesys/routing.go b/namesys/routing.go index d61fdb9c66..13c554b720 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -6,16 +6,16 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + dht "gx/ipfs/QmSteomMgXnSQxLEY5UpxmkYAd8QF9JuLLeLYBokTHxFru/go-libp2p-kad-dht" ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" pb "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns/pb" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - dht "gx/ipfs/QmcZE4Q9J9YXhmKcweaMtxoLVzGSoySqLd88m6qBKFRiNy/go-libp2p-kad-dht" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From f3066c9cd309e9af638a8c03d9967776254d5d65 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 12 Oct 2018 16:15:40 +0100 Subject: [PATCH 2379/3147] gx: update yamux and refmt * yamux: fix memory leak. * refmt: obey the "empty" tag. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@cb4d2fb72ce804cc5c277ac8d6b1b10a63943072 --- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index aaed6024ed..307d618dea 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" + dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index a11a463246..d90f04aa12 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmTy6VoHV2E5baEFDXbp1xmHhxSVff5qTSrTsoXxD1eB2P/go-path" + ipfspath "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From 07c1e752d682d3f4494d83cc392e0282b9f1535e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 12 Oct 2018 16:15:40 +0100 Subject: [PATCH 2380/3147] gx: update yamux and refmt * yamux: fix memory leak. * refmt: obey the "empty" tag. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@aabb6089a342b430a02e40796349797db12447cb --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 994d358bf8..7828fdb17c 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" + dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From 5d8c47257f7465fdc039c4a982425d415745284e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 12 Oct 2018 16:15:40 +0100 Subject: [PATCH 2381/3147] gx: update yamux and refmt * yamux: fix memory leak. * refmt: obey the "empty" tag. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@40e648173af792f2f96bbb0aebc5d04e2a9fee19 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 76ea2a7d8f..a7bd364db4 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" - bserv "gx/ipfs/QmVgTAMesq25DK9JuPVZAohx2aRkx1s7n8obmDsA2ipd1u/go-blockservice" + bserv "gx/ipfs/QmSU7Nx5eUHWkc9zCTiXDu3ZkdXAZdRgRGRaKM86VjGU4m/go-blockservice" + dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 3987a2dfd7..5736e5597f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" + mdag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 3cd02b3075..ba83bdeb5b 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" - bs "gx/ipfs/QmVgTAMesq25DK9JuPVZAohx2aRkx1s7n8obmDsA2ipd1u/go-blockservice" + bs "gx/ipfs/QmSU7Nx5eUHWkc9zCTiXDu3ZkdXAZdRgRGRaKM86VjGU4m/go-blockservice" + mdag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index c60f18f9b1..dbd57d15e0 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" + "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 1e49392b0d..a99bc7ef54 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmTpyXP1bsqJvyW5VcNmALPCb47VPJFy2T8icGASNy4ML1/go-merkledag" - bserv "gx/ipfs/QmVgTAMesq25DK9JuPVZAohx2aRkx1s7n8obmDsA2ipd1u/go-blockservice" + bserv "gx/ipfs/QmSU7Nx5eUHWkc9zCTiXDu3ZkdXAZdRgRGRaKM86VjGU4m/go-blockservice" + dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" From 25e7fdbb9ea34eb633196e5345fe29003b9a4c34 Mon Sep 17 00:00:00 2001 From: Overbool Date: Wed, 10 Oct 2018 18:09:33 +0800 Subject: [PATCH 2382/3147] fix(resolve): issue #31 This commit was moved from ipfs/go-unixfs@3512ccf8d99e8e7c949b4a4d60b0667a244a9fae --- unixfs/io/resolve.go | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index 3181097f39..dbcd159d6c 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -18,12 +18,7 @@ func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, na fsn, err := ft.FSNodeFromBytes(nd.Data()) if err != nil { // Not a unixfs node, use standard object traversal code - lnk, err := nd.GetNodeLink(names[0]) - if err != nil { - return nil, nil, err - } - - return lnk, names[1:], nil + return nd.ResolveLink(names) } switch fsn.Type() { @@ -40,19 +35,7 @@ func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, na } return out, names[1:], nil - default: - lnk, err := nd.GetNodeLink(names[0]) - if err != nil { - return nil, nil, err - } - - return lnk, names[1:], nil - } - default: - lnk, rest, err := nd.ResolveLink(names) - if err != nil { - return nil, nil, err } - return lnk, rest, nil } + return nd.ResolveLink(names) } From 02fbac0484c3adafc30042e3f420287bafa96b47 Mon Sep 17 00:00:00 2001 From: Overbool Date: Wed, 10 Oct 2018 23:54:20 +0800 Subject: [PATCH 2383/3147] fix(resolve): replace switch with if This commit was moved from ipfs/go-unixfs@b561810616c00589daf0495c78ed0778e443fccf --- unixfs/io/resolve.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/unixfs/io/resolve.go b/unixfs/io/resolve.go index dbcd159d6c..c3dcffc245 100644 --- a/unixfs/io/resolve.go +++ b/unixfs/io/resolve.go @@ -13,16 +13,15 @@ import ( // ResolveUnixfsOnce resolves a single hop of a path through a graph in a // unixfs context. This includes handling traversing sharded directories. func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) { - switch nd := nd.(type) { - case *dag.ProtoNode: - fsn, err := ft.FSNodeFromBytes(nd.Data()) + pn, ok := nd.(*dag.ProtoNode) + if ok { + fsn, err := ft.FSNodeFromBytes(pn.Data()) if err != nil { // Not a unixfs node, use standard object traversal code return nd.ResolveLink(names) } - switch fsn.Type() { - case ft.THAMTShard: + if fsn.Type() == ft.THAMTShard { rods := dag.NewReadOnlyDagService(ds) s, err := hamt.NewHamtFromDag(rods, nd) if err != nil { @@ -37,5 +36,6 @@ func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, na return out, names[1:], nil } } + return nd.ResolveLink(names) } From 2623cc400f7d76c24dc6d3b6c5832d55780ee659 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 16 Oct 2018 12:05:13 +0100 Subject: [PATCH 2384/3147] use new ExtractPublicKey signature The new version returns an error if it fails to extract the public key, instead of just `nil, nil`. This is significantly more "go-like" and less likely to cause confusion. This commit was moved from ipfs/go-ipns@9ed4416569b9e86a2a17079a9a7f25e17a47b35d --- ipns/ipns.go | 7 ++----- ipns/record.go | 10 +++++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/ipns/ipns.go b/ipns/ipns.go index 7bab52478d..f145333b1c 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -73,13 +73,10 @@ func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { if err != nil { return err } - extracted, err := id.ExtractPublicKey() - if err != nil { + if _, err := id.ExtractPublicKey(); err != peer.ErrNoPublicKey { + // Either a *real* error or nil. return err } - if extracted != nil { - return nil - } // We failed to extract the public key from the peer ID, embed it in the // record. diff --git a/ipns/record.go b/ipns/record.go index 56e2219486..eb60ce6f82 100644 --- a/ipns/record.go +++ b/ipns/record.go @@ -61,12 +61,12 @@ func (v Validator) Validate(key string, value []byte) error { } func (v Validator) getPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey, error) { - pk, err := ExtractPublicKey(pid, entry) - if err != nil { - return nil, err - } - if pk != nil { + switch pk, err := ExtractPublicKey(pid, entry); err { + case peer.ErrNoPublicKey: + case nil: return pk, nil + default: + return nil, err } if v.KeyBook == nil { From 724c9ff3e08d4eb4ffba0a34245c489b93ecf3db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 13:50:25 +0200 Subject: [PATCH 2385/3147] gx: update to use extracted go-ipfs-files This commit was moved from ipfs/go-unixfs@727c7d446f500f1b9cabe92a4b49b21062c10654 --- unixfs/importer/helpers/dagbuilder.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 4c897fd482..9c0dd437ce 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -11,7 +11,7 @@ import ( cid "github.com/ipfs/go-cid" chunker "github.com/ipfs/go-ipfs-chunker" - files "github.com/ipfs/go-ipfs-cmdkit/files" + files "github.com/ipfs/go-ipfs-files" pi "github.com/ipfs/go-ipfs-posinfo" ipld "github.com/ipfs/go-ipld-format" ) From 60aa1853647ac4cab317726b1cdd512096719472 Mon Sep 17 00:00:00 2001 From: Overbool Date: Tue, 9 Oct 2018 15:51:34 +0800 Subject: [PATCH 2386/3147] refactor(hamt): remove child interface from hamt pkg This commit was moved from ipfs/go-unixfs@7262fe1795a120870c39265c3348f5a311c24a19 --- unixfs/hamt/hamt.go | 152 +++++++++++++++++++------------------------- 1 file changed, 67 insertions(+), 85 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index b7ac0a2f48..dbdcac1093 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -39,13 +39,20 @@ const ( HashMurmur3 uint64 = 0x22 ) +func (ds *Shard) isValueNode() bool { + if ds.key != "" && ds.val != nil { + return true + } + return false +} + // A Shard represents the HAMT. It should be initialized with NewShard(). type Shard struct { nd *dag.ProtoNode bitfield bitfield.Bitfield - children []child + children []*Shard tableSize int tableSizeLg2 int @@ -57,12 +64,10 @@ type Shard struct { maxpadlen int dserv ipld.DAGService -} -// child can either be another shard, or a leaf node value -type child interface { - Link() (*ipld.Link, error) - Label() string + // leaf node + key string + val *ipld.Link } // NewShard creates a new, empty HAMT shard with the given size. @@ -119,7 +124,7 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { } ds.nd = pbnd.Copy().(*dag.ProtoNode) - ds.children = make([]child, len(pbnd.Links())) + ds.children = make([]*Shard, len(pbnd.Links())) ds.bitfield.SetBytes(fsn.Data()) ds.hashFunc = fsn.HashType() ds.builder = ds.nd.CidBuilder() @@ -156,7 +161,7 @@ func (ds *Shard) Node() (ipld.Node, error) { return nil, err } - err = out.AddRawLink(ds.linkNamePrefix(i)+ch.Label(), clnk) + err = out.AddRawLink(ds.linkNamePrefix(i)+ch.key, clnk) if err != nil { return nil, err } @@ -188,26 +193,14 @@ func (ds *Shard) Node() (ipld.Node, error) { return out, nil } -type shardValue struct { - key string - val *ipld.Link -} - -// Link returns a link to this node -func (sv *shardValue) Link() (*ipld.Link, error) { - return sv.val, nil -} +func (ds *Shard) makeShardValue(lnk *ipld.Link) *Shard { + lnk2 := *lnk + s, _ := makeShard(ds.dserv, ds.tableSize) -func (sv *shardValue) Label() string { - return sv.key -} + s.key = lnk.Name[ds.maxpadlen:] + s.val = &lnk2 -func (ds *Shard) makeShardValue(lnk *ipld.Link) *shardValue { - lnk2 := *lnk - return &shardValue{ - key: lnk.Name[ds.maxpadlen:], - val: &lnk2, - } + return s } func hash(val []byte) []byte { @@ -216,12 +209,6 @@ func hash(val []byte) []byte { return h.Sum(nil) } -// Label for Shards is the empty string, this is used to differentiate them from -// value entries -func (ds *Shard) Label() string { - return "" -} - // Set sets 'name' = nd in the HAMT func (ds *Shard) Set(ctx context.Context, name string, nd ipld.Node) error { hv := &hashBits{b: hash([]byte(name))} @@ -250,7 +237,7 @@ func (ds *Shard) Find(ctx context.Context, name string) (*ipld.Link, error) { hv := &hashBits{b: hash([]byte(name))} var out *ipld.Link - err := ds.getValue(ctx, hv, name, func(sv *shardValue) error { + err := ds.getValue(ctx, hv, name, func(sv *Shard) error { out = sv.val return nil }) @@ -282,7 +269,7 @@ func (ds *Shard) childLinkType(lnk *ipld.Link) (linkType, error) { // getChild returns the i'th child of this shard. If it is cached in the // children array, it will return it from there. Otherwise, it loads the child // node from disk. -func (ds *Shard) getChild(ctx context.Context, i int) (child, error) { +func (ds *Shard) getChild(ctx context.Context, i int) (*Shard, error) { if i >= len(ds.children) || i < 0 { return nil, fmt.Errorf("invalid index passed to getChild (likely corrupt bitfield)") } @@ -301,14 +288,14 @@ func (ds *Shard) getChild(ctx context.Context, i int) (child, error) { // loadChild reads the i'th child node of this shard from disk and returns it // as a 'child' interface -func (ds *Shard) loadChild(ctx context.Context, i int) (child, error) { +func (ds *Shard) loadChild(ctx context.Context, i int) (*Shard, error) { lnk := ds.nd.Links()[i] lnkLinkType, err := ds.childLinkType(lnk) if err != nil { return nil, err } - var c child + var c *Shard if lnkLinkType == shardLink { nd, err := lnk.GetNode(ctx, ds.dserv) if err != nil { @@ -328,12 +315,16 @@ func (ds *Shard) loadChild(ctx context.Context, i int) (child, error) { return c, nil } -func (ds *Shard) setChild(i int, c child) { +func (ds *Shard) setChild(i int, c *Shard) { ds.children[i] = c } // Link returns a merklelink to this shard node func (ds *Shard) Link() (*ipld.Link, error) { + if ds.isValueNode() { + return ds.val, nil + } + nd, err := ds.Node() if err != nil { return nil, err @@ -356,12 +347,12 @@ func (ds *Shard) insertChild(idx int, key string, lnk *ipld.Link) error { ds.bitfield.SetBit(idx) lnk.Name = ds.linkNamePrefix(idx) + key - sv := &shardValue{ + sv := &Shard{ key: key, val: lnk, } - ds.children = append(ds.children[:i], append([]child{sv}, ds.children[i:]...)...) + ds.children = append(ds.children[:i], append([]*Shard{sv}, ds.children[i:]...)...) ds.nd.SetLinks(append(ds.nd.Links()[:i], append([]*ipld.Link{nil}, ds.nd.Links()[i:]...)...)) return nil } @@ -380,7 +371,7 @@ func (ds *Shard) rmChild(i int) error { return nil } -func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*shardValue) error) error { +func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*Shard) error) error { idx := hv.Next(ds.tableSizeLg2) if ds.bitfield.Bit(int(idx)) { cindex := ds.indexForBitPos(idx) @@ -390,13 +381,12 @@ func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func return err } - switch child := child.(type) { - case *Shard: - return child.getValue(ctx, hv, key, cb) - case *shardValue: + if child.isValueNode() { if child.key == key { return cb(child) } + } else { + return child.getValue(ctx, hv, key, cb) } } @@ -408,7 +398,7 @@ func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { var links []*ipld.Link var setlk sync.Mutex - getLinks := makeAsyncTrieGetLinks(ds.dserv, func(sv *shardValue) error { + getLinks := makeAsyncTrieGetLinks(ds.dserv, func(sv *Shard) error { lnk := sv.val lnk.Name = sv.key setlk.Lock() @@ -425,7 +415,7 @@ func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { // ForEachLink walks the Shard and calls the given function. func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { - return ds.walkTrie(ctx, func(sv *shardValue) error { + return ds.walkTrie(ctx, func(sv *Shard) error { lnk := sv.val lnk.Name = sv.key @@ -436,7 +426,7 @@ func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) erro // makeAsyncTrieGetLinks builds a getLinks function that can be used with EnumerateChildrenAsync // to iterate a HAMT shard. It takes an IPLD Dag Service to fetch nodes, and a call back that will get called // on all links to leaf nodes in a HAMT tree, so they can be collected for an EnumLinks operation -func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(*shardValue) error) dag.GetLinks { +func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(shard *Shard) error) dag.GetLinks { return func(ctx context.Context, currentCid cid.Cid) ([]*ipld.Link, error) { node, err := dagService.Get(ctx, currentCid) @@ -471,25 +461,21 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(*shardV } } -func (ds *Shard) walkTrie(ctx context.Context, cb func(*shardValue) error) error { +func (ds *Shard) walkTrie(ctx context.Context, cb func(*Shard) error) error { for idx := range ds.children { c, err := ds.getChild(ctx, idx) if err != nil { return err } - switch c := c.(type) { - case *shardValue: + if c.isValueNode() { if err := cb(c); err != nil { return err } - - case *Shard: + } else { if err := c.walkTrie(ctx, cb); err != nil { return err } - default: - return fmt.Errorf("unexpected child type: %#v", c) } } return nil @@ -497,7 +483,6 @@ func (ds *Shard) walkTrie(ctx context.Context, cb func(*shardValue) error) error func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val *ipld.Link) error { idx := hv.Next(ds.tableSizeLg2) - if !ds.bitfield.Bit(idx) { return ds.insertChild(idx, key, val) } @@ -509,34 +494,7 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val return err } - switch child := child.(type) { - case *Shard: - err := child.modifyValue(ctx, hv, key, val) - if err != nil { - return err - } - - if val == nil { - switch len(child.children) { - case 0: - // empty sub-shard, prune it - // Note: this shouldnt normally ever happen - // in the event of another implementation creates flawed - // structures, this will help to normalize them. - ds.bitfield.UnsetBit(idx) - return ds.rmChild(cindex) - case 1: - nchild, ok := child.children[0].(*shardValue) - if ok { - // sub-shard with a single value element, collapse it - ds.setChild(cindex, nchild) - } - return nil - } - } - - return nil - case *shardValue: + if child.isValueNode() { if child.key == key { // value modification if val == nil { @@ -575,8 +533,32 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val ds.setChild(cindex, ns) return nil - default: - return fmt.Errorf("unexpected type for child: %#v", child) + } else { + err := child.modifyValue(ctx, hv, key, val) + if err != nil { + return err + } + + if val == nil { + switch len(child.children) { + case 0: + // empty sub-shard, prune it + // Note: this shouldnt normally ever happen + // in the event of another implementation creates flawed + // structures, this will help to normalize them. + ds.bitfield.UnsetBit(idx) + return ds.rmChild(cindex) + case 1: + nchild := child.children[0] + if nchild.isValueNode() { + // sub-shard with a single value element, collapse it + ds.setChild(cindex, nchild) + } + return nil + } + } + + return nil } } From db25253b47cb6eae894da91dabe71182e5092c44 Mon Sep 17 00:00:00 2001 From: Overbool Date: Tue, 16 Oct 2018 17:03:30 +0800 Subject: [PATCH 2387/3147] fix(hamt): modify isValueNode This commit was moved from ipfs/go-unixfs@9e75a2ecf857b646115dba5b88d0857336a4b4a6 --- unixfs/hamt/hamt.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index dbdcac1093..e4c8ff8397 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -40,10 +40,7 @@ const ( ) func (ds *Shard) isValueNode() bool { - if ds.key != "" && ds.val != nil { - return true - } - return false + return ds.key != "" && ds.val != nil } // A Shard represents the HAMT. It should be initialized with NewShard(). From 4804cc97b89142c8f537f9cbe537d21f9078f76f Mon Sep 17 00:00:00 2001 From: Overbool Date: Tue, 16 Oct 2018 18:25:22 +0800 Subject: [PATCH 2388/3147] fix(hamt): add error in makeShardValue This commit was moved from ipfs/go-unixfs@3cc73ee497524c938f0eb6c5a23de0a04d7f48fc --- unixfs/hamt/hamt.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index e4c8ff8397..0b474289b8 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -190,14 +190,17 @@ func (ds *Shard) Node() (ipld.Node, error) { return out, nil } -func (ds *Shard) makeShardValue(lnk *ipld.Link) *Shard { +func (ds *Shard) makeShardValue(lnk *ipld.Link) (*Shard, error) { lnk2 := *lnk - s, _ := makeShard(ds.dserv, ds.tableSize) + s, err := makeShard(ds.dserv, ds.tableSize) + if err != nil { + return nil, err + } s.key = lnk.Name[ds.maxpadlen:] s.val = &lnk2 - return s + return s, nil } func hash(val []byte) []byte { @@ -305,7 +308,11 @@ func (ds *Shard) loadChild(ctx context.Context, i int) (*Shard, error) { c = cds } else { - c = ds.makeShardValue(lnk) + s, err := ds.makeShardValue(lnk) + if err != nil { + return nil, err + } + c = s } ds.children[i] = c @@ -447,8 +454,11 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(shard * if lnkLinkType == shardLink { childShards = append(childShards, lnk) } else { - sv := directoryShard.makeShardValue(lnk) - err := onShardValue(sv) + sv, err := directoryShard.makeShardValue(lnk) + if err != nil { + return nil, err + } + err = onShardValue(sv) if err != nil { return nil, err } From a8bae11046745cf6446295ad58f1dbfd5f1b221e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 11:41:00 +0200 Subject: [PATCH 2389/3147] namesys: review fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@ea466fec47fdfef343e1a05fc5e43a54c2fabd47 --- namesys/base.go | 16 +++++++++------- namesys/dns.go | 1 + namesys/namesys.go | 18 +++++++++++++++--- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 56cfd03a24..508847ac3b 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -1,12 +1,12 @@ package namesys import ( + "context" "strings" "time" - context "context" - opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ) @@ -40,13 +40,10 @@ func resolve(ctx context.Context, r resolver, name string, options opts.ResolveO return p, err } -//TODO: -// - better error handling -// - select on writes func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) <-chan Result { resCh := r.resolveOnceAsync(ctx, name, options) depth := options.Depth - outCh := make(chan Result) + outCh := make(chan Result, 1) go func() { defer close(outCh) @@ -97,8 +94,13 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res break } - outCh <- res + select { + case outCh <- res: + case <-ctx.Done(): + return + } case <-ctx.Done(): + return } if resCh == nil && subCh == nil { return diff --git a/namesys/dns.go b/namesys/dns.go index 81eef07da9..f4d37e654f 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -7,6 +7,7 @@ import ( "strings" opts "github.com/ipfs/go-ipfs/namesys/opts" + isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ) diff --git a/namesys/namesys.go b/namesys/namesys.go index 2e71b30031..83cd7dbccf 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,9 +5,10 @@ import ( "strings" "time" - opts "github.com/ipfs/go-ipfs/namesys/opts" path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + opts "github.com/ipfs/go-ipfs/namesys/opts" + routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" @@ -138,10 +139,21 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. // Attach rest of the path if len(segments) > 3 { - p, _ = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + p, err := path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + if err != nil { + select { + case out <- onceResult{value: p, err: err}: + case <-ctx.Done(): + } + return + } } - out <- onceResult{value: p, err: res.err} + select { + case out <- onceResult{value: p, ttl: res.ttl, err: res.err}: + case <-ctx.Done(): + return + } case <-ctx.Done(): return } From 6aaeb7276d4aa93de22390a6abf730231d75bbf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 11:41:00 +0200 Subject: [PATCH 2390/3147] namesys: review fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@f660979841b69c6f91ff258b2eb90695dae98e75 --- coreiface/name.go | 1 - 1 file changed, 1 deletion(-) diff --git a/coreiface/name.go b/coreiface/name.go index 14127ac27b..782f683515 100644 --- a/coreiface/name.go +++ b/coreiface/name.go @@ -2,7 +2,6 @@ package iface import ( "context" - "errors" options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" From 6e882475240a0cf4454828cb9e3b7ec196a92106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 16:35:31 +0200 Subject: [PATCH 2391/3147] namesys: drop prefix args MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@5f1e0f0ba3aa670ce3b6d2767fe89b90426b605c --- namesys/base.go | 10 +++++----- namesys/dns.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 13 +++++++------ namesys/namesys.go | 4 ++-- namesys/proquint.go | 5 +++-- namesys/routing.go | 7 ++++--- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 508847ac3b..1906bdf5d9 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -21,14 +21,14 @@ type resolver interface { } // resolve is a helper for implementing Resolver.ResolveN using resolveOnce. -func resolve(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) (path.Path, error) { +func resolve(ctx context.Context, r resolver, name string, options opts.ResolveOpts) (path.Path, error) { ctx, cancel := context.WithCancel(ctx) defer cancel() err := ErrResolveFailed var p path.Path - resCh := resolveAsync(ctx, r, name, options, prefix) + resCh := resolveAsync(ctx, r, name, options) for res := range resCh { p, err = res.Path, res.Err @@ -40,7 +40,7 @@ func resolve(ctx context.Context, r resolver, name string, options opts.ResolveO return p, err } -func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts, prefix string) <-chan Result { +func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts) <-chan Result { resCh := r.resolveOnceAsync(ctx, name, options) depth := options.Depth outCh := make(chan Result, 1) @@ -86,8 +86,8 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res subCtx, cancelSub = context.WithCancel(ctx) defer cancelSub() - p := strings.TrimPrefix(res.value.String(), prefix) - subCh = resolveAsync(subCtx, r, p, subopts, prefix) + p := strings.TrimPrefix(res.value.String(), ipnsPrefix) + subCh = resolveAsync(subCtx, r, p, subopts) case res, ok := <-subCh: if !ok { subCh = nil diff --git a/namesys/dns.go b/namesys/dns.go index f4d37e654f..d3f9e09561 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -28,12 +28,12 @@ func NewDNSResolver() *DNSResolver { // Resolve implements Resolver. func (r *DNSResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { - return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") + return resolve(ctx, r, name, opts.ProcessOpts(options)) } // ResolveAsync implements Resolver. func (r *DNSResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { - return resolveAsync(ctx, r, name, opts.ProcessOpts(options), "/ipns/") + return resolveAsync(ctx, r, name, opts.ProcessOpts(options)) } type lookupRes struct { diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index e12841421a..5bcef4e147 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,9 +5,10 @@ import ( "testing" "time" - opts "github.com/ipfs/go-ipfs/namesys/opts" path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + opts "github.com/ipfs/go-ipfs/namesys/opts" + testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" @@ -57,7 +58,7 @@ func TestResolverValidation(t *testing.T) { } // Resolve entry - resp, err := resolve(ctx, resolver, id.Pretty(), opts.DefaultResolveOpts(), "/ipns/") + resp, err := resolve(ctx, resolver, id.Pretty(), opts.DefaultResolveOpts()) if err != nil { t.Fatal(err) } @@ -77,7 +78,7 @@ func TestResolverValidation(t *testing.T) { } // Record should fail validation because entry is expired - _, err = resolve(ctx, resolver, id.Pretty(), opts.DefaultResolveOpts(), "/ipns/") + _, err = resolve(ctx, resolver, id.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have returned error") } @@ -99,7 +100,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key defined by // ipns path doesn't match record signature - _, err = resolve(ctx, resolver, id2.Pretty(), opts.DefaultResolveOpts(), "/ipns/") + _, err = resolve(ctx, resolver, id2.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have failed signature verification") } @@ -117,7 +118,7 @@ func TestResolverValidation(t *testing.T) { // Record should fail validation because public key is not available // in peer store or on network - _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts(), "/ipns/") + _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts()) if err == nil { t.Fatal("ValidateIpnsRecord should have failed because public key was not found") } @@ -132,7 +133,7 @@ func TestResolverValidation(t *testing.T) { // public key is available in the peer store by looking it up in // the DHT, which causes the DHT to fetch it and cache it in the // peer store - _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts(), "/ipns/") + _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts()) if err != nil { t.Fatal(err) } diff --git a/namesys/namesys.go b/namesys/namesys.go index 83cd7dbccf..50d302079b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -62,7 +62,7 @@ func (ns *mpns) Resolve(ctx context.Context, name string, options ...opts.Resolv return path.ParsePath("/ipfs/" + name) } - return resolve(ctx, ns, name, opts.ProcessOpts(options), "/ipns/") + return resolve(ctx, ns, name, opts.ProcessOpts(options)) } func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { @@ -79,7 +79,7 @@ func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.R return res } - return resolveAsync(ctx, ns, name, opts.ProcessOpts(options), "/ipns/") + return resolveAsync(ctx, ns, name, opts.ProcessOpts(options)) } // resolveOnce implements resolver. diff --git a/namesys/proquint.go b/namesys/proquint.go index 0caaf9497c..8945793137 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,16 +4,17 @@ import ( "context" "errors" - opts "github.com/ipfs/go-ipfs/namesys/opts" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + + opts "github.com/ipfs/go-ipfs/namesys/opts" ) type ProquintResolver struct{} // Resolve implements Resolver. func (r *ProquintResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { - return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") + return resolve(ctx, r, name, opts.ProcessOpts(options)) } // resolveOnce implements resolver. Decodes the proquint string. diff --git a/namesys/routing.go b/namesys/routing.go index ef7e376e62..25daafff4e 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,9 +5,10 @@ import ( "strings" "time" - opts "github.com/ipfs/go-ipfs/namesys/opts" path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + opts "github.com/ipfs/go-ipfs/namesys/opts" + cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" @@ -39,12 +40,12 @@ func NewIpnsResolver(route routing.ValueStore) *IpnsResolver { // Resolve implements Resolver. func (r *IpnsResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { - return resolve(ctx, r, name, opts.ProcessOpts(options), "/ipns/") + return resolve(ctx, r, name, opts.ProcessOpts(options)) } // ResolveAsync implements Resolver. func (r *IpnsResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { - return resolveAsync(ctx, r, name, opts.ProcessOpts(options), "/ipns/") + return resolveAsync(ctx, r, name, opts.ProcessOpts(options)) } // resolveOnce implements resolver. Uses the IPFS routing system to From 183798effb213f1913b8c3702a89b5a026077e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 16:35:31 +0200 Subject: [PATCH 2392/3147] namesys: drop prefix args MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@1308d71ad0a2b782fd9b7f481ffe7789b30b8a29 --- coreiface/name.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/name.go b/coreiface/name.go index 782f683515..a02bc07874 100644 --- a/coreiface/name.go +++ b/coreiface/name.go @@ -40,7 +40,7 @@ type NameAPI interface { // Search is a version of Resolve which outputs paths as they are discovered, // reducing the time to first entry // - // Note that by default only the last path returned before the channel closes - // can be considered 'safe'. + // Note: by default, all paths read from the channel are considered unsafe, + // except the latest (last path in channel read buffer). Search(ctx context.Context, name string, opts ...options.NameResolveOption) (<-chan IpnsResult, error) } From 6fa3260a83b1442bfaa93b9296b6391666e9000c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 16:37:15 +0200 Subject: [PATCH 2393/3147] namesys: allow non /ipfs paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@4d118239ef2517bc657188ae0d5737c5ea9dafe9 --- namesys/base.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/base.go b/namesys/base.go index 1906bdf5d9..a523a10bf0 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -63,7 +63,7 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res return } log.Debugf("resolved %s to %s", name, res.value.String()) - if strings.HasPrefix(res.value.String(), "/ipfs/") { + if !strings.HasPrefix(res.value.String(), ipnsPrefix) { outCh <- Result{Path: res.value} break } From 54896c36516a84d4c406afec9cc8e8d5b6e8b35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 16:53:45 +0200 Subject: [PATCH 2394/3147] namesys: avoid defer in loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@6474166878cadc9da48210e53b50f157dc14e451 --- namesys/base.go | 15 +++++++++++++-- namesys/namesys.go | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index a523a10bf0..064286ab45 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -60,6 +60,9 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res if res.err != nil { outCh <- Result{Err: res.err} + if cancelSub != nil { + cancelSub() + } return } log.Debugf("resolved %s to %s", name, res.value.String()) @@ -79,12 +82,11 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res } var subCtx context.Context - if subCh != nil { + if cancelSub != nil { // Cancel previous recursive resolve since it won't be used anyways cancelSub() } subCtx, cancelSub = context.WithCancel(ctx) - defer cancelSub() p := strings.TrimPrefix(res.value.String(), ipnsPrefix) subCh = resolveAsync(subCtx, r, p, subopts) @@ -97,12 +99,21 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res select { case outCh <- res: case <-ctx.Done(): + if cancelSub != nil { + cancelSub() + } return } case <-ctx.Done(): + if cancelSub != nil { + cancelSub() + } return } if resCh == nil && subCh == nil { + if cancelSub != nil { + cancelSub() + } return } } diff --git a/namesys/namesys.go b/namesys/namesys.go index 50d302079b..674146e575 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -86,8 +86,8 @@ func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.R func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { out := make(chan onceResult, 1) - if !strings.HasPrefix(name, "/ipns/") { - name = "/ipns/" + name + if !strings.HasPrefix(name, ipnsPrefix) { + name = ipnsPrefix + name } segments := strings.SplitN(name, "/", 4) if len(segments) < 3 || segments[0] != "" { From 91e92b9527e630055bba19195a72b722fe14ff19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 16 Oct 2018 17:45:13 +0200 Subject: [PATCH 2395/3147] namesys: select on output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@b3d0160412ab6f3460d3822d8919afbc36f7f85d --- namesys/base.go | 37 +++++++++++++++++-------------------- namesys/dns.go | 10 ++-------- namesys/namesys.go | 19 +++++++++---------- namesys/routing.go | 20 ++++---------------- 4 files changed, 32 insertions(+), 54 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 064286ab45..28bc87dad7 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -49,6 +49,11 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res defer close(outCh) var subCh <-chan Result var cancelSub context.CancelFunc + defer func() { + if cancelSub != nil { + cancelSub() + } + }() for { select { @@ -59,20 +64,17 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res } if res.err != nil { - outCh <- Result{Err: res.err} - if cancelSub != nil { - cancelSub() - } + emitResult(ctx, outCh, Result{Err: res.err}) return } log.Debugf("resolved %s to %s", name, res.value.String()) if !strings.HasPrefix(res.value.String(), ipnsPrefix) { - outCh <- Result{Path: res.value} + emitResult(ctx, outCh, Result{Path: res.value}) break } if depth == 1 { - outCh <- Result{Path: res.value, Err: ErrResolveRecursion} + emitResult(ctx, outCh, Result{Path: res.value, Err: ErrResolveRecursion}) break } @@ -87,6 +89,7 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res cancelSub() } subCtx, cancelSub = context.WithCancel(ctx) + _ = cancelSub p := strings.TrimPrefix(res.value.String(), ipnsPrefix) subCh = resolveAsync(subCtx, r, p, subopts) @@ -96,27 +99,21 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res break } - select { - case outCh <- res: - case <-ctx.Done(): - if cancelSub != nil { - cancelSub() - } - return - } + emitResult(ctx, outCh, res) case <-ctx.Done(): - if cancelSub != nil { - cancelSub() - } return } if resCh == nil && subCh == nil { - if cancelSub != nil { - cancelSub() - } return } } }() return outCh } + +func emitResult(ctx context.Context, outCh chan<- Result, r Result) { + select { + case outCh <- r: + case <-ctx.Done(): + } +} diff --git a/namesys/dns.go b/namesys/dns.go index d3f9e09561..bd62b7d220 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -80,10 +80,7 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options } if subRes.error == nil { p, err := appendPath(subRes.path) - select { - case out <- onceResult{value: p, err: err}: - case <-ctx.Done(): - } + emitOnceResult(ctx, out, onceResult{value: p, err: err}) return } case rootRes, ok := <-rootChan: @@ -93,10 +90,7 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options } if rootRes.error == nil { p, err := appendPath(rootRes.path) - select { - case out <- onceResult{value: p, err: err}: - case <-ctx.Done(): - } + emitOnceResult(ctx, out, onceResult{value: p, err: err}) } case <-ctx.Done(): return diff --git a/namesys/namesys.go b/namesys/namesys.go index 674146e575..aa37a93fe9 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -141,19 +141,11 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. if len(segments) > 3 { p, err := path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) if err != nil { - select { - case out <- onceResult{value: p, err: err}: - case <-ctx.Done(): - } - return + emitOnceResult(ctx, out, onceResult{value: p, ttl: res.ttl, err: err}) } } - select { - case out <- onceResult{value: p, ttl: res.ttl, err: res.err}: - case <-ctx.Done(): - return - } + emitOnceResult(ctx, out, onceResult{value: p, ttl: res.ttl, err: res.err}) case <-ctx.Done(): return } @@ -163,6 +155,13 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. return out } +func emitOnceResult(ctx context.Context, outCh chan<- onceResult, r onceResult) { + select { + case outCh <- r: + case <-ctx.Done(): + } +} + // Publish implements Publisher func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { return ns.PublishWithEOL(ctx, name, value, time.Now().Add(DefaultRecordTTL)) diff --git a/namesys/routing.go b/namesys/routing.go index 25daafff4e..76aa860347 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -112,10 +112,7 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option err = proto.Unmarshal(val, entry) if err != nil { log.Debugf("RoutingResolver: could not unmarshal value for name %s: %s", name, err) - select { - case out <- onceResult{err: err}: - case <-ctx.Done(): - } + emitOnceResult(ctx, out, onceResult{err: err}) return } @@ -129,10 +126,7 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option // Not a multihash, probably a new style record p, err = path.ParsePath(string(entry.GetValue())) if err != nil { - select { - case out <- onceResult{err: err}: - case <-ctx.Done(): - } + emitOnceResult(ctx, out, onceResult{err: err}) return } } @@ -154,17 +148,11 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option } default: log.Errorf("encountered error when parsing EOL: %s", err) - select { - case out <- onceResult{err: err}: - case <-ctx.Done(): - } + emitOnceResult(ctx, out, onceResult{err: err}) return } - select { - case out <- onceResult{value: p, ttl: ttl}: - case <-ctx.Done(): - } + emitOnceResult(ctx, out, onceResult{value: p, ttl: ttl}) case <-ctx.Done(): return } From bdbaca61fa7bbc195fa51cb919ef030b1a9f82a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 18 Oct 2018 10:16:31 +0200 Subject: [PATCH 2396/3147] gx: update to use extracted go-ipfs-files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@13aa36cfc0d055f8be28f8fd4230982da760cab8 --- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 30e13c72dd..8be28a7d35 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,7 +7,7 @@ import ( "time" opts "github.com/ipfs/go-ipfs/namesys/opts" - "gx/ipfs/QmRX6WZhMinQrQhyuwaqNHYQtNPhtBwzxKFySzNMaJmW9v/go-unixfs" + "gx/ipfs/QmWE6Ftsk98cG2MTVgH4wJT8VP2nL9TuBkYTrz9GSqcsh5/go-unixfs" path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/publisher.go b/namesys/publisher.go index 684caa6557..cff6e0e3d9 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,7 +7,7 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmRX6WZhMinQrQhyuwaqNHYQtNPhtBwzxKFySzNMaJmW9v/go-unixfs" + ft "gx/ipfs/QmWE6Ftsk98cG2MTVgH4wJT8VP2nL9TuBkYTrz9GSqcsh5/go-unixfs" path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" From 7af2ed03ee8171a3a4bf3d943fc50953f5390acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 18 Oct 2018 10:16:31 +0200 Subject: [PATCH 2397/3147] gx: update to use extracted go-ipfs-files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a945dc346666180846b543c15cf1a7cb3d25d7bd --- coreiface/unixfs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index c622e210e5..078d648bca 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - files "gx/ipfs/QmSP88ryZkHSRn1fnngAaV2Vcn63WUJzAavnRM9CVdU1Ky/go-ipfs-cmdkit/files" + files "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) From e0ff2439719bcd359efca38f44b86fedb1929813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 18 Oct 2018 15:02:05 +0200 Subject: [PATCH 2398/3147] namesys: doc on emitResult MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@81709d0a2f5afacc37a2d8c7e98b8cb5f2105fa6 --- namesys/base.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/namesys/base.go b/namesys/base.go index 28bc87dad7..f90e8add16 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -99,6 +99,8 @@ func resolveAsync(ctx context.Context, r resolver, name string, options opts.Res break } + // We don't bother returning here in case of context timeout as there is + // no good reason to do that, and we may still be able to emit a result emitResult(ctx, outCh, res) case <-ctx.Done(): return From e10f78b7c555bad18926d523049dce92bc3bf778 Mon Sep 17 00:00:00 2001 From: Overbool Date: Fri, 19 Oct 2018 13:29:29 +0800 Subject: [PATCH 2399/3147] feat(fsnode): add type helper This commit was moved from ipfs/go-mfs@c9235a35b096b9862f98eacccdd60b4fc3459dca --- mfs/mfs_test.go | 37 +++++++++++++++++++++++++++++++++++++ mfs/system.go | 10 ++++++++++ 2 files changed, 47 insertions(+) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index e840f6c066..dc417b9d7b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -1182,3 +1182,40 @@ func TestTruncateAndWrite(t *testing.T) { } } } + +func TestIsDir(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + dir := rt.GetDirectory() + + nd := dag.NodeWithData(ft.FolderPBData()) + di, err := NewDirectory(ctx, "test", nd, dir, ds) + if err != nil { + t.Fatal(err) + } + ret := IsDir(di) + if !ret { + t.Fatal("FSNode type should be dir, but not") + } +} + +func TestIsFile(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + dir := rt.GetDirectory() + + nd := dag.NodeWithData(ft.FilePBData(nil, 0)) + fi, err := NewFile("test", nd, dir, ds) + if err != nil { + t.Fatal(err) + } + + ret := IsFile(fi) + if !ret { + t.Fatal("FSNode type should be file, but not") + } +} diff --git a/mfs/system.go b/mfs/system.go index cc7e65d3aa..704e5b57f7 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -48,6 +48,16 @@ type FSNode interface { Type() NodeType } +// IsDir checks whether the FSNode is dir type +func IsDir(fsn FSNode) bool { + return fsn.Type() == TDir +} + +// IsFile checks whether the FSNode is file type +func IsFile(fsn FSNode) bool { + return fsn.Type() == TFile +} + // Root represents the root of a filesystem tree. type Root struct { From 17e26a71e253fd9e5b78b53ec2e25397aca17a1b Mon Sep 17 00:00:00 2001 From: Overbool Date: Sat, 20 Oct 2018 09:52:09 +0800 Subject: [PATCH 2400/3147] test(fsnode): modify test This commit was moved from ipfs/go-mfs@8c63df0e0438669ed1d70a10216f813d289ff605 --- mfs/mfs_test.go | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index dc417b9d7b..fd9990bdd0 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -1183,15 +1183,14 @@ func TestTruncateAndWrite(t *testing.T) { } } -func TestIsDir(t *testing.T) { +func TestFSNodeType(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ds, rt := setupRoot(ctx, t) - dir := rt.GetDirectory() - + // check for IsDir nd := dag.NodeWithData(ft.FolderPBData()) - di, err := NewDirectory(ctx, "test", nd, dir, ds) + di, err := NewDirectory(ctx, "test", nd, rt.GetDirectory(), ds) if err != nil { t.Fatal(err) } @@ -1199,22 +1198,14 @@ func TestIsDir(t *testing.T) { if !ret { t.Fatal("FSNode type should be dir, but not") } -} - -func TestIsFile(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - ds, rt := setupRoot(ctx, t) - - dir := rt.GetDirectory() - nd := dag.NodeWithData(ft.FilePBData(nil, 0)) - fi, err := NewFile("test", nd, dir, ds) + // check for IsFile + fnd := dag.NodeWithData(ft.FilePBData(nil, 0)) + fi, err := NewFile("test", fnd, rt.GetDirectory(), ds) if err != nil { t.Fatal(err) } - - ret := IsFile(fi) + ret = IsFile(fi) if !ret { t.Fatal("FSNode type should be file, but not") } From 83af9fbde0491d60155e511ad14d2e20068fd753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 9 Oct 2018 18:57:25 +0200 Subject: [PATCH 2401/3147] coreapi unixfs: remove Cat, use sessions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@26985dbeb71dc2999d2640c301cc88b2e1e56b72 --- coreiface/unixfs.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 078d648bca..4a6c956a0e 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -31,10 +31,6 @@ type UnixfsAPI interface { // to operations performed on the returned file Get(context.Context, Path) (files.File, error) - // Cat returns a reader for the file - // TODO: Remove in favour of Get (if we use Get on a file we still have reader directly, so..) - Cat(context.Context, Path) (Reader, error) - // Ls returns the list of links in a directory Ls(context.Context, Path) ([]*ipld.Link, error) } From 8d4196176a99ab51bfd521afbd061bfcf456354f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 15 Oct 2018 12:45:49 +0200 Subject: [PATCH 2402/3147] coreapi unixfs: Return seeker from get MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@7fad9653969f1e71a85778e3e4e225c97d71558b --- coreiface/unixfs.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 4a6c956a0e..dd7e5a3926 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -2,6 +2,7 @@ package iface import ( "context" + "io" options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" @@ -17,6 +18,11 @@ type AddEvent struct { Size string `json:",omitempty"` } +type UnixfsFile interface { + files.SizeFile + io.Seeker +} + // UnixfsAPI is the basic interface to immutable files in IPFS // NOTE: This API is heavily WIP, things are guaranteed to break frequently type UnixfsAPI interface { @@ -29,7 +35,7 @@ type UnixfsAPI interface { // // Note that some implementations of this API may apply the specified context // to operations performed on the returned file - Get(context.Context, Path) (files.File, error) + Get(context.Context, Path) (UnixfsFile, error) // Ls returns the list of links in a directory Ls(context.Context, Path) ([]*ipld.Link, error) From 43a63d6df5aa862019072b8ddbdd957b933a4d89 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 09:59:18 -0700 Subject: [PATCH 2403/3147] gx update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@fffcec9dbcd3479773eb8e3606727c9d1fa12396 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 22 +++++++++++----------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 12 ++++++------ namesys/proquint.go | 2 +- namesys/publisher.go | 12 ++++++------ namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 12 ++++++------ 14 files changed, 53 insertions(+), 53 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index f90e8add16..d6124410c0 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 8a96d90fd2..9f364ffd37 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index bd62b7d220..bef6bad0df 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -9,7 +9,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index a1b1308ca8..3c03c0f52d 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 5bcef4e147..59fda05466 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,24 +5,24 @@ import ( "testing" "time" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" - ropts "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing/options" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/mock" - offline "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/offline" - record "gx/ipfs/QmSb4B8ZAAj5ALe9LjfzPyF8Ma6ezC1NTnDF2JQPUJxEXb/go-libp2p-record" - pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore/pstoremem" - ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" + testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" + record "gx/ipfs/Qma9Eqp16mNHDX1EL73pcxhFfzbyXVcAYtaDd1xdmDRDtL/go-libp2p-record" + ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" + ropts "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing/options" + mockrouting "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/mock" + offline "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index aa37a93fe9..ac9f0ea30a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,17 +5,17 @@ import ( "strings" "time" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index e088b29336..8d3e7a28eb 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,14 +8,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - offroute "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/offline" - "gx/ipfs/QmWE6Ftsk98cG2MTVgH4wJT8VP2nL9TuBkYTrz9GSqcsh5/go-unixfs" - pstoremem "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore/pstoremem" - ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" + "gx/ipfs/QmU7HFzvfEvimC6wJehti4rcEkvQhvtgo1koHhPN4TXav4/go-unixfs" + ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + offroute "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 8945793137..08b451a6ff 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -5,7 +5,7 @@ import ( "errors" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index cff6e0e3d9..40eb627f24 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmWE6Ftsk98cG2MTVgH4wJT8VP2nL9TuBkYTrz9GSqcsh5/go-unixfs" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + ft "gx/ipfs/QmU7HFzvfEvimC6wJehti4rcEkvQhvtgo1koHhPN4TXav4/go-unixfs" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" - routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" - pb "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns/pb" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" + pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dsquery "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index e298810046..4f59272066 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" - testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - mockrouting "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/mock" dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" - ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + ma "gx/ipfs/QmT4U94DnD8FRfqr21obWY32HLM5VExccPKMjQHofeYqr9/go-multiaddr" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" + ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + mockrouting "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/mock" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 2ea8d46330..66c96ac75e 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pb "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns/pb" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index a982b2df13..4d375567f3 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" - mocknet "gx/ipfs/QmPL3AKtiaQyYpchZceXBZhZ3MSnoGqJvLZrc7fzDTTQdJ/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" + pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" + mocknet "gx/ipfs/QmabWrc5aEQ36iWgJZonKgHpttvyDhHoWBoCtesuyMn9XF/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 3fd8f2c973..925e8f2f87 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" - testutil "gx/ipfs/QmNfQbgBfARAtrYsBguChX6VJ5nbjeoYy1KdC36aaYWqG8/go-testutil" - mockrouting "gx/ipfs/QmQ9PR61a8rwEFuFNs7JMA1QtQC9yZnBwoDn51JWXDbaTd/go-ipfs-routing/mock" - ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" + ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + mockrouting "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/mock" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 76aa860347..ca5701b3e6 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,18 +5,18 @@ import ( "strings" "time" - path "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - routing "gx/ipfs/QmPmFeQ5oY5G6M7aBWggi5phxEPXwsQntE1DFcUzETULdp/go-libp2p-routing" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dht "gx/ipfs/QmSteomMgXnSQxLEY5UpxmkYAd8QF9JuLLeLYBokTHxFru/go-libp2p-kad-dht" - ipns "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns" - pb "gx/ipfs/QmX72XT6sSQRkNHKcAFLM2VqB3B4bWPetgWnHY8LgsUVeT/go-ipns/pb" + dht "gx/ipfs/QmRMohiAZU9231TVUydLJfyiiEmXRJYpGVLDarhsLy4FU3/go-libp2p-kad-dht" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" + pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" + routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) From d897fb4b7e8aa1cdf7e3edeeaee1869bb2a1b3dd Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 09:59:18 -0700 Subject: [PATCH 2404/3147] gx update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@622611f19a4564d40673d7effedc2c805e89d8ef --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 7828fdb17c..ce05d3b654 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" + dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From 0efdaa0010b4058f2049e049148457d40d63467d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 09:59:18 -0700 Subject: [PATCH 2405/3147] gx update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@a9c40b603bd0d1e144493df5e6eb63012e1861e5 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index a7bd364db4..ae9c892d6c 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmSU7Nx5eUHWkc9zCTiXDu3ZkdXAZdRgRGRaKM86VjGU4m/go-blockservice" - dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" + bserv "gx/ipfs/QmTdoqcwpxSgzUSzX9ZGj6RFsZ28A5SLqsJRUgdFvGQbFC/go-blockservice" + dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 5736e5597f..1ca50402b1 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" + mdag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index ba83bdeb5b..3821ff6378 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmSU7Nx5eUHWkc9zCTiXDu3ZkdXAZdRgRGRaKM86VjGU4m/go-blockservice" - mdag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" + bs "gx/ipfs/QmTdoqcwpxSgzUSzX9ZGj6RFsZ28A5SLqsJRUgdFvGQbFC/go-blockservice" + mdag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index dbd57d15e0..6c082095b1 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" + "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index a99bc7ef54..ba50b975b1 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmSU7Nx5eUHWkc9zCTiXDu3ZkdXAZdRgRGRaKM86VjGU4m/go-blockservice" - dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" + bserv "gx/ipfs/QmTdoqcwpxSgzUSzX9ZGj6RFsZ28A5SLqsJRUgdFvGQbFC/go-blockservice" + dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" From 10afc1c6e7946a55faeacc943f1aa6802530796b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 09:59:18 -0700 Subject: [PATCH 2406/3147] gx update License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@c9eb6014a863a96f762fd87274a63ff906da0c65 --- coreiface/dht.go | 4 ++-- coreiface/key.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/pubsub.go | 2 +- coreiface/swarm.go | 8 ++++---- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index cb3362bb96..38a0f73488 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/key.go b/coreiface/key.go index cc6dc89004..9e7bfee281 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 307d618dea..8fe172fea0 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmVvNkTCx8V9Zei8xuTYTBdUXmbnDRS4iNuw1SztYyhQwQ/go-merkledag" + dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index d90f04aa12..53938c3de1 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmdrpbDgeYH3VxkCciQCJY5LkDYdXtig6unDzQmMxFtWEw/go-path" + ipfspath "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index d7a21e02f1..b3f3f6b762 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" + peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/coreiface/swarm.go b/coreiface/swarm.go index ba1a556981..d4b92c017d 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,11 +5,11 @@ import ( "errors" "time" - net "gx/ipfs/QmSTaEYUgDe1r581hxyd2u9582Hgp3KX4wGwYbRqz2u9Qh/go-libp2p-net" - pstore "gx/ipfs/QmWtCpWB39Rzc2xTB75MKorsxNpo3TyecTEN24CJ3KVohE/go-libp2p-peerstore" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + ma "gx/ipfs/QmT4U94DnD8FRfqr21obWY32HLM5VExccPKMjQHofeYqr9/go-multiaddr" + "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" + net "gx/ipfs/QmXuRkCR7BNQa9uqfpTiFWsTQLzmTWYg91Ja1w95gnqb6u/go-libp2p-net" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" - "gx/ipfs/QmbNepETomvmXfz1X5pHNFD2QuPqnqi47dTd94QJWSorQ3/go-libp2p-peer" ) var ( From 5dd448a0a4dbb4b327cdccd0272dfb63a3189c90 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 12:49:25 -0700 Subject: [PATCH 2407/3147] gx update go-libp2p License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@d4356645b79ee3bf9b968560f710d49f2f69270e --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 13 files changed, 17 insertions(+), 17 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index d6124410c0..654db8ba83 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 9f364ffd37..33e347b2f4 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index bef6bad0df..b1c7f6c8c5 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,8 +8,8 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/interface.go b/namesys/interface.go index 3c03c0f52d..f20be01027 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 59fda05466..a326949bd1 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys.go b/namesys/namesys.go index ac9f0ea30a..55ab9edbf9 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 8d3e7a28eb..760eeacc66 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,14 +8,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" - "gx/ipfs/QmU7HFzvfEvimC6wJehti4rcEkvQhvtgo1koHhPN4TXav4/go-unixfs" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" offroute "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" + "gx/ipfs/QmeA7Cd6kMzQNDFzfXXhe64jX1XufcL8B79hwguu5v6ib9/go-unixfs" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 08b451a6ff..9a5f0b31ea 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 40eb627f24..e48dce3d84 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmU7HFzvfEvimC6wJehti4rcEkvQhvtgo1koHhPN4TXav4/go-unixfs" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + ft "gx/ipfs/QmeA7Cd6kMzQNDFzfXXhe64jX1XufcL8B79hwguu5v6ib9/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 66c96ac75e..026e16e660 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 4d375567f3..f17877d7a7 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + mocknet "gx/ipfs/QmRqtXHu5gsCLpf2s1R2jQuKJBowYKkg6FGQiGCbzttSd1/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" - mocknet "gx/ipfs/QmabWrc5aEQ36iWgJZonKgHpttvyDhHoWBoCtesuyMn9XF/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 925e8f2f87..97e7f71d5a 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index ca5701b3e6..416c0b2861 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,14 +5,14 @@ import ( "strings" "time" - path "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dht "gx/ipfs/QmRMohiAZU9231TVUydLJfyiiEmXRJYpGVLDarhsLy4FU3/go-libp2p-kad-dht" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + dht "gx/ipfs/QmVMa2b3qsZCWFSfpU7Q7ci57q3o8rQzfWdS8c1yqqL4US/go-libp2p-kad-dht" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" From 958723131ca74c84f0c579b39fcdfb5c909d1afa Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 12:49:25 -0700 Subject: [PATCH 2408/3147] gx update go-libp2p License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@6f0e229891a43bd4c6e596fd72bcd609be74e69b --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index ce05d3b654..de1d82d5a2 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" + dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From 33041a8b67bf58006b86654fa105a52b735400e9 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 12:49:25 -0700 Subject: [PATCH 2409/3147] gx update go-libp2p License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@b7d9a81432d7a9ec65c1e01338e3f8ec6316358c --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ae9c892d6c..a188a23f7f 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmTdoqcwpxSgzUSzX9ZGj6RFsZ28A5SLqsJRUgdFvGQbFC/go-blockservice" - dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" + bserv "gx/ipfs/QmbZbNRg1x28X9ayEG1ZgEuSXcryGPcdEtWN5k6sNz4aqz/go-blockservice" + dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 1ca50402b1..95764ce96c 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" + mdag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 3821ff6378..097428fd25 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmTdoqcwpxSgzUSzX9ZGj6RFsZ28A5SLqsJRUgdFvGQbFC/go-blockservice" - mdag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" + bs "gx/ipfs/QmbZbNRg1x28X9ayEG1ZgEuSXcryGPcdEtWN5k6sNz4aqz/go-blockservice" + mdag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 6c082095b1..da91cbbac0 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" + "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index ba50b975b1..990c747091 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmTdoqcwpxSgzUSzX9ZGj6RFsZ28A5SLqsJRUgdFvGQbFC/go-blockservice" - dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" + bserv "gx/ipfs/QmbZbNRg1x28X9ayEG1ZgEuSXcryGPcdEtWN5k6sNz4aqz/go-blockservice" + dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" From 8cdb97d783313ce8276610860ec005d66e395cb5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 12:49:25 -0700 Subject: [PATCH 2410/3147] gx update go-libp2p License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@da1f68d4e43463145f44894cbb8cf5d5a992f8d3 --- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 8fe172fea0..4d179f9ffc 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmY5xpETYHq3PPvaJnafyLWKqk5y7cZnUeBqLRtLUpEV3s/go-merkledag" + dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index 53938c3de1..44d53f23c4 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmayGyPXjTt3cGzjCR3wb5HsHQX7LaJcWUbZemGDn6rKWq/go-path" + ipfspath "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From 0105ad9624082ca3a8b9e162976d2e53ebf7d593 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 15:01:31 -0700 Subject: [PATCH 2411/3147] gx: update yamux (fixes a panic due to a race) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@39b130f100cc230fe00509ee44161ed2eb0ce872 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 4 ++-- 13 files changed, 17 insertions(+), 17 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 654db8ba83..5bae575617 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 33e347b2f4..349a44e6e7 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index b1c7f6c8c5..3c9a58bc4b 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index f20be01027..281c36d628 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index a326949bd1..e885b2f133 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys.go b/namesys/namesys.go index 55ab9edbf9..8d486cdfb1 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 760eeacc66..39100c4f25 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,14 +8,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + "gx/ipfs/QmTJUySFxXjh54zEoFbzQEmGD3yj89XKS3A28y7Nqsn1TC/go-unixfs" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" offroute "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" - "gx/ipfs/QmeA7Cd6kMzQNDFzfXXhe64jX1XufcL8B79hwguu5v6ib9/go-unixfs" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 9a5f0b31ea..4ec9cb1ea3 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/publisher.go b/namesys/publisher.go index e48dce3d84..899617d0ce 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" - ft "gx/ipfs/QmeA7Cd6kMzQNDFzfXXhe64jX1XufcL8B79hwguu5v6ib9/go-unixfs" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + ft "gx/ipfs/QmTJUySFxXjh54zEoFbzQEmGD3yj89XKS3A28y7Nqsn1TC/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 026e16e660..b6fe6334b7 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index f17877d7a7..8ac797a2f8 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" - mocknet "gx/ipfs/QmRqtXHu5gsCLpf2s1R2jQuKJBowYKkg6FGQiGCbzttSd1/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" + mocknet "gx/ipfs/QmUDTcnDp2WssbmiDLC6aYurUeyt7QeRakHUQMxA2mZ5iB/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 97e7f71d5a..07d1053eff 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index 416c0b2861..e3873ef3cf 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,14 +5,14 @@ import ( "strings" "time" - path "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + dht "gx/ipfs/QmQHnqaNULV8WeUGgh97o9K3KAW6kWQmDyNf9UuikgnPTe/go-libp2p-kad-dht" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - dht "gx/ipfs/QmVMa2b3qsZCWFSfpU7Q7ci57q3o8rQzfWdS8c1yqqL4US/go-libp2p-kad-dht" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" From 1c174821c82b543817a8463db7feee5e1deef238 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 15:01:31 -0700 Subject: [PATCH 2412/3147] gx: update yamux (fixes a panic due to a race) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@e1d4b14b61c357963b58ac8af62df05d309c2b52 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index de1d82d5a2..9c3bf48aa3 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" + dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" From cbed8c00664814a0b201aef13c27c35aa4c3b107 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 15:01:31 -0700 Subject: [PATCH 2413/3147] gx: update yamux (fixes a panic due to a race) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@65b1e941472a3e52dad23ab16f7a5ff0a5b9b95b --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index a188a23f7f..dab01e7d17 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmbZbNRg1x28X9ayEG1ZgEuSXcryGPcdEtWN5k6sNz4aqz/go-blockservice" - dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" + bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" + dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 95764ce96c..20d0ff957f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" + mdag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 097428fd25..9369677681 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmbZbNRg1x28X9ayEG1ZgEuSXcryGPcdEtWN5k6sNz4aqz/go-blockservice" - mdag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" + bs "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" + mdag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index da91cbbac0..bab412f1d3 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" + "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 990c747091..3d59b4c0a9 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmbZbNRg1x28X9ayEG1ZgEuSXcryGPcdEtWN5k6sNz4aqz/go-blockservice" - dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" + bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" + dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" From 7e7e70c7ef59b3024e7030f93d9b24f7697a4b51 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 24 Oct 2018 15:01:31 -0700 Subject: [PATCH 2414/3147] gx: update yamux (fixes a panic due to a race) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@edab11e8dd939a1f41567c663c20e79a334c38f3 --- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 4d179f9ffc..f564d24275 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmcescwzzD86xrxoXNJ6VwSw46wLC91QzFDnozYRVf4KnX/go-merkledag" + dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index 44d53f23c4..eb976ebd8c 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmQ4sKWqHhSYekzST5RwT4VHdQB4df6JWLHNy7tuWTo8uY/go-path" + ipfspath "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From b74f92ef615dd95e75ed8c6fa983cea3565a3c41 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Oct 2018 11:44:28 +0200 Subject: [PATCH 2415/3147] Fix #27: Remove batching from importers A batching DAG service is forced onto the users of the importers, but they could just wrap the given DAGSerice in the batching one to get the same functionality (remembering to Close it at the end of the proccess). As detailed in #27, the importers should not be making choices about what DAGService is the right one to use and wrapping the given one. This change requires wrapping the DAGService in go-ipfs into ipld.Batch. and closing it when Finishing the adding process. This commit was moved from ipfs/go-unixfs@60781411d2fb5cb1e660deff21ac0915c38c0019 --- unixfs/importer/balanced/builder.go | 4 +-- unixfs/importer/helpers/dagbuilder.go | 38 +++++++-------------------- unixfs/importer/helpers/helpers.go | 4 +-- unixfs/importer/trickle/trickledag.go | 19 +------------- 4 files changed, 14 insertions(+), 51 deletions(-) diff --git a/unixfs/importer/balanced/builder.go b/unixfs/importer/balanced/builder.go index 55b9ccb365..c1a3e86404 100644 --- a/unixfs/importer/balanced/builder.go +++ b/unixfs/importer/balanced/builder.go @@ -130,7 +130,7 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { // This works without Filestore support (`ProcessFileStore`). // TODO: Why? Is there a test case missing? - return db.AddNodeAndClose(root) + return root, db.Add(root) } // The first `root` will be a single leaf node with data @@ -160,7 +160,7 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { } } - return db.AddNodeAndClose(root) + return root, db.Add(root) } // fillNodeRec will "fill" the given internal (non-leaf) `node` with data by diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 9c0dd437ce..24896cd1b3 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -6,6 +6,7 @@ import ( "os" dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" pb "github.com/ipfs/go-unixfs/pb" @@ -25,7 +26,6 @@ type DagBuilderHelper struct { rawLeaves bool nextData []byte // the next item to return. maxlinks int - batch *ipld.Batch cidBuilder cid.Builder // Filestore support variables. @@ -78,7 +78,6 @@ func (dbp *DagBuilderParams) New(spl chunker.Splitter) *DagBuilderHelper { rawLeaves: dbp.RawLeaves, cidBuilder: dbp.CidBuilder, maxlinks: dbp.Maxlinks, - batch: ipld.NewBatch(context.TODO(), dbp.Dagserv), } if fi, ok := spl.Reader().(files.FileInfo); dbp.NoCopy && ok { db.fullPath = fi.AbsPath() @@ -327,8 +326,8 @@ func (db *DagBuilderHelper) ProcessFileStore(node ipld.Node, dataSize uint64) ip return node } -// Add sends a node to the DAGService, and returns it. -func (db *DagBuilderHelper) Add(node *UnixfsNode) (ipld.Node, error) { +// AddUnixfsNode sends a node to the DAGService, and returns it as ipld.Node. +func (db *DagBuilderHelper) AddUnixfsNode(node *UnixfsNode) (ipld.Node, error) { dn, err := node.GetDagNode() if err != nil { return nil, err @@ -342,36 +341,17 @@ func (db *DagBuilderHelper) Add(node *UnixfsNode) (ipld.Node, error) { return dn, nil } +// Add inserts the given node in the DAGService. +func (db *DagBuilderHelper) Add(node ipld.Node) error { + return db.dserv.Add(context.TODO(), node) +} + // Maxlinks returns the configured maximum number for links // for nodes built with this helper. func (db *DagBuilderHelper) Maxlinks() int { return db.maxlinks } -// Close has the DAGService perform a batch Commit operation. -// It should be called at the end of the building process to make -// sure all data is persisted. -func (db *DagBuilderHelper) Close() error { - return db.batch.Commit() -} - -// AddNodeAndClose adds the last `ipld.Node` from the DAG and -// closes the builder. It returns the same `node` passed as -// argument. -func (db *DagBuilderHelper) AddNodeAndClose(node ipld.Node) (ipld.Node, error) { - err := db.batch.Add(node) - if err != nil { - return nil, err - } - - err = db.Close() - if err != nil { - return nil, err - } - - return node, nil -} - // FSNodeOverDag encapsulates an `unixfs.FSNode` that will be stored in a // `dag.ProtoNode`. Instead of just having a single `ipld.Node` that // would need to be constantly (un)packed to access and modify its @@ -421,7 +401,7 @@ func (n *FSNodeOverDag) AddChild(child ipld.Node, fileSize uint64, db *DagBuilde n.file.AddBlockSize(fileSize) - return db.batch.Add(child) + return db.Add(child) } // Commit unifies (resolves) the cache nodes into a single `ipld.Node` diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index a2e443ea34..ba6d518267 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -6,6 +6,7 @@ import ( "os" dag "github.com/ipfs/go-merkledag" + ft "github.com/ipfs/go-unixfs" cid "github.com/ipfs/go-cid" @@ -103,8 +104,7 @@ func (n *UnixfsNode) AddChild(child *UnixfsNode, db *DagBuilderHelper) error { return err } - err = db.batch.Add(childnode) - + _, err = db.AddUnixfsNode(child) return err } diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index bdc72e8bfe..70a953825c 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -42,16 +42,7 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { return nil, err } - out, err := db.Add(root) - if err != nil { - return nil, err - } - - if err := db.Close(); err != nil { - return nil, err - } - - return out, nil + return db.AddUnixfsNode(root) } // fillTrickleRec creates a trickle (sub-)tree with an optional maximum specified depth @@ -92,14 +83,6 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i return nil, dag.ErrNotProtobuf } - defer func() { - if errOut == nil { - if err := db.Close(); err != nil { - errOut = err - } - } - }() - // Convert to unixfs node for working with easily ufsn, err := h.NewUnixfsNodeFromDag(base) if err != nil { From c0c8c3333ebebcd5eb58219dd07a0b676bdf02ee Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 26 Oct 2018 16:07:05 +0200 Subject: [PATCH 2416/3147] Add travis and makefile This commit was moved from ipfs/go-unixfs@18a59cc4222193a669d9b42d3362089c60b630b9 --- unixfs/Makefile | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 unixfs/Makefile diff --git a/unixfs/Makefile b/unixfs/Makefile new file mode 100644 index 0000000000..20619413c9 --- /dev/null +++ b/unixfs/Makefile @@ -0,0 +1,11 @@ +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go + +deps: gx + gx --verbose install --global + gx-go rewrite + +publish: + gx-go rewrite --undo + From 3a41d40d2229201163ac22f565bc25eca4e69229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 26 Oct 2018 18:41:03 +0200 Subject: [PATCH 2417/3147] namesys: properly attach path in name.Resolve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@5f6c06c0734b37681c8f60be030277af8ff3c4cf --- namesys/namesys.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 8d486cdfb1..dddb0dff30 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -100,6 +100,14 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. key := segments[2] if p, ok := ns.cacheGet(key); ok { + if len(segments) > 3 { + var err error + p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + if err != nil { + emitOnceResult(ctx, out, onceResult{value: p, err: err}) + } + } + out <- onceResult{value: p} close(out) return out @@ -139,7 +147,8 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. // Attach rest of the path if len(segments) > 3 { - p, err := path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + var err error + p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) if err != nil { emitOnceResult(ctx, out, onceResult{value: p, ttl: res.ttl, err: err}) } From cf080549beaa04ea4d675d9ca8a7c0cafd2ac4d2 Mon Sep 17 00:00:00 2001 From: Kejie Zhang Date: Fri, 12 Oct 2018 14:29:11 +0800 Subject: [PATCH 2418/3147] correctly handle offsets bigger than file size This commit was moved from ipfs/go-unixfs@f573b7b58ee5861b30763f05b4f6f07913db480b --- unixfs/mod/dagmodifier.go | 12 ++++++++- unixfs/mod/dagmodifier_test.go | 49 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index be9b07ea73..a4c0980521 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -200,6 +200,16 @@ func (dm *DagModifier) Sync() error { // Number of bytes we're going to write buflen := dm.wrBuf.Len() + fs, err := fileSize(dm.curNode) + if err != nil { + return err + } + if fs < dm.writeStart { + if err := dm.expandSparse(int64(dm.writeStart - fs)); err != nil { + return err + } + } + // overwrite existing dag nodes thisc, err := dm.modifyDag(dm.curNode, dm.writeStart) if err != nil { @@ -225,8 +235,8 @@ func (dm *DagModifier) Sync() error { } dm.writeStart += uint64(buflen) - dm.wrBuf = nil + return nil } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index f9e302ee81..1e192e7205 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -7,12 +7,14 @@ import ( "io/ioutil" "testing" + dag "github.com/ipfs/go-merkledag" h "github.com/ipfs/go-unixfs/importer/helpers" trickle "github.com/ipfs/go-unixfs/importer/trickle" uio "github.com/ipfs/go-unixfs/io" testu "github.com/ipfs/go-unixfs/test" u "github.com/ipfs/go-ipfs-util" + "github.com/ipfs/go-unixfs" ) func testModWrite(t *testing.T, beg, size uint64, orig []byte, dm *DagModifier, opts testu.NodeOpts) []byte { @@ -410,6 +412,53 @@ func testDagTruncate(t *testing.T, opts testu.NodeOpts) { } } +func TestDagSync(t *testing.T) { + dserv := testu.GetDAGServ() + nd := dag.NodeWithData(unixfs.FilePBData(nil, 0)) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dagmod, err := NewDagModifier(ctx, nd, dserv, testu.SizeSplitterGen(512)) + if err != nil { + t.Fatal(err) + } + + _, err = dagmod.Write([]byte("test1")) + if err != nil { + t.Fatal(err) + } + + err = dagmod.Sync() + if err != nil { + t.Fatal(err) + } + + err = dagmod.Truncate(0) + if err != nil { + t.Fatal(err) + } + + _, err = dagmod.Write([]byte("test2")) + if err != nil { + t.Fatal(err) + } + + err = dagmod.Sync() + if err != nil { + t.Fatal(err) + } + + out, err := ioutil.ReadAll(dagmod) + if err != nil { + t.Fatal(err) + } + + if err = testu.ArrComp(out[5:], []byte("test2")); err != nil { + t.Fatal(err) + } +} + // TestDagTruncateSameSize tests that a DAG truncated // to the same size (i.e., doing nothing) doesn't modify // the DAG (its hash). From e813f09e43adccefa60420f55204b737370edced Mon Sep 17 00:00:00 2001 From: Kejie Zhang Date: Wed, 24 Oct 2018 21:34:44 +0800 Subject: [PATCH 2419/3147] document testDagSync function This commit was moved from ipfs/go-unixfs@e8af7a6b5b5588835fb856e35024d9163361c7ab --- unixfs/mod/dagmodifier_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 1e192e7205..b613693623 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -412,6 +412,8 @@ func testDagTruncate(t *testing.T, opts testu.NodeOpts) { } } +// TestDagSync tests that a DAG will expand sparse during sync +// if offset > curNode's size. func TestDagSync(t *testing.T) { dserv := testu.GetDAGServ() nd := dag.NodeWithData(unixfs.FilePBData(nil, 0)) @@ -434,6 +436,7 @@ func TestDagSync(t *testing.T) { t.Fatal(err) } + // Truncate leave the offset at 5 and filesize at 0 err = dagmod.Truncate(0) if err != nil { t.Fatal(err) @@ -444,6 +447,7 @@ func TestDagSync(t *testing.T) { t.Fatal(err) } + // When Offset > filesize , Sync will call enpandSparse err = dagmod.Sync() if err != nil { t.Fatal(err) From 95c39b6f72f1d32c0e68731b2a02e031ac941e02 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 27 Oct 2018 03:30:18 +0200 Subject: [PATCH 2420/3147] Bubble deps License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/interface-go-ipfs-core@c21b863fa15557b64d4bdcc99a7134b28ac3ca05 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/object.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/unixfs.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index bc889237b3..b744a207a5 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" + ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index 06bb91dce8..6cca5b9e68 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" + ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" ) // DagOps groups operations that can be batched together diff --git a/coreiface/object.go b/coreiface/object.go index 6b355a302a..229f69869e 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -7,7 +7,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" + ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index f564d24275..8a91378875 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" + dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index eb976ebd8c..5a3d1128b1 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + ipfspath "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index dd7e5a3926..6fd33ad2c5 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" files "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files" - ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) // TODO: ideas on making this more coreapi-ish without breaking the http API? From f0351b2a56fb13426ed8f0a2bc9b61373437f19a Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 27 Oct 2018 03:30:18 +0200 Subject: [PATCH 2421/3147] Bubble deps License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@0066fb584454d5654f9b3408f717ebbecdc075e4 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 5bae575617..4aa4fcfbd6 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 349a44e6e7..78ca295a84 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 3c9a58bc4b..7b1b9e35c4 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 281c36d628..093798faf5 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index e885b2f133..2bd3c42efb 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys.go b/namesys/namesys.go index dddb0dff30..0080533bad 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 39100c4f25..1e92547e31 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,14 +8,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" - "gx/ipfs/QmTJUySFxXjh54zEoFbzQEmGD3yj89XKS3A28y7Nqsn1TC/go-unixfs" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" offroute "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" + "gx/ipfs/QmfB3oNXGGq9S4B2a9YeCajoATms3Zw2VvDm8fK7VeLSV8/go-unixfs" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 4ec9cb1ea3..c906b1861f 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 899617d0ce..76d65a42b3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" - ft "gx/ipfs/QmTJUySFxXjh54zEoFbzQEmGD3yj89XKS3A28y7Nqsn1TC/go-unixfs" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + ft "gx/ipfs/QmfB3oNXGGq9S4B2a9YeCajoATms3Zw2VvDm8fK7VeLSV8/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index b6fe6334b7..e8a9c36317 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 8ac797a2f8..08ac7b7b15 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 07d1053eff..24e93112cf 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index e3873ef3cf..073a8341bd 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmRKuTyCzg7HFBcV1YUhzStroGtJSb8iWgyxfsDCwFhWTS/go-path" + path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" From 3fb782e2d07114c8b0b4c4b08294c6e6f214502a Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 27 Oct 2018 03:30:18 +0200 Subject: [PATCH 2422/3147] Bubble deps License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@837f8f56a066c7180417876069c3a0e21a09f202 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 1ad7471fbc..19f5fd2097 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,8 +11,8 @@ import ( "context" "errors" - posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + posinfo "gx/ipfs/QmQyUyYcpKG1u53V7N25qRTGw5XwaAxTMKXbduqHotQztg/go-ipfs-posinfo" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 9c3bf48aa3..f3813f6252 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,10 +7,10 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" + dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" - posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + posinfo "gx/ipfs/QmQyUyYcpKG1u53V7N25qRTGw5XwaAxTMKXbduqHotQztg/go-ipfs-posinfo" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 7ecfaae8c5..74b0131b81 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,8 +10,8 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - posinfo "gx/ipfs/QmPG32VXR5jmpo9q8R9FNdR4Ae97Ky9CiZE6SctJLUB79H/go-ipfs-posinfo" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + posinfo "gx/ipfs/QmQyUyYcpKG1u53V7N25qRTGw5XwaAxTMKXbduqHotQztg/go-ipfs-posinfo" blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" From ff999c03bea447a3646f9331bf2e06debe7037c9 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Sat, 27 Oct 2018 03:30:18 +0200 Subject: [PATCH 2423/3147] Bubble deps License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@7d1a930ce30b402d87339fd6efd598b08d5331c9 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index dab01e7d17..a1bfa02789 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" + dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" - dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" "gx/ipfs/QmVkMRSkXrpjqrroEXWuYBvDBnXCdMMY6gsKicBGVGUqKT/go-verifcid" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" dstore "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" bstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" - ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 20d0ff957f..88bd1aec6d 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" + mdag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 9369677681..d92d8a8370 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" + mdag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" bs "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" - mdag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index bab412f1d3..439f4384e0 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" + "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ipld "gx/ipfs/QmdDXJs4axxefSPgK6Y1QhpJWKuDPnGJiqgq4uncb4rFHL/go-ipld-format" + ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 3d59b4c0a9..919efe6d0d 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" + dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" - dag "gx/ipfs/QmY8BMUSpCwNiTmFhACmC9Bt1qT63cHP35AoQAus4x14qH/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" From b7d8e3af3df705851341fb1d270272d21f4d5ff3 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 17 Oct 2018 03:53:01 +0100 Subject: [PATCH 2424/3147] feat(Directory): Add EnumLinksAsync method - Add LinkResult type to unix-fs - is an ipld Link or an error - Add EnumLinksAsync method to Directory interface, returns channel of directory links or error - Add EnumLinksAsync method to Shard interface in HAMT, returns channel of directory links or error - EnumLinks method in Shard interface in HAMT uses EnumLinksAsync now - modify makeAsyncTrieGetLinks to use channel This commit was moved from ipfs/go-unixfs@0e51ad49eac10f04f32f9232738b94121ac72627 --- unixfs/hamt/hamt.go | 56 +++++++++++++---------- unixfs/hamt/hamt_test.go | 91 ++++++++++++++++++++++++++++--------- unixfs/io/directory.go | 27 +++++++++++ unixfs/io/directory_test.go | 29 ++++++++++++ unixfs/unixfs.go | 9 ++++ 5 files changed, 165 insertions(+), 47 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 0b474289b8..9de7fb3abb 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -24,14 +24,14 @@ import ( "context" "fmt" "os" - "sync" bitfield "github.com/Stebalien/go-bitfield" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" - format "github.com/ipfs/go-unixfs" "github.com/spaolacci/murmur3" + + format "github.com/ipfs/go-unixfs" ) const ( @@ -400,21 +400,18 @@ func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func // EnumLinks collects all links in the Shard. func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { var links []*ipld.Link - var setlk sync.Mutex - - getLinks := makeAsyncTrieGetLinks(ds.dserv, func(sv *Shard) error { - lnk := sv.val - lnk.Name = sv.key - setlk.Lock() - links = append(links, lnk) - setlk.Unlock() - return nil - }) - - cset := cid.NewSet() - err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), cset.Visit) - return links, err + linkResults, err := ds.EnumLinksAsync(ctx) + if err != nil { + return nil, err + } + for linkResult := range linkResults { + if linkResult.Err != nil { + return links, linkResult.Err + } + links = append(links, linkResult.Link) + } + return links, nil } // ForEachLink walks the Shard and calls the given function. @@ -427,18 +424,33 @@ func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) erro }) } +// EnumLinksAsync returns a channel which will receive Links in the directory +// as they are enumerated, where order is not gauranteed +func (ds *Shard) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, error) { + linkResults := make(chan format.LinkResult) + go func() { + defer close(linkResults) + getLinks := makeAsyncTrieGetLinks(ds.dserv, linkResults) + cset := cid.NewSet() + dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), cset.Visit) + }() + return linkResults, nil +} + // makeAsyncTrieGetLinks builds a getLinks function that can be used with EnumerateChildrenAsync // to iterate a HAMT shard. It takes an IPLD Dag Service to fetch nodes, and a call back that will get called // on all links to leaf nodes in a HAMT tree, so they can be collected for an EnumLinks operation -func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(shard *Shard) error) dag.GetLinks { +func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format.LinkResult) dag.GetLinks { return func(ctx context.Context, currentCid cid.Cid) ([]*ipld.Link, error) { node, err := dagService.Get(ctx, currentCid) if err != nil { + linkResults <- format.LinkResult{Link: nil, Err: err} return nil, err } directoryShard, err := NewHamtFromDag(dagService, node) if err != nil { + linkResults <- format.LinkResult{Link: nil, Err: err} return nil, err } @@ -449,19 +461,13 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, onShardValue func(shard * lnkLinkType, err := directoryShard.childLinkType(lnk) if err != nil { + linkResults <- format.LinkResult{Link: nil, Err: err} return nil, err } if lnkLinkType == shardLink { childShards = append(childShards, lnk) } else { - sv, err := directoryShard.makeShardValue(lnk) - if err != nil { - return nil, err - } - err = onShardValue(sv) - if err != nil { - return nil, err - } + linkResults <- format.LinkResult{Link: lnk, Err: nil} } } return childShards, nil diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index ffbb676ebe..0779760516 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -74,28 +74,7 @@ func assertLink(s *Shard, name string, found bool) error { } } -func assertSerializationWorks(ds ipld.DAGService, s *Shard) error { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - nd, err := s.Node() - if err != nil { - return err - } - - nds, err := NewHamtFromDag(ds, nd) - if err != nil { - return err - } - - linksA, err := s.EnumLinks(ctx) - if err != nil { - return err - } - - linksB, err := nds.EnumLinks(ctx) - if err != nil { - return err - } +func assertLinksEqual(linksA []*ipld.Link, linksB []*ipld.Link) error { if len(linksA) != len(linksB) { return fmt.Errorf("links arrays are different sizes") @@ -121,6 +100,32 @@ func assertSerializationWorks(ds ipld.DAGService, s *Shard) error { return nil } +func assertSerializationWorks(ds ipld.DAGService, s *Shard) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nd, err := s.Node() + if err != nil { + return err + } + + nds, err := NewHamtFromDag(ds, nd) + if err != nil { + return err + } + + linksA, err := s.EnumLinks(ctx) + if err != nil { + return err + } + + linksB, err := nds.EnumLinks(ctx) + if err != nil { + return err + } + + return assertLinksEqual(linksA, linksB) +} + func TestBasicSet(t *testing.T) { ds := mdtest.Mock() for _, w := range []int{128, 256, 512, 1024, 2048, 4096} { @@ -309,6 +314,48 @@ func TestSetAfterMarshal(t *testing.T) { } } +func TestEnumLinksAsync(t *testing.T) { + ds := mdtest.Mock() + _, s, err := makeDir(ds, 300) + if err != nil { + t.Fatal(err) + } + ctx := context.Background() + + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + nds, err := NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } + + linksA, err := nds.EnumLinks(ctx) + if err != nil { + t.Fatal(err) + } + + linkResults, err := nds.EnumLinksAsync(ctx) + if err != nil { + t.Fatal(err) + } + var linksB []*ipld.Link + + for linkResult := range linkResults { + if linkResult.Err != nil { + t.Fatal(linkResult.Err) + } + linksB = append(linksB, linkResult.Link) + } + + err = assertLinksEqual(linksA, linksB) + if err != nil { + t.Fatal(err) + } +} + func TestDuplicateAddShard(t *testing.T) { ds := mdtest.Mock() dir, _ := NewShard(ds, 256) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index aa1ec8de7b..26bd2b241d 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -6,6 +6,7 @@ import ( "os" mdag "github.com/ipfs/go-merkledag" + format "github.com/ipfs/go-unixfs" hamt "github.com/ipfs/go-unixfs/hamt" @@ -38,6 +39,10 @@ type Directory interface { // ForEachLink applies the given function to Links in the directory. ForEachLink(context.Context, func(*ipld.Link) error) error + // EnumLinksAsync returns a channel which will receive Links in the directory + // as they are enumerated, where order is not gauranteed + EnumLinksAsync(context.Context) (<-chan format.LinkResult, error) + // Links returns the all the links in the directory node. Links(context.Context) ([]*ipld.Link, error) @@ -141,6 +146,22 @@ func (d *BasicDirectory) AddChild(ctx context.Context, name string, node ipld.No return d.node.AddNodeLink(name, node) } +// EnumLinksAsync returns a channel which will receive Links in the directory +// as they are enumerated, where order is not gauranteed +func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, error) { + linkResults := make(chan format.LinkResult) + go func() { + defer close(linkResults) + for _, l := range d.node.Links() { + linkResults <- format.LinkResult{ + Link: l, + Err: nil, + } + } + }() + return linkResults, nil +} + // ForEachLink implements the `Directory` interface. func (d *BasicDirectory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { for _, l := range d.node.Links() { @@ -226,6 +247,12 @@ func (d *HAMTDirectory) ForEachLink(ctx context.Context, f func(*ipld.Link) erro return d.shard.ForEachLink(ctx, f) } +// EnumLinksAsync returns a channel which will receive Links in the directory +// as they are enumerated, where order is not gauranteed +func (d *HAMTDirectory) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, error) { + return d.shard.EnumLinksAsync(ctx) +} + // Links implements the `Directory` interface. func (d *HAMTDirectory) Links(ctx context.Context) ([]*ipld.Link, error) { return d.shard.EnumLinks(ctx) diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 64a1ef2c61..6f621e977f 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -5,7 +5,9 @@ import ( "fmt" "testing" + ipld "github.com/ipfs/go-ipld-format" mdtest "github.com/ipfs/go-merkledag/test" + ft "github.com/ipfs/go-unixfs" ) @@ -155,4 +157,31 @@ func TestDirBuilder(t *testing.T) { if len(links) != count { t.Fatal("wrong number of links", len(links), count) } + + linkResults, err := dir.EnumLinksAsync(ctx) + if err != nil { + t.Fatal(err) + } + + asyncNames := make(map[string]bool) + var asyncLinks []*ipld.Link + + for linkResult := range linkResults { + if linkResult.Err != nil { + t.Fatal(linkResult.Err) + } + asyncNames[linkResult.Link.Name] = true + asyncLinks = append(asyncLinks, linkResult.Link) + } + + for i := 0; i < count; i++ { + n := fmt.Sprintf("entry %d", i) + if !asyncNames[n] { + t.Fatal("COULDNT FIND: ", n) + } + } + + if len(asyncLinks) != count { + t.Fatal("wrong number of links", len(asyncLinks), count) + } } diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 7b41891538..4ee755186b 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -9,9 +9,18 @@ import ( proto "github.com/gogo/protobuf/proto" dag "github.com/ipfs/go-merkledag" + + ipld "github.com/ipfs/go-ipld-format" pb "github.com/ipfs/go-unixfs/pb" ) +// A LinkResult for any parallel enumeration of links +// TODO: Should this live in go-ipld-format? +type LinkResult struct { + Link *ipld.Link + Err error +} + // Shorthands for protobuffer types const ( TRaw = pb.Data_Raw From 6d2b748c71bbebcc0bf35c92cebfaf5406ee94e9 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 17 Oct 2018 21:30:12 +0100 Subject: [PATCH 2425/3147] Add context cancelling logic This commit was moved from ipfs/go-unixfs@87012196a81907dcba6408feab5cc6ca627ed263 --- unixfs/hamt/hamt.go | 17 +++++++++++++---- unixfs/io/directory.go | 6 +++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 9de7fb3abb..1908526a00 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -428,8 +428,10 @@ func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) erro // as they are enumerated, where order is not gauranteed func (ds *Shard) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, error) { linkResults := make(chan format.LinkResult) + ctx, cancel := context.WithCancel(ctx) go func() { defer close(linkResults) + defer cancel() getLinks := makeAsyncTrieGetLinks(ds.dserv, linkResults) cset := cid.NewSet() dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), cset.Visit) @@ -445,12 +447,12 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format return func(ctx context.Context, currentCid cid.Cid) ([]*ipld.Link, error) { node, err := dagService.Get(ctx, currentCid) if err != nil { - linkResults <- format.LinkResult{Link: nil, Err: err} + emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) return nil, err } directoryShard, err := NewHamtFromDag(dagService, node) if err != nil { - linkResults <- format.LinkResult{Link: nil, Err: err} + emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) return nil, err } @@ -461,19 +463,26 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format lnkLinkType, err := directoryShard.childLinkType(lnk) if err != nil { - linkResults <- format.LinkResult{Link: nil, Err: err} + emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) return nil, err } if lnkLinkType == shardLink { childShards = append(childShards, lnk) } else { - linkResults <- format.LinkResult{Link: lnk, Err: nil} + emitResult(ctx, linkResults, format.LinkResult{Link: lnk, Err: nil}) } } return childShards, nil } } +func emitResult(ctx context.Context, linkResults chan<- format.LinkResult, r format.LinkResult) { + select { + case linkResults <- r: + case <-ctx.Done(): + } +} + func (ds *Shard) walkTrie(ctx context.Context, cb func(*Shard) error) error { for idx := range ds.children { c, err := ds.getChild(ctx, idx) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 26bd2b241d..5a4f638b94 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -153,9 +153,13 @@ func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) (<-chan format.Link go func() { defer close(linkResults) for _, l := range d.node.Links() { - linkResults <- format.LinkResult{ + select { + case linkResults <- format.LinkResult{ Link: l, Err: nil, + }: + case <-ctx.Done(): + return } } }() From 9a6f776b1c7123cf43cd6bd941d99e7aeef26bf1 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 18 Oct 2018 10:46:01 +0100 Subject: [PATCH 2426/3147] Convert formatting in hamt links to remove bit prefix This commit was moved from ipfs/go-unixfs@fa995d36c0c5522a8a575b6792d8dd74e6a3eefd --- unixfs/hamt/hamt.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 1908526a00..33b706c009 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -469,7 +469,13 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format if lnkLinkType == shardLink { childShards = append(childShards, lnk) } else { - emitResult(ctx, linkResults, format.LinkResult{Link: lnk, Err: nil}) + sv, err := directoryShard.makeShardValue(lnk) + if err != nil { + return nil, err + } + formattedLink := sv.val + formattedLink.Name = sv.key + emitResult(ctx, linkResults, format.LinkResult{Link: formattedLink, Err: nil}) } } return childShards, nil From 6b813c9b37efea1271bc192d55afe18554f2469f Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 18 Oct 2018 15:32:36 +0100 Subject: [PATCH 2427/3147] Force processing of context cancellation first This commit was moved from ipfs/go-unixfs@a5528c4a3478e76fac3838fcb5253f27594ee3e9 --- unixfs/hamt/hamt.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 33b706c009..b1d4c34e62 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -483,6 +483,15 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format } func emitResult(ctx context.Context, linkResults chan<- format.LinkResult, r format.LinkResult) { + // make sure that context cancel is processed first + // the reason is due to the concurrency of EnumerateChildrenAsync + // it's possible for EnumLinksAsync to complete and close the linkResults + // channel before this code runs + select { + case <-ctx.Done(): + return + default: + } select { case linkResults <- r: case <-ctx.Done(): From 2cdbd7aa250d4b951c11037f2944d1444789fad3 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 18 Oct 2018 16:34:29 +0100 Subject: [PATCH 2428/3147] Emit errors once at end This commit was moved from ipfs/go-unixfs@269f6d222e845017bdd44b0254f0275b59a0cd35 --- unixfs/hamt/hamt.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index b1d4c34e62..a823fa3017 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -434,7 +434,10 @@ func (ds *Shard) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, defer cancel() getLinks := makeAsyncTrieGetLinks(ds.dserv, linkResults) cset := cid.NewSet() - dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), cset.Visit) + err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), cset.Visit) + if err != nil { + emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) + } }() return linkResults, nil } @@ -447,12 +450,10 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format return func(ctx context.Context, currentCid cid.Cid) ([]*ipld.Link, error) { node, err := dagService.Get(ctx, currentCid) if err != nil { - emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) return nil, err } directoryShard, err := NewHamtFromDag(dagService, node) if err != nil { - emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) return nil, err } @@ -463,7 +464,6 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format lnkLinkType, err := directoryShard.childLinkType(lnk) if err != nil { - emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) return nil, err } if lnkLinkType == shardLink { From 6b818489a139004c9878ef637d676056dbd4db92 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 29 Oct 2018 15:05:38 -0700 Subject: [PATCH 2429/3147] feat(EnumLinksAsync): Remove error since it's unused This commit was moved from ipfs/go-unixfs@c54d0e47ad42f03de7736c2826c315de9f63b5a6 --- unixfs/hamt/hamt.go | 13 +++++-------- unixfs/hamt/hamt_test.go | 6 ++---- unixfs/io/directory.go | 8 ++++---- unixfs/io/directory_test.go | 5 +---- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index a823fa3017..3714c30a21 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -29,9 +29,8 @@ import ( cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" - "github.com/spaolacci/murmur3" - format "github.com/ipfs/go-unixfs" + "github.com/spaolacci/murmur3" ) const ( @@ -401,10 +400,8 @@ func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func func (ds *Shard) EnumLinks(ctx context.Context) ([]*ipld.Link, error) { var links []*ipld.Link - linkResults, err := ds.EnumLinksAsync(ctx) - if err != nil { - return nil, err - } + linkResults := ds.EnumLinksAsync(ctx) + for linkResult := range linkResults { if linkResult.Err != nil { return links, linkResult.Err @@ -426,7 +423,7 @@ func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) erro // EnumLinksAsync returns a channel which will receive Links in the directory // as they are enumerated, where order is not gauranteed -func (ds *Shard) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, error) { +func (ds *Shard) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { linkResults := make(chan format.LinkResult) ctx, cancel := context.WithCancel(ctx) go func() { @@ -439,7 +436,7 @@ func (ds *Shard) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) } }() - return linkResults, nil + return linkResults } // makeAsyncTrieGetLinks builds a getLinks function that can be used with EnumerateChildrenAsync diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 0779760516..1483fcd9fd 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -337,10 +337,8 @@ func TestEnumLinksAsync(t *testing.T) { t.Fatal(err) } - linkResults, err := nds.EnumLinksAsync(ctx) - if err != nil { - t.Fatal(err) - } + linkResults := nds.EnumLinksAsync(ctx) + var linksB []*ipld.Link for linkResult := range linkResults { diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 5a4f638b94..2e02276237 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -41,7 +41,7 @@ type Directory interface { // EnumLinksAsync returns a channel which will receive Links in the directory // as they are enumerated, where order is not gauranteed - EnumLinksAsync(context.Context) (<-chan format.LinkResult, error) + EnumLinksAsync(context.Context) <-chan format.LinkResult // Links returns the all the links in the directory node. Links(context.Context) ([]*ipld.Link, error) @@ -148,7 +148,7 @@ func (d *BasicDirectory) AddChild(ctx context.Context, name string, node ipld.No // EnumLinksAsync returns a channel which will receive Links in the directory // as they are enumerated, where order is not gauranteed -func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, error) { +func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { linkResults := make(chan format.LinkResult) go func() { defer close(linkResults) @@ -163,7 +163,7 @@ func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) (<-chan format.Link } } }() - return linkResults, nil + return linkResults } // ForEachLink implements the `Directory` interface. @@ -253,7 +253,7 @@ func (d *HAMTDirectory) ForEachLink(ctx context.Context, f func(*ipld.Link) erro // EnumLinksAsync returns a channel which will receive Links in the directory // as they are enumerated, where order is not gauranteed -func (d *HAMTDirectory) EnumLinksAsync(ctx context.Context) (<-chan format.LinkResult, error) { +func (d *HAMTDirectory) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { return d.shard.EnumLinksAsync(ctx) } diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 6f621e977f..12c4817537 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -158,10 +158,7 @@ func TestDirBuilder(t *testing.T) { t.Fatal("wrong number of links", len(links), count) } - linkResults, err := dir.EnumLinksAsync(ctx) - if err != nil { - t.Fatal(err) - } + linkResults := dir.EnumLinksAsync(ctx) asyncNames := make(map[string]bool) var asyncLinks []*ipld.Link From abd0d4dddf5f23500d65ce04ab82a0dd8b7baa74 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Oct 2018 08:48:49 -0700 Subject: [PATCH 2430/3147] coreapi: fix errisdir JavaScript expects this to be "this dag node is a directory". I'm almost of a mind to say "don't parse errors" but, well, we don't give any better alternatives. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@dc979581ae4496d6e2c57a019cb133d780585df7 --- coreiface/errors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/errors.go b/coreiface/errors.go index 072275409e..4ee3026ffc 100644 --- a/coreiface/errors.go +++ b/coreiface/errors.go @@ -3,6 +3,6 @@ package iface import "errors" var ( - ErrIsDir = errors.New("object is a directory") + ErrIsDir = errors.New("this dag node is a directory") ErrOffline = errors.New("this action must be run in online mode, try running 'ipfs daemon' first") ) From b5f7f3348973656cc732acb7414b28f8b1326156 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Oct 2018 08:42:23 -0700 Subject: [PATCH 2431/3147] use a consistent error across ResolveToLastNode and ResolveLinks Really, we just need to get rid of some of this code but this is *a* fix. This commit was moved from ipfs/go-path@cc0c0f32286165c2f65793cbb64bae10b2b3f3d4 --- path/resolver/resolver.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 352004f52c..67bb9f6fb6 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -83,6 +83,9 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. } if err != nil { + if err == dag.ErrLinkNotFound { + err = ErrNoLink{Name: p[0], Node: nd.Cid()} + } return cid.Cid{}, nil, err } @@ -101,6 +104,9 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. // Confirm the path exists within the object val, rest, err := nd.Resolve(p) if err != nil { + if err == dag.ErrLinkNotFound { + err = ErrNoLink{Name: p[0], Node: nd.Cid()} + } return cid.Cid{}, nil, err } From 150d354c2f40a1cbb95d84d4ae3f60c882ab9bb0 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Oct 2018 09:27:41 -0700 Subject: [PATCH 2432/3147] gx: update go-path fixes the changed path cat error causing the js-ipfs-api tests to fail License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@cc45cf0ac009f5b7f4c6f55cf3d4636389b3198f --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/proquint.go | 2 +- namesys/publisher.go | 2 +- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 4aa4fcfbd6..7923241ed2 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 78ca295a84..c083c35b21 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 7b1b9e35c4..fb76a060f9 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 093798faf5..47b4e0c488 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 2bd3c42efb..8968016719 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys.go b/namesys/namesys.go index 0080533bad..4cbaf261ea 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 1e92547e31..856be40ed4 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,9 +8,9 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" diff --git a/namesys/proquint.go b/namesys/proquint.go index c906b1861f..8693f55dc8 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 76d65a42b3..95d0e358bd 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,7 +7,7 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" ft "gx/ipfs/QmfB3oNXGGq9S4B2a9YeCajoATms3Zw2VvDm8fK7VeLSV8/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index e8a9c36317..c2fc7242bf 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 08ac7b7b15..8b406e644d 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 24e93112cf..8694e2bddf 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index 073a8341bd..403df4ff62 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" From 41c1c071623c7781041fb09e69c641db9642bc1d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Oct 2018 09:27:41 -0700 Subject: [PATCH 2433/3147] gx: update go-path fixes the changed path cat error causing the js-ipfs-api tests to fail License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@6fcff53bc29de056f4b948bb0bfaa468546d1c66 --- coreiface/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/path.go b/coreiface/path.go index 5a3d1128b1..79dac201d1 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmZbQUht8hzKmQxLHnzY14WSuoQqYkR5mn4cunchyWPmhn/go-path" + ipfspath "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From 905993f35b75a302e90a1d30adfdeff75ee4fca1 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 1 Nov 2018 14:06:19 -0700 Subject: [PATCH 2434/3147] Update go-mfs and go-unixfs So we can get go-unixfs v1.2.0 License: MIT Signed-off-by: hannahhoward This commit was moved from ipfs/go-namesys@9fe2d78555f93787db860593a0356080b259ae03 --- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 856be40ed4..b32d5d6631 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -11,11 +11,11 @@ import ( path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" + "gx/ipfs/QmUaZkqxmKvUX16F8XeAAk9LVvmNMktvbhcx4PG4s8SqDG/go-unixfs" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" offroute "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" - "gx/ipfs/QmfB3oNXGGq9S4B2a9YeCajoATms3Zw2VvDm8fK7VeLSV8/go-unixfs" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index 95d0e358bd..b1a6c36794 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,7 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" - ft "gx/ipfs/QmfB3oNXGGq9S4B2a9YeCajoATms3Zw2VvDm8fK7VeLSV8/go-unixfs" + ft "gx/ipfs/QmUaZkqxmKvUX16F8XeAAk9LVvmNMktvbhcx4PG4s8SqDG/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" From 6cc67d0eb2b92bd082ebc731d0dfbf304deafdbb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 13:16:34 -0700 Subject: [PATCH 2435/3147] gx: update go-ipld-cbor (might as well do this at the same time) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@689ef22607a8138744624af78279e6dc141390da --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 7923241ed2..9c691b428a 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index c083c35b21..a52afcfccc 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index fb76a060f9..894ebb8c7c 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 47b4e0c488..b81b689a4a 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 8968016719..0600b24ccc 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys.go b/namesys/namesys.go index 4cbaf261ea..6493e5dcd6 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index b32d5d6631..693889670e 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,13 +8,13 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" - "gx/ipfs/QmUaZkqxmKvUX16F8XeAAk9LVvmNMktvbhcx4PG4s8SqDG/go-unixfs" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" + "gx/ipfs/Qmcba8ak38WXFWuaLak5pfJPUDFxcSWbkycBNQfmarpuTv/go-unixfs" offroute "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index 8693f55dc8..6fa5c52111 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/publisher.go b/namesys/publisher.go index b1a6c36794..7a0b3c19ce 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" - ft "gx/ipfs/QmUaZkqxmKvUX16F8XeAAk9LVvmNMktvbhcx4PG4s8SqDG/go-unixfs" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + ft "gx/ipfs/Qmcba8ak38WXFWuaLak5pfJPUDFxcSWbkycBNQfmarpuTv/go-unixfs" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index c2fc7242bf..ea59681611 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 8b406e644d..766aaa6f5c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 8694e2bddf..f61219cd72 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index 403df4ff62..40f235c4ec 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" From 9054f4c4c977dda2774bcf8493b2087fbf097d4d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 13:16:34 -0700 Subject: [PATCH 2436/3147] gx: update go-ipld-cbor (might as well do this at the same time) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@bca0017a7a95666fff03c83e4a8e38b51d6158f3 --- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 8a91378875..d541adac78 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -6,7 +6,7 @@ import ( cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" + dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index 79dac201d1..034bfffc34 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmT3rzed1ppXefourpmoZ7tyVQfsGPQZ1pHDngLmCvXxd3/go-path" + ipfspath "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ) From 09a5c1460bd7b60023135a7e7207b2f4aa11e48c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 13:16:34 -0700 Subject: [PATCH 2437/3147] gx: update go-ipld-cbor (might as well do this at the same time) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@bdacbf7d68a53592f27dc50a541158fa5c41544b --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index f3813f6252..f3516b02ff 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" + dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" posinfo "gx/ipfs/QmQyUyYcpKG1u53V7N25qRTGw5XwaAxTMKXbduqHotQztg/go-ipfs-posinfo" From 8cd9c4ba747494f3ab2e2a256c317ed2aa49829e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 13:16:34 -0700 Subject: [PATCH 2438/3147] gx: update go-ipld-cbor (might as well do this at the same time) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@10d16d09bf21592116489851669a435bc2b304d1 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index a1bfa02789..9d45636434 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" + dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 88bd1aec6d..af6a365bab 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" + mdag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index d92d8a8370..bd23db4629 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" bs "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" + mdag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 439f4384e0..d235960bd1 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" + "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 919efe6d0d..d59f5ea6cf 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmSei8kFMfqdJq7Q68d2LMnHbTWKKg2daA29ezUYFAUNgc/go-merkledag" bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" + dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" From bc68b9db0609bc8f54d487f4f2637af4a8ee01dd Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 17:15:21 -0700 Subject: [PATCH 2439/3147] gx: update go-log and sha256 fixes #5709 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@3df5b272a73be70bf4cc49ec2251ddee25f95689 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 26 ++++++++++++------------ namesys/namesys.go | 10 ++++----- namesys/namesys_test.go | 14 ++++++------- namesys/proquint.go | 2 +- namesys/publisher.go | 14 ++++++------- namesys/publisher_test.go | 14 ++++++------- namesys/republisher/repub.go | 10 ++++----- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 ++++----- namesys/routing.go | 18 ++++++++-------- 14 files changed, 67 insertions(+), 67 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 9c691b428a..3e46548ca8 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index a52afcfccc..2cb5e462df 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 894ebb8c7c..bba548afc6 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index b81b689a4a..a5ed85605d 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,9 +36,9 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 0600b24ccc..5ebb641897 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,24 +5,24 @@ import ( "testing" "time" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - u "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" - testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" - record "gx/ipfs/Qma9Eqp16mNHDX1EL73pcxhFfzbyXVcAYtaDd1xdmDRDtL/go-libp2p-record" - ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" + mockrouting "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/mock" + offline "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/offline" + record "gx/ipfs/QmSoeYGNm8v8jAF49hX7UwHwkXjoeobSrn9sya5NPPsxXP/go-libp2p-record" + pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore/pstoremem" + routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" + ropts "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing/options" + ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" + testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" - ropts "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing/options" - mockrouting "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/mock" - offline "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 6493e5dcd6..4b45025a4b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,17 +5,17 @@ import ( "strings" "time" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 693889670e..17f8277b36 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,15 +7,15 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - pstoremem "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore/pstoremem" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" - ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + offroute "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/offline" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + pstoremem "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore/pstoremem" + "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs" + ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - "gx/ipfs/Qmcba8ak38WXFWuaLak5pfJPUDFxcSWbkycBNQfmarpuTv/go-unixfs" - offroute "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/offline" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 6fa5c52111..3849b937a5 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/publisher.go b/namesys/publisher.go index 7a0b3c19ce..9da5169031 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,16 +7,16 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" - ft "gx/ipfs/Qmcba8ak38WXFWuaLak5pfJPUDFxcSWbkycBNQfmarpuTv/go-unixfs" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + ft "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" - pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" + ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" + pb "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns/pb" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dsquery "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" - routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 4f59272066..987493cc23 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" - ma "gx/ipfs/QmT4U94DnD8FRfqr21obWY32HLM5VExccPKMjQHofeYqr9/go-multiaddr" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" - ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + mockrouting "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/mock" + ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" + ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" + testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" + dshelp "gx/ipfs/QmaHSUAhuf9WG3mzJUd1fLDsQGvjsaQdUE7w5cZncz9AcB/go-ipfs-ds-help" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - mockrouting "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/mock" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index ea59681611..649613c5cd 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" - ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" + pb "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns/pb" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 766aaa6f5c..b2c1b29beb 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" - mocknet "gx/ipfs/QmUDTcnDp2WssbmiDLC6aYurUeyt7QeRakHUQMxA2mZ5iB/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" + mocknet "gx/ipfs/QmXnpYYg2onGLXVxM4Q5PEFcx29k8zeJQkPeLAk9h9naxg/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index f61219cd72..f3556c4c2d 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - testutil "gx/ipfs/Qma6ESRQTf1ZLPgzpCwDTqQJefPnU6uLvMjP18vK8EWp8L/go-testutil" - ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" + mockrouting "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/mock" + ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" + testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - mockrouting "gx/ipfs/QmcjvUP25nLSwELgUeqWe854S3XVbtsntTr7kZxG63yKhe/go-ipfs-routing/mock" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 40f235c4ec..aabbc95112 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,19 +5,19 @@ import ( "strings" "time" - path "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dht "gx/ipfs/QmQHnqaNULV8WeUGgh97o9K3KAW6kWQmDyNf9UuikgnPTe/go-libp2p-kad-dht" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" - ipns "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns" - pb "gx/ipfs/QmaRFtZhVAwXBk4Z3zEsvjScH9fjsDZmhXfa1Gm8eMb9cg/go-ipns/pb" - routing "gx/ipfs/QmcQ81jSyWCp1jpkQ8CMbtpXT3jK7Wg6ZtYmoyWFgBoF9c/go-libp2p-routing" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" + ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" + pb "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns/pb" + dht "gx/ipfs/QmadRyQYRn64xHb5HKy2jRFp2Der643Cgo7NEjFgs4MX2k/go-libp2p-kad-dht" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) var log = logging.Logger("namesys") From 93332aaa1821369c585b86e957acd42a09d3f1dd Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 17:15:21 -0700 Subject: [PATCH 2440/3147] gx: update go-log and sha256 fixes #5709 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@1c6351bc2b6ca351b0aaf8f3a6eca43714af21e1 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/dht.go | 4 ++-- coreiface/key.go | 2 +- coreiface/object.go | 4 ++-- coreiface/options/block.go | 4 ++-- coreiface/options/dag.go | 2 +- coreiface/options/unixfs.go | 6 +++--- coreiface/path.go | 4 ++-- coreiface/pubsub.go | 2 +- coreiface/swarm.go | 8 ++++---- coreiface/unixfs.go | 2 +- 12 files changed, 21 insertions(+), 21 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index b744a207a5..bab4fc13b3 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index 6cca5b9e68..eb9e2da4a0 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) // DagOps groups operations that can be batched together diff --git a/coreiface/dht.go b/coreiface/dht.go index 38a0f73488..c4eef93792 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" + pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/key.go b/coreiface/key.go index 9e7bfee281..36a74688b1 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/object.go b/coreiface/object.go index 229f69869e..ba6f5a95d6 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 6603136f30..ea4ae26bb6 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -2,8 +2,8 @@ package options import ( "fmt" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) type BlockPutSettings struct { diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go index 4fdff0489c..9cccba5854 100644 --- a/coreiface/options/dag.go +++ b/coreiface/options/dag.go @@ -3,7 +3,7 @@ package options import ( "math" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ) type DagPutSettings struct { diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index d541adac78..9b0683a117 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index 034bfffc34..f5e7aeb4c1 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,9 +1,9 @@ package iface import ( - ipfspath "gx/ipfs/QmUB3RFRDctDp1k73mDJydzWiKdiuNHfyuoRPQeU52rWWT/go-path" + ipfspath "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index b3f3f6b762..93e4295746 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" + peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/coreiface/swarm.go b/coreiface/swarm.go index d4b92c017d..b830a08174 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,11 +5,11 @@ import ( "errors" "time" - ma "gx/ipfs/QmT4U94DnD8FRfqr21obWY32HLM5VExccPKMjQHofeYqr9/go-multiaddr" - "gx/ipfs/QmTRhk7cgjUf2gfQ3p2M9KPECNZEW9XUrmHcFCgog4cPgB/go-libp2p-peer" - pstore "gx/ipfs/QmTTJcDL3gsnGDALjh2fDGg1onGRUdVgNL2hU2WEZcVrMX/go-libp2p-peerstore" - net "gx/ipfs/QmXuRkCR7BNQa9uqfpTiFWsTQLzmTWYg91Ja1w95gnqb6u/go-libp2p-net" + ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" + net "gx/ipfs/QmRKbEchaYADxSCyyjhDh4cTrUby8ftXUb8MRLBTHQYupw/go-libp2p-net" + pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" + "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) var ( diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 6fd33ad2c5..002635d993 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" files "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) // TODO: ideas on making this more coreapi-ish without breaking the http API? From 0fe9d3d93426ed44410f2c74ef96fd105ac43de7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 17:15:21 -0700 Subject: [PATCH 2441/3147] gx: update go-log and sha256 fixes #5709 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@a9ac2cfb972a3c0c4f6d6dc79ebdf42c60abc1ec --- filestore/filestore.go | 10 +++++----- filestore/filestore_test.go | 8 ++++---- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 19f5fd2097..04f3ef6834 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,12 +11,12 @@ import ( "context" "errors" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - posinfo "gx/ipfs/QmQyUyYcpKG1u53V7N25qRTGw5XwaAxTMKXbduqHotQztg/go-ipfs-posinfo" - blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" - logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" + blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" - blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" + logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index f3516b02ff..bfe6b13540 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" + dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - posinfo "gx/ipfs/QmQyUyYcpKG1u53V7N25qRTGw5XwaAxTMKXbduqHotQztg/go-ipfs-posinfo" + posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 74b0131b81..fa4ba0dcc8 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,14 +10,14 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - posinfo "gx/ipfs/QmQyUyYcpKG1u53V7N25qRTGw5XwaAxTMKXbduqHotQztg/go-ipfs-posinfo" - blocks "gx/ipfs/QmRcHuYzAyswytBuMF78rj3LTChYszomRFXNg4685ZN1WM/go-block-format" - dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" + posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" + blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" + dshelp "gx/ipfs/QmaHSUAhuf9WG3mzJUd1fLDsQGvjsaQdUE7w5cZncz9AcB/go-ipfs-ds-help" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dsns "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/namespace" dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" - blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/filestore/util.go b/filestore/util.go index 39df78c6f3..f7af7f601e 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - dshelp "gx/ipfs/QmS73grfbWgWrNztd8Lns9GCG3jjRNDfcPYg2VYQzKDZSt/go-ipfs-ds-help" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" + dshelp "gx/ipfs/QmaHSUAhuf9WG3mzJUd1fLDsQGvjsaQdUE7w5cZncz9AcB/go-ipfs-ds-help" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" - blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) // Status is used to identify the state of the block data referenced From e2c9f0f0998c03b902a20ef43e783a6c2e952769 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 17:15:21 -0700 Subject: [PATCH 2442/3147] gx: update go-log and sha256 fixes #5709 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@f5ffd000e4b0d6c48a3b12ad8a2376a05ba28c05 --- pinning/pinner/gc/gc.go | 18 +++++++++--------- pinning/pinner/pin.go | 8 ++++---- pinning/pinner/pin_test.go | 12 ++++++------ pinning/pinner/set.go | 6 +++--- pinning/pinner/set_test.go | 10 +++++----- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 9d45636434..8c0b2e879c 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" - dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" - - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" - offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" - "gx/ipfs/QmVkMRSkXrpjqrroEXWuYBvDBnXCdMMY6gsKicBGVGUqKT/go-verifcid" - logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + bserv "gx/ipfs/QmVPeMNK9DfGLXDZzs2W4RoFWC9Zq1EnLGmLXtYtWrNdcW/go-blockservice" + dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + + offline "gx/ipfs/QmPpnbwgAuvhUkA9jGooR88ZwZtTUHXXvoQNKdjZC6nYku/go-ipfs-exchange-offline" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + bstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" + "gx/ipfs/QmYMQuypUbgsdNHmuCBSUJV6wdQVsBHRivNAp3efHJwZJD/go-verifcid" dstore "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - bstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" + logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index af6a365bab..e8ebe8c3eb 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" + mdag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" - logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" + logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index bd23db4629..b58691860e 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - bs "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" - mdag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" + bs "gx/ipfs/QmVPeMNK9DfGLXDZzs2W4RoFWC9Zq1EnLGmLXtYtWrNdcW/go-blockservice" + mdag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - util "gx/ipfs/QmPdKqUcHGFdeSpvjVoaTRPPstGif9GBZb5Q56RVw9o69A/go-ipfs-util" - offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" + util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" + offline "gx/ipfs/QmPpnbwgAuvhUkA9jGooR88ZwZtTUHXXvoQNKdjZC6nYku/go-ipfs-exchange-offline" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" - blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index d235960bd1..35b76eb293 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" + "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - ipld "gx/ipfs/QmR7TcHkR9nxkUorfi8XMTAMLUK7GiP64TWWBzY3aacc1o/go-ipld-format" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index d59f5ea6cf..82e4679b1b 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmWfhv1D18DRSiSm73r4QGcByspzPtxxRTcmHW3axFXZo8/go-blockservice" - dag "gx/ipfs/QmXyuFW7at4r9dxRAbrPU9JpHW5aqngAFyxvyhvYjzxRKS/go-merkledag" + bserv "gx/ipfs/QmVPeMNK9DfGLXDZzs2W4RoFWC9Zq1EnLGmLXtYtWrNdcW/go-blockservice" + dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" - cid "gx/ipfs/QmPSQnBKM9g7BaUcZCvswUJVscQ1ipjmwxN5PXCjkp9EQ7/go-cid" - offline "gx/ipfs/QmT6dHGp3UYd3vUMpy7rzX2CXQv7HLcj42Vtq8qwwjgASb/go-ipfs-exchange-offline" + offline "gx/ipfs/QmPpnbwgAuvhUkA9jGooR88ZwZtTUHXXvoQNKdjZC6nYku/go-ipfs-exchange-offline" + cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" - blockstore "gx/ipfs/QmcDDgAXDbpDUpadCJKLr49KYR4HuL7T8Z1dZTHt6ixsoR/go-ipfs-blockstore" ) func ignoreCids(_ cid.Cid) {} From 4309543c6072a930005d7d4f81b446fdc0558a40 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 2 Nov 2018 17:15:21 -0700 Subject: [PATCH 2443/3147] gx: update go-log and sha256 fixes #5709 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-keystore@33935f4f62f67439a75f5ccea0cfc2f3990f14fd --- keystore/keystore.go | 4 ++-- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index ba43da47fa..7c41b36edd 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,8 +7,8 @@ import ( "path/filepath" "strings" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - logging "gx/ipfs/QmZChCsSt8DctjceaL56Eibc29CVQq4dGKRXC5JRZ6Ppae/go-log" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" ) var log = logging.Logger("keystore") diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 751a2e39d2..1d2005e9eb 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index a89a1ae7f1..0c8f8861f4 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" +import ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. From f7a75ea5068633f821367cdd2d090c5ebf41d3aa Mon Sep 17 00:00:00 2001 From: songjiayang Date: Thu, 8 Nov 2018 14:50:32 +0800 Subject: [PATCH 2444/3147] make blockservice AddBlocks return more quickly This commit was moved from ipfs/go-blockservice@13325361e5c2eefd8a688a3addc4f95ad57a4a8e --- blockservice/blockservice.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 2e1de3f7a1..926b7208ca 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -181,6 +181,10 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { toput = bs } + if len(toput) == 0 { + return nil + } + err := s.blockstore.PutMany(toput) if err != nil { return err From 4d4382b88abed0d1af232aa66e573416a8c1185b Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Thu, 27 Sep 2018 17:04:56 +0800 Subject: [PATCH 2445/3147] Fix comments in helpers Fix value of roughLinkSize. Add default value of DefaultLinksPerBlock. And delete calc_test.go as it is deleted in commit bc79ae17a1987 ("refactor importer package with trickle and balanced dag generation") License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@e163417e64556ee6abd6930adc4f967d3bcaaff1 --- unixfs/importer/helpers/helpers.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index ba6d518267..5bf72bc867 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -29,10 +29,11 @@ var roughLinkSize = 34 + 8 + 5 // sha256 multihash + size + no name + protobuf // For now, we use: // // var roughLinkBlockSize = 1 << 13 // 8KB -// var roughLinkSize = 288 // sha256 + framing + name +// var roughLinkSize = 34 + 8 + 5 // sha256 multihash + size + no name +// // + protobuf framing // var DefaultLinksPerBlock = (roughLinkBlockSize / roughLinkSize) -// -// See calc_test.go +// = ( 8192 / 47 ) +// = (approximately) 174 var DefaultLinksPerBlock = roughLinkBlockSize / roughLinkSize // ErrSizeLimitExceeded signals that a block is larger than BlockSizeLimit. From faac94fac8a13913bc291aceebddff36d6229806 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Sat, 10 Nov 2018 18:37:06 -0800 Subject: [PATCH 2446/3147] Update go-ipfs-delay and assoc deps License: MIT Signed-off-by: hannahhoward This commit was moved from ipfs/go-namesys@2f6e6b1d4e7b2331877561706d111b95a7dc92ba --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 20 ++++++++++---------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 14 +++++++------- namesys/proquint.go | 2 +- namesys/publisher.go | 14 +++++++------- namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 10 +++++----- 14 files changed, 53 insertions(+), 53 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 3e46548ca8..2581d84a1a 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 2cb5e462df..171a99de2f 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index bba548afc6..33aff5aa74 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index a5ed85605d..1fb417e5f6 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 5ebb641897..a2144dbdae 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,24 +5,24 @@ import ( "testing" "time" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - mockrouting "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/mock" - offline "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/offline" + pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore/pstoremem" + ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" record "gx/ipfs/QmSoeYGNm8v8jAF49hX7UwHwkXjoeobSrn9sya5NPPsxXP/go-libp2p-record" - pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore/pstoremem" - routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" - ropts "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing/options" - ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" + routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" + ropts "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing/options" testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + mockrouting "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/mock" + offline "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/offline" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 4b45025a4b..6fae36c7a8 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,17 +5,17 @@ import ( "strings" "time" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" + routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 17f8277b36..cd1cbdcf47 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,14 +8,14 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - offroute "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/offline" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" - pstoremem "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore/pstoremem" - "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs" - ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" + pstoremem "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore/pstoremem" + ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" + "gx/ipfs/QmUnHNqhSB1JgzVCxL1Kz3yb4bdyB4q1Z9AD5AUBVmt3fZ/go-unixfs" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + offroute "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/offline" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 3849b937a5..27bef3e924 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/publisher.go b/namesys/publisher.go index 9da5169031..a1ce79c6fe 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,17 +7,17 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" - ft "gx/ipfs/QmXLCwhHh7bxRsBnCKNE9BAN87V44aSxXLquZYTtjr6fZ3/go-unixfs" + ft "gx/ipfs/QmUnHNqhSB1JgzVCxL1Kz3yb4bdyB4q1Z9AD5AUBVmt3fZ/go-unixfs" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" - ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" - pb "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns/pb" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dsquery "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" + pb "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns/pb" + routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dsquery "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 987493cc23..bb24ab3535 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -7,14 +7,14 @@ import ( "time" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - mockrouting "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/mock" + ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" - ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" - dshelp "gx/ipfs/QmaHSUAhuf9WG3mzJUd1fLDsQGvjsaQdUE7w5cZncz9AcB/go-ipfs-ds-help" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" + dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + mockrouting "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/mock" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 649613c5cd..171416c9bc 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,16 +7,16 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + pb "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns/pb" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pb "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns/pb" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index b2c1b29beb..82597a966b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" - mocknet "gx/ipfs/QmXnpYYg2onGLXVxM4Q5PEFcx29k8zeJQkPeLAk9h9naxg/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmVvV8JQmmqPCwXAaesWJPheUiEFQJ9HWRhWhuFuxVQxpR/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index f3556c4c2d..1376ea7790 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" - mockrouting "gx/ipfs/QmNuVissmH2ftUd4ADvhm9WER3351wTYduY1EeDDGtP1tM/go-ipfs-routing/mock" - ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" + ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + mockrouting "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/mock" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index aabbc95112..f4e115686c 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,15 +5,15 @@ import ( "strings" "time" - path "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" + dht "gx/ipfs/QmQsw6Nq2A345PqChdtbWVoYbSno7uqRDHwYmYpbPHmZNc/go-libp2p-kad-dht" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - routing "gx/ipfs/QmYyg3UnyiQubxjs4uhKixPxR7eeKrhJ5Vyz6Et4Tet18B/go-libp2p-routing" - ipns "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns" - pb "gx/ipfs/QmZMJfrt7fU33oFQ9WvWnovhiiZ8T6qkWkFXNCFreJTzgT/go-ipns/pb" - dht "gx/ipfs/QmadRyQYRn64xHb5HKy2jRFp2Der643Cgo7NEjFgs4MX2k/go-libp2p-kad-dht" + ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" + pb "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns/pb" + routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" From cd374fff52aec080e9faa17753d6fc104c1bd4ae Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Sat, 10 Nov 2018 18:37:06 -0800 Subject: [PATCH 2447/3147] Update go-ipfs-delay and assoc deps License: MIT Signed-off-by: hannahhoward This commit was moved from ipfs/interface-go-ipfs-core@20ca7387bd766e8a03ba3d7675d4d611a3a3fdab --- coreiface/dht.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/swarm.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index c4eef93792..243f1292c9 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,7 +5,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" + pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" ) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 9b0683a117..742aa6f9e6 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -5,7 +5,7 @@ import ( "fmt" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/path.go b/coreiface/path.go index f5e7aeb4c1..0545c30d76 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmRG3XuGwT7GYuAqgWDJBKTzdaHMwAnc1x7J2KHEXNHxzG/go-path" + ipfspath "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ) diff --git a/coreiface/swarm.go b/coreiface/swarm.go index b830a08174..1ecb0bb5ef 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,11 +5,11 @@ import ( "errors" "time" + pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" - net "gx/ipfs/QmRKbEchaYADxSCyyjhDh4cTrUby8ftXUb8MRLBTHQYupw/go-libp2p-net" - pstore "gx/ipfs/QmUymf8fJtideyv3z727BcZUifGBjMZMpCJqu3Gxk5aRUk/go-libp2p-peerstore" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + net "gx/ipfs/QmenvQQy4bFGSiHJUGupVmCRHfetg5rH3vTp9Z2f6v2KXR/go-libp2p-net" ) var ( From 8b8b993d4727724ba49becf8333a31411fceeb61 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Sat, 10 Nov 2018 18:37:06 -0800 Subject: [PATCH 2448/3147] Update go-ipfs-delay and assoc deps License: MIT Signed-off-by: hannahhoward This commit was moved from ipfs/go-filestore@bdaaf12e092d59f55f5d9a540a58b35d5be4ba04 --- filestore/filestore.go | 4 ++-- filestore/filestore_test.go | 6 +++--- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 04f3ef6834..d9632d9f9b 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -13,10 +13,10 @@ import ( posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" + blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" - dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" + dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index bfe6b13540..b40941e2e8 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index fa4ba0dcc8..f6b39e27e6 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -12,13 +12,13 @@ import ( posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" + blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" - dshelp "gx/ipfs/QmaHSUAhuf9WG3mzJUd1fLDsQGvjsaQdUE7w5cZncz9AcB/go-ipfs-ds-help" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dsns "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/namespace" - dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dsns "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/namespace" + dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index f7af7f601e..af25da2726 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -7,10 +7,10 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" - dshelp "gx/ipfs/QmaHSUAhuf9WG3mzJUd1fLDsQGvjsaQdUE7w5cZncz9AcB/go-ipfs-ds-help" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" ) // Status is used to identify the state of the block data referenced From 788a6eb0c8a0ac40e4cb01c1bc31bc57be9bd403 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Sat, 10 Nov 2018 18:37:06 -0800 Subject: [PATCH 2449/3147] Update go-ipfs-delay and assoc deps License: MIT Signed-off-by: hannahhoward This commit was moved from ipfs/go-ipfs-pinner@c4286905469afeae1a3daab881fb07f0dbcfbd98 --- pinning/pinner/gc/gc.go | 10 +++++----- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 12 ++++++------ pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 12 ++++++------ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 8c0b2e879c..0e291e39ce 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmVPeMNK9DfGLXDZzs2W4RoFWC9Zq1EnLGmLXtYtWrNdcW/go-blockservice" - dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + bserv "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" + dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" - offline "gx/ipfs/QmPpnbwgAuvhUkA9jGooR88ZwZtTUHXXvoQNKdjZC6nYku/go-ipfs-exchange-offline" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - bstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" + bstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" "gx/ipfs/QmYMQuypUbgsdNHmuCBSUJV6wdQVsBHRivNAp3efHJwZJD/go-verifcid" - dstore "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" + offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" + dstore "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index e8ebe8c3eb..75a7d03622 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + mdag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index b58691860e..2b05b0f770 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - bs "gx/ipfs/QmVPeMNK9DfGLXDZzs2W4RoFWC9Zq1EnLGmLXtYtWrNdcW/go-blockservice" - mdag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + bs "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" + mdag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - offline "gx/ipfs/QmPpnbwgAuvhUkA9jGooR88ZwZtTUHXXvoQNKdjZC6nYku/go-ipfs-exchange-offline" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dssync "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/sync" + blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 35b76eb293..9c7d1eb7a6 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 82e4679b1b..de7205dacd 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmVPeMNK9DfGLXDZzs2W4RoFWC9Zq1EnLGmLXtYtWrNdcW/go-blockservice" - dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag" + bserv "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" + dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" - offline "gx/ipfs/QmPpnbwgAuvhUkA9jGooR88ZwZtTUHXXvoQNKdjZC6nYku/go-ipfs-exchange-offline" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmSNLNnL3kq3A1NGdQA9AtgxM9CWKiiSEup3W435jCkRQS/go-ipfs-blockstore" - ds "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore" - dsq "gx/ipfs/QmaRb5yNXKonhbkpNxNawoydk4N6es6b4fPj19sjEKsh5D/go-datastore/query" + blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline" + ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" ) func ignoreCids(_ cid.Cid) {} From d4bc803bd72426b3d69aaceb631db961c4338b36 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 28 Nov 2018 17:21:36 -0500 Subject: [PATCH 2450/3147] Gx update go-merkledag and related deps. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-namesys@53d23c6b0765b76529700ebfaeb07b0b1b75eca9 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 2581d84a1a..c3b939a187 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 171a99de2f..74cc31db3f 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 33aff5aa74..3df35142a4 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 1fb417e5f6..1df11aaece 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index a2144dbdae..64ec3079bf 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys.go b/namesys/namesys.go index 6fae36c7a8..c9c937c302 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index cd1cbdcf47..976939c053 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -9,9 +9,9 @@ import ( ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" pstoremem "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore/pstoremem" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" - "gx/ipfs/QmUnHNqhSB1JgzVCxL1Kz3yb4bdyB4q1Z9AD5AUBVmt3fZ/go-unixfs" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + "gx/ipfs/QmXAFxWtAB9YAMzMy9op6m95hWYu2CC5rmTsijkYL12Kvu/go-unixfs" peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" offroute "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/offline" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/proquint.go b/namesys/proquint.go index 27bef3e924..8151f8f549 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/publisher.go b/namesys/publisher.go index a1ce79c6fe..d7d8d3a379 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmUnHNqhSB1JgzVCxL1Kz3yb4bdyB4q1Z9AD5AUBVmt3fZ/go-unixfs" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + ft "gx/ipfs/QmXAFxWtAB9YAMzMy9op6m95hWYu2CC5rmTsijkYL12Kvu/go-unixfs" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 171416c9bc..c460a333ec 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" pb "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns/pb" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 82597a966b..2ef2e6c826 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 1376ea7790..d59614fbc7 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index f4e115686c..84a418f09b 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" From 33840cd7fb98e69e4a3795ad744faf3135dc9a9b Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 28 Nov 2018 17:21:36 -0500 Subject: [PATCH 2451/3147] Gx update go-merkledag and related deps. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/interface-go-ipfs-core@1f51fd41ce7d6160fa741a5c7699a3b5bb305540 --- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 742aa6f9e6..4d7b61a936 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -5,7 +5,7 @@ import ( "fmt" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" + dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/path.go b/coreiface/path.go index 0545c30d76..aa3b2d0c6d 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmVi2uUygezqaMTqs3Yzt5FcZFHJoYD4B7jQ2BELjj7ZuY/go-path" + ipfspath "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ) From d083cb0c746e9c7f588d59c3de663f5893cea100 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 28 Nov 2018 17:21:36 -0500 Subject: [PATCH 2452/3147] Gx update go-merkledag and related deps. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@a0b864f8f877bf048c154ef072454f858fa1a6a6 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index b40941e2e8..ea3f2d744c 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" + dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" From c6332756df0b72c07286b0ebc827bcbf2c53030f Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Wed, 28 Nov 2018 17:21:36 -0500 Subject: [PATCH 2453/3147] Gx update go-merkledag and related deps. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-ipfs-pinner@8e78bd723dd02ce328136d37f7a4e44b6ef3ce05 --- pinning/pinner/gc/gc.go | 2 +- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 2 +- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 0e291e39ce..3ab3dcdc0d 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -9,7 +9,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" bserv "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" - dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" + dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" bstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 75a7d03622..ae8e35d74c 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" + mdag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 2b05b0f770..70e1dbc254 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -6,7 +6,7 @@ import ( "time" bs "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" - mdag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" + mdag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 9c7d1eb7a6..f37d6a347f 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" + "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index de7205dacd..1d8e655943 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -6,7 +6,7 @@ import ( "testing" bserv "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" - dag "gx/ipfs/QmcGt25mrjuB2kKW2zhPbXVZNHc4yoTDQ65NA8m6auP2f1/go-merkledag" + dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From 1928f10ac3cf6902f8ef99f9159627522563eb9c Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Tue, 4 Dec 2018 16:09:34 +0800 Subject: [PATCH 2454/3147] Fix typo in helpers License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@b56f85fe528a11d29bff58287c6ffdfd2e819c96 --- unixfs/importer/helpers/helpers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index 5bf72bc867..75d0130900 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -88,7 +88,7 @@ func (n *UnixfsNode) GetChild(ctx context.Context, i int, ds ipld.DAGService) (* } // AddChild adds the given UnixfsNode as a child of the receiver. -// The passed in DagBuilderHelper is used to store the child node an +// The passed in DagBuilderHelper is used to store the child node and // pin it locally so it doesnt get lost. func (n *UnixfsNode) AddChild(child *UnixfsNode, db *DagBuilderHelper) error { n.ufmt.AddBlockSize(child.FileSize()) From 032060566e194f69bb3fd22c6d238eed9a10dcf6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Dec 2018 15:01:22 -0800 Subject: [PATCH 2455/3147] testing: disable inline peer ID test We're disabling these until we can properly specify the hash function in the key itself. This commit was moved from ipfs/go-ipns@39adaba0123da75ac33636c9fa9745d6f4eaee15 --- ipns/validate_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ipns/validate_test.go b/ipns/validate_test.go index 0ef9d00c5f..1e10249b6b 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -128,6 +128,8 @@ func TestEmbeddedPubKeyValidate(t *testing.T) { } func TestPeerIDPubKeyValidate(t *testing.T) { + t.Skip("disabled until libp2p/go-libp2p-crypto#51 is fixed") + goodeol := time.Now().Add(time.Hour) kbook := pstoremem.NewPeerstore() From c884a163c3cad6f1c0d28270dc1b9ccb739859fe Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Dec 2018 15:37:23 -0800 Subject: [PATCH 2456/3147] gx: update go-libp2p-peer Reverts the changes that allowed small keys (ed25519 keys) to be inlined. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@0c0c90a487f0e0b0d02e19ea0462f1ead4305077 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 22 +++++++++++----------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 12 ++++++------ namesys/proquint.go | 2 +- namesys/publisher.go | 12 ++++++------ namesys/publisher_test.go | 8 ++++---- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 12 ++++++------ 14 files changed, 52 insertions(+), 52 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index c3b939a187..e956f7653d 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 74cc31db3f..653580586d 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 3df35142a4..b92a780290 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 1df11aaece..e330a83cbe 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 64ec3079bf..840bd064a5 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,24 +5,24 @@ import ( "testing" "time" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore/pstoremem" - ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" - record "gx/ipfs/QmSoeYGNm8v8jAF49hX7UwHwkXjoeobSrn9sya5NPPsxXP/go-libp2p-record" - routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" - ropts "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing/options" - testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" - mockrouting "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/mock" - offline "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/offline" + ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" + testutil "gx/ipfs/QmPuhRE325DR8ChNcFtgd6F1eANCHy1oohXZPpYop4xsK6/go-testutil" + routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" + ropts "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing/options" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore/pstoremem" + mockrouting "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/mock" + offline "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/offline" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" + record "gx/ipfs/QmfARXVCzpwFXQdepAJZuqyNDgV9doEsMnVCo1ssmuSe1U/go-libp2p-record" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index c9c937c302..303413d29b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,15 +5,15 @@ import ( "strings" "time" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" + routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 976939c053..e97933afd8 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,12 +8,12 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - pstoremem "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore/pstoremem" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" - ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" - "gx/ipfs/QmXAFxWtAB9YAMzMy9op6m95hWYu2CC5rmTsijkYL12Kvu/go-unixfs" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" - offroute "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/offline" + ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + pstoremem "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore/pstoremem" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + "gx/ipfs/QmdYvDbHp7qAhZ7GsCj6e1cMo55ND6y2mjWVzwdvcv4f12/go-unixfs" + offroute "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/offline" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index 8151f8f549..a2c8c6f083 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index d7d8d3a379..78bfd160f6 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,14 +7,14 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" - ft "gx/ipfs/QmXAFxWtAB9YAMzMy9op6m95hWYu2CC5rmTsijkYL12Kvu/go-unixfs" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + ft "gx/ipfs/QmdYvDbHp7qAhZ7GsCj6e1cMo55ND6y2mjWVzwdvcv4f12/go-unixfs" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" - pb "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns/pb" - routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" + pb "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns/pb" + routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dsquery "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index bb24ab3535..5f0c9867c3 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -7,12 +7,12 @@ import ( "time" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" + ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" + testutil "gx/ipfs/QmPuhRE325DR8ChNcFtgd6F1eANCHy1oohXZPpYop4xsK6/go-testutil" ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" - testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" - mockrouting "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/mock" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index c460a333ec..7fb593a685 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,13 +7,13 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - pb "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns/pb" + pb "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns/pb" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 2ef2e6c826..26d3fa807b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" - pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" + mocknet "gx/ipfs/QmRBaUEQEeFWywfrZJ64QgsmvcqgLSK3VbvGMR2NM2Edpf/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmVvV8JQmmqPCwXAaesWJPheUiEFQJ9HWRhWhuFuxVQxpR/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index d59614fbc7..32bc6dddf7 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" - ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" - testutil "gx/ipfs/QmZXjR5X1p4KrQ967cTsy4MymMzUM8mZECF3PV8UcN4o3g/go-testutil" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" - mockrouting "gx/ipfs/QmdxhyAwBrnmJFsYPK6tyHh4Yy3gK8gbULErX1dRnpUMqu/go-ipfs-routing/mock" + ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" + testutil "gx/ipfs/QmPuhRE325DR8ChNcFtgd6F1eANCHy1oohXZPpYop4xsK6/go-testutil" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + mockrouting "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/mock" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 84a418f09b..3398e0e7f0 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,16 +5,16 @@ import ( "strings" "time" - path "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - dht "gx/ipfs/QmQsw6Nq2A345PqChdtbWVoYbSno7uqRDHwYmYpbPHmZNc/go-libp2p-kad-dht" + ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" + pb "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns/pb" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipns "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns" - pb "gx/ipfs/QmR9UpasSQR4Mqq1qiJAfnY4SVBxJn7r639CxiLjx8dYGm/go-ipns/pb" - routing "gx/ipfs/QmZBH87CAPFHcc7cYmBqeSQ98zQ3SX9KUxiYgzPmLWNVKz/go-libp2p-routing" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" + dht "gx/ipfs/QmXbPygnUKAPMwseE5U3hQA7Thn59GVm7pQrhkFV63umT8/go-libp2p-kad-dht" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" From 21152b6074f3bf08068a4f980775194769ba63e5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Dec 2018 15:37:23 -0800 Subject: [PATCH 2457/3147] gx: update go-libp2p-peer Reverts the changes that allowed small keys (ed25519 keys) to be inlined. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@2d2e05fe7cc9680e2a06a5f752e76666a17b5944 --- coreiface/dht.go | 4 ++-- coreiface/key.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/pubsub.go | 2 +- coreiface/swarm.go | 6 +++--- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 243f1292c9..e39be92c58 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/key.go b/coreiface/key.go index 36a74688b1..f310c3cc2e 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 4d7b61a936..b771896bcc 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -5,7 +5,7 @@ import ( "fmt" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" + dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/path.go b/coreiface/path.go index aa3b2d0c6d..57ef4c21bd 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,7 @@ package iface import ( - ipfspath "gx/ipfs/QmQtg7N4XjAk2ZYpBjjv8B6gQprsRekabHBCnF6i46JYKJ/go-path" + ipfspath "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ) diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index 93e4295746..867c8adc44 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" + peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 1ecb0bb5ef..63d20f0351 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,11 +5,11 @@ import ( "errors" "time" - pstore "gx/ipfs/QmQAGG1zxfePqj2t7bLxyN8AFccZ889DDR9Gn8kVLDrGZo/go-libp2p-peerstore" + net "gx/ipfs/QmPtFaR7BWHLAjSwLh9kXcyrgTzDpuhcWLkx8ioa9RMYnx/go-libp2p-net" ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" + "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" - "gx/ipfs/QmcqU6QUDSXprb1518vYDGczrTJTyGwLG9eUa5iNX4xUtS/go-libp2p-peer" - net "gx/ipfs/QmenvQQy4bFGSiHJUGupVmCRHfetg5rH3vTp9Z2f6v2KXR/go-libp2p-net" ) var ( From 87d7dd8741c99d5223c1a240c5c86a8126b15d5a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Dec 2018 15:37:23 -0800 Subject: [PATCH 2458/3147] gx: update go-libp2p-peer Reverts the changes that allowed small keys (ed25519 keys) to be inlined. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@62dc882c631232e9e54ff95f3c7dad7d72704049 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index ea3f2d744c..474c7ecfa3 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" + dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" From 4f65e0d6d0ad82358c5fc0036a044dec82eaf64b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Dec 2018 15:37:23 -0800 Subject: [PATCH 2459/3147] gx: update go-libp2p-peer Reverts the changes that allowed small keys (ed25519 keys) to be inlined. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@bcb5927195dc40e461a267d18d58bf395c2ffc32 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 3ab3dcdc0d..8a04d7fc1a 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" - dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" + bserv "gx/ipfs/QmPoh3SrQzFBWtdGK6qmHDV4EanKR6kYPj4DD3J2NLoEmZ/go-blockservice" + dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" bstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ae8e35d74c..d9a21f1cab 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" + mdag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 70e1dbc254..ce13cb844f 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" - mdag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" + bs "gx/ipfs/QmPoh3SrQzFBWtdGK6qmHDV4EanKR6kYPj4DD3J2NLoEmZ/go-blockservice" + mdag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index f37d6a347f..66ae325c8f 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" + "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 1d8e655943..da964e37e1 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmVDTbzzTwnuBwNbJdhW3u7LoBQp46bezm9yp4z1RoEepM/go-blockservice" - dag "gx/ipfs/QmdURv6Sbob8TVW2tFFve9vcEWrSUgwPqeqnXyvYhLrkyd/go-merkledag" + bserv "gx/ipfs/QmPoh3SrQzFBWtdGK6qmHDV4EanKR6kYPj4DD3J2NLoEmZ/go-blockservice" + dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From 59e6b21a1ab34a2e442f1697cd632481292d4661 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Dec 2018 15:44:08 -0800 Subject: [PATCH 2460/3147] fix ed25519 test(s) License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@9abd586f2f3a549075e5c7df1cb227f42efbca8e --- namesys/publisher_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 5f0c9867c3..d872ec3249 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -108,5 +108,5 @@ func TestRSAPublisher(t *testing.T) { } func TestEd22519Publisher(t *testing.T) { - testNamekeyPublisher(t, ci.Ed25519, ds.ErrNotFound, false) + testNamekeyPublisher(t, ci.Ed25519, nil, true) } From a632c4c8b4bc4708bb45cdab8a6d5b18f5423f1b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 11 Dec 2018 12:43:14 -0800 Subject: [PATCH 2461/3147] go fmt This commit was moved from ipfs/go-mfs@06fd27e475c85a704f5c80fffaca4d5d7baea6c5 --- mfs/inode.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/inode.go b/mfs/inode.go index 54f064c7b9..e2b591cb38 100644 --- a/mfs/inode.go +++ b/mfs/inode.go @@ -10,10 +10,10 @@ import ( type inode struct { // name of this `inode` in the MFS path (the same value // is also stored as the name of the DAG link). - name string + name string // parent directory of this `inode` (which may be the `Root`). - parent childCloser + parent childCloser // dagService used to store modifications made to the contents // of the file or directory the `inode` belongs to. From 6f8aeeb4e1dc34c4bf9807a3216e8bb7918d4d2e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 11 Dec 2018 12:43:22 -0800 Subject: [PATCH 2462/3147] avoid unecessary constructors (also avoid exposing a public constructor for a private datastructure) This commit was moved from ipfs/go-mfs@0ae12b2070af108bc56c14cb8b9b6555d2c0fd79 --- mfs/dir.go | 6 +++++- mfs/file.go | 8 ++++++-- mfs/inode.go | 9 --------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 2532b861b9..51a00bd48b 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -48,7 +48,11 @@ func NewDirectory(ctx context.Context, name string, node ipld.Node, parent child } return &Directory{ - inode: NewInode(name, parent, dserv), + inode: &inode{ + name: name, + parent: parent, + dagService: dserv, + }, ctx: ctx, unixfsDir: db, childDirs: make(map[string]*Directory), diff --git a/mfs/file.go b/mfs/file.go index 86e00713b4..00f4834481 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -28,8 +28,12 @@ type File struct { // Cid version is non-zero RawLeaves will be enabled. func NewFile(name string, node ipld.Node, parent childCloser, dserv ipld.DAGService) (*File, error) { fi := &File{ - inode: NewInode(name, parent, dserv), - node: node, + inode: &inode{ + name: name, + parent: parent, + dagService: dserv, + }, + node: node, } if node.Cid().Prefix().Version > 0 { fi.RawLeaves = true diff --git a/mfs/inode.go b/mfs/inode.go index e2b591cb38..f0330a222b 100644 --- a/mfs/inode.go +++ b/mfs/inode.go @@ -19,12 +19,3 @@ type inode struct { // of the file or directory the `inode` belongs to. dagService ipld.DAGService } - -// NewInode creates a new `inode` structure and return it's pointer. -func NewInode(name string, parent childCloser, dagService ipld.DAGService) *inode { - return &inode{ - name: name, - parent: parent, - dagService: dagService, - } -} From 7babe52bdadc118847ed33881c3e0a6726fee6bd Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 11 Dec 2018 12:45:52 -0800 Subject: [PATCH 2463/3147] avoid unecessary indirection This commit was moved from ipfs/go-mfs@ec0acc9eae643b3694dac17bf88c4ff298a825ab --- mfs/dir.go | 4 ++-- mfs/file.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 51a00bd48b..e42400a35e 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -22,7 +22,7 @@ var ErrInvalidChild = errors.New("invalid child node") var ErrDirExists = errors.New("directory already has entry by that name") type Directory struct { - *inode + inode childDirs map[string]*Directory files map[string]*File @@ -48,7 +48,7 @@ func NewDirectory(ctx context.Context, name string, node ipld.Node, parent child } return &Directory{ - inode: &inode{ + inode: inode{ name: name, parent: parent, dagService: dserv, diff --git a/mfs/file.go b/mfs/file.go index 00f4834481..e0be550893 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -14,7 +14,7 @@ import ( ) type File struct { - *inode + inode desclock sync.RWMutex @@ -28,7 +28,7 @@ type File struct { // Cid version is non-zero RawLeaves will be enabled. func NewFile(name string, node ipld.Node, parent childCloser, dserv ipld.DAGService) (*File, error) { fi := &File{ - inode: &inode{ + inode: inode{ name: name, parent: parent, dagService: dserv, From 040dc65c17ddfd95c769332e89f701d571344c52 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 31 Oct 2018 11:37:33 -0300 Subject: [PATCH 2464/3147] documentation notes This commit was moved from ipfs/go-mfs@0167a27fc5cce23a6b5f2efa18c3f2d597a0c9a6 --- mfs/README.md | 11 +++++++++++ mfs/dir.go | 37 +++++++++++++++++++++++++++++++++++++ mfs/fd.go | 16 ++++++++++++++++ mfs/file.go | 31 +++++++++++++++++++++++++++++++ mfs/ops.go | 17 +++++++++++++++++ mfs/system.go | 38 ++++++++++++++++++++++++++++++++++---- 6 files changed, 146 insertions(+), 4 deletions(-) diff --git a/mfs/README.md b/mfs/README.md index d8247a5b6e..86c9d9b5d4 100644 --- a/mfs/README.md +++ b/mfs/README.md @@ -33,6 +33,17 @@ import "github.com/ipfs/go-mfs" Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-mfs) +## Repository Structure +This repository contains many files, all belonging to the root `mfs` package. + +* `file.go`: MFS `File`. +* `dir.go`: MFS `Directory`. +* `fd.go`: `FileDescriptor` used to operate on `File`s. +* `ops.go`: Functions that do not belong to either `File` nor `Directory` (although they mostly operate on them) that contain common operations to the MFS, e.g., find, move, add a file, make a directory. +* `system.go`: Made up of two parts, the MFS `Root` and the `Republisher`. +* `mfs_test.go`: General tests (needs a [revision](https://github.com/ipfs/go-mfs/issues/9)). +* `repub_test.go`: Republisher-specific tests (contains only the `TestRepublisher` function). + ## Contribute PRs accepted. diff --git a/mfs/dir.go b/mfs/dir.go index e42400a35e..0b93aa997e 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -21,13 +21,20 @@ var ErrNotYetImplemented = errors.New("not yet implemented") var ErrInvalidChild = errors.New("invalid child node") var ErrDirExists = errors.New("directory already has entry by that name") +// TODO: There's too much functionality associated with this structure, +// let's organize it (and if possible extract part of it elsewhere) +// and document the main features of `Directory` here. type Directory struct { inode + // Cache. + // TODO: Should this be a single cache of `FSNode`s? childDirs map[string]*Directory files map[string]*File lock sync.Mutex + // TODO: What content is being protected here exactly? The entire directory? + ctx context.Context // UnixFS directory implementation used for creating, @@ -73,12 +80,24 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { // closeChild updates the child by the given name to the dag node 'nd' // and changes its own dag node +// `sync` (alias `fullsync`): has two uses, propagate the update upwards +// (in which case we wouldn't want this?) and in `closeChildUpdate`. +// TODO: Find *all* the places where `sync`/`fullsync` is evaluated. func (d *Directory) closeChild(name string, nd ipld.Node, sync bool) error { + + // There's a local flush (`closeChildUpdate`) and a propagated flush (`closeChild`). + mynd, err := d.closeChildUpdate(name, nd, sync) if err != nil { return err } + // TODO: The `sync` seems to be tightly coupling this two pieces of code, + // we use the node returned by `closeChildUpdate` (which entails a copy) + // only if `sync` is set, and we are discarding it otherwise. At the very + // least the `if sync {` clause at the end of `closeChildUpdate` should + // be merged with this one. + if sync { return d.parent.closeChild(d.name, mynd, true) } @@ -86,10 +105,22 @@ func (d *Directory) closeChild(name string, nd ipld.Node, sync bool) error { } // closeChildUpdate is the portion of closeChild that needs to be locked around +// TODO: Definitely document this. +// Updates the child entry under `name` with the node `nd` and if `sync` +// is set it "flushes" the node (adding it to the `DAGService`) that +// represents this directory. +// TODO: As mentioned elsewhere "flush" sometimes means persist the node in the +// DAG service and other update the parent node pointing to it. +// +// So, calling this with `sync`/`fullsync` off (this is pretty much the only +// place where `fullsync` seems to matter) will just update the file entry in +// this directory without updating the parent and without saving the node. func (d *Directory) closeChildUpdate(name string, nd ipld.Node, sync bool) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() + // TODO: Clearly define how are we propagating changes to lower layers + // like UnixFS. err := d.updateChild(name, nd) if err != nil { return nil, err @@ -118,6 +149,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { } return pbnd.Copy().(*dag.ProtoNode), nil + // TODO: Why do we need a copy? } func (d *Directory) updateChild(name string, nd ipld.Node) error { @@ -200,6 +232,8 @@ func (d *Directory) Uncache(name string) { defer d.lock.Unlock() delete(d.files, name) delete(d.childDirs, name) + // TODO: We definitely need to join these maps if we are manipulating + // them like this. } // childFromDag searches through this directories dag node for a child link @@ -392,6 +426,9 @@ func (d *Directory) AddUnixFSChild(name string, node ipld.Node) error { return nil } +// TODO: Difference between `sync` and `Flush`? This seems +// to be related to the internal cache and not to the MFS +// hierarchy update. func (d *Directory) sync() error { for name, dir := range d.childDirs { nd, err := dir.GetNode() diff --git a/mfs/fd.go b/mfs/fd.go index fd4351b1a5..45a715877b 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -9,6 +9,12 @@ import ( context "context" ) +// One `File` can have many `FileDescriptor`s associated to it +// (only one if it's RW, many if they are RO, see `File.desclock`). +// A `FileDescriptor` contains the "view" of the file (through an +// instance of a `DagModifier`), that's why it (and not the `File`) +// has the responsibility to `Flush` (which crystallizes that view +// in the `File`'s `Node`). type FileDescriptor interface { io.Reader CtxReadFull(context.Context, []byte) (int, error) @@ -32,6 +38,7 @@ type fileDescriptor struct { sync bool hasChanges bool + // TODO: Where is this variable set? closed bool } @@ -84,6 +91,7 @@ func (fi *fileDescriptor) Close() error { case OpenWriteOnly, OpenReadWrite: fi.inode.desclock.Unlock() } + // TODO: `closed` should be set here. }() if fi.closed { @@ -106,6 +114,8 @@ func (fi *fileDescriptor) Close() error { return nil } +// TODO: Who uses `Sync` and who `Flush`? Do the consumers of this API +// know about the (undocumented) `fullsync` argument? func (fi *fileDescriptor) Sync() error { return fi.flushUp(false) } @@ -116,6 +126,9 @@ func (fi *fileDescriptor) Flush() error { // flushUp syncs the file and adds it to the dagservice // it *must* be called with the File's lock taken +// TODO: What is `fullsync`? Propagate the changes upward +// to the root flushing every node in the path (the "up" +// part of `flushUp`). func (fi *fileDescriptor) flushUp(fullsync bool) error { nd, err := fi.mod.GetNode() if err != nil { @@ -129,9 +142,12 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { fi.inode.nodelk.Lock() fi.inode.node = nd + // TODO: Create a `SetNode` method. name := fi.inode.name parent := fi.inode.parent + // TODO: Can the parent be modified? Do we need to do this inside the lock? fi.inode.nodelk.Unlock() + // TODO: Maybe all this logic should happen in `File`. return parent.closeChild(name, nd, fullsync) } diff --git a/mfs/file.go b/mfs/file.go index e0be550893..2c6912551b 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -13,12 +13,22 @@ import ( ipld "github.com/ipfs/go-ipld-format" ) +// File represents a file in the MFS, its logic its mainly targeted +// to coordinating (potentially many) `FileDescriptor`s pointing to +// it. type File struct { inode + // Lock to coordinate the `FileDescriptor`s associated to this file. desclock sync.RWMutex + // This isn't any node, it's the root node that represents the + // entire DAG of nodes that comprise the file. + // TODO: Rename, there should be an explicit term for these root nodes + // of a particular sub-DAG that abstract an upper layer's entity. node ipld.Node + + // TODO: Rename. nodelk sync.Mutex RawLeaves bool @@ -52,6 +62,10 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { node := fi.node fi.nodelk.Unlock() + // TODO: Move this `switch` logic outside (maybe even + // to another package, this seems like a job of UnixFS), + // `NewDagModifier` uses the IPLD node, we're not + // extracting anything just doing a safety check. switch node := node.(type) { case *dag.ProtoNode: fsn, err := ft.FSNodeFromBytes(node.Data()) @@ -82,6 +96,8 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { } dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dagService, chunker.DefaultSplitter) + // TODO: Remove the use of the `chunker` package here, add a new `NewDagModifier` in + // `go-unixfs` with the `DefaultSplitter` already included. if err != nil { return nil, err } @@ -96,6 +112,11 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { } // Size returns the size of this file +// TODO: Should we be providing this API? +// TODO: There's already a `FileDescriptor.Size()` that +// through the `DagModifier`'s `fileSize` function is doing +// pretty much the same thing as here, we should at least call +// that function and wrap the `ErrNotUnixfs` with an MFS text. func (fi *File) Size() (int64, error) { fi.nodelk.Lock() defer fi.nodelk.Unlock() @@ -114,12 +135,21 @@ func (fi *File) Size() (int64, error) { } // GetNode returns the dag node associated with this file +// TODO: Use this method and do not access the `nodelk` directly anywhere else. func (fi *File) GetNode() (ipld.Node, error) { fi.nodelk.Lock() defer fi.nodelk.Unlock() return fi.node, nil } +// TODO: Tight coupling with the `FileDescriptor`, at the +// very least this should be an independent function that +// takes a `File` argument and automates the open/flush/close +// operations. +// TODO: Why do we need to flush a file that isn't opened? +// (the `OpenWriteOnly` seems to implicitly be targeting a +// closed file, a file we forgot to flush? can we close +// a file without flushing?) func (fi *File) Flush() error { // open the file in fullsync mode fd, err := fi.Open(OpenWriteOnly, true) @@ -134,6 +164,7 @@ func (fi *File) Flush() error { func (fi *File) Sync() error { // just being able to take the writelock means the descriptor is synced + // TODO: Why? fi.desclock.Lock() fi.desclock.Unlock() return nil diff --git a/mfs/ops.go b/mfs/ops.go index 656b8dff91..dc3da4ca24 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -12,7 +12,13 @@ import ( ipld "github.com/ipfs/go-ipld-format" ) +// TODO: Evaluate moving all this operations to as `Root` +// methods, since all of them use it as its first argument +// and there is no clear documentation that explains this +// separation. + // Mv moves the file or directory at 'src' to 'dst' +// TODO: Document what the strings 'src' and 'dst' represent. func Mv(r *Root, src, dst string) error { srcDir, srcFname := gopath.Split(src) @@ -83,6 +89,15 @@ func lookupDir(r *Root, path string) (*Directory, error) { } // PutNode inserts 'nd' at 'path' in the given mfs +// TODO: Rename or clearly document that this is not about nodes but actually +// MFS files/directories (that in the underlying representation can be +// considered as just nodes). +// TODO: Document why are we handling IPLD nodes in the first place when we +// are actually referring to files/directories (that is, it can't be any +// node, it has to have a specific format). +// TODO: Can this function add directories or just files? What would be the +// difference between adding a directory with this method and creating it +// with `Mkdir`. func PutNode(r *Root, path string, nd ipld.Node) error { dirp, filename := gopath.Split(path) if filename == "" { @@ -207,6 +222,8 @@ func DirLookup(d *Directory, pth string) (FSNode, error) { return cur, nil } +// TODO: Document this function and link its functionality +// with the republisher. func FlushPath(rt *Root, pth string) error { nd, err := Lookup(rt, pth) if err != nil { diff --git a/mfs/system.go b/mfs/system.go index cc66aa91e0..d7c103e796 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -1,4 +1,5 @@ // package mfs implements an in memory model of a mutable IPFS filesystem. +// TODO: Develop on this line (and move it elsewhere), delete the rest. // // It consists of four main structs: // 1) The Filesystem @@ -24,12 +25,23 @@ import ( logging "github.com/ipfs/go-log" ) +// TODO: Remove if not used. var ErrNotExist = errors.New("no such rootfs") var log = logging.Logger("mfs") +// TODO: Remove if not used. var ErrIsDirectory = errors.New("error: is a directory") +// TODO: Rename (avoid "close" terminology, if anything +// we are persisting/flushing changes). +// This is always a directory (since we are referring to the parent), +// can be an intermediate directory in the filesystem or the `Root`. +// TODO: What is `fullsync`? (unnamed `bool` argument) +// TODO: There are two types of persistence/flush that need to be +// distinguished here, one at the DAG level (when I store the modified +// nodes in the DAG service) and one in the UnixFS/MFS level (when I modify +// the entry/link of the directory that pointed to the modified node). type childCloser interface { closeChild(string, ipld.Node, bool) error } @@ -41,7 +53,8 @@ const ( TDir ) -// FSNode represents any node (directory, root, or file) in the mfs filesystem. +// FSNode represents any node (directory, or file) in the MFS filesystem. +// Not to be confused with the `unixfs.FSNode`. type FSNode interface { GetNode() (ipld.Node, error) Flush() error @@ -67,9 +80,6 @@ type Root struct { repub *Republisher } -// PubFunc is the function used by the `publish()` method. -type PubFunc func(context.Context, cid.Cid) error - // NewRoot creates a new Root and starts up a republisher routine for it. func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf PubFunc) (*Root, error) { @@ -87,6 +97,7 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf fsn, err := ft.FSNodeFromBytes(node.Data()) if err != nil { log.Error("IPNS pointer was not unixfs node") + // TODO: IPNS pointer? return nil, err } @@ -100,6 +111,8 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf root.dir = newDir case ft.TFile, ft.TMetadata, ft.TRaw: return nil, fmt.Errorf("root can't be a file (unixfs type: %s)", fsn.Type()) + // TODO: This special error reporting case doesn't seem worth it, we either + // have a UnixFS directory or we don't. default: return nil, fmt.Errorf("unrecognized unixfs type: %s", fsn.Type()) } @@ -113,6 +126,7 @@ func (kr *Root) GetDirectory() *Directory { // Flush signals that an update has occurred since the last publish, // and updates the Root republisher. +// TODO: We are definitely abusing the "flush" terminology here. func (kr *Root) Flush() error { nd, err := kr.GetDirectory().GetNode() if err != nil { @@ -133,6 +147,8 @@ func (kr *Root) Flush() error { // may have unintended racy side effects. // A better implemented mfs system (one that does smarter internal caching and // refcounting) shouldnt need this method. +// TODO: Review the motivation behind this method once the cache system is +// refactored. func (kr *Root) FlushMemFree(ctx context.Context) error { dir := kr.GetDirectory() @@ -142,18 +158,25 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { dir.lock.Lock() defer dir.lock.Unlock() + for name := range dir.files { delete(dir.files, name) } for name := range dir.childDirs { delete(dir.childDirs, name) } + // TODO: Can't we just create new maps? return nil } // closeChild implements the childCloser interface, and signals to the publisher that // there are changes ready to be published. +// This is the only thing that separates a `Root` from a `Directory`. +// TODO: Evaluate merging both. +// TODO: The `sync` argument isn't used here (we've already reached +// the top), document it and maybe make it an anonymous variable (if +// that's possible). func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { err := kr.GetDirectory().dagService.Add(context.TODO(), nd) if err != nil { @@ -180,6 +203,11 @@ func (kr *Root) Close() error { return nil } +// TODO: Separate the remaining code in another file: `repub.go`. + +// PubFunc is the function used by the `publish()` method. +type PubFunc func(context.Context, cid.Cid) error + // Republisher manages when to publish a given entry. type Republisher struct { TimeoutLong time.Duration @@ -250,6 +278,8 @@ func (np *Republisher) Update(c cid.Cid) { } // Run is the main republisher loop. +// TODO: Document according to: +// https://github.com/ipfs/go-ipfs/issues/5092#issuecomment-398524255. func (np *Republisher) Run() { for { select { From d21436a80c30a282a5881f80bdf2b69f0bbdea4f Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 16 Dec 2018 13:25:24 -0300 Subject: [PATCH 2465/3147] add a `child` structure Unify the `string`/`ipld.Node` information a parent has about its children when updating a modified entry. This will be used to simplify the code around the `childCloser` interface and related logic. This commit was moved from ipfs/go-mfs@32ca97a1a6878236ea20bd4ce11413db596ce49f --- mfs/system.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mfs/system.go b/mfs/system.go index d7c103e796..83325679e7 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -33,6 +33,15 @@ var log = logging.Logger("mfs") // TODO: Remove if not used. var ErrIsDirectory = errors.New("error: is a directory") +// The information that an MFS `Directory` has about its children +// when updating one of its entries: when a child mutates it signals +// its parent directory to update its entry (under `Name`) with the +// new content (in `Node`). +type child struct { + Name string + Node ipld.Node +} + // TODO: Rename (avoid "close" terminology, if anything // we are persisting/flushing changes). // This is always a directory (since we are referring to the parent), From 3c4791d0ab95ce6075d2859de7d973ec75cadeac Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 16 Dec 2018 13:47:43 -0300 Subject: [PATCH 2466/3147] use new `child` structure Use newly introduced `child` structure whenever the logically tied `string`/`ipld.Node` pair was used to represent a child entry in a directory operation. This commit was moved from ipfs/go-mfs@54062f44a4af9c4aa78699a4e6d7fb8862b7627b --- mfs/dir.go | 30 +++++++++++++++--------------- mfs/fd.go | 2 +- mfs/system.go | 8 ++++---- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 0b93aa997e..4a82a1939b 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -35,7 +35,7 @@ type Directory struct { lock sync.Mutex // TODO: What content is being protected here exactly? The entire directory? - ctx context.Context + ctx context.Context // UnixFS directory implementation used for creating, // reading and editing directories. @@ -83,11 +83,11 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { // `sync` (alias `fullsync`): has two uses, propagate the update upwards // (in which case we wouldn't want this?) and in `closeChildUpdate`. // TODO: Find *all* the places where `sync`/`fullsync` is evaluated. -func (d *Directory) closeChild(name string, nd ipld.Node, sync bool) error { +func (d *Directory) closeChild(c child, sync bool) error { // There's a local flush (`closeChildUpdate`) and a propagated flush (`closeChild`). - mynd, err := d.closeChildUpdate(name, nd, sync) + mynd, err := d.closeChildUpdate(c, sync) if err != nil { return err } @@ -99,7 +99,7 @@ func (d *Directory) closeChild(name string, nd ipld.Node, sync bool) error { // be merged with this one. if sync { - return d.parent.closeChild(d.name, mynd, true) + return d.parent.closeChild(child{d.name, mynd}, true) } return nil } @@ -115,13 +115,13 @@ func (d *Directory) closeChild(name string, nd ipld.Node, sync bool) error { // So, calling this with `sync`/`fullsync` off (this is pretty much the only // place where `fullsync` seems to matter) will just update the file entry in // this directory without updating the parent and without saving the node. -func (d *Directory) closeChildUpdate(name string, nd ipld.Node, sync bool) (*dag.ProtoNode, error) { +func (d *Directory) closeChildUpdate(c child, sync bool) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() // TODO: Clearly define how are we propagating changes to lower layers // like UnixFS. - err := d.updateChild(name, nd) + err := d.updateChild(c) if err != nil { return nil, err } @@ -152,8 +152,8 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { // TODO: Why do we need a copy? } -func (d *Directory) updateChild(name string, nd ipld.Node) error { - err := d.AddUnixFSChild(name, nd) +func (d *Directory) updateChild(c child) error { + err := d.AddUnixFSChild(c) if err != nil { return err } @@ -346,7 +346,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - err = d.AddUnixFSChild(name, ndir) + err = d.AddUnixFSChild(child{name, ndir}) if err != nil { return nil, err } @@ -376,7 +376,7 @@ func (d *Directory) Flush() error { return err } - return d.parent.closeChild(d.name, nd, true) + return d.parent.closeChild(child{d.name, nd}, true) } // AddChild adds the node 'nd' under this directory giving it the name 'name' @@ -394,7 +394,7 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return err } - err = d.AddUnixFSChild(name, nd) + err = d.AddUnixFSChild(child{name, nd}) if err != nil { return err } @@ -405,7 +405,7 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { // AddUnixFSChild adds a child to the inner UnixFS directory // and transitions to a HAMT implementation if needed. -func (d *Directory) AddUnixFSChild(name string, node ipld.Node) error { +func (d *Directory) AddUnixFSChild(c child) error { if uio.UseHAMTSharding { // If the directory HAMT implementation is being used and this // directory is actually a basic implementation switch it to HAMT. @@ -418,7 +418,7 @@ func (d *Directory) AddUnixFSChild(name string, node ipld.Node) error { } } - err := d.unixfsDir.AddChild(d.ctx, name, node) + err := d.unixfsDir.AddChild(d.ctx, c.Name, c.Node) if err != nil { return err } @@ -436,7 +436,7 @@ func (d *Directory) sync() error { return err } - err = d.updateChild(name, nd) + err = d.updateChild(child{name, nd}) if err != nil { return err } @@ -448,7 +448,7 @@ func (d *Directory) sync() error { return err } - err = d.updateChild(name, nd) + err = d.updateChild(child{name, nd}) if err != nil { return err } diff --git a/mfs/fd.go b/mfs/fd.go index 45a715877b..7bcc15efb6 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -149,7 +149,7 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { fi.inode.nodelk.Unlock() // TODO: Maybe all this logic should happen in `File`. - return parent.closeChild(name, nd, fullsync) + return parent.closeChild(child{name, nd}, fullsync) } // Seek implements io.Seeker diff --git a/mfs/system.go b/mfs/system.go index 83325679e7..d56b87ee28 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -52,7 +52,7 @@ type child struct { // nodes in the DAG service) and one in the UnixFS/MFS level (when I modify // the entry/link of the directory that pointed to the modified node). type childCloser interface { - closeChild(string, ipld.Node, bool) error + closeChild(child, bool) error } type NodeType int @@ -186,14 +186,14 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { // TODO: The `sync` argument isn't used here (we've already reached // the top), document it and maybe make it an anonymous variable (if // that's possible). -func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { - err := kr.GetDirectory().dagService.Add(context.TODO(), nd) +func (kr *Root) closeChild(c child, sync bool) error { + err := kr.GetDirectory().dagService.Add(context.TODO(), c.Node) if err != nil { return err } if kr.repub != nil { - kr.repub.Update(nd.Cid()) + kr.repub.Update(c.Node.Cid()) } return nil } From f28dd6f67c2cac52109841e745dd4f3374da1683 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 16 Dec 2018 14:06:23 -0300 Subject: [PATCH 2467/3147] rename the `childCloser` interface Rename the `childCloser` interface to `mutableParent` to better reflect the fact that the structures that implement it (`Directory` and `Root`) have the function of parents in the MFS hierarchy. Rename also the method of the interface from `closeChild` to `updateChildEntry` shifting the focus away from in which circumstance is the method being called (when closing a child) to actually what operation is being performed by the method (updating an entry in the parent to the new content). This commit was moved from ipfs/go-mfs@e87a272a8780e1f2ed784ffd33a18030316ad6ed --- mfs/dir.go | 18 +++++++++--------- mfs/fd.go | 2 +- mfs/file.go | 2 +- mfs/inode.go | 2 +- mfs/system.go | 26 ++++++++++++++++++-------- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 4a82a1939b..31c8848360 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -48,7 +48,7 @@ type Directory struct { // // You probably don't want to call this directly. Instead, construct a new root // using NewRoot. -func NewDirectory(ctx context.Context, name string, node ipld.Node, parent childCloser, dserv ipld.DAGService) (*Directory, error) { +func NewDirectory(ctx context.Context, name string, node ipld.Node, parent mutableParent, dserv ipld.DAGService) (*Directory, error) { db, err := uio.NewDirectoryFromNode(dserv, node) if err != nil { return nil, err @@ -78,16 +78,16 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { d.unixfsDir.SetCidBuilder(b) } -// closeChild updates the child by the given name to the dag node 'nd' +// updateChildEntry updates the child by the given name to the dag node 'nd' // and changes its own dag node // `sync` (alias `fullsync`): has two uses, propagate the update upwards // (in which case we wouldn't want this?) and in `closeChildUpdate`. // TODO: Find *all* the places where `sync`/`fullsync` is evaluated. -func (d *Directory) closeChild(c child, sync bool) error { +func (d *Directory) updateChildEntry(c child, fullSync bool) error { - // There's a local flush (`closeChildUpdate`) and a propagated flush (`closeChild`). + // There's a local flush (`closeChildUpdate`) and a propagated flush (`updateChildEntry`). - mynd, err := d.closeChildUpdate(c, sync) + mynd, err := d.closeChildUpdate(c, fullSync) if err != nil { return err } @@ -98,13 +98,13 @@ func (d *Directory) closeChild(c child, sync bool) error { // least the `if sync {` clause at the end of `closeChildUpdate` should // be merged with this one. - if sync { - return d.parent.closeChild(child{d.name, mynd}, true) + if fullSync { + return d.parent.updateChildEntry(child{d.name, mynd}, true) } return nil } -// closeChildUpdate is the portion of closeChild that needs to be locked around +// closeChildUpdate is the portion of updateChildEntry that needs to be locked around // TODO: Definitely document this. // Updates the child entry under `name` with the node `nd` and if `sync` // is set it "flushes" the node (adding it to the `DAGService`) that @@ -376,7 +376,7 @@ func (d *Directory) Flush() error { return err } - return d.parent.closeChild(child{d.name, nd}, true) + return d.parent.updateChildEntry(child{d.name, nd}, true) } // AddChild adds the node 'nd' under this directory giving it the name 'name' diff --git a/mfs/fd.go b/mfs/fd.go index 7bcc15efb6..d4a767c32d 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -149,7 +149,7 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { fi.inode.nodelk.Unlock() // TODO: Maybe all this logic should happen in `File`. - return parent.closeChild(child{name, nd}, fullsync) + return parent.updateChildEntry(child{name, nd}, fullsync) } // Seek implements io.Seeker diff --git a/mfs/file.go b/mfs/file.go index 2c6912551b..43713925e8 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -36,7 +36,7 @@ type File struct { // NewFile returns a NewFile object with the given parameters. If the // Cid version is non-zero RawLeaves will be enabled. -func NewFile(name string, node ipld.Node, parent childCloser, dserv ipld.DAGService) (*File, error) { +func NewFile(name string, node ipld.Node, parent mutableParent, dserv ipld.DAGService) (*File, error) { fi := &File{ inode: inode{ name: name, diff --git a/mfs/inode.go b/mfs/inode.go index f0330a222b..8f65672aa7 100644 --- a/mfs/inode.go +++ b/mfs/inode.go @@ -13,7 +13,7 @@ type inode struct { name string // parent directory of this `inode` (which may be the `Root`). - parent childCloser + parent mutableParent // dagService used to store modifications made to the contents // of the file or directory the `inode` belongs to. diff --git a/mfs/system.go b/mfs/system.go index d56b87ee28..32940fd7a7 100644 --- a/mfs/system.go +++ b/mfs/system.go @@ -42,17 +42,25 @@ type child struct { Node ipld.Node } -// TODO: Rename (avoid "close" terminology, if anything -// we are persisting/flushing changes). -// This is always a directory (since we are referring to the parent), -// can be an intermediate directory in the filesystem or the `Root`. +// This interface represents the basic property of MFS directories of updating +// children entries with modified content. Implemented by both the MFS +// `Directory` and `Root` (which is basically a `Directory` with republishing +// support). +// // TODO: What is `fullsync`? (unnamed `bool` argument) // TODO: There are two types of persistence/flush that need to be // distinguished here, one at the DAG level (when I store the modified // nodes in the DAG service) and one in the UnixFS/MFS level (when I modify // the entry/link of the directory that pointed to the modified node). -type childCloser interface { - closeChild(child, bool) error +type mutableParent interface { + // Method called by a child to its parent to signal to update the content + // pointed to in the entry by that child's name. The child sends as + // arguments its own information (under the `child` structure) and a flag + // (`fullsync`) indicating whether or not to propagate the update upwards: + // modifying a directory entry entails modifying its contents which means + // that its parent (the parent's parent) will also need to be updated (and + // so on). + updateChildEntry(c child, fullSync bool) error } type NodeType int @@ -179,18 +187,20 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { return nil } -// closeChild implements the childCloser interface, and signals to the publisher that +// updateChildEntry implements the mutableParent interface, and signals to the publisher that // there are changes ready to be published. // This is the only thing that separates a `Root` from a `Directory`. // TODO: Evaluate merging both. // TODO: The `sync` argument isn't used here (we've already reached // the top), document it and maybe make it an anonymous variable (if // that's possible). -func (kr *Root) closeChild(c child, sync bool) error { +func (kr *Root) updateChildEntry(c child, fullSync bool) error { err := kr.GetDirectory().dagService.Add(context.TODO(), c.Node) if err != nil { return err } + // TODO: Why are we not using the inner directory lock nor + // applying the same procedure as `Directory.updateChildEntry`? if kr.repub != nil { kr.repub.Update(c.Node.Cid()) From 484df5468a8726ed1331211eb1f38150871e53d4 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 16 Dec 2018 14:59:49 -0300 Subject: [PATCH 2468/3147] document code around `Directory.updateChildEntry` This commit was moved from ipfs/go-mfs@ef5e1192db40164649f73fa4acd212eb9a45b366 --- mfs/dir.go | 58 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 31c8848360..b3c8b33228 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -78,16 +78,20 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { d.unixfsDir.SetCidBuilder(b) } -// updateChildEntry updates the child by the given name to the dag node 'nd' -// and changes its own dag node -// `sync` (alias `fullsync`): has two uses, propagate the update upwards -// (in which case we wouldn't want this?) and in `closeChildUpdate`. -// TODO: Find *all* the places where `sync`/`fullsync` is evaluated. +// This method implements the `mutableParent` interface. It first updates +// the child entry in the underlying UnixFS directory and then if `fullSync` +// is set it saves the new content through the internal DAG service. Then, +// also if `fullSync` is set, it propagates the update to its parent (through +// this same interface) with the new node already updated with the new entry. +// So, `fullSync` entails operations at two different layers: +// 1. DAG: save the newly created directory node with the updated entry. +// 2. MFS: propagate the update upwards repeating the whole process in the +// parent. func (d *Directory) updateChildEntry(c child, fullSync bool) error { // There's a local flush (`closeChildUpdate`) and a propagated flush (`updateChildEntry`). - mynd, err := d.closeChildUpdate(c, fullSync) + newDirNode, err := d.closeChildUpdate(c, fullSync) if err != nil { return err } @@ -96,42 +100,43 @@ func (d *Directory) updateChildEntry(c child, fullSync bool) error { // we use the node returned by `closeChildUpdate` (which entails a copy) // only if `sync` is set, and we are discarding it otherwise. At the very // least the `if sync {` clause at the end of `closeChildUpdate` should - // be merged with this one. + // be merged with this one (the use of the `lock` is stopping this at the + // moment, re-evaluate when its purpose has been better understood). if fullSync { - return d.parent.updateChildEntry(child{d.name, mynd}, true) + return d.parent.updateChildEntry(child{d.name, newDirNode}, true) + // Setting `fullSync` to true here means, if the original child that + // initiated the update process wanted to propagate it upwards then + // continue to do so all the way up to the root, that is, the only + // time `fullSync` can be false is in the first call (which will be + // the *only* call), we either update the first parent entry or *all* + // the parent's. } + return nil } -// closeChildUpdate is the portion of updateChildEntry that needs to be locked around -// TODO: Definitely document this. -// Updates the child entry under `name` with the node `nd` and if `sync` -// is set it "flushes" the node (adding it to the `DAGService`) that -// represents this directory. -// TODO: As mentioned elsewhere "flush" sometimes means persist the node in the -// DAG service and other update the parent node pointing to it. -// -// So, calling this with `sync`/`fullsync` off (this is pretty much the only -// place where `fullsync` seems to matter) will just update the file entry in -// this directory without updating the parent and without saving the node. -func (d *Directory) closeChildUpdate(c child, sync bool) (*dag.ProtoNode, error) { +// This method implements the part of `updateChildEntry` that needs +// to be locked around: in charge of updating the UnixFS layer and +// generating the new node reflecting the update. +func (d *Directory) closeChildUpdate(c child, fullSync bool) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() - // TODO: Clearly define how are we propagating changes to lower layers - // like UnixFS. err := d.updateChild(c) if err != nil { return nil, err } + // TODO: Clearly define how are we propagating changes to lower layers + // like UnixFS. - if sync { + if fullSync { return d.flushCurrentNode() } return nil, nil } +// Recreate the underlying UnixFS directory node and save it in the DAG layer. func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { nd, err := d.unixfsDir.GetNode() if err != nil { @@ -142,16 +147,23 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { if err != nil { return nil, err } + // TODO: This method is called in `closeChildUpdate` while the lock is + // taken, we need the lock while operating on `unixfsDir` to create the + // new node but do we also need to keep the lock while adding it to the + // DAG service? Evaluate refactoring these two methods together and better + // redistributing the node. pbnd, ok := nd.(*dag.ProtoNode) if !ok { return nil, dag.ErrNotProtobuf } + // TODO: Why do we check the node *after* adding it to the DAG service? return pbnd.Copy().(*dag.ProtoNode), nil // TODO: Why do we need a copy? } +// Update child entry in the underlying UnixFS directory. func (d *Directory) updateChild(c child) error { err := d.AddUnixFSChild(c) if err != nil { From 25b91e030f375e884af370b597dfa4c9643bbd73 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 16 Dec 2018 15:06:48 -0300 Subject: [PATCH 2469/3147] move `Republisher` to a separate file Extract the `Republisher` structure and related logic from `system.go` (leaving that file mainly with the `Root` logic, and hence now renamed as `root.go`) to a new `repub.go` file. Even though the MFS root has support for republishing updates the logic behind those two structures is mostly decoupled, that should be reflected in the source code organization. This commit was moved from ipfs/go-mfs@8539b814f6e3b863062dd43fccd988ebb34a1110 --- mfs/README.md | 3 +- mfs/repub.go | 135 +++++++++++++++++++++++++++++++++++ mfs/{system.go => root.go} | 141 +------------------------------------ 3 files changed, 139 insertions(+), 140 deletions(-) create mode 100644 mfs/repub.go rename mfs/{system.go => root.go} (64%) diff --git a/mfs/README.md b/mfs/README.md index 86c9d9b5d4..084c74919f 100644 --- a/mfs/README.md +++ b/mfs/README.md @@ -40,7 +40,8 @@ This repository contains many files, all belonging to the root `mfs` package. * `dir.go`: MFS `Directory`. * `fd.go`: `FileDescriptor` used to operate on `File`s. * `ops.go`: Functions that do not belong to either `File` nor `Directory` (although they mostly operate on them) that contain common operations to the MFS, e.g., find, move, add a file, make a directory. -* `system.go`: Made up of two parts, the MFS `Root` and the `Republisher`. +* `root.go`: MFS `Root` (a `Directory` with republishing support). +* `repub.go`: `Republisher`. * `mfs_test.go`: General tests (needs a [revision](https://github.com/ipfs/go-mfs/issues/9)). * `repub_test.go`: Republisher-specific tests (contains only the `TestRepublisher` function). diff --git a/mfs/repub.go b/mfs/repub.go new file mode 100644 index 0000000000..3ffcb9758f --- /dev/null +++ b/mfs/repub.go @@ -0,0 +1,135 @@ +package mfs + +import ( + "context" + "sync" + "time" + + cid "github.com/ipfs/go-cid" +) + +// PubFunc is the function used by the `publish()` method. +type PubFunc func(context.Context, cid.Cid) error + +// Republisher manages when to publish a given entry. +type Republisher struct { + TimeoutLong time.Duration + TimeoutShort time.Duration + Publish chan struct{} + pubfunc PubFunc + pubnowch chan chan struct{} + + ctx context.Context + cancel func() + + lk sync.Mutex + val cid.Cid + lastpub cid.Cid +} + +// NewRepublisher creates a new Republisher object to republish the given root +// using the given short and long time intervals. +func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { + ctx, cancel := context.WithCancel(ctx) + return &Republisher{ + TimeoutShort: tshort, + TimeoutLong: tlong, + Publish: make(chan struct{}, 1), + pubfunc: pf, + pubnowch: make(chan chan struct{}), + ctx: ctx, + cancel: cancel, + } +} + +func (p *Republisher) setVal(c cid.Cid) { + p.lk.Lock() + defer p.lk.Unlock() + p.val = c +} + +// WaitPub Returns immediately if `lastpub` value is consistent with the +// current value `val`, else will block until `val` has been published. +func (p *Republisher) WaitPub() { + p.lk.Lock() + consistent := p.lastpub == p.val + p.lk.Unlock() + if consistent { + return + } + + wait := make(chan struct{}) + p.pubnowch <- wait + <-wait +} + +func (p *Republisher) Close() error { + err := p.publish(p.ctx) + p.cancel() + return err +} + +// Touch signals that an update has occurred since the last publish. +// Multiple consecutive touches may extend the time period before +// the next Publish occurs in order to more efficiently batch updates. +func (np *Republisher) Update(c cid.Cid) { + np.setVal(c) + select { + case np.Publish <- struct{}{}: + default: + } +} + +// Run is the main republisher loop. +// TODO: Document according to: +// https://github.com/ipfs/go-ipfs/issues/5092#issuecomment-398524255. +func (np *Republisher) Run() { + for { + select { + case <-np.Publish: + quick := time.After(np.TimeoutShort) + longer := time.After(np.TimeoutLong) + + wait: + var pubnowresp chan struct{} + + select { + case <-np.ctx.Done(): + return + case <-np.Publish: + quick = time.After(np.TimeoutShort) + goto wait + case <-quick: + case <-longer: + case pubnowresp = <-np.pubnowch: + } + + err := np.publish(np.ctx) + if pubnowresp != nil { + pubnowresp <- struct{}{} + } + if err != nil { + log.Errorf("republishRoot error: %s", err) + } + + case <-np.ctx.Done(): + return + } + } +} + +// publish calls the `PubFunc`. +func (np *Republisher) publish(ctx context.Context) error { + np.lk.Lock() + topub := np.val + np.lk.Unlock() + + err := np.pubfunc(ctx, topub) + if err != nil { + return err + } + np.lk.Lock() + np.lastpub = topub + np.lk.Unlock() + return nil +} diff --git a/mfs/system.go b/mfs/root.go similarity index 64% rename from mfs/system.go rename to mfs/root.go index 32940fd7a7..d92f1837b7 100644 --- a/mfs/system.go +++ b/mfs/root.go @@ -1,26 +1,17 @@ // package mfs implements an in memory model of a mutable IPFS filesystem. -// TODO: Develop on this line (and move it elsewhere), delete the rest. -// -// It consists of four main structs: -// 1) The Filesystem -// The filesystem serves as a container and entry point for various mfs filesystems -// 2) Root -// Root represents an individual filesystem mounted within the mfs system as a whole -// 3) Directories -// 4) Files +// TODO: Develop on this line (and move it to `doc.go`). + package mfs import ( "context" "errors" "fmt" - "sync" "time" dag "github.com/ipfs/go-merkledag" ft "github.com/ipfs/go-unixfs" - cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" ) @@ -221,131 +212,3 @@ func (kr *Root) Close() error { return nil } - -// TODO: Separate the remaining code in another file: `repub.go`. - -// PubFunc is the function used by the `publish()` method. -type PubFunc func(context.Context, cid.Cid) error - -// Republisher manages when to publish a given entry. -type Republisher struct { - TimeoutLong time.Duration - TimeoutShort time.Duration - Publish chan struct{} - pubfunc PubFunc - pubnowch chan chan struct{} - - ctx context.Context - cancel func() - - lk sync.Mutex - val cid.Cid - lastpub cid.Cid -} - -// NewRepublisher creates a new Republisher object to republish the given root -// using the given short and long time intervals. -func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { - ctx, cancel := context.WithCancel(ctx) - return &Republisher{ - TimeoutShort: tshort, - TimeoutLong: tlong, - Publish: make(chan struct{}, 1), - pubfunc: pf, - pubnowch: make(chan chan struct{}), - ctx: ctx, - cancel: cancel, - } -} - -func (p *Republisher) setVal(c cid.Cid) { - p.lk.Lock() - defer p.lk.Unlock() - p.val = c -} - -// WaitPub Returns immediately if `lastpub` value is consistent with the -// current value `val`, else will block until `val` has been published. -func (p *Republisher) WaitPub() { - p.lk.Lock() - consistent := p.lastpub == p.val - p.lk.Unlock() - if consistent { - return - } - - wait := make(chan struct{}) - p.pubnowch <- wait - <-wait -} - -func (p *Republisher) Close() error { - err := p.publish(p.ctx) - p.cancel() - return err -} - -// Touch signals that an update has occurred since the last publish. -// Multiple consecutive touches may extend the time period before -// the next Publish occurs in order to more efficiently batch updates. -func (np *Republisher) Update(c cid.Cid) { - np.setVal(c) - select { - case np.Publish <- struct{}{}: - default: - } -} - -// Run is the main republisher loop. -// TODO: Document according to: -// https://github.com/ipfs/go-ipfs/issues/5092#issuecomment-398524255. -func (np *Republisher) Run() { - for { - select { - case <-np.Publish: - quick := time.After(np.TimeoutShort) - longer := time.After(np.TimeoutLong) - - wait: - var pubnowresp chan struct{} - - select { - case <-np.ctx.Done(): - return - case <-np.Publish: - quick = time.After(np.TimeoutShort) - goto wait - case <-quick: - case <-longer: - case pubnowresp = <-np.pubnowch: - } - - err := np.publish(np.ctx) - if pubnowresp != nil { - pubnowresp <- struct{}{} - } - if err != nil { - log.Errorf("republishRoot error: %s", err) - } - - case <-np.ctx.Done(): - return - } - } -} - -// publish calls the `PubFunc`. -func (np *Republisher) publish(ctx context.Context) error { - np.lk.Lock() - topub := np.val - np.lk.Unlock() - - err := np.pubfunc(ctx, topub) - if err != nil { - return err - } - np.lk.Lock() - np.lastpub = topub - np.lk.Unlock() - return nil -} From 1a74873444314107ba5d45fab8031b14c60c1b0c Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 16 Dec 2018 20:49:26 -0300 Subject: [PATCH 2470/3147] remove `Sync` from `FileDescriptor` Remove the `Sync()` method from the `FileDescriptor` and also its implementation. Two different undocumented methods in `FileDescriptor` are offered to update the state of the MFS: `Flush()` and `Sync()`, both calling `updateChildEntry`. The only difference (the user is not aware of) is that one sets the `fullSync` argument and the other doesn't, that is, one does a full update of the filesystem and the other just updates the parent directory. This current situation is not clear to the consumer who may use one desiring the effect of the other. As a precautionary measure while redesigning the MFS API one method is removed to simplify its usage. The `Sync()` was chosen as the less "safe" alternative which didn't do a full update of the MFS and also doesn't seem to be used in the `go-ipfs` repository (the main consumer of the `mfs` package). This commit was moved from ipfs/go-mfs@2f52311782f3441d5c871283b6cb3ab4a8545594 --- mfs/fd.go | 20 +++++++++++--------- mfs/mfs_test.go | 6 ------ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/mfs/fd.go b/mfs/fd.go index d4a767c32d..8a27cb57e9 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -27,7 +27,6 @@ type FileDescriptor interface { Truncate(int64) error Size() (int64, error) - Sync() error Flush() error } @@ -114,12 +113,10 @@ func (fi *fileDescriptor) Close() error { return nil } -// TODO: Who uses `Sync` and who `Flush`? Do the consumers of this API -// know about the (undocumented) `fullsync` argument? -func (fi *fileDescriptor) Sync() error { - return fi.flushUp(false) -} - +// Flush generates a new version of the node of the underlying +// UnixFS directory (adding it to the DAG service) and updates +// the entry in the parent directory (setting `fullSync` to +// propagate the update all the way to the root). func (fi *fileDescriptor) Flush() error { return fi.flushUp(true) } @@ -129,7 +126,7 @@ func (fi *fileDescriptor) Flush() error { // TODO: What is `fullsync`? Propagate the changes upward // to the root flushing every node in the path (the "up" // part of `flushUp`). -func (fi *fileDescriptor) flushUp(fullsync bool) error { +func (fi *fileDescriptor) flushUp(fullSync bool) error { nd, err := fi.mod.GetNode() if err != nil { return err @@ -139,6 +136,11 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { if err != nil { return err } + // TODO: Very similar logic to the update process in + // `Directory`, the logic should be unified, both structures + // (`File` and `Directory`) are backed by a IPLD node with + // a UnixFS format that is the actual target of the update + // (regenerating it and adding it to the DAG service). fi.inode.nodelk.Lock() fi.inode.node = nd @@ -149,7 +151,7 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { fi.inode.nodelk.Unlock() // TODO: Maybe all this logic should happen in `File`. - return parent.updateChildEntry(child{name, nd}, fullsync) + return parent.updateChildEntry(child{name, nd}, fullSync) } // Seek implements io.Seeker diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index ee53d35bfe..20753466a5 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -419,12 +419,6 @@ func TestMfsFile(t *testing.T) { t.Fatal("didnt write correct number of bytes") } - // sync file - err = wfd.Sync() - if err != nil { - t.Fatal(err) - } - // make sure size hasnt changed size, err = wfd.Size() if err != nil { From 970544a1e1c6949dc06516e23078e064c66467c5 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Sun, 16 Dec 2018 22:05:44 -0300 Subject: [PATCH 2471/3147] unify the caches in `Directory` Unify the two caches in `Directory` that discriminated between files and directories (`files` and `childDirs`) into a single `entriesCache` since that distinction wasn't used anywhere and made the code unnecessarily more complex. This commit was moved from ipfs/go-mfs@925c0a80bcfb03de907bef2299a6d0c06403429c --- mfs/dir.go | 60 ++++++++++++++++------------------------------------- mfs/root.go | 14 ++++++------- 2 files changed, 25 insertions(+), 49 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index b3c8b33228..80ead54b98 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -27,10 +27,9 @@ var ErrDirExists = errors.New("directory already has entry by that name") type Directory struct { inode - // Cache. - // TODO: Should this be a single cache of `FSNode`s? - childDirs map[string]*Directory - files map[string]*File + // Internal cache with added entries to the directory, its cotents + // are synched with the underlying `unixfsDir` node in `sync()`. + entriesCache map[string]FSNode lock sync.Mutex // TODO: What content is being protected here exactly? The entire directory? @@ -60,11 +59,10 @@ func NewDirectory(ctx context.Context, name string, node ipld.Node, parent mutab parent: parent, dagService: dserv, }, - ctx: ctx, - unixfsDir: db, - childDirs: make(map[string]*Directory), - files: make(map[string]*File), - modTime: time.Now(), + ctx: ctx, + unixfsDir: db, + entriesCache: make(map[string]FSNode), + modTime: time.Now(), }, nil } @@ -206,14 +204,14 @@ func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { return nil, err } - d.childDirs[name] = ndir + d.entriesCache[name] = ndir return ndir, nil case ft.TFile, ft.TRaw, ft.TSymlink: nfi, err := NewFile(name, nd, d, d.dagService) if err != nil { return nil, err } - d.files[name] = nfi + d.entriesCache[name] = nfi return nfi, nil case ft.TMetadata: return nil, ErrNotYetImplemented @@ -225,7 +223,7 @@ func (d *Directory) cacheNode(name string, nd ipld.Node) (FSNode, error) { if err != nil { return nil, err } - d.files[name] = nfi + d.entriesCache[name] = nfi return nfi, nil default: return nil, fmt.Errorf("unrecognized node type in cache node") @@ -242,10 +240,7 @@ func (d *Directory) Child(name string) (FSNode, error) { func (d *Directory) Uncache(name string) { d.lock.Lock() defer d.lock.Unlock() - delete(d.files, name) - delete(d.childDirs, name) - // TODO: We definitely need to join these maps if we are manipulating - // them like this. + delete(d.entriesCache, name) } // childFromDag searches through this directories dag node for a child link @@ -257,14 +252,9 @@ func (d *Directory) childFromDag(name string) (ipld.Node, error) { // childUnsync returns the child under this directory by the given name // without locking, useful for operations which already hold a lock func (d *Directory) childUnsync(name string) (FSNode, error) { - cdir, ok := d.childDirs[name] + entry, ok := d.entriesCache[name] if ok { - return cdir, nil - } - - cfile, ok := d.files[name] - if ok { - return cfile, nil + return entry, nil } return d.childNode(name) @@ -368,7 +358,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - d.childDirs[name] = dirobj + d.entriesCache[name] = dirobj return dirobj, nil } @@ -376,8 +366,7 @@ func (d *Directory) Unlink(name string) error { d.lock.Lock() defer d.lock.Unlock() - delete(d.childDirs, name) - delete(d.files, name) + delete(d.entriesCache, name) return d.unixfsDir.RemoveChild(d.ctx, name) } @@ -438,12 +427,9 @@ func (d *Directory) AddUnixFSChild(c child) error { return nil } -// TODO: Difference between `sync` and `Flush`? This seems -// to be related to the internal cache and not to the MFS -// hierarchy update. func (d *Directory) sync() error { - for name, dir := range d.childDirs { - nd, err := dir.GetNode() + for name, entry := range d.entriesCache { + nd, err := entry.GetNode() if err != nil { return err } @@ -454,17 +440,7 @@ func (d *Directory) sync() error { } } - for name, file := range d.files { - nd, err := file.GetNode() - if err != nil { - return err - } - - err = d.updateChild(child{name, nd}) - if err != nil { - return err - } - } + // TODO: Should we clean the cache here? return nil } diff --git a/mfs/root.go b/mfs/root.go index d92f1837b7..4831aba152 100644 --- a/mfs/root.go +++ b/mfs/root.go @@ -61,8 +61,11 @@ const ( TDir ) -// FSNode represents any node (directory, or file) in the MFS filesystem. -// Not to be confused with the `unixfs.FSNode`. +// FSNode abstracts the `Directory` and `File` structures, it represents +// any child node in the MFS (i.e., all the nodes besides the `Root`). It +// is the counterpart of the `mutableParent` interface which represents any +// parent node in the MFS (`Root` and `Directory`). +// (Not to be confused with the `unixfs.FSNode`.) type FSNode interface { GetNode() (ipld.Node, error) Flush() error @@ -167,11 +170,8 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { dir.lock.Lock() defer dir.lock.Unlock() - for name := range dir.files { - delete(dir.files, name) - } - for name := range dir.childDirs { - delete(dir.childDirs, name) + for name := range dir.entriesCache { + delete(dir.entriesCache, name) } // TODO: Can't we just create new maps? From e456ec5feb819d56826361dccd729580e01bf3a1 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Tue, 18 Dec 2018 12:02:19 -0300 Subject: [PATCH 2472/3147] add documentation links in README This commit was moved from ipfs/go-mfs@777ea2151c870dbf4d2c44f998e3fd23f9d9e00d --- mfs/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mfs/README.md b/mfs/README.md index 86c9d9b5d4..da0dcdf49e 100644 --- a/mfs/README.md +++ b/mfs/README.md @@ -33,6 +33,14 @@ import "github.com/ipfs/go-mfs" Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-mfs) +## Documentation + +Documentation around the MFS and the Files API in general around IPFS is a work in progress the following links may be of use: + +* [UnixFS](https://docs.ipfs.io/guides/concepts/unixfs/) +* [MFS](https://docs.ipfs.io/guides/concepts/mfs/) +* [General concept document about how are files handled in IPFS (WIP)](https://github.com/ipfs/docs/issues/133) + ## Repository Structure This repository contains many files, all belonging to the root `mfs` package. From bbe5ff6adbc01fb33b4a2d7928cd22ade2825657 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 17 Dec 2018 01:09:50 -0300 Subject: [PATCH 2473/3147] document republisher logic Document the `Republisher` code in `repub.go` according to the explanation in https://github.com/ipfs/go-ipfs/issues/5092#issuecomment-398524255. Erring on the side of verbosity since this has been a part of the code with very little review up until now. This commit was moved from ipfs/go-mfs@0abe7695d65d99f7c6bcfb38aee6110a24918727 --- mfs/repub.go | 128 +++++++++++++++++++++++++++++---------------------- mfs/root.go | 6 ++- 2 files changed, 79 insertions(+), 55 deletions(-) diff --git a/mfs/repub.go b/mfs/repub.go index 3ffcb9758f..e96f04472d 100644 --- a/mfs/repub.go +++ b/mfs/repub.go @@ -8,23 +8,24 @@ import ( cid "github.com/ipfs/go-cid" ) -// PubFunc is the function used by the `publish()` method. +// PubFunc is the user-defined function that determines exactly what +// logic entails "publishing" a `Cid` value. type PubFunc func(context.Context, cid.Cid) error // Republisher manages when to publish a given entry. type Republisher struct { - TimeoutLong time.Duration - TimeoutShort time.Duration - Publish chan struct{} - pubfunc PubFunc - pubnowch chan chan struct{} + TimeoutLong time.Duration + TimeoutShort time.Duration + valueHasBeenUpdated chan struct{} + pubfunc PubFunc + immediatePublish chan chan struct{} + + valueLock sync.Mutex + valueToPublish cid.Cid + lastValuePublished cid.Cid ctx context.Context cancel func() - - lk sync.Mutex - val cid.Cid - lastpub cid.Cid } // NewRepublisher creates a new Republisher object to republish the given root @@ -32,34 +33,28 @@ type Republisher struct { func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { ctx, cancel := context.WithCancel(ctx) return &Republisher{ - TimeoutShort: tshort, - TimeoutLong: tlong, - Publish: make(chan struct{}, 1), - pubfunc: pf, - pubnowch: make(chan chan struct{}), - ctx: ctx, - cancel: cancel, + TimeoutShort: tshort, + TimeoutLong: tlong, + valueHasBeenUpdated: make(chan struct{}, 1), + pubfunc: pf, + immediatePublish: make(chan chan struct{}), + ctx: ctx, + cancel: cancel, } } -func (p *Republisher) setVal(c cid.Cid) { - p.lk.Lock() - defer p.lk.Unlock() - p.val = c -} - -// WaitPub Returns immediately if `lastpub` value is consistent with the -// current value `val`, else will block until `val` has been published. +// WaitPub waits for the current value to be published (or returns early +// if it already has). func (p *Republisher) WaitPub() { - p.lk.Lock() - consistent := p.lastpub == p.val - p.lk.Unlock() - if consistent { + p.valueLock.Lock() + valueHasBeenPublished := p.lastValuePublished == p.valueToPublish + p.valueLock.Unlock() + if valueHasBeenPublished { return } wait := make(chan struct{}) - p.pubnowch <- wait + p.immediatePublish <- wait <-wait } @@ -69,67 +64,92 @@ func (p *Republisher) Close() error { return err } -// Touch signals that an update has occurred since the last publish. -// Multiple consecutive touches may extend the time period before -// the next Publish occurs in order to more efficiently batch updates. +// Update the `valueToPublish` and signal it in the `valueHasBeenUpdated` +// channel. Multiple consecutive updates may extend the time period before +// the next publish occurs in order to more efficiently batch updates. func (np *Republisher) Update(c cid.Cid) { - np.setVal(c) + np.valueLock.Lock() + np.valueToPublish = c + np.valueLock.Unlock() + select { - case np.Publish <- struct{}{}: + case np.valueHasBeenUpdated <- struct{}{}: default: } } -// Run is the main republisher loop. -// TODO: Document according to: -// https://github.com/ipfs/go-ipfs/issues/5092#issuecomment-398524255. +// Run contains the core logic of the `Republisher`. It calls the user-defined +// `pubfunc` function whenever the `Cid` value is updated. The complexity comes +// from the fact that `pubfunc` may be slow so we need to batch updates. +// Algorithm: +// 1. When we receive the first update after publishing, we set a `longer` timer. +// 2. When we receive any update, we reset the `quick` timer. +// 3. If either the `quick` timeout or the `longer` timeout elapses, +// we call `publish` with the latest updated value. +// +// The `longer` timer ensures that we delay publishing by at most +// `TimeoutLong`. The `quick` timer allows us to publish sooner if +// it looks like there are no more updates coming down the pipe. func (np *Republisher) Run() { for { select { - case <-np.Publish: + case <-np.ctx.Done(): + return + case <-np.valueHasBeenUpdated: + // Fast timeout, a `publish` will be issued if there are + // no more updates before it expires (restarted every time + // the `valueHasBeenUpdated` is signaled). quick := time.After(np.TimeoutShort) + // Long timeout that guarantees a `publish` after it expires + // even if the value keeps being updated (and `quick` is + // restarted). longer := time.After(np.TimeoutLong) wait: - var pubnowresp chan struct{} + var valueHasBeenPublished chan struct{} select { case <-np.ctx.Done(): return - case <-np.Publish: + case <-np.valueHasBeenUpdated: + // The `valueToPublish` has been updated *again* since + // the last time we checked and we still haven't published + // it, restart the `quick` timer allowing for some more + // time to see if the `valueToPublish` changes again. quick = time.After(np.TimeoutShort) goto wait + case <-quick: case <-longer: - case pubnowresp = <-np.pubnowch: + case valueHasBeenPublished = <-np.immediatePublish: } err := np.publish(np.ctx) - if pubnowresp != nil { - pubnowresp <- struct{}{} + if valueHasBeenPublished != nil { + // The user is waiting in `WaitPub` with this channel, signal + // that the `publish` has happened. + valueHasBeenPublished <- struct{}{} } if err != nil { log.Errorf("republishRoot error: %s", err) } - - case <-np.ctx.Done(): - return } } } -// publish calls the `PubFunc`. +// Wrapper function around the user-defined `pubfunc`. It publishes +// the (last) `valueToPublish` set and registers it in `lastValuePublished`. func (np *Republisher) publish(ctx context.Context) error { - np.lk.Lock() - topub := np.val - np.lk.Unlock() + np.valueLock.Lock() + topub := np.valueToPublish + np.valueLock.Unlock() err := np.pubfunc(ctx, topub) if err != nil { return err } - np.lk.Lock() - np.lastpub = topub - np.lk.Unlock() + np.valueLock.Lock() + np.lastValuePublished = topub + np.valueLock.Unlock() return nil } diff --git a/mfs/root.go b/mfs/root.go index 4831aba152..b3c311ef5d 100644 --- a/mfs/root.go +++ b/mfs/root.go @@ -97,7 +97,11 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf var repub *Republisher if pf != nil { repub = NewRepublisher(parent, pf, time.Millisecond*300, time.Second*3) - repub.setVal(node.Cid()) + + repub.valueToPublish = node.Cid() + // No need to take the lock here since we just created + // the `Republisher` and no one has access to it yet. + go repub.Run() } From 9363790c2c8d2d0b7afb29ab991ea52a410c755c Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 17 Dec 2018 01:22:33 -0300 Subject: [PATCH 2474/3147] rename all `Republisher` receivers Unify all the `Republisher` receivers names to `rp` (avoiding `r` to distinguish it from the `Root` receivers). This commit was moved from ipfs/go-mfs@4809106df1424c32acc9dcf13742b9ff445c464b --- mfs/repub.go | 62 ++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/mfs/repub.go b/mfs/repub.go index e96f04472d..1efda7b5cc 100644 --- a/mfs/repub.go +++ b/mfs/repub.go @@ -45,35 +45,35 @@ func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration // WaitPub waits for the current value to be published (or returns early // if it already has). -func (p *Republisher) WaitPub() { - p.valueLock.Lock() - valueHasBeenPublished := p.lastValuePublished == p.valueToPublish - p.valueLock.Unlock() +func (rp *Republisher) WaitPub() { + rp.valueLock.Lock() + valueHasBeenPublished := rp.lastValuePublished == rp.valueToPublish + rp.valueLock.Unlock() if valueHasBeenPublished { return } wait := make(chan struct{}) - p.immediatePublish <- wait + rp.immediatePublish <- wait <-wait } -func (p *Republisher) Close() error { - err := p.publish(p.ctx) - p.cancel() +func (rp *Republisher) Close() error { + err := rp.publish(rp.ctx) + rp.cancel() return err } // Update the `valueToPublish` and signal it in the `valueHasBeenUpdated` // channel. Multiple consecutive updates may extend the time period before // the next publish occurs in order to more efficiently batch updates. -func (np *Republisher) Update(c cid.Cid) { - np.valueLock.Lock() - np.valueToPublish = c - np.valueLock.Unlock() +func (rp *Republisher) Update(c cid.Cid) { + rp.valueLock.Lock() + rp.valueToPublish = c + rp.valueLock.Unlock() select { - case np.valueHasBeenUpdated <- struct{}{}: + case rp.valueHasBeenUpdated <- struct{}{}: default: } } @@ -90,41 +90,41 @@ func (np *Republisher) Update(c cid.Cid) { // The `longer` timer ensures that we delay publishing by at most // `TimeoutLong`. The `quick` timer allows us to publish sooner if // it looks like there are no more updates coming down the pipe. -func (np *Republisher) Run() { +func (rp *Republisher) Run() { for { select { - case <-np.ctx.Done(): + case <-rp.ctx.Done(): return - case <-np.valueHasBeenUpdated: + case <-rp.valueHasBeenUpdated: // Fast timeout, a `publish` will be issued if there are // no more updates before it expires (restarted every time // the `valueHasBeenUpdated` is signaled). - quick := time.After(np.TimeoutShort) + quick := time.After(rp.TimeoutShort) // Long timeout that guarantees a `publish` after it expires // even if the value keeps being updated (and `quick` is // restarted). - longer := time.After(np.TimeoutLong) + longer := time.After(rp.TimeoutLong) wait: var valueHasBeenPublished chan struct{} select { - case <-np.ctx.Done(): + case <-rp.ctx.Done(): return - case <-np.valueHasBeenUpdated: + case <-rp.valueHasBeenUpdated: // The `valueToPublish` has been updated *again* since // the last time we checked and we still haven't published // it, restart the `quick` timer allowing for some more // time to see if the `valueToPublish` changes again. - quick = time.After(np.TimeoutShort) + quick = time.After(rp.TimeoutShort) goto wait case <-quick: case <-longer: - case valueHasBeenPublished = <-np.immediatePublish: + case valueHasBeenPublished = <-rp.immediatePublish: } - err := np.publish(np.ctx) + err := rp.publish(rp.ctx) if valueHasBeenPublished != nil { // The user is waiting in `WaitPub` with this channel, signal // that the `publish` has happened. @@ -139,17 +139,17 @@ func (np *Republisher) Run() { // Wrapper function around the user-defined `pubfunc`. It publishes // the (last) `valueToPublish` set and registers it in `lastValuePublished`. -func (np *Republisher) publish(ctx context.Context) error { - np.valueLock.Lock() - topub := np.valueToPublish - np.valueLock.Unlock() +func (rp *Republisher) publish(ctx context.Context) error { + rp.valueLock.Lock() + topub := rp.valueToPublish + rp.valueLock.Unlock() - err := np.pubfunc(ctx, topub) + err := rp.pubfunc(ctx, topub) if err != nil { return err } - np.valueLock.Lock() - np.lastValuePublished = topub - np.valueLock.Unlock() + rp.valueLock.Lock() + rp.lastValuePublished = topub + rp.valueLock.Unlock() return nil } From 1e8201dd237f06370d0f5a6859b4974687786048 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 19 Dec 2018 13:58:03 -0300 Subject: [PATCH 2475/3147] rename and document `File`'s node lock This commit was moved from ipfs/go-mfs@36363fb4b864ae44cfaa9e52cd7719a807c02f26 --- mfs/fd.go | 4 ++-- mfs/file.go | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/mfs/fd.go b/mfs/fd.go index 45a715877b..53275c4b79 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -140,13 +140,13 @@ func (fi *fileDescriptor) flushUp(fullsync bool) error { return err } - fi.inode.nodelk.Lock() + fi.inode.nodeLock.Lock() fi.inode.node = nd // TODO: Create a `SetNode` method. name := fi.inode.name parent := fi.inode.parent // TODO: Can the parent be modified? Do we need to do this inside the lock? - fi.inode.nodelk.Unlock() + fi.inode.nodeLock.Unlock() // TODO: Maybe all this logic should happen in `File`. return parent.closeChild(name, nd, fullsync) diff --git a/mfs/file.go b/mfs/file.go index 2c6912551b..963428aa71 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -28,8 +28,9 @@ type File struct { // of a particular sub-DAG that abstract an upper layer's entity. node ipld.Node - // TODO: Rename. - nodelk sync.Mutex + // Lock around the `node` that represents this file, necessary because + // there may be many `FileDescriptor`s operating on this `File`. + nodeLock sync.Mutex RawLeaves bool } @@ -58,9 +59,9 @@ const ( ) func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { - fi.nodelk.Lock() + fi.nodeLock.Lock() node := fi.node - fi.nodelk.Unlock() + fi.nodeLock.Unlock() // TODO: Move this `switch` logic outside (maybe even // to another package, this seems like a job of UnixFS), @@ -118,8 +119,8 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { // pretty much the same thing as here, we should at least call // that function and wrap the `ErrNotUnixfs` with an MFS text. func (fi *File) Size() (int64, error) { - fi.nodelk.Lock() - defer fi.nodelk.Unlock() + fi.nodeLock.Lock() + defer fi.nodeLock.Unlock() switch nd := fi.node.(type) { case *dag.ProtoNode: fsn, err := ft.FSNodeFromBytes(nd.Data()) @@ -135,10 +136,10 @@ func (fi *File) Size() (int64, error) { } // GetNode returns the dag node associated with this file -// TODO: Use this method and do not access the `nodelk` directly anywhere else. +// TODO: Use this method and do not access the `nodeLock` directly anywhere else. func (fi *File) GetNode() (ipld.Node, error) { - fi.nodelk.Lock() - defer fi.nodelk.Unlock() + fi.nodeLock.Lock() + defer fi.nodeLock.Unlock() return fi.node, nil } From 717ba6e6d333619cb248a614b7af9b9aada71bce Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 19 Dec 2018 14:04:35 -0300 Subject: [PATCH 2476/3147] use RW lock for the `File`'s node This allows us to, e.g., get the size, etc. in parallel. This commit was moved from ipfs/go-mfs@00b7d5c5388270eb1865b8c9e3500320597e2f34 --- mfs/file.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index 963428aa71..f75723ada1 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -30,7 +30,7 @@ type File struct { // Lock around the `node` that represents this file, necessary because // there may be many `FileDescriptor`s operating on this `File`. - nodeLock sync.Mutex + nodeLock sync.RWMutex RawLeaves bool } @@ -59,9 +59,9 @@ const ( ) func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { - fi.nodeLock.Lock() + fi.nodeLock.RLock() node := fi.node - fi.nodeLock.Unlock() + fi.nodeLock.RUnlock() // TODO: Move this `switch` logic outside (maybe even // to another package, this seems like a job of UnixFS), @@ -119,8 +119,8 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { // pretty much the same thing as here, we should at least call // that function and wrap the `ErrNotUnixfs` with an MFS text. func (fi *File) Size() (int64, error) { - fi.nodeLock.Lock() - defer fi.nodeLock.Unlock() + fi.nodeLock.RLock() + defer fi.nodeLock.RUnlock() switch nd := fi.node.(type) { case *dag.ProtoNode: fsn, err := ft.FSNodeFromBytes(nd.Data()) @@ -138,8 +138,8 @@ func (fi *File) Size() (int64, error) { // GetNode returns the dag node associated with this file // TODO: Use this method and do not access the `nodeLock` directly anywhere else. func (fi *File) GetNode() (ipld.Node, error) { - fi.nodeLock.Lock() - defer fi.nodeLock.Unlock() + fi.nodeLock.RLock() + defer fi.nodeLock.RUnlock() return fi.node, nil } From 609021953cf5b46ecb02f9f3af59abae357d79a0 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 19 Dec 2018 12:30:06 -0300 Subject: [PATCH 2477/3147] rename the `mutableParent` interface to just `parent` The name `mutableParent` signals "this is a mutable parent, there are immutable versions". This commit was moved from ipfs/go-mfs@d1471dab14dddcfa65b530706181533d76014c2c --- mfs/dir.go | 4 ++-- mfs/file.go | 2 +- mfs/inode.go | 2 +- mfs/root.go | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 80ead54b98..d01aa07cfc 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -47,7 +47,7 @@ type Directory struct { // // You probably don't want to call this directly. Instead, construct a new root // using NewRoot. -func NewDirectory(ctx context.Context, name string, node ipld.Node, parent mutableParent, dserv ipld.DAGService) (*Directory, error) { +func NewDirectory(ctx context.Context, name string, node ipld.Node, parent parent, dserv ipld.DAGService) (*Directory, error) { db, err := uio.NewDirectoryFromNode(dserv, node) if err != nil { return nil, err @@ -76,7 +76,7 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { d.unixfsDir.SetCidBuilder(b) } -// This method implements the `mutableParent` interface. It first updates +// This method implements the `parent` interface. It first updates // the child entry in the underlying UnixFS directory and then if `fullSync` // is set it saves the new content through the internal DAG service. Then, // also if `fullSync` is set, it propagates the update to its parent (through diff --git a/mfs/file.go b/mfs/file.go index 43713925e8..ac36441e45 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -36,7 +36,7 @@ type File struct { // NewFile returns a NewFile object with the given parameters. If the // Cid version is non-zero RawLeaves will be enabled. -func NewFile(name string, node ipld.Node, parent mutableParent, dserv ipld.DAGService) (*File, error) { +func NewFile(name string, node ipld.Node, parent parent, dserv ipld.DAGService) (*File, error) { fi := &File{ inode: inode{ name: name, diff --git a/mfs/inode.go b/mfs/inode.go index 8f65672aa7..50bed0b38e 100644 --- a/mfs/inode.go +++ b/mfs/inode.go @@ -13,7 +13,7 @@ type inode struct { name string // parent directory of this `inode` (which may be the `Root`). - parent mutableParent + parent parent // dagService used to store modifications made to the contents // of the file or directory the `inode` belongs to. diff --git a/mfs/root.go b/mfs/root.go index b3c311ef5d..6e91d02859 100644 --- a/mfs/root.go +++ b/mfs/root.go @@ -43,7 +43,7 @@ type child struct { // distinguished here, one at the DAG level (when I store the modified // nodes in the DAG service) and one in the UnixFS/MFS level (when I modify // the entry/link of the directory that pointed to the modified node). -type mutableParent interface { +type parent interface { // Method called by a child to its parent to signal to update the content // pointed to in the entry by that child's name. The child sends as // arguments its own information (under the `child` structure) and a flag @@ -63,7 +63,7 @@ const ( // FSNode abstracts the `Directory` and `File` structures, it represents // any child node in the MFS (i.e., all the nodes besides the `Root`). It -// is the counterpart of the `mutableParent` interface which represents any +// is the counterpart of the `parent` interface which represents any // parent node in the MFS (`Root` and `Directory`). // (Not to be confused with the `unixfs.FSNode`.) type FSNode interface { @@ -182,8 +182,8 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { return nil } -// updateChildEntry implements the mutableParent interface, and signals to the publisher that -// there are changes ready to be published. +// updateChildEntry implements the `parent` interface, and signals +// to the publisher that there are changes ready to be published. // This is the only thing that separates a `Root` from a `Directory`. // TODO: Evaluate merging both. // TODO: The `sync` argument isn't used here (we've already reached From 0bae804eba521257199997b046053f83663040df Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 19 Dec 2018 12:34:04 -0300 Subject: [PATCH 2478/3147] reword `updateChildEntry` method documentation This commit was moved from ipfs/go-mfs@25dd99b483cd0604f6bfde73e0e923553bc100f2 --- mfs/dir.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index d01aa07cfc..ab2158b6c3 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -77,14 +77,11 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { } // This method implements the `parent` interface. It first updates -// the child entry in the underlying UnixFS directory and then if `fullSync` -// is set it saves the new content through the internal DAG service. Then, -// also if `fullSync` is set, it propagates the update to its parent (through -// this same interface) with the new node already updated with the new entry. -// So, `fullSync` entails operations at two different layers: -// 1. DAG: save the newly created directory node with the updated entry. -// 2. MFS: propagate the update upwards repeating the whole process in the -// parent. +// the child entry in the underlying UnixFS directory and then, if `fullSync` +// is set, it: +// 1. DAG: saves the newly created directory node with the updated entry. +// 2. MFS: propagates the update upwards (through this same interface) +// repeating the whole process in the parent. func (d *Directory) updateChildEntry(c child, fullSync bool) error { // There's a local flush (`closeChildUpdate`) and a propagated flush (`updateChildEntry`). From 4cb1cc1f14d6ae7c86336cffaed14c0bde9899d7 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 19 Dec 2018 14:41:01 -0300 Subject: [PATCH 2479/3147] unexport `AddUnixFSChild` This commit was moved from ipfs/go-mfs@6c4a00ac702565c1a5c7254561744dbe02ba4c2a --- mfs/dir.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index ab2158b6c3..d488eb272b 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -160,7 +160,7 @@ func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { // Update child entry in the underlying UnixFS directory. func (d *Directory) updateChild(c child) error { - err := d.AddUnixFSChild(c) + err := d.addUnixFSChild(c) if err != nil { return err } @@ -345,7 +345,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - err = d.AddUnixFSChild(child{name, ndir}) + err = d.addUnixFSChild(child{name, ndir}) if err != nil { return nil, err } @@ -392,7 +392,7 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return err } - err = d.AddUnixFSChild(child{name, nd}) + err = d.addUnixFSChild(child{name, nd}) if err != nil { return err } @@ -401,9 +401,9 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return nil } -// AddUnixFSChild adds a child to the inner UnixFS directory +// addUnixFSChild adds a child to the inner UnixFS directory // and transitions to a HAMT implementation if needed. -func (d *Directory) AddUnixFSChild(c child) error { +func (d *Directory) addUnixFSChild(c child) error { if uio.UseHAMTSharding { // If the directory HAMT implementation is being used and this // directory is actually a basic implementation switch it to HAMT. From 5a85a431f81b0ba3feb64c8adc814b09b7ebe4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 26 Oct 2018 14:14:49 +0200 Subject: [PATCH 2480/3147] gx: update go-ipfs-files to 2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@1dc26f7a3fc0c1992e3c005177cecddb3fa8e14a --- coreiface/unixfs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 002635d993..3a214085c2 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - files "gx/ipfs/QmZMWMvWMVKCbHetJ4RgndbuEF1io2UpUxwQwtNjtYPzSC/go-ipfs-files" + files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) From d4352730fe649983c5c9099d4ba2fba2170451f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 26 Oct 2018 15:56:30 +0200 Subject: [PATCH 2481/3147] files2.0: fix build errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@072259200527f4b78299675bb5efbbaa715ca821 --- coreiface/unixfs.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 3a214085c2..773b36dc03 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -2,9 +2,8 @@ package iface import ( "context" - "io" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" @@ -18,11 +17,6 @@ type AddEvent struct { Size string `json:",omitempty"` } -type UnixfsFile interface { - files.SizeFile - io.Seeker -} - // UnixfsAPI is the basic interface to immutable files in IPFS // NOTE: This API is heavily WIP, things are guaranteed to break frequently type UnixfsAPI interface { @@ -35,7 +29,7 @@ type UnixfsAPI interface { // // Note that some implementations of this API may apply the specified context // to operations performed on the returned file - Get(context.Context, Path) (UnixfsFile, error) + Get(context.Context, Path) (files.File, error) // Ls returns the list of links in a directory Ls(context.Context, Path) ([]*ipld.Link, error) From 2904a69ad87f9a72ce9598c08536212a6d19609d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Nov 2018 03:24:42 +0100 Subject: [PATCH 2482/3147] files2.0: updates for file type split MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@65f7599676af200b0b87cee47292e6a48b1c14eb --- coreiface/unixfs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 773b36dc03..589083c6b8 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -23,13 +23,13 @@ type UnixfsAPI interface { // Add imports the data from the reader into merkledag file // // TODO: a long useful comment on how to use this for many different scenarios - Add(context.Context, files.File, ...options.UnixfsAddOption) (ResolvedPath, error) + Add(context.Context, files.Node, ...options.UnixfsAddOption) (ResolvedPath, error) // Get returns a read-only handle to a file tree referenced by a path // // Note that some implementations of this API may apply the specified context // to operations performed on the returned file - Get(context.Context, Path) (files.File, error) + Get(context.Context, Path) (files.Node, error) // Ls returns the list of links in a directory Ls(context.Context, Path) ([]*ipld.Link, error) From 0e2ab3797e3ea5f3d78d72f7f8b646e22772e2dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 18 Dec 2018 02:09:43 +0100 Subject: [PATCH 2483/3147] files2.0: address review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@d68c62b157814c099608799f543888595fdb8fd5 --- coreiface/errors.go | 1 + 1 file changed, 1 insertion(+) diff --git a/coreiface/errors.go b/coreiface/errors.go index 4ee3026ffc..234abe5667 100644 --- a/coreiface/errors.go +++ b/coreiface/errors.go @@ -4,5 +4,6 @@ import "errors" var ( ErrIsDir = errors.New("this dag node is a directory") + ErrNotFile = errors.New("this dag node is not a regular file") ErrOffline = errors.New("this action must be run in online mode, try running 'ipfs daemon' first") ) From 49c1363b243d972fc350a3e294658a68cfdbf494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 26 Oct 2018 14:14:49 +0200 Subject: [PATCH 2484/3147] gx: update go-ipfs-files to 2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@be43fa36d61a6fe2971048974884cb3859573053 --- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index e97933afd8..4e398485f7 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -12,7 +12,7 @@ import ( peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" pstoremem "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore/pstoremem" path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" - "gx/ipfs/QmdYvDbHp7qAhZ7GsCj6e1cMo55ND6y2mjWVzwdvcv4f12/go-unixfs" + "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs" offroute "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/offline" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" diff --git a/namesys/publisher.go b/namesys/publisher.go index 78bfd160f6..64bea67141 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,7 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" - ft "gx/ipfs/QmdYvDbHp7qAhZ7GsCj6e1cMo55ND6y2mjWVzwdvcv4f12/go-unixfs" + ft "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" From 3d132ddab18ee64dc731918e08fd4548d1b335dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 6 Dec 2018 10:47:51 +0100 Subject: [PATCH 2485/3147] coreapi: Global options for api constructor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@84509e38781da3257c7a82d09483b4c7d9188a10 --- coreiface/options/global.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 coreiface/options/global.go diff --git a/coreiface/options/global.go b/coreiface/options/global.go new file mode 100644 index 0000000000..f439652294 --- /dev/null +++ b/coreiface/options/global.go @@ -0,0 +1,32 @@ +package options + +type ApiSettings struct { + Offline bool +} + +type ApiOption func(*ApiSettings) error + +func ApiOptions(opts ...ApiOption) (*ApiSettings, error) { + options := &ApiSettings{ + Offline: false, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + return options, nil +} + +type apiOpts struct{} + +var Api dagOpts + +func (dagOpts) Offline(offline bool) ApiOption { + return func(settings *ApiSettings) error { + settings.Offline = offline + return nil + } +} From 6d52ba5bb4ccdda79fb3a55fbc1d024bee208c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 10 Dec 2018 14:21:19 +0100 Subject: [PATCH 2486/3147] coreapi.WithOptions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@7b478b88d1f788045344cede17f73e2f9b21d680 --- coreiface/coreapi.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index bab4fc13b3..226399967c 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,6 +5,8 @@ package iface import ( "context" + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) @@ -46,4 +48,8 @@ type CoreAPI interface { // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node ResolveNode(context.Context, Path) (ipld.Node, error) + + // WithOptions creates new instance of CoreAPI based on this instance with + // a set of options applied + WithOptions(...options.ApiOption) (CoreAPI, error) } From 57bf11c1602f87c424c2b0309d89642ef6d7d0d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 10 Dec 2018 14:31:19 +0100 Subject: [PATCH 2487/3147] coreapi: drop nameopt.Local in favour of api.Offline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@42d3b2edfa9d76d00e9fb2b86f6ab35ee15a0c0d --- coreiface/options/name.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/coreiface/options/name.go b/coreiface/options/name.go index c614db3abc..e2a0fc1649 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -20,7 +20,6 @@ type NamePublishSettings struct { } type NameResolveSettings struct { - Local bool Cache bool ResolveOpts []ropts.ResolveOpt @@ -49,7 +48,6 @@ func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings, error) func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings, error) { options := &NameResolveSettings{ - Local: false, Cache: true, } @@ -106,15 +104,6 @@ func (nameOpts) TTL(ttl time.Duration) NamePublishOption { } } -// Local is an option for Name.Resolve which specifies if the lookup should be -// offline. Default value is false -func (nameOpts) Local(local bool) NameResolveOption { - return func(settings *NameResolveSettings) error { - settings.Local = local - return nil - } -} - // Cache is an option for Name.Resolve which specifies if cache should be used. // Default value is true func (nameOpts) Cache(cache bool) NameResolveOption { From 3b8f8c7c8238d5fbd913ab0fb13f466ec3313e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 10 Dec 2018 15:26:27 +0100 Subject: [PATCH 2488/3147] coreapi: implement --local with Offline option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@286ea29c95a4d398c9a4b08fc5d24494e0c5d7c1 --- coreiface/options/unixfs.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index b771896bcc..fd748bb4ad 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -30,7 +30,6 @@ type UnixfsAddSettings struct { Pin bool OnlyHash bool - Local bool FsCache bool NoCopy bool @@ -60,7 +59,6 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, Pin: false, OnlyHash: false, - Local: false, FsCache: false, NoCopy: false, @@ -220,16 +218,6 @@ func (unixfsOpts) HashOnly(hashOnly bool) UnixfsAddOption { } } -// Local will add the data to blockstore without announcing it to the network -// -// Note that this doesn't prevent other nodes from getting this data -func (unixfsOpts) Local(local bool) UnixfsAddOption { - return func(settings *UnixfsAddSettings) error { - settings.Local = local - return nil - } -} - // Wrap tells the adder to wrap the added file structure with an additional // directory. func (unixfsOpts) Wrap(wrap bool) UnixfsAddOption { From e84f354e2490ba03d16798213311feb0ef47b59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 11 Dec 2018 22:24:40 +0100 Subject: [PATCH 2489/3147] coreapi WithOptions: apply on top of parent options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3956a72f07973de428f73776571af0518872e87c --- coreiface/options/global.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/coreiface/options/global.go b/coreiface/options/global.go index f439652294..93d635e41b 100644 --- a/coreiface/options/global.go +++ b/coreiface/options/global.go @@ -11,6 +11,10 @@ func ApiOptions(opts ...ApiOption) (*ApiSettings, error) { Offline: false, } + return ApiOptionsTo(options, opts...) +} + +func ApiOptionsTo(options *ApiSettings, opts ...ApiOption) (*ApiSettings, error) { for _, opt := range opts { err := opt(options) if err != nil { @@ -22,9 +26,9 @@ func ApiOptions(opts ...ApiOption) (*ApiSettings, error) { type apiOpts struct{} -var Api dagOpts +var Api apiOpts -func (dagOpts) Offline(offline bool) ApiOption { +func (apiOpts) Offline(offline bool) ApiOption { return func(settings *ApiSettings) error { settings.Offline = offline return nil From 4ca66099f8d8cf3985e847cd719b6990dbe09edb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 20 Dec 2018 18:23:10 -0800 Subject: [PATCH 2490/3147] fix a potential overflow bug If we have a deep enough directory, we could walk off the end of the bit array. This commit was moved from ipfs/go-unixfs@68e91bf352e567fec43ca73dadcaeb2a37fdd322 --- unixfs/hamt/hamt.go | 10 ++++++++-- unixfs/hamt/util.go | 14 +++++++++++--- unixfs/hamt/util_test.go | 35 +++++++++++++++++++++++++++-------- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 3714c30a21..8108da3d3a 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -375,7 +375,10 @@ func (ds *Shard) rmChild(i int) error { } func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*Shard) error) error { - idx := hv.Next(ds.tableSizeLg2) + idx, err := hv.Next(ds.tableSizeLg2) + if err != nil { + return fmt.Errorf("sharded directory too deep") + } if ds.bitfield.Bit(int(idx)) { cindex := ds.indexForBitPos(idx) @@ -516,7 +519,10 @@ func (ds *Shard) walkTrie(ctx context.Context, cb func(*Shard) error) error { } func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val *ipld.Link) error { - idx := hv.Next(ds.tableSizeLg2) + idx, err := hv.Next(ds.tableSizeLg2) + if err != nil { + return fmt.Errorf("sharded directory too deep") + } if !ds.bitfield.Bit(idx) { return ds.insertChild(idx, key, val) } diff --git a/unixfs/hamt/util.go b/unixfs/hamt/util.go index 5f684a21ac..927d449647 100644 --- a/unixfs/hamt/util.go +++ b/unixfs/hamt/util.go @@ -15,8 +15,16 @@ func mkmask(n int) byte { return (1 << uint(n)) - 1 } -// Next returns the next 'i' bits of the hashBits value as an integer -func (hb *hashBits) Next(i int) int { +// Next returns the next 'i' bits of the hashBits value as an integer, or an +// error if there aren't enough bits. +func (hb *hashBits) Next(i int) (int, error) { + if hb.consumed+i > len(hb.b)*8 { + return 0, fmt.Errorf("not enough bits remaining") + } + return hb.next(i), nil +} + +func (hb *hashBits) next(i int) int { curbi := hb.consumed / 8 leftb := 8 - (hb.consumed % 8) @@ -35,7 +43,7 @@ func (hb *hashBits) Next(i int) int { out := int(mkmask(leftb) & curb) out <<= uint(i - leftb) hb.consumed += leftb - out += hb.Next(i - leftb) + out += hb.next(i - leftb) return out } } diff --git a/unixfs/hamt/util_test.go b/unixfs/hamt/util_test.go index b1cbc52176..835c174282 100644 --- a/unixfs/hamt/util_test.go +++ b/unixfs/hamt/util_test.go @@ -9,37 +9,56 @@ func TestHashBitsEvenSizes(t *testing.T) { hb := hashBits{b: buf} for _, v := range buf { - if hb.Next(8) != int(v) { - t.Fatal("got wrong numbers back") + if a, _ := hb.Next(8); a != int(v) { + t.Fatalf("got wrong numbers back: expected %d, got %d", v, a) } } } +func TestHashBitsOverflow(t *testing.T) { + buf := []byte{255} + hb := hashBits{b: buf} + + for i := 0; i < 8; i++ { + bit, err := hb.Next(1) + if err != nil { + t.Fatalf("got %d bits back, expected 8: %s", i, err) + } + if bit != 1 { + t.Fatal("expected all one bits") + } + } + _, err := hb.Next(1) + if err == nil { + t.Error("overflowed the bit vector") + } +} + func TestHashBitsUneven(t *testing.T) { buf := []byte{255, 127, 79, 45, 116, 99, 35, 17} hb := hashBits{b: buf} - v := hb.Next(4) + v, _ := hb.Next(4) if v != 15 { t.Fatal("should have gotten 15: ", v) } - v = hb.Next(4) + v, _ = hb.Next(4) if v != 15 { t.Fatal("should have gotten 15: ", v) } - if v := hb.Next(3); v != 3 { + if v, _ := hb.Next(3); v != 3 { t.Fatalf("expected 3, but got %b", v) } - if v := hb.Next(3); v != 7 { + if v, _ := hb.Next(3); v != 7 { t.Fatalf("expected 7, but got %b", v) } - if v := hb.Next(3); v != 6 { + if v, _ := hb.Next(3); v != 6 { t.Fatalf("expected 6, but got %b", v) } - if v := hb.Next(15); v != 20269 { + if v, _ := hb.Next(15); v != 20269 { t.Fatalf("expected 20269, but got %b (%d)", v, v) } } From 2fefa38f508742783bf1f14accf22288a37f2741 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 20 Dec 2018 18:26:59 -0800 Subject: [PATCH 2491/3147] keep the full murmur128 hash 1. It's less confusing. Murmur64 is something our library supports by truncating a Murmur128 hash. 2. We'll only use the part we need anyways. directory trees. This commit was moved from ipfs/go-unixfs@6e4a0b54ebf90cd60ef35971dc2eb568db192536 --- unixfs/hamt/hamt.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 8108da3d3a..e59f88173a 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -203,9 +203,9 @@ func (ds *Shard) makeShardValue(lnk *ipld.Link) (*Shard, error) { } func hash(val []byte) []byte { - h := murmur3.New64() + h := murmur3.New128() h.Write(val) - return h.Sum(nil) + return h.Sum(make([]byte, 0, 128/8)) } // Set sets 'name' = nd in the HAMT From e5c6bfca93f033def1cf9269e44af166cb0ed836 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 20 Dec 2018 19:23:56 -0800 Subject: [PATCH 2492/3147] return the sharded directory error from the hash bits helper I didn't do this before because this datastructure *technically* isn't specific to sharded directories but, really, that was just even more confusing. This commit was moved from ipfs/go-unixfs@f3b122d2a5e64be72d9b9db8d0c63fe82b022c18 --- unixfs/hamt/hamt.go | 4 ++-- unixfs/hamt/util.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index e59f88173a..fdaf5be9b8 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -377,7 +377,7 @@ func (ds *Shard) rmChild(i int) error { func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*Shard) error) error { idx, err := hv.Next(ds.tableSizeLg2) if err != nil { - return fmt.Errorf("sharded directory too deep") + return err } if ds.bitfield.Bit(int(idx)) { cindex := ds.indexForBitPos(idx) @@ -521,7 +521,7 @@ func (ds *Shard) walkTrie(ctx context.Context, cb func(*Shard) error) error { func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val *ipld.Link) error { idx, err := hv.Next(ds.tableSizeLg2) if err != nil { - return fmt.Errorf("sharded directory too deep") + return err } if !ds.bitfield.Bit(idx) { return ds.insertChild(idx, key, val) diff --git a/unixfs/hamt/util.go b/unixfs/hamt/util.go index 927d449647..c2b33bc22f 100644 --- a/unixfs/hamt/util.go +++ b/unixfs/hamt/util.go @@ -19,7 +19,7 @@ func mkmask(n int) byte { // error if there aren't enough bits. func (hb *hashBits) Next(i int) (int, error) { if hb.consumed+i > len(hb.b)*8 { - return 0, fmt.Errorf("not enough bits remaining") + return 0, fmt.Errorf("sharded directory too deep") } return hb.next(i), nil } From 3a93f3a16133ff7c0f177d80b8b9149313ce3d82 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 21 Dec 2018 15:26:05 -0300 Subject: [PATCH 2493/3147] remove the `fullSync` option from `updateChildEntry` Make `updateChildEntry` always propagate the update all the way up to the root, the equivalent of calling it always with `fullSync` set. The case of calling it without setting `fullSync` (a kind of "half-update") where only the parent's directory UnixFS node was updated (but nothing else, leaving the root outdated) seemed of little used. This helps to simplify the logic around the update mechanism in MFS. This commit was moved from ipfs/go-mfs@1bbc52db970c95c1c51cf4f096b14d0fd8bf12a8 --- mfs/dir.go | 30 +++++++++--------------------- mfs/fd.go | 11 +++++++---- mfs/root.go | 15 +++++++-------- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index d488eb272b..20272d8986 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -77,16 +77,15 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { } // This method implements the `parent` interface. It first updates -// the child entry in the underlying UnixFS directory and then, if `fullSync` -// is set, it: +// the child entry in the underlying UnixFS directory and then it: // 1. DAG: saves the newly created directory node with the updated entry. // 2. MFS: propagates the update upwards (through this same interface) // repeating the whole process in the parent. -func (d *Directory) updateChildEntry(c child, fullSync bool) error { +func (d *Directory) updateChildEntry(c child) error { // There's a local flush (`closeChildUpdate`) and a propagated flush (`updateChildEntry`). - newDirNode, err := d.closeChildUpdate(c, fullSync) + newDirNode, err := d.closeChildUpdate(c) if err != nil { return err } @@ -98,23 +97,15 @@ func (d *Directory) updateChildEntry(c child, fullSync bool) error { // be merged with this one (the use of the `lock` is stopping this at the // moment, re-evaluate when its purpose has been better understood). - if fullSync { - return d.parent.updateChildEntry(child{d.name, newDirNode}, true) - // Setting `fullSync` to true here means, if the original child that - // initiated the update process wanted to propagate it upwards then - // continue to do so all the way up to the root, that is, the only - // time `fullSync` can be false is in the first call (which will be - // the *only* call), we either update the first parent entry or *all* - // the parent's. - } - - return nil + // Continue to propagate the update process upwards + // (all the way up to the root). + return d.parent.updateChildEntry(child{d.name, newDirNode}) } // This method implements the part of `updateChildEntry` that needs // to be locked around: in charge of updating the UnixFS layer and // generating the new node reflecting the update. -func (d *Directory) closeChildUpdate(c child, fullSync bool) (*dag.ProtoNode, error) { +func (d *Directory) closeChildUpdate(c child) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() @@ -125,10 +116,7 @@ func (d *Directory) closeChildUpdate(c child, fullSync bool) (*dag.ProtoNode, er // TODO: Clearly define how are we propagating changes to lower layers // like UnixFS. - if fullSync { - return d.flushCurrentNode() - } - return nil, nil + return d.flushCurrentNode() } // Recreate the underlying UnixFS directory node and save it in the DAG layer. @@ -374,7 +362,7 @@ func (d *Directory) Flush() error { return err } - return d.parent.updateChildEntry(child{d.name, nd}, true) + return d.parent.updateChildEntry(child{d.name, nd}) } // AddChild adds the node 'nd' under this directory giving it the name 'name' diff --git a/mfs/fd.go b/mfs/fd.go index e260a60abd..ea04bc9688 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -123,9 +123,8 @@ func (fi *fileDescriptor) Flush() error { // flushUp syncs the file and adds it to the dagservice // it *must* be called with the File's lock taken -// TODO: What is `fullsync`? Propagate the changes upward -// to the root flushing every node in the path (the "up" -// part of `flushUp`). +// If `fullSync` is set the changes are propagated upwards +// (the `Up` part of `flushUp`). func (fi *fileDescriptor) flushUp(fullSync bool) error { nd, err := fi.mod.GetNode() if err != nil { @@ -151,7 +150,11 @@ func (fi *fileDescriptor) flushUp(fullSync bool) error { fi.inode.nodeLock.Unlock() // TODO: Maybe all this logic should happen in `File`. - return parent.updateChildEntry(child{name, nd}, fullSync) + if fullSync { + return parent.updateChildEntry(child{name, nd}) + } + + return nil } // Seek implements io.Seeker diff --git a/mfs/root.go b/mfs/root.go index 6e91d02859..9810961ff9 100644 --- a/mfs/root.go +++ b/mfs/root.go @@ -45,13 +45,12 @@ type child struct { // the entry/link of the directory that pointed to the modified node). type parent interface { // Method called by a child to its parent to signal to update the content - // pointed to in the entry by that child's name. The child sends as - // arguments its own information (under the `child` structure) and a flag - // (`fullsync`) indicating whether or not to propagate the update upwards: - // modifying a directory entry entails modifying its contents which means - // that its parent (the parent's parent) will also need to be updated (and - // so on). - updateChildEntry(c child, fullSync bool) error + // pointed to in the entry by that child's name. The child sends its own + // information in the `child` structure. As modifying a directory entry + // entails modifying its contents the parent will also call *its* parent's + // `updateChildEntry` to update the entry pointing to the new directory, + // this mechanism is in turn repeated until reaching the `Root`. + updateChildEntry(c child) error } type NodeType int @@ -189,7 +188,7 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { // TODO: The `sync` argument isn't used here (we've already reached // the top), document it and maybe make it an anonymous variable (if // that's possible). -func (kr *Root) updateChildEntry(c child, fullSync bool) error { +func (kr *Root) updateChildEntry(c child) error { err := kr.GetDirectory().dagService.Add(context.TODO(), c.Node) if err != nil { return err From 1bfbf8f984f20ad46113f56d42353ec262c61e17 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 21 Dec 2018 16:11:18 -0300 Subject: [PATCH 2494/3147] merge `closeChildUpdate` with `flushCurrentNode` Without the `sync` logic (now removed) the code is simplified for these tightly coupled methods (the first one was the only caller of the second) to be merged in a single `localUpdate` method. This commit was moved from ipfs/go-mfs@8d2621030188477ab59ecc2aa47b967c12b1547d --- mfs/dir.go | 48 ++++++++++++++---------------------------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 20272d8986..61f85d064d 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -76,27 +76,17 @@ func (d *Directory) SetCidBuilder(b cid.Builder) { d.unixfsDir.SetCidBuilder(b) } -// This method implements the `parent` interface. It first updates -// the child entry in the underlying UnixFS directory and then it: -// 1. DAG: saves the newly created directory node with the updated entry. -// 2. MFS: propagates the update upwards (through this same interface) -// repeating the whole process in the parent. +// This method implements the `parent` interface. It first does the local +// update of the child entry in the underlying UnixFS directory and saves +// the newly created directory node with the updated entry in the DAG +// service. Then it propagates the update upwards (through this same +// interface) repeating the whole process in the parent. func (d *Directory) updateChildEntry(c child) error { - - // There's a local flush (`closeChildUpdate`) and a propagated flush (`updateChildEntry`). - - newDirNode, err := d.closeChildUpdate(c) + newDirNode, err := d.localUpdate(c) if err != nil { return err } - // TODO: The `sync` seems to be tightly coupling this two pieces of code, - // we use the node returned by `closeChildUpdate` (which entails a copy) - // only if `sync` is set, and we are discarding it otherwise. At the very - // least the `if sync {` clause at the end of `closeChildUpdate` should - // be merged with this one (the use of the `lock` is stopping this at the - // moment, re-evaluate when its purpose has been better understood). - // Continue to propagate the update process upwards // (all the way up to the root). return d.parent.updateChildEntry(child{d.name, newDirNode}) @@ -104,8 +94,9 @@ func (d *Directory) updateChildEntry(c child) error { // This method implements the part of `updateChildEntry` that needs // to be locked around: in charge of updating the UnixFS layer and -// generating the new node reflecting the update. -func (d *Directory) closeChildUpdate(c child) (*dag.ProtoNode, error) { +// generating the new node reflecting the update. It also stores the +// new node in the DAG layer. +func (d *Directory) localUpdate(c child) (*dag.ProtoNode, error) { d.lock.Lock() defer d.lock.Unlock() @@ -116,31 +107,20 @@ func (d *Directory) closeChildUpdate(c child) (*dag.ProtoNode, error) { // TODO: Clearly define how are we propagating changes to lower layers // like UnixFS. - return d.flushCurrentNode() -} - -// Recreate the underlying UnixFS directory node and save it in the DAG layer. -func (d *Directory) flushCurrentNode() (*dag.ProtoNode, error) { nd, err := d.unixfsDir.GetNode() if err != nil { return nil, err } - err = d.dagService.Add(d.ctx, nd) - if err != nil { - return nil, err - } - // TODO: This method is called in `closeChildUpdate` while the lock is - // taken, we need the lock while operating on `unixfsDir` to create the - // new node but do we also need to keep the lock while adding it to the - // DAG service? Evaluate refactoring these two methods together and better - // redistributing the node. - pbnd, ok := nd.(*dag.ProtoNode) if !ok { return nil, dag.ErrNotProtobuf } - // TODO: Why do we check the node *after* adding it to the DAG service? + + err = d.dagService.Add(d.ctx, nd) + if err != nil { + return nil, err + } return pbnd.Copy().(*dag.ProtoNode), nil // TODO: Why do we need a copy? From b5e06d34876da3759fa39fb18f557085e27f76d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 18 Dec 2018 14:23:55 +0100 Subject: [PATCH 2495/3147] coreapi/unixfs: Use path instead of raw hash in AddEvent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a1cf89b78a61aef35a4893f916e14e39cd5c9157 --- coreiface/path.go | 1 + coreiface/unixfs.go | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coreiface/path.go b/coreiface/path.go index 57ef4c21bd..01dda97d5a 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -46,6 +46,7 @@ type ResolvedPath interface { // cidRoot := {"A": {"/": cidA }} // // And resolve paths: + // // * "/ipfs/${cidRoot}" // * Calling Cid() will return `cidRoot` // * Calling Root() will return `cidRoot` diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 589083c6b8..b42b454cc2 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -9,12 +9,11 @@ import ( ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) -// TODO: ideas on making this more coreapi-ish without breaking the http API? type AddEvent struct { Name string - Hash string `json:",omitempty"` - Bytes int64 `json:",omitempty"` - Size string `json:",omitempty"` + Path ResolvedPath `json:",omitempty"` + Bytes int64 `json:",omitempty"` + Size string `json:",omitempty"` } // UnixfsAPI is the basic interface to immutable files in IPFS From 69e80ca212839db8ad52e9959504afaedc8d8a74 Mon Sep 17 00:00:00 2001 From: nmalhotra Date: Tue, 25 Dec 2018 11:23:34 -0500 Subject: [PATCH 2496/3147] fix/32/pr-ports : Pulled changes from PR 4517 Pulled changes from https://github.com/ipfs/go-ipfs/pull/4517, on top of, https://github.com/ipfs/go-mfs/pull/45. Change added to unblock the `waitPub()` call. With the elimination of stateSync cause a `updateChildEntry` to happen for `stateFlushed` as well, causing it to propogate upwards to the parent(s) [fullSync] and force a publish to happen, hence unblocking `waitPub`. This commit was moved from ipfs/go-mfs@2642dbfee4da72b535fb3ab1485e391779555749 --- mfs/fd.go | 168 +++++++++++++++++++++++++++--------------------- mfs/file.go | 41 ++++++------ mfs/mfs_test.go | 29 +++++---- mfs/options.go | 7 ++ mfs/repub.go | 7 -- mfs/root.go | 1 + 6 files changed, 138 insertions(+), 115 deletions(-) create mode 100644 mfs/options.go diff --git a/mfs/fd.go b/mfs/fd.go index ea04bc9688..35b945c24c 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -7,6 +7,16 @@ import ( mod "github.com/ipfs/go-unixfs/mod" context "context" + + ipld "github.com/ipfs/go-ipld-format" +) + +type state uint8 + +const ( + stateFlushed state = iota + stateDirty + stateClosed ) // One `File` can have many `FileDescriptor`s associated to it @@ -31,14 +41,31 @@ type FileDescriptor interface { } type fileDescriptor struct { - inode *File - mod *mod.DagModifier - perms int - sync bool - hasChanges bool - - // TODO: Where is this variable set? - closed bool + inode *File + mod *mod.DagModifier + flags Flags + + state state +} + +func (fi *fileDescriptor) checkWrite() error { + if fi.state == stateClosed { + return ErrClosed + } + if !fi.flags.Write { + return fmt.Errorf("file is read-only") + } + return nil +} + +func (fi *fileDescriptor) checkRead() error { + if fi.state == stateClosed { + return ErrClosed + } + if !fi.flags.Read { + return fmt.Errorf("file is write-only") + } + return nil } // Size returns the size of the file referred to by this descriptor @@ -48,34 +75,34 @@ func (fi *fileDescriptor) Size() (int64, error) { // Truncate truncates the file to size func (fi *fileDescriptor) Truncate(size int64) error { - if fi.perms == OpenReadOnly { - return fmt.Errorf("cannot call truncate on readonly file descriptor") + if err := fi.checkWrite(); err != nil { + return fmt.Errorf("truncate failed: %s", err) } - fi.hasChanges = true + fi.state = stateDirty return fi.mod.Truncate(size) } // Write writes the given data to the file at its current offset func (fi *fileDescriptor) Write(b []byte) (int, error) { - if fi.perms == OpenReadOnly { - return 0, fmt.Errorf("cannot write on not writeable descriptor") + if err := fi.checkWrite(); err != nil { + return 0, fmt.Errorf("write failed: %s", err) } - fi.hasChanges = true + fi.state = stateDirty return fi.mod.Write(b) } // Read reads into the given buffer from the current offset func (fi *fileDescriptor) Read(b []byte) (int, error) { - if fi.perms == OpenWriteOnly { - return 0, fmt.Errorf("cannot read on write-only descriptor") + if err := fi.checkRead(); err != nil { + return 0, fmt.Errorf("read failed: %s", err) } return fi.mod.Read(b) } // Read reads into the given buffer from the current offset func (fi *fileDescriptor) CtxReadFull(ctx context.Context, b []byte) (int, error) { - if fi.perms == OpenWriteOnly { - return 0, fmt.Errorf("cannot read on write-only descriptor") + if err := fi.checkRead(); err != nil { + return 0, fmt.Errorf("read failed: %s", err) } return fi.mod.CtxReadFull(ctx, b) } @@ -83,34 +110,17 @@ func (fi *fileDescriptor) CtxReadFull(ctx context.Context, b []byte) (int, error // Close flushes, then propogates the modified dag node up the directory structure // and signals a republish to occur func (fi *fileDescriptor) Close() error { - defer func() { - switch fi.perms { - case OpenReadOnly: - fi.inode.desclock.RUnlock() - case OpenWriteOnly, OpenReadWrite: - fi.inode.desclock.Unlock() - } - // TODO: `closed` should be set here. - }() - - if fi.closed { - panic("attempted to close file descriptor twice!") + if fi.state == stateClosed { + return ErrClosed } - - if fi.hasChanges { - err := fi.mod.Sync() - if err != nil { - return err - } - - fi.hasChanges = false - - // explicitly stay locked for flushUp call, - // it will manage the lock for us - return fi.flushUp(fi.sync) + if fi.flags.Write { + defer fi.inode.desclock.Unlock() + } else if fi.flags.Read { + defer fi.inode.desclock.RUnlock() } - - return nil + err := fi.flushUp(fi.flags.Sync) + fi.state = stateClosed + return err } // Flush generates a new version of the node of the underlying @@ -126,47 +136,57 @@ func (fi *fileDescriptor) Flush() error { // If `fullSync` is set the changes are propagated upwards // (the `Up` part of `flushUp`). func (fi *fileDescriptor) flushUp(fullSync bool) error { - nd, err := fi.mod.GetNode() - if err != nil { - return err - } + var nd ipld.Node + switch fi.state { + case stateDirty: + // calls mod.Sync internally. + var err error + nd, err = fi.mod.GetNode() + if err != nil { + return err + } + err = fi.inode.dagService.Add(context.TODO(), nd) + if err != nil { + return err + } + fi.inode.nodeLock.Lock() + fi.inode.node = nd + fi.inode.nodeLock.Unlock() + fallthrough + case stateFlushed: + if !fullSync { + return nil + } - err = fi.inode.dagService.Add(context.TODO(), nd) - if err != nil { - return err - } - // TODO: Very similar logic to the update process in - // `Directory`, the logic should be unified, both structures - // (`File` and `Directory`) are backed by a IPLD node with - // a UnixFS format that is the actual target of the update - // (regenerating it and adding it to the DAG service). - - fi.inode.nodeLock.Lock() - fi.inode.node = nd - // TODO: Create a `SetNode` method. - name := fi.inode.name - parent := fi.inode.parent - // TODO: Can the parent be modified? Do we need to do this inside the lock? - fi.inode.nodeLock.Unlock() - // TODO: Maybe all this logic should happen in `File`. - - if fullSync { - return parent.updateChildEntry(child{name, nd}) - } + fi.inode.nodeLock.Lock() + nd = fi.inode.node + parent := fi.inode.parent + name := fi.inode.name + fi.inode.nodeLock.Unlock() - return nil + if err := parent.updateChildEntry(child{name, nd}); err != nil { + return err + } + fi.state = stateFlushed + return nil + default: + panic("invalid state") + } } // Seek implements io.Seeker func (fi *fileDescriptor) Seek(offset int64, whence int) (int64, error) { + if fi.state == stateClosed { + return 0, fmt.Errorf("seek failed: %s", ErrClosed) + } return fi.mod.Seek(offset, whence) } // Write At writes the given bytes at the offset 'at' func (fi *fileDescriptor) WriteAt(b []byte, at int64) (int, error) { - if fi.perms == OpenReadOnly { - return 0, fmt.Errorf("cannot write on not writeable descriptor") + if err := fi.checkWrite(); err != nil { + return 0, fmt.Errorf("write-at failed: %s", err) } - fi.hasChanges = true + fi.state = stateDirty return fi.mod.WriteAt(b, at) } diff --git a/mfs/file.go b/mfs/file.go index 7a20fdf9a7..fd2eb28b5b 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -26,7 +26,7 @@ type File struct { // entire DAG of nodes that comprise the file. // TODO: Rename, there should be an explicit term for these root nodes // of a particular sub-DAG that abstract an upper layer's entity. - node ipld.Node + node ipld.Node // Lock around the `node` that represents this file, necessary because // there may be many `FileDescriptor`s operating on this `File`. @@ -52,13 +52,25 @@ func NewFile(name string, node ipld.Node, parent parent, dserv ipld.DAGService) return fi, nil } -const ( - OpenReadOnly = iota - OpenWriteOnly - OpenReadWrite -) +func (fi *File) Open(flags Flags) (_ FileDescriptor, _retErr error) { + if flags.Write { + fi.desclock.Lock() + defer func() { + if _retErr != nil { + fi.desclock.Unlock() + } + }() + } else if flags.Read { + fi.desclock.RLock() + defer func() { + if _retErr != nil { + fi.desclock.Unlock() + } + }() + } else { + return nil, fmt.Errorf("file opened for neither reading nor writing") + } -func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { fi.nodeLock.RLock() node := fi.node fi.nodeLock.RUnlock() @@ -86,16 +98,6 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { // Ok as well. } - switch flags { - case OpenReadOnly: - fi.desclock.RLock() - case OpenWriteOnly, OpenReadWrite: - fi.desclock.Lock() - default: - // TODO: support other modes - return nil, fmt.Errorf("mode not supported") - } - dmod, err := mod.NewDagModifier(context.TODO(), node, fi.dagService, chunker.DefaultSplitter) // TODO: Remove the use of the `chunker` package here, add a new `NewDagModifier` in // `go-unixfs` with the `DefaultSplitter` already included. @@ -106,8 +108,7 @@ func (fi *File) Open(flags int, sync bool) (FileDescriptor, error) { return &fileDescriptor{ inode: fi, - perms: flags, - sync: sync, + flags: flags, mod: dmod, }, nil } @@ -153,7 +154,7 @@ func (fi *File) GetNode() (ipld.Node, error) { // a file without flushing?) func (fi *File) Flush() error { // open the file in fullsync mode - fd, err := fi.Open(OpenWriteOnly, true) + fd, err := fi.Open(Flags{Write: true, Sync: true}) if err != nil { return err } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 20753466a5..8112d8a3f6 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -14,9 +14,10 @@ import ( "testing" "time" + path "github.com/ipfs/go-path" + bserv "github.com/ipfs/go-blockservice" dag "github.com/ipfs/go-merkledag" - "github.com/ipfs/go-path" ft "github.com/ipfs/go-unixfs" importer "github.com/ipfs/go-unixfs/importer" uio "github.com/ipfs/go-unixfs/io" @@ -161,7 +162,7 @@ func assertFileAtPath(ds ipld.DAGService, root *Directory, expn ipld.Node, pth s return fmt.Errorf("%s was not a file", pth) } - rfd, err := file.Open(OpenReadOnly, false) + rfd, err := file.Open(Flags{Read: true}) if err != nil { return err } @@ -394,7 +395,7 @@ func TestMfsFile(t *testing.T) { t.Fatal("some is seriously wrong here") } - wfd, err := fi.Open(OpenReadWrite, true) + wfd, err := fi.Open(Flags{Read: true, Write: true, Sync: true}) if err != nil { t.Fatal(err) } @@ -554,7 +555,7 @@ func actorMakeFile(d *Directory) error { return err } - wfd, err := f.Open(OpenWriteOnly, true) + wfd, err := f.Open(Flags{Write: true, Sync: true}) if err != nil { return err } @@ -634,7 +635,7 @@ func actorWriteFile(d *Directory) error { return err } - wfd, err := fi.Open(OpenWriteOnly, true) + wfd, err := fi.Open(Flags{Write: true, Sync: true}) if err != nil { return err } @@ -666,7 +667,7 @@ func actorReadFile(d *Directory) error { return err } - rfd, err := fi.Open(OpenReadOnly, false) + rfd, err := fi.Open(Flags{Read: true}) if err != nil { return err } @@ -868,7 +869,7 @@ func readFile(rt *Root, path string, offset int64, buf []byte) error { return fmt.Errorf("%s was not a file", path) } - fd, err := fi.Open(OpenReadOnly, false) + fd, err := fi.Open(Flags{Read: true}) if err != nil { return err } @@ -946,7 +947,7 @@ func writeFile(rt *Root, path string, data []byte) error { return fmt.Errorf("expected to receive a file, but didnt get one") } - fd, err := fi.Open(OpenWriteOnly, true) + fd, err := fi.Open(Flags{Write: true, Sync: true}) if err != nil { return err } @@ -1014,7 +1015,7 @@ func TestFileDescriptors(t *testing.T) { } // test read only - rfd1, err := fi.Open(OpenReadOnly, false) + rfd1, err := fi.Open(Flags{Read: true}) if err != nil { t.Fatal(err) } @@ -1038,7 +1039,7 @@ func TestFileDescriptors(t *testing.T) { go func() { defer close(done) // can open second readonly file descriptor - rfd2, err := fi.Open(OpenReadOnly, false) + rfd2, err := fi.Open(Flags{Read: true}) if err != nil { t.Error(err) return @@ -1061,7 +1062,7 @@ func TestFileDescriptors(t *testing.T) { done = make(chan struct{}) go func() { defer close(done) - wfd1, err := fi.Open(OpenWriteOnly, true) + wfd1, err := fi.Open(Flags{Write: true, Sync: true}) if err != nil { t.Error(err) } @@ -1090,7 +1091,7 @@ func TestFileDescriptors(t *testing.T) { case <-done: } - wfd, err := fi.Open(OpenWriteOnly, true) + wfd, err := fi.Open(Flags{Write: true, Sync: true}) if err != nil { t.Fatal(err) } @@ -1119,7 +1120,7 @@ func TestTruncateAtSize(t *testing.T) { t.Fatal(err) } - fd, err := fi.Open(OpenReadWrite, true) + fd, err := fi.Open(Flags{Read: true, Write: true, Sync: true}) if err != nil { t.Fatal(err) } @@ -1144,7 +1145,7 @@ func TestTruncateAndWrite(t *testing.T) { t.Fatal(err) } - fd, err := fi.Open(OpenReadWrite, true) + fd, err := fi.Open(Flags{Read: true, Write: true, Sync: true}) defer fd.Close() if err != nil { t.Fatal(err) diff --git a/mfs/options.go b/mfs/options.go new file mode 100644 index 0000000000..1edb99e11b --- /dev/null +++ b/mfs/options.go @@ -0,0 +1,7 @@ +package mfs + +type Flags struct { + Read bool + Write bool + Sync bool +} diff --git a/mfs/repub.go b/mfs/repub.go index 1efda7b5cc..12738fa482 100644 --- a/mfs/repub.go +++ b/mfs/repub.go @@ -46,13 +46,6 @@ func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration // WaitPub waits for the current value to be published (or returns early // if it already has). func (rp *Republisher) WaitPub() { - rp.valueLock.Lock() - valueHasBeenPublished := rp.lastValuePublished == rp.valueToPublish - rp.valueLock.Unlock() - if valueHasBeenPublished { - return - } - wait := make(chan struct{}) rp.immediatePublish <- wait <-wait diff --git a/mfs/root.go b/mfs/root.go index 9810961ff9..cbce68df9d 100644 --- a/mfs/root.go +++ b/mfs/root.go @@ -18,6 +18,7 @@ import ( // TODO: Remove if not used. var ErrNotExist = errors.New("no such rootfs") +var ErrClosed = errors.New("file closed") var log = logging.Logger("mfs") From 65e3df92ff61b14e2b32bfffff8b51e2d2783b23 Mon Sep 17 00:00:00 2001 From: nmalhotra Date: Tue, 25 Dec 2018 13:47:00 -0500 Subject: [PATCH 2497/3147] Add `stateCreated` as default fd state Added a new state for a freshly opened `fileDescriptor`. In `flushUp` only bubble up update if state is either `stateDirty` or `stateCreated`. `stateFlushed` should prevent bubble up. This commit was moved from ipfs/go-mfs@1cf41ee0c147a022a930d6fc0ae1011e44b78fb1 --- mfs/fd.go | 7 +++++-- mfs/file.go | 1 + mfs/root.go | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mfs/fd.go b/mfs/fd.go index 35b945c24c..7e2ccc6551 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -14,7 +14,8 @@ import ( type state uint8 const ( - stateFlushed state = iota + stateCreated state = iota + stateFlushed stateDirty stateClosed ) @@ -153,7 +154,7 @@ func (fi *fileDescriptor) flushUp(fullSync bool) error { fi.inode.node = nd fi.inode.nodeLock.Unlock() fallthrough - case stateFlushed: + case stateCreated: if !fullSync { return nil } @@ -169,6 +170,8 @@ func (fi *fileDescriptor) flushUp(fullSync bool) error { } fi.state = stateFlushed return nil + case stateFlushed: + return nil default: panic("invalid state") } diff --git a/mfs/file.go b/mfs/file.go index fd2eb28b5b..280bf93ab2 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -110,6 +110,7 @@ func (fi *File) Open(flags Flags) (_ FileDescriptor, _retErr error) { inode: fi, flags: flags, mod: dmod, + state: stateCreated, }, nil } diff --git a/mfs/root.go b/mfs/root.go index cbce68df9d..ef1d9bcbe4 100644 --- a/mfs/root.go +++ b/mfs/root.go @@ -68,6 +68,7 @@ const ( // (Not to be confused with the `unixfs.FSNode`.) type FSNode interface { GetNode() (ipld.Node, error) + Flush() error Type() NodeType } From 056171009263d2055f75626ef1a973ad8d2833e1 Mon Sep 17 00:00:00 2001 From: nmalhotra Date: Tue, 25 Dec 2018 21:02:46 -0500 Subject: [PATCH 2498/3147] Add 1 to rand func in `actorMakeFile` test helper Add 1 to rand.Intn() to prevent 0 size reader for being created. This commit was moved from ipfs/go-mfs@0baeab22d465bf591302a3ee7069c6fdeb134656 --- mfs/mfs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 8112d8a3f6..0274e17a69 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -561,7 +561,7 @@ func actorMakeFile(d *Directory) error { } rread := rand.New(rand.NewSource(time.Now().UnixNano())) - r := io.LimitReader(rread, int64(77*rand.Intn(123))) + r := io.LimitReader(rread, int64(77*rand.Intn(123)+1)) _, err = io.Copy(wfd, r) if err != nil { return err From 2ece99e82932c11c97d3b451b2221f6f4d20f061 Mon Sep 17 00:00:00 2001 From: nmalhotra Date: Tue, 25 Dec 2018 23:28:15 -0500 Subject: [PATCH 2499/3147] Update unflushed fd's inode during `flushUp` During `flushUp()` of an un-flushed fd, be it with freshly created or modified content, always update the file descriptors inode, with the contents of the node. This commit was moved from ipfs/go-mfs@1c807139bc9a7178d861a164a00f57767a783086 --- mfs/fd.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mfs/fd.go b/mfs/fd.go index 7e2ccc6551..756e999f7d 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -139,8 +139,7 @@ func (fi *fileDescriptor) Flush() error { func (fi *fileDescriptor) flushUp(fullSync bool) error { var nd ipld.Node switch fi.state { - case stateDirty: - // calls mod.Sync internally. + case stateCreated, stateDirty: var err error nd, err = fi.mod.GetNode() if err != nil { @@ -150,15 +149,17 @@ func (fi *fileDescriptor) flushUp(fullSync bool) error { if err != nil { return err } + + // Always update the file descriptor's inode with the created/modified node. fi.inode.nodeLock.Lock() fi.inode.node = nd fi.inode.nodeLock.Unlock() - fallthrough - case stateCreated: + if !fullSync { return nil } + // Bubble up the update's to the parent, only if fullSync is set to true. fi.inode.nodeLock.Lock() nd = fi.inode.node parent := fi.inode.parent From 28f06fc05ebce5dd32ccbde5cf7836a20a357f40 Mon Sep 17 00:00:00 2001 From: nmalhotra Date: Wed, 26 Dec 2018 20:21:35 -0500 Subject: [PATCH 2500/3147] Moved all RW ops between same locks in flushUp This commit was moved from ipfs/go-mfs@ed06dbe0ea16e1288bcee7a0975f26f4d5023e97 --- mfs/fd.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/mfs/fd.go b/mfs/fd.go index 756e999f7d..77a82d6923 100644 --- a/mfs/fd.go +++ b/mfs/fd.go @@ -150,25 +150,26 @@ func (fi *fileDescriptor) flushUp(fullSync bool) error { return err } - // Always update the file descriptor's inode with the created/modified node. + // TODO: Very similar logic to the update process in + // `Directory`, the logic should be unified, both structures + // (`File` and `Directory`) are backed by a IPLD node with + // a UnixFS format that is the actual target of the update + // (regenerating it and adding it to the DAG service). fi.inode.nodeLock.Lock() + // Always update the file descriptor's inode with the created/modified node. fi.inode.node = nd - fi.inode.nodeLock.Unlock() - - if !fullSync { - return nil - } - - // Bubble up the update's to the parent, only if fullSync is set to true. - fi.inode.nodeLock.Lock() - nd = fi.inode.node + // Save the members to be used for subsequent calls parent := fi.inode.parent name := fi.inode.name fi.inode.nodeLock.Unlock() - if err := parent.updateChildEntry(child{name, nd}); err != nil { - return err + // Bubble up the update's to the parent, only if fullSync is set to true. + if fullSync { + if err := parent.updateChildEntry(child{name, nd}); err != nil { + return err + } } + fi.state = stateFlushed return nil case stateFlushed: From 6fb480340c6a13f6613829e2fbebf06ed758bbae Mon Sep 17 00:00:00 2001 From: nmalhotra Date: Thu, 27 Dec 2018 18:17:48 -0500 Subject: [PATCH 2501/3147] Merge unit test changes from issue #32 Pull in commit from go-ipfs commit https://github.com/ipfs/go-ipfs/commit/f4dc9a41bc5eb3ecae77554c4a75b50865fc57ec Dropped nloop to 500 (from 1000) in `TestConcurrentWriteAndFlush` to reduce testing time. All unittests pass. This commit was moved from ipfs/go-mfs@40c7e34f271676119c464dd110ed439be5300d29 --- mfs/mfs_test.go | 61 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 0274e17a69..dde5562832 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -3,6 +3,7 @@ package mfs import ( "bytes" "context" + "encoding/binary" "errors" "fmt" "io" @@ -765,14 +766,14 @@ func TestConcurrentWriteAndFlush(t *testing.T) { t.Fatal(err) } - nloops := 5000 + nloops := 500 wg := new(sync.WaitGroup) wg.Add(1) go func() { defer wg.Done() for i := 0; i < nloops; i++ { - err := writeFile(rt, "/foo/bar/baz/file", []byte("STUFF")) + err := writeFile(rt, "/foo/bar/baz/file", func(_ []byte) []byte { return []byte("STUFF") }) if err != nil { t.Error("file write failed: ", err) return @@ -936,7 +937,7 @@ func TestConcurrentReads(t *testing.T) { wg.Wait() } -func writeFile(rt *Root, path string, data []byte) error { +func writeFile(rt *Root, path string, transform func([]byte) []byte) error { n, err := Lookup(rt, path) if err != nil { return err @@ -947,12 +948,27 @@ func writeFile(rt *Root, path string, data []byte) error { return fmt.Errorf("expected to receive a file, but didnt get one") } - fd, err := fi.Open(Flags{Write: true, Sync: true}) + fd, err := fi.Open(Flags{Read: true, Write: true, Sync: true}) if err != nil { return err } defer fd.Close() + data, err := ioutil.ReadAll(fd) + if err != nil { + return err + } + data = transform(data) + + _, err = fd.Seek(0, io.SeekStart) + if err != nil { + return err + } + err = fd.Truncate(0) + if err != nil { + return err + } + nw, err := fd.Write(data) if err != nil { return err @@ -986,19 +1002,48 @@ func TestConcurrentWrites(t *testing.T) { nloops := 100 for i := 0; i < 10; i++ { wg.Add(1) - go func(me int) { + go func() { defer wg.Done() - mybuf := bytes.Repeat([]byte{byte(me)}, 10) + var lastSeen uint64 for j := 0; j < nloops; j++ { - err := writeFile(rt, "a/b/c/afile", mybuf) + err := writeFile(rt, "a/b/c/afile", func(buf []byte) []byte { + if len(buf) == 0 { + if lastSeen > 0 { + t.Fatalf("file corrupted, last seen: %d", lastSeen) + } + buf = make([]byte, 8) + } else if len(buf) != 8 { + t.Fatal("buf not the right size") + } + + num := binary.LittleEndian.Uint64(buf) + if num < lastSeen { + t.Fatalf("count decreased: was %d, is %d", lastSeen, num) + } else { + t.Logf("count correct: was %d, is %d", lastSeen, num) + } + num++ + binary.LittleEndian.PutUint64(buf, num) + lastSeen = num + return buf + }) if err != nil { t.Error("writefile failed: ", err) return } } - }(i) + }() } wg.Wait() + buf := make([]byte, 8) + if err := readFile(rt, "a/b/c/afile", 0, buf); err != nil { + t.Fatal(err) + } + actual := binary.LittleEndian.Uint64(buf) + expected := uint64(10 * nloops) + if actual != expected { + t.Fatalf("iteration mismatch: expect %d, got %d", expected, actual) + } } func TestFileDescriptors(t *testing.T) { From 3301b037c33fd42e0deb10965447a7e26e1e86fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Dec 2018 19:45:58 +0100 Subject: [PATCH 2502/3147] coreapi: move tests to interface subpackage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a479105a40eddefc84ca1de9aaaf12cbe2e13e56 --- coreiface/tests/block_test.go | 183 +++++++ coreiface/tests/dag_test.go | 151 ++++++ coreiface/tests/dht_test.go | 126 +++++ coreiface/tests/key_test.go | 475 ++++++++++++++++ coreiface/tests/name_test.go | 262 +++++++++ coreiface/tests/object_test.go | 427 +++++++++++++++ coreiface/tests/path_test.go | 154 ++++++ coreiface/tests/pin_test.go | 214 ++++++++ coreiface/tests/pubsub_test.go | 106 ++++ coreiface/tests/unixfs_test.go | 963 +++++++++++++++++++++++++++++++++ 10 files changed, 3061 insertions(+) create mode 100644 coreiface/tests/block_test.go create mode 100644 coreiface/tests/dag_test.go create mode 100644 coreiface/tests/dht_test.go create mode 100644 coreiface/tests/key_test.go create mode 100644 coreiface/tests/name_test.go create mode 100644 coreiface/tests/object_test.go create mode 100644 coreiface/tests/path_test.go create mode 100644 coreiface/tests/pin_test.go create mode 100644 coreiface/tests/pubsub_test.go create mode 100644 coreiface/tests/unixfs_test.go diff --git a/coreiface/tests/block_test.go b/coreiface/tests/block_test.go new file mode 100644 index 0000000000..81360b150e --- /dev/null +++ b/coreiface/tests/block_test.go @@ -0,0 +1,183 @@ +package tests_test + +import ( + "context" + "io/ioutil" + "strings" + "testing" + + coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" +) + +func TestBlockPut(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) + if err != nil { + t.Error(err) + } + + if res.Path().Cid().String() != "QmPyo15ynbVrSTVdJL9th7JysHaAbXt9dM9tXk1bMHbRtk" { + t.Errorf("got wrong cid: %s", res.Path().Cid().String()) + } +} + +func TestBlockPutFormat(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("cbor")) + if err != nil { + t.Error(err) + } + + if res.Path().Cid().String() != "zdpuAn4amuLWo8Widi5v6VQpuo2dnpnwbVE3oB6qqs7mDSeoa" { + t.Errorf("got wrong cid: %s", res.Path().Cid().String()) + } +} + +func TestBlockPutHash(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Hash(mh.KECCAK_512, -1)) + if err != nil { + t.Fatal(err) + } + + if res.Path().Cid().String() != "zBurKB9YZkcDf6xa53WBE8CFX4ydVqAyf9KPXBFZt5stJzEstaS8Hukkhu4gwpMtc1xHNDbzP7sPtQKyWsP3C8fbhkmrZ" { + t.Errorf("got wrong cid: %s", res.Path().Cid().String()) + } +} + +func TestBlockGet(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Hash(mh.KECCAK_512, -1)) + if err != nil { + t.Error(err) + } + + r, err := api.Block().Get(ctx, res.Path()) + if err != nil { + t.Error(err) + } + + d, err := ioutil.ReadAll(r) + if err != nil { + t.Error(err) + } + + if string(d) != "Hello" { + t.Error("didn't get correct data back") + } + + p, err := coreiface.ParsePath("/ipfs/" + res.Path().Cid().String()) + if err != nil { + t.Error(err) + } + + rp, err := api.ResolvePath(ctx, p) + if err != nil { + t.Fatal(err) + } + if rp.Cid().String() != res.Path().Cid().String() { + t.Error("paths didn't match") + } +} + +func TestBlockRm(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) + if err != nil { + t.Error(err) + } + + r, err := api.Block().Get(ctx, res.Path()) + if err != nil { + t.Error(err) + } + + d, err := ioutil.ReadAll(r) + if err != nil { + t.Error(err) + } + + if string(d) != "Hello" { + t.Error("didn't get correct data back") + } + + err = api.Block().Rm(ctx, res.Path()) + if err != nil { + t.Error(err) + } + + _, err = api.Block().Get(ctx, res.Path()) + if err == nil { + t.Error("expected err to exist") + } + if err.Error() != "blockservice: key not found" { + t.Errorf("unexpected error; %s", err.Error()) + } + + err = api.Block().Rm(ctx, res.Path()) + if err == nil { + t.Error("expected err to exist") + } + if err.Error() != "blockstore: block not found" { + t.Errorf("unexpected error; %s", err.Error()) + } + + err = api.Block().Rm(ctx, res.Path(), opt.Block.Force(true)) + if err != nil { + t.Error(err) + } +} + +func TestBlockStat(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) + if err != nil { + t.Error(err) + } + + stat, err := api.Block().Stat(ctx, res.Path()) + if err != nil { + t.Error(err) + } + + if stat.Path().String() != res.Path().String() { + t.Error("paths don't match") + } + + if stat.Size() != len("Hello") { + t.Error("length doesn't match") + } +} diff --git a/coreiface/tests/dag_test.go b/coreiface/tests/dag_test.go new file mode 100644 index 0000000000..17059192be --- /dev/null +++ b/coreiface/tests/dag_test.go @@ -0,0 +1,151 @@ +package tests_test + +import ( + "context" + "path" + "strings" + "testing" + + coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + + mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" +) + +var ( + treeExpected = map[string]struct{}{ + "a": {}, + "b": {}, + "c": {}, + "c/d": {}, + "c/e": {}, + } +) + +func TestPut(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Dag().Put(ctx, strings.NewReader(`"Hello"`)) + if err != nil { + t.Error(err) + } + + if res.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + t.Errorf("got wrong cid: %s", res.Cid().String()) + } +} + +func TestPutWithHash(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + res, err := api.Dag().Put(ctx, strings.NewReader(`"Hello"`), opt.Dag.Hash(mh.ID, -1)) + if err != nil { + t.Error(err) + } + + if res.Cid().String() != "z5hRLNd2sv4z1c" { + t.Errorf("got wrong cid: %s", res.Cid().String()) + } +} + +func TestPath(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + sub, err := api.Dag().Put(ctx, strings.NewReader(`"foo"`)) + if err != nil { + t.Error(err) + } + + res, err := api.Dag().Put(ctx, strings.NewReader(`{"lnk": {"/": "`+sub.Cid().String()+`"}}`)) + if err != nil { + t.Error(err) + } + + p, err := coreiface.ParsePath(path.Join(res.Cid().String(), "lnk")) + if err != nil { + t.Error(err) + } + + nd, err := api.Dag().Get(ctx, p) + if err != nil { + t.Error(err) + } + + if nd.Cid().String() != sub.Cid().String() { + t.Errorf("got unexpected cid %s, expected %s", nd.Cid().String(), sub.Cid().String()) + } +} + +func TestTree(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + c, err := api.Dag().Put(ctx, strings.NewReader(`{"a": 123, "b": "foo", "c": {"d": 321, "e": 111}}`)) + if err != nil { + t.Error(err) + } + + res, err := api.Dag().Get(ctx, c) + if err != nil { + t.Error(err) + } + + lst := res.Tree("", -1) + if len(lst) != len(treeExpected) { + t.Errorf("tree length of %d doesn't match expected %d", len(lst), len(treeExpected)) + } + + for _, ent := range lst { + if _, ok := treeExpected[ent]; !ok { + t.Errorf("unexpected tree entry %s", ent) + } + } +} + +func TestBatch(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + batch := api.Dag().Batch(ctx) + + c, err := batch.Put(ctx, strings.NewReader(`"Hello"`)) + if err != nil { + t.Error(err) + } + + if c.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + t.Errorf("got wrong cid: %s", c.Cid().String()) + } + + _, err = api.Dag().Get(ctx, c) + if err == nil || err.Error() != "merkledag: not found" { + t.Error(err) + } + + if err := batch.Commit(ctx); err != nil { + t.Error(err) + } + + _, err = api.Dag().Get(ctx, c) + if err != nil { + t.Error(err) + } +} diff --git a/coreiface/tests/dht_test.go b/coreiface/tests/dht_test.go new file mode 100644 index 0000000000..be16bb0839 --- /dev/null +++ b/coreiface/tests/dht_test.go @@ -0,0 +1,126 @@ +package tests_test + +import ( + "context" + "io" + "testing" + + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +func TestDhtFindPeer(t *testing.T) { + ctx := context.Background() + apis, err := makeAPISwarm(ctx, true, 5) + if err != nil { + t.Fatal(err) + } + + self0, err := apis[0].Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + pi, err := apis[2].Dht().FindPeer(ctx, self0.ID()) + if err != nil { + t.Fatal(err) + } + + if pi.Addrs[0].String() != "/ip4/127.0.0.1/tcp/4001" { + t.Errorf("got unexpected address from FindPeer: %s", pi.Addrs[0].String()) + } + + self2, err := apis[2].Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + pi, err = apis[1].Dht().FindPeer(ctx, self2.ID()) + if err != nil { + t.Fatal(err) + } + + if pi.Addrs[0].String() != "/ip4/127.0.2.1/tcp/4001" { + t.Errorf("got unexpected address from FindPeer: %s", pi.Addrs[0].String()) + } +} + +func TestDhtFindProviders(t *testing.T) { + ctx := context.Background() + apis, err := makeAPISwarm(ctx, true, 5) + if err != nil { + t.Fatal(err) + } + + p, err := addTestObject(ctx, apis[0]) + if err != nil { + t.Fatal(err) + } + + out, err := apis[2].Dht().FindProviders(ctx, p, options.Dht.NumProviders(1)) + if err != nil { + t.Fatal(err) + } + + provider := <-out + + self0, err := apis[0].Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if provider.ID.String() != self0.ID().String() { + t.Errorf("got wrong provider: %s != %s", provider.ID.String(), self0.ID().String()) + } +} + +func TestDhtProvide(t *testing.T) { + ctx := context.Background() + apis, err := makeAPISwarm(ctx, true, 5) + if err != nil { + t.Fatal(err) + } + + off0, err := apis[0].WithOptions(options.Api.Offline(true)) + if err != nil { + t.Fatal(err) + } + + s, err := off0.Block().Put(ctx, &io.LimitedReader{R: rnd, N: 4092}) + if err != nil { + t.Fatal(err) + } + + p := s.Path() + + out, err := apis[2].Dht().FindProviders(ctx, p, options.Dht.NumProviders(1)) + if err != nil { + t.Fatal(err) + } + + provider := <-out + + self0, err := apis[0].Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if provider.ID.String() != "" { + t.Errorf("got wrong provider: %s != %s", provider.ID.String(), self0.ID().String()) + } + + err = apis[0].Dht().Provide(ctx, p) + if err != nil { + t.Fatal(err) + } + + out, err = apis[2].Dht().FindProviders(ctx, p, options.Dht.NumProviders(1)) + if err != nil { + t.Fatal(err) + } + + provider = <-out + + if provider.ID.String() != self0.ID().String() { + t.Errorf("got wrong provider: %s != %s", provider.ID.String(), self0.ID().String()) + } +} diff --git a/coreiface/tests/key_test.go b/coreiface/tests/key_test.go new file mode 100644 index 0000000000..21884e448d --- /dev/null +++ b/coreiface/tests/key_test.go @@ -0,0 +1,475 @@ +package tests_test + +import ( + "context" + "strings" + "testing" + + opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +func TestListSelf(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + return + } + + keys, err := api.Key().List(ctx) + if err != nil { + t.Fatalf("failed to list keys: %s", err) + return + } + + if len(keys) != 1 { + t.Fatalf("there should be 1 key (self), got %d", len(keys)) + return + } + + if keys[0].Name() != "self" { + t.Errorf("expected the key to be called 'self', got '%s'", keys[0].Name()) + } + + if keys[0].Path().String() != "/ipns/"+testPeerID { + t.Errorf("expected the key to have path '/ipns/%s', got '%s'", testPeerID, keys[0].Path().String()) + } +} + +func TestRenameSelf(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + return + } + + _, _, err = api.Key().Rename(ctx, "self", "foo") + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "cannot rename key with name 'self'" { + t.Fatalf("expected error 'cannot rename key with name 'self'', got '%s'", err.Error()) + } + } + + _, _, err = api.Key().Rename(ctx, "self", "foo", opt.Key.Force(true)) + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "cannot rename key with name 'self'" { + t.Fatalf("expected error 'cannot rename key with name 'self'', got '%s'", err.Error()) + } + } +} + +func TestRemoveSelf(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + return + } + + _, err = api.Key().Remove(ctx, "self") + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "cannot remove key with name 'self'" { + t.Fatalf("expected error 'cannot remove key with name 'self'', got '%s'", err.Error()) + } + } +} + +func TestGenerate(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + k, err := api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + if k.Name() != "foo" { + t.Errorf("expected the key to be called 'foo', got '%s'", k.Name()) + } + + if !strings.HasPrefix(k.Path().String(), "/ipns/Qm") { + t.Errorf("expected the key to be prefixed with '/ipns/Qm', got '%s'", k.Path().String()) + } +} + +func TestGenerateSize(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + k, err := api.Key().Generate(ctx, "foo", opt.Key.Size(1024)) + if err != nil { + t.Fatal(err) + return + } + + if k.Name() != "foo" { + t.Errorf("expected the key to be called 'foo', got '%s'", k.Name()) + } + + if !strings.HasPrefix(k.Path().String(), "/ipns/Qm") { + t.Errorf("expected the key to be prefixed with '/ipns/Qm', got '%s'", k.Path().String()) + } +} + +func TestGenerateType(t *testing.T) { + ctx := context.Background() + t.Skip("disabled until libp2p/specs#111 is fixed") + + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + k, err := api.Key().Generate(ctx, "bar", opt.Key.Type(opt.Ed25519Key)) + if err != nil { + t.Fatal(err) + return + } + + if k.Name() != "bar" { + t.Errorf("expected the key to be called 'foo', got '%s'", k.Name()) + } + + // Expected to be an inlined identity hash. + if !strings.HasPrefix(k.Path().String(), "/ipns/12") { + t.Errorf("expected the key to be prefixed with '/ipns/12', got '%s'", k.Path().String()) + } +} + +func TestGenerateExisting(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + _, err = api.Key().Generate(ctx, "foo") + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "key with name 'foo' already exists" { + t.Fatalf("expected error 'key with name 'foo' already exists', got '%s'", err.Error()) + } + } + + _, err = api.Key().Generate(ctx, "self") + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "cannot create key with name 'self'" { + t.Fatalf("expected error 'cannot create key with name 'self'', got '%s'", err.Error()) + } + } +} + +func TestList(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + l, err := api.Key().List(ctx) + if err != nil { + t.Fatal(err) + return + } + + if len(l) != 2 { + t.Fatalf("expected to get 2 keys, got %d", len(l)) + return + } + + if l[0].Name() != "self" { + t.Fatalf("expected key 0 to be called 'self', got '%s'", l[0].Name()) + return + } + + if l[1].Name() != "foo" { + t.Fatalf("expected key 1 to be called 'foo', got '%s'", l[1].Name()) + return + } + + if !strings.HasPrefix(l[0].Path().String(), "/ipns/Qm") { + t.Fatalf("expected key 0 to be prefixed with '/ipns/Qm', got '%s'", l[0].Name()) + return + } + + if !strings.HasPrefix(l[1].Path().String(), "/ipns/Qm") { + t.Fatalf("expected key 1 to be prefixed with '/ipns/Qm', got '%s'", l[1].Name()) + return + } +} + +func TestRename(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + k, overwrote, err := api.Key().Rename(ctx, "foo", "bar") + if err != nil { + t.Fatal(err) + return + } + + if overwrote { + t.Error("overwrote should be false") + } + + if k.Name() != "bar" { + t.Errorf("returned key should be called 'bar', got '%s'", k.Name()) + } +} + +func TestRenameToSelf(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + _, _, err = api.Key().Rename(ctx, "foo", "self") + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "cannot overwrite key with name 'self'" { + t.Fatalf("expected error 'cannot overwrite key with name 'self'', got '%s'", err.Error()) + } + } +} + +func TestRenameToSelfForce(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + _, _, err = api.Key().Rename(ctx, "foo", "self", opt.Key.Force(true)) + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "cannot overwrite key with name 'self'" { + t.Fatalf("expected error 'cannot overwrite key with name 'self'', got '%s'", err.Error()) + } + } +} + +func TestRenameOverwriteNoForce(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + _, err = api.Key().Generate(ctx, "bar") + if err != nil { + t.Fatal(err) + return + } + + _, _, err = api.Key().Rename(ctx, "foo", "bar") + if err == nil { + t.Error("expected error to not be nil") + } else { + if err.Error() != "key by that name already exists, refusing to overwrite" { + t.Fatalf("expected error 'key by that name already exists, refusing to overwrite', got '%s'", err.Error()) + } + } +} + +func TestRenameOverwrite(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + kfoo, err := api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + _, err = api.Key().Generate(ctx, "bar") + if err != nil { + t.Fatal(err) + return + } + + k, overwrote, err := api.Key().Rename(ctx, "foo", "bar", opt.Key.Force(true)) + if err != nil { + t.Fatal(err) + return + } + + if !overwrote { + t.Error("overwrote should be true") + } + + if k.Name() != "bar" { + t.Errorf("returned key should be called 'bar', got '%s'", k.Name()) + } + + if k.Path().String() != kfoo.Path().String() { + t.Errorf("k and kfoo should have equal paths, '%s'!='%s'", k.Path().String(), kfoo.Path().String()) + } +} + +func TestRenameSameNameNoForce(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + k, overwrote, err := api.Key().Rename(ctx, "foo", "foo") + if err != nil { + t.Fatal(err) + return + } + + if overwrote { + t.Error("overwrote should be false") + } + + if k.Name() != "foo" { + t.Errorf("returned key should be called 'foo', got '%s'", k.Name()) + } +} + +func TestRenameSameName(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + k, overwrote, err := api.Key().Rename(ctx, "foo", "foo", opt.Key.Force(true)) + if err != nil { + t.Fatal(err) + return + } + + if overwrote { + t.Error("overwrote should be false") + } + + if k.Name() != "foo" { + t.Errorf("returned key should be called 'foo', got '%s'", k.Name()) + } +} + +func TestRemove(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + k, err := api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + l, err := api.Key().List(ctx) + if err != nil { + t.Fatal(err) + return + } + + if len(l) != 2 { + t.Fatalf("expected to get 2 keys, got %d", len(l)) + return + } + + p, err := api.Key().Remove(ctx, "foo") + if err != nil { + t.Fatal(err) + return + } + + if k.Path().String() != p.Path().String() { + t.Errorf("k and p should have equal paths, '%s'!='%s'", k.Path().String(), p.Path().String()) + } + + l, err = api.Key().List(ctx) + if err != nil { + t.Fatal(err) + return + } + + if len(l) != 1 { + t.Fatalf("expected to get 1 key, got %d", len(l)) + return + } + + if l[0].Name() != "self" { + t.Errorf("expected the key to be called 'self', got '%s'", l[0].Name()) + } +} diff --git a/coreiface/tests/name_test.go b/coreiface/tests/name_test.go new file mode 100644 index 0000000000..a3514e0513 --- /dev/null +++ b/coreiface/tests/name_test.go @@ -0,0 +1,262 @@ +package tests_test + +import ( + "context" + "io" + "math/rand" + "path" + "testing" + "time" + + "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" + ipath "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + + coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +var rnd = rand.New(rand.NewSource(0x62796532303137)) + +func addTestObject(ctx context.Context, api coreiface.CoreAPI) (coreiface.Path, error) { + return api.Unixfs().Add(ctx, files.NewReaderFile(&io.LimitedReader{R: rnd, N: 4092})) +} + +func appendPath(p coreiface.Path, sub string) coreiface.Path { + p, err := coreiface.ParsePath(path.Join(p.String(), sub)) + if err != nil { + panic(err) + } + return p +} + +func TestPublishResolve(t *testing.T) { + ctx := context.Background() + init := func() (coreiface.CoreAPI, coreiface.Path) { + apis, err := makeAPISwarm(ctx, true, 5) + if err != nil { + t.Fatal(err) + return nil, nil + } + api := apis[0] + + p, err := addTestObject(ctx, api) + if err != nil { + t.Fatal(err) + return nil, nil + } + return api, p + } + + run := func(t *testing.T, ropts []opt.NameResolveOption) { + t.Run("basic", func(t *testing.T) { + api, p := init() + e, err := api.Name().Publish(ctx, p) + if err != nil { + t.Fatal(err) + } + + self, err := api.Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if e.Name() != self.ID().Pretty() { + t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + } + + if e.Value().String() != p.String() { + t.Errorf("expected paths to match, '%s'!='%s'", e.Value().String(), p.String()) + } + + resPath, err := api.Name().Resolve(ctx, e.Name(), ropts...) + if err != nil { + t.Fatal(err) + } + + if resPath.String() != p.String() { + t.Errorf("expected paths to match, '%s'!='%s'", resPath.String(), p.String()) + } + }) + + t.Run("publishPath", func(t *testing.T) { + api, p := init() + e, err := api.Name().Publish(ctx, appendPath(p, "/test")) + if err != nil { + t.Fatal(err) + } + + self, err := api.Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if e.Name() != self.ID().Pretty() { + t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + } + + if e.Value().String() != p.String()+"/test" { + t.Errorf("expected paths to match, '%s'!='%s'", e.Value().String(), p.String()) + } + + resPath, err := api.Name().Resolve(ctx, e.Name(), ropts...) + if err != nil { + t.Fatal(err) + } + + if resPath.String() != p.String()+"/test" { + t.Errorf("expected paths to match, '%s'!='%s'", resPath.String(), p.String()+"/test") + } + }) + + t.Run("revolvePath", func(t *testing.T) { + api, p := init() + e, err := api.Name().Publish(ctx, p) + if err != nil { + t.Fatal(err) + } + + self, err := api.Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if e.Name() != self.ID().Pretty() { + t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + } + + if e.Value().String() != p.String() { + t.Errorf("expected paths to match, '%s'!='%s'", e.Value().String(), p.String()) + } + + resPath, err := api.Name().Resolve(ctx, e.Name()+"/test", ropts...) + if err != nil { + t.Fatal(err) + } + + if resPath.String() != p.String()+"/test" { + t.Errorf("expected paths to match, '%s'!='%s'", resPath.String(), p.String()+"/test") + } + }) + + t.Run("publishRevolvePath", func(t *testing.T) { + api, p := init() + e, err := api.Name().Publish(ctx, appendPath(p, "/a")) + if err != nil { + t.Fatal(err) + } + + self, err := api.Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if e.Name() != self.ID().Pretty() { + t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + } + + if e.Value().String() != p.String()+"/a" { + t.Errorf("expected paths to match, '%s'!='%s'", e.Value().String(), p.String()) + } + + resPath, err := api.Name().Resolve(ctx, e.Name()+"/b", ropts...) + if err != nil { + t.Fatal(err) + } + + if resPath.String() != p.String()+"/a/b" { + t.Errorf("expected paths to match, '%s'!='%s'", resPath.String(), p.String()+"/a/b") + } + }) + } + + t.Run("default", func(t *testing.T) { + run(t, []opt.NameResolveOption{}) + }) + + t.Run("nocache", func(t *testing.T) { + run(t, []opt.NameResolveOption{opt.Name.Cache(false)}) + }) +} + +func TestBasicPublishResolveKey(t *testing.T) { + ctx := context.Background() + apis, err := makeAPISwarm(ctx, true, 5) + if err != nil { + t.Fatal(err) + } + api := apis[0] + + k, err := api.Key().Generate(ctx, "foo") + if err != nil { + t.Fatal(err) + } + + p, err := addTestObject(ctx, api) + if err != nil { + t.Fatal(err) + } + + e, err := api.Name().Publish(ctx, p, opt.Name.Key(k.Name())) + if err != nil { + t.Fatal(err) + } + + if ipath.Join([]string{"/ipns", e.Name()}) != k.Path().String() { + t.Errorf("expected e.Name to equal '%s', got '%s'", e.Name(), k.Path().String()) + } + + if e.Value().String() != p.String() { + t.Errorf("expected paths to match, '%s'!='%s'", e.Value().String(), p.String()) + } + + resPath, err := api.Name().Resolve(ctx, e.Name()) + if err != nil { + t.Fatal(err) + } + + if resPath.String() != p.String() { + t.Errorf("expected paths to match, '%s'!='%s'", resPath.String(), p.String()) + } +} + +func TestBasicPublishResolveTimeout(t *testing.T) { + t.Skip("ValidTime doesn't appear to work at this time resolution") + + ctx := context.Background() + apis, err := makeAPISwarm(ctx, true, 5) + if err != nil { + t.Fatal(err) + } + api := apis[0] + p, err := addTestObject(ctx, api) + if err != nil { + t.Fatal(err) + } + + e, err := api.Name().Publish(ctx, p, opt.Name.ValidTime(time.Millisecond*100)) + if err != nil { + t.Fatal(err) + } + + self, err := api.Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if e.Name() != self.ID().Pretty() { + t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + } + + if e.Value().String() != p.String() { + t.Errorf("expected paths to match, '%s'!='%s'", e.Value().String(), p.String()) + } + + time.Sleep(time.Second) + + _, err = api.Name().Resolve(ctx, e.Name()) + if err == nil { + t.Fatal("Expected an error") + } +} + +//TODO: When swarm api is created, add multinode tests diff --git a/coreiface/tests/object_test.go b/coreiface/tests/object_test.go new file mode 100644 index 0000000000..ac9e1d5f37 --- /dev/null +++ b/coreiface/tests/object_test.go @@ -0,0 +1,427 @@ +package tests_test + +import ( + "bytes" + "context" + "encoding/hex" + "io/ioutil" + "strings" + "testing" + + "github.com/ipfs/go-ipfs/core/coreapi/interface" + opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +func TestNew(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + emptyNode, err := api.Object().New(ctx) + if err != nil { + t.Fatal(err) + } + + dirNode, err := api.Object().New(ctx, opt.Object.Type("unixfs-dir")) + if err != nil { + t.Fatal(err) + } + + if emptyNode.String() != "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n" { + t.Errorf("Unexpected emptyNode path: %s", emptyNode.String()) + } + + if dirNode.String() != "QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn" { + t.Errorf("Unexpected dirNode path: %s", dirNode.String()) + } +} + +func TestObjectPut(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"YmFy"}`), opt.Object.DataType("base64")) //bar + if err != nil { + t.Fatal(err) + } + + pbBytes, err := hex.DecodeString("0a0362617a") + if err != nil { + t.Fatal(err) + } + + p3, err := api.Object().Put(ctx, bytes.NewReader(pbBytes), opt.Object.InputEnc("protobuf")) + if err != nil { + t.Fatal(err) + } + + if p1.String() != "/ipfs/QmQeGyS87nyijii7kFt1zbe4n2PsXTFimzsdxyE9qh9TST" { + t.Errorf("unexpected path: %s", p1.String()) + } + + if p2.String() != "/ipfs/QmNeYRbCibmaMMK6Du6ChfServcLqFvLJF76PzzF76SPrZ" { + t.Errorf("unexpected path: %s", p2.String()) + } + + if p3.String() != "/ipfs/QmZreR7M2t7bFXAdb1V5FtQhjk4t36GnrvueLJowJbQM9m" { + t.Errorf("unexpected path: %s", p3.String()) + } +} + +func TestObjectGet(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + nd, err := api.Object().Get(ctx, p1) + if err != nil { + t.Fatal(err) + } + + if string(nd.RawData()[len(nd.RawData())-3:]) != "foo" { + t.Fatal("got non-matching data") + } +} + +func TestObjectData(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + r, err := api.Object().Data(ctx, p1) + if err != nil { + t.Fatal(err) + } + + data, err := ioutil.ReadAll(r) + if err != nil { + t.Fatal(err) + } + + if string(data) != "foo" { + t.Fatal("got non-matching data") + } +} + +func TestObjectLinks(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().Put(ctx, strings.NewReader(`{"Links":[{"Name":"bar", "Hash":"`+p1.Cid().String()+`"}]}`)) + if err != nil { + t.Fatal(err) + } + + links, err := api.Object().Links(ctx, p2) + if err != nil { + t.Fatal(err) + } + + if len(links) != 1 { + t.Errorf("unexpected number of links: %d", len(links)) + } + + if links[0].Cid.String() != p1.Cid().String() { + t.Fatal("cids didn't batch") + } + + if links[0].Name != "bar" { + t.Fatal("unexpected link name") + } +} + +func TestObjectStat(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"bazz", "Links":[{"Name":"bar", "Hash":"`+p1.Cid().String()+`", "Size":3}]}`)) + if err != nil { + t.Fatal(err) + } + + stat, err := api.Object().Stat(ctx, p2) + if err != nil { + t.Fatal(err) + } + + if stat.Cid.String() != p2.Cid().String() { + t.Error("unexpected stat.Cid") + } + + if stat.NumLinks != 1 { + t.Errorf("unexpected stat.NumLinks") + } + + if stat.BlockSize != 51 { + t.Error("unexpected stat.BlockSize") + } + + if stat.LinksSize != 47 { + t.Errorf("unexpected stat.LinksSize: %d", stat.LinksSize) + } + + if stat.DataSize != 4 { + t.Error("unexpected stat.DataSize") + } + + if stat.CumulativeSize != 54 { + t.Error("unexpected stat.DataSize") + } +} + +func TestObjectAddLink(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"bazz", "Links":[{"Name":"bar", "Hash":"`+p1.Cid().String()+`", "Size":3}]}`)) + if err != nil { + t.Fatal(err) + } + + p3, err := api.Object().AddLink(ctx, p2, "abc", p2) + if err != nil { + t.Fatal(err) + } + + links, err := api.Object().Links(ctx, p3) + if err != nil { + t.Fatal(err) + } + + if len(links) != 2 { + t.Errorf("unexpected number of links: %d", len(links)) + } + + if links[0].Name != "abc" { + t.Errorf("unexpected link 0 name: %s", links[0].Name) + } + + if links[1].Name != "bar" { + t.Errorf("unexpected link 1 name: %s", links[1].Name) + } +} + +func TestObjectAddLinkCreate(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"bazz", "Links":[{"Name":"bar", "Hash":"`+p1.Cid().String()+`", "Size":3}]}`)) + if err != nil { + t.Fatal(err) + } + + p3, err := api.Object().AddLink(ctx, p2, "abc/d", p2) + if err == nil { + t.Fatal("expected an error") + } + if err.Error() != "no link by that name" { + t.Fatalf("unexpected error: %s", err.Error()) + } + + p3, err = api.Object().AddLink(ctx, p2, "abc/d", p2, opt.Object.Create(true)) + if err != nil { + t.Fatal(err) + } + + links, err := api.Object().Links(ctx, p3) + if err != nil { + t.Fatal(err) + } + + if len(links) != 2 { + t.Errorf("unexpected number of links: %d", len(links)) + } + + if links[0].Name != "abc" { + t.Errorf("unexpected link 0 name: %s", links[0].Name) + } + + if links[1].Name != "bar" { + t.Errorf("unexpected link 1 name: %s", links[1].Name) + } +} + +func TestObjectRmLink(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"bazz", "Links":[{"Name":"bar", "Hash":"`+p1.Cid().String()+`", "Size":3}]}`)) + if err != nil { + t.Fatal(err) + } + + p3, err := api.Object().RmLink(ctx, p2, "bar") + if err != nil { + t.Fatal(err) + } + + links, err := api.Object().Links(ctx, p3) + if err != nil { + t.Fatal(err) + } + + if len(links) != 0 { + t.Errorf("unexpected number of links: %d", len(links)) + } +} + +func TestObjectAddData(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().AppendData(ctx, p1, strings.NewReader("bar")) + if err != nil { + t.Fatal(err) + } + + r, err := api.Object().Data(ctx, p2) + if err != nil { + t.Fatal(err) + } + + data, err := ioutil.ReadAll(r) + + if string(data) != "foobar" { + t.Error("unexpected data") + } +} + +func TestObjectSetData(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().SetData(ctx, p1, strings.NewReader("bar")) + if err != nil { + t.Fatal(err) + } + + r, err := api.Object().Data(ctx, p2) + if err != nil { + t.Fatal(err) + } + + data, err := ioutil.ReadAll(r) + + if string(data) != "bar" { + t.Error("unexpected data") + } +} + +func TestDiffTest(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + p1, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"foo"}`)) + if err != nil { + t.Fatal(err) + } + + p2, err := api.Object().Put(ctx, strings.NewReader(`{"Data":"bar"}`)) + if err != nil { + t.Fatal(err) + } + + changes, err := api.Object().Diff(ctx, p1, p2) + if err != nil { + t.Fatal(err) + } + + if len(changes) != 1 { + t.Fatal("unexpected changes len") + } + + if changes[0].Type != iface.DiffMod { + t.Fatal("unexpected change type") + } + + if changes[0].Before.String() != p1.String() { + t.Fatal("unexpected before path") + } + + if changes[0].After.String() != p2.String() { + t.Fatal("unexpected before path") + } +} diff --git a/coreiface/tests/path_test.go b/coreiface/tests/path_test.go new file mode 100644 index 0000000000..e054280733 --- /dev/null +++ b/coreiface/tests/path_test.go @@ -0,0 +1,154 @@ +package tests_test + +import ( + "context" + "strings" + "testing" + + coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +func TestMutablePath(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + // get self /ipns path + keys, err := api.Key().List(ctx) + if err != nil { + t.Fatal(err) + } + + if !keys[0].Path().Mutable() { + t.Error("expected self /ipns path to be mutable") + } + + blk, err := api.Block().Put(ctx, strings.NewReader(`foo`)) + if err != nil { + t.Error(err) + } + + if blk.Path().Mutable() { + t.Error("expected /ipld path to be immutable") + } +} + +func TestPathRemainder(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) + if err != nil { + t.Fatal(err) + } + + p1, err := coreiface.ParsePath(obj.String() + "/foo/bar") + if err != nil { + t.Error(err) + } + + rp1, err := api.ResolvePath(ctx, p1) + if err != nil { + t.Fatal(err) + } + + if rp1.Remainder() != "foo/bar" { + t.Error("expected to get path remainder") + } +} + +func TestEmptyPathRemainder(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) + if err != nil { + t.Fatal(err) + } + + if obj.Remainder() != "" { + t.Error("expected the resolved path to not have a remainder") + } + + p1, err := coreiface.ParsePath(obj.String()) + if err != nil { + t.Error(err) + } + + rp1, err := api.ResolvePath(ctx, p1) + if err != nil { + t.Fatal(err) + } + + if rp1.Remainder() != "" { + t.Error("expected the resolved path to not have a remainder") + } +} + +func TestInvalidPathRemainder(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) + if err != nil { + t.Fatal(err) + } + + p1, err := coreiface.ParsePath(obj.String() + "/bar/baz") + if err != nil { + t.Error(err) + } + + _, err = api.ResolvePath(ctx, p1) + if err == nil || err.Error() != "no such link found" { + t.Fatalf("unexpected error: %s", err) + } +} + +func TestPathRoot(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + blk, err := api.Block().Put(ctx, strings.NewReader(`foo`), options.Block.Format("raw")) + if err != nil { + t.Error(err) + } + + obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"/": "`+blk.Path().Cid().String()+`"}}`)) + if err != nil { + t.Fatal(err) + } + + p1, err := coreiface.ParsePath(obj.String() + "/foo") + if err != nil { + t.Error(err) + } + + rp, err := api.ResolvePath(ctx, p1) + if err != nil { + t.Fatal(err) + } + + if rp.Root().String() != obj.Cid().String() { + t.Error("unexpected path root") + } + + if rp.Cid().String() != blk.Path().Cid().String() { + t.Error("unexpected path cid") + } +} diff --git a/coreiface/tests/pin_test.go b/coreiface/tests/pin_test.go new file mode 100644 index 0000000000..5c4b82bc25 --- /dev/null +++ b/coreiface/tests/pin_test.go @@ -0,0 +1,214 @@ +package tests_test + +import ( + "context" + "strings" + "testing" + + opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" +) + +func TestPinAdd(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + p, err := api.Unixfs().Add(ctx, strFile("foo")()) + if err != nil { + t.Error(err) + } + + err = api.Pin().Add(ctx, p) + if err != nil { + t.Error(err) + } +} + +func TestPinSimple(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + p, err := api.Unixfs().Add(ctx, strFile("foo")()) + if err != nil { + t.Error(err) + } + + err = api.Pin().Add(ctx, p) + if err != nil { + t.Error(err) + } + + list, err := api.Pin().Ls(ctx) + if err != nil { + t.Fatal(err) + } + + if len(list) != 1 { + t.Errorf("unexpected pin list len: %d", len(list)) + } + + if list[0].Path().Cid().String() != p.Cid().String() { + t.Error("paths don't match") + } + + if list[0].Type() != "recursive" { + t.Error("unexpected pin type") + } + + err = api.Pin().Rm(ctx, p) + if err != nil { + t.Fatal(err) + } + + list, err = api.Pin().Ls(ctx) + if err != nil { + t.Fatal(err) + } + + if len(list) != 0 { + t.Errorf("unexpected pin list len: %d", len(list)) + } +} + +func TestPinRecursive(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + p0, err := api.Unixfs().Add(ctx, strFile("foo")()) + if err != nil { + t.Error(err) + } + + p1, err := api.Unixfs().Add(ctx, strFile("bar")()) + if err != nil { + t.Error(err) + } + + p2, err := api.Dag().Put(ctx, strings.NewReader(`{"lnk": {"/": "`+p0.Cid().String()+`"}}`)) + if err != nil { + t.Error(err) + } + + p3, err := api.Dag().Put(ctx, strings.NewReader(`{"lnk": {"/": "`+p1.Cid().String()+`"}}`)) + if err != nil { + t.Error(err) + } + + err = api.Pin().Add(ctx, p2) + if err != nil { + t.Error(err) + } + + err = api.Pin().Add(ctx, p3, opt.Pin.Recursive(false)) + if err != nil { + t.Error(err) + } + + list, err := api.Pin().Ls(ctx) + if err != nil { + t.Fatal(err) + } + + if len(list) != 3 { + t.Errorf("unexpected pin list len: %d", len(list)) + } + + list, err = api.Pin().Ls(ctx, opt.Pin.Type.Direct()) + if err != nil { + t.Fatal(err) + } + + if len(list) != 1 { + t.Errorf("unexpected pin list len: %d", len(list)) + } + + if list[0].Path().String() != p3.String() { + t.Error("unexpected path") + } + + list, err = api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) + if err != nil { + t.Fatal(err) + } + + if len(list) != 1 { + t.Errorf("unexpected pin list len: %d", len(list)) + } + + if list[0].Path().String() != p2.String() { + t.Error("unexpected path") + } + + list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) + if err != nil { + t.Fatal(err) + } + + if len(list) != 1 { + t.Errorf("unexpected pin list len: %d", len(list)) + } + + if list[0].Path().Cid().String() != p0.Cid().String() { + t.Error("unexpected path") + } + + res, err := api.Pin().Verify(ctx) + if err != nil { + t.Fatal(err) + } + n := 0 + for r := range res { + if !r.Ok() { + t.Error("expected pin to be ok") + } + n++ + } + + if n != 1 { + t.Errorf("unexpected verify result count: %d", n) + } + + //TODO: figure out a way to test verify without touching IpfsNode + /* + err = api.Block().Rm(ctx, p0, opt.Block.Force(true)) + if err != nil { + t.Fatal(err) + } + + res, err = api.Pin().Verify(ctx) + if err != nil { + t.Fatal(err) + } + n = 0 + for r := range res { + if r.Ok() { + t.Error("expected pin to not be ok") + } + + if len(r.BadNodes()) != 1 { + t.Fatalf("unexpected badNodes len") + } + + if r.BadNodes()[0].Path().Cid().String() != p0.Cid().String() { + t.Error("unexpected badNode path") + } + + if r.BadNodes()[0].Err().Error() != "merkledag: not found" { + t.Errorf("unexpected badNode error: %s", r.BadNodes()[0].Err().Error()) + } + n++ + } + + if n != 1 { + t.Errorf("unexpected verify result count: %d", n) + } + */ +} diff --git a/coreiface/tests/pubsub_test.go b/coreiface/tests/pubsub_test.go new file mode 100644 index 0000000000..19a1eba521 --- /dev/null +++ b/coreiface/tests/pubsub_test.go @@ -0,0 +1,106 @@ +package tests_test + +import ( + "context" + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "testing" + "time" +) + +func TestBasicPubSub(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + apis, err := makeAPISwarm(ctx, true, 2) + if err != nil { + t.Fatal(err) + } + + sub, err := apis[0].PubSub().Subscribe(ctx, "testch") + if err != nil { + t.Fatal(err) + } + + go func() { + tick := time.Tick(100 * time.Millisecond) + + for { + err = apis[1].PubSub().Publish(ctx, "testch", []byte("hello world")) + if err != nil { + t.Fatal(err) + } + select { + case <-tick: + case <-ctx.Done(): + return + } + } + }() + + m, err := sub.Next(ctx) + if err != nil { + t.Fatal(err) + } + + if string(m.Data()) != "hello world" { + t.Errorf("got invalid data: %s", string(m.Data())) + } + + self1, err := apis[1].Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if m.From() != self1.ID() { + t.Errorf("m.From didn't match") + } + + peers, err := apis[1].PubSub().Peers(ctx, options.PubSub.Topic("testch")) + if err != nil { + t.Fatal(err) + } + + if len(peers) != 1 { + t.Fatalf("got incorrect number of peers: %d", len(peers)) + } + + self0, err := apis[0].Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + + if peers[0] != self0.ID() { + t.Errorf("peer didn't match") + } + + peers, err = apis[1].PubSub().Peers(ctx, options.PubSub.Topic("nottestch")) + if err != nil { + t.Fatal(err) + } + + if len(peers) != 0 { + t.Fatalf("got incorrect number of peers: %d", len(peers)) + } + + topics, err := apis[0].PubSub().Ls(ctx) + if err != nil { + t.Fatal(err) + } + + if len(topics) != 1 { + t.Fatalf("got incorrect number of topics: %d", len(peers)) + } + + if topics[0] != "testch" { + t.Errorf("topic didn't match") + } + + topics, err = apis[1].PubSub().Ls(ctx) + if err != nil { + t.Fatal(err) + } + + if len(topics) != 0 { + t.Fatalf("got incorrect number of topics: %d", len(peers)) + } +} diff --git a/coreiface/tests/unixfs_test.go b/coreiface/tests/unixfs_test.go new file mode 100644 index 0000000000..d7ddae9633 --- /dev/null +++ b/coreiface/tests/unixfs_test.go @@ -0,0 +1,963 @@ +package tests_test + +import ( + "bytes" + "context" + "encoding/base64" + "fmt" + "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + "io" + "io/ioutil" + "math" + "os" + "strconv" + "strings" + "sync" + "testing" + + "github.com/ipfs/go-ipfs/core" + "github.com/ipfs/go-ipfs/core/coreapi" + coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + mock "github.com/ipfs/go-ipfs/core/mock" + "github.com/ipfs/go-ipfs/keystore" + "github.com/ipfs/go-ipfs/repo" + + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + "gx/ipfs/QmRBaUEQEeFWywfrZJ64QgsmvcqgLSK3VbvGMR2NM2Edpf/go-libp2p/p2p/net/mock" + cbor "gx/ipfs/QmRoARq3nkUb13HSKZGepCZSWe5GrVPwx7xURJGZ7KWv9V/go-ipld-cbor" + "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" + "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" + "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs" + "gx/ipfs/QmcZfkbgwwwH5ZLTQRHkSQBDiDqd3skY2eU6MZRgWuXcse/go-ipfs-config" + mdag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + syncds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" +) + +const testPeerID = "QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe" + +// `echo -n 'hello, world!' | ipfs add` +var hello = "/ipfs/QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk" +var helloStr = "hello, world!" + +// `echo -n | ipfs add` +var emptyFile = "/ipfs/QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH" + +func makeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) { + mn := mocknet.New(ctx) + + nodes := make([]*core.IpfsNode, n) + apis := make([]coreiface.CoreAPI, n) + + for i := 0; i < n; i++ { + var ident config.Identity + if fullIdentity { + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) + if err != nil { + return nil, err + } + + id, err := peer.IDFromPublicKey(pk) + if err != nil { + return nil, err + } + + kbytes, err := sk.Bytes() + if err != nil { + return nil, err + } + + ident = config.Identity{ + PeerID: id.Pretty(), + PrivKey: base64.StdEncoding.EncodeToString(kbytes), + } + } else { + ident = config.Identity{ + PeerID: testPeerID, + } + } + + c := config.Config{} + c.Addresses.Swarm = []string{fmt.Sprintf("/ip4/127.0.%d.1/tcp/4001", i)} + c.Identity = ident + + r := &repo.Mock{ + C: c, + D: syncds.MutexWrap(datastore.NewMapDatastore()), + K: keystore.NewMemKeystore(), + } + + node, err := core.NewNode(ctx, &core.BuildCfg{ + Repo: r, + Host: mock.MockHostOption(mn), + Online: fullIdentity, + ExtraOpts: map[string]bool{ + "pubsub": true, + }, + }) + if err != nil { + return nil, err + } + nodes[i] = node + apis[i], err = coreapi.NewCoreAPI(node) + if err != nil { + return nil, err + } + } + + err := mn.LinkAll() + if err != nil { + return nil, err + } + + bsinf := core.BootstrapConfigWithPeers( + []pstore.PeerInfo{ + nodes[0].Peerstore.PeerInfo(nodes[0].Identity), + }, + ) + + for _, n := range nodes[1:] { + if err := n.Bootstrap(bsinf); err != nil { + return nil, err + } + } + + return apis, nil +} + +func makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { + api, err := makeAPISwarm(ctx, false, 1) + if err != nil { + return nil, err + } + + return api[0], nil +} + +func strFile(data string) func() files.Node { + return func() files.Node { + return files.NewBytesFile([]byte(data)) + } +} + +func twoLevelDir() func() files.Node { + return func() files.Node { + return files.NewMapDirectory(map[string]files.Node{ + "abc": files.NewMapDirectory(map[string]files.Node{ + "def": files.NewBytesFile([]byte("world")), + }), + + "bar": files.NewBytesFile([]byte("hello2")), + "foo": files.NewBytesFile([]byte("hello1")), + }) + } +} + +func flatDir() files.Node { + return files.NewMapDirectory(map[string]files.Node{ + "bar": files.NewBytesFile([]byte("hello2")), + "foo": files.NewBytesFile([]byte("hello1")), + }) +} + +func wrapped(name string) func(f files.Node) files.Node { + return func(f files.Node) files.Node { + return files.NewMapDirectory(map[string]files.Node{ + name: f, + }) + } +} + +func TestAdd(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + p := func(h string) coreiface.ResolvedPath { + c, err := cid.Parse(h) + if err != nil { + t.Fatal(err) + } + return coreiface.IpfsPath(c) + } + + cases := []struct { + name string + data func() files.Node + expect func(files.Node) files.Node + + apiOpts []options.ApiOption + + path string + err string + + wrap string + + events []coreiface.AddEvent + + opts []options.UnixfsAddOption + }{ + // Simple cases + { + name: "simpleAdd", + data: strFile(helloStr), + path: hello, + opts: []options.UnixfsAddOption{}, + }, + { + name: "addEmpty", + data: strFile(""), + path: emptyFile, + }, + // CIDv1 version / rawLeaves + { + name: "addCidV1", + data: strFile(helloStr), + path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + opts: []options.UnixfsAddOption{options.Unixfs.CidVersion(1)}, + }, + { + name: "addCidV1NoLeaves", + data: strFile(helloStr), + path: "/ipfs/zdj7WY4GbN8NDbTW1dfCShAQNVovams2xhq9hVCx5vXcjvT8g", + opts: []options.UnixfsAddOption{options.Unixfs.CidVersion(1), options.Unixfs.RawLeaves(false)}, + }, + // Non sha256 hash vs CID + { + name: "addCidSha3", + data: strFile(helloStr), + path: "/ipfs/zb2wwnYtXBxpndNABjtYxWAPt3cwWNRnc11iT63fvkYV78iRb", + opts: []options.UnixfsAddOption{options.Unixfs.Hash(mh.SHA3_256)}, + }, + { + name: "addCidSha3Cid0", + data: strFile(helloStr), + err: "CIDv0 only supports sha2-256", + opts: []options.UnixfsAddOption{options.Unixfs.CidVersion(0), options.Unixfs.Hash(mh.SHA3_256)}, + }, + // Inline + { + name: "addInline", + data: strFile(helloStr), + path: "/ipfs/zaYomJdLndMku8P9LHngHB5w2CQ7NenLbv", + opts: []options.UnixfsAddOption{options.Unixfs.Inline(true)}, + }, + { + name: "addInlineLimit", + data: strFile(helloStr), + path: "/ipfs/zaYomJdLndMku8P9LHngHB5w2CQ7NenLbv", + opts: []options.UnixfsAddOption{options.Unixfs.InlineLimit(32), options.Unixfs.Inline(true)}, + }, + { + name: "addInlineZero", + data: strFile(""), + path: "/ipfs/z2yYDV", + opts: []options.UnixfsAddOption{options.Unixfs.InlineLimit(0), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true)}, + }, + { //TODO: after coreapi add is used in `ipfs add`, consider making this default for inline + name: "addInlineRaw", + data: strFile(helloStr), + path: "/ipfs/zj7Gr8AcBreqGEfrnR5kPFe", + opts: []options.UnixfsAddOption{options.Unixfs.InlineLimit(32), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true)}, + }, + // Chunker / Layout + { + name: "addChunks", + data: strFile(strings.Repeat("aoeuidhtns", 200)), + path: "/ipfs/QmRo11d4QJrST47aaiGVJYwPhoNA4ihRpJ5WaxBWjWDwbX", + opts: []options.UnixfsAddOption{options.Unixfs.Chunker("size-4")}, + }, + { + name: "addChunksTrickle", + data: strFile(strings.Repeat("aoeuidhtns", 200)), + path: "/ipfs/QmNNhDGttafX3M1wKWixGre6PrLFGjnoPEDXjBYpTv93HP", + opts: []options.UnixfsAddOption{options.Unixfs.Chunker("size-4"), options.Unixfs.Layout(options.TrickleLayout)}, + }, + // Local + { + name: "addLocal", // better cases in sharness + data: strFile(helloStr), + path: hello, + apiOpts: []options.ApiOption{options.Api.Offline(true)}, + }, + { + name: "hashOnly", // test (non)fetchability + data: strFile(helloStr), + path: hello, + opts: []options.UnixfsAddOption{options.Unixfs.HashOnly(true)}, + }, + // multi file + { + name: "simpleDir", + data: flatDir, + wrap: "t", + path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp", + }, + { + name: "twoLevelDir", + data: twoLevelDir(), + wrap: "t", + path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", + }, + // wrapped + { + name: "addWrapped", + path: "/ipfs/QmVE9rNpj5doj7XHzp5zMUxD7BJgXEqx4pe3xZ3JBReWHE", + data: func() files.Node { + return files.NewBytesFile([]byte(helloStr)) + }, + wrap: "foo", + expect: wrapped("foo"), + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, + }, + { + name: "addNotWrappedDirFile", + path: hello, + data: func() files.Node { + return files.NewBytesFile([]byte(helloStr)) + }, + wrap: "foo", + }, + { + name: "stdinWrapped", + path: "/ipfs/QmU3r81oZycjHS9oaSHw37ootMFuFUw1DvMLKXPsezdtqU", + data: func() files.Node { + return files.NewBytesFile([]byte(helloStr)) + }, + expect: func(files.Node) files.Node { + return files.NewMapDirectory(map[string]files.Node{ + "QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk": files.NewBytesFile([]byte(helloStr)), + }) + }, + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, + }, + { + name: "stdinNamed", + path: "/ipfs/QmQ6cGBmb3ZbdrQW1MRm1RJnYnaxCqfssz7CrTa9NEhQyS", + data: func() files.Node { + rf, err := files.NewReaderPathFile(os.Stdin.Name(), ioutil.NopCloser(strings.NewReader(helloStr)), nil) + if err != nil { + panic(err) + } + + return rf + }, + expect: func(files.Node) files.Node { + return files.NewMapDirectory(map[string]files.Node{ + "test": files.NewBytesFile([]byte(helloStr)), + }) + }, + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.StdinName("test")}, + }, + { + name: "twoLevelDirWrapped", + data: twoLevelDir(), + wrap: "t", + expect: wrapped("t"), + path: "/ipfs/QmPwsL3T5sWhDmmAWZHAzyjKtMVDS9a11aHNRqb3xoVnmg", + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, + }, + { + name: "twoLevelInlineHash", + data: twoLevelDir(), + wrap: "t", + expect: wrapped("t"), + path: "/ipfs/zBunoruKoyCHKkALNSWxDvj4L7yuQnMgQ4hUa9j1Z64tVcDEcu6Zdetyu7eeFCxMPfxb7YJvHeFHoFoHMkBUQf6vfdhmi", + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true), options.Unixfs.Hash(mh.SHA3)}, + }, + // hidden + { + name: "hiddenFiles", + data: func() files.Node { + return files.NewMapDirectory(map[string]files.Node{ + ".bar": files.NewBytesFile([]byte("hello2")), + "bar": files.NewBytesFile([]byte("hello2")), + "foo": files.NewBytesFile([]byte("hello1")), + }) + }, + wrap: "t", + path: "/ipfs/QmehGvpf2hY196MzDFmjL8Wy27S4jbgGDUAhBJyvXAwr3g", + opts: []options.UnixfsAddOption{options.Unixfs.Hidden(true)}, + }, + { + name: "hiddenFileAlwaysAdded", + data: func() files.Node { + return files.NewBytesFile([]byte(helloStr)) + }, + wrap: ".foo", + path: hello, + }, + { + name: "hiddenFilesNotAdded", + data: func() files.Node { + return files.NewMapDirectory(map[string]files.Node{ + ".bar": files.NewBytesFile([]byte("hello2")), + "bar": files.NewBytesFile([]byte("hello2")), + "foo": files.NewBytesFile([]byte("hello1")), + }) + }, + expect: func(files.Node) files.Node { + return flatDir() + }, + wrap: "t", + path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp", + opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)}, + }, + // Events / Progress + { + name: "simpleAddEvent", + data: strFile(helloStr), + path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + events: []coreiface.AddEvent{ + {Name: "zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", Path: p("zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd"), Size: strconv.Itoa(len(helloStr))}, + }, + opts: []options.UnixfsAddOption{options.Unixfs.RawLeaves(true)}, + }, + { + name: "silentAddEvent", + data: twoLevelDir(), + path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", + events: []coreiface.AddEvent{ + {Name: "t/abc", Path: p("QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt"), Size: "62"}, + {Name: "t", Path: p("QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr"), Size: "229"}, + }, + wrap: "t", + opts: []options.UnixfsAddOption{options.Unixfs.Silent(true)}, + }, + { + name: "dirAddEvents", + data: twoLevelDir(), + path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", + events: []coreiface.AddEvent{ + {Name: "t/abc/def", Path: p("QmNyJpQkU1cEkBwMDhDNFstr42q55mqG5GE5Mgwug4xyGk"), Size: "13"}, + {Name: "t/bar", Path: p("QmS21GuXiRMvJKHos4ZkEmQDmRBqRaF5tQS2CQCu2ne9sY"), Size: "14"}, + {Name: "t/foo", Path: p("QmfAjGiVpTN56TXi6SBQtstit5BEw3sijKj1Qkxn6EXKzJ"), Size: "14"}, + {Name: "t/abc", Path: p("QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt"), Size: "62"}, + {Name: "t", Path: p("QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr"), Size: "229"}, + }, + wrap: "t", + }, + { + name: "progress1M", + data: func() files.Node { + return files.NewReaderFile(bytes.NewReader(bytes.Repeat([]byte{0}, 1000000))) + }, + path: "/ipfs/QmXXNNbwe4zzpdMg62ZXvnX1oU7MwSrQ3vAEtuwFKCm1oD", + events: []coreiface.AddEvent{ + {Name: "", Bytes: 262144}, + {Name: "", Bytes: 524288}, + {Name: "", Bytes: 786432}, + {Name: "", Bytes: 1000000}, + {Name: "QmXXNNbwe4zzpdMg62ZXvnX1oU7MwSrQ3vAEtuwFKCm1oD", Path: p("QmXXNNbwe4zzpdMg62ZXvnX1oU7MwSrQ3vAEtuwFKCm1oD"), Size: "1000256"}, + }, + wrap: "", + opts: []options.UnixfsAddOption{options.Unixfs.Progress(true)}, + }, + } + + for _, testCase := range cases { + t.Run(testCase.name, func(t *testing.T) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + // recursive logic + + data := testCase.data() + if testCase.wrap != "" { + data = files.NewMapDirectory(map[string]files.Node{ + testCase.wrap: data, + }) + } + + // handle events if relevant to test case + + opts := testCase.opts + eventOut := make(chan interface{}) + var evtWg sync.WaitGroup + if len(testCase.events) > 0 { + opts = append(opts, options.Unixfs.Events(eventOut)) + evtWg.Add(1) + + go func() { + defer evtWg.Done() + expected := testCase.events + + for evt := range eventOut { + event, ok := evt.(*coreiface.AddEvent) + if !ok { + t.Fatal("unexpected event type") + } + + if len(expected) < 1 { + t.Fatal("got more events than expected") + } + + if expected[0].Size != event.Size { + t.Errorf("Event.Size didn't match, %s != %s", expected[0].Size, event.Size) + } + + if expected[0].Name != event.Name { + t.Errorf("Event.Name didn't match, %s != %s", expected[0].Name, event.Name) + } + + if expected[0].Path != nil && event.Path != nil { + if expected[0].Path.Cid().String() != event.Path.Cid().String() { + t.Errorf("Event.Hash didn't match, %s != %s", expected[0].Path, event.Path) + } + } else if event.Path != expected[0].Path { + t.Errorf("Event.Hash didn't match, %s != %s", expected[0].Path, event.Path) + } + if expected[0].Bytes != event.Bytes { + t.Errorf("Event.Bytes didn't match, %d != %d", expected[0].Bytes, event.Bytes) + } + + expected = expected[1:] + } + + if len(expected) > 0 { + t.Fatalf("%d event(s) didn't arrive", len(expected)) + } + }() + } + + tapi, err := api.WithOptions(testCase.apiOpts...) + if err != nil { + t.Fatal(err) + } + + // Add! + + p, err := tapi.Unixfs().Add(ctx, data, opts...) + close(eventOut) + evtWg.Wait() + if testCase.err != "" { + if err == nil { + t.Fatalf("expected an error: %s", testCase.err) + } + if err.Error() != testCase.err { + t.Fatalf("expected an error: '%s' != '%s'", err.Error(), testCase.err) + } + return + } + if err != nil { + t.Fatal(err) + } + + if p.String() != testCase.path { + t.Errorf("expected path %s, got: %s", testCase.path, p) + } + + // compare file structure with Unixfs().Get + + var cmpFile func(origName string, orig files.Node, gotName string, got files.Node) + cmpFile = func(origName string, orig files.Node, gotName string, got files.Node) { + _, origDir := orig.(files.Directory) + _, gotDir := got.(files.Directory) + + if origDir != gotDir { + t.Fatal("file type mismatch") + } + + if origName != gotName { + t.Errorf("file name mismatch, orig='%s', got='%s'", origName, gotName) + } + + if !gotDir { + defer orig.Close() + defer got.Close() + + do, err := ioutil.ReadAll(orig.(files.File)) + if err != nil { + t.Fatal(err) + } + + dg, err := ioutil.ReadAll(got.(files.File)) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(do, dg) { + t.Fatal("data not equal") + } + + return + } + + origIt := orig.(files.Directory).Entries() + gotIt := got.(files.Directory).Entries() + + for { + if origIt.Next() { + if !gotIt.Next() { + t.Fatal("gotIt out of entries before origIt") + } + } else { + if gotIt.Next() { + t.Fatal("origIt out of entries before gotIt") + } + break + } + + cmpFile(origIt.Name(), origIt.Node(), gotIt.Name(), gotIt.Node()) + } + if origIt.Err() != nil { + t.Fatal(origIt.Err()) + } + if gotIt.Err() != nil { + t.Fatal(gotIt.Err()) + } + } + + f, err := tapi.Unixfs().Get(ctx, p) + if err != nil { + t.Fatal(err) + } + + orig := testCase.data() + if testCase.expect != nil { + orig = testCase.expect(orig) + } + + cmpFile("", orig, "", f) + }) + } +} + +func TestAddPinned(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Unixfs().Add(ctx, strFile(helloStr)(), options.Unixfs.Pin(true)) + if err != nil { + t.Error(err) + } + + pins, err := api.Pin().Ls(ctx) + if len(pins) != 1 { + t.Fatalf("expected 1 pin, got %d", len(pins)) + } + + if pins[0].Path().String() != "/ipld/QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk" { + t.Fatalf("got unexpected pin: %s", pins[0].Path().String()) + } +} + +func TestAddHashOnly(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + p, err := api.Unixfs().Add(ctx, strFile(helloStr)(), options.Unixfs.HashOnly(true)) + if err != nil { + t.Error(err) + } + + if p.String() != hello { + t.Errorf("unxepected path: %s", p.String()) + } + + _, err = api.Block().Get(ctx, p) + if err == nil { + t.Fatal("expected an error") + } + if err.Error() != "blockservice: key not found" { + t.Errorf("unxepected error: %s", err.Error()) + } +} + +func TestGetEmptyFile(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + _, err = api.Unixfs().Add(ctx, files.NewBytesFile([]byte{})) + if err != nil { + t.Fatal(err) + } + + emptyFilePath, err := coreiface.ParsePath(emptyFile) + if err != nil { + t.Fatal(err) + } + + r, err := api.Unixfs().Get(ctx, emptyFilePath) + if err != nil { + t.Fatal(err) + } + + buf := make([]byte, 1) // non-zero so that Read() actually tries to read + n, err := io.ReadFull(r.(files.File), buf) + if err != nil && err != io.EOF { + t.Error(err) + } + if !bytes.HasPrefix(buf, []byte{0x00}) { + t.Fatalf("expected empty data, got [%s] [read=%d]", buf, n) + } +} + +func TestGetDir(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + edir := unixfs.EmptyDirNode() + _, err = api.Dag().Put(ctx, bytes.NewReader(edir.RawData()), options.Dag.Codec(cid.DagProtobuf), options.Dag.InputEnc("raw")) + if err != nil { + t.Error(err) + } + p := coreiface.IpfsPath(edir.Cid()) + + emptyDir, err := api.Object().New(ctx, options.Object.Type("unixfs-dir")) + if err != nil { + t.Error(err) + } + + if p.String() != coreiface.IpfsPath(emptyDir.Cid()).String() { + t.Fatalf("expected path %s, got: %s", emptyDir.Cid(), p.String()) + } + + r, err := api.Unixfs().Get(ctx, coreiface.IpfsPath(emptyDir.Cid())) + if err != nil { + t.Error(err) + } + + if _, ok := r.(files.Directory); !ok { + t.Fatalf("expected a directory") + } +} + +func TestGetNonUnixfs(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + nd := new(mdag.ProtoNode) + _, err = api.Dag().Put(ctx, bytes.NewReader(nd.RawData()), options.Dag.Codec(nd.CidBuilder().GetCodec()), options.Dag.InputEnc("raw")) + if err != nil { + t.Error(err) + } + + _, err = api.Unixfs().Get(ctx, coreiface.IpfsPath(nd.Cid())) + if !strings.Contains(err.Error(), "proto: required field") { + t.Fatalf("expected protobuf error, got: %s", err) + } +} + +func TestLs(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + r := strings.NewReader("content-of-file") + p, err := api.Unixfs().Add(ctx, files.NewMapDirectory(map[string]files.Node{ + "0": files.NewMapDirectory(map[string]files.Node{ + "name-of-file": files.NewReaderFile(r), + }), + })) + if err != nil { + t.Error(err) + } + + links, err := api.Unixfs().Ls(ctx, p) + if err != nil { + t.Error(err) + } + + if len(links) != 1 { + t.Fatalf("expected 1 link, got %d", len(links)) + } + if links[0].Size != 23 { + t.Fatalf("expected size = 23, got %d", links[0].Size) + } + if links[0].Name != "name-of-file" { + t.Fatalf("expected name = name-of-file, got %s", links[0].Name) + } + if links[0].Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { + t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", links[0].Cid) + } +} + +func TestEntriesExpired(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + r := strings.NewReader("content-of-file") + p, err := api.Unixfs().Add(ctx, files.NewMapDirectory(map[string]files.Node{ + "0": files.NewMapDirectory(map[string]files.Node{ + "name-of-file": files.NewReaderFile(r), + }), + })) + if err != nil { + t.Error(err) + } + + ctx, cancel := context.WithCancel(ctx) + + nd, err := api.Unixfs().Get(ctx, p) + if err != nil { + t.Error(err) + } + cancel() + + it := files.ToDir(nd).Entries() + if it == nil { + t.Fatal("it was nil") + } + + if it.Next() { + t.Fatal("Next succeeded") + } + + if it.Err() != context.Canceled { + t.Fatalf("unexpected error %s", it.Err()) + } + + if it.Next() { + t.Fatal("Next succeeded") + } +} + +func TestLsEmptyDir(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Unixfs().Add(ctx, files.NewMapDirectory(map[string]files.Node{"0": files.NewSliceDirectory([]files.DirEntry{})})) + if err != nil { + t.Error(err) + } + + emptyDir, err := api.Object().New(ctx, options.Object.Type("unixfs-dir")) + if err != nil { + t.Error(err) + } + + links, err := api.Unixfs().Ls(ctx, coreiface.IpfsPath(emptyDir.Cid())) + if err != nil { + t.Error(err) + } + + if len(links) != 0 { + t.Fatalf("expected 0 links, got %d", len(links)) + } +} + +// TODO(lgierth) this should test properly, with len(links) > 0 +func TestLsNonUnixfs(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + nd, err := cbor.WrapObject(map[string]interface{}{"foo": "bar"}, math.MaxUint64, -1) + if err != nil { + t.Fatal(err) + } + + _, err = api.Dag().Put(ctx, bytes.NewReader(nd.RawData()), options.Dag.Codec(cid.DagCBOR), options.Dag.InputEnc("raw")) + if err != nil { + t.Error(err) + } + + links, err := api.Unixfs().Ls(ctx, coreiface.IpfsPath(nd.Cid())) + if err != nil { + t.Error(err) + } + + if len(links) != 0 { + t.Fatalf("expected 0 links, got %d", len(links)) + } +} + +type closeTestF struct { + files.File + closed bool + + t *testing.T +} + +type closeTestD struct { + files.Directory + closed bool + + t *testing.T +} + +func (f *closeTestD) Close() error { + if f.closed { + f.t.Fatal("already closed") + } + f.closed = true + return nil +} + +func (f *closeTestF) Close() error { + if f.closed { + f.t.Fatal("already closed") + } + f.closed = true + return nil +} + +func TestAddCloses(t *testing.T) { + ctx := context.Background() + api, err := makeAPI(ctx) + if err != nil { + t.Error(err) + } + + n4 := &closeTestF{files.NewBytesFile([]byte("foo")), false, t} + d3 := &closeTestD{files.NewMapDirectory(map[string]files.Node{ + "sub": n4, + }), false, t} + n2 := &closeTestF{files.NewBytesFile([]byte("bar")), false, t} + n1 := &closeTestF{files.NewBytesFile([]byte("baz")), false, t} + d0 := &closeTestD{files.NewMapDirectory(map[string]files.Node{ + "a": d3, + "b": n1, + "c": n2, + }), false, t} + + _, err = api.Unixfs().Add(ctx, d0) + if err != nil { + t.Error(err) + } + + d0.Close() // Adder doesn't close top-level file + + for i, n := range []*closeTestF{n1, n2, n4} { + if !n.closed { + t.Errorf("file %d not closed!", i) + } + } + + for i, n := range []*closeTestD{d0, d3} { + if !n.closed { + t.Errorf("dir %d not closed!", i) + } + } + +} From 6649a031fab719883b2f507b4191538d61d183bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Dec 2018 20:11:37 +0100 Subject: [PATCH 2503/3147] coreapi: run tests from interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@88e58e6b286d55882958c68525d69c4a3dd213b8 --- coreiface/tests/api.go | 129 ++++++++++++++++++ coreiface/tests/{block_test.go => block.go} | 11 +- coreiface/tests/{dag_test.go => dag.go} | 12 +- coreiface/tests/{dht_test.go => dht.go} | 8 +- coreiface/tests/{key_test.go => key.go} | 19 ++- coreiface/tests/{name_test.go => name.go} | 7 +- coreiface/tests/{object_test.go => object.go} | 17 ++- coreiface/tests/{path_test.go => path.go} | 10 +- coreiface/tests/{pin_test.go => pin.go} | 8 +- coreiface/tests/{pubsub_test.go => pubsub.go} | 6 +- coreiface/tests/{unixfs_test.go => unixfs.go} | 123 +++-------------- 11 files changed, 233 insertions(+), 117 deletions(-) create mode 100644 coreiface/tests/api.go rename coreiface/tests/{block_test.go => block.go} (92%) rename coreiface/tests/{dag_test.go => dag.go} (92%) rename coreiface/tests/{dht_test.go => dht.go} (93%) rename coreiface/tests/{key_test.go => key.go} (93%) rename coreiface/tests/{name_test.go => name.go} (97%) rename coreiface/tests/{object_test.go => object.go} (93%) rename coreiface/tests/{path_test.go => path.go} (91%) rename coreiface/tests/{pin_test.go => pin.go} (95%) rename coreiface/tests/{pubsub_test.go => pubsub.go} (95%) rename coreiface/tests/{unixfs_test.go => unixfs.go} (89%) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go new file mode 100644 index 0000000000..8baa869dd9 --- /dev/null +++ b/coreiface/tests/api.go @@ -0,0 +1,129 @@ +package tests + +import ( + "context" + "encoding/base64" + "fmt" + "testing" + + "github.com/ipfs/go-ipfs/core" + "github.com/ipfs/go-ipfs/core/coreapi" + coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + mock "github.com/ipfs/go-ipfs/core/mock" + "github.com/ipfs/go-ipfs/keystore" + "github.com/ipfs/go-ipfs/repo" + + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + "gx/ipfs/QmRBaUEQEeFWywfrZJ64QgsmvcqgLSK3VbvGMR2NM2Edpf/go-libp2p/p2p/net/mock" + "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" + "gx/ipfs/QmcZfkbgwwwH5ZLTQRHkSQBDiDqd3skY2eU6MZRgWuXcse/go-ipfs-config" + "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + syncds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" +) + + +func makeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) { + mn := mocknet.New(ctx) + + nodes := make([]*core.IpfsNode, n) + apis := make([]coreiface.CoreAPI, n) + + for i := 0; i < n; i++ { + var ident config.Identity + if fullIdentity { + sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) + if err != nil { + return nil, err + } + + id, err := peer.IDFromPublicKey(pk) + if err != nil { + return nil, err + } + + kbytes, err := sk.Bytes() + if err != nil { + return nil, err + } + + ident = config.Identity{ + PeerID: id.Pretty(), + PrivKey: base64.StdEncoding.EncodeToString(kbytes), + } + } else { + ident = config.Identity{ + PeerID: testPeerID, + } + } + + c := config.Config{} + c.Addresses.Swarm = []string{fmt.Sprintf("/ip4/127.0.%d.1/tcp/4001", i)} + c.Identity = ident + + r := &repo.Mock{ + C: c, + D: syncds.MutexWrap(datastore.NewMapDatastore()), + K: keystore.NewMemKeystore(), + } + + node, err := core.NewNode(ctx, &core.BuildCfg{ + Repo: r, + Host: mock.MockHostOption(mn), + Online: fullIdentity, + ExtraOpts: map[string]bool{ + "pubsub": true, + }, + }) + if err != nil { + return nil, err + } + nodes[i] = node + apis[i], err = coreapi.NewCoreAPI(node) + if err != nil { + return nil, err + } + } + + err := mn.LinkAll() + if err != nil { + return nil, err + } + + bsinf := core.BootstrapConfigWithPeers( + []pstore.PeerInfo{ + nodes[0].Peerstore.PeerInfo(nodes[0].Identity), + }, + ) + + for _, n := range nodes[1:] { + if err := n.Bootstrap(bsinf); err != nil { + return nil, err + } + } + + return apis, nil +} + +func makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { + api, err := makeAPISwarm(ctx, false, 1) + if err != nil { + return nil, err + } + + return api[0], nil +} + + +func TestApi(t *testing.T) { + t.Run("Block", TestBlock) + t.Run("TestDag", TestDag) + t.Run("TestDht", TestDht) + t.Run("TestKey", TestKey) + t.Run("TestName", TestName) + t.Run("TestObject", TestObject) + t.Run("TestPath", TestPath) + t.Run("TestPin", TestPin) + t.Run("TestPubSub", TestPubSub) + t.Run("TestUnixfs", TestUnixfs) +} diff --git a/coreiface/tests/block_test.go b/coreiface/tests/block.go similarity index 92% rename from coreiface/tests/block_test.go rename to coreiface/tests/block.go index 81360b150e..07679a9263 100644 --- a/coreiface/tests/block_test.go +++ b/coreiface/tests/block.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -12,6 +12,15 @@ import ( mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) +func TestBlock(t *testing.T) { + t.Run("TestBlockPut", TestBlockPut) + t.Run("TestBlockPutFormat", TestBlockPutFormat) + t.Run("TestBlockPutHash", TestBlockPutHash) + t.Run("TestBlockGet", TestBlockGet) + t.Run("TestBlockRm", TestBlockRm) + t.Run("TestBlockStat", TestBlockStat) +} + func TestBlockPut(t *testing.T) { ctx := context.Background() api, err := makeAPI(ctx) diff --git a/coreiface/tests/dag_test.go b/coreiface/tests/dag.go similarity index 92% rename from coreiface/tests/dag_test.go rename to coreiface/tests/dag.go index 17059192be..a75438ab19 100644 --- a/coreiface/tests/dag_test.go +++ b/coreiface/tests/dag.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -12,6 +12,14 @@ import ( mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) +func TestDag(t *testing.T) { + t.Run("TestPut", TestPut) + t.Run("TestPutWithHash", TestPutWithHash) + t.Run("TestPath", TestDagPath) + t.Run("TestTree", TestTree) + t.Run("TestBatch", TestBatch) +} + var ( treeExpected = map[string]struct{}{ "a": {}, @@ -56,7 +64,7 @@ func TestPutWithHash(t *testing.T) { } } -func TestPath(t *testing.T) { +func TestDagPath(t *testing.T) { ctx := context.Background() api, err := makeAPI(ctx) if err != nil { diff --git a/coreiface/tests/dht_test.go b/coreiface/tests/dht.go similarity index 93% rename from coreiface/tests/dht_test.go rename to coreiface/tests/dht.go index be16bb0839..429197f703 100644 --- a/coreiface/tests/dht_test.go +++ b/coreiface/tests/dht.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -8,6 +8,12 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) +func TestDht(t *testing.T) { + t.Run("TestDhtFindPeer", TestDhtFindPeer) + t.Run("TestDhtFindProviders", TestDhtFindProviders) + t.Run("TestDhtProvide", TestDhtProvide) +} + func TestDhtFindPeer(t *testing.T) { ctx := context.Background() apis, err := makeAPISwarm(ctx, true, 5) diff --git a/coreiface/tests/key_test.go b/coreiface/tests/key.go similarity index 93% rename from coreiface/tests/key_test.go rename to coreiface/tests/key.go index 21884e448d..b08f56a4fd 100644 --- a/coreiface/tests/key_test.go +++ b/coreiface/tests/key.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -8,6 +8,23 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) +func TestKey(t *testing.T) { + t.Run("TestListSelf", TestListSelf) + t.Run("TestRenameSelf", TestRenameSelf) + t.Run("TestRemoveSelf", TestRemoveSelf) + t.Run("TestGenerateSize", TestGenerateSize) + t.Run("TestGenerateExisting", TestGenerateExisting) + t.Run("TestList", TestList) + t.Run("TestRename", TestRename) + t.Run("TestRenameToSelf", TestRenameToSelf) + t.Run("TestRenameToSelfForce", TestRenameToSelfForce) + t.Run("TestRenameOverwriteNoForce", TestRenameOverwriteNoForce) + t.Run("TestRenameOverwrite", TestRenameOverwrite) + t.Run("TestRenameSameNameNoForce", TestRenameSameNameNoForce) + t.Run("TestRenameSameName", TestRenameSameName) + t.Run("TestRemove", TestRemove) +} + func TestListSelf(t *testing.T) { ctx := context.Background() api, err := makeAPI(ctx) diff --git a/coreiface/tests/name_test.go b/coreiface/tests/name.go similarity index 97% rename from coreiface/tests/name_test.go rename to coreiface/tests/name.go index a3514e0513..154c1d4448 100644 --- a/coreiface/tests/name_test.go +++ b/coreiface/tests/name.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -15,6 +15,11 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) +func TestName(t *testing.T) { + t.Run("TestPublishResolve", TestPublishResolve) + t.Run("TestBasicPublishResolveKey", TestBasicPublishResolveKey) +} + var rnd = rand.New(rand.NewSource(0x62796532303137)) func addTestObject(ctx context.Context, api coreiface.CoreAPI) (coreiface.Path, error) { diff --git a/coreiface/tests/object_test.go b/coreiface/tests/object.go similarity index 93% rename from coreiface/tests/object_test.go rename to coreiface/tests/object.go index ac9e1d5f37..7d4243bca7 100644 --- a/coreiface/tests/object_test.go +++ b/coreiface/tests/object.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "bytes" @@ -12,6 +12,21 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) +func TestObject(t *testing.T) { + t.Run("TestNew", TestNew) + t.Run("TestObjectPut", TestObjectPut) + t.Run("TestObjectGet", TestObjectGet) + t.Run("TestObjectData", TestObjectData) + t.Run("TestObjectLinks", TestObjectLinks) + t.Run("TestObjectStat", TestObjectStat) + t.Run("TestObjectAddLink", TestObjectAddLink) + t.Run("TestObjectAddLinkCreate", TestObjectAddLinkCreate) + t.Run("TestObjectRmLink", TestObjectRmLink) + t.Run("TestObjectAddData", TestObjectAddData) + t.Run("TestObjectSetData", TestObjectSetData) + t.Run("TestDiffTest", TestDiffTest) +} + func TestNew(t *testing.T) { ctx := context.Background() api, err := makeAPI(ctx) diff --git a/coreiface/tests/path_test.go b/coreiface/tests/path.go similarity index 91% rename from coreiface/tests/path_test.go rename to coreiface/tests/path.go index e054280733..efbacd29f0 100644 --- a/coreiface/tests/path_test.go +++ b/coreiface/tests/path.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -9,6 +9,14 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) +func TestPath(t *testing.T) { + t.Run("TestMutablePath", TestMutablePath) + t.Run("TestPathRemainder", TestPathRemainder) + t.Run("TestEmptyPathRemainder", TestEmptyPathRemainder) + t.Run("TestInvalidPathRemainder", TestInvalidPathRemainder) + t.Run("TestPathRoot", TestPathRoot) +} + func TestMutablePath(t *testing.T) { ctx := context.Background() api, err := makeAPI(ctx) diff --git a/coreiface/tests/pin_test.go b/coreiface/tests/pin.go similarity index 95% rename from coreiface/tests/pin_test.go rename to coreiface/tests/pin.go index 5c4b82bc25..344cd0db73 100644 --- a/coreiface/tests/pin_test.go +++ b/coreiface/tests/pin.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -8,6 +8,12 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) +func TestPin(t *testing.T) { + t.Run("TestPinAdd", TestPinAdd) + t.Run("TestPinSimple", TestPinSimple) + t.Run("TestPinRecursive", TestPinRecursive) +} + func TestPinAdd(t *testing.T) { ctx := context.Background() api, err := makeAPI(ctx) diff --git a/coreiface/tests/pubsub_test.go b/coreiface/tests/pubsub.go similarity index 95% rename from coreiface/tests/pubsub_test.go rename to coreiface/tests/pubsub.go index 19a1eba521..3ecd80274c 100644 --- a/coreiface/tests/pubsub_test.go +++ b/coreiface/tests/pubsub.go @@ -1,4 +1,4 @@ -package tests_test +package tests import ( "context" @@ -7,6 +7,10 @@ import ( "time" ) +func TestPubSub(t *testing.T) { + t.Run("TestBasicPubSub", TestBasicPubSub) +} + func TestBasicPubSub(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/coreiface/tests/unixfs_test.go b/coreiface/tests/unixfs.go similarity index 89% rename from coreiface/tests/unixfs_test.go rename to coreiface/tests/unixfs.go index d7ddae9633..1ca0b282ac 100644 --- a/coreiface/tests/unixfs_test.go +++ b/coreiface/tests/unixfs.go @@ -1,11 +1,8 @@ -package tests_test +package tests import ( "bytes" "context" - "encoding/base64" - "fmt" - "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" "io" "io/ioutil" "math" @@ -15,28 +12,31 @@ import ( "sync" "testing" - "github.com/ipfs/go-ipfs/core" - "github.com/ipfs/go-ipfs/core/coreapi" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - mock "github.com/ipfs/go-ipfs/core/mock" - "github.com/ipfs/go-ipfs/keystore" - "github.com/ipfs/go-ipfs/repo" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - "gx/ipfs/QmRBaUEQEeFWywfrZJ64QgsmvcqgLSK3VbvGMR2NM2Edpf/go-libp2p/p2p/net/mock" + "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" cbor "gx/ipfs/QmRoARq3nkUb13HSKZGepCZSWe5GrVPwx7xURJGZ7KWv9V/go-ipld-cbor" "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" - "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" - pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs" - "gx/ipfs/QmcZfkbgwwwH5ZLTQRHkSQBDiDqd3skY2eU6MZRgWuXcse/go-ipfs-config" mdag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" - "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - syncds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) +func TestUnixfs(t *testing.T) { + t.Run("TestAdd", TestAdd) + t.Run("TestAddPinned", TestAddPinned) + t.Run("TestAddHashOnly", TestAddHashOnly) + t.Run("TestGetEmptyFile", TestGetEmptyFile) + t.Run("TestGetDir", TestGetDir) + t.Run("TestGetNonUnixfs", TestGetNonUnixfs) + t.Run("TestLs", TestLs) + t.Run("TestEntriesExpired", TestEntriesExpired) + t.Run("TestLsEmptyDir", TestLsEmptyDir) + t.Run("TestLsNonUnixfs", TestLsNonUnixfs) + t.Run("TestAddCloses", TestAddCloses) +} + const testPeerID = "QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe" // `echo -n 'hello, world!' | ipfs add` @@ -46,97 +46,6 @@ var helloStr = "hello, world!" // `echo -n | ipfs add` var emptyFile = "/ipfs/QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH" -func makeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) { - mn := mocknet.New(ctx) - - nodes := make([]*core.IpfsNode, n) - apis := make([]coreiface.CoreAPI, n) - - for i := 0; i < n; i++ { - var ident config.Identity - if fullIdentity { - sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) - if err != nil { - return nil, err - } - - id, err := peer.IDFromPublicKey(pk) - if err != nil { - return nil, err - } - - kbytes, err := sk.Bytes() - if err != nil { - return nil, err - } - - ident = config.Identity{ - PeerID: id.Pretty(), - PrivKey: base64.StdEncoding.EncodeToString(kbytes), - } - } else { - ident = config.Identity{ - PeerID: testPeerID, - } - } - - c := config.Config{} - c.Addresses.Swarm = []string{fmt.Sprintf("/ip4/127.0.%d.1/tcp/4001", i)} - c.Identity = ident - - r := &repo.Mock{ - C: c, - D: syncds.MutexWrap(datastore.NewMapDatastore()), - K: keystore.NewMemKeystore(), - } - - node, err := core.NewNode(ctx, &core.BuildCfg{ - Repo: r, - Host: mock.MockHostOption(mn), - Online: fullIdentity, - ExtraOpts: map[string]bool{ - "pubsub": true, - }, - }) - if err != nil { - return nil, err - } - nodes[i] = node - apis[i], err = coreapi.NewCoreAPI(node) - if err != nil { - return nil, err - } - } - - err := mn.LinkAll() - if err != nil { - return nil, err - } - - bsinf := core.BootstrapConfigWithPeers( - []pstore.PeerInfo{ - nodes[0].Peerstore.PeerInfo(nodes[0].Identity), - }, - ) - - for _, n := range nodes[1:] { - if err := n.Bootstrap(bsinf); err != nil { - return nil, err - } - } - - return apis, nil -} - -func makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { - api, err := makeAPISwarm(ctx, false, 1) - if err != nil { - return nil, err - } - - return api[0], nil -} - func strFile(data string) func() files.Node { return func() files.Node { return files.NewBytesFile([]byte(data)) From 9e88033a986fbd3454d5b438e3590b871ae0987d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Dec 2018 21:01:00 +0100 Subject: [PATCH 2504/3147] coreapi: Interface for external test providers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@1532d2602204f7c279b22db1ebcb960f82e67050 --- coreiface/tests/api.go | 134 +++++++------------------------------- coreiface/tests/block.go | 38 +++++------ coreiface/tests/dag.go | 32 ++++----- coreiface/tests/dht.go | 20 +++--- coreiface/tests/key.go | 105 +++++++++++++++-------------- coreiface/tests/name.go | 19 +++--- coreiface/tests/object.go | 74 ++++++++++----------- coreiface/tests/path.go | 32 ++++----- coreiface/tests/pin.go | 20 +++--- coreiface/tests/pubsub.go | 8 +-- coreiface/tests/unixfs.go | 70 ++++++++++---------- 11 files changed, 236 insertions(+), 316 deletions(-) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index 8baa869dd9..a4b0312f63 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -2,128 +2,42 @@ package tests import ( "context" - "encoding/base64" - "fmt" "testing" - "github.com/ipfs/go-ipfs/core" - "github.com/ipfs/go-ipfs/core/coreapi" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" - mock "github.com/ipfs/go-ipfs/core/mock" - "github.com/ipfs/go-ipfs/keystore" - "github.com/ipfs/go-ipfs/repo" - - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - "gx/ipfs/QmRBaUEQEeFWywfrZJ64QgsmvcqgLSK3VbvGMR2NM2Edpf/go-libp2p/p2p/net/mock" - "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" - pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" - "gx/ipfs/QmcZfkbgwwwH5ZLTQRHkSQBDiDqd3skY2eU6MZRgWuXcse/go-ipfs-config" - "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - syncds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) - -func makeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) { - mn := mocknet.New(ctx) - - nodes := make([]*core.IpfsNode, n) - apis := make([]coreiface.CoreAPI, n) - - for i := 0; i < n; i++ { - var ident config.Identity - if fullIdentity { - sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512) - if err != nil { - return nil, err - } - - id, err := peer.IDFromPublicKey(pk) - if err != nil { - return nil, err - } - - kbytes, err := sk.Bytes() - if err != nil { - return nil, err - } - - ident = config.Identity{ - PeerID: id.Pretty(), - PrivKey: base64.StdEncoding.EncodeToString(kbytes), - } - } else { - ident = config.Identity{ - PeerID: testPeerID, - } - } - - c := config.Config{} - c.Addresses.Swarm = []string{fmt.Sprintf("/ip4/127.0.%d.1/tcp/4001", i)} - c.Identity = ident - - r := &repo.Mock{ - C: c, - D: syncds.MutexWrap(datastore.NewMapDatastore()), - K: keystore.NewMemKeystore(), - } - - node, err := core.NewNode(ctx, &core.BuildCfg{ - Repo: r, - Host: mock.MockHostOption(mn), - Online: fullIdentity, - ExtraOpts: map[string]bool{ - "pubsub": true, - }, - }) - if err != nil { - return nil, err - } - nodes[i] = node - apis[i], err = coreapi.NewCoreAPI(node) - if err != nil { - return nil, err - } - } - - err := mn.LinkAll() +func (tp *provider) makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { + api, err := tp.MakeAPISwarm(ctx, false, 1) if err != nil { return nil, err } - bsinf := core.BootstrapConfigWithPeers( - []pstore.PeerInfo{ - nodes[0].Peerstore.PeerInfo(nodes[0].Identity), - }, - ) - - for _, n := range nodes[1:] { - if err := n.Bootstrap(bsinf); err != nil { - return nil, err - } - } - - return apis, nil + return api[0], nil } -func makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { - api, err := makeAPISwarm(ctx, false, 1) - if err != nil { - return nil, err - } - - return api[0], nil +type Provider interface { + // Make creates n nodes. fullIdentity set to false can be ignored + MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) } +type provider struct { + Provider +} -func TestApi(t *testing.T) { - t.Run("Block", TestBlock) - t.Run("TestDag", TestDag) - t.Run("TestDht", TestDht) - t.Run("TestKey", TestKey) - t.Run("TestName", TestName) - t.Run("TestObject", TestObject) - t.Run("TestPath", TestPath) - t.Run("TestPin", TestPin) - t.Run("TestPubSub", TestPubSub) - t.Run("TestUnixfs", TestUnixfs) +func TestApi(p Provider) func(t *testing.T) { + tp := &provider{p} + + return func(t *testing.T) { + t.Run("Block", tp.TestBlock) + t.Run("Dag", tp.TestDag) + t.Run("Dht", tp.TestDht) + t.Run("Key", tp.TestKey) + t.Run("Name", tp.TestName) + t.Run("Object", tp.TestObject) + t.Run("Path", tp.TestPath) + t.Run("Pin", tp.TestPin) + t.Run("PubSub", tp.TestPubSub) + t.Run("Unixfs", tp.TestUnixfs) + } } diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 07679a9263..0ee9688608 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -12,18 +12,18 @@ import ( mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) -func TestBlock(t *testing.T) { - t.Run("TestBlockPut", TestBlockPut) - t.Run("TestBlockPutFormat", TestBlockPutFormat) - t.Run("TestBlockPutHash", TestBlockPutHash) - t.Run("TestBlockGet", TestBlockGet) - t.Run("TestBlockRm", TestBlockRm) - t.Run("TestBlockStat", TestBlockStat) +func (tp *provider) TestBlock(t *testing.T) { + t.Run("TestBlockPut", tp.TestBlockPut) + t.Run("TestBlockPutFormat", tp.TestBlockPutFormat) + t.Run("TestBlockPutHash", tp.TestBlockPutHash) + t.Run("TestBlockGet", tp.TestBlockGet) + t.Run("TestBlockRm", tp.TestBlockRm) + t.Run("TestBlockStat", tp.TestBlockStat) } -func TestBlockPut(t *testing.T) { +func (tp *provider) TestBlockPut(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -38,9 +38,9 @@ func TestBlockPut(t *testing.T) { } } -func TestBlockPutFormat(t *testing.T) { +func (tp *provider) TestBlockPutFormat(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -55,9 +55,9 @@ func TestBlockPutFormat(t *testing.T) { } } -func TestBlockPutHash(t *testing.T) { +func (tp *provider) TestBlockPutHash(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -72,9 +72,9 @@ func TestBlockPutHash(t *testing.T) { } } -func TestBlockGet(t *testing.T) { +func (tp *provider) TestBlockGet(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -112,9 +112,9 @@ func TestBlockGet(t *testing.T) { } } -func TestBlockRm(t *testing.T) { +func (tp *provider) TestBlockRm(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -165,9 +165,9 @@ func TestBlockRm(t *testing.T) { } } -func TestBlockStat(t *testing.T) { +func (tp *provider) TestBlockStat(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index a75438ab19..f192162219 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -12,12 +12,12 @@ import ( mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) -func TestDag(t *testing.T) { - t.Run("TestPut", TestPut) - t.Run("TestPutWithHash", TestPutWithHash) - t.Run("TestPath", TestDagPath) - t.Run("TestTree", TestTree) - t.Run("TestBatch", TestBatch) +func (tp *provider) TestDag(t *testing.T) { + t.Run("TestPut", tp.TestPut) + t.Run("TestPutWithHash", tp.TestPutWithHash) + t.Run("TestPath", tp.TestDagPath) + t.Run("TestTree", tp.TestTree) + t.Run("TestBatch", tp.TestBatch) } var ( @@ -30,9 +30,9 @@ var ( } ) -func TestPut(t *testing.T) { +func (tp *provider) TestPut(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -47,9 +47,9 @@ func TestPut(t *testing.T) { } } -func TestPutWithHash(t *testing.T) { +func (tp *provider) TestPutWithHash(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -64,9 +64,9 @@ func TestPutWithHash(t *testing.T) { } } -func TestDagPath(t *testing.T) { +func (tp *provider) TestDagPath(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -96,9 +96,9 @@ func TestDagPath(t *testing.T) { } } -func TestTree(t *testing.T) { +func (tp *provider) TestTree(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -125,9 +125,9 @@ func TestTree(t *testing.T) { } } -func TestBatch(t *testing.T) { +func (tp *provider) TestBatch(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index 429197f703..9269bc4c50 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -8,15 +8,15 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) -func TestDht(t *testing.T) { - t.Run("TestDhtFindPeer", TestDhtFindPeer) - t.Run("TestDhtFindProviders", TestDhtFindProviders) - t.Run("TestDhtProvide", TestDhtProvide) +func (tp *provider) TestDht(t *testing.T) { + t.Run("TestDhtFindPeer", tp.TestDhtFindPeer) + t.Run("TestDhtFindProviders", tp.TestDhtFindProviders) + t.Run("TestDhtProvide", tp.TestDhtProvide) } -func TestDhtFindPeer(t *testing.T) { +func (tp *provider) TestDhtFindPeer(t *testing.T) { ctx := context.Background() - apis, err := makeAPISwarm(ctx, true, 5) + apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) } @@ -50,9 +50,9 @@ func TestDhtFindPeer(t *testing.T) { } } -func TestDhtFindProviders(t *testing.T) { +func (tp *provider) TestDhtFindProviders(t *testing.T) { ctx := context.Background() - apis, err := makeAPISwarm(ctx, true, 5) + apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) } @@ -79,9 +79,9 @@ func TestDhtFindProviders(t *testing.T) { } } -func TestDhtProvide(t *testing.T) { +func (tp *provider) TestDhtProvide(t *testing.T) { ctx := context.Background() - apis, err := makeAPISwarm(ctx, true, 5) + apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) } diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index b08f56a4fd..c2b8925993 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -8,31 +8,38 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) -func TestKey(t *testing.T) { - t.Run("TestListSelf", TestListSelf) - t.Run("TestRenameSelf", TestRenameSelf) - t.Run("TestRemoveSelf", TestRemoveSelf) - t.Run("TestGenerateSize", TestGenerateSize) - t.Run("TestGenerateExisting", TestGenerateExisting) - t.Run("TestList", TestList) - t.Run("TestRename", TestRename) - t.Run("TestRenameToSelf", TestRenameToSelf) - t.Run("TestRenameToSelfForce", TestRenameToSelfForce) - t.Run("TestRenameOverwriteNoForce", TestRenameOverwriteNoForce) - t.Run("TestRenameOverwrite", TestRenameOverwrite) - t.Run("TestRenameSameNameNoForce", TestRenameSameNameNoForce) - t.Run("TestRenameSameName", TestRenameSameName) - t.Run("TestRemove", TestRemove) +func (tp *provider) TestKey(t *testing.T) { + t.Run("TestListSelf", tp.TestListSelf) + t.Run("TestRenameSelf", tp.TestRenameSelf) + t.Run("TestRemoveSelf", tp.TestRemoveSelf) + t.Run("TestGenerate", tp.TestGenerate) + t.Run("TestGenerateSize", tp.TestGenerateSize) + t.Run("TestGenerateType", tp.TestGenerateType) + t.Run("TestGenerateExisting", tp.TestGenerateExisting) + t.Run("TestList", tp.TestList) + t.Run("TestRename", tp.TestRename) + t.Run("TestRenameToSelf", tp.TestRenameToSelf) + t.Run("TestRenameToSelfForce", tp.TestRenameToSelfForce) + t.Run("TestRenameOverwriteNoForce", tp.TestRenameOverwriteNoForce) + t.Run("TestRenameOverwrite", tp.TestRenameOverwrite) + t.Run("TestRenameSameNameNoForce", tp.TestRenameSameNameNoForce) + t.Run("TestRenameSameName", tp.TestRenameSameName) + t.Run("TestRemove", tp.TestRemove) } -func TestListSelf(t *testing.T) { +func (tp *provider) TestListSelf(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) return } + self, err := api.Key().Self(ctx) + if err != nil { + t.Fatal(err) + } + keys, err := api.Key().List(ctx) if err != nil { t.Fatalf("failed to list keys: %s", err) @@ -48,14 +55,14 @@ func TestListSelf(t *testing.T) { t.Errorf("expected the key to be called 'self', got '%s'", keys[0].Name()) } - if keys[0].Path().String() != "/ipns/"+testPeerID { - t.Errorf("expected the key to have path '/ipns/%s', got '%s'", testPeerID, keys[0].Path().String()) + if keys[0].Path().String() != "/ipns/"+self.ID().Pretty() { + t.Errorf("expected the key to have path '/ipns/%s', got '%s'", self.ID().Pretty(), keys[0].Path().String()) } } -func TestRenameSelf(t *testing.T) { +func (tp *provider) TestRenameSelf(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) return @@ -80,9 +87,9 @@ func TestRenameSelf(t *testing.T) { } } -func TestRemoveSelf(t *testing.T) { +func (tp *provider) TestRemoveSelf(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) return @@ -98,9 +105,9 @@ func TestRemoveSelf(t *testing.T) { } } -func TestGenerate(t *testing.T) { +func (tp *provider) TestGenerate(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -120,9 +127,9 @@ func TestGenerate(t *testing.T) { } } -func TestGenerateSize(t *testing.T) { +func (tp *provider) TestGenerateSize(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -142,11 +149,11 @@ func TestGenerateSize(t *testing.T) { } } -func TestGenerateType(t *testing.T) { +func (tp *provider) TestGenerateType(t *testing.T) { ctx := context.Background() t.Skip("disabled until libp2p/specs#111 is fixed") - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -167,9 +174,9 @@ func TestGenerateType(t *testing.T) { } } -func TestGenerateExisting(t *testing.T) { +func (tp *provider) TestGenerateExisting(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -199,9 +206,9 @@ func TestGenerateExisting(t *testing.T) { } } -func TestList(t *testing.T) { +func (tp *provider) TestList(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -244,9 +251,9 @@ func TestList(t *testing.T) { } } -func TestRename(t *testing.T) { +func (tp *provider) TestRename(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -272,9 +279,9 @@ func TestRename(t *testing.T) { } } -func TestRenameToSelf(t *testing.T) { +func (tp *provider) TestRenameToSelf(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -295,9 +302,9 @@ func TestRenameToSelf(t *testing.T) { } } -func TestRenameToSelfForce(t *testing.T) { +func (tp *provider) TestRenameToSelfForce(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -318,9 +325,9 @@ func TestRenameToSelfForce(t *testing.T) { } } -func TestRenameOverwriteNoForce(t *testing.T) { +func (tp *provider) TestRenameOverwriteNoForce(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -347,9 +354,9 @@ func TestRenameOverwriteNoForce(t *testing.T) { } } -func TestRenameOverwrite(t *testing.T) { +func (tp *provider) TestRenameOverwrite(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -385,9 +392,9 @@ func TestRenameOverwrite(t *testing.T) { } } -func TestRenameSameNameNoForce(t *testing.T) { +func (tp *provider) TestRenameSameNameNoForce(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -413,9 +420,9 @@ func TestRenameSameNameNoForce(t *testing.T) { } } -func TestRenameSameName(t *testing.T) { +func (tp *provider) TestRenameSameName(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -441,9 +448,9 @@ func TestRenameSameName(t *testing.T) { } } -func TestRemove(t *testing.T) { +func (tp *provider) TestRemove(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 154c1d4448..ecb06ddde6 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -15,9 +15,10 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) -func TestName(t *testing.T) { - t.Run("TestPublishResolve", TestPublishResolve) - t.Run("TestBasicPublishResolveKey", TestBasicPublishResolveKey) +func (tp *provider) TestName(t *testing.T) { + t.Run("TestPublishResolve", tp.TestPublishResolve) + t.Run("TestBasicPublishResolveKey", tp.TestBasicPublishResolveKey) + t.Run("TestBasicPublishResolveTimeout", tp.TestBasicPublishResolveTimeout) } var rnd = rand.New(rand.NewSource(0x62796532303137)) @@ -34,10 +35,10 @@ func appendPath(p coreiface.Path, sub string) coreiface.Path { return p } -func TestPublishResolve(t *testing.T) { +func (tp *provider) TestPublishResolve(t *testing.T) { ctx := context.Background() init := func() (coreiface.CoreAPI, coreiface.Path) { - apis, err := makeAPISwarm(ctx, true, 5) + apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) return nil, nil @@ -183,9 +184,9 @@ func TestPublishResolve(t *testing.T) { }) } -func TestBasicPublishResolveKey(t *testing.T) { +func (tp *provider) TestBasicPublishResolveKey(t *testing.T) { ctx := context.Background() - apis, err := makeAPISwarm(ctx, true, 5) + apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) } @@ -224,11 +225,11 @@ func TestBasicPublishResolveKey(t *testing.T) { } } -func TestBasicPublishResolveTimeout(t *testing.T) { +func (tp *provider) TestBasicPublishResolveTimeout(t *testing.T) { t.Skip("ValidTime doesn't appear to work at this time resolution") ctx := context.Background() - apis, err := makeAPISwarm(ctx, true, 5) + apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) } diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 7d4243bca7..349b4a8f56 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -12,24 +12,24 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) -func TestObject(t *testing.T) { - t.Run("TestNew", TestNew) - t.Run("TestObjectPut", TestObjectPut) - t.Run("TestObjectGet", TestObjectGet) - t.Run("TestObjectData", TestObjectData) - t.Run("TestObjectLinks", TestObjectLinks) - t.Run("TestObjectStat", TestObjectStat) - t.Run("TestObjectAddLink", TestObjectAddLink) - t.Run("TestObjectAddLinkCreate", TestObjectAddLinkCreate) - t.Run("TestObjectRmLink", TestObjectRmLink) - t.Run("TestObjectAddData", TestObjectAddData) - t.Run("TestObjectSetData", TestObjectSetData) - t.Run("TestDiffTest", TestDiffTest) +func (tp *provider) TestObject(t *testing.T) { + t.Run("TestNew", tp.TestNew) + t.Run("TestObjectPut", tp.TestObjectPut) + t.Run("TestObjectGet", tp.TestObjectGet) + t.Run("TestObjectData", tp.TestObjectData) + t.Run("TestObjectLinks", tp.TestObjectLinks) + t.Run("TestObjectStat", tp.TestObjectStat) + t.Run("TestObjectAddLink", tp.TestObjectAddLink) + t.Run("TestObjectAddLinkCreate", tp.TestObjectAddLinkCreate) + t.Run("TestObjectRmLink", tp.TestObjectRmLink) + t.Run("TestObjectAddData", tp.TestObjectAddData) + t.Run("TestObjectSetData", tp.TestObjectSetData) + t.Run("TestDiffTest", tp.TestDiffTest) } -func TestNew(t *testing.T) { +func (tp *provider) TestNew(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -53,9 +53,9 @@ func TestNew(t *testing.T) { } } -func TestObjectPut(t *testing.T) { +func (tp *provider) TestObjectPut(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -93,9 +93,9 @@ func TestObjectPut(t *testing.T) { } } -func TestObjectGet(t *testing.T) { +func (tp *provider) TestObjectGet(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -115,9 +115,9 @@ func TestObjectGet(t *testing.T) { } } -func TestObjectData(t *testing.T) { +func (tp *provider) TestObjectData(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -142,9 +142,9 @@ func TestObjectData(t *testing.T) { } } -func TestObjectLinks(t *testing.T) { +func (tp *provider) TestObjectLinks(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -177,9 +177,9 @@ func TestObjectLinks(t *testing.T) { } } -func TestObjectStat(t *testing.T) { +func (tp *provider) TestObjectStat(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -224,9 +224,9 @@ func TestObjectStat(t *testing.T) { } } -func TestObjectAddLink(t *testing.T) { +func (tp *provider) TestObjectAddLink(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -264,9 +264,9 @@ func TestObjectAddLink(t *testing.T) { } } -func TestObjectAddLinkCreate(t *testing.T) { +func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -312,9 +312,9 @@ func TestObjectAddLinkCreate(t *testing.T) { } } -func TestObjectRmLink(t *testing.T) { +func (tp *provider) TestObjectRmLink(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -344,9 +344,9 @@ func TestObjectRmLink(t *testing.T) { } } -func TestObjectAddData(t *testing.T) { +func (tp *provider) TestObjectAddData(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -373,9 +373,9 @@ func TestObjectAddData(t *testing.T) { } } -func TestObjectSetData(t *testing.T) { +func (tp *provider) TestObjectSetData(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -402,9 +402,9 @@ func TestObjectSetData(t *testing.T) { } } -func TestDiffTest(t *testing.T) { +func (tp *provider) TestDiffTest(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index efbacd29f0..cb12463667 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -9,17 +9,17 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) -func TestPath(t *testing.T) { - t.Run("TestMutablePath", TestMutablePath) - t.Run("TestPathRemainder", TestPathRemainder) - t.Run("TestEmptyPathRemainder", TestEmptyPathRemainder) - t.Run("TestInvalidPathRemainder", TestInvalidPathRemainder) - t.Run("TestPathRoot", TestPathRoot) +func (tp *provider) TestPath(t *testing.T) { + t.Run("TestMutablePath", tp.TestMutablePath) + t.Run("TestPathRemainder", tp.TestPathRemainder) + t.Run("TestEmptyPathRemainder", tp.TestEmptyPathRemainder) + t.Run("TestInvalidPathRemainder", tp.TestInvalidPathRemainder) + t.Run("TestPathRoot", tp.TestPathRoot) } -func TestMutablePath(t *testing.T) { +func (tp *provider) TestMutablePath(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -44,9 +44,9 @@ func TestMutablePath(t *testing.T) { } } -func TestPathRemainder(t *testing.T) { +func (tp *provider) TestPathRemainder(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -71,9 +71,9 @@ func TestPathRemainder(t *testing.T) { } } -func TestEmptyPathRemainder(t *testing.T) { +func (tp *provider) TestEmptyPathRemainder(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -102,9 +102,9 @@ func TestEmptyPathRemainder(t *testing.T) { } } -func TestInvalidPathRemainder(t *testing.T) { +func (tp *provider) TestInvalidPathRemainder(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -125,9 +125,9 @@ func TestInvalidPathRemainder(t *testing.T) { } } -func TestPathRoot(t *testing.T) { +func (tp *provider) TestPathRoot(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 344cd0db73..8c659ba358 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -8,15 +8,15 @@ import ( opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) -func TestPin(t *testing.T) { - t.Run("TestPinAdd", TestPinAdd) - t.Run("TestPinSimple", TestPinSimple) - t.Run("TestPinRecursive", TestPinRecursive) +func (tp *provider) TestPin(t *testing.T) { + t.Run("TestPinAdd", tp.TestPinAdd) + t.Run("TestPinSimple", tp.TestPinSimple) + t.Run("TestPinRecursive", tp.TestPinRecursive) } -func TestPinAdd(t *testing.T) { +func (tp *provider) TestPinAdd(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -32,9 +32,9 @@ func TestPinAdd(t *testing.T) { } } -func TestPinSimple(t *testing.T) { +func (tp *provider) TestPinSimple(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -81,9 +81,9 @@ func TestPinSimple(t *testing.T) { } } -func TestPinRecursive(t *testing.T) { +func (tp *provider) TestPinRecursive(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index 3ecd80274c..3462b47551 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -7,15 +7,15 @@ import ( "time" ) -func TestPubSub(t *testing.T) { - t.Run("TestBasicPubSub", TestBasicPubSub) +func (tp *provider) TestPubSub(t *testing.T) { + t.Run("TestBasicPubSub", tp.TestBasicPubSub) } -func TestBasicPubSub(t *testing.T) { +func (tp *provider) TestBasicPubSub(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - apis, err := makeAPISwarm(ctx, true, 2) + apis, err := tp.MakeAPISwarm(ctx, true, 2) if err != nil { t.Fatal(err) } diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 1ca0b282ac..b31a55d4ce 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -23,22 +23,20 @@ import ( mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) -func TestUnixfs(t *testing.T) { - t.Run("TestAdd", TestAdd) - t.Run("TestAddPinned", TestAddPinned) - t.Run("TestAddHashOnly", TestAddHashOnly) - t.Run("TestGetEmptyFile", TestGetEmptyFile) - t.Run("TestGetDir", TestGetDir) - t.Run("TestGetNonUnixfs", TestGetNonUnixfs) - t.Run("TestLs", TestLs) - t.Run("TestEntriesExpired", TestEntriesExpired) - t.Run("TestLsEmptyDir", TestLsEmptyDir) - t.Run("TestLsNonUnixfs", TestLsNonUnixfs) - t.Run("TestAddCloses", TestAddCloses) +func (tp *provider) TestUnixfs(t *testing.T) { + t.Run("TestAdd", tp.TestAdd) + t.Run("TestAddPinned", tp.TestAddPinned) + t.Run("TestAddHashOnly", tp.TestAddHashOnly) + t.Run("TestGetEmptyFile", tp.TestGetEmptyFile) + t.Run("TestGetDir", tp.TestGetDir) + t.Run("TestGetNonUnixfs", tp.TestGetNonUnixfs) + t.Run("TestLs", tp.TestLs) + t.Run("TestEntriesExpired", tp.TestEntriesExpired) + t.Run("TestLsEmptyDir", tp.TestLsEmptyDir) + t.Run("TestLsNonUnixfs", tp.TestLsNonUnixfs) + t.Run("TestAddCloses", tp.TestAddCloses) } -const testPeerID = "QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe" - // `echo -n 'hello, world!' | ipfs add` var hello = "/ipfs/QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk" var helloStr = "hello, world!" @@ -80,9 +78,9 @@ func wrapped(name string) func(f files.Node) files.Node { } } -func TestAdd(t *testing.T) { +func (tp *provider) TestAdd(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -537,9 +535,9 @@ func TestAdd(t *testing.T) { } } -func TestAddPinned(t *testing.T) { +func (tp *provider) TestAddPinned(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -559,9 +557,9 @@ func TestAddPinned(t *testing.T) { } } -func TestAddHashOnly(t *testing.T) { +func (tp *provider) TestAddHashOnly(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -584,9 +582,9 @@ func TestAddHashOnly(t *testing.T) { } } -func TestGetEmptyFile(t *testing.T) { +func (tp *provider) TestGetEmptyFile(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) } @@ -616,9 +614,9 @@ func TestGetEmptyFile(t *testing.T) { } } -func TestGetDir(t *testing.T) { +func (tp *provider) TestGetDir(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -648,9 +646,9 @@ func TestGetDir(t *testing.T) { } } -func TestGetNonUnixfs(t *testing.T) { +func (tp *provider) TestGetNonUnixfs(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -667,9 +665,9 @@ func TestGetNonUnixfs(t *testing.T) { } } -func TestLs(t *testing.T) { +func (tp *provider) TestLs(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -703,9 +701,9 @@ func TestLs(t *testing.T) { } } -func TestEntriesExpired(t *testing.T) { +func (tp *provider) TestEntriesExpired(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -746,9 +744,9 @@ func TestEntriesExpired(t *testing.T) { } } -func TestLsEmptyDir(t *testing.T) { +func (tp *provider) TestLsEmptyDir(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -774,9 +772,9 @@ func TestLsEmptyDir(t *testing.T) { } // TODO(lgierth) this should test properly, with len(links) > 0 -func TestLsNonUnixfs(t *testing.T) { +func (tp *provider) TestLsNonUnixfs(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } @@ -831,9 +829,9 @@ func (f *closeTestF) Close() error { return nil } -func TestAddCloses(t *testing.T) { +func (tp *provider) TestAddCloses(t *testing.T) { ctx := context.Background() - api, err := makeAPI(ctx) + api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) } From 23069a4c459b67e966fa5370e980aaab410e718b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 20 Dec 2018 22:27:59 +0100 Subject: [PATCH 2505/3147] coreapi: make sure to cancel context in tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@aa64f771136226accbcae0213eb929ff79697046 --- coreiface/tests/api.go | 37 +++++++++++++++++++++++++++++- coreiface/tests/block.go | 18 ++++++++++----- coreiface/tests/dag.go | 15 ++++++++---- coreiface/tests/dht.go | 9 +++++--- coreiface/tests/key.go | 48 ++++++++++++++++++++++++++------------- coreiface/tests/name.go | 9 +++++--- coreiface/tests/object.go | 36 +++++++++++++++++++---------- coreiface/tests/path.go | 15 ++++++++---- coreiface/tests/pin.go | 9 +++++--- coreiface/tests/unixfs.go | 35 ++++++++++++++++++---------- 10 files changed, 165 insertions(+), 66 deletions(-) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index a4b0312f63..ab1feff5be 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -3,6 +3,7 @@ package tests import ( "context" "testing" + "time" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" ) @@ -21,12 +22,37 @@ type Provider interface { MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) } +func (tp *provider) MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) { + tp.apis <- 1 + go func() { + <-ctx.Done() + tp.apis <- -1 + }() + + return tp.Provider.MakeAPISwarm(ctx, fullIdentity, n) +} + type provider struct { Provider + + apis chan int } func TestApi(p Provider) func(t *testing.T) { - tp := &provider{p} + running := 1 + apis := make(chan int) + zeroRunning := make(chan struct{}) + go func() { + for i := range apis { + running += i + if running < 1 { + close(zeroRunning) + return + } + } + }() + + tp := &provider{Provider: p, apis: apis} return func(t *testing.T) { t.Run("Block", tp.TestBlock) @@ -39,5 +65,14 @@ func TestApi(p Provider) func(t *testing.T) { t.Run("Pin", tp.TestPin) t.Run("PubSub", tp.TestPubSub) t.Run("Unixfs", tp.TestUnixfs) + + apis <- -1 + t.Run("TestsCancelCtx", func(t *testing.T) { + select { + case <-zeroRunning: + case <-time.After(time.Second): + t.Errorf("%d node(s) not closed", running) + } + }) } } diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 0ee9688608..a3a5f93aa1 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -22,7 +22,8 @@ func (tp *provider) TestBlock(t *testing.T) { } func (tp *provider) TestBlockPut(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -39,7 +40,8 @@ func (tp *provider) TestBlockPut(t *testing.T) { } func (tp *provider) TestBlockPutFormat(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -56,7 +58,8 @@ func (tp *provider) TestBlockPutFormat(t *testing.T) { } func (tp *provider) TestBlockPutHash(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -73,7 +76,8 @@ func (tp *provider) TestBlockPutHash(t *testing.T) { } func (tp *provider) TestBlockGet(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -113,7 +117,8 @@ func (tp *provider) TestBlockGet(t *testing.T) { } func (tp *provider) TestBlockRm(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -166,7 +171,8 @@ func (tp *provider) TestBlockRm(t *testing.T) { } func (tp *provider) TestBlockStat(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index f192162219..636c386991 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -31,7 +31,8 @@ var ( ) func (tp *provider) TestPut(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -48,7 +49,8 @@ func (tp *provider) TestPut(t *testing.T) { } func (tp *provider) TestPutWithHash(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -65,7 +67,8 @@ func (tp *provider) TestPutWithHash(t *testing.T) { } func (tp *provider) TestDagPath(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -97,7 +100,8 @@ func (tp *provider) TestDagPath(t *testing.T) { } func (tp *provider) TestTree(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -126,7 +130,8 @@ func (tp *provider) TestTree(t *testing.T) { } func (tp *provider) TestBatch(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index 9269bc4c50..9b77f16792 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -15,7 +15,8 @@ func (tp *provider) TestDht(t *testing.T) { } func (tp *provider) TestDhtFindPeer(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) @@ -51,7 +52,8 @@ func (tp *provider) TestDhtFindPeer(t *testing.T) { } func (tp *provider) TestDhtFindProviders(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) @@ -80,7 +82,8 @@ func (tp *provider) TestDhtFindProviders(t *testing.T) { } func (tp *provider) TestDhtProvide(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index c2b8925993..99c30c3023 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -28,7 +28,8 @@ func (tp *provider) TestKey(t *testing.T) { } func (tp *provider) TestListSelf(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -61,7 +62,8 @@ func (tp *provider) TestListSelf(t *testing.T) { } func (tp *provider) TestRenameSelf(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -88,7 +90,8 @@ func (tp *provider) TestRenameSelf(t *testing.T) { } func (tp *provider) TestRemoveSelf(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -106,7 +109,8 @@ func (tp *provider) TestRemoveSelf(t *testing.T) { } func (tp *provider) TestGenerate(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -128,7 +132,8 @@ func (tp *provider) TestGenerate(t *testing.T) { } func (tp *provider) TestGenerateSize(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -150,7 +155,8 @@ func (tp *provider) TestGenerateSize(t *testing.T) { } func (tp *provider) TestGenerateType(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() t.Skip("disabled until libp2p/specs#111 is fixed") api, err := tp.makeAPI(ctx) @@ -175,7 +181,8 @@ func (tp *provider) TestGenerateType(t *testing.T) { } func (tp *provider) TestGenerateExisting(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -207,7 +214,8 @@ func (tp *provider) TestGenerateExisting(t *testing.T) { } func (tp *provider) TestList(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -252,7 +260,8 @@ func (tp *provider) TestList(t *testing.T) { } func (tp *provider) TestRename(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -280,7 +289,8 @@ func (tp *provider) TestRename(t *testing.T) { } func (tp *provider) TestRenameToSelf(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -303,7 +313,8 @@ func (tp *provider) TestRenameToSelf(t *testing.T) { } func (tp *provider) TestRenameToSelfForce(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -326,7 +337,8 @@ func (tp *provider) TestRenameToSelfForce(t *testing.T) { } func (tp *provider) TestRenameOverwriteNoForce(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -355,7 +367,8 @@ func (tp *provider) TestRenameOverwriteNoForce(t *testing.T) { } func (tp *provider) TestRenameOverwrite(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -393,7 +406,8 @@ func (tp *provider) TestRenameOverwrite(t *testing.T) { } func (tp *provider) TestRenameSameNameNoForce(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -421,7 +435,8 @@ func (tp *provider) TestRenameSameNameNoForce(t *testing.T) { } func (tp *provider) TestRenameSameName(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -449,7 +464,8 @@ func (tp *provider) TestRenameSameName(t *testing.T) { } func (tp *provider) TestRemove(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index ecb06ddde6..e114b26dea 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -36,7 +36,8 @@ func appendPath(p coreiface.Path, sub string) coreiface.Path { } func (tp *provider) TestPublishResolve(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() init := func() (coreiface.CoreAPI, coreiface.Path) { apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { @@ -185,7 +186,8 @@ func (tp *provider) TestPublishResolve(t *testing.T) { } func (tp *provider) TestBasicPublishResolveKey(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) @@ -228,7 +230,8 @@ func (tp *provider) TestBasicPublishResolveKey(t *testing.T) { func (tp *provider) TestBasicPublishResolveTimeout(t *testing.T) { t.Skip("ValidTime doesn't appear to work at this time resolution") - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 349b4a8f56..1cd24aac25 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -28,7 +28,8 @@ func (tp *provider) TestObject(t *testing.T) { } func (tp *provider) TestNew(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -54,7 +55,8 @@ func (tp *provider) TestNew(t *testing.T) { } func (tp *provider) TestObjectPut(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -94,7 +96,8 @@ func (tp *provider) TestObjectPut(t *testing.T) { } func (tp *provider) TestObjectGet(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -116,7 +119,8 @@ func (tp *provider) TestObjectGet(t *testing.T) { } func (tp *provider) TestObjectData(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -143,7 +147,8 @@ func (tp *provider) TestObjectData(t *testing.T) { } func (tp *provider) TestObjectLinks(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -178,7 +183,8 @@ func (tp *provider) TestObjectLinks(t *testing.T) { } func (tp *provider) TestObjectStat(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -225,7 +231,8 @@ func (tp *provider) TestObjectStat(t *testing.T) { } func (tp *provider) TestObjectAddLink(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -265,7 +272,8 @@ func (tp *provider) TestObjectAddLink(t *testing.T) { } func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -313,7 +321,8 @@ func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { } func (tp *provider) TestObjectRmLink(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -345,7 +354,8 @@ func (tp *provider) TestObjectRmLink(t *testing.T) { } func (tp *provider) TestObjectAddData(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -374,7 +384,8 @@ func (tp *provider) TestObjectAddData(t *testing.T) { } func (tp *provider) TestObjectSetData(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -403,7 +414,8 @@ func (tp *provider) TestObjectSetData(t *testing.T) { } func (tp *provider) TestDiffTest(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index cb12463667..e74053c049 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -18,7 +18,8 @@ func (tp *provider) TestPath(t *testing.T) { } func (tp *provider) TestMutablePath(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -45,7 +46,8 @@ func (tp *provider) TestMutablePath(t *testing.T) { } func (tp *provider) TestPathRemainder(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -72,7 +74,8 @@ func (tp *provider) TestPathRemainder(t *testing.T) { } func (tp *provider) TestEmptyPathRemainder(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -103,7 +106,8 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { } func (tp *provider) TestInvalidPathRemainder(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -126,7 +130,8 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { } func (tp *provider) TestPathRoot(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 8c659ba358..823281ab14 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -15,7 +15,8 @@ func (tp *provider) TestPin(t *testing.T) { } func (tp *provider) TestPinAdd(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -33,7 +34,8 @@ func (tp *provider) TestPinAdd(t *testing.T) { } func (tp *provider) TestPinSimple(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -82,7 +84,8 @@ func (tp *provider) TestPinSimple(t *testing.T) { } func (tp *provider) TestPinRecursive(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index b31a55d4ce..f411ad24da 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -79,7 +79,8 @@ func wrapped(name string) func(f files.Node) files.Node { } func (tp *provider) TestAdd(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -536,7 +537,8 @@ func (tp *provider) TestAdd(t *testing.T) { } func (tp *provider) TestAddPinned(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -558,7 +560,8 @@ func (tp *provider) TestAddPinned(t *testing.T) { } func (tp *provider) TestAddHashOnly(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -583,7 +586,8 @@ func (tp *provider) TestAddHashOnly(t *testing.T) { } func (tp *provider) TestGetEmptyFile(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Fatal(err) @@ -615,7 +619,8 @@ func (tp *provider) TestGetEmptyFile(t *testing.T) { } func (tp *provider) TestGetDir(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -647,7 +652,8 @@ func (tp *provider) TestGetDir(t *testing.T) { } func (tp *provider) TestGetNonUnixfs(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -666,7 +672,8 @@ func (tp *provider) TestGetNonUnixfs(t *testing.T) { } func (tp *provider) TestLs(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -702,7 +709,8 @@ func (tp *provider) TestLs(t *testing.T) { } func (tp *provider) TestEntriesExpired(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -718,7 +726,7 @@ func (tp *provider) TestEntriesExpired(t *testing.T) { t.Error(err) } - ctx, cancel := context.WithCancel(ctx) + ctx, cancel = context.WithCancel(ctx) nd, err := api.Unixfs().Get(ctx, p) if err != nil { @@ -745,7 +753,8 @@ func (tp *provider) TestEntriesExpired(t *testing.T) { } func (tp *provider) TestLsEmptyDir(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -773,7 +782,8 @@ func (tp *provider) TestLsEmptyDir(t *testing.T) { // TODO(lgierth) this should test properly, with len(links) > 0 func (tp *provider) TestLsNonUnixfs(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) @@ -830,7 +840,8 @@ func (f *closeTestF) Close() error { } func (tp *provider) TestAddCloses(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() api, err := tp.makeAPI(ctx) if err != nil { t.Error(err) From 27609c7a833ec02858ad16464eb40946f7ddeae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 2 Jan 2019 17:41:12 +0100 Subject: [PATCH 2506/3147] coreapi: don't panic as much in tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@89157f98eeb09c4653c098eb4e438741cbdbd21a --- coreiface/tests/api.go | 2 +- coreiface/tests/block.go | 12 ++++++------ coreiface/tests/dag.go | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index ab1feff5be..23ec0612bc 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -71,7 +71,7 @@ func TestApi(p Provider) func(t *testing.T) { select { case <-zeroRunning: case <-time.After(time.Second): - t.Errorf("%d node(s) not closed", running) + t.Errorf("%d test swarms(s) not closed", running) } }) } diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index a3a5f93aa1..d1117cc50c 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -26,12 +26,12 @@ func (tp *provider) TestBlockPut(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) if err != nil { - t.Error(err) + t.Fatal(err) } if res.Path().Cid().String() != "QmPyo15ynbVrSTVdJL9th7JysHaAbXt9dM9tXk1bMHbRtk" { @@ -49,7 +49,7 @@ func (tp *provider) TestBlockPutFormat(t *testing.T) { res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("cbor")) if err != nil { - t.Error(err) + t.Fatal(err) } if res.Path().Cid().String() != "zdpuAn4amuLWo8Widi5v6VQpuo2dnpnwbVE3oB6qqs7mDSeoa" { @@ -85,7 +85,7 @@ func (tp *provider) TestBlockGet(t *testing.T) { res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Hash(mh.KECCAK_512, -1)) if err != nil { - t.Error(err) + t.Fatal(err) } r, err := api.Block().Get(ctx, res.Path()) @@ -126,7 +126,7 @@ func (tp *provider) TestBlockRm(t *testing.T) { res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) if err != nil { - t.Error(err) + t.Fatal(err) } r, err := api.Block().Get(ctx, res.Path()) @@ -180,7 +180,7 @@ func (tp *provider) TestBlockStat(t *testing.T) { res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) if err != nil { - t.Error(err) + t.Fatal(err) } stat, err := api.Block().Stat(ctx, res.Path()) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 636c386991..d502639434 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -40,7 +40,7 @@ func (tp *provider) TestPut(t *testing.T) { res, err := api.Dag().Put(ctx, strings.NewReader(`"Hello"`)) if err != nil { - t.Error(err) + t.Fatal(err) } if res.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { @@ -58,7 +58,7 @@ func (tp *provider) TestPutWithHash(t *testing.T) { res, err := api.Dag().Put(ctx, strings.NewReader(`"Hello"`), opt.Dag.Hash(mh.ID, -1)) if err != nil { - t.Error(err) + t.Fatal(err) } if res.Cid().String() != "z5hRLNd2sv4z1c" { @@ -76,12 +76,12 @@ func (tp *provider) TestDagPath(t *testing.T) { sub, err := api.Dag().Put(ctx, strings.NewReader(`"foo"`)) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Dag().Put(ctx, strings.NewReader(`{"lnk": {"/": "`+sub.Cid().String()+`"}}`)) if err != nil { - t.Error(err) + t.Fatal(err) } p, err := coreiface.ParsePath(path.Join(res.Cid().String(), "lnk")) @@ -109,7 +109,7 @@ func (tp *provider) TestTree(t *testing.T) { c, err := api.Dag().Put(ctx, strings.NewReader(`{"a": 123, "b": "foo", "c": {"d": 321, "e": 111}}`)) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Dag().Get(ctx, c) @@ -141,7 +141,7 @@ func (tp *provider) TestBatch(t *testing.T) { c, err := batch.Put(ctx, strings.NewReader(`"Hello"`)) if err != nil { - t.Error(err) + t.Fatal(err) } if c.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { From aecc5aa1ac7d14502faf74530e73fb801aed4158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 4 Jan 2019 02:35:40 +0100 Subject: [PATCH 2507/3147] Fix offline gateway directory logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@360e8bbf0b798f4c52541d9116e3b2d240c71a9a --- coreiface/path.go | 9 +++++++-- coreiface/tests/path.go | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/coreiface/path.go b/coreiface/path.go index 01dda97d5a..96f30852d8 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,9 +1,8 @@ package iface import ( + "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipfspath "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" - - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ) //TODO: merge with ipfspath so we don't depend on it @@ -106,6 +105,12 @@ type resolvedPath struct { remainder string } +// Join appends provided segments to the base path +func Join(base Path, a ...string) Path { + s := ipfspath.Join(append([]string{base.String()}, a...)) + return &path{path: ipfspath.FromString(s)} +} + // IpfsPath creates new /ipfs path from the provided CID func IpfsPath(c cid.Cid) ResolvedPath { return &resolvedPath{ diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index e74053c049..7057d62864 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -15,6 +15,7 @@ func (tp *provider) TestPath(t *testing.T) { t.Run("TestEmptyPathRemainder", tp.TestEmptyPathRemainder) t.Run("TestInvalidPathRemainder", tp.TestInvalidPathRemainder) t.Run("TestPathRoot", tp.TestPathRoot) + t.Run("TestPathJoin", tp.TestPathJoin) } func (tp *provider) TestMutablePath(t *testing.T) { @@ -165,3 +166,14 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Error("unexpected path cid") } } + +func (tp *provider) TestPathJoin(t *testing.T) { + p1, err := coreiface.ParsePath("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") + if err != nil { + t.Error(err) + } + + if coreiface.Join(p1, "foo").String() != "/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz/foo" { + t.Error("unexpected path") + } +} From 030083beef42fd48df466a4a97ea0f51fb1dfbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 4 Jan 2019 15:40:15 +0100 Subject: [PATCH 2508/3147] coreapi: FetchBlocks option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@6800f56736680add20352d2348a59a1a41f7808e --- coreiface/options/global.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/coreiface/options/global.go b/coreiface/options/global.go index 93d635e41b..90e2586f10 100644 --- a/coreiface/options/global.go +++ b/coreiface/options/global.go @@ -1,14 +1,16 @@ package options type ApiSettings struct { - Offline bool + Offline bool + FetchBlocks bool } type ApiOption func(*ApiSettings) error func ApiOptions(opts ...ApiOption) (*ApiSettings, error) { options := &ApiSettings{ - Offline: false, + Offline: false, + FetchBlocks: true, } return ApiOptionsTo(options, opts...) @@ -34,3 +36,12 @@ func (apiOpts) Offline(offline bool) ApiOption { return nil } } + +// FetchBlocks when set to false prevents api from fetching blocks from the +// network while allowing other services such as IPNS to still be online +func (apiOpts) FetchBlocks(fetch bool) ApiOption { + return func(settings *ApiSettings) error { + settings.FetchBlocks = fetch + return nil + } +} From 9845df2662de30cb8d0030bd280e2b58247a0ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 7 Jan 2019 16:19:55 +0100 Subject: [PATCH 2509/3147] CoreAPI: Don't panic when testing incomplete implementions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@d7a89ddb0258cbc54631924688e6f23bc02709d5 --- coreiface/tests/api.go | 16 +++++++++++++++ coreiface/tests/block.go | 7 +++++++ coreiface/tests/dag.go | 7 +++++++ coreiface/tests/dht.go | 8 ++++++++ coreiface/tests/key.go | 8 ++++++++ coreiface/tests/name.go | 7 +++++++ coreiface/tests/object.go | 7 +++++++ coreiface/tests/path.go | 42 ++++++++++++++++++++++++++++++--------- coreiface/tests/pin.go | 8 ++++++++ coreiface/tests/pubsub.go | 8 ++++++++ coreiface/tests/unixfs.go | 7 +++++++ 11 files changed, 116 insertions(+), 9 deletions(-) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index 23ec0612bc..7a4bd73862 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -2,12 +2,15 @@ package tests import ( "context" + "errors" "testing" "time" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" ) +var apiNotImplemented = errors.New("api not implemented") + func (tp *provider) makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { api, err := tp.MakeAPISwarm(ctx, false, 1) if err != nil { @@ -76,3 +79,16 @@ func TestApi(p Provider) func(t *testing.T) { }) } } + +func (tp *provider) hasApi(t *testing.T, tf func(coreiface.CoreAPI) error) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + if err := tf(api); err != nil { + t.Fatal(api) + } +} diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index d1117cc50c..81a6fb0617 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -13,6 +13,13 @@ import ( ) func (tp *provider) TestBlock(t *testing.T) { + tp.hasApi(t, func(api coreiface.CoreAPI) error { + if api.Block() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestBlockPut", tp.TestBlockPut) t.Run("TestBlockPutFormat", tp.TestBlockPutFormat) t.Run("TestBlockPutHash", tp.TestBlockPutHash) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index d502639434..70a45aa204 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -13,6 +13,13 @@ import ( ) func (tp *provider) TestDag(t *testing.T) { + tp.hasApi(t, func(api coreiface.CoreAPI) error { + if api.Dag() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestPut", tp.TestPut) t.Run("TestPutWithHash", tp.TestPutWithHash) t.Run("TestPath", tp.TestDagPath) diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index 9b77f16792..3ec77d33bf 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -5,10 +5,18 @@ import ( "io" "testing" + "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) func (tp *provider) TestDht(t *testing.T) { + tp.hasApi(t, func(api iface.CoreAPI) error { + if api.Dht() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestDhtFindPeer", tp.TestDhtFindPeer) t.Run("TestDhtFindProviders", tp.TestDhtFindProviders) t.Run("TestDhtProvide", tp.TestDhtProvide) diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index 99c30c3023..8dd6af57f4 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -5,10 +5,18 @@ import ( "strings" "testing" + "github.com/ipfs/go-ipfs/core/coreapi/interface" opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ) func (tp *provider) TestKey(t *testing.T) { + tp.hasApi(t, func(api iface.CoreAPI) error { + if api.Key() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestListSelf", tp.TestListSelf) t.Run("TestRenameSelf", tp.TestRenameSelf) t.Run("TestRemoveSelf", tp.TestRemoveSelf) diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index e114b26dea..639e72c3d9 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -16,6 +16,13 @@ import ( ) func (tp *provider) TestName(t *testing.T) { + tp.hasApi(t, func(api coreiface.CoreAPI) error { + if api.Name() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestPublishResolve", tp.TestPublishResolve) t.Run("TestBasicPublishResolveKey", tp.TestBasicPublishResolveKey) t.Run("TestBasicPublishResolveTimeout", tp.TestBasicPublishResolveTimeout) diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 1cd24aac25..81d5b4117c 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -13,6 +13,13 @@ import ( ) func (tp *provider) TestObject(t *testing.T) { + tp.hasApi(t, func(api iface.CoreAPI) error { + if api.Object() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestNew", tp.TestNew) t.Run("TestObjectPut", tp.TestObjectPut) t.Run("TestObjectGet", tp.TestObjectGet) diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 7057d62864..50a1977d50 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -26,23 +26,27 @@ func (tp *provider) TestMutablePath(t *testing.T) { t.Fatal(err) } - // get self /ipns path - keys, err := api.Key().List(ctx) + blk, err := api.Block().Put(ctx, strings.NewReader(`foo`)) if err != nil { t.Fatal(err) } - if !keys[0].Path().Mutable() { - t.Error("expected self /ipns path to be mutable") + if blk.Path().Mutable() { + t.Error("expected /ipld path to be immutable") } - blk, err := api.Block().Put(ctx, strings.NewReader(`foo`)) + // get self /ipns path + if api.Key() == nil { + t.Fatal(".Key not implemented") + } + + keys, err := api.Key().List(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } - if blk.Path().Mutable() { - t.Error("expected /ipld path to be immutable") + if !keys[0].Path().Mutable() { + t.Error("expected self /ipns path to be mutable") } } @@ -54,6 +58,10 @@ func (tp *provider) TestPathRemainder(t *testing.T) { t.Fatal(err) } + if api.Dag() == nil { + t.Fatal(".Dag not implemented") + } + obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) if err != nil { t.Fatal(err) @@ -82,6 +90,10 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { t.Fatal(err) } + if api.Dag() == nil { + t.Fatal(".Dag not implemented") + } + obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) if err != nil { t.Fatal(err) @@ -114,6 +126,10 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { t.Fatal(err) } + if api.Dag() == nil { + t.Fatal(".Dag not implemented") + } + obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) if err != nil { t.Fatal(err) @@ -138,9 +154,17 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(err) } + if api.Block() == nil { + t.Fatal(".Block not implemented") + } + blk, err := api.Block().Put(ctx, strings.NewReader(`foo`), options.Block.Format("raw")) if err != nil { - t.Error(err) + t.Fatal(err) + } + + if api.Dag() == nil { + t.Fatal(".Dag not implemented") } obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"/": "`+blk.Path().Cid().String()+`"}}`)) diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 823281ab14..87ad8a0048 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -2,6 +2,7 @@ package tests import ( "context" + "github.com/ipfs/go-ipfs/core/coreapi/interface" "strings" "testing" @@ -9,6 +10,13 @@ import ( ) func (tp *provider) TestPin(t *testing.T) { + tp.hasApi(t, func(api iface.CoreAPI) error { + if api.Pin() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestPinAdd", tp.TestPinAdd) t.Run("TestPinSimple", tp.TestPinSimple) t.Run("TestPinRecursive", tp.TestPinRecursive) diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index 3462b47551..b993f51dc5 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -2,12 +2,20 @@ package tests import ( "context" + "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" "testing" "time" ) func (tp *provider) TestPubSub(t *testing.T) { + tp.hasApi(t, func(api iface.CoreAPI) error { + if api.PubSub() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestBasicPubSub", tp.TestBasicPubSub) } diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index f411ad24da..ddb3145f7a 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -24,6 +24,13 @@ import ( ) func (tp *provider) TestUnixfs(t *testing.T) { + tp.hasApi(t, func(api coreiface.CoreAPI) error { + if api.Unixfs() == nil { + return apiNotImplemented + } + return nil + }) + t.Run("TestAdd", tp.TestAdd) t.Run("TestAddPinned", tp.TestAddPinned) t.Run("TestAddHashOnly", tp.TestAddHashOnly) From 551b466a611343bda0eb37d646ef753153919d2a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 8 Jan 2019 19:19:34 -0800 Subject: [PATCH 2510/3147] gx: update deps Importantly: * fixes a bunch of MFS bugs * pulls in some bitswap improvements License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@e51dd550f4404781592f8d911ba822512039f304 --- coreiface/dht.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/swarm.go | 6 +++--- coreiface/tests/name.go | 2 +- coreiface/tests/unixfs.go | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index e39be92c58..ec8bd92c34 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" - pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index fd748bb4ad..5f92f3eea4 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -5,7 +5,7 @@ import ( "fmt" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/path.go b/coreiface/path.go index 96f30852d8..580703a732 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,8 +1,8 @@ package iface import ( + ipfspath "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipfspath "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 63d20f0351..83e2072824 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,10 +5,10 @@ import ( "errors" "time" - net "gx/ipfs/QmPtFaR7BWHLAjSwLh9kXcyrgTzDpuhcWLkx8ioa9RMYnx/go-libp2p-net" - ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" + ma "gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr" + net "gx/ipfs/QmNgLg1NTw37iWbYPKcyK85YJ9Whs1MkPtJwhfqbNYAyKg/go-libp2p-net" + pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" - pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" ) diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 639e72c3d9..2e43a12eee 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -8,8 +8,8 @@ import ( "testing" "time" + ipath "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" - ipath "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index ddb3145f7a..e8a1aba32e 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -15,11 +15,11 @@ import ( coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" cbor "gx/ipfs/QmRoARq3nkUb13HSKZGepCZSWe5GrVPwx7xURJGZ7KWv9V/go-ipld-cbor" + mdag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" - "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs" - mdag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) From d34b0ea4adb45156bd973dea8923e03eca96dde3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 8 Jan 2019 19:19:34 -0800 Subject: [PATCH 2511/3147] gx: update deps Importantly: * fixes a bunch of MFS bugs * pulls in some bitswap improvements License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@8f0ee3d5cc4ea9d113661292f14a3bd27e87d6d5 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 474c7ecfa3..a39d6f9066 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" From 3046c1a64078f3c690b346bde5e9c6bb68da7689 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 8 Jan 2019 19:19:34 -0800 Subject: [PATCH 2512/3147] gx: update deps Importantly: * fixes a bunch of MFS bugs * pulls in some bitswap improvements License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@d6ba56e752325a91f2e1a991c137f2f818e84028 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 18 +++++++++--------- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 10 +++++----- namesys/proquint.go | 2 +- namesys/publisher.go | 10 +++++----- namesys/publisher_test.go | 8 ++++---- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 8 ++++---- namesys/routing.go | 10 +++++----- 14 files changed, 44 insertions(+), 44 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index e956f7653d..9fbaa06b9e 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 653580586d..51bb0c0b0d 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index b92a780290..5267941747 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index e330a83cbe..64690cd3d8 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 840bd064a5..181f227f00 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,21 +5,21 @@ import ( "testing" "time" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" - testutil "gx/ipfs/QmPuhRE325DR8ChNcFtgd6F1eANCHy1oohXZPpYop4xsK6/go-testutil" - routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" - ropts "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing/options" + testutil "gx/ipfs/QmNvHv84aH2qZafDuSdKJCQ1cvPZ1kmQmyD4YtzjUHuk9v/go-testutil" + pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore/pstoremem" + routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" + ropts "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing/options" + mockrouting "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/mock" + offline "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/offline" + ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" - pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore/pstoremem" - mockrouting "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/mock" - offline "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/offline" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" record "gx/ipfs/QmfARXVCzpwFXQdepAJZuqyNDgV9doEsMnVCo1ssmuSe1U/go-libp2p-record" diff --git a/namesys/namesys.go b/namesys/namesys.go index 303413d29b..d944b650f4 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,13 +5,13 @@ import ( "strings" "time" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" + routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 4e398485f7..bbbf632d0b 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,13 +7,13 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" + pstoremem "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore/pstoremem" + "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs" + offroute "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/offline" + ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" - pstoremem "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore/pstoremem" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" - "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs" - offroute "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/offline" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index a2c8c6f083..5e8d52fe7b 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 64bea67141..63cae54ce3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,13 +7,13 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" - ft "gx/ipfs/Qmbvw7kpSM2p6rbQ57WGRhhqNfCiNGW6EKH4xgHLw4bsnB/go-unixfs" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + ft "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" - pb "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns/pb" - routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" + routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" + ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" + pb "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns/pb" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index d872ec3249..0d82cc0c27 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,13 +6,13 @@ import ( "testing" "time" + ma "gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" - testutil "gx/ipfs/QmPuhRE325DR8ChNcFtgd6F1eANCHy1oohXZPpYop4xsK6/go-testutil" - ma "gx/ipfs/QmRKLtwMw131aK7ugC3G7ybpumMz78YrJe5dzneyindvG1/go-multiaddr" + testutil "gx/ipfs/QmNvHv84aH2qZafDuSdKJCQ1cvPZ1kmQmyD4YtzjUHuk9v/go-testutil" + mockrouting "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/mock" + ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" - mockrouting "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/mock" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 7fb593a685..52d90629be 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,12 +7,12 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - pb "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns/pb" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" + pb "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns/pb" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 26d3fa807b..f55fd2984a 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" - mocknet "gx/ipfs/QmRBaUEQEeFWywfrZJ64QgsmvcqgLSK3VbvGMR2NM2Edpf/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmZ9zH2FnLcxv1xyzFeUpDUeo55xEhZQHgveZijcxr7TLj/go-libp2p-peerstore" + mocknet "gx/ipfs/QmYxivS34F2M2n44WQQnRHGAKS8aoRUxwGpi9wk4Cdn4Jf/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 32bc6dddf7..c157f7de38 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" - ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" - testutil "gx/ipfs/QmPuhRE325DR8ChNcFtgd6F1eANCHy1oohXZPpYop4xsK6/go-testutil" + testutil "gx/ipfs/QmNvHv84aH2qZafDuSdKJCQ1cvPZ1kmQmyD4YtzjUHuk9v/go-testutil" + mockrouting "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/mock" + ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" - mockrouting "gx/ipfs/QmdmWkx54g7VfVyxeG8ic84uf4G6Eq1GohuyKA3XDuJ8oC/go-ipfs-routing/mock" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 3398e0e7f0..029eaeb83c 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,15 +5,15 @@ import ( "strings" "time" - path "gx/ipfs/QmZErC2Ay6WuGi96CPg316PwitdwgLo6RxZRqVjJjRj2MR/go-path" + path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - ipns "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns" - pb "gx/ipfs/QmPrt2JqvtFcgMBmYBjtZ5jFzq6HoFXy8PTwLb2Dpm2cGf/go-ipns/pb" + dht "gx/ipfs/QmNoNExMdWrYSPZDiJJTVmxSh6uKLN26xYVzbLzBLedRcv/go-libp2p-kad-dht" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - routing "gx/ipfs/QmRASJXJUFygM5qU4YrH7k7jD6S4Hg8nJmgqJ4bYJvLatd/go-libp2p-routing" - dht "gx/ipfs/QmXbPygnUKAPMwseE5U3hQA7Thn59GVm7pQrhkFV63umT8/go-libp2p-kad-dht" + routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" + ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" + pb "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns/pb" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" From 4a963093010d26c72a10506c90b61d367c42f174 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 8 Jan 2019 19:19:34 -0800 Subject: [PATCH 2513/3147] gx: update deps Importantly: * fixes a bunch of MFS bugs * pulls in some bitswap improvements License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@20a477e2e65bee7aa49290236b1d0ead47eb6f9f --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 8a04d7fc1a..1c5c6a7af1 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmPoh3SrQzFBWtdGK6qmHDV4EanKR6kYPj4DD3J2NLoEmZ/go-blockservice" - dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + bserv "gx/ipfs/QmYPZzd9VqmJDwxUnThfeSbV1Y5o53aVPDijTB7j7rS9Ep/go-blockservice" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" bstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index d9a21f1cab..11fb21039d 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + mdag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index ce13cb844f..e37773e76d 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmPoh3SrQzFBWtdGK6qmHDV4EanKR6kYPj4DD3J2NLoEmZ/go-blockservice" - mdag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + mdag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + bs "gx/ipfs/QmYPZzd9VqmJDwxUnThfeSbV1Y5o53aVPDijTB7j7rS9Ep/go-blockservice" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 66ae325c8f..ff7152685a 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index da964e37e1..184041f369 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmPoh3SrQzFBWtdGK6qmHDV4EanKR6kYPj4DD3J2NLoEmZ/go-blockservice" - dag "gx/ipfs/QmdV35UHnL1FM52baPkeUo6u7Fxm2CRUkPTLRPxeF8a4Ap/go-merkledag" + dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + bserv "gx/ipfs/QmYPZzd9VqmJDwxUnThfeSbV1Y5o53aVPDijTB7j7rS9Ep/go-blockservice" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From 8181fdcf87df81e45b7abf051bbb82d0ad5c8ad2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 7 Jan 2019 17:17:05 -0800 Subject: [PATCH 2514/3147] fix over-wait in WaitPub Before, WaitPub could wait forever if a value was published at the same time as the call to WaitPub. This patch also avoids republishing the same value multiple times and allows setting an initial value without reaching in and modifying internal state. fixes #38 This commit was moved from ipfs/go-mfs@740d0589f0524f824d1e06a6ebefd425519f5051 --- mfs/ops.go | 3 +- mfs/repub.go | 211 ++++++++++++++++++++++++++++------------------ mfs/repub_test.go | 22 +++-- mfs/root.go | 3 +- 4 files changed, 143 insertions(+), 96 deletions(-) diff --git a/mfs/ops.go b/mfs/ops.go index dc3da4ca24..031a77d466 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -1,6 +1,7 @@ package mfs import ( + "context" "fmt" "os" gopath "path" @@ -235,6 +236,6 @@ func FlushPath(rt *Root, pth string) error { return err } - rt.repub.WaitPub() + rt.repub.WaitPub(context.TODO()) return nil } diff --git a/mfs/repub.go b/mfs/repub.go index 12738fa482..de1a3c57c4 100644 --- a/mfs/repub.go +++ b/mfs/repub.go @@ -2,7 +2,6 @@ package mfs import ( "context" - "sync" "time" cid "github.com/ipfs/go-cid" @@ -14,15 +13,13 @@ type PubFunc func(context.Context, cid.Cid) error // Republisher manages when to publish a given entry. type Republisher struct { - TimeoutLong time.Duration - TimeoutShort time.Duration - valueHasBeenUpdated chan struct{} - pubfunc PubFunc - immediatePublish chan chan struct{} + TimeoutLong time.Duration + TimeoutShort time.Duration + RetryTimeout time.Duration + pubfunc PubFunc - valueLock sync.Mutex - valueToPublish cid.Cid - lastValuePublished cid.Cid + update chan cid.Cid + immediatePublish chan chan struct{} ctx context.Context cancel func() @@ -33,47 +30,62 @@ type Republisher struct { func NewRepublisher(ctx context.Context, pf PubFunc, tshort, tlong time.Duration) *Republisher { ctx, cancel := context.WithCancel(ctx) return &Republisher{ - TimeoutShort: tshort, - TimeoutLong: tlong, - valueHasBeenUpdated: make(chan struct{}, 1), - pubfunc: pf, - immediatePublish: make(chan chan struct{}), - ctx: ctx, - cancel: cancel, + TimeoutShort: tshort, + TimeoutLong: tlong, + RetryTimeout: tlong, + update: make(chan cid.Cid, 1), + pubfunc: pf, + immediatePublish: make(chan chan struct{}), + ctx: ctx, + cancel: cancel, } } // WaitPub waits for the current value to be published (or returns early // if it already has). -func (rp *Republisher) WaitPub() { +func (rp *Republisher) WaitPub(ctx context.Context) error { wait := make(chan struct{}) - rp.immediatePublish <- wait - <-wait + select { + case rp.immediatePublish <- wait: + case <-ctx.Done(): + return ctx.Err() + } + select { + case <-wait: + return nil + case <-ctx.Done(): + return ctx.Err() + } } func (rp *Republisher) Close() error { - err := rp.publish(rp.ctx) + // TODO(steb): Wait for `Run` to stop + err := rp.WaitPub(rp.ctx) rp.cancel() return err } -// Update the `valueToPublish` and signal it in the `valueHasBeenUpdated` -// channel. Multiple consecutive updates may extend the time period before -// the next publish occurs in order to more efficiently batch updates. +// Update the current value. The value will be published after a delay but each +// consecutive call to Update may extend this delay up to TimeoutLong. func (rp *Republisher) Update(c cid.Cid) { - rp.valueLock.Lock() - rp.valueToPublish = c - rp.valueLock.Unlock() - select { - case rp.valueHasBeenUpdated <- struct{}{}: - default: + case <-rp.update: + select { + case rp.update <- c: + default: + // Don't try again. If we hit this case, there's a + // concurrent publish and we can safely let that + // concurrent publish win. + } + case rp.update <- c: } } // Run contains the core logic of the `Republisher`. It calls the user-defined -// `pubfunc` function whenever the `Cid` value is updated. The complexity comes -// from the fact that `pubfunc` may be slow so we need to batch updates. +// `pubfunc` function whenever the `Cid` value is updated to a *new* value. The +// complexity comes from the fact that `pubfunc` may be slow so we need to batch +// updates. +// // Algorithm: // 1. When we receive the first update after publishing, we set a `longer` timer. // 2. When we receive any update, we reset the `quick` timer. @@ -83,66 +95,103 @@ func (rp *Republisher) Update(c cid.Cid) { // The `longer` timer ensures that we delay publishing by at most // `TimeoutLong`. The `quick` timer allows us to publish sooner if // it looks like there are no more updates coming down the pipe. -func (rp *Republisher) Run() { - for { +// +// Note: If a publish fails, we retry repeatedly every TimeoutRetry. +func (rp *Republisher) Run(lastPublished cid.Cid) { + quick := time.NewTimer(0) + if !quick.Stop() { + <-quick.C + } + longer := time.NewTimer(0) + if !longer.Stop() { + <-longer.C + } + + var toPublish cid.Cid + for rp.ctx.Err() == nil { + var waiter chan struct{} + select { case <-rp.ctx.Done(): return - case <-rp.valueHasBeenUpdated: - // Fast timeout, a `publish` will be issued if there are - // no more updates before it expires (restarted every time - // the `valueHasBeenUpdated` is signaled). - quick := time.After(rp.TimeoutShort) - // Long timeout that guarantees a `publish` after it expires - // even if the value keeps being updated (and `quick` is - // restarted). - longer := time.After(rp.TimeoutLong) - - wait: - var valueHasBeenPublished chan struct{} + case newValue := <-rp.update: + // Skip already published values. + if lastPublished.Equals(newValue) { + // Break to the end of the switch to cleanup any + // timers. + toPublish = cid.Undef + break + } - select { - case <-rp.ctx.Done(): - return - case <-rp.valueHasBeenUpdated: - // The `valueToPublish` has been updated *again* since - // the last time we checked and we still haven't published - // it, restart the `quick` timer allowing for some more - // time to see if the `valueToPublish` changes again. - quick = time.After(rp.TimeoutShort) - goto wait - - case <-quick: - case <-longer: - case valueHasBeenPublished = <-rp.immediatePublish: + // If we aren't already waiting to publish something, + // reset the long timeout. + if !toPublish.Defined() { + longer.Reset(rp.TimeoutLong) } - err := rp.publish(rp.ctx) - if valueHasBeenPublished != nil { - // The user is waiting in `WaitPub` with this channel, signal - // that the `publish` has happened. - valueHasBeenPublished <- struct{}{} + // Always reset the short timeout. + quick.Reset(rp.TimeoutShort) + + // Finally, set the new value to publish. + toPublish = newValue + continue + case waiter = <-rp.immediatePublish: + // Make sure to grab the *latest* value to publish. + select { + case toPublish = <-rp.update: + default: } - if err != nil { - log.Errorf("republishRoot error: %s", err) + + // Avoid publishing duplicate values + if !lastPublished.Equals(toPublish) { + toPublish = cid.Undef } + case <-quick.C: + case <-longer.C: } - } -} -// Wrapper function around the user-defined `pubfunc`. It publishes -// the (last) `valueToPublish` set and registers it in `lastValuePublished`. -func (rp *Republisher) publish(ctx context.Context) error { - rp.valueLock.Lock() - topub := rp.valueToPublish - rp.valueLock.Unlock() + // Cleanup, publish, and close waiters. + + // 1. Stop any timers. Don't use the `if !t.Stop() { ... }` + // idiom as these timers may not be running. + + quick.Stop() + select { + case <-quick.C: + default: + } - err := rp.pubfunc(ctx, topub) - if err != nil { - return err + longer.Stop() + select { + case <-longer.C: + default: + } + + // 2. If we have a value to publish, publish it now. + if toPublish.Defined() { + for { + err := rp.pubfunc(rp.ctx, toPublish) + if err == nil { + break + } + // Keep retrying until we succeed or we abort. + // TODO(steb): We could try pulling new values + // off `update` but that's not critical (and + // complicates this code a bit). We'll pull off + // a new value on the next loop through. + select { + case <-time.After(rp.RetryTimeout): + case <-rp.ctx.Done(): + return + } + } + lastPublished = toPublish + toPublish = cid.Undef + } + + // 3. Trigger anything waiting in `WaitPub`. + if waiter != nil { + close(waiter) + } } - rp.valueLock.Lock() - rp.lastValuePublished = topub - rp.valueLock.Unlock() - return nil } diff --git a/mfs/repub_test.go b/mfs/repub_test.go index d81ffd04ef..3a7eaaf701 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -23,13 +23,16 @@ func TestRepublisher(t *testing.T) { return nil } + testCid1, _ := cid.Parse("QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH") + testCid2, _ := cid.Parse("QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVX") + tshort := time.Millisecond * 50 tlong := time.Second / 2 rp := NewRepublisher(ctx, pf, tshort, tlong) - go rp.Run() + go rp.Run(cid.Undef) - rp.Update(cid.Undef) + rp.Update(testCid1) // should hit short timeout select { @@ -42,7 +45,7 @@ func TestRepublisher(t *testing.T) { go func() { for { - rp.Update(cid.Undef) + rp.Update(testCid2) time.Sleep(time.Millisecond * 10) select { case <-cctx.Done(): @@ -65,13 +68,8 @@ func TestRepublisher(t *testing.T) { cancel() - go func() { - err := rp.Close() - if err != nil { - t.Fatal(err) - } - }() - - // final pub from closing - <-pub + err := rp.Close() + if err != nil { + t.Fatal(err) + } } diff --git a/mfs/root.go b/mfs/root.go index ef1d9bcbe4..026a3202d1 100644 --- a/mfs/root.go +++ b/mfs/root.go @@ -99,11 +99,10 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf if pf != nil { repub = NewRepublisher(parent, pf, time.Millisecond*300, time.Second*3) - repub.valueToPublish = node.Cid() // No need to take the lock here since we just created // the `Republisher` and no one has access to it yet. - go repub.Run() + go repub.Run(node.Cid()) } root := &Root{ From 30ccbef95ef833214b85ad077614b4b07b85c9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 12 Jan 2019 15:41:19 +0100 Subject: [PATCH 2515/3147] coreapi: replace coreiface.DagAPI with ipld.DAGService MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@8e049b49d6e97f38c682aed4b2c18cdb557b3b84 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 41 ----------------- coreiface/options/dag.go | 95 --------------------------------------- coreiface/tests/dag.go | 77 +++++++++++++++++++++---------- coreiface/tests/path.go | 38 +++++++++++----- coreiface/tests/pin.go | 24 ++++++---- coreiface/tests/unixfs.go | 6 +-- 7 files changed, 98 insertions(+), 185 deletions(-) delete mode 100644 coreiface/dag.go delete mode 100644 coreiface/options/dag.go diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 226399967c..9d2100fcc5 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -19,7 +19,7 @@ type CoreAPI interface { Block() BlockAPI // Dag returns an implementation of Dag API - Dag() DagAPI + Dag() ipld.DAGService // Name returns an implementation of Name API Name() NameAPI diff --git a/coreiface/dag.go b/coreiface/dag.go deleted file mode 100644 index eb9e2da4a0..0000000000 --- a/coreiface/dag.go +++ /dev/null @@ -1,41 +0,0 @@ -package iface - -import ( - "context" - "io" - - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" -) - -// DagOps groups operations that can be batched together -type DagOps interface { - // Put inserts data using specified format and input encoding. - // Unless used with WithCodec or WithHash, the defaults "dag-cbor" and - // "sha256" are used. - Put(ctx context.Context, src io.Reader, opts ...options.DagPutOption) (ResolvedPath, error) -} - -// DagBatch is the batching version of DagAPI. All implementations of DagBatch -// should be threadsafe -type DagBatch interface { - DagOps - - // Commit commits nodes to the datastore and announces them to the network - Commit(ctx context.Context) error -} - -// DagAPI specifies the interface to IPLD -type DagAPI interface { - DagOps - - // Get attempts to resolve and get the node specified by the path - Get(ctx context.Context, path Path) (ipld.Node, error) - - // Tree returns list of paths within a node specified by the path. - Tree(ctx context.Context, path Path, opts ...options.DagTreeOption) ([]Path, error) - - // Batch creates new DagBatch - Batch(ctx context.Context) DagBatch -} diff --git a/coreiface/options/dag.go b/coreiface/options/dag.go deleted file mode 100644 index 9cccba5854..0000000000 --- a/coreiface/options/dag.go +++ /dev/null @@ -1,95 +0,0 @@ -package options - -import ( - "math" - - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" -) - -type DagPutSettings struct { - InputEnc string - Codec uint64 - MhType uint64 - MhLength int -} - -type DagTreeSettings struct { - Depth int -} - -type DagPutOption func(*DagPutSettings) error -type DagTreeOption func(*DagTreeSettings) error - -func DagPutOptions(opts ...DagPutOption) (*DagPutSettings, error) { - options := &DagPutSettings{ - InputEnc: "json", - Codec: cid.DagCBOR, - MhType: math.MaxUint64, - MhLength: -1, - } - - for _, opt := range opts { - err := opt(options) - if err != nil { - return nil, err - } - } - return options, nil -} - -func DagTreeOptions(opts ...DagTreeOption) (*DagTreeSettings, error) { - options := &DagTreeSettings{ - Depth: -1, - } - - for _, opt := range opts { - err := opt(options) - if err != nil { - return nil, err - } - } - return options, nil -} - -type dagOpts struct{} - -var Dag dagOpts - -// InputEnc is an option for Dag.Put which specifies the input encoding of the -// data. Default is "json", most formats/codecs support "raw" -func (dagOpts) InputEnc(enc string) DagPutOption { - return func(settings *DagPutSettings) error { - settings.InputEnc = enc - return nil - } -} - -// Codec is an option for Dag.Put which specifies the multicodec to use to -// serialize the object. Default is cid.DagCBOR (0x71) -func (dagOpts) Codec(codec uint64) DagPutOption { - return func(settings *DagPutSettings) error { - settings.Codec = codec - return nil - } -} - -// Hash is an option for Dag.Put which specifies the multihash settings to use -// when hashing the object. Default is based on the codec used -// (mh.SHA2_256 (0x12) for DagCBOR). If mhLen is set to -1, default length for -// the hash will be used -func (dagOpts) Hash(mhType uint64, mhLen int) DagPutOption { - return func(settings *DagPutSettings) error { - settings.MhType = mhType - settings.MhLength = mhLen - return nil - } -} - -// Depth is an option for Dag.Tree which specifies maximum depth of the -// returned tree. Default is -1 (no depth limit) -func (dagOpts) Depth(depth int) DagTreeOption { - return func(settings *DagTreeSettings) error { - settings.Depth = depth - return nil - } -} diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 70a45aa204..e66106c332 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -2,12 +2,13 @@ package tests import ( "context" + "math" "path" "strings" "testing" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" - opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + coredag "github.com/ipfs/go-ipfs/core/coredag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) @@ -45,13 +46,18 @@ func (tp *provider) TestPut(t *testing.T) { t.Error(err) } - res, err := api.Dag().Put(ctx, strings.NewReader(`"Hello"`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"Hello"`), math.MaxUint64, -1) + if err != nil { + t.Error(err) + } + + err = api.Dag().Add(ctx, nds[0]) if err != nil { t.Fatal(err) } - if res.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { - t.Errorf("got wrong cid: %s", res.Cid().String()) + if nds[0].Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + t.Errorf("got wrong cid: %s", nds[0].Cid().String()) } } @@ -63,13 +69,18 @@ func (tp *provider) TestPutWithHash(t *testing.T) { t.Error(err) } - res, err := api.Dag().Put(ctx, strings.NewReader(`"Hello"`), opt.Dag.Hash(mh.ID, -1)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"Hello"`), mh.ID, -1) + if err != nil { + t.Error(err) + } + + err = api.Dag().Add(ctx, nds[0]) if err != nil { t.Fatal(err) } - if res.Cid().String() != "z5hRLNd2sv4z1c" { - t.Errorf("got wrong cid: %s", res.Cid().String()) + if nds[0].Cid().String() != "z5hRLNd2sv4z1c" { + t.Errorf("got wrong cid: %s", nds[0].Cid().String()) } } @@ -81,28 +92,43 @@ func (tp *provider) TestDagPath(t *testing.T) { t.Error(err) } - sub, err := api.Dag().Put(ctx, strings.NewReader(`"foo"`)) + snds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"foo"`), math.MaxUint64, -1) + if err != nil { + t.Error(err) + } + + err = api.Dag().Add(ctx, snds[0]) if err != nil { t.Fatal(err) } - res, err := api.Dag().Put(ctx, strings.NewReader(`{"lnk": {"/": "`+sub.Cid().String()+`"}}`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"lnk": {"/": "`+snds[0].Cid().String()+`"}}`), math.MaxUint64, -1) + if err != nil { + t.Error(err) + } + + err = api.Dag().Add(ctx, nds[0]) if err != nil { t.Fatal(err) } - p, err := coreiface.ParsePath(path.Join(res.Cid().String(), "lnk")) + p, err := coreiface.ParsePath(path.Join(nds[0].Cid().String(), "lnk")) if err != nil { t.Error(err) } - nd, err := api.Dag().Get(ctx, p) + rp, err := api.ResolvePath(ctx, p) if err != nil { t.Error(err) } - if nd.Cid().String() != sub.Cid().String() { - t.Errorf("got unexpected cid %s, expected %s", nd.Cid().String(), sub.Cid().String()) + nd, err := api.Dag().Get(ctx, rp.Cid()) + if err != nil { + t.Error(err) + } + + if nd.Cid().String() != snds[0].Cid().String() { + t.Errorf("got unexpected cid %s, expected %s", nd.Cid().String(), snds[0].Cid().String()) } } @@ -114,12 +140,17 @@ func (tp *provider) TestTree(t *testing.T) { t.Error(err) } - c, err := api.Dag().Put(ctx, strings.NewReader(`{"a": 123, "b": "foo", "c": {"d": 321, "e": 111}}`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"a": 123, "b": "foo", "c": {"d": 321, "e": 111}}`), math.MaxUint64, -1) + if err != nil { + t.Error(err) + } + + err = api.Dag().Add(ctx, nds[0]) if err != nil { t.Fatal(err) } - res, err := api.Dag().Get(ctx, c) + res, err := api.Dag().Get(ctx, nds[0].Cid()) if err != nil { t.Error(err) } @@ -144,27 +175,25 @@ func (tp *provider) TestBatch(t *testing.T) { t.Error(err) } - batch := api.Dag().Batch(ctx) - - c, err := batch.Put(ctx, strings.NewReader(`"Hello"`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"Hello"`), math.MaxUint64, -1) if err != nil { - t.Fatal(err) + t.Error(err) } - if c.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { - t.Errorf("got wrong cid: %s", c.Cid().String()) + if nds[0].Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + t.Errorf("got wrong cid: %s", nds[0].Cid().String()) } - _, err = api.Dag().Get(ctx, c) + _, err = api.Dag().Get(ctx, nds[0].Cid()) if err == nil || err.Error() != "merkledag: not found" { t.Error(err) } - if err := batch.Commit(ctx); err != nil { + if err := api.Dag().AddMany(ctx, nds); err != nil { t.Error(err) } - _, err = api.Dag().Get(ctx, c) + _, err = api.Dag().Get(ctx, nds[0].Cid()) if err != nil { t.Error(err) } diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 50a1977d50..01f2e6f36b 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -2,11 +2,13 @@ package tests import ( "context" + "math" "strings" "testing" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/go-ipfs/core/coredag" ) func (tp *provider) TestPath(t *testing.T) { @@ -62,12 +64,16 @@ func (tp *provider) TestPathRemainder(t *testing.T) { t.Fatal(".Dag not implemented") } - obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { + t.Error(err) + } + + if err := api.Dag().AddMany(ctx, nds); err != nil { t.Fatal(err) } - p1, err := coreiface.ParsePath(obj.String() + "/foo/bar") + p1, err := coreiface.ParsePath(nds[0].String() + "/foo/bar") if err != nil { t.Error(err) } @@ -94,16 +100,16 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { t.Fatal(".Dag not implemented") } - obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { - t.Fatal(err) + t.Error(err) } - if obj.Remainder() != "" { - t.Error("expected the resolved path to not have a remainder") + if err := api.Dag().AddMany(ctx, nds); err != nil { + t.Fatal(err) } - p1, err := coreiface.ParsePath(obj.String()) + p1, err := coreiface.ParsePath(nds[0].Cid().String()) if err != nil { t.Error(err) } @@ -130,12 +136,16 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { t.Fatal(".Dag not implemented") } - obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"bar": "baz"}}`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { + t.Error(err) + } + + if err := api.Dag().AddMany(ctx, nds); err != nil { t.Fatal(err) } - p1, err := coreiface.ParsePath(obj.String() + "/bar/baz") + p1, err := coreiface.ParsePath("/ipld/" + nds[0].Cid().String() + "/bar/baz") if err != nil { t.Error(err) } @@ -167,12 +177,16 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(".Dag not implemented") } - obj, err := api.Dag().Put(ctx, strings.NewReader(`{"foo": {"/": "`+blk.Path().Cid().String()+`"}}`)) + nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"/": "`+blk.Path().Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { + t.Error(err) + } + + if err := api.Dag().AddMany(ctx, nds); err != nil { t.Fatal(err) } - p1, err := coreiface.ParsePath(obj.String() + "/foo") + p1, err := coreiface.ParsePath("/ipld/" + nds[0].Cid().String() + "/foo") if err != nil { t.Error(err) } @@ -182,7 +196,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(err) } - if rp.Root().String() != obj.Cid().String() { + if rp.Root().String() != nds[0].Cid().String() { t.Error("unexpected path root") } diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 87ad8a0048..2507992222 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -2,11 +2,13 @@ package tests import ( "context" - "github.com/ipfs/go-ipfs/core/coreapi/interface" + "math" "strings" "testing" + "github.com/ipfs/go-ipfs/core/coreapi/interface" opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/go-ipfs/core/coredag" ) func (tp *provider) TestPin(t *testing.T) { @@ -109,22 +111,26 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Error(err) } - p2, err := api.Dag().Put(ctx, strings.NewReader(`{"lnk": {"/": "`+p0.Cid().String()+`"}}`)) + nd2, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"lnk": {"/": "`+p0.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - p3, err := api.Dag().Put(ctx, strings.NewReader(`{"lnk": {"/": "`+p1.Cid().String()+`"}}`)) + nd3, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"lnk": {"/": "`+p1.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - err = api.Pin().Add(ctx, p2) + if err := api.Dag().AddMany(ctx, append(nd2, nd3...)); err != nil { + t.Fatal(err) + } + + err = api.Pin().Add(ctx, iface.IpldPath(nd2[0].Cid())) if err != nil { t.Error(err) } - err = api.Pin().Add(ctx, p3, opt.Pin.Recursive(false)) + err = api.Pin().Add(ctx, iface.IpldPath(nd3[0].Cid()), opt.Pin.Recursive(false)) if err != nil { t.Error(err) } @@ -147,8 +153,8 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - if list[0].Path().String() != p3.String() { - t.Error("unexpected path") + if list[0].Path().String() != iface.IpldPath(nd3[0].Cid()).String() { + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpfsPath(nd2[0].Cid()).String()) } list, err = api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) @@ -160,8 +166,8 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - if list[0].Path().String() != p2.String() { - t.Error("unexpected path") + if list[0].Path().String() != iface.IpldPath(nd2[0].Cid()).String() { + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpldPath(nd3[0].Cid()).String()) } list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index e8a1aba32e..fce41ae849 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -633,7 +633,7 @@ func (tp *provider) TestGetDir(t *testing.T) { t.Error(err) } edir := unixfs.EmptyDirNode() - _, err = api.Dag().Put(ctx, bytes.NewReader(edir.RawData()), options.Dag.Codec(cid.DagProtobuf), options.Dag.InputEnc("raw")) + err = api.Dag().Add(ctx, edir) if err != nil { t.Error(err) } @@ -667,7 +667,7 @@ func (tp *provider) TestGetNonUnixfs(t *testing.T) { } nd := new(mdag.ProtoNode) - _, err = api.Dag().Put(ctx, bytes.NewReader(nd.RawData()), options.Dag.Codec(nd.CidBuilder().GetCodec()), options.Dag.InputEnc("raw")) + err = api.Dag().Add(ctx, nd) if err != nil { t.Error(err) } @@ -801,7 +801,7 @@ func (tp *provider) TestLsNonUnixfs(t *testing.T) { t.Fatal(err) } - _, err = api.Dag().Put(ctx, bytes.NewReader(nd.RawData()), options.Dag.Codec(cid.DagCBOR), options.Dag.InputEnc("raw")) + err = api.Dag().Add(ctx, nd) if err != nil { t.Error(err) } From ce6145c5f966f889afe10c4d610fc73a26dc2b5f Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 14 Jan 2019 21:22:02 -0300 Subject: [PATCH 2516/3147] repub: fix typo in comparison We only unset `toPublish` if it was a repeated value. This commit was moved from ipfs/go-mfs@2e0c3bc16e67617135127f7436343cff4a33b1dd --- mfs/repub.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/repub.go b/mfs/repub.go index de1a3c57c4..2c9dbd25da 100644 --- a/mfs/repub.go +++ b/mfs/repub.go @@ -143,7 +143,7 @@ func (rp *Republisher) Run(lastPublished cid.Cid) { } // Avoid publishing duplicate values - if !lastPublished.Equals(toPublish) { + if lastPublished.Equals(toPublish) { toPublish = cid.Undef } case <-quick.C: From 6d44270b3a49474f67a51f0fcddfbf40766363be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 15 Jan 2019 18:51:29 +0100 Subject: [PATCH 2517/3147] coreapi: adjust some tests for go-ipfs-http-api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@fb15570caa8ff7cb9defce24198738273b23aa16 --- coreiface/tests/block.go | 4 ++-- coreiface/tests/dht.go | 20 ++++++++++++++++++-- coreiface/tests/key.go | 16 ++++++++-------- coreiface/tests/object.go | 2 +- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 81a6fb0617..427ad3357b 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -159,7 +159,7 @@ func (tp *provider) TestBlockRm(t *testing.T) { if err == nil { t.Error("expected err to exist") } - if err.Error() != "blockservice: key not found" { + if !strings.Contains(err.Error(), "blockservice: key not found") { t.Errorf("unexpected error; %s", err.Error()) } @@ -167,7 +167,7 @@ func (tp *provider) TestBlockRm(t *testing.T) { if err == nil { t.Error("expected err to exist") } - if err.Error() != "blockstore: block not found" { + if !strings.Contains(err.Error(), "blockstore: block not found") { t.Errorf("unexpected error; %s", err.Error()) } diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index 3ec77d33bf..d2eae1af47 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -35,12 +35,20 @@ func (tp *provider) TestDhtFindPeer(t *testing.T) { t.Fatal(err) } + laddrs0, err := apis[0].Swarm().LocalAddrs(ctx) + if err != nil { + t.Fatal(err) + } + if len(laddrs0) != 1 { + t.Fatal("unexpected number of local addrs") + } + pi, err := apis[2].Dht().FindPeer(ctx, self0.ID()) if err != nil { t.Fatal(err) } - if pi.Addrs[0].String() != "/ip4/127.0.0.1/tcp/4001" { + if pi.Addrs[0].String() != laddrs0[0].String() { t.Errorf("got unexpected address from FindPeer: %s", pi.Addrs[0].String()) } @@ -54,7 +62,15 @@ func (tp *provider) TestDhtFindPeer(t *testing.T) { t.Fatal(err) } - if pi.Addrs[0].String() != "/ip4/127.0.2.1/tcp/4001" { + laddrs2, err := apis[2].Swarm().LocalAddrs(ctx) + if err != nil { + t.Fatal(err) + } + if len(laddrs2) != 1 { + t.Fatal("unexpected number of local addrs") + } + + if pi.Addrs[0].String() != laddrs2[0].String() { t.Errorf("got unexpected address from FindPeer: %s", pi.Addrs[0].String()) } } diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index 8dd6af57f4..66011f99f9 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -82,7 +82,7 @@ func (tp *provider) TestRenameSelf(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "cannot rename key with name 'self'" { + if !strings.Contains(err.Error(), "cannot rename key with name 'self'") { t.Fatalf("expected error 'cannot rename key with name 'self'', got '%s'", err.Error()) } } @@ -91,7 +91,7 @@ func (tp *provider) TestRenameSelf(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "cannot rename key with name 'self'" { + if !strings.Contains(err.Error(), "cannot rename key with name 'self'") { t.Fatalf("expected error 'cannot rename key with name 'self'', got '%s'", err.Error()) } } @@ -110,7 +110,7 @@ func (tp *provider) TestRemoveSelf(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "cannot remove key with name 'self'" { + if !strings.Contains(err.Error(), "cannot remove key with name 'self'") { t.Fatalf("expected error 'cannot remove key with name 'self'', got '%s'", err.Error()) } } @@ -206,7 +206,7 @@ func (tp *provider) TestGenerateExisting(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "key with name 'foo' already exists" { + if !strings.Contains(err.Error(), "key with name 'foo' already exists") { t.Fatalf("expected error 'key with name 'foo' already exists', got '%s'", err.Error()) } } @@ -215,7 +215,7 @@ func (tp *provider) TestGenerateExisting(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "cannot create key with name 'self'" { + if !strings.Contains(err.Error(), "cannot create key with name 'self'") { t.Fatalf("expected error 'cannot create key with name 'self'', got '%s'", err.Error()) } } @@ -314,7 +314,7 @@ func (tp *provider) TestRenameToSelf(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "cannot overwrite key with name 'self'" { + if !strings.Contains(err.Error(), "cannot overwrite key with name 'self'") { t.Fatalf("expected error 'cannot overwrite key with name 'self'', got '%s'", err.Error()) } } @@ -338,7 +338,7 @@ func (tp *provider) TestRenameToSelfForce(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "cannot overwrite key with name 'self'" { + if !strings.Contains(err.Error(), "cannot overwrite key with name 'self'") { t.Fatalf("expected error 'cannot overwrite key with name 'self'', got '%s'", err.Error()) } } @@ -368,7 +368,7 @@ func (tp *provider) TestRenameOverwriteNoForce(t *testing.T) { if err == nil { t.Error("expected error to not be nil") } else { - if err.Error() != "key by that name already exists, refusing to overwrite" { + if !strings.Contains(err.Error(), "key by that name already exists, refusing to overwrite") { t.Fatalf("expected error 'key by that name already exists, refusing to overwrite', got '%s'", err.Error()) } } diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 81d5b4117c..2a3b1bd5ca 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -300,7 +300,7 @@ func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { if err == nil { t.Fatal("expected an error") } - if err.Error() != "no link by that name" { + if !strings.Contains(err.Error(), "no link by that name") { t.Fatalf("unexpected error: %s", err.Error()) } From 40c3900dd0eb8a88e013751d40e2f84f47ab3b0e Mon Sep 17 00:00:00 2001 From: Overbool Date: Fri, 19 Oct 2018 22:58:58 +0800 Subject: [PATCH 2518/3147] refactor(hamt): remove protonode This commit was moved from ipfs/go-unixfs@71ede54b4fa611a6e6ccc501bf6b1d7a456ebf84 --- unixfs/hamt/hamt.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index fdaf5be9b8..f09dfc2857 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -44,10 +44,11 @@ func (ds *Shard) isValueNode() bool { // A Shard represents the HAMT. It should be initialized with NewShard(). type Shard struct { - nd *dag.ProtoNode + cid cid.Cid bitfield bitfield.Bitfield + links []*ipld.Link children []*Shard tableSize int @@ -73,7 +74,7 @@ func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { return nil, err } - ds.nd = new(dag.ProtoNode) + ds.links = make([]*ipld.Link, 0) ds.hashFunc = HashMurmur3 return ds, nil } @@ -119,11 +120,16 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { return nil, err } - ds.nd = pbnd.Copy().(*dag.ProtoNode) + if len(pbnd.Links()) > 0 { + ds.links = make([]*ipld.Link, len(pbnd.Links())) + copy(ds.links, pbnd.Links()) + } + + ds.cid = pbnd.Cid() ds.children = make([]*Shard, len(pbnd.Links())) ds.bitfield.SetBytes(fsn.Data()) ds.hashFunc = fsn.HashType() - ds.builder = ds.nd.CidBuilder() + ds.builder = pbnd.CidBuilder() return ds, nil } @@ -163,7 +169,7 @@ func (ds *Shard) Node() (ipld.Node, error) { } } else { // child unloaded, just copy in link with updated name - lnk := ds.nd.Links()[cindex] + lnk := ds.links[cindex] label := lnk.Name[ds.maxpadlen:] err := out.AddRawLink(ds.linkNamePrefix(i)+label, lnk) @@ -273,7 +279,7 @@ func (ds *Shard) getChild(ctx context.Context, i int) (*Shard, error) { return nil, fmt.Errorf("invalid index passed to getChild (likely corrupt bitfield)") } - if len(ds.children) != len(ds.nd.Links()) { + if len(ds.children) != len(ds.links) { return nil, fmt.Errorf("inconsistent lengths between children array and Links array") } @@ -288,7 +294,7 @@ func (ds *Shard) getChild(ctx context.Context, i int) (*Shard, error) { // loadChild reads the i'th child node of this shard from disk and returns it // as a 'child' interface func (ds *Shard) loadChild(ctx context.Context, i int) (*Shard, error) { - lnk := ds.nd.Links()[i] + lnk := ds.links[i] lnkLinkType, err := ds.childLinkType(lnk) if err != nil { return nil, err @@ -356,20 +362,20 @@ func (ds *Shard) insertChild(idx int, key string, lnk *ipld.Link) error { } ds.children = append(ds.children[:i], append([]*Shard{sv}, ds.children[i:]...)...) - ds.nd.SetLinks(append(ds.nd.Links()[:i], append([]*ipld.Link{nil}, ds.nd.Links()[i:]...)...)) + ds.links = append(ds.links[:i], append([]*ipld.Link{nil}, ds.links[i:]...)...) return nil } func (ds *Shard) rmChild(i int) error { - if i < 0 || i >= len(ds.children) || i >= len(ds.nd.Links()) { + if i < 0 || i >= len(ds.children) || i >= len(ds.links) { return fmt.Errorf("hamt: attempted to remove child with out of range index") } copy(ds.children[i:], ds.children[i+1:]) ds.children = ds.children[:len(ds.children)-1] - copy(ds.nd.Links()[i:], ds.nd.Links()[i+1:]) - ds.nd.SetLinks(ds.nd.Links()[:len(ds.nd.Links())-1]) + copy(ds.links[i:], ds.links[i+1:]) + ds.links = ds.links[:len(ds.links)-1] return nil } @@ -458,7 +464,7 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format } childShards := make([]*ipld.Link, 0, len(directoryShard.children)) - links := directoryShard.nd.Links() + links := directoryShard.links for idx := range directoryShard.children { lnk := links[idx] lnkLinkType, err := directoryShard.childLinkType(lnk) From f0fc602c5a605aafd5e276ea31a4e6fa91f42792 Mon Sep 17 00:00:00 2001 From: Overbool Date: Mon, 5 Nov 2018 16:02:28 +0800 Subject: [PATCH 2519/3147] hamt: wrap the manipulation about child and link This commit was moved from ipfs/go-unixfs@332e82f2d7733368887cf5f154094a424422d094 --- unixfs/hamt/hamt.go | 356 ++++++++++++++++++++++----------------- unixfs/hamt/hamt_test.go | 8 +- unixfs/hamt/util.go | 8 + 3 files changed, 213 insertions(+), 159 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index f09dfc2857..17e0315027 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -30,7 +30,6 @@ import ( ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" format "github.com/ipfs/go-unixfs" - "github.com/spaolacci/murmur3" ) const ( @@ -46,10 +45,7 @@ func (ds *Shard) isValueNode() bool { type Shard struct { cid cid.Cid - bitfield bitfield.Bitfield - - links []*ipld.Link - children []*Shard + childer *childer tableSize int tableSizeLg2 int @@ -74,7 +70,6 @@ func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { return nil, err } - ds.links = make([]*ipld.Link, 0) ds.hashFunc = HashMurmur3 return ds, nil } @@ -85,14 +80,18 @@ func makeShard(ds ipld.DAGService, size int) (*Shard, error) { return nil, err } maxpadding := fmt.Sprintf("%X", size-1) - return &Shard{ + s := &Shard{ tableSizeLg2: lg2s, prefixPadStr: fmt.Sprintf("%%0%dX", len(maxpadding)), maxpadlen: len(maxpadding), - bitfield: bitfield.NewBitfield(size), + childer: newChilder(ds, size), tableSize: size, dserv: ds, - }, nil + } + + s.childer.sd = s + + return s, nil } // NewHamtFromDag creates new a HAMT shard from the given DAG. @@ -115,19 +114,16 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { return nil, fmt.Errorf("only murmur3 supported as hash function") } - ds, err := makeShard(dserv, int(fsn.Fanout())) + size := int(fsn.Fanout()) + + ds, err := makeShard(dserv, size) if err != nil { return nil, err } - if len(pbnd.Links()) > 0 { - ds.links = make([]*ipld.Link, len(pbnd.Links())) - copy(ds.links, pbnd.Links()) - } + ds.childer.makeChilder(fsn.Data(), pbnd.Links()) ds.cid = pbnd.Cid() - ds.children = make([]*Shard, len(pbnd.Links())) - ds.bitfield.SetBytes(fsn.Data()) ds.hashFunc = fsn.HashType() ds.builder = pbnd.CidBuilder() @@ -152,11 +148,11 @@ func (ds *Shard) Node() (ipld.Node, error) { cindex := 0 // TODO: optimized 'for each set bit' for i := 0; i < ds.tableSize; i++ { - if !ds.bitfield.Bit(i) { + if !ds.childer.has(i) { continue } - ch := ds.children[cindex] + ch := ds.childer.child(cindex) if ch != nil { clnk, err := ch.Link() if err != nil { @@ -169,7 +165,7 @@ func (ds *Shard) Node() (ipld.Node, error) { } } else { // child unloaded, just copy in link with updated name - lnk := ds.links[cindex] + lnk := ds.childer.link(cindex) label := lnk.Name[ds.maxpadlen:] err := out.AddRawLink(ds.linkNamePrefix(i)+label, lnk) @@ -180,7 +176,7 @@ func (ds *Shard) Node() (ipld.Node, error) { cindex++ } - data, err := format.HAMTShardData(ds.bitfield.Bytes(), uint64(ds.tableSize), HashMurmur3) + data, err := format.HAMTShardData(ds.childer.bitfield.Bytes(), uint64(ds.tableSize), HashMurmur3) if err != nil { return nil, err } @@ -208,12 +204,6 @@ func (ds *Shard) makeShardValue(lnk *ipld.Link) (*Shard, error) { return s, nil } -func hash(val []byte) []byte { - h := murmur3.New128() - h.Write(val) - return h.Sum(make([]byte, 0, 128/8)) -} - // Set sets 'name' = nd in the HAMT func (ds *Shard) Set(ctx context.Context, name string, nd ipld.Node) error { hv := &hashBits{b: hash([]byte(name))} @@ -271,63 +261,6 @@ func (ds *Shard) childLinkType(lnk *ipld.Link) (linkType, error) { return shardValueLink, nil } -// getChild returns the i'th child of this shard. If it is cached in the -// children array, it will return it from there. Otherwise, it loads the child -// node from disk. -func (ds *Shard) getChild(ctx context.Context, i int) (*Shard, error) { - if i >= len(ds.children) || i < 0 { - return nil, fmt.Errorf("invalid index passed to getChild (likely corrupt bitfield)") - } - - if len(ds.children) != len(ds.links) { - return nil, fmt.Errorf("inconsistent lengths between children array and Links array") - } - - c := ds.children[i] - if c != nil { - return c, nil - } - - return ds.loadChild(ctx, i) -} - -// loadChild reads the i'th child node of this shard from disk and returns it -// as a 'child' interface -func (ds *Shard) loadChild(ctx context.Context, i int) (*Shard, error) { - lnk := ds.links[i] - lnkLinkType, err := ds.childLinkType(lnk) - if err != nil { - return nil, err - } - - var c *Shard - if lnkLinkType == shardLink { - nd, err := lnk.GetNode(ctx, ds.dserv) - if err != nil { - return nil, err - } - cds, err := NewHamtFromDag(ds.dserv, nd) - if err != nil { - return nil, err - } - - c = cds - } else { - s, err := ds.makeShardValue(lnk) - if err != nil { - return nil, err - } - c = s - } - - ds.children[i] = c - return c, nil -} - -func (ds *Shard) setChild(i int, c *Shard) { - ds.children[i] = c -} - // Link returns a merklelink to this shard node func (ds *Shard) Link() (*ipld.Link, error) { if ds.isValueNode() { @@ -347,48 +280,13 @@ func (ds *Shard) Link() (*ipld.Link, error) { return ipld.MakeLink(nd) } -func (ds *Shard) insertChild(idx int, key string, lnk *ipld.Link) error { - if lnk == nil { - return os.ErrNotExist - } - - i := ds.indexForBitPos(idx) - ds.bitfield.SetBit(idx) - - lnk.Name = ds.linkNamePrefix(idx) + key - sv := &Shard{ - key: key, - val: lnk, - } - - ds.children = append(ds.children[:i], append([]*Shard{sv}, ds.children[i:]...)...) - ds.links = append(ds.links[:i], append([]*ipld.Link{nil}, ds.links[i:]...)...) - return nil -} - -func (ds *Shard) rmChild(i int) error { - if i < 0 || i >= len(ds.children) || i >= len(ds.links) { - return fmt.Errorf("hamt: attempted to remove child with out of range index") - } - - copy(ds.children[i:], ds.children[i+1:]) - ds.children = ds.children[:len(ds.children)-1] - - copy(ds.links[i:], ds.links[i+1:]) - ds.links = ds.links[:len(ds.links)-1] - - return nil -} - func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*Shard) error) error { idx, err := hv.Next(ds.tableSizeLg2) if err != nil { return err } - if ds.bitfield.Bit(int(idx)) { - cindex := ds.indexForBitPos(idx) - - child, err := ds.getChild(ctx, cindex) + if ds.childer.has(idx) { + child, err := ds.childer.get(ctx, ds.childer.index(idx)) if err != nil { return err } @@ -440,7 +338,7 @@ func (ds *Shard) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { defer cancel() getLinks := makeAsyncTrieGetLinks(ds.dserv, linkResults) cset := cid.NewSet() - err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.nd.Cid(), cset.Visit) + err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.cid, cset.Visit) if err != nil { emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) } @@ -463,9 +361,9 @@ func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format return nil, err } - childShards := make([]*ipld.Link, 0, len(directoryShard.children)) - links := directoryShard.links - for idx := range directoryShard.children { + childShards := make([]*ipld.Link, 0, directoryShard.childer.length()) + links := directoryShard.childer.links + for idx := range directoryShard.childer.children { lnk := links[idx] lnkLinkType, err := directoryShard.childLinkType(lnk) @@ -505,23 +403,18 @@ func emitResult(ctx context.Context, linkResults chan<- format.LinkResult, r for } func (ds *Shard) walkTrie(ctx context.Context, cb func(*Shard) error) error { - for idx := range ds.children { - c, err := ds.getChild(ctx, idx) - if err != nil { - return err - } - - if c.isValueNode() { - if err := cb(c); err != nil { + return ds.childer.each(ctx, func(s *Shard) error { + if s.isValueNode() { + if err := cb(s); err != nil { return err } } else { - if err := c.walkTrie(ctx, cb); err != nil { + if err := s.walkTrie(ctx, cb); err != nil { return err } } - } - return nil + return nil + }) } func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val *ipld.Link) error { @@ -529,13 +422,14 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val if err != nil { return err } - if !ds.bitfield.Bit(idx) { - return ds.insertChild(idx, key, val) + + if !ds.childer.has(idx) { + return ds.childer.insert(key, val, idx) } - cindex := ds.indexForBitPos(idx) + i := ds.childer.index(idx) - child, err := ds.getChild(ctx, cindex) + child, err := ds.childer.get(ctx, i) if err != nil { return err } @@ -544,8 +438,7 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val if child.key == key { // value modification if val == nil { - ds.bitfield.UnsetBit(idx) - return ds.rmChild(cindex) + return ds.childer.rm(idx) } child.val = val @@ -577,7 +470,7 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val return err } - ds.setChild(cindex, ns) + ds.childer.set(ns, i) return nil } else { err := child.modifyValue(ctx, hv, key, val) @@ -586,19 +479,18 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val } if val == nil { - switch len(child.children) { + switch child.childer.length() { case 0: // empty sub-shard, prune it // Note: this shouldnt normally ever happen // in the event of another implementation creates flawed // structures, this will help to normalize them. - ds.bitfield.UnsetBit(idx) - return ds.rmChild(cindex) + return ds.childer.rm(idx) case 1: - nchild := child.children[0] + nchild := child.childer.children[0] if nchild.isValueNode() { // sub-shard with a single value element, collapse it - ds.setChild(cindex, nchild) + ds.childer.set(nchild, i) } return nil } @@ -608,14 +500,170 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val } } -// indexForBitPos returns the index within the collapsed array corresponding to -// the given bit in the bitset. The collapsed array contains only one entry -// per bit set in the bitfield, and this function is used to map the indices. -func (ds *Shard) indexForBitPos(bp int) int { - return ds.bitfield.OnesBefore(bp) -} - // linkNamePrefix takes in the bitfield index of an entry and returns its hex prefix func (ds *Shard) linkNamePrefix(idx int) string { return fmt.Sprintf(ds.prefixPadStr, idx) } + +// childer wraps the links, children and bitfield +// and provides basic operation (get, rm, insert and set) of manipulating children. +type childer struct { + sd *Shard + dserv ipld.DAGService + bitfield bitfield.Bitfield + links []*ipld.Link + children []*Shard +} + +func newChilder(ds ipld.DAGService, size int) *childer { + return &childer{ + dserv: ds, + bitfield: bitfield.NewBitfield(size), + } +} + +func (s *childer) makeChilder(data []byte, links []*ipld.Link) *childer { + s.children = make([]*Shard, len(links)) + s.bitfield.SetBytes(data) + if len(links) > 0 { + s.links = make([]*ipld.Link, len(links)) + copy(s.links, links) + } + + return s +} + +func (s *childer) index(idx int) int { + return s.bitfield.OnesBefore(idx) +} + +func (s *childer) child(i int) *Shard { + return s.children[i] +} + +func (s *childer) link(i int) *ipld.Link { + return s.links[i] +} + +func (s *childer) insert(key string, lnk *ipld.Link, idx int) error { + if lnk == nil { + return os.ErrNotExist + } + + lnk.Name = s.sd.linkNamePrefix(idx) + key + i := s.index(idx) + sd := &Shard{key: key, val: lnk} + + s.children = append(s.children[:i], append([]*Shard{sd}, s.children[i:]...)...) + s.links = append(s.links[:i], append([]*ipld.Link{nil}, s.links[i:]...)...) + s.bitfield.SetBit(idx) + + return nil +} + +func (s *childer) set(sd *Shard, i int) { + s.children[i] = sd +} + +func (s *childer) rm(idx int) error { + i := s.index(idx) + + if err := s.check(i); err != nil { + return err + } + + copy(s.children[i:], s.children[i+1:]) + s.children = s.children[:len(s.children)-1] + + copy(s.links[i:], s.links[i+1:]) + s.links = s.links[:len(s.links)-1] + + s.bitfield.UnsetBit(idx) + + return nil +} + +// get returns the i'th child of this shard. If it is cached in the +// children array, it will return it from there. Otherwise, it loads the child +// node from disk. +func (s *childer) get(ctx context.Context, i int) (*Shard, error) { + if err := s.check(i); err != nil { + return nil, err + } + + c := s.child(i) + if c != nil { + return c, nil + } + + return s.loadChild(ctx, i) +} + +// loadChild reads the i'th child node of this shard from disk and returns it +// as a 'child' interface +func (s *childer) loadChild(ctx context.Context, i int) (*Shard, error) { + lnk := s.link(i) + lnkLinkType, err := s.sd.childLinkType(lnk) + if err != nil { + return nil, err + } + + var c *Shard + if lnkLinkType == shardLink { + nd, err := lnk.GetNode(ctx, s.dserv) + if err != nil { + return nil, err + } + cds, err := NewHamtFromDag(s.dserv, nd) + if err != nil { + return nil, err + } + + c = cds + } else { + s, err := s.sd.makeShardValue(lnk) + if err != nil { + return nil, err + } + c = s + } + + s.set(c, i) + + return c, nil +} + +func (s *childer) has(idx int) bool { + return s.bitfield.Bit(idx) +} + +func (s *childer) length() int { + return len(s.children) +} + +func (s *childer) each(ctx context.Context, cb func(*Shard) error) error { + for i := range s.children { + c, err := s.get(ctx, i) + if err != nil { + return err + } + + if err := cb(c); err != nil { + return err + } + } + + return nil +} + +func (s *childer) check(i int) error { + if i >= len(s.children) || i < 0 { + return fmt.Errorf("invalid index passed to operate children (likely corrupt bitfield)") + } + + if len(s.children) != len(s.links) { + return fmt.Errorf("inconsistent lengths between children array and Links array") + } + + return nil +} diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 1483fcd9fd..65b79931eb 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -9,12 +9,10 @@ import ( "testing" "time" + ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" mdtest "github.com/ipfs/go-merkledag/test" - ft "github.com/ipfs/go-unixfs" - - ipld "github.com/ipfs/go-ipld-format" ) func shuffle(seed int64, arr []string) { @@ -488,11 +486,11 @@ func TestBitfieldIndexing(t *testing.T) { s, _ := NewShard(ds, 256) set := func(i int) { - s.bitfield.SetBit(i) + s.childer.bitfield.SetBit(i) } assert := func(i int, val int) { - if s.indexForBitPos(i) != val { + if s.childer.index(i) != val { t.Fatalf("expected index %d to be %d", i, val) } } diff --git a/unixfs/hamt/util.go b/unixfs/hamt/util.go index c2b33bc22f..7ae02dfb3f 100644 --- a/unixfs/hamt/util.go +++ b/unixfs/hamt/util.go @@ -2,6 +2,8 @@ package hamt import ( "fmt" + + "github.com/spaolacci/murmur3" "math/bits" ) @@ -58,3 +60,9 @@ func logtwo(v int) (int, error) { } return lg2, nil } + +func hash(val []byte) []byte { + h := murmur3.New64() + h.Write(val) + return h.Sum(nil) +} From f67b0fdc7ce2d99b89455cde3a80db0afed8275e Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Tue, 15 Jan 2019 15:00:32 -0300 Subject: [PATCH 2520/3147] hamt: rename to distinguish between child and slice indexes This commit was moved from ipfs/go-unixfs@0691474159bdefa862a6877f97a769ef8ee425da --- unixfs/hamt/hamt.go | 74 ++++++++++++++++++++++------------------ unixfs/hamt/hamt_test.go | 2 +- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 17e0315027..7947a2aa04 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -145,35 +145,35 @@ func (ds *Shard) Node() (ipld.Node, error) { out := new(dag.ProtoNode) out.SetCidBuilder(ds.builder) - cindex := 0 + sliceIndex := 0 // TODO: optimized 'for each set bit' - for i := 0; i < ds.tableSize; i++ { - if !ds.childer.has(i) { + for childIndex := 0; childIndex < ds.tableSize; childIndex++ { + if !ds.childer.has(childIndex) { continue } - ch := ds.childer.child(cindex) + ch := ds.childer.child(sliceIndex) if ch != nil { clnk, err := ch.Link() if err != nil { return nil, err } - err = out.AddRawLink(ds.linkNamePrefix(i)+ch.key, clnk) + err = out.AddRawLink(ds.linkNamePrefix(childIndex)+ch.key, clnk) if err != nil { return nil, err } } else { // child unloaded, just copy in link with updated name - lnk := ds.childer.link(cindex) + lnk := ds.childer.link(sliceIndex) label := lnk.Name[ds.maxpadlen:] - err := out.AddRawLink(ds.linkNamePrefix(i)+label, lnk) + err := out.AddRawLink(ds.linkNamePrefix(childIndex)+label, lnk) if err != nil { return nil, err } } - cindex++ + sliceIndex++ } data, err := format.HAMTShardData(ds.childer.bitfield.Bytes(), uint64(ds.tableSize), HashMurmur3) @@ -281,12 +281,13 @@ func (ds *Shard) Link() (*ipld.Link, error) { } func (ds *Shard) getValue(ctx context.Context, hv *hashBits, key string, cb func(*Shard) error) error { - idx, err := hv.Next(ds.tableSizeLg2) + childIndex, err := hv.Next(ds.tableSizeLg2) if err != nil { return err } - if ds.childer.has(idx) { - child, err := ds.childer.get(ctx, ds.childer.index(idx)) + + if ds.childer.has(childIndex) { + child, err := ds.childer.get(ctx, ds.childer.sliceIndex(childIndex)) if err != nil { return err } @@ -427,7 +428,7 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val return ds.childer.insert(key, val, idx) } - i := ds.childer.index(idx) + i := ds.childer.sliceIndex(idx) child, err := ds.childer.get(ctx, i) if err != nil { @@ -507,6 +508,10 @@ func (ds *Shard) linkNamePrefix(idx int) string { // childer wraps the links, children and bitfield // and provides basic operation (get, rm, insert and set) of manipulating children. +// The slices `links` and `children` are always coordinated to have the entries +// in the same index. A `childIndex` belonging to one of the original `Shard.size` +// entries corresponds to a `sliceIndex` in `links` and `children` (the conversion +// is done through `bitfield`). type childer struct { sd *Shard dserv ipld.DAGService @@ -533,16 +538,17 @@ func (s *childer) makeChilder(data []byte, links []*ipld.Link) *childer { return s } -func (s *childer) index(idx int) int { - return s.bitfield.OnesBefore(idx) +// Return the `sliceIndex` associated with a child. +func (s *childer) sliceIndex(childIndex int) (sliceIndex int) { + return s.bitfield.OnesBefore(childIndex) } -func (s *childer) child(i int) *Shard { - return s.children[i] +func (s *childer) child(sliceIndex int) *Shard { + return s.children[sliceIndex] } -func (s *childer) link(i int) *ipld.Link { - return s.links[i] +func (s *childer) link(sliceIndex int) *ipld.Link { + return s.links[sliceIndex] } func (s *childer) insert(key string, lnk *ipld.Link, idx int) error { @@ -551,11 +557,13 @@ func (s *childer) insert(key string, lnk *ipld.Link, idx int) error { } lnk.Name = s.sd.linkNamePrefix(idx) + key - i := s.index(idx) + i := s.sliceIndex(idx) sd := &Shard{key: key, val: lnk} s.children = append(s.children[:i], append([]*Shard{sd}, s.children[i:]...)...) s.links = append(s.links[:i], append([]*ipld.Link{nil}, s.links[i:]...)...) + // Add a `nil` placeholder in `links` so the rest of the entries keep the same + // index as `children`. s.bitfield.SetBit(idx) return nil @@ -565,8 +573,8 @@ func (s *childer) set(sd *Shard, i int) { s.children[i] = sd } -func (s *childer) rm(idx int) error { - i := s.index(idx) +func (s *childer) rm(childIndex int) error { + i := s.sliceIndex(childIndex) if err := s.check(i); err != nil { return err @@ -578,7 +586,7 @@ func (s *childer) rm(idx int) error { copy(s.links[i:], s.links[i+1:]) s.links = s.links[:len(s.links)-1] - s.bitfield.UnsetBit(idx) + s.bitfield.UnsetBit(childIndex) return nil } @@ -586,23 +594,23 @@ func (s *childer) rm(idx int) error { // get returns the i'th child of this shard. If it is cached in the // children array, it will return it from there. Otherwise, it loads the child // node from disk. -func (s *childer) get(ctx context.Context, i int) (*Shard, error) { - if err := s.check(i); err != nil { +func (s *childer) get(ctx context.Context, sliceIndex int) (*Shard, error) { + if err := s.check(sliceIndex); err != nil { return nil, err } - c := s.child(i) + c := s.child(sliceIndex) if c != nil { return c, nil } - return s.loadChild(ctx, i) + return s.loadChild(ctx, sliceIndex) } // loadChild reads the i'th child node of this shard from disk and returns it // as a 'child' interface -func (s *childer) loadChild(ctx context.Context, i int) (*Shard, error) { - lnk := s.link(i) +func (s *childer) loadChild(ctx context.Context, sliceIndex int) (*Shard, error) { + lnk := s.link(sliceIndex) lnkLinkType, err := s.sd.childLinkType(lnk) if err != nil { return nil, err @@ -628,13 +636,13 @@ func (s *childer) loadChild(ctx context.Context, i int) (*Shard, error) { c = s } - s.set(c, i) + s.set(c, sliceIndex) return c, nil } -func (s *childer) has(idx int) bool { - return s.bitfield.Bit(idx) +func (s *childer) has(childIndex int) bool { + return s.bitfield.Bit(childIndex) } func (s *childer) length() int { @@ -656,8 +664,8 @@ func (s *childer) each(ctx context.Context, cb func(*Shard) error) error { return nil } -func (s *childer) check(i int) error { - if i >= len(s.children) || i < 0 { +func (s *childer) check(sliceIndex int) error { + if sliceIndex >= len(s.children) || sliceIndex < 0 { return fmt.Errorf("invalid index passed to operate children (likely corrupt bitfield)") } diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 65b79931eb..4025bfb378 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -490,7 +490,7 @@ func TestBitfieldIndexing(t *testing.T) { } assert := func(i int, val int) { - if s.childer.index(i) != val { + if s.childer.sliceIndex(i) != val { t.Fatalf("expected index %d to be %d", i, val) } } From 06e2cf72f2cda060ddb4e60d078e193a65d02177 Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Thu, 16 Aug 2018 16:20:04 +0800 Subject: [PATCH 2521/3147] dag: add fsNodeType in NewLeafNode and NewLeafDataNode NewLeafNode and NewLeafDataNode is introduced in commit 474b77a2bdb1c ("importer: remove `UnixfsNode` from the balanced builder"). It is intended to return ipfs.Node instead of UnixfsNode. But it only support creating the TFile leaf node for merkledag. This commit add fsNodeType to above two functions and update the code in dagbuild.go. Further patches of trickledag will make use of them and pass TRaw to create leaf node. License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@c7228b92ac2c00f80ee35c1a21ef2227ad353a87 --- unixfs/importer/balanced/builder.go | 6 +++--- unixfs/importer/helpers/dagbuilder.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/unixfs/importer/balanced/builder.go b/unixfs/importer/balanced/builder.go index c1a3e86404..760ab320ea 100644 --- a/unixfs/importer/balanced/builder.go +++ b/unixfs/importer/balanced/builder.go @@ -123,7 +123,7 @@ import ( func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { if db.Done() { // No data, return just an empty node. - root, err := db.NewLeafNode(nil) + root, err := db.NewLeafNode(nil, ft.TFile) if err != nil { return nil, err } @@ -137,7 +137,7 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { // (corner case), after that subsequent `root` nodes will // always be internal nodes (with a depth > 0) that can // be handled by the loop. - root, fileSize, err := db.NewLeafDataNode() + root, fileSize, err := db.NewLeafDataNode(ft.TFile) if err != nil { return nil, err } @@ -224,7 +224,7 @@ func fillNodeRec(db *h.DagBuilderHelper, node *h.FSNodeOverDag, depth int) (fill if depth == 1 { // Base case: add leaf node with data. - childNode, childFileSize, err = db.NewLeafDataNode() + childNode, childFileSize, err = db.NewLeafDataNode(ft.TFile) if err != nil { return nil, 0, err } diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 24896cd1b3..85c8b70aa5 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -186,7 +186,7 @@ func (db *DagBuilderHelper) NewLeaf(data []byte) (*UnixfsNode, error) { // NewLeafNode is a variation from `NewLeaf` (see its description) that // returns an `ipld.Node` instead. -func (db *DagBuilderHelper) NewLeafNode(data []byte) (ipld.Node, error) { +func (db *DagBuilderHelper) NewLeafNode(data []byte, fsNodeType pb.Data_DataType) (ipld.Node, error) { if len(data) > BlockSizeLimit { return nil, ErrSizeLimitExceeded } @@ -204,7 +204,7 @@ func (db *DagBuilderHelper) NewLeafNode(data []byte) (ipld.Node, error) { } // Encapsulate the data in UnixFS node (instead of a raw node). - fsNodeOverDag := db.NewFSNodeOverDag(ft.TFile) + fsNodeOverDag := db.NewFSNodeOverDag(fsNodeType) fsNodeOverDag.SetFileData(data) node, err := fsNodeOverDag.Commit() if err != nil { @@ -273,7 +273,7 @@ func (db *DagBuilderHelper) GetNextDataNode() (*UnixfsNode, error) { // used to keep track of the DAG file size). The size of the data is // computed here because after that it will be hidden by `NewLeafNode` // inside a generic `ipld.Node` representation. -func (db *DagBuilderHelper) NewLeafDataNode() (node ipld.Node, dataSize uint64, err error) { +func (db *DagBuilderHelper) NewLeafDataNode(fsNodeType pb.Data_DataType) (node ipld.Node, dataSize uint64, err error) { fileData, err := db.Next() if err != nil { return nil, 0, err @@ -281,7 +281,7 @@ func (db *DagBuilderHelper) NewLeafDataNode() (node ipld.Node, dataSize uint64, dataSize = uint64(len(fileData)) // Create a new leaf node containing the file chunk data. - node, err = db.NewLeafNode(fileData) + node, err = db.NewLeafNode(fileData, fsNodeType) if err != nil { return nil, 0, err } From 1edc96a53c398ad7268b934fa2ac52b17cf75eb9 Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Thu, 16 Aug 2018 16:20:16 +0800 Subject: [PATCH 2522/3147] Docs: update balanced builder document After fsNodeType in NewLeafNode is supported by commit 85897b3f89301 ("dag: add fsNodeType in NewLeafNode and NewLeafDataNode"). Move comments in NewLeafNode to importer/balanced/builder.go to clarify why TFile is used by balanced builder as leaves. License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@b56bc9553d3d071808826534c60556156437e866 --- unixfs/importer/balanced/builder.go | 9 +++++++++ unixfs/importer/helpers/dagbuilder.go | 5 ----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/unixfs/importer/balanced/builder.go b/unixfs/importer/balanced/builder.go index 760ab320ea..407117dad1 100644 --- a/unixfs/importer/balanced/builder.go +++ b/unixfs/importer/balanced/builder.go @@ -16,6 +16,15 @@ // mentioned. This is the only scenario where the root can be of a type different // that the UnixFS node. // +// Notes: +// 1. In the implementation. `FSNodeOverDag` structure is used for representing +// the UnixFS node encoded inside the DAG node. +// (see https://github.com/ipfs/go-ipfs/pull/5118.) +// 2. `TFile` is used for backwards-compatibility. It was a bug causing the leaf +// nodes to be generated with this type instead of `TRaw`. The former one +// should be used (like the trickle builder does). +// (See https://github.com/ipfs/go-ipfs/pull/5120.) +// // +-------------+ // | Root 4 | // +-------------+ diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 85c8b70aa5..be381dc046 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -213,11 +213,6 @@ func (db *DagBuilderHelper) NewLeafNode(data []byte, fsNodeType pb.Data_DataType // TODO: Encapsulate this sequence of calls into a function that // just returns the final `ipld.Node` avoiding going through // `FSNodeOverDag`. - // TODO: Using `TFile` for backwards-compatibility, a bug in the - // balanced builder was causing the leaf nodes to be generated - // with this type instead of `TRaw`, the one that should be used - // (like the trickle builder does). - // (See https://github.com/ipfs/go-ipfs/pull/5120.) return node, nil } From ce96228b9fc547c7b4a54d1c4f39ae3c1b779e3c Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Thu, 16 Aug 2018 16:23:45 +0800 Subject: [PATCH 2523/3147] dag: remove `UnixfsNode` in Layout of trickledag This patch is the part of trickledag work which is similar to the merkledag work in commit 474b77a2bdb1c ("importer: remove `UnixfsNode` from the balanced builder"). Two helper functions(fillTrickleRecFSNode and FillFSNodeLayer) is introduced temporarily for modifing the Layout functions. These two funtions will be removed when all the code of UnixfsNode is removed in trickledag.go. Test ipfs add and get commands to check whether get the same hash of file after the code changes. License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@6aa0d7fdd4182374137c8f31cf0b609e458f93aa --- unixfs/importer/helpers/dagbuilder.go | 19 +++++++++++ unixfs/importer/trickle/trickledag.go | 48 +++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index be381dc046..e68f71f7b8 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -246,6 +246,25 @@ func (db *DagBuilderHelper) FillNodeLayer(node *UnixfsNode) error { return nil } +// FillFSNodeLayer do the same thing as FillNodeLayer. +func (db *DagBuilderHelper) FillFSNodeLayer(node *FSNodeOverDag) error { + + // while we have room AND we're not done + for node.NumChildren() < db.maxlinks && !db.Done() { + child, childFileSize, err := db.NewLeafDataNode(ft.TRaw) + if err != nil { + return err + } + + if err := node.AddChild(child, childFileSize, db); err != nil { + return err + } + } + node.Commit() + + return nil +} + // GetNextDataNode builds a UnixFsNode with the data obtained from the // Splitter, given the constraints (BlockSizeLimit, RawLeaves) specified // when creating the DagBuilderHelper. diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 70a953825c..626044887d 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -37,12 +37,13 @@ const layerRepeat = 4 // DagBuilderHelper. See the module's description for a more detailed // explanation. func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { - root := db.NewUnixfsNode() - if err := fillTrickleRec(db, root, -1); err != nil { + newRoot := db.NewFSNodeOverDag(ft.TFile) + root, _, err := fillTrickleRecFSNode(db, newRoot, -1) + if err != nil { return nil, err } - return db.AddUnixfsNode(root) + return root, db.Add(root) } // fillTrickleRec creates a trickle (sub-)tree with an optional maximum specified depth @@ -76,6 +77,47 @@ func fillTrickleRec(db *h.DagBuilderHelper, node *h.UnixfsNode, maxDepth int) er } } +// fillTrickleRecFSNode creates a trickle (sub-)tree with an optional maximum specified depth +// in the case maxDepth is greater than zero, or with unlimited depth otherwise +// (where the DAG builder will signal the end of data to end the function). +func fillTrickleRecFSNode(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDepth int) (filledNode ipld.Node, nodeFileSize uint64, err error) { + // Always do this, even in the base case + if err := db.FillFSNodeLayer(node); err != nil { + return nil, 0, err + } + + for depth := 1; ; depth++ { + // Apply depth limit only if the parameter is set (> 0). + if db.Done() || (maxDepth > 0 && depth == maxDepth) { + break + } + for layer := 0; layer < layerRepeat; layer++ { + if db.Done() { + break + } + + nextChild := db.NewFSNodeOverDag(ft.TFile) + childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, depth) + if err != nil { + return nil, 0, err + } + + if err := node.AddChild(childNode, childFileSize, db); err != nil { + return nil, 0, err + } + } + } + nodeFileSize = node.FileSize() + + // Get the final `dag.ProtoNode` with the `FSNode` data encoded inside. + filledNode, err = node.Commit() + if err != nil { + return nil, 0, err + } + + return filledNode, nodeFileSize, nil +} + // Append appends the data in `db` to the dag, using the Trickledag format func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out ipld.Node, errOut error) { base, ok := basen.(*dag.ProtoNode) From b23a60a11ffa64c5d01c096ee29aed86af421a51 Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Mon, 12 Nov 2018 19:33:03 +0800 Subject: [PATCH 2524/3147] Trickle: add new functions for FSNodeOverDag Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@bb3e55c6f23f5f4501a23bd1f05357ca4c2d84d9 --- unixfs/importer/helpers/dagbuilder.go | 39 +++++++++++++++++++++++++++ unixfs/importer/trickle/trickledag.go | 9 +++++++ 2 files changed, 48 insertions(+) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index e68f71f7b8..cb77d07f59 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -402,6 +402,24 @@ func (db *DagBuilderHelper) NewFSNodeOverDag(fsNodeType pb.Data_DataType) *FSNod return node } +// NewFSNFromDag reconstructs a FSNodeOverDag node from a given dag node +func (db *DagBuilderHelper) NewFSNFromDag(nd *dag.ProtoNode) (*FSNodeOverDag, error) { + return NewFSNFromDag(nd) +} + +// NewFSNFromDag reconstructs a FSNodeOverDag node from a given dag node +func NewFSNFromDag(nd *dag.ProtoNode) (*FSNodeOverDag, error) { + mb, err := ft.FSNodeFromBytes(nd.Data()) + if err != nil { + return nil, err + } + + return &FSNodeOverDag{ + dag: nd, + file: mb, + }, nil +} + // AddChild adds a `child` `ipld.Node` to both node layers. The // `dag.ProtoNode` creates a link to the child node while the // `ft.FSNode` stores its file size (that is, not the size of the @@ -450,3 +468,24 @@ func (n *FSNodeOverDag) FileSize() uint64 { func (n *FSNodeOverDag) SetFileData(fileData []byte) { n.file.SetData(fileData) } + +// GetDagNode fills out the proper formatting for the FSNodeOverDag node +// inside of a DAG node and returns the dag node. +func (n *FSNodeOverDag) GetDagNode() (ipld.Node, error) { + return n.dag, nil +} + +// GetChild gets the ith child of this node from the given DAGService. +func (n *FSNodeOverDag) GetChild(ctx context.Context, i int, ds ipld.DAGService) (*FSNodeOverDag, error) { + nd, err := n.dag.Links()[i].GetNode(ctx, ds) + if err != nil { + return nil, err + } + + pbn, ok := nd.(*dag.ProtoNode) + if !ok { + return nil, dag.ErrNotProtobuf + } + + return NewFSNFromDag(pbn) +} diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 626044887d..8eb81ad746 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -277,6 +277,15 @@ func trickleDepthInfo(node *h.UnixfsNode, maxlinks int) (int, int) { return ((n - maxlinks) / layerRepeat) + 1, (n - maxlinks) % layerRepeat } +func trickleDepthInfoFSNode(node *h.FSNodeOverDag, maxlinks int) (int, int) { + n := node.NumChildren() + if n < maxlinks { + return 0, 0 + } + + return ((n - maxlinks) / layerRepeat) + 1, (n - maxlinks) % layerRepeat +} + // VerifyParams is used by VerifyTrickleDagStructure type VerifyParams struct { Getter ipld.NodeGetter From 94374fa931e90b9d8be307c5a61a3a5c2bbbda10 Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Sat, 8 Dec 2018 18:29:22 +0800 Subject: [PATCH 2525/3147] dag: remove `UnixfsNode` in Append of trickledag License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@a1e4554728693e2e2cea0fcb044ced46a3c251cf --- unixfs/importer/helpers/dagbuilder.go | 6 ++ unixfs/importer/trickle/trickledag.go | 82 ++++++++++++++------------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index cb77d07f59..583fb162df 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -436,6 +436,12 @@ func (n *FSNodeOverDag) AddChild(child ipld.Node, fileSize uint64, db *DagBuilde return db.Add(child) } +// RemoveChild deletes the child node at the given index. +func (n *FSNodeOverDag) RemoveChild(index int, dbh *DagBuilderHelper) { + n.file.RemoveBlockSize(index) + n.dag.SetLinks(append(n.dag.Links()[:index], n.dag.Links()[index+1:]...)) +} + // Commit unifies (resolves) the cache nodes into a single `ipld.Node` // that represents them: the `ft.FSNode` is encoded inside the // `dag.ProtoNode`. diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 8eb81ad746..840fe0e8b9 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -126,21 +126,22 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i } // Convert to unixfs node for working with easily - ufsn, err := h.NewUnixfsNodeFromDag(base) + + fsn, err := h.NewFSNFromDag(base) if err != nil { return nil, err } // Get depth of this 'tree' - n, layerProgress := trickleDepthInfo(ufsn, db.Maxlinks()) + n, layerProgress := trickleDepthInfoFSNode(fsn, db.Maxlinks()) if n == 0 { // If direct blocks not filled... - if err := db.FillNodeLayer(ufsn); err != nil { + if err := db.FillFSNodeLayer(fsn); err != nil { return nil, err } if db.Done() { - return ufsn.GetDagNode() + return fsn.GetDagNode() } // If continuing, our depth has increased by one @@ -148,7 +149,7 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i } // Last child in this node may not be a full tree, lets file it up - if err := appendFillLastChild(ctx, ufsn, n-1, layerProgress, db); err != nil { + if err := appendFillLastChild(ctx, fsn, n-1, layerProgress, db); err != nil { return nil, err } @@ -160,44 +161,48 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i // Now, continue filling out tree like normal for i := n; !db.Done(); i++ { for j := 0; j < layerRepeat && !db.Done(); j++ { - next := db.NewUnixfsNode() - err := fillTrickleRec(db, next, i) + nextChild := db.NewFSNodeOverDag(ft.TFile) + childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, i) if err != nil { return nil, err } - - err = ufsn.AddChild(next, db) + err = fsn.AddChild(childNode, childFileSize, db) if err != nil { return nil, err } } } - - return ufsn.GetDagNode() + _, err = fsn.Commit() + if err != nil { + return nil, err + } + return fsn.GetDagNode() } -// appendFillLastChild will take in an incomplete trickledag node (uncomplete meaning, not full) and -// fill it out to the specified depth with blocks from the given DagBuilderHelper -func appendFillLastChild(ctx context.Context, ufsn *h.UnixfsNode, depth int, layerFill int, db *h.DagBuilderHelper) error { - if ufsn.NumChildren() <= db.Maxlinks() { +func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, layerFill int, db *h.DagBuilderHelper) error { + if fsn.NumChildren() <= db.Maxlinks() { return nil } // Recursive step, grab last child - last := ufsn.NumChildren() - 1 - lastChild, err := ufsn.GetChild(ctx, last, db.GetDagServ()) + last := fsn.NumChildren() - 1 + lastChild, err := fsn.GetChild(ctx, last, db.GetDagServ()) if err != nil { return err } // Fill out last child (may not be full tree) - nchild, err := appendRec(ctx, lastChild, db, depth-1) + nchild, nchildSize, err := appendRec(ctx, lastChild, db, depth-1) if err != nil { return err } // Update changed child in parent node - ufsn.RemoveChild(last, db) - err = ufsn.AddChild(nchild, db) + fsn.RemoveChild(last, db) + filledNode, err := nchild.Commit() + if err != nil { + return err + } + err = fsn.AddChild(filledNode, nchildSize, db) if err != nil { return err } @@ -205,14 +210,13 @@ func appendFillLastChild(ctx context.Context, ufsn *h.UnixfsNode, depth int, lay // Partially filled depth layer if layerFill != 0 { for ; layerFill < layerRepeat && !db.Done(); layerFill++ { - next := db.NewUnixfsNode() - err := fillTrickleRec(db, next, depth) + nextChild := db.NewFSNodeOverDag(ft.TFile) + childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, depth) if err != nil { return err } - err = ufsn.AddChild(next, db) - if err != nil { + if err := fsn.AddChild(childNode, childFileSize, db); err != nil { return err } } @@ -222,28 +226,28 @@ func appendFillLastChild(ctx context.Context, ufsn *h.UnixfsNode, depth int, lay } // recursive call for Append -func appendRec(ctx context.Context, ufsn *h.UnixfsNode, db *h.DagBuilderHelper, depth int) (*h.UnixfsNode, error) { +func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper, depth int) (*h.FSNodeOverDag, uint64, error) { if depth == 0 || db.Done() { - return ufsn, nil + return fsn, fsn.FileSize(), nil } // Get depth of this 'tree' - n, layerProgress := trickleDepthInfo(ufsn, db.Maxlinks()) + n, layerProgress := trickleDepthInfoFSNode(fsn, db.Maxlinks()) if n == 0 { // If direct blocks not filled... - if err := db.FillNodeLayer(ufsn); err != nil { - return nil, err + if err := db.FillFSNodeLayer(fsn); err != nil { + return nil, 0, err } n++ } // If at correct depth, no need to continue if n == depth { - return ufsn, nil + return fsn, fsn.FileSize(), nil } - if err := appendFillLastChild(ctx, ufsn, n, layerProgress, db); err != nil { - return nil, err + if err := appendFillLastChild(ctx, fsn, n, layerProgress, db); err != nil { + return nil, 0, err } // after appendFillLastChild, our depth is now increased by one @@ -254,20 +258,20 @@ func appendRec(ctx context.Context, ufsn *h.UnixfsNode, db *h.DagBuilderHelper, // Now, continue filling out tree like normal for i := n; i < depth && !db.Done(); i++ { for j := 0; j < layerRepeat && !db.Done(); j++ { - next := db.NewUnixfsNode() - if err := fillTrickleRec(db, next, i); err != nil { - return nil, err + nextChild := db.NewFSNodeOverDag(ft.TFile) + childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, i) + if err != nil { + return nil, 0, err } - if err := ufsn.AddChild(next, db); err != nil { - return nil, err + if err := fsn.AddChild(childNode, childFileSize, db); err != nil { + return nil, 0, err } } } - return ufsn, nil + return fsn, fsn.FileSize(), nil } - func trickleDepthInfo(node *h.UnixfsNode, maxlinks int) (int, int) { n := node.NumChildren() if n < maxlinks { From d45000d65a121cd11dd5cbaed1d768334691b255 Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Tue, 25 Dec 2018 15:05:57 +0800 Subject: [PATCH 2526/3147] dag: remove fillTrickleRec License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@c2ac0aa23df9b09ef2b4d225380b863824b929c8 --- unixfs/importer/trickle/trickledag.go | 43 ++++----------------------- 1 file changed, 6 insertions(+), 37 deletions(-) diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 840fe0e8b9..538ff889c0 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -38,7 +38,7 @@ const layerRepeat = 4 // explanation. func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { newRoot := db.NewFSNodeOverDag(ft.TFile) - root, _, err := fillTrickleRecFSNode(db, newRoot, -1) + root, _, err := fillTrickleRec(db, newRoot, -1) if err != nil { return nil, err } @@ -49,38 +49,7 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { // fillTrickleRec creates a trickle (sub-)tree with an optional maximum specified depth // in the case maxDepth is greater than zero, or with unlimited depth otherwise // (where the DAG builder will signal the end of data to end the function). -func fillTrickleRec(db *h.DagBuilderHelper, node *h.UnixfsNode, maxDepth int) error { - // Always do this, even in the base case - if err := db.FillNodeLayer(node); err != nil { - return err - } - - for depth := 1; ; depth++ { - // Apply depth limit only if the parameter is set (> 0). - if maxDepth > 0 && depth == maxDepth { - return nil - } - for layer := 0; layer < layerRepeat; layer++ { - if db.Done() { - return nil - } - - nextChild := db.NewUnixfsNode() - if err := fillTrickleRec(db, nextChild, depth); err != nil { - return err - } - - if err := node.AddChild(nextChild, db); err != nil { - return err - } - } - } -} - -// fillTrickleRecFSNode creates a trickle (sub-)tree with an optional maximum specified depth -// in the case maxDepth is greater than zero, or with unlimited depth otherwise -// (where the DAG builder will signal the end of data to end the function). -func fillTrickleRecFSNode(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDepth int) (filledNode ipld.Node, nodeFileSize uint64, err error) { +func fillTrickleRec(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDepth int) (filledNode ipld.Node, nodeFileSize uint64, err error) { // Always do this, even in the base case if err := db.FillFSNodeLayer(node); err != nil { return nil, 0, err @@ -97,7 +66,7 @@ func fillTrickleRecFSNode(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDept } nextChild := db.NewFSNodeOverDag(ft.TFile) - childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, depth) + childNode, childFileSize, err := fillTrickleRec(db, nextChild, depth) if err != nil { return nil, 0, err } @@ -162,7 +131,7 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i for i := n; !db.Done(); i++ { for j := 0; j < layerRepeat && !db.Done(); j++ { nextChild := db.NewFSNodeOverDag(ft.TFile) - childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, i) + childNode, childFileSize, err := fillTrickleRec(db, nextChild, i) if err != nil { return nil, err } @@ -211,7 +180,7 @@ func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, l if layerFill != 0 { for ; layerFill < layerRepeat && !db.Done(); layerFill++ { nextChild := db.NewFSNodeOverDag(ft.TFile) - childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, depth) + childNode, childFileSize, err := fillTrickleRec(db, nextChild, depth) if err != nil { return err } @@ -259,7 +228,7 @@ func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper for i := n; i < depth && !db.Done(); i++ { for j := 0; j < layerRepeat && !db.Done(); j++ { nextChild := db.NewFSNodeOverDag(ft.TFile) - childNode, childFileSize, err := fillTrickleRecFSNode(db, nextChild, i) + childNode, childFileSize, err := fillTrickleRec(db, nextChild, i) if err != nil { return nil, 0, err } From 3ba76e6f81c4c24fdf5161ebfaa52ddc9ff8adb8 Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Tue, 25 Dec 2018 15:12:33 +0800 Subject: [PATCH 2527/3147] dag: remove trickleDepthInfo License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@032dcd44067124c84c11a8fd1150b9dc9ecba0c3 --- unixfs/importer/trickle/trickledag.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 538ff889c0..85dcbd9c1b 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -102,7 +102,7 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i } // Get depth of this 'tree' - n, layerProgress := trickleDepthInfoFSNode(fsn, db.Maxlinks()) + n, layerProgress := trickleDepthInfo(fsn, db.Maxlinks()) if n == 0 { // If direct blocks not filled... if err := db.FillFSNodeLayer(fsn); err != nil { @@ -201,7 +201,7 @@ func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper } // Get depth of this 'tree' - n, layerProgress := trickleDepthInfoFSNode(fsn, db.Maxlinks()) + n, layerProgress := trickleDepthInfo(fsn, db.Maxlinks()) if n == 0 { // If direct blocks not filled... if err := db.FillFSNodeLayer(fsn); err != nil { @@ -241,16 +241,8 @@ func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper return fsn, fsn.FileSize(), nil } -func trickleDepthInfo(node *h.UnixfsNode, maxlinks int) (int, int) { - n := node.NumChildren() - if n < maxlinks { - return 0, 0 - } - - return ((n - maxlinks) / layerRepeat) + 1, (n - maxlinks) % layerRepeat -} -func trickleDepthInfoFSNode(node *h.FSNodeOverDag, maxlinks int) (int, int) { +func trickleDepthInfo(node *h.FSNodeOverDag, maxlinks int) (int, int) { n := node.NumChildren() if n < maxlinks { return 0, 0 From bf16decbe43918df20a67d81b9ceb53b4c37fcee Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Wed, 26 Dec 2018 11:05:03 +0800 Subject: [PATCH 2528/3147] dag: remove the old FillNodeLayer License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@183a92b6055d46604946286bb308d998de1b4562 --- unixfs/importer/helpers/dagbuilder.go | 22 ++-------------------- unixfs/importer/trickle/trickledag.go | 6 +++--- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 583fb162df..5c5e7536ac 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -228,26 +228,8 @@ func (db *DagBuilderHelper) newUnixfsBlock() *UnixfsNode { } // FillNodeLayer will add datanodes as children to the give node until -// at most db.indirSize nodes are added. -func (db *DagBuilderHelper) FillNodeLayer(node *UnixfsNode) error { - - // while we have room AND we're not done - for node.NumChildren() < db.maxlinks && !db.Done() { - child, err := db.GetNextDataNode() - if err != nil { - return err - } - - if err := node.AddChild(child, db); err != nil { - return err - } - } - - return nil -} - -// FillFSNodeLayer do the same thing as FillNodeLayer. -func (db *DagBuilderHelper) FillFSNodeLayer(node *FSNodeOverDag) error { +// it is full in this layer or no more data. +func (db *DagBuilderHelper) FillNodeLayer(node *FSNodeOverDag) error { // while we have room AND we're not done for node.NumChildren() < db.maxlinks && !db.Done() { diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index 85dcbd9c1b..f798c0eab7 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -51,7 +51,7 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { // (where the DAG builder will signal the end of data to end the function). func fillTrickleRec(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDepth int) (filledNode ipld.Node, nodeFileSize uint64, err error) { // Always do this, even in the base case - if err := db.FillFSNodeLayer(node); err != nil { + if err := db.FillNodeLayer(node); err != nil { return nil, 0, err } @@ -105,7 +105,7 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i n, layerProgress := trickleDepthInfo(fsn, db.Maxlinks()) if n == 0 { // If direct blocks not filled... - if err := db.FillFSNodeLayer(fsn); err != nil { + if err := db.FillNodeLayer(fsn); err != nil { return nil, err } @@ -204,7 +204,7 @@ func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper n, layerProgress := trickleDepthInfo(fsn, db.Maxlinks()) if n == 0 { // If direct blocks not filled... - if err := db.FillFSNodeLayer(fsn); err != nil { + if err := db.FillNodeLayer(fsn); err != nil { return nil, 0, err } n++ From c3a67909bfcff15b5a9e6826e3d0af6cbe7a809c Mon Sep 17 00:00:00 2001 From: Bamvor Zhang Date: Wed, 26 Dec 2018 11:12:59 +0800 Subject: [PATCH 2529/3147] dag: Remove UnixfsNode Notes of removing UnixfsNode: - `NewLeafNode` will return the `FSNodeOverDag` with the given `fsNodeType`. While the old `NewLeaf`: `if data is nil the type field will be TRaw (for backwards compatibility), if data is defined (but possibly empty) the type field will be TRaw.`. Not sure if I should follow this. And because of this, I keep the `NewLeafNode` and `NewLeafDataNode`, not rename them to `NewLeaf` and `GetNextDataNode`. - There is no functions in importer/helpers/helpers.go. I am thinking if I should move the `FSNodeOverDag` part of importer/helpers/dagbuilder.go into importer/helpers/helpers.go. - `GetDagNode` return FilestoreNode for RawNode. But I do not understand how it is used in the `DagBuilderHelper.AddChild`. And `FileSize` do not calculate the size of RawNode because there is no flag of Raw in `FSNodeOverDag`. License: MIT Signed-off-by: Bamvor Zhang This commit was moved from ipfs/go-unixfs@c8ae0ec6aa32691397bc0ec68ccce1730d98bd5a --- unixfs/importer/helpers/dagbuilder.go | 104 ++----------------- unixfs/importer/helpers/helpers.go | 144 -------------------------- 2 files changed, 10 insertions(+), 238 deletions(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 5c5e7536ac..ad390d1f5a 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -134,58 +134,14 @@ func (db *DagBuilderHelper) GetDagServ() ipld.DAGService { return db.dserv } -// NewUnixfsNode creates a new Unixfs node to represent a file. -func (db *DagBuilderHelper) NewUnixfsNode() *UnixfsNode { - n := &UnixfsNode{ - node: new(dag.ProtoNode), - ufmt: ft.NewFSNode(ft.TFile), - } - n.SetCidBuilder(db.cidBuilder) - return n -} - // GetCidBuilder returns the internal `cid.CidBuilder` set in the builder. func (db *DagBuilderHelper) GetCidBuilder() cid.Builder { return db.cidBuilder } -// NewLeaf creates a leaf node filled with data. If rawLeaves is -// defined than a raw leaf will be returned. Otherwise, if data is -// nil the type field will be TRaw (for backwards compatibility), if -// data is defined (but possibly empty) the type field will be TRaw. -func (db *DagBuilderHelper) NewLeaf(data []byte) (*UnixfsNode, error) { - if len(data) > BlockSizeLimit { - return nil, ErrSizeLimitExceeded - } - - if db.rawLeaves { - if db.cidBuilder == nil { - return &UnixfsNode{ - rawnode: dag.NewRawNode(data), - raw: true, - }, nil - } - rawnode, err := dag.NewRawNodeWPrefix(data, db.cidBuilder) - if err != nil { - return nil, err - } - return &UnixfsNode{ - rawnode: rawnode, - raw: true, - }, nil - } - - if data == nil { - return db.NewUnixfsNode(), nil - } - - blk := db.newUnixfsBlock() - blk.SetData(data) - return blk, nil -} - -// NewLeafNode is a variation from `NewLeaf` (see its description) that -// returns an `ipld.Node` instead. +// NewLeafNode creates a leaf node filled with data. If rawLeaves is +// defined then a raw leaf will be returned. Otherwise, it will create +// and return `FSNodeOverDag` with `fsNodeType`. func (db *DagBuilderHelper) NewLeafNode(data []byte, fsNodeType pb.Data_DataType) (ipld.Node, error) { if len(data) > BlockSizeLimit { return nil, ErrSizeLimitExceeded @@ -217,16 +173,6 @@ func (db *DagBuilderHelper) NewLeafNode(data []byte, fsNodeType pb.Data_DataType return node, nil } -// newUnixfsBlock creates a new Unixfs node to represent a raw data block -func (db *DagBuilderHelper) newUnixfsBlock() *UnixfsNode { - n := &UnixfsNode{ - node: new(dag.ProtoNode), - ufmt: ft.NewFSNode(ft.TRaw), - } - n.SetCidBuilder(db.cidBuilder) - return n -} - // FillNodeLayer will add datanodes as children to the give node until // it is full in this layer or no more data. func (db *DagBuilderHelper) FillNodeLayer(node *FSNodeOverDag) error { @@ -247,28 +193,13 @@ func (db *DagBuilderHelper) FillNodeLayer(node *FSNodeOverDag) error { return nil } -// GetNextDataNode builds a UnixFsNode with the data obtained from the -// Splitter, given the constraints (BlockSizeLimit, RawLeaves) specified -// when creating the DagBuilderHelper. -func (db *DagBuilderHelper) GetNextDataNode() (*UnixfsNode, error) { - data, err := db.Next() - if err != nil { - return nil, err - } - - if data == nil { // we're done! - return nil, nil - } - - return db.NewLeaf(data) -} - -// NewLeafDataNode is a variation of `GetNextDataNode` that returns -// an `ipld.Node` instead. It builds the `node` with the data obtained -// from the Splitter and returns it with the `dataSize` (that will be -// used to keep track of the DAG file size). The size of the data is -// computed here because after that it will be hidden by `NewLeafNode` -// inside a generic `ipld.Node` representation. +// NewLeafDataNode builds the `node` with the data obtained from the +// Splitter with the given constraints (BlockSizeLimit, RawLeaves) +// specified when creating the DagBuilderHelper. It returns +// `ipld.Node` with the `dataSize` (that will be used to keep track of +// the DAG file size). The size of the data is computed here because +// after that it will be hidden by `NewLeafNode` inside a generic +// `ipld.Node` representation. func (db *DagBuilderHelper) NewLeafDataNode(fsNodeType pb.Data_DataType) (node ipld.Node, dataSize uint64, err error) { fileData, err := db.Next() if err != nil { @@ -322,21 +253,6 @@ func (db *DagBuilderHelper) ProcessFileStore(node ipld.Node, dataSize uint64) ip return node } -// AddUnixfsNode sends a node to the DAGService, and returns it as ipld.Node. -func (db *DagBuilderHelper) AddUnixfsNode(node *UnixfsNode) (ipld.Node, error) { - dn, err := node.GetDagNode() - if err != nil { - return nil, err - } - - err = db.dserv.Add(context.TODO(), dn) - if err != nil { - return nil, err - } - - return dn, nil -} - // Add inserts the given node in the DAGService. func (db *DagBuilderHelper) Add(node ipld.Node) error { return db.dserv.Add(context.TODO(), node) diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index 75d0130900..075b2d2d29 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -1,17 +1,7 @@ package helpers import ( - "context" "fmt" - "os" - - dag "github.com/ipfs/go-merkledag" - - ft "github.com/ipfs/go-unixfs" - - cid "github.com/ipfs/go-cid" - pi "github.com/ipfs/go-ipfs-posinfo" - ipld "github.com/ipfs/go-ipld-format" ) // BlockSizeLimit specifies the maximum size an imported block can have. @@ -38,137 +28,3 @@ var DefaultLinksPerBlock = roughLinkBlockSize / roughLinkSize // ErrSizeLimitExceeded signals that a block is larger than BlockSizeLimit. var ErrSizeLimitExceeded = fmt.Errorf("object size limit exceeded") - -// UnixfsNode is a struct created to aid in the generation -// of unixfs DAG trees -type UnixfsNode struct { - raw bool - rawnode *dag.RawNode - node *dag.ProtoNode - ufmt *ft.FSNode - posInfo *pi.PosInfo -} - -// NewUnixfsNodeFromDag reconstructs a Unixfs node from a given dag node -func NewUnixfsNodeFromDag(nd *dag.ProtoNode) (*UnixfsNode, error) { - mb, err := ft.FSNodeFromBytes(nd.Data()) - if err != nil { - return nil, err - } - - return &UnixfsNode{ - node: nd, - ufmt: mb, - }, nil -} - -// SetCidBuilder sets the CID Builder -func (n *UnixfsNode) SetCidBuilder(builder cid.Builder) { - n.node.SetCidBuilder(builder) -} - -// NumChildren returns the number of children referenced by this UnixfsNode. -func (n *UnixfsNode) NumChildren() int { - return n.ufmt.NumChildren() -} - -// GetChild gets the ith child of this node from the given DAGService. -func (n *UnixfsNode) GetChild(ctx context.Context, i int, ds ipld.DAGService) (*UnixfsNode, error) { - nd, err := n.node.Links()[i].GetNode(ctx, ds) - if err != nil { - return nil, err - } - - pbn, ok := nd.(*dag.ProtoNode) - if !ok { - return nil, dag.ErrNotProtobuf - } - - return NewUnixfsNodeFromDag(pbn) -} - -// AddChild adds the given UnixfsNode as a child of the receiver. -// The passed in DagBuilderHelper is used to store the child node and -// pin it locally so it doesnt get lost. -func (n *UnixfsNode) AddChild(child *UnixfsNode, db *DagBuilderHelper) error { - n.ufmt.AddBlockSize(child.FileSize()) - - childnode, err := child.GetDagNode() - if err != nil { - return err - } - - // Add a link to this node without storing a reference to the memory - // This way, we avoid nodes building up and consuming all of our RAM - err = n.node.AddNodeLink("", childnode) - if err != nil { - return err - } - - _, err = db.AddUnixfsNode(child) - return err -} - -// RemoveChild deletes the child node at the given index. -func (n *UnixfsNode) RemoveChild(index int, dbh *DagBuilderHelper) { - n.ufmt.RemoveBlockSize(index) - n.node.SetLinks(append(n.node.Links()[:index], n.node.Links()[index+1:]...)) -} - -// SetData stores data in this node. -func (n *UnixfsNode) SetData(data []byte) { - n.ufmt.SetData(data) -} - -// FileSize returns the total file size of this tree (including children) -// In the case of raw nodes, it returns the length of the -// raw data. -func (n *UnixfsNode) FileSize() uint64 { - if n.raw { - return uint64(len(n.rawnode.RawData())) - } - return n.ufmt.FileSize() -} - -// SetPosInfo sets information about the offset of the data of this node in a -// filesystem file. -func (n *UnixfsNode) SetPosInfo(offset uint64, fullPath string, stat os.FileInfo) { - n.posInfo = &pi.PosInfo{ - Offset: offset, - FullPath: fullPath, - Stat: stat, - } -} - -// GetDagNode fills out the proper formatting for the unixfs node -// inside of a DAG node and returns the dag node. -func (n *UnixfsNode) GetDagNode() (ipld.Node, error) { - nd, err := n.getBaseDagNode() - if err != nil { - return nil, err - } - - if n.posInfo != nil { - if rn, ok := nd.(*dag.RawNode); ok { - return &pi.FilestoreNode{ - Node: rn, - PosInfo: n.posInfo, - }, nil - } - } - - return nd, nil -} - -func (n *UnixfsNode) getBaseDagNode() (ipld.Node, error) { - if n.raw { - return n.rawnode, nil - } - - data, err := n.ufmt.GetBytes() - if err != nil { - return nil, err - } - n.node.SetData(data) - return n.node, nil -} From 70a49ca7e634c87f018df336e95cdbf5ac2ffc4d Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Tue, 15 Jan 2019 16:58:41 -0300 Subject: [PATCH 2530/3147] trickle: document `fillTrickleRec` and `trickleDepthInfo` This commit was moved from ipfs/go-unixfs@207a325720b4c4fa8bc2fa365206a641d0e1b836 --- unixfs/importer/trickle/trickle_test.go | 6 +-- unixfs/importer/trickle/trickledag.go | 54 ++++++++++++++++--------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/unixfs/importer/trickle/trickle_test.go b/unixfs/importer/trickle/trickle_test.go index 9c568c9865..2067a24e3e 100644 --- a/unixfs/importer/trickle/trickle_test.go +++ b/unixfs/importer/trickle/trickle_test.go @@ -52,7 +52,7 @@ func buildTestDag(ds ipld.DAGService, spl chunker.Splitter, rawLeaves UseRawLeav return pbnd, VerifyTrickleDagStructure(pbnd, VerifyParams{ Getter: ds, Direct: dbp.Maxlinks, - LayerRepeat: layerRepeat, + LayerRepeat: depthRepeat, RawLeaves: bool(rawLeaves), }) } @@ -511,7 +511,7 @@ func testAppend(t *testing.T, rawLeaves UseRawLeaves) { err = VerifyTrickleDagStructure(nnode, VerifyParams{ Getter: ds, Direct: dbp.Maxlinks, - LayerRepeat: layerRepeat, + LayerRepeat: depthRepeat, RawLeaves: bool(rawLeaves), }) if err != nil { @@ -572,7 +572,7 @@ func testMultipleAppends(t *testing.T, rawLeaves UseRawLeaves) { err = VerifyTrickleDagStructure(nnode, VerifyParams{ Getter: ds, Direct: dbp.Maxlinks, - LayerRepeat: layerRepeat, + LayerRepeat: depthRepeat, RawLeaves: bool(rawLeaves), }) if err != nil { diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index f798c0eab7..d975de909f 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -28,10 +28,10 @@ import ( dag "github.com/ipfs/go-merkledag" ) -// layerRepeat specifies how many times to append a child tree of a +// depthRepeat specifies how many times to append a child tree of a // given depth. Higher values increase the width of a given node, which // improves seek speeds. -const layerRepeat = 4 +const depthRepeat = 4 // Layout builds a new DAG with the trickle format using the provided // DagBuilderHelper. See the module's description for a more detailed @@ -55,18 +55,18 @@ func fillTrickleRec(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDepth int) return nil, 0, err } - for depth := 1; ; depth++ { - // Apply depth limit only if the parameter is set (> 0). - if db.Done() || (maxDepth > 0 && depth == maxDepth) { + // For each depth in [1, `maxDepth`) (or without limit if `maxDepth` is -1, + // initial call from `Layout`) add `depthRepeat` sub-graphs of that depth. + for depth := 1; maxDepth == -1 || depth < maxDepth; depth++ { + if db.Done() { break + // No more data, stop here, posterior append calls will figure out + // where we left off. } - for layer := 0; layer < layerRepeat; layer++ { - if db.Done() { - break - } - nextChild := db.NewFSNodeOverDag(ft.TFile) - childNode, childFileSize, err := fillTrickleRec(db, nextChild, depth) + for repeatIndex := 0; repeatIndex < depthRepeat && !db.Done(); repeatIndex++ { + + childNode, childFileSize, err := fillTrickleRec(db, db.NewFSNodeOverDag(ft.TFile), depth) if err != nil { return nil, 0, err } @@ -76,7 +76,6 @@ func fillTrickleRec(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDepth int) } } } - nodeFileSize = node.FileSize() // Get the final `dag.ProtoNode` with the `FSNode` data encoded inside. filledNode, err = node.Commit() @@ -84,7 +83,7 @@ func fillTrickleRec(db *h.DagBuilderHelper, node *h.FSNodeOverDag, maxDepth int) return nil, 0, err } - return filledNode, nodeFileSize, nil + return filledNode, node.FileSize(), nil } // Append appends the data in `db` to the dag, using the Trickledag format @@ -129,7 +128,7 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i // Now, continue filling out tree like normal for i := n; !db.Done(); i++ { - for j := 0; j < layerRepeat && !db.Done(); j++ { + for j := 0; j < depthRepeat && !db.Done(); j++ { nextChild := db.NewFSNodeOverDag(ft.TFile) childNode, childFileSize, err := fillTrickleRec(db, nextChild, i) if err != nil { @@ -178,7 +177,7 @@ func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, l // Partially filled depth layer if layerFill != 0 { - for ; layerFill < layerRepeat && !db.Done(); layerFill++ { + for ; layerFill < depthRepeat && !db.Done(); layerFill++ { nextChild := db.NewFSNodeOverDag(ft.TFile) childNode, childFileSize, err := fillTrickleRec(db, nextChild, depth) if err != nil { @@ -226,7 +225,7 @@ func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper // Now, continue filling out tree like normal for i := n; i < depth && !db.Done(); i++ { - for j := 0; j < layerRepeat && !db.Done(); j++ { + for j := 0; j < depthRepeat && !db.Done(); j++ { nextChild := db.NewFSNodeOverDag(ft.TFile) childNode, childFileSize, err := fillTrickleRec(db, nextChild, i) if err != nil { @@ -242,13 +241,32 @@ func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper return fsn, fsn.FileSize(), nil } -func trickleDepthInfo(node *h.FSNodeOverDag, maxlinks int) (int, int) { +// Deduce where we left off in `fillTrickleRec`, returns the `depth` +// with which new sub-graphs were being added and, within that depth, +// in which `repeatNumber` of the total `depthRepeat` we should add. +func trickleDepthInfo(node *h.FSNodeOverDag, maxlinks int) (depth int, repeatNumber int) { n := node.NumChildren() + if n < maxlinks { + // We didn't even added the initial `maxlinks` leaf nodes (`FillNodeLayer`). return 0, 0 } - return ((n - maxlinks) / layerRepeat) + 1, (n - maxlinks) % layerRepeat + nonLeafChildren := n - maxlinks + // The number of non-leaf child nodes added in `fillTrickleRec` (after + // the `FillNodeLayer` call). + + depth = nonLeafChildren/depthRepeat + 1 + // "Deduplicate" the added `depthRepeat` sub-graphs at each depth + // (rounding it up since we may be on an unfinished depth with less + // than `depthRepeat` sub-graphs). + + repeatNumber = nonLeafChildren % depthRepeat + // What's left after taking full depths of `depthRepeat` sub-graphs + // is the current `repeatNumber` we're at (this fractional part is + // what we rounded up before). + + return } // VerifyParams is used by VerifyTrickleDagStructure From 58dbc6a5af3ae21ca2b56325bfddd34475a64891 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Tue, 15 Jan 2019 21:25:22 -0300 Subject: [PATCH 2531/3147] trickle: rename variables according to new `trickleDepthInfo` names This commit was moved from ipfs/go-unixfs@b1b1f17daaff16eebe63e6e6a22cdc6cbf4b38e1 --- unixfs/importer/trickle/trickledag.go | 48 +++++++++++++++------------ 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/unixfs/importer/trickle/trickledag.go b/unixfs/importer/trickle/trickledag.go index d975de909f..3a631adb86 100644 --- a/unixfs/importer/trickle/trickledag.go +++ b/unixfs/importer/trickle/trickledag.go @@ -101,33 +101,35 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i } // Get depth of this 'tree' - n, layerProgress := trickleDepthInfo(fsn, db.Maxlinks()) - if n == 0 { + depth, repeatNumber := trickleDepthInfo(fsn, db.Maxlinks()) + if depth == 0 { // If direct blocks not filled... if err := db.FillNodeLayer(fsn); err != nil { return nil, err } if db.Done() { + // TODO: If `FillNodeLayer` stop `Commit`ing this should be + // the place (besides the function end) to call it. return fsn.GetDagNode() } // If continuing, our depth has increased by one - n++ + depth++ } - // Last child in this node may not be a full tree, lets file it up - if err := appendFillLastChild(ctx, fsn, n-1, layerProgress, db); err != nil { + // Last child in this node may not be a full tree, lets fill it up. + if err := appendFillLastChild(ctx, fsn, depth-1, repeatNumber, db); err != nil { return nil, err } // after appendFillLastChild, our depth is now increased by one if !db.Done() { - n++ + depth++ } // Now, continue filling out tree like normal - for i := n; !db.Done(); i++ { + for i := depth; !db.Done(); i++ { for j := 0; j < depthRepeat && !db.Done(); j++ { nextChild := db.NewFSNodeOverDag(ft.TFile) childNode, childFileSize, err := fillTrickleRec(db, nextChild, i) @@ -147,10 +149,13 @@ func Append(ctx context.Context, basen ipld.Node, db *h.DagBuilderHelper) (out i return fsn.GetDagNode() } -func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, layerFill int, db *h.DagBuilderHelper) error { +func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, repeatNumber int, db *h.DagBuilderHelper) error { if fsn.NumChildren() <= db.Maxlinks() { return nil } + // TODO: Why do we need this check, didn't the caller already take + // care of this? + // Recursive step, grab last child last := fsn.NumChildren() - 1 lastChild, err := fsn.GetChild(ctx, last, db.GetDagServ()) @@ -159,14 +164,14 @@ func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, l } // Fill out last child (may not be full tree) - nchild, nchildSize, err := appendRec(ctx, lastChild, db, depth-1) + newChild, nchildSize, err := appendRec(ctx, lastChild, db, depth-1) if err != nil { return err } // Update changed child in parent node fsn.RemoveChild(last, db) - filledNode, err := nchild.Commit() + filledNode, err := newChild.Commit() if err != nil { return err } @@ -176,8 +181,8 @@ func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, l } // Partially filled depth layer - if layerFill != 0 { - for ; layerFill < depthRepeat && !db.Done(); layerFill++ { + if repeatNumber != 0 { + for ; repeatNumber < depthRepeat && !db.Done(); repeatNumber++ { nextChild := db.NewFSNodeOverDag(ft.TFile) childNode, childFileSize, err := fillTrickleRec(db, nextChild, depth) if err != nil { @@ -194,37 +199,38 @@ func appendFillLastChild(ctx context.Context, fsn *h.FSNodeOverDag, depth int, l } // recursive call for Append -func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper, depth int) (*h.FSNodeOverDag, uint64, error) { - if depth == 0 || db.Done() { +func appendRec(ctx context.Context, fsn *h.FSNodeOverDag, db *h.DagBuilderHelper, maxDepth int) (*h.FSNodeOverDag, uint64, error) { + if maxDepth == 0 || db.Done() { return fsn, fsn.FileSize(), nil } // Get depth of this 'tree' - n, layerProgress := trickleDepthInfo(fsn, db.Maxlinks()) - if n == 0 { + depth, repeatNumber := trickleDepthInfo(fsn, db.Maxlinks()) + if depth == 0 { // If direct blocks not filled... if err := db.FillNodeLayer(fsn); err != nil { return nil, 0, err } - n++ + depth++ } + // TODO: Same as `appendFillLastChild`, when is this case possible? // If at correct depth, no need to continue - if n == depth { + if depth == maxDepth { return fsn, fsn.FileSize(), nil } - if err := appendFillLastChild(ctx, fsn, n, layerProgress, db); err != nil { + if err := appendFillLastChild(ctx, fsn, depth, repeatNumber, db); err != nil { return nil, 0, err } // after appendFillLastChild, our depth is now increased by one if !db.Done() { - n++ + depth++ } // Now, continue filling out tree like normal - for i := n; i < depth && !db.Done(); i++ { + for i := depth; i < maxDepth && !db.Done(); i++ { for j := 0; j < depthRepeat && !db.Done(); j++ { nextChild := db.NewFSNodeOverDag(ft.TFile) childNode, childFileSize, err := fillTrickleRec(db, nextChild, i) From 5d0cb2f837f9ce4809aad56beb526888a291f48d Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Tue, 15 Jan 2019 21:37:18 -0300 Subject: [PATCH 2532/3147] helpers: doc and TODOs This commit was moved from ipfs/go-unixfs@2ea1b470b1d8d6418fc0236df2937b126b2183e2 --- unixfs/importer/helpers/dagbuilder.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index ad390d1f5a..891cdaa4d1 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -175,6 +175,8 @@ func (db *DagBuilderHelper) NewLeafNode(data []byte, fsNodeType pb.Data_DataType // FillNodeLayer will add datanodes as children to the give node until // it is full in this layer or no more data. +// NOTE: This function creates raw data nodes so it only works +// for the `trickle.Layout`. func (db *DagBuilderHelper) FillNodeLayer(node *FSNodeOverDag) error { // while we have room AND we're not done @@ -189,6 +191,8 @@ func (db *DagBuilderHelper) FillNodeLayer(node *FSNodeOverDag) error { } } node.Commit() + // TODO: Do we need to commit here? The caller who created the + // `FSNodeOverDag` should be in charge of that. return nil } @@ -344,7 +348,7 @@ func (n *FSNodeOverDag) RemoveChild(index int, dbh *DagBuilderHelper) { // that represents them: the `ft.FSNode` is encoded inside the // `dag.ProtoNode`. // -// TODO: Evaluate making it read-only after committing. +// TODO: Make it read-only after committing, allow to commit only once. func (n *FSNodeOverDag) Commit() (ipld.Node, error) { fileData, err := n.file.GetBytes() if err != nil { @@ -375,6 +379,8 @@ func (n *FSNodeOverDag) SetFileData(fileData []byte) { // GetDagNode fills out the proper formatting for the FSNodeOverDag node // inside of a DAG node and returns the dag node. +// TODO: Check if we have committed (passed the UnixFS information +// to the DAG layer) before returning this. func (n *FSNodeOverDag) GetDagNode() (ipld.Node, error) { return n.dag, nil } From 9d818692576545efe3be8a5c775156e48766367e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 17 Jan 2019 16:53:12 +0000 Subject: [PATCH 2533/3147] nit: validate CIDs in IPLD paths This commit was moved from ipfs/go-path@261f0f7e43da7b2529505608d1818be74deb0d83 --- path/path.go | 14 ++++++++++---- path/path_test.go | 9 +++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/path/path.go b/path/path.go index 7754ef1ea4..eada90d8fb 100644 --- a/path/path.go +++ b/path/path.go @@ -106,7 +106,7 @@ func ParsePath(txt string) (Path, error) { // if the path doesnt begin with a '/' // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { - if _, err := ParseCidToPath(parts[0]); err != nil { + if _, err := cid.Decode(parts[0]); err != nil { return "", ErrBadPath } // The case when the path starts with hash without a protocol prefix @@ -117,11 +117,17 @@ func ParsePath(txt string) (Path, error) { return "", ErrBadPath } - if parts[1] == "ipfs" { - if _, err := ParseCidToPath(parts[2]); err != nil { + //TODO: make this smarter + switch parts[1] { + case "ipfs", "ipld": + // Validate Cid. + _, err := cid.Decode(parts[2]) + if err != nil { return "", err } - } else if parts[1] != "ipns" && parts[1] != "ipld" { //TODO: make this smarter + case "ipns": + // No validation. + default: return "", ErrBadPath } diff --git a/path/path_test.go b/path/path_test.go index db28193c8d..a166e713de 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -18,9 +18,14 @@ func TestPathParsing(t *testing.T) { "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, "/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": false, "/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": false, - "/ipfs/": false, - "ipfs/": false, + "/ipfs/foo": false, + "/ipfs/": false, + "ipfs/": false, "ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": false, + "/ipld/foo": false, + "/ipld/": false, + "ipld/": false, + "ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": false, } for p, expected := range cases { From b1caa58eae01f9d6623c504be4085c32ebc675f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 11 Jan 2019 12:49:50 +0100 Subject: [PATCH 2534/3147] ls: report real size by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@d48b9e1c1f2c70766f5fd1cb13f872ec86075d4d --- coreiface/tests/unixfs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index e8a1aba32e..9e1454c417 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -704,8 +704,8 @@ func (tp *provider) TestLs(t *testing.T) { if len(links) != 1 { t.Fatalf("expected 1 link, got %d", len(links)) } - if links[0].Size != 23 { - t.Fatalf("expected size = 23, got %d", links[0].Size) + if links[0].Size != 15 { + t.Fatalf("expected size = 15, got %d", links[0].Size) } if links[0].Name != "name-of-file" { t.Fatalf("expected name = name-of-file, got %s", links[0].Name) From 100779d936550209ee7020525cb7b3ff0639787f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 11 Jan 2019 13:16:47 +0100 Subject: [PATCH 2535/3147] ls: skip size for directories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@6c323ff16d39002eec98b8ae6337f7050937e0d8 --- coreiface/tests/unixfs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 9e1454c417..e8a1aba32e 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -704,8 +704,8 @@ func (tp *provider) TestLs(t *testing.T) { if len(links) != 1 { t.Fatalf("expected 1 link, got %d", len(links)) } - if links[0].Size != 15 { - t.Fatalf("expected size = 15, got %d", links[0].Size) + if links[0].Size != 23 { + t.Fatalf("expected size = 23, got %d", links[0].Size) } if links[0].Name != "name-of-file" { t.Fatalf("expected name = name-of-file, got %s", links[0].Name) From 7448e658e8687d8976bef3a42bbc1d1aa69ad969 Mon Sep 17 00:00:00 2001 From: Kevin Atkinson Date: Thu, 22 Nov 2018 04:16:45 -0500 Subject: [PATCH 2536/3147] Add global --cid-base option and enable it for most commands. This does it on ther server side for most commands. This also adds a global --output-cidv1 option. License: MIT Signed-off-by: Kevin Atkinson This commit was moved from ipfs/go-filestore@682a30e88ed7b65560b4cc2a3a301244c48afc31 --- filestore/util.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/filestore/util.go b/filestore/util.go index af25da2726..a4f1b97326 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -66,15 +66,18 @@ type ListRes struct { Size uint64 } -// FormatLong returns a human readable string for a ListRes object. -func (r *ListRes) FormatLong() string { +// FormatLong returns a human readable string for a ListRes object +func (r *ListRes) FormatLong(enc func(cid.Cid) string) string { + if enc == nil { + enc = (cid.Cid).String + } switch { case !r.Key.Defined(): return "" case r.FilePath == "": return r.Key.String() default: - return fmt.Sprintf("%-50s %6d %s %d", r.Key, r.Size, r.FilePath, r.Offset) + return fmt.Sprintf("%-50s %6d %s %d", enc(r.Key), r.Size, r.FilePath, r.Offset) } } From 14775e570f295908e29ec9ecb04acb8237435c72 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Thu, 17 Jan 2019 01:30:27 -0300 Subject: [PATCH 2537/3147] mod: `TestDagSync`, seek before reading This commit was moved from ipfs/go-unixfs@63cc1b69aabd36604b0f7f249c006c45866a81eb --- unixfs/mod/dagmodifier_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index b613693623..9870b2022c 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -453,6 +453,11 @@ func TestDagSync(t *testing.T) { t.Fatal(err) } + _, err = dagmod.Seek(0, io.SeekStart) + if err != nil { + t.Fatal(err) + } + out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) From 3d978107f2e1b6ffe0d6183bdefeeb5ddbd7905e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 20 Jan 2019 16:59:22 +0100 Subject: [PATCH 2538/3147] Don't error on closed exchange This commit was moved from ipfs/go-blockservice@3d57ac5823071e4249e896a5bcc759613e71ca88 --- blockservice/blockservice.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 2e1de3f7a1..3b5a1df6b9 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -6,7 +6,6 @@ package blockservice import ( "context" "errors" - "fmt" "io" "sync" @@ -150,8 +149,7 @@ func (s *blockService) AddBlock(o blocks.Block) error { log.Event(context.TODO(), "BlockService.BlockAdded", c) if err := s.exchange.HasBlock(o); err != nil { - // TODO(#4623): really an error? - return errors.New("blockservice is closed") + log.Errorf("HasBlock: %s", err.Error()) } return nil @@ -189,8 +187,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { for _, o := range toput { log.Event(context.TODO(), "BlockService.BlockAdded", o.Cid()) if err := s.exchange.HasBlock(o); err != nil { - // TODO(#4623): Should this really *return*? - return fmt.Errorf("blockservice is closed (%s)", err) + log.Errorf("HasBlock: %s", err.Error()) } } return nil From b92dcf5817ba9154db34f6156ad70836b7669b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 21 Jan 2019 21:31:52 +0100 Subject: [PATCH 2539/3147] coreapi: few more error check fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@b4e7753bacca7684d5e70294f766948fd77bf1c7 --- coreiface/tests/dag.go | 2 +- coreiface/tests/path.go | 2 +- coreiface/tests/unixfs.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index e66106c332..10fab125a2 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -185,7 +185,7 @@ func (tp *provider) TestBatch(t *testing.T) { } _, err = api.Dag().Get(ctx, nds[0].Cid()) - if err == nil || err.Error() != "merkledag: not found" { + if err == nil || !strings.Contains(err.Error(), "not found") { t.Error(err) } diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 01f2e6f36b..e7df6f1fb7 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -151,7 +151,7 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { } _, err = api.ResolvePath(ctx, p1) - if err == nil || err.Error() != "no such link found" { + if err == nil || !strings.Contains(err.Error(), "no such link found") { t.Fatalf("unexpected error: %s", err) } } diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index fce41ae849..0ef3f031e5 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -587,7 +587,7 @@ func (tp *provider) TestAddHashOnly(t *testing.T) { if err == nil { t.Fatal("expected an error") } - if err.Error() != "blockservice: key not found" { + if !strings.Contains(err.Error(), "blockservice: key not found") { t.Errorf("unxepected error: %s", err.Error()) } } From 9eb0432c770d33d2b1c15ea25e5d3974654e843f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 22 Jan 2019 21:01:19 +0100 Subject: [PATCH 2540/3147] Port dag commansds to CoreAPI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@f40d44ddbfd929eb84316d66e895f93dedf47424 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 coreiface/dag.go diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 9d2100fcc5..16b28182e6 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -19,7 +19,7 @@ type CoreAPI interface { Block() BlockAPI // Dag returns an implementation of Dag API - Dag() ipld.DAGService + Dag() APIDagService // Name returns an implementation of Name API Name() NameAPI diff --git a/coreiface/dag.go b/coreiface/dag.go new file mode 100644 index 0000000000..455d004503 --- /dev/null +++ b/coreiface/dag.go @@ -0,0 +1,13 @@ +package iface + +import ( + ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" +) + +// APIDagService extends ipld.DAGService +type APIDagService interface { + ipld.DAGService + + // Pinning returns special NodeAdder which recursively pins added nodes + Pinning() ipld.NodeAdder +} From a833f0e460c7148714560fdf58c39fb15d130cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 22:02:51 +0100 Subject: [PATCH 2541/3147] Enforce refs on files when using nocopy This commit was moved from ipfs/go-unixfs@7eb118dfd0dc36cf44fcf53bc3f3558dac169eb8 --- unixfs/importer/helpers/dagbuilder.go | 12 ++++++++++-- unixfs/importer/importer.go | 13 ++++++++++--- unixfs/mod/dagmodifier.go | 6 +++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index 891cdaa4d1..a624217f8b 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -2,6 +2,7 @@ package helpers import ( "context" + "errors" "io" "os" @@ -17,6 +18,8 @@ import ( ipld "github.com/ipfs/go-ipld-format" ) +var ErrMissingFsRef = errors.New("missing file path or URL, can't create filestore reference") + // DagBuilderHelper wraps together a bunch of objects needed to // efficiently create unixfs dag trees type DagBuilderHelper struct { @@ -71,7 +74,7 @@ type DagBuilderParams struct { // New generates a new DagBuilderHelper from the given params and a given // chunker.Splitter as data source. -func (dbp *DagBuilderParams) New(spl chunker.Splitter) *DagBuilderHelper { +func (dbp *DagBuilderParams) New(spl chunker.Splitter) (*DagBuilderHelper, error) { db := &DagBuilderHelper{ dserv: dbp.Dagserv, spl: spl, @@ -87,7 +90,12 @@ func (dbp *DagBuilderParams) New(spl chunker.Splitter) *DagBuilderHelper { if dbp.URL != "" && dbp.NoCopy { db.fullPath = dbp.URL } - return db + + if dbp.NoCopy && db.fullPath == "" { // Enforce NoCopy + return nil, ErrMissingFsRef + } + + return db, nil } // prepareNext consumes the next item from the splitter and puts it diff --git a/unixfs/importer/importer.go b/unixfs/importer/importer.go index ecf016854d..03f1c6048a 100644 --- a/unixfs/importer/importer.go +++ b/unixfs/importer/importer.go @@ -18,8 +18,11 @@ func BuildDagFromReader(ds ipld.DAGService, spl chunker.Splitter) (ipld.Node, er Dagserv: ds, Maxlinks: h.DefaultLinksPerBlock, } - - return bal.Layout(dbp.New(spl)) + db, err := dbp.New(spl) + if err != nil { + return nil, err + } + return bal.Layout(db) } // BuildTrickleDagFromReader creates a DAG given a DAGService and a Splitter @@ -30,5 +33,9 @@ func BuildTrickleDagFromReader(ds ipld.DAGService, spl chunker.Splitter) (ipld.N Maxlinks: h.DefaultLinksPerBlock, } - return trickle.Layout(dbp.New(spl)) + db, err := dbp.New(spl) + if err != nil { + return nil, err + } + return trickle.Layout(db) } diff --git a/unixfs/mod/dagmodifier.go b/unixfs/mod/dagmodifier.go index a4c0980521..1e2b2dcca8 100644 --- a/unixfs/mod/dagmodifier.go +++ b/unixfs/mod/dagmodifier.go @@ -359,7 +359,11 @@ func (dm *DagModifier) appendData(nd ipld.Node, spl chunker.Splitter) (ipld.Node CidBuilder: dm.Prefix, RawLeaves: dm.RawLeaves, } - return trickle.Append(dm.ctx, nd, dbp.New(spl)) + db, err := dbp.New(spl) + if err != nil { + return nil, err + } + return trickle.Append(dm.ctx, nd, db) default: return nil, ErrNotUnixfs } From fe4bf0a3c8b521c17dce892b3fe8db7610768ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 22:14:06 +0100 Subject: [PATCH 2542/3147] fix tests after DagBuilder changes This commit was moved from ipfs/go-unixfs@9e866f18e27d2c59de70057aab1f92afced0717e --- unixfs/importer/balanced/balanced_test.go | 7 ++++- unixfs/importer/trickle/trickle_test.go | 37 ++++++++++++++++++++--- unixfs/test/utils.go | 6 +++- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/unixfs/importer/balanced/balanced_test.go b/unixfs/importer/balanced/balanced_test.go index 1f135b781b..b2069e3a93 100644 --- a/unixfs/importer/balanced/balanced_test.go +++ b/unixfs/importer/balanced/balanced_test.go @@ -27,7 +27,12 @@ func buildTestDag(ds ipld.DAGService, spl chunker.Splitter) (*dag.ProtoNode, err Maxlinks: h.DefaultLinksPerBlock, } - nd, err := Layout(dbp.New(spl)) + db, err := dbp.New(spl) + if err != nil { + return nil, err + } + + nd, err := Layout(db) if err != nil { return nil, err } diff --git a/unixfs/importer/trickle/trickle_test.go b/unixfs/importer/trickle/trickle_test.go index 2067a24e3e..2b6e0bd461 100644 --- a/unixfs/importer/trickle/trickle_test.go +++ b/unixfs/importer/trickle/trickle_test.go @@ -39,7 +39,12 @@ func buildTestDag(ds ipld.DAGService, spl chunker.Splitter, rawLeaves UseRawLeav RawLeaves: bool(rawLeaves), } - nd, err := Layout(dbp.New(spl)) + db, err := dbp.New(spl) + if err != nil { + return nil, err + } + + nd, err := Layout(db) if err != nil { return nil, err } @@ -503,7 +508,13 @@ func testAppend(t *testing.T, rawLeaves UseRawLeaves) { r := bytes.NewReader(should[nbytes/2:]) ctx := context.Background() - nnode, err := Append(ctx, nd, dbp.New(chunker.NewSizeSplitter(r, 500))) + + db, err := dbp.New(chunker.NewSizeSplitter(r, 500)) + if err != nil { + t.Fatal(err) + } + + nnode, err := Append(ctx, nd, db) if err != nil { t.Fatal(err) } @@ -564,7 +575,12 @@ func testMultipleAppends(t *testing.T, rawLeaves UseRawLeaves) { ctx := context.Background() for i := 0; i < len(should); i++ { - nnode, err := Append(ctx, nd, dbp.New(spl(bytes.NewReader(should[i:i+1])))) + db, err := dbp.New(spl(bytes.NewReader(should[i : i+1]))) + if err != nil { + t.Fatal(err) + } + + nnode, err := Append(ctx, nd, db) if err != nil { t.Fatal(err) } @@ -612,12 +628,23 @@ func TestAppendSingleBytesToEmpty(t *testing.T) { spl := chunker.SizeSplitterGen(500) ctx := context.Background() - nnode, err := Append(ctx, nd, dbp.New(spl(bytes.NewReader(data[:1])))) + + db, err := dbp.New(spl(bytes.NewReader(data[:1]))) + if err != nil { + t.Fatal(err) + } + + nnode, err := Append(ctx, nd, db) + if err != nil { + t.Fatal(err) + } + + db, err = dbp.New(spl(bytes.NewReader(data[1:]))) if err != nil { t.Fatal(err) } - nnode, err = Append(ctx, nnode, dbp.New(spl(bytes.NewReader(data[1:])))) + nnode, err = Append(ctx, nnode, db) if err != nil { t.Fatal(err) } diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index 98bce14cf4..bb251bc118 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -67,7 +67,11 @@ func GetNode(t testing.TB, dserv ipld.DAGService, data []byte, opts NodeOpts) ip RawLeaves: opts.RawLeavesUsed, } - node, err := trickle.Layout(dbp.New(SizeSplitterGen(500)(in))) + db, err := dbp.New(SizeSplitterGen(500)(in)) + if err != nil { + t.Fatal(err) + } + node, err := trickle.Layout(db) if err != nil { t.Fatal(err) } From f542e9c788b6601c072ec7408e73a9057921a0b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 21:01:39 +0100 Subject: [PATCH 2543/3147] Unixfs.Add nocopy test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@e49c3d2211a09a5bfa5c5eceeeaf08715b230313 --- coreiface/tests/unixfs.go | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 0ef3f031e5..0ceae06e1d 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -101,6 +101,34 @@ func (tp *provider) TestAdd(t *testing.T) { return coreiface.IpfsPath(c) } + rf, err := ioutil.TempFile(os.TempDir(), "unixfs-add-real") + if err != nil { + t.Fatal(err) + } + rfp := rf.Name() + + if _, err := rf.Write([]byte(helloStr)); err != nil { + t.Fatal(err) + } + + stat, err := rf.Stat() + if err != nil { + t.Fatal(err) + } + + if err := rf.Close(); err != nil { + t.Fatal(err) + } + defer os.Remove(rfp) + + realFile := func() files.Node { + n, err := files.NewReaderPathFile(rfp, ioutil.NopCloser(strings.NewReader(helloStr)), stat) + if err != nil { + t.Fatal(err) + } + return n + } + cases := []struct { name string data func() files.Node @@ -323,6 +351,20 @@ func (tp *provider) TestAdd(t *testing.T) { path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp", opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)}, }, + // NoCopy + { + name: "simpleNoCopy", + data: realFile, + path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + opts: []options.UnixfsAddOption{options.Unixfs.Nocopy(true)}, + }, + { + name: "noCopyNoRaw", + data: realFile, + path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + opts: []options.UnixfsAddOption{options.Unixfs.Nocopy(true), options.Unixfs.RawLeaves(false)}, + err: "nocopy option requires '--raw-leaves' to be enabled as well", + }, // Events / Progress { name: "simpleAddEvent", From 089430e39729baec439315f08826de38643a99fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 22:00:57 +0100 Subject: [PATCH 2544/3147] Unixfs: enforce refs on files when using nocopy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3de10ba1bd3faefa63d1c9353a7ac47c5de45d2d --- coreiface/tests/unixfs.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 0ceae06e1d..fdc1a08cd0 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -16,6 +16,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs" + "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs/importer/helpers" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" cbor "gx/ipfs/QmRoARq3nkUb13HSKZGepCZSWe5GrVPwx7xURJGZ7KWv9V/go-ipld-cbor" mdag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" @@ -365,6 +366,13 @@ func (tp *provider) TestAdd(t *testing.T) { opts: []options.UnixfsAddOption{options.Unixfs.Nocopy(true), options.Unixfs.RawLeaves(false)}, err: "nocopy option requires '--raw-leaves' to be enabled as well", }, + { + name: "noCopyNoPath", + data: strFile(helloStr), + path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + opts: []options.UnixfsAddOption{options.Unixfs.Nocopy(true)}, + err: helpers.ErrMissingFsRef.Error(), + }, // Events / Progress { name: "simpleAddEvent", From c4c8f78fbaabeefdd34da61134117fb4fac3485a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 23 Jan 2019 05:52:50 -0800 Subject: [PATCH 2545/3147] fix: no components error We need to return "ErrNoComponents" when the part after `/{ipld,ipfs,ipns}/` is empty. This commit was moved from ipfs/go-path@3a06fd5efac9babd9d45f58d4118370ba940cc43 --- path/path.go | 7 ++++++- path/path_test.go | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index eada90d8fb..b0d6cdcdee 100644 --- a/path/path.go +++ b/path/path.go @@ -120,13 +120,18 @@ func ParsePath(txt string) (Path, error) { //TODO: make this smarter switch parts[1] { case "ipfs", "ipld": + if parts[2] == "" { + return "", ErrNoComponents + } // Validate Cid. _, err := cid.Decode(parts[2]) if err != nil { return "", err } case "ipns": - // No validation. + if parts[2] == "" { + return "", ErrNoComponents + } default: return "", ErrBadPath } diff --git a/path/path_test.go b/path/path_test.go index a166e713de..657c58c75d 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -37,6 +37,19 @@ func TestPathParsing(t *testing.T) { } } +func TestNoComponents(t *testing.T) { + for _, s := range []string{ + "/ipfs/", + "/ipns/", + "/ipld/", + } { + _, err := ParsePath(s) + if err != ErrNoComponents { + t.Errorf("expected ErrNoComponents, got %s", err) + } + } +} + func TestIsJustAKey(t *testing.T) { cases := map[string]bool{ "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, From d8eb73b5b2bb26bff6da6249a4ea3b2dd4dc0b49 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 23 Jan 2019 05:57:52 -0800 Subject: [PATCH 2546/3147] ci: add travis This commit was moved from ipfs/go-path@ab96f1839f90066285f4b1eaa7a0f70716947b5d --- path/Makefile | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 path/Makefile diff --git a/path/Makefile b/path/Makefile new file mode 100644 index 0000000000..20619413c9 --- /dev/null +++ b/path/Makefile @@ -0,0 +1,11 @@ +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go + +deps: gx + gx --verbose install --global + gx-go rewrite + +publish: + gx-go rewrite --undo + From 0607c70fc34030eeef947bb4b338fdc65ac45aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 22:05:10 +0100 Subject: [PATCH 2547/3147] gx: update go-unixfs to 1.2.14 and go-bitswap to 1.1.21 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (and everything else...) License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@ac501b69c4b9fd4e05d39d2c8ff0eb1bfbea8c7b --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 9fbaa06b9e..bc6d4dd2c7 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 51bb0c0b0d..8f41c64d32 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 5267941747..769a9d5d7a 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 64690cd3d8..0b047eec91 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 181f227f00..47c0bcd04f 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys.go b/namesys/namesys.go index d944b650f4..ac3caa3284 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index bbbf632d0b..8f6da5d718 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -7,12 +7,12 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" pstoremem "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore/pstoremem" - "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs" + "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs" offroute "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/offline" ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" diff --git a/namesys/proquint.go b/namesys/proquint.go index 5e8d52fe7b..703bbb3cc3 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/publisher.go b/namesys/publisher.go index 63cae54ce3..ef536a7e9e 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,8 +7,8 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" - ft "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs" + ft "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 52d90629be..429f41f8c7 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index f55fd2984a..a7530b1e9b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index c157f7de38..fe0a811255 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" testutil "gx/ipfs/QmNvHv84aH2qZafDuSdKJCQ1cvPZ1kmQmyD4YtzjUHuk9v/go-testutil" mockrouting "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/mock" diff --git a/namesys/routing.go b/namesys/routing.go index 029eaeb83c..9ac7c086a5 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,7 +5,7 @@ import ( "strings" "time" - path "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" From 99fe5e7502f9c05b67e338490b47816d4434aa71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 22:05:10 +0100 Subject: [PATCH 2548/3147] gx: update go-unixfs to 1.2.14 and go-bitswap to 1.1.21 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (and everything else...) License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3cc6578657ac8580d77f93a681f80ceeba1d6389 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/object.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/tests/name.go | 2 +- coreiface/tests/unixfs.go | 8 ++++---- coreiface/unixfs.go | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 16b28182e6..d26ec4f7d1 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index 455d004503..d15e24360e 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -1,7 +1,7 @@ package iface import ( - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" ) // APIDagService extends ipld.DAGService diff --git a/coreiface/object.go b/coreiface/object.go index ba6f5a95d6..2ed357cb63 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -7,7 +7,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 5f92f3eea4..109a63f1d8 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -5,7 +5,7 @@ import ( "fmt" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/path.go b/coreiface/path.go index 580703a732..b96e0e7757 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,8 +1,8 @@ package iface import ( - ipfspath "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + ipfspath "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 2e43a12eee..7b0a5d8f08 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -8,7 +8,7 @@ import ( "testing" "time" - ipath "gx/ipfs/QmNYPETsdAu2uQ1k9q9S1jYEGURaLHV6cbYRSVFVRftpF8/go-path" + ipath "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index fdc1a08cd0..6f10406ebf 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -15,12 +15,12 @@ import ( coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs" - "gx/ipfs/QmQXze9tG878pa4Euya4rrDpyTNX3kQe4dhCaBzBozGgpe/go-unixfs/importer/helpers" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - cbor "gx/ipfs/QmRoARq3nkUb13HSKZGepCZSWe5GrVPwx7xURJGZ7KWv9V/go-ipld-cbor" - mdag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + cbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" + "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs" + "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs/importer/helpers" "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" + mdag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index b42b454cc2..3c27881967 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" ) type AddEvent struct { From 24a1bb8996f847f83fae360f99977f76ebb39260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 22:05:10 +0100 Subject: [PATCH 2549/3147] gx: update go-unixfs to 1.2.14 and go-bitswap to 1.1.21 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (and everything else...) License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-ipfs-pinner@3845684e5ca294d5c69992c65abcb312a1dcd681 --- pinning/pinner/gc/gc.go | 6 +++--- pinning/pinner/pin.go | 4 ++-- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 4 ++-- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 1c5c6a7af1..5e09f5078d 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,14 +8,14 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" - bserv "gx/ipfs/QmYPZzd9VqmJDwxUnThfeSbV1Y5o53aVPDijTB7j7rS9Ep/go-blockservice" + bserv "gx/ipfs/QmVKQHuzni68SWByzJgBUCwHvvr4TWiXfutNWWwpZpp4rE/go-blockservice" + dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" bstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" "gx/ipfs/QmYMQuypUbgsdNHmuCBSUJV6wdQVsBHRivNAp3efHJwZJD/go-verifcid" offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline" - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" dstore "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 11fb21039d..8a1a18fe1c 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,10 +10,10 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + mdag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index e37773e76d..9660d73391 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" - bs "gx/ipfs/QmYPZzd9VqmJDwxUnThfeSbV1Y5o53aVPDijTB7j7rS9Ep/go-blockservice" + bs "gx/ipfs/QmVKQHuzni68SWByzJgBUCwHvvr4TWiXfutNWWwpZpp4rE/go-blockservice" + mdag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index ff7152685a..f7e457315c 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipld "gx/ipfs/QmcKKBwfz6FyQdHR2jsXrrF6XeSBXYL86anmWNewpFpoF5/go-ipld-format" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 184041f369..52b55b9ffb 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" - bserv "gx/ipfs/QmYPZzd9VqmJDwxUnThfeSbV1Y5o53aVPDijTB7j7rS9Ep/go-blockservice" + bserv "gx/ipfs/QmVKQHuzni68SWByzJgBUCwHvvr4TWiXfutNWWwpZpp4rE/go-blockservice" + dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From 0e53a875d30352b1421cec5b4a8529f97ffa63f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 14 Jan 2019 22:05:10 +0100 Subject: [PATCH 2550/3147] gx: update go-unixfs to 1.2.14 and go-bitswap to 1.1.21 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (and everything else...) License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-filestore@4c773744e5cc90f162f00b84dd5fbbb85eacdb83 --- filestore/filestore.go | 2 +- filestore/filestore_test.go | 4 ++-- filestore/fsrefstore.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index d9632d9f9b..0ee63e52e7 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,9 +11,9 @@ import ( "context" "errors" - posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index a39d6f9066..9f8bdb26b9 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,11 +7,11 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmTQdH4848iTVCJmKXYyRiK72HufWTLYQQ8iN3JaQ8K1Hq/go-merkledag" + dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" - posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index f6b39e27e6..a7e34bb770 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,9 +10,9 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - posinfo "gx/ipfs/QmR6YMs8EkXQLXNwQKxLnQp2VBZSepoEJ8KCZAyanJHhJu/go-ipfs-posinfo" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" From 71502ba7d5e8ec823510861f127f395db821f791 Mon Sep 17 00:00:00 2001 From: Daniel Aleksandersen Date: Mon, 28 Jan 2019 07:28:30 +0100 Subject: [PATCH 2551/3147] Only perform DNSLink lookups on fully qualified domain names (FQDN) This change halves the number of DNS queries requires to lookup DNSLink information for "example.com" by forcing the use of a FQDN. * example.com * example.com.local (removed) * _dnslink.example.com * _dnslink.example.com.local (removed) Where .local is the local system's organization/domain name. License: MIT Signed-off-by: Daniel Aleksandersen This commit was moved from ipfs/go-namesys@48bc858f19bbbd4431efffa93b63e4f78072b3d0 --- namesys/dns.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 769a9d5d7a..f0cd63c706 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -45,6 +45,7 @@ type lookupRes struct { // TXT records for a given domain name should contain a b58 // encoded multihash. func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + var fqdn string out := make(chan onceResult, 1) segments := strings.SplitN(name, "/", 2) domain := segments[0] @@ -56,11 +57,17 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options } log.Debugf("DNSResolver resolving %s", domain) + if strings.HasSuffix(domain, ".") { + fqdn = domain + } else { + fqdn = domain + "." + } + rootChan := make(chan lookupRes, 1) - go workDomain(r, domain, rootChan) + go workDomain(r, fqdn, rootChan) subChan := make(chan lookupRes, 1) - go workDomain(r, "_dnslink."+domain, subChan) + go workDomain(r, "_dnslink."+fqdn, subChan) appendPath := func(p path.Path) (path.Path, error) { if len(segments) > 1 { From 04686cc6ec5c43db753e3c8ac2a7da1f6a33c4fc Mon Sep 17 00:00:00 2001 From: Daniel Aleksandersen Date: Mon, 28 Jan 2019 08:13:14 +0100 Subject: [PATCH 2552/3147] Update mockDNS to use FQDNs License: MIT Signed-off-by: Daniel Aleksandersen This commit was moved from ipfs/go-namesys@e3e8ab9a5048d3d2b1732acc3bd7ef2a9e1b9f1b --- namesys/dns_test.go | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 2a58124ed4..282906998b 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -61,66 +61,66 @@ func TestDnsEntryParsing(t *testing.T) { func newMockDNS() *mockDNS { return &mockDNS{ entries: map[string][]string{ - "multihash.example.com": []string{ + "multihash.example.com.": []string{ "dnslink=QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "ipfs.example.com": []string{ + "ipfs.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "_dnslink.dipfs.example.com": []string{ + "_dnslink.dipfs.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "dns1.example.com": []string{ + "dns1.example.com.": []string{ "dnslink=/ipns/ipfs.example.com", }, - "dns2.example.com": []string{ + "dns2.example.com.": []string{ "dnslink=/ipns/dns1.example.com", }, - "multi.example.com": []string{ + "multi.example.com.": []string{ "some stuff", "dnslink=/ipns/dns1.example.com", "masked dnslink=/ipns/example.invalid", }, - "equals.example.com": []string{ + "equals.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", }, - "loop1.example.com": []string{ + "loop1.example.com.": []string{ "dnslink=/ipns/loop2.example.com", }, - "loop2.example.com": []string{ + "loop2.example.com.": []string{ "dnslink=/ipns/loop1.example.com", }, - "_dnslink.dloop1.example.com": []string{ + "_dnslink.dloop1.example.com.": []string{ "dnslink=/ipns/loop2.example.com", }, - "_dnslink.dloop2.example.com": []string{ + "_dnslink.dloop2.example.com.": []string{ "dnslink=/ipns/loop1.example.com", }, - "bad.example.com": []string{ + "bad.example.com.": []string{ "dnslink=", }, - "withsegment.example.com": []string{ + "withsegment.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", }, - "withrecsegment.example.com": []string{ + "withrecsegment.example.com.": []string{ "dnslink=/ipns/withsegment.example.com/subsub", }, - "withtrailing.example.com": []string{ + "withtrailing.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/", }, - "withtrailingrec.example.com": []string{ + "withtrailingrec.example.com.": []string{ "dnslink=/ipns/withtrailing.example.com/segment/", }, - "double.example.com": []string{ + "double.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "_dnslink.double.example.com": []string{ + "_dnslink.double.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "double.conflict.com": []string{ + "double.conflict.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "_dnslink.conflict.example.com": []string{ + "_dnslink.conflict.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", }, }, From 3558ff5bddae35f9cf69d7484502fafb65791b27 Mon Sep 17 00:00:00 2001 From: Daniel Aleksandersen Date: Mon, 28 Jan 2019 08:47:51 +0100 Subject: [PATCH 2553/3147] Add FQDN name test License: MIT Signed-off-by: Daniel Aleksandersen This commit was moved from ipfs/go-namesys@3bf774ef781e831fe6c810e1a5f521f0da624e23 --- namesys/dns_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 282906998b..ed28aa9459 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -123,6 +123,9 @@ func newMockDNS() *mockDNS { "_dnslink.conflict.example.com.": []string{ "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", }, + "fqdn.example.com.": []string{ + "dnslink=/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", + }, }, } } @@ -159,4 +162,5 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "withtrailingrec.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/", nil) testResolution(t, r, "double.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "conflict.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", nil) + testResolution(t, r, "fqdn.example.com.", opts.DefaultDepthLimit, "/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", nil) } From 6b2d6ab3cdddb3db4b653e82ac78560e2c1b842f Mon Sep 17 00:00:00 2001 From: Overbool Date: Thu, 13 Dec 2018 23:02:55 +0800 Subject: [PATCH 2554/3147] cmds/pin: use coreapi/pin License: MIT Signed-off-by: Overbool This commit was moved from ipfs/interface-go-ipfs-core@3e1cd71bb97f70a6309fa31f3d9e719c7b38f254 --- coreiface/options/pin.go | 36 +++++++++++++++++++++++++++++++++++- coreiface/pin.go | 2 +- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 9d1107f927..630b561de4 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -8,12 +8,23 @@ type PinLsSettings struct { Type string } +// PinRmSettings represents the settings of pin rm command +type PinRmSettings struct { + Recursive bool + Force bool +} + type PinUpdateSettings struct { Unpin bool } type PinAddOption func(*PinAddSettings) error -type PinLsOption func(settings *PinLsSettings) error + +// PinRmOption pin rm option func +type PinRmOption func(*PinRmSettings) error + +// PinLsOption pin ls option func +type PinLsOption func(*PinLsSettings) error type PinUpdateOption func(*PinUpdateSettings) error func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { @@ -31,6 +42,21 @@ func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { return options, nil } +// PinRmOptions pin rm options +func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) { + options := &PinRmSettings{ + Recursive: true, + } + + for _, opt := range opts { + if err := opt(options); err != nil { + return nil, err + } + } + + return options, nil +} + func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { options := &PinLsSettings{ Type: "all", @@ -102,6 +128,14 @@ func (pinOpts) Recursive(recursive bool) PinAddOption { } } +// RmRecursive is an option for Pin.Rm +func (pinOpts) RmRecursive(recursive bool) PinRmOption { + return func(settings *PinRmSettings) error { + settings.Recursive = recursive + return nil + } +} + // Type is an option for Pin.Ls which allows to specify which pin types should // be returned // diff --git a/coreiface/pin.go b/coreiface/pin.go index 2e119cbeae..6e13def8f5 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -43,7 +43,7 @@ type PinAPI interface { Ls(context.Context, ...options.PinLsOption) ([]Pin, error) // Rm removes pin for object specified by the path - Rm(context.Context, Path) error + Rm(context.Context, Path, ...options.PinRmOption) error // Update changes one pin to another, skipping checks for matching paths in // the old tree From e3960a2b9f8f40403f8ffbce29e576a217dbbf74 Mon Sep 17 00:00:00 2001 From: Overbool Date: Sat, 15 Dec 2018 11:14:29 +0800 Subject: [PATCH 2555/3147] cmds/pin: modify test License: MIT Signed-off-by: Overbool This commit was moved from ipfs/interface-go-ipfs-core@8e9e8d1b419aa93da6f3573bf424db57a60399ae --- coreiface/options/pin.go | 1 - 1 file changed, 1 deletion(-) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 630b561de4..cc4a8ef296 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -11,7 +11,6 @@ type PinLsSettings struct { // PinRmSettings represents the settings of pin rm command type PinRmSettings struct { Recursive bool - Force bool } type PinUpdateSettings struct { From 11fbccb95bed15f9a03ecb3763c80e858c38f16f Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 13 Jul 2018 12:07:17 -0300 Subject: [PATCH 2556/3147] unixfs: decouple the DAG traversal logic from the DAG reader Decouple the DAG traversal logic from the `PBDagReader` encapsulating it in the (new) `Walker` structure. Collapse PB and Buffer DAG readers into one (`dagReader`) removing the `bufdagreader.go` and `pbdagreader.go` files, moving all the code to `dagreader.go`. Remove `TestSeekAndReadLarge` and `TestReadAndCancel` which operated directly on the `NodePromise` structure that is now abstracted away in `NavigableIPLDNode`, in the `go-ipld-format` repo, where they should be recreated. License: MIT Signed-off-by: Lucas Molas This commit was moved from ipfs/go-unixfs@ecd031d34eda4b9f03e0306931308a82b6338420 --- unixfs/archive/tar/writer.go | 6 +- unixfs/io/bufdagreader.go | 39 ---- unixfs/io/dagreader.go | 372 ++++++++++++++++++++++++++++++++++- unixfs/io/dagreader_test.go | 85 -------- unixfs/io/pbdagreader.go | 326 ------------------------------ unixfs/unixfs.go | 53 ++++- 6 files changed, 419 insertions(+), 462 deletions(-) delete mode 100644 unixfs/io/bufdagreader.go delete mode 100644 unixfs/io/pbdagreader.go diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go index bc1253d3d7..0e91ba9b0e 100644 --- a/unixfs/archive/tar/writer.go +++ b/unixfs/archive/tar/writer.go @@ -60,7 +60,11 @@ func (w *Writer) writeFile(nd *mdag.ProtoNode, fsNode *ft.FSNode, fpath string) return err } - dagr := uio.NewPBFileReader(w.ctx, nd, fsNode, w.Dag) + dagr, err := uio.NewDagReader(w.ctx, nd, w.Dag) + if err != nil { + return err + } + if _, err := dagr.WriteTo(w.TarW); err != nil { return err } diff --git a/unixfs/io/bufdagreader.go b/unixfs/io/bufdagreader.go deleted file mode 100644 index 48efe98ad2..0000000000 --- a/unixfs/io/bufdagreader.go +++ /dev/null @@ -1,39 +0,0 @@ -package io - -import ( - "bytes" - "context" -) - -// BufDagReader implements a DagReader that reads from a byte slice -// using a bytes.Reader. It is used for RawNodes. -type BufDagReader struct { - *bytes.Reader -} - -// NewBufDagReader returns a DAG reader for the given byte slice. -// BufDagReader is used to read RawNodes. -func NewBufDagReader(b []byte) *BufDagReader { - return &BufDagReader{bytes.NewReader(b)} -} - -var _ DagReader = (*BufDagReader)(nil) - -// Close is a nop. -func (*BufDagReader) Close() error { - return nil -} - -// CtxReadFull reads the slice onto b. -func (rd *BufDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { - return rd.Read(b) -} - -// Size returns the size of the buffer. -func (rd *BufDagReader) Size() uint64 { - s := rd.Reader.Size() - if s < 0 { - panic("size smaller than 0 (impossible!!)") - } - return uint64(s) -} diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index cf980d2be3..333f7999fb 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -1,13 +1,15 @@ package io import ( + "bytes" "context" "errors" "io" + "io/ioutil" ipld "github.com/ipfs/go-ipld-format" mdag "github.com/ipfs/go-merkledag" - ft "github.com/ipfs/go-unixfs" + unixfs "github.com/ipfs/go-unixfs" ) // Common errors @@ -17,6 +19,10 @@ var ( ErrUnkownNodeType = errors.New("unknown node type") ) +// TODO: Rename the `DagReader` interface, this doesn't read *any* DAG, just +// DAGs with UnixFS node (and it *belongs* to the `unixfs` package). Some +// alternatives: `FileReader`, `UnixFSFileReader`, `UnixFSReader`. + // A DagReader provides read-only read and seek acess to a unixfs file. // Different implementations of readers are used for the different // types of unixfs/protobuf-encoded nodes. @@ -35,24 +41,29 @@ type ReadSeekCloser interface { } // NewDagReader creates a new reader object that reads the data represented by -// the given node, using the passed in DAGService for data retrieval +// the given node, using the passed in DAGService for data retrieval. func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagReader, error) { + var size uint64 + switch n := n.(type) { case *mdag.RawNode: - return NewBufDagReader(n.RawData()), nil + size = uint64(len(n.RawData())) + case *mdag.ProtoNode: - fsNode, err := ft.FSNodeFromBytes(n.Data()) + fsNode, err := unixfs.FSNodeFromBytes(n.Data()) if err != nil { return nil, err } switch fsNode.Type() { - case ft.TDirectory, ft.THAMTShard: + case unixfs.TFile, unixfs.TRaw: + size = fsNode.FileSize() + + case unixfs.TDirectory, unixfs.THAMTShard: // Dont allow reading directories return nil, ErrIsDir - case ft.TFile, ft.TRaw: - return NewPBFileReader(ctx, n, fsNode, serv), nil - case ft.TMetadata: + + case unixfs.TMetadata: if len(n.Links()) == 0 { return nil, errors.New("incorrectly formatted metadata object") } @@ -66,12 +77,353 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe return nil, mdag.ErrNotProtobuf } return NewDagReader(ctx, childpb, serv) - case ft.TSymlink: + case unixfs.TSymlink: return nil, ErrCantReadSymlinks default: - return nil, ft.ErrUnrecognizedType + return nil, unixfs.ErrUnrecognizedType } default: return nil, ErrUnkownNodeType } + + ctxWithCancel, cancel := context.WithCancel(ctx) + + return &dagReader{ + ctx: ctxWithCancel, + cancel: cancel, + serv: serv, + size: size, + rootNode: n, + dagWalker: ipld.NewWalker(ctxWithCancel, ipld.NewNavigableIPLDNode(n, serv)), + }, nil +} + +// dagReader provides a way to easily read the data contained in a dag. +type dagReader struct { + + // Structure to perform the DAG iteration and search, the reader + // just needs to add logic to the `Visitor` callback passed to + // `Iterate` and `Seek`. + dagWalker *ipld.Walker + + // Buffer with the data extracted from the current node being visited. + // To avoid revisiting a node to complete a (potential) partial read + // (or read after seek) the node's data is fully extracted in a single + // `readNodeDataBuffer` operation. + currentNodeData *bytes.Reader + + // Implements the `Size()` API. + size uint64 + + // Current offset for the read head within the DAG file. + offset int64 + + // Root node of the DAG, stored to re-create the `dagWalker` (effectively + // re-setting the position of the reader, used during `Seek`). + rootNode ipld.Node + + // Context passed to the `dagWalker`, the `cancel` function is used to + // cancel read operations (cancelling requested child node promises, + // see `ipld.NavigableIPLDNode.FetchChild` for details). + ctx context.Context + cancel func() + + // Passed to the `dagWalker` that will use it to request nodes. + // TODO: Revisit name. + serv ipld.NodeGetter +} + +// Size returns the total size of the data from the DAG structured file. +func (dr *dagReader) Size() uint64 { + return dr.size +} + +// Read implements the `io.Reader` interface through the `CtxReadFull` +// method using the DAG reader's internal context. +func (dr *dagReader) Read(b []byte) (int, error) { + return dr.CtxReadFull(dr.ctx, b) +} + +// CtxReadFull reads data from the DAG structured file. It always +// attempts a full read of the DAG until the `out` buffer is full. +// It uses the `Walker` structure to iterate the file DAG and read +// every node's data into the `out` buffer. +func (dr *dagReader) CtxReadFull(ctx context.Context, out []byte) (n int, err error) { + // Set the `dagWalker`'s context to the `ctx` argument, it will be used + // to fetch the child node promises (see + // `ipld.NavigableIPLDNode.FetchChild` for details). + dr.dagWalker.SetContext(ctx) + + // If there was a partially read buffer from the last visited + // node read it before visiting a new one. + if dr.currentNodeData != nil { + // TODO: Move this check inside `readNodeDataBuffer`? + n = dr.readNodeDataBuffer(out) + + if n == len(out) { + return n, nil + // Output buffer full, no need to traverse the DAG. + } + } + + // Iterate the DAG calling the passed `Visitor` function on every node + // to read its data into the `out` buffer, stop if there is an error or + // if the entire DAG is traversed (`EndOfDag`). + err = dr.dagWalker.Iterate(func(visitedNode ipld.NavigableNode) error { + node := ipld.ExtractIPLDNode(visitedNode) + + // Skip internal nodes, they shouldn't have any file data + // (see the `balanced` package for more details). + if len(node.Links()) > 0 { + return nil + } + + err = dr.saveNodeData(node) + if err != nil { + return err + } + // Save the leaf node file data in a buffer in case it is only + // partially read now and future `CtxReadFull` calls reclaim the + // rest (as each node is visited only once during `Iterate`). + // + // TODO: We could check if the entire node's data can fit in the + // remaining `out` buffer free space to skip this intermediary step. + + n += dr.readNodeDataBuffer(out[n:]) + + if n == len(out) { + // Output buffer full, no need to keep traversing the DAG, + // signal the `Walker` to pause the iteration. + dr.dagWalker.Pause() + } + + return nil + }) + + if err == ipld.EndOfDag { + return n, io.EOF + // Reached the end of the (DAG) file, no more data to read. + } else if err != nil { + return n, err + // Pass along any other errors from the `Visitor`. + } + + return n, nil +} + +// Save the UnixFS `node`'s data into the internal `currentNodeData` buffer to +// later move it to the output buffer (`Read`) or seek into it (`Seek`). +func (dr *dagReader) saveNodeData(node ipld.Node) error { + extractedNodeData, err := unixfs.ReadUnixFSNodeData(node) + if err != nil { + return err + } + + dr.currentNodeData = bytes.NewReader(extractedNodeData) + return nil +} + +// Read the `currentNodeData` buffer into `out`. This function can't have +// any errors as it's always reading from a `bytes.Reader` and asking only +// the available data in it. +func (dr *dagReader) readNodeDataBuffer(out []byte) int { + + n, _ := dr.currentNodeData.Read(out) + // Ignore the error as the EOF may not be returned in the first + // `Read` call, explicitly ask for an empty buffer below to check + // if we've reached the end. + + if dr.currentNodeData.Len() == 0 { + dr.currentNodeData = nil + // Signal that the buffer was consumed (for later `Read` calls). + // This shouldn't return an EOF error as it's just the end of a + // single node's data, not the entire DAG. + } + + dr.offset += int64(n) + // TODO: Should `offset` be incremented here or in the calling function? + // (Doing it here saves LoC but may be confusing as it's more hidden). + + return n +} + +// WriteTo writes to the given writer. +// +// TODO: Improve performance. It would be better to progressively +// write each node to the writer on every visit instead of allocating +// a huge buffer, that would imply defining a `Visitor` very similar +// to the one used in `CtxReadFull` (that would write to the `io.Writer` +// instead of the reading into the `currentNodeData` buffer). More +// consideration is needed to restructure those two `Visitor` functions +// to avoid repeating code. +func (dr *dagReader) WriteTo(w io.Writer) (int64, error) { + writeBuf, err := ioutil.ReadAll(dr) + if err != nil { + return 0, err + } + return bytes.NewReader(writeBuf).WriteTo(w) +} + +// Close the reader (cancelling fetch node operations requested with +// the internal context, that is, `Read` calls but not `CtxReadFull` +// with user-supplied contexts). +func (dr *dagReader) Close() error { + dr.cancel() + return nil +} + +// Seek implements `io.Seeker` seeking to a given offset in the DAG file, +// it matches the standard unix `seek`. It moves the position of the internal +// `dagWalker` and may also leave a `currentNodeData` buffer loaded in case +// the seek is performed to the middle of the data in a node. +// +// TODO: Support seeking from the current position (relative seek) +// through the `dagWalker` in `io.SeekCurrent`. +func (dr *dagReader) Seek(offset int64, whence int) (int64, error) { + switch whence { + case io.SeekStart: + if offset < 0 { + return -1, errors.New("invalid offset") + } + + if offset == dr.offset { + return offset, nil + // Already at the requested `offset`, nothing to do. + } + + left := offset + // Amount left to seek. + + // Seek from the beginning of the DAG. + dr.resetPosition() + + // Use the internal reader's context to fetch the child node promises + // (see `ipld.NavigableIPLDNode.FetchChild` for details). + dr.dagWalker.SetContext(dr.ctx) + // TODO: Performance: we could adjust here `preloadSize` of + // `ipld.NavigableIPLDNode` also, when seeking we only want + // to fetch one child at a time. + + // Seek the DAG by calling the provided `Visitor` function on every + // node the `dagWalker` descends to while searching which can be + // either an internal or leaf node. In the internal node case, check + // the child node sizes and set the corresponding child index to go + // down to next. In the leaf case (last visit of the search), if there + // is still an amount `left` to seek do it inside the node's data + // saved in the `currentNodeData` buffer, leaving it ready for a `Read` + // call. + err := dr.dagWalker.Seek(func(visitedNode ipld.NavigableNode) error { + node := ipld.ExtractIPLDNode(visitedNode) + + if len(node.Links()) > 0 { + // Internal node, should be a `mdag.ProtoNode` containing a + // `unixfs.FSNode` (see the `balanced` package for more details). + fsNode, err := unixfs.ExtractFSNode(node) + if err != nil { + return err + } + + // If there aren't enough size hints don't seek + // (see the `io.EOF` handling error comment below). + if fsNode.NumChildren() != len(node.Links()) { + return io.EOF + } + + // Internal nodes have no data, so just iterate through the + // sizes of its children (advancing the child index of the + // `dagWalker`) to find where we need to go down to next in + // the search. + for { + childSize := fsNode.BlockSize(int(dr.dagWalker.ActiveChildIndex())) + + if childSize > uint64(left) { + // This child's data contains the position requested + // in `offset`, go down this child. + return nil + } + + // Else, skip this child. + left -= int64(childSize) + err := dr.dagWalker.NextChild() + if err == ipld.ErrNextNoChild { + // No more child nodes available, nothing to do, + // the `Seek` will stop on its own. + return nil + } else if err != nil { + return err + // Pass along any other errors (that may in future + // implementations be returned by `Next`) to stop + // the search. + } + } + + } else { + // Leaf node, seek inside its data. + err := dr.saveNodeData(node) + if err != nil { + return err + } + + _, err = dr.currentNodeData.Seek(left, io.SeekStart) + if err != nil { + return err + } + // The corner case of a DAG consisting only of a single (leaf) + // node should make no difference here. In that case, where the + // node doesn't have a parent UnixFS node with size hints, this + // implementation would allow this `Seek` to be called with an + // argument larger than the buffer size which normally wouldn't + // happen (because we would skip the node based on the size + // hint) but that would just mean that a future `CtxReadFull` + // call would read no data from the `currentNodeData` buffer. + // TODO: Re-check this reasoning. + + return nil + // In the leaf node case the search will stop here. + } + }) + + if err == io.EOF { + // TODO: Taken from https://github.com/ipfs/go-ipfs/pull/4320, + // check if still valid. + // Return negative number if we can't figure out the file size. Using io.EOF + // for this seems to be good(-enough) solution as it's only returned by + // precalcNextBuf when we step out of file range. + // This is needed for gateway to function properly + return -1, nil + } + + if err != nil { + return 0, err + } + + dr.offset = offset + return dr.offset, nil + + case io.SeekCurrent: + if offset == 0 { + return dr.offset, nil + } + + return dr.Seek(dr.offset+offset, io.SeekStart) + // TODO: Performance. This can be improved supporting relative + // searches in the `Walker` (see `Walker.Seek`). + + case io.SeekEnd: + return dr.Seek(int64(dr.Size())-offset, io.SeekStart) + + default: + return 0, errors.New("invalid whence") + } +} + +// Reset the reader position by resetting the `dagWalker` and discarding +// any partially used node's data in the `currentNodeData` buffer, used +// in the `SeekStart` case. +func (dr *dagReader) resetPosition() { + dr.currentNodeData = nil + + dr.dagWalker = ipld.NewWalker(dr.ctx, ipld.NewNavigableIPLDNode(dr.rootNode, dr.serv)) + // TODO: This could be avoided (along with storing the `dr.rootNode` and + // `dr.serv` just for this call) if `Reset` is supported in the `Walker`. } diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 6e1fef8d04..d79d2d1f51 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -4,7 +4,6 @@ import ( "bytes" "io" "io/ioutil" - "math/rand" "strings" "testing" @@ -73,90 +72,6 @@ func TestSeekAndRead(t *testing.T) { } } -func TestSeekAndReadLarge(t *testing.T) { - dserv := testu.GetDAGServ() - inbuf := make([]byte, 20000) - rand.Read(inbuf) - - node := testu.GetNode(t, dserv, inbuf, testu.UseProtoBufLeaves) - ctx, closer := context.WithCancel(context.Background()) - defer closer() - - reader, err := NewDagReader(ctx, node, dserv) - if err != nil { - t.Fatal(err) - } - - _, err = reader.Seek(10000, io.SeekStart) - if err != nil { - t.Fatal(err) - } - - buf := make([]byte, 100) - _, err = io.ReadFull(reader, buf) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(buf, inbuf[10000:10100]) { - t.Fatal("seeked read failed") - } - - pbdr := reader.(*PBDagReader) - var count int - for i, p := range pbdr.promises { - if i > 20 && i < 30 { - if p == nil { - t.Fatal("expected index to be not nil: ", i) - } - count++ - } else { - if p != nil { - t.Fatal("expected index to be nil: ", i) - } - } - } - // -1 because we read some and it cleared one - if count != preloadSize-1 { - t.Fatalf("expected %d preloaded promises, got %d", preloadSize-1, count) - } -} - -func TestReadAndCancel(t *testing.T) { - dserv := testu.GetDAGServ() - inbuf := make([]byte, 20000) - rand.Read(inbuf) - - node := testu.GetNode(t, dserv, inbuf, testu.UseProtoBufLeaves) - ctx, closer := context.WithCancel(context.Background()) - defer closer() - - reader, err := NewDagReader(ctx, node, dserv) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithCancel(context.Background()) - buf := make([]byte, 100) - _, err = reader.CtxReadFull(ctx, buf) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(buf, inbuf[0:100]) { - t.Fatal("read failed") - } - cancel() - - b, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(inbuf[100:], b) { - t.Fatal("buffers not equal") - } -} - func TestRelativeSeek(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) diff --git a/unixfs/io/pbdagreader.go b/unixfs/io/pbdagreader.go deleted file mode 100644 index bea5f496e9..0000000000 --- a/unixfs/io/pbdagreader.go +++ /dev/null @@ -1,326 +0,0 @@ -package io - -import ( - "context" - "errors" - "fmt" - "io" - - cid "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" - mdag "github.com/ipfs/go-merkledag" - ft "github.com/ipfs/go-unixfs" -) - -// PBDagReader provides a way to easily read the data contained in a dag. -type PBDagReader struct { - serv ipld.NodeGetter - - // UnixFS file (it should be of type `Data_File` or `Data_Raw` only). - file *ft.FSNode - - // the current data buffer to be read from - // will either be a bytes.Reader or a child DagReader - buf ReadSeekCloser - - // NodePromises for each of 'nodes' child links - promises []*ipld.NodePromise - - // the cid of each child of the current node - links []cid.Cid - - // the index of the child link currently being read from - linkPosition int - - // current offset for the read head within the 'file' - offset int64 - - // Our context - ctx context.Context - - // context cancel for children - cancel func() -} - -var _ DagReader = (*PBDagReader)(nil) - -// NewPBFileReader constructs a new PBFileReader. -func NewPBFileReader(ctx context.Context, n *mdag.ProtoNode, file *ft.FSNode, serv ipld.NodeGetter) *PBDagReader { - fctx, cancel := context.WithCancel(ctx) - curLinks := getLinkCids(n) - return &PBDagReader{ - serv: serv, - buf: NewBufDagReader(file.Data()), - promises: make([]*ipld.NodePromise, len(curLinks)), - links: curLinks, - ctx: fctx, - cancel: cancel, - file: file, - } -} - -const preloadSize = 10 - -func (dr *PBDagReader) preload(ctx context.Context, beg int) { - end := beg + preloadSize - if end >= len(dr.links) { - end = len(dr.links) - } - - copy(dr.promises[beg:], ipld.GetNodes(ctx, dr.serv, dr.links[beg:end])) -} - -// precalcNextBuf follows the next link in line and loads it from the -// DAGService, setting the next buffer to read from -func (dr *PBDagReader) precalcNextBuf(ctx context.Context) error { - if dr.buf != nil { - dr.buf.Close() // Just to make sure - dr.buf = nil - } - - if dr.linkPosition >= len(dr.promises) { - return io.EOF - } - - // If we drop to <= preloadSize/2 preloading nodes, preload the next 10. - for i := dr.linkPosition; i < dr.linkPosition+preloadSize/2 && i < len(dr.promises); i++ { - // TODO: check if canceled. - if dr.promises[i] == nil { - dr.preload(ctx, i) - break - } - } - - nxt, err := dr.promises[dr.linkPosition].Get(ctx) - dr.promises[dr.linkPosition] = nil - switch err { - case nil: - case context.DeadlineExceeded, context.Canceled: - err = ctx.Err() - if err != nil { - return ctx.Err() - } - // In this case, the context used to *preload* the node has been canceled. - // We need to retry the load with our context and we might as - // well preload some extra nodes while we're at it. - // - // Note: When using `Read`, this code will never execute as - // `Read` will use the global context. It only runs if the user - // explicitly reads with a custom context (e.g., by calling - // `CtxReadFull`). - dr.preload(ctx, dr.linkPosition) - nxt, err = dr.promises[dr.linkPosition].Get(ctx) - dr.promises[dr.linkPosition] = nil - if err != nil { - return err - } - default: - return err - } - - dr.linkPosition++ - - return dr.loadBufNode(nxt) -} - -func (dr *PBDagReader) loadBufNode(node ipld.Node) error { - switch node := node.(type) { - case *mdag.ProtoNode: - fsNode, err := ft.FSNodeFromBytes(node.Data()) - if err != nil { - return fmt.Errorf("incorrectly formatted protobuf: %s", err) - } - - switch fsNode.Type() { - case ft.TFile: - dr.buf = NewPBFileReader(dr.ctx, node, fsNode, dr.serv) - return nil - case ft.TRaw: - dr.buf = NewBufDagReader(fsNode.Data()) - return nil - default: - return fmt.Errorf("found %s node in unexpected place", fsNode.Type().String()) - } - case *mdag.RawNode: - dr.buf = NewBufDagReader(node.RawData()) - return nil - default: - return ErrUnkownNodeType - } -} - -func getLinkCids(n ipld.Node) []cid.Cid { - links := n.Links() - out := make([]cid.Cid, 0, len(links)) - for _, l := range links { - out = append(out, l.Cid) - } - return out -} - -// Size return the total length of the data from the DAG structured file. -func (dr *PBDagReader) Size() uint64 { - return dr.file.FileSize() -} - -// Read reads data from the DAG structured file -func (dr *PBDagReader) Read(b []byte) (int, error) { - return dr.CtxReadFull(dr.ctx, b) -} - -// CtxReadFull reads data from the DAG structured file -func (dr *PBDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) { - if dr.buf == nil { - if err := dr.precalcNextBuf(ctx); err != nil { - return 0, err - } - } - - // If no cached buffer, load one - total := 0 - for { - // Attempt to fill bytes from cached buffer - n, err := io.ReadFull(dr.buf, b[total:]) - total += n - dr.offset += int64(n) - switch err { - // io.EOF will happen is dr.buf had noting more to read (n == 0) - case io.EOF, io.ErrUnexpectedEOF: - // do nothing - case nil: - return total, nil - default: - return total, err - } - - // if we are not done with the output buffer load next block - err = dr.precalcNextBuf(ctx) - if err != nil { - return total, err - } - } -} - -// WriteTo writes to the given writer. -func (dr *PBDagReader) WriteTo(w io.Writer) (int64, error) { - if dr.buf == nil { - if err := dr.precalcNextBuf(dr.ctx); err != nil { - return 0, err - } - } - - // If no cached buffer, load one - total := int64(0) - for { - // Attempt to write bytes from cached buffer - n, err := dr.buf.WriteTo(w) - total += n - dr.offset += n - if err != nil { - if err != io.EOF { - return total, err - } - } - - // Otherwise, load up the next block - err = dr.precalcNextBuf(dr.ctx) - if err != nil { - if err == io.EOF { - return total, nil - } - return total, err - } - } -} - -// Close closes the reader. -func (dr *PBDagReader) Close() error { - dr.cancel() - return nil -} - -// Seek implements io.Seeker, and will seek to a given offset in the file -// interface matches standard unix seek -// TODO: check if we can do relative seeks, to reduce the amount of dagreader -// recreations that need to happen. -func (dr *PBDagReader) Seek(offset int64, whence int) (int64, error) { - switch whence { - case io.SeekStart: - if offset < 0 { - return -1, errors.New("invalid offset") - } - if offset == dr.offset { - return offset, nil - } - - // left represents the number of bytes remaining to seek to (from beginning) - left := offset - if int64(len(dr.file.Data())) >= offset { - // Close current buf to close potential child dagreader - if dr.buf != nil { - dr.buf.Close() - } - dr.buf = NewBufDagReader(dr.file.Data()[offset:]) - - // start reading links from the beginning - dr.linkPosition = 0 - dr.offset = offset - return offset, nil - } - - // skip past root block data - left -= int64(len(dr.file.Data())) - - // iterate through links and find where we need to be - for i := 0; i < dr.file.NumChildren(); i++ { - if dr.file.BlockSize(i) > uint64(left) { - dr.linkPosition = i - break - } else { - left -= int64(dr.file.BlockSize(i)) - } - } - - // start sub-block request - err := dr.precalcNextBuf(dr.ctx) - if err != nil { - return 0, err - } - - // set proper offset within child readseeker - n, err := dr.buf.Seek(left, io.SeekStart) - if err != nil { - return -1, err - } - - // sanity - left -= n - if left != 0 { - return -1, errors.New("failed to seek properly") - } - dr.offset = offset - return offset, nil - case io.SeekCurrent: - // TODO: be smarter here - if offset == 0 { - return dr.offset, nil - } - - noffset := dr.offset + offset - return dr.Seek(noffset, io.SeekStart) - case io.SeekEnd: - noffset := int64(dr.file.FileSize()) - offset - n, err := dr.Seek(noffset, io.SeekStart) - - // Return negative number if we can't figure out the file size. Using io.EOF - // for this seems to be good(-enough) solution as it's only returned by - // precalcNextBuf when we step out of file range. - // This is needed for gateway to function properly - if err == io.EOF && dr.file.Type() == ft.TFile { - return -1, nil - } - return n, err - default: - return 0, errors.New("invalid whence") - } -} diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 4ee755186b..84caf6f44e 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -5,9 +5,9 @@ package unixfs import ( "errors" + "fmt" proto "github.com/gogo/protobuf/proto" - dag "github.com/ipfs/go-merkledag" ipld "github.com/ipfs/go-ipld-format" @@ -355,3 +355,54 @@ func BytesForMetadata(m *Metadata) ([]byte, error) { func EmptyDirNode() *dag.ProtoNode { return dag.NodeWithData(FolderPBData()) } + +// ReadUnixFSNodeData extracts the UnixFS data from an IPLD node. +// Raw nodes are (also) processed because they are used as leaf +// nodes containing (only) UnixFS data. +func ReadUnixFSNodeData(node ipld.Node) (data []byte, err error) { + switch node := node.(type) { + + case *dag.ProtoNode: + fsNode, err := FSNodeFromBytes(node.Data()) + if err != nil { + return nil, fmt.Errorf("incorrectly formatted protobuf: %s", err) + } + + switch fsNode.Type() { + case pb.Data_File, pb.Data_Raw: + return fsNode.Data(), nil + // Only leaf nodes (of type `Data_Raw`) contain data but due to a + // bug the `Data_File` type (normally used for internal nodes) is + // also used for leaf nodes, so both types are accepted here + // (see the `balanced` package for more details). + default: + return nil, fmt.Errorf("found %s node in unexpected place", + fsNode.Type().String()) + } + + case *dag.RawNode: + return node.RawData(), nil + + default: + return nil, ErrUnrecognizedType + // TODO: To avoid rewriting the error message, but a different error from + // `unixfs.ErrUnrecognizedType` should be used (defining it in the + // `merkledag` or `go-ipld-format` packages). + } +} + +// Extract the `unixfs.FSNode` from the `ipld.Node` (assuming this +// was implemented by a `mdag.ProtoNode`). +func ExtractFSNode(node ipld.Node) (*FSNode, error) { + protoNode, ok := node.(*dag.ProtoNode) + if !ok { + return nil, errors.New("expected a ProtoNode as internal node") + } + + fsNode, err := FSNodeFromBytes(protoNode.Data()) + if err != nil { + return nil, err + } + + return fsNode, nil +} From 5dcc2c65010d385c0c5de4c0bab81b8d3fce7ff9 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 18 Jan 2019 13:14:04 -0300 Subject: [PATCH 2557/3147] io: implement a performant `WriteTo` version in the DAG reader This version writes one node at a time instead of first buffering the entire file contents in a single array (taking up too much memory) before actually writing it. This commit was moved from ipfs/go-unixfs@ac466e6663cc3b3615991235ceccc3ba42477cb2 --- unixfs/io/dagreader.go | 93 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 80 insertions(+), 13 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 333f7999fb..d5de73661e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -5,7 +5,6 @@ import ( "context" "errors" "io" - "io/ioutil" ipld "github.com/ipfs/go-ipld-format" mdag "github.com/ipfs/go-merkledag" @@ -247,21 +246,89 @@ func (dr *dagReader) readNodeDataBuffer(out []byte) int { return n } -// WriteTo writes to the given writer. +// Similar to `readNodeDataBuffer` but it writes the contents to +// an `io.Writer` argument. // -// TODO: Improve performance. It would be better to progressively -// write each node to the writer on every visit instead of allocating -// a huge buffer, that would imply defining a `Visitor` very similar -// to the one used in `CtxReadFull` (that would write to the `io.Writer` -// instead of the reading into the `currentNodeData` buffer). More -// consideration is needed to restructure those two `Visitor` functions -// to avoid repeating code. -func (dr *dagReader) WriteTo(w io.Writer) (int64, error) { - writeBuf, err := ioutil.ReadAll(dr) +// TODO: Check what part of the logic between the two functions +// can be extracted away. +func (dr *dagReader) writeNodeDataBuffer(w io.Writer) (int64, error) { + + n, err := dr.currentNodeData.WriteTo(w) if err != nil { - return 0, err + return n, err + } + + if dr.currentNodeData.Len() == 0 { + dr.currentNodeData = nil + // Signal that the buffer was consumed (for later `Read` calls). + // This shouldn't return an EOF error as it's just the end of a + // single node's data, not the entire DAG. } - return bytes.NewReader(writeBuf).WriteTo(w) + + dr.offset += int64(n) + return n, nil +} + +// WriteTo writes to the given writer. +// This follows the `bytes.Reader.WriteTo` implementation +// where it starts from the internal index that may have +// been modified by other `Read` calls. +// +// TODO: This implementation is very similar to `CtxReadFull`, +// the common parts should be abstracted away. +func (dr *dagReader) WriteTo(w io.Writer) (n int64, err error) { + // Use the internal reader's context to fetch the child node promises + // (see `ipld.NavigableIPLDNode.FetchChild` for details). + dr.dagWalker.SetContext(dr.ctx) + + // If there was a partially read buffer from the last visited + // node read it before visiting a new one. + if dr.currentNodeData != nil { + n, err = dr.writeNodeDataBuffer(w) + if err != nil { + return n, err + } + } + + // Iterate the DAG calling the passed `Visitor` function on every node + // to read its data into the `out` buffer, stop if there is an error or + // if the entire DAG is traversed (`EndOfDag`). + err = dr.dagWalker.Iterate(func(visitedNode ipld.NavigableNode) error { + node := ipld.ExtractIPLDNode(visitedNode) + + // Skip internal nodes, they shouldn't have any file data + // (see the `balanced` package for more details). + if len(node.Links()) > 0 { + return nil + } + + err = dr.saveNodeData(node) + if err != nil { + return err + } + // Save the leaf node file data in a buffer in case it is only + // partially read now and future `CtxReadFull` calls reclaim the + // rest (as each node is visited only once during `Iterate`). + + written, err := dr.writeNodeDataBuffer(w) + n += written + if err != nil { + return err + } + + return nil + }) + + if err == ipld.EndOfDag { + return n, io.EOF + // Reached the end of the (DAG) file, no more data to read. + // TODO: Is this a correct return error for `WriteTo`? + } else if err != nil { + return n, err + // Pass along any other errors from the `Visitor`. + } + + return n, nil } // Close the reader (cancelling fetch node operations requested with From 112da791a6dc321029c2cb34adb7f139553be427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 28 Jan 2019 18:13:57 +0100 Subject: [PATCH 2558/3147] io: return nil when EOF is reached in WriteTo This commit was moved from ipfs/go-unixfs@9dacd09aadb6b5e9110838bb503e6b949ca2fce9 --- unixfs/io/dagreader.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index d5de73661e..8a6475ab14 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -320,15 +320,10 @@ func (dr *dagReader) WriteTo(w io.Writer) (n int64, err error) { }) if err == ipld.EndOfDag { - return n, io.EOF - // Reached the end of the (DAG) file, no more data to read. - // TODO: Is this a correct return error for `WriteTo`? - } else if err != nil { - return n, err - // Pass along any other errors from the `Visitor`. + return n, nil } - return n, nil + return n, err } // Close the reader (cancelling fetch node operations requested with From ca2496aff20dde4e4f7a7d994a2e780835a4925a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 28 Jan 2019 18:16:11 +0100 Subject: [PATCH 2559/3147] io: correctly handle seek offset with io.SeekEnd This commit was moved from ipfs/go-unixfs@cdb64d5a2a22520819745e256a6eb70b4309bd09 --- unixfs/io/dagreader.go | 2 +- unixfs/io/dagreader_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8a6475ab14..75fb5c714d 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -472,7 +472,7 @@ func (dr *dagReader) Seek(offset int64, whence int) (int64, error) { // searches in the `Walker` (see `Walker.Seek`). case io.SeekEnd: - return dr.Seek(int64(dr.Size())-offset, io.SeekStart) + return dr.Seek(int64(dr.Size())+offset, io.SeekStart) default: return 0, errors.New("invalid whence") diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index d79d2d1f51..884ae332d3 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -107,7 +107,7 @@ func TestRelativeSeek(t *testing.T) { } } - _, err = reader.Seek(4, io.SeekEnd) + _, err = reader.Seek(-4, io.SeekEnd) if err != nil { t.Fatal(err) } From 620b4e2181ea25c55d05a6914e3d87894c2146f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 24 Jan 2019 19:24:18 +0100 Subject: [PATCH 2560/3147] archive: use files instead of ipld This commit was moved from ipfs/go-unixfs@cf8e7c8a2424273a6076472151b93436df4c5151 --- unixfs/archive/archive.go | 118 ++++++++++++++++++++++++---- unixfs/archive/tar/writer.go | 146 ----------------------------------- 2 files changed, 105 insertions(+), 159 deletions(-) delete mode 100644 unixfs/archive/tar/writer.go diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 6396ca0aee..19af431a0a 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -2,16 +2,16 @@ package archive import ( + "archive/tar" "bufio" "compress/gzip" - "context" + "errors" + "fmt" "io" "path" + "time" - tar "github.com/ipfs/go-unixfs/archive/tar" - uio "github.com/ipfs/go-unixfs/io" - - ipld "github.com/ipfs/go-ipld-format" + files "github.com/ipfs/go-ipfs-files" ) // DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. @@ -31,8 +31,7 @@ func (i *identityWriteCloser) Close() error { } // DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` -func DagArchive(ctx context.Context, nd ipld.Node, name string, dag ipld.DAGService, archive bool, compression int) (io.Reader, error) { - +func FileArchive(f files.Node, name string, archive bool, compression int) (io.Reader, error) { cleaned := path.Clean(name) _, filename := path.Split(cleaned) @@ -67,13 +66,13 @@ func DagArchive(ctx context.Context, nd ipld.Node, name string, dag ipld.DAGServ if !archive && compression != gzip.NoCompression { // the case when the node is a file - dagr, err := uio.NewDagReader(ctx, nd, dag) - if checkErrAndClosePipe(err) { - return nil, err + r := files.ToFile(f) + if r == nil { + return nil, errors.New("file is not regular") } go func() { - if _, err := dagr.WriteTo(maybeGzw); checkErrAndClosePipe(err) { + if _, err := io.Copy(maybeGzw, r); checkErrAndClosePipe(err) { return } closeGzwAndPipe() // everything seems to be ok @@ -82,14 +81,14 @@ func DagArchive(ctx context.Context, nd ipld.Node, name string, dag ipld.DAGServ // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format // construct the tar writer - w, err := tar.NewWriter(ctx, dag, maybeGzw) + w, err := NewWriter(maybeGzw) if checkErrAndClosePipe(err) { return nil, err } go func() { // write all the nodes recursively - if err := w.WriteNode(nd, filename); checkErrAndClosePipe(err) { + if err := w.WriteFile(f, filename); checkErrAndClosePipe(err) { return } w.Close() // close tar writer @@ -106,3 +105,96 @@ func newMaybeGzWriter(w io.Writer, compression int) (io.WriteCloser, error) { } return &identityWriteCloser{w}, nil } + +type Writer struct { + + TarW *tar.Writer +} + +// NewWriter wraps given io.Writer. +func NewWriter(w io.Writer) (*Writer, error) { + return &Writer{ + TarW: tar.NewWriter(w), + }, nil +} + +func (w *Writer) writeDir(f files.Directory, fpath string) error { + if err := writeDirHeader(w.TarW, fpath); err != nil { + return err + } + + it := f.Entries() + for it.Next() { + if err := w.WriteFile(it.Node(), path.Join(fpath, it.Name())); err != nil { + return err + } + } + return it.Err() +} + +func (w *Writer) writeFile(f files.File, fpath string) error { + size, err := f.Size() + if err != nil { + return err + } + + if err := writeFileHeader(w.TarW, fpath, uint64(size)); err != nil { + return err + } + + if _, err := io.Copy(w.TarW, f); err != nil { + return err + } + w.TarW.Flush() + return nil +} + +// WriteNode adds a node to the archive. +func (w *Writer) WriteFile(nd files.Node, fpath string) error { + switch nd := nd.(type) { + case *files.Symlink: + return writeSymlinkHeader(w.TarW, nd.Target, fpath) + case files.File: + return w.writeFile(nd, fpath) + case files.Directory: + return w.writeDir(nd, fpath) + default: + return fmt.Errorf("file type %T is not supported", nd) + } +} + +// Close closes the tar writer. +func (w *Writer) Close() error { + return w.TarW.Close() +} + +func writeDirHeader(w *tar.Writer, fpath string) error { + return w.WriteHeader(&tar.Header{ + Name: fpath, + Typeflag: tar.TypeDir, + Mode: 0777, + ModTime: time.Now(), + // TODO: set mode, dates, etc. when added to unixFS + }) +} + +func writeFileHeader(w *tar.Writer, fpath string, size uint64) error { + return w.WriteHeader(&tar.Header{ + Name: fpath, + Size: int64(size), + Typeflag: tar.TypeReg, + Mode: 0644, + ModTime: time.Now(), + // TODO: set mode, dates, etc. when added to unixFS + }) +} + +func writeSymlinkHeader(w *tar.Writer, target, fpath string) error { + return w.WriteHeader(&tar.Header{ + Name: fpath, + Linkname: target, + Mode: 0777, + Typeflag: tar.TypeSymlink, + }) +} + diff --git a/unixfs/archive/tar/writer.go b/unixfs/archive/tar/writer.go deleted file mode 100644 index 0e91ba9b0e..0000000000 --- a/unixfs/archive/tar/writer.go +++ /dev/null @@ -1,146 +0,0 @@ -// Package tar provides functionality to write a unixfs merkledag -// as a tar archive. -package tar - -import ( - "archive/tar" - "context" - "fmt" - "io" - "path" - "time" - - mdag "github.com/ipfs/go-merkledag" - ft "github.com/ipfs/go-unixfs" - uio "github.com/ipfs/go-unixfs/io" - - ipld "github.com/ipfs/go-ipld-format" -) - -// Writer is a utility structure that helps to write -// unixfs merkledag nodes as a tar archive format. -// It wraps any io.Writer. -type Writer struct { - Dag ipld.DAGService - TarW *tar.Writer - - ctx context.Context -} - -// NewWriter wraps given io.Writer. -func NewWriter(ctx context.Context, dag ipld.DAGService, w io.Writer) (*Writer, error) { - return &Writer{ - Dag: dag, - TarW: tar.NewWriter(w), - ctx: ctx, - }, nil -} - -func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error { - dir, err := uio.NewDirectoryFromNode(w.Dag, nd) - if err != nil { - return err - } - if err := writeDirHeader(w.TarW, fpath); err != nil { - return err - } - - return dir.ForEachLink(w.ctx, func(l *ipld.Link) error { - child, err := w.Dag.Get(w.ctx, l.Cid) - if err != nil { - return err - } - npath := path.Join(fpath, l.Name) - return w.WriteNode(child, npath) - }) -} - -func (w *Writer) writeFile(nd *mdag.ProtoNode, fsNode *ft.FSNode, fpath string) error { - if err := writeFileHeader(w.TarW, fpath, fsNode.FileSize()); err != nil { - return err - } - - dagr, err := uio.NewDagReader(w.ctx, nd, w.Dag) - if err != nil { - return err - } - - if _, err := dagr.WriteTo(w.TarW); err != nil { - return err - } - w.TarW.Flush() - return nil -} - -// WriteNode adds a node to the archive. -func (w *Writer) WriteNode(nd ipld.Node, fpath string) error { - switch nd := nd.(type) { - case *mdag.ProtoNode: - fsNode, err := ft.FSNodeFromBytes(nd.Data()) - if err != nil { - return err - } - - switch fsNode.Type() { - case ft.TMetadata: - fallthrough - case ft.TDirectory, ft.THAMTShard: - return w.writeDir(nd, fpath) - case ft.TRaw: - fallthrough - case ft.TFile: - return w.writeFile(nd, fsNode, fpath) - case ft.TSymlink: - return writeSymlinkHeader(w.TarW, string(fsNode.Data()), fpath) - default: - return ft.ErrUnrecognizedType - } - case *mdag.RawNode: - if err := writeFileHeader(w.TarW, fpath, uint64(len(nd.RawData()))); err != nil { - return err - } - - if _, err := w.TarW.Write(nd.RawData()); err != nil { - return err - } - w.TarW.Flush() - return nil - default: - return fmt.Errorf("nodes of type %T are not supported in unixfs", nd) - } -} - -// Close closes the tar writer. -func (w *Writer) Close() error { - return w.TarW.Close() -} - -func writeDirHeader(w *tar.Writer, fpath string) error { - return w.WriteHeader(&tar.Header{ - Name: fpath, - Typeflag: tar.TypeDir, - Mode: 0777, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) -} - -func writeFileHeader(w *tar.Writer, fpath string, size uint64) error { - return w.WriteHeader(&tar.Header{ - Name: fpath, - Size: int64(size), - Typeflag: tar.TypeReg, - Mode: 0644, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) -} - -func writeSymlinkHeader(w *tar.Writer, target, fpath string) error { - return w.WriteHeader(&tar.Header{ - Name: fpath, - Linkname: target, - Mode: 0777, - Typeflag: tar.TypeSymlink, - }) -} From e5205c486694dad9f040999867c99472a72fdc01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 24 Jan 2019 20:36:18 +0100 Subject: [PATCH 2561/3147] generate archives from files instead of dag nodes This commit was moved from ipfs/go-unixfs@de8cb1497905d51fd13d6165ba0069a596ccbe70 --- unixfs/archive/archive.go | 97 +-------------------------------------- 1 file changed, 1 insertion(+), 96 deletions(-) diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go index 19af431a0a..c90e3e859d 100644 --- a/unixfs/archive/archive.go +++ b/unixfs/archive/archive.go @@ -2,14 +2,11 @@ package archive import ( - "archive/tar" "bufio" "compress/gzip" "errors" - "fmt" "io" "path" - "time" files "github.com/ipfs/go-ipfs-files" ) @@ -81,7 +78,7 @@ func FileArchive(f files.Node, name string, archive bool, compression int) (io.R // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format // construct the tar writer - w, err := NewWriter(maybeGzw) + w, err := files.NewTarWriter(maybeGzw) if checkErrAndClosePipe(err) { return nil, err } @@ -106,95 +103,3 @@ func newMaybeGzWriter(w io.Writer, compression int) (io.WriteCloser, error) { return &identityWriteCloser{w}, nil } -type Writer struct { - - TarW *tar.Writer -} - -// NewWriter wraps given io.Writer. -func NewWriter(w io.Writer) (*Writer, error) { - return &Writer{ - TarW: tar.NewWriter(w), - }, nil -} - -func (w *Writer) writeDir(f files.Directory, fpath string) error { - if err := writeDirHeader(w.TarW, fpath); err != nil { - return err - } - - it := f.Entries() - for it.Next() { - if err := w.WriteFile(it.Node(), path.Join(fpath, it.Name())); err != nil { - return err - } - } - return it.Err() -} - -func (w *Writer) writeFile(f files.File, fpath string) error { - size, err := f.Size() - if err != nil { - return err - } - - if err := writeFileHeader(w.TarW, fpath, uint64(size)); err != nil { - return err - } - - if _, err := io.Copy(w.TarW, f); err != nil { - return err - } - w.TarW.Flush() - return nil -} - -// WriteNode adds a node to the archive. -func (w *Writer) WriteFile(nd files.Node, fpath string) error { - switch nd := nd.(type) { - case *files.Symlink: - return writeSymlinkHeader(w.TarW, nd.Target, fpath) - case files.File: - return w.writeFile(nd, fpath) - case files.Directory: - return w.writeDir(nd, fpath) - default: - return fmt.Errorf("file type %T is not supported", nd) - } -} - -// Close closes the tar writer. -func (w *Writer) Close() error { - return w.TarW.Close() -} - -func writeDirHeader(w *tar.Writer, fpath string) error { - return w.WriteHeader(&tar.Header{ - Name: fpath, - Typeflag: tar.TypeDir, - Mode: 0777, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) -} - -func writeFileHeader(w *tar.Writer, fpath string, size uint64) error { - return w.WriteHeader(&tar.Header{ - Name: fpath, - Size: int64(size), - Typeflag: tar.TypeReg, - Mode: 0644, - ModTime: time.Now(), - // TODO: set mode, dates, etc. when added to unixFS - }) -} - -func writeSymlinkHeader(w *tar.Writer, target, fpath string) error { - return w.WriteHeader(&tar.Header{ - Name: fpath, - Linkname: target, - Mode: 0777, - Typeflag: tar.TypeSymlink, - }) -} - From 69fd88577161414157919a1c82f1c8aa5cedb3fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 24 Jan 2019 20:36:44 +0100 Subject: [PATCH 2562/3147] move unixfile here from go-ipfs This commit was moved from ipfs/go-unixfs@7dbe59d5c78caa2e588768899a6b10b0edc96656 --- unixfs/file/unixfile.go | 181 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 unixfs/file/unixfile.go diff --git a/unixfs/file/unixfile.go b/unixfs/file/unixfile.go new file mode 100644 index 0000000000..6617591fc3 --- /dev/null +++ b/unixfs/file/unixfile.go @@ -0,0 +1,181 @@ +package unixfile + +import ( + "context" + "errors" + + ft "github.com/ipfs/go-unixfs" + uio "github.com/ipfs/go-unixfs/io" + + files "github.com/ipfs/go-ipfs-files" + ipld "github.com/ipfs/go-ipld-format" + dag "github.com/ipfs/go-merkledag" +) + +// Number to file to prefetch in directories +// TODO: should we allow setting this via context hint? +const prefetchFiles = 4 + +type ufsDirectory struct { + ctx context.Context + dserv ipld.DAGService + dir uio.Directory +} + +type ufsIterator struct { + ctx context.Context + files chan *ipld.Link + dserv ipld.DAGService + + curName string + curFile files.Node + + err error + errCh chan error +} + +func (it *ufsIterator) Name() string { + return it.curName +} + +func (it *ufsIterator) Node() files.Node { + return it.curFile +} + +func (it *ufsIterator) Next() bool { + if it.err != nil { + return false + } + + var l *ipld.Link + var ok bool + for !ok { + if it.files == nil && it.errCh == nil { + return false + } + select { + case l, ok = <-it.files: + if !ok { + it.files = nil + } + case err := <-it.errCh: + it.errCh = nil + it.err = err + + if err != nil { + return false + } + } + } + + it.curFile = nil + + nd, err := l.GetNode(it.ctx, it.dserv) + if err != nil { + it.err = err + return false + } + + it.curName = l.Name + it.curFile, it.err = NewUnixfsFile(it.ctx, it.dserv, nd) + return it.err == nil +} + +func (it *ufsIterator) Err() error { + return it.err +} + +func (d *ufsDirectory) Close() error { + return nil +} + +func (d *ufsDirectory) Entries() files.DirIterator { + fileCh := make(chan *ipld.Link, prefetchFiles) + errCh := make(chan error, 1) + go func() { + errCh <- d.dir.ForEachLink(d.ctx, func(link *ipld.Link) error { + if d.ctx.Err() != nil { + return d.ctx.Err() + } + select { + case fileCh <- link: + case <-d.ctx.Done(): + return d.ctx.Err() + } + return nil + }) + + close(errCh) + close(fileCh) + }() + + return &ufsIterator{ + ctx: d.ctx, + files: fileCh, + errCh: errCh, + dserv: d.dserv, + } +} + +func (d *ufsDirectory) Size() (int64, error) { + n, err := d.dir.GetNode() + if err != nil { + return 0, err + } + s, err := n.Size() + return int64(s), err +} + +type ufsFile struct { + uio.DagReader +} + +func (f *ufsFile) Size() (int64, error) { + return int64(f.DagReader.Size()), nil +} + +func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (files.Directory, error) { + dir, err := uio.NewDirectoryFromNode(dserv, nd) + if err != nil { + return nil, err + } + + return &ufsDirectory{ + ctx: ctx, + dserv: dserv, + + dir: dir, + }, nil +} + +func NewUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (files.Node, error) { + switch dn := nd.(type) { + case *dag.ProtoNode: + fsn, err := ft.FSNodeFromBytes(dn.Data()) + if err != nil { + return nil, err + } + if fsn.IsDir() { + return newUnixfsDir(ctx, dserv, nd) + } + if fsn.Type() == ft.TSymlink { + return files.NewLinkFile(string(fsn.Data()), nil), nil + } + + case *dag.RawNode: + default: + return nil, errors.New("unknown node type") + } + + dr, err := uio.NewDagReader(ctx, nd, dserv) + if err != nil { + return nil, err + } + + return &ufsFile{ + DagReader: dr, + }, nil +} + +var _ files.Directory = &ufsDirectory{} +var _ files.File = &ufsFile{} From 699671692038e5a44f40ce7e80b3ec7c6cf3490d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 30 Jan 2019 16:14:09 +0100 Subject: [PATCH 2563/3147] archiwe: move to go-ipfs get command This commit was moved from ipfs/go-unixfs@94dca9ceff20878acd96922890a39743c43f7d0a --- unixfs/archive/archive.go | 105 -------------------------------------- 1 file changed, 105 deletions(-) delete mode 100644 unixfs/archive/archive.go diff --git a/unixfs/archive/archive.go b/unixfs/archive/archive.go deleted file mode 100644 index c90e3e859d..0000000000 --- a/unixfs/archive/archive.go +++ /dev/null @@ -1,105 +0,0 @@ -// Package archive provides utilities to archive and compress a [Unixfs] DAG. -package archive - -import ( - "bufio" - "compress/gzip" - "errors" - "io" - "path" - - files "github.com/ipfs/go-ipfs-files" -) - -// DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks. -// TODO: does this need to be configurable? -var DefaultBufSize = 1048576 - -type identityWriteCloser struct { - w io.Writer -} - -func (i *identityWriteCloser) Write(p []byte) (int, error) { - return i.w.Write(p) -} - -func (i *identityWriteCloser) Close() error { - return nil -} - -// DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip` -func FileArchive(f files.Node, name string, archive bool, compression int) (io.Reader, error) { - cleaned := path.Clean(name) - _, filename := path.Split(cleaned) - - // need to connect a writer to a reader - piper, pipew := io.Pipe() - checkErrAndClosePipe := func(err error) bool { - if err != nil { - pipew.CloseWithError(err) - return true - } - return false - } - - // use a buffered writer to parallelize task - bufw := bufio.NewWriterSize(pipew, DefaultBufSize) - - // compression determines whether to use gzip compression. - maybeGzw, err := newMaybeGzWriter(bufw, compression) - if checkErrAndClosePipe(err) { - return nil, err - } - - closeGzwAndPipe := func() { - if err := maybeGzw.Close(); checkErrAndClosePipe(err) { - return - } - if err := bufw.Flush(); checkErrAndClosePipe(err) { - return - } - pipew.Close() // everything seems to be ok. - } - - if !archive && compression != gzip.NoCompression { - // the case when the node is a file - r := files.ToFile(f) - if r == nil { - return nil, errors.New("file is not regular") - } - - go func() { - if _, err := io.Copy(maybeGzw, r); checkErrAndClosePipe(err) { - return - } - closeGzwAndPipe() // everything seems to be ok - }() - } else { - // the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format - - // construct the tar writer - w, err := files.NewTarWriter(maybeGzw) - if checkErrAndClosePipe(err) { - return nil, err - } - - go func() { - // write all the nodes recursively - if err := w.WriteFile(f, filename); checkErrAndClosePipe(err) { - return - } - w.Close() // close tar writer - closeGzwAndPipe() // everything seems to be ok - }() - } - - return piper, nil -} - -func newMaybeGzWriter(w io.Writer, compression int) (io.WriteCloser, error) { - if compression != gzip.NoCompression { - return gzip.NewWriterLevel(w, compression) - } - return &identityWriteCloser{w}, nil -} - From 24673b7fcdcbdbdf7191ded6851f8cc02ccffefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 30 Jan 2019 19:09:17 +0100 Subject: [PATCH 2564/3147] unixfile: precalc dir size This commit was moved from ipfs/go-unixfs@89d0dca4d95e102e6f9e7cb12e5c6889eed2c460 --- unixfs/file/unixfile.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/unixfs/file/unixfile.go b/unixfs/file/unixfile.go index 6617591fc3..df3ce9e892 100644 --- a/unixfs/file/unixfile.go +++ b/unixfs/file/unixfile.go @@ -20,6 +20,7 @@ type ufsDirectory struct { ctx context.Context dserv ipld.DAGService dir uio.Directory + size int64 } type ufsIterator struct { @@ -118,12 +119,7 @@ func (d *ufsDirectory) Entries() files.DirIterator { } func (d *ufsDirectory) Size() (int64, error) { - n, err := d.dir.GetNode() - if err != nil { - return 0, err - } - s, err := n.Size() - return int64(s), err + return d.size, nil } type ufsFile struct { @@ -134,17 +130,23 @@ func (f *ufsFile) Size() (int64, error) { return int64(f.DagReader.Size()), nil } -func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (files.Directory, error) { +func newUnixfsDir(ctx context.Context, dserv ipld.DAGService, nd *dag.ProtoNode) (files.Directory, error) { dir, err := uio.NewDirectoryFromNode(dserv, nd) if err != nil { return nil, err } + size, err := nd.Size() + if err != nil { + return nil, err + } + return &ufsDirectory{ ctx: ctx, dserv: dserv, - dir: dir, + dir: dir, + size: int64(size), }, nil } @@ -156,7 +158,7 @@ func NewUnixfsFile(ctx context.Context, dserv ipld.DAGService, nd ipld.Node) (fi return nil, err } if fsn.IsDir() { - return newUnixfsDir(ctx, dserv, nd) + return newUnixfsDir(ctx, dserv, dn) } if fsn.Type() == ft.TSymlink { return files.NewLinkFile(string(fsn.Data()), nil), nil From c6503a1ba9fa4f111fd0ca2975a9f7285d5d4768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 30 Jan 2019 17:42:14 +0100 Subject: [PATCH 2565/3147] gx: update go-unixfs to propagate archive changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@fbde8e2781a69d29530a3a55c8007f135d65e25e --- coreiface/tests/name.go | 2 +- coreiface/tests/unixfs.go | 6 +++--- coreiface/unixfs.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 7b0a5d8f08..8690f22c31 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -9,7 +9,7 @@ import ( "time" ipath "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" - "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" + "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 6f10406ebf..2f1ab90a42 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -15,11 +15,11 @@ import ( coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" + "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs/importer/helpers" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" cbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" - "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs" - "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs/importer/helpers" - "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" + "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" mdag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 3c27881967..408280cbcb 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - files "gx/ipfs/QmXWZCd8jfaHmt4UDSnjKmGcrQMw95bDGWqEeVLVJjoANX/go-ipfs-files" + files "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" ) type AddEvent struct { From 109cd040aa9efeb7d55cadc80bb4faed604ae349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 30 Jan 2019 17:42:14 +0100 Subject: [PATCH 2566/3147] gx: update go-unixfs to propagate archive changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@1b992b836ecabea7c8c3f86ff72e0fe9f4e70ac6 --- namesys/namesys_test.go | 2 +- namesys/publisher.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 8f6da5d718..a73785b59f 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -9,7 +9,7 @@ import ( ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" pstoremem "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore/pstoremem" - "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs" + "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" offroute "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/offline" ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" diff --git a/namesys/publisher.go b/namesys/publisher.go index ef536a7e9e..49cc93b47d 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,7 +7,7 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmSMJ4rZbCJaih3y82Ebq7BZqK6vU2FHsKcWKQiE1DPTpS/go-unixfs" + ft "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" From ac20c6ad8101683bb28e0a57955bcefc454a959f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 21 Jan 2019 12:30:34 +0100 Subject: [PATCH 2567/3147] coreapi: add some seeker tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@be8e8d1aebcd3b544b0b9c345338ed9c55bbfe1c --- coreiface/tests/unixfs.go | 105 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 2f1ab90a42..5ae2739878 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -3,9 +3,11 @@ package tests import ( "bytes" "context" + "fmt" "io" "io/ioutil" "math" + "math/rand" "os" "strconv" "strings" @@ -43,6 +45,7 @@ func (tp *provider) TestUnixfs(t *testing.T) { t.Run("TestLsEmptyDir", tp.TestLsEmptyDir) t.Run("TestLsNonUnixfs", tp.TestLsNonUnixfs) t.Run("TestAddCloses", tp.TestAddCloses) + t.Run("TestGetSeek", tp.TestGetSeek) } // `echo -n 'hello, world!' | ipfs add` @@ -934,5 +937,107 @@ func (tp *provider) TestAddCloses(t *testing.T) { t.Errorf("dir %d not closed!", i) } } +} + +func (tp *provider) TestGetSeek(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Error(err) + } + + dataSize := int64(100000) + tf := files.NewReaderFile(io.LimitReader(rand.New(rand.NewSource(1403768328)), dataSize)) + + p, err := api.Unixfs().Add(ctx, tf, options.Unixfs.Chunker("size-100")) + if err != nil { + t.Fatal(err) + } + + r, err := api.Unixfs().Get(ctx, p) + if err != nil { + t.Fatal(err) + } + + f := files.ToFile(r) + if f == nil { + t.Fatal("not a file") + } + + orig := make([]byte, dataSize) + if _, err := f.Read(orig); err != nil { + t.Fatal(err) + } + f.Close() + + origR := bytes.NewReader(orig) + + r, err = api.Unixfs().Get(ctx, p) + if err != nil { + t.Fatal(err) + } + + f = files.ToFile(r) + if f == nil { + t.Fatal("not a file") + } + + test := func(offset int64, whence int, read int, expect int64, shouldEof bool) { + t.Run(fmt.Sprintf("seek%d+%d-r%d-%d", whence, offset, read, expect), func(t *testing.T) { + n, err := f.Seek(offset, whence) + if err != nil { + t.Fatal(err) + } + origN, err := origR.Seek(offset, whence) + if err != nil { + t.Fatal(err) + } + + if n != origN { + t.Fatalf("offsets didn't match, expected %d, got %d", origN, n) + } + + buf := make([]byte, read) + origBuf := make([]byte, read) + origRead, err := origR.Read(origBuf) + if err != nil { + t.Fatalf("orig: %s", err) + } + r, err := f.Read(buf) + switch { + case shouldEof && err != nil && err != io.EOF: + fallthrough + case !shouldEof && err != nil: + t.Fatalf("f: %s", err) + case shouldEof: + _, err := f.Read([]byte{0}) + if err != io.EOF { + t.Fatal("expected EOF") + } + _, err = origR.Read([]byte{0}) + if err != io.EOF { + t.Fatal("expected EOF (orig)") + } + } + + if int64(r) != expect { + t.Fatal("read wrong amount of data") + } + if r != origRead { + t.Fatal("read different amount of data than bytes.Reader") + } + if !bytes.Equal(buf, origBuf) { + t.Fatal("data didn't match") + } + }) + } + test(3, io.SeekCurrent, 10, 10, false) + test(3, io.SeekCurrent, 10, 10, false) + test(500, io.SeekCurrent, 10, 10, false) + test(350, io.SeekStart, 100, 100, false) + test(-123, io.SeekCurrent, 100, 100, false) + test(dataSize-50, io.SeekStart, 100, 50, true) + test(-5, io.SeekEnd, 100, 5, true) } From 3afaf889d4d49000482655a90591acdd3eb16349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 1 Feb 2019 19:48:43 +0100 Subject: [PATCH 2568/3147] coreapi: use chan for returning results in Unixfs.Ls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@93175e9900f58425d3868381c3a8668500ac39a9 --- coreiface/tests/unixfs.go | 18 ++++++++++-------- coreiface/unixfs.go | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 5ae2739878..68d408e6c8 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -754,18 +754,20 @@ func (tp *provider) TestLs(t *testing.T) { t.Error(err) } - if len(links) != 1 { - t.Fatalf("expected 1 link, got %d", len(links)) + link := <- links + if link.Size != 23 { + t.Fatalf("expected size = 23, got %d", link.Size) } - if links[0].Size != 23 { - t.Fatalf("expected size = 23, got %d", links[0].Size) + if link.Name != "name-of-file" { + t.Fatalf("expected name = name-of-file, got %s", link.Name) } - if links[0].Name != "name-of-file" { - t.Fatalf("expected name = name-of-file, got %s", links[0].Name) + if link.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { + t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", link.Cid) } - if links[0].Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { - t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", links[0].Cid) + if _, ok := <-links; ok { + t.Errorf("didn't expect a second link") } + } func (tp *provider) TestEntriesExpired(t *testing.T) { diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 408280cbcb..cdb6a1e0ce 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -31,5 +31,5 @@ type UnixfsAPI interface { Get(context.Context, Path) (files.Node, error) // Ls returns the list of links in a directory - Ls(context.Context, Path) ([]*ipld.Link, error) + Ls(context.Context, Path) (<-chan *ipld.Link, error) } From db66d03977366d25aa6b91f30a6ec7a9fcae9037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 1 Feb 2019 20:12:48 +0100 Subject: [PATCH 2569/3147] coreapi: asunc ls option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@72006bfe2d78cd6cb507ff0265cd1844521d190e --- coreiface/options/unixfs.go | 30 ++++++++++++++++++++++++++++++ coreiface/tests/unixfs.go | 22 ++++++++++++++++++++-- coreiface/unixfs.go | 6 +++--- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 109a63f1d8..819cc3b6bf 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -42,7 +42,12 @@ type UnixfsAddSettings struct { Progress bool } +type UnixfsLsSettings struct { + Async bool +} + type UnixfsAddOption func(*UnixfsAddSettings) error +type UnixfsLsOption func(*UnixfsLsSettings) error func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, error) { options := &UnixfsAddSettings{ @@ -122,6 +127,21 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, return options, prefix, nil } +func UnixfsLsOptions(opts ...UnixfsLsOption) (*UnixfsLsSettings, error) { + options := &UnixfsLsSettings{ + Async: true, + } + + for _, opt := range opts { + err := opt(options) + if err != nil { + return nil, err + } + } + + return options, nil +} + type unixfsOpts struct{} var Unixfs unixfsOpts @@ -290,3 +310,13 @@ func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption { return nil } } + +// Async tells ls to return results as soon as they are available, which can be +// useful for listing HAMT directories. When this option is set to true returned +// results won't be returned in order +func (unixfsOpts) Async(async bool) UnixfsLsOption { + return func(settings *UnixfsLsSettings) error { + settings.Async = async + return nil + } +} diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 68d408e6c8..b2b5a9ebb0 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -749,12 +749,12 @@ func (tp *provider) TestLs(t *testing.T) { t.Error(err) } - links, err := api.Unixfs().Ls(ctx, p) + links, err := api.Unixfs().Ls(ctx, p, options.Unixfs.Async(false)) if err != nil { t.Error(err) } - link := <- links + link := (<-links).Link if link.Size != 23 { t.Fatalf("expected size = 23, got %d", link.Size) } @@ -768,6 +768,24 @@ func (tp *provider) TestLs(t *testing.T) { t.Errorf("didn't expect a second link") } + links, err = api.Unixfs().Ls(ctx, p, options.Unixfs.Async(true)) + if err != nil { + t.Error(err) + } + + link = (<-links).Link + if link.Size != 23 { + t.Fatalf("expected size = 23, got %d", link.Size) + } + if link.Name != "name-of-file" { + t.Fatalf("expected name = name-of-file, got %s", link.Name) + } + if link.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { + t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", link.Cid) + } + if _, ok := <-links; ok { + t.Errorf("didn't expect a second link") + } } func (tp *provider) TestEntriesExpired(t *testing.T) { diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index cdb6a1e0ce..ba2673fee0 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - files "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" + ft "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" + "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" ) type AddEvent struct { @@ -31,5 +31,5 @@ type UnixfsAPI interface { Get(context.Context, Path) (files.Node, error) // Ls returns the list of links in a directory - Ls(context.Context, Path) (<-chan *ipld.Link, error) + Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan ft.LinkResult, error) } From 54f7855257d69f5f79fe37d7896ddff4e0d1c2f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 1 Feb 2019 23:07:19 +0100 Subject: [PATCH 2570/3147] coreapi: resolve type/size in Unixfs.Ls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@01bbf29cf470532d94aba2bc5a912eb44d9997d0 --- coreiface/options/unixfs.go | 17 +++++++++++++++++ coreiface/unixfs.go | 14 +++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 819cc3b6bf..6dbab93b62 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -44,6 +44,9 @@ type UnixfsAddSettings struct { type UnixfsLsSettings struct { Async bool + + ResolveType bool + ResolveSize bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -320,3 +323,17 @@ func (unixfsOpts) Async(async bool) UnixfsLsOption { return nil } } + +func (unixfsOpts) ResolveSize(resolve bool) UnixfsLsOption { + return func(settings *UnixfsLsSettings) error { + settings.ResolveSize = resolve + return nil + } +} + +func (unixfsOpts) ResolveType(resolve bool) UnixfsLsOption { + return func(settings *UnixfsLsSettings) error { + settings.ResolveSize = resolve + return nil + } +} \ No newline at end of file diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index ba2673fee0..846b746296 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -2,10 +2,10 @@ package iface import ( "context" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - ft "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" + "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs/pb" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" ) @@ -16,6 +16,14 @@ type AddEvent struct { Size string `json:",omitempty"` } +type LsLink struct { + Link *ipld.Link + Size uint64 + Type unixfs_pb.Data_DataType + + Err error +} + // UnixfsAPI is the basic interface to immutable files in IPFS // NOTE: This API is heavily WIP, things are guaranteed to break frequently type UnixfsAPI interface { @@ -31,5 +39,5 @@ type UnixfsAPI interface { Get(context.Context, Path) (files.Node, error) // Ls returns the list of links in a directory - Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan ft.LinkResult, error) + Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan LsLink, error) } From 966d0008c10b29c04075261e3c59b0cab8953faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 2 Feb 2019 00:18:44 +0100 Subject: [PATCH 2571/3147] ls: use CoreAPI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@fad4bd392abb9eb689687497d89d9e51e56486fb --- coreiface/options/unixfs.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 6dbab93b62..4ff5cdb3f8 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -133,6 +133,9 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, func UnixfsLsOptions(opts ...UnixfsLsOption) (*UnixfsLsSettings, error) { options := &UnixfsLsSettings{ Async: true, + + ResolveSize: true, + ResolveType: true, } for _, opt := range opts { @@ -333,7 +336,7 @@ func (unixfsOpts) ResolveSize(resolve bool) UnixfsLsOption { func (unixfsOpts) ResolveType(resolve bool) UnixfsLsOption { return func(settings *UnixfsLsSettings) error { - settings.ResolveSize = resolve + settings.ResolveType = resolve return nil } -} \ No newline at end of file +} From 328e6f8ac9b4229e990201a93954213be992c45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 2 Feb 2019 03:42:00 +0100 Subject: [PATCH 2572/3147] coreapi: stream only ls, handle storting in command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@a62acc82d4b5f8135f1d1249a22e91572a9a03c0 --- coreiface/options/unixfs.go | 14 -------------- coreiface/tests/unixfs.go | 21 +-------------------- coreiface/unixfs.go | 3 ++- 3 files changed, 3 insertions(+), 35 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 4ff5cdb3f8..7e77410bc6 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -43,8 +43,6 @@ type UnixfsAddSettings struct { } type UnixfsLsSettings struct { - Async bool - ResolveType bool ResolveSize bool } @@ -132,8 +130,6 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, func UnixfsLsOptions(opts ...UnixfsLsOption) (*UnixfsLsSettings, error) { options := &UnixfsLsSettings{ - Async: true, - ResolveSize: true, ResolveType: true, } @@ -317,16 +313,6 @@ func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption { } } -// Async tells ls to return results as soon as they are available, which can be -// useful for listing HAMT directories. When this option is set to true returned -// results won't be returned in order -func (unixfsOpts) Async(async bool) UnixfsLsOption { - return func(settings *UnixfsLsSettings) error { - settings.Async = async - return nil - } -} - func (unixfsOpts) ResolveSize(resolve bool) UnixfsLsOption { return func(settings *UnixfsLsSettings) error { settings.ResolveSize = resolve diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index b2b5a9ebb0..054461de1d 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -749,7 +749,7 @@ func (tp *provider) TestLs(t *testing.T) { t.Error(err) } - links, err := api.Unixfs().Ls(ctx, p, options.Unixfs.Async(false)) + links, err := api.Unixfs().Ls(ctx, p) if err != nil { t.Error(err) } @@ -767,25 +767,6 @@ func (tp *provider) TestLs(t *testing.T) { if _, ok := <-links; ok { t.Errorf("didn't expect a second link") } - - links, err = api.Unixfs().Ls(ctx, p, options.Unixfs.Async(true)) - if err != nil { - t.Error(err) - } - - link = (<-links).Link - if link.Size != 23 { - t.Fatalf("expected size = 23, got %d", link.Size) - } - if link.Name != "name-of-file" { - t.Fatalf("expected name = name-of-file, got %s", link.Name) - } - if link.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { - t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", link.Cid) - } - if _, ok := <-links; ok { - t.Errorf("didn't expect a second link") - } } func (tp *provider) TestEntriesExpired(t *testing.T) { diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 846b746296..a77011988d 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -38,6 +38,7 @@ type UnixfsAPI interface { // to operations performed on the returned file Get(context.Context, Path) (files.Node, error) - // Ls returns the list of links in a directory + // Ls returns the list of links in a directory. Links aren't guaranteed to be + // returned in order Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan LsLink, error) } From 793d38f83e3036e51781126e23040e397f1ac8d8 Mon Sep 17 00:00:00 2001 From: chenminjian <727180553@qq.com> Date: Sat, 2 Feb 2019 11:47:02 +0800 Subject: [PATCH 2573/3147] fix(mv): dst path error This commit was moved from ipfs/go-mfs@1836bf0d8cdd7b165a78e98b27699e718982d8e2 --- mfs/ops.go | 1 + 1 file changed, 1 insertion(+) diff --git a/mfs/ops.go b/mfs/ops.go index 031a77d466..d989bb5f01 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -60,6 +60,7 @@ func Mv(r *Root, src, dst string) error { _ = dstDir.Unlink(filename) case *Directory: dstDir = n + filename = srcFname default: return fmt.Errorf("unexpected type at path: %s", dst) } From 8d88635d4a9ae6462528d7a6cd7737ecbd5716de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 2 Feb 2019 17:13:28 +0100 Subject: [PATCH 2574/3147] coreapi ls: merge ResolveType and ResolveSize MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@d93b9f110ec9df2fb0e4f840974243ae878ffdf6 --- coreiface/options/unixfs.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 7e77410bc6..015c2dca3c 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -43,8 +43,7 @@ type UnixfsAddSettings struct { } type UnixfsLsSettings struct { - ResolveType bool - ResolveSize bool + ResolveChildren bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -130,8 +129,7 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, func UnixfsLsOptions(opts ...UnixfsLsOption) (*UnixfsLsSettings, error) { options := &UnixfsLsSettings{ - ResolveSize: true, - ResolveType: true, + ResolveChildren: true, } for _, opt := range opts { @@ -313,16 +311,9 @@ func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption { } } -func (unixfsOpts) ResolveSize(resolve bool) UnixfsLsOption { +func (unixfsOpts) ResolveChildren(resolve bool) UnixfsLsOption { return func(settings *UnixfsLsSettings) error { - settings.ResolveSize = resolve - return nil - } -} - -func (unixfsOpts) ResolveType(resolve bool) UnixfsLsOption { - return func(settings *UnixfsLsSettings) error { - settings.ResolveType = resolve + settings.ResolveChildren = resolve return nil } } From e47af31e2d3e5b497f91392603ed5f6b760f6eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 2 Feb 2019 17:27:54 +0100 Subject: [PATCH 2575/3147] coreapi: mirror unixfs file types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@e8196db410d2fc38fb64613bebedccc79c1ecaec --- coreiface/unixfs.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index a77011988d..1fb07638f8 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,7 +4,7 @@ import ( "context" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs/pb" + "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" ) @@ -16,10 +16,21 @@ type AddEvent struct { Size string `json:",omitempty"` } +type FileType int32 + +const ( + TRaw = FileType(unixfs.TRaw) + TFile = FileType(unixfs.TFile) + TDirectory = FileType(unixfs.TDirectory) + TMetadata = FileType(unixfs.TMetadata) + TSymlink = FileType(unixfs.TSymlink) + THAMTShard = FileType(unixfs.THAMTShard) +) + type LsLink struct { Link *ipld.Link Size uint64 - Type unixfs_pb.Data_DataType + Type FileType Err error } From 9ea89f38600dab60d9a09740c28d935ef9bfc202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 4 Feb 2019 18:05:05 +0100 Subject: [PATCH 2576/3147] block put --pin option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@005752045c872e4dabb17e5c9ba1732f3cf04ea6 --- coreiface/options/block.go | 11 +++++++++++ coreiface/tests/block.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/coreiface/options/block.go b/coreiface/options/block.go index ea4ae26bb6..40dfba79ab 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -10,6 +10,7 @@ type BlockPutSettings struct { Codec string MhType uint64 MhLength int + Pin bool } type BlockRmSettings struct { @@ -24,6 +25,7 @@ func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, cid.Prefix, err Codec: "", MhType: mh.SHA2_256, MhLength: -1, + Pin: false, } for _, opt := range opts { @@ -105,6 +107,15 @@ func (blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption { } } +// Pin is an option for Block.Put which specifies whether to (recursively) pin +// added blocks +func (blockOpts) Pin(pin bool) BlockPutOption { + return func(settings *BlockPutSettings) error { + settings.Pin = pin + return nil + } +} + // Force is an option for Block.Rm which, when set to true, will ignore // non-existing blocks func (blockOpts) Force(force bool) BlockRmOption { diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 427ad3357b..c2ee70a3a6 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -26,6 +26,7 @@ func (tp *provider) TestBlock(t *testing.T) { t.Run("TestBlockGet", tp.TestBlockGet) t.Run("TestBlockRm", tp.TestBlockRm) t.Run("TestBlockStat", tp.TestBlockStat) + t.Run("TestBlockPin", tp.TestBlockPin) } func (tp *provider) TestBlockPut(t *testing.T) { @@ -203,3 +204,40 @@ func (tp *provider) TestBlockStat(t *testing.T) { t.Error("length doesn't match") } } + +func (tp *provider) TestBlockPin(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Error(err) + } + + _, err = api.Block().Put(ctx, strings.NewReader(`Hello`)) + if err != nil { + t.Fatal(err) + } + + if pins, err := api.Pin().Ls(ctx); err != nil || len(pins) != 0 { + t.Fatal("expected 0 pins") + } + + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Pin(true)) + if err != nil { + t.Fatal(err) + } + + pins, err := api.Pin().Ls(ctx) + if err != nil { + return + } + if len(pins) != 1 { + t.Fatal("expected 1 pin") + } + if pins[0].Type() != "recursive" { + t.Error("expected a recursive pin") + } + if pins[0].Path().String() != res.Path().String() { + t.Error("pin path didn't match") + } +} From 4a549b9da6016451497081912b388caa71b865b4 Mon Sep 17 00:00:00 2001 From: roignpar <47150492+roignpar@users.noreply.github.com> Date: Mon, 4 Feb 2019 22:38:29 +0200 Subject: [PATCH 2577/3147] fix community/CONTRIBUTING.md link in README.md This commit was moved from ipfs/go-ipns@b9006c464449dacdcf8a29bdf386797b38b26906 --- ipns/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipns/README.md b/ipns/README.md index efd897a255..1fbb36d1f3 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -54,7 +54,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ### Want to hack on IPFS? -[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) ## License From 301ad37db0af794d974c8583b2d4ee24b7dbc596 Mon Sep 17 00:00:00 2001 From: roignpar <47150492+roignpar@users.noreply.github.com> Date: Mon, 4 Feb 2019 22:48:13 +0200 Subject: [PATCH 2578/3147] fix typo in README.md This commit was moved from ipfs/go-ipns@a35ea72a32cf387b2429f28555606d445894039a --- ipns/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipns/README.md b/ipns/README.md index efd897a255..72b9e6f9ff 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -8,7 +8,7 @@ > ipns record definitions -This package contains all of components necessary to create, understand, and validate IPNS records. It does *not* publish or resolve those records. [`go-ipfs`](https://github.com/ipfs/go-ipfs) uses this package internally to manipulate records. +This package contains all of the components necessary to create, understand, and validate IPNS records. It does *not* publish or resolve those records. [`go-ipfs`](https://github.com/ipfs/go-ipfs) uses this package internally to manipulate records. ## Usage From 1e59d281dfae25d81b2f2dba9ca6138537c431a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 5 Feb 2019 20:20:27 +0100 Subject: [PATCH 2579/3147] coreapi: fix seek test on http impl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@3291f565631f8ccbb1d09bb71e686265cc00803d --- coreiface/tests/unixfs.go | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 054461de1d..1c21f4fd01 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -3,6 +3,7 @@ package tests import ( "bytes" "context" + "encoding/hex" "fmt" "io" "io/ioutil" @@ -754,9 +755,13 @@ func (tp *provider) TestLs(t *testing.T) { t.Error(err) } - link := (<-links).Link - if link.Size != 23 { - t.Fatalf("expected size = 23, got %d", link.Size) + linkRes := <-links + if linkRes.Err != nil { + t.Fatal(linkRes.Err) + } + link := linkRes.Link + if linkRes.Size != 15 { + t.Fatalf("expected size = 15, got %d", link.Size) } if link.Name != "name-of-file" { t.Fatalf("expected name = name-of-file, got %s", link.Name) @@ -764,8 +769,11 @@ func (tp *provider) TestLs(t *testing.T) { if link.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", link.Cid) } - if _, ok := <-links; ok { + if l, ok := <-links; ok { t.Errorf("didn't expect a second link") + if l.Err != nil { + t.Error(l.Err) + } } } @@ -967,7 +975,7 @@ func (tp *provider) TestGetSeek(t *testing.T) { } orig := make([]byte, dataSize) - if _, err := f.Read(orig); err != nil { + if _, err := io.ReadFull(f, orig); err != nil { t.Fatal(err) } f.Close() @@ -1005,9 +1013,9 @@ func (tp *provider) TestGetSeek(t *testing.T) { if err != nil { t.Fatalf("orig: %s", err) } - r, err := f.Read(buf) + r, err := io.ReadFull(f, buf) switch { - case shouldEof && err != nil && err != io.EOF: + case shouldEof && err != nil && err != io.ErrUnexpectedEOF: fallthrough case !shouldEof && err != nil: t.Fatalf("f: %s", err) @@ -1029,6 +1037,8 @@ func (tp *provider) TestGetSeek(t *testing.T) { t.Fatal("read different amount of data than bytes.Reader") } if !bytes.Equal(buf, origBuf) { + fmt.Fprintf(os.Stderr, "original:\n%s\n", hex.Dump(origBuf)) + fmt.Fprintf(os.Stderr, "got:\n%s\n", hex.Dump(buf)) t.Fatal("data didn't match") } }) @@ -1039,6 +1049,7 @@ func (tp *provider) TestGetSeek(t *testing.T) { test(500, io.SeekCurrent, 10, 10, false) test(350, io.SeekStart, 100, 100, false) test(-123, io.SeekCurrent, 100, 100, false) + test(0, io.SeekStart, int(dataSize), dataSize, false) test(dataSize-50, io.SeekStart, 100, 50, true) test(-5, io.SeekEnd, 100, 5, true) } From 912c1a08af7de98f6350eb595caa62894c50af5e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 7 Feb 2019 16:54:18 -0800 Subject: [PATCH 2580/3147] chore: go fmt This commit was moved from ipfs/go-path@05fabccd1fea9d47be7ad3b47c914ca667288815 --- path/resolver/resolver_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index cec160fe75..480ccdf1dd 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -95,7 +95,6 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - if len(rest) != 0 { t.Error("expected rest to be empty") } From 266c4e727b378a07cbabc9cf7db1ff13fb997998 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 7 Feb 2019 17:11:29 -0800 Subject: [PATCH 2581/3147] gx: update go-libp2p-peer Switch _back_ to the 0.4.18 style of peer IDs while we figure things out. See https://github.com/libp2p/specs/issues/138. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@6913730770e58c55b6bdb99c62205e11ee0f6fe2 --- namesys/base.go | 2 +- namesys/cache.go | 2 +- namesys/dns.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 22 +++++++++++----------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 12 ++++++------ namesys/proquint.go | 2 +- namesys/publisher.go | 12 ++++++------ namesys/publisher_test.go | 8 ++++---- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 12 ++++++------ 14 files changed, 52 insertions(+), 52 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index bc6d4dd2c7..de71ff3452 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -7,7 +7,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 8f41c64d32..44ecaab4d8 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index f0cd63c706..6eb08ed80d 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -8,7 +8,7 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 0b047eec91..88c48efd85 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,7 +36,7 @@ import ( context "context" opts "github.com/ipfs/go-ipfs/namesys/opts" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 47c0bcd04f..0a9e316341 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,24 +5,24 @@ import ( "testing" "time" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - testutil "gx/ipfs/QmNvHv84aH2qZafDuSdKJCQ1cvPZ1kmQmyD4YtzjUHuk9v/go-testutil" - pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore/pstoremem" - routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" - ropts "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing/options" - mockrouting "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/mock" - offline "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/offline" - ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" + mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" + offline "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" + routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" + ropts "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing/options" + testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" + ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" + record "gx/ipfs/QmexPd3srWxHC76gW2p5j5tQvwpPuCoW7b9vFhJ8BRPyh9/go-libp2p-record" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" - record "gx/ipfs/QmfARXVCzpwFXQdepAJZuqyNDgV9doEsMnVCo1ssmuSe1U/go-libp2p-record" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index ac3caa3284..a16cf1388b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,14 +5,14 @@ import ( "strings" "time" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index a73785b59f..3b3c1e255b 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -8,12 +8,12 @@ import ( opts "github.com/ipfs/go-ipfs/namesys/opts" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - pstoremem "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore/pstoremem" - "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" - offroute "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/offline" - ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" + offroute "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" + ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" + "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index 703bbb3cc3..75d56c80fd 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" opts "github.com/ipfs/go-ipfs/namesys/opts" diff --git a/namesys/publisher.go b/namesys/publisher.go index 49cc93b47d..d20cda5a0b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,14 +7,14 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - ft "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + ft "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" - ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" - pb "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns/pb" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" + ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" + pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dsquery "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 0d82cc0c27..7a8cf7ede4 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -8,10 +8,10 @@ import ( ma "gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - testutil "gx/ipfs/QmNvHv84aH2qZafDuSdKJCQ1cvPZ1kmQmyD4YtzjUHuk9v/go-testutil" - mockrouting "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/mock" - ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" + testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" + ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 429f41f8c7..46d381a5d3 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,13 +7,13 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pb "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns/pb" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index a7530b1e9b..738a3301d0 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" + pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmYxivS34F2M2n44WQQnRHGAKS8aoRUxwGpi9wk4Cdn4Jf/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmSgtf5vHyugoxcwMbyNy6bZ9qPDDTJSYEED2GkWjLwitZ/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index fe0a811255..54cc4c8d69 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,12 +6,12 @@ import ( "testing" "time" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - testutil "gx/ipfs/QmNvHv84aH2qZafDuSdKJCQ1cvPZ1kmQmyD4YtzjUHuk9v/go-testutil" - mockrouting "gx/ipfs/QmVZ6cQXHoTQja4oo9GhhHZi7dThi4x98mRKgGtKnTy37u/go-ipfs-routing/mock" - ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" + testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" + ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/routing.go b/namesys/routing.go index 9ac7c086a5..bfe1520e72 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,18 +5,18 @@ import ( "strings" "time" - path "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" opts "github.com/ipfs/go-ipfs/namesys/opts" - dht "gx/ipfs/QmNoNExMdWrYSPZDiJJTVmxSh6uKLN26xYVzbLzBLedRcv/go-libp2p-kad-dht" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - routing "gx/ipfs/QmTiRqrF5zkdZyrdsL5qndG1UbeWi8k8N2pYxCtXWrahR2/go-libp2p-routing" - ipns "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns" - pb "gx/ipfs/QmWPFehHmySCdaGttQ48iwF7M6mBRrGE5GSPWKCuMWqJDR/go-ipns/pb" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" + ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" + pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + dht "gx/ipfs/Qmeh1RJ3kvEXgmuEmbNLwZ9wVUDuaqE7BhhEngd8aXV8tf/go-libp2p-kad-dht" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) From 132387d33db2093e89e1b97dbe292ba780debf0f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 7 Feb 2019 17:11:29 -0800 Subject: [PATCH 2582/3147] gx: update go-libp2p-peer Switch _back_ to the 0.4.18 style of peer IDs while we figure things out. See https://github.com/libp2p/specs/issues/138. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/interface-go-ipfs-core@67fd754fced65b8d75a92217fe265af48822cef1 --- coreiface/dht.go | 4 ++-- coreiface/key.go | 2 +- coreiface/options/unixfs.go | 2 +- coreiface/path.go | 2 +- coreiface/pubsub.go | 2 +- coreiface/swarm.go | 6 +++--- coreiface/tests/name.go | 2 +- coreiface/tests/unixfs.go | 6 +++--- coreiface/unixfs.go | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index ec8bd92c34..94fb3779f7 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/key.go b/coreiface/key.go index f310c3cc2e..69857e6137 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 015c2dca3c..0dd1296096 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -5,7 +5,7 @@ import ( "fmt" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" + dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/path.go b/coreiface/path.go index b96e0e7757..d59a851b45 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,8 +1,8 @@ package iface import ( + ipfspath "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipfspath "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index 867c8adc44..9336738260 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - peer "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 83e2072824..3af078f17a 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -6,9 +6,9 @@ import ( "time" ma "gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr" - net "gx/ipfs/QmNgLg1NTw37iWbYPKcyK85YJ9Whs1MkPtJwhfqbNYAyKg/go-libp2p-net" - pstore "gx/ipfs/QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD/go-libp2p-peerstore" - "gx/ipfs/QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY/go-libp2p-peer" + "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" + net "gx/ipfs/QmZ7cBWUXkyWTMN4qH6NGoyMVs7JugyFChBNP4ZUp5rJHH/go-libp2p-net" "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" ) diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 8690f22c31..8d87bd495d 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -8,7 +8,7 @@ import ( "testing" "time" - ipath "gx/ipfs/QmWqh9oob7ZHQRwU5CdTqpnC8ip8BEkFNrwXRxeNo5Y7vA/go-path" + ipath "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 1c21f4fd01..f5ce85b78b 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -18,12 +18,12 @@ import ( coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" - "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs/importer/helpers" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" cbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" + mdag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" + "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" + "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs/importer/helpers" "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" - mdag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 1fb07638f8..8e559022cc 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,8 +4,8 @@ import ( "context" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "gx/ipfs/QmQ1JnYpnzkaurjW1yxkQxC2w3K1PorNE1nv1vaP5Le7sq/go-unixfs" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" ) From d1cddb3cdb1e0accb3567b3ec9323a98aeb57ac6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 7 Feb 2019 17:11:29 -0800 Subject: [PATCH 2583/3147] gx: update go-libp2p-peer Switch _back_ to the 0.4.18 style of peer IDs while we figure things out. See https://github.com/libp2p/specs/issues/138. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@3ecaee5b84ca4e8ebce7db4f1c36f82ccd34db26 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 5e09f5078d..eebfb1f413 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmVKQHuzni68SWByzJgBUCwHvvr4TWiXfutNWWwpZpp4rE/go-blockservice" - dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" + dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" + bserv "gx/ipfs/QmbgbNxC1PMyS2gbx7nf2jKNG7bZAfYJJebdK4ptBBWCz1/go-blockservice" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 8a1a18fe1c..bac29feb73 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" + mdag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 9660d73391..763643fea5 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmVKQHuzni68SWByzJgBUCwHvvr4TWiXfutNWWwpZpp4rE/go-blockservice" - mdag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" + mdag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" + bs "gx/ipfs/QmbgbNxC1PMyS2gbx7nf2jKNG7bZAfYJJebdK4ptBBWCz1/go-blockservice" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index f7e457315c..982f7d22a9 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" + "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 52b55b9ffb..b81f9aad2f 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmVKQHuzni68SWByzJgBUCwHvvr4TWiXfutNWWwpZpp4rE/go-blockservice" - dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" + dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" + bserv "gx/ipfs/QmbgbNxC1PMyS2gbx7nf2jKNG7bZAfYJJebdK4ptBBWCz1/go-blockservice" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From 506f026f27bd7f23a314fcc4e098e45055630de1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 7 Feb 2019 17:11:29 -0800 Subject: [PATCH 2584/3147] gx: update go-libp2p-peer Switch _back_ to the 0.4.18 style of peer IDs while we figure things out. See https://github.com/libp2p/specs/issues/138. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@daa03129ed43c436ab2299548b06f25dd17eff8b --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 9f8bdb26b9..8205bd6cc6 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/Qmb2UEG2TAeVrEJSjqsZF7Y2he7wRDkrdt6c3bECxwZf4k/go-merkledag" + dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From b3a8575241b2bb5970ad56c80d49308b6cec5853 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 7 Feb 2019 17:45:09 -0800 Subject: [PATCH 2585/3147] namesys: fix ed25519 test for peer ID inlining License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@d725e654f7de83a4f41a52899fc59042332250df --- namesys/publisher_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 7a8cf7ede4..0e9ef1d4e8 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -108,5 +108,5 @@ func TestRSAPublisher(t *testing.T) { } func TestEd22519Publisher(t *testing.T) { - testNamekeyPublisher(t, ci.Ed25519, nil, true) + testNamekeyPublisher(t, ci.Ed25519, ds.ErrNotFound, false) } From d15daa504fd1884c0e2a9c57ae3ae42343ec482e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 8 Feb 2019 17:58:56 +0100 Subject: [PATCH 2586/3147] coreapi: cleanup coredag references in interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@c3fa814784e5a96d5baeb5722bc51da7750a09ce --- coreiface/tests/dag.go | 53 +++++++++++++++++++++-------------------- coreiface/tests/path.go | 32 +++++++++++++------------ coreiface/tests/pin.go | 22 +++++++++-------- 3 files changed, 56 insertions(+), 51 deletions(-) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 10fab125a2..4decfebb4b 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -8,8 +8,9 @@ import ( "testing" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" - coredag "github.com/ipfs/go-ipfs/core/coredag" + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) @@ -46,18 +47,18 @@ func (tp *provider) TestPut(t *testing.T) { t.Error(err) } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"Hello"`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), math.MaxUint64, -1) if err != nil { t.Error(err) } - err = api.Dag().Add(ctx, nds[0]) + err = api.Dag().Add(ctx, nd) if err != nil { t.Fatal(err) } - if nds[0].Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { - t.Errorf("got wrong cid: %s", nds[0].Cid().String()) + if nd.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + t.Errorf("got wrong cid: %s", nd.Cid().String()) } } @@ -69,18 +70,18 @@ func (tp *provider) TestPutWithHash(t *testing.T) { t.Error(err) } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"Hello"`), mh.ID, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), mh.ID, -1) if err != nil { t.Error(err) } - err = api.Dag().Add(ctx, nds[0]) + err = api.Dag().Add(ctx, nd) if err != nil { t.Fatal(err) } - if nds[0].Cid().String() != "z5hRLNd2sv4z1c" { - t.Errorf("got wrong cid: %s", nds[0].Cid().String()) + if nd.Cid().String() != "z5hRLNd2sv4z1c" { + t.Errorf("got wrong cid: %s", nd.Cid().String()) } } @@ -92,27 +93,27 @@ func (tp *provider) TestDagPath(t *testing.T) { t.Error(err) } - snds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"foo"`), math.MaxUint64, -1) + snd, err := ipldcbor.FromJSON(strings.NewReader(`"foo"`), math.MaxUint64, -1) if err != nil { t.Error(err) } - err = api.Dag().Add(ctx, snds[0]) + err = api.Dag().Add(ctx, snd) if err != nil { t.Fatal(err) } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"lnk": {"/": "`+snds[0].Cid().String()+`"}}`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+snd.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - err = api.Dag().Add(ctx, nds[0]) + err = api.Dag().Add(ctx, nd) if err != nil { t.Fatal(err) } - p, err := coreiface.ParsePath(path.Join(nds[0].Cid().String(), "lnk")) + p, err := coreiface.ParsePath(path.Join(nd.Cid().String(), "lnk")) if err != nil { t.Error(err) } @@ -122,13 +123,13 @@ func (tp *provider) TestDagPath(t *testing.T) { t.Error(err) } - nd, err := api.Dag().Get(ctx, rp.Cid()) + ndd, err := api.Dag().Get(ctx, rp.Cid()) if err != nil { t.Error(err) } - if nd.Cid().String() != snds[0].Cid().String() { - t.Errorf("got unexpected cid %s, expected %s", nd.Cid().String(), snds[0].Cid().String()) + if nd.Cid().String() != snd.Cid().String() { + t.Errorf("got unexpected cid %s, expected %s", ndd.Cid().String(), snd.Cid().String()) } } @@ -140,17 +141,17 @@ func (tp *provider) TestTree(t *testing.T) { t.Error(err) } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"a": 123, "b": "foo", "c": {"d": 321, "e": 111}}`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`{"a": 123, "b": "foo", "c": {"d": 321, "e": 111}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - err = api.Dag().Add(ctx, nds[0]) + err = api.Dag().Add(ctx, nd) if err != nil { t.Fatal(err) } - res, err := api.Dag().Get(ctx, nds[0].Cid()) + res, err := api.Dag().Get(ctx, nd.Cid()) if err != nil { t.Error(err) } @@ -175,25 +176,25 @@ func (tp *provider) TestBatch(t *testing.T) { t.Error(err) } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`"Hello"`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), math.MaxUint64, -1) if err != nil { t.Error(err) } - if nds[0].Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { - t.Errorf("got wrong cid: %s", nds[0].Cid().String()) + if nd.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + t.Errorf("got wrong cid: %s", nd.Cid().String()) } - _, err = api.Dag().Get(ctx, nds[0].Cid()) + _, err = api.Dag().Get(ctx, nd.Cid()) if err == nil || !strings.Contains(err.Error(), "not found") { t.Error(err) } - if err := api.Dag().AddMany(ctx, nds); err != nil { + if err := api.Dag().AddMany(ctx, []ipld.Node{nd}); err != nil { t.Error(err) } - _, err = api.Dag().Get(ctx, nds[0].Cid()) + _, err = api.Dag().Get(ctx, nd.Cid()) if err != nil { t.Error(err) } diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index e7df6f1fb7..5594cf0da5 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -8,7 +8,8 @@ import ( coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "github.com/ipfs/go-ipfs/core/coredag" + + ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" ) func (tp *provider) TestPath(t *testing.T) { @@ -37,7 +38,8 @@ func (tp *provider) TestMutablePath(t *testing.T) { t.Error("expected /ipld path to be immutable") } - // get self /ipns path + // get self /ipns path ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" + if api.Key() == nil { t.Fatal(".Key not implemented") } @@ -64,16 +66,16 @@ func (tp *provider) TestPathRemainder(t *testing.T) { t.Fatal(".Dag not implemented") } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - if err := api.Dag().AddMany(ctx, nds); err != nil { + if err := api.Dag().Add(ctx, nd); err != nil { t.Fatal(err) } - p1, err := coreiface.ParsePath(nds[0].String() + "/foo/bar") + p1, err := coreiface.ParsePath(nd.String() + "/foo/bar") if err != nil { t.Error(err) } @@ -100,16 +102,16 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { t.Fatal(".Dag not implemented") } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - if err := api.Dag().AddMany(ctx, nds); err != nil { + if err := api.Dag().Add(ctx, nd); err != nil { t.Fatal(err) } - p1, err := coreiface.ParsePath(nds[0].Cid().String()) + p1, err := coreiface.ParsePath(nd.Cid().String()) if err != nil { t.Error(err) } @@ -136,16 +138,16 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { t.Fatal(".Dag not implemented") } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - if err := api.Dag().AddMany(ctx, nds); err != nil { + if err := api.Dag().Add(ctx, nd); err != nil { t.Fatal(err) } - p1, err := coreiface.ParsePath("/ipld/" + nds[0].Cid().String() + "/bar/baz") + p1, err := coreiface.ParsePath("/ipld/" + nd.Cid().String() + "/bar/baz") if err != nil { t.Error(err) } @@ -177,16 +179,16 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(".Dag not implemented") } - nds, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"foo": {"/": "`+blk.Path().Cid().String()+`"}}`), math.MaxUint64, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"/": "`+blk.Path().Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - if err := api.Dag().AddMany(ctx, nds); err != nil { + if err := api.Dag().Add(ctx, nd); err != nil { t.Fatal(err) } - p1, err := coreiface.ParsePath("/ipld/" + nds[0].Cid().String() + "/foo") + p1, err := coreiface.ParsePath("/ipld/" + nd.Cid().String() + "/foo") if err != nil { t.Error(err) } @@ -196,7 +198,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(err) } - if rp.Root().String() != nds[0].Cid().String() { + if rp.Root().String() != nd.Cid().String() { t.Error("unexpected path root") } diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 2507992222..35c9136187 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -8,7 +8,9 @@ import ( "github.com/ipfs/go-ipfs/core/coreapi/interface" opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - "github.com/ipfs/go-ipfs/core/coredag" + + ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" ) func (tp *provider) TestPin(t *testing.T) { @@ -111,26 +113,26 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Error(err) } - nd2, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"lnk": {"/": "`+p0.Cid().String()+`"}}`), math.MaxUint64, -1) + nd2, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+p0.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - nd3, err := coredag.ParseInputs("json", "dag-cbor", strings.NewReader(`{"lnk": {"/": "`+p1.Cid().String()+`"}}`), math.MaxUint64, -1) + nd3, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+p1.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { t.Error(err) } - if err := api.Dag().AddMany(ctx, append(nd2, nd3...)); err != nil { + if err := api.Dag().AddMany(ctx, []ipld.Node{nd2, nd3}); err != nil { t.Fatal(err) } - err = api.Pin().Add(ctx, iface.IpldPath(nd2[0].Cid())) + err = api.Pin().Add(ctx, iface.IpldPath(nd2.Cid())) if err != nil { t.Error(err) } - err = api.Pin().Add(ctx, iface.IpldPath(nd3[0].Cid()), opt.Pin.Recursive(false)) + err = api.Pin().Add(ctx, iface.IpldPath(nd3.Cid()), opt.Pin.Recursive(false)) if err != nil { t.Error(err) } @@ -153,8 +155,8 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - if list[0].Path().String() != iface.IpldPath(nd3[0].Cid()).String() { - t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpfsPath(nd2[0].Cid()).String()) + if list[0].Path().String() != iface.IpldPath(nd3.Cid()).String() { + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpfsPath(nd2.Cid()).String()) } list, err = api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) @@ -166,8 +168,8 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - if list[0].Path().String() != iface.IpldPath(nd2[0].Cid()).String() { - t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpldPath(nd3[0].Cid()).String()) + if list[0].Path().String() != iface.IpldPath(nd2.Cid()).String() { + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpldPath(nd3.Cid()).String()) } list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) From a2f6e434b94663fc953c37e74156ee27b8ab73fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 8 Feb 2019 19:23:01 +0100 Subject: [PATCH 2587/3147] coreapi: move namesys options to coreapi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@263199d56ec6e7f2dab7c8619b75e2a6fbcf5f15 --- coreiface/options/name.go | 2 +- coreiface/options/namesys/opts.go | 74 +++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 coreiface/options/namesys/opts.go diff --git a/coreiface/options/name.go b/coreiface/options/name.go index e2a0fc1649..e07ef8a595 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -3,7 +3,7 @@ package options import ( "time" - ropts "github.com/ipfs/go-ipfs/namesys/opts" + ropts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" ) const ( diff --git a/coreiface/options/namesys/opts.go b/coreiface/options/namesys/opts.go new file mode 100644 index 0000000000..ee2bd5ac2a --- /dev/null +++ b/coreiface/options/namesys/opts.go @@ -0,0 +1,74 @@ +package nsopts + +import ( + "time" +) + +const ( + // DefaultDepthLimit is the default depth limit used by Resolve. + DefaultDepthLimit = 32 + + // UnlimitedDepth allows infinite recursion in Resolve. You + // probably don't want to use this, but it's here if you absolutely + // trust resolution to eventually complete and can't put an upper + // limit on how many steps it will take. + UnlimitedDepth = 0 +) + +// ResolveOpts specifies options for resolving an IPNS path +type ResolveOpts struct { + // Recursion depth limit + Depth uint + // The number of IPNS records to retrieve from the DHT + // (the best record is selected from this set) + DhtRecordCount uint + // The amount of time to wait for DHT records to be fetched + // and verified. A zero value indicates that there is no explicit + // timeout (although there is an implicit timeout due to dial + // timeouts within the DHT) + DhtTimeout time.Duration +} + +// DefaultResolveOpts returns the default options for resolving +// an IPNS path +func DefaultResolveOpts() ResolveOpts { + return ResolveOpts{ + Depth: DefaultDepthLimit, + DhtRecordCount: 16, + DhtTimeout: time.Minute, + } +} + +// ResolveOpt is used to set an option +type ResolveOpt func(*ResolveOpts) + +// Depth is the recursion depth limit +func Depth(depth uint) ResolveOpt { + return func(o *ResolveOpts) { + o.Depth = depth + } +} + +// DhtRecordCount is the number of IPNS records to retrieve from the DHT +func DhtRecordCount(count uint) ResolveOpt { + return func(o *ResolveOpts) { + o.DhtRecordCount = count + } +} + +// DhtTimeout is the amount of time to wait for DHT records to be fetched +// and verified. A zero value indicates that there is no explicit timeout +func DhtTimeout(timeout time.Duration) ResolveOpt { + return func(o *ResolveOpts) { + o.DhtTimeout = timeout + } +} + +// ProcessOpts converts an array of ResolveOpt into a ResolveOpts object +func ProcessOpts(opts []ResolveOpt) ResolveOpts { + rsopts := DefaultResolveOpts() + for _, option := range opts { + option(&rsopts) + } + return rsopts +} From 94470d9da65a3bcd624efa7d09ae945c48cd0566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 8 Feb 2019 19:23:01 +0100 Subject: [PATCH 2588/3147] coreapi: move namesys options to coreapi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@3ff5fdd4d17f76497d5f93837441446c037bc07f --- namesys/base.go | 2 +- namesys/dns.go | 2 +- namesys/dns_test.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/opts/opts.go | 74 ------------------------ namesys/proquint.go | 2 +- namesys/routing.go | 2 +- 10 files changed, 9 insertions(+), 83 deletions(-) delete mode 100644 namesys/opts/opts.go diff --git a/namesys/base.go b/namesys/base.go index de71ff3452..79cb65be9b 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,7 +5,7 @@ import ( "strings" "time" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" ) diff --git a/namesys/dns.go b/namesys/dns.go index 6eb08ed80d..5a34d5e250 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,7 +6,7 @@ import ( "net" "strings" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" diff --git a/namesys/dns_test.go b/namesys/dns_test.go index ed28aa9459..e434e19f80 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 88c48efd85..96fbb35b38 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,7 +35,7 @@ import ( context "context" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 0a9e316341..1e5c0d04ce 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" diff --git a/namesys/namesys.go b/namesys/namesys.go index a16cf1388b..6a1a495aea 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 3b3c1e255b..1e0c173b66 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" diff --git a/namesys/opts/opts.go b/namesys/opts/opts.go deleted file mode 100644 index ee2bd5ac2a..0000000000 --- a/namesys/opts/opts.go +++ /dev/null @@ -1,74 +0,0 @@ -package nsopts - -import ( - "time" -) - -const ( - // DefaultDepthLimit is the default depth limit used by Resolve. - DefaultDepthLimit = 32 - - // UnlimitedDepth allows infinite recursion in Resolve. You - // probably don't want to use this, but it's here if you absolutely - // trust resolution to eventually complete and can't put an upper - // limit on how many steps it will take. - UnlimitedDepth = 0 -) - -// ResolveOpts specifies options for resolving an IPNS path -type ResolveOpts struct { - // Recursion depth limit - Depth uint - // The number of IPNS records to retrieve from the DHT - // (the best record is selected from this set) - DhtRecordCount uint - // The amount of time to wait for DHT records to be fetched - // and verified. A zero value indicates that there is no explicit - // timeout (although there is an implicit timeout due to dial - // timeouts within the DHT) - DhtTimeout time.Duration -} - -// DefaultResolveOpts returns the default options for resolving -// an IPNS path -func DefaultResolveOpts() ResolveOpts { - return ResolveOpts{ - Depth: DefaultDepthLimit, - DhtRecordCount: 16, - DhtTimeout: time.Minute, - } -} - -// ResolveOpt is used to set an option -type ResolveOpt func(*ResolveOpts) - -// Depth is the recursion depth limit -func Depth(depth uint) ResolveOpt { - return func(o *ResolveOpts) { - o.Depth = depth - } -} - -// DhtRecordCount is the number of IPNS records to retrieve from the DHT -func DhtRecordCount(count uint) ResolveOpt { - return func(o *ResolveOpts) { - o.DhtRecordCount = count - } -} - -// DhtTimeout is the amount of time to wait for DHT records to be fetched -// and verified. A zero value indicates that there is no explicit timeout -func DhtTimeout(timeout time.Duration) ResolveOpt { - return func(o *ResolveOpts) { - o.DhtTimeout = timeout - } -} - -// ProcessOpts converts an array of ResolveOpt into a ResolveOpts object -func ProcessOpts(opts []ResolveOpt) ResolveOpts { - rsopts := DefaultResolveOpts() - for _, option := range opts { - option(&rsopts) - } - return rsopts -} diff --git a/namesys/proquint.go b/namesys/proquint.go index 75d56c80fd..850eb398e2 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" ) type ProquintResolver struct{} diff --git a/namesys/routing.go b/namesys/routing.go index bfe1520e72..66220aba93 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "github.com/ipfs/go-ipfs/namesys/opts" + opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" From ea6b30e219991d9a4125537ac16e3e50df0650d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 8 Feb 2019 20:38:21 +0100 Subject: [PATCH 2589/3147] coreapi: fix failing dag test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/interface-go-ipfs-core@268b4fdbf1604d9296e09fe2cf1cf3328f498898 --- coreiface/tests/dag.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 4decfebb4b..cf332027c8 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -128,7 +128,7 @@ func (tp *provider) TestDagPath(t *testing.T) { t.Error(err) } - if nd.Cid().String() != snd.Cid().String() { + if ndd.Cid().String() != snd.Cid().String() { t.Errorf("got unexpected cid %s, expected %s", ndd.Cid().String(), snd.Cid().String()) } } From 2009531b47971008a2798aee1d0436182f8d6f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 9 Feb 2019 01:11:25 +0100 Subject: [PATCH 2590/3147] Add License This commit was moved from ipfs/interface-go-ipfs-core@6595d29079aa84f2e45e5cfd5bb0dce067ae9158 --- coreiface/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 coreiface/LICENSE diff --git a/coreiface/LICENSE b/coreiface/LICENSE new file mode 100644 index 0000000000..14121ca71d --- /dev/null +++ b/coreiface/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Protocol Labs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From 5c537a46d37b548c6a830a7ea9ca8aca833e9acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 9 Feb 2019 01:15:09 +0100 Subject: [PATCH 2591/3147] Update imports This commit was moved from ipfs/interface-go-ipfs-core@515a114be219fdfdeed3f26c56c91fb7477439bb --- coreiface/block.go | 2 +- coreiface/coreapi.go | 2 +- coreiface/dht.go | 2 +- coreiface/key.go | 2 +- coreiface/name.go | 2 +- coreiface/object.go | 2 +- coreiface/options/name.go | 2 +- coreiface/pin.go | 2 +- coreiface/pubsub.go | 2 +- coreiface/tests/api.go | 2 +- coreiface/tests/block.go | 4 ++-- coreiface/tests/dag.go | 2 +- coreiface/tests/dht.go | 4 ++-- coreiface/tests/key.go | 4 ++-- coreiface/tests/name.go | 4 ++-- coreiface/tests/object.go | 4 ++-- coreiface/tests/path.go | 4 ++-- coreiface/tests/pin.go | 4 ++-- coreiface/tests/pubsub.go | 5 +++-- coreiface/tests/unixfs.go | 4 ++-- coreiface/unixfs.go | 2 +- 21 files changed, 31 insertions(+), 30 deletions(-) diff --git a/coreiface/block.go b/coreiface/block.go index b99b05fdb7..587ad339f6 100644 --- a/coreiface/block.go +++ b/coreiface/block.go @@ -4,7 +4,7 @@ import ( "context" "io" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + options "github.com/ipfs/interface-go-ipfs-core/options" ) // BlockStat contains information about a block diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index d26ec4f7d1..651af8bf08 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -5,7 +5,7 @@ package iface import ( "context" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/interface-go-ipfs-core/options" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" ) diff --git a/coreiface/dht.go b/coreiface/dht.go index 94fb3779f7..b3f7879e33 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -3,7 +3,7 @@ package iface import ( "context" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/interface-go-ipfs-core/options" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" diff --git a/coreiface/key.go b/coreiface/key.go index 69857e6137..154f82b669 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -3,7 +3,7 @@ package iface import ( "context" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + options "github.com/ipfs/interface-go-ipfs-core/options" "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" ) diff --git a/coreiface/name.go b/coreiface/name.go index a02bc07874..51b005b7ef 100644 --- a/coreiface/name.go +++ b/coreiface/name.go @@ -4,7 +4,7 @@ import ( "context" "errors" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + options "github.com/ipfs/interface-go-ipfs-core/options" ) var ErrResolveFailed = errors.New("could not resolve name") diff --git a/coreiface/object.go b/coreiface/object.go index 2ed357cb63..28613aaa04 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -4,7 +4,7 @@ import ( "context" "io" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + options "github.com/ipfs/interface-go-ipfs-core/options" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/coreiface/options/name.go b/coreiface/options/name.go index e07ef8a595..59aaf2ca36 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -3,7 +3,7 @@ package options import ( "time" - ropts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + ropts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ) const ( diff --git a/coreiface/pin.go b/coreiface/pin.go index 6e13def8f5..6a7dab4137 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -3,7 +3,7 @@ package iface import ( "context" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + options "github.com/ipfs/interface-go-ipfs-core/options" ) // Pin holds information about pinned resource diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index 9336738260..40cea689a9 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -4,7 +4,7 @@ import ( "context" "io" - options "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + options "github.com/ipfs/interface-go-ipfs-core/options" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" ) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index 7a4bd73862..5e7c1f5415 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -6,7 +6,7 @@ import ( "testing" "time" - coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + coreiface "github.com/ipfs/interface-go-ipfs-core" ) var apiNotImplemented = errors.New("api not implemented") diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index c2ee70a3a6..2e0a84b408 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -6,8 +6,8 @@ import ( "strings" "testing" - coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" - opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + coreiface "github.com/ipfs/interface-go-ipfs-core" + opt "github.com/ipfs/interface-go-ipfs-core/options" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index cf332027c8..9e0bc34ba7 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + coreiface "github.com/ipfs/interface-go-ipfs-core" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index d2eae1af47..1793cd7384 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -5,8 +5,8 @@ import ( "io" "testing" - "github.com/ipfs/go-ipfs/core/coreapi/interface" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/interface-go-ipfs-core" + "github.com/ipfs/interface-go-ipfs-core/options" ) func (tp *provider) TestDht(t *testing.T) { diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index 66011f99f9..dbbfce0599 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -5,8 +5,8 @@ import ( "strings" "testing" - "github.com/ipfs/go-ipfs/core/coreapi/interface" - opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/interface-go-ipfs-core" + opt "github.com/ipfs/interface-go-ipfs-core/options" ) func (tp *provider) TestKey(t *testing.T) { diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 8d87bd495d..eb5cd1e3a3 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -11,8 +11,8 @@ import ( ipath "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" - coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" - opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + coreiface "github.com/ipfs/interface-go-ipfs-core" + opt "github.com/ipfs/interface-go-ipfs-core/options" ) func (tp *provider) TestName(t *testing.T) { diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 2a3b1bd5ca..026def73bb 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "github.com/ipfs/go-ipfs/core/coreapi/interface" - opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/interface-go-ipfs-core" + opt "github.com/ipfs/interface-go-ipfs-core/options" ) func (tp *provider) TestObject(t *testing.T) { diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 5594cf0da5..01841d869c 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -6,8 +6,8 @@ import ( "strings" "testing" - coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + coreiface "github.com/ipfs/interface-go-ipfs-core" + "github.com/ipfs/interface-go-ipfs-core/options" ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" ) diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 35c9136187..27ed2ad5db 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -6,8 +6,8 @@ import ( "strings" "testing" - "github.com/ipfs/go-ipfs/core/coreapi/interface" - opt "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/interface-go-ipfs-core" + opt "github.com/ipfs/interface-go-ipfs-core/options" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index b993f51dc5..14e3545a9d 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -2,10 +2,11 @@ package tests import ( "context" - "github.com/ipfs/go-ipfs/core/coreapi/interface" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" "testing" "time" + + "github.com/ipfs/interface-go-ipfs-core" + "github.com/ipfs/interface-go-ipfs-core/options" ) func (tp *provider) TestPubSub(t *testing.T) { diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index f5ce85b78b..cb5897b69c 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -15,8 +15,8 @@ import ( "sync" "testing" - coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + coreiface "github.com/ipfs/interface-go-ipfs-core" + "github.com/ipfs/interface-go-ipfs-core/options" "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" cbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 8e559022cc..c01ccde78e 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -2,7 +2,7 @@ package iface import ( "context" - "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + "github.com/ipfs/interface-go-ipfs-core/options" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" From def3b3d8058572379b772d2db227011fd45662ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 9 Feb 2019 01:23:13 +0100 Subject: [PATCH 2592/3147] gx-go uw This commit was moved from ipfs/interface-go-ipfs-core@93299fcb14d845e3ed4c128f0792f18458794c62 --- coreiface/coreapi.go | 2 +- coreiface/dag.go | 2 +- coreiface/dht.go | 4 ++-- coreiface/key.go | 2 +- coreiface/object.go | 4 ++-- coreiface/options/block.go | 4 ++-- coreiface/options/unixfs.go | 6 +++--- coreiface/path.go | 4 ++-- coreiface/pubsub.go | 2 +- coreiface/swarm.go | 10 +++++----- coreiface/tests/block.go | 2 +- coreiface/tests/dag.go | 6 +++--- coreiface/tests/name.go | 4 ++-- coreiface/tests/path.go | 4 ++-- coreiface/tests/pin.go | 4 ++-- coreiface/tests/unixfs.go | 14 +++++++------- coreiface/unixfs.go | 6 +++--- 17 files changed, 40 insertions(+), 40 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 651af8bf08..f3433c0890 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) // CoreAPI defines an unified interface to IPFS for Go programs diff --git a/coreiface/dag.go b/coreiface/dag.go index d15e24360e..3cc3aeb4de 100644 --- a/coreiface/dag.go +++ b/coreiface/dag.go @@ -1,7 +1,7 @@ package iface import ( - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + ipld "github.com/ipfs/go-ipld-format" ) // APIDagService extends ipld.DAGService diff --git a/coreiface/dht.go b/coreiface/dht.go index b3f7879e33..d1ae05125d 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -5,8 +5,8 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" + peer "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/key.go b/coreiface/key.go index 154f82b669..78c29d2684 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -5,7 +5,7 @@ import ( options "github.com/ipfs/interface-go-ipfs-core/options" - "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + "github.com/libp2p/go-libp2p-peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/object.go b/coreiface/object.go index 28613aaa04..4f9652fb1d 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -6,8 +6,8 @@ import ( options "github.com/ipfs/interface-go-ipfs-core/options" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" ) // ObjectStat provides information about dag nodes diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 40dfba79ab..043dfdea46 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -2,8 +2,8 @@ package options import ( "fmt" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + cid "github.com/ipfs/go-cid" + mh "github.com/multiformats/go-multihash" ) type BlockPutSettings struct { diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 0dd1296096..b76b01adf4 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" - mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + cid "github.com/ipfs/go-cid" + dag "github.com/ipfs/go-merkledag" + mh "github.com/multiformats/go-multihash" ) type Layout int diff --git a/coreiface/path.go b/coreiface/path.go index d59a851b45..4e86172ace 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,8 +1,8 @@ package iface import ( - ipfspath "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + "github.com/ipfs/go-cid" + ipfspath "github.com/ipfs/go-path" ) //TODO: merge with ipfspath so we don't depend on it diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index 40cea689a9..212e772253 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/interface-go-ipfs-core/options" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + peer "github.com/libp2p/go-libp2p-peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 3af078f17a..2e00ecbd31 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,11 +5,11 @@ import ( "errors" "time" - ma "gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr" - "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" - net "gx/ipfs/QmZ7cBWUXkyWTMN4qH6NGoyMVs7JugyFChBNP4ZUp5rJHH/go-libp2p-net" - "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol" + net "github.com/libp2p/go-libp2p-net" + "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-protocol" + ma "github.com/multiformats/go-multiaddr" ) var ( diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 2e0a84b408..3cd74358d9 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -9,7 +9,7 @@ import ( coreiface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" - mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + mh "github.com/multiformats/go-multihash" ) func (tp *provider) TestBlock(t *testing.T) { diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 9e0bc34ba7..7446c20de3 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -9,9 +9,9 @@ import ( coreiface "github.com/ipfs/interface-go-ipfs-core" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" - mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + ipldcbor "github.com/ipfs/go-ipld-cbor" + ipld "github.com/ipfs/go-ipld-format" + mh "github.com/multiformats/go-multihash" ) func (tp *provider) TestDag(t *testing.T) { diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index eb5cd1e3a3..1eb2dd5136 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -8,8 +8,8 @@ import ( "testing" "time" - ipath "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" + "github.com/ipfs/go-ipfs-files" + ipath "github.com/ipfs/go-path" coreiface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 01841d869c..4da1a5181b 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -9,7 +9,7 @@ import ( coreiface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" - ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" + ipldcbor "github.com/ipfs/go-ipld-cbor" ) func (tp *provider) TestPath(t *testing.T) { @@ -38,7 +38,7 @@ func (tp *provider) TestMutablePath(t *testing.T) { t.Error("expected /ipld path to be immutable") } - // get self /ipns path ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" + // get self /ipns path if api.Key() == nil { t.Fatal(".Key not implemented") diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 27ed2ad5db..eed5422833 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -9,8 +9,8 @@ import ( "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - ipldcbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" + ipldcbor "github.com/ipfs/go-ipld-cbor" + ipld "github.com/ipfs/go-ipld-format" ) func (tp *provider) TestPin(t *testing.T) { diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index cb5897b69c..bcb5331d51 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -18,13 +18,13 @@ import ( coreiface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" - "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - cbor "gx/ipfs/QmRZxJ7oybgnnwriuRub9JXp5YdFM9wiGSyRq38QC7swpS/go-ipld-cbor" - mdag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" - "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" - "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs/importer/helpers" - "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" - mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-ipfs-files" + cbor "github.com/ipfs/go-ipld-cbor" + mdag "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-unixfs" + "github.com/ipfs/go-unixfs/importer/helpers" + mh "github.com/multiformats/go-multihash" ) func (tp *provider) TestUnixfs(t *testing.T) { diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index c01ccde78e..5aae00dc4b 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,9 +4,9 @@ import ( "context" "github.com/ipfs/interface-go-ipfs-core/options" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" - "gx/ipfs/QmaXvvAVAQ5ABqM5xtjYmV85xmN5MkWAZsX9H9Fwo4FVXp/go-ipfs-files" + "github.com/ipfs/go-ipfs-files" + ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-unixfs" ) type AddEvent struct { From a2c6f1f76b1fa4725a2408e49538da8975553fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 9 Feb 2019 01:40:57 +0100 Subject: [PATCH 2593/3147] coreapi: update imports to updated interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@a7de936a5e314ef01ef91eb9eac9088d15070192 --- namesys/base.go | 2 +- namesys/dns.go | 2 +- namesys/dns_test.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/proquint.go | 2 +- namesys/routing.go | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 79cb65be9b..91fda73011 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,7 +5,7 @@ import ( "strings" "time" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" ) diff --git a/namesys/dns.go b/namesys/dns.go index 5a34d5e250..fcc93b7126 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,7 +6,7 @@ import ( "net" "strings" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" diff --git a/namesys/dns_test.go b/namesys/dns_test.go index e434e19f80..4fdc46c354 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 96fbb35b38..10009bb826 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,8 +35,8 @@ import ( context "context" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 1e5c0d04ce..0e94abfdb3 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" diff --git a/namesys/namesys.go b/namesys/namesys.go index 6a1a495aea..4eba5bae52 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 1e0c173b66..45314bebdc 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" diff --git a/namesys/proquint.go b/namesys/proquint.go index 850eb398e2..f488ba6b46 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" ) type ProquintResolver struct{} diff --git a/namesys/routing.go b/namesys/routing.go index 66220aba93..f8c6f9a2cb 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,7 +7,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "github.com/ipfs/go-ipfs/core/coreapi/interface/options/namesys" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" From 9bd5f6cfb14fcf95e83363f511f2f1408e594700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 9 Feb 2019 01:57:26 +0100 Subject: [PATCH 2594/3147] coreapi: fix import grouping after extracting iface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@9fec2b36bbaf843a3f457506c1136af90569995d --- namesys/base.go | 3 +-- namesys/dns.go | 3 +-- namesys/interface.go | 3 +-- namesys/ipns_resolver_validation_test.go | 6 ++---- namesys/namesys.go | 6 ++---- namesys/namesys_test.go | 3 +-- namesys/proquint.go | 3 +-- namesys/publisher.go | 4 ++-- namesys/resolve_test.go | 3 +-- namesys/routing.go | 6 ++---- 10 files changed, 14 insertions(+), 26 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 91fda73011..4818cfbaf7 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,9 +5,8 @@ import ( "strings" "time" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" ) type onceResult struct { diff --git a/namesys/dns.go b/namesys/dns.go index fcc93b7126..868d0a9b3a 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,9 +6,8 @@ import ( "net" "strings" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/interface.go b/namesys/interface.go index 10009bb826..5567751220 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,10 +35,9 @@ import ( context "context" + ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 0e94abfdb3..af19801457 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,13 +5,10 @@ import ( "testing" "time" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" @@ -20,6 +17,7 @@ import ( ropts "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing/options" testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" record "gx/ipfs/QmexPd3srWxHC76gW2p5j5tQvwpPuCoW7b9vFhJ8BRPyh9/go-libp2p-record" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" diff --git a/namesys/namesys.go b/namesys/namesys.go index 4eba5bae52..8e39b0bfa5 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,14 +5,12 @@ import ( "strings" "time" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 45314bebdc..9cb17fa7ef 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,14 +5,13 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" offroute "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" diff --git a/namesys/proquint.go b/namesys/proquint.go index f488ba6b46..c63d7e03d2 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -5,9 +5,8 @@ import ( "errors" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" + proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index d20cda5a0b..19b49e6d1d 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -7,14 +7,14 @@ import ( "time" pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - ft "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" + ft "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dsquery "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 54cc4c8d69..368e52698d 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,9 +6,8 @@ import ( "testing" "time" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" diff --git a/namesys/routing.go b/namesys/routing.go index f8c6f9a2cb..6ab72f2f74 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,15 +5,13 @@ import ( "strings" "time" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" + path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" + opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" dht "gx/ipfs/Qmeh1RJ3kvEXgmuEmbNLwZ9wVUDuaqE7BhhEngd8aXV8tf/go-libp2p-kad-dht" From 3559740e16963ab8d004a003575fe3e70c2a170c Mon Sep 17 00:00:00 2001 From: Adam Uhlir Date: Fri, 8 Feb 2019 17:06:03 -0800 Subject: [PATCH 2595/3147] Rename DefaultRecordTTL into DefaultRecordEOL License: MIT Signed-off-by: Adam Uhlir This commit was moved from ipfs/go-namesys@3c318b843063d461e4236de8d918b9019c437dde --- namesys/namesys.go | 2 +- namesys/publisher.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 6a1a495aea..ae8f422d4a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -173,7 +173,7 @@ func emitOnceResult(ctx context.Context, outCh chan<- onceResult, r onceResult) // Publish implements Publisher func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { - return ns.PublishWithEOL(ctx, name, value, time.Now().Add(DefaultRecordTTL)) + return ns.PublishWithEOL(ctx, name, value, time.Now().Add(DefaultRecordEOL)) } func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { diff --git a/namesys/publisher.go b/namesys/publisher.go index d20cda5a0b..b4f9eafe4f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -24,7 +24,7 @@ import ( const ipnsPrefix = "/ipns/" const PublishPutValTimeout = time.Minute -const DefaultRecordTTL = 24 * time.Hour +const DefaultRecordEOL = 24 * time.Hour // IpnsPublisher is capable of publishing and resolving names to the IPFS // routing system. @@ -48,7 +48,7 @@ func NewIpnsPublisher(route routing.ValueStore, ds ds.Datastore) *IpnsPublisher // and publishes it out to the routing system func (p *IpnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) - return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordTTL)) + return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordEOL)) } func IpnsDsKey(id peer.ID) ds.Key { From c426f90634a506cc46bf18d55ca59fe2883cd00a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 11 Feb 2019 08:46:22 -0800 Subject: [PATCH 2596/3147] gx: update go-ipfs-files fix compatibility issue with js-ipfs License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@d0ac8b42160cba98ecaec1ae4f8fcd9a1f108eab --- namesys/base.go | 2 +- namesys/dns.go | 2 +- namesys/dns_test.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 4 ++-- namesys/proquint.go | 2 +- namesys/publisher.go | 2 +- namesys/routing.go | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 4818cfbaf7..682b78f2c4 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -6,7 +6,7 @@ import ( "time" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" ) type onceResult struct { diff --git a/namesys/dns.go b/namesys/dns.go index 868d0a9b3a..1898453a64 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -7,7 +7,7 @@ import ( "strings" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 4fdc46c354..07bc8c66e1 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 5567751220..a7a277cbdd 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -37,7 +37,7 @@ import ( ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index af19801457..6a1095b37c 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -15,9 +15,9 @@ import ( offline "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" ropts "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing/options" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" record "gx/ipfs/QmexPd3srWxHC76gW2p5j5tQvwpPuCoW7b9vFhJ8BRPyh9/go-libp2p-record" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" diff --git a/namesys/namesys.go b/namesys/namesys.go index 8e39b0bfa5..ae96b696cf 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -10,7 +10,7 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 9cb17fa7ef..0a885ae1f8 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,9 +10,9 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" offroute "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" - "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" + "gx/ipfs/QmetDvVkKzbr8PYuBV6S48q5DU9EUQktYjo9KdkA3zbQgK/go-unixfs" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index c63d7e03d2..b49be8b00c 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -5,7 +5,7 @@ import ( "errors" path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 19b49e6d1d..064b4e087c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -14,8 +14,8 @@ import ( routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" - ft "gx/ipfs/QmZArMcsVDsXdcLbUx4844CuqKXBpbxdeiryM4cnmGTNRq/go-unixfs" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + ft "gx/ipfs/QmetDvVkKzbr8PYuBV6S48q5DU9EUQktYjo9KdkA3zbQgK/go-unixfs" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dsquery "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" diff --git a/namesys/routing.go b/namesys/routing.go index 6ab72f2f74..4a8671f624 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -9,9 +9,9 @@ import ( path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" + opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" - opts "gx/ipfs/QmWqb6eEpQ2qtu2jmcDWJXebP7YS14fwor8562g795ZxjH/interface-go-ipfs-core/options/namesys" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" dht "gx/ipfs/Qmeh1RJ3kvEXgmuEmbNLwZ9wVUDuaqE7BhhEngd8aXV8tf/go-libp2p-kad-dht" From bc7e36143ffe315dc853eecd39d4be5e9b1ab425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 12 Feb 2019 13:30:07 +0100 Subject: [PATCH 2597/3147] pubsub: fix race in test This commit was moved from ipfs/interface-go-ipfs-core@a84bfa1f4055bb15e3727841df03c3f306ed5cfc --- coreiface/tests/pubsub.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index 14e3545a9d..bb870de6c3 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -38,7 +38,7 @@ func (tp *provider) TestBasicPubSub(t *testing.T) { tick := time.Tick(100 * time.Millisecond) for { - err = apis[1].PubSub().Publish(ctx, "testch", []byte("hello world")) + err := apis[1].PubSub().Publish(ctx, "testch", []byte("hello world")) if err != nil { t.Fatal(err) } From dc402e7962af0a940097f8bfa959036d12db424a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 14 Feb 2019 14:58:35 -0800 Subject: [PATCH 2598/3147] gx: update libp2p stuff License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@8e9d688d14bc48ffbb204c2d051bc3017949ca1d --- namesys/base.go | 4 ++-- namesys/cache.go | 2 +- namesys/dns.go | 4 ++-- namesys/dns_test.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 4 ++-- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 4 ++-- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 6 +++--- 14 files changed, 26 insertions(+), 26 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 682b78f2c4..6b6de3d048 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,8 +5,8 @@ import ( "strings" "time" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 44ecaab4d8..0dc79d87ab 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 1898453a64..e2c3202eff 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,8 +6,8 @@ import ( "net" "strings" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 07bc8c66e1..29fce15071 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index a7a277cbdd..137a08e87e 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -36,8 +36,8 @@ import ( context "context" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 6a1095b37c..9ab672dcee 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,16 +6,16 @@ import ( "time" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" offline "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" ropts "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing/options" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" record "gx/ipfs/QmexPd3srWxHC76gW2p5j5tQvwpPuCoW7b9vFhJ8BRPyh9/go-libp2p-record" diff --git a/namesys/namesys.go b/namesys/namesys.go index 9192a300fb..a74e94f779 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,11 +6,11 @@ import ( "time" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 0a885ae1f8..3223697a48 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -6,13 +6,13 @@ import ( "testing" ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" offroute "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" + "gx/ipfs/QmSygPSC63Uka8z9PYokAS4thiMAor17vhXUTi4qmKHh6P/go-unixfs" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - "gx/ipfs/QmetDvVkKzbr8PYuBV6S48q5DU9EUQktYjo9KdkA3zbQgK/go-unixfs" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" ) diff --git a/namesys/proquint.go b/namesys/proquint.go index b49be8b00c..37df4aba09 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 0583a4d98c..69eb52258b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -10,12 +10,12 @@ import ( ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" + ft "gx/ipfs/QmSygPSC63Uka8z9PYokAS4thiMAor17vhXUTi4qmKHh6P/go-unixfs" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - ft "gx/ipfs/QmetDvVkKzbr8PYuBV6S48q5DU9EUQktYjo9KdkA3zbQgK/go-unixfs" ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" dsquery "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 46d381a5d3..fb7ea3ded4 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 738a3301d0..2ae20392ef 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmSgtf5vHyugoxcwMbyNy6bZ9qPDDTJSYEED2GkWjLwitZ/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmebEmt23jQxrwnqBkFL4qbpE8EnnQunpv5U32LS5ESus1/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 368e52698d..930d5219a0 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -7,7 +7,7 @@ import ( "time" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" diff --git a/namesys/routing.go b/namesys/routing.go index 4a8671f624..d08bb51031 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,16 +5,16 @@ import ( "strings" "time" + opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQ3YSqfxunT5QBg6KBVskKyRE26q6hjSMyhpxchpm7jEN/go-path" + path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" - opts "gx/ipfs/QmVSbopkxvLSRFuUn1SeHoEcArhCLn2okUbVpLvhQ1pm1X/interface-go-ipfs-core/options/namesys" + dht "gx/ipfs/QmS5Tvk8Adz1qPkCBCbiScty9KPbMSMCSTbFK4TVvatKqi/go-libp2p-kad-dht" ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - dht "gx/ipfs/Qmeh1RJ3kvEXgmuEmbNLwZ9wVUDuaqE7BhhEngd8aXV8tf/go-libp2p-kad-dht" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) From 608db31d87f6b819235388eeae8bd20c86f14599 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 14 Feb 2019 14:58:35 -0800 Subject: [PATCH 2599/3147] gx: update libp2p stuff License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@7efadfb8a743832e11515e05b813116dcc3f4216 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index eebfb1f413..86bc86f1dd 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" - bserv "gx/ipfs/QmbgbNxC1PMyS2gbx7nf2jKNG7bZAfYJJebdK4ptBBWCz1/go-blockservice" + dag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" + bserv "gx/ipfs/QmZuPasxd7fSgtzRzCL7Z8J8QwDJML2fgBUExRbQCqb4BT/go-blockservice" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index bac29feb73..bf4a719570 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" + mdag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 763643fea5..f7da552694 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" - bs "gx/ipfs/QmbgbNxC1PMyS2gbx7nf2jKNG7bZAfYJJebdK4ptBBWCz1/go-blockservice" + mdag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" + bs "gx/ipfs/QmZuPasxd7fSgtzRzCL7Z8J8QwDJML2fgBUExRbQCqb4BT/go-blockservice" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 982f7d22a9..846e2013e6 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" + "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index b81f9aad2f..96340bed15 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" - bserv "gx/ipfs/QmbgbNxC1PMyS2gbx7nf2jKNG7bZAfYJJebdK4ptBBWCz1/go-blockservice" + dag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" + bserv "gx/ipfs/QmZuPasxd7fSgtzRzCL7Z8J8QwDJML2fgBUExRbQCqb4BT/go-blockservice" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From 00f24d271d3f65b0fd3cf847b18d2d934166523d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 14 Feb 2019 14:58:35 -0800 Subject: [PATCH 2600/3147] gx: update libp2p stuff License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@87f6409caeff502c8679040b57ef95100ceb953f --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 8205bd6cc6..2d06a9ac23 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmUtsx89yiCY6F8mbpP6ecXckiSzCBH7EvkKZuZEHBcr1m/go-merkledag" + dag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" From ea3c527fd71ae88eecfbf03380759594b9934a83 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 18 Feb 2019 16:24:47 +0100 Subject: [PATCH 2601/3147] gx publish 0.1.7 This commit was moved from ipfs/go-ipfs-blockstore@fd2101897a88d0a9649aa61c902282455c544d46 --- blockstore/blockstore_test.go | 3 +++ blockstore/bloom_cache_test.go | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 50b8ae0558..b01574a440 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -272,3 +272,6 @@ func (c *queryTestDS) Query(q dsq.Query) (dsq.Results, error) { func (c *queryTestDS) Batch() (ds.Batch, error) { return ds.NewBasicBatch(c), nil } +func (c *queryTestDS) Close() error { + return nil +} diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index d9474ada19..fd65c0b286 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -148,6 +148,8 @@ func TestHasIsBloomCached(t *testing.T) { } } +var _ ds.Batching = (*callbackDatastore)(nil) + type callbackDatastore struct { sync.Mutex f func() @@ -186,6 +188,10 @@ func (c *callbackDatastore) GetSize(key ds.Key) (size int, err error) { return c.ds.GetSize(key) } +func (c *callbackDatastore) Close() error { + return nil +} + func (c *callbackDatastore) Delete(key ds.Key) (err error) { c.CallF() return c.ds.Delete(key) From 6f16fbbde6d84491210bf8c2442e5de52821524e Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 18 Feb 2019 17:08:41 +0100 Subject: [PATCH 2602/3147] gx publish 0.1.21 This commit was moved from ipfs/go-ipns@00a0e62c4a22e61f1de061f7d0249febce82f09f --- ipns/pb/ipns.pb.go | 111 ++++++++++++++++++++++++++++----------------- 1 file changed, 70 insertions(+), 41 deletions(-) diff --git a/ipns/pb/ipns.pb.go b/ipns/pb/ipns.pb.go index 5a6a0bebba..b38ce4ea93 100644 --- a/ipns/pb/ipns.pb.go +++ b/ipns/pb/ipns.pb.go @@ -3,13 +3,13 @@ package ipns_pb -import proto "github.com/gogo/protobuf/proto" -import fmt "fmt" -import math "math" - -import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" - -import io "io" +import ( + fmt "fmt" + github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -32,6 +32,7 @@ const ( var IpnsEntry_ValidityType_name = map[int32]string{ 0: "EOL", } + var IpnsEntry_ValidityType_value = map[string]int32{ "EOL": 0, } @@ -41,9 +42,11 @@ func (x IpnsEntry_ValidityType) Enum() *IpnsEntry_ValidityType { *p = x return p } + func (x IpnsEntry_ValidityType) String() string { return proto.EnumName(IpnsEntry_ValidityType_name, int32(x)) } + func (x *IpnsEntry_ValidityType) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(IpnsEntry_ValidityType_value, data, "IpnsEntry_ValidityType") if err != nil { @@ -52,8 +55,9 @@ func (x *IpnsEntry_ValidityType) UnmarshalJSON(data []byte) error { *x = IpnsEntry_ValidityType(value) return nil } + func (IpnsEntry_ValidityType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_ipns_02f6be73595bcc54, []int{0, 0} + return fileDescriptor_4d5b16fb32bfe8ea, []int{0, 0} } type IpnsEntry struct { @@ -77,7 +81,7 @@ func (m *IpnsEntry) Reset() { *m = IpnsEntry{} } func (m *IpnsEntry) String() string { return proto.CompactTextString(m) } func (*IpnsEntry) ProtoMessage() {} func (*IpnsEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_ipns_02f6be73595bcc54, []int{0} + return fileDescriptor_4d5b16fb32bfe8ea, []int{0} } func (m *IpnsEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -94,8 +98,8 @@ func (m *IpnsEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (dst *IpnsEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_IpnsEntry.Merge(dst, src) +func (m *IpnsEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_IpnsEntry.Merge(m, src) } func (m *IpnsEntry) XXX_Size() int { return m.Size() @@ -156,9 +160,30 @@ func (m *IpnsEntry) GetPubKey() []byte { } func init() { - proto.RegisterType((*IpnsEntry)(nil), "ipns.pb.IpnsEntry") proto.RegisterEnum("ipns.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) + proto.RegisterType((*IpnsEntry)(nil), "ipns.pb.IpnsEntry") +} + +func init() { proto.RegisterFile("ipns.proto", fileDescriptor_4d5b16fb32bfe8ea) } + +var fileDescriptor_4d5b16fb32bfe8ea = []byte{ + // 221 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xca, 0x2c, 0xc8, 0x2b, + 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0xb0, 0x93, 0x94, 0xfe, 0x33, 0x72, 0x71, + 0x7a, 0x16, 0xe4, 0x15, 0xbb, 0xe6, 0x95, 0x14, 0x55, 0x0a, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, + 0x94, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x69, 0xf0, 0x04, 0x41, 0x38, 0x42, 0x32, 0x5c, 0x9c, 0xc5, + 0x99, 0xe9, 0x79, 0x89, 0x25, 0xa5, 0x45, 0xa9, 0x12, 0x4c, 0x60, 0x19, 0x84, 0x80, 0x90, 0x33, + 0x17, 0x4f, 0x59, 0x62, 0x4e, 0x66, 0x4a, 0x66, 0x49, 0x65, 0x48, 0x65, 0x41, 0xaa, 0x04, 0xb3, + 0x02, 0xa3, 0x06, 0x9f, 0x91, 0xbc, 0x1e, 0xd4, 0x06, 0x3d, 0xb8, 0xe9, 0x7a, 0x61, 0x48, 0xca, + 0x82, 0x50, 0x34, 0x09, 0x49, 0x71, 0x71, 0xc0, 0xf8, 0x12, 0x2c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, + 0x70, 0x3e, 0x48, 0xae, 0x38, 0xb5, 0xb0, 0x34, 0x35, 0x2f, 0x39, 0x55, 0x82, 0x55, 0x81, 0x51, + 0x83, 0x25, 0x08, 0xce, 0x17, 0x12, 0xe0, 0x62, 0x2e, 0x29, 0xc9, 0x91, 0x60, 0x03, 0x0b, 0x83, + 0x98, 0x42, 0x62, 0x5c, 0x6c, 0x05, 0xa5, 0x49, 0xde, 0xa9, 0x95, 0x12, 0xec, 0x60, 0x73, 0xa0, + 0x3c, 0x25, 0x71, 0x2e, 0x1e, 0x64, 0xfb, 0x85, 0xd8, 0xb9, 0x98, 0x5d, 0xfd, 0x7d, 0x04, 0x18, + 0x9c, 0x78, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0x46, 0x40, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x32, 0x35, 0xc7, 0xf2, 0x25, 0x01, 0x00, 0x00, } + func (m *IpnsEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -233,6 +258,9 @@ func encodeVarintIpns(dAtA []byte, offset int, v uint64) int { return offset + 1 } func (m *IpnsEntry) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Value != nil { @@ -295,7 +323,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -323,7 +351,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= (int(b) & 0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } @@ -332,6 +360,9 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { return ErrInvalidLengthIpns } postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -355,7 +386,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= (int(b) & 0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } @@ -364,6 +395,9 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { return ErrInvalidLengthIpns } postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -387,7 +421,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (IpnsEntry_ValidityType(b) & 0x7F) << shift + v |= IpnsEntry_ValidityType(b&0x7F) << shift if b < 0x80 { break } @@ -407,7 +441,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= (int(b) & 0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } @@ -416,6 +450,9 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { return ErrInvalidLengthIpns } postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -438,7 +475,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (uint64(b) & 0x7F) << shift + v |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -458,7 +495,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (uint64(b) & 0x7F) << shift + v |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -478,7 +515,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= (int(b) & 0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } @@ -487,6 +524,9 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { return ErrInvalidLengthIpns } postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -504,6 +544,9 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { if skippy < 0 { return ErrInvalidLengthIpns } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthIpns + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } @@ -577,10 +620,13 @@ func skipIpns(dAtA []byte) (n int, err error) { break } } - iNdEx += length if length < 0 { return 0, ErrInvalidLengthIpns } + iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthIpns + } return iNdEx, nil case 3: for { @@ -609,6 +655,9 @@ func skipIpns(dAtA []byte) (n int, err error) { return 0, err } iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthIpns + } } return iNdEx, nil case 4: @@ -627,23 +676,3 @@ var ( ErrInvalidLengthIpns = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowIpns = fmt.Errorf("proto: integer overflow") ) - -func init() { proto.RegisterFile("ipns.proto", fileDescriptor_ipns_02f6be73595bcc54) } - -var fileDescriptor_ipns_02f6be73595bcc54 = []byte{ - // 221 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xca, 0x2c, 0xc8, 0x2b, - 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0xb0, 0x93, 0x94, 0xfe, 0x33, 0x72, 0x71, - 0x7a, 0x16, 0xe4, 0x15, 0xbb, 0xe6, 0x95, 0x14, 0x55, 0x0a, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, - 0x94, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x69, 0xf0, 0x04, 0x41, 0x38, 0x42, 0x32, 0x5c, 0x9c, 0xc5, - 0x99, 0xe9, 0x79, 0x89, 0x25, 0xa5, 0x45, 0xa9, 0x12, 0x4c, 0x60, 0x19, 0x84, 0x80, 0x90, 0x33, - 0x17, 0x4f, 0x59, 0x62, 0x4e, 0x66, 0x4a, 0x66, 0x49, 0x65, 0x48, 0x65, 0x41, 0xaa, 0x04, 0xb3, - 0x02, 0xa3, 0x06, 0x9f, 0x91, 0xbc, 0x1e, 0xd4, 0x06, 0x3d, 0xb8, 0xe9, 0x7a, 0x61, 0x48, 0xca, - 0x82, 0x50, 0x34, 0x09, 0x49, 0x71, 0x71, 0xc0, 0xf8, 0x12, 0x2c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, - 0x70, 0x3e, 0x48, 0xae, 0x38, 0xb5, 0xb0, 0x34, 0x35, 0x2f, 0x39, 0x55, 0x82, 0x55, 0x81, 0x51, - 0x83, 0x25, 0x08, 0xce, 0x17, 0x12, 0xe0, 0x62, 0x2e, 0x29, 0xc9, 0x91, 0x60, 0x03, 0x0b, 0x83, - 0x98, 0x42, 0x62, 0x5c, 0x6c, 0x05, 0xa5, 0x49, 0xde, 0xa9, 0x95, 0x12, 0xec, 0x60, 0x73, 0xa0, - 0x3c, 0x25, 0x71, 0x2e, 0x1e, 0x64, 0xfb, 0x85, 0xd8, 0xb9, 0x98, 0x5d, 0xfd, 0x7d, 0x04, 0x18, - 0x9c, 0x78, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0x46, 0x40, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x32, 0x35, 0xc7, 0xf2, 0x25, 0x01, 0x00, 0x00, -} From cf950c2acfcbf76caf93e96d80c227ba00286334 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 18 Feb 2019 17:19:12 +0100 Subject: [PATCH 2603/3147] gx publish 1.3.6 This commit was moved from ipfs/go-unixfs@8a24c3802dd689dac7d3e176c75bd003a779aeac --- unixfs/pb/unixfs.pb.go | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 0ec0617e7e..6f1c8fe830 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -3,9 +3,11 @@ package unixfs_pb -import proto "github.com/gogo/protobuf/proto" -import fmt "fmt" -import math "math" +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -37,6 +39,7 @@ var Data_DataType_name = map[int32]string{ 4: "Symlink", 5: "HAMTShard", } + var Data_DataType_value = map[string]int32{ "Raw": 0, "Directory": 1, @@ -51,9 +54,11 @@ func (x Data_DataType) Enum() *Data_DataType { *p = x return p } + func (x Data_DataType) String() string { return proto.EnumName(Data_DataType_name, int32(x)) } + func (x *Data_DataType) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(Data_DataType_value, data, "Data_DataType") if err != nil { @@ -62,8 +67,9 @@ func (x *Data_DataType) UnmarshalJSON(data []byte) error { *x = Data_DataType(value) return nil } + func (Data_DataType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_unixfs_768dd0381a72e0c6, []int{0, 0} + return fileDescriptor_e2fd76cc44dfc7c3, []int{0, 0} } type Data struct { @@ -82,7 +88,7 @@ func (m *Data) Reset() { *m = Data{} } func (m *Data) String() string { return proto.CompactTextString(m) } func (*Data) ProtoMessage() {} func (*Data) Descriptor() ([]byte, []int) { - return fileDescriptor_unixfs_768dd0381a72e0c6, []int{0} + return fileDescriptor_e2fd76cc44dfc7c3, []int{0} } func (m *Data) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Data.Unmarshal(m, b) @@ -90,8 +96,8 @@ func (m *Data) XXX_Unmarshal(b []byte) error { func (m *Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Data.Marshal(b, m, deterministic) } -func (dst *Data) XXX_Merge(src proto.Message) { - xxx_messageInfo_Data.Merge(dst, src) +func (m *Data) XXX_Merge(src proto.Message) { + xxx_messageInfo_Data.Merge(m, src) } func (m *Data) XXX_Size() int { return xxx_messageInfo_Data.Size(m) @@ -155,7 +161,7 @@ func (m *Metadata) Reset() { *m = Metadata{} } func (m *Metadata) String() string { return proto.CompactTextString(m) } func (*Metadata) ProtoMessage() {} func (*Metadata) Descriptor() ([]byte, []int) { - return fileDescriptor_unixfs_768dd0381a72e0c6, []int{1} + return fileDescriptor_e2fd76cc44dfc7c3, []int{1} } func (m *Metadata) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Metadata.Unmarshal(m, b) @@ -163,8 +169,8 @@ func (m *Metadata) XXX_Unmarshal(b []byte) error { func (m *Metadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Metadata.Marshal(b, m, deterministic) } -func (dst *Metadata) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metadata.Merge(dst, src) +func (m *Metadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metadata.Merge(m, src) } func (m *Metadata) XXX_Size() int { return xxx_messageInfo_Metadata.Size(m) @@ -183,14 +189,14 @@ func (m *Metadata) GetMimeType() string { } func init() { + proto.RegisterEnum("unixfs.pb.Data_DataType", Data_DataType_name, Data_DataType_value) proto.RegisterType((*Data)(nil), "unixfs.pb.Data") proto.RegisterType((*Metadata)(nil), "unixfs.pb.Metadata") - proto.RegisterEnum("unixfs.pb.Data_DataType", Data_DataType_name, Data_DataType_value) } -func init() { proto.RegisterFile("unixfs.proto", fileDescriptor_unixfs_768dd0381a72e0c6) } +func init() { proto.RegisterFile("unixfs.proto", fileDescriptor_e2fd76cc44dfc7c3) } -var fileDescriptor_unixfs_768dd0381a72e0c6 = []byte{ +var fileDescriptor_e2fd76cc44dfc7c3 = []byte{ // 254 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x90, 0xb1, 0x6a, 0xeb, 0x30, 0x18, 0x85, 0xaf, 0x6c, 0x25, 0xb1, 0xff, 0xeb, 0x16, 0xf1, 0x0f, 0x45, 0x74, 0x28, 0xc6, 0x43, From c364eb32133d29e22b45483c9b442d88171a7cc6 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 18 Feb 2019 17:37:09 +0100 Subject: [PATCH 2604/3147] Update protobuf License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@7ed9abe9e7cc59d7f5f8fe0f429b86d83da62674 --- namesys/base.go | 4 ++-- namesys/cache.go | 2 +- namesys/dns.go | 4 ++-- namesys/dns_test.go | 2 +- namesys/interface.go | 6 ++--- namesys/ipns_resolver_validation_test.go | 30 ++++++++++++------------ namesys/namesys.go | 12 +++++----- namesys/namesys_test.go | 20 ++++++++-------- namesys/proquint.go | 4 ++-- namesys/publisher.go | 20 ++++++++-------- namesys/publisher_test.go | 16 ++++++------- namesys/republisher/repub.go | 14 +++++------ namesys/republisher/repub_test.go | 6 ++--- namesys/resolve_test.go | 14 +++++------ namesys/routing.go | 18 +++++++------- 15 files changed, 86 insertions(+), 86 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 6b6de3d048..7b242801ae 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,8 +5,8 @@ import ( "strings" "time" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 0dc79d87ab..67a8e79a75 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index e2c3202eff..e5af516541 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,8 +6,8 @@ import ( "net" "strings" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 29fce15071..3353403c70 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 137a08e87e..631d93db4a 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,9 +35,9 @@ import ( context "context" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 9ab672dcee..41ed8bed99 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,22 +5,22 @@ import ( "testing" "time" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" - mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" - offline "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" - routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" - ropts "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing/options" - testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" - ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - record "gx/ipfs/QmexPd3srWxHC76gW2p5j5tQvwpPuCoW7b9vFhJ8BRPyh9/go-libp2p-record" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" + routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" + ropts "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing/options" + record "gx/ipfs/QmX1vqjTLTP6pepDi2uiaGxwKbQbem2PD88nGCZrwxKPEW/go-libp2p-record" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" + offline "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/offline" + ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" + testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index a74e94f779..97608b5e21 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,15 +5,15 @@ import ( "strings" "time" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 3223697a48..d7ae27ec52 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,16 +5,16 @@ import ( "fmt" "testing" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - pstoremem "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore/pstoremem" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" - offroute "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/offline" - "gx/ipfs/QmSygPSC63Uka8z9PYokAS4thiMAor17vhXUTi4qmKHh6P/go-unixfs" - ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + "gx/ipfs/QmcTSz9ByVBLGkQBNgxFPvKAjMFriKX8PiyhHfjXQzPN23/go-unixfs" + offroute "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/offline" + ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 37df4aba09..0d5175656f 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 69eb52258b..46a91aa7ba 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,16 +8,16 @@ import ( pin "github.com/ipfs/go-ipfs/pin" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" - routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" - ft "gx/ipfs/QmSygPSC63Uka8z9PYokAS4thiMAor17vhXUTi4qmKHh6P/go-unixfs" - ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" - proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dsquery "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dsquery "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" + routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + ft "gx/ipfs/QmcTSz9ByVBLGkQBNgxFPvKAjMFriKX8PiyhHfjXQzPN23/go-unixfs" + ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" + pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" + proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 0e9ef1d4e8..2c58f4c236 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -7,14 +7,14 @@ import ( "time" ma "gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" - testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" - ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" + dshelp "gx/ipfs/QmXx5R5qwsVxbhFogLNzU8A2tch9SZpJJgMUinfpHZsC9C/go-ipfs-ds-help" + mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" + ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" + testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index fb7ea3ded4..2959cdccc5 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,16 +7,16 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" - ic "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" - logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" - proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + ic "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" + proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 2ae20392ef..728423998c 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" - pstore "gx/ipfs/QmQFFp4ntkd4C14sP3FaH9WJyBuetuGUVo6dShNHvnoEvC/go-libp2p-peerstore" + pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmebEmt23jQxrwnqBkFL4qbpE8EnnQunpv5U32LS5ESus1/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmcNGX5RaxPPCYwa6yGXM1EcUbrreTTinixLcYGmMwf1sx/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 930d5219a0..4d0f94f513 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,13 +6,13 @@ import ( "testing" "time" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" - mockrouting "gx/ipfs/QmRJvdmKJoDcQEhhTt5NYXJPQFnJYPo1kfapxtjZLfDDqH/go-ipfs-routing/mock" - testutil "gx/ipfs/QmVnJMgafh5MBYiyqbvDtoCL8pcQvbEGD2k9o9GFpBWPzY/go-testutil" - ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" + ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" + testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index d08bb51031..ffd958292c 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,17 +5,17 @@ import ( "strings" "time" - opts "gx/ipfs/QmNmqKNivNTN11HrKWJYt29n6Z2fuzkeDheQV62dbxNuLb/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmPJxxDsX2UbchSHobbYuvz7qnyJTFKvaKMzE2rZWJ4x5B/go-libp2p-peer" - path "gx/ipfs/QmQiXYqcxU5AvpAJkfbXUEZgUYKog1Pd2Cv3WBiW2Hpe8M/go-path" + opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - routing "gx/ipfs/QmRjT8Bkut84fHf9nxMQBxGsqLAkqzMdFaemDK7e61dBNZ/go-libp2p-routing" - dht "gx/ipfs/QmS5Tvk8Adz1qPkCBCbiScty9KPbMSMCSTbFK4TVvatKqi/go-libp2p-kad-dht" - ipns "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns" - pb "gx/ipfs/QmVpC4PPSaoqZzWYEnQURnsQagimcWEzNKZouZyd7sNJdZ/go-ipns/pb" - logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" - proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" + path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" + pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" + proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + dht "gx/ipfs/QmfM7kwroZsKhKFmnJagPvM28MZMyKxG3QV2AqfvZvEEqS/go-libp2p-kad-dht" ) var log = logging.Logger("namesys") From 923bf724f755800bb8fd46e538c9670985ce317c Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 18 Feb 2019 17:37:09 +0100 Subject: [PATCH 2605/3147] Update protobuf License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@5cd19525cab999f733fc0838f7e62c77d9f0abfb --- pinning/pinner/gc/gc.go | 12 ++-- pinning/pinner/internal/pb/header.pb.go | 80 ++++++++++++++----------- pinning/pinner/pin.go | 6 +- pinning/pinner/pin_test.go | 12 ++-- pinning/pinner/set.go | 4 +- pinning/pinner/set_test.go | 12 ++-- 6 files changed, 68 insertions(+), 58 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 86bc86f1dd..ef8eace649 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" - bserv "gx/ipfs/QmZuPasxd7fSgtzRzCL7Z8J8QwDJML2fgBUExRbQCqb4BT/go-blockservice" + bserv "gx/ipfs/QmZsGVGCqMCNzHLNMB6q4F6yyvomqf1VxwhJwSfgo1NGaF/go-blockservice" + dag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - bstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + bstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + offline "gx/ipfs/QmSz8kAe2JCKp2dWSG8gHSWnwSmne8YfRXTeK5HBmc9L7t/go-ipfs-exchange-offline" + dstore "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" "gx/ipfs/QmYMQuypUbgsdNHmuCBSUJV6wdQVsBHRivNAp3efHJwZJD/go-verifcid" - offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline" - logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" - dstore "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go index ca4173c3ea..dd215e1263 100644 --- a/pinning/pinner/internal/pb/header.pb.go +++ b/pinning/pinner/internal/pb/header.pb.go @@ -3,13 +3,13 @@ package pb -import proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" -import fmt "fmt" -import math "math" - -import encoding_binary "encoding/binary" - -import io "io" +import ( + encoding_binary "encoding/binary" + fmt "fmt" + proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + io "io" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -28,16 +28,14 @@ type Set struct { // how many of the links are subtrees Fanout uint32 `protobuf:"varint,2,opt,name=fanout" json:"fanout"` // hash seed for subtree selection, a random number - Seed uint32 `protobuf:"fixed32,3,opt,name=seed" json:"seed"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_sizecache int32 `json:"-"` + Seed uint32 `protobuf:"fixed32,3,opt,name=seed" json:"seed"` } func (m *Set) Reset() { *m = Set{} } func (m *Set) String() string { return proto.CompactTextString(m) } func (*Set) ProtoMessage() {} func (*Set) Descriptor() ([]byte, []int) { - return fileDescriptor_header_778100e52d428560, []int{0} + return fileDescriptor_cda303a5a3ed87e7, []int{0} } func (m *Set) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -54,8 +52,8 @@ func (m *Set) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (dst *Set) XXX_Merge(src proto.Message) { - xxx_messageInfo_Set.Merge(dst, src) +func (m *Set) XXX_Merge(src proto.Message) { + xxx_messageInfo_Set.Merge(m, src) } func (m *Set) XXX_Size() int { return m.Size() @@ -90,6 +88,24 @@ func (m *Set) GetSeed() uint32 { func init() { proto.RegisterType((*Set)(nil), "ipfs.pin.Set") } + +func init() { proto.RegisterFile("pin/internal/pb/header.proto", fileDescriptor_cda303a5a3ed87e7) } + +var fileDescriptor_cda303a5a3ed87e7 = []byte{ + // 162 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x29, 0xc8, 0xcc, 0xd3, + 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0xcc, 0xd1, 0x2f, 0x48, 0xd2, 0xcf, 0x48, 0x4d, 0x4c, + 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xc8, 0x2c, 0x48, 0x2b, 0xd6, 0x2b, + 0xc8, 0xcc, 0x53, 0x8a, 0xe5, 0x62, 0x0e, 0x4e, 0x2d, 0x11, 0x92, 0xe3, 0x62, 0x2f, 0x4b, 0x2d, + 0x2a, 0xce, 0xcc, 0xcf, 0x93, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x75, 0x62, 0x39, 0x71, 0x4f, 0x9e, + 0x21, 0x08, 0x26, 0x28, 0x24, 0xc3, 0xc5, 0x96, 0x96, 0x98, 0x97, 0x5f, 0x5a, 0x22, 0xc1, 0x84, + 0x24, 0x0d, 0x15, 0x13, 0x92, 0xe0, 0x62, 0x29, 0x4e, 0x4d, 0x4d, 0x91, 0x60, 0x56, 0x60, 0xd4, + 0x60, 0x87, 0xca, 0x81, 0x45, 0x9c, 0x64, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, + 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, + 0x21, 0x8a, 0xa9, 0x20, 0x09, 0x10, 0x00, 0x00, 0xff, 0xff, 0x20, 0x85, 0x2f, 0x24, 0xa5, 0x00, + 0x00, 0x00, +} + func (m *Set) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -128,6 +144,9 @@ func encodeVarintHeader(dAtA []byte, offset int, v uint64) int { return offset + 1 } func (m *Set) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l n += 1 + sovHeader(uint64(m.Version)) @@ -164,7 +183,7 @@ func (m *Set) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -192,7 +211,7 @@ func (m *Set) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Version |= (uint32(b) & 0x7F) << shift + m.Version |= uint32(b&0x7F) << shift if b < 0x80 { break } @@ -211,7 +230,7 @@ func (m *Set) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Fanout |= (uint32(b) & 0x7F) << shift + m.Fanout |= uint32(b&0x7F) << shift if b < 0x80 { break } @@ -235,6 +254,9 @@ func (m *Set) Unmarshal(dAtA []byte) error { if skippy < 0 { return ErrInvalidLengthHeader } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthHeader + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } @@ -301,10 +323,13 @@ func skipHeader(dAtA []byte) (n int, err error) { break } } - iNdEx += length if length < 0 { return 0, ErrInvalidLengthHeader } + iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthHeader + } return iNdEx, nil case 3: for { @@ -333,6 +358,9 @@ func skipHeader(dAtA []byte) (n int, err error) { return 0, err } iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthHeader + } } return iNdEx, nil case 4: @@ -351,21 +379,3 @@ var ( ErrInvalidLengthHeader = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowHeader = fmt.Errorf("proto: integer overflow") ) - -func init() { - proto.RegisterFile("pin/internal/pb/header.proto", fileDescriptor_header_778100e52d428560) -} - -var fileDescriptor_header_778100e52d428560 = []byte{ - // 154 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x29, 0xc8, 0xcc, 0xd3, - 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0xcc, 0xd1, 0x2f, 0x48, 0xd2, 0xcf, 0x48, 0x4d, 0x4c, - 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xc8, 0x2c, 0x48, 0x2b, 0xd6, 0x2b, - 0xc8, 0xcc, 0x53, 0x8a, 0xe5, 0x62, 0x0e, 0x4e, 0x2d, 0x11, 0x92, 0xe3, 0x62, 0x2f, 0x4b, 0x2d, - 0x2a, 0xce, 0xcc, 0xcf, 0x93, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x75, 0x62, 0x39, 0x71, 0x4f, 0x9e, - 0x21, 0x08, 0x26, 0x28, 0x24, 0xc3, 0xc5, 0x96, 0x96, 0x98, 0x97, 0x5f, 0x5a, 0x22, 0xc1, 0x84, - 0x24, 0x0d, 0x15, 0x13, 0x92, 0xe0, 0x62, 0x29, 0x4e, 0x4d, 0x4d, 0x91, 0x60, 0x56, 0x60, 0xd4, - 0x60, 0x87, 0xca, 0x81, 0x45, 0x9c, 0x44, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, - 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0xa2, 0x98, 0x0a, 0x92, 0x00, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xc3, 0xf9, 0x7f, 0x24, 0x9d, 0x00, 0x00, 0x00, -} diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index bf4a719570..2cb1bee037 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" + mdag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index f7da552694..89065b4e42 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - mdag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" - bs "gx/ipfs/QmZuPasxd7fSgtzRzCL7Z8J8QwDJML2fgBUExRbQCqb4BT/go-blockservice" + bs "gx/ipfs/QmZsGVGCqMCNzHLNMB6q4F6yyvomqf1VxwhJwSfgo1NGaF/go-blockservice" + mdag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" - offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dssync "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/sync" + blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + offline "gx/ipfs/QmSz8kAe2JCKp2dWSG8gHSWnwSmne8YfRXTeK5HBmc9L7t/go-ipfs-exchange-offline" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 846e2013e6..70b46ec9df 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,11 +10,11 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" + "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" + "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 96340bed15..ba05d356a4 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" - bserv "gx/ipfs/QmZuPasxd7fSgtzRzCL7Z8J8QwDJML2fgBUExRbQCqb4BT/go-blockservice" + bserv "gx/ipfs/QmZsGVGCqMCNzHLNMB6q4F6yyvomqf1VxwhJwSfgo1NGaF/go-blockservice" + dag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" - offline "gx/ipfs/QmYZwey1thDTynSrvd6qQkX24UpTka6TFhQ2v569UpoqxD/go-ipfs-exchange-offline" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" + blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + offline "gx/ipfs/QmSz8kAe2JCKp2dWSG8gHSWnwSmne8YfRXTeK5HBmc9L7t/go-ipfs-exchange-offline" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" ) func ignoreCids(_ cid.Cid) {} From 2936ea0db358718f34aff4b6fc0df0f3c71b6dba Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 18 Feb 2019 17:37:09 +0100 Subject: [PATCH 2606/3147] Update protobuf License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-filestore@ad56e7d3f88b8fb02a4816ff2e38bdaca74f9fa1 --- filestore/filestore.go | 6 +-- filestore/filestore_test.go | 6 +-- filestore/fsrefstore.go | 12 +++--- filestore/pb/dataobj.pb.go | 83 ++++++++++++++++++++++--------------- filestore/util.go | 8 ++-- 5 files changed, 65 insertions(+), 50 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 0ee63e52e7..3b0deb43d3 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -12,11 +12,11 @@ import ( "errors" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" - logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" - dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" + logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 2d06a9ac23..eaa38217c3 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmQvMsV5aPyd7eMd3U1hvAUhZEupG3rXbVZn7ppU5RE6bt/go-merkledag" + dag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index a7e34bb770..81aea7e6c6 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -11,14 +11,14 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" + blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dsns "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/namespace" + dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" - dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" - proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dsns "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/namespace" - dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" + dshelp "gx/ipfs/QmXx5R5qwsVxbhFogLNzU8A2tch9SZpJJgMUinfpHZsC9C/go-ipfs-ds-help" + proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index 6046acbd62..cf1da15133 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -3,11 +3,12 @@ package datastore_pb -import proto "gx/ipfs/QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8/gogo-protobuf/proto" -import fmt "fmt" -import math "math" - -import io "io" +import ( + fmt "fmt" + proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + io "io" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -21,18 +22,16 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package type DataObj struct { - FilePath string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath"` - Offset uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset"` - Size_ uint64 `protobuf:"varint,3,opt,name=Size" json:"Size"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_sizecache int32 `json:"-"` + FilePath string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath"` + Offset uint64 `protobuf:"varint,2,opt,name=Offset" json:"Offset"` + Size_ uint64 `protobuf:"varint,3,opt,name=Size" json:"Size"` } func (m *DataObj) Reset() { *m = DataObj{} } func (m *DataObj) String() string { return proto.CompactTextString(m) } func (*DataObj) ProtoMessage() {} func (*DataObj) Descriptor() ([]byte, []int) { - return fileDescriptor_dataobj_216c555249812eeb, []int{0} + return fileDescriptor_86a3613fbaff9a6c, []int{0} } func (m *DataObj) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -49,8 +48,8 @@ func (m *DataObj) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (dst *DataObj) XXX_Merge(src proto.Message) { - xxx_messageInfo_DataObj.Merge(dst, src) +func (m *DataObj) XXX_Merge(src proto.Message) { + xxx_messageInfo_DataObj.Merge(m, src) } func (m *DataObj) XXX_Size() int { return m.Size() @@ -85,6 +84,23 @@ func (m *DataObj) GetSize_() uint64 { func init() { proto.RegisterType((*DataObj)(nil), "datastore.pb.DataObj") } + +func init() { proto.RegisterFile("filestore/pb/dataobj.proto", fileDescriptor_86a3613fbaff9a6c) } + +var fileDescriptor_86a3613fbaff9a6c = []byte{ + // 160 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xcb, 0xcc, 0x49, + 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0xd5, 0x2f, 0x48, 0xd2, 0x4f, 0x49, 0x2c, 0x49, 0xcc, 0x4f, 0xca, + 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x01, 0x71, 0xc1, 0x72, 0x7a, 0x05, 0x49, 0x4a, + 0xc9, 0x5c, 0xec, 0x2e, 0x89, 0x25, 0x89, 0xfe, 0x49, 0x59, 0x42, 0x0a, 0x5c, 0x1c, 0x6e, 0x99, + 0x39, 0xa9, 0x01, 0x89, 0x25, 0x19, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x4e, 0x2c, 0x27, 0xee, + 0xc9, 0x33, 0x04, 0xc1, 0x45, 0x85, 0x64, 0xb8, 0xd8, 0xfc, 0xd3, 0xd2, 0x8a, 0x53, 0x4b, 0x24, + 0x98, 0x14, 0x18, 0x35, 0x58, 0xa0, 0xf2, 0x50, 0x31, 0x21, 0x09, 0x2e, 0x96, 0xe0, 0xcc, 0xaa, + 0x54, 0x09, 0x66, 0x24, 0x39, 0xb0, 0x88, 0x93, 0xc4, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, + 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, + 0xcb, 0x31, 0x00, 0x02, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x87, 0xf5, 0x88, 0xa9, 0x00, 0x00, 0x00, +} + func (m *DataObj) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -123,6 +139,9 @@ func encodeVarintDataobj(dAtA []byte, offset int, v uint64) int { return offset + 1 } func (m *DataObj) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.FilePath) @@ -160,7 +179,7 @@ func (m *DataObj) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -188,7 +207,7 @@ func (m *DataObj) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -198,6 +217,9 @@ func (m *DataObj) Unmarshal(dAtA []byte) error { return ErrInvalidLengthDataobj } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDataobj + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -217,7 +239,7 @@ func (m *DataObj) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Offset |= (uint64(b) & 0x7F) << shift + m.Offset |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -236,7 +258,7 @@ func (m *DataObj) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Size_ |= (uint64(b) & 0x7F) << shift + m.Size_ |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -250,6 +272,9 @@ func (m *DataObj) Unmarshal(dAtA []byte) error { if skippy < 0 { return ErrInvalidLengthDataobj } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthDataobj + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } @@ -316,10 +341,13 @@ func skipDataobj(dAtA []byte) (n int, err error) { break } } - iNdEx += length if length < 0 { return 0, ErrInvalidLengthDataobj } + iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthDataobj + } return iNdEx, nil case 3: for { @@ -348,6 +376,9 @@ func skipDataobj(dAtA []byte) (n int, err error) { return 0, err } iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthDataobj + } } return iNdEx, nil case 4: @@ -366,19 +397,3 @@ var ( ErrInvalidLengthDataobj = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowDataobj = fmt.Errorf("proto: integer overflow") ) - -func init() { proto.RegisterFile("filestore/pb/dataobj.proto", fileDescriptor_dataobj_216c555249812eeb) } - -var fileDescriptor_dataobj_216c555249812eeb = []byte{ - // 151 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xcb, 0xcc, 0x49, - 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0xd5, 0x2f, 0x48, 0xd2, 0x4f, 0x49, 0x2c, 0x49, 0xcc, 0x4f, 0xca, - 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x01, 0x71, 0xc1, 0x72, 0x7a, 0x05, 0x49, 0x4a, - 0xc9, 0x5c, 0xec, 0x2e, 0x89, 0x25, 0x89, 0xfe, 0x49, 0x59, 0x42, 0x0a, 0x5c, 0x1c, 0x6e, 0x99, - 0x39, 0xa9, 0x01, 0x89, 0x25, 0x19, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x4e, 0x2c, 0x27, 0xee, - 0xc9, 0x33, 0x04, 0xc1, 0x45, 0x85, 0x64, 0xb8, 0xd8, 0xfc, 0xd3, 0xd2, 0x8a, 0x53, 0x4b, 0x24, - 0x98, 0x14, 0x18, 0x35, 0x58, 0xa0, 0xf2, 0x50, 0x31, 0x21, 0x09, 0x2e, 0x96, 0xe0, 0xcc, 0xaa, - 0x54, 0x09, 0x66, 0x24, 0x39, 0xb0, 0x88, 0x93, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, - 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0x03, 0x20, 0x00, 0x00, 0xff, 0xff, 0x8c, - 0xe7, 0x83, 0xa2, 0xa1, 0x00, 0x00, 0x00, -} diff --git a/filestore/util.go b/filestore/util.go index a4f1b97326..3d4d4552ba 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -7,10 +7,10 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-blockstore" - dshelp "gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help" - ds "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore" - dsq "gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query" + blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" + dshelp "gx/ipfs/QmXx5R5qwsVxbhFogLNzU8A2tch9SZpJJgMUinfpHZsC9C/go-ipfs-ds-help" ) // Status is used to identify the state of the block data referenced From 2863f1ff76057b034b1bbf56fda41f6dc5ec87b5 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 18 Feb 2019 17:37:09 +0100 Subject: [PATCH 2607/3147] Update protobuf License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-keystore@5e1d11f77cfea0319e38a183a7590b0e94cb0033 --- keystore/keystore.go | 4 ++-- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 7c41b36edd..bafc859b9f 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,8 +7,8 @@ import ( "path/filepath" "strings" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" - logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" ) var log = logging.Logger("keystore") diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 1d2005e9eb..fe8276872a 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" + ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 0c8f8861f4..6983100f9f 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmNiJiXwWE3kRhZrC5ej3kSjWHm337pYfhjLGSCDNKJP2s/go-libp2p-crypto" +import ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. From 2c70ad1761014168a0bdd27b6ec4628cb08e1001 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 19 Feb 2019 02:39:21 -0800 Subject: [PATCH 2608/3147] errors: introduce a 'not supported' error This commit was moved from ipfs/interface-go-ipfs-core@a81e4359ce5808c1de22b5ec3c6f05b83d86499d --- coreiface/errors.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/coreiface/errors.go b/coreiface/errors.go index 234abe5667..e0bd7805d8 100644 --- a/coreiface/errors.go +++ b/coreiface/errors.go @@ -3,7 +3,8 @@ package iface import "errors" var ( - ErrIsDir = errors.New("this dag node is a directory") - ErrNotFile = errors.New("this dag node is not a regular file") - ErrOffline = errors.New("this action must be run in online mode, try running 'ipfs daemon' first") + ErrIsDir = errors.New("this dag node is a directory") + ErrNotFile = errors.New("this dag node is not a regular file") + ErrOffline = errors.New("this action must be run in online mode, try running 'ipfs daemon' first") + ErrNotSupported = errors.New("operation not supported") ) From 88537c541c069f797717ea553b2be01f33f65a27 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 19 Feb 2019 03:48:04 -0800 Subject: [PATCH 2609/3147] coreapi: return coreiface.ErrNotSupported when "catting" symlinks. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@4d15a8bc10456a7433ee005a4267887a126a13ce --- namesys/base.go | 2 +- namesys/dns.go | 2 +- namesys/dns_test.go | 2 +- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 2 +- namesys/namesys.go | 2 +- namesys/namesys_test.go | 2 +- namesys/proquint.go | 2 +- namesys/routing.go | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 7b242801ae..1f645b5543 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,7 +5,7 @@ import ( "strings" "time" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" ) diff --git a/namesys/dns.go b/namesys/dns.go index e5af516541..c4e095f07e 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,7 +6,7 @@ import ( "net" "strings" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 3353403c70..126f67a2c8 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 631d93db4a..0c9c33bf14 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,7 +35,7 @@ import ( context "context" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" ) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 41ed8bed99..4a6f704974 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,7 +6,7 @@ import ( "time" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" diff --git a/namesys/namesys.go b/namesys/namesys.go index 97608b5e21..b945c39d60 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,7 +5,7 @@ import ( "strings" "time" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index d7ae27ec52..e8cbf0b1f7 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" diff --git a/namesys/proquint.go b/namesys/proquint.go index 0d5175656f..054fdc931e 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,7 +4,7 @@ import ( "context" "errors" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/routing.go b/namesys/routing.go index ffd958292c..d907e0db30 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,7 +5,7 @@ import ( "strings" "time" - opts "gx/ipfs/QmNt8iUv3uJoVrJ3Ls4cgMLk124V4Bt1JxuUMWbjULt9ns/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" From 1e563751d6b51e485919044ba12db6d0ea4c7c12 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Feb 2019 17:19:54 -0800 Subject: [PATCH 2610/3147] gx: update go-bitswap and go-libp2p-kad-dht * go-bitswap: fix some race conditions. * go-libp2p-kad-dht: fix a goroutine leak. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@7bb0ebcef5e84d83449b7ccbea00ad5a299f7672 --- namesys/base.go | 4 ++-- namesys/cache.go | 2 +- namesys/dns.go | 4 ++-- namesys/dns_test.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 4 ++-- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 4 ++-- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- namesys/resolve_test.go | 2 +- namesys/routing.go | 6 +++--- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 1f645b5543..6f25cf2e6f 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,8 +5,8 @@ import ( "strings" "time" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 67a8e79a75..6ae568f544 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index c4e095f07e..c86729972e 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,9 +6,9 @@ import ( "net" "strings" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 126f67a2c8..90da2ebdc1 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 0c9c33bf14..e1e6f3fd54 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,9 +35,9 @@ import ( context "context" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 4a6f704974..252fbb0057 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,17 +6,17 @@ import ( "time" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" ropts "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing/options" record "gx/ipfs/QmX1vqjTLTP6pepDi2uiaGxwKbQbem2PD88nGCZrwxKPEW/go-libp2p-record" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" offline "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/offline" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" diff --git a/namesys/namesys.go b/namesys/namesys.go index b945c39d60..81418a9c8f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,14 +5,14 @@ import ( "strings" "time" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index e8cbf0b1f7..c8cf228b1e 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,16 +5,16 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" - "gx/ipfs/QmcTSz9ByVBLGkQBNgxFPvKAjMFriKX8PiyhHfjXQzPN23/go-unixfs" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" offroute "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/offline" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" + "gx/ipfs/QmfKmRac17N7UmsV16vifHtB5Eqz3hTyKcu22Qb2oFoZyR/go-unixfs" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 054fdc931e..6ffd479c6f 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,9 +4,9 @@ import ( "context" "errors" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 46a91aa7ba..8c75694fe0 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -13,11 +13,11 @@ import ( ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dsquery "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" - ft "gx/ipfs/QmcTSz9ByVBLGkQBNgxFPvKAjMFriKX8PiyhHfjXQzPN23/go-unixfs" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + ft "gx/ipfs/QmfKmRac17N7UmsV16vifHtB5Eqz3hTyKcu22Qb2oFoZyR/go-unixfs" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 2959cdccc5..5048588054 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 728423998c..9d2188c5ee 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,7 +10,7 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 4d0f94f513..91f9a7bb0e 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -9,7 +9,7 @@ import ( peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" diff --git a/namesys/routing.go b/namesys/routing.go index d907e0db30..b03f602b0f 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,17 +5,17 @@ import ( "strings" "time" - opts "gx/ipfs/QmNuVxikLRanHXwpw3sy58Vt5yMd4K5BRmWsUqYCctRRVE/interface-go-ipfs-core/options/namesys" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" - path "gx/ipfs/QmXgYy6EgbKrpXFtfdHumWsEMd1HrsqGXtovrfBnMgbpfy/go-path" + path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + dht "gx/ipfs/QmbMXtieVFmFfT5AzVEP9RUbq7dYiWCZjz8KWa5hsr8kSE/go-libp2p-kad-dht" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" - dht "gx/ipfs/QmfM7kwroZsKhKFmnJagPvM28MZMyKxG3QV2AqfvZvEEqS/go-libp2p-kad-dht" ) var log = logging.Logger("namesys") From 233ef9a959aaf0e9b72c6c96af4ea2237b6cf0ea Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Feb 2019 17:19:54 -0800 Subject: [PATCH 2611/3147] gx: update go-bitswap and go-libp2p-kad-dht * go-bitswap: fix some race conditions. * go-libp2p-kad-dht: fix a goroutine leak. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@1b127cc93facfb086597d2ef502f1d3ac746adb4 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ef8eace649..3db3336f0f 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmZsGVGCqMCNzHLNMB6q4F6yyvomqf1VxwhJwSfgo1NGaF/go-blockservice" - dag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" + bserv "gx/ipfs/QmRCLtpTSWPmh4QK3TJ4rHCBSH7thYNZMWZG2PZvVrb8KJ/go-blockservice" + dag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 2cb1bee037..dce6df8031 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" + mdag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 89065b4e42..84314e4125 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - bs "gx/ipfs/QmZsGVGCqMCNzHLNMB6q4F6yyvomqf1VxwhJwSfgo1NGaF/go-blockservice" - mdag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" + bs "gx/ipfs/QmRCLtpTSWPmh4QK3TJ4rHCBSH7thYNZMWZG2PZvVrb8KJ/go-blockservice" + mdag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 70b46ec9df..7cebac76ba 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" + "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index ba05d356a4..85e3807eec 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmZsGVGCqMCNzHLNMB6q4F6yyvomqf1VxwhJwSfgo1NGaF/go-blockservice" - dag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" + bserv "gx/ipfs/QmRCLtpTSWPmh4QK3TJ4rHCBSH7thYNZMWZG2PZvVrb8KJ/go-blockservice" + dag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" From dc7339793d39a3fc86af226ab8f17240e6cd7079 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Feb 2019 17:19:54 -0800 Subject: [PATCH 2612/3147] gx: update go-bitswap and go-libp2p-kad-dht * go-bitswap: fix some race conditions. * go-libp2p-kad-dht: fix a goroutine leak. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@b5d1bfb927f22666795a9852738fd3638601c600 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index eaa38217c3..9cc5599193 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/Qmccmovpo9isKeaaDzcxvT7mVJN1uKwn2xzSs1y8hb6PEs/go-merkledag" + dag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" From 19fac3d8b187daf4af1fc206a6f18df44bd25e6a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Feb 2019 20:29:06 -0800 Subject: [PATCH 2613/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@3868a4b01d44a72e0aab614d38247f868e058804 --- namesys/base.go | 4 ++-- namesys/cache.go | 2 +- namesys/dns.go | 4 ++-- namesys/dns_test.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 12 ++++++------ namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 8 ++++---- namesys/proquint.go | 4 ++-- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 4 ++-- namesys/routing.go | 10 +++++----- 15 files changed, 38 insertions(+), 38 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 6f25cf2e6f..5f81262c2e 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,8 +5,8 @@ import ( "strings" "time" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 6ae568f544..31e16e3cd4 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index c86729972e..234b8257f5 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,9 +6,9 @@ import ( "net" "strings" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 90da2ebdc1..6c2700178b 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index e1e6f3fd54..8fd2efaaa4 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,9 +35,9 @@ import ( context "context" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 252fbb0057..ab1851d0a9 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,21 +6,21 @@ import ( "time" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" - ropts "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing/options" record "gx/ipfs/QmX1vqjTLTP6pepDi2uiaGxwKbQbem2PD88nGCZrwxKPEW/go-libp2p-record" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" - mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" - offline "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/offline" + mockrouting "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/mock" + offline "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/offline" + routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" + ropts "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing/options" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 81418a9c8f..36db21447f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -6,13 +6,13 @@ import ( "time" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index c8cf228b1e..f5a80f1e60 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,16 +5,16 @@ import ( "fmt" "testing" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" - offroute "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/offline" + "gx/ipfs/QmVytt7Vtb9jbGN2uNfEm15t78pBUjw1SS72nkJFcWYZwe/go-unixfs" + offroute "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/offline" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" - "gx/ipfs/QmfKmRac17N7UmsV16vifHtB5Eqz3hTyKcu22Qb2oFoZyR/go-unixfs" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index 6ffd479c6f..deaf717c9c 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,9 +4,9 @@ import ( "context" "errors" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 8c75694fe0..3822881427 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,16 +8,16 @@ import ( pin "github.com/ipfs/go-ipfs/pin" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dsquery "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + ft "gx/ipfs/QmVytt7Vtb9jbGN2uNfEm15t78pBUjw1SS72nkJFcWYZwe/go-unixfs" + routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" - ft "gx/ipfs/QmfKmRac17N7UmsV16vifHtB5Eqz3hTyKcu22Qb2oFoZyR/go-unixfs" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 2c58f4c236..0e8899217e 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -11,8 +11,8 @@ import ( peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - dshelp "gx/ipfs/QmXx5R5qwsVxbhFogLNzU8A2tch9SZpJJgMUinfpHZsC9C/go-ipfs-ds-help" - mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" + dshelp "gx/ipfs/QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847/go-ipfs-ds-help" + mockrouting "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/mock" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 5048588054..939354379f 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 9d2188c5ee..3a1243ccf4 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmcNGX5RaxPPCYwa6yGXM1EcUbrreTTinixLcYGmMwf1sx/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmcZUhA1xQo8meuYBFLcTHqQb2ogpDCTZUTfTrko7PUeHs/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 91f9a7bb0e..9274861ee6 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" - mockrouting "gx/ipfs/QmcjqHcsk8E1Gd8RbuaUawWC7ogDtaVcdjLvZF8ysCCiPn/go-ipfs-routing/mock" + mockrouting "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/mock" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" ) diff --git a/namesys/routing.go b/namesys/routing.go index b03f602b0f..fb32811dee 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,16 +5,16 @@ import ( "strings" "time" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" + path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" - opts "gx/ipfs/QmUM3JbzMPPVpsUvUcfCdmeU2tssrdVPnUn5E6RawFjDLC/interface-go-ipfs-core/options/namesys" - routing "gx/ipfs/QmWaDSNoSdSXU9b6udyaq9T8y6LkzMwqWxECznFqvtcTsk/go-libp2p-routing" - path "gx/ipfs/QmaVydE6qtiiMhRUraPrzL6dvtfHPNR6Y9JJZcTwDAw9dY/go-path" - dht "gx/ipfs/QmbMXtieVFmFfT5AzVEP9RUbq7dYiWCZjz8KWa5hsr8kSE/go-libp2p-kad-dht" + dht "gx/ipfs/QmbKppYPA1bmEGpqmA4QGZZNRGFcJo2Z4KjYRQWJDzbD8P/go-libp2p-kad-dht" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) From 43ebc5edb5fcdb02260c6e1c848d7e77a9289e4d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Feb 2019 20:29:06 -0800 Subject: [PATCH 2614/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@1beea9fe241b682c1892bac0afa87fcb35a1af52 --- pinning/pinner/gc/gc.go | 14 +++++++------- pinning/pinner/pin.go | 6 +++--- pinning/pinner/pin_test.go | 10 +++++----- pinning/pinner/set.go | 6 +++--- pinning/pinner/set_test.go | 10 +++++----- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 3db3336f0f..919c96f799 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,16 +8,16 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - bserv "gx/ipfs/QmRCLtpTSWPmh4QK3TJ4rHCBSH7thYNZMWZG2PZvVrb8KJ/go-blockservice" - dag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" + dag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" + bserv "gx/ipfs/QmXBjp9iatjaiEpRqrEZpUuKVWTc71vuSUYoPQ5rRQ3SUU/go-blockservice" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" - bstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" - offline "gx/ipfs/QmSz8kAe2JCKp2dWSG8gHSWnwSmne8YfRXTeK5HBmc9L7t/go-ipfs-exchange-offline" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" dstore "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - "gx/ipfs/QmYMQuypUbgsdNHmuCBSUJV6wdQVsBHRivNAp3efHJwZJD/go-verifcid" + bstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" + ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" + offline "gx/ipfs/Qmb9fkAWgcyVRnFdXGqA6jcWGFj6q35oJjwRAYRhfEboGS/go-ipfs-exchange-offline" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + "gx/ipfs/QmcVd2ApQdbfaYPKhCjj4WoQuxk4CMxPqmNpijKmFLh6qa/go-verifcid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index dce6df8031..ecc0c78356 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,11 +10,11 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" + mdag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" ) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 84314e4125..35efd2b148 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - bs "gx/ipfs/QmRCLtpTSWPmh4QK3TJ4rHCBSH7thYNZMWZG2PZvVrb8KJ/go-blockservice" - mdag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" + mdag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" + bs "gx/ipfs/QmXBjp9iatjaiEpRqrEZpUuKVWTc71vuSUYoPQ5rRQ3SUU/go-blockservice" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" - offline "gx/ipfs/QmSz8kAe2JCKp2dWSG8gHSWnwSmne8YfRXTeK5HBmc9L7t/go-ipfs-exchange-offline" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" + blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" + offline "gx/ipfs/Qmb9fkAWgcyVRnFdXGqA6jcWGFj6q35oJjwRAYRhfEboGS/go-ipfs-exchange-offline" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 7cebac76ba..cd0e0ffc36 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,10 +10,10 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" + "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - ipld "gx/ipfs/QmRL22E4paat7ky7vx9MLpR97JHHbFPrg3ytFQw6qp1y1s/go-ipld-format" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" + ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" ) diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 85e3807eec..bdc084391b 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - bserv "gx/ipfs/QmRCLtpTSWPmh4QK3TJ4rHCBSH7thYNZMWZG2PZvVrb8KJ/go-blockservice" - dag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" + dag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" + bserv "gx/ipfs/QmXBjp9iatjaiEpRqrEZpUuKVWTc71vuSUYoPQ5rRQ3SUU/go-blockservice" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" - offline "gx/ipfs/QmSz8kAe2JCKp2dWSG8gHSWnwSmne8YfRXTeK5HBmc9L7t/go-ipfs-exchange-offline" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" + blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" + offline "gx/ipfs/Qmb9fkAWgcyVRnFdXGqA6jcWGFj6q35oJjwRAYRhfEboGS/go-ipfs-exchange-offline" ) func ignoreCids(_ cid.Cid) {} From e80725d6dc59637fd594badd94729f6680d99c47 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Feb 2019 20:29:06 -0800 Subject: [PATCH 2615/3147] gx: update go-cid License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@17b80629e2234a2720307044f211bb50694f03fa --- filestore/filestore.go | 8 ++++---- filestore/filestore_test.go | 8 ++++---- filestore/fsrefstore.go | 10 +++++----- filestore/util.go | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 3b0deb43d3..69021b7b7f 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,12 +11,12 @@ import ( "context" "errors" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" - blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" + blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" + blocks "gx/ipfs/QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK/go-block-format" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + posinfo "gx/ipfs/QmdiZuFuiFD1Gbuu8PdqmsfrCR3z4QKSR2bN1NAvnJgTY7/go-ipfs-posinfo" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 9cc5599193..62ea454033 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmUsnWBZaqpZ8i2wX37V2wC5hcB7VWB3zsUcNsyQ1Be5AX/go-merkledag" + dag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" + blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" + posinfo "gx/ipfs/QmdiZuFuiFD1Gbuu8PdqmsfrCR3z4QKSR2bN1NAvnJgTY7/go-ipfs-posinfo" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 81aea7e6c6..190061017f 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,15 +10,15 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dsns "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/namespace" dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - posinfo "gx/ipfs/QmUhHBdzfNb9FQPDtKwhghVoR3zwkbXzFJ1uJyEMYUpFSd/go-ipfs-posinfo" - blocks "gx/ipfs/QmWoXtvgC8inqFkAATB7cp2Dax7XBi9VDvSg9RCCZufmRk/go-block-format" - dshelp "gx/ipfs/QmXx5R5qwsVxbhFogLNzU8A2tch9SZpJJgMUinfpHZsC9C/go-ipfs-ds-help" + dshelp "gx/ipfs/QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847/go-ipfs-ds-help" + blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" + blocks "gx/ipfs/QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK/go-block-format" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + posinfo "gx/ipfs/QmdiZuFuiFD1Gbuu8PdqmsfrCR3z4QKSR2bN1NAvnJgTY7/go-ipfs-posinfo" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/util.go b/filestore/util.go index 3d4d4552ba..45accb3a37 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - cid "gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid" - blockstore "gx/ipfs/QmRu7tiRnFk9mMPpVECQTBQJqXtmG132jJxA1w9A7TtpBz/go-ipfs-blockstore" + cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - dshelp "gx/ipfs/QmXx5R5qwsVxbhFogLNzU8A2tch9SZpJJgMUinfpHZsC9C/go-ipfs-ds-help" + dshelp "gx/ipfs/QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847/go-ipfs-ds-help" + blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" ) // Status is used to identify the state of the block data referenced From 265faed09f52664f4155f176de18b0199a9e4cf8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Feb 2019 20:41:00 -0800 Subject: [PATCH 2616/3147] ci: modernize This commit was moved from ipfs/go-ipfs-exchange-interface@2970ce71247805ebf47a1c76c823e83dad4252da --- exchange/Makefile | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/exchange/Makefile b/exchange/Makefile index 73f2841f61..20619413c9 100644 --- a/exchange/Makefile +++ b/exchange/Makefile @@ -1,18 +1,11 @@ -all: deps gx: go get github.com/whyrusleeping/gx go get github.com/whyrusleeping/gx-go -deps: gx + +deps: gx gx --verbose install --global gx-go rewrite -test: deps - gx test -v -race -coverprofile=coverage.txt -covermode=atomic . -rw: - gx-go rewrite -rwundo: - gx-go rewrite --undo -publish: rwundo - gx publish -.PHONY: all gx deps test rw rwundo publish +publish: + gx-go rewrite --undo From 1fbf1ae368eacc8098ff48071f14ef5f273db296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 21 Feb 2019 16:03:42 +0100 Subject: [PATCH 2617/3147] Enable Travis This commit was moved from ipfs/interface-go-ipfs-core@4bf61d8680c9c9bd878b6deec2b946a5030c738e --- coreiface/Makefile | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 coreiface/Makefile diff --git a/coreiface/Makefile b/coreiface/Makefile new file mode 100644 index 0000000000..89fc88d7f4 --- /dev/null +++ b/coreiface/Makefile @@ -0,0 +1,16 @@ +all: deps +gx: + go get github.com/whyrusleeping/gx + go get github.com/whyrusleeping/gx-go +deps: gx + gx --verbose install --global + gx-go rewrite +test: deps + gx test -v -race -coverprofile=coverage.txt -covermode=atomic . +rw: + gx-go rewrite +rwundo: + gx-go rewrite --undo +publish: rwundo + gx publish +.PHONY: all gx deps test rw rwundo publish From d497db124cf910eb5b4395dbbdd1a57d8cfb7126 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 27 Feb 2019 01:10:59 +0000 Subject: [PATCH 2618/3147] Gx Bubble. libp2p-6.0.38 License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@d15cb70753a77360abc8c87e9fdb736e205fdd46 --- namesys/base.go | 4 ++-- namesys/cache.go | 2 +- namesys/dns.go | 4 ++-- namesys/dns_test.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 24 ++++++++++++------------ namesys/namesys.go | 8 ++++---- namesys/namesys_test.go | 14 +++++++------- namesys/proquint.go | 4 ++-- namesys/publisher.go | 12 ++++++------ namesys/publisher_test.go | 10 +++++----- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 6 +++--- namesys/resolve_test.go | 10 +++++----- namesys/routing.go | 14 +++++++------- 15 files changed, 62 insertions(+), 62 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index 5f81262c2e..b8ca81076a 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,8 +5,8 @@ import ( "strings" "time" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 31e16e3cd4..3fa1ee50e6 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 234b8257f5..8f78dd3d4b 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,9 +6,9 @@ import ( "net" "strings" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 6c2700178b..12f7ae9a0b 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 8fd2efaaa4..08228c1b1a 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,9 +35,9 @@ import ( context "context" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index ab1851d0a9..7f4f5107ff 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,21 +6,21 @@ import ( "time" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" - pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - record "gx/ipfs/QmX1vqjTLTP6pepDi2uiaGxwKbQbem2PD88nGCZrwxKPEW/go-libp2p-record" - mockrouting "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/mock" - offline "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/offline" - routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" - ropts "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing/options" - ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" - testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" + ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + testutil "gx/ipfs/QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W/go-testutil" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" + routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" + ropts "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing/options" + mockrouting "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/mock" + offline "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/offline" + pstore "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore" + pstoremem "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore/pstoremem" + record "gx/ipfs/QmbeHtaBy9nZsW4cHRcvgVY4CnDhXudE2Dr6qDxS7yg9rX/go-libp2p-record" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 36db21447f..e6122dc44f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,14 +5,14 @@ import ( "strings" "time" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" + routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index f5a80f1e60..c3b1e9dc0a 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,16 +5,16 @@ import ( "fmt" "testing" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" - pstoremem "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore/pstoremem" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + "gx/ipfs/QmSbCXEwpsog4vBf53YntmGk9uHsgZNuU5oBKv3o2kkTSe/go-unixfs" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - "gx/ipfs/QmVytt7Vtb9jbGN2uNfEm15t78pBUjw1SS72nkJFcWYZwe/go-unixfs" - offroute "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/offline" - ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" + ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" + offroute "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/offline" + pstoremem "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore/pstoremem" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index deaf717c9c..a416bc2f38 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,9 +4,9 @@ import ( "context" "errors" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 3822881427..64bacc6fd3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,15 +8,15 @@ import ( pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + ft "gx/ipfs/QmSbCXEwpsog4vBf53YntmGk9uHsgZNuU5oBKv3o2kkTSe/go-unixfs" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dsquery "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - ft "gx/ipfs/QmVytt7Vtb9jbGN2uNfEm15t78pBUjw1SS72nkJFcWYZwe/go-unixfs" - routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" - ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" - pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" + ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" + pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" + routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 0e8899217e..8b7481d59c 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" - ma "gx/ipfs/QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc/go-multiaddr" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + ma "gx/ipfs/QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL/go-multiaddr" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" + ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" + testutil "gx/ipfs/QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W/go-testutil" dshelp "gx/ipfs/QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847/go-ipfs-ds-help" - mockrouting "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/mock" - ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" - testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" + mockrouting "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/mock" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 939354379f..4dfd2e4919 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,15 +7,15 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" ic "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" + pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" - pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" ) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 3a1243ccf4..09c778e90a 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" - pstore "gx/ipfs/QmRhFARzTHcFh8wUxwN5KvyTGq73FLC65EfFAhz8Ng7aGb/go-libp2p-peerstore" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmcZUhA1xQo8meuYBFLcTHqQb2ogpDCTZUTfTrko7PUeHs/go-libp2p/p2p/net/mock" + mocknet "gx/ipfs/QmWRUZmLb9qEpwuHTtrzbdE5LQxm64qftncw5o8tBVPobL/go-libp2p/p2p/net/mock" + pstore "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 9274861ee6..4e9dcbd4ad 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,13 +6,13 @@ import ( "testing" "time" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - mockrouting "gx/ipfs/QmbRWQPxtwacR1M8phDY5Y2jJbS96HXZAsK5dKD7s12Wob/go-ipfs-routing/mock" - ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" - testutil "gx/ipfs/QmeFVdhzY13YZPWxCiQvmLercrumFRoQZFQEYw2BtzyiQc/go-testutil" + ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" + testutil "gx/ipfs/QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W/go-testutil" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" + mockrouting "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/mock" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index fb32811dee..843061b215 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,16 +5,16 @@ import ( "strings" "time" - path "gx/ipfs/QmR3bNAtBoTN6xZ2HQNqpRQARcDoazH9jU6zKUNjFyQKWS/go-path" + dht "gx/ipfs/QmNqZEo6SByQ5zMn8FuWPKo17pGn26D8fruHxpRcog8usL/go-libp2p-kad-dht" + path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - peer "gx/ipfs/QmTu65MVbemtUxJEWgsTtzv9Zv9P8rvmqNA4eG9TrTRGYc/go-libp2p-peer" - dht "gx/ipfs/QmbKppYPA1bmEGpqmA4QGZZNRGFcJo2Z4KjYRQWJDzbD8P/go-libp2p-kad-dht" + ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" + pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" + opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" + routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" - routing "gx/ipfs/QmcxZXMqFu4vjLQRfG2tAcg6DPQNurgZ2SQ5iQVk6dXQjn/go-libp2p-routing" - ipns "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns" - pb "gx/ipfs/QmdboayjE53q27kq6zGk5vkx4u7LDGdcbVoi5NXMCtfiKS/go-ipns/pb" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" - opts "gx/ipfs/QmeWKXQfEqbtUDCiQBAHzSZDja9br5LdPgk8eHu86oJxgr/interface-go-ipfs-core/options/namesys" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) From 1c314606d744f30c09e016f4708921fc52bed777 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 27 Feb 2019 01:10:59 +0000 Subject: [PATCH 2619/3147] Gx Bubble. libp2p-6.0.38 License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-ipfs-pinner@fb8c0d56aded05ee794f5418beb7040989be82ee --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 919c96f799..71bda14a88 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" - bserv "gx/ipfs/QmXBjp9iatjaiEpRqrEZpUuKVWTc71vuSUYoPQ5rRQ3SUU/go-blockservice" + dag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" + bserv "gx/ipfs/Qmdvbc3xsufJasP1idu6dZKiLLfEzuaLpuriCyUK7Aukje/go-blockservice" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" dstore "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index ecc0c78356..371f6171ab 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" + mdag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 35efd2b148..7945526446 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" - bs "gx/ipfs/QmXBjp9iatjaiEpRqrEZpUuKVWTc71vuSUYoPQ5rRQ3SUU/go-blockservice" + mdag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" + bs "gx/ipfs/Qmdvbc3xsufJasP1idu6dZKiLLfEzuaLpuriCyUK7Aukje/go-blockservice" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index cd0e0ffc36..55103a7361 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" + "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index bdc084391b..7976fe82ea 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" - bserv "gx/ipfs/QmXBjp9iatjaiEpRqrEZpUuKVWTc71vuSUYoPQ5rRQ3SUU/go-blockservice" + dag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" + bserv "gx/ipfs/Qmdvbc3xsufJasP1idu6dZKiLLfEzuaLpuriCyUK7Aukje/go-blockservice" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" From 75ac23d9f73d1b87d5d610bb79e4f33e6838cd83 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 27 Feb 2019 01:10:59 +0000 Subject: [PATCH 2620/3147] Gx Bubble. libp2p-6.0.38 License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-filestore@88923c9f23c55554d7a565943fba0a54538373f9 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 62ea454033..8dde19de0e 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmScf5hnTEK8fDpRJAbcdMnKXpKUp1ytdymzXUbXDCFssp/go-merkledag" + dag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" From 0d7b0f46acf5f8e0a5757be5c33ca389e46121b2 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 27 Feb 2019 05:30:15 +0000 Subject: [PATCH 2621/3147] Fix a problem with go-libp2p-kad-dht License: MIT Signed-off-by: Hector Sanjuan This commit was moved from ipfs/go-namesys@2c5e8411f746c95aa8efcd762c9ec41000d91b5a --- namesys/routing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/routing.go b/namesys/routing.go index 843061b215..5f2a731a86 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,9 +5,9 @@ import ( "strings" "time" - dht "gx/ipfs/QmNqZEo6SByQ5zMn8FuWPKo17pGn26D8fruHxpRcog8usL/go-libp2p-kad-dht" path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" + dht "gx/ipfs/QmUTc27ifFbaTWZBCKFxuMfWfB1jy88MtYtB37vZ9saaXo/go-libp2p-kad-dht" ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" From 04e8baf657f98ac130f5eb22e9aeb4afbbe7df50 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 27 Feb 2019 19:08:11 +0100 Subject: [PATCH 2622/3147] Remove verifcid as it is handled in go-cid This commit was moved from ipfs/go-blockservice@f4c929d46b6d7ec6a31a8f5cbdc33b72ab0fbf5f --- blockservice/blockservice.go | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3b5a1df6b9..23dcd0c333 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -14,7 +14,6 @@ import ( blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" logging "github.com/ipfs/go-log" - "github.com/ipfs/go-verifcid" ) var log = logging.Logger("blockservice") @@ -131,11 +130,6 @@ func NewSession(ctx context.Context, bs BlockService) *Session { // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *blockService) AddBlock(o blocks.Block) error { c := o.Cid() - // hash security - err := verifcid.ValidateCid(c) - if err != nil { - return err - } if s.checkFirst { if has, err := s.blockstore.Has(c); has || err != nil { return err @@ -156,13 +150,6 @@ func (s *blockService) AddBlock(o blocks.Block) error { } func (s *blockService) AddBlocks(bs []blocks.Block) error { - // hash security - for _, b := range bs { - err := verifcid.ValidateCid(b.Cid()) - if err != nil { - return err - } - } var toput []blocks.Block if s.checkFirst { toput = make([]blocks.Block, 0, len(bs)) @@ -211,11 +198,6 @@ func (s *blockService) getExchange() exchange.Fetcher { } func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) (blocks.Block, error) { - err := verifcid.ValidateCid(c) // hash security - if err != nil { - return nil, err - } - block, err := bs.Get(c) if err == nil { return block, nil @@ -259,18 +241,6 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget go func() { defer close(out) - k := 0 - for _, c := range ks { - // hash security - if err := verifcid.ValidateCid(c); err == nil { - ks[k] = c - k++ - } else { - log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) - } - } - ks = ks[:k] - var misses []cid.Cid for _, c := range ks { hit, err := bs.Get(c) From a743193b9afc05fd5d9ba97efc6408517334bada Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Feb 2019 12:39:24 -0800 Subject: [PATCH 2623/3147] gx: update go-ipfs-cmds, go-bitswap, go-libp2p-kad-dht, and go-mplex Fixes the latest batch of bugs found in RC testing. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@7bcfde87b7c13fb848c2989bf325876ed8f3ccf2 --- pinning/pinner/gc/gc.go | 4 ++-- pinning/pinner/pin.go | 2 +- pinning/pinner/pin_test.go | 4 ++-- pinning/pinner/set.go | 2 +- pinning/pinner/set_test.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 71bda14a88..97ea9a81e2 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -8,8 +8,8 @@ import ( "strings" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" - bserv "gx/ipfs/Qmdvbc3xsufJasP1idu6dZKiLLfEzuaLpuriCyUK7Aukje/go-blockservice" + dag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" + bserv "gx/ipfs/QmUEXNytX2q9g9xtdfHRVYfsvjw5V9FQ32vE9ZRYFAxFoy/go-blockservice" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" dstore "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 371f6171ab..e60dc18be1 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" + mdag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 7945526446..7758003724 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - mdag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" - bs "gx/ipfs/Qmdvbc3xsufJasP1idu6dZKiLLfEzuaLpuriCyUK7Aukje/go-blockservice" + mdag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" + bs "gx/ipfs/QmUEXNytX2q9g9xtdfHRVYfsvjw5V9FQ32vE9ZRYFAxFoy/go-blockservice" util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index 55103a7361..f3fcac1f79 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,7 +10,7 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" + "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index 7976fe82ea..ea6df844ee 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" - bserv "gx/ipfs/Qmdvbc3xsufJasP1idu6dZKiLLfEzuaLpuriCyUK7Aukje/go-blockservice" + dag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" + bserv "gx/ipfs/QmUEXNytX2q9g9xtdfHRVYfsvjw5V9FQ32vE9ZRYFAxFoy/go-blockservice" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" From 9397bfa012b29c80430821655e9fb4f259d558a3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Feb 2019 12:39:24 -0800 Subject: [PATCH 2624/3147] gx: update go-ipfs-cmds, go-bitswap, go-libp2p-kad-dht, and go-mplex Fixes the latest batch of bugs found in RC testing. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@f64185838ddade6885d0415e4478c1bc7d9ed5eb --- namesys/base.go | 4 ++-- namesys/cache.go | 2 +- namesys/dns.go | 4 ++-- namesys/dns_test.go | 2 +- namesys/interface.go | 4 ++-- namesys/ipns_resolver_validation_test.go | 4 ++-- namesys/namesys.go | 4 ++-- namesys/namesys_test.go | 6 +++--- namesys/proquint.go | 4 ++-- namesys/publisher.go | 4 ++-- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 2 +- namesys/routing.go | 6 +++--- 14 files changed, 26 insertions(+), 26 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index b8ca81076a..ebeb86c313 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,8 +5,8 @@ import ( "strings" "time" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index 3fa1ee50e6..d277756691 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 8f78dd3d4b..2c31fcae72 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,8 +6,8 @@ import ( "net" "strings" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" ) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 12f7ae9a0b..460afb023e 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 08228c1b1a..04ca1eeb7a 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,9 +35,9 @@ import ( context "context" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 7f4f5107ff..3c583a973b 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -6,13 +6,13 @@ import ( "time" u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" testutil "gx/ipfs/QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W/go-testutil" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" ropts "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing/options" diff --git a/namesys/namesys.go b/namesys/namesys.go index e6122dc44f..b8ccdaafb1 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,11 +5,11 @@ import ( "strings" "time" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index c3b1e9dc0a..3da16d2389 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,16 +5,16 @@ import ( "fmt" "testing" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" - "gx/ipfs/QmSbCXEwpsog4vBf53YntmGk9uHsgZNuU5oBKv3o2kkTSe/go-unixfs" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" offroute "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/offline" pstoremem "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore/pstoremem" + "gx/ipfs/QmcYUTQ7tBZeH1CLsZM2S3xhMEZdvUgXvbjhpMsLDpk3oJ/go-unixfs" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index a416bc2f38..e36865903a 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,8 +4,8 @@ import ( "context" "errors" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index 64bacc6fd3..126bcd1ce5 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,8 +8,7 @@ import ( pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" - ft "gx/ipfs/QmSbCXEwpsog4vBf53YntmGk9uHsgZNuU5oBKv3o2kkTSe/go-unixfs" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dsquery "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" @@ -17,6 +16,7 @@ import ( pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" + ft "gx/ipfs/QmcYUTQ7tBZeH1CLsZM2S3xhMEZdvUgXvbjhpMsLDpk3oJ/go-unixfs" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4dfd2e4919..c7a7f4442d 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,7 +7,7 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 09c778e90a..1f582a44dc 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,10 +10,10 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" + mocknet "gx/ipfs/QmRxk6AUaGaKCfzS1xSNRojiAPd7h2ih8GuCdjJBF3Y6GK/go-libp2p/p2p/net/mock" goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - mocknet "gx/ipfs/QmWRUZmLb9qEpwuHTtrzbdE5LQxm64qftncw5o8tBVPobL/go-libp2p/p2p/net/mock" pstore "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore" ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 4e9dcbd4ad..80eb7d83f5 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" diff --git a/namesys/routing.go b/namesys/routing.go index 5f2a731a86..315a281bb5 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,15 +5,15 @@ import ( "strings" "time" - path "gx/ipfs/QmQ8Y8pKbrdAFuoHnnduWp81qS5LESWATnjmUEqhopRbJo/go-path" + path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - dht "gx/ipfs/QmUTc27ifFbaTWZBCKFxuMfWfB1jy88MtYtB37vZ9saaXo/go-libp2p-kad-dht" ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" - opts "gx/ipfs/QmVzvYWRABgGEv4iu3M9wivWbZKTW29qsU4VTZ2iZEoExX/interface-go-ipfs-core/options/namesys" + opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + dht "gx/ipfs/QmdR6WN3TUEAVQ9KWE2UiFJikWTbUvgBJay6mjB4yUJebq/go-libp2p-kad-dht" proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" ) From 6f8b262d1281225ab1a0fa427fcf965fef81ce60 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Feb 2019 12:39:24 -0800 Subject: [PATCH 2625/3147] gx: update go-ipfs-cmds, go-bitswap, go-libp2p-kad-dht, and go-mplex Fixes the latest batch of bugs found in RC testing. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@fdbb00728fa8c795ce35b4a0263b20be3e4d8294 --- filestore/filestore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 8dde19de0e..b6fdf3507e 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,7 +7,7 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmP9i4G9nRcfKBnpk1A7CwU7ppLkSn2j6vJeWn2AJ8rfcN/go-merkledag" + dag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" From 367840e237d1c5d7b906f1ef9bd51ece01bb4278 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 28 Feb 2019 18:46:16 +0100 Subject: [PATCH 2626/3147] Add gomod, use multiformats/go-base32, change travis This commit was moved from ipfs/go-ipfs-ds-help@4a69beb72c1b4e6e7ed62c5c5cbc1bd7a3d219b2 --- datastore/dshelp/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index b4fff9891e..1f47023fe9 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -5,7 +5,7 @@ package dshelp import ( cid "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" - "github.com/whyrusleeping/base32" + "github.com/multiformats/go-base32" ) // NewKeyFromBinary creates a new key from a byte slice. From fdca4bff9e1ab55eecb93a3ad2e6e6adf145ea84 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 28 Feb 2019 11:17:34 -0800 Subject: [PATCH 2627/3147] Revert "Remove verifcid as it is handled in go-cid" This commit was moved from ipfs/go-blockservice@0a3d4f7b4befaecaa3677f407c51b8aa40c48a6e --- blockservice/blockservice.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 23dcd0c333..3b5a1df6b9 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -14,6 +14,7 @@ import ( blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" logging "github.com/ipfs/go-log" + "github.com/ipfs/go-verifcid" ) var log = logging.Logger("blockservice") @@ -130,6 +131,11 @@ func NewSession(ctx context.Context, bs BlockService) *Session { // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *blockService) AddBlock(o blocks.Block) error { c := o.Cid() + // hash security + err := verifcid.ValidateCid(c) + if err != nil { + return err + } if s.checkFirst { if has, err := s.blockstore.Has(c); has || err != nil { return err @@ -150,6 +156,13 @@ func (s *blockService) AddBlock(o blocks.Block) error { } func (s *blockService) AddBlocks(bs []blocks.Block) error { + // hash security + for _, b := range bs { + err := verifcid.ValidateCid(b.Cid()) + if err != nil { + return err + } + } var toput []blocks.Block if s.checkFirst { toput = make([]blocks.Block, 0, len(bs)) @@ -198,6 +211,11 @@ func (s *blockService) getExchange() exchange.Fetcher { } func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) (blocks.Block, error) { + err := verifcid.ValidateCid(c) // hash security + if err != nil { + return nil, err + } + block, err := bs.Get(c) if err == nil { return block, nil @@ -241,6 +259,18 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget go func() { defer close(out) + k := 0 + for _, c := range ks { + // hash security + if err := verifcid.ValidateCid(c); err == nil { + ks[k] = c + k++ + } else { + log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) + } + } + ks = ks[:k] + var misses []cid.Cid for _, c := range ks { hit, err := bs.Get(c) From 916e539eccbdafc65f2b177eeb1b7040e0f795dc Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 2 Mar 2019 18:41:53 +0100 Subject: [PATCH 2628/3147] Fmt options.go License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-mfs@f2af04af36884d527059509ec84482a82cd011e5 --- mfs/options.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mfs/options.go b/mfs/options.go index 1edb99e11b..6bdcd71006 100644 --- a/mfs/options.go +++ b/mfs/options.go @@ -1,7 +1,7 @@ package mfs type Flags struct { - Read bool + Read bool Write bool - Sync bool + Sync bool } From 9c3cf70c5f23696257374f5f42212364d706d427 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 4 Mar 2019 20:11:38 -0800 Subject: [PATCH 2629/3147] tweak the Ls interface 1. Avoid `ipld.Link`. This is a protodag specific thing that will go away in future IPLD versions. 2. Avoid exposing the underlying file types. The user shouldn't care if they're dealing with a hamt, etc. 3. Add a field for a symlink's target. 4. Rename LsLink to DirEntry to better this type's role. This commit was moved from ipfs/interface-go-ipfs-core@dbee8cc1adb3b53a10ea33add0584b030f92106a --- coreiface/tests/unixfs.go | 23 +++++++++++------------ coreiface/unixfs.go | 36 ++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index bcb5331d51..a0c33c0b0a 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -750,26 +750,25 @@ func (tp *provider) TestLs(t *testing.T) { t.Error(err) } - links, err := api.Unixfs().Ls(ctx, p) + entries, err := api.Unixfs().Ls(ctx, p) if err != nil { t.Error(err) } - linkRes := <-links - if linkRes.Err != nil { - t.Fatal(linkRes.Err) + entry := <-entries + if entry.Err != nil { + t.Fatal(entry.Err) } - link := linkRes.Link - if linkRes.Size != 15 { - t.Fatalf("expected size = 15, got %d", link.Size) + if entry.Size != 15 { + t.Fatalf("expected size = 15, got %d", entry.Size) } - if link.Name != "name-of-file" { - t.Fatalf("expected name = name-of-file, got %s", link.Name) + if entry.Name != "name-of-file" { + t.Fatalf("expected name = name-of-file, got %s", entry.Name) } - if link.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { - t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", link.Cid) + if entry.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { + t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", entry.Cid) } - if l, ok := <-links; ok { + if l, ok := <-entries; ok { t.Errorf("didn't expect a second link") if l.Err != nil { t.Error(l.Err) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 5aae00dc4b..bdf08b5c3c 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -4,9 +4,8 @@ import ( "context" "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/ipfs/go-ipfs-files" - ipld "github.com/ipfs/go-ipld-format" - "github.com/ipfs/go-unixfs" + cid "github.com/ipfs/go-cid" + files "github.com/ipfs/go-ipfs-files" ) type AddEvent struct { @@ -16,21 +15,30 @@ type AddEvent struct { Size string `json:",omitempty"` } +// FileType is an enum of possible UnixFS file types. type FileType int32 const ( - TRaw = FileType(unixfs.TRaw) - TFile = FileType(unixfs.TFile) - TDirectory = FileType(unixfs.TDirectory) - TMetadata = FileType(unixfs.TMetadata) - TSymlink = FileType(unixfs.TSymlink) - THAMTShard = FileType(unixfs.THAMTShard) + // TUnknown means the file type isn't known (e.g., it hasn't been + // resolved). + TUnknown FileType = iota + // TFile is a regular file. + TFile + // TDirectory is a directory. + TDirectory + // TSymlink is a symlink. + TSymlink ) -type LsLink struct { - Link *ipld.Link - Size uint64 - Type FileType +// DirEntry is a directory entry returned by `Ls`. +type DirEntry struct { + Name string + Cid cid.Cid + + // Only filled when asked to resolve the directory entry. + Size uint64 // The size of the file in bytes (or the size of the symlink). + Type FileType // The type of the file. + Target Path // The symlink target (if a symlink). Err error } @@ -51,5 +59,5 @@ type UnixfsAPI interface { // Ls returns the list of links in a directory. Links aren't guaranteed to be // returned in order - Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan LsLink, error) + Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan DirEntry, error) } From 528e82bcf9b1dd1cf9ebe33ee5c256268792d41c Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 2 Mar 2019 19:26:36 +0100 Subject: [PATCH 2630/3147] gx: unrewrite License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-pinner@8721ce0afa4cfd9f3e6b1a896c13d9f8b5528035 --- pinning/pinner/gc/gc.go | 20 ++++++++++---------- pinning/pinner/internal/pb/header.pb.go | 2 +- pinning/pinner/pin.go | 10 +++++----- pinning/pinner/pin_test.go | 18 +++++++++--------- pinning/pinner/set.go | 8 ++++---- pinning/pinner/set_test.go | 16 ++++++++-------- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 97ea9a81e2..9234d43689 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -7,17 +7,17 @@ import ( "fmt" "strings" + bserv "github.com/ipfs/go-blockservice" pin "github.com/ipfs/go-ipfs/pin" - dag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" - bserv "gx/ipfs/QmUEXNytX2q9g9xtdfHRVYfsvjw5V9FQ32vE9ZRYFAxFoy/go-blockservice" - - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - dstore "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - bstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" - ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" - offline "gx/ipfs/Qmb9fkAWgcyVRnFdXGqA6jcWGFj6q35oJjwRAYRhfEboGS/go-ipfs-exchange-offline" - logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" - "gx/ipfs/QmcVd2ApQdbfaYPKhCjj4WoQuxk4CMxPqmNpijKmFLh6qa/go-verifcid" + dag "github.com/ipfs/go-merkledag" + + cid "github.com/ipfs/go-cid" + dstore "github.com/ipfs/go-datastore" + bstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" + "github.com/ipfs/go-verifcid" ) var log = logging.Logger("gc") diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go index dd215e1263..71196b2631 100644 --- a/pinning/pinner/internal/pb/header.pb.go +++ b/pinning/pinner/internal/pb/header.pb.go @@ -6,7 +6,7 @@ package pb import ( encoding_binary "encoding/binary" fmt "fmt" - proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + proto "github.com/gogo/protobuf/proto" io "io" math "math" ) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index e60dc18be1..24dbf46535 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -10,12 +10,12 @@ import ( "time" "github.com/ipfs/go-ipfs/dagutils" - mdag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" + mdag "github.com/ipfs/go-merkledag" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" - logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 7758003724..6f9914ef3b 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -5,15 +5,15 @@ import ( "testing" "time" - mdag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" - bs "gx/ipfs/QmUEXNytX2q9g9xtdfHRVYfsvjw5V9FQ32vE9ZRYFAxFoy/go-blockservice" - - util "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" - offline "gx/ipfs/Qmb9fkAWgcyVRnFdXGqA6jcWGFj6q35oJjwRAYRhfEboGS/go-ipfs-exchange-offline" + bs "github.com/ipfs/go-blockservice" + mdag "github.com/ipfs/go-merkledag" + + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + blockstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" + util "github.com/ipfs/go-ipfs-util" ) var rand = util.NewTimeSeededRand() diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index f3fcac1f79..b050c31c43 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -10,11 +10,11 @@ import ( "sort" "github.com/ipfs/go-ipfs/pin/internal/pb" - "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" + "github.com/ipfs/go-merkledag" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ipld "gx/ipfs/QmZ6nzCLwGLVfRzYLpD7pW6UNuBDKEcA2imJtVpbEx2rxy/go-ipld-format" - "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + "github.com/gogo/protobuf/proto" + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index ea6df844ee..d9a573c5fa 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -5,14 +5,14 @@ import ( "encoding/binary" "testing" - dag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" - bserv "gx/ipfs/QmUEXNytX2q9g9xtdfHRVYfsvjw5V9FQ32vE9ZRYFAxFoy/go-blockservice" - - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" - offline "gx/ipfs/Qmb9fkAWgcyVRnFdXGqA6jcWGFj6q35oJjwRAYRhfEboGS/go-ipfs-exchange-offline" + bserv "github.com/ipfs/go-blockservice" + dag "github.com/ipfs/go-merkledag" + + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-datastore/query" + blockstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" ) func ignoreCids(_ cid.Cid) {} From 33e89f90a8cda173c71b5ef00157c21486bf7fb2 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 2 Mar 2019 19:26:36 +0100 Subject: [PATCH 2631/3147] gx: unrewrite License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-namesys@c204b8318ffe68ebc3c7c50b2a3bf1f83cc4692d --- namesys/base.go | 4 +-- namesys/cache.go | 2 +- namesys/dns.go | 6 ++--- namesys/dns_test.go | 2 +- namesys/interface.go | 6 ++--- namesys/ipns_resolver_validation_test.go | 32 ++++++++++++------------ namesys/namesys.go | 18 ++++++------- namesys/namesys_test.go | 20 +++++++-------- namesys/proquint.go | 6 ++--- namesys/publisher.go | 22 ++++++++-------- namesys/publisher_test.go | 18 ++++++------- namesys/republisher/repub.go | 20 +++++++-------- namesys/republisher/repub_test.go | 8 +++--- namesys/resolve_test.go | 14 +++++------ namesys/routing.go | 22 ++++++++-------- 15 files changed, 100 insertions(+), 100 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index ebeb86c313..27cc38f888 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -5,8 +5,8 @@ import ( "strings" "time" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" + path "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ) type onceResult struct { diff --git a/namesys/cache.go b/namesys/cache.go index d277756691..4a5cb5113a 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -3,7 +3,7 @@ package namesys import ( "time" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" + path "github.com/ipfs/go-path" ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { diff --git a/namesys/dns.go b/namesys/dns.go index 2c31fcae72..931edec001 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -6,9 +6,9 @@ import ( "net" "strings" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" - isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" + path "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + isd "github.com/jbenet/go-is-domain" ) type LookupTXTFunc func(name string) (txt []string, err error) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 460afb023e..8d53887be5 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ) type mockDNS struct { diff --git a/namesys/interface.go b/namesys/interface.go index 04ca1eeb7a..4db95ab3ca 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -35,9 +35,9 @@ import ( context "context" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" + path "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + ci "github.com/libp2p/go-libp2p-crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 3c583a973b..71335b5223 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,22 +5,22 @@ import ( "testing" "time" - u "gx/ipfs/QmNohiVssaPw3KVLZik59DBVGTSm2dGvYT9eoXt5DQ36Yz/go-ipfs-util" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - testutil "gx/ipfs/QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W/go-testutil" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" - ropts "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing/options" - mockrouting "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/mock" - offline "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/offline" - pstore "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore" - pstoremem "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore/pstoremem" - record "gx/ipfs/QmbeHtaBy9nZsW4cHRcvgVY4CnDhXudE2Dr6qDxS7yg9rX/go-libp2p-record" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + mockrouting "github.com/ipfs/go-ipfs-routing/mock" + offline "github.com/ipfs/go-ipfs-routing/offline" + u "github.com/ipfs/go-ipfs-util" + ipns "github.com/ipfs/go-ipns" + path "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" + record "github.com/libp2p/go-libp2p-record" + routing "github.com/libp2p/go-libp2p-routing" + ropts "github.com/libp2p/go-libp2p-routing/options" + testutil "github.com/libp2p/go-testutil" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index b8ccdaafb1..94d4989922 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -5,15 +5,15 @@ import ( "strings" "time" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - lru "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" - isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain" - mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + lru "github.com/hashicorp/golang-lru" + ds "github.com/ipfs/go-datastore" + path "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + isd "github.com/jbenet/go-is-domain" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + routing "github.com/libp2p/go-libp2p-routing" + mh "github.com/multiformats/go-multihash" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 3da16d2389..09c5a39c20 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -5,16 +5,16 @@ import ( "fmt" "testing" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - offroute "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/offline" - pstoremem "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore/pstoremem" - "gx/ipfs/QmcYUTQ7tBZeH1CLsZM2S3xhMEZdvUgXvbjhpMsLDpk3oJ/go-unixfs" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + offroute "github.com/ipfs/go-ipfs-routing/offline" + ipns "github.com/ipfs/go-ipns" + path "github.com/ipfs/go-path" + "github.com/ipfs/go-unixfs" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" ) type mockResolver struct { diff --git a/namesys/proquint.go b/namesys/proquint.go index e36865903a..63cb62a047 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -4,9 +4,9 @@ import ( "context" "errors" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" - proquint "gx/ipfs/QmYnf27kzqR2cxt6LFZdrAFJuQd6785fTkBvMuEj9EeRxM/proquint" + proquint "github.com/bren2010/proquint" + path "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ) type ProquintResolver struct{} diff --git a/namesys/publisher.go b/namesys/publisher.go index 126bcd1ce5..e43858d02f 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -8,17 +8,17 @@ import ( pin "github.com/ipfs/go-ipfs/pin" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dsquery "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" - ft "gx/ipfs/QmcYUTQ7tBZeH1CLsZM2S3xhMEZdvUgXvbjhpMsLDpk3oJ/go-unixfs" - proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" - base32 "gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32" + proto "github.com/gogo/protobuf/proto" + ds "github.com/ipfs/go-datastore" + dsquery "github.com/ipfs/go-datastore/query" + ipns "github.com/ipfs/go-ipns" + pb "github.com/ipfs/go-ipns/pb" + path "github.com/ipfs/go-path" + ft "github.com/ipfs/go-unixfs" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + routing "github.com/libp2p/go-libp2p-routing" + base32 "github.com/whyrusleeping/base32" ) const ipnsPrefix = "/ipns/" diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 8b7481d59c..53cc6735ee 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - ma "gx/ipfs/QmTZBfrPJmjWsCvHEtX5FE6KimVJhsJg5sBbqEFYf4UZtL/go-multiaddr" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - testutil "gx/ipfs/QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W/go-testutil" - dshelp "gx/ipfs/QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847/go-ipfs-ds-help" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - mockrouting "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/mock" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + dshelp "github.com/ipfs/go-ipfs-ds-help" + mockrouting "github.com/ipfs/go-ipfs-routing/mock" + ipns "github.com/ipfs/go-ipns" + ci "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" + testutil "github.com/libp2p/go-testutil" + ma "github.com/multiformats/go-multiaddr" ) type identity struct { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index c7a7f4442d..1092ba3a57 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -7,16 +7,16 @@ import ( keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-ipfs/namesys" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - gpctx "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess/context" - ic "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" - proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + path "github.com/ipfs/go-path" + + proto "github.com/gogo/protobuf/proto" + ds "github.com/ipfs/go-datastore" + pb "github.com/ipfs/go-ipns/pb" + logging "github.com/ipfs/go-log" + goprocess "github.com/jbenet/goprocess" + gpctx "github.com/jbenet/goprocess/context" + ic "github.com/libp2p/go-libp2p-crypto" + peer "github.com/libp2p/go-libp2p-peer" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 1f582a44dc..22d69e254d 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -10,11 +10,11 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" + path "github.com/ipfs/go-path" - mocknet "gx/ipfs/QmRxk6AUaGaKCfzS1xSNRojiAPd7h2ih8GuCdjJBF3Y6GK/go-libp2p/p2p/net/mock" - goprocess "gx/ipfs/QmSF8fPo3jgVBAy8fpdjjYqgG87dkJgUprRBHRd2tmfgpP/goprocess" - pstore "gx/ipfs/QmaCTz9RkrU13bm9kMB54f7atgqM4qkjDZpRwRoJiWXEqs/go-libp2p-peerstore" + goprocess "github.com/jbenet/goprocess" + pstore "github.com/libp2p/go-libp2p-peerstore" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 80eb7d83f5..8820614486 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -6,13 +6,13 @@ import ( "testing" "time" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dssync "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/sync" - ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - testutil "gx/ipfs/QmWapVoHjtKhn4MhvKNoPTkJKADFGACfXPFnt7combwp5W/go-testutil" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - mockrouting "gx/ipfs/QmZ22s3UgNi5vvYNH79jWJ63NPyQGiv4mdNaWCz4WKqMTZ/go-ipfs-routing/mock" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + mockrouting "github.com/ipfs/go-ipfs-routing/mock" + ipns "github.com/ipfs/go-ipns" + path "github.com/ipfs/go-path" + peer "github.com/libp2p/go-libp2p-peer" + testutil "github.com/libp2p/go-testutil" ) func TestRoutingResolve(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index 315a281bb5..d581337754 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,17 +5,17 @@ import ( "strings" "time" - path "gx/ipfs/QmQAgv6Gaoe2tQpcabqwKXKChp2MZ7i3UXv9DqTTaxCaTR/go-path" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ipns "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns" - pb "gx/ipfs/QmUwMnKKjH3JwGKNVZ3TcP37W93xzqNA4ECFFiMo6sXkkc/go-ipns/pb" - opts "gx/ipfs/QmXLwxifxwfc2bAwq6rdjbYqAsGzWsDE9RM5TWMGtykyj6/interface-go-ipfs-core/options/namesys" - peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer" - routing "gx/ipfs/QmYxUdYY9S6yg5tSPVin5GFTvtfsLauVcr7reHDD3dM8xf/go-libp2p-routing" - logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" - dht "gx/ipfs/QmdR6WN3TUEAVQ9KWE2UiFJikWTbUvgBJay6mjB4yUJebq/go-libp2p-kad-dht" - proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" - mh "gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash" + proto "github.com/gogo/protobuf/proto" + cid "github.com/ipfs/go-cid" + ipns "github.com/ipfs/go-ipns" + pb "github.com/ipfs/go-ipns/pb" + logging "github.com/ipfs/go-log" + path "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + dht "github.com/libp2p/go-libp2p-kad-dht" + peer "github.com/libp2p/go-libp2p-peer" + routing "github.com/libp2p/go-libp2p-routing" + mh "github.com/multiformats/go-multihash" ) var log = logging.Logger("namesys") From 9b48524e90cf6a1a78f16a9ca5bc8678f7296f4e Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 2 Mar 2019 19:26:36 +0100 Subject: [PATCH 2632/3147] gx: unrewrite License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-keystore@519c2134b72dfab9451ec5fb00ab4f34a99895a8 --- keystore/keystore.go | 4 ++-- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index bafc859b9f..d9467f263c 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,8 +7,8 @@ import ( "path/filepath" "strings" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" - logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" + logging "github.com/ipfs/go-log" + ci "github.com/libp2p/go-libp2p-crypto" ) var log = logging.Logger("keystore") diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index fe8276872a..c69fd6a053 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 6983100f9f..4f505a995b 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto" +import ci "github.com/libp2p/go-libp2p-crypto" // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. From d042bd4cf142c251e8ab147bfb768cc3d27b45da Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 2 Mar 2019 19:26:36 +0100 Subject: [PATCH 2633/3147] gx: unrewrite License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-filestore@13954a4a034df7278f440033badc2acf44307fe0 --- filestore/filestore.go | 12 ++++++------ filestore/filestore_test.go | 10 +++++----- filestore/fsrefstore.go | 18 +++++++++--------- filestore/pb/dataobj.pb.go | 2 +- filestore/util.go | 10 +++++----- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 69021b7b7f..be4d954beb 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -11,12 +11,12 @@ import ( "context" "errors" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" - blocks "gx/ipfs/QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK/go-block-format" - logging "gx/ipfs/QmbkT7eMTyXfpeyB3ZMxxcxg7XH8t6uXp49jqzz4HB7BGF/go-log" - posinfo "gx/ipfs/QmdiZuFuiFD1Gbuu8PdqmsfrCR3z4QKSR2bN1NAvnJgTY7/go-ipfs-posinfo" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + dsq "github.com/ipfs/go-datastore/query" + blockstore "github.com/ipfs/go-ipfs-blockstore" + posinfo "github.com/ipfs/go-ipfs-posinfo" + logging "github.com/ipfs/go-log" ) var log = logging.Logger("filestore") diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index b6fdf3507e..783dc86f94 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -7,12 +7,12 @@ import ( "math/rand" "testing" - dag "gx/ipfs/QmPJNbVw8o3ohC43ppSXyNXwYKsWShG4zygnirHptfbHri/go-merkledag" + dag "github.com/ipfs/go-merkledag" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" - posinfo "gx/ipfs/QmdiZuFuiFD1Gbuu8PdqmsfrCR3z4QKSR2bN1NAvnJgTY7/go-ipfs-posinfo" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + blockstore "github.com/ipfs/go-ipfs-blockstore" + posinfo "github.com/ipfs/go-ipfs-posinfo" ) func newTestFilestore(t *testing.T) (string, *Filestore) { diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 190061017f..b4c66a32d1 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -10,15 +10,15 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dsns "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/namespace" - dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - dshelp "gx/ipfs/QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847/go-ipfs-ds-help" - blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" - blocks "gx/ipfs/QmYYLnAzR28nAQ4U5MFniLprnktu6eTFKibeNt96V21EZK/go-block-format" - proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" - posinfo "gx/ipfs/QmdiZuFuiFD1Gbuu8PdqmsfrCR3z4QKSR2bN1NAvnJgTY7/go-ipfs-posinfo" + proto "github.com/gogo/protobuf/proto" + blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dsns "github.com/ipfs/go-datastore/namespace" + dsq "github.com/ipfs/go-datastore/query" + blockstore "github.com/ipfs/go-ipfs-blockstore" + dshelp "github.com/ipfs/go-ipfs-ds-help" + posinfo "github.com/ipfs/go-ipfs-posinfo" ) // FilestorePrefix identifies the key prefix for FileManager blocks. diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index cf1da15133..59650a11c1 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -5,7 +5,7 @@ package datastore_pb import ( fmt "fmt" - proto "gx/ipfs/QmddjPSGZb3ieihSseFeCfVRpZzcqczPNsD2DvarSwnjJB/gogo-protobuf/proto" + proto "github.com/gogo/protobuf/proto" io "io" math "math" ) diff --git a/filestore/util.go b/filestore/util.go index 45accb3a37..4f39495915 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -6,11 +6,11 @@ import ( pb "github.com/ipfs/go-ipfs/filestore/pb" - cid "gx/ipfs/QmTbxNB1NwDesLmKTscr4udL2tVP7MaxvXnD1D9yX7g3PN/go-cid" - ds "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore" - dsq "gx/ipfs/QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9/go-datastore/query" - dshelp "gx/ipfs/QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847/go-ipfs-ds-help" - blockstore "gx/ipfs/QmXjKkjMDTtXAiLBwstVexofB8LeruZmE2eBd85GwGFFLA/go-ipfs-blockstore" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dsq "github.com/ipfs/go-datastore/query" + blockstore "github.com/ipfs/go-ipfs-blockstore" + dshelp "github.com/ipfs/go-ipfs-ds-help" ) // Status is used to identify the state of the block data referenced From ee697a3b097c25457cccf63c42ba03fadde9d4ef Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 5 Mar 2019 09:36:58 -0800 Subject: [PATCH 2634/3147] file type: add stringer This commit was moved from ipfs/interface-go-ipfs-core@4e99a8e9250040b9cfc9600641d138fca8ff01f9 --- coreiface/unixfs.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index bdf08b5c3c..d0e3ec572d 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -30,6 +30,21 @@ const ( TSymlink ) +func (t FileType) String() string { + switch t { + case TUnknown: + return "unknown" + case TFile: + return "file" + case TDirectory: + return "directory" + case TSymlink: + return "symlink" + default: + return "" + } +} + // DirEntry is a directory entry returned by `Ls`. type DirEntry struct { Name string From 4be6e60dbea5e9dd8cf37d1f7a5b038e2a18dbf7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 5 Mar 2019 09:37:40 -0800 Subject: [PATCH 2635/3147] tests: add symlink target test (also, fix some error versus fatal nits) This commit was moved from ipfs/interface-go-ipfs-core@5c6a751986f6d5fe1174819442fcd5f60e0a6f7d --- coreiface/tests/unixfs.go | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index a0c33c0b0a..b8b22e50ae 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -737,22 +737,23 @@ func (tp *provider) TestLs(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } r := strings.NewReader("content-of-file") p, err := api.Unixfs().Add(ctx, files.NewMapDirectory(map[string]files.Node{ "0": files.NewMapDirectory(map[string]files.Node{ - "name-of-file": files.NewReaderFile(r), + "name-of-file": files.NewReaderFile(r), + "name-of-symlink": files.NewLinkFile("/foo/bar", nil), }), })) if err != nil { - t.Error(err) + t.Fatal(err) } entries, err := api.Unixfs().Ls(ctx, p) if err != nil { - t.Error(err) + t.Fatal(err) } entry := <-entries @@ -760,13 +761,33 @@ func (tp *provider) TestLs(t *testing.T) { t.Fatal(entry.Err) } if entry.Size != 15 { - t.Fatalf("expected size = 15, got %d", entry.Size) + t.Errorf("expected size = 15, got %d", entry.Size) } if entry.Name != "name-of-file" { - t.Fatalf("expected name = name-of-file, got %s", entry.Name) + t.Errorf("expected name = name-of-file, got %s", entry.Name) + } + if entry.Type != coreiface.TFile { + t.Errorf("wrong type %s", entry.Type) } if entry.Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { - t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", entry.Cid) + t.Errorf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", entry.Cid) + } + entry = <-entries + if entry.Err != nil { + t.Fatal(entry.Err) + } + if entry.Type != coreiface.TSymlink { + t.Errorf("wrong type %s", entry.Type) + } + if entry.Name != "name-of-symlink" { + t.Errorf("expected name = name-of-symlink, got %s", entry.Name) + } + if entry.Target.String() != "/foo/bar" { + t.Errorf("expected symlink target to be /foo/bar, got %s", entry.Target) + } + + if int(entry.Size) != len(entry.Target.String()) { + t.Errorf("expected size = %d, got %d", len(entry.Target.String()), entry.Size) } if l, ok := <-entries; ok { t.Errorf("didn't expect a second link") From e2900773a64d532ccbbabd5ed23c048270bfbefe Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 5 Mar 2019 09:54:43 -0800 Subject: [PATCH 2636/3147] switch symlink target type to string (path can't represent relative paths) This commit was moved from ipfs/interface-go-ipfs-core@368881fa4a30814112d1b2096c37c91f5fd16976 --- coreiface/tests/unixfs.go | 6 +++--- coreiface/unixfs.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index b8b22e50ae..79dedf155e 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -782,12 +782,12 @@ func (tp *provider) TestLs(t *testing.T) { if entry.Name != "name-of-symlink" { t.Errorf("expected name = name-of-symlink, got %s", entry.Name) } - if entry.Target.String() != "/foo/bar" { + if entry.Target != "/foo/bar" { t.Errorf("expected symlink target to be /foo/bar, got %s", entry.Target) } - if int(entry.Size) != len(entry.Target.String()) { - t.Errorf("expected size = %d, got %d", len(entry.Target.String()), entry.Size) + if int(entry.Size) != len(entry.Target) { + t.Errorf("expected size = %d, got %d", len(entry.Target), entry.Size) } if l, ok := <-entries; ok { t.Errorf("didn't expect a second link") diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index d0e3ec572d..f9508f1385 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -53,7 +53,7 @@ type DirEntry struct { // Only filled when asked to resolve the directory entry. Size uint64 // The size of the file in bytes (or the size of the symlink). Type FileType // The type of the file. - Target Path // The symlink target (if a symlink). + Target string // The symlink target (if a symlink). Err error } From f5117736743ee8753e359aa7e7dbcaf602d75224 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 6 Mar 2019 16:41:05 -0800 Subject: [PATCH 2637/3147] remove target size requirement It's complicated. We need to carefully think through how sizes work. This commit was moved from ipfs/interface-go-ipfs-core@7a7cf9694be27b62820f05e2ac11bb4a57bab982 --- coreiface/tests/unixfs.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 79dedf155e..bbcb668997 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -786,9 +786,6 @@ func (tp *provider) TestLs(t *testing.T) { t.Errorf("expected symlink target to be /foo/bar, got %s", entry.Target) } - if int(entry.Size) != len(entry.Target) { - t.Errorf("expected size = %d, got %d", len(entry.Target), entry.Size) - } if l, ok := <-entries; ok { t.Errorf("didn't expect a second link") if l.Err != nil { From 5d1baca6923535dacdb0dcd2da5c6968c8870c61 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Fri, 8 Mar 2019 14:19:29 -0800 Subject: [PATCH 2638/3147] Provide root node immediately when add and pin add License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@931c253ea481289ffd83709494cad630e46a36f7 --- provider/provider.go | 88 ++++++++++++++++ provider/queue.go | 235 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 323 insertions(+) create mode 100644 provider/provider.go create mode 100644 provider/queue.go diff --git a/provider/provider.go b/provider/provider.go new file mode 100644 index 0000000000..ee0481a0f1 --- /dev/null +++ b/provider/provider.go @@ -0,0 +1,88 @@ +// Package provider implements structures and methods to provide blocks, +// keep track of which blocks are provided, and to allow those blocks to +// be reprovided. +package provider + +import ( + "context" + "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p-routing" + "time" +) + +var ( + log = logging.Logger("provider") +) + +const ( + provideOutgoingWorkerLimit = 8 + provideOutgoingTimeout = 15 * time.Second +) + +// Provider announces blocks to the network, tracks which blocks are +// being provided, and untracks blocks when they're no longer in the blockstore. +type Provider struct { + ctx context.Context + // the CIDs for which provide announcements should be made + queue *Queue + // used to announce providing to the network + contentRouting routing.ContentRouting +} + +func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.ContentRouting) *Provider { + return &Provider{ + ctx: ctx, + queue: queue, + contentRouting: contentRouting, + } +} + +// Start workers to handle provide requests. +func (p *Provider) Run() { + p.queue.Run() + p.handleAnnouncements() +} + +// Provide the given cid using specified strategy. +func (p *Provider) Provide(root cid.Cid) error { + return p.queue.Enqueue(root) +} + +// Handle all outgoing cids by providing (announcing) them +func (p *Provider) handleAnnouncements() { + for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { + go func() { + for { + select { + case <-p.ctx.Done(): + return + case entry := <-p.queue.Dequeue(): + if err := doProvide(p.ctx, p.contentRouting, entry.cid); err != nil { + log.Warningf("Unable to provide entry: %s, %s", entry.cid, err) + } + + if err := entry.Complete(); err != nil { + log.Warningf("Unable to complete queue entry when providing: %s, %s", entry.cid, err) + } + } + } + }() + } +} + +// TODO: better document this provide logic +func doProvide(ctx context.Context, contentRouting routing.ContentRouting, key cid.Cid) error { + // announce + log.Info("announce - start - ", key) + ctx, cancel := context.WithTimeout(ctx, provideOutgoingTimeout) + if err := contentRouting.Provide(ctx, key, true); err != nil { + log.Warningf("Failed to provide cid: %s", err) + // TODO: Maybe put these failures onto a failures queue? + cancel() + return err + } + cancel() + log.Info("announce - end - ", key) + return nil +} diff --git a/provider/queue.go b/provider/queue.go new file mode 100644 index 0000000000..65656450a0 --- /dev/null +++ b/provider/queue.go @@ -0,0 +1,235 @@ +package provider + +import ( + "context" + "errors" + "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/namespace" + "github.com/ipfs/go-datastore/query" + "math" + "strconv" + "strings" + "sync" +) + +// Entry allows for the durability in the queue. When a cid is dequeued it is +// not removed from the datastore until you call Complete() on the entry you +// receive. +type Entry struct { + cid cid.Cid + key ds.Key + queue *Queue +} + +func (e *Entry) Complete() error { + return e.queue.remove(e.key) +} + +// Queue provides a durable, FIFO interface to the datastore for storing cids +// +// Durability just means that cids in the process of being provided when a +// crash or shutdown occurs will still be in the queue when the node is +// brought back online. +type Queue struct { + // used to differentiate queues in datastore + // e.g. provider vs reprovider + name string + + ctx context.Context + + tail uint64 + head uint64 + + lock sync.Mutex + datastore ds.Datastore + + dequeue chan *Entry + notEmpty chan struct{} + + isRunning bool +} + +func NewQueue(name string, ctx context.Context, datastore ds.Datastore) (*Queue, error) { + namespaced := namespace.Wrap(datastore, ds.NewKey("/" + name + "/queue/")) + head, tail, err := getQueueHeadTail(name, ctx, namespaced) + if err != nil { + return nil, err + } + q := &Queue{ + name: name, + ctx: ctx, + head: head, + tail: tail, + lock: sync.Mutex{}, + datastore: namespaced, + dequeue: make(chan *Entry), + notEmpty: make(chan struct{}), + isRunning: false, + } + return q, nil +} + +// Put a cid in the queue +func (q *Queue) Enqueue(cid cid.Cid) error { + q.lock.Lock() + defer q.lock.Unlock() + + wasEmpty := q.IsEmpty() + + nextKey := q.queueKey(q.tail) + + if err := q.datastore.Put(nextKey, cid.Bytes()); err != nil { + return err + } + + q.tail++ + + if q.isRunning && wasEmpty { + select { + case q.notEmpty <- struct{}{}: + case <-q.ctx.Done(): + } + } + + return nil +} + +// Remove an entry from the queue. +func (q *Queue) Dequeue() <-chan *Entry { + return q.dequeue +} + +func (q *Queue) IsEmpty() bool { + return (q.tail - q.head) == 0 +} + +func (q *Queue) remove(key ds.Key) error { + return q.datastore.Delete(key) +} + +// dequeue items when the dequeue channel is available to +// be written to +func (q *Queue) Run() { + q.isRunning = true + go func() { + for { + select { + case <-q.ctx.Done(): + return + default: + } + if q.IsEmpty() { + select { + case <-q.ctx.Done(): + return + // wait for a notEmpty message + case <-q.notEmpty: + } + } + + entry, err := q.next() + if err != nil { + log.Warningf("Error Dequeue()-ing: %s, %s", entry, err) + continue + } + + select { + case <-q.ctx.Done(): + return + case q.dequeue <- entry: + } + } + }() +} + +// Find the next item in the queue, crawl forward if an entry is not +// found in the next spot. +func (q *Queue) next() (*Entry, error) { + q.lock.Lock() + defer q.lock.Unlock() + + var nextKey ds.Key + var value []byte + var err error + for { + if q.head >= q.tail { + return nil, errors.New("no more entries in queue") + } + select { + case <-q.ctx.Done(): + return nil, nil + default: + } + nextKey = q.queueKey(q.head) + value, err = q.datastore.Get(nextKey) + if err == ds.ErrNotFound { + q.head++ + continue + } else if err != nil { + return nil, err + } else { + break + } + } + + id, err := cid.Parse(value) + if err != nil { + return nil, err + } + + entry := &Entry { + cid: id, + key: nextKey, + queue: q, + } + + q.head++ + + return entry, nil +} + +func (q *Queue) queueKey(id uint64) ds.Key { + return ds.NewKey(strconv.FormatUint(id, 10)) +} + +// crawl over the queue entries to find the head and tail +func getQueueHeadTail(name string, ctx context.Context, datastore ds.Datastore) (uint64, uint64, error) { + query := query.Query{} + results, err := datastore.Query(query) + if err != nil { + return 0, 0, err + } + + var tail uint64 = 0 + var head uint64 = math.MaxUint64 + for entry := range results.Next() { + select { + case <-ctx.Done(): + return 0, 0, nil + default: + } + trimmed := strings.TrimPrefix(entry.Key, "/") + id, err := strconv.ParseUint(trimmed, 10, 64) + if err != nil { + return 0, 0, err + } + + if id < head { + head = id + } + + if (id+1) > tail { + tail = (id+1) + } + } + if err := results.Close(); err != nil { + return 0, 0, err + } + if head == math.MaxUint64 { + head = 0 + } + + return head, tail, nil +} + From a0ccc85a802798410c2d587a96157da9b65ef8ff Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Fri, 8 Mar 2019 15:49:25 -0800 Subject: [PATCH 2639/3147] Remove timeout from provide context This is being removed because it appears that the provide announcements go out regardless of the timeout. License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@c5f00613d8f8eaa1b08011ba28f9b06336614055 --- provider/provider.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index ee0481a0f1..e43058b396 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -8,7 +8,6 @@ import ( "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-routing" - "time" ) var ( @@ -17,7 +16,6 @@ var ( const ( provideOutgoingWorkerLimit = 8 - provideOutgoingTimeout = 15 * time.Second ) // Provider announces blocks to the network, tracks which blocks are @@ -75,14 +73,11 @@ func (p *Provider) handleAnnouncements() { func doProvide(ctx context.Context, contentRouting routing.ContentRouting, key cid.Cid) error { // announce log.Info("announce - start - ", key) - ctx, cancel := context.WithTimeout(ctx, provideOutgoingTimeout) if err := contentRouting.Provide(ctx, key, true); err != nil { log.Warningf("Failed to provide cid: %s", err) // TODO: Maybe put these failures onto a failures queue? - cancel() return err } - cancel() log.Info("announce - end - ", key) return nil } From 95ff711ff0709e816700f23725ef54fea34a668b Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Fri, 8 Mar 2019 16:31:51 -0800 Subject: [PATCH 2640/3147] Use offlineProvider when --offline License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@90d30898c4fbbb1344286f620f68221a0f05cfa3 --- provider/offline.go | 15 +++++++++++++++ provider/provider.go | 17 +++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 provider/offline.go diff --git a/provider/offline.go b/provider/offline.go new file mode 100644 index 0000000000..f7b9603b92 --- /dev/null +++ b/provider/offline.go @@ -0,0 +1,15 @@ +package provider + +import "github.com/ipfs/go-cid" + +type offlineProvider struct {} + +func NewOfflineProvider() Provider { + return &offlineProvider{} +} + +func (op *offlineProvider) Run() {} + +func (op *offlineProvider) Provide(cid cid.Cid) error { + return nil +} diff --git a/provider/provider.go b/provider/provider.go index e43058b396..e4ee6d9ffb 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -18,9 +18,14 @@ const ( provideOutgoingWorkerLimit = 8 ) +type Provider interface { + Run() + Provide(cid.Cid) error +} + // Provider announces blocks to the network, tracks which blocks are // being provided, and untracks blocks when they're no longer in the blockstore. -type Provider struct { +type provider struct { ctx context.Context // the CIDs for which provide announcements should be made queue *Queue @@ -28,8 +33,8 @@ type Provider struct { contentRouting routing.ContentRouting } -func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.ContentRouting) *Provider { - return &Provider{ +func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.ContentRouting) Provider { + return &provider{ ctx: ctx, queue: queue, contentRouting: contentRouting, @@ -37,18 +42,18 @@ func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.Conte } // Start workers to handle provide requests. -func (p *Provider) Run() { +func (p *provider) Run() { p.queue.Run() p.handleAnnouncements() } // Provide the given cid using specified strategy. -func (p *Provider) Provide(root cid.Cid) error { +func (p *provider) Provide(root cid.Cid) error { return p.queue.Enqueue(root) } // Handle all outgoing cids by providing (announcing) them -func (p *Provider) handleAnnouncements() { +func (p *provider) handleAnnouncements() { for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { go func() { for { From 52598b7b12e9659e4a0b9cad99543e8e9d6e0a96 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 10 Mar 2019 15:22:42 +0100 Subject: [PATCH 2641/3147] Add license License: MIT License: Apache 2.0 Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-verifcid@11ea67429882fb057e0c7f239583f5edf522ed5a --- verifcid/LICENSE-APACHE | 15 +++++++++++++++ verifcid/LICENSE-MIT | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 verifcid/LICENSE-APACHE create mode 100644 verifcid/LICENSE-MIT diff --git a/verifcid/LICENSE-APACHE b/verifcid/LICENSE-APACHE new file mode 100644 index 0000000000..324ca36e94 --- /dev/null +++ b/verifcid/LICENSE-APACHE @@ -0,0 +1,15 @@ +APACHE License + +Copyright 2018 Protocol Labs, Inc + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/verifcid/LICENSE-MIT b/verifcid/LICENSE-MIT new file mode 100644 index 0000000000..5b0bba394b --- /dev/null +++ b/verifcid/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright 2018 Protocol Labs, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 0a145b6e0db0262e547f518fb4559c348cc95da1 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Fri, 8 Mar 2019 16:58:17 -0800 Subject: [PATCH 2642/3147] Refactor per code climate rules License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@7bdb5546328bf765897153f86cc136ee14863b6b --- provider/offline.go | 3 ++- provider/provider.go | 4 +-- provider/queue.go | 60 +++++++++++++++++++++++--------------------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/provider/offline.go b/provider/offline.go index f7b9603b92..029ddfa988 100644 --- a/provider/offline.go +++ b/provider/offline.go @@ -2,8 +2,9 @@ package provider import "github.com/ipfs/go-cid" -type offlineProvider struct {} +type offlineProvider struct{} +// NewOfflineProvider creates a Provider that does nothing func NewOfflineProvider() Provider { return &offlineProvider{} } diff --git a/provider/provider.go b/provider/provider.go index e4ee6d9ffb..76004f51ab 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -18,13 +18,12 @@ const ( provideOutgoingWorkerLimit = 8 ) +// Provider announces blocks to the network type Provider interface { Run() Provide(cid.Cid) error } -// Provider announces blocks to the network, tracks which blocks are -// being provided, and untracks blocks when they're no longer in the blockstore. type provider struct { ctx context.Context // the CIDs for which provide announcements should be made @@ -33,6 +32,7 @@ type provider struct { contentRouting routing.ContentRouting } +// NewProvider creates a provider that announces blocks to the network using a content router func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.ContentRouting) Provider { return &provider{ ctx: ctx, diff --git a/provider/queue.go b/provider/queue.go index 65656450a0..cc756366d6 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -17,11 +17,12 @@ import ( // not removed from the datastore until you call Complete() on the entry you // receive. type Entry struct { - cid cid.Cid - key ds.Key + cid cid.Cid + key ds.Key queue *Queue } +// Complete the entry by removing it from the queue func (e *Entry) Complete() error { return e.queue.remove(e.key) } @@ -41,36 +42,37 @@ type Queue struct { tail uint64 head uint64 - lock sync.Mutex + lock sync.Mutex datastore ds.Datastore - dequeue chan *Entry + dequeue chan *Entry notEmpty chan struct{} isRunning bool } -func NewQueue(name string, ctx context.Context, datastore ds.Datastore) (*Queue, error) { - namespaced := namespace.Wrap(datastore, ds.NewKey("/" + name + "/queue/")) - head, tail, err := getQueueHeadTail(name, ctx, namespaced) +// NewQueue creates a queue for cids +func NewQueue(ctx context.Context, name string, datastore ds.Datastore) (*Queue, error) { + namespaced := namespace.Wrap(datastore, ds.NewKey("/"+name+"/queue/")) + head, tail, err := getQueueHeadTail(ctx, name, namespaced) if err != nil { return nil, err } q := &Queue{ - name: name, - ctx: ctx, - head: head, - tail: tail, - lock: sync.Mutex{}, + name: name, + ctx: ctx, + head: head, + tail: tail, + lock: sync.Mutex{}, datastore: namespaced, - dequeue: make(chan *Entry), - notEmpty: make(chan struct{}), + dequeue: make(chan *Entry), + notEmpty: make(chan struct{}), isRunning: false, } return q, nil } -// Put a cid in the queue +// Enqueue puts a cid in the queue func (q *Queue) Enqueue(cid cid.Cid) error { q.lock.Lock() defer q.lock.Unlock() @@ -95,21 +97,18 @@ func (q *Queue) Enqueue(cid cid.Cid) error { return nil } -// Remove an entry from the queue. +// Dequeue returns a channel that if listened to will remove entries from the queue func (q *Queue) Dequeue() <-chan *Entry { return q.dequeue } +// IsEmpty returns whether or not the queue has any items func (q *Queue) IsEmpty() bool { return (q.tail - q.head) == 0 } -func (q *Queue) remove(key ds.Key) error { - return q.datastore.Delete(key) -} - -// dequeue items when the dequeue channel is available to -// be written to +// Run dequeues items when the dequeue channel is available to +// be written to. func (q *Queue) Run() { q.isRunning = true go func() { @@ -178,9 +177,9 @@ func (q *Queue) next() (*Entry, error) { return nil, err } - entry := &Entry { - cid: id, - key: nextKey, + entry := &Entry{ + cid: id, + key: nextKey, queue: q, } @@ -194,14 +193,14 @@ func (q *Queue) queueKey(id uint64) ds.Key { } // crawl over the queue entries to find the head and tail -func getQueueHeadTail(name string, ctx context.Context, datastore ds.Datastore) (uint64, uint64, error) { +func getQueueHeadTail(ctx context.Context, name string, datastore ds.Datastore) (uint64, uint64, error) { query := query.Query{} results, err := datastore.Query(query) if err != nil { return 0, 0, err } - var tail uint64 = 0 + var tail uint64 var head uint64 = math.MaxUint64 for entry := range results.Next() { select { @@ -219,8 +218,8 @@ func getQueueHeadTail(name string, ctx context.Context, datastore ds.Datastore) head = id } - if (id+1) > tail { - tail = (id+1) + if (id + 1) > tail { + tail = (id + 1) } } if err := results.Close(); err != nil { @@ -233,3 +232,6 @@ func getQueueHeadTail(name string, ctx context.Context, datastore ds.Datastore) return head, tail, nil } +func (q *Queue) remove(key ds.Key) error { + return q.datastore.Delete(key) +} From 547c85784ffe37f1cbcfd9824ae1f94389f6d3f9 Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Thu, 14 Mar 2019 16:48:17 -0700 Subject: [PATCH 2643/3147] Provider queue updates to address deadlocks License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@925e6c88572021b5f34e92a5398da99904d28b25 --- provider/provider.go | 5 +++-- provider/queue.go | 38 +++++++++++++++----------------------- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index 76004f51ab..28fed76496 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -5,9 +5,10 @@ package provider import ( "context" - "github.com/ipfs/go-cid" + + cid "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-routing" + routing "github.com/libp2p/go-libp2p-routing" ) var ( diff --git a/provider/queue.go b/provider/queue.go index cc756366d6..4219cc80df 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -24,6 +24,8 @@ type Entry struct { // Complete the entry by removing it from the queue func (e *Entry) Complete() error { + e.queue.lock.Lock() + defer e.queue.lock.Unlock() return e.queue.remove(e.key) } @@ -46,9 +48,7 @@ type Queue struct { datastore ds.Datastore dequeue chan *Entry - notEmpty chan struct{} - - isRunning bool + added chan struct{} } // NewQueue creates a queue for cids @@ -66,8 +66,7 @@ func NewQueue(ctx context.Context, name string, datastore ds.Datastore) (*Queue, lock: sync.Mutex{}, datastore: namespaced, dequeue: make(chan *Entry), - notEmpty: make(chan struct{}), - isRunning: false, + added: make(chan struct{}), } return q, nil } @@ -77,8 +76,6 @@ func (q *Queue) Enqueue(cid cid.Cid) error { q.lock.Lock() defer q.lock.Unlock() - wasEmpty := q.IsEmpty() - nextKey := q.queueKey(q.tail) if err := q.datastore.Put(nextKey, cid.Bytes()); err != nil { @@ -87,11 +84,10 @@ func (q *Queue) Enqueue(cid cid.Cid) error { q.tail++ - if q.isRunning && wasEmpty { - select { - case q.notEmpty <- struct{}{}: + select { + case q.added <- struct{}{}: case <-q.ctx.Done(): - } + default: } return nil @@ -110,20 +106,13 @@ func (q *Queue) IsEmpty() bool { // Run dequeues items when the dequeue channel is available to // be written to. func (q *Queue) Run() { - q.isRunning = true go func() { for { - select { - case <-q.ctx.Done(): - return - default: - } if q.IsEmpty() { select { case <-q.ctx.Done(): return - // wait for a notEmpty message - case <-q.notEmpty: + case <-q.added: } } @@ -138,6 +127,7 @@ func (q *Queue) Run() { return case q.dequeue <- entry: } + } }() } @@ -146,14 +136,16 @@ func (q *Queue) Run() { // found in the next spot. func (q *Queue) next() (*Entry, error) { q.lock.Lock() - defer q.lock.Unlock() + defer func() { + q.lock.Unlock() + }() var nextKey ds.Key var value []byte var err error for { if q.head >= q.tail { - return nil, errors.New("no more entries in queue") + return nil, errors.New("next: no more entries in queue returning") } select { case <-q.ctx.Done(): @@ -194,8 +186,8 @@ func (q *Queue) queueKey(id uint64) ds.Key { // crawl over the queue entries to find the head and tail func getQueueHeadTail(ctx context.Context, name string, datastore ds.Datastore) (uint64, uint64, error) { - query := query.Query{} - results, err := datastore.Query(query) + q := query.Query{} + results, err := datastore.Query(q) if err != nil { return 0, 0, err } From 2e9554e05ca286c0c642822e1b476df5fdf3aa9c Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Thu, 14 Mar 2019 16:49:15 -0700 Subject: [PATCH 2644/3147] Provider tests License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@3c0793a512181e3a3b53652730b8583d9b4d1d58 --- provider/provider_test.go | 79 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 provider/provider_test.go diff --git a/provider/provider_test.go b/provider/provider_test.go new file mode 100644 index 0000000000..bacb73944c --- /dev/null +++ b/provider/provider_test.go @@ -0,0 +1,79 @@ +package provider + +import ( + "context" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-ipfs-blocksutil" + pstore "github.com/libp2p/go-libp2p-peerstore" + "math/rand" + "testing" + "time" +) + +var blockGenerator = blocksutil.NewBlockGenerator() + +type mockRouting struct { + provided chan cid.Cid +} + +func mockContentRouting() *mockRouting { + r := mockRouting{} + r.provided = make(chan cid.Cid) + return &r +} + +func TestAnnouncement(t *testing.T) { + ctx := context.Background() + defer func() { + ctx.Done() + }() + + queue, err := NewQueue(ctx, "test", datastore.NewMapDatastore()) + if err != nil { + t.Fatal(err) + } + + r := mockContentRouting() + + provider := NewProvider(ctx, queue, r) + provider.Run() + + cids := cid.NewSet() + + for i := 0; i < 100; i++ { + c := blockGenerator.Next().Cid() + cids.Add(c) + } + + go func() { + for _, c := range cids.Keys() { + err = provider.Provide(c) + // A little goroutine stirring to exercise some different states + r := rand.Intn(10) + time.Sleep(time.Microsecond * time.Duration(r)) + } + }() + + for cids.Len() > 0 { + select { + case cp := <-r.provided: + if !cids.Has(cp) { + t.Fatal("Wrong CID provided") + } + cids.Remove(cp) + case <-time.After(time.Second * 1): + t.Fatal("Timeout waiting for cids to be provided.") + } + } +} + +func (r *mockRouting) Provide(ctx context.Context, cid cid.Cid, recursive bool) error { + r.provided <- cid + return nil +} + +// Search for peers who are able to provide a given key +func (r *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, timeout int) <-chan pstore.PeerInfo { + return nil +} \ No newline at end of file From 554655f8b2723a8e915b4e2bd122f4e6dfc53857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Mar 2019 14:06:31 +0100 Subject: [PATCH 2645/3147] Wire up context to FlushPath This commit was moved from ipfs/go-mfs@9843dad7802b324847201298802bd7594452ecea --- mfs/mfs_test.go | 8 ++++---- mfs/ops.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index dde5562832..539b71a32f 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -817,19 +817,19 @@ func TestFlushing(t *testing.T) { t.Fatal(err) } - if err := FlushPath(rt, "/a/b/c/TEST"); err != nil { + if err := FlushPath(ctx, rt, "/a/b/c/TEST"); err != nil { t.Fatal(err) } - if err := FlushPath(rt, "/a/b/d/TEST"); err != nil { + if err := FlushPath(ctx, rt, "/a/b/d/TEST"); err != nil { t.Fatal(err) } - if err := FlushPath(rt, "/a/b/e/TEST"); err != nil { + if err := FlushPath(ctx, rt, "/a/b/e/TEST"); err != nil { t.Fatal(err) } - if err := FlushPath(rt, "/FILE"); err != nil { + if err := FlushPath(ctx, rt, "/FILE"); err != nil { t.Fatal(err) } diff --git a/mfs/ops.go b/mfs/ops.go index d989bb5f01..6e99e23f2f 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -226,7 +226,7 @@ func DirLookup(d *Directory, pth string) (FSNode, error) { // TODO: Document this function and link its functionality // with the republisher. -func FlushPath(rt *Root, pth string) error { +func FlushPath(ctx context.Context, rt *Root, pth string) error { nd, err := Lookup(rt, pth) if err != nil { return err @@ -237,6 +237,6 @@ func FlushPath(rt *Root, pth string) error { return err } - rt.repub.WaitPub(context.TODO()) + rt.repub.WaitPub(ctx) return nil } From 137b23bc0aa1c8c2e285dcdf0ca33936d2fc2625 Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Fri, 15 Mar 2019 11:04:31 -0700 Subject: [PATCH 2646/3147] Cleanup, fix broken restart, and more tests. License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@0200a0e94b54396075d6eef98e49d4a96d8562b1 --- provider/provider.go | 21 ++------- provider/provider_test.go | 17 ++++---- provider/queue.go | 83 ++++++++++++++++-------------------- provider/queue_test.go | 89 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+), 72 deletions(-) create mode 100644 provider/queue_test.go diff --git a/provider/provider.go b/provider/provider.go index 28fed76496..7a30f6d27b 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -62,28 +62,13 @@ func (p *provider) handleAnnouncements() { case <-p.ctx.Done(): return case entry := <-p.queue.Dequeue(): - if err := doProvide(p.ctx, p.contentRouting, entry.cid); err != nil { + log.Info("announce - start - ", entry.cid) + if err := p.contentRouting.Provide(p.ctx, entry.cid, true); err != nil { log.Warningf("Unable to provide entry: %s, %s", entry.cid, err) } - - if err := entry.Complete(); err != nil { - log.Warningf("Unable to complete queue entry when providing: %s, %s", entry.cid, err) - } + log.Info("announce - end - ", entry.cid) } } }() } } - -// TODO: better document this provide logic -func doProvide(ctx context.Context, contentRouting routing.ContentRouting, key cid.Cid) error { - // announce - log.Info("announce - start - ", key) - if err := contentRouting.Provide(ctx, key, true); err != nil { - log.Warningf("Failed to provide cid: %s", err) - // TODO: Maybe put these failures onto a failures queue? - return err - } - log.Info("announce - end - ", key) - return nil -} diff --git a/provider/provider_test.go b/provider/provider_test.go index bacb73944c..464d73d9a3 100644 --- a/provider/provider_test.go +++ b/provider/provider_test.go @@ -2,13 +2,15 @@ package provider import ( "context" - "github.com/ipfs/go-cid" - "github.com/ipfs/go-datastore" - "github.com/ipfs/go-ipfs-blocksutil" - pstore "github.com/libp2p/go-libp2p-peerstore" "math/rand" "testing" "time" + + blocksutil "github.com/ipfs/go-ipfs-blocksutil" + cid "github.com/ipfs/go-cid" + datastore "github.com/ipfs/go-datastore" + pstore "github.com/libp2p/go-libp2p-peerstore" + sync "github.com/ipfs/go-datastore/sync" ) var blockGenerator = blocksutil.NewBlockGenerator() @@ -25,11 +27,10 @@ func mockContentRouting() *mockRouting { func TestAnnouncement(t *testing.T) { ctx := context.Background() - defer func() { - ctx.Done() - }() + defer ctx.Done() - queue, err := NewQueue(ctx, "test", datastore.NewMapDatastore()) + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := NewQueue(ctx, "test", ds) if err != nil { t.Fatal(err) } diff --git a/provider/queue.go b/provider/queue.go index 4219cc80df..f1c9945cdf 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -3,14 +3,15 @@ package provider import ( "context" "errors" - "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/namespace" - "github.com/ipfs/go-datastore/query" "math" "strconv" "strings" "sync" + + cid "github.com/ipfs/go-cid" + datastore "github.com/ipfs/go-datastore" + namespace "github.com/ipfs/go-datastore/namespace" + query "github.com/ipfs/go-datastore/query" ) // Entry allows for the durability in the queue. When a cid is dequeued it is @@ -18,17 +19,10 @@ import ( // receive. type Entry struct { cid cid.Cid - key ds.Key + key datastore.Key queue *Queue } -// Complete the entry by removing it from the queue -func (e *Entry) Complete() error { - e.queue.lock.Lock() - defer e.queue.lock.Unlock() - return e.queue.remove(e.key) -} - // Queue provides a durable, FIFO interface to the datastore for storing cids // // Durability just means that cids in the process of being provided when a @@ -44,41 +38,41 @@ type Queue struct { tail uint64 head uint64 - lock sync.Mutex - datastore ds.Datastore + enqueueLock sync.Mutex + ds datastore.Datastore // Must be threadsafe dequeue chan *Entry added chan struct{} } // NewQueue creates a queue for cids -func NewQueue(ctx context.Context, name string, datastore ds.Datastore) (*Queue, error) { - namespaced := namespace.Wrap(datastore, ds.NewKey("/"+name+"/queue/")) +func NewQueue(ctx context.Context, name string, ds datastore.Datastore) (*Queue, error) { + namespaced := namespace.Wrap(ds, datastore.NewKey("/"+name+"/queue/")) head, tail, err := getQueueHeadTail(ctx, name, namespaced) if err != nil { return nil, err } q := &Queue{ - name: name, - ctx: ctx, - head: head, - tail: tail, - lock: sync.Mutex{}, - datastore: namespaced, - dequeue: make(chan *Entry), - added: make(chan struct{}), + name: name, + ctx: ctx, + head: head, + tail: tail, + enqueueLock: sync.Mutex{}, + ds: namespaced, + dequeue: make(chan *Entry), + added: make(chan struct{}), } return q, nil } // Enqueue puts a cid in the queue func (q *Queue) Enqueue(cid cid.Cid) error { - q.lock.Lock() - defer q.lock.Unlock() + q.enqueueLock.Lock() + defer q.enqueueLock.Unlock() nextKey := q.queueKey(q.tail) - if err := q.datastore.Put(nextKey, cid.Bytes()); err != nil { + if err := q.ds.Put(nextKey, cid.Bytes()); err != nil { return err } @@ -126,8 +120,9 @@ func (q *Queue) Run() { case <-q.ctx.Done(): return case q.dequeue <- entry: + q.head++ + err = q.ds.Delete(entry.key) } - } }() } @@ -135,12 +130,7 @@ func (q *Queue) Run() { // Find the next item in the queue, crawl forward if an entry is not // found in the next spot. func (q *Queue) next() (*Entry, error) { - q.lock.Lock() - defer func() { - q.lock.Unlock() - }() - - var nextKey ds.Key + var key datastore.Key var value []byte var err error for { @@ -152,9 +142,12 @@ func (q *Queue) next() (*Entry, error) { return nil, nil default: } - nextKey = q.queueKey(q.head) - value, err = q.datastore.Get(nextKey) - if err == ds.ErrNotFound { + key = q.queueKey(q.head) + + value, err = q.ds.Get(key) + + value, err = q.ds.Get(key) + if err == datastore.ErrNotFound { q.head++ continue } else if err != nil { @@ -171,21 +164,23 @@ func (q *Queue) next() (*Entry, error) { entry := &Entry{ cid: id, - key: nextKey, + key: key, queue: q, } - q.head++ + if err != nil { + return nil, err + } return entry, nil } -func (q *Queue) queueKey(id uint64) ds.Key { - return ds.NewKey(strconv.FormatUint(id, 10)) +func (q *Queue) queueKey(id uint64) datastore.Key { + return datastore.NewKey(strconv.FormatUint(id, 10)) } // crawl over the queue entries to find the head and tail -func getQueueHeadTail(ctx context.Context, name string, datastore ds.Datastore) (uint64, uint64, error) { +func getQueueHeadTail(ctx context.Context, name string, datastore datastore.Datastore) (uint64, uint64, error) { q := query.Query{} results, err := datastore.Query(q) if err != nil { @@ -223,7 +218,3 @@ func getQueueHeadTail(ctx context.Context, name string, datastore ds.Datastore) return head, tail, nil } - -func (q *Queue) remove(key ds.Key) error { - return q.datastore.Delete(key) -} diff --git a/provider/queue_test.go b/provider/queue_test.go new file mode 100644 index 0000000000..724eca4ee1 --- /dev/null +++ b/provider/queue_test.go @@ -0,0 +1,89 @@ +package provider + +import ( + "context" + "testing" + "time" + + cid "github.com/ipfs/go-cid" + datastore "github.com/ipfs/go-datastore" + sync "github.com/ipfs/go-datastore/sync" +) + +func makeCids(n int) []cid.Cid { + cids := make([]cid.Cid, 0, 10) + for i := 0; i < 10; i++ { + c := blockGenerator.Next().Cid() + cids = append(cids, c) + } + return cids +} + +func assertOrdered(cids []cid.Cid, q *Queue, t *testing.T) { + for _, c := range cids { + select { + case dequeued := <- q.dequeue: + if c != dequeued.cid { + t.Fatalf("Error in ordering of CIDs retrieved from queue. Expected: %s, got: %s", c, dequeued.cid) + } + + case <-time.After(time.Second * 1): + t.Fatal("Timeout waiting for cids to be provided.") + } + } +} + +func TestBasicOperation(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + queue.Run() + + cids := makeCids(10) + + for _, c := range cids { + err = queue.Enqueue(c) + if err != nil { + t.Fatal("Failed to enqueue CID") + } + } + + assertOrdered(cids, queue, t) +} + +func TestInitialization(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + queue.Run() + + cids := makeCids(10) + + for _, c := range cids { + err = queue.Enqueue(c) + if err != nil { + t.Fatal("Failed to enqueue CID") + } + } + + assertOrdered(cids[:5], queue, t) + + // make a new queue, same data + queue, err = NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + queue.Run() + + assertOrdered(cids[5:], queue, t) +} From 3e36d7771e6109d0aff228d43dce0dc0d0626a33 Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Fri, 15 Mar 2019 14:19:19 -0700 Subject: [PATCH 2647/3147] Remove locking entirely License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@e5715368caea9f8fa35f41a6cfacd25a58710d11 --- provider/provider.go | 22 ++--- provider/provider_test.go | 4 +- provider/queue.go | 168 +++++++++++++------------------------- provider/queue_test.go | 19 ++--- 4 files changed, 71 insertions(+), 142 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index 7a30f6d27b..7e149f7776 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -11,13 +11,9 @@ import ( routing "github.com/libp2p/go-libp2p-routing" ) -var ( - log = logging.Logger("provider") -) +var log = logging.Logger("provider") -const ( - provideOutgoingWorkerLimit = 8 -) +const provideOutgoingWorkerLimit = 8 // Provider announces blocks to the network type Provider interface { @@ -44,13 +40,13 @@ func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.Conte // Start workers to handle provide requests. func (p *provider) Run() { - p.queue.Run() p.handleAnnouncements() } // Provide the given cid using specified strategy. func (p *provider) Provide(root cid.Cid) error { - return p.queue.Enqueue(root) + p.queue.Enqueue(root) + return nil } // Handle all outgoing cids by providing (announcing) them @@ -61,12 +57,12 @@ func (p *provider) handleAnnouncements() { select { case <-p.ctx.Done(): return - case entry := <-p.queue.Dequeue(): - log.Info("announce - start - ", entry.cid) - if err := p.contentRouting.Provide(p.ctx, entry.cid, true); err != nil { - log.Warningf("Unable to provide entry: %s, %s", entry.cid, err) + case c := <-p.queue.Dequeue(): + log.Info("announce - start - ", c) + if err := p.contentRouting.Provide(p.ctx, c, true); err != nil { + log.Warningf("Unable to provide entry: %s, %s", c, err) } - log.Info("announce - end - ", entry.cid) + log.Info("announce - end - ", c) } } }() diff --git a/provider/provider_test.go b/provider/provider_test.go index 464d73d9a3..95282e38a9 100644 --- a/provider/provider_test.go +++ b/provider/provider_test.go @@ -42,7 +42,7 @@ func TestAnnouncement(t *testing.T) { cids := cid.NewSet() - for i := 0; i < 100; i++ { + for i := 0; i < 1000; i++ { c := blockGenerator.Next().Cid() cids.Add(c) } @@ -63,7 +63,7 @@ func TestAnnouncement(t *testing.T) { t.Fatal("Wrong CID provided") } cids.Remove(cp) - case <-time.After(time.Second * 1): + case <-time.After(time.Second * 5): t.Fatal("Timeout waiting for cids to be provided.") } } diff --git a/provider/queue.go b/provider/queue.go index f1c9945cdf..3f7115f68e 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -2,27 +2,15 @@ package provider import ( "context" - "errors" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/namespace" + "github.com/ipfs/go-datastore/query" "math" "strconv" "strings" - "sync" - - cid "github.com/ipfs/go-cid" - datastore "github.com/ipfs/go-datastore" - namespace "github.com/ipfs/go-datastore/namespace" - query "github.com/ipfs/go-datastore/query" ) -// Entry allows for the durability in the queue. When a cid is dequeued it is -// not removed from the datastore until you call Complete() on the entry you -// receive. -type Entry struct { - cid cid.Cid - key datastore.Key - queue *Queue -} - // Queue provides a durable, FIFO interface to the datastore for storing cids // // Durability just means that cids in the process of being provided when a @@ -32,17 +20,15 @@ type Queue struct { // used to differentiate queues in datastore // e.g. provider vs reprovider name string - ctx context.Context tail uint64 head uint64 - enqueueLock sync.Mutex ds datastore.Datastore // Must be threadsafe - dequeue chan *Entry - added chan struct{} + dequeue chan cid.Cid + enqueue chan cid.Cid } // NewQueue creates a queue for cids @@ -57,124 +43,85 @@ func NewQueue(ctx context.Context, name string, ds datastore.Datastore) (*Queue, ctx: ctx, head: head, tail: tail, - enqueueLock: sync.Mutex{}, ds: namespaced, - dequeue: make(chan *Entry), - added: make(chan struct{}), + dequeue: make(chan cid.Cid), + enqueue: make(chan cid.Cid), } + q.work() return q, nil } // Enqueue puts a cid in the queue -func (q *Queue) Enqueue(cid cid.Cid) error { - q.enqueueLock.Lock() - defer q.enqueueLock.Unlock() - - nextKey := q.queueKey(q.tail) - - if err := q.ds.Put(nextKey, cid.Bytes()); err != nil { - return err - } - - q.tail++ - +func (q *Queue) Enqueue(cid cid.Cid) { select { - case q.added <- struct{}{}: + case q.enqueue <- cid: case <-q.ctx.Done(): - default: } - - return nil } // Dequeue returns a channel that if listened to will remove entries from the queue -func (q *Queue) Dequeue() <-chan *Entry { +func (q *Queue) Dequeue() <-chan cid.Cid { return q.dequeue } -// IsEmpty returns whether or not the queue has any items -func (q *Queue) IsEmpty() bool { - return (q.tail - q.head) == 0 -} - -// Run dequeues items when the dequeue channel is available to -// be written to. -func (q *Queue) Run() { +// Run dequeues and enqueues when available. +func (q *Queue) work() { go func() { for { - if q.IsEmpty() { - select { - case <-q.ctx.Done(): - return - case <-q.added: + var c cid.Cid = cid.Undef + var key datastore.Key + var dequeue chan cid.Cid + + // If we're not empty dequeue a cid and ship it + if q.head < q.tail { + key = q.queueKey(q.head) + value, err := q.ds.Get(key) + + if err == datastore.ErrNotFound { + log.Warningf("Missing entry in queue: %s", err) + q.head++ + continue + } else if err != nil { + log.Warningf("Error fetching from queue: %s", err) + continue + } + + c, err = cid.Parse(value) + if err != nil { + log.Warningf("Error marshalling Cid from queue: ", err) + q.head++ + err = q.ds.Delete(key) + continue } } - entry, err := q.next() - if err != nil { - log.Warningf("Error Dequeue()-ing: %s, %s", entry, err) - continue + if c != cid.Undef { + dequeue = q.dequeue } select { + case toQueue := <-q.enqueue: + nextKey := q.queueKey(q.tail) + + if err := q.ds.Put(nextKey, toQueue.Bytes()); err != nil { + log.Errorf("Failed to enqueue cid: %s", err) + } + + q.tail++ + case dequeue <- c: + q.head++ + err := q.ds.Delete(key) + + if err != nil { + log.Errorf("Failed to delete queued cid: %s", err) + } case <-q.ctx.Done(): return - case q.dequeue <- entry: - q.head++ - err = q.ds.Delete(entry.key) } } }() } -// Find the next item in the queue, crawl forward if an entry is not -// found in the next spot. -func (q *Queue) next() (*Entry, error) { - var key datastore.Key - var value []byte - var err error - for { - if q.head >= q.tail { - return nil, errors.New("next: no more entries in queue returning") - } - select { - case <-q.ctx.Done(): - return nil, nil - default: - } - key = q.queueKey(q.head) - - value, err = q.ds.Get(key) - - value, err = q.ds.Get(key) - if err == datastore.ErrNotFound { - q.head++ - continue - } else if err != nil { - return nil, err - } else { - break - } - } - - id, err := cid.Parse(value) - if err != nil { - return nil, err - } - - entry := &Entry{ - cid: id, - key: key, - queue: q, - } - - if err != nil { - return nil, err - } - - return entry, nil -} - func (q *Queue) queueKey(id uint64) datastore.Key { return datastore.NewKey(strconv.FormatUint(id, 10)) } @@ -190,11 +137,6 @@ func getQueueHeadTail(ctx context.Context, name string, datastore datastore.Data var tail uint64 var head uint64 = math.MaxUint64 for entry := range results.Next() { - select { - case <-ctx.Done(): - return 0, 0, nil - default: - } trimmed := strings.TrimPrefix(entry.Key, "/") id, err := strconv.ParseUint(trimmed, 10, 64) if err != nil { diff --git a/provider/queue_test.go b/provider/queue_test.go index 724eca4ee1..2ac2de2882 100644 --- a/provider/queue_test.go +++ b/provider/queue_test.go @@ -11,7 +11,7 @@ import ( ) func makeCids(n int) []cid.Cid { - cids := make([]cid.Cid, 0, 10) + cids := make([]cid.Cid, 0, n) for i := 0; i < 10; i++ { c := blockGenerator.Next().Cid() cids = append(cids, c) @@ -23,8 +23,8 @@ func assertOrdered(cids []cid.Cid, q *Queue, t *testing.T) { for _, c := range cids { select { case dequeued := <- q.dequeue: - if c != dequeued.cid { - t.Fatalf("Error in ordering of CIDs retrieved from queue. Expected: %s, got: %s", c, dequeued.cid) + if c != dequeued { + t.Fatalf("Error in ordering of CIDs retrieved from queue. Expected: %s, got: %s", c, dequeued) } case <-time.After(time.Second * 1): @@ -42,15 +42,11 @@ func TestBasicOperation(t *testing.T) { if err != nil { t.Fatal(err) } - queue.Run() cids := makeCids(10) for _, c := range cids { - err = queue.Enqueue(c) - if err != nil { - t.Fatal("Failed to enqueue CID") - } + queue.Enqueue(c) } assertOrdered(cids, queue, t) @@ -65,15 +61,11 @@ func TestInitialization(t *testing.T) { if err != nil { t.Fatal(err) } - queue.Run() cids := makeCids(10) for _, c := range cids { - err = queue.Enqueue(c) - if err != nil { - t.Fatal("Failed to enqueue CID") - } + queue.Enqueue(c) } assertOrdered(cids[:5], queue, t) @@ -83,7 +75,6 @@ func TestInitialization(t *testing.T) { if err != nil { t.Fatal(err) } - queue.Run() assertOrdered(cids[5:], queue, t) } From fcb323293ff1605f7f75b75d5e55beeeaa28584b Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Fri, 15 Mar 2019 16:36:43 -0700 Subject: [PATCH 2648/3147] Gofmt License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@4f00ef1bf2a154f62b355b86cc12d8c463158529 --- provider/provider.go | 2 +- provider/provider_test.go | 20 ++++++++++---------- provider/queue.go | 31 ++++++++++++++----------------- provider/queue_test.go | 2 +- 4 files changed, 26 insertions(+), 29 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index 7e149f7776..a5093d65bd 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -11,7 +11,7 @@ import ( routing "github.com/libp2p/go-libp2p-routing" ) -var log = logging.Logger("provider") +var log = logging.Logger("provider") const provideOutgoingWorkerLimit = 8 diff --git a/provider/provider_test.go b/provider/provider_test.go index 95282e38a9..7836f04ce8 100644 --- a/provider/provider_test.go +++ b/provider/provider_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - blocksutil "github.com/ipfs/go-ipfs-blocksutil" cid "github.com/ipfs/go-cid" datastore "github.com/ipfs/go-datastore" - pstore "github.com/libp2p/go-libp2p-peerstore" sync "github.com/ipfs/go-datastore/sync" + blocksutil "github.com/ipfs/go-ipfs-blocksutil" + pstore "github.com/libp2p/go-libp2p-peerstore" ) var blockGenerator = blocksutil.NewBlockGenerator() @@ -58,13 +58,13 @@ func TestAnnouncement(t *testing.T) { for cids.Len() > 0 { select { - case cp := <-r.provided: - if !cids.Has(cp) { - t.Fatal("Wrong CID provided") - } - cids.Remove(cp) - case <-time.After(time.Second * 5): - t.Fatal("Timeout waiting for cids to be provided.") + case cp := <-r.provided: + if !cids.Has(cp) { + t.Fatal("Wrong CID provided") + } + cids.Remove(cp) + case <-time.After(time.Second * 5): + t.Fatal("Timeout waiting for cids to be provided.") } } } @@ -77,4 +77,4 @@ func (r *mockRouting) Provide(ctx context.Context, cid cid.Cid, recursive bool) // Search for peers who are able to provide a given key func (r *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, timeout int) <-chan pstore.PeerInfo { return nil -} \ No newline at end of file +} diff --git a/provider/queue.go b/provider/queue.go index 3f7115f68e..b5b7ba7097 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -19,14 +19,11 @@ import ( type Queue struct { // used to differentiate queues in datastore // e.g. provider vs reprovider - name string - ctx context.Context - - tail uint64 - head uint64 - - ds datastore.Datastore // Must be threadsafe - + name string + ctx context.Context + tail uint64 + head uint64 + ds datastore.Datastore // Must be threadsafe dequeue chan cid.Cid enqueue chan cid.Cid } @@ -39,13 +36,13 @@ func NewQueue(ctx context.Context, name string, ds datastore.Datastore) (*Queue, return nil, err } q := &Queue{ - name: name, - ctx: ctx, - head: head, - tail: tail, - ds: namespaced, - dequeue: make(chan cid.Cid), - enqueue: make(chan cid.Cid), + name: name, + ctx: ctx, + head: head, + tail: tail, + ds: namespaced, + dequeue: make(chan cid.Cid), + enqueue: make(chan cid.Cid), } q.work() return q, nil @@ -54,8 +51,8 @@ func NewQueue(ctx context.Context, name string, ds datastore.Datastore) (*Queue, // Enqueue puts a cid in the queue func (q *Queue) Enqueue(cid cid.Cid) { select { - case q.enqueue <- cid: - case <-q.ctx.Done(): + case q.enqueue <- cid: + case <-q.ctx.Done(): } } diff --git a/provider/queue_test.go b/provider/queue_test.go index 2ac2de2882..0dd3bab09c 100644 --- a/provider/queue_test.go +++ b/provider/queue_test.go @@ -22,7 +22,7 @@ func makeCids(n int) []cid.Cid { func assertOrdered(cids []cid.Cid, q *Queue, t *testing.T) { for _, c := range cids { select { - case dequeued := <- q.dequeue: + case dequeued := <-q.dequeue: if c != dequeued { t.Fatalf("Error in ordering of CIDs retrieved from queue. Expected: %s, got: %s", c, dequeued) } From 12a43f1b1bf8876d45b32ff9c9cf0934a37d864a Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Fri, 15 Mar 2019 20:45:59 -0700 Subject: [PATCH 2649/3147] Make queue operation more clear License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@25a24e573442724e5343c4d77750fd19b9382111 --- provider/provider_test.go | 2 +- provider/queue.go | 72 ++++++++++++++++++++++++--------------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/provider/provider_test.go b/provider/provider_test.go index 7836f04ce8..14cd685214 100644 --- a/provider/provider_test.go +++ b/provider/provider_test.go @@ -42,7 +42,7 @@ func TestAnnouncement(t *testing.T) { cids := cid.NewSet() - for i := 0; i < 1000; i++ { + for i := 0; i < 100; i++ { c := blockGenerator.Next().Cid() cids.Add(c) } diff --git a/provider/queue.go b/provider/queue.go index b5b7ba7097..1220779547 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -61,37 +61,50 @@ func (q *Queue) Dequeue() <-chan cid.Cid { return q.dequeue } +type entry struct { + cid cid.Cid + key datastore.Key +} + +// Look for next Cid in the queue and return it. Skip over gaps and mangled data +func (q *Queue) nextEntry() (datastore.Key, cid.Cid) { + for { + if q.head >= q.tail { + return datastore.Key{}, cid.Undef + } + + key := q.queueKey(q.head) + value, err := q.ds.Get(key) + + if err == datastore.ErrNotFound { + log.Warningf("Error missing entry in queue: %s", key) + q.head++ // move on + continue + } else if err != nil { + log.Warningf("Error fetching from queue: %s", err) + continue + } + + c, err := cid.Parse(value) + if err != nil { + log.Warningf("Error marshalling Cid from queue: ", err) + q.head++ + err = q.ds.Delete(key) + continue + } + + return key, c + } +} + // Run dequeues and enqueues when available. func (q *Queue) work() { go func() { + for { - var c cid.Cid = cid.Undef - var key datastore.Key + k, c := q.nextEntry() var dequeue chan cid.Cid - // If we're not empty dequeue a cid and ship it - if q.head < q.tail { - key = q.queueKey(q.head) - value, err := q.ds.Get(key) - - if err == datastore.ErrNotFound { - log.Warningf("Missing entry in queue: %s", err) - q.head++ - continue - } else if err != nil { - log.Warningf("Error fetching from queue: %s", err) - continue - } - - c, err = cid.Parse(value) - if err != nil { - log.Warningf("Error marshalling Cid from queue: ", err) - q.head++ - err = q.ds.Delete(key) - continue - } - } - if c != cid.Undef { dequeue = q.dequeue } @@ -102,16 +115,19 @@ func (q *Queue) work() { if err := q.ds.Put(nextKey, toQueue.Bytes()); err != nil { log.Errorf("Failed to enqueue cid: %s", err) + continue } q.tail++ case dequeue <- c: - q.head++ - err := q.ds.Delete(key) + err := q.ds.Delete(k) if err != nil { - log.Errorf("Failed to delete queued cid: %s", err) + log.Errorf("Failed to delete queued cid %s with key %s: %s", c, k, err) + continue } + + q.head++ case <-q.ctx.Done(): return } From 003c27468eaf1543f70ace2f746ccfbbd75007e7 Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Sat, 16 Mar 2019 09:52:24 -0700 Subject: [PATCH 2650/3147] Don't do extra work in provider queue loop License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@74884fbe8db563c9d1970a51fdaf683497ceee04 --- provider/queue.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/provider/queue.go b/provider/queue.go index 1220779547..a3268e1093 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -2,13 +2,14 @@ package provider import ( "context" - "github.com/ipfs/go-cid" - "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/namespace" - "github.com/ipfs/go-datastore/query" "math" "strconv" "strings" + + cid "github.com/ipfs/go-cid" + datastore "github.com/ipfs/go-datastore" + namespace "github.com/ipfs/go-datastore/namespace" + query "github.com/ipfs/go-datastore/query" ) // Queue provides a durable, FIFO interface to the datastore for storing cids @@ -100,11 +101,16 @@ func (q *Queue) nextEntry() (datastore.Key, cid.Cid) { // Run dequeues and enqueues when available. func (q *Queue) work() { go func() { + var k datastore.Key = datastore.Key{} + var c cid.Cid = cid.Undef for { - k, c := q.nextEntry() - var dequeue chan cid.Cid + if c == cid.Undef { + k, c = q.nextEntry() + } + // If c != cid.Undef set dequeue and attempt write, otherwise wait for enqueue + var dequeue chan cid.Cid if c != cid.Undef { dequeue = q.dequeue } @@ -126,7 +132,7 @@ func (q *Queue) work() { log.Errorf("Failed to delete queued cid %s with key %s: %s", c, k, err) continue } - + c = cid.Undef q.head++ case <-q.ctx.Done(): return From d9a3636df6eaabe502d3a5111e378cc5aee9d215 Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Sat, 16 Mar 2019 09:52:57 -0700 Subject: [PATCH 2651/3147] Additional provider tests License: MIT Signed-off-by: Erik Ingenito This commit was moved from ipfs/go-ipfs-provider@96406fe08f4fc1249fbd6f361ccb7e745e13477b --- provider/provider_test.go | 19 +++++++------- provider/queue_test.go | 53 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/provider/provider_test.go b/provider/provider_test.go index 14cd685214..7ef007b03a 100644 --- a/provider/provider_test.go +++ b/provider/provider_test.go @@ -19,6 +19,15 @@ type mockRouting struct { provided chan cid.Cid } +func (r *mockRouting) Provide(ctx context.Context, cid cid.Cid, recursive bool) error { + r.provided <- cid + return nil +} + +func (r *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, timeout int) <-chan pstore.PeerInfo { + return nil +} + func mockContentRouting() *mockRouting { r := mockRouting{} r.provided = make(chan cid.Cid) @@ -68,13 +77,3 @@ func TestAnnouncement(t *testing.T) { } } } - -func (r *mockRouting) Provide(ctx context.Context, cid cid.Cid, recursive bool) error { - r.provided <- cid - return nil -} - -// Search for peers who are able to provide a given key -func (r *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, timeout int) <-chan pstore.PeerInfo { - return nil -} diff --git a/provider/queue_test.go b/provider/queue_test.go index 0dd3bab09c..e1b74878ea 100644 --- a/provider/queue_test.go +++ b/provider/queue_test.go @@ -52,7 +52,37 @@ func TestBasicOperation(t *testing.T) { assertOrdered(cids, queue, t) } -func TestInitialization(t *testing.T) { +func TestSparseDatastore(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + + cids := makeCids(10) + for _, c := range cids { + queue.Enqueue(c) + } + + // remove entries in the middle + err = queue.ds.Delete(queue.queueKey(5)) + if err != nil { + t.Fatal(err) + } + + err = queue.ds.Delete(queue.queueKey(6)) + if err != nil { + t.Fatal(err) + } + + expected := append(cids[:5], cids[7:]...) + assertOrdered(expected, queue, t) +} + +func TestMangledData(t *testing.T) { ctx := context.Background() defer ctx.Done() @@ -63,7 +93,28 @@ func TestInitialization(t *testing.T) { } cids := makeCids(10) + for _, c := range cids { + queue.Enqueue(c) + } + + // remove entries in the middle + err = queue.ds.Put(queue.queueKey(5), []byte("borked")) + expected := append(cids[:5], cids[6:]...) + assertOrdered(expected, queue, t) +} + +func TestInitialization(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + + cids := makeCids(10) for _, c := range cids { queue.Enqueue(c) } From 8ddd53922d9de50f79438685a45641d30aaf3ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 19 Mar 2019 18:01:12 +0100 Subject: [PATCH 2652/3147] return flushed node from FlushPath This commit was moved from ipfs/go-mfs@d9d9b305eb473d0bee8b3c987fa817273a6d9ad8 --- mfs/mfs_test.go | 12 ++++++++---- mfs/ops.go | 8 ++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 539b71a32f..8d64fe581f 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -817,19 +817,23 @@ func TestFlushing(t *testing.T) { t.Fatal(err) } - if err := FlushPath(ctx, rt, "/a/b/c/TEST"); err != nil { + nd, err := FlushPath(ctx, rt, "/a/b/c/TEST") + if err != nil { t.Fatal(err) } + if nd.Cid().String() != "QmYi7wrRFKVCcTB56A6Pep2j31Q5mHfmmu21RzHXu25RVR" { + t.Fatalf("unexpected node from FlushPath: %s", nd.Cid()) + } - if err := FlushPath(ctx, rt, "/a/b/d/TEST"); err != nil { + if _, err := FlushPath(ctx, rt, "/a/b/d/TEST"); err != nil { t.Fatal(err) } - if err := FlushPath(ctx, rt, "/a/b/e/TEST"); err != nil { + if _, err := FlushPath(ctx, rt, "/a/b/e/TEST"); err != nil { t.Fatal(err) } - if err := FlushPath(ctx, rt, "/FILE"); err != nil { + if _, err := FlushPath(ctx, rt, "/FILE"); err != nil { t.Fatal(err) } diff --git a/mfs/ops.go b/mfs/ops.go index 6e99e23f2f..bf05cd4435 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -226,17 +226,17 @@ func DirLookup(d *Directory, pth string) (FSNode, error) { // TODO: Document this function and link its functionality // with the republisher. -func FlushPath(ctx context.Context, rt *Root, pth string) error { +func FlushPath(ctx context.Context, rt *Root, pth string) (ipld.Node, error) { nd, err := Lookup(rt, pth) if err != nil { - return err + return nil, err } err = nd.Flush() if err != nil { - return err + return nil, err } rt.repub.WaitPub(ctx) - return nil + return nd.GetNode() } From 25f76b08a84f0e1e84990e55b11c6821f12b00f8 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 20 Mar 2019 14:13:30 -0700 Subject: [PATCH 2653/3147] Add comments; Check ctx.Err(); Move import License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@b34d1787a57c9a6c1c8c4dea9599041cf6db41c9 --- provider/provider.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index a5093d65bd..f9aa4ed782 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -5,10 +5,9 @@ package provider import ( "context" - - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" - routing "github.com/libp2p/go-libp2p-routing" + "github.com/libp2p/go-libp2p-routing" ) var log = logging.Logger("provider") @@ -17,7 +16,9 @@ const provideOutgoingWorkerLimit = 8 // Provider announces blocks to the network type Provider interface { + // Run is used to begin processing the provider work Run() + // Provide takes a cid and makes an attempt to announce it to the network Provide(cid.Cid) error } @@ -53,7 +54,7 @@ func (p *provider) Provide(root cid.Cid) error { func (p *provider) handleAnnouncements() { for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { go func() { - for { + for p.ctx.Err() == nil { select { case <-p.ctx.Done(): return From eef47968f53038f837a20a7fb4a5da6074b763a1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 20 Mar 2019 19:10:44 -0700 Subject: [PATCH 2654/3147] gc: fix a potential deadlock Events: 1. User triggers a GC. 2. User aborts the GC. 3. We fail to delete a block when the output channel is already full. This is really unlikely to happen in practice but it's still incorrect. Could be related to #6107 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@eb33dc1f4c645e264052f50f4231e737cbacddc8 --- pinning/pinner/gc/gc.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 9234d43689..12b0fadb22 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -83,7 +83,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn var removed uint64 loop: - for { + for ctx.Err() == nil { // select may not notice that we're "done". select { case k, ok := <-keychan: if !ok { @@ -94,8 +94,11 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn removed++ if err != nil { errors = true - output <- Result{Error: &CannotDeleteBlockError{k, err}} - //log.Errorf("Error removing key from blockstore: %s", err) + select { + case output <- Result{Error: &CannotDeleteBlockError{k, err}}: + case <-ctx.Done(): + break loop + } // continue as error is non-fatal continue loop } From 1ec848f9a24d9c67927520cedcce7c2393893b9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 25 Feb 2019 17:10:23 +0100 Subject: [PATCH 2655/3147] unixfs add: Changes for fixed wrap logic This commit was moved from ipfs/interface-go-ipfs-core@e87318a2c3620d2402517a6833e21749c065a397 --- coreiface/options/unixfs.go | 11 ++++ coreiface/tests/unixfs.go | 116 +++++++++++++++++++++--------------- 2 files changed, 80 insertions(+), 47 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index b76b01adf4..44ba8c7cd3 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -35,6 +35,7 @@ type UnixfsAddSettings struct { Wrap bool Hidden bool + TopHidden bool StdinName string Events chan<- interface{} @@ -69,6 +70,7 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, Wrap: false, Hidden: false, + TopHidden: false, StdinName: "", Events: nil, @@ -255,6 +257,15 @@ func (unixfsOpts) Hidden(hidden bool) UnixfsAddOption { } } +// TopHidden enables adding of hidden files in top-level directory (files +// prefixed with '.') +func (unixfsOpts) TopHidden(hidden bool) UnixfsAddOption { + return func(settings *UnixfsAddSettings) error { + settings.TopHidden = hidden + return nil + } +} + // StdinName is the name set for files which don specify FilePath as // os.Stdin.Name() func (unixfsOpts) StdinName(name string) UnixfsAddOption { diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index bbcb668997..1ad3193335 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -82,11 +82,14 @@ func flatDir() files.Node { }) } -func wrapped(name string) func(f files.Node) files.Node { +func wrapped(names ...string) func(f files.Node) files.Node { return func(f files.Node) files.Node { - return files.NewMapDirectory(map[string]files.Node{ - name: f, - }) + for i := range names { + f = files.NewMapDirectory(map[string]files.Node{ + names[len(names)-i-1]: f, + }) + } + return f } } @@ -241,16 +244,30 @@ func (tp *provider) TestAdd(t *testing.T) { }, // multi file { - name: "simpleDir", + name: "simpleDirNoWrap", data: flatDir, - wrap: "t", path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp", }, { - name: "twoLevelDir", - data: twoLevelDir(), - wrap: "t", - path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", + name: "simpleDirWrap", + data: flatDir, + expect: wrapped("QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp"), + path: "/ipfs/QmXxCaQkC8Z6Qws1nTkTQfCsL9y4XvWXnrPokp9bhmjC1L", + opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, + }, + { + name: "simpleDir", + data: flatDir, + wrap: "t", + expect: wrapped("t"), + path: "/ipfs/Qmc3nGXm1HtUVCmnXLQHvWcNwfdZGpfg2SRm1CxLf7Q2Rm", + }, + { + name: "twoLevelDir", + data: twoLevelDir(), + wrap: "t", + expect: wrapped("t"), + path: "/ipfs/QmPwsL3T5sWhDmmAWZHAzyjKtMVDS9a11aHNRqb3xoVnmg", }, // wrapped { @@ -261,15 +278,6 @@ func (tp *provider) TestAdd(t *testing.T) { }, wrap: "foo", expect: wrapped("foo"), - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, - }, - { - name: "addNotWrappedDirFile", - path: hello, - data: func() files.Node { - return files.NewBytesFile([]byte(helloStr)) - }, - wrap: "foo", }, { name: "stdinWrapped", @@ -306,16 +314,16 @@ func (tp *provider) TestAdd(t *testing.T) { name: "twoLevelDirWrapped", data: twoLevelDir(), wrap: "t", - expect: wrapped("t"), - path: "/ipfs/QmPwsL3T5sWhDmmAWZHAzyjKtMVDS9a11aHNRqb3xoVnmg", + expect: wrapped("QmPwsL3T5sWhDmmAWZHAzyjKtMVDS9a11aHNRqb3xoVnmg", "t"), + path: "/ipfs/QmXzZwAh34pmNjuKsVGZfpbByis5S5qeZjCCUxa1ajZqzH", opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, }, { name: "twoLevelInlineHash", data: twoLevelDir(), wrap: "t", - expect: wrapped("t"), - path: "/ipfs/zBunoruKoyCHKkALNSWxDvj4L7yuQnMgQ4hUa9j1Z64tVcDEcu6Zdetyu7eeFCxMPfxb7YJvHeFHoFoHMkBUQf6vfdhmi", + expect: wrapped("zBunoruKoyCHKkALNSWxDvj4L7yuQnMgQ4hUa9j1Z64tVcDEcu6Zdetyu7eeFCxMPfxb7YJvHeFHoFoHMkBUQf6vfdhmi", "t"), + path: "/ipfs/QmUX6GykDGHTMtLmDkfjqs48QwQK82vou51xwaY9TSU7Zo", opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true), options.Unixfs.Hash(mh.SHA3)}, }, // hidden @@ -328,17 +336,20 @@ func (tp *provider) TestAdd(t *testing.T) { "foo": files.NewBytesFile([]byte("hello1")), }) }, - wrap: "t", - path: "/ipfs/QmehGvpf2hY196MzDFmjL8Wy27S4jbgGDUAhBJyvXAwr3g", - opts: []options.UnixfsAddOption{options.Unixfs.Hidden(true)}, + wrap: "t", + expect: wrapped("t"), + path: "/ipfs/QmPXLSBX382vJDLrGakcbrZDkU3grfkjMox7EgSC9KFbtQ", + opts: []options.UnixfsAddOption{options.Unixfs.Hidden(true)}, }, { - name: "hiddenFileAlwaysAdded", + name: "topHiddenFileAdded", data: func() files.Node { return files.NewBytesFile([]byte(helloStr)) }, - wrap: ".foo", - path: hello, + wrap: ".foo", + expect: wrapped(".foo"), + path: "/ipfs/QmciAVG3krCbvzUaK9gr6jUgfEjQtYmuuXi1n67teQ4Ni2", + opts: []options.UnixfsAddOption{options.Unixfs.TopHidden(true)}, }, { name: "hiddenFilesNotAdded", @@ -352,10 +363,25 @@ func (tp *provider) TestAdd(t *testing.T) { expect: func(files.Node) files.Node { return flatDir() }, - wrap: "t", path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp", opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)}, }, + { + name: "hiddenFilesWrappedNotAdded", + data: func() files.Node { + return files.NewMapDirectory(map[string]files.Node{ + ".bar": files.NewBytesFile([]byte("hello2")), + "bar": files.NewBytesFile([]byte("hello2")), + "foo": files.NewBytesFile([]byte("hello1")), + }) + }, + expect: func(files.Node) files.Node { + return wrapped("t")(flatDir()) + }, + wrap: "t", + path: "/ipfs/Qmc3nGXm1HtUVCmnXLQHvWcNwfdZGpfg2SRm1CxLf7Q2Rm", + opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)}, + }, // NoCopy { name: "simpleNoCopy", @@ -392,10 +418,9 @@ func (tp *provider) TestAdd(t *testing.T) { data: twoLevelDir(), path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", events: []coreiface.AddEvent{ - {Name: "t/abc", Path: p("QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt"), Size: "62"}, - {Name: "t", Path: p("QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr"), Size: "229"}, + {Name: "abc", Path: p("QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt"), Size: "62"}, + {Name: "", Path: p("QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr"), Size: "229"}, }, - wrap: "t", opts: []options.UnixfsAddOption{options.Unixfs.Silent(true)}, }, { @@ -403,13 +428,12 @@ func (tp *provider) TestAdd(t *testing.T) { data: twoLevelDir(), path: "/ipfs/QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr", events: []coreiface.AddEvent{ - {Name: "t/abc/def", Path: p("QmNyJpQkU1cEkBwMDhDNFstr42q55mqG5GE5Mgwug4xyGk"), Size: "13"}, - {Name: "t/bar", Path: p("QmS21GuXiRMvJKHos4ZkEmQDmRBqRaF5tQS2CQCu2ne9sY"), Size: "14"}, - {Name: "t/foo", Path: p("QmfAjGiVpTN56TXi6SBQtstit5BEw3sijKj1Qkxn6EXKzJ"), Size: "14"}, - {Name: "t/abc", Path: p("QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt"), Size: "62"}, - {Name: "t", Path: p("QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr"), Size: "229"}, + {Name: "abc/def", Path: p("QmNyJpQkU1cEkBwMDhDNFstr42q55mqG5GE5Mgwug4xyGk"), Size: "13"}, + {Name: "bar", Path: p("QmS21GuXiRMvJKHos4ZkEmQDmRBqRaF5tQS2CQCu2ne9sY"), Size: "14"}, + {Name: "foo", Path: p("QmfAjGiVpTN56TXi6SBQtstit5BEw3sijKj1Qkxn6EXKzJ"), Size: "14"}, + {Name: "abc", Path: p("QmU7nuGs2djqK99UNsNgEPGh6GV4662p6WtsgccBNGTDxt"), Size: "62"}, + {Name: "", Path: p("QmVG2ZYCkV1S4TK8URA3a4RupBF17A8yAr4FqsRDXVJASr"), Size: "229"}, }, - wrap: "t", }, { name: "progress1M", @@ -528,14 +552,14 @@ func (tp *provider) TestAdd(t *testing.T) { _, origDir := orig.(files.Directory) _, gotDir := got.(files.Directory) - if origDir != gotDir { - t.Fatal("file type mismatch") - } - if origName != gotName { t.Errorf("file name mismatch, orig='%s', got='%s'", origName, gotName) } + if origDir != gotDir { + t.Fatalf("file type mismatch on %s", origName) + } + if !gotDir { defer orig.Close() defer got.Close() @@ -804,9 +828,7 @@ func (tp *provider) TestEntriesExpired(t *testing.T) { r := strings.NewReader("content-of-file") p, err := api.Unixfs().Add(ctx, files.NewMapDirectory(map[string]files.Node{ - "0": files.NewMapDirectory(map[string]files.Node{ - "name-of-file": files.NewReaderFile(r), - }), + "name-of-file": files.NewReaderFile(r), })) if err != nil { t.Error(err) @@ -846,7 +868,7 @@ func (tp *provider) TestLsEmptyDir(t *testing.T) { t.Error(err) } - _, err = api.Unixfs().Add(ctx, files.NewMapDirectory(map[string]files.Node{"0": files.NewSliceDirectory([]files.DirEntry{})})) + _, err = api.Unixfs().Add(ctx, files.NewSliceDirectory([]files.DirEntry{})) if err != nil { t.Error(err) } From 4274224bd095962491241080f0b1fc794d999239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Mar 2019 22:10:02 +0100 Subject: [PATCH 2656/3147] unixfs add: Remove hidden file handling This commit was moved from ipfs/interface-go-ipfs-core@56944d64d1ad4bb349a3d1a30633d5bea06d6a2e --- coreiface/options/unixfs.go | 21 ------------------ coreiface/tests/unixfs.go | 44 +------------------------------------ 2 files changed, 1 insertion(+), 64 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 44ba8c7cd3..574d46b985 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -34,8 +34,6 @@ type UnixfsAddSettings struct { NoCopy bool Wrap bool - Hidden bool - TopHidden bool StdinName string Events chan<- interface{} @@ -69,8 +67,6 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, NoCopy: false, Wrap: false, - Hidden: false, - TopHidden: false, StdinName: "", Events: nil, @@ -249,23 +245,6 @@ func (unixfsOpts) Wrap(wrap bool) UnixfsAddOption { } } -// Hidden enables adding of hidden files (files prefixed with '.') -func (unixfsOpts) Hidden(hidden bool) UnixfsAddOption { - return func(settings *UnixfsAddSettings) error { - settings.Hidden = hidden - return nil - } -} - -// TopHidden enables adding of hidden files in top-level directory (files -// prefixed with '.') -func (unixfsOpts) TopHidden(hidden bool) UnixfsAddOption { - return func(settings *UnixfsAddSettings) error { - settings.TopHidden = hidden - return nil - } -} - // StdinName is the name set for files which don specify FilePath as // os.Stdin.Name() func (unixfsOpts) StdinName(name string) UnixfsAddOption { diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 1ad3193335..0defd2f327 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -328,7 +328,7 @@ func (tp *provider) TestAdd(t *testing.T) { }, // hidden { - name: "hiddenFiles", + name: "hiddenFilesAdded", data: func() files.Node { return files.NewMapDirectory(map[string]files.Node{ ".bar": files.NewBytesFile([]byte("hello2")), @@ -339,48 +339,6 @@ func (tp *provider) TestAdd(t *testing.T) { wrap: "t", expect: wrapped("t"), path: "/ipfs/QmPXLSBX382vJDLrGakcbrZDkU3grfkjMox7EgSC9KFbtQ", - opts: []options.UnixfsAddOption{options.Unixfs.Hidden(true)}, - }, - { - name: "topHiddenFileAdded", - data: func() files.Node { - return files.NewBytesFile([]byte(helloStr)) - }, - wrap: ".foo", - expect: wrapped(".foo"), - path: "/ipfs/QmciAVG3krCbvzUaK9gr6jUgfEjQtYmuuXi1n67teQ4Ni2", - opts: []options.UnixfsAddOption{options.Unixfs.TopHidden(true)}, - }, - { - name: "hiddenFilesNotAdded", - data: func() files.Node { - return files.NewMapDirectory(map[string]files.Node{ - ".bar": files.NewBytesFile([]byte("hello2")), - "bar": files.NewBytesFile([]byte("hello2")), - "foo": files.NewBytesFile([]byte("hello1")), - }) - }, - expect: func(files.Node) files.Node { - return flatDir() - }, - path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp", - opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)}, - }, - { - name: "hiddenFilesWrappedNotAdded", - data: func() files.Node { - return files.NewMapDirectory(map[string]files.Node{ - ".bar": files.NewBytesFile([]byte("hello2")), - "bar": files.NewBytesFile([]byte("hello2")), - "foo": files.NewBytesFile([]byte("hello1")), - }) - }, - expect: func(files.Node) files.Node { - return wrapped("t")(flatDir()) - }, - wrap: "t", - path: "/ipfs/Qmc3nGXm1HtUVCmnXLQHvWcNwfdZGpfg2SRm1CxLf7Q2Rm", - opts: []options.UnixfsAddOption{options.Unixfs.Hidden(false)}, }, // NoCopy { From bd1689b886cda8cd5095b711df1eba9d15cabc7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Mar 2019 13:36:57 +0100 Subject: [PATCH 2657/3147] unixfs: fix ls test for new add This commit was moved from ipfs/interface-go-ipfs-core@91f8aac428155f9f302c3d6327c5f8659742013f --- coreiface/tests/unixfs.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 0defd2f327..d4af7c3f08 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -724,10 +724,8 @@ func (tp *provider) TestLs(t *testing.T) { r := strings.NewReader("content-of-file") p, err := api.Unixfs().Add(ctx, files.NewMapDirectory(map[string]files.Node{ - "0": files.NewMapDirectory(map[string]files.Node{ - "name-of-file": files.NewReaderFile(r), - "name-of-symlink": files.NewLinkFile("/foo/bar", nil), - }), + "name-of-file": files.NewReaderFile(r), + "name-of-symlink": files.NewLinkFile("/foo/bar", nil), })) if err != nil { t.Fatal(err) From f3f74adfdbb7715898650b91985c61e3ba7a2788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 11 Mar 2019 15:58:40 +0100 Subject: [PATCH 2658/3147] unixfs add: remove StdinName This commit was moved from ipfs/interface-go-ipfs-core@e12c21afc03931525ceefc18be0bda8c71818d29 --- coreiface/options/unixfs.go | 15 ++------------- coreiface/tests/unixfs.go | 18 ------------------ 2 files changed, 2 insertions(+), 31 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 574d46b985..578eb53205 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -33,8 +33,7 @@ type UnixfsAddSettings struct { FsCache bool NoCopy bool - Wrap bool - StdinName string + Wrap bool Events chan<- interface{} Silent bool @@ -66,8 +65,7 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, FsCache: false, NoCopy: false, - Wrap: false, - StdinName: "", + Wrap: false, Events: nil, Silent: false, @@ -245,15 +243,6 @@ func (unixfsOpts) Wrap(wrap bool) UnixfsAddOption { } } -// StdinName is the name set for files which don specify FilePath as -// os.Stdin.Name() -func (unixfsOpts) StdinName(name string) UnixfsAddOption { - return func(settings *UnixfsAddSettings) error { - settings.StdinName = name - return nil - } -} - // Events specifies channel which will be used to report events about ongoing // Add operation. // diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index d4af7c3f08..c27826b512 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -292,24 +292,6 @@ func (tp *provider) TestAdd(t *testing.T) { }, opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, }, - { - name: "stdinNamed", - path: "/ipfs/QmQ6cGBmb3ZbdrQW1MRm1RJnYnaxCqfssz7CrTa9NEhQyS", - data: func() files.Node { - rf, err := files.NewReaderPathFile(os.Stdin.Name(), ioutil.NopCloser(strings.NewReader(helloStr)), nil) - if err != nil { - panic(err) - } - - return rf - }, - expect: func(files.Node) files.Node { - return files.NewMapDirectory(map[string]files.Node{ - "test": files.NewBytesFile([]byte(helloStr)), - }) - }, - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.StdinName("test")}, - }, { name: "twoLevelDirWrapped", data: twoLevelDir(), From a0c8ed395649c7fcda2ceaccdd65aa13feb2d2ae Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 22 Mar 2019 15:05:41 -0700 Subject: [PATCH 2659/3147] remove Wrap This can be trivially implemented by the end-user if desired. The best the CoreAPI can do is name the file with it's own hash so this isn't really all that helpful either. Note: This differs from js-ipfs because _there_, all files have paths (even outside directories). This commit was moved from ipfs/interface-go-ipfs-core@ac37dde21aaeea010bbe50c8c37155e4471c0000 --- coreiface/options/unixfs.go | 13 ------------- coreiface/tests/unixfs.go | 36 ------------------------------------ 2 files changed, 49 deletions(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 578eb53205..3fd96f772c 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -33,8 +33,6 @@ type UnixfsAddSettings struct { FsCache bool NoCopy bool - Wrap bool - Events chan<- interface{} Silent bool Progress bool @@ -65,8 +63,6 @@ func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid.Prefix, FsCache: false, NoCopy: false, - Wrap: false, - Events: nil, Silent: false, Progress: false, @@ -234,15 +230,6 @@ func (unixfsOpts) HashOnly(hashOnly bool) UnixfsAddOption { } } -// Wrap tells the adder to wrap the added file structure with an additional -// directory. -func (unixfsOpts) Wrap(wrap bool) UnixfsAddOption { - return func(settings *UnixfsAddSettings) error { - settings.Wrap = wrap - return nil - } -} - // Events specifies channel which will be used to report events about ongoing // Add operation. // diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index c27826b512..0fd494f667 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -248,13 +248,6 @@ func (tp *provider) TestAdd(t *testing.T) { data: flatDir, path: "/ipfs/QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp", }, - { - name: "simpleDirWrap", - data: flatDir, - expect: wrapped("QmRKGpFfR32FVXdvJiHfo4WJ5TDYBsM1P9raAp1p6APWSp"), - path: "/ipfs/QmXxCaQkC8Z6Qws1nTkTQfCsL9y4XvWXnrPokp9bhmjC1L", - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, - }, { name: "simpleDir", data: flatDir, @@ -279,35 +272,6 @@ func (tp *provider) TestAdd(t *testing.T) { wrap: "foo", expect: wrapped("foo"), }, - { - name: "stdinWrapped", - path: "/ipfs/QmU3r81oZycjHS9oaSHw37ootMFuFUw1DvMLKXPsezdtqU", - data: func() files.Node { - return files.NewBytesFile([]byte(helloStr)) - }, - expect: func(files.Node) files.Node { - return files.NewMapDirectory(map[string]files.Node{ - "QmQy2Dw4Wk7rdJKjThjYXzfFJNaRKRHhHP5gHHXroJMYxk": files.NewBytesFile([]byte(helloStr)), - }) - }, - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, - }, - { - name: "twoLevelDirWrapped", - data: twoLevelDir(), - wrap: "t", - expect: wrapped("QmPwsL3T5sWhDmmAWZHAzyjKtMVDS9a11aHNRqb3xoVnmg", "t"), - path: "/ipfs/QmXzZwAh34pmNjuKsVGZfpbByis5S5qeZjCCUxa1ajZqzH", - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true)}, - }, - { - name: "twoLevelInlineHash", - data: twoLevelDir(), - wrap: "t", - expect: wrapped("zBunoruKoyCHKkALNSWxDvj4L7yuQnMgQ4hUa9j1Z64tVcDEcu6Zdetyu7eeFCxMPfxb7YJvHeFHoFoHMkBUQf6vfdhmi", "t"), - path: "/ipfs/QmUX6GykDGHTMtLmDkfjqs48QwQK82vou51xwaY9TSU7Zo", - opts: []options.UnixfsAddOption{options.Unixfs.Wrap(true), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true), options.Unixfs.Hash(mh.SHA3)}, - }, // hidden { name: "hiddenFilesAdded", From 39e93487470af2692b0bd9c9f9b25a2de98615a5 Mon Sep 17 00:00:00 2001 From: chenminjian <727180553@qq.com> Date: Tue, 26 Mar 2019 14:18:00 +0800 Subject: [PATCH 2660/3147] fix: not remove file by mistakes This commit was moved from ipfs/go-mfs@c322bfadadf72dce54570e9f408900806f631877 --- mfs/ops.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mfs/ops.go b/mfs/ops.go index bf05cd4435..90e229d4ee 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -73,6 +73,10 @@ func Mv(r *Root, src, dst string) error { return err } + if srcDirObj == dstDir && srcFname == filename { + return nil + } + return srcDirObj.Unlink(srcFname) } From 1a828e67296415ef8bbeb4d9e07fc994f9633748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 26 Mar 2019 19:48:30 +0800 Subject: [PATCH 2661/3147] Update ops.go Co-Authored-By: chenminjian <727180553@qq.com> This commit was moved from ipfs/go-mfs@9fe9f96862eb074ff2ef0ebf7c63bc82a3ba2f50 --- mfs/ops.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/ops.go b/mfs/ops.go index 90e229d4ee..3232f81035 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -73,7 +73,7 @@ func Mv(r *Root, src, dst string) error { return err } - if srcDirObj == dstDir && srcFname == filename { + if srcDir == dstDirStr && srcFname == filename { return nil } From 35272d3a3b89759460bf3fb96c15e36019036da4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 26 Mar 2019 18:27:35 +0000 Subject: [PATCH 2662/3147] make unrecoverable test errors fatal Otherwise, we can get random panics form dereferencing nil pointers. This commit was moved from ipfs/interface-go-ipfs-core@6d166d40d8d347faa4a10aec30444999d5d7b85b --- coreiface/tests/block.go | 28 ++++++++++----------- coreiface/tests/dag.go | 36 +++++++++++++-------------- coreiface/tests/key.go | 26 ++++++++++---------- coreiface/tests/path.go | 18 +++++++------- coreiface/tests/pin.go | 26 ++++++++++---------- coreiface/tests/unixfs.go | 51 +++++++++++++++++++++------------------ 6 files changed, 94 insertions(+), 91 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 3cd74358d9..d584ac98aa 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -52,7 +52,7 @@ func (tp *provider) TestBlockPutFormat(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("cbor")) @@ -70,7 +70,7 @@ func (tp *provider) TestBlockPutHash(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Hash(mh.KECCAK_512, -1)) @@ -88,7 +88,7 @@ func (tp *provider) TestBlockGet(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Hash(mh.KECCAK_512, -1)) @@ -98,12 +98,12 @@ func (tp *provider) TestBlockGet(t *testing.T) { r, err := api.Block().Get(ctx, res.Path()) if err != nil { - t.Error(err) + t.Fatal(err) } d, err := ioutil.ReadAll(r) if err != nil { - t.Error(err) + t.Fatal(err) } if string(d) != "Hello" { @@ -112,7 +112,7 @@ func (tp *provider) TestBlockGet(t *testing.T) { p, err := coreiface.ParsePath("/ipfs/" + res.Path().Cid().String()) if err != nil { - t.Error(err) + t.Fatal(err) } rp, err := api.ResolvePath(ctx, p) @@ -129,7 +129,7 @@ func (tp *provider) TestBlockRm(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) @@ -139,12 +139,12 @@ func (tp *provider) TestBlockRm(t *testing.T) { r, err := api.Block().Get(ctx, res.Path()) if err != nil { - t.Error(err) + t.Fatal(err) } d, err := ioutil.ReadAll(r) if err != nil { - t.Error(err) + t.Fatal(err) } if string(d) != "Hello" { @@ -153,7 +153,7 @@ func (tp *provider) TestBlockRm(t *testing.T) { err = api.Block().Rm(ctx, res.Path()) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Block().Get(ctx, res.Path()) @@ -174,7 +174,7 @@ func (tp *provider) TestBlockRm(t *testing.T) { err = api.Block().Rm(ctx, res.Path(), opt.Block.Force(true)) if err != nil { - t.Error(err) + t.Fatal(err) } } @@ -183,7 +183,7 @@ func (tp *provider) TestBlockStat(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) @@ -193,7 +193,7 @@ func (tp *provider) TestBlockStat(t *testing.T) { stat, err := api.Block().Stat(ctx, res.Path()) if err != nil { - t.Error(err) + t.Fatal(err) } if stat.Path().String() != res.Path().String() { @@ -210,7 +210,7 @@ func (tp *provider) TestBlockPin(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Block().Put(ctx, strings.NewReader(`Hello`)) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 7446c20de3..ff034beeca 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -44,12 +44,12 @@ func (tp *provider) TestPut(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Dag().Add(ctx, nd) @@ -67,12 +67,12 @@ func (tp *provider) TestPutWithHash(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), mh.ID, -1) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Dag().Add(ctx, nd) @@ -90,12 +90,12 @@ func (tp *provider) TestDagPath(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } snd, err := ipldcbor.FromJSON(strings.NewReader(`"foo"`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Dag().Add(ctx, snd) @@ -105,7 +105,7 @@ func (tp *provider) TestDagPath(t *testing.T) { nd, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+snd.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Dag().Add(ctx, nd) @@ -115,17 +115,17 @@ func (tp *provider) TestDagPath(t *testing.T) { p, err := coreiface.ParsePath(path.Join(nd.Cid().String(), "lnk")) if err != nil { - t.Error(err) + t.Fatal(err) } rp, err := api.ResolvePath(ctx, p) if err != nil { - t.Error(err) + t.Fatal(err) } ndd, err := api.Dag().Get(ctx, rp.Cid()) if err != nil { - t.Error(err) + t.Fatal(err) } if ndd.Cid().String() != snd.Cid().String() { @@ -138,12 +138,12 @@ func (tp *provider) TestTree(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } nd, err := ipldcbor.FromJSON(strings.NewReader(`{"a": 123, "b": "foo", "c": {"d": 321, "e": 111}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Dag().Add(ctx, nd) @@ -153,7 +153,7 @@ func (tp *provider) TestTree(t *testing.T) { res, err := api.Dag().Get(ctx, nd.Cid()) if err != nil { - t.Error(err) + t.Fatal(err) } lst := res.Tree("", -1) @@ -173,12 +173,12 @@ func (tp *provider) TestBatch(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } if nd.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { @@ -187,15 +187,15 @@ func (tp *provider) TestBatch(t *testing.T) { _, err = api.Dag().Get(ctx, nd.Cid()) if err == nil || !strings.Contains(err.Error(), "not found") { - t.Error(err) + t.Fatal(err) } if err := api.Dag().AddMany(ctx, []ipld.Node{nd}); err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Dag().Get(ctx, nd.Cid()) if err != nil { - t.Error(err) + t.Fatal(err) } } diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index dbbfce0599..7ff5f33300 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -121,7 +121,7 @@ func (tp *provider) TestGenerate(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } k, err := api.Key().Generate(ctx, "foo") @@ -144,7 +144,7 @@ func (tp *provider) TestGenerateSize(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } k, err := api.Key().Generate(ctx, "foo", opt.Key.Size(1024)) @@ -169,7 +169,7 @@ func (tp *provider) TestGenerateType(t *testing.T) { api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } k, err := api.Key().Generate(ctx, "bar", opt.Key.Type(opt.Ed25519Key)) @@ -193,7 +193,7 @@ func (tp *provider) TestGenerateExisting(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -226,7 +226,7 @@ func (tp *provider) TestList(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -272,7 +272,7 @@ func (tp *provider) TestRename(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -301,7 +301,7 @@ func (tp *provider) TestRenameToSelf(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -325,7 +325,7 @@ func (tp *provider) TestRenameToSelfForce(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -349,7 +349,7 @@ func (tp *provider) TestRenameOverwriteNoForce(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -379,7 +379,7 @@ func (tp *provider) TestRenameOverwrite(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } kfoo, err := api.Key().Generate(ctx, "foo") @@ -418,7 +418,7 @@ func (tp *provider) TestRenameSameNameNoForce(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -447,7 +447,7 @@ func (tp *provider) TestRenameSameName(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Key().Generate(ctx, "foo") @@ -476,7 +476,7 @@ func (tp *provider) TestRemove(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } k, err := api.Key().Generate(ctx, "foo") diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 4da1a5181b..b99e8ab9cc 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -68,7 +68,7 @@ func (tp *provider) TestPathRemainder(t *testing.T) { nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } if err := api.Dag().Add(ctx, nd); err != nil { @@ -77,7 +77,7 @@ func (tp *provider) TestPathRemainder(t *testing.T) { p1, err := coreiface.ParsePath(nd.String() + "/foo/bar") if err != nil { - t.Error(err) + t.Fatal(err) } rp1, err := api.ResolvePath(ctx, p1) @@ -104,7 +104,7 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } if err := api.Dag().Add(ctx, nd); err != nil { @@ -113,7 +113,7 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { p1, err := coreiface.ParsePath(nd.Cid().String()) if err != nil { - t.Error(err) + t.Fatal(err) } rp1, err := api.ResolvePath(ctx, p1) @@ -140,7 +140,7 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"bar": "baz"}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } if err := api.Dag().Add(ctx, nd); err != nil { @@ -149,7 +149,7 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { p1, err := coreiface.ParsePath("/ipld/" + nd.Cid().String() + "/bar/baz") if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.ResolvePath(ctx, p1) @@ -181,7 +181,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { nd, err := ipldcbor.FromJSON(strings.NewReader(`{"foo": {"/": "`+blk.Path().Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } if err := api.Dag().Add(ctx, nd); err != nil { @@ -190,7 +190,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { p1, err := coreiface.ParsePath("/ipld/" + nd.Cid().String() + "/foo") if err != nil { - t.Error(err) + t.Fatal(err) } rp, err := api.ResolvePath(ctx, p1) @@ -210,7 +210,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { func (tp *provider) TestPathJoin(t *testing.T) { p1, err := coreiface.ParsePath("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") if err != nil { - t.Error(err) + t.Fatal(err) } if coreiface.Join(p1, "foo").String() != "/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz/foo" { diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index eed5422833..ff6f98e358 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -31,17 +31,17 @@ func (tp *provider) TestPinAdd(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } p, err := api.Unixfs().Add(ctx, strFile("foo")()) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Pin().Add(ctx, p) if err != nil { - t.Error(err) + t.Fatal(err) } } @@ -50,17 +50,17 @@ func (tp *provider) TestPinSimple(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } p, err := api.Unixfs().Add(ctx, strFile("foo")()) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Pin().Add(ctx, p) if err != nil { - t.Error(err) + t.Fatal(err) } list, err := api.Pin().Ls(ctx) @@ -100,27 +100,27 @@ func (tp *provider) TestPinRecursive(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } p0, err := api.Unixfs().Add(ctx, strFile("foo")()) if err != nil { - t.Error(err) + t.Fatal(err) } p1, err := api.Unixfs().Add(ctx, strFile("bar")()) if err != nil { - t.Error(err) + t.Fatal(err) } nd2, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+p0.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } nd3, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+p1.Cid().String()+`"}}`), math.MaxUint64, -1) if err != nil { - t.Error(err) + t.Fatal(err) } if err := api.Dag().AddMany(ctx, []ipld.Node{nd2, nd3}); err != nil { @@ -129,12 +129,12 @@ func (tp *provider) TestPinRecursive(t *testing.T) { err = api.Pin().Add(ctx, iface.IpldPath(nd2.Cid())) if err != nil { - t.Error(err) + t.Fatal(err) } err = api.Pin().Add(ctx, iface.IpldPath(nd3.Cid()), opt.Pin.Recursive(false)) if err != nil { - t.Error(err) + t.Fatal(err) } list, err := api.Pin().Ls(ctx) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index c27826b512..e99bf44295 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -98,7 +98,7 @@ func (tp *provider) TestAdd(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } p := func(h string) coreiface.ResolvedPath { @@ -566,15 +566,18 @@ func (tp *provider) TestAddPinned(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Unixfs().Add(ctx, strFile(helloStr)(), options.Unixfs.Pin(true)) if err != nil { - t.Error(err) + t.Fatal(err) } pins, err := api.Pin().Ls(ctx) + if err != nil { + t.Fatal(err) + } if len(pins) != 1 { t.Fatalf("expected 1 pin, got %d", len(pins)) } @@ -589,12 +592,12 @@ func (tp *provider) TestAddHashOnly(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } p, err := api.Unixfs().Add(ctx, strFile(helloStr)(), options.Unixfs.HashOnly(true)) if err != nil { - t.Error(err) + t.Fatal(err) } if p.String() != hello { @@ -648,18 +651,18 @@ func (tp *provider) TestGetDir(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } edir := unixfs.EmptyDirNode() err = api.Dag().Add(ctx, edir) if err != nil { - t.Error(err) + t.Fatal(err) } p := coreiface.IpfsPath(edir.Cid()) emptyDir, err := api.Object().New(ctx, options.Object.Type("unixfs-dir")) if err != nil { - t.Error(err) + t.Fatal(err) } if p.String() != coreiface.IpfsPath(emptyDir.Cid()).String() { @@ -668,7 +671,7 @@ func (tp *provider) TestGetDir(t *testing.T) { r, err := api.Unixfs().Get(ctx, coreiface.IpfsPath(emptyDir.Cid())) if err != nil { - t.Error(err) + t.Fatal(err) } if _, ok := r.(files.Directory); !ok { @@ -681,13 +684,13 @@ func (tp *provider) TestGetNonUnixfs(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } nd := new(mdag.ProtoNode) err = api.Dag().Add(ctx, nd) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Unixfs().Get(ctx, coreiface.IpfsPath(nd.Cid())) @@ -761,7 +764,7 @@ func (tp *provider) TestEntriesExpired(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } r := strings.NewReader("content-of-file") @@ -769,14 +772,14 @@ func (tp *provider) TestEntriesExpired(t *testing.T) { "name-of-file": files.NewReaderFile(r), })) if err != nil { - t.Error(err) + t.Fatal(err) } ctx, cancel = context.WithCancel(ctx) nd, err := api.Unixfs().Get(ctx, p) if err != nil { - t.Error(err) + t.Fatal(err) } cancel() @@ -803,22 +806,22 @@ func (tp *provider) TestLsEmptyDir(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } _, err = api.Unixfs().Add(ctx, files.NewSliceDirectory([]files.DirEntry{})) if err != nil { - t.Error(err) + t.Fatal(err) } emptyDir, err := api.Object().New(ctx, options.Object.Type("unixfs-dir")) if err != nil { - t.Error(err) + t.Fatal(err) } links, err := api.Unixfs().Ls(ctx, coreiface.IpfsPath(emptyDir.Cid())) if err != nil { - t.Error(err) + t.Fatal(err) } if len(links) != 0 { @@ -832,7 +835,7 @@ func (tp *provider) TestLsNonUnixfs(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } nd, err := cbor.WrapObject(map[string]interface{}{"foo": "bar"}, math.MaxUint64, -1) @@ -842,12 +845,12 @@ func (tp *provider) TestLsNonUnixfs(t *testing.T) { err = api.Dag().Add(ctx, nd) if err != nil { - t.Error(err) + t.Fatal(err) } links, err := api.Unixfs().Ls(ctx, coreiface.IpfsPath(nd.Cid())) if err != nil { - t.Error(err) + t.Fatal(err) } if len(links) != 0 { @@ -890,7 +893,7 @@ func (tp *provider) TestAddCloses(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } n4 := &closeTestF{files.NewBytesFile([]byte("foo")), false, t} @@ -907,7 +910,7 @@ func (tp *provider) TestAddCloses(t *testing.T) { _, err = api.Unixfs().Add(ctx, d0) if err != nil { - t.Error(err) + t.Fatal(err) } d0.Close() // Adder doesn't close top-level file @@ -930,7 +933,7 @@ func (tp *provider) TestGetSeek(t *testing.T) { defer cancel() api, err := tp.makeAPI(ctx) if err != nil { - t.Error(err) + t.Fatal(err) } dataSize := int64(100000) From ccb4a5c183b98b9dcf40eee0c0ac8e4a317b4ed8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 26 Mar 2019 18:35:13 +0000 Subject: [PATCH 2663/3147] tests: remove t.Fatal from goroutines This commit was moved from ipfs/interface-go-ipfs-core@5f17f8346b441a6105b569084fa020af989b0f4c --- coreiface/tests/pubsub.go | 4 +++- coreiface/tests/unixfs.go | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index bb870de6c3..dd05b73cf2 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -40,7 +40,9 @@ func (tp *provider) TestBasicPubSub(t *testing.T) { for { err := apis[1].PubSub().Publish(ctx, "testch", []byte("hello world")) if err != nil { - t.Fatal(err) + t.Error(err) + cancel() + return } select { case <-tick: diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index e99bf44295..576160500c 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -423,11 +423,13 @@ func (tp *provider) TestAdd(t *testing.T) { for evt := range eventOut { event, ok := evt.(*coreiface.AddEvent) if !ok { - t.Fatal("unexpected event type") + t.Error("unexpected event type") + continue } if len(expected) < 1 { - t.Fatal("got more events than expected") + t.Error("got more events than expected") + continue } if expected[0].Size != event.Size { @@ -453,7 +455,7 @@ func (tp *provider) TestAdd(t *testing.T) { } if len(expected) > 0 { - t.Fatalf("%d event(s) didn't arrive", len(expected)) + t.Errorf("%d event(s) didn't arrive", len(expected)) } }() } From b75b1243fb9738e1b5eb6fd19bca980bd156299c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 26 Mar 2019 18:37:40 +0000 Subject: [PATCH 2664/3147] tests: remove ticker leak This commit was moved from ipfs/interface-go-ipfs-core@a7d4a7199895a4bd66fa655b73f94ecea4540fdf --- coreiface/tests/pubsub.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index dd05b73cf2..418fc4867c 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -35,7 +35,8 @@ func (tp *provider) TestBasicPubSub(t *testing.T) { } go func() { - tick := time.Tick(100 * time.Millisecond) + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() for { err := apis[1].PubSub().Publish(ctx, "testch", []byte("hello world")) @@ -45,7 +46,7 @@ func (tp *provider) TestBasicPubSub(t *testing.T) { return } select { - case <-tick: + case <-ticker.C: case <-ctx.Done(): return } From bbf450e3e44f7595a128eba9b7578a412ddcd551 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 26 Mar 2019 18:38:02 +0000 Subject: [PATCH 2665/3147] tests: fix unused variable lints This commit was moved from ipfs/interface-go-ipfs-core@5d6a474f3191362120268fa1b0396823013fbe41 --- coreiface/tests/object.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 026def73bb..8682a2edca 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -296,7 +296,7 @@ func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { t.Fatal(err) } - p3, err := api.Object().AddLink(ctx, p2, "abc/d", p2) + _, err = api.Object().AddLink(ctx, p2, "abc/d", p2) if err == nil { t.Fatal("expected an error") } @@ -304,7 +304,7 @@ func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { t.Fatalf("unexpected error: %s", err.Error()) } - p3, err = api.Object().AddLink(ctx, p2, "abc/d", p2, opt.Object.Create(true)) + p3, err := api.Object().AddLink(ctx, p2, "abc/d", p2, opt.Object.Create(true)) if err != nil { t.Fatal(err) } @@ -384,6 +384,9 @@ func (tp *provider) TestObjectAddData(t *testing.T) { } data, err := ioutil.ReadAll(r) + if err != nil { + t.Fatal(err) + } if string(data) != "foobar" { t.Error("unexpected data") @@ -414,6 +417,9 @@ func (tp *provider) TestObjectSetData(t *testing.T) { } data, err := ioutil.ReadAll(r) + if err != nil { + t.Fatal(err) + } if string(data) != "bar" { t.Error("unexpected data") From 21ade61b10b9757f9dfd2dafdb3c95a0ec00ccb1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 26 Mar 2019 19:01:23 +0000 Subject: [PATCH 2666/3147] don't close the top-level addr See https://github.com/ipfs/go-ipfs-http-client/pull/10/files#r269268326 This commit was moved from ipfs/interface-go-ipfs-core@1b707f294336a6eaf3274e27ab0ce85a2b374fbe --- coreiface/tests/unixfs.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 0fd494f667..ea36b7330b 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -834,6 +834,7 @@ type closeTestD struct { } func (f *closeTestD) Close() error { + f.t.Helper() if f.closed { f.t.Fatal("already closed") } @@ -874,8 +875,6 @@ func (tp *provider) TestAddCloses(t *testing.T) { t.Error(err) } - d0.Close() // Adder doesn't close top-level file - for i, n := range []*closeTestF{n1, n2, n4} { if !n.closed { t.Errorf("file %d not closed!", i) From e6ed297b25353687011dacb6bcfec85a297719d8 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Mon, 25 Mar 2019 09:03:09 -0700 Subject: [PATCH 2667/3147] Query for provider head/tail License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@cb07b21213d8bca40ed95354cd3b356bf239a1ee --- provider/queue.go | 66 +++++++++++++++++++++++++----------------- provider/queue_test.go | 26 ++++++++++++++++- 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/provider/queue.go b/provider/queue.go index a3268e1093..918bdcbd76 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -2,7 +2,7 @@ package provider import ( "context" - "math" + "fmt" "strconv" "strings" @@ -32,7 +32,7 @@ type Queue struct { // NewQueue creates a queue for cids func NewQueue(ctx context.Context, name string, ds datastore.Datastore) (*Queue, error) { namespaced := namespace.Wrap(ds, datastore.NewKey("/"+name+"/queue/")) - head, tail, err := getQueueHeadTail(ctx, name, namespaced) + head, tail, err := getQueueHeadTail(ctx, namespaced) if err != nil { return nil, err } @@ -142,40 +142,52 @@ func (q *Queue) work() { } func (q *Queue) queueKey(id uint64) datastore.Key { - return datastore.NewKey(strconv.FormatUint(id, 10)) + s := fmt.Sprintf("%016X", id) + return datastore.NewKey(s) } -// crawl over the queue entries to find the head and tail -func getQueueHeadTail(ctx context.Context, name string, datastore datastore.Datastore) (uint64, uint64, error) { - q := query.Query{} - results, err := datastore.Query(q) +func getQueueHeadTail(ctx context.Context, datastore datastore.Datastore) (uint64, uint64, error) { + head, err := getQueueHead(datastore) if err != nil { return 0, 0, err } + tail, err := getQueueTail(datastore) + if err != nil { + return 0, 0, err + } + return head, tail, nil +} - var tail uint64 - var head uint64 = math.MaxUint64 - for entry := range results.Next() { - trimmed := strings.TrimPrefix(entry.Key, "/") - id, err := strconv.ParseUint(trimmed, 10, 64) - if err != nil { - return 0, 0, err - } +func getQueueHead(ds datastore.Datastore) (uint64, error) { + return getFirstIDByOrder(ds, query.OrderByKey{}) +} - if id < head { - head = id - } +func getQueueTail(ds datastore.Datastore) (uint64, error) { + tail, err := getFirstIDByOrder(ds, query.OrderByKeyDescending{}) + if err != nil { + return 0, err + } + if tail > 0 { + tail++ + } + return tail, nil +} - if (id + 1) > tail { - tail = (id + 1) - } +func getFirstIDByOrder(ds datastore.Datastore, order query.Order) (uint64, error) { + q := query.Query{Orders: []query.Order{order}} + results, err := ds.Query(q) + if err != nil { + return 0, err } - if err := results.Close(); err != nil { - return 0, 0, err + defer results.Close() + r, ok := results.NextSync() + if !ok { + return 0, nil } - if head == math.MaxUint64 { - head = 0 + trimmed := strings.TrimPrefix(r.Key, "/") + id, err := strconv.ParseUint(trimmed, 16, 64) + if err != nil { + return 0, err } - - return head, tail, nil + return id, nil } diff --git a/provider/queue_test.go b/provider/queue_test.go index e1b74878ea..2857da0a93 100644 --- a/provider/queue_test.go +++ b/provider/queue_test.go @@ -12,7 +12,7 @@ import ( func makeCids(n int) []cid.Cid { cids := make([]cid.Cid, 0, n) - for i := 0; i < 10; i++ { + for i := 0; i < n; i++ { c := blockGenerator.Next().Cid() cids = append(cids, c) } @@ -129,3 +129,27 @@ func TestInitialization(t *testing.T) { assertOrdered(cids[5:], queue, t) } + +func TestInitializationWithManyCids(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + + cids := makeCids(25) + for _, c := range cids { + queue.Enqueue(c) + } + + // make a new queue, same data + queue, err = NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + + assertOrdered(cids, queue, t) +} From f440f3ba86bbc5fe4bb7db919f306e6f0949f46c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Mar 2019 14:46:29 +0000 Subject: [PATCH 2668/3147] chore: fix a bunch of issues caught by golangci-lint Most of these are probably harmless but a few looked like they might actually be bugs. Most of them are just faulty tests. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@c2d9637ee6d2005d7a3ca04318e48c06598b8578 --- namesys/namesys.go | 2 +- namesys/namesys_test.go | 5 ++++- namesys/republisher/repub_test.go | 4 +++- namesys/routing.go | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 94d4989922..f8b8c6d12e 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -183,7 +183,7 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. return err } ttl := DefaultResolverCacheTTL - if ttEol := eol.Sub(time.Now()); ttEol < ttl { + if ttEol := time.Until(eol); ttEol < ttl { ttl = ttEol } ns.cacheSet(peer.IDB58Encode(id), value, ttl) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 09c5a39c20..38d6c4abbf 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -104,5 +104,8 @@ func TestPublishWithCache0(t *testing.T) { if err != nil { t.Fatal(err) } - nsys.Publish(context.Background(), priv, p) + err = nsys.Publish(context.Background(), priv, p) + if err != nil { + t.Fatal(err) + } } diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 22d69e254d..8f0048c4c8 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -41,7 +41,9 @@ func TestRepublish(t *testing.T) { nodes = append(nodes, nd) } - mn.LinkAll() + if err := mn.LinkAll(); err != nil { + t.Fatal(err) + } bsinf := core.BootstrapConfigWithPeers( []pstore.PeerInfo{ diff --git a/namesys/routing.go b/namesys/routing.go index d581337754..e89dd9c9d4 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -137,7 +137,7 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option case ipns.ErrUnrecognizedValidity: // No EOL. case nil: - ttEol := eol.Sub(time.Now()) + ttEol := time.Until(eol) if ttEol < 0 { // It *was* valid when we first resolved it. ttl = 0 From 62dc10386ca75de1c48ce267d08080e7519d0ef2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Mar 2019 14:46:29 +0000 Subject: [PATCH 2669/3147] chore: fix a bunch of issues caught by golangci-lint Most of these are probably harmless but a few looked like they might actually be bugs. Most of them are just faulty tests. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-provider@13f94287dae70589f680c90275a790a3d74c5b17 --- provider/queue.go | 8 +++----- provider/queue_test.go | 3 +++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/provider/queue.go b/provider/queue.go index 918bdcbd76..c8982ff10f 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -62,11 +62,6 @@ func (q *Queue) Dequeue() <-chan cid.Cid { return q.dequeue } -type entry struct { - cid cid.Cid - key datastore.Key -} - // Look for next Cid in the queue and return it. Skip over gaps and mangled data func (q *Queue) nextEntry() (datastore.Key, cid.Cid) { for { @@ -91,6 +86,9 @@ func (q *Queue) nextEntry() (datastore.Key, cid.Cid) { log.Warningf("Error marshalling Cid from queue: ", err) q.head++ err = q.ds.Delete(key) + if err != nil { + log.Warningf("Provider queue failed to delete: %s", key) + } continue } diff --git a/provider/queue_test.go b/provider/queue_test.go index 2857da0a93..e151478d9f 100644 --- a/provider/queue_test.go +++ b/provider/queue_test.go @@ -99,6 +99,9 @@ func TestMangledData(t *testing.T) { // remove entries in the middle err = queue.ds.Put(queue.queueKey(5), []byte("borked")) + if err != nil { + t.Fatal(err) + } expected := append(cids[:5], cids[6:]...) assertOrdered(expected, queue, t) From 641cd1d4ca96323a69aeebeadb9038b12aa207f3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Mar 2019 14:46:29 +0000 Subject: [PATCH 2670/3147] chore: fix a bunch of issues caught by golangci-lint Most of these are probably harmless but a few looked like they might actually be bugs. Most of them are just faulty tests. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@1aabde8dd166fd4b0078008993fba6fb972d76ac --- pinning/pinner/pin_test.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 6f9914ef3b..27e4c71dee 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -2,6 +2,7 @@ package pin import ( "context" + "io" "testing" "time" @@ -21,7 +22,10 @@ var rand = util.NewTimeSeededRand() func randNode() (*mdag.ProtoNode, cid.Cid) { nd := new(mdag.ProtoNode) nd.SetData(make([]byte, 32)) - rand.Read(nd.Data()) + _, err := io.ReadFull(rand, nd.Data()) + if err != nil { + panic(err) + } k := nd.Cid() return nd, k } @@ -111,11 +115,11 @@ func TestPinnerBasic(t *testing.T) { assertPinned(t, p, bk, "Recursively pinned node not found..") d, _ := randNode() - d.AddNodeLink("a", a) - d.AddNodeLink("c", c) + _ = d.AddNodeLink("a", a) + _ = d.AddNodeLink("c", c) e, _ := randNode() - d.AddNodeLink("e", e) + _ = d.AddNodeLink("e", e) // Must be in dagserv for unpin to work err = dserv.Add(ctx, e) @@ -385,8 +389,12 @@ func TestPinUpdate(t *testing.T) { n1, c1 := randNode() n2, c2 := randNode() - dserv.Add(ctx, n1) - dserv.Add(ctx, n2) + if err := dserv.Add(ctx, n1); err != nil { + t.Fatal(err) + } + if err := dserv.Add(ctx, n2); err != nil { + t.Fatal(err) + } if err := p.Pin(ctx, n1, true); err != nil { t.Fatal(err) From c3616aece419def1698ba872af8fba464da26cd2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Mar 2019 14:46:29 +0000 Subject: [PATCH 2671/3147] chore: fix a bunch of issues caught by golangci-lint Most of these are probably harmless but a few looked like they might actually be bugs. Most of them are just faulty tests. License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-keystore@104cf5bfc98d7b419bf26f73c36e53b176d055b8 --- keystore/keystore_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index c69fd6a053..d7118d7564 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -198,7 +198,7 @@ func TestInvalidKeyFiles(t *testing.T) { t.Fatal(err) } - if exist, err = ks.Has(".invalid"); err == nil { + if _, err = ks.Has(".invalid"); err == nil { t.Fatal("shouldnt be able to put a key with a 'hidden' name") } } From b04e8b8ac05474b627488dc4e4c390afd5959fd7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Mar 2019 15:26:31 +0000 Subject: [PATCH 2672/3147] test: fix namesys test License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-namesys@8fe329d6f9979f3b14034799e020449c09ac7d25 --- namesys/namesys_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 38d6c4abbf..2cf316cf32 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -15,6 +15,7 @@ import ( ci "github.com/libp2p/go-libp2p-crypto" peer "github.com/libp2p/go-libp2p-peer" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" + record "github.com/libp2p/go-libp2p-record" ) type mockResolver struct { @@ -97,7 +98,10 @@ func TestPublishWithCache0(t *testing.T) { t.Fatal(err) } - routing := offroute.NewOfflineRouter(dst, ipns.Validator{KeyBook: ps}) + routing := offroute.NewOfflineRouter(dst, record.NamespacedValidator{ + "ipns": ipns.Validator{KeyBook: ps}, + "pk": record.PublicKeyValidator{}, + }) nsys := NewNameSystem(routing, dst, 0) p, err := path.ParsePath(unixfs.EmptyDirNode().Cid().String()) From ea26ae5e0535dc2429c8c2797b79982317cc9bb3 Mon Sep 17 00:00:00 2001 From: Edgar Lee Date: Fri, 29 Mar 2019 16:16:16 -0700 Subject: [PATCH 2673/3147] Update Pin.RmRecursive docs to clarify shared indirect pins are not removed This commit was moved from ipfs/interface-go-ipfs-core@c908a059feab33b74ce66dca01fd521389372942 --- coreiface/options/pin.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index cc4a8ef296..6b211bb73b 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -127,7 +127,9 @@ func (pinOpts) Recursive(recursive bool) PinAddOption { } } -// RmRecursive is an option for Pin.Rm +// RmRecursive is an option for Pin.Rm which specifies whether to recursively +// unpin the object linked to by the specified object(s). This does not remove +// indirect pins referenced by other recursive pins. func (pinOpts) RmRecursive(recursive bool) PinRmOption { return func(settings *PinRmSettings) error { settings.Recursive = recursive From 31071e1f5e59a62d53e2c2c7e259eedff6d49f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 25 Mar 2019 17:03:44 +0100 Subject: [PATCH 2674/3147] path: drop error from ParsePath This commit was moved from ipfs/interface-go-ipfs-core@2b9bff7523c812447641aa70c39ec0b096f5b5c4 --- coreiface/path.go | 51 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/coreiface/path.go b/coreiface/path.go index 4e86172ace..ede190df7d 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,7 +1,9 @@ package iface import ( - "github.com/ipfs/go-cid" + "strings" + + cid "github.com/ipfs/go-cid" ipfspath "github.com/ipfs/go-path" ) @@ -23,6 +25,9 @@ type Path interface { // Namespace returns the first component of the path. // // For example path "/ipfs/QmHash", calling Namespace() will return "ipfs" + // + // Calling this method on invalid paths (IsValid() != nil) will result in + // empty string Namespace() string // Mutable returns false if the data pointed to by this path in guaranteed @@ -30,9 +35,14 @@ type Path interface { // // Note that resolved mutable path can be immutable. Mutable() bool + + // IsValid checks if this path is a valid ipfs Path, returning nil iff it is + // valid + IsValid() error } -// ResolvedPath is a path which was resolved to the last resolvable node +// ResolvedPath is a path which was resolved to the last resolvable node. +// ResolvedPaths are guaranteed to return nil from `IsValid` type ResolvedPath interface { // Cid returns the CID of the node referenced by the path. Remainder of the // path is guaranteed to be within the node. @@ -94,7 +104,7 @@ type ResolvedPath interface { // path implements coreiface.Path type path struct { - path ipfspath.Path + path string } // resolvedPath implements coreiface.resolvedPath @@ -107,14 +117,14 @@ type resolvedPath struct { // Join appends provided segments to the base path func Join(base Path, a ...string) Path { - s := ipfspath.Join(append([]string{base.String()}, a...)) - return &path{path: ipfspath.FromString(s)} + s := strings.Join(append([]string{base.String()}, a...), "/") + return &path{path: s} } // IpfsPath creates new /ipfs path from the provided CID func IpfsPath(c cid.Cid) ResolvedPath { return &resolvedPath{ - path: path{ipfspath.Path("/ipfs/" + c.String())}, + path: path{"/ipfs/" + c.String()}, cid: c, root: c, remainder: "", @@ -124,7 +134,7 @@ func IpfsPath(c cid.Cid) ResolvedPath { // IpldPath creates new /ipld path from the provided CID func IpldPath(c cid.Cid) ResolvedPath { return &resolvedPath{ - path: path{ipfspath.Path("/ipld/" + c.String())}, + path: path{"/ipld/" + c.String()}, cid: c, root: c, remainder: "", @@ -132,13 +142,12 @@ func IpldPath(c cid.Cid) ResolvedPath { } // ParsePath parses string path to a Path -func ParsePath(p string) (Path, error) { - pp, err := ipfspath.ParsePath(p) - if err != nil { - return nil, err +func ParsePath(p string) Path { + if pp, err := ipfspath.ParsePath(p); err == nil { + p = pp.String() } - return &path{path: pp}, nil + return &path{path: p} } // NewResolvedPath creates new ResolvedPath. This function performs no checks @@ -146,7 +155,7 @@ func ParsePath(p string) (Path, error) { // cause panics. Handle with care. func NewResolvedPath(ipath ipfspath.Path, c cid.Cid, root cid.Cid, remainder string) ResolvedPath { return &resolvedPath{ - path: path{ipath}, + path: path{ipath.String()}, cid: c, root: root, remainder: remainder, @@ -154,14 +163,19 @@ func NewResolvedPath(ipath ipfspath.Path, c cid.Cid, root cid.Cid, remainder str } func (p *path) String() string { - return p.path.String() + return p.path } func (p *path) Namespace() string { - if len(p.path.Segments()) < 1 { + ip, err := ipfspath.ParsePath(p.path) + if err != nil { + return "" + } + + if len(ip.Segments()) < 1 { panic("path without namespace") //this shouldn't happen under any scenario } - return p.path.Segments()[0] + return ip.Segments()[0] } func (p *path) Mutable() bool { @@ -169,6 +183,11 @@ func (p *path) Mutable() bool { return p.Namespace() == "ipns" } +func (p *path) IsValid() error { + _, err := ipfspath.ParsePath(p.path) + return err +} + func (p *resolvedPath) Cid() cid.Cid { return p.cid } From 1497150b1f90816ac7b117fbe0b2fb6aacaa7968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 25 Mar 2019 17:03:53 +0100 Subject: [PATCH 2675/3147] path: fix tests This commit was moved from ipfs/interface-go-ipfs-core@33d445a6140b26da90a07d2bf86c8827d74284b6 --- coreiface/tests/block.go | 5 +---- coreiface/tests/dag.go | 5 +---- coreiface/tests/name.go | 6 +----- coreiface/tests/path.go | 33 +++++---------------------------- coreiface/tests/unixfs.go | 5 +---- 5 files changed, 9 insertions(+), 45 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index d584ac98aa..96319b4887 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -110,10 +110,7 @@ func (tp *provider) TestBlockGet(t *testing.T) { t.Error("didn't get correct data back") } - p, err := coreiface.ParsePath("/ipfs/" + res.Path().Cid().String()) - if err != nil { - t.Fatal(err) - } + p := coreiface.ParsePath("/ipfs/" + res.Path().Cid().String()) rp, err := api.ResolvePath(ctx, p) if err != nil { diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index ff034beeca..a17296d1d2 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -113,10 +113,7 @@ func (tp *provider) TestDagPath(t *testing.T) { t.Fatal(err) } - p, err := coreiface.ParsePath(path.Join(nd.Cid().String(), "lnk")) - if err != nil { - t.Fatal(err) - } + p := coreiface.ParsePath(path.Join(nd.Cid().String(), "lnk")) rp, err := api.ResolvePath(ctx, p) if err != nil { diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 1eb2dd5136..c9e99a584a 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -35,11 +35,7 @@ func addTestObject(ctx context.Context, api coreiface.CoreAPI) (coreiface.Path, } func appendPath(p coreiface.Path, sub string) coreiface.Path { - p, err := coreiface.ParsePath(path.Join(p.String(), sub)) - if err != nil { - panic(err) - } - return p + return coreiface.ParsePath(path.Join(p.String(), sub)) } func (tp *provider) TestPublishResolve(t *testing.T) { diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index b99e8ab9cc..f5b0ee3489 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -75,12 +75,7 @@ func (tp *provider) TestPathRemainder(t *testing.T) { t.Fatal(err) } - p1, err := coreiface.ParsePath(nd.String() + "/foo/bar") - if err != nil { - t.Fatal(err) - } - - rp1, err := api.ResolvePath(ctx, p1) + rp1, err := api.ResolvePath(ctx, coreiface.ParsePath(nd.String()+"/foo/bar")) if err != nil { t.Fatal(err) } @@ -111,12 +106,7 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { t.Fatal(err) } - p1, err := coreiface.ParsePath(nd.Cid().String()) - if err != nil { - t.Fatal(err) - } - - rp1, err := api.ResolvePath(ctx, p1) + rp1, err := api.ResolvePath(ctx, coreiface.ParsePath(nd.Cid().String())) if err != nil { t.Fatal(err) } @@ -147,12 +137,7 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { t.Fatal(err) } - p1, err := coreiface.ParsePath("/ipld/" + nd.Cid().String() + "/bar/baz") - if err != nil { - t.Fatal(err) - } - - _, err = api.ResolvePath(ctx, p1) + _, err = api.ResolvePath(ctx, coreiface.ParsePath("/ipld/"+nd.Cid().String()+"/bar/baz")) if err == nil || !strings.Contains(err.Error(), "no such link found") { t.Fatalf("unexpected error: %s", err) } @@ -188,12 +173,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(err) } - p1, err := coreiface.ParsePath("/ipld/" + nd.Cid().String() + "/foo") - if err != nil { - t.Fatal(err) - } - - rp, err := api.ResolvePath(ctx, p1) + rp, err := api.ResolvePath(ctx, coreiface.ParsePath("/ipld/"+nd.Cid().String()+"/foo")) if err != nil { t.Fatal(err) } @@ -208,10 +188,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { } func (tp *provider) TestPathJoin(t *testing.T) { - p1, err := coreiface.ParsePath("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") - if err != nil { - t.Fatal(err) - } + p1 := coreiface.ParsePath("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") if coreiface.Join(p1, "foo").String() != "/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz/foo" { t.Error("unexpected path") diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 611ea54761..15cb8abc83 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -592,10 +592,7 @@ func (tp *provider) TestGetEmptyFile(t *testing.T) { t.Fatal(err) } - emptyFilePath, err := coreiface.ParsePath(emptyFile) - if err != nil { - t.Fatal(err) - } + emptyFilePath := coreiface.ParsePath(emptyFile) r, err := api.Unixfs().Get(ctx, emptyFilePath) if err != nil { From b8463e7c123e4ff15fd8fdd33a02a6414682ca9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 25 Mar 2019 19:37:28 +0100 Subject: [PATCH 2676/3147] path: WIP This commit was moved from ipfs/interface-go-ipfs-core@5a836515396273412794edaaba72ef0cf3ead46d --- coreiface/block.go | 11 ++- coreiface/coreapi.go | 5 +- coreiface/dht.go | 7 +- coreiface/key.go | 5 +- coreiface/name.go | 11 ++- coreiface/object.go | 29 +++--- coreiface/path.go | 197 ------------------------------------- coreiface/path/path.go | 199 ++++++++++++++++++++++++++++++++++++++ coreiface/pin.go | 13 +-- coreiface/tests/block.go | 3 +- coreiface/tests/dag.go | 5 +- coreiface/tests/name.go | 12 +-- coreiface/tests/path.go | 14 +-- coreiface/tests/pin.go | 13 +-- coreiface/tests/unixfs.go | 19 ++-- coreiface/unixfs.go | 17 ++-- 16 files changed, 287 insertions(+), 273 deletions(-) create mode 100644 coreiface/path/path.go diff --git a/coreiface/block.go b/coreiface/block.go index 587ad339f6..9f0ad9cbb4 100644 --- a/coreiface/block.go +++ b/coreiface/block.go @@ -2,9 +2,10 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "io" - options "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/options" ) // BlockStat contains information about a block @@ -13,7 +14,7 @@ type BlockStat interface { Size() int // Path returns path to the block - Path() ResolvedPath + Path() path.ResolvedPath } // BlockAPI specifies the interface to the block layer @@ -22,15 +23,15 @@ type BlockAPI interface { Put(context.Context, io.Reader, ...options.BlockPutOption) (BlockStat, error) // Get attempts to resolve the path and return a reader for data in the block - Get(context.Context, Path) (io.Reader, error) + Get(context.Context, path.Path) (io.Reader, error) // Rm removes the block specified by the path from local blockstore. // By default an error will be returned if the block can't be found locally. // // NOTE: If the specified block is pinned it won't be removed and no error // will be returned - Rm(context.Context, Path, ...options.BlockRmOption) error + Rm(context.Context, path.Path, ...options.BlockRmOption) error // Stat returns information on - Stat(context.Context, Path) (BlockStat, error) + Stat(context.Context, path.Path) (BlockStat, error) } diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index f3433c0890..bef3ce01fc 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -4,6 +4,7 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" @@ -43,11 +44,11 @@ type CoreAPI interface { PubSub() PubSubAPI // ResolvePath resolves the path using Unixfs resolver - ResolvePath(context.Context, Path) (ResolvedPath, error) + ResolvePath(context.Context, path.Path) (path.ResolvedPath, error) // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node - ResolveNode(context.Context, Path) (ipld.Node, error) + ResolveNode(context.Context, path.Path) (ipld.Node, error) // WithOptions creates new instance of CoreAPI based on this instance with // a set of options applied diff --git a/coreiface/dht.go b/coreiface/dht.go index d1ae05125d..0cb7893ef3 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -2,10 +2,11 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" ) @@ -19,8 +20,8 @@ type DhtAPI interface { // FindProviders finds peers in the DHT who can provide a specific value // given a key. - FindProviders(context.Context, Path, ...options.DhtFindProvidersOption) (<-chan pstore.PeerInfo, error) + FindProviders(context.Context, path.Path, ...options.DhtFindProvidersOption) (<-chan pstore.PeerInfo, error) // Provide announces to the network that you are providing given values - Provide(context.Context, Path, ...options.DhtProvideOption) error + Provide(context.Context, path.Path, ...options.DhtProvideOption) error } diff --git a/coreiface/key.go b/coreiface/key.go index 78c29d2684..e7fb3f4427 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -2,8 +2,9 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" - options "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/options" "github.com/libp2p/go-libp2p-peer" ) @@ -14,7 +15,7 @@ type Key interface { Name() string // Path returns key path - Path() Path + Path() path.Path // ID returns key PeerID ID() peer.ID diff --git a/coreiface/name.go b/coreiface/name.go index 51b005b7ef..3dc9f68783 100644 --- a/coreiface/name.go +++ b/coreiface/name.go @@ -3,8 +3,9 @@ package iface import ( "context" "errors" + path "github.com/ipfs/interface-go-ipfs-core/path" - options "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/options" ) var ErrResolveFailed = errors.New("could not resolve name") @@ -14,11 +15,11 @@ type IpnsEntry interface { // Name returns IpnsEntry name Name() string // Value returns IpnsEntry value - Value() Path + Value() path.Path } type IpnsResult struct { - Path + path.Path Err error } @@ -32,10 +33,10 @@ type IpnsResult struct { // You can use .Key API to list and generate more names and their respective keys. type NameAPI interface { // Publish announces new IPNS name - Publish(ctx context.Context, path Path, opts ...options.NamePublishOption) (IpnsEntry, error) + Publish(ctx context.Context, path path.Path, opts ...options.NamePublishOption) (IpnsEntry, error) // Resolve attempts to resolve the newest version of the specified name - Resolve(ctx context.Context, name string, opts ...options.NameResolveOption) (Path, error) + Resolve(ctx context.Context, name string, opts ...options.NameResolveOption) (path.Path, error) // Search is a version of Resolve which outputs paths as they are discovered, // reducing the time to first entry diff --git a/coreiface/object.go b/coreiface/object.go index 4f9652fb1d..3e4b7e0876 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -2,11 +2,12 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "io" - options "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/options" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" ) @@ -58,11 +59,11 @@ type ObjectChange struct { // Before holds the link path before the change. Note that when a link is // added, this will be nil. - Before ResolvedPath + Before path.ResolvedPath // After holds the link path after the change. Note that when a link is // removed, this will be nil. - After ResolvedPath + After path.ResolvedPath } // ObjectAPI specifies the interface to MerkleDAG and contains useful utilities @@ -72,35 +73,35 @@ type ObjectAPI interface { New(context.Context, ...options.ObjectNewOption) (ipld.Node, error) // Put imports the data into merkledag - Put(context.Context, io.Reader, ...options.ObjectPutOption) (ResolvedPath, error) + Put(context.Context, io.Reader, ...options.ObjectPutOption) (path.ResolvedPath, error) // Get returns the node for the path - Get(context.Context, Path) (ipld.Node, error) + Get(context.Context, path.Path) (ipld.Node, error) // Data returns reader for data of the node - Data(context.Context, Path) (io.Reader, error) + Data(context.Context, path.Path) (io.Reader, error) // Links returns lint or links the node contains - Links(context.Context, Path) ([]*ipld.Link, error) + Links(context.Context, path.Path) ([]*ipld.Link, error) // Stat returns information about the node - Stat(context.Context, Path) (*ObjectStat, error) + Stat(context.Context, path.Path) (*ObjectStat, error) // AddLink adds a link under the specified path. child path can point to a // subdirectory within the patent which must be present (can be overridden // with WithCreate option). - AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (ResolvedPath, error) + AddLink(ctx context.Context, base path.Path, name string, child path.Path, opts ...options.ObjectAddLinkOption) (path.ResolvedPath, error) // RmLink removes a link from the node - RmLink(ctx context.Context, base Path, link string) (ResolvedPath, error) + RmLink(ctx context.Context, base path.Path, link string) (path.ResolvedPath, error) // AppendData appends data to the node - AppendData(context.Context, Path, io.Reader) (ResolvedPath, error) + AppendData(context.Context, path.Path, io.Reader) (path.ResolvedPath, error) // SetData sets the data contained in the node - SetData(context.Context, Path, io.Reader) (ResolvedPath, error) + SetData(context.Context, path.Path, io.Reader) (path.ResolvedPath, error) // Diff returns a set of changes needed to transform the first object into the // second. - Diff(context.Context, Path, Path) ([]ObjectChange, error) + Diff(context.Context, path.Path, path.Path) ([]ObjectChange, error) } diff --git a/coreiface/path.go b/coreiface/path.go index ede190df7d..198651129c 100644 --- a/coreiface/path.go +++ b/coreiface/path.go @@ -1,201 +1,4 @@ package iface -import ( - "strings" - - cid "github.com/ipfs/go-cid" - ipfspath "github.com/ipfs/go-path" -) - //TODO: merge with ipfspath so we don't depend on it -// Path is a generic wrapper for paths used in the API. A path can be resolved -// to a CID using one of Resolve functions in the API. -// -// Paths must be prefixed with a valid prefix: -// -// * /ipfs - Immutable unixfs path (files) -// * /ipld - Immutable ipld path (data) -// * /ipns - Mutable names. Usually resolves to one of the immutable paths -//TODO: /local (MFS) -type Path interface { - // String returns the path as a string. - String() string - - // Namespace returns the first component of the path. - // - // For example path "/ipfs/QmHash", calling Namespace() will return "ipfs" - // - // Calling this method on invalid paths (IsValid() != nil) will result in - // empty string - Namespace() string - - // Mutable returns false if the data pointed to by this path in guaranteed - // to not change. - // - // Note that resolved mutable path can be immutable. - Mutable() bool - - // IsValid checks if this path is a valid ipfs Path, returning nil iff it is - // valid - IsValid() error -} - -// ResolvedPath is a path which was resolved to the last resolvable node. -// ResolvedPaths are guaranteed to return nil from `IsValid` -type ResolvedPath interface { - // Cid returns the CID of the node referenced by the path. Remainder of the - // path is guaranteed to be within the node. - // - // Examples: - // If you have 3 linked objects: QmRoot -> A -> B: - // - // cidB := {"foo": {"bar": 42 }} - // cidA := {"B": {"/": cidB }} - // cidRoot := {"A": {"/": cidA }} - // - // And resolve paths: - // - // * "/ipfs/${cidRoot}" - // * Calling Cid() will return `cidRoot` - // * Calling Root() will return `cidRoot` - // * Calling Remainder() will return `` - // - // * "/ipfs/${cidRoot}/A" - // * Calling Cid() will return `cidA` - // * Calling Root() will return `cidRoot` - // * Calling Remainder() will return `` - // - // * "/ipfs/${cidRoot}/A/B/foo" - // * Calling Cid() will return `cidB` - // * Calling Root() will return `cidRoot` - // * Calling Remainder() will return `foo` - // - // * "/ipfs/${cidRoot}/A/B/foo/bar" - // * Calling Cid() will return `cidB` - // * Calling Root() will return `cidRoot` - // * Calling Remainder() will return `foo/bar` - Cid() cid.Cid - - // Root returns the CID of the root object of the path - // - // Example: - // If you have 3 linked objects: QmRoot -> A -> B, and resolve path - // "/ipfs/QmRoot/A/B", the Root method will return the CID of object QmRoot - // - // For more examples see the documentation of Cid() method - Root() cid.Cid - - // Remainder returns unresolved part of the path - // - // Example: - // If you have 2 linked objects: QmRoot -> A, where A is a CBOR node - // containing the following data: - // - // {"foo": {"bar": 42 }} - // - // When resolving "/ipld/QmRoot/A/foo/bar", Remainder will return "foo/bar" - // - // For more examples see the documentation of Cid() method - Remainder() string - - Path -} - -// path implements coreiface.Path -type path struct { - path string -} - -// resolvedPath implements coreiface.resolvedPath -type resolvedPath struct { - path - cid cid.Cid - root cid.Cid - remainder string -} - -// Join appends provided segments to the base path -func Join(base Path, a ...string) Path { - s := strings.Join(append([]string{base.String()}, a...), "/") - return &path{path: s} -} - -// IpfsPath creates new /ipfs path from the provided CID -func IpfsPath(c cid.Cid) ResolvedPath { - return &resolvedPath{ - path: path{"/ipfs/" + c.String()}, - cid: c, - root: c, - remainder: "", - } -} - -// IpldPath creates new /ipld path from the provided CID -func IpldPath(c cid.Cid) ResolvedPath { - return &resolvedPath{ - path: path{"/ipld/" + c.String()}, - cid: c, - root: c, - remainder: "", - } -} - -// ParsePath parses string path to a Path -func ParsePath(p string) Path { - if pp, err := ipfspath.ParsePath(p); err == nil { - p = pp.String() - } - - return &path{path: p} -} - -// NewResolvedPath creates new ResolvedPath. This function performs no checks -// and is intended to be used by resolver implementations. Incorrect inputs may -// cause panics. Handle with care. -func NewResolvedPath(ipath ipfspath.Path, c cid.Cid, root cid.Cid, remainder string) ResolvedPath { - return &resolvedPath{ - path: path{ipath.String()}, - cid: c, - root: root, - remainder: remainder, - } -} - -func (p *path) String() string { - return p.path -} - -func (p *path) Namespace() string { - ip, err := ipfspath.ParsePath(p.path) - if err != nil { - return "" - } - - if len(ip.Segments()) < 1 { - panic("path without namespace") //this shouldn't happen under any scenario - } - return ip.Segments()[0] -} - -func (p *path) Mutable() bool { - //TODO: MFS: check for /local - return p.Namespace() == "ipns" -} - -func (p *path) IsValid() error { - _, err := ipfspath.ParsePath(p.path) - return err -} - -func (p *resolvedPath) Cid() cid.Cid { - return p.cid -} - -func (p *resolvedPath) Root() cid.Cid { - return p.root -} - -func (p *resolvedPath) Remainder() string { - return p.remainder -} diff --git a/coreiface/path/path.go b/coreiface/path/path.go new file mode 100644 index 0000000000..414d454fa6 --- /dev/null +++ b/coreiface/path/path.go @@ -0,0 +1,199 @@ +package path + +import ( + "strings" + + cid "github.com/ipfs/go-cid" + ipfspath "github.com/ipfs/go-path" +) + +// Path is a generic wrapper for paths used in the API. A path can be resolved +// to a CID using one of Resolve functions in the API. +// +// Paths must be prefixed with a valid prefix: +// +// * /ipfs - Immutable unixfs path (files) +// * /ipld - Immutable ipld path (data) +// * /ipns - Mutable names. Usually resolves to one of the immutable paths +//TODO: /local (MFS) +type Path interface { + // String returns the path as a string. + String() string + + // Namespace returns the first component of the path. + // + // For example path "/ipfs/QmHash", calling Namespace() will return "ipfs" + // + // Calling this method on invalid paths (IsValid() != nil) will result in + // empty string + Namespace() string + + // Mutable returns false if the data pointed to by this path in guaranteed + // to not change. + // + // Note that resolved mutable path can be immutable. + Mutable() bool + + // IsValid checks if this path is a valid ipfs Path, returning nil iff it is + // valid + IsValid() error +} + +// ResolvedPath is a path which was resolved to the last resolvable node. +// ResolvedPaths are guaranteed to return nil from `IsValid` +type ResolvedPath interface { + // Cid returns the CID of the node referenced by the path. Remainder of the + // path is guaranteed to be within the node. + // + // Examples: + // If you have 3 linked objects: QmRoot -> A -> B: + // + // cidB := {"foo": {"bar": 42 }} + // cidA := {"B": {"/": cidB }} + // cidRoot := {"A": {"/": cidA }} + // + // And resolve paths: + // + // * "/ipfs/${cidRoot}" + // * Calling Cid() will return `cidRoot` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `` + // + // * "/ipfs/${cidRoot}/A" + // * Calling Cid() will return `cidA` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `` + // + // * "/ipfs/${cidRoot}/A/B/foo" + // * Calling Cid() will return `cidB` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `foo` + // + // * "/ipfs/${cidRoot}/A/B/foo/bar" + // * Calling Cid() will return `cidB` + // * Calling Root() will return `cidRoot` + // * Calling Remainder() will return `foo/bar` + Cid() cid.Cid + + // Root returns the CID of the root object of the path + // + // Example: + // If you have 3 linked objects: QmRoot -> A -> B, and resolve path + // "/ipfs/QmRoot/A/B", the Root method will return the CID of object QmRoot + // + // For more examples see the documentation of Cid() method + Root() cid.Cid + + // Remainder returns unresolved part of the path + // + // Example: + // If you have 2 linked objects: QmRoot -> A, where A is a CBOR node + // containing the following data: + // + // {"foo": {"bar": 42 }} + // + // When resolving "/ipld/QmRoot/A/foo/bar", Remainder will return "foo/bar" + // + // For more examples see the documentation of Cid() method + Remainder() string + + Path +} + +// path implements coreiface.Path +type path struct { + path string +} + +// resolvedPath implements coreiface.resolvedPath +type resolvedPath struct { + path + cid cid.Cid + root cid.Cid + remainder string +} + +// Join appends provided segments to the base path +func Join(base Path, a ...string) Path { + s := strings.Join(append([]string{base.String()}, a...), "/") + return &path{path: s} +} + +// IpfsPath creates new /ipfs path from the provided CID +func IpfsPath(c cid.Cid) ResolvedPath { + return &resolvedPath{ + path: path{"/ipfs/" + c.String()}, + cid: c, + root: c, + remainder: "", + } +} + +// IpldPath creates new /ipld path from the provided CID +func IpldPath(c cid.Cid) ResolvedPath { + return &resolvedPath{ + path: path{"/ipld/" + c.String()}, + cid: c, + root: c, + remainder: "", + } +} + +// ParsePath parses string path to a Path +func ParsePath(p string) Path { + if pp, err := ipfspath.ParsePath(p); err == nil { + p = pp.String() + } + + return &path{path: p} +} + +// NewResolvedPath creates new ResolvedPath. This function performs no checks +// and is intended to be used by resolver implementations. Incorrect inputs may +// cause panics. Handle with care. +func NewResolvedPath(ipath ipfspath.Path, c cid.Cid, root cid.Cid, remainder string) ResolvedPath { + return &resolvedPath{ + path: path{ipath.String()}, + cid: c, + root: root, + remainder: remainder, + } +} + +func (p *path) String() string { + return p.path +} + +func (p *path) Namespace() string { + ip, err := ipfspath.ParsePath(p.path) + if err != nil { + return "" + } + + if len(ip.Segments()) < 1 { + panic("path without namespace") // this shouldn't happen under any scenario + } + return ip.Segments()[0] +} + +func (p *path) Mutable() bool { + // TODO: MFS: check for /local + return p.Namespace() == "ipns" +} + +func (p *path) IsValid() error { + _, err := ipfspath.ParsePath(p.path) + return err +} + +func (p *resolvedPath) Cid() cid.Cid { + return p.cid +} + +func (p *resolvedPath) Root() cid.Cid { + return p.root +} + +func (p *resolvedPath) Remainder() string { + return p.remainder +} diff --git a/coreiface/pin.go b/coreiface/pin.go index 6a7dab4137..736b2d68b9 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -2,14 +2,15 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" - options "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/options" ) // Pin holds information about pinned resource type Pin interface { // Path to the pinned object - Path() ResolvedPath + Path() path.ResolvedPath // Type of the pin Type() string @@ -27,7 +28,7 @@ type PinStatus interface { // BadPinNode is a node that has been marked as bad by Pin.Verify type BadPinNode interface { // Path is the path of the node - Path() ResolvedPath + Path() path.ResolvedPath // Err is the reason why the node has been marked as bad Err() error @@ -37,17 +38,17 @@ type BadPinNode interface { type PinAPI interface { // Add creates new pin, be default recursive - pinning the whole referenced // tree - Add(context.Context, Path, ...options.PinAddOption) error + Add(context.Context, path.Path, ...options.PinAddOption) error // Ls returns list of pinned objects on this node Ls(context.Context, ...options.PinLsOption) ([]Pin, error) // Rm removes pin for object specified by the path - Rm(context.Context, Path, ...options.PinRmOption) error + Rm(context.Context, path.Path, ...options.PinRmOption) error // Update changes one pin to another, skipping checks for matching paths in // the old tree - Update(ctx context.Context, from Path, to Path, opts ...options.PinUpdateOption) error + Update(ctx context.Context, from path.Path, to path.Path, opts ...options.PinUpdateOption) error // Verify verifies the integrity of pinned objects Verify(context.Context) (<-chan PinStatus, error) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 96319b4887..59b49d5672 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -2,6 +2,7 @@ package tests import ( "context" + "github.com/ipfs/interface-go-ipfs-core/path" "io/ioutil" "strings" "testing" @@ -110,7 +111,7 @@ func (tp *provider) TestBlockGet(t *testing.T) { t.Error("didn't get correct data back") } - p := coreiface.ParsePath("/ipfs/" + res.Path().Cid().String()) + p := path.ParsePath("/ipfs/" + res.Path().Cid().String()) rp, err := api.ResolvePath(ctx, p) if err != nil { diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index a17296d1d2..0abcee32f8 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -2,8 +2,9 @@ package tests import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "math" - "path" + gopath "path" "strings" "testing" @@ -113,7 +114,7 @@ func (tp *provider) TestDagPath(t *testing.T) { t.Fatal(err) } - p := coreiface.ParsePath(path.Join(nd.Cid().String(), "lnk")) + p := path.ParsePath(gopath.Join(nd.Cid().String(), "lnk")) rp, err := api.ResolvePath(ctx, p) if err != nil { diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index c9e99a584a..98ae6853ee 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -2,9 +2,10 @@ package tests import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "io" "math/rand" - "path" + gopath "path" "testing" "time" @@ -30,18 +31,18 @@ func (tp *provider) TestName(t *testing.T) { var rnd = rand.New(rand.NewSource(0x62796532303137)) -func addTestObject(ctx context.Context, api coreiface.CoreAPI) (coreiface.Path, error) { +func addTestObject(ctx context.Context, api coreiface.CoreAPI) (path.Path, error) { return api.Unixfs().Add(ctx, files.NewReaderFile(&io.LimitedReader{R: rnd, N: 4092})) } -func appendPath(p coreiface.Path, sub string) coreiface.Path { - return coreiface.ParsePath(path.Join(p.String(), sub)) +func appendPath(p path.Path, sub string) path.Path { + return path.ParsePath(gopath.Join(p.String(), sub)) } func (tp *provider) TestPublishResolve(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - init := func() (coreiface.CoreAPI, coreiface.Path) { + init := func() (coreiface.CoreAPI, path.Path) { apis, err := tp.MakeAPISwarm(ctx, true, 5) if err != nil { t.Fatal(err) @@ -56,7 +57,6 @@ func (tp *provider) TestPublishResolve(t *testing.T) { } return api, p } - run := func(t *testing.T, ropts []opt.NameResolveOption) { t.Run("basic", func(t *testing.T) { api, p := init() diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index f5b0ee3489..685f469981 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -2,11 +2,11 @@ package tests import ( "context" + "github.com/ipfs/interface-go-ipfs-core/path" "math" "strings" "testing" - coreiface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" ipldcbor "github.com/ipfs/go-ipld-cbor" @@ -75,7 +75,7 @@ func (tp *provider) TestPathRemainder(t *testing.T) { t.Fatal(err) } - rp1, err := api.ResolvePath(ctx, coreiface.ParsePath(nd.String()+"/foo/bar")) + rp1, err := api.ResolvePath(ctx, path.ParsePath(nd.String()+"/foo/bar")) if err != nil { t.Fatal(err) } @@ -106,7 +106,7 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { t.Fatal(err) } - rp1, err := api.ResolvePath(ctx, coreiface.ParsePath(nd.Cid().String())) + rp1, err := api.ResolvePath(ctx, path.ParsePath(nd.Cid().String())) if err != nil { t.Fatal(err) } @@ -137,7 +137,7 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { t.Fatal(err) } - _, err = api.ResolvePath(ctx, coreiface.ParsePath("/ipld/"+nd.Cid().String()+"/bar/baz")) + _, err = api.ResolvePath(ctx, path.ParsePath("/ipld/"+nd.Cid().String()+"/bar/baz")) if err == nil || !strings.Contains(err.Error(), "no such link found") { t.Fatalf("unexpected error: %s", err) } @@ -173,7 +173,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(err) } - rp, err := api.ResolvePath(ctx, coreiface.ParsePath("/ipld/"+nd.Cid().String()+"/foo")) + rp, err := api.ResolvePath(ctx, path.ParsePath("/ipld/"+nd.Cid().String()+"/foo")) if err != nil { t.Fatal(err) } @@ -188,9 +188,9 @@ func (tp *provider) TestPathRoot(t *testing.T) { } func (tp *provider) TestPathJoin(t *testing.T) { - p1 := coreiface.ParsePath("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") + p1 := path.ParsePath("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") - if coreiface.Join(p1, "foo").String() != "/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz/foo" { + if path.Join(p1, "foo").String() != "/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz/foo" { t.Error("unexpected path") } } diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index ff6f98e358..344db65e20 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -2,6 +2,7 @@ package tests import ( "context" + "github.com/ipfs/interface-go-ipfs-core/path" "math" "strings" "testing" @@ -127,12 +128,12 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Fatal(err) } - err = api.Pin().Add(ctx, iface.IpldPath(nd2.Cid())) + err = api.Pin().Add(ctx, path.IpldPath(nd2.Cid())) if err != nil { t.Fatal(err) } - err = api.Pin().Add(ctx, iface.IpldPath(nd3.Cid()), opt.Pin.Recursive(false)) + err = api.Pin().Add(ctx, path.IpldPath(nd3.Cid()), opt.Pin.Recursive(false)) if err != nil { t.Fatal(err) } @@ -155,8 +156,8 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - if list[0].Path().String() != iface.IpldPath(nd3.Cid()).String() { - t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpfsPath(nd2.Cid()).String()) + if list[0].Path().String() != path.IpldPath(nd3.Cid()).String() { + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpfsPath(nd2.Cid()).String()) } list, err = api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) @@ -168,8 +169,8 @@ func (tp *provider) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - if list[0].Path().String() != iface.IpldPath(nd2.Cid()).String() { - t.Errorf("unexpected path, %s != %s", list[0].Path().String(), iface.IpldPath(nd3.Cid()).String()) + if list[0].Path().String() != path.IpldPath(nd2.Cid()).String() { + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpldPath(nd3.Cid()).String()) } list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 15cb8abc83..d2d9f85b85 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -5,6 +5,7 @@ import ( "context" "encoding/hex" "fmt" + "github.com/ipfs/interface-go-ipfs-core/path" "io" "io/ioutil" "math" @@ -101,12 +102,12 @@ func (tp *provider) TestAdd(t *testing.T) { t.Fatal(err) } - p := func(h string) coreiface.ResolvedPath { + p := func(h string) path.ResolvedPath { c, err := cid.Parse(h) if err != nil { t.Fatal(err) } - return coreiface.IpfsPath(c) + return path.IpfsPath(c) } rf, err := ioutil.TempFile(os.TempDir(), "unixfs-add-real") @@ -592,7 +593,7 @@ func (tp *provider) TestGetEmptyFile(t *testing.T) { t.Fatal(err) } - emptyFilePath := coreiface.ParsePath(emptyFile) + emptyFilePath := path.ParsePath(emptyFile) r, err := api.Unixfs().Get(ctx, emptyFilePath) if err != nil { @@ -621,18 +622,18 @@ func (tp *provider) TestGetDir(t *testing.T) { if err != nil { t.Fatal(err) } - p := coreiface.IpfsPath(edir.Cid()) + p := path.IpfsPath(edir.Cid()) emptyDir, err := api.Object().New(ctx, options.Object.Type("unixfs-dir")) if err != nil { t.Fatal(err) } - if p.String() != coreiface.IpfsPath(emptyDir.Cid()).String() { + if p.String() != path.IpfsPath(emptyDir.Cid()).String() { t.Fatalf("expected path %s, got: %s", emptyDir.Cid(), p.String()) } - r, err := api.Unixfs().Get(ctx, coreiface.IpfsPath(emptyDir.Cid())) + r, err := api.Unixfs().Get(ctx, path.IpfsPath(emptyDir.Cid())) if err != nil { t.Fatal(err) } @@ -656,7 +657,7 @@ func (tp *provider) TestGetNonUnixfs(t *testing.T) { t.Fatal(err) } - _, err = api.Unixfs().Get(ctx, coreiface.IpfsPath(nd.Cid())) + _, err = api.Unixfs().Get(ctx, path.IpfsPath(nd.Cid())) if !strings.Contains(err.Error(), "proto: required field") { t.Fatalf("expected protobuf error, got: %s", err) } @@ -782,7 +783,7 @@ func (tp *provider) TestLsEmptyDir(t *testing.T) { t.Fatal(err) } - links, err := api.Unixfs().Ls(ctx, coreiface.IpfsPath(emptyDir.Cid())) + links, err := api.Unixfs().Ls(ctx, path.IpfsPath(emptyDir.Cid())) if err != nil { t.Fatal(err) } @@ -811,7 +812,7 @@ func (tp *provider) TestLsNonUnixfs(t *testing.T) { t.Fatal(err) } - links, err := api.Unixfs().Ls(ctx, coreiface.IpfsPath(nd.Cid())) + links, err := api.Unixfs().Ls(ctx, path.IpfsPath(nd.Cid())) if err != nil { t.Fatal(err) } diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index f9508f1385..0b27519f37 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -3,16 +3,17 @@ package iface import ( "context" "github.com/ipfs/interface-go-ipfs-core/options" + path "github.com/ipfs/interface-go-ipfs-core/path" - cid "github.com/ipfs/go-cid" - files "github.com/ipfs/go-ipfs-files" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-ipfs-files" ) type AddEvent struct { Name string - Path ResolvedPath `json:",omitempty"` - Bytes int64 `json:",omitempty"` - Size string `json:",omitempty"` + Path path.ResolvedPath `json:",omitempty"` + Bytes int64 `json:",omitempty"` + Size string `json:",omitempty"` } // FileType is an enum of possible UnixFS file types. @@ -64,15 +65,15 @@ type UnixfsAPI interface { // Add imports the data from the reader into merkledag file // // TODO: a long useful comment on how to use this for many different scenarios - Add(context.Context, files.Node, ...options.UnixfsAddOption) (ResolvedPath, error) + Add(context.Context, files.Node, ...options.UnixfsAddOption) (path.ResolvedPath, error) // Get returns a read-only handle to a file tree referenced by a path // // Note that some implementations of this API may apply the specified context // to operations performed on the returned file - Get(context.Context, Path) (files.Node, error) + Get(context.Context, path.Path) (files.Node, error) // Ls returns the list of links in a directory. Links aren't guaranteed to be // returned in order - Ls(context.Context, Path, ...options.UnixfsLsOption) (<-chan DirEntry, error) + Ls(context.Context, path.Path, ...options.UnixfsLsOption) (<-chan DirEntry, error) } From fbc9ab8769cbaac70a6459c33973c0d894e85126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 26 Mar 2019 15:09:08 +0100 Subject: [PATCH 2677/3147] path: rename ParsePath and ResolvedPath This commit was moved from ipfs/interface-go-ipfs-core@21a72398d98125cae4fcef33cc80ed4a1f3be22c --- coreiface/block.go | 2 +- coreiface/coreapi.go | 2 +- coreiface/object.go | 14 +++++++------- coreiface/path.go | 4 ---- coreiface/path/path.go | 16 ++++++++-------- coreiface/pin.go | 4 ++-- coreiface/tests/block.go | 2 +- coreiface/tests/dag.go | 2 +- coreiface/tests/name.go | 2 +- coreiface/tests/path.go | 10 +++++----- coreiface/tests/unixfs.go | 4 ++-- coreiface/unixfs.go | 8 ++++---- 12 files changed, 33 insertions(+), 37 deletions(-) delete mode 100644 coreiface/path.go diff --git a/coreiface/block.go b/coreiface/block.go index 9f0ad9cbb4..b105b079df 100644 --- a/coreiface/block.go +++ b/coreiface/block.go @@ -14,7 +14,7 @@ type BlockStat interface { Size() int // Path returns path to the block - Path() path.ResolvedPath + Path() path.Resolved } // BlockAPI specifies the interface to the block layer diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index bef3ce01fc..12cb166a88 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -44,7 +44,7 @@ type CoreAPI interface { PubSub() PubSubAPI // ResolvePath resolves the path using Unixfs resolver - ResolvePath(context.Context, path.Path) (path.ResolvedPath, error) + ResolvePath(context.Context, path.Path) (path.Resolved, error) // ResolveNode resolves the path (if not resolved already) using Unixfs // resolver, gets and returns the resolved Node diff --git a/coreiface/object.go b/coreiface/object.go index 3e4b7e0876..86536d4210 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -59,11 +59,11 @@ type ObjectChange struct { // Before holds the link path before the change. Note that when a link is // added, this will be nil. - Before path.ResolvedPath + Before path.Resolved // After holds the link path after the change. Note that when a link is // removed, this will be nil. - After path.ResolvedPath + After path.Resolved } // ObjectAPI specifies the interface to MerkleDAG and contains useful utilities @@ -73,7 +73,7 @@ type ObjectAPI interface { New(context.Context, ...options.ObjectNewOption) (ipld.Node, error) // Put imports the data into merkledag - Put(context.Context, io.Reader, ...options.ObjectPutOption) (path.ResolvedPath, error) + Put(context.Context, io.Reader, ...options.ObjectPutOption) (path.Resolved, error) // Get returns the node for the path Get(context.Context, path.Path) (ipld.Node, error) @@ -90,16 +90,16 @@ type ObjectAPI interface { // AddLink adds a link under the specified path. child path can point to a // subdirectory within the patent which must be present (can be overridden // with WithCreate option). - AddLink(ctx context.Context, base path.Path, name string, child path.Path, opts ...options.ObjectAddLinkOption) (path.ResolvedPath, error) + AddLink(ctx context.Context, base path.Path, name string, child path.Path, opts ...options.ObjectAddLinkOption) (path.Resolved, error) // RmLink removes a link from the node - RmLink(ctx context.Context, base path.Path, link string) (path.ResolvedPath, error) + RmLink(ctx context.Context, base path.Path, link string) (path.Resolved, error) // AppendData appends data to the node - AppendData(context.Context, path.Path, io.Reader) (path.ResolvedPath, error) + AppendData(context.Context, path.Path, io.Reader) (path.Resolved, error) // SetData sets the data contained in the node - SetData(context.Context, path.Path, io.Reader) (path.ResolvedPath, error) + SetData(context.Context, path.Path, io.Reader) (path.Resolved, error) // Diff returns a set of changes needed to transform the first object into the // second. diff --git a/coreiface/path.go b/coreiface/path.go deleted file mode 100644 index 198651129c..0000000000 --- a/coreiface/path.go +++ /dev/null @@ -1,4 +0,0 @@ -package iface - -//TODO: merge with ipfspath so we don't depend on it - diff --git a/coreiface/path/path.go b/coreiface/path/path.go index 414d454fa6..01b1673b1d 100644 --- a/coreiface/path/path.go +++ b/coreiface/path/path.go @@ -39,9 +39,9 @@ type Path interface { IsValid() error } -// ResolvedPath is a path which was resolved to the last resolvable node. +// Resolved is a path which was resolved to the last resolvable node. // ResolvedPaths are guaranteed to return nil from `IsValid` -type ResolvedPath interface { +type Resolved interface { // Cid returns the CID of the node referenced by the path. Remainder of the // path is guaranteed to be within the node. // @@ -120,7 +120,7 @@ func Join(base Path, a ...string) Path { } // IpfsPath creates new /ipfs path from the provided CID -func IpfsPath(c cid.Cid) ResolvedPath { +func IpfsPath(c cid.Cid) Resolved { return &resolvedPath{ path: path{"/ipfs/" + c.String()}, cid: c, @@ -130,7 +130,7 @@ func IpfsPath(c cid.Cid) ResolvedPath { } // IpldPath creates new /ipld path from the provided CID -func IpldPath(c cid.Cid) ResolvedPath { +func IpldPath(c cid.Cid) Resolved { return &resolvedPath{ path: path{"/ipld/" + c.String()}, cid: c, @@ -139,8 +139,8 @@ func IpldPath(c cid.Cid) ResolvedPath { } } -// ParsePath parses string path to a Path -func ParsePath(p string) Path { +// New parses string path to a Path +func New(p string) Path { if pp, err := ipfspath.ParsePath(p); err == nil { p = pp.String() } @@ -148,10 +148,10 @@ func ParsePath(p string) Path { return &path{path: p} } -// NewResolvedPath creates new ResolvedPath. This function performs no checks +// NewResolvedPath creates new Resolved path. This function performs no checks // and is intended to be used by resolver implementations. Incorrect inputs may // cause panics. Handle with care. -func NewResolvedPath(ipath ipfspath.Path, c cid.Cid, root cid.Cid, remainder string) ResolvedPath { +func NewResolvedPath(ipath ipfspath.Path, c cid.Cid, root cid.Cid, remainder string) Resolved { return &resolvedPath{ path: path{ipath.String()}, cid: c, diff --git a/coreiface/pin.go b/coreiface/pin.go index 736b2d68b9..7df2956f02 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -10,7 +10,7 @@ import ( // Pin holds information about pinned resource type Pin interface { // Path to the pinned object - Path() path.ResolvedPath + Path() path.Resolved // Type of the pin Type() string @@ -28,7 +28,7 @@ type PinStatus interface { // BadPinNode is a node that has been marked as bad by Pin.Verify type BadPinNode interface { // Path is the path of the node - Path() path.ResolvedPath + Path() path.Resolved // Err is the reason why the node has been marked as bad Err() error diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 59b49d5672..961ac722d6 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -111,7 +111,7 @@ func (tp *provider) TestBlockGet(t *testing.T) { t.Error("didn't get correct data back") } - p := path.ParsePath("/ipfs/" + res.Path().Cid().String()) + p := path.New("/ipfs/" + res.Path().Cid().String()) rp, err := api.ResolvePath(ctx, p) if err != nil { diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 0abcee32f8..fe92641f42 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -114,7 +114,7 @@ func (tp *provider) TestDagPath(t *testing.T) { t.Fatal(err) } - p := path.ParsePath(gopath.Join(nd.Cid().String(), "lnk")) + p := path.New(gopath.Join(nd.Cid().String(), "lnk")) rp, err := api.ResolvePath(ctx, p) if err != nil { diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 98ae6853ee..efaf1d3ae1 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -36,7 +36,7 @@ func addTestObject(ctx context.Context, api coreiface.CoreAPI) (path.Path, error } func appendPath(p path.Path, sub string) path.Path { - return path.ParsePath(gopath.Join(p.String(), sub)) + return path.New(gopath.Join(p.String(), sub)) } func (tp *provider) TestPublishResolve(t *testing.T) { diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 685f469981..4fd18bd206 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -75,7 +75,7 @@ func (tp *provider) TestPathRemainder(t *testing.T) { t.Fatal(err) } - rp1, err := api.ResolvePath(ctx, path.ParsePath(nd.String()+"/foo/bar")) + rp1, err := api.ResolvePath(ctx, path.New(nd.String()+"/foo/bar")) if err != nil { t.Fatal(err) } @@ -106,7 +106,7 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { t.Fatal(err) } - rp1, err := api.ResolvePath(ctx, path.ParsePath(nd.Cid().String())) + rp1, err := api.ResolvePath(ctx, path.New(nd.Cid().String())) if err != nil { t.Fatal(err) } @@ -137,7 +137,7 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { t.Fatal(err) } - _, err = api.ResolvePath(ctx, path.ParsePath("/ipld/"+nd.Cid().String()+"/bar/baz")) + _, err = api.ResolvePath(ctx, path.New("/ipld/"+nd.Cid().String()+"/bar/baz")) if err == nil || !strings.Contains(err.Error(), "no such link found") { t.Fatalf("unexpected error: %s", err) } @@ -173,7 +173,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { t.Fatal(err) } - rp, err := api.ResolvePath(ctx, path.ParsePath("/ipld/"+nd.Cid().String()+"/foo")) + rp, err := api.ResolvePath(ctx, path.New("/ipld/"+nd.Cid().String()+"/foo")) if err != nil { t.Fatal(err) } @@ -188,7 +188,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { } func (tp *provider) TestPathJoin(t *testing.T) { - p1 := path.ParsePath("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") + p1 := path.New("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") if path.Join(p1, "foo").String() != "/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz/foo" { t.Error("unexpected path") diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index d2d9f85b85..38fab7cd8b 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -102,7 +102,7 @@ func (tp *provider) TestAdd(t *testing.T) { t.Fatal(err) } - p := func(h string) path.ResolvedPath { + p := func(h string) path.Resolved { c, err := cid.Parse(h) if err != nil { t.Fatal(err) @@ -593,7 +593,7 @@ func (tp *provider) TestGetEmptyFile(t *testing.T) { t.Fatal(err) } - emptyFilePath := path.ParsePath(emptyFile) + emptyFilePath := path.New(emptyFile) r, err := api.Unixfs().Get(ctx, emptyFilePath) if err != nil { diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 0b27519f37..686c402987 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -11,9 +11,9 @@ import ( type AddEvent struct { Name string - Path path.ResolvedPath `json:",omitempty"` - Bytes int64 `json:",omitempty"` - Size string `json:",omitempty"` + Path path.Resolved `json:",omitempty"` + Bytes int64 `json:",omitempty"` + Size string `json:",omitempty"` } // FileType is an enum of possible UnixFS file types. @@ -65,7 +65,7 @@ type UnixfsAPI interface { // Add imports the data from the reader into merkledag file // // TODO: a long useful comment on how to use this for many different scenarios - Add(context.Context, files.Node, ...options.UnixfsAddOption) (path.ResolvedPath, error) + Add(context.Context, files.Node, ...options.UnixfsAddOption) (path.Resolved, error) // Get returns a read-only handle to a file tree referenced by a path // From a80c6053a9c9141c9eb3ee878a30af0cb74ee7d7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 4 Apr 2019 04:34:50 -0700 Subject: [PATCH 2678/3147] provider queue: don't repeatedly retry the same item if we fail License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-provider@00f05cb1d43629ce0f98fa134b1866ff2f2ab5a8 --- provider/queue.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/provider/queue.go b/provider/queue.go index c8982ff10f..b1d899cbf6 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -72,13 +72,14 @@ func (q *Queue) nextEntry() (datastore.Key, cid.Cid) { key := q.queueKey(q.head) value, err := q.ds.Get(key) - if err == datastore.ErrNotFound { - log.Warningf("Error missing entry in queue: %s", key) + if err != nil { + if err == datastore.ErrNotFound { + log.Warningf("Error missing entry in queue: %s", key) + } else { + log.Errorf("Error fetching from queue: %s", err) + } q.head++ // move on continue - } else if err != nil { - log.Warningf("Error fetching from queue: %s", err) - continue } c, err := cid.Parse(value) From a30c9f6649da45a4a7edba09364e11c6d3c5ef30 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Fri, 5 Apr 2019 09:52:12 -0700 Subject: [PATCH 2679/3147] Close provider on ipfs shutdown License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@dbfc1c39018ca456607615c030853eb9172f7eaf --- provider/offline.go | 4 ++++ provider/provider.go | 8 ++++++++ provider/queue.go | 18 +++++++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/provider/offline.go b/provider/offline.go index 029ddfa988..0c91ed2af7 100644 --- a/provider/offline.go +++ b/provider/offline.go @@ -14,3 +14,7 @@ func (op *offlineProvider) Run() {} func (op *offlineProvider) Provide(cid cid.Cid) error { return nil } + +func (op *offlineProvider) Close() error { + return nil +} diff --git a/provider/provider.go b/provider/provider.go index f9aa4ed782..67c5c6b6b9 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -20,6 +20,8 @@ type Provider interface { Run() // Provide takes a cid and makes an attempt to announce it to the network Provide(cid.Cid) error + // Close stops the provider + Close() error } type provider struct { @@ -39,6 +41,12 @@ func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.Conte } } +// Close stops the provider +func (p *provider) Close() error { + p.queue.Close() + return nil +} + // Start workers to handle provide requests. func (p *provider) Run() { p.handleAnnouncements() diff --git a/provider/queue.go b/provider/queue.go index b1d899cbf6..8fdfca8152 100644 --- a/provider/queue.go +++ b/provider/queue.go @@ -27,6 +27,8 @@ type Queue struct { ds datastore.Datastore // Must be threadsafe dequeue chan cid.Cid enqueue chan cid.Cid + close context.CancelFunc + closed chan struct{} } // NewQueue creates a queue for cids @@ -36,19 +38,29 @@ func NewQueue(ctx context.Context, name string, ds datastore.Datastore) (*Queue, if err != nil { return nil, err } + cancelCtx, cancel := context.WithCancel(ctx) q := &Queue{ name: name, - ctx: ctx, + ctx: cancelCtx, head: head, tail: tail, ds: namespaced, dequeue: make(chan cid.Cid), enqueue: make(chan cid.Cid), + close: cancel, + closed: make(chan struct{}, 1), } q.work() return q, nil } +// Close stops the queue +func (q *Queue) Close() error { + q.close() + <-q.closed + return nil +} + // Enqueue puts a cid in the queue func (q *Queue) Enqueue(cid cid.Cid) { select { @@ -103,6 +115,10 @@ func (q *Queue) work() { var k datastore.Key = datastore.Key{} var c cid.Cid = cid.Undef + defer func() { + close(q.closed) + }() + for { if c == cid.Undef { k, c = q.nextEntry() From d493b701942234de0168890c2625082ff382e1b3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 15 Apr 2019 21:58:51 -0700 Subject: [PATCH 2680/3147] fix: cleanup TestDhtProvide And fix for peer ID formatting changes. fixes https://github.com/ipfs/go-ipfs/pull/6222#issuecomment-483479039 This commit was moved from ipfs/interface-go-ipfs-core@29b26f5bcb322e936e67dfbb7b0a5264b7e23089 --- coreiface/tests/dht.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index 1793cd7384..5482b50b13 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -130,17 +130,17 @@ func (tp *provider) TestDhtProvide(t *testing.T) { t.Fatal(err) } - provider := <-out + _, ok := <-out + + if ok { + t.Fatal("did not expect to find any providers") + } self0, err := apis[0].Key().Self(ctx) if err != nil { t.Fatal(err) } - if provider.ID.String() != "" { - t.Errorf("got wrong provider: %s != %s", provider.ID.String(), self0.ID().String()) - } - err = apis[0].Dht().Provide(ctx, p) if err != nil { t.Fatal(err) @@ -151,7 +151,7 @@ func (tp *provider) TestDhtProvide(t *testing.T) { t.Fatal(err) } - provider = <-out + provider := <-out if provider.ID.String() != self0.ID().String() { t.Errorf("got wrong provider: %s != %s", provider.ID.String(), self0.ID().String()) From 597a5cc370527406a23d325644cf1321e449f12b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Apr 2019 03:44:32 +0200 Subject: [PATCH 2681/3147] Cleanup core package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@454a1503e463566e564b8aeb0af2bbac35f89d88 --- namesys/republisher/repub_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 8f0048c4c8..48a0b086f0 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/ipfs/go-ipfs/core" + "github.com/ipfs/go-ipfs/core/bootstrap" mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" @@ -45,7 +46,7 @@ func TestRepublish(t *testing.T) { t.Fatal(err) } - bsinf := core.BootstrapConfigWithPeers( + bsinf := bootstrap.BootstrapConfigWithPeers( []pstore.PeerInfo{ nodes[0].Peerstore.PeerInfo(nodes[0].Identity), }, From f30c65a3877c3a9f7be87adbdf54a92554f85c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Apr 2019 03:51:45 +0200 Subject: [PATCH 2682/3147] Move pathresolve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@2479384173ecb39a5b133b1a6178e6f82ee324b8 --- namesys/resolve/pathresolver_test.go | 32 ++++++++++++ namesys/resolve/resolve.go | 78 ++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 namesys/resolve/pathresolver_test.go create mode 100644 namesys/resolve/resolve.go diff --git a/namesys/resolve/pathresolver_test.go b/namesys/resolve/pathresolver_test.go new file mode 100644 index 0000000000..fe578b5d3f --- /dev/null +++ b/namesys/resolve/pathresolver_test.go @@ -0,0 +1,32 @@ +package resolve_test + +import ( + "testing" + + coremock "github.com/ipfs/go-ipfs/core/mock" + "github.com/ipfs/go-ipfs/namesys/resolve" + + path "github.com/ipfs/go-path" +) + +func TestResolveNoComponents(t *testing.T) { + n, err := coremock.NewMockNode() + if n == nil || err != nil { + t.Fatal("Should have constructed a mock node", err) + } + + _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipns/")) + if err != path.ErrNoComponents { + t.Fatal("Should error with no components (/ipns/).", err) + } + + _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipfs/")) + if err != path.ErrNoComponents { + t.Fatal("Should error with no components (/ipfs/).", err) + } + + _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/../..")) + if err != path.ErrBadPath { + t.Fatal("Should error with invalid path.", err) + } +} diff --git a/namesys/resolve/resolve.go b/namesys/resolve/resolve.go new file mode 100644 index 0000000000..bd1667fa41 --- /dev/null +++ b/namesys/resolve/resolve.go @@ -0,0 +1,78 @@ +package resolve + +import ( + "context" + "errors" + "strings" + + "github.com/ipfs/go-ipld-format" + log2 "github.com/ipfs/go-log" + logging "github.com/ipfs/go-log" + "github.com/ipfs/go-path" + "github.com/ipfs/go-path/resolver" + + "github.com/ipfs/go-ipfs/namesys" +) + +var log = logging.Logger("nsresolv") + +// ErrNoNamesys is an explicit error for when an IPFS node doesn't +// (yet) have a name system +var ErrNoNamesys = errors.New( + "core/resolve: no Namesys on IpfsNode - can't resolve ipns entry") + +// ResolveIPNS resolves /ipns paths +func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (path.Path, error) { + if strings.HasPrefix(p.String(), "/ipns/") { + evt := log.EventBegin(ctx, "resolveIpnsPath") + defer evt.Done() + // resolve ipns paths + + // TODO(cryptix): we should be able to query the local cache for the path + if nsys == nil { + evt.Append(log2.LoggableMap{"error": ErrNoNamesys.Error()}) + return "", ErrNoNamesys + } + + seg := p.Segments() + + if len(seg) < 2 || seg[1] == "" { // just "/" without further segments + evt.Append(log2.LoggableMap{"error": path.ErrNoComponents.Error()}) + return "", path.ErrNoComponents + } + + extensions := seg[2:] + resolvable, err := path.FromSegments("/", seg[0], seg[1]) + if err != nil { + evt.Append(log2.LoggableMap{"error": err.Error()}) + return "", err + } + + respath, err := nsys.Resolve(ctx, resolvable.String()) + if err != nil { + evt.Append(log2.LoggableMap{"error": err.Error()}) + return "", err + } + + segments := append(respath.Segments(), extensions...) + p, err = path.FromSegments("/", segments...) + if err != nil { + evt.Append(log2.LoggableMap{"error": err.Error()}) + return "", err + } + } + return p, nil +} + +// Resolve resolves the given path by parsing out protocol-specific +// entries (e.g. /ipns/) and then going through the /ipfs/ +// entries and returning the final node. +func Resolve(ctx context.Context, nsys namesys.NameSystem, r *resolver.Resolver, p path.Path) (format.Node, error) { + p, err := ResolveIPNS(ctx, nsys, p) + if err != nil { + return nil, err + } + + // ok, we have an IPFS path now (or what we'll treat as one) + return r.ResolvePath(ctx, p) +} From 20e11ccf03fb918347952186e34e439575bbca73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Apr 2019 16:56:45 +0200 Subject: [PATCH 2683/3147] Move option parsing to BuildCfg; fix imports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Łukasz Magiera This commit was moved from ipfs/go-namesys@38d5b8ede7111687c4c20f5c31ba068baa51d9eb --- namesys/resolve/resolve.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/namesys/resolve/resolve.go b/namesys/resolve/resolve.go index bd1667fa41..128619c65b 100644 --- a/namesys/resolve/resolve.go +++ b/namesys/resolve/resolve.go @@ -6,7 +6,6 @@ import ( "strings" "github.com/ipfs/go-ipld-format" - log2 "github.com/ipfs/go-log" logging "github.com/ipfs/go-log" "github.com/ipfs/go-path" "github.com/ipfs/go-path/resolver" @@ -30,34 +29,34 @@ func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (pat // TODO(cryptix): we should be able to query the local cache for the path if nsys == nil { - evt.Append(log2.LoggableMap{"error": ErrNoNamesys.Error()}) + evt.Append(logging.LoggableMap{"error": ErrNoNamesys.Error()}) return "", ErrNoNamesys } seg := p.Segments() if len(seg) < 2 || seg[1] == "" { // just "/" without further segments - evt.Append(log2.LoggableMap{"error": path.ErrNoComponents.Error()}) + evt.Append(logging.LoggableMap{"error": path.ErrNoComponents.Error()}) return "", path.ErrNoComponents } extensions := seg[2:] resolvable, err := path.FromSegments("/", seg[0], seg[1]) if err != nil { - evt.Append(log2.LoggableMap{"error": err.Error()}) + evt.Append(logging.LoggableMap{"error": err.Error()}) return "", err } respath, err := nsys.Resolve(ctx, resolvable.String()) if err != nil { - evt.Append(log2.LoggableMap{"error": err.Error()}) + evt.Append(logging.LoggableMap{"error": err.Error()}) return "", err } segments := append(respath.Segments(), extensions...) p, err = path.FromSegments("/", segments...) if err != nil { - evt.Append(log2.LoggableMap{"error": err.Error()}) + evt.Append(logging.LoggableMap{"error": err.Error()}) return "", err } } From 2afcfc942636613bd75d607bfe83a97de89020b7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Apr 2019 11:34:01 -0700 Subject: [PATCH 2684/3147] gc: cancel context We were canceling the context in `GarbageCollect` but some functions call `GC` directly. Move the context cancelation down to where we actually _need_ it. fixes #6279 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@8fd812606e1f74c79512ce0b4d2986063fa4493b --- pinning/pinner/gc/gc.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 12b0fadb22..bf8b7b10fa 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -39,6 +39,7 @@ type Result struct { // The routine then iterates over every block in the blockstore and // deletes any block that is not found in the marked set. func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []cid.Cid) <-chan Result { + ctx, cancel := context.WithCancel(ctx) elock := log.EventBegin(ctx, "GC.lockWait") unlocker := bs.GCLock() @@ -52,6 +53,7 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn output := make(chan Result, 128) go func() { + defer cancel() defer close(output) defer unlocker.Unlock() defer elock.Done() From 763b3d8a00d19fd1ba9d5b5b8825cbd7a7f01d1e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 7 May 2019 00:57:21 -0700 Subject: [PATCH 2685/3147] switch to base32 cidv1 by default This commit was moved from ipfs/interface-go-ipfs-core@6287246646853656271cbd190acab071950d4060 --- coreiface/tests/block.go | 4 ++-- coreiface/tests/dag.go | 6 +++--- coreiface/tests/unixfs.go | 24 ++++++++++++------------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 961ac722d6..34e47e90c8 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -61,7 +61,7 @@ func (tp *provider) TestBlockPutFormat(t *testing.T) { t.Fatal(err) } - if res.Path().Cid().String() != "zdpuAn4amuLWo8Widi5v6VQpuo2dnpnwbVE3oB6qqs7mDSeoa" { + if res.Path().Cid().String() != "bafyreiayl6g3gitr7ys7kyng7sjywlrgimdoymco3jiyab6rozecmoazne" { t.Errorf("got wrong cid: %s", res.Path().Cid().String()) } } @@ -79,7 +79,7 @@ func (tp *provider) TestBlockPutHash(t *testing.T) { t.Fatal(err) } - if res.Path().Cid().String() != "zBurKB9YZkcDf6xa53WBE8CFX4ydVqAyf9KPXBFZt5stJzEstaS8Hukkhu4gwpMtc1xHNDbzP7sPtQKyWsP3C8fbhkmrZ" { + if res.Path().Cid().String() != "bafyb2qgdh7w6dcq24u65xbtdoehyavegnpvxcqce7ttvs6ielgmwdfxrahmu37d33atik57x5y6s7d7qz32aasuwgirh3ocn6ywswqdifvu6e" { t.Errorf("got wrong cid: %s", res.Path().Cid().String()) } } diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index fe92641f42..0bb3aa487e 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -58,7 +58,7 @@ func (tp *provider) TestPut(t *testing.T) { t.Fatal(err) } - if nd.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + if nd.Cid().String() != "bafyreicnga62zhxnmnlt6ymq5hcbsg7gdhqdu6z4ehu3wpjhvqnflfy6nm" { t.Errorf("got wrong cid: %s", nd.Cid().String()) } } @@ -81,7 +81,7 @@ func (tp *provider) TestPutWithHash(t *testing.T) { t.Fatal(err) } - if nd.Cid().String() != "z5hRLNd2sv4z1c" { + if nd.Cid().String() != "bafyqabtfjbswy3dp" { t.Errorf("got wrong cid: %s", nd.Cid().String()) } } @@ -179,7 +179,7 @@ func (tp *provider) TestBatch(t *testing.T) { t.Fatal(err) } - if nd.Cid().String() != "zdpuAqckYF3ToF3gcJNxPZXmnmGuXd3gxHCXhq81HGxBejEvv" { + if nd.Cid().String() != "bafyreicnga62zhxnmnlt6ymq5hcbsg7gdhqdu6z4ehu3wpjhvqnflfy6nm" { t.Errorf("got wrong cid: %s", nd.Cid().String()) } diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 38fab7cd8b..c810167e8c 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -170,20 +170,20 @@ func (tp *provider) TestAdd(t *testing.T) { { name: "addCidV1", data: strFile(helloStr), - path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + path: "/ipfs/bafkreidi4zlleupgp2bvrpxyja5lbvi4mym7hz5bvhyoowby2qp7g2hxfa", opts: []options.UnixfsAddOption{options.Unixfs.CidVersion(1)}, }, { name: "addCidV1NoLeaves", data: strFile(helloStr), - path: "/ipfs/zdj7WY4GbN8NDbTW1dfCShAQNVovams2xhq9hVCx5vXcjvT8g", + path: "/ipfs/bafybeibhbcn7k7o2m6xsqkrlfiokod3nxwe47viteynhruh6uqx7hvkjfu", opts: []options.UnixfsAddOption{options.Unixfs.CidVersion(1), options.Unixfs.RawLeaves(false)}, }, // Non sha256 hash vs CID { name: "addCidSha3", data: strFile(helloStr), - path: "/ipfs/zb2wwnYtXBxpndNABjtYxWAPt3cwWNRnc11iT63fvkYV78iRb", + path: "/ipfs/bafkrmichjflejeh6aren53o7pig7zk3m3vxqcoc2i5dv326k3x6obh7jry", opts: []options.UnixfsAddOption{options.Unixfs.Hash(mh.SHA3_256)}, }, { @@ -196,25 +196,25 @@ func (tp *provider) TestAdd(t *testing.T) { { name: "addInline", data: strFile(helloStr), - path: "/ipfs/zaYomJdLndMku8P9LHngHB5w2CQ7NenLbv", + path: "/ipfs/bafyaafikcmeaeeqnnbswy3dpfqqho33snrsccgan", opts: []options.UnixfsAddOption{options.Unixfs.Inline(true)}, }, { name: "addInlineLimit", data: strFile(helloStr), - path: "/ipfs/zaYomJdLndMku8P9LHngHB5w2CQ7NenLbv", + path: "/ipfs/bafyaafikcmeaeeqnnbswy3dpfqqho33snrsccgan", opts: []options.UnixfsAddOption{options.Unixfs.InlineLimit(32), options.Unixfs.Inline(true)}, }, { name: "addInlineZero", data: strFile(""), - path: "/ipfs/z2yYDV", + path: "/ipfs/bafkqaaa", opts: []options.UnixfsAddOption{options.Unixfs.InlineLimit(0), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true)}, }, { //TODO: after coreapi add is used in `ipfs add`, consider making this default for inline name: "addInlineRaw", data: strFile(helloStr), - path: "/ipfs/zj7Gr8AcBreqGEfrnR5kPFe", + path: "/ipfs/bafkqadlimvwgy3zmeb3w64tmmqqq", opts: []options.UnixfsAddOption{options.Unixfs.InlineLimit(32), options.Unixfs.Inline(true), options.Unixfs.RawLeaves(true)}, }, // Chunker / Layout @@ -291,20 +291,20 @@ func (tp *provider) TestAdd(t *testing.T) { { name: "simpleNoCopy", data: realFile, - path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + path: "/ipfs/bafkreidi4zlleupgp2bvrpxyja5lbvi4mym7hz5bvhyoowby2qp7g2hxfa", opts: []options.UnixfsAddOption{options.Unixfs.Nocopy(true)}, }, { name: "noCopyNoRaw", data: realFile, - path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + path: "/ipfs/bafkreidi4zlleupgp2bvrpxyja5lbvi4mym7hz5bvhyoowby2qp7g2hxfa", opts: []options.UnixfsAddOption{options.Unixfs.Nocopy(true), options.Unixfs.RawLeaves(false)}, err: "nocopy option requires '--raw-leaves' to be enabled as well", }, { name: "noCopyNoPath", data: strFile(helloStr), - path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + path: "/ipfs/bafkreidi4zlleupgp2bvrpxyja5lbvi4mym7hz5bvhyoowby2qp7g2hxfa", opts: []options.UnixfsAddOption{options.Unixfs.Nocopy(true)}, err: helpers.ErrMissingFsRef.Error(), }, @@ -312,9 +312,9 @@ func (tp *provider) TestAdd(t *testing.T) { { name: "simpleAddEvent", data: strFile(helloStr), - path: "/ipfs/zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", + path: "/ipfs/bafkreidi4zlleupgp2bvrpxyja5lbvi4mym7hz5bvhyoowby2qp7g2hxfa", events: []coreiface.AddEvent{ - {Name: "zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd", Path: p("zb2rhdhmJjJZs9qkhQCpCQ7VREFkqWw3h1r8utjVvQugwHPFd"), Size: strconv.Itoa(len(helloStr))}, + {Name: "bafkreidi4zlleupgp2bvrpxyja5lbvi4mym7hz5bvhyoowby2qp7g2hxfa", Path: p("bafkreidi4zlleupgp2bvrpxyja5lbvi4mym7hz5bvhyoowby2qp7g2hxfa"), Size: strconv.Itoa(len(helloStr))}, }, opts: []options.UnixfsAddOption{options.Unixfs.RawLeaves(true)}, }, From a5254e2962046f64c7905dc8853388f8c26ef004 Mon Sep 17 00:00:00 2001 From: Erik Ingenito Date: Wed, 8 May 2019 12:14:25 -0700 Subject: [PATCH 2686/3147] Fix directory mv and add tests * Naming changes for my personal comprehension * Add a few tests covering simple mv cases (including our bug) * Fix bug in Mv that would leave fail to delete src directories (when named without a trailing slash) after copying them to their new location This commit was moved from ipfs/go-mfs@2b77b0a36fb40e40ec6fa6f9aea50a73061e16e3 --- mfs/mfs_test.go | 116 ++++++++++++++++++++++++++++++++++++++++++++++++ mfs/ops.go | 30 ++++++------- 2 files changed, 131 insertions(+), 15 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 8d64fe581f..81c63f95cb 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -83,6 +83,14 @@ func mkdirP(t *testing.T, root *Directory, pth string) *Directory { return cur } +func assertDirNotAtPath(root *Directory, pth string) error { + _, err := DirLookup(root, pth) + if err == nil { + return fmt.Errorf("%s exists in %s", pth, root.name) + } + return nil +} + func assertDirAtPath(root *Directory, pth string, children []string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -370,6 +378,114 @@ func TestDirectoryLoadFromDag(t *testing.T) { } } +func TestMvFile(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dagService, rt := setupRoot(ctx, t) + rootDir := rt.GetDirectory() + + fi := getRandFile(t, dagService, 1000) + + err := rootDir.AddChild("afile", fi) + if err != nil { + t.Fatal(err) + } + + err = Mv(rt, "/afile", "/bfile") + if err != nil { + t.Fatal(err) + } + + err = assertFileAtPath(dagService, rootDir, fi, "bfile") + if err != nil { + t.Fatal(err) + } +} + +func TestMvFileToSubdir(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dagService, rt := setupRoot(ctx, t) + rootDir := rt.GetDirectory() + + _ = mkdirP(t, rootDir, "test1") + + fi := getRandFile(t, dagService, 1000) + + err := rootDir.AddChild("afile", fi) + if err != nil { + t.Fatal(err) + } + + err = Mv(rt, "/afile", "/test1") + if err != nil { + t.Fatal(err) + } + + err = assertFileAtPath(dagService, rootDir, fi, "test1/afile") + if err != nil { + t.Fatal(err) + } +} + +func TestMvFileToSubdirWithRename(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dagService, rt := setupRoot(ctx, t) + rootDir := rt.GetDirectory() + + _ = mkdirP(t, rootDir, "test1") + + fi := getRandFile(t, dagService, 1000) + + err := rootDir.AddChild("afile", fi) + if err != nil { + t.Fatal(err) + } + + err = Mv(rt, "/afile", "/test1/bfile") + if err != nil { + t.Fatal(err) + } + + err = assertFileAtPath(dagService, rootDir, fi, "test1/bfile") + if err != nil { + t.Fatal(err) + } +} + +func TestMvDir(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dagService, rt := setupRoot(ctx, t) + rootDir := rt.GetDirectory() + + _ = mkdirP(t, rootDir, "test1") + d2 := mkdirP(t, rootDir, "test2") + + fi := getRandFile(t, dagService, 1000) + + err := d2.AddChild("afile", fi) + if err != nil { + t.Fatal(err) + } + + err = Mv(rt, "/test2", "/test1") + if err != nil { + t.Fatal(err) + } + + err = assertDirNotAtPath(rootDir, "test2") + if err != nil { + t.Fatal(err) + } + + err = assertFileAtPath(dagService, rootDir, fi, "test1/test2/afile") + if err != nil { + t.Fatal(err) + } +} + func TestMfsFile(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/mfs/ops.go b/mfs/ops.go index 3232f81035..2b2907289b 100644 --- a/mfs/ops.go +++ b/mfs/ops.go @@ -21,29 +21,29 @@ import ( // Mv moves the file or directory at 'src' to 'dst' // TODO: Document what the strings 'src' and 'dst' represent. func Mv(r *Root, src, dst string) error { - srcDir, srcFname := gopath.Split(src) + srcDirName, srcFname := gopath.Split(src) - var dstDirStr string - var filename string + var dstDirName string + var dstFname string if dst[len(dst)-1] == '/' { - dstDirStr = dst - filename = srcFname + dstDirName = dst + dstFname = srcFname } else { - dstDirStr, filename = gopath.Split(dst) + dstDirName, dstFname = gopath.Split(dst) } // get parent directories of both src and dest first - dstDir, err := lookupDir(r, dstDirStr) + dstDir, err := lookupDir(r, dstDirName) if err != nil { return err } - srcDirObj, err := lookupDir(r, srcDir) + srcDir, err := lookupDir(r, srcDirName) if err != nil { return err } - srcObj, err := srcDirObj.Child(srcFname) + srcObj, err := srcDir.Child(srcFname) if err != nil { return err } @@ -53,14 +53,14 @@ func Mv(r *Root, src, dst string) error { return err } - fsn, err := dstDir.Child(filename) + fsn, err := dstDir.Child(dstFname) if err == nil { switch n := fsn.(type) { case *File: - _ = dstDir.Unlink(filename) + _ = dstDir.Unlink(dstFname) case *Directory: dstDir = n - filename = srcFname + dstFname = srcFname default: return fmt.Errorf("unexpected type at path: %s", dst) } @@ -68,16 +68,16 @@ func Mv(r *Root, src, dst string) error { return err } - err = dstDir.AddChild(filename, nd) + err = dstDir.AddChild(dstFname, nd) if err != nil { return err } - if srcDir == dstDirStr && srcFname == filename { + if srcDir.name == dstDir.name && srcFname == dstFname { return nil } - return srcDirObj.Unlink(srcFname) + return srcDir.Unlink(srcFname) } func lookupDir(r *Root, path string) (*Directory, error) { From 931e619ba6b32a99a9f05681f4fe1e6bd1d2ffef Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 8 May 2019 21:40:17 -0700 Subject: [PATCH 2687/3147] pin: don't walk all pinned blocks when removing a non-existent pin We do this _just_ to make the error nicer but it's really slow. Additionally, we do it while holding the pin lock, blocking all other pin operations. fixes #6295 License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-ipfs-pinner@4e5b0e8d1d6fd813513000efcef1a9607b16e46b --- pinning/pinner/pin.go | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 24dbf46535..8df21ee1ce 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -263,32 +263,24 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { } // ErrNotPinned is returned when trying to unpin items which are not pinned. -var ErrNotPinned = fmt.Errorf("not pinned") +var ErrNotPinned = fmt.Errorf("not pinned or pinned indirectly") // Unpin a given key func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { p.lock.Lock() defer p.lock.Unlock() - reason, pinned, err := p.isPinnedWithType(c, Any) - if err != nil { - return err - } - if !pinned { - return ErrNotPinned - } - switch reason { - case "recursive": - if recursive { - p.recursePin.Remove(c) - return nil + if p.recursePin.Has(c) { + if !recursive { + return fmt.Errorf("%s is pinned recursively", c) } - return fmt.Errorf("%s is pinned recursively", c) - case "direct": + p.recursePin.Remove(c) + return nil + } + if p.directPin.Has(c) { p.directPin.Remove(c) return nil - default: - return fmt.Errorf("%s is pinned indirectly under %s", c, reason) } + return ErrNotPinned } func (p *pinner) isInternalPin(c cid.Cid) bool { From c638646a28cd994932e454f10381d2573323ffc6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 10 May 2019 23:53:44 -0700 Subject: [PATCH 2688/3147] chore: fix linter nits License: MIT Signed-off-by: Steven Allen This commit was moved from ipfs/go-filestore@2f0edb371cf3d24eb1a0535b988bd4de8e462cce --- filestore/fsrefstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index b4c66a32d1..320ee5928b 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -281,7 +281,7 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { if !f.AllowFiles { return ErrFilestoreNotEnabled } - if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { + if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { //nolint:staticcheck return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) } From 229d33682eef59eaca67454e537f4f806e75ca2b Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 15 May 2019 17:21:14 -0700 Subject: [PATCH 2689/3147] feat(session): instantiated sessions lazily Do not instantiate a bitswap session if all operations are local This commit was moved from ipfs/go-blockservice@4b230aa46c2fff0df0e6be96c99ea1a76aed85a7 --- blockservice/blockservice.go | 3 +- blockservice/blockservice_test.go | 59 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3b5a1df6b9..0a442c8a5e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -114,9 +114,8 @@ func (s *blockService) Exchange() exchange.Interface { func NewSession(ctx context.Context, bs BlockService) *Session { exch := bs.Exchange() if sessEx, ok := exch.(exchange.SessionExchange); ok { - ses := sessEx.NewSession(ctx) return &Session{ - ses: ses, + ses: nil, sessEx: sessEx, bs: bs.Blockstore(), } diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index fd64eb60ca..4f093d7fca 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -1,6 +1,7 @@ package blockservice import ( + "context" "testing" blocks "github.com/ipfs/go-block-format" @@ -8,6 +9,7 @@ import ( dssync "github.com/ipfs/go-datastore/sync" blockstore "github.com/ipfs/go-ipfs-blockstore" butil "github.com/ipfs/go-ipfs-blocksutil" + exchange "github.com/ipfs/go-ipfs-exchange-interface" offline "github.com/ipfs/go-ipfs-exchange-offline" ) @@ -35,6 +37,52 @@ func TestWriteThroughWorks(t *testing.T) { } } +func TestLazySessionInitialization(t *testing.T) { + ctx := context.Background() + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + bstore2 := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + bstore3 := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + session := offline.Exchange(bstore2) + exchange := offline.Exchange(bstore3) + sessionExch := &fakeSessionExchange{Interface: exchange, session: session} + bservSessEx := NewWriteThrough(bstore, sessionExch) + bgen := butil.NewBlockGenerator() + + block := bgen.Next() + bstore.Put(block) + + block2 := bgen.Next() + session.HasBlock(block2) + + bsession := NewSession(ctx, bservSessEx) + if bsession.ses != nil { + t.Fatal("Session exchange should not instantiated session immediately") + } + returnedBlock, err := bsession.GetBlock(ctx, block.Cid()) + if err != nil { + t.Fatal("Should have fetched block locally") + } + if returnedBlock.Cid() != block.Cid() { + t.Fatal("Got incorrect block") + } + if bsession.ses != nil { + t.Fatal("Session exchange should not instantiated session if local store had block") + } + returnedBlock, err = bsession.GetBlock(ctx, block2.Cid()) + if err != nil { + t.Fatal("Should have fetched block remotely") + } + if returnedBlock.Cid() != block2.Cid() { + t.Fatal("Got incorrect block") + } + if bsession.ses != session { + t.Fatal("Should have initialized session to fetch block") + } +} + var _ blockstore.Blockstore = (*PutCountingBlockstore)(nil) type PutCountingBlockstore struct { @@ -46,3 +94,14 @@ func (bs *PutCountingBlockstore) Put(block blocks.Block) error { bs.PutCounter++ return bs.Blockstore.Put(block) } + +var _ exchange.SessionExchange = (*fakeSessionExchange)(nil) + +type fakeSessionExchange struct { + exchange.Interface + session exchange.Fetcher +} + +func (fe *fakeSessionExchange) NewSession(context.Context) exchange.Fetcher { + return fe.session +} From 4509f7cf0aa1c689f9735d4fe64bfc5c6ae7fba6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 16 May 2019 14:38:57 -0700 Subject: [PATCH 2690/3147] chore: remove URL field We now just use the AbsPath field for both URLs and file paths. This commit was moved from ipfs/go-unixfs@dd66a0cfb22ee91cbefc4eb2e13bcd842aa5432b --- unixfs/importer/helpers/dagbuilder.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index a624217f8b..e3cf7b44f0 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -65,11 +65,6 @@ type DagBuilderParams struct { // NoCopy signals to the chunker that it should track fileinfo for // filestore adds NoCopy bool - - // URL if non-empty (and NoCopy is also true) indicates that the - // file will not be stored in the datastore but instead retrieved - // from this location via the urlstore. - URL string } // New generates a new DagBuilderHelper from the given params and a given @@ -87,10 +82,6 @@ func (dbp *DagBuilderParams) New(spl chunker.Splitter) (*DagBuilderHelper, error db.stat = fi.Stat() } - if dbp.URL != "" && dbp.NoCopy { - db.fullPath = dbp.URL - } - if dbp.NoCopy && db.fullPath == "" { // Enforce NoCopy return nil, ErrMissingFsRef } From 218696c5a3ac4d5f8f2bb8c26de3576972b3519a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 16 May 2019 19:06:08 -0700 Subject: [PATCH 2691/3147] include the path in path errors This should improve UX by telling the user the path we failed to parse. This commit was moved from ipfs/go-path@c13536f13f6030c7d5a8280fc96f1378c5daad7b --- path/error.go | 23 +++++++++++++++++++++++ path/path.go | 32 +++++++++++--------------------- path/path_test.go | 5 +++-- 3 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 path/error.go diff --git a/path/error.go b/path/error.go new file mode 100644 index 0000000000..ca2e8416d5 --- /dev/null +++ b/path/error.go @@ -0,0 +1,23 @@ +package path + +import ( + "fmt" +) + +// helper type so path parsing errors include the path +type pathError struct { + error error + path string +} + +func (e *pathError) Error() string { + return fmt.Sprintf("invalid path %q: %s", e.path, e.error) +} + +func (e *pathError) Unwrap() error { + return e.error +} + +func (e *pathError) Path() string { + return e.path +} diff --git a/path/path.go b/path/path.go index b0d6cdcdee..18a85a9021 100644 --- a/path/path.go +++ b/path/path.go @@ -2,23 +2,13 @@ package path import ( - "errors" + "fmt" "path" "strings" cid "github.com/ipfs/go-cid" ) -var ( - // ErrBadPath is returned when a given path is incorrectly formatted - ErrBadPath = errors.New("invalid 'ipfs ref' path") - - // ErrNoComponents is used when Paths after a protocol - // do not contain at least one component - ErrNoComponents = errors.New( - "path must contain at least one component") -) - // A Path represents an ipfs content path: // * //path/to/file // * /ipfs/ @@ -107,33 +97,33 @@ func ParsePath(txt string) (Path, error) { // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { if _, err := cid.Decode(parts[0]); err != nil { - return "", ErrBadPath + return "", &pathError{error: err, path: txt} } // The case when the path starts with hash without a protocol prefix return Path("/ipfs/" + txt), nil } if len(parts) < 3 { - return "", ErrBadPath + return "", &pathError{error: fmt.Errorf("path does not begin with '/'"), path: txt} } //TODO: make this smarter switch parts[1] { case "ipfs", "ipld": if parts[2] == "" { - return "", ErrNoComponents + return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} } // Validate Cid. _, err := cid.Decode(parts[2]) if err != nil { - return "", err + return "", &pathError{error: fmt.Errorf("invalid CID: %s", err), path: txt} } case "ipns": if parts[2] == "" { - return "", ErrNoComponents + return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} } default: - return "", ErrBadPath + return "", &pathError{error: fmt.Errorf("unknown namespace %q", parts[1]), path: txt} } return Path(txt), nil @@ -142,12 +132,12 @@ func ParsePath(txt string) (Path, error) { // ParseCidToPath takes a CID in string form and returns a valid ipfs Path. func ParseCidToPath(txt string) (Path, error) { if txt == "" { - return "", ErrNoComponents + return "", &pathError{error: fmt.Errorf("empty"), path: txt} } c, err := cid.Decode(txt) if err != nil { - return "", err + return "", &pathError{error: err, path: txt} } return FromCid(c), nil @@ -179,13 +169,13 @@ func SplitAbsPath(fpath Path) (cid.Cid, []string, error) { // if nothing, bail. if len(parts) == 0 { - return cid.Cid{}, nil, ErrNoComponents + return cid.Cid{}, nil, &pathError{error: fmt.Errorf("empty"), path: string(fpath)} } c, err := cid.Decode(parts[0]) // first element in the path is a cid if err != nil { - return cid.Cid{}, nil, err + return cid.Cid{}, nil, &pathError{error: fmt.Errorf("invalid CID: %s", err), path: string(fpath)} } return c, parts[1:], nil diff --git a/path/path_test.go b/path/path_test.go index 657c58c75d..fdd71fc0c7 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -1,6 +1,7 @@ package path import ( + "strings" "testing" ) @@ -44,8 +45,8 @@ func TestNoComponents(t *testing.T) { "/ipld/", } { _, err := ParsePath(s) - if err != ErrNoComponents { - t.Errorf("expected ErrNoComponents, got %s", err) + if err == nil || !strings.Contains(err.Error(), "not enough path components") || !strings.Contains(err.Error(), s) { + t.Error("wrong error") } } } From 3d72707f576f881c01bc5fc9ffb97ece3456c014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 17 May 2019 18:57:15 +0200 Subject: [PATCH 2692/3147] tests: expose TestSuite This commit was moved from ipfs/interface-go-ipfs-core@6fe8577a835a24bf8a38de0d5ee9d1fe6ca9e913 --- coreiface/tests/api.go | 22 ++++++++++++---------- coreiface/tests/block.go | 16 ++++++++-------- coreiface/tests/dag.go | 12 ++++++------ coreiface/tests/dht.go | 8 ++++---- coreiface/tests/key.go | 34 +++++++++++++++++----------------- coreiface/tests/name.go | 8 ++++---- coreiface/tests/object.go | 26 +++++++++++++------------- coreiface/tests/path.go | 14 +++++++------- coreiface/tests/pin.go | 8 ++++---- coreiface/tests/pubsub.go | 4 ++-- coreiface/tests/unixfs.go | 26 +++++++++++++------------- 11 files changed, 90 insertions(+), 88 deletions(-) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index 5e7c1f5415..1af3a83b37 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -11,7 +11,7 @@ import ( var apiNotImplemented = errors.New("api not implemented") -func (tp *provider) makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { +func (tp *TestSuite) makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { api, err := tp.MakeAPISwarm(ctx, false, 1) if err != nil { return nil, err @@ -25,17 +25,19 @@ type Provider interface { MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) } -func (tp *provider) MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) { - tp.apis <- 1 - go func() { - <-ctx.Done() - tp.apis <- -1 - }() +func (tp *TestSuite) MakeAPISwarm(ctx context.Context, fullIdentity bool, n int) ([]coreiface.CoreAPI, error) { + if tp.apis != nil { + tp.apis <- 1 + go func() { + <-ctx.Done() + tp.apis <- -1 + }() + } return tp.Provider.MakeAPISwarm(ctx, fullIdentity, n) } -type provider struct { +type TestSuite struct { Provider apis chan int @@ -55,7 +57,7 @@ func TestApi(p Provider) func(t *testing.T) { } }() - tp := &provider{Provider: p, apis: apis} + tp := &TestSuite{Provider: p, apis: apis} return func(t *testing.T) { t.Run("Block", tp.TestBlock) @@ -80,7 +82,7 @@ func TestApi(p Provider) func(t *testing.T) { } } -func (tp *provider) hasApi(t *testing.T, tf func(coreiface.CoreAPI) error) { +func (tp *TestSuite) hasApi(t *testing.T, tf func(coreiface.CoreAPI) error) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 34e47e90c8..6b648f3946 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -13,7 +13,7 @@ import ( mh "github.com/multiformats/go-multihash" ) -func (tp *provider) TestBlock(t *testing.T) { +func (tp *TestSuite) TestBlock(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Block() == nil { return apiNotImplemented @@ -30,7 +30,7 @@ func (tp *provider) TestBlock(t *testing.T) { t.Run("TestBlockPin", tp.TestBlockPin) } -func (tp *provider) TestBlockPut(t *testing.T) { +func (tp *TestSuite) TestBlockPut(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -48,7 +48,7 @@ func (tp *provider) TestBlockPut(t *testing.T) { } } -func (tp *provider) TestBlockPutFormat(t *testing.T) { +func (tp *TestSuite) TestBlockPutFormat(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -66,7 +66,7 @@ func (tp *provider) TestBlockPutFormat(t *testing.T) { } } -func (tp *provider) TestBlockPutHash(t *testing.T) { +func (tp *TestSuite) TestBlockPutHash(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -84,7 +84,7 @@ func (tp *provider) TestBlockPutHash(t *testing.T) { } } -func (tp *provider) TestBlockGet(t *testing.T) { +func (tp *TestSuite) TestBlockGet(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -122,7 +122,7 @@ func (tp *provider) TestBlockGet(t *testing.T) { } } -func (tp *provider) TestBlockRm(t *testing.T) { +func (tp *TestSuite) TestBlockRm(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -176,7 +176,7 @@ func (tp *provider) TestBlockRm(t *testing.T) { } } -func (tp *provider) TestBlockStat(t *testing.T) { +func (tp *TestSuite) TestBlockStat(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -203,7 +203,7 @@ func (tp *provider) TestBlockStat(t *testing.T) { } } -func (tp *provider) TestBlockPin(t *testing.T) { +func (tp *TestSuite) TestBlockPin(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 0bb3aa487e..1ccd45d59b 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -15,7 +15,7 @@ import ( mh "github.com/multiformats/go-multihash" ) -func (tp *provider) TestDag(t *testing.T) { +func (tp *TestSuite) TestDag(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Dag() == nil { return apiNotImplemented @@ -40,7 +40,7 @@ var ( } ) -func (tp *provider) TestPut(t *testing.T) { +func (tp *TestSuite) TestPut(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -63,7 +63,7 @@ func (tp *provider) TestPut(t *testing.T) { } } -func (tp *provider) TestPutWithHash(t *testing.T) { +func (tp *TestSuite) TestPutWithHash(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -86,7 +86,7 @@ func (tp *provider) TestPutWithHash(t *testing.T) { } } -func (tp *provider) TestDagPath(t *testing.T) { +func (tp *TestSuite) TestDagPath(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -131,7 +131,7 @@ func (tp *provider) TestDagPath(t *testing.T) { } } -func (tp *provider) TestTree(t *testing.T) { +func (tp *TestSuite) TestTree(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -166,7 +166,7 @@ func (tp *provider) TestTree(t *testing.T) { } } -func (tp *provider) TestBatch(t *testing.T) { +func (tp *TestSuite) TestBatch(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index 5482b50b13..33b4ff14c7 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" ) -func (tp *provider) TestDht(t *testing.T) { +func (tp *TestSuite) TestDht(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Dht() == nil { return apiNotImplemented @@ -22,7 +22,7 @@ func (tp *provider) TestDht(t *testing.T) { t.Run("TestDhtProvide", tp.TestDhtProvide) } -func (tp *provider) TestDhtFindPeer(t *testing.T) { +func (tp *TestSuite) TestDhtFindPeer(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) @@ -75,7 +75,7 @@ func (tp *provider) TestDhtFindPeer(t *testing.T) { } } -func (tp *provider) TestDhtFindProviders(t *testing.T) { +func (tp *TestSuite) TestDhtFindProviders(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) @@ -105,7 +105,7 @@ func (tp *provider) TestDhtFindProviders(t *testing.T) { } } -func (tp *provider) TestDhtProvide(t *testing.T) { +func (tp *TestSuite) TestDhtProvide(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index 7ff5f33300..e3461f9718 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -9,7 +9,7 @@ import ( opt "github.com/ipfs/interface-go-ipfs-core/options" ) -func (tp *provider) TestKey(t *testing.T) { +func (tp *TestSuite) TestKey(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Key() == nil { return apiNotImplemented @@ -35,7 +35,7 @@ func (tp *provider) TestKey(t *testing.T) { t.Run("TestRemove", tp.TestRemove) } -func (tp *provider) TestListSelf(t *testing.T) { +func (tp *TestSuite) TestListSelf(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -69,7 +69,7 @@ func (tp *provider) TestListSelf(t *testing.T) { } } -func (tp *provider) TestRenameSelf(t *testing.T) { +func (tp *TestSuite) TestRenameSelf(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -97,7 +97,7 @@ func (tp *provider) TestRenameSelf(t *testing.T) { } } -func (tp *provider) TestRemoveSelf(t *testing.T) { +func (tp *TestSuite) TestRemoveSelf(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -116,7 +116,7 @@ func (tp *provider) TestRemoveSelf(t *testing.T) { } } -func (tp *provider) TestGenerate(t *testing.T) { +func (tp *TestSuite) TestGenerate(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -139,7 +139,7 @@ func (tp *provider) TestGenerate(t *testing.T) { } } -func (tp *provider) TestGenerateSize(t *testing.T) { +func (tp *TestSuite) TestGenerateSize(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -162,7 +162,7 @@ func (tp *provider) TestGenerateSize(t *testing.T) { } } -func (tp *provider) TestGenerateType(t *testing.T) { +func (tp *TestSuite) TestGenerateType(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() t.Skip("disabled until libp2p/specs#111 is fixed") @@ -188,7 +188,7 @@ func (tp *provider) TestGenerateType(t *testing.T) { } } -func (tp *provider) TestGenerateExisting(t *testing.T) { +func (tp *TestSuite) TestGenerateExisting(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -221,7 +221,7 @@ func (tp *provider) TestGenerateExisting(t *testing.T) { } } -func (tp *provider) TestList(t *testing.T) { +func (tp *TestSuite) TestList(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -267,7 +267,7 @@ func (tp *provider) TestList(t *testing.T) { } } -func (tp *provider) TestRename(t *testing.T) { +func (tp *TestSuite) TestRename(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -296,7 +296,7 @@ func (tp *provider) TestRename(t *testing.T) { } } -func (tp *provider) TestRenameToSelf(t *testing.T) { +func (tp *TestSuite) TestRenameToSelf(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -320,7 +320,7 @@ func (tp *provider) TestRenameToSelf(t *testing.T) { } } -func (tp *provider) TestRenameToSelfForce(t *testing.T) { +func (tp *TestSuite) TestRenameToSelfForce(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -344,7 +344,7 @@ func (tp *provider) TestRenameToSelfForce(t *testing.T) { } } -func (tp *provider) TestRenameOverwriteNoForce(t *testing.T) { +func (tp *TestSuite) TestRenameOverwriteNoForce(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -374,7 +374,7 @@ func (tp *provider) TestRenameOverwriteNoForce(t *testing.T) { } } -func (tp *provider) TestRenameOverwrite(t *testing.T) { +func (tp *TestSuite) TestRenameOverwrite(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -413,7 +413,7 @@ func (tp *provider) TestRenameOverwrite(t *testing.T) { } } -func (tp *provider) TestRenameSameNameNoForce(t *testing.T) { +func (tp *TestSuite) TestRenameSameNameNoForce(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -442,7 +442,7 @@ func (tp *provider) TestRenameSameNameNoForce(t *testing.T) { } } -func (tp *provider) TestRenameSameName(t *testing.T) { +func (tp *TestSuite) TestRenameSameName(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -471,7 +471,7 @@ func (tp *provider) TestRenameSameName(t *testing.T) { } } -func (tp *provider) TestRemove(t *testing.T) { +func (tp *TestSuite) TestRemove(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index efaf1d3ae1..31a5c14663 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -16,7 +16,7 @@ import ( opt "github.com/ipfs/interface-go-ipfs-core/options" ) -func (tp *provider) TestName(t *testing.T) { +func (tp *TestSuite) TestName(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Name() == nil { return apiNotImplemented @@ -39,7 +39,7 @@ func appendPath(p path.Path, sub string) path.Path { return path.New(gopath.Join(p.String(), sub)) } -func (tp *provider) TestPublishResolve(t *testing.T) { +func (tp *TestSuite) TestPublishResolve(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() init := func() (coreiface.CoreAPI, path.Path) { @@ -188,7 +188,7 @@ func (tp *provider) TestPublishResolve(t *testing.T) { }) } -func (tp *provider) TestBasicPublishResolveKey(t *testing.T) { +func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() apis, err := tp.MakeAPISwarm(ctx, true, 5) @@ -230,7 +230,7 @@ func (tp *provider) TestBasicPublishResolveKey(t *testing.T) { } } -func (tp *provider) TestBasicPublishResolveTimeout(t *testing.T) { +func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) { t.Skip("ValidTime doesn't appear to work at this time resolution") ctx, cancel := context.WithCancel(context.Background()) diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 8682a2edca..2e066ca71b 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -12,7 +12,7 @@ import ( opt "github.com/ipfs/interface-go-ipfs-core/options" ) -func (tp *provider) TestObject(t *testing.T) { +func (tp *TestSuite) TestObject(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Object() == nil { return apiNotImplemented @@ -34,7 +34,7 @@ func (tp *provider) TestObject(t *testing.T) { t.Run("TestDiffTest", tp.TestDiffTest) } -func (tp *provider) TestNew(t *testing.T) { +func (tp *TestSuite) TestNew(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -61,7 +61,7 @@ func (tp *provider) TestNew(t *testing.T) { } } -func (tp *provider) TestObjectPut(t *testing.T) { +func (tp *TestSuite) TestObjectPut(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -102,7 +102,7 @@ func (tp *provider) TestObjectPut(t *testing.T) { } } -func (tp *provider) TestObjectGet(t *testing.T) { +func (tp *TestSuite) TestObjectGet(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -125,7 +125,7 @@ func (tp *provider) TestObjectGet(t *testing.T) { } } -func (tp *provider) TestObjectData(t *testing.T) { +func (tp *TestSuite) TestObjectData(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -153,7 +153,7 @@ func (tp *provider) TestObjectData(t *testing.T) { } } -func (tp *provider) TestObjectLinks(t *testing.T) { +func (tp *TestSuite) TestObjectLinks(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -189,7 +189,7 @@ func (tp *provider) TestObjectLinks(t *testing.T) { } } -func (tp *provider) TestObjectStat(t *testing.T) { +func (tp *TestSuite) TestObjectStat(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -237,7 +237,7 @@ func (tp *provider) TestObjectStat(t *testing.T) { } } -func (tp *provider) TestObjectAddLink(t *testing.T) { +func (tp *TestSuite) TestObjectAddLink(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -278,7 +278,7 @@ func (tp *provider) TestObjectAddLink(t *testing.T) { } } -func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { +func (tp *TestSuite) TestObjectAddLinkCreate(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -327,7 +327,7 @@ func (tp *provider) TestObjectAddLinkCreate(t *testing.T) { } } -func (tp *provider) TestObjectRmLink(t *testing.T) { +func (tp *TestSuite) TestObjectRmLink(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -360,7 +360,7 @@ func (tp *provider) TestObjectRmLink(t *testing.T) { } } -func (tp *provider) TestObjectAddData(t *testing.T) { +func (tp *TestSuite) TestObjectAddData(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -393,7 +393,7 @@ func (tp *provider) TestObjectAddData(t *testing.T) { } } -func (tp *provider) TestObjectSetData(t *testing.T) { +func (tp *TestSuite) TestObjectSetData(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -426,7 +426,7 @@ func (tp *provider) TestObjectSetData(t *testing.T) { } } -func (tp *provider) TestDiffTest(t *testing.T) { +func (tp *TestSuite) TestDiffTest(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 4fd18bd206..2d9497244c 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -12,7 +12,7 @@ import ( ipldcbor "github.com/ipfs/go-ipld-cbor" ) -func (tp *provider) TestPath(t *testing.T) { +func (tp *TestSuite) TestPath(t *testing.T) { t.Run("TestMutablePath", tp.TestMutablePath) t.Run("TestPathRemainder", tp.TestPathRemainder) t.Run("TestEmptyPathRemainder", tp.TestEmptyPathRemainder) @@ -21,7 +21,7 @@ func (tp *provider) TestPath(t *testing.T) { t.Run("TestPathJoin", tp.TestPathJoin) } -func (tp *provider) TestMutablePath(t *testing.T) { +func (tp *TestSuite) TestMutablePath(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -54,7 +54,7 @@ func (tp *provider) TestMutablePath(t *testing.T) { } } -func (tp *provider) TestPathRemainder(t *testing.T) { +func (tp *TestSuite) TestPathRemainder(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -85,7 +85,7 @@ func (tp *provider) TestPathRemainder(t *testing.T) { } } -func (tp *provider) TestEmptyPathRemainder(t *testing.T) { +func (tp *TestSuite) TestEmptyPathRemainder(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -116,7 +116,7 @@ func (tp *provider) TestEmptyPathRemainder(t *testing.T) { } } -func (tp *provider) TestInvalidPathRemainder(t *testing.T) { +func (tp *TestSuite) TestInvalidPathRemainder(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -143,7 +143,7 @@ func (tp *provider) TestInvalidPathRemainder(t *testing.T) { } } -func (tp *provider) TestPathRoot(t *testing.T) { +func (tp *TestSuite) TestPathRoot(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -187,7 +187,7 @@ func (tp *provider) TestPathRoot(t *testing.T) { } } -func (tp *provider) TestPathJoin(t *testing.T) { +func (tp *TestSuite) TestPathJoin(t *testing.T) { p1 := path.New("/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz") if path.Join(p1, "foo").String() != "/ipfs/QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6/bar/baz/foo" { diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 344db65e20..9b28a682a1 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -14,7 +14,7 @@ import ( ipld "github.com/ipfs/go-ipld-format" ) -func (tp *provider) TestPin(t *testing.T) { +func (tp *TestSuite) TestPin(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Pin() == nil { return apiNotImplemented @@ -27,7 +27,7 @@ func (tp *provider) TestPin(t *testing.T) { t.Run("TestPinRecursive", tp.TestPinRecursive) } -func (tp *provider) TestPinAdd(t *testing.T) { +func (tp *TestSuite) TestPinAdd(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -46,7 +46,7 @@ func (tp *provider) TestPinAdd(t *testing.T) { } } -func (tp *provider) TestPinSimple(t *testing.T) { +func (tp *TestSuite) TestPinSimple(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -96,7 +96,7 @@ func (tp *provider) TestPinSimple(t *testing.T) { } } -func (tp *provider) TestPinRecursive(t *testing.T) { +func (tp *TestSuite) TestPinRecursive(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index 418fc4867c..e66291572b 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -9,7 +9,7 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" ) -func (tp *provider) TestPubSub(t *testing.T) { +func (tp *TestSuite) TestPubSub(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.PubSub() == nil { return apiNotImplemented @@ -20,7 +20,7 @@ func (tp *provider) TestPubSub(t *testing.T) { t.Run("TestBasicPubSub", tp.TestBasicPubSub) } -func (tp *provider) TestBasicPubSub(t *testing.T) { +func (tp *TestSuite) TestBasicPubSub(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index c810167e8c..47ce505c82 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -28,7 +28,7 @@ import ( mh "github.com/multiformats/go-multihash" ) -func (tp *provider) TestUnixfs(t *testing.T) { +func (tp *TestSuite) TestUnixfs(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Unixfs() == nil { return apiNotImplemented @@ -94,7 +94,7 @@ func wrapped(names ...string) func(f files.Node) files.Node { } } -func (tp *provider) TestAdd(t *testing.T) { +func (tp *TestSuite) TestAdd(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -528,7 +528,7 @@ func (tp *provider) TestAdd(t *testing.T) { } } -func (tp *provider) TestAddPinned(t *testing.T) { +func (tp *TestSuite) TestAddPinned(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -554,7 +554,7 @@ func (tp *provider) TestAddPinned(t *testing.T) { } } -func (tp *provider) TestAddHashOnly(t *testing.T) { +func (tp *TestSuite) TestAddHashOnly(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -580,7 +580,7 @@ func (tp *provider) TestAddHashOnly(t *testing.T) { } } -func (tp *provider) TestGetEmptyFile(t *testing.T) { +func (tp *TestSuite) TestGetEmptyFile(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -610,7 +610,7 @@ func (tp *provider) TestGetEmptyFile(t *testing.T) { } } -func (tp *provider) TestGetDir(t *testing.T) { +func (tp *TestSuite) TestGetDir(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -643,7 +643,7 @@ func (tp *provider) TestGetDir(t *testing.T) { } } -func (tp *provider) TestGetNonUnixfs(t *testing.T) { +func (tp *TestSuite) TestGetNonUnixfs(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -663,7 +663,7 @@ func (tp *provider) TestGetNonUnixfs(t *testing.T) { } } -func (tp *provider) TestLs(t *testing.T) { +func (tp *TestSuite) TestLs(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -723,7 +723,7 @@ func (tp *provider) TestLs(t *testing.T) { } } -func (tp *provider) TestEntriesExpired(t *testing.T) { +func (tp *TestSuite) TestEntriesExpired(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -765,7 +765,7 @@ func (tp *provider) TestEntriesExpired(t *testing.T) { } } -func (tp *provider) TestLsEmptyDir(t *testing.T) { +func (tp *TestSuite) TestLsEmptyDir(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -794,7 +794,7 @@ func (tp *provider) TestLsEmptyDir(t *testing.T) { } // TODO(lgierth) this should test properly, with len(links) > 0 -func (tp *provider) TestLsNonUnixfs(t *testing.T) { +func (tp *TestSuite) TestLsNonUnixfs(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -853,7 +853,7 @@ func (f *closeTestF) Close() error { return nil } -func (tp *provider) TestAddCloses(t *testing.T) { +func (tp *TestSuite) TestAddCloses(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -891,7 +891,7 @@ func (tp *provider) TestAddCloses(t *testing.T) { } } -func (tp *provider) TestGetSeek(t *testing.T) { +func (tp *TestSuite) TestGetSeek(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) From 152af791452b6d1b03e9b76c5e2dac1213e182fb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 16 May 2019 22:57:32 -0700 Subject: [PATCH 2693/3147] feat: improve errors when a path fails to parse This helps with issues like #4190 by telling the user the path that failed to parse. fixes #4190 This commit was moved from ipfs/go-namesys@b65e2dbe722dab7d559ee52e453c2d8fb1c29727 --- namesys/resolve/resolve.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/namesys/resolve/resolve.go b/namesys/resolve/resolve.go index 128619c65b..44f735a1f4 100644 --- a/namesys/resolve/resolve.go +++ b/namesys/resolve/resolve.go @@ -3,6 +3,7 @@ package resolve import ( "context" "errors" + "fmt" "strings" "github.com/ipfs/go-ipld-format" @@ -36,8 +37,9 @@ func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (pat seg := p.Segments() if len(seg) < 2 || seg[1] == "" { // just "/" without further segments - evt.Append(logging.LoggableMap{"error": path.ErrNoComponents.Error()}) - return "", path.ErrNoComponents + err := fmt.Errorf("invalid path %q: ipns path missing IPNS ID", p) + evt.Append(logging.LoggableMap{"error": err}) + return "", err } extensions := seg[2:] From cda470a4223903b7e22946736655f10dfc03ed41 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 21 May 2019 10:22:58 -0700 Subject: [PATCH 2694/3147] chore: fix linter nits and tests that don't compile This commit was moved from ipfs/go-namesys@6a45588750d568d5dd2dec274dadd86c12bcb5a3 --- namesys/resolve/pathresolver_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/namesys/resolve/pathresolver_test.go b/namesys/resolve/pathresolver_test.go index fe578b5d3f..3d9c04fa2f 100644 --- a/namesys/resolve/pathresolver_test.go +++ b/namesys/resolve/pathresolver_test.go @@ -16,17 +16,17 @@ func TestResolveNoComponents(t *testing.T) { } _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipns/")) - if err != path.ErrNoComponents { - t.Fatal("Should error with no components (/ipns/).", err) + if err.Error() != "invalid path \"/ipns/\": ipns path missing IPNS ID" { + t.Error("Should error with no components (/ipns/).", err) } _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipfs/")) - if err != path.ErrNoComponents { - t.Fatal("Should error with no components (/ipfs/).", err) + if err.Error() != "invalid path \"/ipfs/\": not enough path components" { + t.Error("Should error with no components (/ipfs/).", err) } _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/../..")) - if err != path.ErrBadPath { - t.Fatal("Should error with invalid path.", err) + if err.Error() != "invalid path \"/../..\": unknown namespace \"..\"" { + t.Error("Should error with invalid path.", err) } } From ff7a1034b726238764149e59eca90838cf93749b Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 24 May 2019 20:44:39 +0200 Subject: [PATCH 2695/3147] Fix travis CI link in README This commit was moved from ipfs/go-blockservice@b46b687fa3e5c09875391efb5bae7e01f7e9c941 --- blockservice/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/README.md b/blockservice/README.md index 0ec2aef878..3df67fdecb 100644 --- a/blockservice/README.md +++ b/blockservice/README.md @@ -5,7 +5,7 @@ go-blockservice [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) [![Coverage Status](https://codecov.io/gh/ipfs/go-block-format/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-block-format/branch/master) -[![Travis CI](https://travis-ci.org/ipfs/go-block-format.svg?branch=master)](https://travis-ci.org/ipfs/go-block-format) +[![Travis CI](https://travis-ci.com/ipfs/go-blockservice.svg?branch=master)](https://travis-ci.com/ipfs/go-blockservice) > go-blockservice provides a seamless interface to both local and remote storage backends. From 41486008be5e0d01f6e132a2b5ee59b1063be146 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 24 May 2019 11:59:30 -0700 Subject: [PATCH 2696/3147] set the session context fixes https://github.com/ipfs/go-bitswap/issues/131 This commit was moved from ipfs/go-blockservice@6013394c0f5b4df756a927018c530a3231fb7197 --- blockservice/blockservice.go | 12 +++++++----- blockservice/blockservice_test.go | 5 ++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0a442c8a5e..845506534a 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -115,14 +115,16 @@ func NewSession(ctx context.Context, bs BlockService) *Session { exch := bs.Exchange() if sessEx, ok := exch.(exchange.SessionExchange); ok { return &Session{ - ses: nil, - sessEx: sessEx, - bs: bs.Blockstore(), + sessCtx: ctx, + ses: nil, + sessEx: sessEx, + bs: bs.Blockstore(), } } return &Session{ - ses: exch, - bs: bs.Blockstore(), + ses: exch, + sessCtx: ctx, + bs: bs.Blockstore(), } } diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 4f093d7fca..a94b672cfe 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -102,6 +102,9 @@ type fakeSessionExchange struct { session exchange.Fetcher } -func (fe *fakeSessionExchange) NewSession(context.Context) exchange.Fetcher { +func (fe *fakeSessionExchange) NewSession(ctx context.Context) exchange.Fetcher { + if ctx == nil { + panic("nil context") + } return fe.session } From 6bc65525abe5a9f425bbb22f40e915e4f4b27cc5 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 24 May 2019 21:23:39 +0200 Subject: [PATCH 2697/3147] Fix tests Method was renamed This commit was moved from ipfs/go-blockservice@fa6461310b2de7f0e5b7933d0bab28b127a08158 --- blockservice/test/mock.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index 9638f3cb3c..a6eba6911c 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -3,7 +3,7 @@ package bstest import ( . "github.com/ipfs/go-blockservice" - bitswap "github.com/ipfs/go-bitswap" + testinstance "github.com/ipfs/go-bitswap/testinstance" tn "github.com/ipfs/go-bitswap/testnet" delay "github.com/ipfs/go-ipfs-delay" mockrouting "github.com/ipfs/go-ipfs-routing/mock" @@ -12,7 +12,7 @@ import ( // Mocks returns |n| connected mock Blockservices func Mocks(n int) []BlockService { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) - sg := bitswap.NewTestSessionGenerator(net) + sg := testinstance.NewTestInstanceGenerator(net) instances := sg.Instances(n) From fc50e9a9b642135cf46602d2b695a81d59b4aec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 28 May 2019 16:42:41 +0100 Subject: [PATCH 2698/3147] migrate to go-libp2p-core. This commit was moved from ipfs/go-ipfs-routing@f5e0203fa1b87188bfe03a6ff3915e05a8afe5de --- routing/mock/centralized_client.go | 32 ++++++++++++++-------------- routing/mock/centralized_server.go | 22 +++++++++---------- routing/mock/centralized_test.go | 21 +++++++++--------- routing/mock/interface.go | 17 ++++++++------- routing/none/none_client.go | 30 +++++++++++++------------- routing/offline/offline.go | 34 +++++++++++++++--------------- routing/offline/offline_test.go | 12 ++++++----- 7 files changed, 86 insertions(+), 82 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index e09350da5b..e57d03239c 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,11 +6,11 @@ import ( cid "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" - "github.com/libp2p/go-testutil" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-testing/net" + ma "github.com/multiformats/go-multiaddr" ) @@ -19,37 +19,37 @@ var log = logging.Logger("mockrouter") type client struct { vs routing.ValueStore server server - peer testutil.Identity + peer tnet.Identity } // FIXME(brian): is this method meant to simulate putting a value into the network? -func (c *client) PutValue(ctx context.Context, key string, val []byte, opts ...ropts.Option) error { +func (c *client) PutValue(ctx context.Context, key string, val []byte, opts ...routing.Option) error { log.Debugf("PutValue: %s", key) return c.vs.PutValue(ctx, key, val, opts...) } // FIXME(brian): is this method meant to simulate getting a value from the network? -func (c *client) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { +func (c *client) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) { log.Debugf("GetValue: %s", key) return c.vs.GetValue(ctx, key, opts...) } -func (c *client) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { +func (c *client) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) { log.Debugf("SearchValue: %s", key) return c.vs.SearchValue(ctx, key, opts...) } -func (c *client) FindProviders(ctx context.Context, key cid.Cid) ([]pstore.PeerInfo, error) { +func (c *client) FindProviders(ctx context.Context, key cid.Cid) ([]peer.AddrInfo, error) { return c.server.Providers(key), nil } -func (c *client) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { +func (c *client) FindPeer(ctx context.Context, pid peer.ID) (peer.AddrInfo, error) { log.Debugf("FindPeer: %s", pid) - return pstore.PeerInfo{}, nil + return peer.AddrInfo{}, nil } -func (c *client) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan pstore.PeerInfo { - out := make(chan pstore.PeerInfo) +func (c *client) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan peer.AddrInfo { + out := make(chan peer.AddrInfo) go func() { defer close(out) for i, p := range c.server.Providers(k) { @@ -72,7 +72,7 @@ func (c *client) Provide(_ context.Context, key cid.Cid, brd bool) error { if !brd { return nil } - info := pstore.PeerInfo{ + info := peer.AddrInfo{ ID: c.peer.ID(), Addrs: []ma.Multiaddr{c.peer.Address()}, } @@ -87,4 +87,4 @@ func (c *client) Bootstrap(context.Context) error { return nil } -var _ routing.IpfsRouting = &client{} +var _ routing.Routing = &client{} diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index a223f911b5..9c8bd853c1 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -9,17 +9,17 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-testutil" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-testing/net" offline "github.com/ipfs/go-ipfs-routing/offline" ) // server is the mockrouting.Client's private interface to the routing server type server interface { - Announce(pstore.PeerInfo, cid.Cid) error - Providers(cid.Cid) []pstore.PeerInfo + Announce(peer.AddrInfo, cid.Cid) error + Providers(cid.Cid) []peer.AddrInfo Server } @@ -33,11 +33,11 @@ type s struct { } type providerRecord struct { - Peer pstore.PeerInfo + Peer peer.AddrInfo Created time.Time } -func (rs *s) Announce(p pstore.PeerInfo, c cid.Cid) error { +func (rs *s) Announce(p peer.AddrInfo, c cid.Cid) error { rs.lock.Lock() defer rs.lock.Unlock() @@ -54,14 +54,14 @@ func (rs *s) Announce(p pstore.PeerInfo, c cid.Cid) error { return nil } -func (rs *s) Providers(c cid.Cid) []pstore.PeerInfo { +func (rs *s) Providers(c cid.Cid) []peer.AddrInfo { rs.delayConf.Query.Wait() // before locking rs.lock.RLock() defer rs.lock.RUnlock() k := c.KeyString() - var ret []pstore.PeerInfo + var ret []peer.AddrInfo records, ok := rs.providers[k] if !ok { return ret @@ -80,11 +80,11 @@ func (rs *s) Providers(c cid.Cid) []pstore.PeerInfo { return ret } -func (rs *s) Client(p testutil.Identity) Client { +func (rs *s) Client(p tnet.Identity) Client { return rs.ClientWithDatastore(context.Background(), p, dssync.MutexWrap(ds.NewMapDatastore())) } -func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Identity, datastore ds.Datastore) Client { +func (rs *s) ClientWithDatastore(_ context.Context, p tnet.Identity, datastore ds.Datastore) Client { return &client{ peer: p, vs: offline.NewOfflineRouter(datastore, MockValidator{}), diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 704557a664..2767ff1a29 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,13 +8,14 @@ import ( cid "github.com/ipfs/go-cid" delay "github.com/ipfs/go-ipfs-delay" u "github.com/ipfs/go-ipfs-util" - pstore "github.com/libp2p/go-libp2p-peerstore" - testutil "github.com/libp2p/go-testutil" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-testing/net" ) func TestKeyNotFound(t *testing.T) { - var pi = testutil.RandIdentityOrFatal(t) + var pi = tnet.RandIdentityOrFatal(t) var key = cid.NewCidV0(u.Hash([]byte("mock key"))) var ctx = context.Background() @@ -27,7 +28,7 @@ func TestKeyNotFound(t *testing.T) { } func TestClientFindProviders(t *testing.T) { - pi := testutil.RandIdentityOrFatal(t) + pi := tnet.RandIdentityOrFatal(t) rs := NewServer() client := rs.Client(pi) @@ -58,7 +59,7 @@ func TestClientOverMax(t *testing.T) { k := cid.NewCidV0(u.Hash([]byte("hello"))) numProvidersForHelloKey := 100 for i := 0; i < numProvidersForHelloKey; i++ { - pi := testutil.RandIdentityOrFatal(t) + pi := tnet.RandIdentityOrFatal(t) err := rs.Client(pi).Provide(context.Background(), k, true) if err != nil { t.Fatal(err) @@ -66,7 +67,7 @@ func TestClientOverMax(t *testing.T) { } max := 10 - pi := testutil.RandIdentityOrFatal(t) + pi := tnet.RandIdentityOrFatal(t) client := rs.Client(pi) providersFromClient := client.FindProvidersAsync(context.Background(), k, max) @@ -101,7 +102,7 @@ func TestCanceledContext(t *testing.T) { default: } - pi, err := testutil.RandIdentity() + pi, err := tnet.RandIdentity() if err != nil { t.Error(err) } @@ -113,7 +114,7 @@ func TestCanceledContext(t *testing.T) { } }() - local := testutil.RandIdentityOrFatal(t) + local := tnet.RandIdentityOrFatal(t) client := rs.Client(local) t.Log("warning: max is finite so this test is non-deterministic") @@ -141,7 +142,7 @@ func TestValidAfter(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - pi := testutil.RandIdentityOrFatal(t) + pi := tnet.RandIdentityOrFatal(t) key := cid.NewCidV0(u.Hash([]byte("mock key"))) conf := DelayConfig{ ValueVisibility: delay.Fixed(1 * time.Hour), @@ -152,7 +153,7 @@ func TestValidAfter(t *testing.T) { rs.Client(pi).Provide(ctx, key, true) - var providers []pstore.PeerInfo + var providers []peer.AddrInfo max := 100 providersChan := rs.Client(pi).FindProvidersAsync(ctx, key, max) for p := range providersChan { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 5d4e9f9aa6..6b02065348 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -1,6 +1,6 @@ // Package mockrouting provides a virtual routing server. To use it, // create a virtual routing server and use the Client() method to get a -// routing client (IpfsRouting). The server quacks like a DHT but is +// routing client (Routing). The server quacks like a DHT but is // really a local in-memory hash table. package mockrouting @@ -9,9 +9,10 @@ import ( ds "github.com/ipfs/go-datastore" delay "github.com/ipfs/go-ipfs-delay" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" - "github.com/libp2p/go-testutil" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-testing/net" ) // MockValidator is a record validator that always returns success. @@ -22,13 +23,13 @@ func (MockValidator) Select(_ string, _ [][]byte) (int, error) { return 0, nil } // Server provides mockrouting Clients type Server interface { - Client(p testutil.Identity) Client - ClientWithDatastore(context.Context, testutil.Identity, ds.Datastore) Client + Client(p tnet.Identity) Client + ClientWithDatastore(context.Context, tnet.Identity, ds.Datastore) Client } -// Client implements IpfsRouting +// Client implements Routing type Client interface { - routing.IpfsRouting + routing.Routing } // NewServer returns a mockrouting Server diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 45febc554e..9604ab07c1 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -7,35 +7,35 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" - p2phost "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + record "github.com/libp2p/go-libp2p-record" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" ) type nilclient struct { } -func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte, _ ...ropts.Option) error { +func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte, _ ...routing.Option) error { return nil } -func (c *nilclient) GetValue(_ context.Context, _ string, _ ...ropts.Option) ([]byte, error) { +func (c *nilclient) GetValue(_ context.Context, _ string, _ ...routing.Option) ([]byte, error) { return nil, errors.New("tried GetValue from nil routing") } -func (c *nilclient) SearchValue(_ context.Context, _ string, _ ...ropts.Option) (<-chan []byte, error) { +func (c *nilclient) SearchValue(_ context.Context, _ string, _ ...routing.Option) (<-chan []byte, error) { return nil, errors.New("tried SearchValue from nil routing") } -func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, error) { - return pstore.PeerInfo{}, nil +func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (peer.AddrInfo, error) { + return peer.AddrInfo{}, nil } -func (c *nilclient) FindProvidersAsync(_ context.Context, _ cid.Cid, _ int) <-chan pstore.PeerInfo { - out := make(chan pstore.PeerInfo) +func (c *nilclient) FindProvidersAsync(_ context.Context, _ cid.Cid, _ int) <-chan peer.AddrInfo { + out := make(chan peer.AddrInfo) defer close(out) return out } @@ -48,10 +48,10 @@ func (c *nilclient) Bootstrap(_ context.Context) error { return nil } -// ConstructNilRouting creates an IpfsRouting client which does nothing. -func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ ds.Batching, _ record.Validator) (routing.IpfsRouting, error) { +// ConstructNilRouting creates an Routing client which does nothing. +func ConstructNilRouting(_ context.Context, _ host.Host, _ ds.Batching, _ record.Validator) (routing.Routing, error) { return &nilclient{}, nil } // ensure nilclient satisfies interface -var _ routing.IpfsRouting = &nilclient{} +var _ routing.Routing = &nilclient{} diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 1627490c23..c76f920983 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -1,4 +1,4 @@ -// Package offline implements IpfsRouting with a client which +// Package offline implements Routing with a client which // is only able to perform offline operations. package offline @@ -12,29 +12,29 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dshelp "github.com/ipfs/go-ipfs-ds-help" - "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/routing" + record "github.com/libp2p/go-libp2p-record" pb "github.com/libp2p/go-libp2p-record/pb" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" ) // ErrOffline is returned when trying to perform operations that // require connectivity. var ErrOffline = errors.New("routing system in offline mode") -// NewOfflineRouter returns an IpfsRouting implementation which only performs +// NewOfflineRouter returns an Routing implementation which only performs // offline operations. It allows to Put and Get signed dht // records to and from the local datastore. -func NewOfflineRouter(dstore ds.Datastore, validator record.Validator) routing.IpfsRouting { +func NewOfflineRouter(dstore ds.Datastore, validator record.Validator) routing.Routing { return &offlineRouting{ datastore: dstore, validator: validator, } } -// offlineRouting implements the IpfsRouting interface, +// offlineRouting implements the Routing interface, // but only provides the capability to Put and Get signed dht // records to and from the local datastore. type offlineRouting struct { @@ -42,7 +42,7 @@ type offlineRouting struct { validator record.Validator } -func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ ...ropts.Option) error { +func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ ...routing.Option) error { if err := c.validator.Validate(key, val); err != nil { return err } @@ -70,7 +70,7 @@ func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data) } -func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Option) ([]byte, error) { +func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...routing.Option) ([]byte, error) { buf, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err @@ -90,7 +90,7 @@ func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...ropts.Op return val, nil } -func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...ropts.Option) (<-chan []byte, error) { +func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...routing.Option) (<-chan []byte, error) { out := make(chan []byte, 1) go func() { defer close(out) @@ -102,12 +102,12 @@ func (c *offlineRouting) SearchValue(ctx context.Context, key string, _ ...ropts return out, nil } -func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) { - return pstore.PeerInfo{}, ErrOffline +func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (peer.AddrInfo, error) { + return peer.AddrInfo{}, ErrOffline } -func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan pstore.PeerInfo { - out := make(chan pstore.PeerInfo) +func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k cid.Cid, max int) <-chan peer.AddrInfo { + out := make(chan peer.AddrInfo) close(out) return out } @@ -124,5 +124,5 @@ func (c *offlineRouting) Bootstrap(context.Context) error { return nil } -// ensure offlineRouting matches the IpfsRouting interface -var _ routing.IpfsRouting = &offlineRouting{} +// ensure offlineRouting matches the Routing interface +var _ routing.Routing = &offlineRouting{} diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 9703bac573..00e0174ba9 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -7,8 +7,10 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" - ropt "github.com/libp2p/go-libp2p-routing/options" - testutil "github.com/libp2p/go-testutil" + + "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-core/test" + mh "github.com/multiformats/go-multihash" ) @@ -40,12 +42,12 @@ func TestOfflineRouterStorage(t *testing.T) { t.Fatal("Router should throw errors for unfound records") } - local, err := offline.GetValue(ctx, "key", ropt.Offline) + local, err := offline.GetValue(ctx, "key", routing.Offline) if err != nil { t.Fatal(err) } - _, err = offline.GetValue(ctx, "notHere", ropt.Offline) + _, err = offline.GetValue(ctx, "notHere", routing.Offline) if err == nil { t.Fatal("Router should throw errors for unfound records") } @@ -61,7 +63,7 @@ func TestOfflineRouterLocal(t *testing.T) { nds := ds.NewMapDatastore() offline := NewOfflineRouter(nds, blankValidator{}) - id, _ := testutil.RandPeerID() + id, _ := test.RandPeerID() _, err := offline.FindPeer(ctx, id) if err != ErrOffline { t.Fatal("OfflineRouting should alert that its offline") From 1f2b5ca04f4cb9d5fe9b11d4c58edb91bab8b2a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 28 May 2019 17:09:34 +0100 Subject: [PATCH 2699/3147] migrate to go-libp2p-core. This commit was moved from ipfs/interface-go-ipfs-core@2cc0c497f2b0b14a4ac22989a3861c1a2b0038c4 --- coreiface/dht.go | 7 +++---- coreiface/key.go | 2 +- coreiface/pubsub.go | 2 +- coreiface/swarm.go | 12 ++++++------ 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 0cb7893ef3..5f49e74a35 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -6,8 +6,7 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/peer" ) // DhtAPI specifies the interface to the DHT @@ -16,11 +15,11 @@ import ( type DhtAPI interface { // FindPeer queries the DHT for all of the multiaddresses associated with a // Peer ID - FindPeer(context.Context, peer.ID) (pstore.PeerInfo, error) + FindPeer(context.Context, peer.ID) (peer.AddrInfo, error) // FindProviders finds peers in the DHT who can provide a specific value // given a key. - FindProviders(context.Context, path.Path, ...options.DhtFindProvidersOption) (<-chan pstore.PeerInfo, error) + FindProviders(context.Context, path.Path, ...options.DhtFindProvidersOption) (<-chan peer.AddrInfo, error) // Provide announces to the network that you are providing given values Provide(context.Context, path.Path, ...options.DhtProvideOption) error diff --git a/coreiface/key.go b/coreiface/key.go index e7fb3f4427..db729b3b41 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -6,7 +6,7 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index 212e772253..d9826551d4 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -6,7 +6,7 @@ import ( options "github.com/ipfs/interface-go-ipfs-core/options" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/coreiface/swarm.go b/coreiface/swarm.go index 2e00ecbd31..d7b25d5e87 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,10 +5,10 @@ import ( "errors" "time" - net "github.com/libp2p/go-libp2p-net" - "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-libp2p-protocol" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" + ma "github.com/multiformats/go-multiaddr" ) @@ -26,7 +26,7 @@ type ConnectionInfo interface { Address() ma.Multiaddr // Direction returns which way the connection was established - Direction() net.Direction + Direction() network.Direction // Latency returns last known round trip time to the peer Latency() (time.Duration, error) @@ -38,7 +38,7 @@ type ConnectionInfo interface { // SwarmAPI specifies the interface to libp2p swarm type SwarmAPI interface { // Connect to a given peer - Connect(context.Context, pstore.PeerInfo) error + Connect(context.Context, peer.AddrInfo) error // Disconnect from a given address Disconnect(context.Context, ma.Multiaddr) error From 71415df55b5d8e528ce29aa9626cd2e145b66207 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 17 Apr 2019 10:08:08 -0700 Subject: [PATCH 2700/3147] Introduce first strategic provider: do nothing License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@e3c70dfd532e93a554431d9c0a9782cbd252f445 --- provider/offline.go | 20 ++- provider/provider.go | 70 ++------ provider/{ => queue}/queue.go | 5 +- provider/{ => queue}/queue_test.go | 5 +- provider/simple/provider.go | 72 ++++++++ provider/{ => simple}/provider_test.go | 14 +- provider/simple/reprovide.go | 225 +++++++++++++++++++++++++ provider/simple/reprovide_test.go | 61 +++++++ provider/system.go | 47 ++++++ 9 files changed, 448 insertions(+), 71 deletions(-) rename provider/{ => queue}/queue.go (98%) rename provider/{ => queue}/queue_test.go (96%) create mode 100644 provider/simple/provider.go rename provider/{ => simple}/provider_test.go (86%) create mode 100644 provider/simple/reprovide.go create mode 100644 provider/simple/reprovide_test.go create mode 100644 provider/system.go diff --git a/provider/offline.go b/provider/offline.go index 0c91ed2af7..eb1d1b9acd 100644 --- a/provider/offline.go +++ b/provider/offline.go @@ -1,20 +1,28 @@ package provider -import "github.com/ipfs/go-cid" +import ( + "context" + "github.com/ipfs/go-cid" +) type offlineProvider struct{} -// NewOfflineProvider creates a Provider that does nothing -func NewOfflineProvider() Provider { +// NewOfflineProvider creates a ProviderSystem that does nothing +func NewOfflineProvider() System { return &offlineProvider{} } -func (op *offlineProvider) Run() {} +func (op *offlineProvider) Run() { +} -func (op *offlineProvider) Provide(cid cid.Cid) error { +func (op *offlineProvider) Close() error { return nil } -func (op *offlineProvider) Close() error { +func (op *offlineProvider) Provide(_ cid.Cid) error { + return nil +} + +func (op *offlineProvider) Reprovide(_ context.Context) error { return nil } diff --git a/provider/provider.go b/provider/provider.go index 67c5c6b6b9..e8939ba6f7 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -1,18 +1,18 @@ -// Package provider implements structures and methods to provide blocks, -// keep track of which blocks are provided, and to allow those blocks to -// be reprovided. package provider import ( "context" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-routing" ) -var log = logging.Logger("provider") +var ( + // StrategicProvidingEnabled toggles between the original providing mechanism + // and the new strategic providing system + StrategicProvidingEnabled = false -const provideOutgoingWorkerLimit = 8 + log = logging.Logger("provider") +) // Provider announces blocks to the network type Provider interface { @@ -24,56 +24,10 @@ type Provider interface { Close() error } -type provider struct { - ctx context.Context - // the CIDs for which provide announcements should be made - queue *Queue - // used to announce providing to the network - contentRouting routing.ContentRouting -} - -// NewProvider creates a provider that announces blocks to the network using a content router -func NewProvider(ctx context.Context, queue *Queue, contentRouting routing.ContentRouting) Provider { - return &provider{ - ctx: ctx, - queue: queue, - contentRouting: contentRouting, - } -} - -// Close stops the provider -func (p *provider) Close() error { - p.queue.Close() - return nil -} - -// Start workers to handle provide requests. -func (p *provider) Run() { - p.handleAnnouncements() -} - -// Provide the given cid using specified strategy. -func (p *provider) Provide(root cid.Cid) error { - p.queue.Enqueue(root) - return nil -} - -// Handle all outgoing cids by providing (announcing) them -func (p *provider) handleAnnouncements() { - for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { - go func() { - for p.ctx.Err() == nil { - select { - case <-p.ctx.Done(): - return - case c := <-p.queue.Dequeue(): - log.Info("announce - start - ", c) - if err := p.contentRouting.Provide(p.ctx, c, true); err != nil { - log.Warningf("Unable to provide entry: %s, %s", c, err) - } - log.Info("announce - end - ", c) - } - } - }() - } +// Reprovider reannounces blocks to the network +type Reprovider interface { + // Run is used to begin processing the reprovider work and waiting for reprovide triggers + Run() + // Trigger a reprovide + Trigger(context.Context) error } diff --git a/provider/queue.go b/provider/queue/queue.go similarity index 98% rename from provider/queue.go rename to provider/queue/queue.go index 8fdfca8152..2afbc81ee9 100644 --- a/provider/queue.go +++ b/provider/queue/queue.go @@ -1,4 +1,4 @@ -package provider +package queue import ( "context" @@ -10,8 +10,11 @@ import ( datastore "github.com/ipfs/go-datastore" namespace "github.com/ipfs/go-datastore/namespace" query "github.com/ipfs/go-datastore/query" + logging "github.com/ipfs/go-log" ) +var log = logging.Logger("provider.queue") + // Queue provides a durable, FIFO interface to the datastore for storing cids // // Durability just means that cids in the process of being provided when a diff --git a/provider/queue_test.go b/provider/queue/queue_test.go similarity index 96% rename from provider/queue_test.go rename to provider/queue/queue_test.go index e151478d9f..c8fb8682e3 100644 --- a/provider/queue_test.go +++ b/provider/queue/queue_test.go @@ -1,4 +1,4 @@ -package provider +package queue import ( "context" @@ -8,8 +8,11 @@ import ( cid "github.com/ipfs/go-cid" datastore "github.com/ipfs/go-datastore" sync "github.com/ipfs/go-datastore/sync" + "github.com/ipfs/go-ipfs-blocksutil" ) +var blockGenerator = blocksutil.NewBlockGenerator() + func makeCids(n int) []cid.Cid { cids := make([]cid.Cid, 0, n) for i := 0; i < n; i++ { diff --git a/provider/simple/provider.go b/provider/simple/provider.go new file mode 100644 index 0000000000..8310cebb3a --- /dev/null +++ b/provider/simple/provider.go @@ -0,0 +1,72 @@ +// Package simple implements structures and methods to provide blocks, +// keep track of which blocks are provided, and to allow those blocks to +// be reprovided. +package simple + +import ( + "context" + + cid "github.com/ipfs/go-cid" + q "github.com/ipfs/go-ipfs/provider/queue" + logging "github.com/ipfs/go-log" + routing "github.com/libp2p/go-libp2p-routing" +) + +var logP = logging.Logger("provider.simple") + +const provideOutgoingWorkerLimit = 8 + +// Provider announces blocks to the network +type Provider struct { + ctx context.Context + // the CIDs for which provide announcements should be made + queue *q.Queue + // used to announce providing to the network + contentRouting routing.ContentRouting +} + +// NewProvider creates a provider that announces blocks to the network using a content router +func NewProvider(ctx context.Context, queue *q.Queue, contentRouting routing.ContentRouting) *Provider { + return &Provider{ + ctx: ctx, + queue: queue, + contentRouting: contentRouting, + } +} + +// Close stops the provider +func (p *Provider) Close() error { + p.queue.Close() + return nil +} + +// Run workers to handle provide requests. +func (p *Provider) Run() { + p.handleAnnouncements() +} + +// Provide the given cid using specified strategy. +func (p *Provider) Provide(root cid.Cid) error { + p.queue.Enqueue(root) + return nil +} + +// Handle all outgoing cids by providing (announcing) them +func (p *Provider) handleAnnouncements() { + for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { + go func() { + for p.ctx.Err() == nil { + select { + case <-p.ctx.Done(): + return + case c := <-p.queue.Dequeue(): + logP.Info("announce - start - ", c) + if err := p.contentRouting.Provide(p.ctx, c, true); err != nil { + logP.Warningf("Unable to provide entry: %s, %s", c, err) + } + logP.Info("announce - end - ", c) + } + } + }() + } +} diff --git a/provider/provider_test.go b/provider/simple/provider_test.go similarity index 86% rename from provider/provider_test.go rename to provider/simple/provider_test.go index 7ef007b03a..6f70a41d72 100644 --- a/provider/provider_test.go +++ b/provider/simple/provider_test.go @@ -1,4 +1,4 @@ -package provider +package simple_test import ( "context" @@ -11,6 +11,10 @@ import ( sync "github.com/ipfs/go-datastore/sync" blocksutil "github.com/ipfs/go-ipfs-blocksutil" pstore "github.com/libp2p/go-libp2p-peerstore" + + q "github.com/ipfs/go-ipfs/provider/queue" + + . "github.com/ipfs/go-ipfs/provider/simple" ) var blockGenerator = blocksutil.NewBlockGenerator() @@ -39,15 +43,15 @@ func TestAnnouncement(t *testing.T) { defer ctx.Done() ds := sync.MutexWrap(datastore.NewMapDatastore()) - queue, err := NewQueue(ctx, "test", ds) + queue, err := q.NewQueue(ctx, "test", ds) if err != nil { t.Fatal(err) } r := mockContentRouting() - provider := NewProvider(ctx, queue, r) - provider.Run() + prov := NewProvider(ctx, queue, r) + prov.Run() cids := cid.NewSet() @@ -58,7 +62,7 @@ func TestAnnouncement(t *testing.T) { go func() { for _, c := range cids.Keys() { - err = provider.Provide(c) + err = prov.Provide(c) // A little goroutine stirring to exercise some different states r := rand.Intn(10) time.Sleep(time.Microsecond * time.Duration(r)) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go new file mode 100644 index 0000000000..73b733ce24 --- /dev/null +++ b/provider/simple/reprovide.go @@ -0,0 +1,225 @@ +package simple + +import ( + "context" + "fmt" + "time" + + backoff "github.com/cenkalti/backoff" + cid "github.com/ipfs/go-cid" + cidutil "github.com/ipfs/go-cidutil" + blocks "github.com/ipfs/go-ipfs-blockstore" + pin "github.com/ipfs/go-ipfs/pin" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" + merkledag "github.com/ipfs/go-merkledag" + verifcid "github.com/ipfs/go-verifcid" + routing "github.com/libp2p/go-libp2p-routing" +) + +var logR = logging.Logger("reprovider.simple") + +//KeyChanFunc is function streaming CIDs to pass to content routing +type KeyChanFunc func(context.Context) (<-chan cid.Cid, error) +type doneFunc func(error) + +// Reprovider reannounces blocks to the network +type Reprovider struct { + ctx context.Context + trigger chan doneFunc + + // The routing system to provide values through + rsys routing.ContentRouting + + keyProvider KeyChanFunc + + tick time.Duration +} + +// NewReprovider creates new Reprovider instance. +func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys routing.ContentRouting, keyProvider KeyChanFunc) *Reprovider { + return &Reprovider{ + ctx: ctx, + trigger: make(chan doneFunc), + + rsys: rsys, + keyProvider: keyProvider, + tick: reprovideIniterval, + } +} + +// Close the reprovider +func (rp *Reprovider) Close() error { + return nil +} + +// Run re-provides keys with 'tick' interval or when triggered +func (rp *Reprovider) Run() { + // dont reprovide immediately. + // may have just started the daemon and shutting it down immediately. + // probability( up another minute | uptime ) increases with uptime. + after := time.After(time.Minute) + var done doneFunc + for { + if rp.tick == 0 { + after = make(chan time.Time) + } + + select { + case <-rp.ctx.Done(): + return + case done = <-rp.trigger: + case <-after: + } + + //'mute' the trigger channel so when `ipfs bitswap reprovide` is called + //a 'reprovider is already running' error is returned + unmute := rp.muteTrigger() + + err := rp.Reprovide() + if err != nil { + logR.Debug(err) + } + + if done != nil { + done(err) + } + + unmute() + + after = time.After(rp.tick) + } +} + +// Reprovide registers all keys given by rp.keyProvider to libp2p content routing +func (rp *Reprovider) Reprovide() error { + keychan, err := rp.keyProvider(rp.ctx) + if err != nil { + return fmt.Errorf("failed to get key chan: %s", err) + } + for c := range keychan { + // hash security + if err := verifcid.ValidateCid(c); err != nil { + logR.Errorf("insecure hash in reprovider, %s (%s)", c, err) + continue + } + op := func() error { + err := rp.rsys.Provide(rp.ctx, c, true) + if err != nil { + logR.Debugf("Failed to provide key: %s", err) + } + return err + } + + // TODO: this backoff library does not respect our context, we should + // eventually work contexts into it. low priority. + err := backoff.Retry(op, backoff.NewExponentialBackOff()) + if err != nil { + logR.Debugf("Providing failed after number of retries: %s", err) + return err + } + } + return nil +} + +// Trigger starts reprovision process in rp.Run and waits for it +func (rp *Reprovider) Trigger(ctx context.Context) error { + progressCtx, done := context.WithCancel(ctx) + + var err error + df := func(e error) { + err = e + done() + } + + select { + case <-rp.ctx.Done(): + return context.Canceled + case <-ctx.Done(): + return context.Canceled + case rp.trigger <- df: + <-progressCtx.Done() + return err + } +} + +func (rp *Reprovider) muteTrigger() context.CancelFunc { + ctx, cf := context.WithCancel(rp.ctx) + go func() { + defer cf() + for { + select { + case <-ctx.Done(): + return + case done := <-rp.trigger: + done(fmt.Errorf("reprovider is already running")) + } + } + }() + + return cf +} + +// Strategies + +// NewBlockstoreProvider returns key provider using bstore.AllKeysChan +func NewBlockstoreProvider(bstore blocks.Blockstore) KeyChanFunc { + return func(ctx context.Context) (<-chan cid.Cid, error) { + return bstore.AllKeysChan(ctx) + } +} + +// NewPinnedProvider returns provider supplying pinned keys +func NewPinnedProvider(onlyRoots bool) func(pin.Pinner, ipld.DAGService) KeyChanFunc { + return func(pinning pin.Pinner, dag ipld.DAGService) KeyChanFunc { + return func(ctx context.Context) (<-chan cid.Cid, error) { + set, err := pinSet(ctx, pinning, dag, onlyRoots) + if err != nil { + return nil, err + } + + outCh := make(chan cid.Cid) + go func() { + defer close(outCh) + for c := range set.New { + select { + case <-ctx.Done(): + return + case outCh <- c: + } + } + + }() + + return outCh, nil + } + } +} + +func pinSet(ctx context.Context, pinning pin.Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { + set := cidutil.NewStreamingSet() + + go func() { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + defer close(set.New) + + for _, key := range pinning.DirectKeys() { + set.Visitor(ctx)(key) + } + + for _, key := range pinning.RecursiveKeys() { + set.Visitor(ctx)(key) + + if !onlyRoots { + err := merkledag.EnumerateChildren(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) + if err != nil { + logR.Errorf("reprovide indirect pins: %s", err) + return + } + } + } + }() + + return set, nil +} diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go new file mode 100644 index 0000000000..17c626c5b9 --- /dev/null +++ b/provider/simple/reprovide_test.go @@ -0,0 +1,61 @@ +package simple_test + +import ( + "context" + "testing" + "time" + + blocks "github.com/ipfs/go-block-format" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + "github.com/ipfs/go-ipfs-blockstore" + mock "github.com/ipfs/go-ipfs-routing/mock" + pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-testutil" + + . "github.com/ipfs/go-ipfs/provider/simple" +) + +func TestReprovide(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + mrserv := mock.NewServer() + + idA := testutil.RandIdentityOrFatal(t) + idB := testutil.RandIdentityOrFatal(t) + + clA := mrserv.Client(idA) + clB := mrserv.Client(idB) + + bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + + blk := blocks.NewBlock([]byte("this is a test")) + err := bstore.Put(blk) + if err != nil { + t.Fatal(err) + } + + keyProvider := NewBlockstoreProvider(bstore) + reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) + err = reprov.Reprovide() + if err != nil { + t.Fatal(err) + } + + var providers []pstore.PeerInfo + maxProvs := 100 + + provChan := clB.FindProvidersAsync(ctx, blk.Cid(), maxProvs) + for p := range provChan { + providers = append(providers, p) + } + + if len(providers) == 0 { + t.Fatal("Should have gotten a provider") + } + + if providers[0].ID != idA.ID() { + t.Fatal("Somehow got the wrong peer back as a provider.") + } +} diff --git a/provider/system.go b/provider/system.go new file mode 100644 index 0000000000..6bc1d357cb --- /dev/null +++ b/provider/system.go @@ -0,0 +1,47 @@ +package provider + +import ( + "context" + "github.com/ipfs/go-cid" +) + +// System defines the interface for interacting with the value +// provider system +type System interface { + Run() + Close() error + Provide(cid.Cid) error + Reprovide(context.Context) error +} + +type system struct { + provider Provider + reprovider Reprovider +} + +// NewSystem constructs a new provider system from a provider and reprovider +func NewSystem(provider Provider, reprovider Reprovider) System { + return &system{provider, reprovider} +} + +// Run the provider system by running the provider and reprovider +func (s *system) Run() { + go s.provider.Run() + go s.reprovider.Run() +} + +// Close the provider and reprovider +func (s *system) Close() error { + // TODO: Close reprovider here + return s.provider.Close() +} + +// Provide a value +func (s *system) Provide(cid cid.Cid) error { + return s.provider.Provide(cid) +} + +// Reprovide all the previously provided values +func (s *system) Reprovide(ctx context.Context) error { + return s.reprovider.Trigger(ctx) +} From be52bbe69ede891acb30ff9adcf75ac5532853a3 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Mon, 6 May 2019 11:24:35 -0700 Subject: [PATCH 2701/3147] Remove unnecessary _ License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@7d7655da46fbe7b03da2aaf9f3676a1616d5acd6 --- provider/offline.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/provider/offline.go b/provider/offline.go index eb1d1b9acd..5511364ed7 100644 --- a/provider/offline.go +++ b/provider/offline.go @@ -19,10 +19,10 @@ func (op *offlineProvider) Close() error { return nil } -func (op *offlineProvider) Provide(_ cid.Cid) error { +func (op *offlineProvider) Provide(cid.Cid) error { return nil } -func (op *offlineProvider) Reprovide(_ context.Context) error { +func (op *offlineProvider) Reprovide(context.Context) error { return nil } From 4f924d987cf4042397c6200b8e2376625574ceb1 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Mon, 6 May 2019 11:46:26 -0700 Subject: [PATCH 2702/3147] Close reprovider in the provider system License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@29621ab7788e322f42784a39131dfb2e5609eeaa --- provider/provider.go | 2 ++ provider/system.go | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index e8939ba6f7..689bfeb1b0 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -30,4 +30,6 @@ type Reprovider interface { Run() // Trigger a reprovide Trigger(context.Context) error + // Close stops the reprovider + Close() error } diff --git a/provider/system.go b/provider/system.go index 6bc1d357cb..b3e17ee40c 100644 --- a/provider/system.go +++ b/provider/system.go @@ -32,8 +32,20 @@ func (s *system) Run() { // Close the provider and reprovider func (s *system) Close() error { - // TODO: Close reprovider here - return s.provider.Close() + var errs []error + + if err := s.provider.Close(); err != nil { + errs = append(errs, err) + } + + if err := s.reprovider.Close(); err != nil { + errs = append(errs, err) + } + + if len(errs) > 0 { + return errs[0] + } + return nil } // Provide a value From c704a5b39ec54b7d6581c7290f12d0de929b98fd Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Mon, 6 May 2019 14:54:41 -0700 Subject: [PATCH 2703/3147] Remove unused strategic providing feature flag License: MIT Signed-off-by: Michael Avila This commit was moved from ipfs/go-ipfs-provider@313c41c327fd3000d0c6a027333d66693880c3c9 --- provider/provider.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index 689bfeb1b0..751d7cd631 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -6,13 +6,7 @@ import ( logging "github.com/ipfs/go-log" ) -var ( - // StrategicProvidingEnabled toggles between the original providing mechanism - // and the new strategic providing system - StrategicProvidingEnabled = false - - log = logging.Logger("provider") -) +var log = logging.Logger("provider") // Provider announces blocks to the network type Provider interface { From e32e76160186688dbdcfbb6eb61e7c51246f0915 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 22 May 2019 14:04:59 -0700 Subject: [PATCH 2704/3147] Remove unused logger in provider This commit was moved from ipfs/go-ipfs-provider@f8ac9dae80c6f1ce42f240f2f4e12835fc202af1 --- provider/provider.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/provider/provider.go b/provider/provider.go index 751d7cd631..7dec4c172e 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -3,11 +3,8 @@ package provider import ( "context" "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log" ) -var log = logging.Logger("provider") - // Provider announces blocks to the network type Provider interface { // Run is used to begin processing the provider work From 8fa0e7f946f4130e3e92f550f3e426a7399a683c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 31 May 2019 18:19:29 -0700 Subject: [PATCH 2705/3147] migrate to go-libp2p-core This commit was moved from ipfs/go-mfs@a6cdb51b96dbc76be9e28440be5c7de62bf2d77e --- mfs/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/repub_test.go b/mfs/repub_test.go index 3a7eaaf701..6be5624ab1 100644 --- a/mfs/repub_test.go +++ b/mfs/repub_test.go @@ -6,7 +6,7 @@ import ( "time" cid "github.com/ipfs/go-cid" - ci "github.com/libp2p/go-testutil/ci" + ci "github.com/libp2p/go-libp2p-testing/ci" ) func TestRepublisher(t *testing.T) { From 97950e8f04f3d9908dd86d99db0d61aa2ba177d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 28 May 2019 17:21:57 +0100 Subject: [PATCH 2706/3147] migrate to go-libp2p-core. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #6391 License: MIT Signed-off-by: Raúl Kripalani This commit was moved from ipfs/go-ipfs-provider@095af8f253aed3b34efebeba4e3a4c5ed5b755b7 --- provider/simple/provider.go | 2 +- provider/simple/provider_test.go | 4 ++-- provider/simple/reprovide.go | 2 +- provider/simple/reprovide_test.go | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index 8310cebb3a..abe13ce598 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -9,7 +9,7 @@ import ( cid "github.com/ipfs/go-cid" q "github.com/ipfs/go-ipfs/provider/queue" logging "github.com/ipfs/go-log" - routing "github.com/libp2p/go-libp2p-routing" + routing "github.com/libp2p/go-libp2p-core/routing" ) var logP = logging.Logger("provider.simple") diff --git a/provider/simple/provider_test.go b/provider/simple/provider_test.go index 6f70a41d72..4922958c8c 100644 --- a/provider/simple/provider_test.go +++ b/provider/simple/provider_test.go @@ -10,7 +10,7 @@ import ( datastore "github.com/ipfs/go-datastore" sync "github.com/ipfs/go-datastore/sync" blocksutil "github.com/ipfs/go-ipfs-blocksutil" - pstore "github.com/libp2p/go-libp2p-peerstore" + peer "github.com/libp2p/go-libp2p-core/peer" q "github.com/ipfs/go-ipfs/provider/queue" @@ -28,7 +28,7 @@ func (r *mockRouting) Provide(ctx context.Context, cid cid.Cid, recursive bool) return nil } -func (r *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, timeout int) <-chan pstore.PeerInfo { +func (r *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, timeout int) <-chan peer.AddrInfo { return nil } diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 73b733ce24..ce5c71812f 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -14,7 +14,7 @@ import ( logging "github.com/ipfs/go-log" merkledag "github.com/ipfs/go-merkledag" verifcid "github.com/ipfs/go-verifcid" - routing "github.com/libp2p/go-libp2p-routing" + routing "github.com/libp2p/go-libp2p-core/routing" ) var logR = logging.Logger("reprovider.simple") diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 17c626c5b9..e9925e55ec 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -10,8 +10,8 @@ import ( dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs-blockstore" mock "github.com/ipfs/go-ipfs-routing/mock" - pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-testutil" + peer "github.com/libp2p/go-libp2p-core/peer" + testutil "github.com/libp2p/go-libp2p-testing/net" . "github.com/ipfs/go-ipfs/provider/simple" ) @@ -43,7 +43,7 @@ func TestReprovide(t *testing.T) { t.Fatal(err) } - var providers []pstore.PeerInfo + var providers []peer.AddrInfo maxProvs := 100 provChan := clB.FindProvidersAsync(ctx, blk.Cid(), maxProvs) From 53c3e0cfdf4577b5e2e776ae5b7b919fe9b85304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 28 May 2019 17:21:57 +0100 Subject: [PATCH 2707/3147] migrate to go-libp2p-core. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #6391 License: MIT Signed-off-by: Raúl Kripalani This commit was moved from ipfs/go-namesys@3c8536299a1ec2c8c86303ea45057622190072b6 --- namesys/interface.go | 2 +- namesys/ipns_resolver_validation_test.go | 17 ++++++++--------- namesys/namesys.go | 6 +++--- namesys/namesys_test.go | 4 ++-- namesys/publisher.go | 6 +++--- namesys/publisher_test.go | 6 +++--- namesys/republisher/repub.go | 4 ++-- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve_test.go | 12 +++++++----- namesys/routing.go | 4 ++-- 10 files changed, 33 insertions(+), 32 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 4db95ab3ca..ecd80943be 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -37,7 +37,7 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-core/crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 71335b5223..9eed8375bb 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -13,14 +13,13 @@ import ( ipns "github.com/ipfs/go-ipns" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + pstore "github.com/libp2p/go-libp2p-core/peerstore" + routing "github.com/libp2p/go-libp2p-core/routing" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" - routing "github.com/libp2p/go-libp2p-routing" - ropts "github.com/libp2p/go-libp2p-routing/options" - testutil "github.com/libp2p/go-testutil" + testutil "github.com/libp2p/go-libp2p-testing/net" ) func TestResolverValidation(t *testing.T) { @@ -168,11 +167,11 @@ func newMockValueStore(id testutil.Identity, dstore ds.Datastore, kbook pstore.K } } -func (m *mockValueStore) GetValue(ctx context.Context, k string, opts ...ropts.Option) ([]byte, error) { +func (m *mockValueStore) GetValue(ctx context.Context, k string, opts ...routing.Option) ([]byte, error) { return m.r.GetValue(ctx, k, opts...) } -func (m *mockValueStore) SearchValue(ctx context.Context, k string, opts ...ropts.Option) (<-chan []byte, error) { +func (m *mockValueStore) SearchValue(ctx context.Context, k string, opts ...routing.Option) (<-chan []byte, error) { return m.r.SearchValue(ctx, k, opts...) } @@ -196,6 +195,6 @@ func (m *mockValueStore) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey return pk, m.kbook.AddPubKey(p, pk) } -func (m *mockValueStore) PutValue(ctx context.Context, k string, d []byte, opts ...ropts.Option) error { +func (m *mockValueStore) PutValue(ctx context.Context, k string, d []byte, opts ...routing.Option) error { return m.r.PutValue(ctx, k, d, opts...) } diff --git a/namesys/namesys.go b/namesys/namesys.go index f8b8c6d12e..6d59c62e33 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -10,9 +10,9 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" isd "github.com/jbenet/go-is-domain" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + routing "github.com/libp2p/go-libp2p-core/routing" mh "github.com/multiformats/go-multihash" ) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 2cf316cf32..031ae833ac 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -12,8 +12,8 @@ import ( path "github.com/ipfs/go-path" "github.com/ipfs/go-unixfs" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index e43858d02f..c06deb795a 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -15,9 +15,9 @@ import ( pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" ft "github.com/ipfs/go-unixfs" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + routing "github.com/libp2p/go-libp2p-core/routing" base32 "github.com/whyrusleeping/base32" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 53cc6735ee..0b7b2c9399 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -11,9 +11,9 @@ import ( dshelp "github.com/ipfs/go-ipfs-ds-help" mockrouting "github.com/ipfs/go-ipfs-routing/mock" ipns "github.com/ipfs/go-ipns" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - testutil "github.com/libp2p/go-testutil" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + testutil "github.com/libp2p/go-libp2p-testing/net" ma "github.com/multiformats/go-multiaddr" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 1092ba3a57..9e7272d32e 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -15,8 +15,8 @@ import ( logging "github.com/ipfs/go-log" goprocess "github.com/jbenet/goprocess" gpctx "github.com/jbenet/goprocess/context" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ic "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 48a0b086f0..5fedc3907a 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -14,7 +14,7 @@ import ( path "github.com/ipfs/go-path" goprocess "github.com/jbenet/goprocess" - pstore "github.com/libp2p/go-libp2p-peerstore" + peer "github.com/libp2p/go-libp2p-core/peer" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" ) @@ -47,7 +47,7 @@ func TestRepublish(t *testing.T) { } bsinf := bootstrap.BootstrapConfigWithPeers( - []pstore.PeerInfo{ + []peer.AddrInfo{ nodes[0].Peerstore.PeerInfo(nodes[0].Identity), }, ) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 8820614486..814bf59730 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,8 +11,10 @@ import ( mockrouting "github.com/ipfs/go-ipfs-routing/mock" ipns "github.com/ipfs/go-ipns" path "github.com/ipfs/go-path" - peer "github.com/libp2p/go-libp2p-peer" - testutil "github.com/libp2p/go-testutil" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + test "github.com/libp2p/go-libp2p-core/test" + testutil "github.com/libp2p/go-libp2p-testing/net" ) func TestRoutingResolve(t *testing.T) { @@ -24,7 +26,7 @@ func TestRoutingResolve(t *testing.T) { resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) - privk, pubk, err := testutil.RandTestKeyPair(512) + privk, pubk, err := test.RandTestKeyPair(ci.RSA, 512) if err != nil { t.Fatal(err) } @@ -57,7 +59,7 @@ func TestPrexistingExpiredRecord(t *testing.T) { resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) - privk, pubk, err := testutil.RandTestKeyPair(512) + privk, pubk, err := test.RandTestKeyPair(ci.RSA, 512) if err != nil { t.Fatal(err) } @@ -99,7 +101,7 @@ func TestPrexistingRecord(t *testing.T) { resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) - privk, pubk, err := testutil.RandTestKeyPair(512) + privk, pubk, err := test.RandTestKeyPair(ci.RSA, 512) if err != nil { t.Fatal(err) } diff --git a/namesys/routing.go b/namesys/routing.go index e89dd9c9d4..94c12a7261 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -12,9 +12,9 @@ import ( logging "github.com/ipfs/go-log" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" + peer "github.com/libp2p/go-libp2p-core/peer" + routing "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" - peer "github.com/libp2p/go-libp2p-peer" - routing "github.com/libp2p/go-libp2p-routing" mh "github.com/multiformats/go-multihash" ) From 1761264ece49ba93aad1c293100fd7bd3fb89131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 28 May 2019 17:21:57 +0100 Subject: [PATCH 2708/3147] migrate to go-libp2p-core. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #6391 License: MIT Signed-off-by: Raúl Kripalani This commit was moved from ipfs/go-ipfs-keystore@b10263a4cef90848a63d25b02271dbd695a11254 --- keystore/keystore.go | 2 +- keystore/keystore_test.go | 2 +- keystore/memkeystore.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index d9467f263c..237d4b05c3 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -8,7 +8,7 @@ import ( "strings" logging "github.com/ipfs/go-log" - ci "github.com/libp2p/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-core/crypto" ) var log = logging.Logger("keystore") diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index d7118d7564..37f59ebfff 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -9,7 +9,7 @@ import ( "sort" "testing" - ci "github.com/libp2p/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-core/crypto" ) type rr struct{} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 4f505a995b..4067bbce29 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,6 @@ package keystore -import ci "github.com/libp2p/go-libp2p-crypto" +import ci "github.com/libp2p/go-libp2p-core/crypto" // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. From 74df8aef3bf365fcbf3b219cce8f546e0a190b01 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Thu, 6 Jun 2019 11:21:30 -0700 Subject: [PATCH 2709/3147] Fix references and add go.mod This commit was moved from ipfs/go-ipfs-provider@d9e78687ab9de19171a207b3f1cb95a793d7057b --- provider/simple/provider.go | 2 +- provider/simple/provider_test.go | 4 ++-- provider/simple/reprovide_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index abe13ce598..b7da4b2455 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -7,7 +7,7 @@ import ( "context" cid "github.com/ipfs/go-cid" - q "github.com/ipfs/go-ipfs/provider/queue" + q "github.com/ipfs/go-ipfs-provider/queue" logging "github.com/ipfs/go-log" routing "github.com/libp2p/go-libp2p-core/routing" ) diff --git a/provider/simple/provider_test.go b/provider/simple/provider_test.go index 4922958c8c..6fbc528bae 100644 --- a/provider/simple/provider_test.go +++ b/provider/simple/provider_test.go @@ -12,9 +12,9 @@ import ( blocksutil "github.com/ipfs/go-ipfs-blocksutil" peer "github.com/libp2p/go-libp2p-core/peer" - q "github.com/ipfs/go-ipfs/provider/queue" + q "github.com/ipfs/go-ipfs-provider/queue" - . "github.com/ipfs/go-ipfs/provider/simple" + . "github.com/ipfs/go-ipfs-provider/simple" ) var blockGenerator = blocksutil.NewBlockGenerator() diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index e9925e55ec..c863720007 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -13,7 +13,7 @@ import ( peer "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-testing/net" - . "github.com/ipfs/go-ipfs/provider/simple" + . "github.com/ipfs/go-ipfs-provider/simple" ) func TestReprovide(t *testing.T) { From 05e5b0c51914debea72dffb32a720e4d96fcdadf Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Thu, 6 Jun 2019 14:46:37 -0700 Subject: [PATCH 2710/3147] Remove dependency on go-ipfs pinner This commit was moved from ipfs/go-ipfs-provider@245e9651e80d5df45db9889848a390bd3c15d29f --- provider/simple/reprovide.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index ce5c71812f..6511b33a7c 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -5,16 +5,15 @@ import ( "fmt" "time" - backoff "github.com/cenkalti/backoff" - cid "github.com/ipfs/go-cid" - cidutil "github.com/ipfs/go-cidutil" + "github.com/cenkalti/backoff" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-cidutil" blocks "github.com/ipfs/go-ipfs-blockstore" - pin "github.com/ipfs/go-ipfs/pin" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" - merkledag "github.com/ipfs/go-merkledag" - verifcid "github.com/ipfs/go-verifcid" - routing "github.com/libp2p/go-libp2p-core/routing" + "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-verifcid" + "github.com/libp2p/go-libp2p-core/routing" ) var logR = logging.Logger("reprovider.simple") @@ -169,9 +168,16 @@ func NewBlockstoreProvider(bstore blocks.Blockstore) KeyChanFunc { } } +// Pinner interface defines how the simple.Reprovider wants to interact +// with a Pinning service +type Pinner interface { + DirectKeys() []cid.Cid + RecursiveKeys() []cid.Cid +} + // NewPinnedProvider returns provider supplying pinned keys -func NewPinnedProvider(onlyRoots bool) func(pin.Pinner, ipld.DAGService) KeyChanFunc { - return func(pinning pin.Pinner, dag ipld.DAGService) KeyChanFunc { +func NewPinnedProvider(onlyRoots bool) func(Pinner, ipld.DAGService) KeyChanFunc { + return func(pinning Pinner, dag ipld.DAGService) KeyChanFunc { return func(ctx context.Context) (<-chan cid.Cid, error) { set, err := pinSet(ctx, pinning, dag, onlyRoots) if err != nil { @@ -196,7 +202,7 @@ func NewPinnedProvider(onlyRoots bool) func(pin.Pinner, ipld.DAGService) KeyChan } } -func pinSet(ctx context.Context, pinning pin.Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { +func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { set := cidutil.NewStreamingSet() go func() { From b2e20be5acbb9c8e9586504ede7dc35b9b5e2c2e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 6 Jun 2019 15:42:03 -0700 Subject: [PATCH 2711/3147] pin: fix concurrent map access race Not sure why this didn't show up sooner. fixes #6418 This commit was moved from ipfs/go-ipfs-pinner@4eaa9166a097c9d4e8800e0ac44092182d7f5710 --- pinning/pinner/pin.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 8df21ee1ce..48a16f84e5 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -498,11 +498,17 @@ func LoadPinner(d ds.Datastore, dserv, internal ipld.DAGService) (Pinner, error) // DirectKeys returns a slice containing the directly pinned keys func (p *pinner) DirectKeys() []cid.Cid { + p.lock.RLock() + defer p.lock.RUnlock() + return p.directPin.Keys() } // RecursiveKeys returns a slice containing the recursively pinned keys func (p *pinner) RecursiveKeys() []cid.Cid { + p.lock.RLock() + defer p.lock.RUnlock() + return p.recursePin.Keys() } From a7795d1022888bd01927cb8d032e6b232e7b6edb Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Mon, 10 Jun 2019 11:47:52 -0700 Subject: [PATCH 2712/3147] Refactor NewPinnedProvider to be created all at once This commit was moved from ipfs/go-ipfs-provider@d7bb85e89013a89c088194e91d9d871c959b2ce4 --- provider/simple/reprovide.go | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 6511b33a7c..4b5c833691 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -176,29 +176,27 @@ type Pinner interface { } // NewPinnedProvider returns provider supplying pinned keys -func NewPinnedProvider(onlyRoots bool) func(Pinner, ipld.DAGService) KeyChanFunc { - return func(pinning Pinner, dag ipld.DAGService) KeyChanFunc { - return func(ctx context.Context) (<-chan cid.Cid, error) { - set, err := pinSet(ctx, pinning, dag, onlyRoots) - if err != nil { - return nil, err - } +func NewPinnedProvider(onlyRoots bool, pinning Pinner, dag ipld.DAGService) KeyChanFunc { + return func(ctx context.Context) (<-chan cid.Cid, error) { + set, err := pinSet(ctx, pinning, dag, onlyRoots) + if err != nil { + return nil, err + } - outCh := make(chan cid.Cid) - go func() { - defer close(outCh) - for c := range set.New { - select { - case <-ctx.Done(): - return - case outCh <- c: - } + outCh := make(chan cid.Cid) + go func() { + defer close(outCh) + for c := range set.New { + select { + case <-ctx.Done(): + return + case outCh <- c: } + } - }() + }() - return outCh, nil - } + return outCh, nil } } From 4d3e5a45e10bf75c507b882face79b0cb33f7393 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Tue, 11 Jun 2019 09:42:06 -0700 Subject: [PATCH 2713/3147] Add basic README This commit was moved from ipfs/go-ipfs-provider@a95551d21c0ccd67a6f2064c7cccc6ea85fcff3a --- provider/LICENSE-APACHE | 13 +++++++++ provider/LICENSE-MIT | 19 ++++++++++++ provider/README.md | 64 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 provider/LICENSE-APACHE create mode 100644 provider/LICENSE-MIT create mode 100644 provider/README.md diff --git a/provider/LICENSE-APACHE b/provider/LICENSE-APACHE new file mode 100644 index 0000000000..546514363d --- /dev/null +++ b/provider/LICENSE-APACHE @@ -0,0 +1,13 @@ +Copyright 2019. Protocol Labs, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/provider/LICENSE-MIT b/provider/LICENSE-MIT new file mode 100644 index 0000000000..ea532a8305 --- /dev/null +++ b/provider/LICENSE-MIT @@ -0,0 +1,19 @@ +Copyright 2019. Protocol Labs, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/provider/README.md b/provider/README.md new file mode 100644 index 0000000000..d5f5aadc5a --- /dev/null +++ b/provider/README.md @@ -0,0 +1,64 @@ +# go-ipfs-provider + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![Coverage Status](https://codecov.io/gh/ipfs/go-ipfs-provider/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-ipfs-provider) +[![Travis CI](https://travis-ci.org/ipfs/go-ipfs-provider.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-provider) + +## Background + +The provider system is responsible for announcing and reannouncing to the ipfs network that a node has content. + +## Install + +Via `go get`: + +```sh +$ go get github.com/ipfs/go-ipfs-provider +``` + +> Requires Go 1.12 + +## Usage + +Here's how you create, start, interact with, and stop the provider system: + +```golang +import ( + "context" + "time" + + "github.com/ipfs/go-ipfs-provider" + "github.com/ipfs/go-ipfs-provider/queue" + "github.com/ipfs/go-ipfs-provider/simple" +) + +rsys := (your routing system here) +dstore := (your datastore here) +cid := (your cid to provide here) + +q := queue.NewQueue(context.Background(), "example", dstore) + +reprov := simple.NewReprovider(context.Background(), time.Hour * 12, rsys, simple.NewBlockstoreProvider) +prov := simple.NewProvider(context.Background(), q, rsys) +sys := provider.NewSystem(prov, reprov) + +sys.Run() + +sys.Provide(cid) + +sys.Close() +``` + +## Contribute + +PRs are welcome! + +Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +This library is dual-licensed under Apache 2.0 and MIT terms. + +Copyright 2019. Protocol Labs, Inc. From 77c632e602260f1d97e57fe2287ac129d9edd150 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 12 Jun 2019 11:09:13 -0700 Subject: [PATCH 2714/3147] Add 3 minute timeout to Provide call This commit was moved from ipfs/go-ipfs-provider@c2e647a1581108d8f5da479f0d550268a5712c46 --- provider/simple/provider.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index b7da4b2455..8fa9c108e3 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -5,6 +5,7 @@ package simple import ( "context" + "time" cid "github.com/ipfs/go-cid" q "github.com/ipfs/go-ipfs-provider/queue" @@ -14,7 +15,10 @@ import ( var logP = logging.Logger("provider.simple") -const provideOutgoingWorkerLimit = 8 +const ( + provideOutgoingWorkerLimit = 8 + provideTimeout = 3 * time.Minute +) // Provider announces blocks to the network type Provider struct { @@ -60,8 +64,10 @@ func (p *Provider) handleAnnouncements() { case <-p.ctx.Done(): return case c := <-p.queue.Dequeue(): + ctx, cancel := context.WithTimeout(p.ctx, provideTimeout) + defer cancel() logP.Info("announce - start - ", c) - if err := p.contentRouting.Provide(p.ctx, c, true); err != nil { + if err := p.contentRouting.Provide(ctx, c, true); err != nil { logP.Warningf("Unable to provide entry: %s, %s", c, err) } logP.Info("announce - end - ", c) From 5eadc76a32f0ea3e33072b90df58266250f7681f Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 12 Jun 2019 12:38:25 -0700 Subject: [PATCH 2715/3147] Make timeout configurable This commit was moved from ipfs/go-ipfs-provider@8e30fff33017288e116ff62d25c1534b30e74634 --- provider/simple/provider.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index 8fa9c108e3..3b4c88237d 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -7,17 +7,16 @@ import ( "context" "time" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" q "github.com/ipfs/go-ipfs-provider/queue" logging "github.com/ipfs/go-log" - routing "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-core/routing" ) var logP = logging.Logger("provider.simple") const ( provideOutgoingWorkerLimit = 8 - provideTimeout = 3 * time.Minute ) // Provider announces blocks to the network @@ -27,15 +26,31 @@ type Provider struct { queue *q.Queue // used to announce providing to the network contentRouting routing.ContentRouting + // how long to wait for announce to complete before giving up + timeout time.Duration +} + +type Option func(*Provider) + +func WithTimeout(timeout time.Duration) Option { + return func(p *Provider) { + p.timeout = timeout + } } // NewProvider creates a provider that announces blocks to the network using a content router -func NewProvider(ctx context.Context, queue *q.Queue, contentRouting routing.ContentRouting) *Provider { - return &Provider{ +func NewProvider(ctx context.Context, queue *q.Queue, contentRouting routing.ContentRouting, options ...Option) *Provider { + p := &Provider{ ctx: ctx, queue: queue, contentRouting: contentRouting, } + + for _, option := range options { + option(p) + } + + return p } // Close stops the provider @@ -64,7 +79,7 @@ func (p *Provider) handleAnnouncements() { case <-p.ctx.Done(): return case c := <-p.queue.Dequeue(): - ctx, cancel := context.WithTimeout(p.ctx, provideTimeout) + ctx, cancel := context.WithTimeout(p.ctx, p.timeout) defer cancel() logP.Info("announce - start - ", c) if err := p.contentRouting.Provide(ctx, c, true); err != nil { From 00a447c67e4480f430ba7c41af43286ffb7cc8f6 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 12 Jun 2019 12:43:47 -0700 Subject: [PATCH 2716/3147] Make worker count configurable This commit was moved from ipfs/go-ipfs-provider@c3bccce5e62351f4fb09763fbe7b325275b97f44 --- provider/simple/provider.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index 3b4c88237d..9b374a0431 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -15,10 +15,6 @@ import ( var logP = logging.Logger("provider.simple") -const ( - provideOutgoingWorkerLimit = 8 -) - // Provider announces blocks to the network type Provider struct { ctx context.Context @@ -28,22 +24,35 @@ type Provider struct { contentRouting routing.ContentRouting // how long to wait for announce to complete before giving up timeout time.Duration + // how many workers concurrently work through thhe queue + workerLimit int } +// Option defines the functional option type that can be used to configure +// provider instances type Option func(*Provider) +// WithTimeout is an option to set a timeout on a provider func WithTimeout(timeout time.Duration) Option { return func(p *Provider) { p.timeout = timeout } } +// MaxWorkers is an option to set the max workers on a provider +func MaxWorkers(count int) Option { + return func(p *Provider) { + p.workerLimit = count + } +} + // NewProvider creates a provider that announces blocks to the network using a content router func NewProvider(ctx context.Context, queue *q.Queue, contentRouting routing.ContentRouting, options ...Option) *Provider { p := &Provider{ ctx: ctx, queue: queue, contentRouting: contentRouting, + workerLimit: 8, } for _, option := range options { @@ -72,7 +81,7 @@ func (p *Provider) Provide(root cid.Cid) error { // Handle all outgoing cids by providing (announcing) them func (p *Provider) handleAnnouncements() { - for workers := 0; workers < provideOutgoingWorkerLimit; workers++ { + for workers := 0; workers < p.workerLimit; workers++ { go func() { for p.ctx.Err() == nil { select { From 17d15f0faa9cd777bbf4f595aa8c884fcaf9e800 Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 12 Jun 2019 13:02:41 -0700 Subject: [PATCH 2717/3147] Either timeout or not This commit was moved from ipfs/go-ipfs-provider@5f6a572aacdcfbdfe7f4f399eab628f0b585e099 --- provider/simple/provider.go | 11 +++++-- provider/simple/provider_test.go | 50 +++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index 9b374a0431..9302a27491 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -88,8 +88,15 @@ func (p *Provider) handleAnnouncements() { case <-p.ctx.Done(): return case c := <-p.queue.Dequeue(): - ctx, cancel := context.WithTimeout(p.ctx, p.timeout) - defer cancel() + var ctx context.Context + var cancel context.CancelFunc + if p.timeout > 0 { + ctx, cancel = context.WithTimeout(p.ctx, p.timeout) + defer cancel() + } else { + ctx = p.ctx + } + logP.Info("announce - start - ", c) if err := p.contentRouting.Provide(ctx, c, true); err != nil { logP.Warningf("Unable to provide entry: %s, %s", c, err) diff --git a/provider/simple/provider_test.go b/provider/simple/provider_test.go index 6fbc528bae..deb0032ec2 100644 --- a/provider/simple/provider_test.go +++ b/provider/simple/provider_test.go @@ -24,7 +24,11 @@ type mockRouting struct { } func (r *mockRouting) Provide(ctx context.Context, cid cid.Cid, recursive bool) error { - r.provided <- cid + select { + case r.provided <- cid: + case <-ctx.Done(): + panic("context cancelled, but shouldn't have") + } return nil } @@ -81,3 +85,47 @@ func TestAnnouncement(t *testing.T) { } } } + +func TestAnnouncementTimeout(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := q.NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + + r := mockContentRouting() + + prov := NewProvider(ctx, queue, r, WithTimeout(1*time.Second)) + prov.Run() + + cids := cid.NewSet() + + for i := 0; i < 100; i++ { + c := blockGenerator.Next().Cid() + cids.Add(c) + } + + go func() { + for _, c := range cids.Keys() { + err = prov.Provide(c) + // A little goroutine stirring to exercise some different states + r := rand.Intn(10) + time.Sleep(time.Microsecond * time.Duration(r)) + } + }() + + for cids.Len() > 0 { + select { + case cp := <-r.provided: + if !cids.Has(cp) { + t.Fatal("Wrong CID provided") + } + cids.Remove(cp) + case <-time.After(time.Second * 5): + t.Fatal("Timeout waiting for cids to be provided.") + } + } +} From 5a625d0bf87ae1717f07b318497c417b8170fbdb Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Thu, 13 Jun 2019 15:08:36 +0100 Subject: [PATCH 2718/3147] Allow resolution of .eth names via .eth.link This commit was moved from ipfs/go-namesys@da12604bf0f1a554f787008df4a4ddd4ec8bf8dc --- namesys/namesys.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/namesys/namesys.go b/namesys/namesys.go index 6d59c62e33..cf944001d9 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -80,6 +80,9 @@ func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.R return resolveAsync(ctx, ns, name, opts.ProcessOpts(options)) } +const ethTLD = ".eth" +const linkTLD = ".link" + // resolveOnce implements resolver. func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { out := make(chan onceResult, 1) @@ -87,6 +90,11 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. if !strings.HasPrefix(name, ipnsPrefix) { name = ipnsPrefix + name } + if strings.HasSuffix(name, ethTLD) { + // This is an ENS name. As we're resolving via an arbitrary DNS server + // that may not know about .eth we need to add our link domain suffix. + name = name + linkTLD + } segments := strings.SplitN(name, "/", 4) if len(segments) < 3 || segments[0] != "" { log.Debugf("invalid name syntax for %s", name) From 92c99eb29dfc56e7054e2722589483773fbd7729 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 30 Jun 2019 10:26:24 +0200 Subject: [PATCH 2719/3147] fix defer in a loop This commit was moved from ipfs/go-ipfs-provider@55dd24d1b9b3e3071d241ff47ab2ddf97b607cb2 --- provider/simple/provider.go | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index 9302a27491..3993d45090 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -88,22 +88,26 @@ func (p *Provider) handleAnnouncements() { case <-p.ctx.Done(): return case c := <-p.queue.Dequeue(): - var ctx context.Context - var cancel context.CancelFunc - if p.timeout > 0 { - ctx, cancel = context.WithTimeout(p.ctx, p.timeout) - defer cancel() - } else { - ctx = p.ctx - } - - logP.Info("announce - start - ", c) - if err := p.contentRouting.Provide(ctx, c, true); err != nil { - logP.Warningf("Unable to provide entry: %s, %s", c, err) - } - logP.Info("announce - end - ", c) + p.doProvide(c) } } }() } } + +func (p *Provider) doProvide(c cid.Cid) { + ctx := p.ctx + if p.timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, p.timeout) + defer cancel() + } else { + ctx = p.ctx + } + + logP.Info("announce - start - ", c) + if err := p.contentRouting.Provide(ctx, c, true); err != nil { + logP.Warningf("Unable to provide entry: %s, %s", c, err) + } + logP.Info("announce - end - ", c) +} From 603c772ec458f347db0e4dc9d1af33f4bad49c9c Mon Sep 17 00:00:00 2001 From: Michael Avila Date: Wed, 3 Jul 2019 16:15:48 -0700 Subject: [PATCH 2720/3147] Change queue to be timestamp based; avoid collisions using cids; limit to 1 This commit was moved from ipfs/go-ipfs-provider@ee20a1ecbde67c2e1804b93e2ce5ec93a3a07f7d --- provider/queue/queue.go | 123 +++++++++-------------------------- provider/queue/queue_test.go | 44 +++---------- 2 files changed, 38 insertions(+), 129 deletions(-) diff --git a/provider/queue/queue.go b/provider/queue/queue.go index 2afbc81ee9..ddaa97582e 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -3,8 +3,7 @@ package queue import ( "context" "fmt" - "strconv" - "strings" + "time" cid "github.com/ipfs/go-cid" datastore "github.com/ipfs/go-datastore" @@ -25,8 +24,6 @@ type Queue struct { // e.g. provider vs reprovider name string ctx context.Context - tail uint64 - head uint64 ds datastore.Datastore // Must be threadsafe dequeue chan cid.Cid enqueue chan cid.Cid @@ -37,16 +34,10 @@ type Queue struct { // NewQueue creates a queue for cids func NewQueue(ctx context.Context, name string, ds datastore.Datastore) (*Queue, error) { namespaced := namespace.Wrap(ds, datastore.NewKey("/"+name+"/queue/")) - head, tail, err := getQueueHeadTail(ctx, namespaced) - if err != nil { - return nil, err - } cancelCtx, cancel := context.WithCancel(ctx) q := &Queue{ name: name, ctx: cancelCtx, - head: head, - tail: tail, ds: namespaced, dequeue: make(chan cid.Cid), enqueue: make(chan cid.Cid), @@ -77,41 +68,6 @@ func (q *Queue) Dequeue() <-chan cid.Cid { return q.dequeue } -// Look for next Cid in the queue and return it. Skip over gaps and mangled data -func (q *Queue) nextEntry() (datastore.Key, cid.Cid) { - for { - if q.head >= q.tail { - return datastore.Key{}, cid.Undef - } - - key := q.queueKey(q.head) - value, err := q.ds.Get(key) - - if err != nil { - if err == datastore.ErrNotFound { - log.Warningf("Error missing entry in queue: %s", key) - } else { - log.Errorf("Error fetching from queue: %s", err) - } - q.head++ // move on - continue - } - - c, err := cid.Parse(value) - if err != nil { - log.Warningf("Error marshalling Cid from queue: ", err) - q.head++ - err = q.ds.Delete(key) - if err != nil { - log.Warningf("Provider queue failed to delete: %s", key) - } - continue - } - - return key, c - } -} - // Run dequeues and enqueues when available. func (q *Queue) work() { go func() { @@ -124,7 +80,26 @@ func (q *Queue) work() { for { if c == cid.Undef { - k, c = q.nextEntry() + head, e := q.getQueueHead() + + if e != nil { + log.Errorf("error querying for head of queue: %s, stopping provider", e) + return + } else if head != nil { + k = datastore.NewKey(head.Key) + c, e = cid.Parse(head.Value) + if e != nil { + log.Warningf("error parsing queue entry cid with key (%s), removing it from queue: %s", head.Key, e) + err := q.ds.Delete(k) + if err != nil { + log.Errorf("error deleting queue entry with key (%s), due to error (%s), stopping provider", head.Key, err) + return + } + continue + } + } else { + c = cid.Undef + } } // If c != cid.Undef set dequeue and attempt write, otherwise wait for enqueue @@ -135,14 +110,13 @@ func (q *Queue) work() { select { case toQueue := <-q.enqueue: - nextKey := q.queueKey(q.tail) + keyPath := fmt.Sprintf("%d/%s", time.Now().UnixNano(), c.String()) + nextKey := datastore.NewKey(keyPath) if err := q.ds.Put(nextKey, toQueue.Bytes()); err != nil { log.Errorf("Failed to enqueue cid: %s", err) continue } - - q.tail++ case dequeue <- c: err := q.ds.Delete(k) @@ -151,7 +125,6 @@ func (q *Queue) work() { continue } c = cid.Undef - q.head++ case <-q.ctx.Done(): return } @@ -159,53 +132,17 @@ func (q *Queue) work() { }() } -func (q *Queue) queueKey(id uint64) datastore.Key { - s := fmt.Sprintf("%016X", id) - return datastore.NewKey(s) -} - -func getQueueHeadTail(ctx context.Context, datastore datastore.Datastore) (uint64, uint64, error) { - head, err := getQueueHead(datastore) - if err != nil { - return 0, 0, err - } - tail, err := getQueueTail(datastore) - if err != nil { - return 0, 0, err - } - return head, tail, nil -} - -func getQueueHead(ds datastore.Datastore) (uint64, error) { - return getFirstIDByOrder(ds, query.OrderByKey{}) -} - -func getQueueTail(ds datastore.Datastore) (uint64, error) { - tail, err := getFirstIDByOrder(ds, query.OrderByKeyDescending{}) +func (q *Queue) getQueueHead() (*query.Result, error) { + qry := query.Query{Orders: []query.Order{query.OrderByKey{}}, Limit: 1} + results, err := q.ds.Query(qry) if err != nil { - return 0, err - } - if tail > 0 { - tail++ - } - return tail, nil -} - -func getFirstIDByOrder(ds datastore.Datastore, order query.Order) (uint64, error) { - q := query.Query{Orders: []query.Order{order}} - results, err := ds.Query(q) - if err != nil { - return 0, err + return nil, err } defer results.Close() r, ok := results.NextSync() if !ok { - return 0, nil - } - trimmed := strings.TrimPrefix(r.Key, "/") - id, err := strconv.ParseUint(trimmed, 16, 64) - if err != nil { - return 0, err + return nil, nil } - return id, nil + + return &r, nil } diff --git a/provider/queue/queue_test.go b/provider/queue/queue_test.go index c8fb8682e3..819fa90f97 100644 --- a/provider/queue/queue_test.go +++ b/provider/queue/queue_test.go @@ -5,9 +5,9 @@ import ( "testing" "time" - cid "github.com/ipfs/go-cid" - datastore "github.com/ipfs/go-datastore" - sync "github.com/ipfs/go-datastore/sync" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs-blocksutil" ) @@ -55,36 +55,6 @@ func TestBasicOperation(t *testing.T) { assertOrdered(cids, queue, t) } -func TestSparseDatastore(t *testing.T) { - ctx := context.Background() - defer ctx.Done() - - ds := sync.MutexWrap(datastore.NewMapDatastore()) - queue, err := NewQueue(ctx, "test", ds) - if err != nil { - t.Fatal(err) - } - - cids := makeCids(10) - for _, c := range cids { - queue.Enqueue(c) - } - - // remove entries in the middle - err = queue.ds.Delete(queue.queueKey(5)) - if err != nil { - t.Fatal(err) - } - - err = queue.ds.Delete(queue.queueKey(6)) - if err != nil { - t.Fatal(err) - } - - expected := append(cids[:5], cids[7:]...) - assertOrdered(expected, queue, t) -} - func TestMangledData(t *testing.T) { ctx := context.Background() defer ctx.Done() @@ -100,13 +70,15 @@ func TestMangledData(t *testing.T) { queue.Enqueue(c) } - // remove entries in the middle - err = queue.ds.Put(queue.queueKey(5), []byte("borked")) + // put bad data in the queue + queueKey := datastore.NewKey("/test/0") + err = queue.ds.Put(queueKey, []byte("borked")) if err != nil { t.Fatal(err) } - expected := append(cids[:5], cids[6:]...) + // expect to only see the valid cids we entered + expected := cids assertOrdered(expected, queue, t) } From 0b7ea10c6d7b6c51772c6a742383c2d93515b024 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Thu, 4 Jul 2019 18:44:17 +0100 Subject: [PATCH 2721/3147] Add test for resolution of .eth names This commit was moved from ipfs/go-namesys@35fbeb6c31b16941e9f6ce7dc93e074a4a48dd98 --- namesys/namesys_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 031ae833ac..d1ecf49e85 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -51,6 +51,7 @@ func mockResolverOne() *mockResolver { "QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy": "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", "QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n": "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD": "/ipns/ipfs.io", + "QmQ4QZh8nrsczdUEwTyfBope4THUhqxqc1fx6qYhhzZQei": "/ipfs/QmP3ouCnU8NNLsW6261pAx2pNLV2E4dQoisB1sgda12Act", }, } } @@ -58,7 +59,8 @@ func mockResolverOne() *mockResolver { func mockResolverTwo() *mockResolver { return &mockResolver{ entries: map[string]string{ - "ipfs.io": "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", + "ipfs.io": "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", + "www.wealdtech.eth.link": "/ipns/QmQ4QZh8nrsczdUEwTyfBope4THUhqxqc1fx6qYhhzZQei", }, } } @@ -80,6 +82,8 @@ func TestNamesysResolution(t *testing.T) { testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 1, "/ipns/ipfs.io", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 2, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 3, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) + testResolution(t, r, "/ipns/www.wealdtech.eth", 1, "/ipns/QmQ4QZh8nrsczdUEwTyfBope4THUhqxqc1fx6qYhhzZQei", ErrResolveRecursion) + testResolution(t, r, "/ipns/www.wealdtech.eth", 2, "/ipfs/QmP3ouCnU8NNLsW6261pAx2pNLV2E4dQoisB1sgda12Act", nil) } func TestPublishWithCache0(t *testing.T) { From 78dd059cbc8ae90120740e2dbd0cc92711e0e71a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 11 Jul 2019 15:49:18 -0700 Subject: [PATCH 2722/3147] fix: enumerate children renamed to walk parallel as: 1. It also visited the root. 2. It walked in parallel and wasn't async. This commit was moved from ipfs/go-unixfs@72e2c7f97ba53d55cd23fb054b30cf4954b0c32a --- unixfs/hamt/hamt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 7947a2aa04..c44b1789fe 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -339,7 +339,7 @@ func (ds *Shard) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { defer cancel() getLinks := makeAsyncTrieGetLinks(ds.dserv, linkResults) cset := cid.NewSet() - err := dag.EnumerateChildrenAsync(ctx, getLinks, ds.cid, cset.Visit) + err := dag.WalkParallel(ctx, getLinks, ds.cid, cset.Visit) if err != nil { emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) } From 753a258464b02139b4dc0ec292dd29d01e116917 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 11 Jul 2019 16:02:55 -0700 Subject: [PATCH 2723/3147] ci: update This commit was moved from ipfs/go-unixfs@076d317ec94861d82397b0e0abcb84e22f5cf247 --- unixfs/Makefile | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 unixfs/Makefile diff --git a/unixfs/Makefile b/unixfs/Makefile deleted file mode 100644 index 20619413c9..0000000000 --- a/unixfs/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - From 7c5c1e9b5016d34a2126fbf8bf1cccb406857101 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 11 Jul 2019 16:23:55 -0700 Subject: [PATCH 2724/3147] fix: update go-merkledag to use new Walk function This commit was moved from ipfs/go-ipfs-provider@8c4e1b3ff051e474585512c0aa5ba578c7807d43 --- provider/simple/reprovide.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 4b5c833691..d2a229d66a 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -213,10 +213,8 @@ func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots } for _, key := range pinning.RecursiveKeys() { - set.Visitor(ctx)(key) - if !onlyRoots { - err := merkledag.EnumerateChildren(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) + err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) if err != nil { logR.Errorf("reprovide indirect pins: %s", err) return From ae8b80e7ddf7e8a745065c7f53abade82a8656c5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 11 Jul 2019 18:15:33 -0700 Subject: [PATCH 2725/3147] fix reproviding only roots And improve the tests. This commit was moved from ipfs/go-ipfs-provider@dc4005bc786c429e876dea8ab83fbcadd9466c2c --- provider/simple/reprovide.go | 4 +- provider/simple/reprovide_test.go | 149 +++++++++++++++++++++++++----- 2 files changed, 129 insertions(+), 24 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index d2a229d66a..590b9d1ab1 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -213,7 +213,9 @@ func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots } for _, key := range pinning.RecursiveKeys() { - if !onlyRoots { + if onlyRoots { + set.Visitor(ctx)(key) + } else { err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) if err != nil { logR.Errorf("reprovide indirect pins: %s", err) diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index c863720007..efe906f01b 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -5,40 +5,73 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-block-format" + bsrv "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" mock "github.com/ipfs/go-ipfs-routing/mock" + cbor "github.com/ipfs/go-ipld-cbor" + merkledag "github.com/ipfs/go-merkledag" peer "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-testing/net" + mh "github.com/multiformats/go-multihash" . "github.com/ipfs/go-ipfs-provider/simple" ) -func TestReprovide(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - +func setupRouting(t *testing.T) (clA, clB mock.Client, idA, idB peer.ID) { mrserv := mock.NewServer() - idA := testutil.RandIdentityOrFatal(t) - idB := testutil.RandIdentityOrFatal(t) + iidA := testutil.RandIdentityOrFatal(t) + iidB := testutil.RandIdentityOrFatal(t) - clA := mrserv.Client(idA) - clB := mrserv.Client(idB) + clA = mrserv.Client(iidA) + clB = mrserv.Client(iidB) - bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + return clA, clB, iidA.ID(), iidB.ID() +} - blk := blocks.NewBlock([]byte("this is a test")) - err := bstore.Put(blk) - if err != nil { - t.Fatal(err) +func setupDag(t *testing.T) (nodes []cid.Cid, bstore blockstore.Blockstore) { + bstore = blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + for _, data := range []string{"foo", "bar"} { + blk, err := cbor.WrapObject(data, mh.SHA2_256, -1) + if err != nil { + t.Fatal(err) + } + err = bstore.Put(blk) + if err != nil { + t.Fatal(err) + } + nodes = append(nodes, blk.Cid()) + + blk, err = cbor.WrapObject(map[string]interface{}{ + "child": blk.Cid(), + }, mh.SHA2_256, -1) + if err != nil { + t.Fatal(err) + } + err = bstore.Put(blk) + if err != nil { + t.Fatal(err) + } + nodes = append(nodes, blk.Cid()) } + return nodes, bstore +} + +func TestReprovide(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + clA, clB, idA, _ := setupRouting(t) + nodes, bstore := setupDag(t) + keyProvider := NewBlockstoreProvider(bstore) reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) - err = reprov.Reprovide() + err := reprov.Reprovide() if err != nil { t.Fatal(err) } @@ -46,16 +79,86 @@ func TestReprovide(t *testing.T) { var providers []peer.AddrInfo maxProvs := 100 - provChan := clB.FindProvidersAsync(ctx, blk.Cid(), maxProvs) - for p := range provChan { - providers = append(providers, p) - } + for _, c := range nodes { + provChan := clB.FindProvidersAsync(ctx, c, maxProvs) + for p := range provChan { + providers = append(providers, p) + } - if len(providers) == 0 { - t.Fatal("Should have gotten a provider") + if len(providers) == 0 { + t.Fatal("Should have gotten a provider") + } + + if providers[0].ID != idA { + t.Fatal("Somehow got the wrong peer back as a provider.") + } } +} + +type mockPinner struct { + recursive []cid.Cid + direct []cid.Cid +} + +func (mp *mockPinner) DirectKeys() []cid.Cid { + return mp.direct +} + +func (mp *mockPinner) RecursiveKeys() []cid.Cid { + return mp.recursive +} + +func TestReprovidePinned(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + nodes, bstore := setupDag(t) + + dag := merkledag.NewDAGService(bsrv.New(bstore, offline.Exchange(bstore))) + + for i := 0; i < 2; i++ { + clA, clB, idA, _ := setupRouting(t) + + onlyRoots := i == 0 + t.Logf("only roots: %v", onlyRoots) + + var provide, dont []cid.Cid + if onlyRoots { + provide = []cid.Cid{nodes[1], nodes[3]} + dont = []cid.Cid{nodes[0], nodes[2]} + } else { + provide = []cid.Cid{nodes[0], nodes[1], nodes[3]} + dont = []cid.Cid{nodes[2]} + } + + keyProvider := NewPinnedProvider(onlyRoots, &mockPinner{ + recursive: []cid.Cid{nodes[1]}, + direct: []cid.Cid{nodes[3]}, + }, dag) + + reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) + err := reprov.Reprovide() + if err != nil { + t.Fatal(err) + } + + for i, c := range provide { + prov, ok := <-clB.FindProvidersAsync(ctx, c, 1) + if !ok { + t.Errorf("Should have gotten a provider for %d", i) + continue + } - if providers[0].ID != idA.ID() { - t.Fatal("Somehow got the wrong peer back as a provider.") + if prov.ID != idA { + t.Errorf("Somehow got the wrong peer back as a provider.") + continue + } + } + for i, c := range dont { + prov, ok := <-clB.FindProvidersAsync(ctx, c, 1) + if ok { + t.Fatalf("found provider %s for %d, expected none", prov.ID, i) + } + } } } From 64144f604a03f8cecd4ac3f12bdd76ae7440b0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 15 Jul 2019 15:45:03 +0200 Subject: [PATCH 2726/3147] Fix local imports This commit was moved from ipfs/go-filestore@6837d5d7c5a955568ff33760a58b78ecc5e663ea --- filestore/fsrefstore.go | 2 +- filestore/util.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 320ee5928b..19927e0ef9 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -8,7 +8,7 @@ import ( "os" "path/filepath" - pb "github.com/ipfs/go-ipfs/filestore/pb" + pb "github.com/ipfs/go-filestore/pb" proto "github.com/gogo/protobuf/proto" blocks "github.com/ipfs/go-block-format" diff --git a/filestore/util.go b/filestore/util.go index 4f39495915..bfb240c553 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -4,7 +4,7 @@ import ( "fmt" "sort" - pb "github.com/ipfs/go-ipfs/filestore/pb" + pb "github.com/ipfs/go-filestore/pb" cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" From 92005547d627509e1d381d6f1edbb8a99fb6819a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 15 Jul 2019 15:47:03 +0200 Subject: [PATCH 2727/3147] Copy licenses from go-ipfs This commit was moved from ipfs/go-filestore@87b7259b5615ca10a0cbf805bd70f24d4d099055 --- filestore/LICENSE-APACHE | 5 +++++ filestore/LICENSE-MIT | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 filestore/LICENSE-APACHE create mode 100644 filestore/LICENSE-MIT diff --git a/filestore/LICENSE-APACHE b/filestore/LICENSE-APACHE new file mode 100644 index 0000000000..14478a3b60 --- /dev/null +++ b/filestore/LICENSE-APACHE @@ -0,0 +1,5 @@ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/filestore/LICENSE-MIT b/filestore/LICENSE-MIT new file mode 100644 index 0000000000..72dc60d84b --- /dev/null +++ b/filestore/LICENSE-MIT @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From 92892ab8995b540e4c423ec7c704cbda772afbb4 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Mon, 15 Jul 2019 14:42:40 -0700 Subject: [PATCH 2728/3147] nil exchange is okay This commit was moved from ipfs/go-blockservice@2ec77aa648213c2c7c2849116b9261a516c90b91 --- blockservice/blockservice.go | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 3b5a1df6b9..9d8884936d 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -148,8 +148,10 @@ func (s *blockService) AddBlock(o blocks.Block) error { log.Event(context.TODO(), "BlockService.BlockAdded", c) - if err := s.exchange.HasBlock(o); err != nil { - log.Errorf("HasBlock: %s", err.Error()) + if s.exchange != nil { + if err := s.exchange.HasBlock(o); err != nil { + log.Errorf("HasBlock: %s", err.Error()) + } } return nil @@ -184,10 +186,12 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { return err } - for _, o := range toput { - log.Event(context.TODO(), "BlockService.BlockAdded", o.Cid()) - if err := s.exchange.HasBlock(o); err != nil { - log.Errorf("HasBlock: %s", err.Error()) + if s.exchange != nil { + for _, o := range toput { + log.Event(context.TODO(), "BlockService.BlockAdded", o.Cid()) + if err := s.exchange.HasBlock(o); err != nil { + log.Errorf("HasBlock: %s", err.Error()) + } } } return nil @@ -250,7 +254,12 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun // the returned channel. // NB: No guarantees are made about order. func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { - return getBlocks(ctx, ks, s.blockstore, s.getExchange) // hash security + var f func() exchange.Fetcher + if s.exchange != nil { + f = s.getExchange + } + + return getBlocks(ctx, ks, s.blockstore, f) // hash security } func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) <-chan blocks.Block { @@ -285,7 +294,7 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget } } - if len(misses) == 0 { + if len(misses) == 0 || fget == nil { return } From b768808ef9740aad1019a757c9ebeeeba120c7d2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 11 Jul 2019 18:21:25 -0700 Subject: [PATCH 2729/3147] switch to new merkledag walk functions EnumerateChildrenAsync has been renamed to WalkParallel to reflect the fact that: 1. It visits the root. 2. It's parallel, not async. To mirror this change, EnumerateChildren has also been renamed to Walk and now behaves the same (except that it's not parallel). This commit was moved from ipfs/go-ipfs-pinner@9e2284b1a2b6ba65b8cc2dadd7f55514e2ba0433 --- pinning/pinner/gc/gc.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index bf8b7b10fa..7190b1e015 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -170,10 +170,8 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots } for _, c := range roots { - set.Add(c) - - // EnumerateChildren recursively walks the dag and adds the keys to the given set - err := dag.EnumerateChildren(ctx, verifyGetLinks, c, set.Visit) + // Walk recursively walks the dag and adds the keys to the given set + err := dag.Walk(ctx, verifyGetLinks, c, set.Visit) if err != nil { err = verboseCidError(err) From 7bd84ea3603603f88db6c5cc9d639d0d35c9851a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 22 Jul 2019 16:43:58 -0700 Subject: [PATCH 2730/3147] fix: parallel walk in gc & pin ls This commit was moved from ipfs/go-ipfs-pinner@a8c6bed75e1da9ca0c461bf772461340961db2e0 --- pinning/pinner/gc/gc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index 7190b1e015..ad3c4149d3 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -171,7 +171,7 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots for _, c := range roots { // Walk recursively walks the dag and adds the keys to the given set - err := dag.Walk(ctx, verifyGetLinks, c, set.Visit) + err := dag.WalkParallel(ctx, verifyGetLinks, c, set.Visit) if err != nil { err = verboseCidError(err) From a7f09407bf0712261d6aad697f7eb0775ebcf55b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 24 Jul 2019 12:33:53 +0200 Subject: [PATCH 2731/3147] update to the latest go-merkledag This commit was moved from ipfs/go-ipfs-provider@746e31eee0516d72f85c937d703a2e925500620d --- provider/simple/reprovide.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 590b9d1ab1..9b751f337c 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -18,7 +18,7 @@ import ( var logR = logging.Logger("reprovider.simple") -//KeyChanFunc is function streaming CIDs to pass to content routing +// KeyChanFunc is function streaming CIDs to pass to content routing type KeyChanFunc func(context.Context) (<-chan cid.Cid, error) type doneFunc func(error) From f3b59bef5af97a250e7d8416a5ad7a05568ea52f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 24 Jul 2019 12:21:59 +0200 Subject: [PATCH 2732/3147] update the the last go-merkledag This commit was moved from ipfs/go-unixfs@e1cb36fcbf74a306e11e5b27525aedca3150f3c3 --- unixfs/hamt/hamt.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index c44b1789fe..9bf67505b0 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -330,7 +330,7 @@ func (ds *Shard) ForEachLink(ctx context.Context, f func(*ipld.Link) error) erro } // EnumLinksAsync returns a channel which will receive Links in the directory -// as they are enumerated, where order is not gauranteed +// as they are enumerated, where order is not guaranteed func (ds *Shard) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { linkResults := make(chan format.LinkResult) ctx, cancel := context.WithCancel(ctx) @@ -339,7 +339,7 @@ func (ds *Shard) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { defer cancel() getLinks := makeAsyncTrieGetLinks(ds.dserv, linkResults) cset := cid.NewSet() - err := dag.WalkParallel(ctx, getLinks, ds.cid, cset.Visit) + err := dag.Walk(ctx, getLinks, ds.cid, cset.Visit, dag.Concurrent()) if err != nil { emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) } From 13ac30921b02e5c2604e67c44c1264d87a1d5f53 Mon Sep 17 00:00:00 2001 From: Ganesh Prasad Kumble <11145839+0zAND1z@users.noreply.github.com> Date: Thu, 25 Jul 2019 19:56:40 +0530 Subject: [PATCH 2733/3147] Update README.md - updated the travis build link This commit was moved from ipfs/go-mfs@0205117f00b6ad37d5b70dbd1e78d60c4957e124 --- mfs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/README.md b/mfs/README.md index 4beaa66122..20c6e4834e 100644 --- a/mfs/README.md +++ b/mfs/README.md @@ -4,7 +4,7 @@ [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![GoDoc](https://godoc.org/github.com/ipfs/go-mfs?status.svg)](https://godoc.org/github.com/ipfs/go-mfs) -[![Build Status](https://travis-ci.org/ipfs/go-mfs.svg?branch=master)](https://travis-ci.org/ipfs/go-mfs) +[![Build Status](https://travis-ci.com/ipfs/go-mfs.svg?branch=master)](https://travis-ci.com/ipfs/go-mfs) > go-mfs implements an in-memory model of a mutable IPFS filesystem. From bf9239fe1bf9f3b6e8014900912437e42ad9b5d2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jul 2019 19:06:15 -0700 Subject: [PATCH 2734/3147] fix: return the correct error from RemoveChild This commit was moved from ipfs/go-unixfs@c5e8d46322d98839db850f1031824ab1cb0ed912 --- unixfs/hamt/hamt.go | 3 ++- unixfs/io/directory.go | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 9bf67505b0..6b89b47c77 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -221,7 +221,8 @@ func (ds *Shard) Set(ctx context.Context, name string, nd ipld.Node) error { return ds.modifyValue(ctx, hv, name, lnk) } -// Remove deletes the named entry if it exists, this operation is idempotent. +// Remove deletes the named entry if it exists. Otherwise, it returns +// os.ErrNotExist. func (ds *Shard) Remove(ctx context.Context, name string) error { hv := &hashBits{b: hash([]byte(name))} return ds.modifyValue(ctx, hv, name, nil) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 2e02276237..f773704a22 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -48,9 +48,13 @@ type Directory interface { // Find returns the root node of the file named 'name' within this directory. // In the case of HAMT-directories, it will traverse the tree. + // + // Returns os.ErrNotExist if the child does not exist. Find(context.Context, string) (ipld.Node, error) // RemoveChild removes the child with the given name. + // + // Returns os.ErrNotExist if the child doesn't exist. RemoveChild(context.Context, string) error // GetNode returns the root of this directory. @@ -196,7 +200,11 @@ func (d *BasicDirectory) Find(ctx context.Context, name string) (ipld.Node, erro // RemoveChild implements the `Directory` interface. func (d *BasicDirectory) RemoveChild(ctx context.Context, name string) error { - return d.node.RemoveNodeLink(name) + err := d.node.RemoveNodeLink(name) + if err == mdag.ErrLinkNotFound { + err = os.ErrNotExist + } + return err } // GetNode implements the `Directory` interface. From 30fa491fc1f3a52ee6320ffcd5d956359275eee2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Jul 2019 19:26:06 -0700 Subject: [PATCH 2735/3147] fix: update for merkledag API changes This commit was moved from ipfs/go-ipfs-pinner@91a73c74183f5d257b2d5d1eaecbad8bc280f199 --- pinning/pinner/gc/gc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index ad3c4149d3..e03072770e 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -171,7 +171,7 @@ func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots for _, c := range roots { // Walk recursively walks the dag and adds the keys to the given set - err := dag.WalkParallel(ctx, verifyGetLinks, c, set.Visit) + err := dag.Walk(ctx, verifyGetLinks, c, set.Visit, dag.Concurrent()) if err != nil { err = verboseCidError(err) From 98cec339880e00290049245fc50acf6fc2874701 Mon Sep 17 00:00:00 2001 From: Cole Brown Date: Fri, 2 Aug 2019 21:09:17 -0400 Subject: [PATCH 2736/3147] Bump go-libp2p-core, up test key size to 2048 This commit was moved from ipfs/interface-go-ipfs-core@6ba366dd626d3b605a67d7ade24b3065bc4d9694 --- coreiface/tests/key.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index e3461f9718..265a8f0608 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -147,7 +147,7 @@ func (tp *TestSuite) TestGenerateSize(t *testing.T) { t.Fatal(err) } - k, err := api.Key().Generate(ctx, "foo", opt.Key.Size(1024)) + k, err := api.Key().Generate(ctx, "foo", opt.Key.Size(2048)) if err != nil { t.Fatal(err) return From 1c203d9d620ee407bbe372e4025dc98ac53dc47f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 20 Aug 2019 08:59:45 -0700 Subject: [PATCH 2737/3147] cache: switch to 2q Due to patent concerns in closed-source downstream products: https://github.com/ipfs/go-ipfs/issues/6590 This commit was moved from ipfs/go-ipfs-blockstore@82da4c45720e76cd2831e8c6f1c9c145d7f76803 --- blockstore/arc_cache.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 231fd8555a..ca491e5325 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -16,7 +16,7 @@ type cacheSize int // block Cids. This provides block access-time improvements, allowing // to short-cut many searches without query-ing the underlying datastore. type arccache struct { - arc *lru.ARCCache + arc *lru.TwoQueueCache blockstore Blockstore hits metrics.Counter @@ -24,7 +24,7 @@ type arccache struct { } func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, error) { - arc, err := lru.NewARC(lruSize) + arc, err := lru.New2Q(lruSize) if err != nil { return nil, err } From 0e2dd27b7657379f7837e02bfe2bacb2bb132eb2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 20 Aug 2019 13:39:54 -0700 Subject: [PATCH 2738/3147] chore: fmt This commit was moved from ipfs/go-ipfs-blockstore@91f191931176d9cd06c6092c25b19c2c13b7055d --- blockstore/bloom_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 3720d20d89..f99bb2b4be 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -148,7 +148,7 @@ func (b *bloomcache) Has(k cid.Cid) (bool, error) { } func (b *bloomcache) GetSize(k cid.Cid) (int, error) { - return b.blockstore.GetSize(k) + return b.blockstore.GetSize(k) } func (b *bloomcache) Get(k cid.Cid) (blocks.Block, error) { From d507153cd7d2fd3adf1300706d5ee94bfd3f4327 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 20 Aug 2019 13:40:26 -0700 Subject: [PATCH 2739/3147] chore: remove gx support This commit was moved from ipfs/go-ipfs-blockstore@b40a71c749f24ccefced7e410dcfd69c7471838b --- blockstore/Makefile | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 blockstore/Makefile diff --git a/blockstore/Makefile b/blockstore/Makefile deleted file mode 100644 index 73f2841f61..0000000000 --- a/blockstore/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -all: deps -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go -deps: gx - gx --verbose install --global - gx-go rewrite -test: deps - gx test -v -race -coverprofile=coverage.txt -covermode=atomic . -rw: - gx-go rewrite -rwundo: - gx-go rewrite --undo -publish: rwundo - gx publish -.PHONY: all gx deps test rw rwundo publish - - From 1a40a254afa44a5d8e1dddf8c2396e0c622c2e91 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 23 Aug 2019 11:26:49 -0700 Subject: [PATCH 2740/3147] dep: update bbloom again This commit was moved from ipfs/go-ipfs-blockstore@f9647c539cdc21456734b5b352d73c14cf39aca6 --- blockstore/bloom_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index f99bb2b4be..bd3c611c34 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -51,7 +51,7 @@ func bloomCached(ctx context.Context, bs Blockstore, bloomSize, hashCount int) ( case <-ctx.Done(): return case <-t.C: - fill.Set(bc.bloom.FillRatio()) + fill.Set(bc.bloom.FillRatioTS()) } } } From 218207c69acbca4ce5de08d10325c0eaf43c30ce Mon Sep 17 00:00:00 2001 From: Cole Brown Date: Fri, 2 Aug 2019 21:35:00 -0400 Subject: [PATCH 2741/3147] Update go-libp2p, fix tests with weak RSA keys This commit was moved from ipfs/go-namesys@f6aa2bd8857dc44ebd1ebf590f09a6359e3da7bd --- namesys/ipns_resolver_validation_test.go | 13 +++--- namesys/namesys_test.go | 2 +- namesys/resolve_test.go | 54 ++++++------------------ 3 files changed, 20 insertions(+), 49 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 9eed8375bb..76cd223657 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,11 +5,12 @@ import ( "testing" "time" + "github.com/libp2p/go-libp2p-core/test" + ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" mockrouting "github.com/ipfs/go-ipfs-routing/mock" offline "github.com/ipfs/go-ipfs-routing/offline" - u "github.com/ipfs/go-ipfs-util" ipns "github.com/ipfs/go-ipns" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" @@ -137,19 +138,15 @@ func TestResolverValidation(t *testing.T) { } func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string, string) { - sr := u.NewTimeSeededRand() - priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, sr) + sk, pk, err := test.RandTestKeyPair(ci.RSA, 2048) if err != nil { t.Fatal(err) } - - // Create entry with expiry in one hour - pid, err := peer.IDFromPrivateKey(priv) + id, err := peer.IDFromPublicKey(pk) if err != nil { t.Fatal(err) } - - return priv, pid, PkKeyForID(pid), ipns.RecordKey(pid) + return sk, id, PkKeyForID(id), ipns.RecordKey(id) } type mockValueStore struct { diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index d1ecf49e85..4da3b17cb4 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -88,7 +88,7 @@ func TestNamesysResolution(t *testing.T) { func TestPublishWithCache0(t *testing.T) { dst := dssync.MutexWrap(ds.NewMapDatastore()) - priv, _, err := ci.GenerateKeyPair(ci.RSA, 1024) + priv, _, err := ci.GenerateKeyPair(ci.RSA, 2048) if err != nil { t.Fatal(err) } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 814bf59730..4f92a2d0d0 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,10 +11,8 @@ import ( mockrouting "github.com/ipfs/go-ipfs-routing/mock" ipns "github.com/ipfs/go-ipns" path "github.com/ipfs/go-path" - ci "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" - test "github.com/libp2p/go-libp2p-core/test" testutil "github.com/libp2p/go-libp2p-testing/net" + tnet "github.com/libp2p/go-libp2p-testing/net" ) func TestRoutingResolve(t *testing.T) { @@ -26,23 +24,15 @@ func TestRoutingResolve(t *testing.T) { resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) - privk, pubk, err := test.RandTestKeyPair(ci.RSA, 512) - if err != nil { - t.Fatal(err) - } + identity := tnet.RandIdentityOrFatal(t) h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") - err = publisher.Publish(context.Background(), privk, h) + err := publisher.Publish(context.Background(), identity.PrivateKey(), h) if err != nil { t.Fatal(err) } - pid, err := peer.IDFromPublicKey(pubk) - if err != nil { - t.Fatal(err) - } - - res, err := resolver.Resolve(context.Background(), pid.Pretty()) + res, err := resolver.Resolve(context.Background(), identity.ID().Pretty()) if err != nil { t.Fatal(err) } @@ -59,36 +49,28 @@ func TestPrexistingExpiredRecord(t *testing.T) { resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) - privk, pubk, err := test.RandTestKeyPair(ci.RSA, 512) - if err != nil { - t.Fatal(err) - } - - id, err := peer.IDFromPublicKey(pubk) - if err != nil { - t.Fatal(err) - } + identity := tnet.RandIdentityOrFatal(t) // Make an expired record and put it in the datastore h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour * -1) - entry, err := ipns.Create(privk, []byte(h), 0, eol) + entry, err := ipns.Create(identity.PrivateKey(), []byte(h), 0, eol) if err != nil { t.Fatal(err) } - err = PutRecordToRouting(context.Background(), d, pubk, entry) + err = PutRecordToRouting(context.Background(), d, identity.PublicKey(), entry) if err != nil { t.Fatal(err) } // Now, with an old record in the system already, try and publish a new one - err = publisher.Publish(context.Background(), privk, h) + err = publisher.Publish(context.Background(), identity.PrivateKey(), h) if err != nil { t.Fatal(err) } - err = verifyCanResolve(resolver, id.Pretty(), h) + err = verifyCanResolve(resolver, identity.ID().Pretty(), h) if err != nil { t.Fatal(err) } @@ -101,35 +83,27 @@ func TestPrexistingRecord(t *testing.T) { resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) - privk, pubk, err := test.RandTestKeyPair(ci.RSA, 512) - if err != nil { - t.Fatal(err) - } - - id, err := peer.IDFromPublicKey(pubk) - if err != nil { - t.Fatal(err) - } + identity := tnet.RandIdentityOrFatal(t) // Make a good record and put it in the datastore h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour) - entry, err := ipns.Create(privk, []byte(h), 0, eol) + entry, err := ipns.Create(identity.PrivateKey(), []byte(h), 0, eol) if err != nil { t.Fatal(err) } - err = PutRecordToRouting(context.Background(), d, pubk, entry) + err = PutRecordToRouting(context.Background(), d, identity.PublicKey(), entry) if err != nil { t.Fatal(err) } // Now, with an old record in the system already, try and publish a new one - err = publisher.Publish(context.Background(), privk, h) + err = publisher.Publish(context.Background(), identity.PrivateKey(), h) if err != nil { t.Fatal(err) } - err = verifyCanResolve(resolver, id.Pretty(), h) + err = verifyCanResolve(resolver, identity.ID().Pretty(), h) if err != nil { t.Fatal(err) } From 042f8534001f0fd55474615cadec1b05ccaa75bc Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 23 Aug 2019 14:27:59 -0700 Subject: [PATCH 2742/3147] chore: fix import grouping This commit was moved from ipfs/go-namesys@87436bfad00748844aec8ffa9f0844eb64845383 --- namesys/ipns_resolver_validation_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 76cd223657..1fd7488b9e 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -5,8 +5,6 @@ import ( "testing" "time" - "github.com/libp2p/go-libp2p-core/test" - ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" mockrouting "github.com/ipfs/go-ipfs-routing/mock" @@ -18,6 +16,7 @@ import ( peer "github.com/libp2p/go-libp2p-core/peer" pstore "github.com/libp2p/go-libp2p-core/peerstore" routing "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p-core/test" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" testutil "github.com/libp2p/go-libp2p-testing/net" From 3b9a723861fa7b8069ac6a0c698f83a8b6e82237 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 23 Aug 2019 16:22:22 -0700 Subject: [PATCH 2743/3147] test: fix put with hash test We just changed ID/"id" to IDENTITY/"identity" to match the multicodec table and avoid confusion with peer IDs, CIDs, etc. Unfortunately, this breaks the `--hash=id` flag. Luckily, I'm pretty sure nobody's actually using this. As putting a block with an identity hash is useless. If they are users, we can go about adding in backwards compatibility hacks later. This commit was moved from ipfs/interface-go-ipfs-core@6ebdbe7ef3eadc7f832592abb3b1b151d9b4febf --- coreiface/tests/dag.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 1ccd45d59b..2f68bbf05e 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -71,7 +71,7 @@ func (tp *TestSuite) TestPutWithHash(t *testing.T) { t.Fatal(err) } - nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), mh.ID, -1) + nd, err := ipldcbor.FromJSON(strings.NewReader(`"Hello"`), mh.SHA3_256, -1) if err != nil { t.Fatal(err) } @@ -81,7 +81,7 @@ func (tp *TestSuite) TestPutWithHash(t *testing.T) { t.Fatal(err) } - if nd.Cid().String() != "bafyqabtfjbswy3dp" { + if nd.Cid().String() != "bafyrmifu7haikttpqqgc5ewvmp76z3z4ebp7h2ph4memw7dq4nt6btmxny" { t.Errorf("got wrong cid: %s", nd.Cid().String()) } } From 37112eccdef45f4825447149539071493a3a8001 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 23 Aug 2019 18:05:12 -0700 Subject: [PATCH 2744/3147] dep: update go-datastore Deletes are now idempotent. This commit was moved from ipfs/go-ipfs-blockstore@9666db5dad64c8da12a29ba8e39a30b95feb661c --- blockstore/arc_cache.go | 9 +++------ blockstore/arc_cache_test.go | 4 ++-- blockstore/blockstore.go | 6 +----- blockstore/bloom_cache.go | 2 +- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index ca491e5325..b2ba82105c 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -37,18 +37,15 @@ func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, func (b *arccache) DeleteBlock(k cid.Cid) error { if has, _, ok := b.hasCached(k); ok && !has { - return ErrNotFound + return nil } b.arc.Remove(k) // Invalidate cache before deleting. err := b.blockstore.DeleteBlock(k) - switch err { - case nil, ErrNotFound: + if err == nil { b.cacheHave(k, false) - return err - default: - return err } + return err } // if ok == false has is inconclusive diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 6911db769c..b72c848532 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -139,8 +139,8 @@ func TestGetAndDeleteFalseShortCircuit(t *testing.T) { t.Fatal("get returned invalid result") } - if arc.DeleteBlock(exampleBlock.Cid()) != ErrNotFound { - t.Fatal("expected ErrNotFound error") + if arc.DeleteBlock(exampleBlock.Cid()) != nil { + t.Fatal("expected deletes to be idempotent") } } diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f57a90af63..03004b5924 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -186,11 +186,7 @@ func (bs *blockstore) GetSize(k cid.Cid) (int, error) { } func (bs *blockstore) DeleteBlock(k cid.Cid) error { - err := bs.datastore.Delete(dshelp.CidToDsKey(k)) - if err == ds.ErrNotFound { - return ErrNotFound - } - return err + return bs.datastore.Delete(dshelp.CidToDsKey(k)) } // AllKeysChan runs a query for keys from the blockstore. diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index bd3c611c34..6e28ecec6a 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -113,7 +113,7 @@ func (b *bloomcache) build(ctx context.Context) error { func (b *bloomcache) DeleteBlock(k cid.Cid) error { if has, ok := b.hasCached(k); ok && !has { - return ErrNotFound + return nil } return b.blockstore.DeleteBlock(k) From 500a693599d25bfb30c0b15d88d22f9dffa6acce Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 2 Sep 2019 08:53:23 -0700 Subject: [PATCH 2745/3147] readme: add a lead maintainer See: https://github.com/ipfs/team-mgmt/blob/master/LEAD_MAINTAINER_PROTOCOL.md This commit was moved from ipfs/go-ipns@1255134543a382caa20d14f3ef5418f4f28e36b0 --- ipns/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ipns/README.md b/ipns/README.md index 2ae0846a19..eb1158e2a5 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -10,6 +10,10 @@ This package contains all of the components necessary to create, understand, and validate IPNS records. It does *not* publish or resolve those records. [`go-ipfs`](https://github.com/ipfs/go-ipfs) uses this package internally to manipulate records. +## Lead Maintainer + +[Adin Schmahmann](https://github.com/aschmahmann) + ## Usage To create a new IPNS record: From 437c65f17ea9c5d9b4754841752677f7047629b3 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Sun, 8 Sep 2019 12:53:13 -0700 Subject: [PATCH 2746/3147] demote warning to debug log This commit was moved from ipfs/go-blockservice@1a0d1fd7edcaa41da7829ff7064be29d6cc0053a --- blockservice/blockservice.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 5486c0e854..ba0ab41830 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -72,7 +72,7 @@ type blockService struct { // NewBlockService creates a BlockService with given datastore instance. func New(bs blockstore.Blockstore, rem exchange.Interface) BlockService { if rem == nil { - log.Warning("blockservice running in local (offline) mode.") + log.Debug("blockservice running in local (offline) mode.") } return &blockService{ @@ -86,7 +86,7 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) BlockService { // through to the blockstore and are not skipped by cache checks. func NewWriteThrough(bs blockstore.Blockstore, rem exchange.Interface) BlockService { if rem == nil { - log.Warning("blockservice running in local (offline) mode.") + log.Debug("blockservice running in local (offline) mode.") } return &blockService{ From a8c5ec606246224d3f0dfadfc627a9f90d9b53df Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 10 Sep 2019 18:23:14 -0700 Subject: [PATCH 2747/3147] test: test ReadAt if implemented (I plan on adding support to the http client, at least) This commit was moved from ipfs/interface-go-ipfs-core@ae838686170af209e0a9b29aa1a59b64346b5de1 --- coreiface/tests/unixfs.go | 82 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 47ce505c82..aac7fa92fb 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -48,6 +48,7 @@ func (tp *TestSuite) TestUnixfs(t *testing.T) { t.Run("TestLsNonUnixfs", tp.TestLsNonUnixfs) t.Run("TestAddCloses", tp.TestAddCloses) t.Run("TestGetSeek", tp.TestGetSeek) + t.Run("TestGetReadAt", tp.TestGetReadAt) } // `echo -n 'hello, world!' | ipfs add` @@ -996,3 +997,84 @@ func (tp *TestSuite) TestGetSeek(t *testing.T) { test(dataSize-50, io.SeekStart, 100, 50, true) test(-5, io.SeekEnd, 100, 5, true) } + +func (tp *TestSuite) TestGetReadAt(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + dataSize := int64(100000) + tf := files.NewReaderFile(io.LimitReader(rand.New(rand.NewSource(1403768328)), dataSize)) + + p, err := api.Unixfs().Add(ctx, tf, options.Unixfs.Chunker("size-100")) + if err != nil { + t.Fatal(err) + } + + r, err := api.Unixfs().Get(ctx, p) + if err != nil { + t.Fatal(err) + } + + f, ok := r.(interface { + files.File + io.ReaderAt + }) + if !ok { + t.Skip("ReaderAt not implemented") + } + + orig := make([]byte, dataSize) + if _, err := io.ReadFull(f, orig); err != nil { + t.Fatal(err) + } + f.Close() + + origR := bytes.NewReader(orig) + + r, err = api.Unixfs().Get(ctx, p) + if err != nil { + t.Fatal(err) + } + + test := func(offset int64, read int, expect int64, shouldEof bool) { + t.Run(fmt.Sprintf("readat%d-r%d-%d", offset, read, expect), func(t *testing.T) { + origBuf := make([]byte, read) + origRead, err := origR.ReadAt(origBuf, offset) + if err != nil && err != io.EOF { + t.Fatalf("orig: %s", err) + } + buf := make([]byte, read) + r, err := f.ReadAt(buf, offset) + if shouldEof { + if err != io.EOF { + t.Fatal("expected EOF, got: ", err) + } + } else if err != nil { + t.Fatal("got: ", err) + } + + if int64(r) != expect { + t.Fatal("read wrong amount of data") + } + if r != origRead { + t.Fatal("read different amount of data than bytes.Reader") + } + if !bytes.Equal(buf, origBuf) { + fmt.Fprintf(os.Stderr, "original:\n%s\n", hex.Dump(origBuf)) + fmt.Fprintf(os.Stderr, "got:\n%s\n", hex.Dump(buf)) + t.Fatal("data didn't match") + } + }) + } + + test(3, 10, 10, false) + test(13, 10, 10, false) + test(513, 10, 10, false) + test(350, 100, 100, false) + test(0, int(dataSize), dataSize, false) + test(dataSize-50, 100, 50, true) +} From a242bd1bea25e20c710696536c76791e79723fb6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:00:46 -0700 Subject: [PATCH 2748/3147] doc: add a lead maintainer This commit was moved from ipfs/go-ipfs-util@6b60f8d74b09bac9d7bef7a7ffb795efff749c0a --- util/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/util/README.md b/util/README.md index 33bff12cd5..92619b4770 100644 --- a/util/README.md +++ b/util/README.md @@ -8,6 +8,10 @@ > Common utilities used by go-ipfs and other related go packages +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) + ## Install This is a Go module which can be installed with `go get github.com/ipfs/go-ipfs-util`. `go-ipfs-util` is however packaged with Gx, so it is recommended to use Gx to install it (see Usage section). From d51e93e43d47e942c1266242ab56b478e15eb135 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:14:49 -0700 Subject: [PATCH 2749/3147] doc: add a lead maintainer This commit was moved from ipfs/go-blockservice@4f137b54d1697542e5e47bcd9bed2d8bad5f0616 --- blockservice/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blockservice/README.md b/blockservice/README.md index 3df67fdecb..11d814af23 100644 --- a/blockservice/README.md +++ b/blockservice/README.md @@ -9,6 +9,9 @@ go-blockservice > go-blockservice provides a seamless interface to both local and remote storage backends. +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) ## Table of Contents From 116d2eb66cfc2c671467b8d3e16435f1055ef747 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:17:42 -0700 Subject: [PATCH 2750/3147] doc: add a lead maintainer This commit was moved from ipfs/go-ipfs-exchange-interface@aab2e33aa212746a05fc05ca0433428c69ce0d8c --- exchange/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exchange/README.md b/exchange/README.md index 8dbcfe1c3b..563ca6a279 100644 --- a/exchange/README.md +++ b/exchange/README.md @@ -8,6 +8,10 @@ > go-ipfs-exchange-interface defines the IPFS exchange interface +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) + ## Table of Contents - [Install](#install) From bc81914caf95d4aa5a4eb372085e5b13d3ac539b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:18:57 -0700 Subject: [PATCH 2751/3147] doc: add a lead maintainer This commit was moved from ipfs/go-ipfs-blockstore@e4a281ad7e051428514dcf7bd7758abff54f4fc2 --- blockstore/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blockstore/README.md b/blockstore/README.md index 446a95e257..e634101839 100644 --- a/blockstore/README.md +++ b/blockstore/README.md @@ -8,6 +8,11 @@ > go-ipfs-blockstore implements a thin wrapper over a datastore, giving a clean interface for Getting and Putting block objects. +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) + + ## Table of Contents - [Install](#install) From 5ec56f46a2932dfd1d7dd0006386cf6a88abe279 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:20:34 -0700 Subject: [PATCH 2752/3147] doc: add a lead maintainer This commit was moved from ipfs/go-ipfs-chunker@f9e6481534099152243fd8cbf436198843a2aecd --- chunker/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chunker/README.md b/chunker/README.md index 96faa3de31..84161c5466 100644 --- a/chunker/README.md +++ b/chunker/README.md @@ -12,6 +12,10 @@ The package provides a `SizeSplitter` which creates chunks of equal size and it is used by default in most cases, and a `rabin` fingerprint chunker. This chunker will attempt to split data in a way that the resulting blocks are the same when the data has repetitive patterns, thus optimizing the resulting DAGs. +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) + ## Table of Contents - [Install](#install) From cbfeae5cbc430bd36168fd4889962fc15831bfd6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:22:25 -0700 Subject: [PATCH 2753/3147] doc: add a lead maintainer This commit was moved from ipfs/go-mfs@a4d6b7f53d7e78609d438997ca64bbba841eff2b --- mfs/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mfs/README.md b/mfs/README.md index 20c6e4834e..1688a1ff75 100644 --- a/mfs/README.md +++ b/mfs/README.md @@ -8,6 +8,10 @@ > go-mfs implements an in-memory model of a mutable IPFS filesystem. +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) + ## Table of Contents - [Install](#install) From 4dbca3f8132ba92529ffcf76a472ed648ab6b1f8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:22:49 -0700 Subject: [PATCH 2754/3147] doc: add a lead maintainer This commit was moved from ipfs/go-unixfs@5567923f05b59bfa0a93b87f6db96c397920666d --- unixfs/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unixfs/README.md b/unixfs/README.md index 9a22fbd3af..4fd85e4f94 100644 --- a/unixfs/README.md +++ b/unixfs/README.md @@ -9,6 +9,9 @@ go-unixfs > go-unixfs implements unix-like filesystem utilities on top of an ipld merkledag +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) ## Table of Contents From 2285f7d555878c455c38528e37d427d9a57d18a7 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:27:03 -0700 Subject: [PATCH 2755/3147] README: stub This commit was moved from ipfs/interface-go-ipfs-core@bfec0ce2ae7f0a693589ebb68110b68e80c2bc7a --- coreiface/README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 coreiface/README.md diff --git a/coreiface/README.md b/coreiface/README.md new file mode 100644 index 0000000000..60ea79caed --- /dev/null +++ b/coreiface/README.md @@ -0,0 +1,33 @@ +interface-go-ipfs-core +================== + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](https://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23ipfs) +[![Coverage Status](https://codecov.io/gh/ipfs/interface-go-ipfs-core/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/interface-go-ipfs-core/branch/master) + +> The CoreAPI interfaces for go-ipfs. + +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) + +## Table of Contents + +- [Background](#background) +- [Contribute](#contribute) +- [License](#license) + +## Documentation + +TODO + +## Contribute + +PRs are welcome! + +Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +MIT © Protocol Labs From c32b81c4184e0730972b7617e45b1505cafbd68a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 22:29:14 -0700 Subject: [PATCH 2756/3147] doc: add a lead maintainer This commit was moved from ipfs/go-path@472cfe2c2b4c89542b460764dfc782b7be1805bd --- path/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/path/README.md b/path/README.md index 79dd928929..3edbd8c5d0 100644 --- a/path/README.md +++ b/path/README.md @@ -9,6 +9,9 @@ go-path > go-path is a helper package that provides utilities for parsing and using ipfs paths +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) ## Table of Contents From 5821710d0b24df88596eb3bbefb4ae9943b36815 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 23 Sep 2019 14:05:37 -0700 Subject: [PATCH 2757/3147] namesys: set the correct cache TTL on publish fixes https://github.com/ipfs/go-ipfs/issues/6656#issuecomment-534252128 This commit was moved from ipfs/go-namesys@ac0ea1aa4fadb3fdad8a2aaa4ff4a0a6218e8a85 --- namesys/namesys.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/namesys/namesys.go b/namesys/namesys.go index cf944001d9..0646fef7b3 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -191,6 +191,9 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. return err } ttl := DefaultResolverCacheTTL + if setTTL, ok := checkCtxTTL(ctx); ok { + ttl = setTTL + } if ttEol := time.Until(eol); ttEol < ttl { ttl = ttEol } From 5083a7e3ae08d8bf29b6eeb672c7e2b41ee968fc Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 23 Sep 2019 16:29:26 -0700 Subject: [PATCH 2758/3147] pin: fix pin update X Y where X==Y We were pining Y then removing the pin for X. When X == Y, we'd remove the new pin. fixes #6648 This commit was moved from ipfs/go-ipfs-pinner@550ed3b399036aa2507cc36f29f6cab690f7b2c0 --- pinning/pinner/pin.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 48a16f84e5..975245e063 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -516,6 +516,14 @@ func (p *pinner) RecursiveKeys() []cid.Cid { // this is more efficient than simply pinning the new one and unpinning the // old one func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error { + if from == to { + // Nothing to do. Don't remove this check or we'll end up + // _removing_ the pin. + // + // See #6648 + return nil + } + p.lock.Lock() defer p.lock.Unlock() From 46205d28eb9d4957f099f17ef9a19172e4fc9525 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 23 Sep 2019 17:52:17 -0700 Subject: [PATCH 2759/3147] namesys(test): test TTL on publish No fix is complete without a test. fixes #6670 This commit was moved from ipfs/go-namesys@246219d9fa17be3e8dc9170dbfe66fc84da14999 --- namesys/namesys_test.go | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 4da3b17cb4..524037dcff 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "testing" + "time" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" @@ -117,3 +118,51 @@ func TestPublishWithCache0(t *testing.T) { t.Fatal(err) } } + +func TestPublishWithTTL(t *testing.T) { + dst := dssync.MutexWrap(ds.NewMapDatastore()) + priv, _, err := ci.GenerateKeyPair(ci.RSA, 2048) + if err != nil { + t.Fatal(err) + } + ps := pstoremem.NewPeerstore() + pid, err := peer.IDFromPrivateKey(priv) + if err != nil { + t.Fatal(err) + } + err = ps.AddPrivKey(pid, priv) + if err != nil { + t.Fatal(err) + } + + routing := offroute.NewOfflineRouter(dst, record.NamespacedValidator{ + "ipns": ipns.Validator{KeyBook: ps}, + "pk": record.PublicKeyValidator{}, + }) + + nsys := NewNameSystem(routing, dst, 128) + p, err := path.ParsePath(unixfs.EmptyDirNode().Cid().String()) + if err != nil { + t.Fatal(err) + } + + ttl := 1 * time.Second + eol := time.Now().Add(2 * time.Second) + + ctx := context.WithValue(context.Background(), "ipns-publish-ttl", ttl) + err = nsys.Publish(ctx, priv, p) + if err != nil { + t.Fatal(err) + } + ientry, ok := nsys.(*mpns).cache.Get(pid.Pretty()) + if !ok { + t.Fatal("cache get failed") + } + entry, ok := ientry.(cacheEntry) + if !ok { + t.Fatal("bad cache item returned") + } + if entry.eol.Sub(eol) > 10*time.Millisecond { + t.Fatalf("bad cache ttl: expected %s, got %s", eol, entry.eol) + } +} From 57733596d9a6d7c4ff76a0f17c6602bf9c0227c8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 24 Sep 2019 16:44:22 -0700 Subject: [PATCH 2760/3147] doc: README This commit was moved from ipfs/go-filestore@9c3e8bfc0d030ac33f2e48b53261f222a8f49b21 --- filestore/README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 filestore/README.md diff --git a/filestore/README.md b/filestore/README.md new file mode 100644 index 0000000000..cf6940ef48 --- /dev/null +++ b/filestore/README.md @@ -0,0 +1,38 @@ +# go-filestore + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](https://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![GoDoc](https://godoc.org/github.com/ipfs/go-filestore?status.svg)](https://godoc.org/github.com/ipfs/go-filestore) + +> a by-reference file-backed blockstore + +## Lead Maintainer + +[Steven Allen](https://github.com/Stebalien) + +## Table of Contents + +- [Documentation](#documentation) +- [Contribute](#contribute) +- [License](#license) + +## Documentation + +https://godoc.org/github.com/ipfs/go-filestore + +## Contribute + +Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/go-filestore/issues)! + +This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). + +### Want to hack on IPFS? + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) + +## License + +MIT + From 4182cedde6c7165b2028de6d09831394d9a481c6 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 26 Sep 2019 12:00:06 -0700 Subject: [PATCH 2761/3147] fix: correctly handle symlink file sizes The file size of a symlink is the symlink data. This commit was moved from ipfs/go-unixfs@94a9c5d7befb25d85b162cd9b731030f31428865 --- unixfs/unixfs.go | 15 ++++++++++----- unixfs/unixfs_test.go | 17 +++++++++++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 84caf6f44e..05abf6576d 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -152,13 +152,16 @@ func DataSize(data []byte) (uint64, error) { if err != nil { return 0, err } + return size(pbdata) +} +func size(pbdata *pb.Data) (uint64, error) { switch pbdata.GetType() { - case pb.Data_Directory: + case pb.Data_Directory, pb.Data_HAMTShard: return 0, errors.New("can't get data size of directory") case pb.Data_File: return pbdata.GetFilesize(), nil - case pb.Data_Raw: + case pb.Data_Symlink, pb.Data_Raw: return uint64(len(pbdata.GetData())), nil default: return 0, errors.New("unrecognized node data type") @@ -253,10 +256,12 @@ func (n *FSNode) GetBytes() ([]byte, error) { return proto.Marshal(&n.format) } -// FileSize returns the total size of this tree. That is, the size of -// the data in this node plus the size of all its children. +// FileSize returns the size of the file. func (n *FSNode) FileSize() uint64 { - return n.format.GetFilesize() + // XXX: This needs to be able to return an error when we don't know the + // size. + size, _ := size(&n.format) + return size } // NumChildren returns the number of child blocks of this node diff --git a/unixfs/unixfs_test.go b/unixfs/unixfs_test.go index 79267133d7..cf9e8548b3 100644 --- a/unixfs/unixfs_test.go +++ b/unixfs/unixfs_test.go @@ -123,12 +123,21 @@ func TestPBdataTools(t *testing.T) { if err != nil { t.Fatal(err) } +} - _, sizeErr := DataSize(catSym) - if sizeErr == nil { - t.Fatal("DataSize didn't throw an error when taking the size of a Symlink.") +func TestSymlinkFilesize(t *testing.T) { + path := "/ipfs/adad123123/meowgie.gif" + sym, err := SymlinkData(path) + if err != nil { + t.Fatal(err) + } + size, err := DataSize(sym) + if err != nil { + t.Fatal(err) + } + if int(size) != len(path) { + t.Fatalf("size mismatch: %d != %d", size, len(path)) } - } func TestMetadata(t *testing.T) { From 125f06e6af82e7502de7596d9cfb5a3b560df4e5 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 27 Sep 2019 16:21:44 -0700 Subject: [PATCH 2762/3147] fix(test): fix a flaky pubsub test This commit was moved from ipfs/interface-go-ipfs-core@00de46e290cf0a47bb78a9e8aa264f4b6ce941cd --- coreiface/tests/pubsub.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index e66291572b..36353f8360 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -34,13 +34,20 @@ func (tp *TestSuite) TestBasicPubSub(t *testing.T) { t.Fatal(err) } + done := make(chan struct{}) go func() { + defer close(done) + ticker := time.NewTicker(100 * time.Millisecond) defer ticker.Stop() for { err := apis[1].PubSub().Publish(ctx, "testch", []byte("hello world")) - if err != nil { + switch err { + case nil: + case context.Canceled: + return + default: t.Error(err) cancel() return @@ -53,6 +60,13 @@ func (tp *TestSuite) TestBasicPubSub(t *testing.T) { } }() + // Wait for the sender to finish before we return. + // Otherwise, we can get random errors as publish fails. + defer func() { + cancel() + <-done + }() + m, err := sub.Next(ctx) if err != nil { t.Fatal(err) From b631e177d1667dcb91803f0e947fe7a73a6d4ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 22 Sep 2019 10:19:23 +0900 Subject: [PATCH 2763/3147] log keyProvider failure as an error If an error bubble up here, the Reprovider is effectively disabled. Error level is justified IMHO. This commit was moved from ipfs/go-ipfs-provider@65391ec748de992abe08765fe99932c30903a59b --- provider/simple/reprovide.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 9b751f337c..4cc48ec2a2 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -77,7 +77,7 @@ func (rp *Reprovider) Run() { err := rp.Reprovide() if err != nil { - logR.Debug(err) + logR.Errorf("failed to reprovide: %s", err) } if done != nil { From a6ab260e316058b854d94e85861815ee18e97dc6 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 5 Oct 2019 21:50:29 +0200 Subject: [PATCH 2764/3147] Add benchmarks License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@cd78345010dd145d466cba3a3ad224a373e22b86 --- chunker/rabin_test.go | 29 +++++++++++++++++++++++++++++ chunker/splitting_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index f267db41ab..140c0c4fac 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -79,3 +79,32 @@ func TestRabinChunkReuse(t *testing.T) { t.Log("too many spare chunks made") } } + +var Res uint64 + +func BenchmarkRabin(b *testing.B) { + data := make([]byte, 16<<20) + util.NewTimeSeededRand().Read(data) + + b.SetBytes(16 << 20) + b.ReportAllocs() + b.ResetTimer() + + var res uint64 + + for i := 0; i < b.N; i++ { + r := NewRabin(bytes.NewReader(data), 1024*256) + + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + res = res + uint64(len(chunk)) + } + } + Res = Res + res +} diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 3153427edf..a05504b103 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -6,6 +6,7 @@ import ( "testing" u "github.com/ipfs/go-ipfs-util" + util "github.com/ipfs/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { @@ -118,3 +119,30 @@ func (s *clipReader) Read(buf []byte) (int, error) { return s.r.Read(buf) } + +func BenchmarkDefault(b *testing.B) { + data := make([]byte, 16<<20) + util.NewTimeSeededRand().Read(data) + + b.SetBytes(16 << 20) + b.ReportAllocs() + b.ResetTimer() + + var res uint64 + + for i := 0; i < b.N; i++ { + r := DefaultSplitter(bytes.NewReader(data)) + + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + res = res + uint64(len(chunk)) + } + } + Res = Res + res +} From 8b25c4354f7fce466d5dd724aa68d735fe66762b Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sat, 5 Oct 2019 21:53:36 +0200 Subject: [PATCH 2765/3147] Fix pool usage in benchmark License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@52ca04ea25ced5b8caba1755f1555c25e5082ff1 --- chunker/splitting_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index a05504b103..27afe5967b 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -7,6 +7,7 @@ import ( u "github.com/ipfs/go-ipfs-util" util "github.com/ipfs/go-ipfs-util" + pool "github.com/libp2p/go-buffer-pool" ) func randBuf(t *testing.T, size int) []byte { @@ -142,6 +143,7 @@ func BenchmarkDefault(b *testing.B) { b.Fatal(err) } res = res + uint64(len(chunk)) + pool.Put(chunk) } } Res = Res + res From 4dddab8b3a8520f908a31dc69774ef1829ce9958 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 6 Oct 2019 12:28:43 +0200 Subject: [PATCH 2766/3147] Implement buzhash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It has the same properites as Rabin. Benchmark results: ``` name time/op Buzhash-4 14.3ms ± 7% Rabin-4 94.1ms ± 3% Default-4 1.74ms ± 7% name speed Buzhash-4 1.18GB/s ± 7% Rabin-4 178MB/s ± 3% Default-4 9.63GB/s ± 6% name alloc/op Buzhash-4 14.0kB ±48% Rabin-4 19.2MB ± 0% Default-4 474B ± 6% name allocs/op Buzhash-4 1.00 ± 0% Rabin-4 196 ±12% Default-4 2.00 ± 0% ``` License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@8dc885906ee5dce97bfbcea705de28900f1c732b --- chunker/buzhash.go | 115 ++++++++++++++++++++++++++++++++++++++++ chunker/buzhash_test.go | 94 ++++++++++++++++++++++++++++++++ chunker/gen/main.go | 33 ++++++++++++ chunker/rabin_test.go | 25 ++++++--- 4 files changed, 261 insertions(+), 6 deletions(-) create mode 100644 chunker/buzhash.go create mode 100644 chunker/buzhash_test.go create mode 100644 chunker/gen/main.go diff --git a/chunker/buzhash.go b/chunker/buzhash.go new file mode 100644 index 0000000000..dbec13ccfe --- /dev/null +++ b/chunker/buzhash.go @@ -0,0 +1,115 @@ +package chunk + +import ( + "io" + "math/bits" + + pool "github.com/libp2p/go-buffer-pool" +) + +const ( + buzMin = 128 << 10 + buzMax = 512 << 10 + buzMask = 1<<17 - 1 +) + +type Buzhash struct { + r io.Reader + buf []byte + n int + + err error +} + +func NewBuzhash(r io.Reader) *Buzhash { + return &Buzhash{ + r: r, + buf: pool.Get(buzMax), + } +} + +func (b *Buzhash) NextBytes() ([]byte, error) { + if b.err != nil { + return nil, b.err + } + + buf := b.buf + n, err := io.ReadFull(b.r, buf[b.n:]) + if err != nil { + if err == io.ErrUnexpectedEOF { + b.err = io.EOF + return buf[:n+b.n], nil + } else { + b.err = err + pool.Put(buf) + return nil, err + } + } + + i := buzMin - 32 + + var state uint32 = 0 + + for ; i < buzMin; i++ { + state = bits.RotateLeft32(state, 1) + state = state ^ bytehash[buf[i]] + } + + for ; state&buzMask != 0; i++ { + if i >= buzMax { + break + } + state = bits.RotateLeft32(state, 1) ^ bytehash[buf[i-32]] ^ bytehash[buf[i]] + } + + res := buf[:i] + b.buf = pool.Get(buzMax) + b.n = copy(b.buf, buf[i:]) + + return res, nil +} + +var bytehash = [256]uint32{ + 0x6236e7d5, 0x10279b0b, 0x72818182, 0xdc526514, 0x2fd41e3d, 0x777ef8c8, + 0x83ee5285, 0x2c8f3637, 0x2f049c1a, 0x57df9791, 0x9207151f, 0x9b544818, + 0x74eef658, 0x2028ca60, 0x0271d91a, 0x27ae587e, 0xecf9fa5f, 0x236e71cd, + 0xf43a8a2e, 0xbb13380, 0x9e57912c, 0x89a26cdb, 0x9fcf3d71, 0xa86da6f1, + 0x9c49f376, 0x346aecc7, 0xf094a9ee, 0xea99e9cb, 0xb01713c6, 0x88acffb, + 0x2960a0fb, 0x344a626c, 0x7ff22a46, 0x6d7a1aa5, 0x6a714916, 0x41d454ca, + 0x8325b830, 0xb65f563, 0x447fecca, 0xf9d0ea5e, 0xc1d9d3d4, 0xcb5ec574, + 0x55aae902, 0x86edc0e7, 0xd3a9e33, 0xe70dc1e1, 0xe3c5f639, 0x9b43140a, + 0xc6490ac5, 0x5e4030fb, 0x8e976dd5, 0xa87468ea, 0xf830ef6f, 0xcc1ed5a5, + 0x611f4e78, 0xddd11905, 0xf2613904, 0x566c67b9, 0x905a5ccc, 0x7b37b3a4, + 0x4b53898a, 0x6b8fd29d, 0xaad81575, 0x511be414, 0x3cfac1e7, 0x8029a179, + 0xd40efeda, 0x7380e02, 0xdc9beffd, 0x2d049082, 0x99bc7831, 0xff5002a8, + 0x21ce7646, 0x1cd049b, 0xf43994f, 0xc3c6c5a5, 0xbbda5f50, 0xec15ec7, + 0x9adb19b6, 0xc1e80b9, 0xb9b52968, 0xae162419, 0x2542b405, 0x91a42e9d, + 0x6be0f668, 0x6ed7a6b9, 0xbc2777b4, 0xe162ce56, 0x4266aad5, 0x60fdb704, + 0x66f832a5, 0x9595f6ca, 0xfee83ced, 0x55228d99, 0x12bf0e28, 0x66896459, + 0x789afda, 0x282baa8, 0x2367a343, 0x591491b0, 0x2ff1a4b1, 0x410739b6, + 0x9b7055a0, 0x2e0eb229, 0x24fc8252, 0x3327d3df, 0xb0782669, 0x1c62e069, + 0x7f503101, 0xf50593ae, 0xd9eb275d, 0xe00eb678, 0x5917ccde, 0x97b9660a, + 0xdd06202d, 0xed229e22, 0xa9c735bf, 0xd6316fe6, 0x6fc72e4c, 0x206dfa2, + 0xd6b15c5a, 0x69d87b49, 0x9c97745, 0x13445d61, 0x35a975aa, 0x859aa9b9, + 0x65380013, 0xd1fb6391, 0xc29255fd, 0x784a3b91, 0xb9e74c26, 0x63ce4d40, + 0xc07cbe9e, 0xe6e4529e, 0xfb3632f, 0x9438d9c9, 0x682f94a8, 0xf8fd4611, + 0x257ec1ed, 0x475ce3d6, 0x60ee2db1, 0x2afab002, 0x2b9e4878, 0x86b340de, + 0x1482fdca, 0xfe41b3bf, 0xd4a412b0, 0xe09db98c, 0xc1af5d53, 0x7e55e25f, + 0xd3346b38, 0xb7a12cbd, 0x9c6827ba, 0x71f78bee, 0x8c3a0f52, 0x150491b0, + 0xf26de912, 0x233e3a4e, 0xd309ebba, 0xa0a9e0ff, 0xca2b5921, 0xeeb9893c, + 0x33829e88, 0x9870cc2a, 0x23c4b9d0, 0xeba32ea3, 0xbdac4d22, 0x3bc8c44c, + 0x1e8d0397, 0xf9327735, 0x783b009f, 0xeb83742, 0x2621dc71, 0xed017d03, + 0x5c760aa1, 0x5a69814b, 0x96e3047f, 0xa93c9cde, 0x615c86f5, 0xb4322aa5, + 0x4225534d, 0xd2e2de3, 0xccfccc4b, 0xbac2a57, 0xf0a06d04, 0xbc78d737, + 0xf2d1f766, 0xf5a7953c, 0xbcdfda85, 0x5213b7d5, 0xbce8a328, 0xd38f5f18, + 0xdb094244, 0xfe571253, 0x317fa7ee, 0x4a324f43, 0x3ffc39d9, 0x51b3fa8e, + 0x7a4bee9f, 0x78bbc682, 0x9f5c0350, 0x2fe286c, 0x245ab686, 0xed6bf7d7, + 0xac4988a, 0x3fe010fa, 0xc65fe369, 0xa45749cb, 0x2b84e537, 0xde9ff363, + 0x20540f9a, 0xaa8c9b34, 0x5bc476b3, 0x1d574bd7, 0x929100ad, 0x4721de4d, + 0x27df1b05, 0x58b18546, 0xb7e76764, 0xdf904e58, 0x97af57a1, 0xbd4dc433, + 0xa6256dfd, 0xf63998f3, 0xf1e05833, 0xe20acf26, 0xf57fd9d6, 0x90300b4d, + 0x89df4290, 0x68d01cbc, 0xcf893ee3, 0xcc42a046, 0x778e181b, 0x67265c76, + 0xe981a4c4, 0x82991da1, 0x708f7294, 0xe6e2ae62, 0xfc441870, 0x95e1b0b6, + 0x445f825, 0x5a93b47f, 0x5e9cf4be, 0x84da71e7, 0x9d9582b0, 0x9bf835ef, + 0x591f61e2, 0x43325985, 0x5d2de32e, 0x8d8fbf0f, 0x95b30f38, 0x7ad5b6e, + 0x4e934edf, 0x3cd4990e, 0x9053e259, 0x5c41857d} diff --git a/chunker/buzhash_test.go b/chunker/buzhash_test.go new file mode 100644 index 0000000000..15b46b7a26 --- /dev/null +++ b/chunker/buzhash_test.go @@ -0,0 +1,94 @@ +package chunk + +import ( + "bytes" + "fmt" + "io" + "testing" + + util "github.com/ipfs/go-ipfs-util" + pool "github.com/libp2p/go-buffer-pool" +) + +func TestBuzhashChunking(t *testing.T) { + data := make([]byte, 1024*1024*16) + util.NewTimeSeededRand().Read(data) + + r := NewBuzhash(bytes.NewReader(data)) + + var chunks [][]byte + + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + t.Fatal(err) + } + + chunks = append(chunks, chunk) + } + + t.Logf("average block size: %d\n", len(data)/len(chunks)) + + unchunked := bytes.Join(chunks, nil) + if !bytes.Equal(unchunked, data) { + fmt.Printf("%d %d\n", len(unchunked), len(data)) + //ioutil.WriteFile("./incorrect", unchunked, 0777) + //ioutil.WriteFile("./correct", data, 0777) + t.Fatal("data was chunked incorrectly") + } +} + +func TestBuzhashChunkReuse(t *testing.T) { + newBuzhash := func(r io.Reader) cher { + return NewBuzhash(r) + } + testReuse(t, newBuzhash) +} + +func BenchmarkBuzhash(b *testing.B) { + data := make([]byte, 16<<20) + util.NewTimeSeededRand().Read(data) + + b.SetBytes(16 << 20) + b.ReportAllocs() + b.ResetTimer() + + var res uint64 + + for i := 0; i < b.N; i++ { + r := NewBuzhash(bytes.NewReader(data)) + + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + res = res + uint64(len(chunk)) + pool.Put(chunk) + } + } + Res = Res + res +} + +func TestBuzhashBitsHash(t *testing.T) { + counts := make([]byte, 32) + for _, h := range bytehash { + for i := 0; i < 32; i++ { + if h&1 == 1 { + counts[i]++ + } + h = h >> 1 + } + } + for i, c := range counts { + if c != 128 { + t.Errorf("Bit balance in position %d broken, %d ones", i, c) + } + } +} diff --git a/chunker/gen/main.go b/chunker/gen/main.go new file mode 100644 index 0000000000..9d908544b8 --- /dev/null +++ b/chunker/gen/main.go @@ -0,0 +1,33 @@ +// This file generates bytehash LUT +package main + +import ( + "fmt" + "math/rand" +) + +const nRounds = 200 + +func main() { + rnd := rand.New(rand.NewSource(0)) + + lut := make([]uint32, 256) + for i := 0; i < 256/2; i++ { + lut[i] = 1<<32 - 1 + } + + for r := 0; r < nRounds; r++ { + for b := uint32(0); b < 32; b++ { + mask := uint32(1) << b + nmask := ^mask + for i, j := range rnd.Perm(256) { + li := lut[i] + lj := lut[j] + lut[i] = li&nmask | (lj & mask) + lut[j] = lj&nmask | (li & mask) + } + } + } + + fmt.Printf("%#v", lut) +} diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 140c0c4fac..7aa8a13878 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -39,8 +39,14 @@ func TestRabinChunking(t *testing.T) { } } -func chunkData(t *testing.T, data []byte) map[string]blocks.Block { - r := NewRabin(bytes.NewReader(data), 1024*256) +type cher interface { + NextBytes() ([]byte, error) +} + +type newChunker func(io.Reader) cher + +func chunkData(t *testing.T, newC newChunker, data []byte) map[string]blocks.Block { + r := newC(bytes.NewReader(data)) blkmap := make(map[string]blocks.Block) @@ -60,12 +66,12 @@ func chunkData(t *testing.T, data []byte) map[string]blocks.Block { return blkmap } -func TestRabinChunkReuse(t *testing.T) { +func testReuse(t *testing.T, cr newChunker) { data := make([]byte, 1024*1024*16) util.NewTimeSeededRand().Read(data) - ch1 := chunkData(t, data[1000:]) - ch2 := chunkData(t, data) + ch1 := chunkData(t, cr, data[1000:]) + ch2 := chunkData(t, cr, data) var extra int for k := range ch2 { @@ -76,8 +82,15 @@ func TestRabinChunkReuse(t *testing.T) { } if extra > 2 { - t.Log("too many spare chunks made") + t.Logf("too many spare chunks made: %d", extra) + } +} + +func TestRabinChunkReuse(t *testing.T) { + newRabin := func(r io.Reader) cher { + return NewRabin(r, 256*1024) } + testReuse(t, newRabin) } var Res uint64 From 4d9433179dcf0fe858bc761aabfbc509a3da4733 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 6 Oct 2019 13:53:24 +0200 Subject: [PATCH 2767/3147] Combine if conditions License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@29aeb2c8a218c8b1478500b8d6f60f8a14cad487 --- chunker/buzhash.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/chunker/buzhash.go b/chunker/buzhash.go index dbec13ccfe..4bbe009d8b 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -55,10 +55,7 @@ func (b *Buzhash) NextBytes() ([]byte, error) { state = state ^ bytehash[buf[i]] } - for ; state&buzMask != 0; i++ { - if i >= buzMax { - break - } + for ; state&buzMask != 0 && i < buzMax; i++ { state = bits.RotateLeft32(state, 1) ^ bytehash[buf[i-32]] ^ bytehash[buf[i]] } From 725a707ac834a1cd71674c33a2fcc28dfefb46a8 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 6 Oct 2019 13:56:15 +0200 Subject: [PATCH 2768/3147] Invalidate buf pointer after returning it to the pool License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@9e34967aef4741b48009afa8d40e31981880ad83 --- chunker/buzhash.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chunker/buzhash.go b/chunker/buzhash.go index 4bbe009d8b..40b2e9301d 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -42,6 +42,7 @@ func (b *Buzhash) NextBytes() ([]byte, error) { } else { b.err = err pool.Put(buf) + b.buf = nil return nil, err } } From e9870b762c80dd63136dedc4945c1458ef137bcd Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Sun, 6 Oct 2019 23:34:06 +0200 Subject: [PATCH 2769/3147] Don't use pools for result buffers Don't return them either in benchmarks License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@b1c398a9fac50efee5232df2c9a09ba6da7af448 --- chunker/buzhash.go | 12 +++++++++--- chunker/buzhash_test.go | 6 ++---- chunker/rabin_test.go | 5 +++-- chunker/splitting_test.go | 7 +++---- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/chunker/buzhash.go b/chunker/buzhash.go index 40b2e9301d..edfc4c03df 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -38,7 +38,12 @@ func (b *Buzhash) NextBytes() ([]byte, error) { if err != nil { if err == io.ErrUnexpectedEOF { b.err = io.EOF - return buf[:n+b.n], nil + res := make([]byte, n+b.n) + copy(res, buf) + + pool.Put(b.buf) + b.buf = nil + return res, nil } else { b.err = err pool.Put(buf) @@ -60,8 +65,9 @@ func (b *Buzhash) NextBytes() ([]byte, error) { state = bits.RotateLeft32(state, 1) ^ bytehash[buf[i-32]] ^ bytehash[buf[i]] } - res := buf[:i] - b.buf = pool.Get(buzMax) + res := make([]byte, i) + copy(res, b.buf) + b.n = copy(b.buf, buf[i:]) return res, nil diff --git a/chunker/buzhash_test.go b/chunker/buzhash_test.go index 15b46b7a26..8e2b166326 100644 --- a/chunker/buzhash_test.go +++ b/chunker/buzhash_test.go @@ -7,7 +7,6 @@ import ( "testing" util "github.com/ipfs/go-ipfs-util" - pool "github.com/libp2p/go-buffer-pool" ) func TestBuzhashChunking(t *testing.T) { @@ -49,10 +48,10 @@ func TestBuzhashChunkReuse(t *testing.T) { } func BenchmarkBuzhash(b *testing.B) { - data := make([]byte, 16<<20) + data := make([]byte, 1<<10) util.NewTimeSeededRand().Read(data) - b.SetBytes(16 << 20) + b.SetBytes(int64(len(data))) b.ReportAllocs() b.ResetTimer() @@ -70,7 +69,6 @@ func BenchmarkBuzhash(b *testing.B) { b.Fatal(err) } res = res + uint64(len(chunk)) - pool.Put(chunk) } } Res = Res + res diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 7aa8a13878..9eb8c66939 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -96,10 +96,11 @@ func TestRabinChunkReuse(t *testing.T) { var Res uint64 func BenchmarkRabin(b *testing.B) { - data := make([]byte, 16<<20) + const size = 1 << 10 + data := make([]byte, size) util.NewTimeSeededRand().Read(data) - b.SetBytes(16 << 20) + b.SetBytes(size) b.ReportAllocs() b.ResetTimer() diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index 27afe5967b..f2de774421 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -7,7 +7,6 @@ import ( u "github.com/ipfs/go-ipfs-util" util "github.com/ipfs/go-ipfs-util" - pool "github.com/libp2p/go-buffer-pool" ) func randBuf(t *testing.T, size int) []byte { @@ -122,10 +121,11 @@ func (s *clipReader) Read(buf []byte) (int, error) { } func BenchmarkDefault(b *testing.B) { - data := make([]byte, 16<<20) + const size = 1 << 10 + data := make([]byte, size) util.NewTimeSeededRand().Read(data) - b.SetBytes(16 << 20) + b.SetBytes(size) b.ReportAllocs() b.ResetTimer() @@ -143,7 +143,6 @@ func BenchmarkDefault(b *testing.B) { b.Fatal(err) } res = res + uint64(len(chunk)) - pool.Put(chunk) } } Res = Res + res From d0ead241b9e0b77e4158048ece31f70a2316686d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 7 Oct 2019 17:07:31 +0900 Subject: [PATCH 2770/3147] fix(resolve): correctly handle .eth domains This should have been handled down inside the DNSLink resolver. Otherwise, we'll break any name happens to end in `.eth`. also fixes #6699 This commit was moved from ipfs/go-namesys@af26558d3f2c3cc666bf118ea7ea42da93328d2e --- namesys/dns.go | 9 +++++++++ namesys/namesys.go | 8 -------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 931edec001..984a27aa80 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -11,6 +11,9 @@ import ( isd "github.com/jbenet/go-is-domain" ) +const ethTLD = "eth" +const linkTLD = "link" + type LookupTXTFunc func(name string) (txt []string, err error) // DNSResolver implements a Resolver on DNS domains @@ -62,6 +65,12 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options fqdn = domain + "." } + if strings.HasSuffix(fqdn, "."+ethTLD+".") { + // This is an ENS name. As we're resolving via an arbitrary DNS server + // that may not know about .eth we need to add our link domain suffix. + fqdn += linkTLD + "." + } + rootChan := make(chan lookupRes, 1) go workDomain(r, fqdn, rootChan) diff --git a/namesys/namesys.go b/namesys/namesys.go index 0646fef7b3..7ae93e3e26 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -80,9 +80,6 @@ func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.R return resolveAsync(ctx, ns, name, opts.ProcessOpts(options)) } -const ethTLD = ".eth" -const linkTLD = ".link" - // resolveOnce implements resolver. func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { out := make(chan onceResult, 1) @@ -90,11 +87,6 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. if !strings.HasPrefix(name, ipnsPrefix) { name = ipnsPrefix + name } - if strings.HasSuffix(name, ethTLD) { - // This is an ENS name. As we're resolving via an arbitrary DNS server - // that may not know about .eth we need to add our link domain suffix. - name = name + linkTLD - } segments := strings.SplitN(name, "/", 4) if len(segments) < 3 || segments[0] != "" { log.Debugf("invalid name syntax for %s", name) From a9af64d2b56abea15af597fd03c30a827c157938 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 7 Oct 2019 17:33:38 +0900 Subject: [PATCH 2771/3147] test(namesys): remove broken test This commit was moved from ipfs/go-namesys@bb18e632518df51fbe4e3bcf11ecb52cb565bd4e --- namesys/namesys_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 524037dcff..a0ffbc50d8 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -60,8 +60,7 @@ func mockResolverOne() *mockResolver { func mockResolverTwo() *mockResolver { return &mockResolver{ entries: map[string]string{ - "ipfs.io": "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", - "www.wealdtech.eth.link": "/ipns/QmQ4QZh8nrsczdUEwTyfBope4THUhqxqc1fx6qYhhzZQei", + "ipfs.io": "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", }, } } @@ -83,8 +82,6 @@ func TestNamesysResolution(t *testing.T) { testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 1, "/ipns/ipfs.io", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 2, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 3, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) - testResolution(t, r, "/ipns/www.wealdtech.eth", 1, "/ipns/QmQ4QZh8nrsczdUEwTyfBope4THUhqxqc1fx6qYhhzZQei", ErrResolveRecursion) - testResolution(t, r, "/ipns/www.wealdtech.eth", 2, "/ipfs/QmP3ouCnU8NNLsW6261pAx2pNLV2E4dQoisB1sgda12Act", nil) } func TestPublishWithCache0(t *testing.T) { From 6a4535dfcb578cba16b6cc0dbb6991dcebf58351 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 7 Oct 2019 01:21:46 +0200 Subject: [PATCH 2772/3147] Improve benchmarks License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@25cb45d1068c0b537f335900e897721c72c10920 --- chunker/benchmark_test.go | 59 +++++++++++++++++++++++++++++++++++++++ chunker/buzhash.go | 4 +++ chunker/buzhash_test.go | 31 ++++---------------- chunker/rabin_test.go | 40 ++++---------------------- chunker/splitting_test.go | 29 ++----------------- 5 files changed, 77 insertions(+), 86 deletions(-) create mode 100644 chunker/benchmark_test.go diff --git a/chunker/benchmark_test.go b/chunker/benchmark_test.go new file mode 100644 index 0000000000..5069b06536 --- /dev/null +++ b/chunker/benchmark_test.go @@ -0,0 +1,59 @@ +package chunk + +import ( + "bytes" + "io" + "math/rand" + "testing" +) + +type newSplitter func(io.Reader) Splitter + +type bencSpec struct { + size int + name string +} + +var bSizes = []bencSpec{ + {1 << 10, "1K"}, + {1 << 20, "1M"}, + {16 << 20, "16M"}, + {100 << 20, "100M"}, +} + +func benchmarkChunker(b *testing.B, ns newSplitter) { + for _, s := range bSizes { + s := s + b.Run(s.name, func(b *testing.B) { + benchmarkChunkerSize(b, ns, s.size) + }) + } +} + +func benchmarkChunkerSize(b *testing.B, ns newSplitter, size int) { + rng := rand.New(rand.NewSource(1)) + data := make([]byte, size) + rng.Read(data) + + b.SetBytes(int64(size)) + b.ReportAllocs() + b.ResetTimer() + + var res uint64 + + for i := 0; i < b.N; i++ { + r := ns(bytes.NewReader(data)) + + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + b.Fatal(err) + } + res = res + uint64(len(chunk)) + } + } + Res = Res + res +} diff --git a/chunker/buzhash.go b/chunker/buzhash.go index edfc4c03df..099b723b18 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -28,6 +28,10 @@ func NewBuzhash(r io.Reader) *Buzhash { } } +func (b *Buzhash) Reader() io.Reader { + return b.r +} + func (b *Buzhash) NextBytes() ([]byte, error) { if b.err != nil { return nil, b.err diff --git a/chunker/buzhash_test.go b/chunker/buzhash_test.go index 8e2b166326..6e59d6be8c 100644 --- a/chunker/buzhash_test.go +++ b/chunker/buzhash_test.go @@ -41,37 +41,16 @@ func TestBuzhashChunking(t *testing.T) { } func TestBuzhashChunkReuse(t *testing.T) { - newBuzhash := func(r io.Reader) cher { + newBuzhash := func(r io.Reader) Splitter { return NewBuzhash(r) } testReuse(t, newBuzhash) } -func BenchmarkBuzhash(b *testing.B) { - data := make([]byte, 1<<10) - util.NewTimeSeededRand().Read(data) - - b.SetBytes(int64(len(data))) - b.ReportAllocs() - b.ResetTimer() - - var res uint64 - - for i := 0; i < b.N; i++ { - r := NewBuzhash(bytes.NewReader(data)) - - for { - chunk, err := r.NextBytes() - if err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - res = res + uint64(len(chunk)) - } - } - Res = Res + res +func BenchmarkBuzhash2(b *testing.B) { + benchmarkChunker(b, func(r io.Reader) Splitter { + return NewBuzhash(r) + }) } func TestBuzhashBitsHash(t *testing.T) { diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 9eb8c66939..857e97c2ca 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -39,13 +39,7 @@ func TestRabinChunking(t *testing.T) { } } -type cher interface { - NextBytes() ([]byte, error) -} - -type newChunker func(io.Reader) cher - -func chunkData(t *testing.T, newC newChunker, data []byte) map[string]blocks.Block { +func chunkData(t *testing.T, newC newSplitter, data []byte) map[string]blocks.Block { r := newC(bytes.NewReader(data)) blkmap := make(map[string]blocks.Block) @@ -66,7 +60,7 @@ func chunkData(t *testing.T, newC newChunker, data []byte) map[string]blocks.Blo return blkmap } -func testReuse(t *testing.T, cr newChunker) { +func testReuse(t *testing.T, cr newSplitter) { data := make([]byte, 1024*1024*16) util.NewTimeSeededRand().Read(data) @@ -87,7 +81,7 @@ func testReuse(t *testing.T, cr newChunker) { } func TestRabinChunkReuse(t *testing.T) { - newRabin := func(r io.Reader) cher { + newRabin := func(r io.Reader) Splitter { return NewRabin(r, 256*1024) } testReuse(t, newRabin) @@ -96,29 +90,7 @@ func TestRabinChunkReuse(t *testing.T) { var Res uint64 func BenchmarkRabin(b *testing.B) { - const size = 1 << 10 - data := make([]byte, size) - util.NewTimeSeededRand().Read(data) - - b.SetBytes(size) - b.ReportAllocs() - b.ResetTimer() - - var res uint64 - - for i := 0; i < b.N; i++ { - r := NewRabin(bytes.NewReader(data), 1024*256) - - for { - chunk, err := r.NextBytes() - if err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - res = res + uint64(len(chunk)) - } - } - Res = Res + res + benchmarkChunker(b, func(r io.Reader) Splitter { + return NewRabin(r, 256<<10) + }) } diff --git a/chunker/splitting_test.go b/chunker/splitting_test.go index f2de774421..d6498fcbed 100644 --- a/chunker/splitting_test.go +++ b/chunker/splitting_test.go @@ -6,7 +6,6 @@ import ( "testing" u "github.com/ipfs/go-ipfs-util" - util "github.com/ipfs/go-ipfs-util" ) func randBuf(t *testing.T, size int) []byte { @@ -121,29 +120,7 @@ func (s *clipReader) Read(buf []byte) (int, error) { } func BenchmarkDefault(b *testing.B) { - const size = 1 << 10 - data := make([]byte, size) - util.NewTimeSeededRand().Read(data) - - b.SetBytes(size) - b.ReportAllocs() - b.ResetTimer() - - var res uint64 - - for i := 0; i < b.N; i++ { - r := DefaultSplitter(bytes.NewReader(data)) - - for { - chunk, err := r.NextBytes() - if err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - res = res + uint64(len(chunk)) - } - } - Res = Res + res + benchmarkChunker(b, func(r io.Reader) Splitter { + return DefaultSplitter(r) + }) } From 9f68dfe9ca69ebc09c78c9dd226c0a9d7f1a5df8 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 7 Oct 2019 11:49:08 +0200 Subject: [PATCH 2773/3147] Do not exit if buffer is not full. License: MIT Signed-off-by: Jakub Sztandera License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@5ac3082b5ba63dd0dd1cdac6dc2d532d86d83b26 --- chunker/buzhash.go | 26 ++++++++++++++++---------- chunker/buzhash_test.go | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/chunker/buzhash.go b/chunker/buzhash.go index 099b723b18..1a9b747de9 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -40,14 +40,16 @@ func (b *Buzhash) NextBytes() ([]byte, error) { buf := b.buf n, err := io.ReadFull(b.r, buf[b.n:]) if err != nil { - if err == io.ErrUnexpectedEOF { - b.err = io.EOF - res := make([]byte, n+b.n) - copy(res, buf) - - pool.Put(b.buf) - b.buf = nil - return res, nil + if err == io.ErrUnexpectedEOF || err == io.EOF { + if b.n+n < buzMin { + b.err = io.EOF + res := make([]byte, b.n+n) + copy(res, buf) + + pool.Put(b.buf) + b.buf = nil + return res, nil + } } else { b.err = err pool.Put(buf) @@ -65,14 +67,18 @@ func (b *Buzhash) NextBytes() ([]byte, error) { state = state ^ bytehash[buf[i]] } - for ; state&buzMask != 0 && i < buzMax; i++ { + if b.n+n > len(buf) { + panic("this is impossible, but gives +9 to performance") + } + + for ; state&buzMask != 0 && i < b.n+n; i++ { state = bits.RotateLeft32(state, 1) ^ bytehash[buf[i-32]] ^ bytehash[buf[i]] } res := make([]byte, i) copy(res, b.buf) - b.n = copy(b.buf, buf[i:]) + b.n = copy(b.buf, buf[i:b.n+n]) return res, nil } diff --git a/chunker/buzhash_test.go b/chunker/buzhash_test.go index 6e59d6be8c..f630cef89b 100644 --- a/chunker/buzhash_test.go +++ b/chunker/buzhash_test.go @@ -53,7 +53,7 @@ func BenchmarkBuzhash2(b *testing.B) { }) } -func TestBuzhashBitsHash(t *testing.T) { +func TestBuzhashBitsHashBias(t *testing.T) { counts := make([]byte, 32) for _, h := range bytehash { for i := 0; i < 32; i++ { From a9276c6ee9bc00f722bfdb77280cba00cf3041e2 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 7 Oct 2019 11:53:44 +0200 Subject: [PATCH 2774/3147] Cleanup buf usage License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@462a6eb4ba7783e59120cd9656dae712fd12218f --- chunker/buzhash.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/chunker/buzhash.go b/chunker/buzhash.go index 1a9b747de9..54115d59b0 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -37,14 +37,13 @@ func (b *Buzhash) NextBytes() ([]byte, error) { return nil, b.err } - buf := b.buf - n, err := io.ReadFull(b.r, buf[b.n:]) + n, err := io.ReadFull(b.r, b.buf[b.n:]) if err != nil { if err == io.ErrUnexpectedEOF || err == io.EOF { if b.n+n < buzMin { b.err = io.EOF res := make([]byte, b.n+n) - copy(res, buf) + copy(res, b.buf) pool.Put(b.buf) b.buf = nil @@ -52,7 +51,7 @@ func (b *Buzhash) NextBytes() ([]byte, error) { } } else { b.err = err - pool.Put(buf) + pool.Put(b.buf) b.buf = nil return nil, err } @@ -64,21 +63,21 @@ func (b *Buzhash) NextBytes() ([]byte, error) { for ; i < buzMin; i++ { state = bits.RotateLeft32(state, 1) - state = state ^ bytehash[buf[i]] + state = state ^ bytehash[b.buf[i]] } - if b.n+n > len(buf) { + if b.n+n > len(b.buf) { panic("this is impossible, but gives +9 to performance") } for ; state&buzMask != 0 && i < b.n+n; i++ { - state = bits.RotateLeft32(state, 1) ^ bytehash[buf[i-32]] ^ bytehash[buf[i]] + state = bits.RotateLeft32(state, 1) ^ bytehash[b.buf[i-32]] ^ bytehash[b.buf[i]] } res := make([]byte, i) copy(res, b.buf) - b.n = copy(b.buf, buf[i:b.n+n]) + b.n = copy(b.buf, b.buf[i:b.n+n]) return res, nil } From f66d4a0d2b0d94dedea4571fc70e66361f520759 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Mon, 7 Oct 2019 12:01:18 +0200 Subject: [PATCH 2775/3147] Add buzhash to parsers list License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@57fa65915807a087b69fa6c7e3442cbe56413960 --- chunker/parse.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/chunker/parse.go b/chunker/parse.go index af0a31e80c..5d472b7092 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -14,8 +14,8 @@ var ( ) // FromString returns a Splitter depending on the given string: -// it supports "default" (""), "size-{size}", "rabin", "rabin-{blocksize}" and -// "rabin-{min}-{avg}-{max}". +// it supports "default" (""), "size-{size}", "rabin", "rabin-{blocksize}", +// "rabin-{min}-{avg}-{max}" and "buzhash". func FromString(r io.Reader, chunker string) (Splitter, error) { switch { case chunker == "" || chunker == "default": @@ -34,6 +34,9 @@ func FromString(r io.Reader, chunker string) (Splitter, error) { case strings.HasPrefix(chunker, "rabin"): return parseRabinString(r, chunker) + case chunker == "buzhash": + return NewBuzhash(r), nil + default: return nil, fmt.Errorf("unrecognized chunker option: %s", chunker) } From 293d260dad40d3d21adfe33093515ef4be3f1d3d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 7 Oct 2019 22:23:35 +0900 Subject: [PATCH 2776/3147] test(namesys): add fixed eth.link test This commit was moved from ipfs/go-namesys@37fb4f7d8c901a9c068353cdab2f279f60bc6e48 --- namesys/dns_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 8d53887be5..653c3c7887 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -126,6 +126,9 @@ func newMockDNS() *mockDNS { "fqdn.example.com.": []string{ "dnslink=/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", }, + "www.wealdtech.eth.link.": []string{ + "dnslink=/ipns/ipfs.example.com", + }, }, } } @@ -163,4 +166,7 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "double.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "conflict.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", nil) testResolution(t, r, "fqdn.example.com.", opts.DefaultDepthLimit, "/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", nil) + testResolution(t, r, "www.wealdtech.eth", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) + testResolution(t, r, "www.wealdtech.eth", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "www.wealdtech.eth.link", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) } From eabc6d1e93bb724832193b725a65cbe683c6f8e3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 8 Oct 2019 16:50:24 +0900 Subject: [PATCH 2777/3147] fix(pin): wait till after fetching to remove direct pin Otherwise, we could abort while fetching the graph and stay in a state where the direct pin is removed. fixes #4650 This commit was moved from ipfs/go-ipfs-pinner@c53b7d39f7366427b21016474d8c5dce7a4ffd65 --- pinning/pinner/pin.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 975245e063..63fa663c16 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -225,9 +225,6 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { return nil } - if p.directPin.Has(c) { - p.directPin.Remove(c) - } p.lock.Unlock() // fetch entire graph err := mdag.FetchGraph(ctx, c, p.dserv) From 30eb9c7c432be938b40951a4c98b8cfbe67899cc Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 11 Oct 2019 11:14:39 -0400 Subject: [PATCH 2778/3147] test(pinning): add pin ls tests for indirect pin traversal and pin type precedence This commit was moved from ipfs/interface-go-ipfs-core@cd7be61c71d8169a47604247588b258699f45b5d --- coreiface/tests/pin.go | 269 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 268 insertions(+), 1 deletion(-) diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 9b28a682a1..7e574fa0df 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -2,14 +2,15 @@ package tests import ( "context" - "github.com/ipfs/interface-go-ipfs-core/path" "math" "strings" "testing" "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/path" + "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" ) @@ -25,6 +26,8 @@ func (tp *TestSuite) TestPin(t *testing.T) { t.Run("TestPinAdd", tp.TestPinAdd) t.Run("TestPinSimple", tp.TestPinSimple) t.Run("TestPinRecursive", tp.TestPinRecursive) + t.Run("TestPinLsIndirect", tp.TestPinLsIndirect) + t.Run("TestPinLsPrecedence", tp.TestPinLsPrecedence) } func (tp *TestSuite) TestPinAdd(t *testing.T) { @@ -238,3 +241,267 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { } */ } + +// TestPinLsIndirect verifies that indirect nodes are listed by pin ls even if a parent node is directly pinned +func (tp *TestSuite) TestPinLsIndirect(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + leaf, parent, grandparent := getThreeChainedNodes(t, ctx, api, "foo") + + err = api.Pin().Add(ctx, path.IpldPath(grandparent.Cid())) + if err != nil { + t.Fatal(err) + } + + err = api.Pin().Add(ctx, path.IpldPath(parent.Cid()), opt.Pin.Recursive(false)) + if err != nil { + t.Fatal(err) + } + + assertPinTypes(t, ctx, api, []cidContainer{grandparent}, []cidContainer{parent}, []cidContainer{leaf}) +} + +// TestPinLsPrecedence verifies the precedence of pins (recursive > direct > indirect) +func (tp *TestSuite) TestPinLsPrecedence(t *testing.T) { + // Testing precedence of recursive, direct and indirect pins + // Results should be recursive > indirect, direct > indirect, and recursive > direct + + t.Run("TestPinLsPredenceRecursiveIndirect", tp.TestPinLsPredenceRecursiveIndirect) + t.Run("TestPinLsPrecedenceDirectIndirect", tp.TestPinLsPrecedenceDirectIndirect) + t.Run("TestPinLsPrecedenceRecursiveDirect", tp.TestPinLsPrecedenceRecursiveDirect) +} + +func (tp *TestSuite) TestPinLsPredenceRecursiveIndirect(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + // Test recursive > indirect + leaf, parent, grandparent := getThreeChainedNodes(t, ctx, api, "recursive > indirect") + + err = api.Pin().Add(ctx, path.IpldPath(grandparent.Cid())) + if err != nil { + t.Fatal(err) + } + + err = api.Pin().Add(ctx, path.IpldPath(parent.Cid())) + if err != nil { + t.Fatal(err) + } + + assertPinTypes(t, ctx, api, []cidContainer{grandparent, parent}, []cidContainer{}, []cidContainer{leaf}) +} + +func (tp *TestSuite) TestPinLsPrecedenceDirectIndirect(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + // Test direct > indirect + leaf, parent, grandparent := getThreeChainedNodes(t, ctx, api, "direct > indirect") + + err = api.Pin().Add(ctx, path.IpldPath(grandparent.Cid())) + if err != nil { + t.Fatal(err) + } + + err = api.Pin().Add(ctx, path.IpldPath(parent.Cid()), opt.Pin.Recursive(false)) + if err != nil { + t.Fatal(err) + } + + assertPinTypes(t, ctx, api, []cidContainer{grandparent}, []cidContainer{parent}, []cidContainer{leaf}) +} + +func (tp *TestSuite) TestPinLsPrecedenceRecursiveDirect(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + // Test recursive > direct + leaf, parent, grandparent := getThreeChainedNodes(t, ctx, api, "recursive + direct = error") + + err = api.Pin().Add(ctx, path.IpldPath(parent.Cid())) + if err != nil { + t.Fatal(err) + } + + err = api.Pin().Add(ctx, path.IpldPath(parent.Cid()), opt.Pin.Recursive(false)) + if err == nil { + t.Fatal("expected error directly pinning a recursively pinned node") + } + + assertPinTypes(t, ctx, api, []cidContainer{parent}, []cidContainer{}, []cidContainer{leaf}) + + err = api.Pin().Add(ctx, path.IpldPath(grandparent.Cid()), opt.Pin.Recursive(false)) + if err != nil { + t.Fatal(err) + } + + err = api.Pin().Add(ctx, path.IpldPath(grandparent.Cid())) + if err != nil { + t.Fatal(err) + } + + assertPinTypes(t, ctx, api, []cidContainer{grandparent, parent}, []cidContainer{}, []cidContainer{leaf}) +} + +type cidContainer interface { + Cid() cid.Cid +} + +func getThreeChainedNodes(t *testing.T, ctx context.Context, api iface.CoreAPI, leafData string) (cidContainer, cidContainer, cidContainer) { + leaf, err := api.Unixfs().Add(ctx, strFile(leafData)()) + if err != nil { + t.Fatal(err) + } + + parent, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+leaf.Cid().String()+`"}}`), math.MaxUint64, -1) + if err != nil { + t.Fatal(err) + } + + grandparent, err := ipldcbor.FromJSON(strings.NewReader(`{"lnk": {"/": "`+parent.Cid().String()+`"}}`), math.MaxUint64, -1) + if err != nil { + t.Fatal(err) + } + + if err := api.Dag().AddMany(ctx, []ipld.Node{parent, grandparent}); err != nil { + t.Fatal(err) + } + + return leaf, parent, grandparent +} + +func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI, recusive, direct, indirect []cidContainer) { + assertPinLsAllConsistency(t, ctx, api) + + list, err := api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) + if err != nil { + t.Fatal(err) + } + + assertPinCids(t, list, recusive...) + + list, err = api.Pin().Ls(ctx, opt.Pin.Type.Direct()) + if err != nil { + t.Fatal(err) + } + + assertPinCids(t, list, direct...) + + list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) + if err != nil { + t.Fatal(err) + } + + assertPinCids(t, list, indirect...) +} + +// assertPinCids verifies that the pins match the expected cids +func assertPinCids(t *testing.T, pins []iface.Pin, cids ...cidContainer) { + t.Helper() + + if expected, actual := len(cids), len(pins); expected != actual { + t.Fatalf("expected pin list to have len %d, was %d", expected, actual) + } + + cSet := cid.NewSet() + for _, c := range cids { + cSet.Add(c.Cid()) + } + + valid := true + for _, p := range pins { + c := p.Path().Cid() + if cSet.Has(c) { + cSet.Remove(c) + } else { + valid = false + break + } + } + + valid = valid && cSet.Len() == 0 + + if !valid { + pinStrs := make([]string, len(pins)) + for i, p := range pins { + pinStrs[i] = p.Path().Cid().String() + } + pathStrs := make([]string, len(cids)) + for i, c := range cids { + pathStrs[i] = c.Cid().String() + } + t.Fatalf("expected: %s \nactual: %s", strings.Join(pathStrs, ", "), strings.Join(pinStrs, ", ")) + } +} + +// assertPinLsAllConsistency verifies that listing all pins gives the same result as listing the pin types individually +func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.CoreAPI) { + t.Helper() + allPins, err := api.Pin().Ls(ctx) + if err != nil { + t.Fatal(err) + } + + type pinTypeProps struct { + *cid.Set + opt.PinLsOption + } + + all, recursive, direct, indirect := cid.NewSet(), cid.NewSet(), cid.NewSet(), cid.NewSet() + typeMap := map[string]*pinTypeProps{ + "recursive": {recursive, opt.Pin.Type.Recursive()}, + "direct": {direct, opt.Pin.Type.Direct()}, + "indirect": {indirect, opt.Pin.Type.Indirect()}, + } + + for _, p := range allPins { + if !all.Visit(p.Path().Cid()) { + t.Fatalf("pin ls returned the same cid multiple times") + } + + typeStr := p.Type() + if typeSet, ok := typeMap[p.Type()]; ok { + typeSet.Add(p.Path().Cid()) + } else { + t.Fatalf("unknown pin type: %s", typeStr) + } + } + + for typeStr, pinProps := range typeMap { + pins, err := api.Pin().Ls(ctx, pinProps.PinLsOption) + if err != nil { + t.Fatal(err) + } + + if expected, actual := len(pins), pinProps.Set.Len(); expected != actual { + t.Fatalf("pin ls all has %d pins of type %s, but pin ls for the type has %d", expected, typeStr, actual) + } + + for _, p := range pins { + if pinType := p.Type(); pinType != typeStr { + t.Fatalf("returned wrong pin type: expected %s, got %s", typeStr, pinType) + } + + if c := p.Path().Cid(); !pinProps.Has(c) { + t.Fatalf("%s expected to be in pin ls all as type %s", c.String(), typeStr) + } + } + } +} From 1cb0a281f44440e83bbe3fc3d04d609f937e8087 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 15 Oct 2019 22:48:08 +0900 Subject: [PATCH 2779/3147] chore(dep): update autogenerated protobuf code This commit was moved from ipfs/go-filestore@fb13425f8a5bd9e186d3159c2c0185a5e8eda78a --- filestore/pb/dataobj.pb.go | 136 +++++++++++++++---------------------- 1 file changed, 56 insertions(+), 80 deletions(-) diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index 59650a11c1..5ecc2489e0 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: filestore/pb/dataobj.proto +// source: dataobj.proto package datastore_pb @@ -8,6 +8,7 @@ import ( proto "github.com/gogo/protobuf/proto" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -19,7 +20,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type DataObj struct { FilePath string `protobuf:"bytes,1,opt,name=FilePath" json:"FilePath"` @@ -31,7 +32,7 @@ func (m *DataObj) Reset() { *m = DataObj{} } func (m *DataObj) String() string { return proto.CompactTextString(m) } func (*DataObj) ProtoMessage() {} func (*DataObj) Descriptor() ([]byte, []int) { - return fileDescriptor_86a3613fbaff9a6c, []int{0} + return fileDescriptor_a76cb282d869d683, []int{0} } func (m *DataObj) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -41,7 +42,7 @@ func (m *DataObj) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DataObj.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -85,26 +86,26 @@ func init() { proto.RegisterType((*DataObj)(nil), "datastore.pb.DataObj") } -func init() { proto.RegisterFile("filestore/pb/dataobj.proto", fileDescriptor_86a3613fbaff9a6c) } +func init() { proto.RegisterFile("dataobj.proto", fileDescriptor_a76cb282d869d683) } -var fileDescriptor_86a3613fbaff9a6c = []byte{ - // 160 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xcb, 0xcc, 0x49, - 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0xd5, 0x2f, 0x48, 0xd2, 0x4f, 0x49, 0x2c, 0x49, 0xcc, 0x4f, 0xca, - 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x01, 0x71, 0xc1, 0x72, 0x7a, 0x05, 0x49, 0x4a, - 0xc9, 0x5c, 0xec, 0x2e, 0x89, 0x25, 0x89, 0xfe, 0x49, 0x59, 0x42, 0x0a, 0x5c, 0x1c, 0x6e, 0x99, - 0x39, 0xa9, 0x01, 0x89, 0x25, 0x19, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x4e, 0x2c, 0x27, 0xee, - 0xc9, 0x33, 0x04, 0xc1, 0x45, 0x85, 0x64, 0xb8, 0xd8, 0xfc, 0xd3, 0xd2, 0x8a, 0x53, 0x4b, 0x24, - 0x98, 0x14, 0x18, 0x35, 0x58, 0xa0, 0xf2, 0x50, 0x31, 0x21, 0x09, 0x2e, 0x96, 0xe0, 0xcc, 0xaa, - 0x54, 0x09, 0x66, 0x24, 0x39, 0xb0, 0x88, 0x93, 0xc4, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, - 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, - 0xcb, 0x31, 0x00, 0x02, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x87, 0xf5, 0x88, 0xa9, 0x00, 0x00, 0x00, +var fileDescriptor_a76cb282d869d683 = []byte{ + // 150 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4d, 0x49, 0x2c, 0x49, + 0xcc, 0x4f, 0xca, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x01, 0x71, 0x8b, 0x4b, 0xf2, + 0x8b, 0x52, 0xf5, 0x0a, 0x92, 0x94, 0x92, 0xb9, 0xd8, 0x5d, 0x12, 0x4b, 0x12, 0xfd, 0x93, 0xb2, + 0x84, 0x14, 0xb8, 0x38, 0xdc, 0x32, 0x73, 0x52, 0x03, 0x12, 0x4b, 0x32, 0x24, 0x18, 0x15, 0x18, + 0x35, 0x38, 0x9d, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0x82, 0x8b, 0x0a, 0xc9, 0x70, 0xb1, 0xf9, + 0xa7, 0xa5, 0x15, 0xa7, 0x96, 0x48, 0x30, 0x29, 0x30, 0x6a, 0xb0, 0x40, 0xe5, 0xa1, 0x62, 0x42, + 0x12, 0x5c, 0x2c, 0xc1, 0x99, 0x55, 0xa9, 0x12, 0xcc, 0x48, 0x72, 0x60, 0x11, 0x27, 0x89, 0x13, + 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, + 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x00, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x4a, + 0x76, 0xa0, 0x9c, 0x00, 0x00, 0x00, } func (m *DataObj) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -112,31 +113,39 @@ func (m *DataObj) Marshal() (dAtA []byte, err error) { } func (m *DataObj) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DataObj) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintDataobj(dAtA, i, uint64(len(m.FilePath))) - i += copy(dAtA[i:], m.FilePath) - dAtA[i] = 0x10 - i++ - i = encodeVarintDataobj(dAtA, i, uint64(m.Offset)) - dAtA[i] = 0x18 - i++ i = encodeVarintDataobj(dAtA, i, uint64(m.Size_)) - return i, nil + i-- + dAtA[i] = 0x18 + i = encodeVarintDataobj(dAtA, i, uint64(m.Offset)) + i-- + dAtA[i] = 0x10 + i -= len(m.FilePath) + copy(dAtA[i:], m.FilePath) + i = encodeVarintDataobj(dAtA, i, uint64(len(m.FilePath))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } func encodeVarintDataobj(dAtA []byte, offset int, v uint64) int { + offset -= sovDataobj(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *DataObj) Size() (n int) { if m == nil { @@ -152,14 +161,7 @@ func (m *DataObj) Size() (n int) { } func sovDataobj(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozDataobj(x uint64) (n int) { return sovDataobj(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -290,6 +292,7 @@ func (m *DataObj) Unmarshal(dAtA []byte) error { func skipDataobj(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -321,10 +324,8 @@ func skipDataobj(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -345,55 +346,30 @@ func skipDataobj(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthDataobj } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthDataobj - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowDataobj - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipDataobj(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthDataobj - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupDataobj + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthDataobj + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthDataobj = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowDataobj = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthDataobj = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowDataobj = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupDataobj = fmt.Errorf("proto: unexpected end of group") ) From 5ef6d0b270e746103855f344be5bf9f423d391e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Thu, 17 Oct 2019 18:16:55 +0200 Subject: [PATCH 2780/3147] adapt to go-ipfs Pinner interface changes with context and error This commit was moved from ipfs/go-ipfs-provider@f2597dc7065a64896c4f693056aa21fa6de0c8d7 --- provider/simple/reprovide.go | 18 ++++++++++++++---- provider/simple/reprovide_test.go | 8 ++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 4cc48ec2a2..e5afe80d24 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -171,8 +171,8 @@ func NewBlockstoreProvider(bstore blocks.Blockstore) KeyChanFunc { // Pinner interface defines how the simple.Reprovider wants to interact // with a Pinning service type Pinner interface { - DirectKeys() []cid.Cid - RecursiveKeys() []cid.Cid + DirectKeys(ctx context.Context) ([]cid.Cid, error) + RecursiveKeys(ctx context.Context) ([]cid.Cid, error) } // NewPinnedProvider returns provider supplying pinned keys @@ -208,11 +208,21 @@ func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots defer cancel() defer close(set.New) - for _, key := range pinning.DirectKeys() { + dkeys, err := pinning.DirectKeys(ctx) + if err != nil { + logR.Errorf("reprovide direct pins: %s", err) + return + } + for _, key := range dkeys { set.Visitor(ctx)(key) } - for _, key := range pinning.RecursiveKeys() { + rkeys, err := pinning.RecursiveKeys(ctx) + if err != nil { + logR.Errorf("reprovide indirect pins: %s", err) + return + } + for _, key := range rkeys { if onlyRoots { set.Visitor(ctx)(key) } else { diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index efe906f01b..322e4c10ae 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -100,12 +100,12 @@ type mockPinner struct { direct []cid.Cid } -func (mp *mockPinner) DirectKeys() []cid.Cid { - return mp.direct +func (mp *mockPinner) DirectKeys(ctx context.Context) ([]cid.Cid, error) { + return mp.direct, nil } -func (mp *mockPinner) RecursiveKeys() []cid.Cid { - return mp.recursive +func (mp *mockPinner) RecursiveKeys(ctx context.Context) ([]cid.Cid, error) { + return mp.recursive, nil } func TestReprovidePinned(t *testing.T) { From fb1137a7d4fa1bc7b4856e20728f259f5d8efd82 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 6 Nov 2019 18:08:07 +0100 Subject: [PATCH 2781/3147] Improve performance of buzhash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` name old time/op new time/op delta Buzhash2/1K-4 610ns ± 4% 643ns ±16% ~ (p=0.421 n=8+10) Buzhash2/1M-4 1.25ms ± 5% 1.16ms ± 4% -7.31% (p=0.000 n=10+10) Buzhash2/16M-4 19.2ms ± 2% 17.5ms ± 2% -8.73% (p=0.000 n=9+9) Buzhash2/100M-4 117ms ± 1% 107ms ± 3% -8.26% (p=0.000 n=10+10) name old speed new speed delta Buzhash2/1K-4 1.68GB/s ± 4% 1.60GB/s ±14% ~ (p=0.408 n=8+10) Buzhash2/1M-4 842MB/s ± 5% 908MB/s ± 3% +7.86% (p=0.000 n=10+10) Buzhash2/16M-4 875MB/s ± 2% 959MB/s ± 2% +9.57% (p=0.000 n=9+9) Buzhash2/100M-4 897MB/s ± 1% 977MB/s ± 3% +9.02% (p=0.000 n=10+10) name old alloc/op new alloc/op delta Buzhash2/1K-4 1.17kB ± 1% 1.17kB ± 0% -0.50% (p=0.006 n=10+10) Buzhash2/1M-4 1.08MB ± 1% 1.07MB ± 0% ~ (p=0.739 n=10+10) Buzhash2/16M-4 17.1MB ± 0% 17.1MB ± 0% ~ (p=0.579 n=10+10) Buzhash2/100M-4 106MB ± 0% 106MB ± 0% -0.01% (p=0.000 n=9+7) name old allocs/op new allocs/op delta Buzhash2/1K-4 3.00 ± 0% 3.00 ± 0% ~ (all equal) Buzhash2/1M-4 8.00 ± 0% 8.00 ± 0% ~ (all equal) Buzhash2/16M-4 72.0 ± 0% 72.0 ± 0% ~ (all equal) Buzhash2/100M-4 406 ± 0% 406 ± 0% ~ (all equal) ``` License: MIT Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-ipfs-chunker@79bdab24e1ecceaadf619ec33a56cadb9760e5c7 --- chunker/buzhash.go | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/chunker/buzhash.go b/chunker/buzhash.go index 54115d59b0..b3de95f127 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -61,17 +61,33 @@ func (b *Buzhash) NextBytes() ([]byte, error) { var state uint32 = 0 + if buzMin > len(b.buf) { + panic("this is impossible") + } + for ; i < buzMin; i++ { state = bits.RotateLeft32(state, 1) state = state ^ bytehash[b.buf[i]] } - if b.n+n > len(b.buf) { - panic("this is impossible, but gives +9 to performance") - } + { + max := b.n + n - 32 - 1 - for ; state&buzMask != 0 && i < b.n+n; i++ { - state = bits.RotateLeft32(state, 1) ^ bytehash[b.buf[i-32]] ^ bytehash[b.buf[i]] + buf := b.buf + bufshf := b.buf[32:] + i = buzMin - 32 + _ = buf[max] + _ = bufshf[max] + + for ; i <= max; i++ { + if state&buzMask == 0 { + break + } + state = bits.RotateLeft32(state, 1) ^ + bytehash[buf[i]] ^ + bytehash[bufshf[i]] + } + i += 32 } res := make([]byte, i) From f2c8939c6e04cbd55a468aeefae68d2a5e3c0305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 15 Sep 2019 14:14:42 +0200 Subject: [PATCH 2782/3147] pin: add context and error return to most of the Pinner functions This commit was moved from ipfs/go-ipfs-pinner@ba91b68a6557d9af4017b7b4eff089d4a155c36b --- pinning/pinner/gc/gc.go | 18 ++++++++++--- pinning/pinner/pin.go | 52 +++++++++++++++----------------------- pinning/pinner/pin_test.go | 8 +++--- 3 files changed, 40 insertions(+), 38 deletions(-) diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go index e03072770e..a8309aeac4 100644 --- a/pinning/pinner/gc/gc.go +++ b/pinning/pinner/gc/gc.go @@ -201,7 +201,11 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo } return links, nil } - err := Descendants(ctx, getLinks, gcs, pn.RecursiveKeys()) + rkeys, err := pn.RecursiveKeys(ctx) + if err != nil { + return nil, err + } + err = Descendants(ctx, getLinks, gcs, rkeys) if err != nil { errors = true select { @@ -233,11 +237,19 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo } } - for _, k := range pn.DirectKeys() { + dkeys, err := pn.DirectKeys(ctx) + if err != nil { + return nil, err + } + for _, k := range dkeys { gcs.Add(k) } - err = Descendants(ctx, getLinks, gcs, pn.InternalPins()) + ikeys, err := pn.InternalPins(ctx) + if err != nil { + return nil, err + } + err = Descendants(ctx, getLinks, gcs, ikeys) if err != nil { errors = true select { diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 63fa663c16..85a25c8ca7 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -105,11 +105,11 @@ func StringToMode(s string) (Mode, bool) { type Pinner interface { // IsPinned returns whether or not the given cid is pinned // and an explanation of why its pinned - IsPinned(cid.Cid) (string, bool, error) + IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) // IsPinnedWithType returns whether or not the given cid is pinned with the // given pin type, as well as returning the type of pin its pinned with. - IsPinnedWithType(cid.Cid, Mode) (string, bool, error) + IsPinnedWithType(ctx context.Context, c cid.Cid, mode Mode) (string, bool, error) // Pin the given node, optionally recursively. Pin(ctx context.Context, node ipld.Node, recursive bool) error @@ -125,7 +125,7 @@ type Pinner interface { // Check if a set of keys are pinned, more efficient than // calling IsPinned for each key - CheckIfPinned(cids ...cid.Cid) ([]Pinned, error) + CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]Pinned, error) // PinWithMode is for manually editing the pin structure. Use with // care! If used improperly, garbage collection may not be @@ -138,17 +138,17 @@ type Pinner interface { RemovePinWithMode(cid.Cid, Mode) // Flush writes the pin state to the backing datastore - Flush() error + Flush(ctx context.Context) error // DirectKeys returns all directly pinned cids - DirectKeys() []cid.Cid + DirectKeys(ctx context.Context) ([]cid.Cid, error) // DirectKeys returns all recursively pinned cids - RecursiveKeys() []cid.Cid + RecursiveKeys(ctx context.Context) ([]cid.Cid, error) // InternalPins returns all cids kept pinned for the internal state of the // pinner - InternalPins() []cid.Cid + InternalPins(ctx context.Context) ([]cid.Cid, error) } // Pinned represents CID which has been pinned with a pinning strategy. @@ -211,8 +211,6 @@ func NewPinner(dstore ds.Datastore, serv, internal ipld.DAGService) Pinner { // Pin the given node, optionally recursive func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { - p.lock.Lock() - defer p.lock.Unlock() err := p.dserv.Add(ctx, node) if err != nil { return err @@ -220,13 +218,16 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { c := node.Cid() + p.lock.Lock() + defer p.lock.Unlock() + if recurse { if p.recursePin.Has(c) { return nil } p.lock.Unlock() - // fetch entire graph + // temporary unlock to fetch the entire graph err := mdag.FetchGraph(ctx, c, p.dserv) p.lock.Lock() if err != nil { @@ -243,13 +244,6 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { p.recursePin.Add(c) } else { - p.lock.Unlock() - _, err := p.dserv.Get(ctx, c) - p.lock.Lock() - if err != nil { - return err - } - if p.recursePin.Has(c) { return fmt.Errorf("%s already pinned recursively", c.String()) } @@ -286,15 +280,13 @@ func (p *pinner) isInternalPin(c cid.Cid) bool { // IsPinned returns whether or not the given key is pinned // and an explanation of why its pinned -func (p *pinner) IsPinned(c cid.Cid) (string, bool, error) { - p.lock.RLock() - defer p.lock.RUnlock() +func (p *pinner) IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) { return p.isPinnedWithType(c, Any) } // IsPinnedWithType returns whether or not the given cid is pinned with the // given pin type, as well as returning the type of pin its pinned with. -func (p *pinner) IsPinnedWithType(c cid.Cid, mode Mode) (string, bool, error) { +func (p *pinner) IsPinnedWithType(ctx context.Context, c cid.Cid, mode Mode) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() return p.isPinnedWithType(c, mode) @@ -347,7 +339,7 @@ func (p *pinner) isPinnedWithType(c cid.Cid, mode Mode) (string, bool, error) { // CheckIfPinned Checks if a set of keys are pinned, more efficient than // calling IsPinned for each key, returns the pinned status of cid(s) -func (p *pinner) CheckIfPinned(cids ...cid.Cid) ([]Pinned, error) { +func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]Pinned, error) { p.lock.RLock() defer p.lock.RUnlock() pinned := make([]Pinned, 0, len(cids)) @@ -494,19 +486,19 @@ func LoadPinner(d ds.Datastore, dserv, internal ipld.DAGService) (Pinner, error) } // DirectKeys returns a slice containing the directly pinned keys -func (p *pinner) DirectKeys() []cid.Cid { +func (p *pinner) DirectKeys(ctx context.Context) ([]cid.Cid, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.directPin.Keys() + return p.directPin.Keys(), nil } // RecursiveKeys returns a slice containing the recursively pinned keys -func (p *pinner) RecursiveKeys() []cid.Cid { +func (p *pinner) RecursiveKeys(ctx context.Context) ([]cid.Cid, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.recursePin.Keys() + return p.recursePin.Keys(), nil } // Update updates a recursive pin from one cid to another @@ -541,12 +533,10 @@ func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error } // Flush encodes and writes pinner keysets to the datastore -func (p *pinner) Flush() error { +func (p *pinner) Flush(ctx context.Context) error { p.lock.Lock() defer p.lock.Unlock() - ctx := context.TODO() - internalset := cid.NewSet() recordInternal := internalset.Add @@ -594,12 +584,12 @@ func (p *pinner) Flush() error { // InternalPins returns all cids kept pinned for the internal state of the // pinner -func (p *pinner) InternalPins() []cid.Cid { +func (p *pinner) InternalPins(ctx context.Context) ([]cid.Cid, error) { p.lock.Lock() defer p.lock.Unlock() var out []cid.Cid out = append(out, p.internalPin.Keys()...) - return out + return out, nil } // PinWithMode allows the user to have fine grained control over pin diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/pin_test.go index 27e4c71dee..e477ac07fe 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/pin_test.go @@ -31,7 +31,7 @@ func randNode() (*mdag.ProtoNode, cid.Cid) { } func assertPinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { - _, pinned, err := p.IsPinned(c) + _, pinned, err := p.IsPinned(context.Background(), c) if err != nil { t.Fatal(err) } @@ -42,7 +42,7 @@ func assertPinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { } func assertUnpinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { - _, pinned, err := p.IsPinned(c) + _, pinned, err := p.IsPinned(context.Background(), c) if err != nil { t.Fatal(err) } @@ -146,7 +146,7 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - err = p.Flush() + err = p.Flush(ctx) if err != nil { t.Fatal(err) } @@ -327,7 +327,7 @@ func TestFlush(t *testing.T) { _, k := randNode() p.PinWithMode(k, Recursive) - if err := p.Flush(); err != nil { + if err := p.Flush(context.Background()); err != nil { t.Fatal(err) } assertPinned(t, p, k, "expected key to still be pinned") From 51832d4b35cb69388b14b12bd3b09d070ac2c841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Mon, 18 Nov 2019 18:26:20 +0100 Subject: [PATCH 2783/3147] pin: fix a too aggressive refactor and connect some contexts This commit was moved from ipfs/go-ipfs-pinner@56115933a32b02fa8896abaf77256956041f3900 --- pinning/pinner/pin.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 85a25c8ca7..15b2396b55 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -281,7 +281,9 @@ func (p *pinner) isInternalPin(c cid.Cid) bool { // IsPinned returns whether or not the given key is pinned // and an explanation of why its pinned func (p *pinner) IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) { - return p.isPinnedWithType(c, Any) + p.lock.RLock() + defer p.lock.RUnlock() + return p.isPinnedWithType(ctx, c, Any) } // IsPinnedWithType returns whether or not the given cid is pinned with the @@ -289,12 +291,12 @@ func (p *pinner) IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) func (p *pinner) IsPinnedWithType(ctx context.Context, c cid.Cid, mode Mode) (string, bool, error) { p.lock.RLock() defer p.lock.RUnlock() - return p.isPinnedWithType(c, mode) + return p.isPinnedWithType(ctx, c, mode) } // isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // intended for use by other pinned methods that already take locks -func (p *pinner) isPinnedWithType(c cid.Cid, mode Mode) (string, bool, error) { +func (p *pinner) isPinnedWithType(ctx context.Context, c cid.Cid, mode Mode) (string, bool, error) { switch mode { case Any, Direct, Indirect, Recursive, Internal: default: @@ -326,7 +328,7 @@ func (p *pinner) isPinnedWithType(c cid.Cid, mode Mode) (string, bool, error) { // Default is Indirect visitedSet := cid.NewSet() for _, rc := range p.recursePin.Keys() { - has, err := hasChild(p.dserv, rc, c, visitedSet.Visit) + has, err := hasChild(ctx, p.dserv, rc, c, visitedSet.Visit) if err != nil { return "", false, err } @@ -361,7 +363,7 @@ func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]Pinned, // Now walk all recursive pins to check for indirect pins var checkChildren func(cid.Cid, cid.Cid) error checkChildren = func(rk, parentKey cid.Cid) error { - links, err := ipld.GetLinks(context.TODO(), p.dserv, parentKey) + links, err := ipld.GetLinks(ctx, p.dserv, parentKey) if err != nil { return err } @@ -607,8 +609,8 @@ func (p *pinner) PinWithMode(c cid.Cid, mode Mode) { // hasChild recursively looks for a Cid among the children of a root Cid. // The visit function can be used to shortcut already-visited branches. -func hasChild(ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Cid) bool) (bool, error) { - links, err := ipld.GetLinks(context.TODO(), ng, root) +func hasChild(ctx context.Context, ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Cid) bool) (bool, error) { + links, err := ipld.GetLinks(ctx, ng, root) if err != nil { return false, err } @@ -618,7 +620,7 @@ func hasChild(ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Ci return true, nil } if visit(c) { - has, err := hasChild(ng, c, child, visit) + has, err := hasChild(ctx, ng, c, child, visit) if err != nil { return false, err } From bb3c51169b41c7ac2d3a6b3782531d806db98b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sun, 15 Sep 2019 14:14:42 +0200 Subject: [PATCH 2784/3147] pin: add context and error return to most of the Pinner functions This commit was moved from ipfs/go-namesys@52519e5f689478d70c3b3feb7acd25eeeb6ff0c0 --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index c06deb795a..17c4e1b3fc 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -298,7 +298,7 @@ func InitializeKeyspace(ctx context.Context, pub Publisher, pins pin.Pinner, key return err } - err = pins.Flush() + err = pins.Flush(ctx) if err != nil { return err } From 55e626aa3003307be0654d3a1ef421c50a07582b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Mon, 18 Nov 2019 19:42:51 +0100 Subject: [PATCH 2785/3147] remove the GC code This commit was moved from ipfs/go-ipfs-pinner@3aa7e5e6954c444965e88de4eb609ee1757694f3 --- pinning/pinner/gc/gc.go | 303 ---------------------------------------- 1 file changed, 303 deletions(-) delete mode 100644 pinning/pinner/gc/gc.go diff --git a/pinning/pinner/gc/gc.go b/pinning/pinner/gc/gc.go deleted file mode 100644 index a8309aeac4..0000000000 --- a/pinning/pinner/gc/gc.go +++ /dev/null @@ -1,303 +0,0 @@ -// Package gc provides garbage collection for go-ipfs. -package gc - -import ( - "context" - "errors" - "fmt" - "strings" - - bserv "github.com/ipfs/go-blockservice" - pin "github.com/ipfs/go-ipfs/pin" - dag "github.com/ipfs/go-merkledag" - - cid "github.com/ipfs/go-cid" - dstore "github.com/ipfs/go-datastore" - bstore "github.com/ipfs/go-ipfs-blockstore" - offline "github.com/ipfs/go-ipfs-exchange-offline" - ipld "github.com/ipfs/go-ipld-format" - logging "github.com/ipfs/go-log" - "github.com/ipfs/go-verifcid" -) - -var log = logging.Logger("gc") - -// Result represents an incremental output from a garbage collection -// run. It contains either an error, or the cid of a removed object. -type Result struct { - KeyRemoved cid.Cid - Error error -} - -// GC performs a mark and sweep garbage collection of the blocks in the blockstore -// first, it creates a 'marked' set and adds to it the following: -// - all recursively pinned blocks, plus all of their descendants (recursively) -// - bestEffortRoots, plus all of its descendants (recursively) -// - all directly pinned blocks -// - all blocks utilized internally by the pinner -// -// The routine then iterates over every block in the blockstore and -// deletes any block that is not found in the marked set. -func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []cid.Cid) <-chan Result { - ctx, cancel := context.WithCancel(ctx) - - elock := log.EventBegin(ctx, "GC.lockWait") - unlocker := bs.GCLock() - elock.Done() - elock = log.EventBegin(ctx, "GC.locked") - emark := log.EventBegin(ctx, "GC.mark") - - bsrv := bserv.New(bs, offline.Exchange(bs)) - ds := dag.NewDAGService(bsrv) - - output := make(chan Result, 128) - - go func() { - defer cancel() - defer close(output) - defer unlocker.Unlock() - defer elock.Done() - - gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots, output) - if err != nil { - select { - case output <- Result{Error: err}: - case <-ctx.Done(): - } - return - } - emark.Append(logging.LoggableMap{ - "blackSetSize": fmt.Sprintf("%d", gcs.Len()), - }) - emark.Done() - esweep := log.EventBegin(ctx, "GC.sweep") - - keychan, err := bs.AllKeysChan(ctx) - if err != nil { - select { - case output <- Result{Error: err}: - case <-ctx.Done(): - } - return - } - - errors := false - var removed uint64 - - loop: - for ctx.Err() == nil { // select may not notice that we're "done". - select { - case k, ok := <-keychan: - if !ok { - break loop - } - if !gcs.Has(k) { - err := bs.DeleteBlock(k) - removed++ - if err != nil { - errors = true - select { - case output <- Result{Error: &CannotDeleteBlockError{k, err}}: - case <-ctx.Done(): - break loop - } - // continue as error is non-fatal - continue loop - } - select { - case output <- Result{KeyRemoved: k}: - case <-ctx.Done(): - break loop - } - } - case <-ctx.Done(): - break loop - } - } - esweep.Append(logging.LoggableMap{ - "whiteSetSize": fmt.Sprintf("%d", removed), - }) - esweep.Done() - if errors { - select { - case output <- Result{Error: ErrCannotDeleteSomeBlocks}: - case <-ctx.Done(): - return - } - } - - defer log.EventBegin(ctx, "GC.datastore").Done() - gds, ok := dstor.(dstore.GCDatastore) - if !ok { - return - } - - err = gds.CollectGarbage() - if err != nil { - select { - case output <- Result{Error: err}: - case <-ctx.Done(): - } - return - } - }() - - return output -} - -// Descendants recursively finds all the descendants of the given roots and -// adds them to the given cid.Set, using the provided dag.GetLinks function -// to walk the tree. -func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []cid.Cid) error { - verifyGetLinks := func(ctx context.Context, c cid.Cid) ([]*ipld.Link, error) { - err := verifcid.ValidateCid(c) - if err != nil { - return nil, err - } - - return getLinks(ctx, c) - } - - verboseCidError := func(err error) error { - if strings.Contains(err.Error(), verifcid.ErrBelowMinimumHashLength.Error()) || - strings.Contains(err.Error(), verifcid.ErrPossiblyInsecureHashFunction.Error()) { - err = fmt.Errorf("\"%s\"\nPlease run 'ipfs pin verify'"+ - " to list insecure hashes. If you want to read them,"+ - " please downgrade your go-ipfs to 0.4.13\n", err) - log.Error(err) - } - return err - } - - for _, c := range roots { - // Walk recursively walks the dag and adds the keys to the given set - err := dag.Walk(ctx, verifyGetLinks, c, set.Visit, dag.Concurrent()) - - if err != nil { - err = verboseCidError(err) - return err - } - } - - return nil -} - -// ColoredSet computes the set of nodes in the graph that are pinned by the -// pins in the given pinner. -func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffortRoots []cid.Cid, output chan<- Result) (*cid.Set, error) { - // KeySet currently implemented in memory, in the future, may be bloom filter or - // disk backed to conserve memory. - errors := false - gcs := cid.NewSet() - getLinks := func(ctx context.Context, cid cid.Cid) ([]*ipld.Link, error) { - links, err := ipld.GetLinks(ctx, ng, cid) - if err != nil { - errors = true - select { - case output <- Result{Error: &CannotFetchLinksError{cid, err}}: - case <-ctx.Done(): - return nil, ctx.Err() - } - } - return links, nil - } - rkeys, err := pn.RecursiveKeys(ctx) - if err != nil { - return nil, err - } - err = Descendants(ctx, getLinks, gcs, rkeys) - if err != nil { - errors = true - select { - case output <- Result{Error: err}: - case <-ctx.Done(): - return nil, ctx.Err() - } - } - - bestEffortGetLinks := func(ctx context.Context, cid cid.Cid) ([]*ipld.Link, error) { - links, err := ipld.GetLinks(ctx, ng, cid) - if err != nil && err != ipld.ErrNotFound { - errors = true - select { - case output <- Result{Error: &CannotFetchLinksError{cid, err}}: - case <-ctx.Done(): - return nil, ctx.Err() - } - } - return links, nil - } - err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) - if err != nil { - errors = true - select { - case output <- Result{Error: err}: - case <-ctx.Done(): - return nil, ctx.Err() - } - } - - dkeys, err := pn.DirectKeys(ctx) - if err != nil { - return nil, err - } - for _, k := range dkeys { - gcs.Add(k) - } - - ikeys, err := pn.InternalPins(ctx) - if err != nil { - return nil, err - } - err = Descendants(ctx, getLinks, gcs, ikeys) - if err != nil { - errors = true - select { - case output <- Result{Error: err}: - case <-ctx.Done(): - return nil, ctx.Err() - } - } - - if errors { - return nil, ErrCannotFetchAllLinks - } - - return gcs, nil -} - -// ErrCannotFetchAllLinks is returned as the last Result in the GC output -// channel when there was a error creating the marked set because of a -// problem when finding descendants. -var ErrCannotFetchAllLinks = errors.New("garbage collection aborted: could not retrieve some links") - -// ErrCannotDeleteSomeBlocks is returned when removing blocks marked for -// deletion fails as the last Result in GC output channel. -var ErrCannotDeleteSomeBlocks = errors.New("garbage collection incomplete: could not delete some blocks") - -// CannotFetchLinksError provides detailed information about which links -// could not be fetched and can appear as a Result in the GC output channel. -type CannotFetchLinksError struct { - Key cid.Cid - Err error -} - -// Error implements the error interface for this type with a useful -// message. -func (e *CannotFetchLinksError) Error() string { - return fmt.Sprintf("could not retrieve links for %s: %s", e.Key, e.Err) -} - -// CannotDeleteBlockError provides detailed information about which -// blocks could not be deleted and can appear as a Result in the GC output -// channel. -type CannotDeleteBlockError struct { - Key cid.Cid - Err error -} - -// Error implements the error interface for this type with a -// useful message. -func (e *CannotDeleteBlockError) Error() string { - return fmt.Sprintf("could not remove %s: %s", e.Key, e.Err) -} From 6511e93bd9af73a859258c48821f76a63e444d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Tue, 19 Nov 2019 14:27:30 +0100 Subject: [PATCH 2786/3147] extraction from go-ipfs This commit was moved from ipfs/go-ipfs-pinner@0ee3f875037cbe987f6c812efd6f05c57fcdbdd3 --- pinning/pinner/LICENSE-APACHE | 13 ++++++++++++ pinning/pinner/LICENSE-MIT | 19 ++++++++++++++++++ pinning/pinner/README.md | 37 +++++++++++++++++++++++++++++++++++ pinning/pinner/pin.go | 5 ++--- pinning/pinner/set.go | 6 +++--- pinning/pinner/set_test.go | 3 +-- 6 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 pinning/pinner/LICENSE-APACHE create mode 100644 pinning/pinner/LICENSE-MIT create mode 100644 pinning/pinner/README.md diff --git a/pinning/pinner/LICENSE-APACHE b/pinning/pinner/LICENSE-APACHE new file mode 100644 index 0000000000..546514363d --- /dev/null +++ b/pinning/pinner/LICENSE-APACHE @@ -0,0 +1,13 @@ +Copyright 2019. Protocol Labs, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/pinning/pinner/LICENSE-MIT b/pinning/pinner/LICENSE-MIT new file mode 100644 index 0000000000..ea532a8305 --- /dev/null +++ b/pinning/pinner/LICENSE-MIT @@ -0,0 +1,19 @@ +Copyright 2019. Protocol Labs, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pinning/pinner/README.md b/pinning/pinner/README.md new file mode 100644 index 0000000000..e2f7331711 --- /dev/null +++ b/pinning/pinner/README.md @@ -0,0 +1,37 @@ +# go-ipfs-pinner + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![Coverage Status](https://codecov.io/gh/ipfs/go-ipfs-pinner/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-ipfs-pinner) +[![Travis CI](https://travis-ci.org/ipfs/go-ipfs-pinner.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-pinner) + +## Background + +The pinner system is responsible for keeping track of which objects a user wants to keep stored locally + +## Install + +Via `go get`: + +```sh +$ go get github.com/ipfs/go-ipfs-pinner +``` + +> Requires Go 1.13 + +## Documentation + +https://godoc.org/github.com/ipfs/go-ipfs-pinner + +## Contribute + +PRs are welcome! + +Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +This library is dual-licensed under Apache 2.0 and MIT terms. + +Copyright 2019. Protocol Labs, Inc. diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 15b2396b55..7902478cb3 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -9,13 +9,12 @@ import ( "sync" "time" - "github.com/ipfs/go-ipfs/dagutils" - mdag "github.com/ipfs/go-merkledag" - cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-ipfs/dagutils" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + mdag "github.com/ipfs/go-merkledag" ) var log = logging.Logger("pin") diff --git a/pinning/pinner/set.go b/pinning/pinner/set.go index b050c31c43..ca437974ff 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/set.go @@ -9,12 +9,12 @@ import ( "hash/fnv" "sort" - "github.com/ipfs/go-ipfs/pin/internal/pb" - "github.com/ipfs/go-merkledag" - "github.com/gogo/protobuf/proto" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-merkledag" + + "github.com/ipfs/go-ipfs-pinner/internal/pb" ) const ( diff --git a/pinning/pinner/set_test.go b/pinning/pinner/set_test.go index d9a573c5fa..61a3118b26 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/set_test.go @@ -6,13 +6,12 @@ import ( "testing" bserv "github.com/ipfs/go-blockservice" - dag "github.com/ipfs/go-merkledag" - cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dsq "github.com/ipfs/go-datastore/query" blockstore "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" + dag "github.com/ipfs/go-merkledag" ) func ignoreCids(_ cid.Cid) {} From 1eb5fce5cf5ff2a4e528906149ca1ea02232bf3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Tue, 19 Nov 2019 17:32:51 +0100 Subject: [PATCH 2787/3147] use dagutils migrated in go-merkledag This commit was moved from ipfs/go-ipfs-pinner@fd593c1d435fcce987d3f1ad39454e0120e46f76 --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 7902478cb3..655e59add9 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -11,10 +11,10 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" - "github.com/ipfs/go-ipfs/dagutils" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" mdag "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-merkledag/dagutils" ) var log = logging.Logger("pin") From 6eb5c9791b91da125d269d84b201d0acc8e7657a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 27 Nov 2019 21:40:22 +0100 Subject: [PATCH 2788/3147] feat: make the CoreAPI expose a streaming pin interface This commit was moved from ipfs/interface-go-ipfs-core@f976af7ba62d0209b53aeef72fb102c4387d3f00 --- coreiface/pin.go | 5 ++++- coreiface/tests/block.go | 2 +- coreiface/tests/pin.go | 39 ++++++++++++++++++++++++++++----------- coreiface/tests/unixfs.go | 2 +- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/coreiface/pin.go b/coreiface/pin.go index 7df2956f02..27f9355d39 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -14,6 +14,9 @@ type Pin interface { // Type of the pin Type() string + + // if not nil, an error happened. Everything else should be ignored. + Err() error } // PinStatus holds information about pin health @@ -41,7 +44,7 @@ type PinAPI interface { Add(context.Context, path.Path, ...options.PinAddOption) error // Ls returns list of pinned objects on this node - Ls(context.Context, ...options.PinLsOption) ([]Pin, error) + Ls(context.Context, ...options.PinLsOption) (<-chan Pin, error) // Rm removes pin for object specified by the path Rm(context.Context, path.Path, ...options.PinRmOption) error diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 6b648f3946..2048dd4c26 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -225,7 +225,7 @@ func (tp *TestSuite) TestBlockPin(t *testing.T) { t.Fatal(err) } - pins, err := api.Pin().Ls(ctx) + pins, err := accPins(api.Pin().Ls(ctx)) if err != nil { return } diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 7e574fa0df..a968490d33 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -67,7 +67,7 @@ func (tp *TestSuite) TestPinSimple(t *testing.T) { t.Fatal(err) } - list, err := api.Pin().Ls(ctx) + list, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -89,7 +89,7 @@ func (tp *TestSuite) TestPinSimple(t *testing.T) { t.Fatal(err) } - list, err = api.Pin().Ls(ctx) + list, err = accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -141,7 +141,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Fatal(err) } - list, err := api.Pin().Ls(ctx) + list, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -150,7 +150,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Direct()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Direct())) if err != nil { t.Fatal(err) } @@ -163,7 +163,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpfsPath(nd2.Cid()).String()) } - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Recursive())) if err != nil { t.Fatal(err) } @@ -176,7 +176,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpldPath(nd3.Cid()).String()) } - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Indirect())) if err != nil { t.Fatal(err) } @@ -390,21 +390,21 @@ func getThreeChainedNodes(t *testing.T, ctx context.Context, api iface.CoreAPI, func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI, recusive, direct, indirect []cidContainer) { assertPinLsAllConsistency(t, ctx, api) - list, err := api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) + list, err := accPins(api.Pin().Ls(ctx, opt.Pin.Type.Recursive())) if err != nil { t.Fatal(err) } assertPinCids(t, list, recusive...) - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Direct()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Direct())) if err != nil { t.Fatal(err) } assertPinCids(t, list, direct...) - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Indirect())) if err != nil { t.Fatal(err) } @@ -454,7 +454,7 @@ func assertPinCids(t *testing.T, pins []iface.Pin, cids ...cidContainer) { // assertPinLsAllConsistency verifies that listing all pins gives the same result as listing the pin types individually func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.CoreAPI) { t.Helper() - allPins, err := api.Pin().Ls(ctx) + allPins, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -485,7 +485,7 @@ func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.Core } for typeStr, pinProps := range typeMap { - pins, err := api.Pin().Ls(ctx, pinProps.PinLsOption) + pins, err := accPins(api.Pin().Ls(ctx, pinProps.PinLsOption)) if err != nil { t.Fatal(err) } @@ -505,3 +505,20 @@ func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.Core } } } + +func accPins(pins <-chan iface.Pin, err error) ([]iface.Pin, error) { + if err != nil { + return nil, err + } + + var result []iface.Pin + + for pin := range pins { + if pin.Err() != nil { + return nil, pin.Err() + } + result = append(result, pin) + } + + return result, nil +} diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index aac7fa92fb..1ed80e8733 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -542,7 +542,7 @@ func (tp *TestSuite) TestAddPinned(t *testing.T) { t.Fatal(err) } - pins, err := api.Pin().Ls(ctx) + pins, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } From 689e92b560ca2404db9edd1e8b65cd1a5e929881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Fri, 29 Nov 2019 22:21:29 +0100 Subject: [PATCH 2789/3147] fix some tests This commit was moved from ipfs/interface-go-ipfs-core@48dcedecd468c06e3321b4217b51f67180d07eec --- coreiface/tests/block.go | 2 +- coreiface/tests/pin.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 2048dd4c26..51c099bd08 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -227,7 +227,7 @@ func (tp *TestSuite) TestBlockPin(t *testing.T) { pins, err := accPins(api.Pin().Ls(ctx)) if err != nil { - return + t.Skip(err) } if len(pins) != 1 { t.Fatal("expected 1 pin") diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index a968490d33..58e8120842 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -160,7 +160,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { } if list[0].Path().String() != path.IpldPath(nd3.Cid()).String() { - t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpfsPath(nd2.Cid()).String()) + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpfsPath(nd3.Cid()).String()) } list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Recursive())) @@ -173,7 +173,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { } if list[0].Path().String() != path.IpldPath(nd2.Cid()).String() { - t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpldPath(nd3.Cid()).String()) + t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpldPath(nd2.Cid()).String()) } list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Indirect())) @@ -186,7 +186,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { } if list[0].Path().Cid().String() != p0.Cid().String() { - t.Error("unexpected path") + t.Errorf("unexpected path, %s != %s", list[0].Path().Cid().String(), p0.Cid().String()) } res, err := api.Pin().Verify(ctx) From b1c5044d1541aa39ed8e6fff8f47c71bf012a7eb Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 2 Dec 2019 15:04:28 -0500 Subject: [PATCH 2790/3147] fix(tests): put valid blocks This commit was moved from ipfs/interface-go-ipfs-core@16127b291793c593b78fb2909bbaf106612ffc30 --- coreiface/tests/block.go | 52 ++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 51c099bd08..09a36b5fe9 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -1,18 +1,34 @@ package tests import ( + "bytes" "context" - "github.com/ipfs/interface-go-ipfs-core/path" + "io" "io/ioutil" "strings" "testing" coreiface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/path" mh "github.com/multiformats/go-multihash" ) +var ( + pbCid = "QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN" + cborCid = "bafyreicnga62zhxnmnlt6ymq5hcbsg7gdhqdu6z4ehu3wpjhvqnflfy6nm" + cborKCid = "bafyr2qgsohbwdlk7ajmmbb4lhoytmest4wdbe5xnexfvtxeatuyqqmwv3fgxp3pmhpc27gwey2cct56gloqefoqwcf3yqiqzsaqb7p4jefhcw" +) + +func pbBlock() io.Reader { + return bytes.NewReader([]byte{10, 12, 8, 2, 18, 6, 104, 101, 108, 108, 111, 10, 24, 6}) +} + +func cborBlock() io.Reader { + return bytes.NewReader([]byte{101, 72, 101, 108, 108, 111}) +} + func (tp *TestSuite) TestBlock(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Block() == nil { @@ -38,12 +54,12 @@ func (tp *TestSuite) TestBlockPut(t *testing.T) { t.Fatal(err) } - res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) + res, err := api.Block().Put(ctx, pbBlock()) if err != nil { t.Fatal(err) } - if res.Path().Cid().String() != "QmPyo15ynbVrSTVdJL9th7JysHaAbXt9dM9tXk1bMHbRtk" { + if res.Path().Cid().String() != pbCid { t.Errorf("got wrong cid: %s", res.Path().Cid().String()) } } @@ -56,12 +72,12 @@ func (tp *TestSuite) TestBlockPutFormat(t *testing.T) { t.Fatal(err) } - res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("cbor")) + res, err := api.Block().Put(ctx, cborBlock(), opt.Block.Format("cbor")) if err != nil { t.Fatal(err) } - if res.Path().Cid().String() != "bafyreiayl6g3gitr7ys7kyng7sjywlrgimdoymco3jiyab6rozecmoazne" { + if res.Path().Cid().String() != cborCid { t.Errorf("got wrong cid: %s", res.Path().Cid().String()) } } @@ -74,12 +90,17 @@ func (tp *TestSuite) TestBlockPutHash(t *testing.T) { t.Fatal(err) } - res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Hash(mh.KECCAK_512, -1)) + res, err := api.Block().Put( + ctx, + cborBlock(), + opt.Block.Hash(mh.KECCAK_512, -1), + opt.Block.Format("cbor"), + ) if err != nil { t.Fatal(err) } - if res.Path().Cid().String() != "bafyb2qgdh7w6dcq24u65xbtdoehyavegnpvxcqce7ttvs6ielgmwdfxrahmu37d33atik57x5y6s7d7qz32aasuwgirh3ocn6ywswqdifvu6e" { + if res.Path().Cid().String() != cborKCid { t.Errorf("got wrong cid: %s", res.Path().Cid().String()) } } @@ -92,7 +113,7 @@ func (tp *TestSuite) TestBlockGet(t *testing.T) { t.Fatal(err) } - res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Hash(mh.KECCAK_512, -1)) + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("raw")) if err != nil { t.Fatal(err) } @@ -130,7 +151,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) { t.Fatal(err) } - res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("raw")) if err != nil { t.Fatal(err) } @@ -184,7 +205,7 @@ func (tp *TestSuite) TestBlockStat(t *testing.T) { t.Fatal(err) } - res, err := api.Block().Put(ctx, strings.NewReader(`Hello`)) + res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("raw")) if err != nil { t.Fatal(err) } @@ -211,7 +232,7 @@ func (tp *TestSuite) TestBlockPin(t *testing.T) { t.Fatal(err) } - _, err = api.Block().Put(ctx, strings.NewReader(`Hello`)) + _, err = api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Format("raw")) if err != nil { t.Fatal(err) } @@ -220,14 +241,19 @@ func (tp *TestSuite) TestBlockPin(t *testing.T) { t.Fatal("expected 0 pins") } - res, err := api.Block().Put(ctx, strings.NewReader(`Hello`), opt.Block.Pin(true)) + res, err := api.Block().Put( + ctx, + strings.NewReader(`Hello`), + opt.Block.Pin(true), + opt.Block.Format("raw"), + ) if err != nil { t.Fatal(err) } pins, err := accPins(api.Pin().Ls(ctx)) if err != nil { - t.Skip(err) + t.Fatal(err) } if len(pins) != 1 { t.Fatal("expected 1 pin") From b14ab41d5fff90465ef7c5a2217800f557a22e22 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 2 Dec 2019 15:39:35 -0500 Subject: [PATCH 2791/3147] chore(pb): regenerate protobufs and add a makefile This commit was moved from ipfs/go-ipfs-pinner@05f55f1b4385e71df19b7d545bd685ed27af58bd --- pinning/pinner/internal/pb/Makefile | 11 +++ pinning/pinner/internal/pb/header.pb.go | 120 ++++++++++-------------- 2 files changed, 58 insertions(+), 73 deletions(-) create mode 100644 pinning/pinner/internal/pb/Makefile diff --git a/pinning/pinner/internal/pb/Makefile b/pinning/pinner/internal/pb/Makefile new file mode 100644 index 0000000000..df34e54b01 --- /dev/null +++ b/pinning/pinner/internal/pb/Makefile @@ -0,0 +1,11 @@ +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --proto_path=$(GOPATH)/src:. --gogofaster_out=. $< + +clean: + rm -f *.pb.go + rm -f *.go diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go index 71196b2631..b8b3b0e7dd 100644 --- a/pinning/pinner/internal/pb/header.pb.go +++ b/pinning/pinner/internal/pb/header.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: pin/internal/pb/header.proto +// source: header.proto package pb @@ -9,6 +9,7 @@ import ( proto "github.com/gogo/protobuf/proto" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -20,7 +21,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Set struct { // 1 for now, library will refuse to handle entries with an unrecognized version. @@ -35,7 +36,7 @@ func (m *Set) Reset() { *m = Set{} } func (m *Set) String() string { return proto.CompactTextString(m) } func (*Set) ProtoMessage() {} func (*Set) Descriptor() ([]byte, []int) { - return fileDescriptor_cda303a5a3ed87e7, []int{0} + return fileDescriptor_6398613e36d6c2ce, []int{0} } func (m *Set) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -45,7 +46,7 @@ func (m *Set) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Set.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -89,12 +90,11 @@ func init() { proto.RegisterType((*Set)(nil), "ipfs.pin.Set") } -func init() { proto.RegisterFile("pin/internal/pb/header.proto", fileDescriptor_cda303a5a3ed87e7) } +func init() { proto.RegisterFile("header.proto", fileDescriptor_6398613e36d6c2ce) } -var fileDescriptor_cda303a5a3ed87e7 = []byte{ - // 162 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x29, 0xc8, 0xcc, 0xd3, - 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0xca, 0x4b, 0xcc, 0xd1, 0x2f, 0x48, 0xd2, 0xcf, 0x48, 0x4d, 0x4c, +var fileDescriptor_6398613e36d6c2ce = []byte{ + // 146 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xc9, 0x48, 0x4d, 0x4c, 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xc8, 0x2c, 0x48, 0x2b, 0xd6, 0x2b, 0xc8, 0xcc, 0x53, 0x8a, 0xe5, 0x62, 0x0e, 0x4e, 0x2d, 0x11, 0x92, 0xe3, 0x62, 0x2f, 0x4b, 0x2d, 0x2a, 0xce, 0xcc, 0xcf, 0x93, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x75, 0x62, 0x39, 0x71, 0x4f, 0x9e, @@ -102,14 +102,14 @@ var fileDescriptor_cda303a5a3ed87e7 = []byte{ 0x24, 0x0d, 0x15, 0x13, 0x92, 0xe0, 0x62, 0x29, 0x4e, 0x4d, 0x4d, 0x91, 0x60, 0x56, 0x60, 0xd4, 0x60, 0x87, 0xca, 0x81, 0x45, 0x9c, 0x64, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, - 0x21, 0x8a, 0xa9, 0x20, 0x09, 0x10, 0x00, 0x00, 0xff, 0xff, 0x20, 0x85, 0x2f, 0x24, 0xa5, 0x00, + 0x21, 0x8a, 0xa9, 0x20, 0x09, 0x10, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x49, 0x19, 0x51, 0x95, 0x00, 0x00, 0x00, } func (m *Set) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -117,31 +117,38 @@ func (m *Set) Marshal() (dAtA []byte, err error) { } func (m *Set) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Set) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - dAtA[i] = 0x8 - i++ - i = encodeVarintHeader(dAtA, i, uint64(m.Version)) - dAtA[i] = 0x10 - i++ - i = encodeVarintHeader(dAtA, i, uint64(m.Fanout)) - dAtA[i] = 0x1d - i++ + i -= 4 encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(m.Seed)) - i += 4 - return i, nil + i-- + dAtA[i] = 0x1d + i = encodeVarintHeader(dAtA, i, uint64(m.Fanout)) + i-- + dAtA[i] = 0x10 + i = encodeVarintHeader(dAtA, i, uint64(m.Version)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil } func encodeVarintHeader(dAtA []byte, offset int, v uint64) int { + offset -= sovHeader(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Set) Size() (n int) { if m == nil { @@ -156,14 +163,7 @@ func (m *Set) Size() (n int) { } func sovHeader(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozHeader(x uint64) (n int) { return sovHeader(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -272,6 +272,7 @@ func (m *Set) Unmarshal(dAtA []byte) error { func skipHeader(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -303,10 +304,8 @@ func skipHeader(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -327,55 +326,30 @@ func skipHeader(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthHeader } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthHeader - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowHeader - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipHeader(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthHeader - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupHeader + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthHeader + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthHeader = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowHeader = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthHeader = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowHeader = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupHeader = fmt.Errorf("proto: unexpected end of group") ) From a9cd86b7d8e9eac5b4e8bc5715f7a5fcc63d3301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 20 Nov 2019 16:38:09 +0100 Subject: [PATCH 2792/3147] extract the pinner to go-ipfs-pinner and dagutils into go-merkledag This commit was moved from ipfs/go-namesys@4801adee17192fe145c8d94bb154c6f69a1c83f2 --- namesys/publisher.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 17c4e1b3fc..f5e335cd31 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,11 +6,10 @@ import ( "sync" "time" - pin "github.com/ipfs/go-ipfs/pin" - proto "github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-datastore" dsquery "github.com/ipfs/go-datastore/query" + pin "github.com/ipfs/go-ipfs-pinner" ipns "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" From bab395bfb607b3db9e755e0ba0be10dfabe9e118 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 2 Dec 2019 20:59:21 -0500 Subject: [PATCH 2793/3147] chore(dep): update libp2p & protobuf and regenerate protobufs This commit was moved from ipfs/go-ipns@e8c47138fb4e02422e243e79e68c92579c44e157 --- ipns/examples/embed.go | 2 +- ipns/examples/examples_test.go | 6 +- ipns/examples/key.go | 2 +- ipns/ipns.go | 4 +- ipns/ipns_test.go | 6 +- ipns/pb/ipns.pb.go | 160 +++++++++++++++------------------ ipns/record.go | 6 +- ipns/select_test.go | 4 +- ipns/validate_test.go | 8 +- 9 files changed, 88 insertions(+), 110 deletions(-) diff --git a/ipns/examples/embed.go b/ipns/examples/embed.go index ffc635eafc..78ca4595a4 100644 --- a/ipns/examples/embed.go +++ b/ipns/examples/embed.go @@ -6,7 +6,7 @@ import ( pb "github.com/ipfs/go-ipns/pb" ipns "github.com/ipfs/go-ipns" - crypto "github.com/libp2p/go-libp2p-crypto" + crypto "github.com/libp2p/go-libp2p-core/crypto" ) // CreateEntryWithEmbed shows how you can create an IPNS entry diff --git a/ipns/examples/examples_test.go b/ipns/examples/examples_test.go index af765f9f97..caa21e34cc 100644 --- a/ipns/examples/examples_test.go +++ b/ipns/examples/examples_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/ipfs/go-ipns/examples" - crypto "github.com/libp2p/go-libp2p-crypto" + crypto "github.com/libp2p/go-libp2p-core/crypto" ) var testPath = "/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5" @@ -43,9 +43,7 @@ func TestEmbeddedEntryCreation(t *testing.T) { } func generateRSAKey() (crypto.PrivKey, error) { - // DO NOT USE 1024 BITS IN PRODUCTION - // THIS IS ONLY FOR TESTING PURPOSES - k, err := examples.GenerateRSAKeyPair(1024) + k, err := examples.GenerateRSAKeyPair(2048) if err != nil { return nil, err } diff --git a/ipns/examples/key.go b/ipns/examples/key.go index 408e3da80b..6354521eea 100644 --- a/ipns/examples/key.go +++ b/ipns/examples/key.go @@ -1,7 +1,7 @@ package examples import ( - crypto "github.com/libp2p/go-libp2p-crypto" + crypto "github.com/libp2p/go-libp2p-core/crypto" ) // GenerateRSAKeyPair is used to generate an RSA key pair diff --git a/ipns/ipns.go b/ipns/ipns.go index f145333b1c..32a6104a71 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -8,8 +8,8 @@ import ( pb "github.com/ipfs/go-ipns/pb" u "github.com/ipfs/go-ipfs-util" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ic "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" ) // Create creates a new IPNS entry and signs it with the given private key. diff --git a/ipns/ipns_test.go b/ipns/ipns_test.go index 0f2e30d794..84a4b1d804 100644 --- a/ipns/ipns_test.go +++ b/ipns/ipns_test.go @@ -6,14 +6,14 @@ import ( "time" u "github.com/ipfs/go-ipfs-util" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" ) func TestEmbedPublicKey(t *testing.T) { sr := u.NewTimeSeededRand() - priv, pub, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, sr) + priv, pub, err := ci.GenerateKeyPairWithReader(ci.RSA, 2048, sr) if err != nil { t.Fatal(err) } diff --git a/ipns/pb/ipns.pb.go b/ipns/pb/ipns.pb.go index b38ce4ea93..6354831d08 100644 --- a/ipns/pb/ipns.pb.go +++ b/ipns/pb/ipns.pb.go @@ -9,6 +9,7 @@ import ( proto "github.com/gogo/protobuf/proto" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -20,7 +21,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type IpnsEntry_ValidityType int32 @@ -91,7 +92,7 @@ func (m *IpnsEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_IpnsEntry.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -187,7 +188,7 @@ var fileDescriptor_4d5b16fb32bfe8ea = []byte{ func (m *IpnsEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -195,67 +196,79 @@ func (m *IpnsEntry) Marshal() (dAtA []byte, err error) { } func (m *IpnsEntry) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IpnsEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Value == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") - } else { - dAtA[i] = 0xa - i++ - i = encodeVarintIpns(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) - } - if m.Signature == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") - } else { - dAtA[i] = 0x12 - i++ - i = encodeVarintIpns(dAtA, i, uint64(len(m.Signature))) - i += copy(dAtA[i:], m.Signature) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.ValidityType != nil { - dAtA[i] = 0x18 - i++ - i = encodeVarintIpns(dAtA, i, uint64(*m.ValidityType)) + if m.PubKey != nil { + i -= len(m.PubKey) + copy(dAtA[i:], m.PubKey) + i = encodeVarintIpns(dAtA, i, uint64(len(m.PubKey))) + i-- + dAtA[i] = 0x3a } - if m.Validity != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintIpns(dAtA, i, uint64(len(m.Validity))) - i += copy(dAtA[i:], m.Validity) + if m.Ttl != nil { + i = encodeVarintIpns(dAtA, i, uint64(*m.Ttl)) + i-- + dAtA[i] = 0x30 } if m.Sequence != nil { - dAtA[i] = 0x28 - i++ i = encodeVarintIpns(dAtA, i, uint64(*m.Sequence)) + i-- + dAtA[i] = 0x28 } - if m.Ttl != nil { - dAtA[i] = 0x30 - i++ - i = encodeVarintIpns(dAtA, i, uint64(*m.Ttl)) + if m.Validity != nil { + i -= len(m.Validity) + copy(dAtA[i:], m.Validity) + i = encodeVarintIpns(dAtA, i, uint64(len(m.Validity))) + i-- + dAtA[i] = 0x22 } - if m.PubKey != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintIpns(dAtA, i, uint64(len(m.PubKey))) - i += copy(dAtA[i:], m.PubKey) + if m.ValidityType != nil { + i = encodeVarintIpns(dAtA, i, uint64(*m.ValidityType)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Signature == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") + } else { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintIpns(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 } - return i, nil + if m.Value == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } else { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintIpns(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func encodeVarintIpns(dAtA []byte, offset int, v uint64) int { + offset -= sovIpns(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *IpnsEntry) Size() (n int) { if m == nil { @@ -295,14 +308,7 @@ func (m *IpnsEntry) Size() (n int) { } func sovIpns(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozIpns(x uint64) (n int) { return sovIpns(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -569,6 +575,7 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { func skipIpns(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -600,10 +607,8 @@ func skipIpns(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -627,52 +632,27 @@ func skipIpns(dAtA []byte) (n int, err error) { if iNdEx < 0 { return 0, ErrInvalidLengthIpns } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowIpns - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipIpns(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthIpns - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupIpns + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthIpns = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowIpns = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthIpns = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowIpns = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupIpns = fmt.Errorf("proto: unexpected end of group") ) diff --git a/ipns/record.go b/ipns/record.go index eb60ce6f82..cd2ec3cdd3 100644 --- a/ipns/record.go +++ b/ipns/record.go @@ -8,9 +8,9 @@ import ( proto "github.com/gogo/protobuf/proto" logging "github.com/ipfs/go-log" - ic "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + ic "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + pstore "github.com/libp2p/go-libp2p-core/peerstore" record "github.com/libp2p/go-libp2p-record" ) diff --git a/ipns/select_test.go b/ipns/select_test.go index a9a34a91db..35fc3f618a 100644 --- a/ipns/select_test.go +++ b/ipns/select_test.go @@ -10,7 +10,7 @@ import ( proto "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" - ci "github.com/libp2p/go-libp2p-crypto" + ci "github.com/libp2p/go-libp2p-core/crypto" ) func shuffle(a []*pb.IpnsEntry) { @@ -51,7 +51,7 @@ func TestOrdering(t *testing.T) { // generate a key for signing the records r := u.NewSeededRand(15) // generate deterministic keypair - priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, r) + priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 2048, r) if err != nil { t.Fatal(err) } diff --git a/ipns/validate_test.go b/ipns/validate_test.go index 1e10249b6b..741d20bc1a 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -11,9 +11,9 @@ import ( proto "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + ci "github.com/libp2p/go-libp2p-core/crypto" + peer "github.com/libp2p/go-libp2p-core/peer" + pstore "github.com/libp2p/go-libp2p-core/peerstore" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" ) @@ -162,7 +162,7 @@ func TestPeerIDPubKeyValidate(t *testing.T) { func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string) { sr := u.NewTimeSeededRand() - priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 1024, sr) + priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 2048, sr) if err != nil { t.Fatal(err) } From e83e2db7d01d98f5797d09a544b1c6b579e06114 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 3 Dec 2019 17:19:38 -0500 Subject: [PATCH 2794/3147] update datastore interface to support asynchronous writes to datastores. add datastore Sync during pinner.Flush() This commit was moved from ipfs/go-ipfs-pinner@f462ad6d552c55bbfc197110c81b65e469c06ca5 --- pinning/pinner/pin.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 655e59add9..fa17a6b0c2 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -579,6 +579,9 @@ func (p *pinner) Flush(ctx context.Context) error { if err := p.dstore.Put(pinDatastoreKey, k.Bytes()); err != nil { return fmt.Errorf("cannot store pin state: %v", err) } + if err := p.dstore.Sync(pinDatastoreKey); err != nil { + return fmt.Errorf("cannot sync pin state: %v", err) + } p.internalPin = internalset return nil } From 1d50d25c7b852f12acab0b81a47a786c9425cc2e Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 5 Dec 2019 12:15:45 -0500 Subject: [PATCH 2795/3147] add support for asynchronous datastores This commit was moved from ipfs/go-ipfs-pinner@5901eab20ba3c1345107fb9cc15682bf14cf7245 --- pinning/pinner/pin.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index fa17a6b0c2..7a3cabdf07 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -192,6 +192,11 @@ type pinner struct { dstore ds.Datastore } +type syncDAGService interface { + ipld.DAGService + Sync() error +} + // NewPinner creates a new pinner using the given datastore as a backend func NewPinner(dstore ds.Datastore, serv, internal ipld.DAGService) Pinner { @@ -576,6 +581,19 @@ func (p *pinner) Flush(ctx context.Context) error { k := root.Cid() internalset.Add(k) + + if syncDServ, ok := p.dserv.(syncDAGService); ok { + if err := syncDServ.Sync(); err != nil { + return fmt.Errorf("cannot sync pinned data: %v", err) + } + } + + if syncInternal, ok := p.internal.(syncDAGService); ok { + if err := syncInternal.Sync(); err != nil { + return fmt.Errorf("cannot sync pinning data: %v", err) + } + } + if err := p.dstore.Put(pinDatastoreKey, k.Bytes()); err != nil { return fmt.Errorf("cannot store pin state: %v", err) } From 65575fb3099dd729b394f512d8884b2e7f9c7cd8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 6 Dec 2019 10:36:38 -0500 Subject: [PATCH 2796/3147] chore(gx): remove gx This commit was moved from ipfs/go-ipfs-exchange-offline@30194c5ef96ac12ff0266cbc1d60c7182ed0e44a --- exchange/offline/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/exchange/offline/README.md b/exchange/offline/README.md index 707099e9a8..cd537b3027 100644 --- a/exchange/offline/README.md +++ b/exchange/offline/README.md @@ -25,8 +25,6 @@ This is an offline exchange implementation which will not perform any request. > go get github.com/ipfs/go-ipfs-exchange-offline ``` -It uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. - ## Usage ``` From 4564bd2d00ce963e11ebb89f7ea5fa195de3f3ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Fri, 6 Dec 2019 18:46:35 +0100 Subject: [PATCH 2797/3147] reprovide: pass the context to the back-off retry This commit was moved from ipfs/go-ipfs-provider@03c62646479e4b133276573fc31a39a5b491f122 --- provider/simple/reprovide.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index e5afe80d24..59b49d807e 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -110,9 +110,7 @@ func (rp *Reprovider) Reprovide() error { return err } - // TODO: this backoff library does not respect our context, we should - // eventually work contexts into it. low priority. - err := backoff.Retry(op, backoff.NewExponentialBackOff()) + err := backoff.Retry(op, backoff.WithContext(backoff.NewExponentialBackOff(), rp.ctx)) if err != nil { logR.Debugf("Providing failed after number of retries: %s", err) return err From 674921ba7eaed8dfc75545037a61d235b9efb65d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 9 Dec 2019 13:56:40 +0100 Subject: [PATCH 2798/3147] fix(arc): return the correct size when only "has" is cached This commit was moved from ipfs/go-ipfs-blockstore@5e786b5d8a17fefe58a6309658fa19efa6d6c783 --- blockstore/arc_cache.go | 9 +++++++-- blockstore/arc_cache_test.go | 21 ++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index b2ba82105c..8e88fa81ae 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -86,10 +86,15 @@ func (b *arccache) Has(k cid.Cid) (bool, error) { func (b *arccache) GetSize(k cid.Cid) (int, error) { if has, blockSize, ok := b.hasCached(k); ok { - if has { + if !has { + // don't have it, return + return -1, ErrNotFound + } + if blockSize >= 0 { + // have it and we know the size return blockSize, nil } - return -1, ErrNotFound + // we have it but don't know the size, ask the datastore. } blockSize, err := b.blockstore.GetSize(k) if err == ErrNotFound { diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index b72c848532..dcd9c6e309 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -123,7 +123,7 @@ func TestGetFillsCache(t *testing.T) { t.Fatal("has returned invalid result") } if blockSize, err := arc.GetSize(exampleBlock.Cid()); blockSize == -1 || err != nil { - t.Fatal("getsize returned invalid result") + t.Fatal("getsize returned invalid result", blockSize, err) } } @@ -185,6 +185,25 @@ func TestGetSizeAfterSucessfulGetIsCached(t *testing.T) { arc.GetSize(exampleBlock.Cid()) } +func TestGetSizeAfterSucessfulHas(t *testing.T) { + arc, bs, _ := createStores(t) + + bs.Put(exampleBlock) + has, err := arc.Has(exampleBlock.Cid()) + if err != nil { + t.Fatal(err) + } + if !has { + t.Fatal("expected to have block") + } + + if size, err := arc.GetSize(exampleBlock.Cid()); err != nil { + t.Fatal(err) + } else if size != len(exampleBlock.RawData()) { + t.Fatalf("expected size %d, got %d", len(exampleBlock.RawData()), size) + } +} + func TestGetSizeMissingZeroSizeBlock(t *testing.T) { arc, bs, cd := createStores(t) emptyBlock := blocks.NewBlock([]byte{}) From 7540727e98fe10cd67b65d935fba5dd78eed0895 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 14 Dec 2019 19:48:31 +0100 Subject: [PATCH 2799/3147] fix: move away from deprecated peer ID functions This commit was moved from ipfs/go-namesys@d787d3ba83820c2b25b9e105d5f34f5409ff4730 --- namesys/namesys.go | 2 +- namesys/routing.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 7ae93e3e26..079eecccc0 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -189,6 +189,6 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. if ttEol := time.Until(eol); ttEol < ttl { ttl = ttEol } - ns.cacheSet(peer.IDB58Encode(id), value, ttl) + ns.cacheSet(peer.Encode(id), value, ttl) return nil } diff --git a/namesys/routing.go b/namesys/routing.go index 94c12a7261..c2d0d0252d 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -59,7 +59,7 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option } name = strings.TrimPrefix(name, "/ipns/") - pid, err := peer.IDB58Decode(name) + pid, err := peer.Decode(name) if err != nil { log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) out <- onceResult{err: err} From 13b86854e783f610220e552fe7a38de90e6aa3d1 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 5 Dec 2019 13:16:33 -0500 Subject: [PATCH 2800/3147] support async datastores This commit was moved from ipfs/go-namesys@662bbed655965f7c26ebcc663318791e8fbbcde1 --- namesys/publisher.go | 6 +++++- namesys/publisher_test.go | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index f5e335cd31..1fa0c96c9c 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -179,7 +179,11 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value pa } // Put the new record. - if err := p.ds.Put(IpnsDsKey(id), data); err != nil { + key := IpnsDsKey(id) + if err := p.ds.Put(key, data); err != nil { + return nil, err + } + if err := p.ds.Sync(key); err != nil { return nil, err } return entry, nil diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 0b7b2c9399..6251033835 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -3,6 +3,7 @@ package namesys import ( "context" "crypto/rand" + "github.com/ipfs/go-path" "testing" "time" @@ -110,3 +111,45 @@ func TestRSAPublisher(t *testing.T) { func TestEd22519Publisher(t *testing.T) { testNamekeyPublisher(t, ci.Ed25519, ds.ErrNotFound, false) } + +func TestAsyncDS(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + rt := mockrouting.NewServer().Client(testutil.RandIdentityOrFatal(t)) + ds := &checkSyncDS{ + Datastore: ds.NewMapDatastore(), + syncKeys: make(map[ds.Key]struct{}), + } + publisher := NewIpnsPublisher(rt, ds) + + ipnsFakeID := testutil.RandIdentityOrFatal(t) + ipnsVal, err := path.ParsePath("/ipns/foo.bar") + if err != nil { + t.Fatal(err) + } + + if err := publisher.Publish(ctx, ipnsFakeID.PrivateKey(), ipnsVal); err != nil { + t.Fatal(err) + } + + ipnsKey := IpnsDsKey(ipnsFakeID.ID()) + + for k := range ds.syncKeys { + if k.IsAncestorOf(ipnsKey) || k.Equal(ipnsKey) { + return + } + } + + t.Fatal("ipns key not synced") +} + +type checkSyncDS struct { + ds.Datastore + syncKeys map[ds.Key]struct{} +} + +func (d *checkSyncDS) Sync(prefix ds.Key) error { + d.syncKeys[prefix] = struct{}{} + return d.Datastore.Sync(prefix) +} From 974687971984fc2197734088eef7ea55e990596e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 3 Jan 2020 18:53:00 -0800 Subject: [PATCH 2801/3147] fix(dagreader): remove a buggy workaround for a gateway issue We had a hack that "pretended" seeking worked when it didn't as go's HTTP library uses seeks to determine the file size. However, 1. I'm changing the gateway to actually rely on seeking working as specified. 2. We don't even need this hack. The gateway performs two types of seeks (unless a range query is passed): 1. It seeks to the beginning. We can always shortcut this. 2. It seeks to the end. The gateway now has a special "lazy" seeker to avoid seeking until we actually try to _read_. Therefore, we don't need a hack for that either. This commit was moved from ipfs/go-unixfs@47e41818c092d6478a2ccdb891eff4f3b3544282 --- unixfs/io/dagreader.go | 20 +++++------- unixfs/io/dagreader_test.go | 65 +++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 75fb5c714d..8dcb5c911d 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -16,6 +16,7 @@ var ( ErrIsDir = errors.New("this dag node is a directory") ErrCantReadSymlinks = errors.New("cannot currently read symlinks") ErrUnkownNodeType = errors.New("unknown node type") + ErrSeekNotSupported = errors.New("file does not support seeking") ) // TODO: Rename the `DagReader` interface, this doesn't read *any* DAG, just @@ -345,7 +346,7 @@ func (dr *dagReader) Seek(offset int64, whence int) (int64, error) { switch whence { case io.SeekStart: if offset < 0 { - return -1, errors.New("invalid offset") + return dr.offset, errors.New("invalid offset") } if offset == dr.offset { @@ -359,6 +360,11 @@ func (dr *dagReader) Seek(offset int64, whence int) (int64, error) { // Seek from the beginning of the DAG. dr.resetPosition() + // Shortcut seeking to the beginning, we're already there. + if offset == 0 { + return 0, nil + } + // Use the internal reader's context to fetch the child node promises // (see `ipld.NavigableIPLDNode.FetchChild` for details). dr.dagWalker.SetContext(dr.ctx) @@ -388,7 +394,7 @@ func (dr *dagReader) Seek(offset int64, whence int) (int64, error) { // If there aren't enough size hints don't seek // (see the `io.EOF` handling error comment below). if fsNode.NumChildren() != len(node.Links()) { - return io.EOF + return ErrSeekNotSupported } // Internal nodes have no data, so just iterate through the @@ -445,16 +451,6 @@ func (dr *dagReader) Seek(offset int64, whence int) (int64, error) { } }) - if err == io.EOF { - // TODO: Taken from https://github.com/ipfs/go-ipfs/pull/4320, - // check if still valid. - // Return negative number if we can't figure out the file size. Using io.EOF - // for this seems to be good(-enough) solution as it's only returned by - // precalcNextBuf when we step out of file range. - // This is needed for gateway to function properly - return -1, nil - } - if err != nil { return 0, err } diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index 884ae332d3..de664370c4 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -72,6 +72,71 @@ func TestSeekAndRead(t *testing.T) { } } +func TestSeekWithoutBlocksizes(t *testing.T) { + dserv := testu.GetDAGServ() + ctx, closer := context.WithCancel(context.Background()) + defer closer() + + inbuf := make([]byte, 1024) + + for i := 0; i < 256; i++ { + inbuf[i*4] = byte(i) + } + + inbuf[1023] = 1 // force the reader to be 1024 bytes + node := testu.GetNode(t, dserv, inbuf, testu.UseProtoBufLeaves) + + // remove the blocksizes + pbnode := node.Copy().(*mdag.ProtoNode) + fsnode, err := unixfs.FSNodeFromBytes(pbnode.Data()) + if err != nil { + t.Fatal(err) + } + fsnode.RemoveAllBlockSizes() + newData, err := fsnode.GetBytes() + if err != nil { + t.Fatal(err) + } + pbnode.SetData(newData) + err = dserv.Add(ctx, pbnode) + if err != nil { + t.Fatal(err) + } + node = pbnode + + reader, err := NewDagReader(ctx, node, dserv) + if err != nil { + t.Fatal(err) + } + + _, err = reader.Seek(-4, io.SeekEnd) + if err == nil { + t.Fatal("seeking shouldn't work without blocksizes") + } + + _, err = reader.Seek(4, io.SeekStart) + if err == nil { + t.Fatal("seeking shouldn't work without blocksizes") + } + + _, err = reader.Seek(4, io.SeekCurrent) + if err == nil { + t.Fatal("seeking shouldn't work without blocksizes") + } + + // Seeking to the current position or the end should still work. + + _, err = reader.Seek(0, io.SeekCurrent) + if err != nil { + t.Fatal(err) + } + + _, err = reader.Seek(0, io.SeekStart) + if err != nil { + t.Fatal(err) + } +} + func TestRelativeSeek(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) From b024f2095da39f8766d610e91763caa94782b691 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 5 Jan 2020 16:32:32 -0800 Subject: [PATCH 2802/3147] fix(io): make resetPosition actually reset everything Including the offset. This commit was moved from ipfs/go-unixfs@d1f8577538c558e0dd5abc826a97bdfe715e84c9 --- unixfs/io/dagreader.go | 1 + 1 file changed, 1 insertion(+) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8dcb5c911d..374b509163 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -480,6 +480,7 @@ func (dr *dagReader) Seek(offset int64, whence int) (int64, error) { // in the `SeekStart` case. func (dr *dagReader) resetPosition() { dr.currentNodeData = nil + dr.offset = 0 dr.dagWalker = ipld.NewWalker(dr.ctx, ipld.NewNavigableIPLDNode(dr.rootNode, dr.serv)) // TODO: This could be avoided (along with storing the `dr.rootNode` and From ed4b96d41585ff4159d30c01537a0dbd0d914606 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 7 Jan 2020 09:21:13 -0800 Subject: [PATCH 2803/3147] feat: switch to raw multihashes for blocks Part of: https://github.com/ipfs/go-ipfs/issues/6815 This commit was moved from ipfs/go-ipfs-ds-help@11890cc86e62c173d5159a5c14bd1f528a2b48c1 --- datastore/dshelp/key.go | 23 +++++++++++++++++++---- datastore/dshelp/key_test.go | 5 ++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 1f47023fe9..274da1da4c 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -6,6 +6,7 @@ import ( cid "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/multiformats/go-base32" + mh "github.com/multiformats/go-multihash" ) // NewKeyFromBinary creates a new key from a byte slice. @@ -21,16 +22,30 @@ func BinaryFromDsKey(k datastore.Key) ([]byte, error) { return base32.RawStdEncoding.DecodeString(k.String()[1:]) } +// MultihashToDsKey creates a Key from the given Multihash. +func MultihashToDsKey(k mh.Multihash) datastore.Key { + return NewKeyFromBinary(k) +} + +// DsKeyToMultihash converts a dsKey to the corresponding Multihash. +func DsKeyToMultihash(dsKey datastore.Key) (mh.Multihash, error) { + kb, err := BinaryFromDsKey(dsKey) + if err != nil { + return nil, err + } + return mh.Cast(kb) +} + // CidToDsKey creates a Key from the given Cid. func CidToDsKey(k cid.Cid) datastore.Key { - return NewKeyFromBinary(k.Bytes()) + return MultihashToDsKey(k.Hash()) } // DsKeyToCid converts the given Key to its corresponding Cid. func DsKeyToCid(dsKey datastore.Key) (cid.Cid, error) { - kb, err := BinaryFromDsKey(dsKey) + hash, err := DsKeyToMultihash(dsKey) if err != nil { - return cid.Cid{}, err + return cid.Cid{}, nil } - return cid.Cast(kb) + return cid.NewCidV1(cid.Raw, hash), nil } diff --git a/datastore/dshelp/key_test.go b/datastore/dshelp/key_test.go index 1f739bf8be..01a463366b 100644 --- a/datastore/dshelp/key_test.go +++ b/datastore/dshelp/key_test.go @@ -13,7 +13,10 @@ func TestKey(t *testing.T) { if err != nil { t.Fatal(err) } - if c.String() != c2.String() { + if string(c.Hash()) != string(c2.Hash()) { t.Fatal("should have parsed the same key") } + if c.Equals(c2) || c2.Type() != cid.Raw || c2.Version() != 1 { + t.Fatal("should have been converted to CIDv1-raw") + } } From 7166eaf24f82a15aafcae59e754069a3909c4a06 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 23 Sep 2019 14:05:37 -0700 Subject: [PATCH 2804/3147] namesys: set the correct cache TTL on publish fixes https://github.com/ipfs/go-ipfs/issues/6656#issuecomment-534252128 This commit was moved from ipfs/go-namesys@3856c6e677fe80eb10a1bf64dadafa396171f97b --- namesys/namesys.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/namesys/namesys.go b/namesys/namesys.go index f8b8c6d12e..31b5415387 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -183,6 +183,9 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. return err } ttl := DefaultResolverCacheTTL + if setTTL, ok := checkCtxTTL(ctx); ok { + ttl = setTTL + } if ttEol := time.Until(eol); ttEol < ttl { ttl = ttEol } From 2e4bf45caf6dd57806317ad84d82fbadd823fbc2 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Tue, 21 Jan 2020 16:05:24 +0100 Subject: [PATCH 2805/3147] Fix preexisting tests - they would never fail as written This commit was moved from ipfs/go-ipfs-chunker@f076b1ef460765220ec72067ea3bbc2ac3976623 --- chunker/parse_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/chunker/parse_test.go b/chunker/parse_test.go index f82aba5f2c..f819199d56 100644 --- a/chunker/parse_test.go +++ b/chunker/parse_test.go @@ -15,8 +15,8 @@ func TestParseRabin(t *testing.T) { t.Errorf(err.Error()) } _, err = parseRabinString(r, chk2) - if err == ErrRabinMin { - t.Log("it should be ErrRabinMin here.") + if err != ErrRabinMin { + t.Fatalf("Expected an 'ErrRabinMin' error, got: %#v", err) } } @@ -26,11 +26,11 @@ func TestParseSize(t *testing.T) { size1 := "size-0" size2 := "size-32" _, err := FromString(r, size1) - if err == ErrSize { - t.Log("it should be ErrSize here.") + if err != ErrSize { + t.Fatalf("Expected an 'ErrSize' error, got: %#v", err) } _, err = FromString(r, size2) - if err == ErrSize { + if err != nil { t.Fatal(err) } } From 90e3e8801884cd939fd8a7c9ca2f49f0c1f4f6f9 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Tue, 21 Jan 2020 16:57:58 +0100 Subject: [PATCH 2806/3147] Add various sanity checks for size specifications This commit was moved from ipfs/go-ipfs-chunker@397f536c853dd5e6145e26c0720a736f18c2e4f2 --- chunker/parse.go | 30 +++++++++++++++++++++++++++++- chunker/splitting.go | 3 --- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/chunker/parse.go b/chunker/parse.go index 5d472b7092..59656bf846 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -8,9 +8,25 @@ import ( "strings" ) +const ( + // DefaultBlockSize is the chunk size that splitters produce (or aim to). + DefaultBlockSize int64 = 1024 * 256 + + // 1 MB, on-wire block size for "datablocks ( unixfs, etc )" + // copy of https://github.com/ipfs/go-unixfs/blob/v0.2.3/importer/helpers/helpers.go#L8 + BlockSizeLimit int = 1048576 + + // in case we are using raw-leaves: this would match BlockSizeLimit, but we can't assume that + // be conservative and substract the PB wraping size of a full DAG-PB+UnixFS node describing 1M + // (2b(type2/file)+4b(data-field:3-byte-len-delimited)+4b(size-field:3-byte-varint))+(4b(DAG-type-1:3-byte-len-delimited)) + // FIXME - this calculation will need an update for CBOR + BlockPayloadLimit int = (BlockSizeLimit - (2 + 4 + 4 + 4)) +) + var ( ErrRabinMin = errors.New("rabin min must be greater than 16") - ErrSize = errors.New("chunker size muster greater than 0") + ErrSize = errors.New("chunker size must be greater than 0") + ErrSizeMax = fmt.Errorf("chunker parameters may not exceed the maximum block payload size of %d", BlockPayloadLimit) ) // FromString returns a Splitter depending on the given string: @@ -28,6 +44,8 @@ func FromString(r io.Reader, chunker string) (Splitter, error) { return nil, err } else if size <= 0 { return nil, ErrSize + } else if size > BlockPayloadLimit { + return nil, ErrSizeMax } return NewSizeSplitter(r, int64(size)), nil @@ -51,6 +69,8 @@ func parseRabinString(r io.Reader, chunker string) (Splitter, error) { size, err := strconv.Atoi(parts[1]) if err != nil { return nil, err + } else if int(float32(size)*1.5) > BlockPayloadLimit { // FIXME - there is probably a better way to bubble up this calculation from NewRabin() + return nil, ErrSizeMax } return NewRabin(r, uint64(size)), nil case 4: @@ -84,6 +104,14 @@ func parseRabinString(r io.Reader, chunker string) (Splitter, error) { return nil, err } + if min >= avg { + return nil, errors.New("incorrect format: rabin-min must be smaller than rabin-avg") + } else if avg >= max { + return nil, errors.New("incorrect format: rabin-avg must be smaller than rabin-max") + } else if max > BlockPayloadLimit { + return nil, ErrSizeMax + } + return NewRabinMinMax(r, uint64(min), uint64(avg), uint64(max)), nil default: return nil, errors.New("incorrect format (expected 'rabin' 'rabin-[avg]' or 'rabin-[min]-[avg]-[max]'") diff --git a/chunker/splitting.go b/chunker/splitting.go index 2b2373992d..a137820ab1 100644 --- a/chunker/splitting.go +++ b/chunker/splitting.go @@ -13,9 +13,6 @@ import ( var log = logging.Logger("chunk") -// DefaultBlockSize is the chunk size that splitters produce (or aim to). -var DefaultBlockSize int64 = 1024 * 256 - // A Splitter reads bytes from a Reader and creates "chunks" (byte slices) // that can be used to build DAG nodes. type Splitter interface { From 641b54b5eaf6ebe73a814e3c17d0d8f30a6b0373 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Tue, 21 Jan 2020 16:58:17 +0100 Subject: [PATCH 2807/3147] Test all the things This commit was moved from ipfs/go-ipfs-chunker@65d7a6e9ab7c927a2f596590b6eabe00051368e9 --- chunker/parse_test.go | 70 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/chunker/parse_test.go b/chunker/parse_test.go index f819199d56..242d582eea 100644 --- a/chunker/parse_test.go +++ b/chunker/parse_test.go @@ -2,35 +2,79 @@ package chunk import ( "bytes" + "fmt" "testing" ) +const ( + testTwoThirdsOfBlockPayloadLimit = 2 * (float32(BlockPayloadLimit) / float32(3)) +) + func TestParseRabin(t *testing.T) { - max := 1000 - r := bytes.NewReader(randBuf(t, max)) - chk1 := "rabin-18-25-32" - chk2 := "rabin-15-23-31" - _, err := parseRabinString(r, chk1) + r := bytes.NewReader(randBuf(t, 1000)) + + _, err := FromString(r, "rabin-18-25-32") if err != nil { t.Errorf(err.Error()) } - _, err = parseRabinString(r, chk2) + + _, err = FromString(r, "rabin-15-23-31") if err != ErrRabinMin { t.Fatalf("Expected an 'ErrRabinMin' error, got: %#v", err) } + + _, err = FromString(r, "rabin-20-20-21") + if err == nil || err.Error() != "incorrect format: rabin-min must be smaller than rabin-avg" { + t.Fatalf("Expected an arg-out-of-order error, got: %#v", err) + } + + _, err = FromString(r, "rabin-19-21-21") + if err == nil || err.Error() != "incorrect format: rabin-avg must be smaller than rabin-max" { + t.Fatalf("Expected an arg-out-of-order error, got: %#v", err) + } + + _, err = FromString(r, fmt.Sprintf("rabin-19-21-%d", BlockPayloadLimit)) + if err != nil { + t.Fatalf("Expected success, got: %#v", err) + } + + _, err = FromString(r, fmt.Sprintf("rabin-19-21-%d", 1+BlockPayloadLimit)) + if err != ErrSizeMax { + t.Fatalf("Expected 'ErrSizeMax', got: %#v", err) + } + + _, err = FromString(r, fmt.Sprintf("rabin-%.0f", testTwoThirdsOfBlockPayloadLimit)) + if err != nil { + t.Fatalf("Expected success, got: %#v", err) + } + + _, err = FromString(r, fmt.Sprintf("rabin-%.0f", 1+testTwoThirdsOfBlockPayloadLimit)) + if err != ErrSizeMax { + t.Fatalf("Expected 'ErrSizeMax', got: %#v", err) + } + } func TestParseSize(t *testing.T) { - max := 1000 - r := bytes.NewReader(randBuf(t, max)) - size1 := "size-0" - size2 := "size-32" - _, err := FromString(r, size1) + r := bytes.NewReader(randBuf(t, 1000)) + + _, err := FromString(r, "size-0") if err != ErrSize { t.Fatalf("Expected an 'ErrSize' error, got: %#v", err) } - _, err = FromString(r, size2) + + _, err = FromString(r, "size-32") + if err != nil { + t.Fatalf("Expected success, got: %#v", err) + } + + _, err = FromString(r, fmt.Sprintf("size-%d", BlockPayloadLimit)) if err != nil { - t.Fatal(err) + t.Fatalf("Expected success, got: %#v", err) + } + + _, err = FromString(r, fmt.Sprintf("size-%d", 1+BlockPayloadLimit)) + if err != ErrSizeMax { + t.Fatalf("Expected 'ErrSizeMax', got: %#v", err) } } From 65e7f3a2f7a86dd15100c97a527fac7aab116a64 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Tue, 21 Jan 2020 17:03:50 +0100 Subject: [PATCH 2808/3147] Remove last pieces of gx This commit was moved from ipfs/go-ipfs-chunker@5f9fd98c2afd218261ae9405a8f5d647498a2f88 --- chunker/Makefile | 18 ------------------ chunker/README.md | 2 -- 2 files changed, 20 deletions(-) delete mode 100644 chunker/Makefile diff --git a/chunker/Makefile b/chunker/Makefile deleted file mode 100644 index 73f2841f61..0000000000 --- a/chunker/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -all: deps -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go -deps: gx - gx --verbose install --global - gx-go rewrite -test: deps - gx test -v -race -coverprofile=coverage.txt -covermode=atomic . -rw: - gx-go rewrite -rwundo: - gx-go rewrite --undo -publish: rwundo - gx publish -.PHONY: all gx deps test rw rwundo publish - - diff --git a/chunker/README.md b/chunker/README.md index 84161c5466..7b1b5b2389 100644 --- a/chunker/README.md +++ b/chunker/README.md @@ -31,8 +31,6 @@ The package provides a `SizeSplitter` which creates chunks of equal size and it > go get github.com/ipfs/go-ipfs-chunker ``` -It uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. - ## Usage ``` From 3817b1eb0760edba0d12e7fc527496f5cb0b5081 Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Tue, 21 Jan 2020 21:06:23 +0100 Subject: [PATCH 2809/3147] Address block/chunk logical mismatch, name things correctly This commit was moved from ipfs/go-ipfs-chunker@4414aa269d6baa18717e34aa87f9a72d4948ff4b --- chunker/parse.go | 21 ++++++++------------- chunker/parse_test.go | 14 +++++++------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/chunker/parse.go b/chunker/parse.go index 59656bf846..dee830489a 100644 --- a/chunker/parse.go +++ b/chunker/parse.go @@ -12,21 +12,16 @@ const ( // DefaultBlockSize is the chunk size that splitters produce (or aim to). DefaultBlockSize int64 = 1024 * 256 - // 1 MB, on-wire block size for "datablocks ( unixfs, etc )" - // copy of https://github.com/ipfs/go-unixfs/blob/v0.2.3/importer/helpers/helpers.go#L8 - BlockSizeLimit int = 1048576 - - // in case we are using raw-leaves: this would match BlockSizeLimit, but we can't assume that - // be conservative and substract the PB wraping size of a full DAG-PB+UnixFS node describing 1M - // (2b(type2/file)+4b(data-field:3-byte-len-delimited)+4b(size-field:3-byte-varint))+(4b(DAG-type-1:3-byte-len-delimited)) - // FIXME - this calculation will need an update for CBOR - BlockPayloadLimit int = (BlockSizeLimit - (2 + 4 + 4 + 4)) + // No leaf block should contain more than 1MiB of payload data ( wrapping overhead aside ) + // This effectively mandates the maximum chunk size + // See discussion at https://github.com/ipfs/go-ipfs-chunker/pull/21#discussion_r369124879 for background + ChunkSizeLimit int = 1048576 ) var ( ErrRabinMin = errors.New("rabin min must be greater than 16") ErrSize = errors.New("chunker size must be greater than 0") - ErrSizeMax = fmt.Errorf("chunker parameters may not exceed the maximum block payload size of %d", BlockPayloadLimit) + ErrSizeMax = fmt.Errorf("chunker parameters may not exceed the maximum chunk size of %d", ChunkSizeLimit) ) // FromString returns a Splitter depending on the given string: @@ -44,7 +39,7 @@ func FromString(r io.Reader, chunker string) (Splitter, error) { return nil, err } else if size <= 0 { return nil, ErrSize - } else if size > BlockPayloadLimit { + } else if size > ChunkSizeLimit { return nil, ErrSizeMax } return NewSizeSplitter(r, int64(size)), nil @@ -69,7 +64,7 @@ func parseRabinString(r io.Reader, chunker string) (Splitter, error) { size, err := strconv.Atoi(parts[1]) if err != nil { return nil, err - } else if int(float32(size)*1.5) > BlockPayloadLimit { // FIXME - there is probably a better way to bubble up this calculation from NewRabin() + } else if int(float32(size)*1.5) > ChunkSizeLimit { // FIXME - this will be addressed in a subsequent PR return nil, ErrSizeMax } return NewRabin(r, uint64(size)), nil @@ -108,7 +103,7 @@ func parseRabinString(r io.Reader, chunker string) (Splitter, error) { return nil, errors.New("incorrect format: rabin-min must be smaller than rabin-avg") } else if avg >= max { return nil, errors.New("incorrect format: rabin-avg must be smaller than rabin-max") - } else if max > BlockPayloadLimit { + } else if max > ChunkSizeLimit { return nil, ErrSizeMax } diff --git a/chunker/parse_test.go b/chunker/parse_test.go index 242d582eea..237a2b439a 100644 --- a/chunker/parse_test.go +++ b/chunker/parse_test.go @@ -7,7 +7,7 @@ import ( ) const ( - testTwoThirdsOfBlockPayloadLimit = 2 * (float32(BlockPayloadLimit) / float32(3)) + testTwoThirdsOfChunkLimit = 2 * (float32(ChunkSizeLimit) / float32(3)) ) func TestParseRabin(t *testing.T) { @@ -33,22 +33,22 @@ func TestParseRabin(t *testing.T) { t.Fatalf("Expected an arg-out-of-order error, got: %#v", err) } - _, err = FromString(r, fmt.Sprintf("rabin-19-21-%d", BlockPayloadLimit)) + _, err = FromString(r, fmt.Sprintf("rabin-19-21-%d", ChunkSizeLimit)) if err != nil { t.Fatalf("Expected success, got: %#v", err) } - _, err = FromString(r, fmt.Sprintf("rabin-19-21-%d", 1+BlockPayloadLimit)) + _, err = FromString(r, fmt.Sprintf("rabin-19-21-%d", 1+ChunkSizeLimit)) if err != ErrSizeMax { t.Fatalf("Expected 'ErrSizeMax', got: %#v", err) } - _, err = FromString(r, fmt.Sprintf("rabin-%.0f", testTwoThirdsOfBlockPayloadLimit)) + _, err = FromString(r, fmt.Sprintf("rabin-%.0f", testTwoThirdsOfChunkLimit)) if err != nil { t.Fatalf("Expected success, got: %#v", err) } - _, err = FromString(r, fmt.Sprintf("rabin-%.0f", 1+testTwoThirdsOfBlockPayloadLimit)) + _, err = FromString(r, fmt.Sprintf("rabin-%.0f", 1+testTwoThirdsOfChunkLimit)) if err != ErrSizeMax { t.Fatalf("Expected 'ErrSizeMax', got: %#v", err) } @@ -68,12 +68,12 @@ func TestParseSize(t *testing.T) { t.Fatalf("Expected success, got: %#v", err) } - _, err = FromString(r, fmt.Sprintf("size-%d", BlockPayloadLimit)) + _, err = FromString(r, fmt.Sprintf("size-%d", ChunkSizeLimit)) if err != nil { t.Fatalf("Expected success, got: %#v", err) } - _, err = FromString(r, fmt.Sprintf("size-%d", 1+BlockPayloadLimit)) + _, err = FromString(r, fmt.Sprintf("size-%d", 1+ChunkSizeLimit)) if err != ErrSizeMax { t.Fatalf("Expected 'ErrSizeMax', got: %#v", err) } From 7a2fc1b8165e4079351f62ed4eec6a3fd9bd0aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 22 Jan 2020 17:11:19 +0100 Subject: [PATCH 2810/3147] test: fail early on err to avoid an unrelated panic This commit was moved from ipfs/interface-go-ipfs-core@df21c57e0f09b481b02f09cf3da20d17d25414e9 --- coreiface/tests/block.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 6b648f3946..3777d22599 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -156,7 +156,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) { _, err = api.Block().Get(ctx, res.Path()) if err == nil { - t.Error("expected err to exist") + t.Fatal("expected err to exist") } if !strings.Contains(err.Error(), "blockservice: key not found") { t.Errorf("unexpected error; %s", err.Error()) @@ -164,7 +164,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) { err = api.Block().Rm(ctx, res.Path()) if err == nil { - t.Error("expected err to exist") + t.Fatal("expected err to exist") } if !strings.Contains(err.Error(), "blockstore: block not found") { t.Errorf("unexpected error; %s", err.Error()) From a117bd53c6cdccf16623087459749a73413bb430 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 16 Jan 2020 15:48:20 -0800 Subject: [PATCH 2811/3147] fix: migrate from deprecated warning function This commit was moved from ipfs/go-ipfs-keystore@54050cb4f9ab6ca3d62027100d6d740bbe130a44 --- keystore/keystore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 237d4b05c3..991de5dd1d 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -168,7 +168,7 @@ func (ks *FSKeystore) List() ([]string, error) { if err == nil { list = append(list, name) } else { - log.Warningf("Ignoring the invalid keyfile: %s", name) + log.Warnf("Ignoring the invalid keyfile: %s", name) } } From 5b021581acfd939301275a761385c6427a1b6660 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 16 Jan 2020 16:18:53 -0800 Subject: [PATCH 2812/3147] fix(tracing): remove event tracing We've deprecated this system and have yet to move to a new system. We might as well remove everything, switch to a new system, then deliberately trace the entire system. This commit was moved from ipfs/go-namesys@f00b18eecc1997b26cc02d527203d0b750446d2c --- namesys/resolve/resolve.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/namesys/resolve/resolve.go b/namesys/resolve/resolve.go index 44f735a1f4..5b5dc515ef 100644 --- a/namesys/resolve/resolve.go +++ b/namesys/resolve/resolve.go @@ -7,15 +7,12 @@ import ( "strings" "github.com/ipfs/go-ipld-format" - logging "github.com/ipfs/go-log" "github.com/ipfs/go-path" "github.com/ipfs/go-path/resolver" "github.com/ipfs/go-ipfs/namesys" ) -var log = logging.Logger("nsresolv") - // ErrNoNamesys is an explicit error for when an IPFS node doesn't // (yet) have a name system var ErrNoNamesys = errors.New( @@ -24,13 +21,8 @@ var ErrNoNamesys = errors.New( // ResolveIPNS resolves /ipns paths func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (path.Path, error) { if strings.HasPrefix(p.String(), "/ipns/") { - evt := log.EventBegin(ctx, "resolveIpnsPath") - defer evt.Done() - // resolve ipns paths - // TODO(cryptix): we should be able to query the local cache for the path if nsys == nil { - evt.Append(logging.LoggableMap{"error": ErrNoNamesys.Error()}) return "", ErrNoNamesys } @@ -38,27 +30,23 @@ func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (pat if len(seg) < 2 || seg[1] == "" { // just "/" without further segments err := fmt.Errorf("invalid path %q: ipns path missing IPNS ID", p) - evt.Append(logging.LoggableMap{"error": err}) return "", err } extensions := seg[2:] resolvable, err := path.FromSegments("/", seg[0], seg[1]) if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) return "", err } respath, err := nsys.Resolve(ctx, resolvable.String()) if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) return "", err } segments := append(respath.Segments(), extensions...) p, err = path.FromSegments("/", segments...) if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) return "", err } } From 1cfe8e6646fcb60d612f37808a7d79e3dac2968d Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 31 Jan 2020 12:12:21 +0100 Subject: [PATCH 2813/3147] Remove DsKeyToCid() and CidToDsKey(). Add DsKeyToCidV1Raw() We are deprecating these functions as ipfs strives to store multihashes directly on the datastore, rather than CIDs. Thus multiple CIDs might map to the same multihash. Making this functions reflect that behaviour might cause silent breakage in users. We prefer loud breakage. Users using CidToDsKey(c) should move to MultihashToDsKey(c.Hash()). Users using DsKeyToCid() should move to DsKeyToCidV1Raw() or DsKeyToMultihash(). Note that datastore should handle migrations to replace existing CID-encoded keys with raw multihashes, or preserve DsKeyToCid() and CidToDsKey() in their own codebases. This commit was moved from ipfs/go-ipfs-ds-help@48143f3d8539bdc6b321809c46f06989b1003fab --- datastore/dshelp/key.go | 17 ++++++++--------- datastore/dshelp/key_test.go | 12 +++++++----- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index 274da1da4c..db719d7b57 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -3,7 +3,7 @@ package dshelp import ( - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/multiformats/go-base32" mh "github.com/multiformats/go-multihash" @@ -23,6 +23,9 @@ func BinaryFromDsKey(k datastore.Key) ([]byte, error) { } // MultihashToDsKey creates a Key from the given Multihash. +// If working with Cids, you can call cid.Hash() to obtain +// the multihash. Note that different CIDs might represent +// the same multihash. func MultihashToDsKey(k mh.Multihash) datastore.Key { return NewKeyFromBinary(k) } @@ -36,16 +39,12 @@ func DsKeyToMultihash(dsKey datastore.Key) (mh.Multihash, error) { return mh.Cast(kb) } -// CidToDsKey creates a Key from the given Cid. -func CidToDsKey(k cid.Cid) datastore.Key { - return MultihashToDsKey(k.Hash()) -} - -// DsKeyToCid converts the given Key to its corresponding Cid. -func DsKeyToCid(dsKey datastore.Key) (cid.Cid, error) { +// DsKeyToCidV1Raw converts the given Key (which should be a raw multihash +// key) to a Cid V1 of raw type. +func DsKeyToCidV1Raw(dsKey datastore.Key) (cid.Cid, error) { hash, err := DsKeyToMultihash(dsKey) if err != nil { - return cid.Cid{}, nil + return cid.Cid{}, err } return cid.NewCidV1(cid.Raw, hash), nil } diff --git a/datastore/dshelp/key_test.go b/datastore/dshelp/key_test.go index 01a463366b..ac061f3c7a 100644 --- a/datastore/dshelp/key_test.go +++ b/datastore/dshelp/key_test.go @@ -8,15 +8,17 @@ import ( func TestKey(t *testing.T) { c, _ := cid.Decode("QmP63DkAFEnDYNjDYBpyNDfttu1fvUw99x1brscPzpqmmq") - dsKey := CidToDsKey(c) - c2, err := DsKeyToCid(dsKey) + dsKey := MultihashToDsKey(c.Hash()) + mh, err := DsKeyToMultihash(dsKey) if err != nil { t.Fatal(err) } - if string(c.Hash()) != string(c2.Hash()) { - t.Fatal("should have parsed the same key") + if string(c.Hash()) != string(mh) { + t.Fatal("should have parsed the same multihash") } - if c.Equals(c2) || c2.Type() != cid.Raw || c2.Version() != 1 { + + c2, err := DsKeyToCidV1Raw(dsKey) + if err != nil || c.Equals(c2) || c2.Type() != cid.Raw || c2.Version() != 1 { t.Fatal("should have been converted to CIDv1-raw") } } From 7eb7b84111965b7be8590648b776c7dd692a87d5 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 31 Jan 2020 17:12:27 +0100 Subject: [PATCH 2814/3147] Replace DsKeyToCidV1Raw() with DsKeyToCidV1() Allow passing in whatever codec type the user wants This commit was moved from ipfs/go-ipfs-ds-help@0c9f4a7ce67a8ad26723cb73284646dee7bf0651 --- datastore/dshelp/key.go | 7 ++++--- datastore/dshelp/key_test.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/datastore/dshelp/key.go b/datastore/dshelp/key.go index db719d7b57..32b73a61e6 100644 --- a/datastore/dshelp/key.go +++ b/datastore/dshelp/key.go @@ -40,11 +40,12 @@ func DsKeyToMultihash(dsKey datastore.Key) (mh.Multihash, error) { } // DsKeyToCidV1Raw converts the given Key (which should be a raw multihash -// key) to a Cid V1 of raw type. -func DsKeyToCidV1Raw(dsKey datastore.Key) (cid.Cid, error) { +// key) to a Cid V1 of the given type (see +// https://godoc.org/github.com/ipfs/go-cid#pkg-constants). +func DsKeyToCidV1(dsKey datastore.Key, codecType uint64) (cid.Cid, error) { hash, err := DsKeyToMultihash(dsKey) if err != nil { return cid.Cid{}, err } - return cid.NewCidV1(cid.Raw, hash), nil + return cid.NewCidV1(codecType, hash), nil } diff --git a/datastore/dshelp/key_test.go b/datastore/dshelp/key_test.go index ac061f3c7a..ff9fcc7d6f 100644 --- a/datastore/dshelp/key_test.go +++ b/datastore/dshelp/key_test.go @@ -17,7 +17,7 @@ func TestKey(t *testing.T) { t.Fatal("should have parsed the same multihash") } - c2, err := DsKeyToCidV1Raw(dsKey) + c2, err := DsKeyToCidV1(dsKey, cid.Raw) if err != nil || c.Equals(c2) || c2.Type() != cid.Raw || c2.Version() != 1 { t.Fatal("should have been converted to CIDv1-raw") } From 5a92dcb3cf10a3eb28813282e7eb5a3444ffeaeb Mon Sep 17 00:00:00 2001 From: Alex Trottier Date: Sat, 1 Feb 2020 15:20:52 -0800 Subject: [PATCH 2815/3147] chore: update dependencies, adjust use of removed functions, go 1.13 This commit was moved from ipfs/go-ipfs-blockstore@7a4b99e54ea86b4c4cc6d8c04fb617b9187c34cb --- blockstore/blockstore.go | 22 ++++++++++++---------- blockstore/blockstore_test.go | 4 ++++ blockstore/bloom_cache_test.go | 5 +++++ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 03004b5924..a2eb65c7b3 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -119,8 +119,7 @@ func (bs *blockstore) Get(k cid.Cid) (blocks.Block, error) { log.Error("undefined cid in blockstore") return nil, ErrNotFound } - - bdata, err := bs.datastore.Get(dshelp.CidToDsKey(k)) + bdata, err := bs.datastore.Get(dshelp.MultihashToDsKey(k.Hash())) if err == ds.ErrNotFound { return nil, ErrNotFound } @@ -143,7 +142,7 @@ func (bs *blockstore) Get(k cid.Cid) (blocks.Block, error) { } func (bs *blockstore) Put(block blocks.Block) error { - k := dshelp.CidToDsKey(block.Cid()) + k := dshelp.MultihashToDsKey(block.Cid().Hash()) // Has is cheaper than Put, so see if we already have it exists, err := bs.datastore.Has(k) @@ -159,7 +158,7 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { return err } for _, b := range blocks { - k := dshelp.CidToDsKey(b.Cid()) + k := dshelp.MultihashToDsKey(b.Cid().Hash()) exists, err := bs.datastore.Has(k) if err == nil && exists { continue @@ -174,11 +173,11 @@ func (bs *blockstore) PutMany(blocks []blocks.Block) error { } func (bs *blockstore) Has(k cid.Cid) (bool, error) { - return bs.datastore.Has(dshelp.CidToDsKey(k)) + return bs.datastore.Has(dshelp.MultihashToDsKey(k.Hash())) } func (bs *blockstore) GetSize(k cid.Cid) (int, error) { - size, err := bs.datastore.GetSize(dshelp.CidToDsKey(k)) + size, err := bs.datastore.GetSize(dshelp.MultihashToDsKey(k.Hash())) if err == ds.ErrNotFound { return -1, ErrNotFound } @@ -186,7 +185,7 @@ func (bs *blockstore) GetSize(k cid.Cid) (int, error) { } func (bs *blockstore) DeleteBlock(k cid.Cid) error { - return bs.datastore.Delete(dshelp.CidToDsKey(k)) + return bs.datastore.Delete(dshelp.MultihashToDsKey(k.Hash())) } // AllKeysChan runs a query for keys from the blockstore. @@ -220,12 +219,15 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { } // need to convert to key.Key using key.KeyFromDsKey. - k, err := dshelp.DsKeyToCid(ds.RawKey(e.Key)) + bk, err := dshelp.BinaryFromDsKey(ds.RawKey(e.Key)) if err != nil { - log.Warningf("error parsing key from DsKey: %s", err) + log.Warning("error pasring key from binary: %s", err) continue } - + k, err := cid.Cast(bk) + if err != nil { + log.Warningf("failed to cast cid: %s", err) + } select { case <-ctx.Done(): return diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index b01574a440..44225593ac 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -269,6 +269,10 @@ func (c *queryTestDS) Query(q dsq.Query) (dsq.Results, error) { return c.ds.Query(q) } +func (c *queryTestDS) Sync(key ds.Key) error { + return c.ds.Sync(key) +} + func (c *queryTestDS) Batch() (ds.Batch, error) { return ds.NewBasicBatch(c), nil } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index fd65c0b286..3b290a0c2c 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -202,6 +202,11 @@ func (c *callbackDatastore) Query(q dsq.Query) (dsq.Results, error) { return c.ds.Query(q) } +func (c *callbackDatastore) Sync(key ds.Key) error { + c.CallF() + return c.ds.Sync(key) +} + func (c *callbackDatastore) Batch() (ds.Batch, error) { return ds.NewBasicBatch(c), nil } From bb2ba5c09f380093085a2129b6c47d62eb14311e Mon Sep 17 00:00:00 2001 From: Alex Trottier Date: Sat, 1 Feb 2020 15:24:20 -0800 Subject: [PATCH 2816/3147] fix typo in blockstore.go This commit was moved from ipfs/go-ipfs-blockstore@e62b875f6ff6a9f4230fa569eeef89bf97e7d2b7 --- blockstore/blockstore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index a2eb65c7b3..a7e8b5daa6 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -221,7 +221,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // need to convert to key.Key using key.KeyFromDsKey. bk, err := dshelp.BinaryFromDsKey(ds.RawKey(e.Key)) if err != nil { - log.Warning("error pasring key from binary: %s", err) + log.Warningf("error parsing key from binary: %s", err) continue } k, err := cid.Cast(bk) From 0d1cc0714586d95974d0afc23cccbc2891e5c281 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sat, 1 Feb 2020 17:01:48 -0800 Subject: [PATCH 2817/3147] fix: return raw block CIDs instead of V0 CIDs from AllKeysChan V0 CIDs are always "dag-pb". Using the "raw" codec indicates that these blocks are just raw data. This commit was moved from ipfs/go-ipfs-blockstore@5f9214c8db55d92b36a16971d47854e7123f78e7 --- blockstore/blockstore.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index a7e8b5daa6..e815642da0 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -224,10 +224,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { log.Warningf("error parsing key from binary: %s", err) continue } - k, err := cid.Cast(bk) - if err != nil { - log.Warningf("failed to cast cid: %s", err) - } + k := cid.NewCidV1(cid.Raw, bk) select { case <-ctx.Done(): return From c2d202aeca5f1065e3921deca19bab9c7cde1afa Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 7 Jan 2020 09:34:11 -0800 Subject: [PATCH 2818/3147] feat: switch to raw multihashes for blocks Part of: https://github.com/ipfs/go-ipfs/issues/6815 This commit was moved from ipfs/go-ipfs-blockstore@8f266cac109a60c25dd62959cc03127329fc2976 --- blockstore/arc_cache.go | 6 +++--- blockstore/blockstore_test.go | 33 ++++++++++++++++++++++++++------- blockstore/bloom_cache.go | 8 ++++---- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 8e88fa81ae..e2b930dcad 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -59,7 +59,7 @@ func (b *arccache) hasCached(k cid.Cid) (has bool, size int, ok bool) { return false, -1, false } - h, ok := b.arc.Get(k.KeyString()) + h, ok := b.arc.Get(string(k.Hash())) if ok { b.hits.Inc() switch h := h.(type) { @@ -160,11 +160,11 @@ func (b *arccache) HashOnRead(enabled bool) { } func (b *arccache) cacheHave(c cid.Cid, have bool) { - b.arc.Add(c.KeyString(), cacheHave(have)) + b.arc.Add(string(c.Hash()), cacheHave(have)) } func (b *arccache) cacheSize(c cid.Cid, blockSize int) { - b.arc.Add(c.KeyString(), cacheSize(blockSize)) + b.arc.Add(string(c.Hash()), cacheSize(blockSize)) } func (b *arccache) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 44225593ac..a165652f41 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -53,6 +53,24 @@ func TestPutThenGetBlock(t *testing.T) { } } +func TestCidv0v1(t *testing.T) { + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) + block := blocks.NewBlock([]byte("some data")) + + err := bs.Put(block) + if err != nil { + t.Fatal(err) + } + + blockFromBlockstore, err := bs.Get(cid.NewCidV1(cid.DagProtobuf, block.Cid().Hash())) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(block.RawData(), blockFromBlockstore.RawData()) { + t.Fail() + } +} + func TestPutThenGetSizeBlock(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) block := blocks.NewBlock([]byte("some data")) @@ -218,18 +236,19 @@ func TestAllKeysRespectsContext(t *testing.T) { } func expectMatches(t *testing.T, expect, actual []cid.Cid) { + t.Helper() if len(expect) != len(actual) { t.Errorf("expect and actual differ: %d != %d", len(expect), len(actual)) } + + actualSet := make(map[string]bool, len(actual)) + for _, k := range actual { + actualSet[string(k.Hash())] = true + } + for _, ek := range expect { - found := false - for _, ak := range actual { - if ek.Equals(ak) { - found = true - } - } - if !found { + if !actualSet[string(ek.Hash())] { t.Error("expected key not found: ", ek) } } diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 6e28ecec6a..b4fadc2ef0 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -103,7 +103,7 @@ func (b *bloomcache) build(ctx context.Context) error { atomic.StoreInt32(&b.active, 1) return nil } - b.bloom.AddTS(key.Bytes()) // Use binary key, the more compact the better + b.bloom.AddTS(key.Hash()) // Use binary key, the more compact the better case <-ctx.Done(): b.buildErr = ctx.Err() return b.buildErr @@ -130,7 +130,7 @@ func (b *bloomcache) hasCached(k cid.Cid) (has bool, ok bool) { return false, false } if b.BloomActive() { - blr := b.bloom.HasTS(k.Bytes()) + blr := b.bloom.HasTS(k.Hash()) if !blr { // not contained in bloom is only conclusive answer bloom gives b.hits.Inc() return false, true @@ -163,7 +163,7 @@ func (b *bloomcache) Put(bl blocks.Block) error { // See comment in PutMany err := b.blockstore.Put(bl) if err == nil { - b.bloom.AddTS(bl.Cid().Bytes()) + b.bloom.AddTS(bl.Cid().Hash()) } return err } @@ -178,7 +178,7 @@ func (b *bloomcache) PutMany(bs []blocks.Block) error { return err } for _, bl := range bs { - b.bloom.AddTS(bl.Cid().Bytes()) + b.bloom.AddTS(bl.Cid().Hash()) } return nil } From 555a0b2ead32da70eb9cc94531ccfb8f682f052a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 7 Feb 2020 13:48:34 -0800 Subject: [PATCH 2819/3147] fix: fix a panic when deleting If we try deleting a bunch of files _before_ reading them, we'll panic because they haven't been loaded. This works around that by using the _link_ directly when the child hasn't been loaded. fixes https://github.com/ipfs/go-ipfs/issues/6860 This commit was moved from ipfs/go-unixfs@af8709db62ebcce86b400fb3e1cd75223ef31a15 --- unixfs/hamt/hamt.go | 32 +++++++++++++++++++++++++++++--- unixfs/hamt/hamt_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 6b89b47c77..374f47df24 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -489,10 +489,28 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val // structures, this will help to normalize them. return ds.childer.rm(idx) case 1: - nchild := child.childer.children[0] - if nchild.isValueNode() { + // The single child _should_ be a value by + // induction. However, we allow for it to be a + // shard in case an implementation is broken. + + // Have we loaded the child? Prefer that. + schild := child.childer.child(0) + if schild != nil { + if schild.isValueNode() { + ds.childer.set(schild, i) + } + return nil + } + + // Otherwise, work with the link. + slnk := child.childer.link(0) + lnkType, err := child.childer.sd.childLinkType(slnk) + if err != nil { + return err + } + if lnkType == shardValueLink { // sub-shard with a single value element, collapse it - ds.childer.set(nchild, i) + ds.childer.setLink(slnk, i) } return nil } @@ -517,6 +535,8 @@ type childer struct { sd *Shard dserv ipld.DAGService bitfield bitfield.Bitfield + + // Only one of links/children will be non-nil for every child/link. links []*ipld.Link children []*Shard } @@ -572,6 +592,12 @@ func (s *childer) insert(key string, lnk *ipld.Link, idx int) error { func (s *childer) set(sd *Shard, i int) { s.children[i] = sd + s.links[i] = nil +} + +func (s *childer) setLink(lnk *ipld.Link, i int) { + s.children[i] = nil + s.links[i] = lnk } func (s *childer) rm(childIndex int) error { diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 4025bfb378..4d2f64b225 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -268,6 +268,45 @@ func TestRemoveElems(t *testing.T) { } } +func TestRemoveAfterMarshal(t *testing.T) { + ds := mdtest.Mock() + dirs, s, err := makeDir(ds, 500) + if err != nil { + t.Fatal(err) + } + nd, err := s.Node() + if err != nil { + t.Fatal(err) + } + + s, err = NewHamtFromDag(ds, nd) + + ctx := context.Background() + + shuffle(time.Now().UnixNano(), dirs) + + for i, d := range dirs { + err := s.Remove(ctx, d) + if err != nil { + t.Fatalf("%d/%d: %s", i, len(dirs), err) + } + } + + nd, err = s.Node() + if err != nil { + t.Fatal(err) + } + + if len(nd.Links()) > 0 { + t.Fatal("shouldnt have any links here") + } + + err = s.Remove(ctx, "doesnt exist") + if err != os.ErrNotExist { + t.Fatal("expected error does not exist") + } +} + func TestSetAfterMarshal(t *testing.T) { ds := mdtest.Mock() _, s, err := makeDir(ds, 300) From b3dd77e42e188dd0d78a8a62bff49810674d2ec7 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 14 Feb 2020 14:42:13 +0100 Subject: [PATCH 2820/3147] Update readme and license Fix copyright year and holder (Protocol Labs) in LICENSE file. Remove mentions of `gx` and fix link to travis in README file. This commit was moved from ipfs/go-ipfs-blockstore@14b16b1f455798a03a4aa63174d875408a9f4139 --- blockstore/LICENSE | 2 +- blockstore/README.md | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/blockstore/LICENSE b/blockstore/LICENSE index e4224df5b7..51d20a894e 100644 --- a/blockstore/LICENSE +++ b/blockstore/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 IPFS +Copyright (c) 2020 Protocol Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/blockstore/README.md b/blockstore/README.md index e634101839..f2cec94038 100644 --- a/blockstore/README.md +++ b/blockstore/README.md @@ -4,7 +4,7 @@ [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![GoDoc](https://godoc.org/github.com/ipfs/go-ipfs-blockstore?status.svg)](https://godoc.org/github.com/ipfs/go-ipfs-blockstore) -[![Build Status](https://travis-ci.org/ipfs/go-ipfs-blockstore.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-blockstore) +[![Build Status](https://travis-ci.com/ipfs/go-ipfs-blockstore.svg?branch=master)](https://travis-ci.com/ipfs/go-ipfs-blockstore) > go-ipfs-blockstore implements a thin wrapper over a datastore, giving a clean interface for Getting and Putting block objects. @@ -36,8 +36,6 @@ import "github.com/ipfs/go-ipfs-blockstore" Check the [GoDoc documentation](https://godoc.org/github.com/ipfs/go-ipfs-blockstore) -This module uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. You can use `make all` to build it with the `gx` dependencies. - ## Contribute PRs accepted. From da00d16bbdd0d855d54e375b7f4b7d317616fe31 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 14 Feb 2020 16:03:17 -0800 Subject: [PATCH 2821/3147] fix: don't hold the pin lock while updating pins fixes https://github.com/ipfs/go-ipfs/issues/6885 This commit was moved from ipfs/go-ipfs-pinner@f08a8a14c54c5d5d1579abceec052b15ecce15ce --- pinning/pinner/pin.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 7a3cabdf07..aa74c51854 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -526,7 +526,11 @@ func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error return fmt.Errorf("'from' cid was not recursively pinned already") } + // Temporarily unlock while we fetch the differences. + p.lock.Unlock() err := dagutils.DiffEnumerate(ctx, p.dserv, from, to) + p.lock.Lock() + if err != nil { return err } From fdc57115401d5713beb37cf79e4940a86dca4210 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Mon, 24 Feb 2020 16:28:22 -0500 Subject: [PATCH 2822/3147] Add test to maintain Put contract of calling Has first This commit was moved from ipfs/go-ipfs-blockstore@9a3ae2aa220739e8c9dda067069dbd965ee293b0 --- blockstore/blockstore_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index a165652f41..28f98e14a3 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -104,6 +104,38 @@ func TestPutThenGetSizeBlock(t *testing.T) { } } +type countHasDS struct { + ds.Datastore + hasCount int +} + +func (ds *countHasDS) Has(key ds.Key) (exists bool, err error) { + ds.hasCount += 1 + return ds.Datastore.Has(key) +} + +func TestPutUsesHas(t *testing.T) { + // Some datastores rely on the implementation detail that Put checks Has + // first, to avoid overriding existing objects' metadata. This test ensures + // that Blockstore continues to behave this way. + // Please ping https://github.com/ipfs/go-ipfs-blockstore/pull/47 if this + // behavior is being removed. + ds := &countHasDS{ + Datastore: ds.NewMapDatastore(), + } + bs := NewBlockstore(ds_sync.MutexWrap(ds)) + bl := blocks.NewBlock([]byte("some data")) + if err := bs.Put(bl); err != nil { + t.Fatal(err) + } + if err := bs.Put(bl); err != nil { + t.Fatal(err) + } + if ds.hasCount != 2 { + t.Errorf("Blockstore did not call Has before attempting Put, this breaks compatibility") + } +} + func TestHashOnRead(t *testing.T) { orginalDebug := u.Debug defer (func() { From 18e730c28ba8e34b653771c7dad2bb15e6684698 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 28 Feb 2020 08:07:15 -0500 Subject: [PATCH 2823/3147] Work with Multihashes directly (#21) This updates the filestore to work with raw multihashes instead of CIDs, aligning with the latest versions of go-ipfs-ds-help. Every block in the filestore should already be a raw multihash, however, since they were added as merkledag.RawNode, which is a Cidv1 of type Raw, and maps nicely to a raw multihash. Interfaces have been kept without change, but may be updated in the future to expose only Multihashes. This commit was moved from ipfs/go-filestore@c64f2798890d95a0c8e2641648a9454726fc9a73 --- filestore/filestore.go | 4 ++-- filestore/fsrefstore.go | 49 ++++++++++++++++++++++++----------------- filestore/util.go | 42 +++++++++++++++++++---------------- 3 files changed, 54 insertions(+), 41 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index be4d954beb..a9c36c5d30 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -19,7 +19,7 @@ import ( logging "github.com/ipfs/go-log" ) -var log = logging.Logger("filestore") +var logger = logging.Logger("filestore") var ErrFilestoreNotEnabled = errors.New("filestore is not enabled, see https://git.io/vNItf") var ErrUrlstoreNotEnabled = errors.New("urlstore is not enabled") @@ -86,7 +86,7 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // cant query leveldb concurrently b, err := f.fm.AllKeysChan(ctx) if err != nil { - log.Error("error querying filestore: ", err) + logger.Error("error querying filestore: ", err) return } diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 19927e0ef9..bc183fc38f 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -19,6 +19,7 @@ import ( blockstore "github.com/ipfs/go-ipfs-blockstore" dshelp "github.com/ipfs/go-ipfs-ds-help" posinfo "github.com/ipfs/go-ipfs-posinfo" + mh "github.com/multiformats/go-multihash" ) // FilestorePrefix identifies the key prefix for FileManager blocks. @@ -60,6 +61,8 @@ func NewFileManager(ds ds.Batching, root string) *FileManager { // AllKeysChan returns a channel from which to read the keys stored in // the FileManager. If the given context is cancelled the channel will be // closed. +// +// All CIDs returned are of type Raw. func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { q := dsq.Query{KeysOnly: true} @@ -78,14 +81,14 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { } k := ds.RawKey(v.Key) - c, err := dshelp.DsKeyToCid(k) + mhash, err := dshelp.DsKeyToMultihash(k) if err != nil { - log.Errorf("decoding cid from filestore: %s", err) + logger.Errorf("decoding cid from filestore: %s", err) continue } select { - case out <- c: + case out <- cid.NewCidV1(cid.Raw, mhash): case <-ctx.Done(): return } @@ -98,7 +101,7 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // DeleteBlock deletes the reference-block from the underlying // datastore. It does not touch the referenced data. func (f *FileManager) DeleteBlock(c cid.Cid) error { - err := f.ds.Delete(dshelp.CidToDsKey(c)) + err := f.ds.Delete(dshelp.MultihashToDsKey(c.Hash())) if err == ds.ErrNotFound { return blockstore.ErrNotFound } @@ -110,11 +113,11 @@ func (f *FileManager) DeleteBlock(c cid.Cid) error { // block from the datastore. The second step uses the stored // path and offsets to read the raw block data directly from disk. func (f *FileManager) Get(c cid.Cid) (blocks.Block, error) { - dobj, err := f.getDataObj(c) + dobj, err := f.getDataObj(c.Hash()) if err != nil { return nil, err } - out, err := f.readDataObj(c, dobj) + out, err := f.readDataObj(c.Hash(), dobj) if err != nil { return nil, err } @@ -127,22 +130,22 @@ func (f *FileManager) Get(c cid.Cid) (blocks.Block, error) { // This method may successfully return the size even if returning the block // would fail because the associated file is no longer available. func (f *FileManager) GetSize(c cid.Cid) (int, error) { - dobj, err := f.getDataObj(c) + dobj, err := f.getDataObj(c.Hash()) if err != nil { return -1, err } return int(dobj.GetSize_()), nil } -func (f *FileManager) readDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readDataObj(m mh.Multihash, d *pb.DataObj) ([]byte, error) { if IsURL(d.GetFilePath()) { - return f.readURLDataObj(c, d) + return f.readURLDataObj(m, d) } - return f.readFileDataObj(c, d) + return f.readFileDataObj(m, d) } -func (f *FileManager) getDataObj(c cid.Cid) (*pb.DataObj, error) { - o, err := f.ds.Get(dshelp.CidToDsKey(c)) +func (f *FileManager) getDataObj(m mh.Multihash) (*pb.DataObj, error) { + o, err := f.ds.Get(dshelp.MultihashToDsKey(m)) switch err { case ds.ErrNotFound: return nil, blockstore.ErrNotFound @@ -164,7 +167,7 @@ func unmarshalDataObj(data []byte) (*pb.DataObj, error) { return &dobj, nil } -func (f *FileManager) readFileDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readFileDataObj(m mh.Multihash, d *pb.DataObj) ([]byte, error) { if !f.AllowFiles { return nil, ErrFilestoreNotEnabled } @@ -193,12 +196,15 @@ func (f *FileManager) readFileDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) return nil, &CorruptReferenceError{StatusFileError, err} } - outcid, err := c.Prefix().Sum(outbuf) + // Work with CIDs for this, as they are a nice wrapper and things + // will not break if multihashes underlying types change. + origCid := cid.NewCidV1(cid.Raw, m) + outcid, err := origCid.Prefix().Sum(outbuf) if err != nil { return nil, err } - if !c.Equals(outcid) { + if !origCid.Equals(outcid) { return nil, &CorruptReferenceError{StatusFileChanged, fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())} } @@ -207,7 +213,7 @@ func (f *FileManager) readFileDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) } // reads and verifies the block from URL -func (f *FileManager) readURLDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readURLDataObj(m mh.Multihash, d *pb.DataObj) ([]byte, error) { if !f.AllowUrls { return nil, ErrUrlstoreNotEnabled } @@ -237,12 +243,15 @@ func (f *FileManager) readURLDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { } res.Body.Close() - outcid, err := c.Prefix().Sum(outbuf) + // Work with CIDs for this, as they are a nice wrapper and things + // will not break if multihashes underlying types change. + origCid := cid.NewCidV1(cid.Raw, m) + outcid, err := origCid.Prefix().Sum(outbuf) if err != nil { return nil, err } - if !c.Equals(outcid) { + if !origCid.Equals(outcid) { return nil, &CorruptReferenceError{StatusFileChanged, fmt.Errorf("data in file did not match. %s offset %d", d.GetFilePath(), d.GetOffset())} } @@ -255,7 +264,7 @@ func (f *FileManager) readURLDataObj(c cid.Cid, d *pb.DataObj) ([]byte, error) { func (f *FileManager) Has(c cid.Cid) (bool, error) { // NOTE: interesting thing to consider. Has doesnt validate the data. // So the data on disk could be invalid, and we could think we have it. - dsk := dshelp.CidToDsKey(c) + dsk := dshelp.MultihashToDsKey(c.Hash()) return f.ds.Has(dsk) } @@ -300,7 +309,7 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { return err } - return to.Put(dshelp.CidToDsKey(b.Cid()), data) + return to.Put(dshelp.MultihashToDsKey(b.Cid().Hash()), data) } // PutMany is like Put() but takes a slice of blocks instead, diff --git a/filestore/util.go b/filestore/util.go index bfb240c553..dc860f7352 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -11,6 +11,7 @@ import ( dsq "github.com/ipfs/go-datastore/query" blockstore "github.com/ipfs/go-ipfs-blockstore" dshelp "github.com/ipfs/go-ipfs-ds-help" + mh "github.com/multiformats/go-multihash" ) // Status is used to identify the state of the block data referenced @@ -86,7 +87,7 @@ func (r *ListRes) FormatLong(enc func(cid.Cid) string) string { // List does not verify that the reference is valid or whether the // raw data is accesible. See Verify(). func List(fs *Filestore, key cid.Cid) *ListRes { - return list(fs, false, key) + return list(fs, false, key.Hash()) } // ListAll returns a function as an iterator which, once invoked, returns @@ -105,7 +106,7 @@ func ListAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { // Verify makes sure that the reference is valid and the block data can be // read. func Verify(fs *Filestore, key cid.Cid) *ListRes { - return list(fs, true, key) + return list(fs, true, key.Hash()) } // VerifyAll returns a function as an iterator which, once invoked, @@ -119,7 +120,7 @@ func VerifyAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { return listAll(fs, true) } -func list(fs *Filestore, verify bool, key cid.Cid) *ListRes { +func list(fs *Filestore, verify bool, key mh.Multihash) *ListRes { dobj, err := fs.fm.getDataObj(key) if err != nil { return mkListRes(key, nil, err) @@ -138,34 +139,34 @@ func listAll(fs *Filestore, verify bool) (func() *ListRes, error) { } return func() *ListRes { - cid, dobj, err := next(qr) + mhash, dobj, err := next(qr) if dobj == nil && err == nil { return nil } else if err == nil && verify { - _, err = fs.fm.readDataObj(cid, dobj) + _, err = fs.fm.readDataObj(mhash, dobj) } - return mkListRes(cid, dobj, err) + return mkListRes(mhash, dobj, err) }, nil } -func next(qr dsq.Results) (cid.Cid, *pb.DataObj, error) { +func next(qr dsq.Results) (mh.Multihash, *pb.DataObj, error) { v, ok := qr.NextSync() if !ok { - return cid.Cid{}, nil, nil + return nil, nil, nil } k := ds.RawKey(v.Key) - c, err := dshelp.DsKeyToCid(k) + mhash, err := dshelp.DsKeyToMultihash(k) if err != nil { - return cid.Cid{}, nil, fmt.Errorf("decoding cid from filestore: %s", err) + return nil, nil, fmt.Errorf("decoding multihash from filestore: %s", err) } dobj, err := unmarshalDataObj(v.Value) if err != nil { - return c, nil, err + return mhash, nil, err } - return c, dobj, nil + return mhash, dobj, nil } func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { @@ -206,12 +207,12 @@ func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { } v := entries[i] i++ - // attempt to convert the datastore key to a CID, + // attempt to convert the datastore key to a Multihash, // store the error but don't use it yet - cid, keyErr := dshelp.DsKeyToCid(ds.RawKey(v.dsKey)) + mhash, keyErr := dshelp.DsKeyToMultihash(ds.RawKey(v.dsKey)) // first if they listRes already had an error return that error if v.err != nil { - return mkListRes(cid, nil, v.err) + return mkListRes(mhash, nil, v.err) } // now reconstruct the DataObj dobj := pb.DataObj{ @@ -222,14 +223,14 @@ func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { // now if we could not convert the datastore key return that // error if keyErr != nil { - return mkListRes(cid, &dobj, keyErr) + return mkListRes(mhash, &dobj, keyErr) } // finally verify the dataobj if requested var err error if verify { - _, err = fs.fm.readDataObj(cid, &dobj) + _, err = fs.fm.readDataObj(mhash, &dobj) } - return mkListRes(cid, &dobj, err) + return mkListRes(mhash, &dobj, err) }, nil } @@ -255,7 +256,7 @@ func (l listEntries) Less(i, j int) bool { return l[i].filePath < l[j].filePath } -func mkListRes(c cid.Cid, d *pb.DataObj, err error) *ListRes { +func mkListRes(m mh.Multihash, d *pb.DataObj, err error) *ListRes { status := StatusOk errorMsg := "" if err != nil { @@ -268,6 +269,9 @@ func mkListRes(c cid.Cid, d *pb.DataObj, err error) *ListRes { } errorMsg = err.Error() } + + c := cid.NewCidV1(cid.Raw, m) + if d == nil { return &ListRes{ Status: status, From e84cc0569818ce3b28ff7ea27b5077fe17232163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Fri, 29 Nov 2019 22:33:13 +0100 Subject: [PATCH 2824/3147] pin: add a IsPinned method This commit was moved from ipfs/interface-go-ipfs-core@c82db2ef2270a228185aaba6b08ecd7157a7ebee --- coreiface/options/pin.go | 184 +++++++++++++++++++++++++++++++-------- coreiface/pin.go | 4 + coreiface/tests/pin.go | 95 ++++++++++++++++++-- 3 files changed, 237 insertions(+), 46 deletions(-) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 6b211bb73b..231f0d11a8 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -1,13 +1,23 @@ package options +import "fmt" + type PinAddSettings struct { Recursive bool } +type TypeSettings struct { + Type string +} + type PinLsSettings struct { Type string } +type PinIsPinnedSettings struct { + WithType string +} + // PinRmSettings represents the settings of pin rm command type PinRmSettings struct { Recursive bool @@ -17,13 +27,19 @@ type PinUpdateSettings struct { Unpin bool } +// PinAddOption pin add option func type PinAddOption func(*PinAddSettings) error +// PinLsOption pin ls option func +type PinLsOption func(*PinLsSettings) error + +// PinIsPinnedOption pin isPinned option func +type PinIsPinnedOption func(*PinIsPinnedSettings) error + // PinRmOption pin rm option func type PinRmOption func(*PinRmSettings) error -// PinLsOption pin ls option func -type PinLsOption func(*PinLsSettings) error +// PinUpdateOption pin update option func type PinUpdateOption func(*PinUpdateSettings) error func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { @@ -41,14 +57,14 @@ func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { return options, nil } -// PinRmOptions pin rm options -func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) { - options := &PinRmSettings{ - Recursive: true, +func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { + options := &PinLsSettings{ + Type: "all", } for _, opt := range opts { - if err := opt(options); err != nil { + err := opt(options) + if err != nil { return nil, err } } @@ -56,9 +72,9 @@ func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) { return options, nil } -func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { - options := &PinLsSettings{ - Type: "all", +func PinIsPinnedOptions(opts ...PinIsPinnedOption) (*PinIsPinnedSettings, error) { + options := &PinIsPinnedSettings{ + WithType: "all", } for _, opt := range opts { @@ -71,6 +87,21 @@ func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { return options, nil } +// PinRmOptions pin rm options +func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) { + options := &PinRmSettings{ + Recursive: true, + } + + for _, opt := range opts { + if err := opt(options); err != nil { + return nil, err + } + } + + return options, nil +} + func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, error) { options := &PinUpdateSettings{ Unpin: true, @@ -86,36 +117,131 @@ func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, error) { return options, nil } -type pinType struct{} - type pinOpts struct { - Type pinType + Ls pinLsOpts + IsPinned pinIsPinnedOpts } var Pin pinOpts +type pinLsOpts struct{} + // All is an option for Pin.Ls which will make it return all pins. It is // the default -func (pinType) All() PinLsOption { - return Pin.pinType("all") +func (pinLsOpts) All() PinLsOption { + return Pin.Ls.pinType("all") } // Recursive is an option for Pin.Ls which will make it only return recursive // pins -func (pinType) Recursive() PinLsOption { - return Pin.pinType("recursive") +func (pinLsOpts) Recursive() PinLsOption { + return Pin.Ls.pinType("recursive") } // Direct is an option for Pin.Ls which will make it only return direct (non // recursive) pins -func (pinType) Direct() PinLsOption { - return Pin.pinType("direct") +func (pinLsOpts) Direct() PinLsOption { + return Pin.Ls.pinType("direct") } // Indirect is an option for Pin.Ls which will make it only return indirect pins // (objects referenced by other recursively pinned objects) -func (pinType) Indirect() PinLsOption { - return Pin.pinType("indirect") +func (pinLsOpts) Indirect() PinLsOption { + return Pin.Ls.pinType("indirect") +} + +// Type is an option for Pin.Ls which will make it only return pins of the given +// type. +// +// Supported values: +// * "direct" - directly pinned objects +// * "recursive" - roots of recursive pins +// * "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// * "all" - all pinned objects (default) +func (pinLsOpts) Type(typeStr string) (PinLsOption, error) { + switch typeStr { + case "all", "direct", "indirect", "recursive": + return Pin.Ls.pinType(typeStr), nil + default: + return nil, fmt.Errorf("invalid type '%s', must be one of {direct, indirect, recursive, all}", typeStr) + } +} + +// pinType is an option for Pin.Ls which allows to specify which pin types should +// be returned +// +// Supported values: +// * "direct" - directly pinned objects +// * "recursive" - roots of recursive pins +// * "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// * "all" - all pinned objects (default) +func (pinLsOpts) pinType(t string) PinLsOption { + return func(settings *PinLsSettings) error { + settings.Type = t + return nil + } +} + +type pinIsPinnedOpts struct{} + +// All is an option for Pin.IsPinned which will make it search in all type of pins. +// It is the default +func (pinIsPinnedOpts) All() PinIsPinnedOption { + return Pin.IsPinned.pinType("all") +} + +// Recursive is an option for Pin.IsPinned which will make it only search in +// recursive pins +func (pinIsPinnedOpts) Recursive() PinIsPinnedOption { + return Pin.IsPinned.pinType("recursive") +} + +// Direct is an option for Pin.IsPinned which will make it only search in direct +// (non recursive) pins +func (pinIsPinnedOpts) Direct() PinIsPinnedOption { + return Pin.IsPinned.pinType("direct") +} + +// Indirect is an option for Pin.IsPinned which will make it only search indirect +// pins (objects referenced by other recursively pinned objects) +func (pinIsPinnedOpts) Indirect() PinIsPinnedOption { + return Pin.IsPinned.pinType("indirect") +} + +// Type is an option for Pin.IsPinned which will make it only search pins of the given +// type. +// +// Supported values: +// * "direct" - directly pinned objects +// * "recursive" - roots of recursive pins +// * "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// * "all" - all pinned objects (default) +func (pinIsPinnedOpts) Type(typeStr string) (PinIsPinnedOption, error) { + switch typeStr { + case "all", "direct", "indirect", "recursive": + return Pin.IsPinned.pinType(typeStr), nil + default: + return nil, fmt.Errorf("invalid type '%s', must be one of {direct, indirect, recursive, all}", typeStr) + } +} + +// pinType is an option for Pin.IsPinned which allows to specify which pin type the given +// pin is expected to be, speeding up the research. +// +// Supported values: +// * "direct" - directly pinned objects +// * "recursive" - roots of recursive pins +// * "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// * "all" - all pinned objects (default) +func (pinIsPinnedOpts) pinType(t string) PinIsPinnedOption { + return func(settings *PinIsPinnedSettings) error { + settings.WithType = t + return nil + } } // Recursive is an option for Pin.Add which specifies whether to pin an entire @@ -137,22 +263,6 @@ func (pinOpts) RmRecursive(recursive bool) PinRmOption { } } -// Type is an option for Pin.Ls which allows to specify which pin types should -// be returned -// -// Supported values: -// * "direct" - directly pinned objects -// * "recursive" - roots of recursive pins -// * "indirect" - indirectly pinned objects (referenced by recursively pinned -// objects) -// * "all" - all pinned objects (default) -func (pinOpts) pinType(t string) PinLsOption { - return func(settings *PinLsSettings) error { - settings.Type = t - return nil - } -} - // Unpin is an option for Pin.Update which specifies whether to remove the old pin. // Default is true. func (pinOpts) Unpin(unpin bool) PinUpdateOption { diff --git a/coreiface/pin.go b/coreiface/pin.go index 27f9355d39..4c1788c682 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -46,6 +46,10 @@ type PinAPI interface { // Ls returns list of pinned objects on this node Ls(context.Context, ...options.PinLsOption) (<-chan Pin, error) + // IsPinned returns whether or not the given cid is pinned + // and an explanation of why its pinned + IsPinned(context.Context, path.Path, ...options.PinIsPinnedOption) (string, bool, error) + // Rm removes pin for object specified by the path Rm(context.Context, path.Path, ...options.PinRmOption) error diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 58e8120842..e16d6460bd 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -28,6 +28,7 @@ func (tp *TestSuite) TestPin(t *testing.T) { t.Run("TestPinRecursive", tp.TestPinRecursive) t.Run("TestPinLsIndirect", tp.TestPinLsIndirect) t.Run("TestPinLsPrecedence", tp.TestPinLsPrecedence) + t.Run("TestPinIsPinned", tp.TestPinIsPinned) } func (tp *TestSuite) TestPinAdd(t *testing.T) { @@ -84,6 +85,8 @@ func (tp *TestSuite) TestPinSimple(t *testing.T) { t.Error("unexpected pin type") } + assertIsPinned(t, ctx, api, p, "recursive") + err = api.Pin().Rm(ctx, p) if err != nil { t.Fatal(err) @@ -150,7 +153,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Direct())) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Ls.Direct())) if err != nil { t.Fatal(err) } @@ -163,7 +166,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpfsPath(nd3.Cid()).String()) } - list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Recursive())) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Ls.Recursive())) if err != nil { t.Fatal(err) } @@ -176,7 +179,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpldPath(nd2.Cid()).String()) } - list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Indirect())) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Ls.Indirect())) if err != nil { t.Fatal(err) } @@ -360,6 +363,39 @@ func (tp *TestSuite) TestPinLsPrecedenceRecursiveDirect(t *testing.T) { assertPinTypes(t, ctx, api, []cidContainer{grandparent, parent}, []cidContainer{}, []cidContainer{leaf}) } +func (tp *TestSuite) TestPinIsPinned(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + leaf, parent, grandparent := getThreeChainedNodes(t, ctx, api, "foofoo") + + assertNotPinned(t, ctx, api, path.IpldPath(grandparent.Cid())) + assertNotPinned(t, ctx, api, path.IpldPath(parent.Cid())) + assertNotPinned(t, ctx, api, path.IpldPath(leaf.Cid())) + + err = api.Pin().Add(ctx, path.IpldPath(parent.Cid()), opt.Pin.Recursive(true)) + if err != nil { + t.Fatal(err) + } + + assertNotPinned(t, ctx, api, path.IpldPath(grandparent.Cid())) + assertIsPinned(t, ctx, api, path.IpldPath(parent.Cid()), "recursive") + assertIsPinned(t, ctx, api, path.IpldPath(leaf.Cid()), "indirect") + + err = api.Pin().Add(ctx, path.IpldPath(grandparent.Cid()), opt.Pin.Recursive(false)) + if err != nil { + t.Fatal(err) + } + + assertIsPinned(t, ctx, api, path.IpldPath(grandparent.Cid()), "direct") + assertIsPinned(t, ctx, api, path.IpldPath(parent.Cid()), "recursive") + assertIsPinned(t, ctx, api, path.IpldPath(leaf.Cid()), "indirect") +} + type cidContainer interface { Cid() cid.Cid } @@ -390,21 +426,21 @@ func getThreeChainedNodes(t *testing.T, ctx context.Context, api iface.CoreAPI, func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI, recusive, direct, indirect []cidContainer) { assertPinLsAllConsistency(t, ctx, api) - list, err := accPins(api.Pin().Ls(ctx, opt.Pin.Type.Recursive())) + list, err := accPins(api.Pin().Ls(ctx, opt.Pin.Ls.Recursive())) if err != nil { t.Fatal(err) } assertPinCids(t, list, recusive...) - list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Direct())) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Ls.Direct())) if err != nil { t.Fatal(err) } assertPinCids(t, list, direct...) - list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Indirect())) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Ls.Indirect())) if err != nil { t.Fatal(err) } @@ -466,9 +502,9 @@ func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.Core all, recursive, direct, indirect := cid.NewSet(), cid.NewSet(), cid.NewSet(), cid.NewSet() typeMap := map[string]*pinTypeProps{ - "recursive": {recursive, opt.Pin.Type.Recursive()}, - "direct": {direct, opt.Pin.Type.Direct()}, - "indirect": {indirect, opt.Pin.Type.Indirect()}, + "recursive": {recursive, opt.Pin.Ls.Recursive()}, + "direct": {direct, opt.Pin.Ls.Direct()}, + "indirect": {indirect, opt.Pin.Ls.Indirect()}, } for _, p := range allPins { @@ -506,6 +542,47 @@ func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.Core } } +func assertIsPinned(t *testing.T, ctx context.Context, api iface.CoreAPI, p path.Path, typeStr string) { + t.Helper() + withType, err := opt.Pin.IsPinned.Type(typeStr) + if err != nil { + panic("unhandled pin type") + } + + whyPinned, pinned, err := api.Pin().IsPinned(ctx, p, withType) + if err != nil { + t.Fatal(err) + } + + if !pinned { + t.Fatalf("%s expected to be pinned with type %s", p, typeStr) + } + + switch typeStr { + case "recursive", "direct": + if typeStr != whyPinned { + t.Fatalf("reason for pinning expected to be %s for %s, got %s", typeStr, p, whyPinned) + } + case "indirect": + if whyPinned == "" { + t.Fatalf("expected to have a pin reason for %s", p) + } + } +} + +func assertNotPinned(t *testing.T, ctx context.Context, api iface.CoreAPI, p path.Path) { + t.Helper() + + _, pinned, err := api.Pin().IsPinned(ctx, p) + if err != nil { + t.Fatal(err) + } + + if pinned { + t.Fatalf("%s expected to not be pinned", p) + } +} + func accPins(pins <-chan iface.Pin, err error) ([]iface.Pin, error) { if err != nil { return nil, err From 8e9335f4dff739dffb7b0d8a7a7ba4fb60b4bb48 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 21 Aug 2019 19:25:07 -0700 Subject: [PATCH 2825/3147] resolve: kill off buggy resolve function This resolve function assumed that all paths were of the same type (ipfs, ipld, etc.). The CoreAPI does a much better job. This commit was moved from ipfs/go-namesys@569472a15f20261ebd82e4f910483bb19ec4b693 --- namesys/resolve/pathresolver_test.go | 32 ---------------------------- namesys/resolve/resolve.go | 15 ------------- 2 files changed, 47 deletions(-) delete mode 100644 namesys/resolve/pathresolver_test.go diff --git a/namesys/resolve/pathresolver_test.go b/namesys/resolve/pathresolver_test.go deleted file mode 100644 index 3d9c04fa2f..0000000000 --- a/namesys/resolve/pathresolver_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package resolve_test - -import ( - "testing" - - coremock "github.com/ipfs/go-ipfs/core/mock" - "github.com/ipfs/go-ipfs/namesys/resolve" - - path "github.com/ipfs/go-path" -) - -func TestResolveNoComponents(t *testing.T) { - n, err := coremock.NewMockNode() - if n == nil || err != nil { - t.Fatal("Should have constructed a mock node", err) - } - - _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipns/")) - if err.Error() != "invalid path \"/ipns/\": ipns path missing IPNS ID" { - t.Error("Should error with no components (/ipns/).", err) - } - - _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/ipfs/")) - if err.Error() != "invalid path \"/ipfs/\": not enough path components" { - t.Error("Should error with no components (/ipfs/).", err) - } - - _, err = resolve.Resolve(n.Context(), n.Namesys, n.Resolver, path.Path("/../..")) - if err.Error() != "invalid path \"/../..\": unknown namespace \"..\"" { - t.Error("Should error with invalid path.", err) - } -} diff --git a/namesys/resolve/resolve.go b/namesys/resolve/resolve.go index 5b5dc515ef..f838a6611f 100644 --- a/namesys/resolve/resolve.go +++ b/namesys/resolve/resolve.go @@ -6,9 +6,7 @@ import ( "fmt" "strings" - "github.com/ipfs/go-ipld-format" "github.com/ipfs/go-path" - "github.com/ipfs/go-path/resolver" "github.com/ipfs/go-ipfs/namesys" ) @@ -52,16 +50,3 @@ func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (pat } return p, nil } - -// Resolve resolves the given path by parsing out protocol-specific -// entries (e.g. /ipns/) and then going through the /ipfs/ -// entries and returning the final node. -func Resolve(ctx context.Context, nsys namesys.NameSystem, r *resolver.Resolver, p path.Path) (format.Node, error) { - p, err := ResolveIPNS(ctx, nsys, p) - if err != nil { - return nil, err - } - - // ok, we have an IPFS path now (or what we'll treat as one) - return r.ResolvePath(ctx, p) -} From bbaa90441b1edab9cbd90d2c76b3213ff31dd63e Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Tue, 3 Mar 2020 15:34:20 +0000 Subject: [PATCH 2826/3147] test: add Directory.ListNames test This commit was moved from ipfs/go-mfs@94b7a85ab56f7ad7d02c74b14b01f55c6b7a4dbb --- mfs/mfs_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 81c63f95cb..3c08fd9a6b 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -620,6 +620,48 @@ func TestMfsFile(t *testing.T) { } } +func TestMfsDirListNames(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ds, rt := setupRoot(ctx, t) + + rootdir := rt.GetDirectory() + + rand.Seed(time.Now().UTC().UnixNano()) + + total := rand.Intn(10) + 1 + fNames := make([]string, 0, total) + + for i := 0; i < total; i++ { + fn := randomName() + fNames = append(fNames, fn) + nd := getRandFile(t, ds, rand.Int63n(1000)+1) + err := rootdir.AddChild(fn, nd) + if err != nil { + t.Fatal(err) + } + } + + list, err := rootdir.ListNames(ctx) + + if err != nil { + t.Fatal(err) + } + + for _, lName := range list { + found := false + for _, fName := range fNames { + if lName == fName { + found = true + break + } + } + if !found { + t.Fatal(lName + " not found in directory listing") + } + } +} + func randomWalk(d *Directory, n int) (*Directory, error) { for i := 0; i < n; i++ { dirents, err := d.List(context.Background()) From 3dd2e4c9896909bf40232306531865d62334fb3d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 11 Mar 2020 17:01:08 -0700 Subject: [PATCH 2827/3147] fix: handle query errors If we successfully start a query but get an error when reading an entry from the query, return it and don't try to delete an empty key. This commit was moved from ipfs/go-ipfs-provider@d444d40e596a117ebe857775c083cbb635914d55 --- provider/queue/queue.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/provider/queue/queue.go b/provider/queue/queue.go index ddaa97582e..da110ce804 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -132,7 +132,7 @@ func (q *Queue) work() { }() } -func (q *Queue) getQueueHead() (*query.Result, error) { +func (q *Queue) getQueueHead() (*query.Entry, error) { qry := query.Query{Orders: []query.Order{query.OrderByKey{}}, Limit: 1} results, err := q.ds.Query(qry) if err != nil { @@ -144,5 +144,5 @@ func (q *Queue) getQueueHead() (*query.Result, error) { return nil, nil } - return &r, nil + return &r.Entry, r.Error } From d882497aedc6022382e6d042c1630c99c77e894c Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 11 Mar 2020 17:03:57 -0700 Subject: [PATCH 2828/3147] nit: rename e to err This commit was moved from ipfs/go-ipfs-provider@de3bf42b2c74c9074134f1527cabc72dc1ddc467 --- provider/queue/queue.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/provider/queue/queue.go b/provider/queue/queue.go index da110ce804..b13f38b209 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -80,17 +80,17 @@ func (q *Queue) work() { for { if c == cid.Undef { - head, e := q.getQueueHead() + head, err := q.getQueueHead() - if e != nil { - log.Errorf("error querying for head of queue: %s, stopping provider", e) + if err != nil { + log.Errorf("error querying for head of queue: %s, stopping provider", err) return } else if head != nil { k = datastore.NewKey(head.Key) - c, e = cid.Parse(head.Value) - if e != nil { - log.Warningf("error parsing queue entry cid with key (%s), removing it from queue: %s", head.Key, e) - err := q.ds.Delete(k) + c, err = cid.Parse(head.Value) + if err != nil { + log.Warningf("error parsing queue entry cid with key (%s), removing it from queue: %s", head.Key, err) + err = q.ds.Delete(k) if err != nil { log.Errorf("error deleting queue entry with key (%s), due to error (%s), stopping provider", head.Key, err) return From 3925c35b2a3eb156e06cd993fb2c34c200fc1dc8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 11 Mar 2020 17:13:31 -0700 Subject: [PATCH 2829/3147] feat: return errors from enqueue This commit was moved from ipfs/go-ipfs-provider@c835ad80d441cbe8467f385973110d879b064115 --- provider/queue/queue.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/provider/queue/queue.go b/provider/queue/queue.go index b13f38b209..2c33502563 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -56,10 +56,12 @@ func (q *Queue) Close() error { } // Enqueue puts a cid in the queue -func (q *Queue) Enqueue(cid cid.Cid) { +func (q *Queue) Enqueue(cid cid.Cid) error { select { case q.enqueue <- cid: + return nil case <-q.ctx.Done(): + return fmt.Errorf("failed to enqueue CID: shutting down") } } @@ -75,6 +77,11 @@ func (q *Queue) work() { var c cid.Cid = cid.Undef defer func() { + // also cancels any in-progess enqueue tasks. + q.close() + // unblocks anyone waiting + close(q.dequeue) + // unblocks the close call close(q.closed) }() From 0479ddbb6d5df0a7f10020d0976bd2bbb388ec1d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 11 Mar 2020 18:58:04 -0700 Subject: [PATCH 2830/3147] fix: return errors from the provider This commit was moved from ipfs/go-ipfs-provider@056b8b666d8035e93b3bf7af29dde0f5e6df6774 --- provider/simple/provider.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index 3993d45090..f421f6195a 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -64,8 +64,7 @@ func NewProvider(ctx context.Context, queue *q.Queue, contentRouting routing.Con // Close stops the provider func (p *Provider) Close() error { - p.queue.Close() - return nil + return p.queue.Close() } // Run workers to handle provide requests. @@ -75,8 +74,7 @@ func (p *Provider) Run() { // Provide the given cid using specified strategy. func (p *Provider) Provide(root cid.Cid) error { - p.queue.Enqueue(root) - return nil + return p.queue.Enqueue(root) } // Handle all outgoing cids by providing (announcing) them From 3783ec8d18ebee58c7488a3f54fe66112f0fc886 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Sat, 7 Mar 2020 01:56:48 +0100 Subject: [PATCH 2831/3147] feat: IPFS_NS_MAP Allows static DNSLink mappings with IPFS_NS_MAP. License: MIT Signed-off-by: Marcin Rataj This commit was moved from ipfs/go-namesys@cb01c11cb0b115f3ed3c66c2588d1b3605cb8f91 --- namesys/cache.go | 8 ++++++++ namesys/namesys.go | 25 +++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/namesys/cache.go b/namesys/cache.go index 4a5cb5113a..a0029829d3 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -7,6 +7,14 @@ import ( ) func (ns *mpns) cacheGet(name string) (path.Path, bool) { + // existence of optional mapping defined via IPFS_NS_MAP is checked first + if ns.staticMap != nil { + val, ok := ns.staticMap[name] + if ok { + return val, true + } + } + if ns.cache == nil { return "", false } diff --git a/namesys/namesys.go b/namesys/namesys.go index 079eecccc0..11f4646f17 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -2,6 +2,7 @@ package namesys import ( "context" + "os" "strings" "time" @@ -29,25 +30,45 @@ type mpns struct { dnsResolver, proquintResolver, ipnsResolver resolver ipnsPublisher Publisher - cache *lru.Cache + staticMap map[string]path.Path + cache *lru.Cache } // NewNameSystem will construct the IPFS naming system based on Routing func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSystem { - var cache *lru.Cache + var ( + cache *lru.Cache + staticMap map[string]path.Path + ) if cachesize > 0 { cache, _ = lru.New(cachesize) } + // Prewarm namesys cache with static records for deteministic tests and debugging. + // Useful for testing things like DNSLink without real DNS lookup. + // Example: + // IPFS_NS_MAP="dnslink-test.example.com:/ipfs/bafkreicysg23kiwv34eg2d7qweipxwosdo2py4ldv42nbauguluen5v6am" + if list := os.Getenv("IPFS_NS_MAP"); list != "" { + staticMap = make(map[string]path.Path) + for _, pair := range strings.Split(list, ",") { + mapping := strings.SplitN(pair, ":", 2) + key := mapping[0] + value := path.FromString(mapping[1]) + staticMap[key] = value + } + } + return &mpns{ dnsResolver: NewDNSResolver(), proquintResolver: new(ProquintResolver), ipnsResolver: NewIpnsResolver(r), ipnsPublisher: NewIpnsPublisher(r, ds), + staticMap: staticMap, cache: cache, } } +// DefaultResolverCacheTTL defines max ttl of a record placed in namesys cache. const DefaultResolverCacheTTL = time.Minute // Resolve implements Resolver. From 6cd6774d63e9296021bb967e593f70028f1608df Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Thu, 14 Mar 2019 17:21:38 -0700 Subject: [PATCH 2832/3147] feat(gateway): subdomain and proxy gateway License: MIT Signed-off-by: Marcin Rataj This commit was moved from ipfs/go-namesys@eda5b9a8ec17e8433876772fc002661b015ffe1d --- namesys/namesys.go | 23 ++++++++++++++++++++--- namesys/namesys_test.go | 14 +++++++++----- namesys/routing.go | 1 + 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 11f4646f17..a486b83b8a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -2,11 +2,13 @@ package namesys import ( "context" + "fmt" "os" "strings" "time" lru "github.com/hashicorp/golang-lru" + cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" @@ -14,7 +16,6 @@ import ( ci "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" routing "github.com/libp2p/go-libp2p-core/routing" - mh "github.com/multiformats/go-multihash" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. @@ -133,12 +134,28 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. } // Resolver selection: - // 1. if it is a multihash resolve through "ipns". + // 1. if it is a PeerID/CID/multihash resolve through "ipns". // 2. if it is a domain name, resolve through "dns" // 3. otherwise resolve through the "proquint" resolver var res resolver - if _, err := mh.FromB58String(key); err == nil { + _, err := peer.Decode(key) + + // CIDs in IPNS are expected to have libp2p-key multicodec + // We ease the transition by returning a more meaningful error with a valid CID + if err != nil && err.Error() == "can't convert CID of type protobuf to a peer ID" { + ipnsCid, cidErr := cid.Decode(key) + if cidErr == nil && ipnsCid.Version() == 1 && ipnsCid.Type() != cid.Libp2pKey { + fixedCid := cid.NewCidV1(cid.Libp2pKey, ipnsCid.Hash()).String() + codecErr := fmt.Errorf("peer ID represented as CIDv1 require libp2p-key multicodec: retry with /ipns/%s", fixedCid) + log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", key, codecErr) + out <- onceResult{err: codecErr} + close(out) + return out + } + } + + if err == nil { res = ns.ipnsResolver } else if isd.IsDomain(key) { res = ns.dnsResolver diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index a0ffbc50d8..b3e963c9e9 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -11,7 +11,7 @@ import ( offroute "github.com/ipfs/go-ipfs-routing/offline" ipns "github.com/ipfs/go-ipns" path "github.com/ipfs/go-path" - "github.com/ipfs/go-unixfs" + unixfs "github.com/ipfs/go-unixfs" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ci "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" @@ -49,10 +49,12 @@ func (r *mockResolver) resolveOnceAsync(ctx context.Context, name string, option func mockResolverOne() *mockResolver { return &mockResolver{ entries: map[string]string{ - "QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy": "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", - "QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n": "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", - "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD": "/ipns/ipfs.io", - "QmQ4QZh8nrsczdUEwTyfBope4THUhqxqc1fx6qYhhzZQei": "/ipfs/QmP3ouCnU8NNLsW6261pAx2pNLV2E4dQoisB1sgda12Act", + "QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy": "/ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj", + "QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n": "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", + "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD": "/ipns/ipfs.io", + "QmQ4QZh8nrsczdUEwTyfBope4THUhqxqc1fx6qYhhzZQei": "/ipfs/QmP3ouCnU8NNLsW6261pAx2pNLV2E4dQoisB1sgda12Act", + "12D3KooWFB51PRY9BxcXSH6khFXw1BZeszeLDy7C8GciskqCTZn5": "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", // ed25519+identity multihash + "bafzbeickencdqw37dpz3ha36ewrh4undfjt2do52chtcky4rxkj447qhdm": "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", // cidv1 in base32 with libp2p-key multicodec }, } } @@ -82,6 +84,8 @@ func TestNamesysResolution(t *testing.T) { testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 1, "/ipns/ipfs.io", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 2, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) testResolution(t, r, "/ipns/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", 3, "/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy", ErrResolveRecursion) + testResolution(t, r, "/ipns/12D3KooWFB51PRY9BxcXSH6khFXw1BZeszeLDy7C8GciskqCTZn5", 1, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) + testResolution(t, r, "/ipns/bafzbeickencdqw37dpz3ha36ewrh4undfjt2do52chtcky4rxkj447qhdm", 1, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) } func TestPublishWithCache0(t *testing.T) { diff --git a/namesys/routing.go b/namesys/routing.go index c2d0d0252d..60928fbca6 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -59,6 +59,7 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option } name = strings.TrimPrefix(name, "/ipns/") + pid, err := peer.Decode(name) if err != nil { log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", name, err) From 14036889a512255bf88cf4d0091a65a118b89c69 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 23 Mar 2020 10:56:47 -0700 Subject: [PATCH 2833/3147] doc: fix ci badge in readme This commit was moved from ipfs/go-blockservice@3e11d014808d1708861fbfa7b86bf9977661e96f --- blockservice/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/README.md b/blockservice/README.md index 11d814af23..d36c5cc779 100644 --- a/blockservice/README.md +++ b/blockservice/README.md @@ -5,7 +5,7 @@ go-blockservice [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) [![Coverage Status](https://codecov.io/gh/ipfs/go-block-format/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/go-block-format/branch/master) -[![Travis CI](https://travis-ci.com/ipfs/go-blockservice.svg?branch=master)](https://travis-ci.com/ipfs/go-blockservice) +[![Build Status](https://circleci.com/gh/ipfs/go-blockservice.svg?style=svg)](https://circleci.com/gh/ipfs/go-blockservice) > go-blockservice provides a seamless interface to both local and remote storage backends. From af6b9cf84555d9e0d7db46a2b33e973f321998a3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 23 Mar 2020 11:00:16 -0700 Subject: [PATCH 2834/3147] chore: fix lint This commit was moved from ipfs/go-blockservice@2bb639009da8f1c8f2ec7e806751869ce01a7ab6 --- blockservice/blockservice_test.go | 21 ++++++++++++++++----- blockservice/test/blocks_test.go | 5 ++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index a94b672cfe..dfd12fc437 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -26,12 +26,18 @@ func TestWriteThroughWorks(t *testing.T) { block := bgen.Next() t.Logf("PutCounter: %d", bstore.PutCounter) - bserv.AddBlock(block) + err := bserv.AddBlock(block) + if err != nil { + t.Fatal(err) + } if bstore.PutCounter != 1 { t.Fatalf("expected just one Put call, have: %d", bstore.PutCounter) } - bserv.AddBlock(block) + err = bserv.AddBlock(block) + if err != nil { + t.Fatal(err) + } if bstore.PutCounter != 2 { t.Fatalf("Put should have called again, should be 2 is: %d", bstore.PutCounter) } @@ -52,10 +58,15 @@ func TestLazySessionInitialization(t *testing.T) { bgen := butil.NewBlockGenerator() block := bgen.Next() - bstore.Put(block) - + err := bstore.Put(block) + if err != nil { + t.Fatal(err) + } block2 := bgen.Next() - session.HasBlock(block2) + err = session.HasBlock(block2) + if err != nil { + t.Fatal(err) + } bsession := NewSession(ctx, bservSessEx) if bsession.ses != nil { diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index 95f552d21e..ee808e66e8 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -74,7 +74,10 @@ func TestGetBlocksSequential(t *testing.T) { var cids []cid.Cid for _, o := range objs { cids = append(cids, o.Cid()) - servs[0].AddBlock(o) + err := servs[0].AddBlock(o) + if err != nil { + t.Fatal(err) + } } t.Log("one instance at a time, get blocks concurrently") From 7402ad31097cee61e1a59469bf82b0081e9170b3 Mon Sep 17 00:00:00 2001 From: Adam Uhlir Date: Thu, 21 Feb 2019 11:53:44 -0800 Subject: [PATCH 2835/3147] Introducing EncodedFSKeystore with base32 encoding (#5947) Encoding the key's filename with base32 introduces coherent behaviour across different platforms and their case-sensitive/case-insensitive file-systems. Moreover it allows wider character set to be used for the name of the keys as the original restriction for special FS's characters (e.g. '/', '.') will not apply. License: MIT Signed-off-by: Adam Uhlir This commit was moved from ipfs/go-ipfs-keystore@5598f9ff89833ecb394d3fff85dce63c01007eb4 --- keystore/keystore.go | 120 ++++++++++++++++++++++++++++++++++++++ keystore/keystore_test.go | 89 ++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+) diff --git a/keystore/keystore.go b/keystore/keystore.go index 991de5dd1d..a40ab5cb06 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -9,6 +9,7 @@ import ( logging "github.com/ipfs/go-log" ci "github.com/libp2p/go-libp2p-core/crypto" + base32 "github.com/whyrusleeping/base32" ) var log = logging.Logger("keystore") @@ -52,6 +53,22 @@ func validateName(name string) error { return nil } +// NewKeystore is a factory for getting instance of Keystore interface implementation +func NewKeystore(dir string) (Keystore, error) { + return NewEncodedFSKeystore(dir) +} + +// NewEncodedFSKeystore is a factory for getting instance of EncodedFSKeystore +func NewEncodedFSKeystore(dir string) (*EncodedFSKeystore, error) { + keystore, err := NewFSKeystore(dir) + + if err != nil { + return nil, err + } + + return &EncodedFSKeystore{keystore}, nil +} + func NewFSKeystore(dir string) (*FSKeystore, error) { _, err := os.Stat(dir) if err != nil { @@ -174,3 +191,106 @@ func (ks *FSKeystore) List() ([]string, error) { return list, nil } + +const keyFilenamePrefix = "key_" + +func encode(name string) (string, error) { + if name == "" { + return "", fmt.Errorf("key name must be at least one character") + } + + encodedName := base32.RawStdEncoding.EncodeToString([]byte(name)) + log.Debugf("Encoded key name: %s to: %s", name, encodedName) + + return keyFilenamePrefix + strings.ToLower(encodedName), nil +} + +func decode(name string) (string, error) { + if !strings.HasPrefix(name, keyFilenamePrefix) { + return "", fmt.Errorf("key's filename has unexpected format") + } + + nameWithoutPrefix := strings.ToUpper(name[len(keyFilenamePrefix):]) + data, err := base32.RawStdEncoding.DecodeString(nameWithoutPrefix) + + if err != nil { + return "", err + } + + decodedName := string(data[:]) + + log.Debugf("Decoded key name: %s to: %s", name, decodedName) + + return decodedName, nil +} + +// EncodedFSKeystore is extension of FSKeystore that encodes the key filenames in base32 +type EncodedFSKeystore struct { + *FSKeystore +} + +// Has indicates if key is in keystore +func (ks *EncodedFSKeystore) Has(name string) (bool, error) { + encodedName, err := encode(name) + + if err != nil { + return false, err + } + + return ks.FSKeystore.Has(encodedName) +} + +// Put places key into the keystore +func (ks *EncodedFSKeystore) Put(name string, k ci.PrivKey) error { + encodedName, err := encode(name) + + if err != nil { + return err + } + + return ks.FSKeystore.Put(encodedName, k) +} + +// Get retrieves key by its name from the keystore +func (ks *EncodedFSKeystore) Get(name string) (ci.PrivKey, error) { + encodedName, err := encode(name) + + if err != nil { + return nil, err + } + + return ks.FSKeystore.Get(encodedName) +} + +// Delete removes key from the keystore +func (ks *EncodedFSKeystore) Delete(name string) error { + encodedName, err := encode(name) + + if err != nil { + return err + } + + return ks.FSKeystore.Delete(encodedName) +} + +// List returns list of all keys in keystore +func (ks *EncodedFSKeystore) List() ([]string, error) { + dirs, err := ks.FSKeystore.List() + + if err != nil { + return nil, err + } + + list := make([]string, 0, len(dirs)) + + for _, name := range dirs { + decodedName, err := decode(name) + if err == nil { + list = append(list, decodedName) + } else { + log.Warningf("Ignoring keyfile with invalid encoded filename: %s", name) + } + } + + return list, nil +} diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 37f59ebfff..685e5d942e 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -271,3 +271,92 @@ func assertDirContents(dir string, exp []string) error { } return nil } + +func TestEncodedKeystoreBasics(t *testing.T) { + tdir, err := ioutil.TempDir("", "encoded-keystore-test") + if err != nil { + t.Fatal(err) + } + + ks, err := NewEncodedFSKeystore(tdir) + if err != nil { + t.Fatal(err) + } + + l, err := ks.List() + if err != nil { + t.Fatal(err) + } + + if len(l) != 0 { + t.Fatal("expected no keys") + } + + k1 := privKeyOrFatal(t) + k1Name, err := encode("foo") + if err != nil { + t.Fatal(err) + } + + k2 := privKeyOrFatal(t) + k2Name, err := encode("bar") + if err != nil { + t.Fatal(err) + } + + err = ks.Put("foo", k1) + if err != nil { + t.Fatal(err) + } + + err = ks.Put("bar", k2) + if err != nil { + t.Fatal(err) + } + + l, err = ks.List() + if err != nil { + t.Fatal(err) + } + + sort.Strings(l) + if l[0] != "bar" || l[1] != "foo" { + t.Fatal("wrong entries listed") + } + + if err := assertDirContents(tdir, []string{k1Name, k2Name}); err != nil { + t.Fatal(err) + } + + exist, err := ks.Has("foo") + if !exist { + t.Fatal("should know it has a key named foo") + } + if err != nil { + t.Fatal(err) + } + + if err := ks.Delete("bar"); err != nil { + t.Fatal(err) + } + + if err := assertDirContents(tdir, []string{k1Name}); err != nil { + t.Fatal(err) + } + + if err := assertGetKey(ks, "foo", k1); err != nil { + t.Fatal(err) + } + + if err := ks.Put("..///foo/", k1); err != nil { + t.Fatal(err) + } + + if err := ks.Put("", k1); err == nil { + t.Fatal("shouldnt be able to put a key with no name") + } + + if err := ks.Put(".foo", k1); err != nil { + t.Fatal(err) + } +} From dc82d4467cd7ee394fe12e281a7dd2351fba7b96 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 5 Mar 2020 14:28:02 +0100 Subject: [PATCH 2836/3147] keystore: finish addressing encodedFSKeystore * Use Go's base32 library * Set repo to version 9 * Resolve linting problems and docs. * Merge EncodedFSKeystore into FSKeystore * Remove name limitations and adjust tests This commit was moved from ipfs/go-ipfs-keystore@5f369fe96c2ebcf8526893f93236a1794331fb69 --- keystore/keystore.go | 158 +++++++---------------------------- keystore/keystore_test.go | 120 ++++---------------------- keystore/memkeystore.go | 19 ++--- keystore/memkeystore_test.go | 8 +- 4 files changed, 59 insertions(+), 246 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index a40ab5cb06..463f90e007 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -7,13 +7,16 @@ import ( "path/filepath" "strings" + base32 "encoding/base32" + logging "github.com/ipfs/go-log" ci "github.com/libp2p/go-libp2p-core/crypto" - base32 "github.com/whyrusleeping/base32" ) var log = logging.Logger("keystore") +var codec = base32.StdEncoding.WithPadding(base32.NoPadding) + // Keystore provides a key management interface type Keystore interface { // Has returns whether or not a key exist in the Keystore @@ -29,46 +32,20 @@ type Keystore interface { List() ([]string, error) } +// ErrNoSuchKey is an error message returned when no key of a given name was found. var ErrNoSuchKey = fmt.Errorf("no key by the given name was found") + +// ErrKeyExists is an error message returned when a key already exists var ErrKeyExists = fmt.Errorf("key by that name already exists, refusing to overwrite") +const keyFilenamePrefix = "key_" + // FSKeystore is a keystore backed by files in a given directory stored on disk. type FSKeystore struct { dir string } -func validateName(name string) error { - if name == "" { - return fmt.Errorf("key names must be at least one character") - } - - if strings.Contains(name, "/") { - return fmt.Errorf("key names may not contain slashes") - } - - if strings.HasPrefix(name, ".") { - return fmt.Errorf("key names may not begin with a period") - } - - return nil -} - -// NewKeystore is a factory for getting instance of Keystore interface implementation -func NewKeystore(dir string) (Keystore, error) { - return NewEncodedFSKeystore(dir) -} - -// NewEncodedFSKeystore is a factory for getting instance of EncodedFSKeystore -func NewEncodedFSKeystore(dir string) (*EncodedFSKeystore, error) { - keystore, err := NewFSKeystore(dir) - - if err != nil { - return nil, err - } - - return &EncodedFSKeystore{keystore}, nil -} - +// NewFSKeystore returns a new filesystem-backed keystore. func NewFSKeystore(dir string) (*FSKeystore, error) { _, err := os.Stat(dir) if err != nil { @@ -85,28 +62,25 @@ func NewFSKeystore(dir string) (*FSKeystore, error) { // Has returns whether or not a key exist in the Keystore func (ks *FSKeystore) Has(name string) (bool, error) { + name, err := encode(name) + if err != nil { + return false, err + } + kp := filepath.Join(ks.dir, name) - _, err := os.Stat(kp) + _, err = os.Stat(kp) if os.IsNotExist(err) { return false, nil } - - if err != nil { - return false, err - } - - if err := validateName(name); err != nil { - return false, err - } - - return true, nil + return err == nil, err } // Put stores a key in the Keystore, if a key with the same name already exists, returns ErrKeyExists func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { - if err := validateName(name); err != nil { + name, err := encode(name) + if err != nil { return err } @@ -138,7 +112,8 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { // Get retrieves a key from the Keystore if it exists, and returns ErrNoSuchKey // otherwise. func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { - if err := validateName(name); err != nil { + name, err := encode(name) + if err != nil { return nil, err } @@ -157,7 +132,8 @@ func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { // Delete removes a key from the Keystore func (ks *FSKeystore) Delete(name string) error { - if err := validateName(name); err != nil { + name, err := encode(name) + if err != nil { return err } @@ -181,25 +157,23 @@ func (ks *FSKeystore) List() ([]string, error) { list := make([]string, 0, len(dirs)) for _, name := range dirs { - err := validateName(name) + decodedName, err := decode(name) if err == nil { - list = append(list, name) + list = append(list, decodedName) } else { - log.Warnf("Ignoring the invalid keyfile: %s", name) + log.Errorf("Ignoring keyfile with invalid encoded filename: %s", name) } } return list, nil } -const keyFilenamePrefix = "key_" - func encode(name string) (string, error) { if name == "" { return "", fmt.Errorf("key name must be at least one character") } - encodedName := base32.RawStdEncoding.EncodeToString([]byte(name)) + encodedName := codec.EncodeToString([]byte(name)) log.Debugf("Encoded key name: %s to: %s", name, encodedName) return keyFilenamePrefix + strings.ToLower(encodedName), nil @@ -211,86 +185,12 @@ func decode(name string) (string, error) { } nameWithoutPrefix := strings.ToUpper(name[len(keyFilenamePrefix):]) - data, err := base32.RawStdEncoding.DecodeString(nameWithoutPrefix) - + decodedName, err := codec.DecodeString(nameWithoutPrefix) if err != nil { return "", err } - decodedName := string(data[:]) - log.Debugf("Decoded key name: %s to: %s", name, decodedName) - return decodedName, nil -} - -// EncodedFSKeystore is extension of FSKeystore that encodes the key filenames in base32 -type EncodedFSKeystore struct { - *FSKeystore -} - -// Has indicates if key is in keystore -func (ks *EncodedFSKeystore) Has(name string) (bool, error) { - encodedName, err := encode(name) - - if err != nil { - return false, err - } - - return ks.FSKeystore.Has(encodedName) -} - -// Put places key into the keystore -func (ks *EncodedFSKeystore) Put(name string, k ci.PrivKey) error { - encodedName, err := encode(name) - - if err != nil { - return err - } - - return ks.FSKeystore.Put(encodedName, k) -} - -// Get retrieves key by its name from the keystore -func (ks *EncodedFSKeystore) Get(name string) (ci.PrivKey, error) { - encodedName, err := encode(name) - - if err != nil { - return nil, err - } - - return ks.FSKeystore.Get(encodedName) -} - -// Delete removes key from the keystore -func (ks *EncodedFSKeystore) Delete(name string) error { - encodedName, err := encode(name) - - if err != nil { - return err - } - - return ks.FSKeystore.Delete(encodedName) -} - -// List returns list of all keys in keystore -func (ks *EncodedFSKeystore) List() ([]string, error) { - dirs, err := ks.FSKeystore.List() - - if err != nil { - return nil, err - } - - list := make([]string, 0, len(dirs)) - - for _, name := range dirs { - decodedName, err := decode(name) - if err == nil { - list = append(list, decodedName) - } else { - log.Warningf("Ignoring keyfile with invalid encoded filename: %s", name) - } - } - - return list, nil + return string(decodedName), nil } diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 685e5d942e..2a48b43e56 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -132,16 +132,16 @@ func TestKeystoreBasics(t *testing.T) { t.Fatal(err) } - if err := ks.Put("..///foo/", k1); err == nil { - t.Fatal("shouldnt be able to put a poorly named key") + if err := ks.Put("..///foo/", k1); err != nil { + t.Fatal(err) } if err := ks.Put("", k1); err == nil { t.Fatal("shouldnt be able to put a key with no name") } - if err := ks.Put(".foo", k1); err == nil { - t.Fatal("shouldnt be able to put a key with a 'hidden' name") + if err := ks.Put(".foo", k1); err != nil { + t.Fatal(err) } } @@ -166,12 +166,17 @@ func TestInvalidKeyFiles(t *testing.T) { t.Fatal(err) } - err = ioutil.WriteFile(filepath.Join(ks.dir, "valid"), bytes, 0644) + encodedName, err := encode("valid") + if err != nil { + t.Fatal(err) + } + + err = ioutil.WriteFile(filepath.Join(ks.dir, encodedName), bytes, 0644) if err != nil { t.Fatal(err) } - err = ioutil.WriteFile(filepath.Join(ks.dir, ".invalid"), bytes, 0644) + err = ioutil.WriteFile(filepath.Join(ks.dir, "z.invalid"), bytes, 0644) if err != nil { t.Fatal(err) } @@ -197,10 +202,6 @@ func TestInvalidKeyFiles(t *testing.T) { if err != nil { t.Fatal(err) } - - if _, err = ks.Has(".invalid"); err == nil { - t.Fatal("shouldnt be able to put a key with a 'hidden' name") - } } func TestNonExistingKey(t *testing.T) { @@ -231,12 +232,12 @@ func TestMakeKeystoreNoDir(t *testing.T) { } func assertGetKey(ks Keystore, name string, exp ci.PrivKey) error { - out_k, err := ks.Get(name) + outK, err := ks.Get(name) if err != nil { return err } - if !out_k.Equals(exp) { + if !outK.Equals(exp) { return fmt.Errorf("key we got out didnt match expectation") } @@ -255,7 +256,11 @@ func assertDirContents(dir string, exp []string) error { var names []string for _, fi := range finfos { - names = append(names, fi.Name()) + decodedName, err := decode(fi.Name()) + if err != nil { + return err + } + names = append(names, decodedName) } sort.Strings(names) @@ -271,92 +276,3 @@ func assertDirContents(dir string, exp []string) error { } return nil } - -func TestEncodedKeystoreBasics(t *testing.T) { - tdir, err := ioutil.TempDir("", "encoded-keystore-test") - if err != nil { - t.Fatal(err) - } - - ks, err := NewEncodedFSKeystore(tdir) - if err != nil { - t.Fatal(err) - } - - l, err := ks.List() - if err != nil { - t.Fatal(err) - } - - if len(l) != 0 { - t.Fatal("expected no keys") - } - - k1 := privKeyOrFatal(t) - k1Name, err := encode("foo") - if err != nil { - t.Fatal(err) - } - - k2 := privKeyOrFatal(t) - k2Name, err := encode("bar") - if err != nil { - t.Fatal(err) - } - - err = ks.Put("foo", k1) - if err != nil { - t.Fatal(err) - } - - err = ks.Put("bar", k2) - if err != nil { - t.Fatal(err) - } - - l, err = ks.List() - if err != nil { - t.Fatal(err) - } - - sort.Strings(l) - if l[0] != "bar" || l[1] != "foo" { - t.Fatal("wrong entries listed") - } - - if err := assertDirContents(tdir, []string{k1Name, k2Name}); err != nil { - t.Fatal(err) - } - - exist, err := ks.Has("foo") - if !exist { - t.Fatal("should know it has a key named foo") - } - if err != nil { - t.Fatal(err) - } - - if err := ks.Delete("bar"); err != nil { - t.Fatal(err) - } - - if err := assertDirContents(tdir, []string{k1Name}); err != nil { - t.Fatal(err) - } - - if err := assertGetKey(ks, "foo", k1); err != nil { - t.Fatal(err) - } - - if err := ks.Put("..///foo/", k1); err != nil { - t.Fatal(err) - } - - if err := ks.Put("", k1); err == nil { - t.Fatal("shouldnt be able to put a key with no name") - } - - if err := ks.Put(".foo", k1); err != nil { - t.Fatal(err) - } -} diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 4067bbce29..c96985252a 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -1,6 +1,10 @@ package keystore -import ci "github.com/libp2p/go-libp2p-core/crypto" +import ( + "errors" + + ci "github.com/libp2p/go-libp2p-core/crypto" +) // MemKeystore is an in memory keystore implementation that is not persisted to // any backing storage. @@ -8,6 +12,7 @@ type MemKeystore struct { keys map[string]ci.PrivKey } +// NewMemKeystore creates a MemKeystore. func NewMemKeystore() *MemKeystore { return &MemKeystore{make(map[string]ci.PrivKey)} } @@ -20,8 +25,8 @@ func (mk *MemKeystore) Has(name string) (bool, error) { // Put store a key in the Keystore func (mk *MemKeystore) Put(name string, k ci.PrivKey) error { - if err := validateName(name); err != nil { - return err + if name == "" { + return errors.New("key name must be at least one character") } _, ok := mk.keys[name] @@ -35,10 +40,6 @@ func (mk *MemKeystore) Put(name string, k ci.PrivKey) error { // Get retrieve a key from the Keystore func (mk *MemKeystore) Get(name string) (ci.PrivKey, error) { - if err := validateName(name); err != nil { - return nil, err - } - k, ok := mk.keys[name] if !ok { return nil, ErrNoSuchKey @@ -49,10 +50,6 @@ func (mk *MemKeystore) Get(name string) (ci.PrivKey, error) { // Delete remove a key from the Keystore func (mk *MemKeystore) Delete(name string) error { - if err := validateName(name); err != nil { - return err - } - delete(mk.keys, name) return nil } diff --git a/keystore/memkeystore_test.go b/keystore/memkeystore_test.go index 62533d54b9..a7214893a3 100644 --- a/keystore/memkeystore_test.go +++ b/keystore/memkeystore_test.go @@ -85,15 +85,15 @@ func TestMemKeyStoreBasics(t *testing.T) { t.Fatal(err) } - if err := ks.Put("..///foo/", k1); err == nil { - t.Fatal("shouldnt be able to put a poorly named key") + if err := ks.Put("..///foo/", k1); err != nil { + t.Fatal(err) } if err := ks.Put("", k1); err == nil { t.Fatal("shouldnt be able to put a key with no name") } - if err := ks.Put(".foo", k1); err == nil { - t.Fatal("shouldnt be able to put a key with a 'hidden' name") + if err := ks.Put(".foo", k1); err != nil { + t.Fatal(err) } } From bb83dc670859ca43aa219ff6585664adcd32dfe3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Sun, 15 Mar 2020 23:40:01 -0700 Subject: [PATCH 2837/3147] fix(keystore): avoid racy filesystem access Instead of checking then performing a file operation, perform the file operation and check the error. This commit was moved from ipfs/go-ipfs-keystore@67213bfcb798335e8e7613df8bf2ebf76f62c309 --- keystore/keystore.go | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 463f90e007..a52b4ad171 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -47,16 +47,13 @@ type FSKeystore struct { // NewFSKeystore returns a new filesystem-backed keystore. func NewFSKeystore(dir string) (*FSKeystore, error) { - _, err := os.Stat(dir) - if err != nil { - if !os.IsNotExist(err) { - return nil, err - } - if err := os.Mkdir(dir, 0700); err != nil { - return nil, err - } + err := os.Mkdir(dir, 0700) + switch { + case os.IsExist(err): + case err == nil: + default: + return nil, err } - return &FSKeystore{dir}, nil } @@ -91,15 +88,11 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { kp := filepath.Join(ks.dir, name) - _, err = os.Stat(kp) - if err == nil { - return ErrKeyExists - } else if !os.IsNotExist(err) { - return err - } - - fi, err := os.Create(kp) + fi, err := os.OpenFile(kp, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600) if err != nil { + if os.IsExist(err) { + err = ErrKeyExists + } return err } defer fi.Close() From 679311d2594a84cc4d389064143a8fd769156f5b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 25 Mar 2020 19:14:24 -0700 Subject: [PATCH 2838/3147] fix: don't return an empty block at the end This commit was moved from ipfs/go-ipfs-chunker@ca4d27be5effeb297326ab2220433069d9d6cb1d --- chunker/buzhash.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/chunker/buzhash.go b/chunker/buzhash.go index b3de95f127..83ab019dd4 100644 --- a/chunker/buzhash.go +++ b/chunker/buzhash.go @@ -40,9 +40,16 @@ func (b *Buzhash) NextBytes() ([]byte, error) { n, err := io.ReadFull(b.r, b.buf[b.n:]) if err != nil { if err == io.ErrUnexpectedEOF || err == io.EOF { - if b.n+n < buzMin { + buffered := b.n + n + if buffered < buzMin { b.err = io.EOF - res := make([]byte, b.n+n) + // Read nothing? Don't return an empty block. + if buffered == 0 { + pool.Put(b.buf) + b.buf = nil + return nil, b.err + } + res := make([]byte, buffered) copy(res, b.buf) pool.Put(b.buf) From 358dbca7d9c622fb168965b33256a3fe4a4f14e4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 25 Mar 2020 19:18:06 -0700 Subject: [PATCH 2839/3147] test(buzhash): fuzz This commit was moved from ipfs/go-ipfs-chunker@b4e4e73e00441494d9240b64386b95aaee77f1a8 --- chunker/buzhash_test.go | 52 ++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/chunker/buzhash_test.go b/chunker/buzhash_test.go index f630cef89b..07573bab6b 100644 --- a/chunker/buzhash_test.go +++ b/chunker/buzhash_test.go @@ -2,7 +2,6 @@ package chunk import ( "bytes" - "fmt" "io" "testing" @@ -11,33 +10,48 @@ import ( func TestBuzhashChunking(t *testing.T) { data := make([]byte, 1024*1024*16) - util.NewTimeSeededRand().Read(data) - r := NewBuzhash(bytes.NewReader(data)) + chunkCount := 0 + rounds := 100 - var chunks [][]byte + for i := 0; i < rounds; i++ { + util.NewTimeSeededRand().Read(data) - for { - chunk, err := r.NextBytes() - if err != nil { - if err == io.EOF { - break + r := NewBuzhash(bytes.NewReader(data)) + + var chunks [][]byte + + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break + } + t.Fatal(err) } - t.Fatal(err) + + chunks = append(chunks, chunk) } + chunkCount += len(chunks) - chunks = append(chunks, chunk) - } + for i, chunk := range chunks { + if len(chunk) == 0 { + t.Fatalf("chunk %d/%d is empty", i+1, len(chunks)) + } + } - t.Logf("average block size: %d\n", len(data)/len(chunks)) + for i, chunk := range chunks[:len(chunks)-1] { + if len(chunk) < buzMin { + t.Fatalf("chunk %d/%d is less than the minimum size", i+1, len(chunks)) + } + } - unchunked := bytes.Join(chunks, nil) - if !bytes.Equal(unchunked, data) { - fmt.Printf("%d %d\n", len(unchunked), len(data)) - //ioutil.WriteFile("./incorrect", unchunked, 0777) - //ioutil.WriteFile("./correct", data, 0777) - t.Fatal("data was chunked incorrectly") + unchunked := bytes.Join(chunks, nil) + if !bytes.Equal(unchunked, data) { + t.Fatal("data was chunked incorrectly") + } } + t.Logf("average block size: %d\n", len(data)*rounds/chunkCount) } func TestBuzhashChunkReuse(t *testing.T) { From 1d71592e90a56923f129707d61430355b7e27181 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 26 Mar 2020 13:47:29 -0700 Subject: [PATCH 2840/3147] test: avoid fuzzing while the race detector is enabled It's too slow. This commit was moved from ipfs/go-ipfs-chunker@cbf45fd253b8798d4fa12574260f914ca5d8fc59 --- chunker/buzhash_norace_test.go | 14 ++++++++ chunker/buzhash_test.go | 66 +++++++++++++++++----------------- 2 files changed, 47 insertions(+), 33 deletions(-) create mode 100644 chunker/buzhash_norace_test.go diff --git a/chunker/buzhash_norace_test.go b/chunker/buzhash_norace_test.go new file mode 100644 index 0000000000..2565a4c533 --- /dev/null +++ b/chunker/buzhash_norace_test.go @@ -0,0 +1,14 @@ +//+build !race + +package chunk + +import ( + "testing" +) + +func TestFuzzBuzhashChunking(t *testing.T) { + buf := make([]byte, 1024*1024*16) + for i := 0; i < 100; i++ { + testBuzhashChunking(t, buf) + } +} diff --git a/chunker/buzhash_test.go b/chunker/buzhash_test.go index 07573bab6b..931f23574f 100644 --- a/chunker/buzhash_test.go +++ b/chunker/buzhash_test.go @@ -8,50 +8,50 @@ import ( util "github.com/ipfs/go-ipfs-util" ) -func TestBuzhashChunking(t *testing.T) { - data := make([]byte, 1024*1024*16) - - chunkCount := 0 - rounds := 100 +func testBuzhashChunking(t *testing.T, buf []byte) (chunkCount int) { + util.NewTimeSeededRand().Read(buf) - for i := 0; i < rounds; i++ { - util.NewTimeSeededRand().Read(data) + r := NewBuzhash(bytes.NewReader(buf)) - r := NewBuzhash(bytes.NewReader(data)) + var chunks [][]byte - var chunks [][]byte - - for { - chunk, err := r.NextBytes() - if err != nil { - if err == io.EOF { - break - } - t.Fatal(err) + for { + chunk, err := r.NextBytes() + if err != nil { + if err == io.EOF { + break } - - chunks = append(chunks, chunk) + t.Fatal(err) } - chunkCount += len(chunks) - for i, chunk := range chunks { - if len(chunk) == 0 { - t.Fatalf("chunk %d/%d is empty", i+1, len(chunks)) - } - } + chunks = append(chunks, chunk) + } + chunkCount += len(chunks) - for i, chunk := range chunks[:len(chunks)-1] { - if len(chunk) < buzMin { - t.Fatalf("chunk %d/%d is less than the minimum size", i+1, len(chunks)) - } + for i, chunk := range chunks { + if len(chunk) == 0 { + t.Fatalf("chunk %d/%d is empty", i+1, len(chunks)) } + } - unchunked := bytes.Join(chunks, nil) - if !bytes.Equal(unchunked, data) { - t.Fatal("data was chunked incorrectly") + for i, chunk := range chunks[:len(chunks)-1] { + if len(chunk) < buzMin { + t.Fatalf("chunk %d/%d is less than the minimum size", i+1, len(chunks)) } } - t.Logf("average block size: %d\n", len(data)*rounds/chunkCount) + + unchunked := bytes.Join(chunks, nil) + if !bytes.Equal(unchunked, buf) { + t.Fatal("data was chunked incorrectly") + } + + return chunkCount +} + +func TestBuzhashChunking(t *testing.T) { + buf := make([]byte, 1024*1024*16) + count := testBuzhashChunking(t, buf) + t.Logf("average block size: %d\n", len(buf)/count) } func TestBuzhashChunkReuse(t *testing.T) { From 4892b01788835015cc53c7bf7d337881dcd9ef5f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 26 Mar 2020 13:50:09 -0700 Subject: [PATCH 2841/3147] chore: fix lints This commit was moved from ipfs/go-ipfs-chunker@cbd0b2e188ecd56b6bb350b2901d8d6334d8669f --- chunker/buzhash_test.go | 8 +++++++- chunker/rabin_test.go | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/chunker/buzhash_test.go b/chunker/buzhash_test.go index 931f23574f..05ad7c380f 100644 --- a/chunker/buzhash_test.go +++ b/chunker/buzhash_test.go @@ -9,7 +9,13 @@ import ( ) func testBuzhashChunking(t *testing.T, buf []byte) (chunkCount int) { - util.NewTimeSeededRand().Read(buf) + n, err := util.NewTimeSeededRand().Read(buf) + if n < len(buf) { + t.Fatalf("expected %d bytes, got %d", len(buf), n) + } + if err != nil { + t.Fatal(err) + } r := NewBuzhash(bytes.NewReader(buf)) diff --git a/chunker/rabin_test.go b/chunker/rabin_test.go index 857e97c2ca..2e19a82c74 100644 --- a/chunker/rabin_test.go +++ b/chunker/rabin_test.go @@ -12,7 +12,13 @@ import ( func TestRabinChunking(t *testing.T) { data := make([]byte, 1024*1024*16) - util.NewTimeSeededRand().Read(data) + n, err := util.NewTimeSeededRand().Read(data) + if n < len(data) { + t.Fatalf("expected %d bytes, got %d", len(data), n) + } + if err != nil { + t.Fatal(err) + } r := NewRabin(bytes.NewReader(data), 1024*256) @@ -62,7 +68,13 @@ func chunkData(t *testing.T, newC newSplitter, data []byte) map[string]blocks.Bl func testReuse(t *testing.T, cr newSplitter) { data := make([]byte, 1024*1024*16) - util.NewTimeSeededRand().Read(data) + n, err := util.NewTimeSeededRand().Read(data) + if n < len(data) { + t.Fatalf("expected %d bytes, got %d", len(data), n) + } + if err != nil { + t.Fatal(err) + } ch1 := chunkData(t, cr, data[1000:]) ch2 := chunkData(t, cr, data) From 32c5c58cd8b79c26e1151e045e3455dc6e668f44 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 27 Mar 2020 12:57:53 +0100 Subject: [PATCH 2842/3147] keystore: Switch from Bytes() to MarshalPrivateKey() Bytes is deprecated. This commit was moved from ipfs/go-ipfs-keystore@ba3f6ad628c52ff4437b8ac8ac586cebbcedb385 --- keystore/keystore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index a52b4ad171..ed83c17e6a 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -81,7 +81,7 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { return err } - b, err := k.Bytes() + b, err := ci.MarshalPrivateKey(k) if err != nil { return err } From 44b2237aeb926a4536338395defb278544f0e1be Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 27 Mar 2020 12:59:10 +0100 Subject: [PATCH 2843/3147] keystore: create new keys with 0400 permissions (as spec'ed) Spec is pretty much out of date but specifies this. https://github.com/ipfs/specs/blob/master/KEYSTORE.md This commit was moved from ipfs/go-ipfs-keystore@a8fef3d240997647efd00ce52c26bb543963de38 --- keystore/keystore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index ed83c17e6a..0a2fed3bfc 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -88,7 +88,7 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error { kp := filepath.Join(ks.dir, name) - fi, err := os.OpenFile(kp, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600) + fi, err := os.OpenFile(kp, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0400) if err != nil { if os.IsExist(err) { err = ErrKeyExists From bffa011f0a0f01646bcecbc003552941ca31860b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Mon, 30 Mar 2020 16:20:15 +0200 Subject: [PATCH 2844/3147] pin: better doc, small cleaning This commit was moved from ipfs/interface-go-ipfs-core@478caf05ab8fd3b33ae80f8792be2cb7c7a92b45 --- coreiface/options/pin.go | 32 +++++++++++++++++++++----------- coreiface/tests/pin.go | 2 +- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 231f0d11a8..5014a2d2b1 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -2,46 +2,48 @@ package options import "fmt" +// PinAddSettings represent the settings for PinAPI.Add type PinAddSettings struct { Recursive bool } -type TypeSettings struct { - Type string -} - +// PinLsSettings represent the settings for PinAPI.Ls type PinLsSettings struct { Type string } +// PinIsPinnedSettings represent the settings for PinAPI.IsPinned type PinIsPinnedSettings struct { WithType string } -// PinRmSettings represents the settings of pin rm command +// PinRmSettings represents the settings for PinAPI.Rm type PinRmSettings struct { Recursive bool } +// PinUpdateSettings represent the settings for PinAPI.Update type PinUpdateSettings struct { Unpin bool } -// PinAddOption pin add option func +// PinAddOption is the signature of an option for PinAPI.Add type PinAddOption func(*PinAddSettings) error -// PinLsOption pin ls option func +// PinLsOption is the signature of an option for PinAPI.Ls type PinLsOption func(*PinLsSettings) error -// PinIsPinnedOption pin isPinned option func +// PinIsPinnedOption is the signature of an option for PinAPI.IsPinned type PinIsPinnedOption func(*PinIsPinnedSettings) error -// PinRmOption pin rm option func +// PinRmOption is the signature of an option for PinAPI.Rm type PinRmOption func(*PinRmSettings) error -// PinUpdateOption pin update option func +// PinUpdateOption is the signature of an option for PinAPI.Update type PinUpdateOption func(*PinUpdateSettings) error +// PinAddOptions compile a series of PinAddOption into a ready to use +// PinAddSettings and set the default values. func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { options := &PinAddSettings{ Recursive: true, @@ -57,6 +59,8 @@ func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) { return options, nil } +// PinLsOptions compile a series of PinLsOption into a ready to use +// PinLsSettings and set the default values. func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { options := &PinLsSettings{ Type: "all", @@ -72,6 +76,8 @@ func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) { return options, nil } +// PinIsPinnedOptions compile a series of PinIsPinnedOption into a ready to use +// PinIsPinnedSettings and set the default values. func PinIsPinnedOptions(opts ...PinIsPinnedOption) (*PinIsPinnedSettings, error) { options := &PinIsPinnedSettings{ WithType: "all", @@ -87,7 +93,8 @@ func PinIsPinnedOptions(opts ...PinIsPinnedOption) (*PinIsPinnedSettings, error) return options, nil } -// PinRmOptions pin rm options +// PinRmOptions compile a series of PinRmOption into a ready to use +// PinRmSettings and set the default values. func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) { options := &PinRmSettings{ Recursive: true, @@ -102,6 +109,8 @@ func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) { return options, nil } +// PinUpdateOptions compile a series of PinUpdateOption into a ready to use +// PinUpdateSettings and set the default values. func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, error) { options := &PinUpdateSettings{ Unpin: true, @@ -122,6 +131,7 @@ type pinOpts struct { IsPinned pinIsPinnedOpts } +// Pin provide an access to all the options for the Pin API. var Pin pinOpts type pinLsOpts struct{} diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index e16d6460bd..476bbea6be 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -546,7 +546,7 @@ func assertIsPinned(t *testing.T, ctx context.Context, api iface.CoreAPI, p path t.Helper() withType, err := opt.Pin.IsPinned.Type(typeStr) if err != nil { - panic("unhandled pin type") + t.Fatal("unhandled pin type") } whyPinned, pinned, err := api.Pin().IsPinned(ctx, p, withType) From 315b4efaaf44edd8fce692f5d25a7a1df1a2bcf2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 6 Apr 2020 12:46:59 -0700 Subject: [PATCH 2845/3147] fix: handle closed queue When the queue closes, return instead of providing empty CIDs. This commit was moved from ipfs/go-ipfs-provider@596dc4996bf72ac8bf1d7c7bb3543310b0bad811 --- provider/simple/provider.go | 7 ++++++- provider/simple/provider_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index f421f6195a..6c50ef925b 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -85,7 +85,12 @@ func (p *Provider) handleAnnouncements() { select { case <-p.ctx.Done(): return - case c := <-p.queue.Dequeue(): + case c, ok := <-p.queue.Dequeue(): + if !ok { + // queue closed. + return + } + p.doProvide(c) } } diff --git a/provider/simple/provider_test.go b/provider/simple/provider_test.go index deb0032ec2..d8dbf96f00 100644 --- a/provider/simple/provider_test.go +++ b/provider/simple/provider_test.go @@ -84,6 +84,37 @@ func TestAnnouncement(t *testing.T) { t.Fatal("Timeout waiting for cids to be provided.") } } + prov.Close() + + select { + case cp := <-r.provided: + t.Fatal("did not expect to provide CID: ", cp) + case <-time.After(time.Second * 1): + } +} + +func TestClose(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := sync.MutexWrap(datastore.NewMapDatastore()) + queue, err := q.NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + + r := mockContentRouting() + + prov := NewProvider(ctx, queue, r) + prov.Run() + + prov.Close() + + select { + case cp := <-r.provided: + t.Fatal("did not expect to provide anything, provided: ", cp) + case <-time.After(time.Second * 1): + } } func TestAnnouncementTimeout(t *testing.T) { From 0f975788ef4dd78c9ac371cae6f247aa8855a518 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 19 Mar 2020 18:38:36 -0700 Subject: [PATCH 2846/3147] assign public IP addresses for tests that need them This commit was moved from ipfs/go-namesys@779a4400ff90cea88214f4ef440475fd06c314f5 --- namesys/republisher/repub_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 5fedc3907a..fd946501eb 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -29,10 +29,7 @@ func TestRepublish(t *testing.T) { var nodes []*core.IpfsNode for i := 0; i < 10; i++ { - nd, err := core.NewNode(ctx, &core.BuildCfg{ - Online: true, - Host: mock.MockHostOption(mn), - }) + nd, err := mock.MockPublicNode(ctx, mn) if err != nil { t.Fatal(err) } From 960beb2b79e906551a219fdaf70fac7f5015615d Mon Sep 17 00:00:00 2001 From: postables Date: Sun, 12 Apr 2020 00:20:16 -0700 Subject: [PATCH 2847/3147] add race fix for HashOnRead This commit was moved from ipfs/go-ipfs-blockstore@2bd301c7765e953229c91d355d2155c5b93820d7 --- blockstore/blockstore.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index e815642da0..f8eb07a7d7 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -15,6 +15,7 @@ import ( dsq "github.com/ipfs/go-datastore/query" dshelp "github.com/ipfs/go-ipfs-ds-help" logging "github.com/ipfs/go-log" + uatomic "go.uber.org/atomic" ) var log = logging.Logger("blockstore") @@ -101,17 +102,18 @@ func NewBlockstore(d ds.Batching) Blockstore { dsb = dd return &blockstore{ datastore: dsb, + rehash: uatomic.NewBool(false), } } type blockstore struct { datastore ds.Batching - rehash bool + rehash *uatomic.Bool } func (bs *blockstore) HashOnRead(enabled bool) { - bs.rehash = enabled + bs.rehash.Store(enabled) } func (bs *blockstore) Get(k cid.Cid) (blocks.Block, error) { @@ -126,7 +128,7 @@ func (bs *blockstore) Get(k cid.Cid) (blocks.Block, error) { if err != nil { return nil, err } - if bs.rehash { + if bs.rehash.Load() { rbcid, err := k.Prefix().Sum(bdata) if err != nil { return nil, err From a860f096dc4acd22538da6ad3bfb7385eaf8843d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 13 Apr 2020 18:22:04 -0700 Subject: [PATCH 2848/3147] fix: invalidate cache on failed publish If we fail to publish, _invalidate_ our cache. The publish may have partially succeeded. This commit was moved from ipfs/go-namesys@52d679e87989ab777955b50ad9ecd8095fe5e77d --- namesys/cache.go | 7 +++++++ namesys/namesys.go | 3 +++ 2 files changed, 10 insertions(+) diff --git a/namesys/cache.go b/namesys/cache.go index a0029829d3..b2b1f43a8d 100644 --- a/namesys/cache.go +++ b/namesys/cache.go @@ -49,6 +49,13 @@ func (ns *mpns) cacheSet(name string, val path.Path, ttl time.Duration) { }) } +func (ns *mpns) cacheInvalidate(name string) { + if ns.cache == nil { + return + } + ns.cache.Remove(name) +} + type cacheEntry struct { val path.Path eol time.Time diff --git a/namesys/namesys.go b/namesys/namesys.go index a486b83b8a..0f076ea64e 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -218,6 +218,9 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. return err } if err := ns.ipnsPublisher.PublishWithEOL(ctx, name, value, eol); err != nil { + // Invalidate the cache. Publishing may _partially_ succeed but + // still return an error. + ns.cacheInvalidate(peer.Encode(id)) return err } ttl := DefaultResolverCacheTTL From 9bc754640c3e76185101fb1078aad50a2e3e2b0b Mon Sep 17 00:00:00 2001 From: Dimitris Apostolou Date: Sat, 18 Apr 2020 17:45:01 +0300 Subject: [PATCH 2849/3147] Fix typos and cleanup This commit was moved from ipfs/go-namesys@cf1aba817612f934965c0f770168578ec04b047b --- namesys/namesys.go | 2 +- namesys/republisher/repub_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 0f076ea64e..933ce789db 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -45,7 +45,7 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSys cache, _ = lru.New(cachesize) } - // Prewarm namesys cache with static records for deteministic tests and debugging. + // Prewarm namesys cache with static records for deterministic tests and debugging. // Useful for testing things like DNSLink without real DNS lookup. // Example: // IPFS_NS_MAP="dnslink-test.example.com:/ipfs/bafkreicysg23kiwv34eg2d7qweipxwosdo2py4ldv42nbauguluen5v6am" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index fd946501eb..470d460ba2 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -92,7 +92,7 @@ func TestRepublish(t *testing.T) { // The republishers that are contained within the nodes have their timeout set // to 12 hours. Instead of trying to tweak those, we're just going to pretend - // they dont exist and make our own. + // they don't exist and make our own. repub := NewRepublisher(rp, publisher.Repo.Datastore(), publisher.PrivateKey, publisher.Repo.Keystore()) repub.Interval = time.Second repub.RecordLifetime = time.Second * 5 From 0c84d4315117934b7184e94da69369eb1772b51d Mon Sep 17 00:00:00 2001 From: Dimitris Apostolou Date: Sat, 18 Apr 2020 17:45:01 +0300 Subject: [PATCH 2850/3147] Fix typos and cleanup This commit was moved from ipfs/go-ipfs-keystore@311e4de65464c2e89414e8f008768d0088ed80cf --- keystore/keystore.go | 4 ++-- keystore/keystore_test.go | 4 ++-- keystore/memkeystore.go | 2 +- keystore/memkeystore_test.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 0a2fed3bfc..9b2109ccdf 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -19,7 +19,7 @@ var codec = base32.StdEncoding.WithPadding(base32.NoPadding) // Keystore provides a key management interface type Keystore interface { - // Has returns whether or not a key exist in the Keystore + // Has returns whether or not a key exists in the Keystore Has(string) (bool, error) // Put stores a key in the Keystore, if a key with the same name already exists, returns ErrKeyExists Put(string, ci.PrivKey) error @@ -57,7 +57,7 @@ func NewFSKeystore(dir string) (*FSKeystore, error) { return &FSKeystore{dir}, nil } -// Has returns whether or not a key exist in the Keystore +// Has returns whether or not a key exists in the Keystore func (ks *FSKeystore) Has(name string) (bool, error) { name, err := encode(name) if err != nil { diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 2a48b43e56..06f2fccc53 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -137,7 +137,7 @@ func TestKeystoreBasics(t *testing.T) { } if err := ks.Put("", k1); err == nil { - t.Fatal("shouldnt be able to put a key with no name") + t.Fatal("shouldn't be able to put a key with no name") } if err := ks.Put(".foo", k1); err != nil { @@ -238,7 +238,7 @@ func assertGetKey(ks Keystore, name string, exp ci.PrivKey) error { } if !outK.Equals(exp) { - return fmt.Errorf("key we got out didnt match expectation") + return fmt.Errorf("key we got out didn't match expectation") } return nil diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index c96985252a..94411144d4 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -17,7 +17,7 @@ func NewMemKeystore() *MemKeystore { return &MemKeystore{make(map[string]ci.PrivKey)} } -// Has return whether or not a key exist in the Keystore +// Has return whether or not a key exists in the Keystore func (mk *MemKeystore) Has(name string) (bool, error) { _, ok := mk.keys[name] return ok, nil diff --git a/keystore/memkeystore_test.go b/keystore/memkeystore_test.go index a7214893a3..907cbbd0e7 100644 --- a/keystore/memkeystore_test.go +++ b/keystore/memkeystore_test.go @@ -90,7 +90,7 @@ func TestMemKeyStoreBasics(t *testing.T) { } if err := ks.Put("", k1); err == nil { - t.Fatal("shouldnt be able to put a key with no name") + t.Fatal("shouldn't be able to put a key with no name") } if err := ks.Put(".foo", k1); err != nil { From 0ed0b6f39d3ab3b20bd6dd2232de03a9513b139c Mon Sep 17 00:00:00 2001 From: Will Scott Date: Tue, 21 Apr 2020 08:40:13 -0700 Subject: [PATCH 2851/3147] extra time for dht spin-up This commit was moved from ipfs/interface-go-ipfs-core@9160e645322d5779c687e0e60cbec5a5932d5c27 --- coreiface/tests/dht.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index 33b4ff14c7..a957d66d71 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -4,8 +4,9 @@ import ( "context" "io" "testing" + "time" - "github.com/ipfs/interface-go-ipfs-core" + iface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" ) @@ -43,6 +44,8 @@ func (tp *TestSuite) TestDhtFindPeer(t *testing.T) { t.Fatal("unexpected number of local addrs") } + time.Sleep(3 * time.Second) + pi, err := apis[2].Dht().FindPeer(ctx, self0.ID()) if err != nil { t.Fatal(err) @@ -88,6 +91,8 @@ func (tp *TestSuite) TestDhtFindProviders(t *testing.T) { t.Fatal(err) } + time.Sleep(3 * time.Second) + out, err := apis[2].Dht().FindProviders(ctx, p, options.Dht.NumProviders(1)) if err != nil { t.Fatal(err) @@ -125,6 +130,8 @@ func (tp *TestSuite) TestDhtProvide(t *testing.T) { p := s.Path() + time.Sleep(3 * time.Second) + out, err := apis[2].Dht().FindProviders(ctx, p, options.Dht.NumProviders(1)) if err != nil { t.Fatal(err) From c3522b2cc24fb813435eedd9c809ab2c0a633035 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:22:36 +0200 Subject: [PATCH 2852/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-util@5df41752147cfd90051855e38df986c14b0b66be --- util/.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 util/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/util/.github/ISSUE_TEMPLATE/open_an_issue.md b/util/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/util/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From c5b5baded034cae4bbbe293bfce89f94964c6470 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:33:48 +0200 Subject: [PATCH 2853/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-chunker@0f2812fe69c0d6547c5d8f25aec25268153992c6 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 chunker/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/chunker/.github/ISSUE_TEMPLATE/open_an_issue.md b/chunker/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/chunker/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 8aec54ebab324edeee20c97d00aa2aa35d240d1d Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:33:55 +0200 Subject: [PATCH 2854/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-posinfo@fdc2e84e21803946d48d116850ba8e4869c68700 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 filestore/posinfo/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/filestore/posinfo/.github/ISSUE_TEMPLATE/open_an_issue.md b/filestore/posinfo/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/filestore/posinfo/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 2c8dec827506176298f4cb29180c42cb3108f310 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:34:13 +0200 Subject: [PATCH 2855/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-ds-help@f7b131a57a3d1378a0196eb152ad1be557a024c8 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 datastore/dshelp/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/datastore/dshelp/.github/ISSUE_TEMPLATE/open_an_issue.md b/datastore/dshelp/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/datastore/dshelp/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 9b67c100d646eb9518138a44419cb9ae63e1bd57 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:34:30 +0200 Subject: [PATCH 2856/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-routing@0c9de0d77040cd9d2886c509a26d2b72c9d15743 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 routing/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/routing/.github/ISSUE_TEMPLATE/open_an_issue.md b/routing/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/routing/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 59a94b07793e1e8d3b7b96474b208cb7d859431e Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:34:38 +0200 Subject: [PATCH 2857/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-blockstore@cc23c8874e8c1fdc8a75115b2aee8ee1322d0cb5 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 blockstore/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/blockstore/.github/ISSUE_TEMPLATE/open_an_issue.md b/blockstore/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/blockstore/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 0e84cf3d8bfe260b37a7b4db25563b8e60c0e37f Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:35:12 +0200 Subject: [PATCH 2858/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-exchange-interface@73498d2e745f84585bc71bfd77a15cd16d1407f6 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 exchange/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/exchange/.github/ISSUE_TEMPLATE/open_an_issue.md b/exchange/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/exchange/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 834a321166f3d3b765b83de5a95b798cdf0f2f39 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:35:28 +0200 Subject: [PATCH 2859/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-exchange-offline@9ab9d74dce80c393e2b17460c75bc608da38af79 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 exchange/offline/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/exchange/offline/.github/ISSUE_TEMPLATE/open_an_issue.md b/exchange/offline/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/exchange/offline/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 02f78e29078766e79c0bddc0be2865a0593dd900 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:36:07 +0200 Subject: [PATCH 2860/3147] Add standard issue template This commit was moved from ipfs/go-ipns@6e8c75e8c71f6bc3c3e618572fe019a5bfe442c8 --- ipns/.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 ipns/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/ipns/.github/ISSUE_TEMPLATE/open_an_issue.md b/ipns/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/ipns/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 86d8e7b76ad54d2c3952e3f45a0ffca6faf587d0 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:36:59 +0200 Subject: [PATCH 2861/3147] Add standard issue template This commit was moved from ipfs/go-verifcid@50d3f2f9beaab23b5266e686b94d3e12b35e15e9 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 verifcid/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/verifcid/.github/ISSUE_TEMPLATE/open_an_issue.md b/verifcid/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/verifcid/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From bfe5fc1f06c2ab9ee381a8b25ed679229b4f20c4 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:37:07 +0200 Subject: [PATCH 2862/3147] Add standard issue template This commit was moved from ipfs/go-blockservice@e93f46db9bcf3e93b18398f20f6a007daa1f7fec --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 blockservice/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/blockservice/.github/ISSUE_TEMPLATE/open_an_issue.md b/blockservice/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/blockservice/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From bcdda9436e9eea0a5921063c9e174933e319929a Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:37:24 +0200 Subject: [PATCH 2863/3147] Add standard issue template This commit was moved from ipfs/go-path@0a9ded5c825de59a73770c271b9cdd67bf5b1536 --- path/.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 path/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/path/.github/ISSUE_TEMPLATE/open_an_issue.md b/path/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/path/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From aa4387c09790e2f2cb87f8f7dfda2957dcd5d5ba Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:37:49 +0200 Subject: [PATCH 2864/3147] Add standard issue template This commit was moved from ipfs/go-unixfs@4192c7faa79444c30e95992665ae910e1954d429 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 unixfs/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/unixfs/.github/ISSUE_TEMPLATE/open_an_issue.md b/unixfs/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/unixfs/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From e0c660e7533498e8283641d9a3d0503af64c3e77 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:38:06 +0200 Subject: [PATCH 2865/3147] Add standard issue template This commit was moved from ipfs/go-mfs@b88bb60748a0be3e37ed83fe8b20524c7cc2f904 --- mfs/.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mfs/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/mfs/.github/ISSUE_TEMPLATE/open_an_issue.md b/mfs/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/mfs/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From cb9da11e1ce691702055d9c2f28c6177162910a0 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:38:14 +0200 Subject: [PATCH 2866/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-provider@0505db7f693243858a9c3e82a42be491a5faaa04 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 provider/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/provider/.github/ISSUE_TEMPLATE/open_an_issue.md b/provider/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/provider/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 169a00c8557472b4f0dd1d8f17e6883c9ab01898 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:40:20 +0200 Subject: [PATCH 2867/3147] Add standard issue template This commit was moved from ipfs/interface-go-ipfs-core@6ff6ad1717b1ce5b950b1b5abd8f4104deab7d30 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 coreiface/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/coreiface/.github/ISSUE_TEMPLATE/open_an_issue.md b/coreiface/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/coreiface/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 30f1981284603b004478a1abf2ba8de2b096bc50 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:43:11 +0200 Subject: [PATCH 2868/3147] Add standard issue template This commit was moved from ipfs/go-filestore@140842499d824102b6c0200327608a1aab681f95 --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 filestore/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/filestore/.github/ISSUE_TEMPLATE/open_an_issue.md b/filestore/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/filestore/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From b7869d476cf4b5e2b3abce99f7dc01d8da8efb27 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Apr 2020 11:45:15 +0200 Subject: [PATCH 2869/3147] Add standard issue template This commit was moved from ipfs/go-ipfs-pinner@9e800d1363c2cb23b8f82b3b1f0685b83367103a --- .../.github/ISSUE_TEMPLATE/open_an_issue.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 pinning/pinner/.github/ISSUE_TEMPLATE/open_an_issue.md diff --git a/pinning/pinner/.github/ISSUE_TEMPLATE/open_an_issue.md b/pinning/pinner/.github/ISSUE_TEMPLATE/open_an_issue.md new file mode 100644 index 0000000000..4fcbd00aca --- /dev/null +++ b/pinning/pinner/.github/ISSUE_TEMPLATE/open_an_issue.md @@ -0,0 +1,19 @@ +--- +name: Open an issue +about: Only for actionable issues relevant to this repository. +title: '' +labels: need/triage +assignees: '' + +--- + From 145640c6b9c12fb91df9ab0c3c36bb0177b5b26f Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 27 Apr 2020 17:21:21 -0700 Subject: [PATCH 2870/3147] fix several bugs 1. Don't log an error when shutting down while reproviding. 2. Reprovide on a fixed interval instead of treating the interval as a delay. 3. Remove trigger muting logic and use the simpler way. 4. Add some tests for triggering. 5. Make sure Reprovider.Close actually, you know, does something. And waits for the reprovider to stop. This commit was moved from ipfs/go-ipfs-provider@e2ee98e12df5fbccb482044e161c4ff877f7e342 --- provider/simple/reprovide.go | 112 ++++++++++++++++-------------- provider/simple/reprovide_test.go | 79 ++++++++++++++++++++- 2 files changed, 137 insertions(+), 54 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 59b49d807e..9531fd7b3e 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -20,12 +20,16 @@ var logR = logging.Logger("reprovider.simple") // KeyChanFunc is function streaming CIDs to pass to content routing type KeyChanFunc func(context.Context) (<-chan cid.Cid, error) -type doneFunc func(error) // Reprovider reannounces blocks to the network type Reprovider struct { - ctx context.Context - trigger chan doneFunc + // Reprovider context. Cancel to stop, then wait on doneCh. + ctx context.Context + cancel context.CancelFunc + doneCh chan struct{} + + // Trigger triggers a reprovide. + trigger chan chan<- error // The routing system to provide values through rsys routing.ContentRouting @@ -37,9 +41,12 @@ type Reprovider struct { // NewReprovider creates new Reprovider instance. func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys routing.ContentRouting, keyProvider KeyChanFunc) *Reprovider { + ctx, cancel := context.WithCancel(ctx) return &Reprovider{ ctx: ctx, - trigger: make(chan doneFunc), + cancel: cancel, + doneCh: make(chan struct{}), + trigger: make(chan chan<- error), rsys: rsys, keyProvider: keyProvider, @@ -49,44 +56,60 @@ func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys r // Close the reprovider func (rp *Reprovider) Close() error { + rp.cancel() + <-rp.doneCh return nil } // Run re-provides keys with 'tick' interval or when triggered func (rp *Reprovider) Run() { - // dont reprovide immediately. - // may have just started the daemon and shutting it down immediately. - // probability( up another minute | uptime ) increases with uptime. - after := time.After(time.Minute) - var done doneFunc - for { - if rp.tick == 0 { - after = make(chan time.Time) + defer close(rp.doneCh) + + var initialReprovideCh, reprovideCh <-chan time.Time + + // If reproviding is enabled (non-zero) + if rp.tick > 0 { + reprovideTicker := time.NewTicker(rp.tick) + defer reprovideTicker.Stop() + reprovideCh = reprovideTicker.C + + // If the reprovide ticker is larger than a minute (likely), + // provide once after we've been up a minute. + // + // Don't provide _immediately_ as we might be just about to stop. + if rp.tick > time.Minute { + initialReprovideTimer := time.NewTimer(time.Minute) + defer initialReprovideTimer.Stop() + + initialReprovideCh = initialReprovideTimer.C } + } + var done chan<- error + for rp.ctx.Err() == nil { select { + case <-initialReprovideCh: + case <-reprovideCh: + case done = <-rp.trigger: case <-rp.ctx.Done(): return - case done = <-rp.trigger: - case <-after: } - //'mute' the trigger channel so when `ipfs bitswap reprovide` is called - //a 'reprovider is already running' error is returned - unmute := rp.muteTrigger() - err := rp.Reprovide() - if err != nil { + + // only log if we've hit an actual error, otherwise just tell the client we're shutting down + if rp.ctx.Err() != nil { + err = fmt.Errorf("shutting down") + } else if err != nil { logR.Errorf("failed to reprovide: %s", err) } if done != nil { - done(err) + if err != nil { + done <- err + } + close(done) } - - unmute() - - after = time.After(rp.tick) } } @@ -119,44 +142,27 @@ func (rp *Reprovider) Reprovide() error { return nil } -// Trigger starts reprovision process in rp.Run and waits for it +// Trigger starts reprovision process in rp.Run and waits for it to finish. +// +// Returns an error if a reprovide is already in progress. func (rp *Reprovider) Trigger(ctx context.Context) error { - progressCtx, done := context.WithCancel(ctx) - - var err error - df := func(e error) { - err = e - done() + doneCh := make(chan error, 1) + select { + case rp.trigger <- doneCh: + default: + return fmt.Errorf("reprovider is already running") } select { + case err := <-doneCh: + return err case <-rp.ctx.Done(): - return context.Canceled + return fmt.Errorf("reprovide service stopping") case <-ctx.Done(): - return context.Canceled - case rp.trigger <- df: - <-progressCtx.Done() - return err + return ctx.Err() } } -func (rp *Reprovider) muteTrigger() context.CancelFunc { - ctx, cf := context.WithCancel(rp.ctx) - go func() { - defer cf() - for { - select { - case <-ctx.Done(): - return - case done := <-rp.trigger: - done(fmt.Errorf("reprovider is already running")) - } - } - }() - - return cf -} - // Strategies // NewBlockstoreProvider returns key provider using bstore.AllKeysChan diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 322e4c10ae..0b9271d3a5 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -63,6 +63,22 @@ func setupDag(t *testing.T) (nodes []cid.Cid, bstore blockstore.Blockstore) { } func TestReprovide(t *testing.T) { + testReprovide(t, func(r *Reprovider, ctx context.Context) error { + return r.Reprovide() + }) +} + +func TestTrigger(t *testing.T) { + testReprovide(t, func(r *Reprovider, ctx context.Context) error { + go r.Run() + time.Sleep(1 * time.Second) + defer r.Close() + err := r.Trigger(ctx) + return err + }) +} + +func testReprovide(t *testing.T, trigger func(r *Reprovider, ctx context.Context) error) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -71,7 +87,7 @@ func TestReprovide(t *testing.T) { keyProvider := NewBlockstoreProvider(bstore) reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) - err := reprov.Reprovide() + err := trigger(reprov, ctx) if err != nil { t.Fatal(err) } @@ -95,6 +111,67 @@ func TestReprovide(t *testing.T) { } } +func TestTriggerTwice(t *testing.T) { + // Ensure we can only trigger once at a time. + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + clA, _, _, _ := setupRouting(t) + + keyCh := make(chan cid.Cid) + startCh := make(chan struct{}) + keyFunc := func(ctx context.Context) (<-chan cid.Cid, error) { + <-startCh + return keyCh, nil + } + + reprov := NewReprovider(ctx, time.Hour, clA, keyFunc) + go reprov.Run() + defer reprov.Close() + + // Wait for the reprovider to start, otherwise, the reprovider will + // think a concurrent reprovide is running. + // + // We _could_ fix this race... but that would be complexity for nothing. + // 1. We start a reprovide 1 minute after startup anyways. + // 2. The window is really narrow. + time.Sleep(1 * time.Second) + + errCh := make(chan error, 2) + + // Trigger in the background + go func() { + errCh <- reprov.Trigger(ctx) + }() + + // Wait for the trigger to really start. + startCh <- struct{}{} + + // Try to trigger again, this should fail immediately. + if err := reprov.Trigger(ctx); err == nil { + t.Fatal("expected an error") + } + + // Let the trigger progress. + close(keyCh) + + // Check the result. + err := <-errCh + if err != nil { + t.Fatal(err) + } + + // Try to trigger again, this should work. + go func() { + errCh <- reprov.Trigger(ctx) + }() + startCh <- struct{}{} + err = <-errCh + if err != nil { + t.Fatal(err) + } +} + type mockPinner struct { recursive []cid.Cid direct []cid.Cid From 2fe44c30b5a0c7fd298b710832f97c5a535a349a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 27 Apr 2020 17:43:59 -0700 Subject: [PATCH 2871/3147] fix comment wording Co-Authored-By: Will This commit was moved from ipfs/go-ipfs-provider@4daf83d0194c8e563f57a07402a49e5031a455ca --- provider/simple/reprovide.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 9531fd7b3e..be804a2a98 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -142,7 +142,7 @@ func (rp *Reprovider) Reprovide() error { return nil } -// Trigger starts reprovision process in rp.Run and waits for it to finish. +// Trigger starts the reprovision process in rp.Run and waits for it to finish. // // Returns an error if a reprovide is already in progress. func (rp *Reprovider) Trigger(ctx context.Context) error { From abe7522a79a79ecbd427bba275094ca0198b4c19 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 27 Apr 2020 17:52:09 -0700 Subject: [PATCH 2872/3147] fix: code review This commit was moved from ipfs/go-ipfs-provider@3c0bbfcc0e503c4c05073aebb792125be25a3591 --- provider/simple/reprovide.go | 34 +++++++++++++++++-------------- provider/simple/reprovide_test.go | 4 ++++ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index be804a2a98..bfe6173e1d 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -2,6 +2,7 @@ package simple import ( "context" + "errors" "fmt" "time" @@ -18,15 +19,18 @@ import ( var logR = logging.Logger("reprovider.simple") +// ErrClosed is returned by Trigger when operating on a closed reprovider. +var ErrClosed = errors.New("reprovider service stopped") + // KeyChanFunc is function streaming CIDs to pass to content routing type KeyChanFunc func(context.Context) (<-chan cid.Cid, error) // Reprovider reannounces blocks to the network type Reprovider struct { - // Reprovider context. Cancel to stop, then wait on doneCh. - ctx context.Context - cancel context.CancelFunc - doneCh chan struct{} + // Reprovider context. Cancel to stop, then wait on closedCh. + ctx context.Context + cancel context.CancelFunc + closedCh chan struct{} // Trigger triggers a reprovide. trigger chan chan<- error @@ -43,10 +47,10 @@ type Reprovider struct { func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys routing.ContentRouting, keyProvider KeyChanFunc) *Reprovider { ctx, cancel := context.WithCancel(ctx) return &Reprovider{ - ctx: ctx, - cancel: cancel, - doneCh: make(chan struct{}), - trigger: make(chan chan<- error), + ctx: ctx, + cancel: cancel, + closedCh: make(chan struct{}), + trigger: make(chan chan<- error), rsys: rsys, keyProvider: keyProvider, @@ -57,13 +61,13 @@ func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys r // Close the reprovider func (rp *Reprovider) Close() error { rp.cancel() - <-rp.doneCh + <-rp.closedCh return nil } // Run re-provides keys with 'tick' interval or when triggered func (rp *Reprovider) Run() { - defer close(rp.doneCh) + defer close(rp.closedCh) var initialReprovideCh, reprovideCh <-chan time.Time @@ -99,7 +103,7 @@ func (rp *Reprovider) Run() { // only log if we've hit an actual error, otherwise just tell the client we're shutting down if rp.ctx.Err() != nil { - err = fmt.Errorf("shutting down") + err = ErrClosed } else if err != nil { logR.Errorf("failed to reprovide: %s", err) } @@ -146,18 +150,18 @@ func (rp *Reprovider) Reprovide() error { // // Returns an error if a reprovide is already in progress. func (rp *Reprovider) Trigger(ctx context.Context) error { - doneCh := make(chan error, 1) + resultCh := make(chan error, 1) select { - case rp.trigger <- doneCh: + case rp.trigger <- resultCh: default: return fmt.Errorf("reprovider is already running") } select { - case err := <-doneCh: + case err := <-resultCh: return err case <-rp.ctx.Done(): - return fmt.Errorf("reprovide service stopping") + return ErrClosed case <-ctx.Done(): return ctx.Err() } diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 0b9271d3a5..3858baf5e9 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -147,10 +147,14 @@ func TestTriggerTwice(t *testing.T) { // Wait for the trigger to really start. startCh <- struct{}{} + start := time.Now() // Try to trigger again, this should fail immediately. if err := reprov.Trigger(ctx); err == nil { t.Fatal("expected an error") } + if time.Since(start) > 10*time.Millisecond { + t.Fatal("expected reprovide to fail instantly") + } // Let the trigger progress. close(keyCh) From 7d04b4be9f5b4f3b2f090f8ce3d660c00ec41f6f Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 29 Apr 2020 17:57:38 -0400 Subject: [PATCH 2873/3147] fix: do not use hard coded IPNS Publish maximum timeout duration This commit was moved from ipfs/go-namesys@32b17801321722098b96662139dcf790d4c74b01 --- namesys/publisher.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 1fa0c96c9c..f558eaf288 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -22,7 +22,6 @@ import ( const ipnsPrefix = "/ipns/" -const PublishPutValTimeout = time.Minute const DefaultRecordEOL = 24 * time.Hour // IpnsPublisher is capable of publishing and resolving names to the IPFS @@ -269,15 +268,10 @@ func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk } // Store associated public key - timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) - defer cancel() - return r.PutValue(timectx, k, pkbytes) + return r.PutValue(ctx, k, pkbytes) } func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec *pb.IpnsEntry) error { - timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) - defer cancel() - data, err := proto.Marshal(rec) if err != nil { return err @@ -285,7 +279,7 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+h(pubkey) - return r.PutValue(timectx, ipnskey, data) + return r.PutValue(ctx, ipnskey, data) } // InitializeKeyspace sets the ipns record for the given key to From a40d95cafbd902f90b53dcd512017a2f37a9e03c Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 29 Apr 2020 17:57:38 -0400 Subject: [PATCH 2874/3147] fix: do not use hard coded IPNS Publish maximum timeout duration This commit was moved from ipfs/go-namesys@6f468ea0034aba4840fc0e4c4106b090a7c7849f --- namesys/publisher.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 1fa0c96c9c..f558eaf288 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -22,7 +22,6 @@ import ( const ipnsPrefix = "/ipns/" -const PublishPutValTimeout = time.Minute const DefaultRecordEOL = 24 * time.Hour // IpnsPublisher is capable of publishing and resolving names to the IPFS @@ -269,15 +268,10 @@ func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk } // Store associated public key - timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) - defer cancel() - return r.PutValue(timectx, k, pkbytes) + return r.PutValue(ctx, k, pkbytes) } func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec *pb.IpnsEntry) error { - timectx, cancel := context.WithTimeout(ctx, PublishPutValTimeout) - defer cancel() - data, err := proto.Marshal(rec) if err != nil { return err @@ -285,7 +279,7 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec log.Debugf("Storing ipns entry at: %s", ipnskey) // Store ipns entry at "/ipns/"+h(pubkey) - return r.PutValue(timectx, ipnskey, data) + return r.PutValue(ctx, ipnskey, data) } // InitializeKeyspace sets the ipns record for the given key to From 21a27def4907d97fdfa64a472ccd1a04ca59f112 Mon Sep 17 00:00:00 2001 From: Dominic Della Valle Date: Thu, 14 May 2020 18:58:30 -0400 Subject: [PATCH 2875/3147] Fix incorrect mutex unlock call in File.Open This commit was moved from ipfs/go-mfs@6163f562f6f2d3848dcf6189080d58194ac898ab --- mfs/file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mfs/file.go b/mfs/file.go index 280bf93ab2..bbe508ac3e 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -64,7 +64,7 @@ func (fi *File) Open(flags Flags) (_ FileDescriptor, _retErr error) { fi.desclock.RLock() defer func() { if _retErr != nil { - fi.desclock.Unlock() + fi.desclock.RUnlock() } }() } else { From dde007b98dbae91f5f2e03b743ae256dede75087 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 17 Jun 2020 19:42:14 -0700 Subject: [PATCH 2876/3147] fix: close resolve channel before returning it This commit was moved from ipfs/go-namesys@dd76900f0730e6158cf7628051eaff0ea5d6433c --- namesys/namesys.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 933ce789db..bf028c099a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -86,16 +86,19 @@ func (ns *mpns) Resolve(ctx context.Context, name string, options ...opts.Resolv } func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { - res := make(chan Result, 1) if strings.HasPrefix(name, "/ipfs/") { p, err := path.ParsePath(name) + res := make(chan Result, 1) res <- Result{p, err} + close(res) return res } if !strings.HasPrefix(name, "/") { p, err := path.ParsePath("/ipfs/" + name) + res := make(chan Result, 1) res <- Result{p, err} + close(res) return res } From 2d40fae7c27bd7e573ba7c2f613aa9fc80746a8d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 17 Jun 2020 19:50:51 -0700 Subject: [PATCH 2877/3147] fix: return results from resolve once Previously, we'd return the error + result, then the result. This commit was moved from ipfs/go-namesys@cd4fdab9277b3d15a1b831f0f222034280c0d702 --- namesys/namesys.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index bf028c099a..ac7fb0383f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -123,15 +123,12 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. key := segments[2] if p, ok := ns.cacheGet(key); ok { + var err error if len(segments) > 3 { - var err error p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) - if err != nil { - emitOnceResult(ctx, out, onceResult{value: p, err: err}) - } } - out <- onceResult{value: p} + out <- onceResult{value: p, err: err} close(out) return out } @@ -183,17 +180,15 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. best = res } p := res.value + err := res.err + ttl := res.ttl // Attach rest of the path if len(segments) > 3 { - var err error p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) - if err != nil { - emitOnceResult(ctx, out, onceResult{value: p, ttl: res.ttl, err: err}) - } } - emitOnceResult(ctx, out, onceResult{value: p, ttl: res.ttl, err: res.err}) + emitOnceResult(ctx, out, onceResult{value: p, ttl: ttl, err: err}) case <-ctx.Done(): return } From b36e937e33bed6f58ccb4a6035c86d259082d363 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 24 Jun 2020 16:51:38 +0200 Subject: [PATCH 2878/3147] Avoid modifying passed in slice of cids Signed-off-by: Jakub Sztandera This commit was moved from ipfs/go-blockservice@a978cec6e834457d91dc4309fc4d439583faae8b --- blockservice/blockservice.go | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index ba0ab41830..9cf96a8667 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -273,17 +273,28 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget go func() { defer close(out) - k := 0 + allValid := true for _, c := range ks { - // hash security - if err := verifcid.ValidateCid(c); err == nil { - ks[k] = c - k++ - } else { - log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) + if err := verifcid.ValidateCid(c); err != nil { + allValid = false + break } } - ks = ks[:k] + + if !allValid { + ks2 := make([]cid.Cid, len(ks)) + k := 0 + for _, c := range ks { + // hash security + if err := verifcid.ValidateCid(c); err == nil { + ks2[k] = c + k++ + } else { + log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) + } + } + ks = ks2[:k] + } var misses []cid.Cid for _, c := range ks { From ed1f46e620a6b5563707889f4329ee63dc39a458 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 24 Jun 2020 17:23:42 +0200 Subject: [PATCH 2879/3147] Use append instead of index assign Co-authored-by: Steven Allen This commit was moved from ipfs/go-blockservice@5ca73b911fb3769e1376a15a8da1cee22f1207d3 --- blockservice/blockservice.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 9cf96a8667..33f69141c6 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -282,18 +282,16 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget } if !allValid { - ks2 := make([]cid.Cid, len(ks)) - k := 0 + ks2 := make([]cid.Cid, 0, len(ks)) for _, c := range ks { // hash security if err := verifcid.ValidateCid(c); err == nil { - ks2[k] = c - k++ + ks2 = append(ks2, c) } else { log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) } } - ks = ks2[:k] + ks = ks2 } var misses []cid.Cid From f240accde27bd0145587f4ceb7f6a640df95ae53 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 23 Jul 2020 18:53:52 -0700 Subject: [PATCH 2880/3147] Optimize id store Prefix() is now much faster than extracting the hash. This commit was moved from ipfs/go-ipfs-blockstore@8f7c32424c55e6e0cc75a7e743fddaf2329d583f --- blockstore/idstore.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blockstore/idstore.go b/blockstore/idstore.go index 2a5bf84156..477da70b20 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -18,6 +18,11 @@ func NewIdStore(bs Blockstore) Blockstore { } func extractContents(k cid.Cid) (bool, []byte) { + // Pre-check by calling Prefix(), this much faster than extracting the hash. + if k.Prefix().MhType != mh.IDENTITY { + return false, nil + } + dmh, err := mh.Decode(k.Hash()) if err != nil || dmh.Code != mh.ID { return false, nil From 7bcd64373825dfda1ef91c9d9157a5328928cc09 Mon Sep 17 00:00:00 2001 From: Petar Maymounkov Date: Wed, 22 Jul 2020 09:05:14 -0700 Subject: [PATCH 2881/3147] add id and key formatting utils; format keys as b36cid by default; update tests This commit was moved from ipfs/interface-go-ipfs-core@c604c5b0338c075046d7ddf0b60c5927500607d3 --- coreiface/idfmt.go | 19 ++++++++++++++++ coreiface/tests/key.go | 49 +++++++++++++++++++++++++++-------------- coreiface/tests/name.go | 30 ++++++++++++------------- 3 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 coreiface/idfmt.go diff --git a/coreiface/idfmt.go b/coreiface/idfmt.go new file mode 100644 index 0000000000..1ba79e6023 --- /dev/null +++ b/coreiface/idfmt.go @@ -0,0 +1,19 @@ +package iface + +import ( + peer "github.com/libp2p/go-libp2p-core/peer" + mbase "github.com/multiformats/go-multibase" +) + +func FormatKeyID(id peer.ID) string { + if s, err := peer.ToCid(id).StringOfBase(mbase.Base36); err != nil { + panic(err) + } else { + return s + } +} + +// FormatKey formats the given IPNS key in a canonical way. +func FormatKey(key Key) string { + return FormatKeyID(key.ID()) +} diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index 265a8f0608..c3cd8626fa 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -5,8 +5,11 @@ import ( "strings" "testing" - "github.com/ipfs/interface-go-ipfs-core" + cid "github.com/ipfs/go-cid" + coreiface "github.com/ipfs/interface-go-ipfs-core" + iface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" + mbase "github.com/multiformats/go-multibase" ) func (tp *TestSuite) TestKey(t *testing.T) { @@ -64,8 +67,8 @@ func (tp *TestSuite) TestListSelf(t *testing.T) { t.Errorf("expected the key to be called 'self', got '%s'", keys[0].Name()) } - if keys[0].Path().String() != "/ipns/"+self.ID().Pretty() { - t.Errorf("expected the key to have path '/ipns/%s', got '%s'", self.ID().Pretty(), keys[0].Path().String()) + if keys[0].Path().String() != "/ipns/"+coreiface.FormatKeyID(self.ID()) { + t.Errorf("expected the key to have path '/ipns/%s', got '%s'", coreiface.FormatKeyID(self.ID()), keys[0].Path().String()) } } @@ -134,9 +137,30 @@ func (tp *TestSuite) TestGenerate(t *testing.T) { t.Errorf("expected the key to be called 'foo', got '%s'", k.Name()) } - if !strings.HasPrefix(k.Path().String(), "/ipns/Qm") { - t.Errorf("expected the key to be prefixed with '/ipns/Qm', got '%s'", k.Path().String()) + verifyIPNSPath(t, k.Path().String()) +} + +func verifyIPNSPath(t *testing.T, p string) bool { + t.Helper() + if !strings.HasPrefix(p, "/ipns/") { + t.Errorf("path %q does not look like an IPNS path", p) + return false + } + k := p[len("/ipns/"):] + c, err := cid.Decode(k) + if err != nil { + t.Errorf("failed to decode IPNS key %q (%v)", k, err) + return false + } + b36, err := c.StringOfBase(mbase.Base36) + if err != nil { + t.Fatalf("cid cannot format itself in b36") + return false + } + if b36 != k { + t.Errorf("IPNS key is not base36") } + return true } func (tp *TestSuite) TestGenerateSize(t *testing.T) { @@ -157,9 +181,7 @@ func (tp *TestSuite) TestGenerateSize(t *testing.T) { t.Errorf("expected the key to be called 'foo', got '%s'", k.Name()) } - if !strings.HasPrefix(k.Path().String(), "/ipns/Qm") { - t.Errorf("expected the key to be prefixed with '/ipns/Qm', got '%s'", k.Path().String()) - } + verifyIPNSPath(t, k.Path().String()) } func (tp *TestSuite) TestGenerateType(t *testing.T) { @@ -256,15 +278,8 @@ func (tp *TestSuite) TestList(t *testing.T) { return } - if !strings.HasPrefix(l[0].Path().String(), "/ipns/Qm") { - t.Fatalf("expected key 0 to be prefixed with '/ipns/Qm', got '%s'", l[0].Name()) - return - } - - if !strings.HasPrefix(l[1].Path().String(), "/ipns/Qm") { - t.Fatalf("expected key 1 to be prefixed with '/ipns/Qm', got '%s'", l[1].Name()) - return - } + verifyIPNSPath(t, l[0].Path().String()) + verifyIPNSPath(t, l[1].Path().String()) } func (tp *TestSuite) TestRename(t *testing.T) { diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 31a5c14663..021c1bb975 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -2,15 +2,15 @@ package tests import ( "context" - path "github.com/ipfs/interface-go-ipfs-core/path" "io" "math/rand" gopath "path" "testing" "time" - "github.com/ipfs/go-ipfs-files" - ipath "github.com/ipfs/go-path" + path "github.com/ipfs/interface-go-ipfs-core/path" + + files "github.com/ipfs/go-ipfs-files" coreiface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" @@ -70,8 +70,8 @@ func (tp *TestSuite) TestPublishResolve(t *testing.T) { t.Fatal(err) } - if e.Name() != self.ID().Pretty() { - t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + if e.Name() != coreiface.FormatKeyID(self.ID()) { + t.Errorf("expected e.Name to equal '%s', got '%s'", coreiface.FormatKeyID(self.ID()), e.Name()) } if e.Value().String() != p.String() { @@ -100,8 +100,8 @@ func (tp *TestSuite) TestPublishResolve(t *testing.T) { t.Fatal(err) } - if e.Name() != self.ID().Pretty() { - t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + if e.Name() != coreiface.FormatKeyID(self.ID()) { + t.Errorf("expected e.Name to equal '%s', got '%s'", coreiface.FormatKeyID(self.ID()), e.Name()) } if e.Value().String() != p.String()+"/test" { @@ -130,8 +130,8 @@ func (tp *TestSuite) TestPublishResolve(t *testing.T) { t.Fatal(err) } - if e.Name() != self.ID().Pretty() { - t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + if e.Name() != coreiface.FormatKeyID(self.ID()) { + t.Errorf("expected e.Name to equal '%s', got '%s'", coreiface.FormatKeyID(self.ID()), e.Name()) } if e.Value().String() != p.String() { @@ -160,8 +160,8 @@ func (tp *TestSuite) TestPublishResolve(t *testing.T) { t.Fatal(err) } - if e.Name() != self.ID().Pretty() { - t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + if e.Name() != coreiface.FormatKeyID(self.ID()) { + t.Errorf("expected e.Name to equal '%s', got '%s'", coreiface.FormatKeyID(self.ID()), e.Name()) } if e.Value().String() != p.String()+"/a" { @@ -212,8 +212,8 @@ func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) { t.Fatal(err) } - if ipath.Join([]string{"/ipns", e.Name()}) != k.Path().String() { - t.Errorf("expected e.Name to equal '%s', got '%s'", e.Name(), k.Path().String()) + if e.Name() != coreiface.FormatKey(k) { + t.Errorf("expected e.Name to equal %s, got '%s'", e.Name(), coreiface.FormatKey(k)) } if e.Value().String() != p.String() { @@ -255,8 +255,8 @@ func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) { t.Fatal(err) } - if e.Name() != self.ID().Pretty() { - t.Errorf("expected e.Name to equal '%s', got '%s'", self.ID().Pretty(), e.Name()) + if e.Name() != coreiface.FormatKeyID(self.ID()) { + t.Errorf("expected e.Name to equal '%s', got '%s'", coreiface.FormatKeyID(self.ID()), e.Name()) } if e.Value().String() != p.String() { From 580f84a75f8c3486ad88da5656bc3b43bf50ba4c Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 11 Aug 2020 18:42:20 -0400 Subject: [PATCH 2882/3147] fix: queue: switch from using a time based counter to a monotonic one This commit was moved from ipfs/go-ipfs-provider@071d037e32b3589f2065568d981f46a999b43a87 --- provider/queue/queue.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/provider/queue/queue.go b/provider/queue/queue.go index 2c33502563..4e31c8caeb 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -3,8 +3,6 @@ package queue import ( "context" "fmt" - "time" - cid "github.com/ipfs/go-cid" datastore "github.com/ipfs/go-datastore" namespace "github.com/ipfs/go-datastore/namespace" @@ -29,6 +27,8 @@ type Queue struct { enqueue chan cid.Cid close context.CancelFunc closed chan struct{} + + counter int } // NewQueue creates a queue for cids @@ -117,7 +117,8 @@ func (q *Queue) work() { select { case toQueue := <-q.enqueue: - keyPath := fmt.Sprintf("%d/%s", time.Now().UnixNano(), c.String()) + keyPath := fmt.Sprintf("%063d/%s", q.counter, c.String()) + q.counter++ nextKey := datastore.NewKey(keyPath) if err := q.ds.Put(nextKey, toQueue.Bytes()); err != nil { From 014af4befcdda83aef977c19059fe3e3d1560019 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 14 Aug 2020 18:08:09 -0400 Subject: [PATCH 2883/3147] Stop searching for public keys before doing an IPNS Get (#7549) * feat: stop checking the DHT for public keys before doing an IPNS get. It has been many releases since we started adding the public keys into the IPNS records by default. This commit was moved from ipfs/go-namesys@4887042b38faeb44927cf55f4fdbc63821edaa01 --- namesys/ipns_resolver_validation_test.go | 90 +++++++++++++----------- namesys/routing.go | 14 ---- 2 files changed, 50 insertions(+), 54 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 1fd7488b9e..1e342f2590 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -10,6 +10,7 @@ import ( mockrouting "github.com/ipfs/go-ipfs-routing/mock" offline "github.com/ipfs/go-ipfs-routing/offline" ipns "github.com/ipfs/go-ipns" + ipns_pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ci "github.com/libp2p/go-libp2p-core/crypto" @@ -23,6 +24,25 @@ import ( ) func TestResolverValidation(t *testing.T) { + t.Run("RSA", + func(t *testing.T) { + testResolverValidation(t, ci.RSA) + }) + t.Run("Ed25519", + func(t *testing.T) { + testResolverValidation(t, ci.Ed25519) + }) + t.Run("ECDSA", + func(t *testing.T) { + testResolverValidation(t, ci.ECDSA) + }) + t.Run("Secp256k1", + func(t *testing.T) { + testResolverValidation(t, ci.Secp256k1) + }) +} + +func testResolverValidation(t *testing.T, keyType int) { ctx := context.Background() rid := testutil.RandIdentityOrFatal(t) dstore := dssync.MutexWrap(ds.NewMapDatastore()) @@ -34,16 +54,10 @@ func TestResolverValidation(t *testing.T) { nvVstore := offline.NewOfflineRouter(dstore, mockrouting.MockValidator{}) // Create entry with expiry in one hour - priv, id, _, ipnsDHTPath := genKeys(t) + priv, id, _, ipnsDHTPath := genKeys(t, keyType) ts := time.Now() p := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - entry, err := ipns.Create(priv, p, 1, ts.Add(time.Hour)) - if err != nil { - t.Fatal(err) - } - - // Make peer's public key available in peer store - err = peerstore.AddPubKey(id, priv.GetPublic()) + entry, err := createIPNSRecordWithEmbeddedPublicKey(priv, p, 1, ts.Add(time.Hour)) if err != nil { t.Fatal(err) } @@ -63,7 +77,7 @@ func TestResolverValidation(t *testing.T) { t.Fatalf("Mismatch between published path %s and resolved path %s", p, resp) } // Create expired entry - expiredEntry, err := ipns.Create(priv, p, 1, ts.Add(-1*time.Hour)) + expiredEntry, err := createIPNSRecordWithEmbeddedPublicKey(priv, p, 1, ts.Add(-1*time.Hour)) if err != nil { t.Fatal(err) } @@ -81,13 +95,7 @@ func TestResolverValidation(t *testing.T) { } // Create IPNS record path with a different private key - priv2, id2, _, ipnsDHTPath2 := genKeys(t) - - // Make peer's public key available in peer store - err = peerstore.AddPubKey(id2, priv2.GetPublic()) - if err != nil { - t.Fatal(err) - } + priv2, id2, _, ipnsDHTPath2 := genKeys(t, keyType) // Publish entry err = PublishEntry(ctx, nvVstore, ipnsDHTPath2, entry) @@ -102,50 +110,52 @@ func TestResolverValidation(t *testing.T) { t.Fatal("ValidateIpnsRecord should have failed signature verification") } - // Publish entry without making public key available in peer store - priv3, id3, pubkDHTPath3, ipnsDHTPath3 := genKeys(t) - entry3, err := ipns.Create(priv3, p, 1, ts.Add(time.Hour)) - if err != nil { + // Try embedding the incorrect private key inside the entry + if err := ipns.EmbedPublicKey(priv2.GetPublic(), entry); err != nil { t.Fatal(err) } - err = PublishEntry(ctx, nvVstore, ipnsDHTPath3, entry3) + + // Publish entry + err = PublishEntry(ctx, nvVstore, ipnsDHTPath2, entry) if err != nil { t.Fatal(err) } - // Record should fail validation because public key is not available - // in peer store or on network - _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts()) + // Record should fail validation because public key defined by + // ipns path doesn't match record signature + _, err = resolve(ctx, resolver, id2.Pretty(), opts.DefaultResolveOpts()) if err == nil { - t.Fatal("ValidateIpnsRecord should have failed because public key was not found") + t.Fatal("ValidateIpnsRecord should have failed signature verification") + } +} + +func genKeys(t *testing.T, keyType int) (ci.PrivKey, peer.ID, string, string) { + bits := 0 + if keyType == ci.RSA { + bits = 2048 } - // Publish public key to the network - err = PublishPublicKey(ctx, vstore, pubkDHTPath3, priv3.GetPublic()) + sk, pk, err := test.RandTestKeyPair(keyType, bits) if err != nil { t.Fatal(err) } - - // Record should now pass validation because resolver will ensure - // public key is available in the peer store by looking it up in - // the DHT, which causes the DHT to fetch it and cache it in the - // peer store - _, err = resolve(ctx, resolver, id3.Pretty(), opts.DefaultResolveOpts()) + id, err := peer.IDFromPublicKey(pk) if err != nil { t.Fatal(err) } + return sk, id, PkKeyForID(id), ipns.RecordKey(id) } -func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string, string) { - sk, pk, err := test.RandTestKeyPair(ci.RSA, 2048) +func createIPNSRecordWithEmbeddedPublicKey(sk ci.PrivKey, val []byte, seq uint64, eol time.Time) (*ipns_pb.IpnsEntry, error){ + entry, err := ipns.Create(sk, val, seq, eol) if err != nil { - t.Fatal(err) + return nil, err } - id, err := peer.IDFromPublicKey(pk) - if err != nil { - t.Fatal(err) + if err := ipns.EmbedPublicKey(sk.GetPublic(), entry); err != nil { + return nil, err } - return sk, id, PkKeyForID(id), ipns.RecordKey(id) + + return entry, nil } type mockValueStore struct { diff --git a/namesys/routing.go b/namesys/routing.go index 60928fbca6..8bdfe21e65 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -69,20 +69,6 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option return out } - // Name should be the hash of a public key retrievable from ipfs. - // We retrieve the public key here to make certain that it's in the peer - // store before calling GetValue() on the DHT - the DHT will call the - // ipns validator, which in turn will get the public key from the peer - // store to verify the record signature - _, err = routing.GetPublicKey(r.routing, ctx, pid) - if err != nil { - log.Debugf("RoutingResolver: could not retrieve public key %s: %s\n", name, err) - out <- onceResult{err: err} - close(out) - cancel() - return out - } - // Use the routing system to get the name. // Note that the DHT will call the ipns validator when retrieving // the value, which in turn verifies the ipns record signature From 03b5665a74a1ad6044732da0e83807b91303a477 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Mon, 17 Aug 2020 06:58:57 -0400 Subject: [PATCH 2884/3147] chore: go fmt This commit was moved from ipfs/go-namesys@b5163cdfeaa1825fa5686544ed28aab4c0c8d702 --- namesys/ipns_resolver_validation_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 1e342f2590..5dbfabf9cd 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -146,7 +146,7 @@ func genKeys(t *testing.T, keyType int) (ci.PrivKey, peer.ID, string, string) { return sk, id, PkKeyForID(id), ipns.RecordKey(id) } -func createIPNSRecordWithEmbeddedPublicKey(sk ci.PrivKey, val []byte, seq uint64, eol time.Time) (*ipns_pb.IpnsEntry, error){ +func createIPNSRecordWithEmbeddedPublicKey(sk ci.PrivKey, val []byte, seq uint64, eol time.Time) (*ipns_pb.IpnsEntry, error) { entry, err := ipns.Create(sk, val, seq, eol) if err != nil { return nil, err From 70bffa80b2f1c200e26cb7750c932aa637fb9f8d Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 7 Aug 2020 16:49:02 -0400 Subject: [PATCH 2885/3147] Namesys cache uses IPNS keys with their binary representation instead of string representation to avoid encoding mismatches This commit was moved from ipfs/go-namesys@e18c5332c43a010c317a2a94319e97f8855a7826 --- namesys/namesys.go | 35 ++++++++++++++++++++--------------- namesys/namesys_test.go | 2 +- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index ac7fb0383f..760d04c178 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -122,24 +122,13 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. key := segments[2] - if p, ok := ns.cacheGet(key); ok { - var err error - if len(segments) > 3 { - p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) - } - - out <- onceResult{value: p, err: err} - close(out) - return out - } - // Resolver selection: // 1. if it is a PeerID/CID/multihash resolve through "ipns". // 2. if it is a domain name, resolve through "dns" // 3. otherwise resolve through the "proquint" resolver var res resolver - _, err := peer.Decode(key) + ipnsKey, err := peer.Decode(key) // CIDs in IPNS are expected to have libp2p-key multicodec // We ease the transition by returning a more meaningful error with a valid CID @@ -155,6 +144,22 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. } } + cacheKey := key + if err == nil { + cacheKey = string(ipnsKey) + } + + if p, ok := ns.cacheGet(cacheKey); ok { + var err error + if len(segments) > 3 { + p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) + } + + out <- onceResult{value: p, err: err} + close(out) + return out + } + if err == nil { res = ns.ipnsResolver } else if isd.IsDomain(key) { @@ -172,7 +177,7 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. case res, ok := <-resCh: if !ok { if best != (onceResult{}) { - ns.cacheSet(key, best.value, best.ttl) + ns.cacheSet(cacheKey, best.value, best.ttl) } return } @@ -218,7 +223,7 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. if err := ns.ipnsPublisher.PublishWithEOL(ctx, name, value, eol); err != nil { // Invalidate the cache. Publishing may _partially_ succeed but // still return an error. - ns.cacheInvalidate(peer.Encode(id)) + ns.cacheInvalidate(string(id)) return err } ttl := DefaultResolverCacheTTL @@ -228,6 +233,6 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. if ttEol := time.Until(eol); ttEol < ttl { ttl = ttEol } - ns.cacheSet(peer.Encode(id), value, ttl) + ns.cacheSet(string(id), value, ttl) return nil } diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index b3e963c9e9..cc0ca69590 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -155,7 +155,7 @@ func TestPublishWithTTL(t *testing.T) { if err != nil { t.Fatal(err) } - ientry, ok := nsys.(*mpns).cache.Get(pid.Pretty()) + ientry, ok := nsys.(*mpns).cache.Get(string(pid)) if !ok { t.Fatal("cache get failed") } From 2aa5ac68046d417aa2c4f92f94503ccb8918d08c Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 26 Aug 2020 13:17:48 -0400 Subject: [PATCH 2886/3147] ResolveToLastNode no longer fetches nodes it does not need This commit was moved from ipfs/go-path@ac811c4b484b06ea22da1071890e94fb4b7ab9be --- path/resolver/resolver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 67bb9f6fb6..9f153840c8 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -89,6 +89,10 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. return cid.Cid{}, nil, err } + if len(rest) == 0 { + return lnk.Cid, nil, nil + } + next, err := lnk.GetNode(ctx, r.DAG) if err != nil { return cid.Cid{}, nil, err From 35e8ffb3dc5c79e7d56367ce8d74bbaa83200aba Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 26 Aug 2020 13:59:39 -0400 Subject: [PATCH 2887/3147] test: add test that ResolveToLastNode does not perform unncessary fetches This commit was moved from ipfs/go-path@6d87ec04ebe94d4c105b78fe64471ebdb2a26b70 --- path/resolver/resolver_test.go | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 480ccdf1dd..d3c6913e7e 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -105,3 +105,43 @@ func TestRecurivePathResolution(t *testing.T) { p.String(), rCid.String(), cKey.String())) } } + +func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { + ctx := context.Background() + dagService := dagmock.Mock() + + a := randNode() + b := randNode() + + err := a.AddNodeLink("child", b) + if err != nil { + t.Fatal(err) + } + + err = dagService.Add(ctx, a) + if err != nil { + t.Fatal(err) + } + + aKey := a.Cid() + + segments := []string{aKey.String(), "child"} + p, err := path.FromSegments("/ipfs/", segments...) + if err != nil { + t.Fatal(err) + } + + resolver := resolver.NewBasicResolver(dagService) + resolvedCID, remainingPath, err := resolver.ResolveToLastNode(ctx, p) + if err != nil { + t.Fatal(err) + } + + if len(remainingPath) > 0 { + t.Fatal("cannot have remaining path") + } + + if !resolvedCID.Equals(b.Cid()) { + t.Fatal("resolved to the wrong CID") + } +} From b1c8f445e005ade7848c153bc48af703dd0eaab6 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Mon, 24 Aug 2020 15:22:37 -0400 Subject: [PATCH 2888/3147] namesys: fixed IPNS republisher to not overwrite IPNS record lifetimes This commit was moved from ipfs/go-namesys@1c7d23b0627b74cd6c0d2a7ccbe96d7c0a14529f --- namesys/republisher/repub.go | 24 +++++-- namesys/republisher/repub_test.go | 116 ++++++++++++++++++++++++++++-- 2 files changed, 129 insertions(+), 11 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 9e7272d32e..ed42fa8068 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -11,6 +11,7 @@ import ( proto "github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-datastore" + ipns "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" logging "github.com/ipfs/go-log" goprocess "github.com/jbenet/goprocess" @@ -126,7 +127,7 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro log.Debugf("republishing ipns entry for %s", id) // Look for it locally only - p, err := rp.getLastVal(id) + e, err := rp.getLastIPNSEntry(id) if err != nil { if err == errNoEntry { return nil @@ -134,25 +135,34 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro return err } + p := path.Path(e.GetValue()) + prevEol, err := ipns.GetEOL(e) + if err != nil { + return err + } + // update record with same sequence number eol := time.Now().Add(rp.RecordLifetime) + if prevEol.After(eol) { + eol = prevEol + } return rp.ns.PublishWithEOL(ctx, priv, p, eol) } -func (rp *Republisher) getLastVal(id peer.ID) (path.Path, error) { +func (rp *Republisher) getLastIPNSEntry(id peer.ID) (*pb.IpnsEntry, error) { // Look for it locally only val, err := rp.ds.Get(namesys.IpnsDsKey(id)) switch err { case nil: case ds.ErrNotFound: - return "", errNoEntry + return nil, errNoEntry default: - return "", err + return nil, err } e := new(pb.IpnsEntry) if err := proto.Unmarshal(val, e); err != nil { - return "", err + return nil, err } - return path.Path(e.Value), nil -} + return e, nil +} \ No newline at end of file diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 470d460ba2..c78791397e 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -6,16 +6,23 @@ import ( "testing" "time" + "github.com/gogo/protobuf/proto" + + goprocess "github.com/jbenet/goprocess" + peer "github.com/libp2p/go-libp2p-core/peer" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + + ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-ipns" + "github.com/ipfs/go-ipns/pb" + path "github.com/ipfs/go-path" + "github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/core/bootstrap" mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - path "github.com/ipfs/go-path" - goprocess "github.com/jbenet/goprocess" - peer "github.com/libp2p/go-libp2p-core/peer" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" ) func TestRepublish(t *testing.T) { @@ -109,6 +116,107 @@ func TestRepublish(t *testing.T) { } } +func TestLongEOLRepublish(t *testing.T) { + // set cache life to zero for testing low-period repubs + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // create network + mn := mocknet.New(ctx) + + var nodes []*core.IpfsNode + for i := 0; i < 10; i++ { + nd, err := mock.MockPublicNode(ctx, mn) + if err != nil { + t.Fatal(err) + } + + nd.Namesys = namesys.NewNameSystem(nd.Routing, nd.Repo.Datastore(), 0) + + nodes = append(nodes, nd) + } + + if err := mn.LinkAll(); err != nil { + t.Fatal(err) + } + + bsinf := bootstrap.BootstrapConfigWithPeers( + []peer.AddrInfo{ + nodes[0].Peerstore.PeerInfo(nodes[0].Identity), + }, + ) + + for _, n := range nodes[1:] { + if err := n.Bootstrap(bsinf); err != nil { + t.Fatal(err) + } + } + + // have one node publish a record that is valid for 1 second + publisher := nodes[3] + p := path.FromString("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") // does not need to be valid + rp := namesys.NewIpnsPublisher(publisher.Routing, publisher.Repo.Datastore()) + name := "/ipns/" + publisher.Identity.Pretty() + + expiration := time.Now().Add(time.Hour) + err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, expiration) + if err != nil { + t.Fatal(err) + } + + err = verifyResolution(nodes, name, p) + if err != nil { + t.Fatal(err) + } + + // The republishers that are contained within the nodes have their timeout set + // to 12 hours. Instead of trying to tweak those, we're just going to pretend + // they don't exist and make our own. + repub := NewRepublisher(rp, publisher.Repo.Datastore(), publisher.PrivateKey, publisher.Repo.Keystore()) + repub.Interval = time.Millisecond * 500 + repub.RecordLifetime = time.Second + + proc := goprocess.Go(repub.Run) + defer proc.Close() + + // now wait a couple seconds for it to fire a few times + time.Sleep(time.Second * 2) + + err = verifyResolution(nodes, name, p) + if err != nil { + t.Fatal(err) + } + + entry, err := getLastIPNSEntry(publisher.Repo.Datastore(), publisher.Identity) + if err != nil{ + t.Fatal(err) + } + + finalEol, err := ipns.GetEOL(entry) + if err != nil { + t.Fatal(err) + } + + if !finalEol.Equal(expiration) { + t.Fatal("expiration time modified") + } +} + +func getLastIPNSEntry(dstore ds.Datastore, id peer.ID) (*ipns_pb.IpnsEntry, error) { + // Look for it locally only + val, err := dstore.Get(namesys.IpnsDsKey(id)) + if err != nil { + return nil, err + } + + e := new(ipns_pb.IpnsEntry) + if err := proto.Unmarshal(val, e); err != nil { + return nil, err + } + return e, nil +} + func verifyResolution(nodes []*core.IpfsNode, key string, exp path.Path) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() From 37bba12f7d1c2578ee7e12f85a447dcdf215e891 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 26 Aug 2020 15:33:32 -0400 Subject: [PATCH 2889/3147] chore: cleanup This commit was moved from ipfs/go-namesys@13be1de5b75893aa5306f1ad30daddc7122672a0 --- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index ed42fa8068..84dcc911cf 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -165,4 +165,4 @@ func (rp *Republisher) getLastIPNSEntry(id peer.ID) (*pb.IpnsEntry, error) { return nil, err } return e, nil -} \ No newline at end of file +} diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index c78791397e..c75d7faa9b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -22,7 +22,6 @@ import ( mock "github.com/ipfs/go-ipfs/core/mock" namesys "github.com/ipfs/go-ipfs/namesys" . "github.com/ipfs/go-ipfs/namesys/republisher" - ) func TestRepublish(t *testing.T) { @@ -189,7 +188,7 @@ func TestLongEOLRepublish(t *testing.T) { } entry, err := getLastIPNSEntry(publisher.Repo.Datastore(), publisher.Identity) - if err != nil{ + if err != nil { t.Fatal(err) } From adf1adaa2e195c3ffe0e5be07354e9f866b0e826 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 27 Aug 2020 15:05:05 -0400 Subject: [PATCH 2890/3147] Initial commit This commit was moved from ipfs/go-pinning-service-http-client@840d21a10adc12cb4b0875b261ae491f4d1f088b --- pinning/remote/client/.gitignore | 15 +++++++++++++++ pinning/remote/client/LICENSE | 21 +++++++++++++++++++++ pinning/remote/client/README.md | 2 ++ 3 files changed, 38 insertions(+) create mode 100644 pinning/remote/client/.gitignore create mode 100644 pinning/remote/client/LICENSE create mode 100644 pinning/remote/client/README.md diff --git a/pinning/remote/client/.gitignore b/pinning/remote/client/.gitignore new file mode 100644 index 0000000000..66fd13c903 --- /dev/null +++ b/pinning/remote/client/.gitignore @@ -0,0 +1,15 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ diff --git a/pinning/remote/client/LICENSE b/pinning/remote/client/LICENSE new file mode 100644 index 0000000000..2b5d8a7da5 --- /dev/null +++ b/pinning/remote/client/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 IPFS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pinning/remote/client/README.md b/pinning/remote/client/README.md new file mode 100644 index 0000000000..0a2542a8ac --- /dev/null +++ b/pinning/remote/client/README.md @@ -0,0 +1,2 @@ +# go-pinning-service-http-client +An IPFS Pinning Service HTTP Client From aaa4dcd596eed9264dd196cb1c1b53b293b9562e Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Mon, 21 Sep 2020 13:07:01 -0400 Subject: [PATCH 2891/3147] init: use template for the dual Apache-MIT license and basic README This commit was moved from ipfs/go-pinning-service-http-client@4ebc72023aa7f7ecb39edcfe7f133ddfb3eceb65 --- pinning/remote/client/LICENSE | 35 +++++++++++++++++---------------- pinning/remote/client/README.md | 20 +++++++++++++++++++ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/pinning/remote/client/LICENSE b/pinning/remote/client/LICENSE index 2b5d8a7da5..1f34f71862 100644 --- a/pinning/remote/client/LICENSE +++ b/pinning/remote/client/LICENSE @@ -1,21 +1,22 @@ -MIT License +The software contents of this repository are Copyright (c) Protocol Labs, +Licensed under the `Permissive License Stack`, meaning either of: -Copyright (c) 2020 IPFS +- Apache-2.0 Software License: https://www.apache.org/licenses/LICENSE-2.0 + ([...4tr2kfsq](https://gateway.ipfs.io/ipfs/bafkreiankqxazcae4onkp436wag2lj3ccso4nawxqkkfckd6cg4tr2kfsq)) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +- MIT Software License: https://opensource.org/licenses/MIT + ([...vljevcba](https://gateway.ipfs.io/ipfs/bafkreiepofszg4gfe2gzuhojmksgemsub2h4uy2gewdnr35kswvljevcba)) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +You may not use the contents of this repository except in compliance +with one of the listed Licenses. For an extended clarification of the +intent behind the choice of Licensing please refer to +https://protocol.ai/blog/announcing-the-permissive-license-stack/ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Unless required by applicable law or agreed to in writing, software +distributed under the terms listed in this notice is distributed on +an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. See each License for the specific language +governing permissions and limitations under that License. + + +`SPDX-License-Identifier: Apache-2.0 OR MIT` \ No newline at end of file diff --git a/pinning/remote/client/README.md b/pinning/remote/client/README.md index 0a2542a8ac..213f0df83a 100644 --- a/pinning/remote/client/README.md +++ b/pinning/remote/client/README.md @@ -1,2 +1,22 @@ # go-pinning-service-http-client + + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](https://ipfs.io/) +[![](https://img.shields.io/badge/status-draft-yellow.svg?style=flat-square)](https://github.com/ipfs/specs/#understanding-the-meaning-of-the-spec-badges-and-their-lifecycle) + An IPFS Pinning Service HTTP Client + +> This repo is contains a reference implementation of a client for the [IPFS Pinning Services API Spec](https://github.com/ipfs/pinning-services-api-spec) + +## Lead Maintainer + +[Adin Schmahmann](https://github.com/aschmahmann) + +## Contributing + +Contributions are welcome! This repository is part of the IPFS project and therefore governed by our [contributing guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md). + +## License + +[SPDX-License-Identifier: Apache-2.0 OR MIT](LICENSE.md) \ No newline at end of file From 67cf885fb723b295db69cd8d2e1791b4d66c9f39 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Sat, 29 Aug 2020 21:25:37 -0400 Subject: [PATCH 2892/3147] feat: initial implementation This commit was moved from ipfs/go-pinning-service-http-client@08125a6c7413fc6b06db906e9feee0b8eaebb050 --- pinning/remote/client/client.go | 376 +++++++++ pinning/remote/client/cmd/main.go | 77 ++ pinning/remote/client/model.go | 79 ++ pinning/remote/client/openapi/README.md | 205 +++++ pinning/remote/client/openapi/api_pins.go | 781 ++++++++++++++++++ pinning/remote/client/openapi/client.go | 531 ++++++++++++ .../remote/client/openapi/configuration.go | 228 +++++ pinning/remote/client/openapi/docs/Error.md | 72 ++ pinning/remote/client/openapi/docs/Pin.md | 129 +++ .../remote/client/openapi/docs/PinResults.md | 72 ++ .../remote/client/openapi/docs/PinStatus.md | 161 ++++ pinning/remote/client/openapi/docs/PinsApi.md | 367 ++++++++ pinning/remote/client/openapi/docs/Status.md | 11 + pinning/remote/client/openapi/model_error.go | 134 +++ pinning/remote/client/openapi/model_pin.go | 217 +++++ .../client/openapi/model_pin_results.go | 136 +++ .../remote/client/openapi/model_pin_status.go | 262 ++++++ pinning/remote/client/openapi/model_status.go | 84 ++ pinning/remote/client/openapi/response.go | 46 ++ pinning/remote/client/openapi/utils.go | 327 ++++++++ 20 files changed, 4295 insertions(+) create mode 100644 pinning/remote/client/client.go create mode 100644 pinning/remote/client/cmd/main.go create mode 100644 pinning/remote/client/model.go create mode 100644 pinning/remote/client/openapi/README.md create mode 100644 pinning/remote/client/openapi/api_pins.go create mode 100644 pinning/remote/client/openapi/client.go create mode 100644 pinning/remote/client/openapi/configuration.go create mode 100644 pinning/remote/client/openapi/docs/Error.md create mode 100644 pinning/remote/client/openapi/docs/Pin.md create mode 100644 pinning/remote/client/openapi/docs/PinResults.md create mode 100644 pinning/remote/client/openapi/docs/PinStatus.md create mode 100644 pinning/remote/client/openapi/docs/PinsApi.md create mode 100644 pinning/remote/client/openapi/docs/Status.md create mode 100644 pinning/remote/client/openapi/model_error.go create mode 100644 pinning/remote/client/openapi/model_pin.go create mode 100644 pinning/remote/client/openapi/model_pin_results.go create mode 100644 pinning/remote/client/openapi/model_pin_status.go create mode 100644 pinning/remote/client/openapi/model_status.go create mode 100644 pinning/remote/client/openapi/response.go create mode 100644 pinning/remote/client/openapi/utils.go diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go new file mode 100644 index 0000000000..b4fa378308 --- /dev/null +++ b/pinning/remote/client/client.go @@ -0,0 +1,376 @@ +package go_pinning_service_http_client + +import ( + "context" + "fmt" + "io/ioutil" + "net/http" + "time" + + "github.com/ipfs/go-cid" + "github.com/ipfs/go-pinning-service-http-client/openapi" + "github.com/multiformats/go-multiaddr" + "github.com/multiformats/go-multibase" + + logging "github.com/ipfs/go-log/v2" +) + +var logger = logging.Logger("pinning-service-http-client") + +const UserAgent = "go-pinning-service-http-client" + +type Client struct { + client *openapi.APIClient +} + +func NewClient(url, bearerToken string) *Client { + config := openapi.NewConfiguration() + config.UserAgent = UserAgent + bearer := fmt.Sprintf("Bearer %s", bearerToken) + config.AddDefaultHeader("Authorization", bearer) + config.Servers = openapi.ServerConfigurations{ + openapi.ServerConfiguration{ + URL: url, + }, + } + + return &Client{client: openapi.NewAPIClient(config)} +} + +func getError(e *openapi.Error) error { + return fmt.Errorf("request error: %d - %s", e.Code, e.Message) +} + +// TODO: We should probably make sure there are no duplicates sent +type lsSettings struct { + cids []string + name string + status []Status + before *time.Time + after *time.Time + limit *int32 + meta map[string]string +} + +type LsOption func(options *lsSettings) error + +var PinOpts = pinOpts{} + +type pinOpts struct { + pinLsOpts + pinAddOpts +} + +type pinLsOpts struct{} + +func (pinLsOpts) FilterCIDs(cids ...cid.Cid) LsOption { + return func(options *lsSettings) error { + enc := getCIDEncoder() + for _, c := range cids { + options.cids = append(options.cids, c.Encode(enc)) + } + return nil + } +} + +const maxNameSize = 255 + +func (pinLsOpts) FilterName(name string) LsOption { + return func(options *lsSettings) error { + if len(name) > maxNameSize { + return fmt.Errorf("name cannot be longer than %d", maxNameSize) + } + options.name = name + return nil + } +} + +func (pinLsOpts) FilterStatus(statuses ...Status) LsOption { + return func(options *lsSettings) error { + for _, s := range statuses { + valid := false + for _, existing := range validStatuses { + if existing == s { + valid = true + break + } + } + if !valid { + return fmt.Errorf("invalid status %s", s) + } + } + options.status = append(options.status, statuses...) + return nil + } +} + +func (pinLsOpts) FilterBefore(t time.Time) LsOption { + return func(options *lsSettings) error { + options.before = &t + return nil + } +} + +func (pinLsOpts) FilterAfter(t time.Time) LsOption { + return func(options *lsSettings) error { + options.after = &t + return nil + } +} + +const recordLimit = 1000 +const defaultLimit = 10 + +func (pinLsOpts) Limit(limit int) LsOption { + return func(options *lsSettings) error { + if limit > recordLimit { + return fmt.Errorf("limit exceeded maximum record limit of %d", recordLimit) + } + limitCasted := int32(limit) + options.limit = &limitCasted + return nil + } +} + +func (pinLsOpts) LsMeta(meta map[string]string) LsOption { + return func(options *lsSettings) error { + options.meta = meta + return nil + } +} + +type pinResults = openapi.PinResults + +func (c *Client) Ls(ctx context.Context, opts ...LsOption) (chan PinStatusGetter, chan error) { + res := make(chan PinStatusGetter, 1) + errs := make(chan error, 1) + + settings := new(lsSettings) + for _, o := range opts { + if err := o(settings); err != nil { + close(res) + errs <- err + close(errs) + return res, errs + } + } + + go func() { + defer close(errs) + defer close(res) + + for { + pinRes, err := c.lsInternal(ctx, settings) + if err != nil { + errs <- err + return + } + + results := pinRes.GetResults() + for _, r := range results { + select { + case res <- &pinStatusObject{r}: + case <-ctx.Done(): + errs <- ctx.Err() + return + } + } + + if int(pinRes.Count) == len(results) { + return + } + + oldestResult := pinRes.Results[len(pinRes.Results)-1] + settings.before = &oldestResult.Created + } + }() + + return res, errs +} + +func (c *Client) LsSync(ctx context.Context, opts ...LsOption) ([]PinStatusGetter, error) { + resCh, errCh := c.Ls(ctx, opts...) + + var res []PinStatusGetter + for r := range resCh { + res = append(res, r) + } + + return res, <-errCh +} + +func (c *Client) lsInternal(ctx context.Context, settings *lsSettings) (pinResults, error) { + getter := c.client.PinsApi.PinsGet(ctx) + if len(settings.cids) > 0 { + getter.Cid(settings.cids) + } + if len(settings.status) > 0 { + getter.Status(settings.status) + } + if settings.limit == nil { + getter.Limit(defaultLimit) + } else { + getter.Limit(*settings.limit) + } + if len(settings.name) > 0 { + getter.Name(settings.name) + } + if settings.before != nil { + getter.Before(*settings.before) + } + if settings.after != nil { + getter.After(*settings.after) + } + if settings.meta != nil { + getter.Meta(settings.meta) + } + + // TODO: Ignoring HTTP Response OK? + results, httpresp, err := getter.Execute() + if err != nil { + err := httperr(httpresp, err) + return pinResults{}, err + } + + return results, nil +} + +// TODO: We should probably make sure there are no duplicates sent +type addSettings struct { + cid string + name string + origins []string + meta map[string]string +} + +type AddOption func(options *addSettings) error + +type pinAddOpts struct{} + +func (pinAddOpts) WithName(name string) AddOption { + return func(options *addSettings) error { + if len(name) > maxNameSize { + return fmt.Errorf("name cannot be longer than %d", maxNameSize) + } + options.name = name + return nil + } +} + +func (pinLsOpts) WithOrigins(origins ...multiaddr.Multiaddr) AddOption { + return func(options *addSettings) error { + for _, o := range origins { + options.origins = append(options.origins, o.String()) + } + return nil + } +} + +func (pinAddOpts) AddMeta(meta map[string]string) AddOption { + return func(options *addSettings) error { + options.meta = meta + return nil + } +} + +func (c *Client) Add(ctx context.Context, cid cid.Cid, opts ...AddOption) (PinStatusGetter, error) { + settings := new(addSettings) + for _, o := range opts { + if err := o(settings); err != nil { + return nil, err + } + } + + adder := c.client.PinsApi.PinsPost(ctx) + p := openapi.Pin{ + Cid: cid.Encode(getCIDEncoder()), + } + + if len(settings.origins) > 0 { + p.SetOrigins(settings.origins) + } + if settings.meta != nil { + p.SetMeta(settings.meta) + } + if len(settings.name) > 0 { + p.SetName(settings.name) + } + + result, httpresp, err := adder.Pin(p).Execute() + if err != nil { + err := httperr(httpresp, err) + return nil, err + } + + return &pinStatusObject{result}, nil +} + +func (c *Client) GetStatusByID(ctx context.Context, pinID string) (PinStatusGetter, error) { + getter := c.client.PinsApi.PinsIdGet(ctx, pinID) + result, httpresp, err := getter.Execute() + if err != nil { + err := httperr(httpresp, err) + return nil, err + } + + return &pinStatusObject{result}, nil +} + +func (c *Client) DeleteByID(ctx context.Context, pinID string) error { + deleter := c.client.PinsApi.PinsIdDelete(ctx, pinID) + httpresp, err := deleter.Execute() + if err != nil { + err := httperr(httpresp, err) + return err + } + return nil +} + +func (c *Client) Modify(ctx context.Context, pinID string, cid cid.Cid, opts ...AddOption) (PinStatusGetter, error) { + settings := new(addSettings) + for _, o := range opts { + if err := o(settings); err != nil { + return nil, err + } + } + + adder := c.client.PinsApi.PinsIdPost(ctx, pinID) + p := openapi.Pin{ + Cid: cid.Encode(getCIDEncoder()), + } + + if len(settings.origins) > 0 { + p.SetOrigins(settings.origins) + } + if settings.meta != nil { + p.SetMeta(settings.meta) + } + if len(settings.name) > 0 { + p.SetName(settings.name) + } + + result, httpresp, err := adder.Pin(p).Execute() + if err != nil { + err := httperr(httpresp, err) + return nil, err + } + + return &pinStatusObject{result}, nil +} + +func getCIDEncoder() multibase.Encoder { + enc, err := multibase.NewEncoder(multibase.Base32) + if err != nil { + panic(err) + } + return enc +} + +func httperr(resp *http.Response, e error) error { + body, err := ioutil.ReadAll(resp.Body) + var bodystr string + if err == nil { + bodystr = string(body) + } + return fmt.Errorf("httpresp code: %d, httpresp: %s, httpbody: %s, err: %w", resp.StatusCode, resp.Status, bodystr, e) +} diff --git a/pinning/remote/client/cmd/main.go b/pinning/remote/client/cmd/main.go new file mode 100644 index 0000000000..fefd9503d3 --- /dev/null +++ b/pinning/remote/client/cmd/main.go @@ -0,0 +1,77 @@ +package main + +import ( + "context" + "fmt" + "github.com/ipfs/go-cid" + pinclient "github.com/ipfs/go-pinning-service-http-client" + "os" +) + +func main() { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + url, ok := os.LookupEnv("PS_URL") + if !ok { + panic("No Pinning Service URL found") + } + + key, ok := os.LookupEnv("PS_KEY") + if !ok { + panic("No Pinning Service API Key found") + } + + c := pinclient.NewClient(url, key) + + ipfsPgCid, err := cid.Parse("bafybeiayvrj27f65vbecspbnuavehcb3znvnt2strop2rfbczupudoizya") + if err != nil { + panic(err) + } + + libp2pCid, err := cid.Parse("bafybeiejgrxo4p4uofgfzvlg5twrg5w7tfwpf7aciiswfacfbdpevg2xfy") + if err != nil { + panic(err) + } + _ = ipfsPgCid + + fmt.Println("Adding libp2p home page") + ps, err := c.Add(ctx, libp2pCid, pinclient.PinOpts.WithName("libp2p_home")) + if err == nil { + fmt.Println(ps.GetStatus()) + } else { + fmt.Println(err) + } + + fmt.Println("List all pins") + pins, err := c.LsSync(ctx) + fmt.Println(err) + + for _, p := range pins { + fmt.Printf("Pin Name: %s, CID: %s", p.GetPin().GetName(), p.GetPin().GetCid().String()) + } + + fmt.Println("Check on pin status") + status, err := c.GetStatusByID(ctx, ps.GetId()) + if err == nil { + fmt.Println(status.GetStatus()) + } else { + fmt.Println(err) + } + + fmt.Println("Delete pin") + err = c.DeleteByID(ctx, ps.GetId()) + if err == nil { + fmt.Println("Successfully deleted pin") + } else { + fmt.Println(err) + } + + fmt.Println("List all pins") + pins, err = c.LsSync(ctx) + fmt.Println(err) + + for _, p := range pins { + fmt.Printf("Pin Name: %s, CID: %s", p.GetPin().GetName(), p.GetPin().GetCid().String()) + } +} diff --git a/pinning/remote/client/model.go b/pinning/remote/client/model.go new file mode 100644 index 0000000000..e6c552d516 --- /dev/null +++ b/pinning/remote/client/model.go @@ -0,0 +1,79 @@ +package go_pinning_service_http_client + +import ( + "github.com/ipfs/go-cid" + "github.com/ipfs/go-pinning-service-http-client/openapi" + "github.com/multiformats/go-multiaddr" + "time" +) + +// PinGetter Getter for Pin object +type PinGetter interface { + // CID to be pinned recursively + GetCid() cid.Cid + // Optional name for pinned data; can be used for lookups later + GetName() string + // Optional list of multiaddrs known to provide the data + GetOrigins() []string + // Optional metadata for pin object + GetMeta() map[string]string +} + +type pinObject struct { + openapi.Pin +} + +func (p *pinObject) GetCid() cid.Cid { + c, err := cid.Parse(p.Pin.Cid) + if err != nil { + return cid.Undef + } + return c +} + +type Status = openapi.Status + +const ( + StatusQueued Status = openapi.QUEUED + StatusPinning Status = openapi.PINNING + StatusPinned Status = openapi.PINNED + StatusFailed Status = openapi.FAILED +) + +var validStatuses = []Status{"queued", "pinning", "pinned", "failed"} + +// PinStatusGetter Getter for Pin object with status +type PinStatusGetter interface { + // Globally unique ID of the pin request; can be used to check the status of ongoing pinning, modification of pin object, or pin removal + GetId() string + GetStatus() Status + // Immutable timestamp indicating when a pin request entered a pinning service; can be used for filtering results and pagination + GetCreated() time.Time + GetPin() PinGetter + // List of multiaddrs designated by pinning service for transferring any new data from external peers + GetDelegates() []multiaddr.Multiaddr + // Optional info for PinStatus response + GetInfo() map[string]string +} + +type pinStatusObject struct { + openapi.PinStatus +} + +func (p *pinStatusObject) GetDelegates() []multiaddr.Multiaddr { + delegates := p.PinStatus.GetDelegates() + addrs := make([]multiaddr.Multiaddr, 0, len(delegates)) + for _, d := range delegates { + a, err := multiaddr.NewMultiaddr(d) + if err != nil { + logger.Errorf("returned delegate is an invalid multiaddr: %w", err) + continue + } + addrs = append(addrs, a) + } + return addrs +} + +func (p *pinStatusObject) GetPin() PinGetter { + return &pinObject{p.Pin} +} diff --git a/pinning/remote/client/openapi/README.md b/pinning/remote/client/openapi/README.md new file mode 100644 index 0000000000..64e843f887 --- /dev/null +++ b/pinning/remote/client/openapi/README.md @@ -0,0 +1,205 @@ +# Go API client for openapi + + + +## About this spec +The IPFS Pinning Service API is intended to be an implementation-agnostic API: +- For use and implementation by pinning service providers +- For use in client mode by IPFS nodes and GUI-based applications + +> **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** + +# Schemas +This section describes the most important object types and conventions. + +A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). +## Objects +### Pin object + +![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) + +The `Pin` object is a representation of a pin request. + +It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. + +### Pin status response + +![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) + +The `PinStatus` object is a representation of the current state of a pinning operation. +It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. + +## The pin lifecycle + +![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) + +### Creating a new pin object +The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: +- `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future +- `status` in `PinStatus` indicates the current state of a pin + +### Checking status of in-progress pinning +`status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. + +In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. + +### Modifying an existing pin object +The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. + +### Removing a pin object +A pin object can be removed via `DELETE /pins/{id}`. + + +## Provider hints +Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. + +The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. + +This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. + +## Custom metadata +Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. +### Pin metadata +String keys and values passed in `Pin.meta` are persisted with the pin object. + +Potential uses: +- `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` +- `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) + +Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. + +### Pin status info +Additional `PinStatus.info` can be returned by pinning service. + +Potential uses: +- `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) +- `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead +- `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) +- `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire + +# Pagination and filtering +Pin objects can be listed by executing `GET /pins` with optional parameters: + +- When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. +- The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). +- If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. +- To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. +- Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. + +> **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + + + +## Overview +This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [OpenAPI-spec](https://www.openapis.org/) from a remote server, you can easily generate an API client. + +- API version: 0.0.5 +- Package version: 1.0.0 +- Build package: org.openapitools.codegen.languages.GoClientExperimentalCodegen + +## Installation + +Install the following dependencies: + +```shell +go get github.com/stretchr/testify/assert +go get golang.org/x/oauth2 +go get golang.org/x/net/context +``` + +Put the package under your project folder and add the following in import: + +```golang +import sw "./openapi" +``` + +## Configuration of Server URL + +Default configuration comes with `Servers` field that contains server objects as defined in the OpenAPI specification. + +### Select Server Configuration + +For using other server than the one defined on index 0 set context value `sw.ContextServerIndex` of type `int`. + +```golang +ctx := context.WithValue(context.Background(), sw.ContextServerIndex, 1) +``` + +### Templated Server URL + +Templated server URL is formatted using default variables from configuration or from context value `sw.ContextServerVariables` of type `map[string]string`. + +```golang +ctx := context.WithValue(context.Background(), sw.ContextServerVariables, map[string]string{ + "basePath": "v2", +}) +``` + +Note, enum values are always validated and all unused variables are silently ignored. + +### URLs Configuration per Operation + +Each operation can use different server URL defined using `OperationServers` map in the `Configuration`. +An operation is uniquely identifield by `"{classname}Service.{nickname}"` string. +Similar rules for overriding default operation server index and variables applies by using `sw.ContextOperationServerIndices` and `sw.ContextOperationServerVariables` context maps. + +``` +ctx := context.WithValue(context.Background(), sw.ContextOperationServerIndices, map[string]int{ + "{classname}Service.{nickname}": 2, +}) +ctx = context.WithValue(context.Background(), sw.ContextOperationServerVariables, map[string]map[string]string{ + "{classname}Service.{nickname}": { + "port": "8443", + }, +}) +``` + +## Documentation for API Endpoints + +All URIs are relative to *https://pinning-service.example.com* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*PinsApi* | [**PinsGet**](docs/PinsApi.md#pinsget) | **Get** /pins | List pin objects +*PinsApi* | [**PinsIdDelete**](docs/PinsApi.md#pinsiddelete) | **Delete** /pins/{id} | Remove pin object +*PinsApi* | [**PinsIdGet**](docs/PinsApi.md#pinsidget) | **Get** /pins/{id} | Get pin object +*PinsApi* | [**PinsIdPost**](docs/PinsApi.md#pinsidpost) | **Post** /pins/{id} | Modify pin object +*PinsApi* | [**PinsPost**](docs/PinsApi.md#pinspost) | **Post** /pins | Add pin object + + +## Documentation For Models + + - [Error](docs/Error.md) + - [Pin](docs/Pin.md) + - [PinResults](docs/PinResults.md) + - [PinStatus](docs/PinStatus.md) + - [Status](docs/Status.md) + + +## Documentation For Authorization + + + +### accessToken + + +## Documentation for Utility Methods + +Due to the fact that model structure members are all pointers, this package contains +a number of utility functions to easily obtain pointers to values of basic types. +Each of these functions takes a value of the given basic type and returns a pointer to it: + +* `PtrBool` +* `PtrInt` +* `PtrInt32` +* `PtrInt64` +* `PtrFloat` +* `PtrFloat32` +* `PtrFloat64` +* `PtrString` +* `PtrTime` + +## Author + + + diff --git a/pinning/remote/client/openapi/api_pins.go b/pinning/remote/client/openapi/api_pins.go new file mode 100644 index 0000000000..623862df72 --- /dev/null +++ b/pinning/remote/client/openapi/api_pins.go @@ -0,0 +1,781 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + _context "context" + _ioutil "io/ioutil" + _nethttp "net/http" + _neturl "net/url" + "strings" + "time" +) + +// Linger please +var ( + _ _context.Context +) + +// PinsApiService PinsApi service +type PinsApiService service + +type apiPinsGetRequest struct { + ctx _context.Context + apiService *PinsApiService + cid *[]string + name *string + status *[]Status + before *time.Time + after *time.Time + limit *int32 + meta *map[string]string +} + +func (r apiPinsGetRequest) Cid(cid []string) apiPinsGetRequest { + r.cid = &cid + return r +} + +func (r apiPinsGetRequest) Name(name string) apiPinsGetRequest { + r.name = &name + return r +} + +func (r apiPinsGetRequest) Status(status []Status) apiPinsGetRequest { + r.status = &status + return r +} + +func (r apiPinsGetRequest) Before(before time.Time) apiPinsGetRequest { + r.before = &before + return r +} + +func (r apiPinsGetRequest) After(after time.Time) apiPinsGetRequest { + r.after = &after + return r +} + +func (r apiPinsGetRequest) Limit(limit int32) apiPinsGetRequest { + r.limit = &limit + return r +} + +func (r apiPinsGetRequest) Meta(meta map[string]string) apiPinsGetRequest { + r.meta = &meta + return r +} + +/* +PinsGet List pin objects +List all the pin objects, matching optional filters; when no filter is provided, only successful pins are returned + * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). +@return apiPinsGetRequest +*/ +func (a *PinsApiService) PinsGet(ctx _context.Context) apiPinsGetRequest { + return apiPinsGetRequest{ + apiService: a, + ctx: ctx, + } +} + +/* +Execute executes the request + @return PinResults +*/ +func (r apiPinsGetRequest) Execute() (PinResults, *_nethttp.Response, error) { + var ( + localVarHTTPMethod = _nethttp.MethodGet + localVarPostBody interface{} + localVarFormFileName string + localVarFileName string + localVarFileBytes []byte + localVarReturnValue PinResults + ) + + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsGet") + if err != nil { + return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} + } + + localVarPath := localBasePath + "/pins" + + localVarHeaderParams := make(map[string]string) + localVarQueryParams := _neturl.Values{} + localVarFormParams := _neturl.Values{} + + if r.cid != nil { + localVarQueryParams.Add("cid", parameterToString(*r.cid, "csv")) + } + if r.name != nil { + localVarQueryParams.Add("name", parameterToString(*r.name, "")) + } + if r.status != nil { + localVarQueryParams.Add("status", parameterToString(*r.status, "csv")) + } + if r.before != nil { + localVarQueryParams.Add("before", parameterToString(*r.before, "")) + } + if r.after != nil { + localVarQueryParams.Add("after", parameterToString(*r.after, "")) + } + if r.limit != nil { + localVarQueryParams.Add("limit", parameterToString(*r.limit, "")) + } + if r.meta != nil { + localVarQueryParams.Add("meta", parameterToString(*r.meta, "")) + } + // to determine the Content-Type header + localVarHTTPContentTypes := []string{} + + // set Content-Type header + localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) + if localVarHTTPContentType != "" { + localVarHeaderParams["Content-Type"] = localVarHTTPContentType + } + + // to determine the Accept header + localVarHTTPHeaderAccepts := []string{"application/json"} + + // set Accept header + localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) + if localVarHTTPHeaderAccept != "" { + localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept + } + req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) + if err != nil { + return localVarReturnValue, nil, err + } + + localVarHTTPResponse, err := r.apiService.client.callAPI(req) + if err != nil || localVarHTTPResponse == nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarHTTPResponse.Body.Close() + if err != nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + if localVarHTTPResponse.StatusCode >= 300 { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: localVarHTTPResponse.Status, + } + if localVarHTTPResponse.StatusCode == 400 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + err = r.apiService.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: err.Error(), + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + return localVarReturnValue, localVarHTTPResponse, nil +} + +type apiPinsIdDeleteRequest struct { + ctx _context.Context + apiService *PinsApiService + id string +} + +/* +PinsIdDelete Remove pin object +Remove a pin object + * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + * @param id +@return apiPinsIdDeleteRequest +*/ +func (a *PinsApiService) PinsIdDelete(ctx _context.Context, id string) apiPinsIdDeleteRequest { + return apiPinsIdDeleteRequest{ + apiService: a, + ctx: ctx, + id: id, + } +} + +/* +Execute executes the request + +*/ +func (r apiPinsIdDeleteRequest) Execute() (*_nethttp.Response, error) { + var ( + localVarHTTPMethod = _nethttp.MethodDelete + localVarPostBody interface{} + localVarFormFileName string + localVarFileName string + localVarFileBytes []byte + ) + + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsIdDelete") + if err != nil { + return nil, GenericOpenAPIError{error: err.Error()} + } + + localVarPath := localBasePath + "/pins/{id}" + localVarPath = strings.Replace(localVarPath, "{"+"id"+"}", _neturl.PathEscape(parameterToString(r.id, "")), -1) + + localVarHeaderParams := make(map[string]string) + localVarQueryParams := _neturl.Values{} + localVarFormParams := _neturl.Values{} + + // to determine the Content-Type header + localVarHTTPContentTypes := []string{} + + // set Content-Type header + localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) + if localVarHTTPContentType != "" { + localVarHeaderParams["Content-Type"] = localVarHTTPContentType + } + + // to determine the Accept header + localVarHTTPHeaderAccepts := []string{"application/json"} + + // set Accept header + localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) + if localVarHTTPHeaderAccept != "" { + localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept + } + req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) + if err != nil { + return nil, err + } + + localVarHTTPResponse, err := r.apiService.client.callAPI(req) + if err != nil || localVarHTTPResponse == nil { + return localVarHTTPResponse, err + } + + localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarHTTPResponse.Body.Close() + if err != nil { + return localVarHTTPResponse, err + } + + if localVarHTTPResponse.StatusCode >= 300 { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: localVarHTTPResponse.Status, + } + if localVarHTTPResponse.StatusCode == 400 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.model = v + return localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 401 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.model = v + return localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 404 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.model = v + return localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.model = v + } + return localVarHTTPResponse, newErr + } + + return localVarHTTPResponse, nil +} + +type apiPinsIdGetRequest struct { + ctx _context.Context + apiService *PinsApiService + id string +} + +/* +PinsIdGet Get pin object +Get a pin object and its status + * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + * @param id +@return apiPinsIdGetRequest +*/ +func (a *PinsApiService) PinsIdGet(ctx _context.Context, id string) apiPinsIdGetRequest { + return apiPinsIdGetRequest{ + apiService: a, + ctx: ctx, + id: id, + } +} + +/* +Execute executes the request + @return PinStatus +*/ +func (r apiPinsIdGetRequest) Execute() (PinStatus, *_nethttp.Response, error) { + var ( + localVarHTTPMethod = _nethttp.MethodGet + localVarPostBody interface{} + localVarFormFileName string + localVarFileName string + localVarFileBytes []byte + localVarReturnValue PinStatus + ) + + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsIdGet") + if err != nil { + return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} + } + + localVarPath := localBasePath + "/pins/{id}" + localVarPath = strings.Replace(localVarPath, "{"+"id"+"}", _neturl.PathEscape(parameterToString(r.id, "")), -1) + + localVarHeaderParams := make(map[string]string) + localVarQueryParams := _neturl.Values{} + localVarFormParams := _neturl.Values{} + + // to determine the Content-Type header + localVarHTTPContentTypes := []string{} + + // set Content-Type header + localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) + if localVarHTTPContentType != "" { + localVarHeaderParams["Content-Type"] = localVarHTTPContentType + } + + // to determine the Accept header + localVarHTTPHeaderAccepts := []string{"application/json"} + + // set Accept header + localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) + if localVarHTTPHeaderAccept != "" { + localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept + } + req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) + if err != nil { + return localVarReturnValue, nil, err + } + + localVarHTTPResponse, err := r.apiService.client.callAPI(req) + if err != nil || localVarHTTPResponse == nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarHTTPResponse.Body.Close() + if err != nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + if localVarHTTPResponse.StatusCode >= 300 { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: localVarHTTPResponse.Status, + } + if localVarHTTPResponse.StatusCode == 400 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 404 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + err = r.apiService.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: err.Error(), + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + return localVarReturnValue, localVarHTTPResponse, nil +} + +type apiPinsIdPostRequest struct { + ctx _context.Context + apiService *PinsApiService + id string + pin *Pin +} + +func (r apiPinsIdPostRequest) Pin(pin Pin) apiPinsIdPostRequest { + r.pin = &pin + return r +} + +/* +PinsIdPost Modify pin object +Modify an existing pin object + * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + * @param id +@return apiPinsIdPostRequest +*/ +func (a *PinsApiService) PinsIdPost(ctx _context.Context, id string) apiPinsIdPostRequest { + return apiPinsIdPostRequest{ + apiService: a, + ctx: ctx, + id: id, + } +} + +/* +Execute executes the request + @return PinStatus +*/ +func (r apiPinsIdPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { + var ( + localVarHTTPMethod = _nethttp.MethodPost + localVarPostBody interface{} + localVarFormFileName string + localVarFileName string + localVarFileBytes []byte + localVarReturnValue PinStatus + ) + + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsIdPost") + if err != nil { + return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} + } + + localVarPath := localBasePath + "/pins/{id}" + localVarPath = strings.Replace(localVarPath, "{"+"id"+"}", _neturl.PathEscape(parameterToString(r.id, "")), -1) + + localVarHeaderParams := make(map[string]string) + localVarQueryParams := _neturl.Values{} + localVarFormParams := _neturl.Values{} + + if r.pin == nil { + return localVarReturnValue, nil, reportError("pin is required and must be specified") + } + + // to determine the Content-Type header + localVarHTTPContentTypes := []string{"application/json"} + + // set Content-Type header + localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) + if localVarHTTPContentType != "" { + localVarHeaderParams["Content-Type"] = localVarHTTPContentType + } + + // to determine the Accept header + localVarHTTPHeaderAccepts := []string{"application/json"} + + // set Accept header + localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) + if localVarHTTPHeaderAccept != "" { + localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept + } + // body params + localVarPostBody = r.pin + req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) + if err != nil { + return localVarReturnValue, nil, err + } + + localVarHTTPResponse, err := r.apiService.client.callAPI(req) + if err != nil || localVarHTTPResponse == nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarHTTPResponse.Body.Close() + if err != nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + if localVarHTTPResponse.StatusCode >= 300 { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: localVarHTTPResponse.Status, + } + if localVarHTTPResponse.StatusCode == 400 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 401 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 404 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 409 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + err = r.apiService.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: err.Error(), + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + return localVarReturnValue, localVarHTTPResponse, nil +} + +type apiPinsPostRequest struct { + ctx _context.Context + apiService *PinsApiService + pin *Pin +} + +func (r apiPinsPostRequest) Pin(pin Pin) apiPinsPostRequest { + r.pin = &pin + return r +} + +/* +PinsPost Add pin object +Add a new pin object for the current access token + * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). +@return apiPinsPostRequest +*/ +func (a *PinsApiService) PinsPost(ctx _context.Context) apiPinsPostRequest { + return apiPinsPostRequest{ + apiService: a, + ctx: ctx, + } +} + +/* +Execute executes the request + @return PinStatus +*/ +func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { + var ( + localVarHTTPMethod = _nethttp.MethodPost + localVarPostBody interface{} + localVarFormFileName string + localVarFileName string + localVarFileBytes []byte + localVarReturnValue PinStatus + ) + + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsPost") + if err != nil { + return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} + } + + localVarPath := localBasePath + "/pins" + + localVarHeaderParams := make(map[string]string) + localVarQueryParams := _neturl.Values{} + localVarFormParams := _neturl.Values{} + + if r.pin == nil { + return localVarReturnValue, nil, reportError("pin is required and must be specified") + } + + // to determine the Content-Type header + localVarHTTPContentTypes := []string{"application/json"} + + // set Content-Type header + localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) + if localVarHTTPContentType != "" { + localVarHeaderParams["Content-Type"] = localVarHTTPContentType + } + + // to determine the Accept header + localVarHTTPHeaderAccepts := []string{"application/json"} + + // set Accept header + localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) + if localVarHTTPHeaderAccept != "" { + localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept + } + // body params + localVarPostBody = r.pin + req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) + if err != nil { + return localVarReturnValue, nil, err + } + + localVarHTTPResponse, err := r.apiService.client.callAPI(req) + if err != nil || localVarHTTPResponse == nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarHTTPResponse.Body.Close() + if err != nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + if localVarHTTPResponse.StatusCode >= 300 { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: localVarHTTPResponse.Status, + } + if localVarHTTPResponse.StatusCode == 400 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 401 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 404 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 409 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + err = r.apiService.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: err.Error(), + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + return localVarReturnValue, localVarHTTPResponse, nil +} diff --git a/pinning/remote/client/openapi/client.go b/pinning/remote/client/openapi/client.go new file mode 100644 index 0000000000..2fa0b79aba --- /dev/null +++ b/pinning/remote/client/openapi/client.go @@ -0,0 +1,531 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "bytes" + "context" + "encoding/json" + "encoding/xml" + "errors" + "fmt" + "io" + "log" + "mime/multipart" + "net/http" + "net/http/httputil" + "net/url" + "os" + "path/filepath" + "reflect" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" + + "golang.org/x/oauth2" +) + +var ( + jsonCheck = regexp.MustCompile(`(?i:(?:application|text)/(?:vnd\.[^;]+\+)?json)`) + xmlCheck = regexp.MustCompile(`(?i:(?:application|text)/xml)`) +) + +// APIClient manages communication with the IPFS Pinning Service API API v0.0.5 +// In most cases there should be only one, shared, APIClient. +type APIClient struct { + cfg *Configuration + common service // Reuse a single struct instead of allocating one for each service on the heap. + + // API Services + + PinsApi *PinsApiService +} + +type service struct { + client *APIClient +} + +// NewAPIClient creates a new API client. Requires a userAgent string describing your application. +// optionally a custom http.Client to allow for advanced features such as caching. +func NewAPIClient(cfg *Configuration) *APIClient { + if cfg.HTTPClient == nil { + cfg.HTTPClient = http.DefaultClient + } + + c := &APIClient{} + c.cfg = cfg + c.common.client = c + + // API Services + c.PinsApi = (*PinsApiService)(&c.common) + + return c +} + +func atoi(in string) (int, error) { + return strconv.Atoi(in) +} + +// selectHeaderContentType select a content type from the available list. +func selectHeaderContentType(contentTypes []string) string { + if len(contentTypes) == 0 { + return "" + } + if contains(contentTypes, "application/json") { + return "application/json" + } + return contentTypes[0] // use the first content type specified in 'consumes' +} + +// selectHeaderAccept join all accept types and return +func selectHeaderAccept(accepts []string) string { + if len(accepts) == 0 { + return "" + } + + if contains(accepts, "application/json") { + return "application/json" + } + + return strings.Join(accepts, ",") +} + +// contains is a case insenstive match, finding needle in a haystack +func contains(haystack []string, needle string) bool { + for _, a := range haystack { + if strings.ToLower(a) == strings.ToLower(needle) { + return true + } + } + return false +} + +// Verify optional parameters are of the correct type. +func typeCheckParameter(obj interface{}, expected string, name string) error { + // Make sure there is an object. + if obj == nil { + return nil + } + + // Check the type is as expected. + if reflect.TypeOf(obj).String() != expected { + return fmt.Errorf("Expected %s to be of type %s but received %s.", name, expected, reflect.TypeOf(obj).String()) + } + return nil +} + +// parameterToString convert interface{} parameters to string, using a delimiter if format is provided. +func parameterToString(obj interface{}, collectionFormat string) string { + var delimiter string + + switch collectionFormat { + case "pipes": + delimiter = "|" + case "ssv": + delimiter = " " + case "tsv": + delimiter = "\t" + case "csv": + delimiter = "," + } + + if reflect.TypeOf(obj).Kind() == reflect.Slice { + return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]") + } else if t, ok := obj.(time.Time); ok { + return t.Format(time.RFC3339) + } + + return fmt.Sprintf("%v", obj) +} + +// helper for converting interface{} parameters to json strings +func parameterToJson(obj interface{}) (string, error) { + jsonBuf, err := json.Marshal(obj) + if err != nil { + return "", err + } + return string(jsonBuf), err +} + +// callAPI do the request. +func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) { + if c.cfg.Debug { + dump, err := httputil.DumpRequestOut(request, true) + if err != nil { + return nil, err + } + log.Printf("\n%s\n", string(dump)) + } + + resp, err := c.cfg.HTTPClient.Do(request) + if err != nil { + return resp, err + } + + if c.cfg.Debug { + dump, err := httputil.DumpResponse(resp, true) + if err != nil { + return resp, err + } + log.Printf("\n%s\n", string(dump)) + } + return resp, err +} + +// Allow modification of underlying config for alternate implementations and testing +// Caution: modifying the configuration while live can cause data races and potentially unwanted behavior +func (c *APIClient) GetConfig() *Configuration { + return c.cfg +} + +// prepareRequest build the request +func (c *APIClient) prepareRequest( + ctx context.Context, + path string, method string, + postBody interface{}, + headerParams map[string]string, + queryParams url.Values, + formParams url.Values, + formFileName string, + fileName string, + fileBytes []byte) (localVarRequest *http.Request, err error) { + + var body *bytes.Buffer + + // Detect postBody type and post. + if postBody != nil { + contentType := headerParams["Content-Type"] + if contentType == "" { + contentType = detectContentType(postBody) + headerParams["Content-Type"] = contentType + } + + body, err = setBody(postBody, contentType) + if err != nil { + return nil, err + } + } + + // add form parameters and file if available. + if strings.HasPrefix(headerParams["Content-Type"], "multipart/form-data") && len(formParams) > 0 || (len(fileBytes) > 0 && fileName != "") { + if body != nil { + return nil, errors.New("Cannot specify postBody and multipart form at the same time.") + } + body = &bytes.Buffer{} + w := multipart.NewWriter(body) + + for k, v := range formParams { + for _, iv := range v { + if strings.HasPrefix(k, "@") { // file + err = addFile(w, k[1:], iv) + if err != nil { + return nil, err + } + } else { // form value + w.WriteField(k, iv) + } + } + } + if len(fileBytes) > 0 && fileName != "" { + w.Boundary() + //_, fileNm := filepath.Split(fileName) + part, err := w.CreateFormFile(formFileName, filepath.Base(fileName)) + if err != nil { + return nil, err + } + _, err = part.Write(fileBytes) + if err != nil { + return nil, err + } + } + + // Set the Boundary in the Content-Type + headerParams["Content-Type"] = w.FormDataContentType() + + // Set Content-Length + headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len()) + w.Close() + } + + if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 { + if body != nil { + return nil, errors.New("Cannot specify postBody and x-www-form-urlencoded form at the same time.") + } + body = &bytes.Buffer{} + body.WriteString(formParams.Encode()) + // Set Content-Length + headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len()) + } + + // Setup path and query parameters + url, err := url.Parse(path) + if err != nil { + return nil, err + } + + // Override request host, if applicable + if c.cfg.Host != "" { + url.Host = c.cfg.Host + } + + // Override request scheme, if applicable + if c.cfg.Scheme != "" { + url.Scheme = c.cfg.Scheme + } + + // Adding Query Param + query := url.Query() + for k, v := range queryParams { + for _, iv := range v { + query.Add(k, iv) + } + } + + // Encode the parameters. + url.RawQuery = query.Encode() + + // Generate a new request + if body != nil { + localVarRequest, err = http.NewRequest(method, url.String(), body) + } else { + localVarRequest, err = http.NewRequest(method, url.String(), nil) + } + if err != nil { + return nil, err + } + + // add header parameters, if any + if len(headerParams) > 0 { + headers := http.Header{} + for h, v := range headerParams { + headers.Set(h, v) + } + localVarRequest.Header = headers + } + + // Add the user agent to the request. + localVarRequest.Header.Add("User-Agent", c.cfg.UserAgent) + + if ctx != nil { + // add context to the request + localVarRequest = localVarRequest.WithContext(ctx) + + // Walk through any authentication. + + // OAuth2 authentication + if tok, ok := ctx.Value(ContextOAuth2).(oauth2.TokenSource); ok { + // We were able to grab an oauth2 token from the context + var latestToken *oauth2.Token + if latestToken, err = tok.Token(); err != nil { + return nil, err + } + + latestToken.SetAuthHeader(localVarRequest) + } + + // Basic HTTP Authentication + if auth, ok := ctx.Value(ContextBasicAuth).(BasicAuth); ok { + localVarRequest.SetBasicAuth(auth.UserName, auth.Password) + } + + // AccessToken Authentication + if auth, ok := ctx.Value(ContextAccessToken).(string); ok { + localVarRequest.Header.Add("Authorization", "Bearer "+auth) + } + } + + for header, value := range c.cfg.DefaultHeader { + localVarRequest.Header.Add(header, value) + } + return localVarRequest, nil +} + +func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) { + if len(b) == 0 { + return nil + } + if s, ok := v.(*string); ok { + *s = string(b) + return nil + } + if xmlCheck.MatchString(contentType) { + if err = xml.Unmarshal(b, v); err != nil { + return err + } + return nil + } + if jsonCheck.MatchString(contentType) { + if actualObj, ok := v.(interface{ GetActualInstance() interface{} }); ok { // oneOf, anyOf schemas + if unmarshalObj, ok := actualObj.(interface{ UnmarshalJSON([]byte) error }); ok { // make sure it has UnmarshalJSON defined + if err = unmarshalObj.UnmarshalJSON(b); err != nil { + return err + } + } else { + errors.New("Unknown type with GetActualInstance but no unmarshalObj.UnmarshalJSON defined") + } + } else if err = json.Unmarshal(b, v); err != nil { // simple model + return err + } + return nil + } + return errors.New("undefined response type") +} + +// Add a file to the multipart request +func addFile(w *multipart.Writer, fieldName, path string) error { + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + part, err := w.CreateFormFile(fieldName, filepath.Base(path)) + if err != nil { + return err + } + _, err = io.Copy(part, file) + + return err +} + +// Prevent trying to import "fmt" +func reportError(format string, a ...interface{}) error { + return fmt.Errorf(format, a...) +} + +// Set request body from an interface{} +func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) { + if bodyBuf == nil { + bodyBuf = &bytes.Buffer{} + } + + if reader, ok := body.(io.Reader); ok { + _, err = bodyBuf.ReadFrom(reader) + } else if b, ok := body.([]byte); ok { + _, err = bodyBuf.Write(b) + } else if s, ok := body.(string); ok { + _, err = bodyBuf.WriteString(s) + } else if s, ok := body.(*string); ok { + _, err = bodyBuf.WriteString(*s) + } else if jsonCheck.MatchString(contentType) { + err = json.NewEncoder(bodyBuf).Encode(body) + } else if xmlCheck.MatchString(contentType) { + err = xml.NewEncoder(bodyBuf).Encode(body) + } + + if err != nil { + return nil, err + } + + if bodyBuf.Len() == 0 { + err = fmt.Errorf("Invalid body type %s\n", contentType) + return nil, err + } + return bodyBuf, nil +} + +// detectContentType method is used to figure out `Request.Body` content type for request header +func detectContentType(body interface{}) string { + contentType := "text/plain; charset=utf-8" + kind := reflect.TypeOf(body).Kind() + + switch kind { + case reflect.Struct, reflect.Map, reflect.Ptr: + contentType = "application/json; charset=utf-8" + case reflect.String: + contentType = "text/plain; charset=utf-8" + default: + if b, ok := body.([]byte); ok { + contentType = http.DetectContentType(b) + } else if kind == reflect.Slice { + contentType = "application/json; charset=utf-8" + } + } + + return contentType +} + +// Ripped from https://github.com/gregjones/httpcache/blob/master/httpcache.go +type cacheControl map[string]string + +func parseCacheControl(headers http.Header) cacheControl { + cc := cacheControl{} + ccHeader := headers.Get("Cache-Control") + for _, part := range strings.Split(ccHeader, ",") { + part = strings.Trim(part, " ") + if part == "" { + continue + } + if strings.ContainsRune(part, '=') { + keyval := strings.Split(part, "=") + cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") + } else { + cc[part] = "" + } + } + return cc +} + +// CacheExpires helper function to determine remaining time before repeating a request. +func CacheExpires(r *http.Response) time.Time { + // Figure out when the cache expires. + var expires time.Time + now, err := time.Parse(time.RFC1123, r.Header.Get("date")) + if err != nil { + return time.Now() + } + respCacheControl := parseCacheControl(r.Header) + + if maxAge, ok := respCacheControl["max-age"]; ok { + lifetime, err := time.ParseDuration(maxAge + "s") + if err != nil { + expires = now + } else { + expires = now.Add(lifetime) + } + } else { + expiresHeader := r.Header.Get("Expires") + if expiresHeader != "" { + expires, err = time.Parse(time.RFC1123, expiresHeader) + if err != nil { + expires = now + } + } + } + return expires +} + +func strlen(s string) int { + return utf8.RuneCountInString(s) +} + +// GenericOpenAPIError Provides access to the body, error and model on returned errors. +type GenericOpenAPIError struct { + body []byte + error string + model interface{} +} + +// Error returns non-empty string if there was an error. +func (e GenericOpenAPIError) Error() string { + return e.error +} + +// Body returns the raw bytes of the response +func (e GenericOpenAPIError) Body() []byte { + return e.body +} + +// Model returns the unpacked model of the error +func (e GenericOpenAPIError) Model() interface{} { + return e.model +} diff --git a/pinning/remote/client/openapi/configuration.go b/pinning/remote/client/openapi/configuration.go new file mode 100644 index 0000000000..2dd763a9d0 --- /dev/null +++ b/pinning/remote/client/openapi/configuration.go @@ -0,0 +1,228 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "context" + "fmt" + "net/http" + "strings" +) + +// contextKeys are used to identify the type of value in the context. +// Since these are string, it is possible to get a short description of the +// context key for logging and debugging using key.String(). + +type contextKey string + +func (c contextKey) String() string { + return "auth " + string(c) +} + +var ( + // ContextOAuth2 takes an oauth2.TokenSource as authentication for the request. + ContextOAuth2 = contextKey("token") + + // ContextBasicAuth takes BasicAuth as authentication for the request. + ContextBasicAuth = contextKey("basic") + + // ContextAccessToken takes a string oauth2 access token as authentication for the request. + ContextAccessToken = contextKey("accesstoken") + + // ContextAPIKeys takes a string apikey as authentication for the request + ContextAPIKeys = contextKey("apiKeys") + + // ContextHttpSignatureAuth takes HttpSignatureAuth as authentication for the request. + ContextHttpSignatureAuth = contextKey("httpsignature") + + // ContextServerIndex uses a server configuration from the index. + ContextServerIndex = contextKey("serverIndex") + + // ContextOperationServerIndices uses a server configuration from the index mapping. + ContextOperationServerIndices = contextKey("serverOperationIndices") + + // ContextServerVariables overrides a server configuration variables. + ContextServerVariables = contextKey("serverVariables") + + // ContextOperationServerVariables overrides a server configuration variables using operation specific values. + ContextOperationServerVariables = contextKey("serverOperationVariables") +) + +// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth +type BasicAuth struct { + UserName string `json:"userName,omitempty"` + Password string `json:"password,omitempty"` +} + +// APIKey provides API key based authentication to a request passed via context using ContextAPIKey +type APIKey struct { + Key string + Prefix string +} + +// ServerVariable stores the information about a server variable +type ServerVariable struct { + Description string + DefaultValue string + EnumValues []string +} + +// ServerConfiguration stores the information about a server +type ServerConfiguration struct { + URL string + Description string + Variables map[string]ServerVariable +} + +// ServerConfigurations stores multiple ServerConfiguration items +type ServerConfigurations []ServerConfiguration + +// Configuration stores the configuration of the API client +type Configuration struct { + Host string `json:"host,omitempty"` + Scheme string `json:"scheme,omitempty"` + DefaultHeader map[string]string `json:"defaultHeader,omitempty"` + UserAgent string `json:"userAgent,omitempty"` + Debug bool `json:"debug,omitempty"` + Servers ServerConfigurations + OperationServers map[string]ServerConfigurations + HTTPClient *http.Client +} + +// NewConfiguration returns a new Configuration object +func NewConfiguration() *Configuration { + cfg := &Configuration{ + DefaultHeader: make(map[string]string), + UserAgent: "OpenAPI-Generator/1.0.0/go", + Debug: false, + Servers: ServerConfigurations{ + { + URL: "https://pinning-service.example.com", + Description: "No description provided", + }, + }, + OperationServers: map[string]ServerConfigurations{}, + } + return cfg +} + +// AddDefaultHeader adds a new HTTP header to the default header in the request +func (c *Configuration) AddDefaultHeader(key string, value string) { + c.DefaultHeader[key] = value +} + +// URL formats template on a index using given variables +func (sc ServerConfigurations) URL(index int, variables map[string]string) (string, error) { + if index < 0 || len(sc) <= index { + return "", fmt.Errorf("Index %v out of range %v", index, len(sc)-1) + } + server := sc[index] + url := server.URL + + // go through variables and replace placeholders + for name, variable := range server.Variables { + if value, ok := variables[name]; ok { + found := bool(len(variable.EnumValues) == 0) + for _, enumValue := range variable.EnumValues { + if value == enumValue { + found = true + } + } + if !found { + return "", fmt.Errorf("The variable %s in the server URL has invalid value %v. Must be %v", name, value, variable.EnumValues) + } + url = strings.Replace(url, "{"+name+"}", value, -1) + } else { + url = strings.Replace(url, "{"+name+"}", variable.DefaultValue, -1) + } + } + return url, nil +} + +// ServerURL returns URL based on server settings +func (c *Configuration) ServerURL(index int, variables map[string]string) (string, error) { + return c.Servers.URL(index, variables) +} + +func getServerIndex(ctx context.Context) (int, error) { + si := ctx.Value(ContextServerIndex) + if si != nil { + if index, ok := si.(int); ok { + return index, nil + } + return 0, reportError("Invalid type %T should be int", si) + } + return 0, nil +} + +func getServerOperationIndex(ctx context.Context, endpoint string) (int, error) { + osi := ctx.Value(ContextOperationServerIndices) + if osi != nil { + if operationIndices, ok := osi.(map[string]int); !ok { + return 0, reportError("Invalid type %T should be map[string]int", osi) + } else { + index, ok := operationIndices[endpoint] + if ok { + return index, nil + } + } + } + return getServerIndex(ctx) +} + +func getServerVariables(ctx context.Context) (map[string]string, error) { + sv := ctx.Value(ContextServerVariables) + if sv != nil { + if variables, ok := sv.(map[string]string); ok { + return variables, nil + } + return nil, reportError("ctx value of ContextServerVariables has invalid type %T should be map[string]string", sv) + } + return nil, nil +} + +func getServerOperationVariables(ctx context.Context, endpoint string) (map[string]string, error) { + osv := ctx.Value(ContextOperationServerVariables) + if osv != nil { + if operationVariables, ok := osv.(map[string]map[string]string); !ok { + return nil, reportError("ctx value of ContextOperationServerVariables has invalid type %T should be map[string]map[string]string", osv) + } else { + variables, ok := operationVariables[endpoint] + if ok { + return variables, nil + } + } + } + return getServerVariables(ctx) +} + +// ServerURLWithContext returns a new server URL given an endpoint +func (c *Configuration) ServerURLWithContext(ctx context.Context, endpoint string) (string, error) { + sc, ok := c.OperationServers[endpoint] + if !ok { + sc = c.Servers + } + + if ctx == nil { + return sc.URL(0, nil) + } + + index, err := getServerOperationIndex(ctx, endpoint) + if err != nil { + return "", err + } + + variables, err := getServerOperationVariables(ctx, endpoint) + if err != nil { + return "", err + } + + return sc.URL(index, variables) +} diff --git a/pinning/remote/client/openapi/docs/Error.md b/pinning/remote/client/openapi/docs/Error.md new file mode 100644 index 0000000000..e88553965d --- /dev/null +++ b/pinning/remote/client/openapi/docs/Error.md @@ -0,0 +1,72 @@ +# Error + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Code** | **int32** | | +**Message** | **string** | | + +## Methods + +### NewError + +`func NewError(code int32, message string, ) *Error` + +NewError instantiates a new Error object +This constructor will assign default values to properties that have it defined, +and makes sure properties required by API are set, but the set of arguments +will change when the set of required properties is changed + +### NewErrorWithDefaults + +`func NewErrorWithDefaults() *Error` + +NewErrorWithDefaults instantiates a new Error object +This constructor will only assign default values to properties that have it defined, +but it doesn't guarantee that properties required by API are set + +### GetCode + +`func (o *Error) GetCode() int32` + +GetCode returns the Code field if non-nil, zero value otherwise. + +### GetCodeOk + +`func (o *Error) GetCodeOk() (*int32, bool)` + +GetCodeOk returns a tuple with the Code field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetCode + +`func (o *Error) SetCode(v int32)` + +SetCode sets Code field to given value. + + +### GetMessage + +`func (o *Error) GetMessage() string` + +GetMessage returns the Message field if non-nil, zero value otherwise. + +### GetMessageOk + +`func (o *Error) GetMessageOk() (*string, bool)` + +GetMessageOk returns a tuple with the Message field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetMessage + +`func (o *Error) SetMessage(v string)` + +SetMessage sets Message field to given value. + + + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pinning/remote/client/openapi/docs/Pin.md b/pinning/remote/client/openapi/docs/Pin.md new file mode 100644 index 0000000000..cbdf1a0b7e --- /dev/null +++ b/pinning/remote/client/openapi/docs/Pin.md @@ -0,0 +1,129 @@ +# Pin + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Cid** | **string** | CID to be pinned recursively | +**Name** | Pointer to **string** | Optional name for pinned data; can be used for lookups later | [optional] +**Origins** | Pointer to **[]string** | Optional list of multiaddrs known to provide the data | [optional] +**Meta** | Pointer to **map[string]string** | Optional metadata for pin object | [optional] + +## Methods + +### NewPin + +`func NewPin(cid string, ) *Pin` + +NewPin instantiates a new Pin object +This constructor will assign default values to properties that have it defined, +and makes sure properties required by API are set, but the set of arguments +will change when the set of required properties is changed + +### NewPinWithDefaults + +`func NewPinWithDefaults() *Pin` + +NewPinWithDefaults instantiates a new Pin object +This constructor will only assign default values to properties that have it defined, +but it doesn't guarantee that properties required by API are set + +### GetCid + +`func (o *Pin) GetCid() string` + +GetCid returns the Cid field if non-nil, zero value otherwise. + +### GetCidOk + +`func (o *Pin) GetCidOk() (*string, bool)` + +GetCidOk returns a tuple with the Cid field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetCid + +`func (o *Pin) SetCid(v string)` + +SetCid sets Cid field to given value. + + +### GetName + +`func (o *Pin) GetName() string` + +GetName returns the Name field if non-nil, zero value otherwise. + +### GetNameOk + +`func (o *Pin) GetNameOk() (*string, bool)` + +GetNameOk returns a tuple with the Name field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetName + +`func (o *Pin) SetName(v string)` + +SetName sets Name field to given value. + +### HasName + +`func (o *Pin) HasName() bool` + +HasName returns a boolean if a field has been set. + +### GetOrigins + +`func (o *Pin) GetOrigins() []string` + +GetOrigins returns the Origins field if non-nil, zero value otherwise. + +### GetOriginsOk + +`func (o *Pin) GetOriginsOk() (*[]string, bool)` + +GetOriginsOk returns a tuple with the Origins field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetOrigins + +`func (o *Pin) SetOrigins(v []string)` + +SetOrigins sets Origins field to given value. + +### HasOrigins + +`func (o *Pin) HasOrigins() bool` + +HasOrigins returns a boolean if a field has been set. + +### GetMeta + +`func (o *Pin) GetMeta() map[string]string` + +GetMeta returns the Meta field if non-nil, zero value otherwise. + +### GetMetaOk + +`func (o *Pin) GetMetaOk() (*map[string]string, bool)` + +GetMetaOk returns a tuple with the Meta field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetMeta + +`func (o *Pin) SetMeta(v map[string]string)` + +SetMeta sets Meta field to given value. + +### HasMeta + +`func (o *Pin) HasMeta() bool` + +HasMeta returns a boolean if a field has been set. + + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pinning/remote/client/openapi/docs/PinResults.md b/pinning/remote/client/openapi/docs/PinResults.md new file mode 100644 index 0000000000..1982bfddb0 --- /dev/null +++ b/pinning/remote/client/openapi/docs/PinResults.md @@ -0,0 +1,72 @@ +# PinResults + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Count** | **int32** | The total number of pin objects that exist for passed query filters | +**Results** | [**[]PinStatus**](PinStatus.md) | An array of PinStatus results | + +## Methods + +### NewPinResults + +`func NewPinResults(count int32, results []PinStatus, ) *PinResults` + +NewPinResults instantiates a new PinResults object +This constructor will assign default values to properties that have it defined, +and makes sure properties required by API are set, but the set of arguments +will change when the set of required properties is changed + +### NewPinResultsWithDefaults + +`func NewPinResultsWithDefaults() *PinResults` + +NewPinResultsWithDefaults instantiates a new PinResults object +This constructor will only assign default values to properties that have it defined, +but it doesn't guarantee that properties required by API are set + +### GetCount + +`func (o *PinResults) GetCount() int32` + +GetCount returns the Count field if non-nil, zero value otherwise. + +### GetCountOk + +`func (o *PinResults) GetCountOk() (*int32, bool)` + +GetCountOk returns a tuple with the Count field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetCount + +`func (o *PinResults) SetCount(v int32)` + +SetCount sets Count field to given value. + + +### GetResults + +`func (o *PinResults) GetResults() []PinStatus` + +GetResults returns the Results field if non-nil, zero value otherwise. + +### GetResultsOk + +`func (o *PinResults) GetResultsOk() (*[]PinStatus, bool)` + +GetResultsOk returns a tuple with the Results field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetResults + +`func (o *PinResults) SetResults(v []PinStatus)` + +SetResults sets Results field to given value. + + + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pinning/remote/client/openapi/docs/PinStatus.md b/pinning/remote/client/openapi/docs/PinStatus.md new file mode 100644 index 0000000000..2408abfdaf --- /dev/null +++ b/pinning/remote/client/openapi/docs/PinStatus.md @@ -0,0 +1,161 @@ +# PinStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Id** | **string** | Globally unique ID of the pin request; can be used to check the status of ongoing pinning, modification of pin object, or pin removal | +**Status** | [**Status**](Status.md) | | +**Created** | [**time.Time**](time.Time.md) | Immutable timestamp indicating when a pin request entered a pinning service; can be used for filtering results and pagination | +**Pin** | [**Pin**](Pin.md) | | +**Delegates** | **[]string** | List of multiaddrs designated by pinning service for transferring any new data from external peers | +**Info** | Pointer to **map[string]string** | Optional info for PinStatus response | [optional] + +## Methods + +### NewPinStatus + +`func NewPinStatus(id string, status Status, created time.Time, pin Pin, delegates []string, ) *PinStatus` + +NewPinStatus instantiates a new PinStatus object +This constructor will assign default values to properties that have it defined, +and makes sure properties required by API are set, but the set of arguments +will change when the set of required properties is changed + +### NewPinStatusWithDefaults + +`func NewPinStatusWithDefaults() *PinStatus` + +NewPinStatusWithDefaults instantiates a new PinStatus object +This constructor will only assign default values to properties that have it defined, +but it doesn't guarantee that properties required by API are set + +### GetId + +`func (o *PinStatus) GetId() string` + +GetId returns the Id field if non-nil, zero value otherwise. + +### GetIdOk + +`func (o *PinStatus) GetIdOk() (*string, bool)` + +GetIdOk returns a tuple with the Id field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetId + +`func (o *PinStatus) SetId(v string)` + +SetId sets Id field to given value. + + +### GetStatus + +`func (o *PinStatus) GetStatus() Status` + +GetStatus returns the Status field if non-nil, zero value otherwise. + +### GetStatusOk + +`func (o *PinStatus) GetStatusOk() (*Status, bool)` + +GetStatusOk returns a tuple with the Status field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetStatus + +`func (o *PinStatus) SetStatus(v Status)` + +SetStatus sets Status field to given value. + + +### GetCreated + +`func (o *PinStatus) GetCreated() time.Time` + +GetCreated returns the Created field if non-nil, zero value otherwise. + +### GetCreatedOk + +`func (o *PinStatus) GetCreatedOk() (*time.Time, bool)` + +GetCreatedOk returns a tuple with the Created field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetCreated + +`func (o *PinStatus) SetCreated(v time.Time)` + +SetCreated sets Created field to given value. + + +### GetPin + +`func (o *PinStatus) GetPin() Pin` + +GetPin returns the Pin field if non-nil, zero value otherwise. + +### GetPinOk + +`func (o *PinStatus) GetPinOk() (*Pin, bool)` + +GetPinOk returns a tuple with the Pin field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetPin + +`func (o *PinStatus) SetPin(v Pin)` + +SetPin sets Pin field to given value. + + +### GetDelegates + +`func (o *PinStatus) GetDelegates() []string` + +GetDelegates returns the Delegates field if non-nil, zero value otherwise. + +### GetDelegatesOk + +`func (o *PinStatus) GetDelegatesOk() (*[]string, bool)` + +GetDelegatesOk returns a tuple with the Delegates field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetDelegates + +`func (o *PinStatus) SetDelegates(v []string)` + +SetDelegates sets Delegates field to given value. + + +### GetInfo + +`func (o *PinStatus) GetInfo() map[string]string` + +GetInfo returns the Info field if non-nil, zero value otherwise. + +### GetInfoOk + +`func (o *PinStatus) GetInfoOk() (*map[string]string, bool)` + +GetInfoOk returns a tuple with the Info field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetInfo + +`func (o *PinStatus) SetInfo(v map[string]string)` + +SetInfo sets Info field to given value. + +### HasInfo + +`func (o *PinStatus) HasInfo() bool` + +HasInfo returns a boolean if a field has been set. + + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pinning/remote/client/openapi/docs/PinsApi.md b/pinning/remote/client/openapi/docs/PinsApi.md new file mode 100644 index 0000000000..0aea62d997 --- /dev/null +++ b/pinning/remote/client/openapi/docs/PinsApi.md @@ -0,0 +1,367 @@ +# \PinsApi + +All URIs are relative to *https://pinning-service.example.com* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**PinsGet**](PinsApi.md#PinsGet) | **Get** /pins | List pin objects +[**PinsIdDelete**](PinsApi.md#PinsIdDelete) | **Delete** /pins/{id} | Remove pin object +[**PinsIdGet**](PinsApi.md#PinsIdGet) | **Get** /pins/{id} | Get pin object +[**PinsIdPost**](PinsApi.md#PinsIdPost) | **Post** /pins/{id} | Modify pin object +[**PinsPost**](PinsApi.md#PinsPost) | **Post** /pins | Add pin object + + + +## PinsGet + +> PinResults PinsGet(ctx).Cid(cid).Name(name).Status(status).Before(before).After(after).Limit(limit).Meta(meta).Execute() + +List pin objects + + + +### Example + +```go +package main + +import ( + "context" + "fmt" + "os" + openapiclient "./openapi" +) + +func main() { + cid := []string{"Inner_example"} // []string | Return pin objects responsible for pinning the specified CID(s) (optional) + name := "name_example" // string | Return pin objects with names that contain provided value (partial or full match) (optional) + status := []Status{openapiclient.Status{}} // []Status | Return pin objects for pins with the specified status (optional) + before := Get-Date // time.Time | Return results created (queued) before provided timestamp (optional) + after := Get-Date // time.Time | Return results created (queued) after provided timestamp (optional) + limit := 987 // int32 | Max records to return (optional) (default to 10) + meta := map[string]string{ "Key" = "Value" } // map[string]string | Return pin objects that match specified metadata (optional) + + configuration := openapiclient.NewConfiguration() + api_client := openapiclient.NewAPIClient(configuration) + resp, r, err := api_client.PinsApi.PinsGet(context.Background(), ).Cid(cid).Name(name).Status(status).Before(before).After(after).Limit(limit).Meta(meta).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsGet``: %v\n", err) + fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) + } + // response from `PinsGet`: PinResults + fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsGet`: %v\n", resp) +} +``` + +### Path Parameters + + + +### Other Parameters + +Other parameters are passed through a pointer to a apiPinsGetRequest struct via the builder pattern + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **cid** | [**[]string**](string.md) | Return pin objects responsible for pinning the specified CID(s) | + **name** | **string** | Return pin objects with names that contain provided value (partial or full match) | + **status** | [**[]Status**](Status.md) | Return pin objects for pins with the specified status | + **before** | **time.Time** | Return results created (queued) before provided timestamp | + **after** | **time.Time** | Return results created (queued) after provided timestamp | + **limit** | **int32** | Max records to return | [default to 10] + **meta** | [**map[string]string**](string.md) | Return pin objects that match specified metadata | + +### Return type + +[**PinResults**](PinResults.md) + +### Authorization + +[accessToken](../README.md#accessToken) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) +[[Back to Model list]](../README.md#documentation-for-models) +[[Back to README]](../README.md) + + +## PinsIdDelete + +> PinsIdDelete(ctx, id).Execute() + +Remove pin object + + + +### Example + +```go +package main + +import ( + "context" + "fmt" + "os" + openapiclient "./openapi" +) + +func main() { + id := "id_example" // string | + + configuration := openapiclient.NewConfiguration() + api_client := openapiclient.NewAPIClient(configuration) + resp, r, err := api_client.PinsApi.PinsIdDelete(context.Background(), id).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsIdDelete``: %v\n", err) + fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) + } +} +``` + +### Path Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- +**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. +**id** | **string** | | + +### Other Parameters + +Other parameters are passed through a pointer to a apiPinsIdDeleteRequest struct via the builder pattern + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + + +### Return type + + (empty response body) + +### Authorization + +[accessToken](../README.md#accessToken) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) +[[Back to Model list]](../README.md#documentation-for-models) +[[Back to README]](../README.md) + + +## PinsIdGet + +> PinStatus PinsIdGet(ctx, id).Execute() + +Get pin object + + + +### Example + +```go +package main + +import ( + "context" + "fmt" + "os" + openapiclient "./openapi" +) + +func main() { + id := "id_example" // string | + + configuration := openapiclient.NewConfiguration() + api_client := openapiclient.NewAPIClient(configuration) + resp, r, err := api_client.PinsApi.PinsIdGet(context.Background(), id).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsIdGet``: %v\n", err) + fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) + } + // response from `PinsIdGet`: PinStatus + fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsIdGet`: %v\n", resp) +} +``` + +### Path Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- +**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. +**id** | **string** | | + +### Other Parameters + +Other parameters are passed through a pointer to a apiPinsIdGetRequest struct via the builder pattern + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + + +### Return type + +[**PinStatus**](PinStatus.md) + +### Authorization + +[accessToken](../README.md#accessToken) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) +[[Back to Model list]](../README.md#documentation-for-models) +[[Back to README]](../README.md) + + +## PinsIdPost + +> PinStatus PinsIdPost(ctx, id).Pin(pin).Execute() + +Modify pin object + + + +### Example + +```go +package main + +import ( + "context" + "fmt" + "os" + openapiclient "./openapi" +) + +func main() { + id := "id_example" // string | + pin := openapiclient.Pin{Cid: "Cid_example", Name: "Name_example", Origins: []string{"Origins_example"), Meta: map[string]string{ "Key" = "Value" }} // Pin | + + configuration := openapiclient.NewConfiguration() + api_client := openapiclient.NewAPIClient(configuration) + resp, r, err := api_client.PinsApi.PinsIdPost(context.Background(), id, pin).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsIdPost``: %v\n", err) + fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) + } + // response from `PinsIdPost`: PinStatus + fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsIdPost`: %v\n", resp) +} +``` + +### Path Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- +**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. +**id** | **string** | | + +### Other Parameters + +Other parameters are passed through a pointer to a apiPinsIdPostRequest struct via the builder pattern + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + + **pin** | [**Pin**](Pin.md) | | + +### Return type + +[**PinStatus**](PinStatus.md) + +### Authorization + +[accessToken](../README.md#accessToken) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) +[[Back to Model list]](../README.md#documentation-for-models) +[[Back to README]](../README.md) + + +## PinsPost + +> PinStatus PinsPost(ctx).Pin(pin).Execute() + +Add pin object + + + +### Example + +```go +package main + +import ( + "context" + "fmt" + "os" + openapiclient "./openapi" +) + +func main() { + pin := openapiclient.Pin{Cid: "Cid_example", Name: "Name_example", Origins: []string{"Origins_example"), Meta: map[string]string{ "Key" = "Value" }} // Pin | + + configuration := openapiclient.NewConfiguration() + api_client := openapiclient.NewAPIClient(configuration) + resp, r, err := api_client.PinsApi.PinsPost(context.Background(), pin).Execute() + if err != nil { + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsPost``: %v\n", err) + fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) + } + // response from `PinsPost`: PinStatus + fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsPost`: %v\n", resp) +} +``` + +### Path Parameters + + + +### Other Parameters + +Other parameters are passed through a pointer to a apiPinsPostRequest struct via the builder pattern + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pin** | [**Pin**](Pin.md) | | + +### Return type + +[**PinStatus**](PinStatus.md) + +### Authorization + +[accessToken](../README.md#accessToken) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) +[[Back to Model list]](../README.md#documentation-for-models) +[[Back to README]](../README.md) + diff --git a/pinning/remote/client/openapi/docs/Status.md b/pinning/remote/client/openapi/docs/Status.md new file mode 100644 index 0000000000..01176af11e --- /dev/null +++ b/pinning/remote/client/openapi/docs/Status.md @@ -0,0 +1,11 @@ +# Status + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pinning/remote/client/openapi/model_error.go b/pinning/remote/client/openapi/model_error.go new file mode 100644 index 0000000000..d97ecaa2c6 --- /dev/null +++ b/pinning/remote/client/openapi/model_error.go @@ -0,0 +1,134 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "encoding/json" +) + +// Error Base error object +type Error struct { + Code int32 `json:"code"` + Message string `json:"message"` +} + +// NewError instantiates a new Error object +// This constructor will assign default values to properties that have it defined, +// and makes sure properties required by API are set, but the set of arguments +// will change when the set of required properties is changed +func NewError(code int32, message string) *Error { + this := Error{} + this.Code = code + this.Message = message + return &this +} + +// NewErrorWithDefaults instantiates a new Error object +// This constructor will only assign default values to properties that have it defined, +// but it doesn't guarantee that properties required by API are set +func NewErrorWithDefaults() *Error { + this := Error{} + return &this +} + +// GetCode returns the Code field value +func (o *Error) GetCode() int32 { + if o == nil { + var ret int32 + return ret + } + + return o.Code +} + +// GetCodeOk returns a tuple with the Code field value +// and a boolean to check if the value has been set. +func (o *Error) GetCodeOk() (*int32, bool) { + if o == nil { + return nil, false + } + return &o.Code, true +} + +// SetCode sets field value +func (o *Error) SetCode(v int32) { + o.Code = v +} + +// GetMessage returns the Message field value +func (o *Error) GetMessage() string { + if o == nil { + var ret string + return ret + } + + return o.Message +} + +// GetMessageOk returns a tuple with the Message field value +// and a boolean to check if the value has been set. +func (o *Error) GetMessageOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Message, true +} + +// SetMessage sets field value +func (o *Error) SetMessage(v string) { + o.Message = v +} + +func (o Error) MarshalJSON() ([]byte, error) { + toSerialize := map[string]interface{}{} + if true { + toSerialize["code"] = o.Code + } + if true { + toSerialize["message"] = o.Message + } + return json.Marshal(toSerialize) +} + +type NullableError struct { + value *Error + isSet bool +} + +func (v NullableError) Get() *Error { + return v.value +} + +func (v *NullableError) Set(val *Error) { + v.value = val + v.isSet = true +} + +func (v NullableError) IsSet() bool { + return v.isSet +} + +func (v *NullableError) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableError(val *Error) *NullableError { + return &NullableError{value: val, isSet: true} +} + +func (v NullableError) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableError) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/pinning/remote/client/openapi/model_pin.go b/pinning/remote/client/openapi/model_pin.go new file mode 100644 index 0000000000..c4a5e80155 --- /dev/null +++ b/pinning/remote/client/openapi/model_pin.go @@ -0,0 +1,217 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "encoding/json" +) + +// Pin Pin object +type Pin struct { + // CID to be pinned recursively + Cid string `json:"cid"` + // Optional name for pinned data; can be used for lookups later + Name *string `json:"name,omitempty"` + // Optional list of multiaddrs known to provide the data + Origins *[]string `json:"origins,omitempty"` + // Optional metadata for pin object + Meta *map[string]string `json:"meta,omitempty"` +} + +// NewPin instantiates a new Pin object +// This constructor will assign default values to properties that have it defined, +// and makes sure properties required by API are set, but the set of arguments +// will change when the set of required properties is changed +func NewPin(cid string) *Pin { + this := Pin{} + this.Cid = cid + return &this +} + +// NewPinWithDefaults instantiates a new Pin object +// This constructor will only assign default values to properties that have it defined, +// but it doesn't guarantee that properties required by API are set +func NewPinWithDefaults() *Pin { + this := Pin{} + return &this +} + +// GetCid returns the Cid field value +func (o *Pin) GetCid() string { + if o == nil { + var ret string + return ret + } + + return o.Cid +} + +// GetCidOk returns a tuple with the Cid field value +// and a boolean to check if the value has been set. +func (o *Pin) GetCidOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Cid, true +} + +// SetCid sets field value +func (o *Pin) SetCid(v string) { + o.Cid = v +} + +// GetName returns the Name field value if set, zero value otherwise. +func (o *Pin) GetName() string { + if o == nil || o.Name == nil { + var ret string + return ret + } + return *o.Name +} + +// GetNameOk returns a tuple with the Name field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *Pin) GetNameOk() (*string, bool) { + if o == nil || o.Name == nil { + return nil, false + } + return o.Name, true +} + +// HasName returns a boolean if a field has been set. +func (o *Pin) HasName() bool { + if o != nil && o.Name != nil { + return true + } + + return false +} + +// SetName gets a reference to the given string and assigns it to the Name field. +func (o *Pin) SetName(v string) { + o.Name = &v +} + +// GetOrigins returns the Origins field value if set, zero value otherwise. +func (o *Pin) GetOrigins() []string { + if o == nil || o.Origins == nil { + var ret []string + return ret + } + return *o.Origins +} + +// GetOriginsOk returns a tuple with the Origins field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *Pin) GetOriginsOk() (*[]string, bool) { + if o == nil || o.Origins == nil { + return nil, false + } + return o.Origins, true +} + +// HasOrigins returns a boolean if a field has been set. +func (o *Pin) HasOrigins() bool { + if o != nil && o.Origins != nil { + return true + } + + return false +} + +// SetOrigins gets a reference to the given []string and assigns it to the Origins field. +func (o *Pin) SetOrigins(v []string) { + o.Origins = &v +} + +// GetMeta returns the Meta field value if set, zero value otherwise. +func (o *Pin) GetMeta() map[string]string { + if o == nil || o.Meta == nil { + var ret map[string]string + return ret + } + return *o.Meta +} + +// GetMetaOk returns a tuple with the Meta field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *Pin) GetMetaOk() (*map[string]string, bool) { + if o == nil || o.Meta == nil { + return nil, false + } + return o.Meta, true +} + +// HasMeta returns a boolean if a field has been set. +func (o *Pin) HasMeta() bool { + if o != nil && o.Meta != nil { + return true + } + + return false +} + +// SetMeta gets a reference to the given map[string]string and assigns it to the Meta field. +func (o *Pin) SetMeta(v map[string]string) { + o.Meta = &v +} + +func (o Pin) MarshalJSON() ([]byte, error) { + toSerialize := map[string]interface{}{} + if true { + toSerialize["cid"] = o.Cid + } + if o.Name != nil { + toSerialize["name"] = o.Name + } + if o.Origins != nil { + toSerialize["origins"] = o.Origins + } + if o.Meta != nil { + toSerialize["meta"] = o.Meta + } + return json.Marshal(toSerialize) +} + +type NullablePin struct { + value *Pin + isSet bool +} + +func (v NullablePin) Get() *Pin { + return v.value +} + +func (v *NullablePin) Set(val *Pin) { + v.value = val + v.isSet = true +} + +func (v NullablePin) IsSet() bool { + return v.isSet +} + +func (v *NullablePin) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullablePin(val *Pin) *NullablePin { + return &NullablePin{value: val, isSet: true} +} + +func (v NullablePin) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullablePin) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/pinning/remote/client/openapi/model_pin_results.go b/pinning/remote/client/openapi/model_pin_results.go new file mode 100644 index 0000000000..ac8443976e --- /dev/null +++ b/pinning/remote/client/openapi/model_pin_results.go @@ -0,0 +1,136 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "encoding/json" +) + +// PinResults Response used for listing pin objects matching request +type PinResults struct { + // The total number of pin objects that exist for passed query filters + Count int32 `json:"count"` + // An array of PinStatus results + Results []PinStatus `json:"results"` +} + +// NewPinResults instantiates a new PinResults object +// This constructor will assign default values to properties that have it defined, +// and makes sure properties required by API are set, but the set of arguments +// will change when the set of required properties is changed +func NewPinResults(count int32, results []PinStatus) *PinResults { + this := PinResults{} + this.Count = count + this.Results = results + return &this +} + +// NewPinResultsWithDefaults instantiates a new PinResults object +// This constructor will only assign default values to properties that have it defined, +// but it doesn't guarantee that properties required by API are set +func NewPinResultsWithDefaults() *PinResults { + this := PinResults{} + return &this +} + +// GetCount returns the Count field value +func (o *PinResults) GetCount() int32 { + if o == nil { + var ret int32 + return ret + } + + return o.Count +} + +// GetCountOk returns a tuple with the Count field value +// and a boolean to check if the value has been set. +func (o *PinResults) GetCountOk() (*int32, bool) { + if o == nil { + return nil, false + } + return &o.Count, true +} + +// SetCount sets field value +func (o *PinResults) SetCount(v int32) { + o.Count = v +} + +// GetResults returns the Results field value +func (o *PinResults) GetResults() []PinStatus { + if o == nil { + var ret []PinStatus + return ret + } + + return o.Results +} + +// GetResultsOk returns a tuple with the Results field value +// and a boolean to check if the value has been set. +func (o *PinResults) GetResultsOk() (*[]PinStatus, bool) { + if o == nil { + return nil, false + } + return &o.Results, true +} + +// SetResults sets field value +func (o *PinResults) SetResults(v []PinStatus) { + o.Results = v +} + +func (o PinResults) MarshalJSON() ([]byte, error) { + toSerialize := map[string]interface{}{} + if true { + toSerialize["count"] = o.Count + } + if true { + toSerialize["results"] = o.Results + } + return json.Marshal(toSerialize) +} + +type NullablePinResults struct { + value *PinResults + isSet bool +} + +func (v NullablePinResults) Get() *PinResults { + return v.value +} + +func (v *NullablePinResults) Set(val *PinResults) { + v.value = val + v.isSet = true +} + +func (v NullablePinResults) IsSet() bool { + return v.isSet +} + +func (v *NullablePinResults) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullablePinResults(val *PinResults) *NullablePinResults { + return &NullablePinResults{value: val, isSet: true} +} + +func (v NullablePinResults) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullablePinResults) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/pinning/remote/client/openapi/model_pin_status.go b/pinning/remote/client/openapi/model_pin_status.go new file mode 100644 index 0000000000..78f37dcd23 --- /dev/null +++ b/pinning/remote/client/openapi/model_pin_status.go @@ -0,0 +1,262 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "encoding/json" + "time" +) + +// PinStatus Pin object with status +type PinStatus struct { + // Globally unique ID of the pin request; can be used to check the status of ongoing pinning, modification of pin object, or pin removal + Id string `json:"id"` + Status Status `json:"status"` + // Immutable timestamp indicating when a pin request entered a pinning service; can be used for filtering results and pagination + Created time.Time `json:"created"` + Pin Pin `json:"pin"` + // List of multiaddrs designated by pinning service for transferring any new data from external peers + Delegates []string `json:"delegates"` + // Optional info for PinStatus response + Info *map[string]string `json:"info,omitempty"` +} + +// NewPinStatus instantiates a new PinStatus object +// This constructor will assign default values to properties that have it defined, +// and makes sure properties required by API are set, but the set of arguments +// will change when the set of required properties is changed +func NewPinStatus(id string, status Status, created time.Time, pin Pin, delegates []string) *PinStatus { + this := PinStatus{} + this.Id = id + this.Status = status + this.Created = created + this.Pin = pin + this.Delegates = delegates + return &this +} + +// NewPinStatusWithDefaults instantiates a new PinStatus object +// This constructor will only assign default values to properties that have it defined, +// but it doesn't guarantee that properties required by API are set +func NewPinStatusWithDefaults() *PinStatus { + this := PinStatus{} + return &this +} + +// GetId returns the Id field value +func (o *PinStatus) GetId() string { + if o == nil { + var ret string + return ret + } + + return o.Id +} + +// GetIdOk returns a tuple with the Id field value +// and a boolean to check if the value has been set. +func (o *PinStatus) GetIdOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Id, true +} + +// SetId sets field value +func (o *PinStatus) SetId(v string) { + o.Id = v +} + +// GetStatus returns the Status field value +func (o *PinStatus) GetStatus() Status { + if o == nil { + var ret Status + return ret + } + + return o.Status +} + +// GetStatusOk returns a tuple with the Status field value +// and a boolean to check if the value has been set. +func (o *PinStatus) GetStatusOk() (*Status, bool) { + if o == nil { + return nil, false + } + return &o.Status, true +} + +// SetStatus sets field value +func (o *PinStatus) SetStatus(v Status) { + o.Status = v +} + +// GetCreated returns the Created field value +func (o *PinStatus) GetCreated() time.Time { + if o == nil { + var ret time.Time + return ret + } + + return o.Created +} + +// GetCreatedOk returns a tuple with the Created field value +// and a boolean to check if the value has been set. +func (o *PinStatus) GetCreatedOk() (*time.Time, bool) { + if o == nil { + return nil, false + } + return &o.Created, true +} + +// SetCreated sets field value +func (o *PinStatus) SetCreated(v time.Time) { + o.Created = v +} + +// GetPin returns the Pin field value +func (o *PinStatus) GetPin() Pin { + if o == nil { + var ret Pin + return ret + } + + return o.Pin +} + +// GetPinOk returns a tuple with the Pin field value +// and a boolean to check if the value has been set. +func (o *PinStatus) GetPinOk() (*Pin, bool) { + if o == nil { + return nil, false + } + return &o.Pin, true +} + +// SetPin sets field value +func (o *PinStatus) SetPin(v Pin) { + o.Pin = v +} + +// GetDelegates returns the Delegates field value +func (o *PinStatus) GetDelegates() []string { + if o == nil { + var ret []string + return ret + } + + return o.Delegates +} + +// GetDelegatesOk returns a tuple with the Delegates field value +// and a boolean to check if the value has been set. +func (o *PinStatus) GetDelegatesOk() (*[]string, bool) { + if o == nil { + return nil, false + } + return &o.Delegates, true +} + +// SetDelegates sets field value +func (o *PinStatus) SetDelegates(v []string) { + o.Delegates = v +} + +// GetInfo returns the Info field value if set, zero value otherwise. +func (o *PinStatus) GetInfo() map[string]string { + if o == nil || o.Info == nil { + var ret map[string]string + return ret + } + return *o.Info +} + +// GetInfoOk returns a tuple with the Info field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *PinStatus) GetInfoOk() (*map[string]string, bool) { + if o == nil || o.Info == nil { + return nil, false + } + return o.Info, true +} + +// HasInfo returns a boolean if a field has been set. +func (o *PinStatus) HasInfo() bool { + if o != nil && o.Info != nil { + return true + } + + return false +} + +// SetInfo gets a reference to the given map[string]string and assigns it to the Info field. +func (o *PinStatus) SetInfo(v map[string]string) { + o.Info = &v +} + +func (o PinStatus) MarshalJSON() ([]byte, error) { + toSerialize := map[string]interface{}{} + if true { + toSerialize["id"] = o.Id + } + if true { + toSerialize["status"] = o.Status + } + if true { + toSerialize["created"] = o.Created + } + if true { + toSerialize["pin"] = o.Pin + } + if true { + toSerialize["delegates"] = o.Delegates + } + if o.Info != nil { + toSerialize["info"] = o.Info + } + return json.Marshal(toSerialize) +} + +type NullablePinStatus struct { + value *PinStatus + isSet bool +} + +func (v NullablePinStatus) Get() *PinStatus { + return v.value +} + +func (v *NullablePinStatus) Set(val *PinStatus) { + v.value = val + v.isSet = true +} + +func (v NullablePinStatus) IsSet() bool { + return v.isSet +} + +func (v *NullablePinStatus) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullablePinStatus(val *PinStatus) *NullablePinStatus { + return &NullablePinStatus{value: val, isSet: true} +} + +func (v NullablePinStatus) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullablePinStatus) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/pinning/remote/client/openapi/model_status.go b/pinning/remote/client/openapi/model_status.go new file mode 100644 index 0000000000..fe727407ea --- /dev/null +++ b/pinning/remote/client/openapi/model_status.go @@ -0,0 +1,84 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "encoding/json" + "fmt" +) + +// Status Status a pin object can have at a pinning service +type Status string + +// List of Status +const ( + QUEUED Status = "queued" + PINNING Status = "pinning" + PINNED Status = "pinned" + FAILED Status = "failed" +) + +func (v *Status) UnmarshalJSON(src []byte) error { + var value string + err := json.Unmarshal(src, &value) + if err != nil { + return err + } + enumTypeValue := Status(value) + for _, existing := range []Status{"queued", "pinning", "pinned", "failed"} { + if existing == enumTypeValue { + *v = enumTypeValue + return nil + } + } + + return fmt.Errorf("%+v is not a valid Status", value) +} + +// Ptr returns reference to Status value +func (v Status) Ptr() *Status { + return &v +} + +type NullableStatus struct { + value *Status + isSet bool +} + +func (v NullableStatus) Get() *Status { + return v.value +} + +func (v *NullableStatus) Set(val *Status) { + v.value = val + v.isSet = true +} + +func (v NullableStatus) IsSet() bool { + return v.isSet +} + +func (v *NullableStatus) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableStatus(val *Status) *NullableStatus { + return &NullableStatus{value: val, isSet: true} +} + +func (v NullableStatus) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableStatus) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/pinning/remote/client/openapi/response.go b/pinning/remote/client/openapi/response.go new file mode 100644 index 0000000000..d053bb91f4 --- /dev/null +++ b/pinning/remote/client/openapi/response.go @@ -0,0 +1,46 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "net/http" +) + +// APIResponse stores the API response returned by the server. +type APIResponse struct { + *http.Response `json:"-"` + Message string `json:"message,omitempty"` + // Operation is the name of the OpenAPI operation. + Operation string `json:"operation,omitempty"` + // RequestURL is the request URL. This value is always available, even if the + // embedded *http.Response is nil. + RequestURL string `json:"url,omitempty"` + // Method is the HTTP method used for the request. This value is always + // available, even if the embedded *http.Response is nil. + Method string `json:"method,omitempty"` + // Payload holds the contents of the response body (which may be nil or empty). + // This is provided here as the raw response.Body() reader will have already + // been drained. + Payload []byte `json:"-"` +} + +// NewAPIResponse returns a new APIResonse object. +func NewAPIResponse(r *http.Response) *APIResponse { + + response := &APIResponse{Response: r} + return response +} + +// NewAPIResponseWithError returns a new APIResponse object with the provided error message. +func NewAPIResponseWithError(errorMessage string) *APIResponse { + + response := &APIResponse{Message: errorMessage} + return response +} diff --git a/pinning/remote/client/openapi/utils.go b/pinning/remote/client/openapi/utils.go new file mode 100644 index 0000000000..a5daa92479 --- /dev/null +++ b/pinning/remote/client/openapi/utils.go @@ -0,0 +1,327 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "encoding/json" + "time" +) + +// PtrBool is a helper routine that returns a pointer to given integer value. +func PtrBool(v bool) *bool { return &v } + +// PtrInt is a helper routine that returns a pointer to given integer value. +func PtrInt(v int) *int { return &v } + +// PtrInt32 is a helper routine that returns a pointer to given integer value. +func PtrInt32(v int32) *int32 { return &v } + +// PtrInt64 is a helper routine that returns a pointer to given integer value. +func PtrInt64(v int64) *int64 { return &v } + +// PtrFloat32 is a helper routine that returns a pointer to given float value. +func PtrFloat32(v float32) *float32 { return &v } + +// PtrFloat64 is a helper routine that returns a pointer to given float value. +func PtrFloat64(v float64) *float64 { return &v } + +// PtrString is a helper routine that returns a pointer to given string value. +func PtrString(v string) *string { return &v } + +// PtrTime is helper routine that returns a pointer to given Time value. +func PtrTime(v time.Time) *time.Time { return &v } + +type NullableBool struct { + value *bool + isSet bool +} + +func (v NullableBool) Get() *bool { + return v.value +} + +func (v *NullableBool) Set(val *bool) { + v.value = val + v.isSet = true +} + +func (v NullableBool) IsSet() bool { + return v.isSet +} + +func (v *NullableBool) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableBool(val *bool) *NullableBool { + return &NullableBool{value: val, isSet: true} +} + +func (v NullableBool) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableBool) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + +type NullableInt struct { + value *int + isSet bool +} + +func (v NullableInt) Get() *int { + return v.value +} + +func (v *NullableInt) Set(val *int) { + v.value = val + v.isSet = true +} + +func (v NullableInt) IsSet() bool { + return v.isSet +} + +func (v *NullableInt) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableInt(val *int) *NullableInt { + return &NullableInt{value: val, isSet: true} +} + +func (v NullableInt) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableInt) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + +type NullableInt32 struct { + value *int32 + isSet bool +} + +func (v NullableInt32) Get() *int32 { + return v.value +} + +func (v *NullableInt32) Set(val *int32) { + v.value = val + v.isSet = true +} + +func (v NullableInt32) IsSet() bool { + return v.isSet +} + +func (v *NullableInt32) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableInt32(val *int32) *NullableInt32 { + return &NullableInt32{value: val, isSet: true} +} + +func (v NullableInt32) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableInt32) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + +type NullableInt64 struct { + value *int64 + isSet bool +} + +func (v NullableInt64) Get() *int64 { + return v.value +} + +func (v *NullableInt64) Set(val *int64) { + v.value = val + v.isSet = true +} + +func (v NullableInt64) IsSet() bool { + return v.isSet +} + +func (v *NullableInt64) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableInt64(val *int64) *NullableInt64 { + return &NullableInt64{value: val, isSet: true} +} + +func (v NullableInt64) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableInt64) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + +type NullableFloat32 struct { + value *float32 + isSet bool +} + +func (v NullableFloat32) Get() *float32 { + return v.value +} + +func (v *NullableFloat32) Set(val *float32) { + v.value = val + v.isSet = true +} + +func (v NullableFloat32) IsSet() bool { + return v.isSet +} + +func (v *NullableFloat32) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableFloat32(val *float32) *NullableFloat32 { + return &NullableFloat32{value: val, isSet: true} +} + +func (v NullableFloat32) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableFloat32) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + +type NullableFloat64 struct { + value *float64 + isSet bool +} + +func (v NullableFloat64) Get() *float64 { + return v.value +} + +func (v *NullableFloat64) Set(val *float64) { + v.value = val + v.isSet = true +} + +func (v NullableFloat64) IsSet() bool { + return v.isSet +} + +func (v *NullableFloat64) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableFloat64(val *float64) *NullableFloat64 { + return &NullableFloat64{value: val, isSet: true} +} + +func (v NullableFloat64) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableFloat64) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + +type NullableString struct { + value *string + isSet bool +} + +func (v NullableString) Get() *string { + return v.value +} + +func (v *NullableString) Set(val *string) { + v.value = val + v.isSet = true +} + +func (v NullableString) IsSet() bool { + return v.isSet +} + +func (v *NullableString) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableString(val *string) *NullableString { + return &NullableString{value: val, isSet: true} +} + +func (v NullableString) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableString) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + +type NullableTime struct { + value *time.Time + isSet bool +} + +func (v NullableTime) Get() *time.Time { + return v.value +} + +func (v *NullableTime) Set(val *time.Time) { + v.value = val + v.isSet = true +} + +func (v NullableTime) IsSet() bool { + return v.isSet +} + +func (v *NullableTime) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableTime(val *time.Time) *NullableTime { + return &NullableTime{value: val, isSet: true} +} + +func (v NullableTime) MarshalJSON() ([]byte, error) { + return v.value.MarshalJSON() +} + +func (v *NullableTime) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} From 5d1534a2cdaf586b92c1531a2dfe8481e2fc39d3 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 1 Sep 2020 13:12:49 -0400 Subject: [PATCH 2893/3147] better error logging/debugging + fixed ls bug This commit was moved from ipfs/go-pinning-service-http-client@fa6705a12566cb930bd7e1ef9e7f3ac57dca7f7a --- pinning/remote/client/client.go | 61 +++++++++++++++----- pinning/remote/client/cmd/main.go | 50 +++++++++++------ pinning/remote/client/model.go | 93 +++++++++++++++++++++++++++++-- 3 files changed, 167 insertions(+), 37 deletions(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index b4fa378308..9a0043d7c7 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -1,9 +1,10 @@ package go_pinning_service_http_client import ( + "bytes" "context" + "encoding/json" "fmt" - "io/ioutil" "net/http" "time" @@ -202,27 +203,31 @@ func (c *Client) LsSync(ctx context.Context, opts ...LsOption) ([]PinStatusGette func (c *Client) lsInternal(ctx context.Context, settings *lsSettings) (pinResults, error) { getter := c.client.PinsApi.PinsGet(ctx) if len(settings.cids) > 0 { - getter.Cid(settings.cids) + getter = getter.Cid(settings.cids) } if len(settings.status) > 0 { - getter.Status(settings.status) + statuses := make([]openapi.Status, len(settings.status)) + for i := 0; i < len(statuses); i++ { + statuses[i] = openapi.Status(settings.status[i]) + } + getter = getter.Status(statuses) } if settings.limit == nil { - getter.Limit(defaultLimit) + getter = getter.Limit(defaultLimit) } else { - getter.Limit(*settings.limit) + getter = getter.Limit(*settings.limit) } if len(settings.name) > 0 { - getter.Name(settings.name) + getter = getter.Name(settings.name) } if settings.before != nil { - getter.Before(*settings.before) + getter = getter.Before(*settings.before) } if settings.after != nil { - getter.After(*settings.after) + getter = getter.After(*settings.after) } if settings.meta != nil { - getter.Meta(settings.meta) + getter = getter.Meta(settings.meta) } // TODO: Ignoring HTTP Response OK? @@ -367,10 +372,38 @@ func getCIDEncoder() multibase.Encoder { } func httperr(resp *http.Response, e error) error { - body, err := ioutil.ReadAll(resp.Body) - var bodystr string - if err == nil { - bodystr = string(body) + oerr, ok := e.(openapi.GenericOpenAPIError) + if !ok { + panic("wrong error type") + } + var buf bytes.Buffer + var err error + + var reqStr string + if resp.Request.GetBody != nil { + resp.Request.Body, err = resp.Request.GetBody() + if err != nil { + reqStr = err.Error() + } else if err := resp.Request.Write(&buf); err != nil { + reqStr = err.Error() + } else { + reqStr = buf.String() + } + } else { + reqStr = resp.Request.URL.String() } - return fmt.Errorf("httpresp code: %d, httpresp: %s, httpbody: %s, err: %w", resp.StatusCode, resp.Status, bodystr, e) + + bodystr := string(oerr.Body()) + //body, err := ioutil.ReadAll(resp.Body) + //var bodystr string + //if err == nil { + // bodystr = string(body) + //} + relevantErr := fmt.Sprintf("{ httpcode: %d, httpresp: %s, httpbody: %s, reqstr: %s }", resp.StatusCode, resp.Status, bodystr, reqStr) + relevantErrBytes, err := json.MarshalIndent(relevantErr, "", "\t") + if err != nil { + return fmt.Errorf("RelevantInfo : %s, MarshalErr: %w, Err: %w", relevantErr, err, e) + } + + return fmt.Errorf("relevantErr: %s, err: %w", relevantErrBytes, e) } diff --git a/pinning/remote/client/cmd/main.go b/pinning/remote/client/cmd/main.go index fefd9503d3..d5b74bb2ff 100644 --- a/pinning/remote/client/cmd/main.go +++ b/pinning/remote/client/cmd/main.go @@ -6,6 +6,7 @@ import ( "github.com/ipfs/go-cid" pinclient "github.com/ipfs/go-pinning-service-http-client" "os" + "time" ) func main() { @@ -35,30 +36,37 @@ func main() { } _ = ipfsPgCid + listPins(ctx, c) + fmt.Println("Adding libp2p home page") - ps, err := c.Add(ctx, libp2pCid, pinclient.PinOpts.WithName("libp2p_home")) + ps, err := c.Add(ctx, libp2pCid, pinclient.PinOpts.WithName("libp2p")) if err == nil { - fmt.Println(ps.GetStatus()) + fmt.Printf("PinStatus: %v \n", ps) } else { fmt.Println(err) } - fmt.Println("List all pins") - pins, err := c.LsSync(ctx) - fmt.Println(err) + listPins(ctx, c) - for _, p := range pins { - fmt.Printf("Pin Name: %s, CID: %s", p.GetPin().GetName(), p.GetPin().GetCid().String()) + fmt.Println("Check on pin status") + if ps == nil { + panic("Skipping pin status check because the pin is null") } - fmt.Println("Check on pin status") - status, err := c.GetStatusByID(ctx, ps.GetId()) - if err == nil { - fmt.Println(status.GetStatus()) - } else { - fmt.Println(err) + var pinned bool + for !pinned { + status, err := c.GetStatusByID(ctx, ps.GetId()) + if err == nil { + fmt.Println(status.GetStatus()) + pinned = status.GetStatus() == pinclient.StatusPinned + } else { + fmt.Println(err) + } + time.Sleep(time.Millisecond * 500) } + listPins(ctx, c) + fmt.Println("Delete pin") err = c.DeleteByID(ctx, ps.GetId()) if err == nil { @@ -67,11 +75,17 @@ func main() { fmt.Println(err) } - fmt.Println("List all pins") - pins, err = c.LsSync(ctx) - fmt.Println(err) + listPins(ctx, c) +} - for _, p := range pins { - fmt.Printf("Pin Name: %s, CID: %s", p.GetPin().GetName(), p.GetPin().GetCid().String()) +func listPins(ctx context.Context, c *pinclient.Client) { + fmt.Println("List all pins") + pins, err := c.LsSync(ctx) + if err != nil { + fmt.Println(err) + } else { + for _, p := range pins { + fmt.Printf("Pin: %v \n", p) + } } } diff --git a/pinning/remote/client/model.go b/pinning/remote/client/model.go index e6c552d516..cbb4eaeb1c 100644 --- a/pinning/remote/client/model.go +++ b/pinning/remote/client/model.go @@ -1,6 +1,8 @@ package go_pinning_service_http_client import ( + "encoding/json" + "fmt" "github.com/ipfs/go-cid" "github.com/ipfs/go-pinning-service-http-client/openapi" "github.com/multiformats/go-multiaddr" @@ -9,6 +11,8 @@ import ( // PinGetter Getter for Pin object type PinGetter interface { + fmt.Stringer + json.Marshaler // CID to be pinned recursively GetCid() cid.Cid // Optional name for pinned data; can be used for lookups later @@ -23,6 +27,37 @@ type pinObject struct { openapi.Pin } +func (p *pinObject) MarshalJSON() ([]byte, error) { + var originsStr string + if o := p.GetOrigins(); o != nil { + originsBytes, err := json.Marshal(o) + if err == nil { + originsStr = string(originsBytes) + } + } + + var metaStr string + if meta := p.GetMeta(); meta != nil { + metaBytes, err := json.Marshal(meta) + if err == nil { + metaStr = string(metaBytes) + } + } + + str := fmt.Sprintf("{ \"Cid\" : \"%v\", \"Name\" : \"%s\", \"Origins\" : %v, \"Meta\" : %v }", + p.GetCid(), p.GetName(), originsStr, metaStr) + return []byte(str), nil +} + +func (p *pinObject) String() string { + marshalled, err := json.MarshalIndent(p, "", "\t") + if err != nil { + return "" + } + + return string(marshalled) +} + func (p *pinObject) GetCid() cid.Cid { c, err := cid.Parse(p.Pin.Cid) if err != nil { @@ -31,19 +66,31 @@ func (p *pinObject) GetCid() cid.Cid { return c } -type Status = openapi.Status +type Status string const ( - StatusQueued Status = openapi.QUEUED - StatusPinning Status = openapi.PINNING - StatusPinned Status = openapi.PINNED - StatusFailed Status = openapi.FAILED + StatusUnknown Status = "" + StatusQueued Status = Status(openapi.QUEUED) + StatusPinning Status = Status(openapi.PINNING) + StatusPinned Status = Status(openapi.PINNED) + StatusFailed Status = Status(openapi.FAILED) ) +func (s Status) String() string { + switch s { + case StatusQueued, StatusPinning, StatusPinned, StatusFailed: + return string(s) + default: + return string(StatusUnknown) + } +} + var validStatuses = []Status{"queued", "pinning", "pinned", "failed"} // PinStatusGetter Getter for Pin object with status type PinStatusGetter interface { + fmt.Stringer + json.Marshaler // Globally unique ID of the pin request; can be used to check the status of ongoing pinning, modification of pin object, or pin removal GetId() string GetStatus() Status @@ -77,3 +124,39 @@ func (p *pinStatusObject) GetDelegates() []multiaddr.Multiaddr { func (p *pinStatusObject) GetPin() PinGetter { return &pinObject{p.Pin} } + +func (p *pinStatusObject) GetStatus() Status { + return Status(p.PinStatus.GetStatus()) +} + +func (p *pinStatusObject) MarshalJSON() ([]byte, error) { + var delegatesStr string + if d := p.GetDelegates(); d != nil { + delegatesBytes, err := json.Marshal(d) + if err == nil { + delegatesStr = string(delegatesBytes) + } + } + + var infoStr string + if info := p.GetInfo(); info != nil { + infoBytes, err := json.Marshal(info) + if err == nil { + infoStr = string(infoBytes) + } + } + + str := fmt.Sprintf("{\"Pin\" : %v, \"ID\" : \"%s\", \"Status\" : \"%s\", \"Created\" : \"%v\", \"Delegates\" : %v, \"Info\" : %v }", + p.GetPin(), p.GetId(), p.GetStatus(), p.GetCreated(), delegatesStr, infoStr) + + return []byte(str), nil +} + +func (p *pinStatusObject) String() string { + marshalled, err := json.MarshalIndent(p, "", "\t") + if err != nil { + return "" + } + + return string(marshalled) +} From cc34a8bfe3877861ee954cc98428ff83d98dd60b Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 10 Sep 2020 21:26:38 -0400 Subject: [PATCH 2894/3147] fix: properly emit JSON strings for empty maps in pin and pinStatus objects This commit was moved from ipfs/go-pinning-service-http-client@c86fa75aedfb020006ae17b2f49d6eb8842cb6b9 --- pinning/remote/client/model.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/remote/client/model.go b/pinning/remote/client/model.go index cbb4eaeb1c..8fb51efffe 100644 --- a/pinning/remote/client/model.go +++ b/pinning/remote/client/model.go @@ -36,7 +36,7 @@ func (p *pinObject) MarshalJSON() ([]byte, error) { } } - var metaStr string + metaStr := "{}" if meta := p.GetMeta(); meta != nil { metaBytes, err := json.Marshal(meta) if err == nil { @@ -138,7 +138,7 @@ func (p *pinStatusObject) MarshalJSON() ([]byte, error) { } } - var infoStr string + infoStr := "{}" if info := p.GetInfo(); info != nil { infoBytes, err := json.Marshal(info) if err == nil { From bc509bd0c0a1d94b3664a5637568d3d01ab586cc Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Mon, 21 Sep 2020 16:08:11 -0400 Subject: [PATCH 2895/3147] feat: update to pinning service api spec v1.0.0 This commit was moved from ipfs/go-pinning-service-http-client@0f15288be30ead28cf15b210e29fea521e1db8d7 --- pinning/remote/client/client.go | 11 +- pinning/remote/client/cmd/main.go | 4 +- pinning/remote/client/model.go | 10 +- pinning/remote/client/openapi/README.md | 36 +- pinning/remote/client/openapi/api_pins.go | 324 ++++++++++++------ pinning/remote/client/openapi/client.go | 2 +- .../remote/client/openapi/configuration.go | 2 +- pinning/remote/client/openapi/docs/Error.md | 43 +-- .../remote/client/openapi/docs/ErrorError.md | 77 +++++ pinning/remote/client/openapi/docs/Pin.md | 2 +- .../remote/client/openapi/docs/PinStatus.md | 22 +- pinning/remote/client/openapi/docs/PinsApi.md | 106 +++--- pinning/remote/client/openapi/model_error.go | 61 +--- .../client/openapi/model_error_error.go | 143 ++++++++ pinning/remote/client/openapi/model_pin.go | 4 +- .../client/openapi/model_pin_results.go | 2 +- .../remote/client/openapi/model_pin_status.go | 32 +- pinning/remote/client/openapi/model_status.go | 2 +- pinning/remote/client/openapi/response.go | 2 +- pinning/remote/client/openapi/utils.go | 2 +- 20 files changed, 592 insertions(+), 295 deletions(-) create mode 100644 pinning/remote/client/openapi/docs/ErrorError.md create mode 100644 pinning/remote/client/openapi/model_error_error.go diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index 9a0043d7c7..f021abb086 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -39,7 +39,8 @@ func NewClient(url, bearerToken string) *Client { } func getError(e *openapi.Error) error { - return fmt.Errorf("request error: %d - %s", e.Code, e.Message) + err := e.GetError() + return fmt.Errorf("request error: %s - %s", err.GetReason(), err.GetDetails()) } // TODO: We should probably make sure there are no duplicates sent @@ -311,7 +312,7 @@ func (c *Client) Add(ctx context.Context, cid cid.Cid, opts ...AddOption) (PinSt } func (c *Client) GetStatusByID(ctx context.Context, pinID string) (PinStatusGetter, error) { - getter := c.client.PinsApi.PinsIdGet(ctx, pinID) + getter := c.client.PinsApi.PinsRequestidGet(ctx, pinID) result, httpresp, err := getter.Execute() if err != nil { err := httperr(httpresp, err) @@ -322,7 +323,7 @@ func (c *Client) GetStatusByID(ctx context.Context, pinID string) (PinStatusGett } func (c *Client) DeleteByID(ctx context.Context, pinID string) error { - deleter := c.client.PinsApi.PinsIdDelete(ctx, pinID) + deleter := c.client.PinsApi.PinsRequestidDelete(ctx, pinID) httpresp, err := deleter.Execute() if err != nil { err := httperr(httpresp, err) @@ -339,7 +340,7 @@ func (c *Client) Modify(ctx context.Context, pinID string, cid cid.Cid, opts ... } } - adder := c.client.PinsApi.PinsIdPost(ctx, pinID) + adder := c.client.PinsApi.PinsRequestidPost(ctx, pinID) p := openapi.Pin{ Cid: cid.Encode(getCIDEncoder()), } @@ -402,7 +403,7 @@ func httperr(resp *http.Response, e error) error { relevantErr := fmt.Sprintf("{ httpcode: %d, httpresp: %s, httpbody: %s, reqstr: %s }", resp.StatusCode, resp.Status, bodystr, reqStr) relevantErrBytes, err := json.MarshalIndent(relevantErr, "", "\t") if err != nil { - return fmt.Errorf("RelevantInfo : %s, MarshalErr: %w, Err: %w", relevantErr, err, e) + return fmt.Errorf("RelevantInfo : %s, MarshalErr: %s, Err: %w", relevantErr, err, e) } return fmt.Errorf("relevantErr: %s, err: %w", relevantErrBytes, e) diff --git a/pinning/remote/client/cmd/main.go b/pinning/remote/client/cmd/main.go index d5b74bb2ff..c095ed08c7 100644 --- a/pinning/remote/client/cmd/main.go +++ b/pinning/remote/client/cmd/main.go @@ -55,7 +55,7 @@ func main() { var pinned bool for !pinned { - status, err := c.GetStatusByID(ctx, ps.GetId()) + status, err := c.GetStatusByID(ctx, ps.GetRequestId()) if err == nil { fmt.Println(status.GetStatus()) pinned = status.GetStatus() == pinclient.StatusPinned @@ -68,7 +68,7 @@ func main() { listPins(ctx, c) fmt.Println("Delete pin") - err = c.DeleteByID(ctx, ps.GetId()) + err = c.DeleteByID(ctx, ps.GetRequestId()) if err == nil { fmt.Println("Successfully deleted pin") } else { diff --git a/pinning/remote/client/model.go b/pinning/remote/client/model.go index 8fb51efffe..506c43ae32 100644 --- a/pinning/remote/client/model.go +++ b/pinning/remote/client/model.go @@ -92,7 +92,7 @@ type PinStatusGetter interface { fmt.Stringer json.Marshaler // Globally unique ID of the pin request; can be used to check the status of ongoing pinning, modification of pin object, or pin removal - GetId() string + GetRequestId() string GetStatus() Status // Immutable timestamp indicating when a pin request entered a pinning service; can be used for filtering results and pagination GetCreated() time.Time @@ -129,6 +129,10 @@ func (p *pinStatusObject) GetStatus() Status { return Status(p.PinStatus.GetStatus()) } +func (p *pinStatusObject) GetRequestId() string { + return p.GetRequestid() +} + func (p *pinStatusObject) MarshalJSON() ([]byte, error) { var delegatesStr string if d := p.GetDelegates(); d != nil { @@ -146,8 +150,8 @@ func (p *pinStatusObject) MarshalJSON() ([]byte, error) { } } - str := fmt.Sprintf("{\"Pin\" : %v, \"ID\" : \"%s\", \"Status\" : \"%s\", \"Created\" : \"%v\", \"Delegates\" : %v, \"Info\" : %v }", - p.GetPin(), p.GetId(), p.GetStatus(), p.GetCreated(), delegatesStr, infoStr) + str := fmt.Sprintf("{\"Pin\" : %v, \"RequestID\" : \"%s\", \"Status\" : \"%s\", \"Created\" : \"%v\", \"Delegates\" : %v, \"Info\" : %v }", + p.GetPin(), p.GetRequestId(), p.GetStatus(), p.GetCreated(), delegatesStr, infoStr) return []byte(str), nil } diff --git a/pinning/remote/client/openapi/README.md b/pinning/remote/client/openapi/README.md index 64e843f887..277bbc39a4 100644 --- a/pinning/remote/client/openapi/README.md +++ b/pinning/remote/client/openapi/README.md @@ -13,10 +13,21 @@ The IPFS Pinning Service API is intended to be an implementation-agnostic API&#x This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). + +## Identifiers +### cid +[Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. +### requestid +Unique identifier of a pin request. + +When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. + +Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. + ## Objects ### Pin object -![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) +![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. @@ -24,30 +35,30 @@ It includes the `cid` of data to be pinned, as well as optional metadata in `nam ### Pin status response -![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) +![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. -It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. +It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle -![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) +![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: -- `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future +- `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. -In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. +In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. -### Modifying an existing pin object -The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. +### Replacing an existing pin object +The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object -A pin object can be removed via `DELETE /pins/{id}`. +A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints @@ -161,15 +172,16 @@ All URIs are relative to *https://pinning-service.example.com* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- *PinsApi* | [**PinsGet**](docs/PinsApi.md#pinsget) | **Get** /pins | List pin objects -*PinsApi* | [**PinsIdDelete**](docs/PinsApi.md#pinsiddelete) | **Delete** /pins/{id} | Remove pin object -*PinsApi* | [**PinsIdGet**](docs/PinsApi.md#pinsidget) | **Get** /pins/{id} | Get pin object -*PinsApi* | [**PinsIdPost**](docs/PinsApi.md#pinsidpost) | **Post** /pins/{id} | Modify pin object *PinsApi* | [**PinsPost**](docs/PinsApi.md#pinspost) | **Post** /pins | Add pin object +*PinsApi* | [**PinsRequestidDelete**](docs/PinsApi.md#pinsrequestiddelete) | **Delete** /pins/{requestid} | Remove pin object +*PinsApi* | [**PinsRequestidGet**](docs/PinsApi.md#pinsrequestidget) | **Get** /pins/{requestid} | Get pin object +*PinsApi* | [**PinsRequestidPost**](docs/PinsApi.md#pinsrequestidpost) | **Post** /pins/{requestid} | Replace pin object ## Documentation For Models - [Error](docs/Error.md) + - [ErrorError](docs/ErrorError.md) - [Pin](docs/Pin.md) - [PinResults](docs/PinResults.md) - [PinStatus](docs/PinStatus.md) diff --git a/pinning/remote/client/openapi/api_pins.go b/pinning/remote/client/openapi/api_pins.go index 623862df72..ff03d0c996 100644 --- a/pinning/remote/client/openapi/api_pins.go +++ b/pinning/remote/client/openapi/api_pins.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) @@ -180,7 +180,47 @@ func (r apiPinsGetRequest) Execute() (PinResults, *_nethttp.Response, error) { newErr.model = v return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 500 { + if localVarHTTPResponse.StatusCode == 401 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 404 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 409 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode >= 500 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { @@ -204,54 +244,61 @@ func (r apiPinsGetRequest) Execute() (PinResults, *_nethttp.Response, error) { return localVarReturnValue, localVarHTTPResponse, nil } -type apiPinsIdDeleteRequest struct { +type apiPinsPostRequest struct { ctx _context.Context apiService *PinsApiService - id string + pin *Pin +} + +func (r apiPinsPostRequest) Pin(pin Pin) apiPinsPostRequest { + r.pin = &pin + return r } /* -PinsIdDelete Remove pin object -Remove a pin object +PinsPost Add pin object +Add a new pin object for the current access token * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param id -@return apiPinsIdDeleteRequest +@return apiPinsPostRequest */ -func (a *PinsApiService) PinsIdDelete(ctx _context.Context, id string) apiPinsIdDeleteRequest { - return apiPinsIdDeleteRequest{ +func (a *PinsApiService) PinsPost(ctx _context.Context) apiPinsPostRequest { + return apiPinsPostRequest{ apiService: a, ctx: ctx, - id: id, } } /* Execute executes the request - + @return PinStatus */ -func (r apiPinsIdDeleteRequest) Execute() (*_nethttp.Response, error) { +func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { var ( - localVarHTTPMethod = _nethttp.MethodDelete + localVarHTTPMethod = _nethttp.MethodPost localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte + localVarReturnValue PinStatus ) - localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsIdDelete") + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsPost") if err != nil { - return nil, GenericOpenAPIError{error: err.Error()} + return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} } - localVarPath := localBasePath + "/pins/{id}" - localVarPath = strings.Replace(localVarPath, "{"+"id"+"}", _neturl.PathEscape(parameterToString(r.id, "")), -1) + localVarPath := localBasePath + "/pins" localVarHeaderParams := make(map[string]string) localVarQueryParams := _neturl.Values{} localVarFormParams := _neturl.Values{} + if r.pin == nil { + return localVarReturnValue, nil, reportError("pin is required and must be specified") + } + // to determine the Content-Type header - localVarHTTPContentTypes := []string{} + localVarHTTPContentTypes := []string{"application/json"} // set Content-Type header localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) @@ -267,20 +314,22 @@ func (r apiPinsIdDeleteRequest) Execute() (*_nethttp.Response, error) { if localVarHTTPHeaderAccept != "" { localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept } + // body params + localVarPostBody = r.pin req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) if err != nil { - return nil, err + return localVarReturnValue, nil, err } localVarHTTPResponse, err := r.apiService.client.callAPI(req) if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err + return localVarReturnValue, localVarHTTPResponse, err } localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) localVarHTTPResponse.Body.Close() if err != nil { - return localVarHTTPResponse, err + return localVarReturnValue, localVarHTTPResponse, err } if localVarHTTPResponse.StatusCode >= 300 { @@ -293,88 +342,116 @@ func (r apiPinsIdDeleteRequest) Execute() (*_nethttp.Response, error) { err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() - return localVarHTTPResponse, newErr + return localVarReturnValue, localVarHTTPResponse, newErr } newErr.model = v - return localVarHTTPResponse, newErr + return localVarReturnValue, localVarHTTPResponse, newErr } if localVarHTTPResponse.StatusCode == 401 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() - return localVarHTTPResponse, newErr + return localVarReturnValue, localVarHTTPResponse, newErr } newErr.model = v - return localVarHTTPResponse, newErr + return localVarReturnValue, localVarHTTPResponse, newErr } if localVarHTTPResponse.StatusCode == 404 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() - return localVarHTTPResponse, newErr + return localVarReturnValue, localVarHTTPResponse, newErr } newErr.model = v - return localVarHTTPResponse, newErr + return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 500 { + if localVarHTTPResponse.StatusCode == 409 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() - return localVarHTTPResponse, newErr + return localVarReturnValue, localVarHTTPResponse, newErr } newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr } - return localVarHTTPResponse, newErr + if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode >= 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + } + return localVarReturnValue, localVarHTTPResponse, newErr } - return localVarHTTPResponse, nil + err = r.apiService.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr := GenericOpenAPIError{ + body: localVarBody, + error: err.Error(), + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + return localVarReturnValue, localVarHTTPResponse, nil } -type apiPinsIdGetRequest struct { +type apiPinsRequestidDeleteRequest struct { ctx _context.Context apiService *PinsApiService - id string + requestid string } /* -PinsIdGet Get pin object -Get a pin object and its status +PinsRequestidDelete Remove pin object +Remove a pin object * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param id -@return apiPinsIdGetRequest + * @param requestid +@return apiPinsRequestidDeleteRequest */ -func (a *PinsApiService) PinsIdGet(ctx _context.Context, id string) apiPinsIdGetRequest { - return apiPinsIdGetRequest{ +func (a *PinsApiService) PinsRequestidDelete(ctx _context.Context, requestid string) apiPinsRequestidDeleteRequest { + return apiPinsRequestidDeleteRequest{ apiService: a, ctx: ctx, - id: id, + requestid: requestid, } } /* Execute executes the request - @return PinStatus + */ -func (r apiPinsIdGetRequest) Execute() (PinStatus, *_nethttp.Response, error) { +func (r apiPinsRequestidDeleteRequest) Execute() (*_nethttp.Response, error) { var ( - localVarHTTPMethod = _nethttp.MethodGet + localVarHTTPMethod = _nethttp.MethodDelete localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue PinStatus ) - localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsIdGet") + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsRequestidDelete") if err != nil { - return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} + return nil, GenericOpenAPIError{error: err.Error()} } - localVarPath := localBasePath + "/pins/{id}" - localVarPath = strings.Replace(localVarPath, "{"+"id"+"}", _neturl.PathEscape(parameterToString(r.id, "")), -1) + localVarPath := localBasePath + "/pins/{requestid}" + localVarPath = strings.Replace(localVarPath, "{"+"requestid"+"}", _neturl.PathEscape(parameterToString(r.requestid, "")), -1) localVarHeaderParams := make(map[string]string) localVarQueryParams := _neturl.Values{} @@ -399,18 +476,18 @@ func (r apiPinsIdGetRequest) Execute() (PinStatus, *_nethttp.Response, error) { } req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) if err != nil { - return localVarReturnValue, nil, err + return nil, err } localVarHTTPResponse, err := r.apiService.client.callAPI(req) if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err + return localVarHTTPResponse, err } localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) localVarHTTPResponse.Body.Close() if err != nil { - return localVarReturnValue, localVarHTTPResponse, err + return localVarHTTPResponse, err } if localVarHTTPResponse.StatusCode >= 300 { @@ -423,69 +500,84 @@ func (r apiPinsIdGetRequest) Execute() (PinStatus, *_nethttp.Response, error) { err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr + return localVarHTTPResponse, newErr } newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr + return localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 401 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.model = v + return localVarHTTPResponse, newErr } if localVarHTTPResponse.StatusCode == 404 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr + return localVarHTTPResponse, newErr } newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr + return localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 500 { + if localVarHTTPResponse.StatusCode == 409 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr + return localVarHTTPResponse, newErr } newErr.model = v + return localVarHTTPResponse, newErr } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = r.apiService.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), + if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.model = v + return localVarHTTPResponse, newErr } - return localVarReturnValue, localVarHTTPResponse, newErr + if localVarHTTPResponse.StatusCode >= 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.model = v + } + return localVarHTTPResponse, newErr } - return localVarReturnValue, localVarHTTPResponse, nil + return localVarHTTPResponse, nil } -type apiPinsIdPostRequest struct { +type apiPinsRequestidGetRequest struct { ctx _context.Context apiService *PinsApiService - id string - pin *Pin -} - -func (r apiPinsIdPostRequest) Pin(pin Pin) apiPinsIdPostRequest { - r.pin = &pin - return r + requestid string } /* -PinsIdPost Modify pin object -Modify an existing pin object +PinsRequestidGet Get pin object +Get a pin object and its status * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param id -@return apiPinsIdPostRequest + * @param requestid +@return apiPinsRequestidGetRequest */ -func (a *PinsApiService) PinsIdPost(ctx _context.Context, id string) apiPinsIdPostRequest { - return apiPinsIdPostRequest{ +func (a *PinsApiService) PinsRequestidGet(ctx _context.Context, requestid string) apiPinsRequestidGetRequest { + return apiPinsRequestidGetRequest{ apiService: a, ctx: ctx, - id: id, + requestid: requestid, } } @@ -493,9 +585,9 @@ func (a *PinsApiService) PinsIdPost(ctx _context.Context, id string) apiPinsIdPo Execute executes the request @return PinStatus */ -func (r apiPinsIdPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { +func (r apiPinsRequestidGetRequest) Execute() (PinStatus, *_nethttp.Response, error) { var ( - localVarHTTPMethod = _nethttp.MethodPost + localVarHTTPMethod = _nethttp.MethodGet localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -503,24 +595,20 @@ func (r apiPinsIdPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { localVarReturnValue PinStatus ) - localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsIdPost") + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsRequestidGet") if err != nil { return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} } - localVarPath := localBasePath + "/pins/{id}" - localVarPath = strings.Replace(localVarPath, "{"+"id"+"}", _neturl.PathEscape(parameterToString(r.id, "")), -1) + localVarPath := localBasePath + "/pins/{requestid}" + localVarPath = strings.Replace(localVarPath, "{"+"requestid"+"}", _neturl.PathEscape(parameterToString(r.requestid, "")), -1) localVarHeaderParams := make(map[string]string) localVarQueryParams := _neturl.Values{} localVarFormParams := _neturl.Values{} - if r.pin == nil { - return localVarReturnValue, nil, reportError("pin is required and must be specified") - } - // to determine the Content-Type header - localVarHTTPContentTypes := []string{"application/json"} + localVarHTTPContentTypes := []string{} // set Content-Type header localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) @@ -536,8 +624,6 @@ func (r apiPinsIdPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { if localVarHTTPHeaderAccept != "" { localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept } - // body params - localVarPostBody = r.pin req, err := r.apiService.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes) if err != nil { return localVarReturnValue, nil, err @@ -599,7 +685,17 @@ func (r apiPinsIdPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { newErr.model = v return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 500 { + if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode >= 500 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { @@ -623,27 +719,30 @@ func (r apiPinsIdPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { return localVarReturnValue, localVarHTTPResponse, nil } -type apiPinsPostRequest struct { +type apiPinsRequestidPostRequest struct { ctx _context.Context apiService *PinsApiService + requestid string pin *Pin } -func (r apiPinsPostRequest) Pin(pin Pin) apiPinsPostRequest { +func (r apiPinsRequestidPostRequest) Pin(pin Pin) apiPinsRequestidPostRequest { r.pin = &pin return r } /* -PinsPost Add pin object -Add a new pin object for the current access token +PinsRequestidPost Replace pin object +Replace an existing pin object (shortcut for executing remove and add operations in one step to avoid unnecessary garbage collection of blocks present in both recursive pins) * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). -@return apiPinsPostRequest + * @param requestid +@return apiPinsRequestidPostRequest */ -func (a *PinsApiService) PinsPost(ctx _context.Context) apiPinsPostRequest { - return apiPinsPostRequest{ +func (a *PinsApiService) PinsRequestidPost(ctx _context.Context, requestid string) apiPinsRequestidPostRequest { + return apiPinsRequestidPostRequest{ apiService: a, ctx: ctx, + requestid: requestid, } } @@ -651,7 +750,7 @@ func (a *PinsApiService) PinsPost(ctx _context.Context) apiPinsPostRequest { Execute executes the request @return PinStatus */ -func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { +func (r apiPinsRequestidPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { var ( localVarHTTPMethod = _nethttp.MethodPost localVarPostBody interface{} @@ -661,12 +760,13 @@ func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { localVarReturnValue PinStatus ) - localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsPost") + localBasePath, err := r.apiService.client.cfg.ServerURLWithContext(r.ctx, "PinsApiService.PinsRequestidPost") if err != nil { return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()} } - localVarPath := localBasePath + "/pins" + localVarPath := localBasePath + "/pins/{requestid}" + localVarPath = strings.Replace(localVarPath, "{"+"requestid"+"}", _neturl.PathEscape(parameterToString(r.requestid, "")), -1) localVarHeaderParams := make(map[string]string) localVarQueryParams := _neturl.Values{} @@ -756,7 +856,17 @@ func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { newErr.model = v return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 500 { + if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { + var v Error + err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarReturnValue, localVarHTTPResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode >= 500 { var v Error err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { diff --git a/pinning/remote/client/openapi/client.go b/pinning/remote/client/openapi/client.go index 2fa0b79aba..14a9d5f0c8 100644 --- a/pinning/remote/client/openapi/client.go +++ b/pinning/remote/client/openapi/client.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) diff --git a/pinning/remote/client/openapi/configuration.go b/pinning/remote/client/openapi/configuration.go index 2dd763a9d0..618454bca1 100644 --- a/pinning/remote/client/openapi/configuration.go +++ b/pinning/remote/client/openapi/configuration.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) diff --git a/pinning/remote/client/openapi/docs/Error.md b/pinning/remote/client/openapi/docs/Error.md index e88553965d..7629039432 100644 --- a/pinning/remote/client/openapi/docs/Error.md +++ b/pinning/remote/client/openapi/docs/Error.md @@ -4,14 +4,13 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Code** | **int32** | | -**Message** | **string** | | +**Error** | [**ErrorError**](Error_error.md) | | ## Methods ### NewError -`func NewError(code int32, message string, ) *Error` +`func NewError(error_ ErrorError, ) *Error` NewError instantiates a new Error object This constructor will assign default values to properties that have it defined, @@ -26,44 +25,24 @@ NewErrorWithDefaults instantiates a new Error object This constructor will only assign default values to properties that have it defined, but it doesn't guarantee that properties required by API are set -### GetCode +### GetError -`func (o *Error) GetCode() int32` +`func (o *Error) GetError() ErrorError` -GetCode returns the Code field if non-nil, zero value otherwise. +GetError returns the Error field if non-nil, zero value otherwise. -### GetCodeOk +### GetErrorOk -`func (o *Error) GetCodeOk() (*int32, bool)` +`func (o *Error) GetErrorOk() (*ErrorError, bool)` -GetCodeOk returns a tuple with the Code field if it's non-nil, zero value otherwise +GetErrorOk returns a tuple with the Error field if it's non-nil, zero value otherwise and a boolean to check if the value has been set. -### SetCode +### SetError -`func (o *Error) SetCode(v int32)` +`func (o *Error) SetError(v ErrorError)` -SetCode sets Code field to given value. - - -### GetMessage - -`func (o *Error) GetMessage() string` - -GetMessage returns the Message field if non-nil, zero value otherwise. - -### GetMessageOk - -`func (o *Error) GetMessageOk() (*string, bool)` - -GetMessageOk returns a tuple with the Message field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetMessage - -`func (o *Error) SetMessage(v string)` - -SetMessage sets Message field to given value. +SetError sets Error field to given value. diff --git a/pinning/remote/client/openapi/docs/ErrorError.md b/pinning/remote/client/openapi/docs/ErrorError.md new file mode 100644 index 0000000000..e44d638292 --- /dev/null +++ b/pinning/remote/client/openapi/docs/ErrorError.md @@ -0,0 +1,77 @@ +# ErrorError + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Reason** | **string** | Mandatory string identifying the type of error | +**Details** | Pointer to **string** | Optional, longer description of the error; may include UUID of transaction for support, links to documentation etc | [optional] + +## Methods + +### NewErrorError + +`func NewErrorError(reason string, ) *ErrorError` + +NewErrorError instantiates a new ErrorError object +This constructor will assign default values to properties that have it defined, +and makes sure properties required by API are set, but the set of arguments +will change when the set of required properties is changed + +### NewErrorErrorWithDefaults + +`func NewErrorErrorWithDefaults() *ErrorError` + +NewErrorErrorWithDefaults instantiates a new ErrorError object +This constructor will only assign default values to properties that have it defined, +but it doesn't guarantee that properties required by API are set + +### GetReason + +`func (o *ErrorError) GetReason() string` + +GetReason returns the Reason field if non-nil, zero value otherwise. + +### GetReasonOk + +`func (o *ErrorError) GetReasonOk() (*string, bool)` + +GetReasonOk returns a tuple with the Reason field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetReason + +`func (o *ErrorError) SetReason(v string)` + +SetReason sets Reason field to given value. + + +### GetDetails + +`func (o *ErrorError) GetDetails() string` + +GetDetails returns the Details field if non-nil, zero value otherwise. + +### GetDetailsOk + +`func (o *ErrorError) GetDetailsOk() (*string, bool)` + +GetDetailsOk returns a tuple with the Details field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetDetails + +`func (o *ErrorError) SetDetails(v string)` + +SetDetails sets Details field to given value. + +### HasDetails + +`func (o *ErrorError) HasDetails() bool` + +HasDetails returns a boolean if a field has been set. + + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/pinning/remote/client/openapi/docs/Pin.md b/pinning/remote/client/openapi/docs/Pin.md index cbdf1a0b7e..e5d3e0f18f 100644 --- a/pinning/remote/client/openapi/docs/Pin.md +++ b/pinning/remote/client/openapi/docs/Pin.md @@ -4,7 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Cid** | **string** | CID to be pinned recursively | +**Cid** | **string** | Content Identifier (CID) to be pinned recursively | **Name** | Pointer to **string** | Optional name for pinned data; can be used for lookups later | [optional] **Origins** | Pointer to **[]string** | Optional list of multiaddrs known to provide the data | [optional] **Meta** | Pointer to **map[string]string** | Optional metadata for pin object | [optional] diff --git a/pinning/remote/client/openapi/docs/PinStatus.md b/pinning/remote/client/openapi/docs/PinStatus.md index 2408abfdaf..40ae992ab0 100644 --- a/pinning/remote/client/openapi/docs/PinStatus.md +++ b/pinning/remote/client/openapi/docs/PinStatus.md @@ -4,7 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Id** | **string** | Globally unique ID of the pin request; can be used to check the status of ongoing pinning, modification of pin object, or pin removal | +**Requestid** | **string** | Globally unique identifier of the pin request; can be used to check the status of ongoing pinning, or pin removal | **Status** | [**Status**](Status.md) | | **Created** | [**time.Time**](time.Time.md) | Immutable timestamp indicating when a pin request entered a pinning service; can be used for filtering results and pagination | **Pin** | [**Pin**](Pin.md) | | @@ -15,7 +15,7 @@ Name | Type | Description | Notes ### NewPinStatus -`func NewPinStatus(id string, status Status, created time.Time, pin Pin, delegates []string, ) *PinStatus` +`func NewPinStatus(requestid string, status Status, created time.Time, pin Pin, delegates []string, ) *PinStatus` NewPinStatus instantiates a new PinStatus object This constructor will assign default values to properties that have it defined, @@ -30,24 +30,24 @@ NewPinStatusWithDefaults instantiates a new PinStatus object This constructor will only assign default values to properties that have it defined, but it doesn't guarantee that properties required by API are set -### GetId +### GetRequestid -`func (o *PinStatus) GetId() string` +`func (o *PinStatus) GetRequestid() string` -GetId returns the Id field if non-nil, zero value otherwise. +GetRequestid returns the Requestid field if non-nil, zero value otherwise. -### GetIdOk +### GetRequestidOk -`func (o *PinStatus) GetIdOk() (*string, bool)` +`func (o *PinStatus) GetRequestidOk() (*string, bool)` -GetIdOk returns a tuple with the Id field if it's non-nil, zero value otherwise +GetRequestidOk returns a tuple with the Requestid field if it's non-nil, zero value otherwise and a boolean to check if the value has been set. -### SetId +### SetRequestid -`func (o *PinStatus) SetId(v string)` +`func (o *PinStatus) SetRequestid(v string)` -SetId sets Id field to given value. +SetRequestid sets Requestid field to given value. ### GetStatus diff --git a/pinning/remote/client/openapi/docs/PinsApi.md b/pinning/remote/client/openapi/docs/PinsApi.md index 0aea62d997..00cff667b6 100644 --- a/pinning/remote/client/openapi/docs/PinsApi.md +++ b/pinning/remote/client/openapi/docs/PinsApi.md @@ -5,10 +5,10 @@ All URIs are relative to *https://pinning-service.example.com* Method | HTTP request | Description ------------- | ------------- | ------------- [**PinsGet**](PinsApi.md#PinsGet) | **Get** /pins | List pin objects -[**PinsIdDelete**](PinsApi.md#PinsIdDelete) | **Delete** /pins/{id} | Remove pin object -[**PinsIdGet**](PinsApi.md#PinsIdGet) | **Get** /pins/{id} | Get pin object -[**PinsIdPost**](PinsApi.md#PinsIdPost) | **Post** /pins/{id} | Modify pin object [**PinsPost**](PinsApi.md#PinsPost) | **Post** /pins | Add pin object +[**PinsRequestidDelete**](PinsApi.md#PinsRequestidDelete) | **Delete** /pins/{requestid} | Remove pin object +[**PinsRequestidGet**](PinsApi.md#PinsRequestidGet) | **Get** /pins/{requestid} | Get pin object +[**PinsRequestidPost**](PinsApi.md#PinsRequestidPost) | **Post** /pins/{requestid} | Replace pin object @@ -33,8 +33,8 @@ import ( ) func main() { - cid := []string{"Inner_example"} // []string | Return pin objects responsible for pinning the specified CID(s) (optional) - name := "name_example" // string | Return pin objects with names that contain provided value (partial or full match) (optional) + cid := []string{"Inner_example"} // []string | Return pin objects responsible for pinning the specified CID(s); be aware that using longer hash functions introduces further constraints on the number of CIDs that will fit under the limit of 2000 characters per URL in browser contexts (optional) + name := "name_example" // string | Return pin objects with names that contain provided value (case-insensitive, partial or full match) (optional) status := []Status{openapiclient.Status{}} // []Status | Return pin objects for pins with the specified status (optional) before := Get-Date // time.Time | Return results created (queued) before provided timestamp (optional) after := Get-Date // time.Time | Return results created (queued) after provided timestamp (optional) @@ -64,8 +64,8 @@ Other parameters are passed through a pointer to a apiPinsGetRequest struct via Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **cid** | [**[]string**](string.md) | Return pin objects responsible for pinning the specified CID(s) | - **name** | **string** | Return pin objects with names that contain provided value (partial or full match) | + **cid** | [**[]string**](string.md) | Return pin objects responsible for pinning the specified CID(s); be aware that using longer hash functions introduces further constraints on the number of CIDs that will fit under the limit of 2000 characters per URL in browser contexts | + **name** | **string** | Return pin objects with names that contain provided value (case-insensitive, partial or full match) | **status** | [**[]Status**](Status.md) | Return pin objects for pins with the specified status | **before** | **time.Time** | Return results created (queued) before provided timestamp | **after** | **time.Time** | Return results created (queued) after provided timestamp | @@ -90,11 +90,11 @@ Name | Type | Description | Notes [[Back to README]](../README.md) -## PinsIdDelete +## PinsPost -> PinsIdDelete(ctx, id).Execute() +> PinStatus PinsPost(ctx).Pin(pin).Execute() -Remove pin object +Add pin object @@ -111,38 +111,36 @@ import ( ) func main() { - id := "id_example" // string | + pin := openapiclient.Pin{Cid: "Cid_example", Name: "Name_example", Origins: []string{"Origins_example"), Meta: map[string]string{ "Key" = "Value" }} // Pin | configuration := openapiclient.NewConfiguration() api_client := openapiclient.NewAPIClient(configuration) - resp, r, err := api_client.PinsApi.PinsIdDelete(context.Background(), id).Execute() + resp, r, err := api_client.PinsApi.PinsPost(context.Background(), pin).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsIdDelete``: %v\n", err) + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsPost``: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) } + // response from `PinsPost`: PinStatus + fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsPost`: %v\n", resp) } ``` ### Path Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- -**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**id** | **string** | | ### Other Parameters -Other parameters are passed through a pointer to a apiPinsIdDeleteRequest struct via the builder pattern +Other parameters are passed through a pointer to a apiPinsPostRequest struct via the builder pattern Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - + **pin** | [**Pin**](Pin.md) | | ### Return type - (empty response body) +[**PinStatus**](PinStatus.md) ### Authorization @@ -150,7 +148,7 @@ Name | Type | Description | Notes ### HTTP request headers -- **Content-Type**: Not defined +- **Content-Type**: application/json - **Accept**: application/json [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) @@ -158,11 +156,11 @@ Name | Type | Description | Notes [[Back to README]](../README.md) -## PinsIdGet +## PinsRequestidDelete -> PinStatus PinsIdGet(ctx, id).Execute() +> PinsRequestidDelete(ctx, requestid).Execute() -Get pin object +Remove pin object @@ -179,17 +177,15 @@ import ( ) func main() { - id := "id_example" // string | + requestid := "requestid_example" // string | configuration := openapiclient.NewConfiguration() api_client := openapiclient.NewAPIClient(configuration) - resp, r, err := api_client.PinsApi.PinsIdGet(context.Background(), id).Execute() + resp, r, err := api_client.PinsApi.PinsRequestidDelete(context.Background(), requestid).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsIdGet``: %v\n", err) + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsRequestidDelete``: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) } - // response from `PinsIdGet`: PinStatus - fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsIdGet`: %v\n", resp) } ``` @@ -199,11 +195,11 @@ func main() { Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**id** | **string** | | +**requestid** | **string** | | ### Other Parameters -Other parameters are passed through a pointer to a apiPinsIdGetRequest struct via the builder pattern +Other parameters are passed through a pointer to a apiPinsRequestidDeleteRequest struct via the builder pattern Name | Type | Description | Notes @@ -212,7 +208,7 @@ Name | Type | Description | Notes ### Return type -[**PinStatus**](PinStatus.md) + (empty response body) ### Authorization @@ -228,11 +224,11 @@ Name | Type | Description | Notes [[Back to README]](../README.md) -## PinsIdPost +## PinsRequestidGet -> PinStatus PinsIdPost(ctx, id).Pin(pin).Execute() +> PinStatus PinsRequestidGet(ctx, requestid).Execute() -Modify pin object +Get pin object @@ -249,18 +245,17 @@ import ( ) func main() { - id := "id_example" // string | - pin := openapiclient.Pin{Cid: "Cid_example", Name: "Name_example", Origins: []string{"Origins_example"), Meta: map[string]string{ "Key" = "Value" }} // Pin | + requestid := "requestid_example" // string | configuration := openapiclient.NewConfiguration() api_client := openapiclient.NewAPIClient(configuration) - resp, r, err := api_client.PinsApi.PinsIdPost(context.Background(), id, pin).Execute() + resp, r, err := api_client.PinsApi.PinsRequestidGet(context.Background(), requestid).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsIdPost``: %v\n", err) + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsRequestidGet``: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) } - // response from `PinsIdPost`: PinStatus - fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsIdPost`: %v\n", resp) + // response from `PinsRequestidGet`: PinStatus + fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsRequestidGet`: %v\n", resp) } ``` @@ -270,17 +265,16 @@ func main() { Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. -**id** | **string** | | +**requestid** | **string** | | ### Other Parameters -Other parameters are passed through a pointer to a apiPinsIdPostRequest struct via the builder pattern +Other parameters are passed through a pointer to a apiPinsRequestidGetRequest struct via the builder pattern Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **pin** | [**Pin**](Pin.md) | | ### Return type @@ -292,7 +286,7 @@ Name | Type | Description | Notes ### HTTP request headers -- **Content-Type**: application/json +- **Content-Type**: Not defined - **Accept**: application/json [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) @@ -300,11 +294,11 @@ Name | Type | Description | Notes [[Back to README]](../README.md) -## PinsPost +## PinsRequestidPost -> PinStatus PinsPost(ctx).Pin(pin).Execute() +> PinStatus PinsRequestidPost(ctx, requestid).Pin(pin).Execute() -Add pin object +Replace pin object @@ -321,31 +315,37 @@ import ( ) func main() { + requestid := "requestid_example" // string | pin := openapiclient.Pin{Cid: "Cid_example", Name: "Name_example", Origins: []string{"Origins_example"), Meta: map[string]string{ "Key" = "Value" }} // Pin | configuration := openapiclient.NewConfiguration() api_client := openapiclient.NewAPIClient(configuration) - resp, r, err := api_client.PinsApi.PinsPost(context.Background(), pin).Execute() + resp, r, err := api_client.PinsApi.PinsRequestidPost(context.Background(), requestid, pin).Execute() if err != nil { - fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsPost``: %v\n", err) + fmt.Fprintf(os.Stderr, "Error when calling `PinsApi.PinsRequestidPost``: %v\n", err) fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r) } - // response from `PinsPost`: PinStatus - fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsPost`: %v\n", resp) + // response from `PinsRequestidPost`: PinStatus + fmt.Fprintf(os.Stdout, "Response from `PinsApi.PinsRequestidPost`: %v\n", resp) } ``` ### Path Parameters +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- +**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc. +**requestid** | **string** | | ### Other Parameters -Other parameters are passed through a pointer to a apiPinsPostRequest struct via the builder pattern +Other parameters are passed through a pointer to a apiPinsRequestidPostRequest struct via the builder pattern Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- + **pin** | [**Pin**](Pin.md) | | ### Return type diff --git a/pinning/remote/client/openapi/model_error.go b/pinning/remote/client/openapi/model_error.go index d97ecaa2c6..ab308de3d0 100644 --- a/pinning/remote/client/openapi/model_error.go +++ b/pinning/remote/client/openapi/model_error.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) @@ -13,20 +13,18 @@ import ( "encoding/json" ) -// Error Base error object +// Error Error object type Error struct { - Code int32 `json:"code"` - Message string `json:"message"` + Error ErrorError `json:"error"` } // NewError instantiates a new Error object // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewError(code int32, message string) *Error { +func NewError(error_ ErrorError) *Error { this := Error{} - this.Code = code - this.Message = message + this.Error = error_ return &this } @@ -38,61 +36,34 @@ func NewErrorWithDefaults() *Error { return &this } -// GetCode returns the Code field value -func (o *Error) GetCode() int32 { +// GetError returns the Error field value +func (o *Error) GetError() ErrorError { if o == nil { - var ret int32 + var ret ErrorError return ret } - return o.Code + return o.Error } -// GetCodeOk returns a tuple with the Code field value +// GetErrorOk returns a tuple with the Error field value // and a boolean to check if the value has been set. -func (o *Error) GetCodeOk() (*int32, bool) { +func (o *Error) GetErrorOk() (*ErrorError, bool) { if o == nil { return nil, false } - return &o.Code, true + return &o.Error, true } -// SetCode sets field value -func (o *Error) SetCode(v int32) { - o.Code = v -} - -// GetMessage returns the Message field value -func (o *Error) GetMessage() string { - if o == nil { - var ret string - return ret - } - - return o.Message -} - -// GetMessageOk returns a tuple with the Message field value -// and a boolean to check if the value has been set. -func (o *Error) GetMessageOk() (*string, bool) { - if o == nil { - return nil, false - } - return &o.Message, true -} - -// SetMessage sets field value -func (o *Error) SetMessage(v string) { - o.Message = v +// SetError sets field value +func (o *Error) SetError(v ErrorError) { + o.Error = v } func (o Error) MarshalJSON() ([]byte, error) { toSerialize := map[string]interface{}{} if true { - toSerialize["code"] = o.Code - } - if true { - toSerialize["message"] = o.Message + toSerialize["error"] = o.Error } return json.Marshal(toSerialize) } diff --git a/pinning/remote/client/openapi/model_error_error.go b/pinning/remote/client/openapi/model_error_error.go new file mode 100644 index 0000000000..0a177dbd26 --- /dev/null +++ b/pinning/remote/client/openapi/model_error_error.go @@ -0,0 +1,143 @@ +/* + * IPFS Pinning Service API + * + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * + * API version: 0.0.5 + * Generated by: OpenAPI Generator (https://openapi-generator.tech) + */ + +package openapi + +import ( + "encoding/json" +) + +// ErrorError struct for ErrorError +type ErrorError struct { + // Mandatory string identifying the type of error + Reason string `json:"reason"` + // Optional, longer description of the error; may include UUID of transaction for support, links to documentation etc + Details *string `json:"details,omitempty"` +} + +// NewErrorError instantiates a new ErrorError object +// This constructor will assign default values to properties that have it defined, +// and makes sure properties required by API are set, but the set of arguments +// will change when the set of required properties is changed +func NewErrorError(reason string) *ErrorError { + this := ErrorError{} + this.Reason = reason + return &this +} + +// NewErrorErrorWithDefaults instantiates a new ErrorError object +// This constructor will only assign default values to properties that have it defined, +// but it doesn't guarantee that properties required by API are set +func NewErrorErrorWithDefaults() *ErrorError { + this := ErrorError{} + return &this +} + +// GetReason returns the Reason field value +func (o *ErrorError) GetReason() string { + if o == nil { + var ret string + return ret + } + + return o.Reason +} + +// GetReasonOk returns a tuple with the Reason field value +// and a boolean to check if the value has been set. +func (o *ErrorError) GetReasonOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Reason, true +} + +// SetReason sets field value +func (o *ErrorError) SetReason(v string) { + o.Reason = v +} + +// GetDetails returns the Details field value if set, zero value otherwise. +func (o *ErrorError) GetDetails() string { + if o == nil || o.Details == nil { + var ret string + return ret + } + return *o.Details +} + +// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ErrorError) GetDetailsOk() (*string, bool) { + if o == nil || o.Details == nil { + return nil, false + } + return o.Details, true +} + +// HasDetails returns a boolean if a field has been set. +func (o *ErrorError) HasDetails() bool { + if o != nil && o.Details != nil { + return true + } + + return false +} + +// SetDetails gets a reference to the given string and assigns it to the Details field. +func (o *ErrorError) SetDetails(v string) { + o.Details = &v +} + +func (o ErrorError) MarshalJSON() ([]byte, error) { + toSerialize := map[string]interface{}{} + if true { + toSerialize["reason"] = o.Reason + } + if o.Details != nil { + toSerialize["details"] = o.Details + } + return json.Marshal(toSerialize) +} + +type NullableErrorError struct { + value *ErrorError + isSet bool +} + +func (v NullableErrorError) Get() *ErrorError { + return v.value +} + +func (v *NullableErrorError) Set(val *ErrorError) { + v.value = val + v.isSet = true +} + +func (v NullableErrorError) IsSet() bool { + return v.isSet +} + +func (v *NullableErrorError) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableErrorError(val *ErrorError) *NullableErrorError { + return &NullableErrorError{value: val, isSet: true} +} + +func (v NullableErrorError) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableErrorError) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/pinning/remote/client/openapi/model_pin.go b/pinning/remote/client/openapi/model_pin.go index c4a5e80155..31ae0ca862 100644 --- a/pinning/remote/client/openapi/model_pin.go +++ b/pinning/remote/client/openapi/model_pin.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) @@ -15,7 +15,7 @@ import ( // Pin Pin object type Pin struct { - // CID to be pinned recursively + // Content Identifier (CID) to be pinned recursively Cid string `json:"cid"` // Optional name for pinned data; can be used for lookups later Name *string `json:"name,omitempty"` diff --git a/pinning/remote/client/openapi/model_pin_results.go b/pinning/remote/client/openapi/model_pin_results.go index ac8443976e..b569fe5df2 100644 --- a/pinning/remote/client/openapi/model_pin_results.go +++ b/pinning/remote/client/openapi/model_pin_results.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) diff --git a/pinning/remote/client/openapi/model_pin_status.go b/pinning/remote/client/openapi/model_pin_status.go index 78f37dcd23..21d7992b2e 100644 --- a/pinning/remote/client/openapi/model_pin_status.go +++ b/pinning/remote/client/openapi/model_pin_status.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) @@ -16,9 +16,9 @@ import ( // PinStatus Pin object with status type PinStatus struct { - // Globally unique ID of the pin request; can be used to check the status of ongoing pinning, modification of pin object, or pin removal - Id string `json:"id"` - Status Status `json:"status"` + // Globally unique identifier of the pin request; can be used to check the status of ongoing pinning, or pin removal + Requestid string `json:"requestid"` + Status Status `json:"status"` // Immutable timestamp indicating when a pin request entered a pinning service; can be used for filtering results and pagination Created time.Time `json:"created"` Pin Pin `json:"pin"` @@ -32,9 +32,9 @@ type PinStatus struct { // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewPinStatus(id string, status Status, created time.Time, pin Pin, delegates []string) *PinStatus { +func NewPinStatus(requestid string, status Status, created time.Time, pin Pin, delegates []string) *PinStatus { this := PinStatus{} - this.Id = id + this.Requestid = requestid this.Status = status this.Created = created this.Pin = pin @@ -50,28 +50,28 @@ func NewPinStatusWithDefaults() *PinStatus { return &this } -// GetId returns the Id field value -func (o *PinStatus) GetId() string { +// GetRequestid returns the Requestid field value +func (o *PinStatus) GetRequestid() string { if o == nil { var ret string return ret } - return o.Id + return o.Requestid } -// GetIdOk returns a tuple with the Id field value +// GetRequestidOk returns a tuple with the Requestid field value // and a boolean to check if the value has been set. -func (o *PinStatus) GetIdOk() (*string, bool) { +func (o *PinStatus) GetRequestidOk() (*string, bool) { if o == nil { return nil, false } - return &o.Id, true + return &o.Requestid, true } -// SetId sets field value -func (o *PinStatus) SetId(v string) { - o.Id = v +// SetRequestid sets field value +func (o *PinStatus) SetRequestid(v string) { + o.Requestid = v } // GetStatus returns the Status field value @@ -205,7 +205,7 @@ func (o *PinStatus) SetInfo(v map[string]string) { func (o PinStatus) MarshalJSON() ([]byte, error) { toSerialize := map[string]interface{}{} if true { - toSerialize["id"] = o.Id + toSerialize["requestid"] = o.Requestid } if true { toSerialize["status"] = o.Status diff --git a/pinning/remote/client/openapi/model_status.go b/pinning/remote/client/openapi/model_status.go index fe727407ea..7b30371bab 100644 --- a/pinning/remote/client/openapi/model_status.go +++ b/pinning/remote/client/openapi/model_status.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) diff --git a/pinning/remote/client/openapi/response.go b/pinning/remote/client/openapi/response.go index d053bb91f4..5f1b374568 100644 --- a/pinning/remote/client/openapi/response.go +++ b/pinning/remote/client/openapi/response.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) diff --git a/pinning/remote/client/openapi/utils.go b/pinning/remote/client/openapi/utils.go index a5daa92479..9762391274 100644 --- a/pinning/remote/client/openapi/utils.go +++ b/pinning/remote/client/openapi/utils.go @@ -1,7 +1,7 @@ /* * IPFS Pinning Service API * - * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Objects ### Pin object ![pinning-services-api-pin-object.png](https://bafybeidcoyxd723nakggdayy6qg25bl7mls3ilwwiyxmys5qpek7y6jwc4.ipfs.dweb.link/?filename=pinning-services-api-pin-object.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pinning-services-api-pin-status-response.png](https://bafybeiec3c3gzsus4rksddsuxcybilex3odq5cm2cyrzrb7m3suwspl6uy.ipfs.dweb.link/?filename=pinning-services-api-pin-status-response.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `id` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning-services-api-objects.png](https://bafybeigyefq6vwfcsi7dfgqunf4uei426lvia3w73ylg4kgdwwg6txivpe.ipfs.dweb.link/?filename=pinning-services-api-objects.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `id` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, modifying the pin, and/or removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{id}` until pinning is successful, or the user decides to remove the pending pin. ### Modifying an existing pin object The user can modify an existing pin object via `POST /pins/{id}`. The new pin object `id` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{id}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. + * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * * API version: 0.0.5 * Generated by: OpenAPI Generator (https://openapi-generator.tech) From 941227de7a1b2be5605d1c54d6686c780cda686e Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 15 Oct 2020 15:23:19 -0400 Subject: [PATCH 2896/3147] docs: Update README with codegen instructions This commit was moved from ipfs/go-pinning-service-http-client@df65dc336ff0a790d84cb61487edad99886913c8 --- pinning/remote/client/README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pinning/remote/client/README.md b/pinning/remote/client/README.md index 213f0df83a..0326b556cf 100644 --- a/pinning/remote/client/README.md +++ b/pinning/remote/client/README.md @@ -13,10 +13,27 @@ An IPFS Pinning Service HTTP Client [Adin Schmahmann](https://github.com/aschmahmann) +## Updating Pinning Service Spec + +Download the openapi-generator from https://github.com/OpenAPITools/openapi-generator and generate the code using: + +Current code generated with: openapi-generator 5.0.0-beta + +``` +openapi-generator generate -g go-experimental -i https://raw.githubusercontent.com/ipfs/pinning-services-api-spec/master/ipfs-pinning-service.yaml -o openapi +rm openapi/go.mod openapi/go.sum +``` + +Notes: +Due to https://github.com/OpenAPITools/openapi-generator/issues/7473 the code generator the http error codes processing +may need some manual editing. + +`go-experimental` is becoming mainstream and so in later versions will be replaced with `go` + ## Contributing Contributions are welcome! This repository is part of the IPFS project and therefore governed by our [contributing guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md). ## License -[SPDX-License-Identifier: Apache-2.0 OR MIT](LICENSE.md) \ No newline at end of file +[SPDX-License-Identifier: Apache-2.0 OR MIT](LICENSE.md) From 43fa6b3918353959b0e2574961797fff729a16e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 10 Nov 2020 16:28:56 +0000 Subject: [PATCH 2897/3147] add View() to all the various blockstores. (#59) This commit was moved from ipfs/go-ipfs-blockstore@3e8fd89307c11636913e21e3643ce930f39bb6c6 --- blockstore/arc_cache.go | 121 +++++++++++++++++++++++++------------- blockstore/blockstore.go | 15 +++++ blockstore/bloom_cache.go | 22 +++++++ blockstore/idstore.go | 27 ++++++++- 4 files changed, 143 insertions(+), 42 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index e2b930dcad..1e497abf97 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -12,35 +12,42 @@ import ( type cacheHave bool type cacheSize int -// arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) for -// block Cids. This provides block access-time improvements, allowing -// to short-cut many searches without query-ing the underlying datastore. +// arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) that +// does not store the actual blocks, just metadata about them: existence and +// size. This provides block access-time improvements, allowing +// to short-cut many searches without querying the underlying datastore. type arccache struct { - arc *lru.TwoQueueCache + cache *lru.TwoQueueCache blockstore Blockstore + viewer Viewer hits metrics.Counter total metrics.Counter } +var _ Blockstore = (*arccache)(nil) +var _ Viewer = (*arccache)(nil) + func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, error) { - arc, err := lru.New2Q(lruSize) + cache, err := lru.New2Q(lruSize) if err != nil { return nil, err } - c := &arccache{arc: arc, blockstore: bs} + c := &arccache{cache: cache, blockstore: bs} c.hits = metrics.NewCtx(ctx, "arc.hits_total", "Number of ARC cache hits").Counter() c.total = metrics.NewCtx(ctx, "arc_total", "Total number of ARC cache requests").Counter() - + if v, ok := bs.(Viewer); ok { + c.viewer = v + } return c, nil } func (b *arccache) DeleteBlock(k cid.Cid) error { - if has, _, ok := b.hasCached(k); ok && !has { + if has, _, ok := b.queryCache(k); ok && !has { return nil } - b.arc.Remove(k) // Invalidate cache before deleting. + b.cache.Remove(k) // Invalidate cache before deleting. err := b.blockstore.DeleteBlock(k) if err == nil { b.cacheHave(k, false) @@ -48,32 +55,8 @@ func (b *arccache) DeleteBlock(k cid.Cid) error { return err } -// if ok == false has is inconclusive -// if ok == true then has respons to question: is it contained -func (b *arccache) hasCached(k cid.Cid) (has bool, size int, ok bool) { - b.total.Inc() - if !k.Defined() { - log.Error("undefined cid in arccache") - // Return cache invalid so the call to blockstore happens - // in case of invalid key and correct error is created. - return false, -1, false - } - - h, ok := b.arc.Get(string(k.Hash())) - if ok { - b.hits.Inc() - switch h := h.(type) { - case cacheHave: - return bool(h), -1, true - case cacheSize: - return true, int(h), true - } - } - return false, -1, false -} - func (b *arccache) Has(k cid.Cid) (bool, error) { - if has, _, ok := b.hasCached(k); ok { + if has, _, ok := b.queryCache(k); ok { return has, nil } has, err := b.blockstore.Has(k) @@ -85,7 +68,7 @@ func (b *arccache) Has(k cid.Cid) (bool, error) { } func (b *arccache) GetSize(k cid.Cid) (int, error) { - if has, blockSize, ok := b.hasCached(k); ok { + if has, blockSize, ok := b.queryCache(k); ok { if !has { // don't have it, return return -1, ErrNotFound @@ -105,13 +88,38 @@ func (b *arccache) GetSize(k cid.Cid) (int, error) { return blockSize, err } +func (b *arccache) View(k cid.Cid, callback func([]byte) error) error { + // shortcircuit and fall back to Get if the underlying store + // doesn't support Viewer. + if b.viewer == nil { + blk, err := b.Get(k) + if err != nil { + return err + } + return callback(blk.RawData()) + } + + if !k.Defined() { + log.Error("undefined cid in arc cache") + return ErrNotFound + } + + if has, _, ok := b.queryCache(k); ok && !has { + // short circuit if the cache deterministically tells us the item + // doesn't exist. + return ErrNotFound + } + + return b.viewer.View(k, callback) +} + func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { if !k.Defined() { log.Error("undefined cid in arc cache") return nil, ErrNotFound } - if has, _, ok := b.hasCached(k); ok && !has { + if has, _, ok := b.queryCache(k); ok && !has { return nil, ErrNotFound } @@ -125,7 +133,7 @@ func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { } func (b *arccache) Put(bl blocks.Block) error { - if has, _, ok := b.hasCached(bl.Cid()); ok && has { + if has, _, ok := b.queryCache(bl.Cid()); ok && has { return nil } @@ -141,7 +149,7 @@ func (b *arccache) PutMany(bs []blocks.Block) error { for _, block := range bs { // call put on block if result is inconclusive or we are sure that // the block isn't in storage - if has, _, ok := b.hasCached(block.Cid()); !ok || (ok && !has) { + if has, _, ok := b.queryCache(block.Cid()); !ok || (ok && !has) { good = append(good, block) } } @@ -160,11 +168,44 @@ func (b *arccache) HashOnRead(enabled bool) { } func (b *arccache) cacheHave(c cid.Cid, have bool) { - b.arc.Add(string(c.Hash()), cacheHave(have)) + b.cache.Add(string(c.Hash()), cacheHave(have)) } func (b *arccache) cacheSize(c cid.Cid, blockSize int) { - b.arc.Add(string(c.Hash()), cacheSize(blockSize)) + b.cache.Add(string(c.Hash()), cacheSize(blockSize)) +} + +// queryCache checks if the CID is in the cache. If so, it returns: +// +// * exists (bool): whether the CID is known to exist or not. +// * size (int): the size if cached, or -1 if not cached. +// * ok (bool): whether present in the cache. +// +// When ok is false, the answer in inconclusive and the caller must ignore the +// other two return values. Querying the underying store is necessary. +// +// When ok is true, exists carries the correct answer, and size carries the +// size, if known, or -1 if not. +func (b *arccache) queryCache(k cid.Cid) (exists bool, size int, ok bool) { + b.total.Inc() + if !k.Defined() { + log.Error("undefined cid in arccache") + // Return cache invalid so the call to blockstore happens + // in case of invalid key and correct error is created. + return false, -1, false + } + + h, ok := b.cache.Get(string(k.Hash())) + if ok { + b.hits.Inc() + switch h := h.(type) { + case cacheHave: + return bool(h), -1, true + case cacheSize: + return true, int(h), true + } + } + return false, -1, false } func (b *arccache) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index f8eb07a7d7..6625a34113 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -57,6 +57,21 @@ type Blockstore interface { HashOnRead(enabled bool) } +// Viewer can be implemented by blockstores that offer zero-copy access to +// values. +// +// Callers of View must not mutate or retain the byte slice, as it could be +// an mmapped memory region, or a pooled byte buffer. +// +// View is especially suitable for deserialising in place. +// +// The callback will only be called iff the query operation is successful (and +// the block is found); otherwise, the error will be propagated. Errors returned +// by the callback will be propagated as well. +type Viewer interface { + View(cid cid.Cid, callback func([]byte) error) error +} + // GCLocker abstract functionality to lock a blockstore when performing // garbage-collection operations. type GCLocker interface { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index b4fadc2ef0..da302c97d1 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -29,6 +29,9 @@ func bloomCached(ctx context.Context, bs Blockstore, bloomSize, hashCount int) ( "Total number of requests to bloom cache").Counter(), buildChan: make(chan struct{}), } + if v, ok := bs.(Viewer); ok { + bc.viewer = v + } go func() { err := bc.build(ctx) if err != nil { @@ -67,12 +70,16 @@ type bloomcache struct { buildChan chan struct{} blockstore Blockstore + viewer Viewer // Statistics hits metrics.Counter total metrics.Counter } +var _ Blockstore = (*bloomcache)(nil) +var _ Viewer = (*bloomcache)(nil) + func (b *bloomcache) BloomActive() bool { return atomic.LoadInt32(&b.active) != 0 } @@ -151,6 +158,21 @@ func (b *bloomcache) GetSize(k cid.Cid) (int, error) { return b.blockstore.GetSize(k) } +func (b *bloomcache) View(k cid.Cid, callback func([]byte) error) error { + if b.viewer == nil { + blk, err := b.Get(k) + if err != nil { + return err + } + return callback(blk.RawData()) + } + + if has, ok := b.hasCached(k); ok && !has { + return ErrNotFound + } + return b.viewer.View(k, callback) +} + func (b *bloomcache) Get(k cid.Cid) (blocks.Block, error) { if has, ok := b.hasCached(k); ok && !has { return nil, ErrNotFound diff --git a/blockstore/idstore.go b/blockstore/idstore.go index 477da70b20..274c1a3b35 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -10,11 +10,19 @@ import ( // idstore wraps a BlockStore to add support for identity hashes type idstore struct { - bs Blockstore + bs Blockstore + viewer Viewer } +var _ Blockstore = (*idstore)(nil) +var _ Viewer = (*idstore)(nil) + func NewIdStore(bs Blockstore) Blockstore { - return &idstore{bs} + ids := &idstore{bs: bs} + if v, ok := bs.(Viewer); ok { + ids.viewer = v + } + return ids } func extractContents(k cid.Cid) (bool, []byte) { @@ -46,6 +54,21 @@ func (b *idstore) Has(k cid.Cid) (bool, error) { return b.bs.Has(k) } +func (b *idstore) View(k cid.Cid, callback func([]byte) error) error { + if b.viewer == nil { + blk, err := b.Get(k) + if err != nil { + return err + } + return callback(blk.RawData()) + } + isId, bdata := extractContents(k) + if isId { + return callback(bdata) + } + return b.viewer.View(k, callback) +} + func (b *idstore) GetSize(k cid.Cid) (int, error) { isId, bdata := extractContents(k) if isId { From c473863f1386f9aab5797e46c45ab964817f9f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Mon, 16 Nov 2020 15:17:40 +0000 Subject: [PATCH 2898/3147] make idstore implement io.Closer. (#60) This commit was moved from ipfs/go-ipfs-blockstore@7adc396ab4b40c660c72d215b3a58999b6f63413 --- blockstore/idstore.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/blockstore/idstore.go b/blockstore/idstore.go index 274c1a3b35..1166e5bda1 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -2,6 +2,7 @@ package blockstore import ( "context" + "io" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" @@ -16,6 +17,7 @@ type idstore struct { var _ Blockstore = (*idstore)(nil) var _ Viewer = (*idstore)(nil) +var _ io.Closer = (*idstore)(nil) func NewIdStore(bs Blockstore) Blockstore { ids := &idstore{bs: bs} @@ -112,3 +114,10 @@ func (b *idstore) HashOnRead(enabled bool) { func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.bs.AllKeysChan(ctx) } + +func (b *idstore) Close() error { + if c, ok := b.bs.(io.Closer); ok { + return c.Close() + } + return nil +} From 4e02944ed6940d10f7b9e50e8c328e359ef8f191 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 15 Oct 2020 15:28:18 -0400 Subject: [PATCH 2899/3147] cleaned up client error processing This commit was moved from ipfs/go-pinning-service-http-client@b37b2d435ea52173793aeaf94f40f49e63322d44 --- pinning/remote/client/client.go | 43 ++++++--------------------------- 1 file changed, 8 insertions(+), 35 deletions(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index f021abb086..e3c04176e3 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -1,10 +1,9 @@ package go_pinning_service_http_client import ( - "bytes" "context" - "encoding/json" "fmt" + "github.com/pkg/errors" "net/http" "time" @@ -38,11 +37,6 @@ func NewClient(url, bearerToken string) *Client { return &Client{client: openapi.NewAPIClient(config)} } -func getError(e *openapi.Error) error { - err := e.GetError() - return fmt.Errorf("request error: %s - %s", err.GetReason(), err.GetDetails()) -} - // TODO: We should probably make sure there are no duplicates sent type lsSettings struct { cids []string @@ -374,37 +368,16 @@ func getCIDEncoder() multibase.Encoder { func httperr(resp *http.Response, e error) error { oerr, ok := e.(openapi.GenericOpenAPIError) - if !ok { - panic("wrong error type") - } - var buf bytes.Buffer - var err error - - var reqStr string - if resp.Request.GetBody != nil { - resp.Request.Body, err = resp.Request.GetBody() - if err != nil { - reqStr = err.Error() - } else if err := resp.Request.Write(&buf); err != nil { - reqStr = err.Error() - } else { - reqStr = buf.String() + if ok { + ferr, ok := oerr.Model().(openapi.Failure) + if ok { + return errors.Wrapf(e,"statusCode: %d, reason : %q, details : %q", resp.StatusCode, ferr.Error.GetReason(), ferr.Error.GetDetails()) } - } else { - reqStr = resp.Request.URL.String() } - bodystr := string(oerr.Body()) - //body, err := ioutil.ReadAll(resp.Body) - //var bodystr string - //if err == nil { - // bodystr = string(body) - //} - relevantErr := fmt.Sprintf("{ httpcode: %d, httpresp: %s, httpbody: %s, reqstr: %s }", resp.StatusCode, resp.Status, bodystr, reqStr) - relevantErrBytes, err := json.MarshalIndent(relevantErr, "", "\t") - if err != nil { - return fmt.Errorf("RelevantInfo : %s, MarshalErr: %s, Err: %w", relevantErr, err, e) + if resp == nil { + return errors.Wrapf(e,"empty response from remote pinning service") } - return fmt.Errorf("relevantErr: %s, err: %w", relevantErrBytes, e) + return errors.Wrapf(e, "remote pinning service error. statusCode: %d", resp.StatusCode) } From 380ca9d435e00494b4e54580ab0c98af3f6258f0 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 15 Oct 2020 15:27:44 -0400 Subject: [PATCH 2900/3147] feat: bumped spec to v0.1.1 This commit was moved from ipfs/go-pinning-service-http-client@3159542e49a2f3caaf401a5556640cc2e625d877 --- pinning/remote/client/openapi/README.md | 6 +- pinning/remote/client/openapi/api_pins.go | 267 +----------------- pinning/remote/client/openapi/client.go | 4 +- .../remote/client/openapi/configuration.go | 2 +- .../openapi/docs/{Error.md => Failure.md} | 22 +- .../docs/{ErrorError.md => FailureError.md} | 28 +- .../{model_error.go => model_failure.go} | 50 ++-- ..._error_error.go => model_failure_error.go} | 54 ++-- pinning/remote/client/openapi/model_pin.go | 2 +- .../client/openapi/model_pin_results.go | 2 +- .../remote/client/openapi/model_pin_status.go | 2 +- pinning/remote/client/openapi/model_status.go | 2 +- pinning/remote/client/openapi/response.go | 2 +- pinning/remote/client/openapi/utils.go | 2 +- 14 files changed, 100 insertions(+), 345 deletions(-) rename pinning/remote/client/openapi/docs/{Error.md => Failure.md} (68%) rename pinning/remote/client/openapi/docs/{ErrorError.md => FailureError.md} (71%) rename pinning/remote/client/openapi/{model_error.go => model_failure.go} (89%) rename pinning/remote/client/openapi/{model_error_error.go => model_failure_error.go} (88%) diff --git a/pinning/remote/client/openapi/README.md b/pinning/remote/client/openapi/README.md index 277bbc39a4..fe21b9a009 100644 --- a/pinning/remote/client/openapi/README.md +++ b/pinning/remote/client/openapi/README.md @@ -104,7 +104,7 @@ Pin objects can be listed by executing `GET /pins` with optional parameters: ## Overview This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [OpenAPI-spec](https://www.openapis.org/) from a remote server, you can easily generate an API client. -- API version: 0.0.5 +- API version: 0.1.1 - Package version: 1.0.0 - Build package: org.openapitools.codegen.languages.GoClientExperimentalCodegen @@ -180,8 +180,8 @@ Class | Method | HTTP request | Description ## Documentation For Models - - [Error](docs/Error.md) - - [ErrorError](docs/ErrorError.md) + - [Failure](docs/Failure.md) + - [FailureError](docs/FailureError.md) - [Pin](docs/Pin.md) - [PinResults](docs/PinResults.md) - [PinStatus](docs/PinStatus.md) diff --git a/pinning/remote/client/openapi/api_pins.go b/pinning/remote/client/openapi/api_pins.go index ff03d0c996..8c45df5a32 100644 --- a/pinning/remote/client/openapi/api_pins.go +++ b/pinning/remote/client/openapi/api_pins.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ @@ -170,8 +170,8 @@ func (r apiPinsGetRequest) Execute() (PinResults, *_nethttp.Response, error) { body: localVarBody, error: localVarHTTPResponse.Status, } - if localVarHTTPResponse.StatusCode == 400 { - var v Error + if localVarHTTPResponse.StatusCode >= 400 && localVarHTTPResponse.StatusCode <= 600 { + var v Failure err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() @@ -180,55 +180,6 @@ func (r apiPinsGetRequest) Execute() (PinResults, *_nethttp.Response, error) { newErr.model = v return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 401 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 404 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 409 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode >= 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - } return localVarReturnValue, localVarHTTPResponse, newErr } @@ -337,28 +288,8 @@ func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { body: localVarBody, error: localVarHTTPResponse.Status, } - if localVarHTTPResponse.StatusCode == 400 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 401 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 404 { - var v Error + if localVarHTTPResponse.StatusCode >= 400 && localVarHTTPResponse.StatusCode <= 600 { + var v Failure err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() @@ -367,35 +298,6 @@ func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { newErr.model = v return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 409 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode >= 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - } return localVarReturnValue, localVarHTTPResponse, newErr } @@ -495,18 +397,8 @@ func (r apiPinsRequestidDeleteRequest) Execute() (*_nethttp.Response, error) { body: localVarBody, error: localVarHTTPResponse.Status, } - if localVarHTTPResponse.StatusCode == 400 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarHTTPResponse, newErr - } - newErr.model = v - return localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 401 { - var v Error + if localVarHTTPResponse.StatusCode >= 400 && localVarHTTPResponse.StatusCode <= 600 { + var v Failure err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() @@ -515,45 +407,6 @@ func (r apiPinsRequestidDeleteRequest) Execute() (*_nethttp.Response, error) { newErr.model = v return localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 404 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarHTTPResponse, newErr - } - newErr.model = v - return localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 409 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarHTTPResponse, newErr - } - newErr.model = v - return localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarHTTPResponse, newErr - } - newErr.model = v - return localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode >= 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarHTTPResponse, newErr - } - newErr.model = v - } return localVarHTTPResponse, newErr } @@ -645,8 +498,8 @@ func (r apiPinsRequestidGetRequest) Execute() (PinStatus, *_nethttp.Response, er body: localVarBody, error: localVarHTTPResponse.Status, } - if localVarHTTPResponse.StatusCode == 400 { - var v Error + if localVarHTTPResponse.StatusCode >= 400 && localVarHTTPResponse.StatusCode <= 600 { + var v Failure err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() @@ -655,55 +508,6 @@ func (r apiPinsRequestidGetRequest) Execute() (PinStatus, *_nethttp.Response, er newErr.model = v return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode == 401 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 404 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 409 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode >= 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - } return localVarReturnValue, localVarHTTPResponse, newErr } @@ -816,48 +620,8 @@ func (r apiPinsRequestidPostRequest) Execute() (PinStatus, *_nethttp.Response, e body: localVarBody, error: localVarHTTPResponse.Status, } - if localVarHTTPResponse.StatusCode == 400 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 401 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 404 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode == 409 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - return localVarReturnValue, localVarHTTPResponse, newErr - } - if localVarHTTPResponse.StatusCode > 400 && localVarHTTPResponse.StatusCode < 500 { - var v Error + if localVarHTTPResponse.StatusCode >= 400 && localVarHTTPResponse.StatusCode <= 600 { + var v Failure err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) if err != nil { newErr.error = err.Error() @@ -866,15 +630,6 @@ func (r apiPinsRequestidPostRequest) Execute() (PinStatus, *_nethttp.Response, e newErr.model = v return localVarReturnValue, localVarHTTPResponse, newErr } - if localVarHTTPResponse.StatusCode >= 500 { - var v Error - err = r.apiService.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHTTPResponse, newErr - } - newErr.model = v - } return localVarReturnValue, localVarHTTPResponse, newErr } diff --git a/pinning/remote/client/openapi/client.go b/pinning/remote/client/openapi/client.go index 14a9d5f0c8..9854089875 100644 --- a/pinning/remote/client/openapi/client.go +++ b/pinning/remote/client/openapi/client.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ @@ -39,7 +39,7 @@ var ( xmlCheck = regexp.MustCompile(`(?i:(?:application|text)/xml)`) ) -// APIClient manages communication with the IPFS Pinning Service API API v0.0.5 +// APIClient manages communication with the IPFS Pinning Service API API v0.1.1 // In most cases there should be only one, shared, APIClient. type APIClient struct { cfg *Configuration diff --git a/pinning/remote/client/openapi/configuration.go b/pinning/remote/client/openapi/configuration.go index 618454bca1..2f31e1352e 100644 --- a/pinning/remote/client/openapi/configuration.go +++ b/pinning/remote/client/openapi/configuration.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ diff --git a/pinning/remote/client/openapi/docs/Error.md b/pinning/remote/client/openapi/docs/Failure.md similarity index 68% rename from pinning/remote/client/openapi/docs/Error.md rename to pinning/remote/client/openapi/docs/Failure.md index 7629039432..c899f7138a 100644 --- a/pinning/remote/client/openapi/docs/Error.md +++ b/pinning/remote/client/openapi/docs/Failure.md @@ -1,46 +1,46 @@ -# Error +# Failure ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Error** | [**ErrorError**](Error_error.md) | | +**Error** | [**FailureError**](Failure_error.md) | | ## Methods -### NewError +### NewFailure -`func NewError(error_ ErrorError, ) *Error` +`func NewFailure(error_ FailureError, ) *Failure` -NewError instantiates a new Error object +NewFailure instantiates a new Failure object This constructor will assign default values to properties that have it defined, and makes sure properties required by API are set, but the set of arguments will change when the set of required properties is changed -### NewErrorWithDefaults +### NewFailureWithDefaults -`func NewErrorWithDefaults() *Error` +`func NewFailureWithDefaults() *Failure` -NewErrorWithDefaults instantiates a new Error object +NewFailureWithDefaults instantiates a new Failure object This constructor will only assign default values to properties that have it defined, but it doesn't guarantee that properties required by API are set ### GetError -`func (o *Error) GetError() ErrorError` +`func (o *Failure) GetError() FailureError` GetError returns the Error field if non-nil, zero value otherwise. ### GetErrorOk -`func (o *Error) GetErrorOk() (*ErrorError, bool)` +`func (o *Failure) GetErrorOk() (*FailureError, bool)` GetErrorOk returns a tuple with the Error field if it's non-nil, zero value otherwise and a boolean to check if the value has been set. ### SetError -`func (o *Error) SetError(v ErrorError)` +`func (o *Failure) SetError(v FailureError)` SetError sets Error field to given value. diff --git a/pinning/remote/client/openapi/docs/ErrorError.md b/pinning/remote/client/openapi/docs/FailureError.md similarity index 71% rename from pinning/remote/client/openapi/docs/ErrorError.md rename to pinning/remote/client/openapi/docs/FailureError.md index e44d638292..478f1b942a 100644 --- a/pinning/remote/client/openapi/docs/ErrorError.md +++ b/pinning/remote/client/openapi/docs/FailureError.md @@ -1,4 +1,4 @@ -# ErrorError +# FailureError ## Properties @@ -9,65 +9,65 @@ Name | Type | Description | Notes ## Methods -### NewErrorError +### NewFailureError -`func NewErrorError(reason string, ) *ErrorError` +`func NewFailureError(reason string, ) *FailureError` -NewErrorError instantiates a new ErrorError object +NewFailureError instantiates a new FailureError object This constructor will assign default values to properties that have it defined, and makes sure properties required by API are set, but the set of arguments will change when the set of required properties is changed -### NewErrorErrorWithDefaults +### NewFailureErrorWithDefaults -`func NewErrorErrorWithDefaults() *ErrorError` +`func NewFailureErrorWithDefaults() *FailureError` -NewErrorErrorWithDefaults instantiates a new ErrorError object +NewFailureErrorWithDefaults instantiates a new FailureError object This constructor will only assign default values to properties that have it defined, but it doesn't guarantee that properties required by API are set ### GetReason -`func (o *ErrorError) GetReason() string` +`func (o *FailureError) GetReason() string` GetReason returns the Reason field if non-nil, zero value otherwise. ### GetReasonOk -`func (o *ErrorError) GetReasonOk() (*string, bool)` +`func (o *FailureError) GetReasonOk() (*string, bool)` GetReasonOk returns a tuple with the Reason field if it's non-nil, zero value otherwise and a boolean to check if the value has been set. ### SetReason -`func (o *ErrorError) SetReason(v string)` +`func (o *FailureError) SetReason(v string)` SetReason sets Reason field to given value. ### GetDetails -`func (o *ErrorError) GetDetails() string` +`func (o *FailureError) GetDetails() string` GetDetails returns the Details field if non-nil, zero value otherwise. ### GetDetailsOk -`func (o *ErrorError) GetDetailsOk() (*string, bool)` +`func (o *FailureError) GetDetailsOk() (*string, bool)` GetDetailsOk returns a tuple with the Details field if it's non-nil, zero value otherwise and a boolean to check if the value has been set. ### SetDetails -`func (o *ErrorError) SetDetails(v string)` +`func (o *FailureError) SetDetails(v string)` SetDetails sets Details field to given value. ### HasDetails -`func (o *ErrorError) HasDetails() bool` +`func (o *FailureError) HasDetails() bool` HasDetails returns a boolean if a field has been set. diff --git a/pinning/remote/client/openapi/model_error.go b/pinning/remote/client/openapi/model_failure.go similarity index 89% rename from pinning/remote/client/openapi/model_error.go rename to pinning/remote/client/openapi/model_failure.go index ab308de3d0..ec1fc8268a 100644 --- a/pinning/remote/client/openapi/model_error.go +++ b/pinning/remote/client/openapi/model_failure.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ @@ -13,33 +13,33 @@ import ( "encoding/json" ) -// Error Error object -type Error struct { - Error ErrorError `json:"error"` +// Failure Response for a failed request +type Failure struct { + Error FailureError `json:"error"` } -// NewError instantiates a new Error object +// NewFailure instantiates a new Failure object // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewError(error_ ErrorError) *Error { - this := Error{} +func NewFailure(error_ FailureError) *Failure { + this := Failure{} this.Error = error_ return &this } -// NewErrorWithDefaults instantiates a new Error object +// NewFailureWithDefaults instantiates a new Failure object // This constructor will only assign default values to properties that have it defined, // but it doesn't guarantee that properties required by API are set -func NewErrorWithDefaults() *Error { - this := Error{} +func NewFailureWithDefaults() *Failure { + this := Failure{} return &this } // GetError returns the Error field value -func (o *Error) GetError() ErrorError { +func (o *Failure) GetError() FailureError { if o == nil { - var ret ErrorError + var ret FailureError return ret } @@ -48,7 +48,7 @@ func (o *Error) GetError() ErrorError { // GetErrorOk returns a tuple with the Error field value // and a boolean to check if the value has been set. -func (o *Error) GetErrorOk() (*ErrorError, bool) { +func (o *Failure) GetErrorOk() (*FailureError, bool) { if o == nil { return nil, false } @@ -56,11 +56,11 @@ func (o *Error) GetErrorOk() (*ErrorError, bool) { } // SetError sets field value -func (o *Error) SetError(v ErrorError) { +func (o *Failure) SetError(v FailureError) { o.Error = v } -func (o Error) MarshalJSON() ([]byte, error) { +func (o Failure) MarshalJSON() ([]byte, error) { toSerialize := map[string]interface{}{} if true { toSerialize["error"] = o.Error @@ -68,38 +68,38 @@ func (o Error) MarshalJSON() ([]byte, error) { return json.Marshal(toSerialize) } -type NullableError struct { - value *Error +type NullableFailure struct { + value *Failure isSet bool } -func (v NullableError) Get() *Error { +func (v NullableFailure) Get() *Failure { return v.value } -func (v *NullableError) Set(val *Error) { +func (v *NullableFailure) Set(val *Failure) { v.value = val v.isSet = true } -func (v NullableError) IsSet() bool { +func (v NullableFailure) IsSet() bool { return v.isSet } -func (v *NullableError) Unset() { +func (v *NullableFailure) Unset() { v.value = nil v.isSet = false } -func NewNullableError(val *Error) *NullableError { - return &NullableError{value: val, isSet: true} +func NewNullableFailure(val *Failure) *NullableFailure { + return &NullableFailure{value: val, isSet: true} } -func (v NullableError) MarshalJSON() ([]byte, error) { +func (v NullableFailure) MarshalJSON() ([]byte, error) { return json.Marshal(v.value) } -func (v *NullableError) UnmarshalJSON(src []byte) error { +func (v *NullableFailure) UnmarshalJSON(src []byte) error { v.isSet = true return json.Unmarshal(src, &v.value) } diff --git a/pinning/remote/client/openapi/model_error_error.go b/pinning/remote/client/openapi/model_failure_error.go similarity index 88% rename from pinning/remote/client/openapi/model_error_error.go rename to pinning/remote/client/openapi/model_failure_error.go index 0a177dbd26..4f38acdf96 100644 --- a/pinning/remote/client/openapi/model_error_error.go +++ b/pinning/remote/client/openapi/model_failure_error.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ @@ -13,34 +13,34 @@ import ( "encoding/json" ) -// ErrorError struct for ErrorError -type ErrorError struct { +// FailureError struct for FailureError +type FailureError struct { // Mandatory string identifying the type of error Reason string `json:"reason"` // Optional, longer description of the error; may include UUID of transaction for support, links to documentation etc Details *string `json:"details,omitempty"` } -// NewErrorError instantiates a new ErrorError object +// NewFailureError instantiates a new FailureError object // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewErrorError(reason string) *ErrorError { - this := ErrorError{} +func NewFailureError(reason string) *FailureError { + this := FailureError{} this.Reason = reason return &this } -// NewErrorErrorWithDefaults instantiates a new ErrorError object +// NewFailureErrorWithDefaults instantiates a new FailureError object // This constructor will only assign default values to properties that have it defined, // but it doesn't guarantee that properties required by API are set -func NewErrorErrorWithDefaults() *ErrorError { - this := ErrorError{} +func NewFailureErrorWithDefaults() *FailureError { + this := FailureError{} return &this } // GetReason returns the Reason field value -func (o *ErrorError) GetReason() string { +func (o *FailureError) GetReason() string { if o == nil { var ret string return ret @@ -51,7 +51,7 @@ func (o *ErrorError) GetReason() string { // GetReasonOk returns a tuple with the Reason field value // and a boolean to check if the value has been set. -func (o *ErrorError) GetReasonOk() (*string, bool) { +func (o *FailureError) GetReasonOk() (*string, bool) { if o == nil { return nil, false } @@ -59,12 +59,12 @@ func (o *ErrorError) GetReasonOk() (*string, bool) { } // SetReason sets field value -func (o *ErrorError) SetReason(v string) { +func (o *FailureError) SetReason(v string) { o.Reason = v } // GetDetails returns the Details field value if set, zero value otherwise. -func (o *ErrorError) GetDetails() string { +func (o *FailureError) GetDetails() string { if o == nil || o.Details == nil { var ret string return ret @@ -74,7 +74,7 @@ func (o *ErrorError) GetDetails() string { // GetDetailsOk returns a tuple with the Details field value if set, nil otherwise // and a boolean to check if the value has been set. -func (o *ErrorError) GetDetailsOk() (*string, bool) { +func (o *FailureError) GetDetailsOk() (*string, bool) { if o == nil || o.Details == nil { return nil, false } @@ -82,7 +82,7 @@ func (o *ErrorError) GetDetailsOk() (*string, bool) { } // HasDetails returns a boolean if a field has been set. -func (o *ErrorError) HasDetails() bool { +func (o *FailureError) HasDetails() bool { if o != nil && o.Details != nil { return true } @@ -91,11 +91,11 @@ func (o *ErrorError) HasDetails() bool { } // SetDetails gets a reference to the given string and assigns it to the Details field. -func (o *ErrorError) SetDetails(v string) { +func (o *FailureError) SetDetails(v string) { o.Details = &v } -func (o ErrorError) MarshalJSON() ([]byte, error) { +func (o FailureError) MarshalJSON() ([]byte, error) { toSerialize := map[string]interface{}{} if true { toSerialize["reason"] = o.Reason @@ -106,38 +106,38 @@ func (o ErrorError) MarshalJSON() ([]byte, error) { return json.Marshal(toSerialize) } -type NullableErrorError struct { - value *ErrorError +type NullableFailureError struct { + value *FailureError isSet bool } -func (v NullableErrorError) Get() *ErrorError { +func (v NullableFailureError) Get() *FailureError { return v.value } -func (v *NullableErrorError) Set(val *ErrorError) { +func (v *NullableFailureError) Set(val *FailureError) { v.value = val v.isSet = true } -func (v NullableErrorError) IsSet() bool { +func (v NullableFailureError) IsSet() bool { return v.isSet } -func (v *NullableErrorError) Unset() { +func (v *NullableFailureError) Unset() { v.value = nil v.isSet = false } -func NewNullableErrorError(val *ErrorError) *NullableErrorError { - return &NullableErrorError{value: val, isSet: true} +func NewNullableFailureError(val *FailureError) *NullableFailureError { + return &NullableFailureError{value: val, isSet: true} } -func (v NullableErrorError) MarshalJSON() ([]byte, error) { +func (v NullableFailureError) MarshalJSON() ([]byte, error) { return json.Marshal(v.value) } -func (v *NullableErrorError) UnmarshalJSON(src []byte) error { +func (v *NullableFailureError) UnmarshalJSON(src []byte) error { v.isSet = true return json.Unmarshal(src, &v.value) } diff --git a/pinning/remote/client/openapi/model_pin.go b/pinning/remote/client/openapi/model_pin.go index 31ae0ca862..0152d43bbf 100644 --- a/pinning/remote/client/openapi/model_pin.go +++ b/pinning/remote/client/openapi/model_pin.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ diff --git a/pinning/remote/client/openapi/model_pin_results.go b/pinning/remote/client/openapi/model_pin_results.go index b569fe5df2..eacb5e0212 100644 --- a/pinning/remote/client/openapi/model_pin_results.go +++ b/pinning/remote/client/openapi/model_pin_results.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ diff --git a/pinning/remote/client/openapi/model_pin_status.go b/pinning/remote/client/openapi/model_pin_status.go index 21d7992b2e..0f44e62c2d 100644 --- a/pinning/remote/client/openapi/model_pin_status.go +++ b/pinning/remote/client/openapi/model_pin_status.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ diff --git a/pinning/remote/client/openapi/model_status.go b/pinning/remote/client/openapi/model_status.go index 7b30371bab..56944819fa 100644 --- a/pinning/remote/client/openapi/model_status.go +++ b/pinning/remote/client/openapi/model_status.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ diff --git a/pinning/remote/client/openapi/response.go b/pinning/remote/client/openapi/response.go index 5f1b374568..8f9fb0b081 100644 --- a/pinning/remote/client/openapi/response.go +++ b/pinning/remote/client/openapi/response.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ diff --git a/pinning/remote/client/openapi/utils.go b/pinning/remote/client/openapi/utils.go index 9762391274..25d36f11b6 100644 --- a/pinning/remote/client/openapi/utils.go +++ b/pinning/remote/client/openapi/utils.go @@ -3,7 +3,7 @@ * * ## About this spec The IPFS Pinning Service API is intended to be an implementation-agnostic API: - For use and implementation by pinning service providers - For use in client mode by IPFS nodes and GUI-based applications > **Note**: while ready for implementation, this spec is still a work in progress! 🏗️ **Your input and feedback are welcome and valuable as we develop this API spec. Please join the design discussion at [github.com/ipfs/pinning-services-api-spec](https://github.com/ipfs/pinning-services-api-spec).** # Schemas This section describes the most important object types and conventions. A full list of fields and schemas can be found in the `schemas` section of the [YAML file](https://github.com/ipfs/pinning-services-api-spec/blob/master/ipfs-pinning-service.yaml). ## Identifiers ### cid [Content Identifier (CID)](https://docs.ipfs.io/concepts/content-addressing/) points at the root of a DAG that is pinned recursively. ### requestid Unique identifier of a pin request. When a pin is created, the service responds with unique `requestid` that can be later used for pin removal. When the same `cid` is pinned again, a different `requestid` is returned to differentiate between those pin requests. Service implementation should use UUID, `hash(accessToken,Pin,PinStatus.created)`, or any other opaque identifier that provides equally strong protection against race conditions. ## Objects ### Pin object ![pin object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pin.png) The `Pin` object is a representation of a pin request. It includes the `cid` of data to be pinned, as well as optional metadata in `name`, `origins`, and `meta`. ### Pin status response ![pin status response object](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/pinstatus.png) The `PinStatus` object is a representation of the current state of a pinning operation. It includes the original `pin` object, along with the current `status` and globally unique `requestid` of the entire pinning request, which can be used for future status checks and management. Addresses in the `delegates` array are peers delegated by the pinning service for facilitating direct file transfers (more details in the provider hints section). Any additional vendor-specific information is returned in optional `info`. ## The pin lifecycle ![pinning service objects and lifecycle](https://bafybeideck2fchyxna4wqwc2mo67yriokehw3yujboc5redjdaajrk2fjq.ipfs.dweb.link/lifecycle.png) ### Creating a new pin object The user sends a `Pin` object to `POST /pins` and receives a `PinStatus` response: - `requestid` in `PinStatus` is the identifier of the pin operation, which can can be used for checking status, and removing the pin in the future - `status` in `PinStatus` indicates the current state of a pin ### Checking status of in-progress pinning `status` (in `PinStatus`) may indicate a pending state (`queued` or `pinning`). This means the data behind `Pin.cid` was not found on the pinning service and is being fetched from the IPFS network at large, which may take time. In this case, the user can periodically check pinning progress via `GET /pins/{requestid}` until pinning is successful, or the user decides to remove the pending pin. ### Replacing an existing pin object The user can replace an existing pin object via `POST /pins/{requestid}`. This is a shortcut for removing a pin object identified by `requestid` and creating a new one in a single API call that protects against undesired garbage collection of blocks common to both pins. Useful when updating a pin representing a huge dataset where most of blocks did not change. The new pin object `requestid` is returned in the `PinStatus` response. The old pin object is deleted automatically. ### Removing a pin object A pin object can be removed via `DELETE /pins/{requestid}`. ## Provider hints Pinning of new data can be accelerated by providing a list of known data sources in `Pin.origins`, and connecting at least one of them to pinning service nodes at `PinStatus.delegates`. The most common scenario is a client putting its own IPFS node's multiaddrs in `Pin.origins`, and then directly connecting to every multiaddr returned by a pinning service in `PinStatus.delegates` to initiate transfer. This ensures data transfer starts immediately (without waiting for provider discovery over DHT), and direct dial from a client works around peer routing issues in restrictive network topologies such as NATs. ## Custom metadata Pinning services are encouraged to add support for additional features by leveraging the optional `Pin.meta` and `PinStatus.info` fields. While these attributes can be application- or vendor-specific, we encourage the community at large to leverage these attributes as a sandbox to come up with conventions that could become part of future revisions of this API. ### Pin metadata String keys and values passed in `Pin.meta` are persisted with the pin object. Potential uses: - `Pin.meta[app_id]`: Attaching a unique identifier to pins created by an app enables filtering pins per app via `?meta={\"app_id\":}` - `Pin.meta[vendor_policy]`: Vendor-specific policy (for example: which region to use, how many copies to keep) Note that it is OK for a client to omit or ignore these optional attributes; doing so should not impact the basic pinning functionality. ### Pin status info Additional `PinStatus.info` can be returned by pinning service. Potential uses: - `PinStatus.info[status_details]`: more info about the current status (queue position, percentage of transferred data, summary of where data is stored, etc); when `PinStatus.status=failed`, it could provide a reason why a pin operation failed (e.g. lack of funds, DAG too big, etc.) - `PinStatus.info[dag_size]`: the size of pinned data, along with DAG overhead - `PinStatus.info[raw_size]`: the size of data without DAG overhead (eg. unixfs) - `PinStatus.info[pinned_until]`: if vendor supports time-bound pins, this could indicate when the pin will expire # Pagination and filtering Pin objects can be listed by executing `GET /pins` with optional parameters: - When no filters are provided, the endpoint will return a small batch of the 10 most recently created items, from the latest to the oldest. - The number of returned items can be adjusted with the `limit` parameter (implicit default is 10). - If the value in `PinResults.count` is bigger than the length of `PinResults.results`, the client can infer there are more results that can be queried. - To read more items, pass the `before` filter with the timestamp from `PinStatus.created` found in the oldest item in the current batch of results. Repeat to read all results. - Returned results can be fine-tuned by applying optional `after`, `cid`, `name`, `status`, or `meta` filters. > **Note**: pagination by the `created` timestamp requires each value to be globally unique. Any future considerations to add support for bulk creation must account for this. * - * API version: 0.0.5 + * API version: 0.1.1 * Generated by: OpenAPI Generator (https://openapi-generator.tech) */ From 9783d2953f0a8c1fc2c409fcff113ddeb81bdad6 Mon Sep 17 00:00:00 2001 From: Andrew Gillis Date: Mon, 30 Nov 2020 14:34:37 -0800 Subject: [PATCH 2901/3147] Datastore based pinner (#4) feat: store pins in datastore instead of a DAG Adds a new `/pins` namespace to the given datastore and uses that to store pins as cbor binary, keyed by unique pin ID. The new datastore pinner stores pins in the datastore as individual key-value items. This is faster than the dag pinner, which stored all pins in a single dag that had to be rewritten every time a pin was added or removed. The new pinner provides a secondary indexing mechanism that can be used to index any data that a pin has. Secondary indexing logic is provided by the `dsindex` package. The new pinner currently includes indexing by CID. Both the new datastore pinner (`dspinner` package) and the old dag pinner (`ipldpinner` package) implementations are included to support migration between the two. Migration logic is provided by the `pinconv` package. Other features in new pinner: - Benchmarks are provided to compare performance of between the old and new pinners - New pinner does not keep in-memory set of pinned CIDs, instead it relies on the datastore - Separate recursive and direct CID indexes allow searching for pins without having to load pin data to check the mode - New pinner can rebuild indexes on load, if saved pins appear out of sync with the indexes This commit was moved from ipfs/go-ipfs-pinner@4c920717b015dd9555472fbaf11d36ff70cbd26d --- pinning/pinner/.gitignore | 8 + pinning/pinner/dsindex/error.go | 8 + pinning/pinner/dsindex/indexer.go | 285 +++++ pinning/pinner/dsindex/indexer_test.go | 286 +++++ pinning/pinner/dspinner/pin.go | 961 ++++++++++++++++ pinning/pinner/dspinner/pin_test.go | 1137 +++++++++++++++++++ pinning/pinner/ipldpinner/pin.go | 528 +++++++++ pinning/pinner/{ => ipldpinner}/pin_test.go | 50 +- pinning/pinner/{ => ipldpinner}/set.go | 16 +- pinning/pinner/{ => ipldpinner}/set_test.go | 2 +- pinning/pinner/pin.go | 498 -------- pinning/pinner/pinconv/pinconv.go | 128 +++ pinning/pinner/pinconv/pinconv_test.go | 153 +++ 13 files changed, 3541 insertions(+), 519 deletions(-) create mode 100644 pinning/pinner/.gitignore create mode 100644 pinning/pinner/dsindex/error.go create mode 100644 pinning/pinner/dsindex/indexer.go create mode 100644 pinning/pinner/dsindex/indexer_test.go create mode 100644 pinning/pinner/dspinner/pin.go create mode 100644 pinning/pinner/dspinner/pin_test.go create mode 100644 pinning/pinner/ipldpinner/pin.go rename pinning/pinner/{ => ipldpinner}/pin_test.go (90%) rename pinning/pinner/{ => ipldpinner}/set.go (94%) rename pinning/pinner/{ => ipldpinner}/set_test.go (99%) create mode 100644 pinning/pinner/pinconv/pinconv.go create mode 100644 pinning/pinner/pinconv/pinconv_test.go diff --git a/pinning/pinner/.gitignore b/pinning/pinner/.gitignore new file mode 100644 index 0000000000..3c342889d2 --- /dev/null +++ b/pinning/pinner/.gitignore @@ -0,0 +1,8 @@ +*~ +*.log + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool +*.out diff --git a/pinning/pinner/dsindex/error.go b/pinning/pinner/dsindex/error.go new file mode 100644 index 0000000000..f3b685bb95 --- /dev/null +++ b/pinning/pinner/dsindex/error.go @@ -0,0 +1,8 @@ +package dsindex + +import "errors" + +var ( + ErrEmptyKey = errors.New("key is empty") + ErrEmptyValue = errors.New("value is empty") +) diff --git a/pinning/pinner/dsindex/indexer.go b/pinning/pinner/dsindex/indexer.go new file mode 100644 index 0000000000..e48af2e17b --- /dev/null +++ b/pinning/pinner/dsindex/indexer.go @@ -0,0 +1,285 @@ +// Package dsindex provides secondary indexing functionality for a datastore. +package dsindex + +import ( + "context" + "fmt" + "path" + + ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/namespace" + "github.com/ipfs/go-datastore/query" + "github.com/multiformats/go-multibase" +) + +// Indexer maintains a secondary index. An index is a collection of key-value +// mappings where the key is the secondary index that maps to one or more +// values, where each value is a unique key being indexed. +type Indexer interface { + // Add adds the specified value to the key + Add(ctx context.Context, key, value string) error + + // Delete deletes the specified value from the key. If the value is not in + // the datastore, this method returns no error. + Delete(ctx context.Context, key, value string) error + + // DeleteKey deletes all values in the given key. If a key is not in the + // datastore, this method returns no error. Returns a count of values that + // were deleted. + DeleteKey(ctx context.Context, key string) (count int, err error) + + // DeleteAll deletes all keys managed by this Indexer. Returns a count of + // the values that were deleted. + DeleteAll(ctx context.Context) (count int, err error) + + // ForEach calls the function for each value in the specified key, until + // there are no more values, or until the function returns false. If key + // is empty string, then all keys are iterated. + ForEach(ctx context.Context, key string, fn func(key, value string) bool) error + + // HasValue determines if the key contains the specified value + HasValue(ctx context.Context, key, value string) (bool, error) + + // HasAny determines if any value is in the specified key. If key is + // empty string, then all values are searched. + HasAny(ctx context.Context, key string) (bool, error) + + // Search returns all values for the given key + Search(ctx context.Context, key string) (values []string, err error) +} + +// indexer is a simple implementation of Indexer. This implementation relies +// on the underlying data store to support efficient querying by prefix. +// +// TODO: Consider adding caching +type indexer struct { + dstore ds.Datastore +} + +// New creates a new datastore index. All indexes are stored under the +// specified index name. +// +// To persist the actions of calling Indexer functions, it is necessary to call +// dstore.Sync. +func New(dstore ds.Datastore, name ds.Key) Indexer { + return &indexer{ + dstore: namespace.Wrap(dstore, name), + } +} + +func (x *indexer) Add(ctx context.Context, key, value string) error { + if key == "" { + return ErrEmptyKey + } + if value == "" { + return ErrEmptyValue + } + dsKey := ds.NewKey(encode(key)).ChildString(encode(value)) + return x.dstore.Put(dsKey, []byte{}) +} + +func (x *indexer) Delete(ctx context.Context, key, value string) error { + if key == "" { + return ErrEmptyKey + } + if value == "" { + return ErrEmptyValue + } + return x.dstore.Delete(ds.NewKey(encode(key)).ChildString(encode(value))) +} + +func (x *indexer) DeleteKey(ctx context.Context, key string) (int, error) { + if key == "" { + return 0, ErrEmptyKey + } + return x.deletePrefix(ctx, encode(key)) +} + +func (x *indexer) DeleteAll(ctx context.Context) (int, error) { + return x.deletePrefix(ctx, "") +} + +func (x *indexer) ForEach(ctx context.Context, key string, fn func(key, value string) bool) error { + if key != "" { + key = encode(key) + } + + q := query.Query{ + Prefix: key, + KeysOnly: true, + } + results, err := x.dstore.Query(q) + if err != nil { + return err + } + + for { + r, ok := results.NextSync() + if !ok { + break + } + if r.Error != nil { + err = r.Error + break + } + if ctx.Err() != nil { + err = ctx.Err() + break + } + ent := r.Entry + decIdx, err := decode(path.Base(path.Dir(ent.Key))) + if err != nil { + err = fmt.Errorf("cannot decode index: %v", err) + break + } + decKey, err := decode(path.Base(ent.Key)) + if err != nil { + err = fmt.Errorf("cannot decode key: %v", err) + break + } + if !fn(decIdx, decKey) { + break + } + } + results.Close() + + return err +} + +func (x *indexer) HasValue(ctx context.Context, key, value string) (bool, error) { + if key == "" { + return false, ErrEmptyKey + } + if value == "" { + return false, ErrEmptyValue + } + return x.dstore.Has(ds.NewKey(encode(key)).ChildString(encode(value))) +} + +func (x *indexer) HasAny(ctx context.Context, key string) (bool, error) { + var any bool + err := x.ForEach(ctx, key, func(key, value string) bool { + any = true + return false + }) + return any, err +} + +func (x *indexer) Search(ctx context.Context, key string) ([]string, error) { + if key == "" { + return nil, ErrEmptyKey + } + ents, err := x.queryPrefix(ctx, encode(key)) + if err != nil { + return nil, err + } + if len(ents) == 0 { + return nil, nil + } + + values := make([]string, len(ents)) + for i := range ents { + values[i], err = decode(path.Base(ents[i].Key)) + if err != nil { + return nil, fmt.Errorf("cannot decode value: %v", err) + } + } + return values, nil +} + +// SyncIndex synchronizes the keys in the target Indexer to match those of the +// ref Indexer. This function does not change this indexer's key root (name +// passed into New). +func SyncIndex(ctx context.Context, ref, target Indexer) (bool, error) { + // Build reference index map + refs := map[string]string{} + err := ref.ForEach(ctx, "", func(key, value string) bool { + refs[value] = key + return true + }) + if err != nil { + return false, err + } + if len(refs) == 0 { + return false, nil + } + + // Compare current indexes + dels := map[string]string{} + err = target.ForEach(ctx, "", func(key, value string) bool { + refKey, ok := refs[value] + if ok && refKey == key { + // same in both; delete from refs, do not add to dels + delete(refs, value) + } else { + dels[value] = key + } + return true + }) + if err != nil { + return false, err + } + + // Items in dels are keys that no longer exist + for value, key := range dels { + err = target.Delete(ctx, key, value) + if err != nil { + return false, err + } + } + + // What remains in refs are keys that need to be added + for value, key := range refs { + err = target.Add(ctx, key, value) + if err != nil { + return false, err + } + } + + return len(refs) != 0 || len(dels) != 0, nil +} + +func (x *indexer) deletePrefix(ctx context.Context, prefix string) (int, error) { + ents, err := x.queryPrefix(ctx, prefix) + if err != nil { + return 0, err + } + + for i := range ents { + err = x.dstore.Delete(ds.NewKey(ents[i].Key)) + if err != nil { + return 0, err + } + } + + return len(ents), nil +} + +func (x *indexer) queryPrefix(ctx context.Context, prefix string) ([]query.Entry, error) { + q := query.Query{ + Prefix: prefix, + KeysOnly: true, + } + results, err := x.dstore.Query(q) + if err != nil { + return nil, err + } + return results.Rest() +} + +func encode(data string) string { + encData, err := multibase.Encode(multibase.Base64url, []byte(data)) + if err != nil { + // programming error; using unsupported encoding + panic(err.Error()) + } + return encData +} + +func decode(data string) (string, error) { + _, b, err := multibase.Decode(data) + if err != nil { + return "", err + } + return string(b), nil +} diff --git a/pinning/pinner/dsindex/indexer_test.go b/pinning/pinner/dsindex/indexer_test.go new file mode 100644 index 0000000000..45372c6053 --- /dev/null +++ b/pinning/pinner/dsindex/indexer_test.go @@ -0,0 +1,286 @@ +package dsindex + +import ( + "context" + "testing" + + ds "github.com/ipfs/go-datastore" +) + +func createIndexer() Indexer { + dstore := ds.NewMapDatastore() + nameIndex := New(dstore, ds.NewKey("/data/nameindex")) + + ctx := context.Background() + nameIndex.Add(ctx, "alice", "a1") + nameIndex.Add(ctx, "bob", "b1") + nameIndex.Add(ctx, "bob", "b2") + nameIndex.Add(ctx, "cathy", "c1") + + return nameIndex +} + +func TestAdd(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nameIndex := createIndexer() + err := nameIndex.Add(ctx, "someone", "s1") + if err != nil { + t.Fatal(err) + } + err = nameIndex.Add(ctx, "someone", "s1") + if err != nil { + t.Fatal(err) + } + + err = nameIndex.Add(ctx, "", "noindex") + if err != ErrEmptyKey { + t.Fatal("unexpected error:", err) + } + + err = nameIndex.Add(ctx, "nokey", "") + if err != ErrEmptyValue { + t.Fatal("unexpected error:", err) + } +} + +func TestHasValue(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nameIndex := createIndexer() + + ok, err := nameIndex.HasValue(ctx, "bob", "b1") + if err != nil { + t.Fatal(err) + } + if !ok { + t.Fatal("missing index") + } + + ok, err = nameIndex.HasValue(ctx, "bob", "b3") + if err != nil { + t.Fatal(err) + } + if ok { + t.Fatal("should not have index") + } + + _, err = nameIndex.HasValue(ctx, "", "b1") + if err != ErrEmptyKey { + t.Fatal("unexpected error:", err) + } + + _, err = nameIndex.HasValue(ctx, "bob", "") + if err != ErrEmptyValue { + t.Fatal("unexpected error:", err) + } +} + +func TestHasAny(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nameIndex := createIndexer() + + ok, err := nameIndex.HasAny(ctx, "nothere") + if err != nil { + t.Fatal(err) + } + if ok { + t.Fatal("should return false") + } + + for _, idx := range []string{"alice", "bob", ""} { + ok, err = nameIndex.HasAny(ctx, idx) + if err != nil { + t.Fatal(err) + } + if !ok { + t.Fatal("missing index", idx) + } + } + + count, err := nameIndex.DeleteAll(ctx) + if err != nil { + t.Fatal(err) + } + if count != 4 { + t.Fatal("expected 4 deletions") + } + + ok, err = nameIndex.HasAny(ctx, "") + if err != nil { + t.Fatal(err) + } + if ok { + t.Fatal("should return false") + } +} + +func TestForEach(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nameIndex := createIndexer() + + found := make(map[string]struct{}) + err := nameIndex.ForEach(ctx, "bob", func(key, value string) bool { + found[value] = struct{}{} + return true + }) + if err != nil { + t.Fatal(err) + } + + for _, value := range []string{"b1", "b2"} { + _, ok := found[value] + if !ok { + t.Fatal("missing key for value", value) + } + } + + values := map[string]string{} + err = nameIndex.ForEach(ctx, "", func(key, value string) bool { + values[value] = key + return true + }) + if err != nil { + t.Fatal(err) + } + if len(values) != 4 { + t.Fatal("expected 4 keys") + } + + if values["a1"] != "alice" { + t.Error("expected a1: alice") + } + if values["b1"] != "bob" { + t.Error("expected b1: bob") + } + if values["b2"] != "bob" { + t.Error("expected b2: bob") + } + if values["c1"] != "cathy" { + t.Error("expected c1: cathy") + } +} + +func TestSearch(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nameIndex := createIndexer() + + ids, err := nameIndex.Search(ctx, "bob") + if err != nil { + t.Fatal(err) + } + if len(ids) != 2 { + t.Fatal("wrong number of ids - expected 2 got", ids) + } + for _, id := range ids { + if id != "b1" && id != "b2" { + t.Fatal("wrong value in id set") + } + } + if ids[0] == ids[1] { + t.Fatal("duplicate id") + } + + ids, err = nameIndex.Search(ctx, "cathy") + if err != nil { + t.Fatal(err) + } + if len(ids) != 1 || ids[0] != "c1" { + t.Fatal("wrong ids") + } + + ids, err = nameIndex.Search(ctx, "amit") + if err != nil { + t.Fatal(err) + } + if len(ids) != 0 { + t.Fatal("unexpected ids returned") + } +} + +func TestDelete(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nameIndex := createIndexer() + + err := nameIndex.Delete(ctx, "bob", "b3") + if err != nil { + t.Fatal(err) + } + + err = nameIndex.Delete(ctx, "alice", "a1") + if err != nil { + t.Fatal(err) + } + + ok, err := nameIndex.HasValue(ctx, "alice", "a1") + if err != nil { + t.Fatal(err) + } + if ok { + t.Fatal("index key should have been deleted") + } + + count, err := nameIndex.DeleteKey(ctx, "bob") + if err != nil { + t.Fatal(err) + } + if count != 2 { + t.Fatal("wrong deleted count") + } + ok, _ = nameIndex.HasValue(ctx, "bob", "b1") + if ok { + t.Fatal("index not deleted") + } +} + +func TestSyncIndex(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nameIndex := createIndexer() + + dstore := ds.NewMapDatastore() + refIndex := New(dstore, ds.NewKey("/ref")) + refIndex.Add(ctx, "alice", "a1") + refIndex.Add(ctx, "cathy", "zz") + refIndex.Add(ctx, "dennis", "d1") + + changed, err := SyncIndex(ctx, refIndex, nameIndex) + if err != nil { + t.Fatal(err) + } + if !changed { + t.Error("change was not indicated") + } + + // Create map of id->index in sync target + syncs := map[string]string{} + err = nameIndex.ForEach(ctx, "", func(key, value string) bool { + syncs[value] = key + return true + }) + if err != nil { + t.Fatal(err) + } + + // Iterate items in sync source and make sure they appear in target + var itemCount int + err = refIndex.ForEach(ctx, "", func(key, value string) bool { + itemCount++ + syncKey, ok := syncs[value] + if !ok || key != syncKey { + t.Fatal("key", key, "-->", value, "was not synced") + } + return true + }) + if err != nil { + t.Fatal(err) + } + + if itemCount != len(syncs) { + t.Fatal("different number of items in sync source and target") + } +} diff --git a/pinning/pinner/dspinner/pin.go b/pinning/pinner/dspinner/pin.go new file mode 100644 index 0000000000..5fd65e7bf2 --- /dev/null +++ b/pinning/pinner/dspinner/pin.go @@ -0,0 +1,961 @@ +// Package dspinner implements structures and methods to keep track of +// which objects a user wants to keep stored locally. This implementation +// stores pin data in a datastore. +package dspinner + +import ( + "context" + "errors" + "fmt" + "path" + "sync" + + "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/query" + ipfspinner "github.com/ipfs/go-ipfs-pinner" + "github.com/ipfs/go-ipfs-pinner/dsindex" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" + mdag "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-merkledag/dagutils" + "github.com/polydawn/refmt/cbor" + "github.com/polydawn/refmt/obj/atlas" +) + +const ( + basePath = "/pins" + pinKeyPath = "/pins/pin" + indexKeyPath = "/pins/index" + dirtyKeyPath = "/pins/state/dirty" +) + +var ( + // ErrNotPinned is returned when trying to unpin items that are not pinned. + ErrNotPinned = errors.New("not pinned or pinned indirectly") + + log logging.StandardLogger = logging.Logger("pin") + + linkDirect, linkRecursive string + + pinCidDIndexPath string + pinCidRIndexPath string + pinNameIndexPath string + + dirtyKey = ds.NewKey(dirtyKeyPath) + + pinAtl atlas.Atlas +) + +func init() { + directStr, ok := ipfspinner.ModeToString(ipfspinner.Direct) + if !ok { + panic("could not find Direct pin enum") + } + linkDirect = directStr + + recursiveStr, ok := ipfspinner.ModeToString(ipfspinner.Recursive) + if !ok { + panic("could not find Recursive pin enum") + } + linkRecursive = recursiveStr + + pinCidRIndexPath = path.Join(indexKeyPath, "cidRindex") + pinCidDIndexPath = path.Join(indexKeyPath, "cidDindex") + pinNameIndexPath = path.Join(indexKeyPath, "nameIndex") + + pinAtl = atlas.MustBuild( + atlas.BuildEntry(pin{}).StructMap(). + AddField("Cid", atlas.StructMapEntry{SerialName: "cid"}). + AddField("Metadata", atlas.StructMapEntry{SerialName: "metadata", OmitEmpty: true}). + AddField("Mode", atlas.StructMapEntry{SerialName: "mode"}). + AddField("Name", atlas.StructMapEntry{SerialName: "name", OmitEmpty: true}). + Complete(), + atlas.BuildEntry(cid.Cid{}).Transform(). + TransformMarshal(atlas.MakeMarshalTransformFunc(func(live cid.Cid) ([]byte, error) { return live.MarshalBinary() })). + TransformUnmarshal(atlas.MakeUnmarshalTransformFunc(func(serializable []byte) (cid.Cid, error) { + c := cid.Cid{} + err := c.UnmarshalBinary(serializable) + if err != nil { + return cid.Cid{}, err + } + return c, nil + })).Complete(), + ) + pinAtl = pinAtl.WithMapMorphism(atlas.MapMorphism{KeySortMode: atlas.KeySortMode_Strings}) +} + +// pinner implements the Pinner interface +type pinner struct { + lock sync.RWMutex + + dserv ipld.DAGService + dstore ds.Datastore + + cidDIndex dsindex.Indexer + cidRIndex dsindex.Indexer + nameIndex dsindex.Indexer + + clean int64 + dirty int64 +} + +var _ ipfspinner.Pinner = (*pinner)(nil) + +type pin struct { + Id string + Cid cid.Cid + Metadata map[string]interface{} + Mode ipfspinner.Mode + Name string +} + +func (p *pin) dsKey() ds.Key { + return ds.NewKey(path.Join(pinKeyPath, p.Id)) +} + +func newPin(c cid.Cid, mode ipfspinner.Mode, name string) *pin { + return &pin{ + Id: ds.RandomKey().String(), + Cid: c, + Name: name, + Mode: mode, + } +} + +type syncDAGService interface { + ipld.DAGService + Sync() error +} + +// New creates a new pinner and loads its keysets from the given datastore. If +// there is no data present in the datastore, then an empty pinner is returned. +func New(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService) (ipfspinner.Pinner, error) { + p := &pinner{ + cidDIndex: dsindex.New(dstore, ds.NewKey(pinCidDIndexPath)), + cidRIndex: dsindex.New(dstore, ds.NewKey(pinCidRIndexPath)), + nameIndex: dsindex.New(dstore, ds.NewKey(pinNameIndexPath)), + dserv: dserv, + dstore: dstore, + } + + data, err := dstore.Get(dirtyKey) + if err != nil { + if err == ds.ErrNotFound { + return p, nil + } + return nil, fmt.Errorf("cannot load dirty flag: %v", err) + } + if data[0] == 1 { + p.dirty = 1 + + pins, err := p.loadAllPins(ctx) + if err != nil { + return nil, fmt.Errorf("cannot load pins: %v", err) + } + + err = p.rebuildIndexes(ctx, pins) + if err != nil { + return nil, fmt.Errorf("cannot rebuild indexes: %v", err) + } + } + + return p, nil +} + +// Pin the given node, optionally recursive +func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { + err := p.dserv.Add(ctx, node) + if err != nil { + return err + } + + c := node.Cid() + cidKey := c.KeyString() + + p.lock.Lock() + defer p.lock.Unlock() + + if recurse { + found, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if found { + return nil + } + + dirtyBefore := p.dirty + + // temporary unlock to fetch the entire graph + p.lock.Unlock() + // Fetch graph starting at node identified by cid + err = mdag.FetchGraph(ctx, c, p.dserv) + p.lock.Lock() + if err != nil { + return err + } + + // Only look again if something has changed. + if p.dirty != dirtyBefore { + found, err = p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if found { + return nil + } + } + + // TODO: remove this to support multiple pins per CID + found, err = p.cidDIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if found { + p.removePinsForCid(ctx, c, ipfspinner.Direct) + } + + _, err = p.addPin(ctx, c, ipfspinner.Recursive, "") + if err != nil { + return err + } + } else { + found, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if found { + return fmt.Errorf("%s already pinned recursively", c.String()) + } + + _, err = p.addPin(ctx, c, ipfspinner.Direct, "") + if err != nil { + return err + } + } + return nil +} + +func (p *pinner) addPin(ctx context.Context, c cid.Cid, mode ipfspinner.Mode, name string) (string, error) { + // Create new pin and store in datastore + pp := newPin(c, mode, name) + + // Serialize pin + pinData, err := encodePin(pp) + if err != nil { + return "", fmt.Errorf("could not encode pin: %v", err) + } + + p.setDirty(ctx, true) + + // Store CID index + switch mode { + case ipfspinner.Recursive: + err = p.cidRIndex.Add(ctx, c.KeyString(), pp.Id) + case ipfspinner.Direct: + err = p.cidDIndex.Add(ctx, c.KeyString(), pp.Id) + default: + panic("pin mode must be recursive or direct") + } + if err != nil { + return "", fmt.Errorf("could not add pin cid index: %v", err) + } + + if name != "" { + // Store name index + err = p.nameIndex.Add(ctx, name, pp.Id) + if err != nil { + return "", fmt.Errorf("could not add pin name index: %v", err) + } + } + + // Store the pin. Pin must be stored after index for recovery to work. + err = p.dstore.Put(pp.dsKey(), pinData) + if err != nil { + if mode == ipfspinner.Recursive { + p.cidRIndex.Delete(ctx, c.KeyString(), pp.Id) + } else { + p.cidDIndex.Delete(ctx, c.KeyString(), pp.Id) + } + if name != "" { + p.nameIndex.Delete(ctx, name, pp.Id) + } + return "", err + } + + return pp.Id, nil +} + +func (p *pinner) removePin(ctx context.Context, pp *pin) error { + p.setDirty(ctx, true) + + // Remove pin from datastore. Pin must be removed before index for + // recovery to work. + err := p.dstore.Delete(pp.dsKey()) + if err != nil { + return err + } + // Remove cid index from datastore + if pp.Mode == ipfspinner.Recursive { + err = p.cidRIndex.Delete(ctx, pp.Cid.KeyString(), pp.Id) + } else { + err = p.cidDIndex.Delete(ctx, pp.Cid.KeyString(), pp.Id) + } + if err != nil { + return err + } + + if pp.Name != "" { + // Remove name index from datastore + err = p.nameIndex.Delete(ctx, pp.Name, pp.Id) + if err != nil { + return err + } + } + + return nil +} + +// Unpin a given key +func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { + cidKey := c.KeyString() + + p.lock.Lock() + defer p.lock.Unlock() + + // TODO: use Ls() to lookup pins when new pinning API available + /* + matchSpec := map[string][]string { + "cid": []string{c.String} + } + matches := p.Ls(matchSpec) + */ + has, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + + if has { + if !recursive { + return fmt.Errorf("%s is pinned recursively", c.String()) + } + } else { + has, err = p.cidDIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if !has { + return ErrNotPinned + } + } + + _, err = p.removePinsForCid(ctx, c, ipfspinner.Any) + if err != nil { + return err + } + + return nil +} + +// IsPinned returns whether or not the given key is pinned +// and an explanation of why its pinned +func (p *pinner) IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) { + p.lock.RLock() + defer p.lock.RUnlock() + return p.isPinnedWithType(ctx, c, ipfspinner.Any) +} + +// IsPinnedWithType returns whether or not the given cid is pinned with the +// given pin type, as well as returning the type of pin its pinned with. +func (p *pinner) IsPinnedWithType(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) (string, bool, error) { + p.lock.RLock() + defer p.lock.RUnlock() + return p.isPinnedWithType(ctx, c, mode) +} + +func (p *pinner) isPinnedWithType(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) (string, bool, error) { + cidKey := c.KeyString() + switch mode { + case ipfspinner.Recursive: + has, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return "", false, err + } + if has { + return linkRecursive, true, nil + } + return "", false, nil + case ipfspinner.Direct: + has, err := p.cidDIndex.HasAny(ctx, cidKey) + if err != nil { + return "", false, err + } + if has { + return linkDirect, true, nil + } + return "", false, nil + case ipfspinner.Internal: + return "", false, nil + case ipfspinner.Indirect: + case ipfspinner.Any: + has, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return "", false, err + } + if has { + return linkRecursive, true, nil + } + has, err = p.cidDIndex.HasAny(ctx, cidKey) + if err != nil { + return "", false, err + } + if has { + return linkDirect, true, nil + } + default: + err := fmt.Errorf( + "invalid Pin Mode '%d', must be one of {%d, %d, %d, %d, %d}", + mode, ipfspinner.Direct, ipfspinner.Indirect, ipfspinner.Recursive, + ipfspinner.Internal, ipfspinner.Any) + return "", false, err + } + + // Default is Indirect + visitedSet := cid.NewSet() + + // No index for given CID, so search children of all recursive pinned CIDs + var has bool + var rc cid.Cid + var e error + err := p.cidRIndex.ForEach(ctx, "", func(key, value string) bool { + rc, e = cid.Cast([]byte(key)) + if e != nil { + return false + } + has, e = hasChild(ctx, p.dserv, rc, c, visitedSet.Visit) + if e != nil { + return false + } + if has { + return false + } + return true + }) + if err != nil { + return "", false, err + } + if e != nil { + return "", false, e + } + + if has { + return rc.String(), true, nil + } + + return "", false, nil +} + +// CheckIfPinned checks if a set of keys are pinned, more efficient than +// calling IsPinned for each key, returns the pinned status of cid(s) +// +// TODO: If a CID is pinned by multiple pins, should they all be reported? +func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinner.Pinned, error) { + pinned := make([]ipfspinner.Pinned, 0, len(cids)) + toCheck := cid.NewSet() + + p.lock.RLock() + defer p.lock.RUnlock() + + // First check for non-Indirect pins directly + for _, c := range cids { + cidKey := c.KeyString() + has, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return nil, err + } + if has { + pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Recursive}) + } else { + has, err = p.cidDIndex.HasAny(ctx, cidKey) + if err != nil { + return nil, err + } + if has { + pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Direct}) + } else { + toCheck.Add(c) + } + } + } + + // Now walk all recursive pins to check for indirect pins + var checkChildren func(cid.Cid, cid.Cid) error + checkChildren = func(rk, parentKey cid.Cid) error { + links, err := ipld.GetLinks(ctx, p.dserv, parentKey) + if err != nil { + return err + } + for _, lnk := range links { + c := lnk.Cid + + if toCheck.Has(c) { + pinned = append(pinned, + ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk}) + toCheck.Remove(c) + } + + err = checkChildren(rk, c) + if err != nil { + return err + } + + if toCheck.Len() == 0 { + return nil + } + } + return nil + } + + var e error + err := p.cidRIndex.ForEach(ctx, "", func(key, value string) bool { + var rk cid.Cid + rk, e = cid.Cast([]byte(key)) + if e != nil { + return false + } + e = checkChildren(rk, rk) + if e != nil { + return false + } + if toCheck.Len() == 0 { + return false + } + return true + }) + if err != nil { + return nil, err + } + if e != nil { + return nil, e + } + + // Anything left in toCheck is not pinned + for _, k := range toCheck.Keys() { + pinned = append(pinned, ipfspinner.Pinned{Key: k, Mode: ipfspinner.NotPinned}) + } + + return pinned, nil +} + +// RemovePinWithMode is for manually editing the pin structure. +// Use with care! If used improperly, garbage collection may not +// be successful. +func (p *pinner) RemovePinWithMode(c cid.Cid, mode ipfspinner.Mode) { + ctx := context.TODO() + // Check cache to see if CID is pinned + switch mode { + case ipfspinner.Direct, ipfspinner.Recursive: + default: + // programmer error, panic OK + panic("unrecognized pin type") + } + + p.lock.Lock() + defer p.lock.Unlock() + + p.removePinsForCid(ctx, c, mode) +} + +// removePinsForCid removes all pins for a cid that has the specified mode. +// Returns true if any pins, and all corresponding CID index entries, were +// removed. Otherwise, returns false. +func (p *pinner) removePinsForCid(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) (bool, error) { + // Search for pins by CID + var ids []string + var err error + cidKey := c.KeyString() + switch mode { + case ipfspinner.Recursive: + ids, err = p.cidRIndex.Search(ctx, cidKey) + case ipfspinner.Direct: + ids, err = p.cidDIndex.Search(ctx, cidKey) + case ipfspinner.Any: + ids, err = p.cidRIndex.Search(ctx, cidKey) + if err != nil { + return false, err + } + dIds, err := p.cidDIndex.Search(ctx, cidKey) + if err != nil { + return false, err + } + if len(dIds) != 0 { + ids = append(ids, dIds...) + } + } + if err != nil { + return false, err + } + + var removed bool + + // Remove the pin with the requested mode + for _, pid := range ids { + var pp *pin + pp, err = p.loadPin(ctx, pid) + if err != nil { + if err == ds.ErrNotFound { + p.setDirty(ctx, true) + // Fix index; remove index for pin that does not exist + switch mode { + case ipfspinner.Recursive: + p.cidRIndex.DeleteKey(ctx, cidKey) + case ipfspinner.Direct: + p.cidDIndex.DeleteKey(ctx, cidKey) + case ipfspinner.Any: + p.cidRIndex.DeleteKey(ctx, cidKey) + p.cidDIndex.DeleteKey(ctx, cidKey) + } + log.Error("found CID index with missing pin") + continue + } + return false, err + } + if mode == ipfspinner.Any || pp.Mode == mode { + err = p.removePin(ctx, pp) + if err != nil { + return false, err + } + removed = true + } + } + return removed, nil +} + +// loadPin loads a single pin from the datastore. +func (p *pinner) loadPin(ctx context.Context, pid string) (*pin, error) { + pinData, err := p.dstore.Get(ds.NewKey(path.Join(pinKeyPath, pid))) + if err != nil { + return nil, err + } + return decodePin(pid, pinData) +} + +// loadAllPins loads all pins from the datastore. +func (p *pinner) loadAllPins(ctx context.Context) ([]*pin, error) { + q := query.Query{ + Prefix: pinKeyPath, + } + results, err := p.dstore.Query(q) + if err != nil { + return nil, err + } + ents, err := results.Rest() + if err != nil { + return nil, err + } + if len(ents) == 0 { + return nil, nil + } + + pins := make([]*pin, len(ents)) + for i := range ents { + if ctx.Err() != nil { + return nil, ctx.Err() + } + var p *pin + p, err = decodePin(path.Base(ents[i].Key), ents[i].Value) + if err != nil { + return nil, err + } + pins[i] = p + } + return pins, nil +} + +// rebuildIndexes uses the stored pins to rebuild secondary indexes. This +// resolves any discrepancy between secondary indexes and pins that could +// result from a program termination between saving the two. +func (p *pinner) rebuildIndexes(ctx context.Context, pins []*pin) error { + // Build temporary in-memory CID index from pins + dstoreMem := ds.NewMapDatastore() + tmpCidDIndex := dsindex.New(dstoreMem, ds.NewKey(pinCidDIndexPath)) + tmpCidRIndex := dsindex.New(dstoreMem, ds.NewKey(pinCidRIndexPath)) + tmpNameIndex := dsindex.New(dstoreMem, ds.NewKey(pinNameIndexPath)) + var hasNames bool + for _, pp := range pins { + if ctx.Err() != nil { + return ctx.Err() + } + if pp.Mode == ipfspinner.Recursive { + tmpCidRIndex.Add(ctx, pp.Cid.KeyString(), pp.Id) + } else if pp.Mode == ipfspinner.Direct { + tmpCidDIndex.Add(ctx, pp.Cid.KeyString(), pp.Id) + } + if pp.Name != "" { + tmpNameIndex.Add(ctx, pp.Name, pp.Id) + hasNames = true + } + } + + // Sync the CID index to what was build from pins. This fixes any invalid + // indexes, which could happen if ipfs was terminated between writing pin + // and writing secondary index. + changed, err := dsindex.SyncIndex(ctx, tmpCidRIndex, p.cidRIndex) + if err != nil { + return fmt.Errorf("cannot sync indexes: %v", err) + } + if changed { + log.Info("invalid recursive indexes detected - rebuilt") + } + + changed, err = dsindex.SyncIndex(ctx, tmpCidDIndex, p.cidDIndex) + if err != nil { + return fmt.Errorf("cannot sync indexes: %v", err) + } + if changed { + log.Info("invalid direct indexes detected - rebuilt") + } + + if hasNames { + changed, err = dsindex.SyncIndex(ctx, tmpNameIndex, p.nameIndex) + if err != nil { + return fmt.Errorf("cannot sync name indexes: %v", err) + } + if changed { + log.Info("invalid name indexes detected - rebuilt") + } + } + + return p.Flush(ctx) +} + +// DirectKeys returns a slice containing the directly pinned keys +func (p *pinner) DirectKeys(ctx context.Context) ([]cid.Cid, error) { + p.lock.RLock() + defer p.lock.RUnlock() + + cidSet := cid.NewSet() + var e error + err := p.cidDIndex.ForEach(ctx, "", func(key, value string) bool { + var c cid.Cid + c, e = cid.Cast([]byte(key)) + if e != nil { + return false + } + cidSet.Add(c) + return true + }) + if err != nil { + return nil, err + } + if e != nil { + return nil, e + } + + return cidSet.Keys(), nil +} + +// RecursiveKeys returns a slice containing the recursively pinned keys +func (p *pinner) RecursiveKeys(ctx context.Context) ([]cid.Cid, error) { + p.lock.RLock() + defer p.lock.RUnlock() + + cidSet := cid.NewSet() + var e error + err := p.cidRIndex.ForEach(ctx, "", func(key, value string) bool { + var c cid.Cid + c, e = cid.Cast([]byte(key)) + if e != nil { + return false + } + cidSet.Add(c) + return true + }) + if err != nil { + return nil, err + } + if e != nil { + return nil, e + } + + return cidSet.Keys(), nil +} + +// InternalPins returns all cids kept pinned for the internal state of the +// pinner +func (p *pinner) InternalPins(ctx context.Context) ([]cid.Cid, error) { + return nil, nil +} + +// Update updates a recursive pin from one cid to another. This is equivalent +// to pinning the new one and unpinning the old one. +// +// TODO: This will not work when multiple pins are supported +func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error { + p.lock.Lock() + defer p.lock.Unlock() + + found, err := p.cidRIndex.HasAny(ctx, from.KeyString()) + if err != nil { + return err + } + if !found { + return errors.New("'from' cid was not recursively pinned already") + } + + // If `from` already recursively pinned and `to` is the same, then all done + if from == to { + return nil + } + + // Check if the `to` cid is already recursively pinned + found, err = p.cidRIndex.HasAny(ctx, to.KeyString()) + if err != nil { + return err + } + if found { + return errors.New("'to' cid was already recursively pinned") + } + + // Temporarily unlock while we fetch the differences. + p.lock.Unlock() + err = dagutils.DiffEnumerate(ctx, p.dserv, from, to) + p.lock.Lock() + + if err != nil { + return err + } + + _, err = p.addPin(ctx, to, ipfspinner.Recursive, "") + if err != nil { + return err + } + + if !unpin { + return nil + } + + _, err = p.removePinsForCid(ctx, from, ipfspinner.Recursive) + if err != nil { + return err + } + + return nil +} + +// Flush encodes and writes pinner keysets to the datastore +func (p *pinner) Flush(ctx context.Context) error { + p.lock.Lock() + defer p.lock.Unlock() + + if syncDServ, ok := p.dserv.(syncDAGService); ok { + if err := syncDServ.Sync(); err != nil { + return fmt.Errorf("cannot sync pinned data: %v", err) + } + } + + // Sync pins and indexes + if err := p.dstore.Sync(ds.NewKey(basePath)); err != nil { + return fmt.Errorf("cannot sync pin state: %v", err) + } + + p.setDirty(ctx, false) + + return nil +} + +// PinWithMode allows the user to have fine grained control over pin +// counts +func (p *pinner) PinWithMode(c cid.Cid, mode ipfspinner.Mode) { + ctx := context.TODO() + + p.lock.Lock() + defer p.lock.Unlock() + + // TODO: remove his to support multiple pins per CID + switch mode { + case ipfspinner.Recursive: + if has, _ := p.cidRIndex.HasAny(ctx, c.KeyString()); has { + return // already a recursive pin for this CID + } + case ipfspinner.Direct: + if has, _ := p.cidDIndex.HasAny(ctx, c.KeyString()); has { + return // already a direct pin for this CID + } + default: + panic("unrecognized pin mode") + } + + _, err := p.addPin(ctx, c, mode, "") + if err != nil { + return + } +} + +// hasChild recursively looks for a Cid among the children of a root Cid. +// The visit function can be used to shortcut already-visited branches. +func hasChild(ctx context.Context, ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Cid) bool) (bool, error) { + links, err := ipld.GetLinks(ctx, ng, root) + if err != nil { + return false, err + } + for _, lnk := range links { + c := lnk.Cid + if lnk.Cid.Equals(child) { + return true, nil + } + if visit(c) { + has, err := hasChild(ctx, ng, c, child, visit) + if err != nil { + return false, err + } + + if has { + return has, nil + } + } + } + return false, nil +} + +func encodePin(p *pin) ([]byte, error) { + b, err := cbor.MarshalAtlased(p, pinAtl) + if err != nil { + return nil, err + } + return b, nil +} + +func decodePin(pid string, data []byte) (*pin, error) { + p := &pin{Id: pid} + err := cbor.UnmarshalAtlased(cbor.DecodeOptions{}, data, p, pinAtl) + if err != nil { + return nil, err + } + return p, nil +} + +// setDirty saves a boolean dirty flag in the datastore whenever there is a +// transition between a dirty (counter > 0) and non-dirty (counter == 0) state. +func (p *pinner) setDirty(ctx context.Context, dirty bool) { + isClean := p.dirty == p.clean + if dirty { + p.dirty++ + if !isClean { + return // do not save; was already dirty + } + } else if isClean { + return // already clean + } else { + p.clean = p.dirty // set clean + } + + // Do edge-triggered write to datastore + data := []byte{0} + if dirty { + data[0] = 1 + } + p.dstore.Put(dirtyKey, data) + p.dstore.Sync(dirtyKey) +} diff --git a/pinning/pinner/dspinner/pin_test.go b/pinning/pinner/dspinner/pin_test.go new file mode 100644 index 0000000000..40e2c70cac --- /dev/null +++ b/pinning/pinner/dspinner/pin_test.go @@ -0,0 +1,1137 @@ +package dspinner + +import ( + "context" + "errors" + "fmt" + "io" + "testing" + "time" + + bs "github.com/ipfs/go-blockservice" + mdag "github.com/ipfs/go-merkledag" + + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + lds "github.com/ipfs/go-ds-leveldb" + blockstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" + ipfspin "github.com/ipfs/go-ipfs-pinner" + "github.com/ipfs/go-ipfs-pinner/ipldpinner" + util "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" +) + +var rand = util.NewTimeSeededRand() + +type fakeLogger struct { + logging.StandardLogger + lastError error +} + +func (f *fakeLogger) Error(args ...interface{}) { + f.lastError = errors.New(fmt.Sprint(args...)) +} + +func (f *fakeLogger) Errorf(format string, args ...interface{}) { + f.lastError = fmt.Errorf(format, args...) +} + +func randNode() (*mdag.ProtoNode, cid.Cid) { + nd := new(mdag.ProtoNode) + nd.SetData(make([]byte, 32)) + _, err := io.ReadFull(rand, nd.Data()) + if err != nil { + panic(err) + } + k := nd.Cid() + return nd, k +} + +func assertPinned(t *testing.T, p ipfspin.Pinner, c cid.Cid, failmsg string) { + _, pinned, err := p.IsPinned(context.Background(), c) + if err != nil { + t.Fatal(err) + } + + if !pinned { + t.Fatal(failmsg) + } +} + +func assertPinnedWithType(t *testing.T, p ipfspin.Pinner, c cid.Cid, mode ipfspin.Mode, failmsg string) { + modeText, pinned, err := p.IsPinnedWithType(context.Background(), c, mode) + if err != nil { + t.Fatal(err) + } + + expect, ok := ipfspin.ModeToString(mode) + if !ok { + t.Fatal("unrecognized pin mode") + } + + if !pinned { + t.Fatal(failmsg) + } + + if mode == ipfspin.Any { + return + } + + if expect != modeText { + t.Fatal("expected", expect, "pin, got", modeText) + } +} + +func assertUnpinned(t *testing.T, p ipfspin.Pinner, c cid.Cid, failmsg string) { + _, pinned, err := p.IsPinned(context.Background(), c) + if err != nil { + t.Fatal(err) + } + + if pinned { + t.Fatal(failmsg) + } +} + +func TestPinnerBasic(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + a, ak := randNode() + err = dserv.Add(ctx, a) + if err != nil { + t.Fatal(err) + } + + // Pin A{} + err = p.Pin(ctx, a, false) + if err != nil { + t.Fatal(err) + } + + assertPinned(t, p, ak, "Failed to find key") + assertPinnedWithType(t, p, ak, ipfspin.Direct, "Expected direct pin") + + // create new node c, to be indirectly pinned through b + c, _ := randNode() + err = dserv.Add(ctx, c) + if err != nil { + t.Fatal(err) + } + ck := c.Cid() + + // Create new node b, to be parent to a and c + b, _ := randNode() + err = b.AddNodeLink("child", a) + if err != nil { + t.Fatal(err) + } + err = b.AddNodeLink("otherchild", c) + if err != nil { + t.Fatal(err) + } + + err = dserv.Add(ctx, b) + if err != nil { + t.Fatal(err) + } + bk := b.Cid() + + // recursively pin B{A,C} + err = p.Pin(ctx, b, true) + if err != nil { + t.Fatal(err) + } + + assertPinned(t, p, ck, "child of recursively pinned node not found") + + assertPinned(t, p, bk, "Pinned node not found") + assertPinnedWithType(t, p, bk, ipfspin.Recursive, "Recursively pinned node not found") + + d, _ := randNode() + d.AddNodeLink("a", a) + d.AddNodeLink("c", c) + + e, _ := randNode() + d.AddNodeLink("e", e) + + // Must be in dagserv for unpin to work + err = dserv.Add(ctx, e) + if err != nil { + t.Fatal(err) + } + err = dserv.Add(ctx, d) + if err != nil { + t.Fatal(err) + } + + // Add D{A,C,E} + err = p.Pin(ctx, d, true) + if err != nil { + t.Fatal(err) + } + + dk := d.Cid() + assertPinned(t, p, dk, "pinned node not found.") + + cids, err := p.RecursiveKeys(ctx) + if err != nil { + t.Fatal(err) + } + if len(cids) != 2 { + t.Error("expected 2 recursive pins") + } + if !(bk == cids[0] || bk == cids[1]) { + t.Error("expected recursive pin of B") + } + if !(dk == cids[0] || dk == cids[1]) { + t.Error("expected recursive pin of D") + } + + pinned, err := p.CheckIfPinned(ctx, ak, bk, ck, dk) + if err != nil { + t.Fatal(err) + } + if len(pinned) != 4 { + t.Error("incorrect number of results") + } + for _, pn := range pinned { + switch pn.Key { + case ak: + if pn.Mode != ipfspin.Direct { + t.Error("A pinned with wrong mode") + } + case bk: + if pn.Mode != ipfspin.Recursive { + t.Error("B pinned with wrong mode") + } + case ck: + if pn.Mode != ipfspin.Indirect { + t.Error("C should be pinned indirectly") + } + if pn.Via != dk && pn.Via != bk { + t.Error("C should be pinned via D or B") + } + case dk: + if pn.Mode != ipfspin.Recursive { + t.Error("D pinned with wrong mode") + } + } + } + + cids, err = p.DirectKeys(ctx) + if err != nil { + t.Fatal(err) + } + if len(cids) != 1 { + t.Error("expected 1 direct pin") + } + if cids[0] != ak { + t.Error("wrong direct pin") + } + + cids, _ = p.InternalPins(ctx) + if len(cids) != 0 { + t.Error("shound not have internal keys") + } + + err = p.Unpin(ctx, dk, false) + if err == nil { + t.Fatal("expected error unpinning recursive pin without specifying recursive") + } + + // Test recursive unpin + err = p.Unpin(ctx, dk, true) + if err != nil { + t.Fatal(err) + } + + err = p.Unpin(ctx, dk, true) + if err != ErrNotPinned { + t.Fatal("expected error:", ErrNotPinned) + } + + err = p.Flush(ctx) + if err != nil { + t.Fatal(err) + } + + p, err = New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + // Test directly pinned + assertPinned(t, p, ak, "Could not find pinned node!") + + // Test recursively pinned + assertPinned(t, p, bk, "could not find recursively pinned node") + + // Remove the pin but not the index to simulate corruption + dsp := p.(*pinner) + ids, err := dsp.cidDIndex.Search(ctx, ak.KeyString()) + if err != nil { + t.Fatal(err) + } + if len(ids) == 0 { + t.Fatal("did not find pin for cid", ak.String()) + } + pp, err := dsp.loadPin(ctx, ids[0]) + if err != nil { + t.Fatal(err) + } + if pp.Mode != ipfspin.Direct { + t.Error("loaded pin has wrong mode") + } + if pp.Cid != ak { + t.Error("loaded pin has wrong cid") + } + err = dsp.dstore.Delete(pp.dsKey()) + if err != nil { + t.Fatal(err) + } + + realLog := log + fakeLog := &fakeLogger{} + fakeLog.StandardLogger = log + log = fakeLog + err = p.Pin(ctx, a, true) + if err != nil { + t.Fatal(err) + } + if fakeLog.lastError == nil { + t.Error("expected error to be logged") + } else if fakeLog.lastError.Error() != "found CID index with missing pin" { + t.Error("did not get expected log message") + } + + log = realLog +} + +func TestAddLoadPin(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + + ipfsPin, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + p := ipfsPin.(*pinner) + + a, ak := randNode() + dserv.Add(ctx, a) + + mode := ipfspin.Recursive + name := "my-pin" + pid, err := p.addPin(ctx, ak, mode, name) + if err != nil { + t.Fatal(err) + } + + // Load pin and check that data decoded correctly + pinData, err := p.loadPin(ctx, pid) + if err != nil { + t.Fatal(err) + } + if pinData.Mode != mode { + t.Error("worng pin mode") + } + if pinData.Cid != ak { + t.Error("wrong pin cid") + } + if pinData.Name != name { + t.Error("wrong pin name; expected", name, "got", pinData.Name) + } +} + +func TestRemovePinWithMode(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + a, ak := randNode() + dserv.Add(ctx, a) + + p.Pin(ctx, a, false) + + ok, err := p.(*pinner).removePinsForCid(ctx, ak, ipfspin.Recursive) + if err != nil { + t.Fatal(err) + } + if ok { + t.Error("pin should not have been removed") + } + + p.RemovePinWithMode(ak, ipfspin.Direct) + + assertUnpinned(t, p, ak, "pin was not removed") +} + +func TestIsPinnedLookup(t *testing.T) { + // Test that lookups work in pins which share + // the same branches. For that construct this tree: + // + // A5->A4->A3->A2->A1->A0 + // / / + // B------- / + // \ / + // C--------------- + // + // This ensures that IsPinned works for all objects both when they + // are pinned and once they have been unpinned. + aBranchLen := 6 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + + // Create new pinner. New will not load anything since there are + // no pins saved in the datastore yet. + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + aKeys, bk, ck, err := makeTree(ctx, aBranchLen, dserv, p) + if err != nil { + t.Fatal(err) + } + + assertPinned(t, p, aKeys[0], "A0 should be pinned") + assertPinned(t, p, aKeys[1], "A1 should be pinned") + assertPinned(t, p, ck, "C should be pinned") + assertPinned(t, p, bk, "B should be pinned") + + // Unpin A5 recursively + if err = p.Unpin(ctx, aKeys[5], true); err != nil { + t.Fatal(err) + } + + assertPinned(t, p, aKeys[0], "A0 should still be pinned through B") + assertUnpinned(t, p, aKeys[4], "A4 should be unpinned") + + // Unpin B recursively + if err = p.Unpin(ctx, bk, true); err != nil { + t.Fatal(err) + } + assertUnpinned(t, p, bk, "B should be unpinned") + assertUnpinned(t, p, aKeys[1], "A1 should be unpinned") + assertPinned(t, p, aKeys[0], "A0 should still be pinned through C") +} + +func TestDuplicateSemantics(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + a, _ := randNode() + err = dserv.Add(ctx, a) + if err != nil { + t.Fatal(err) + } + + // pin is recursively + err = p.Pin(ctx, a, true) + if err != nil { + t.Fatal(err) + } + + // pinning directly should fail + err = p.Pin(ctx, a, false) + if err == nil { + t.Fatal("expected direct pin to fail") + } + + // pinning recursively again should succeed + err = p.Pin(ctx, a, true) + if err != nil { + t.Fatal(err) + } +} + +func TestFlush(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + _, k := randNode() + + p.PinWithMode(k, ipfspin.Recursive) + if err = p.Flush(ctx); err != nil { + t.Fatal(err) + } + assertPinned(t, p, k, "expected key to still be pinned") +} + +func TestPinRecursiveFail(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + dserv := mdag.NewDAGService(bserv) + + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + a, _ := randNode() + b, _ := randNode() + err = a.AddNodeLink("child", b) + if err != nil { + t.Fatal(err) + } + + // NOTE: This isnt a time based test, we expect the pin to fail + mctx, cancel := context.WithTimeout(ctx, time.Millisecond) + defer cancel() + + err = p.Pin(mctx, a, true) + if err == nil { + t.Fatal("should have failed to pin here") + } + + err = dserv.Add(ctx, b) + if err != nil { + t.Fatal(err) + } + + err = dserv.Add(ctx, a) + if err != nil { + t.Fatal(err) + } + + // this one is time based... but shouldnt cause any issues + mctx, cancel = context.WithTimeout(ctx, time.Second) + defer cancel() + err = p.Pin(mctx, a, true) + if err != nil { + t.Fatal(err) + } +} + +func TestPinUpdate(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + + dserv := mdag.NewDAGService(bserv) + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + n1, c1 := randNode() + n2, c2 := randNode() + _, c3 := randNode() + + if err = dserv.Add(ctx, n1); err != nil { + t.Fatal(err) + } + if err = dserv.Add(ctx, n2); err != nil { + t.Fatal(err) + } + + if err = p.Pin(ctx, n1, true); err != nil { + t.Fatal(err) + } + + if err = p.Update(ctx, c1, c2, true); err != nil { + t.Fatal(err) + } + + assertPinned(t, p, c2, "c2 should be pinned now") + assertUnpinned(t, p, c1, "c1 should no longer be pinned") + + if err = p.Update(ctx, c2, c1, false); err != nil { + t.Fatal(err) + } + + // Test updating same pin that is already pinned. + if err = p.Update(ctx, c2, c2, true); err != nil { + t.Fatal(err) + } + // Check that pin is still pinned. + _, ok, err := p.IsPinned(ctx, c2) + if err != nil { + t.Fatal(err) + } + if !ok { + t.Fatal("c2 should still be pinned") + } + + // Test updating same pin that is not pinned. + if err = p.Update(ctx, c3, c3, false); err == nil { + t.Fatal("expected error updating unpinned cid") + } + _, ok, err = p.IsPinned(ctx, c3) + if err != nil { + t.Fatal(err) + } + if ok { + t.Fatal("c3 should not be pinned") + } + + assertPinned(t, p, c2, "c2 should be pinned still") + assertPinned(t, p, c1, "c1 should be pinned now") +} + +func TestLoadDirty(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + dserv := mdag.NewDAGService(bserv) + + p, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + a, ak := randNode() + err = dserv.Add(ctx, a) + if err != nil { + t.Fatal(err) + } + + _, bk := randNode() + + err = p.Pin(ctx, a, true) + if err != nil { + t.Fatal(err) + } + + cidAKey := ak.KeyString() + cidBKey := bk.KeyString() + + // Corrupt index + cidRIndex := p.(*pinner).cidRIndex + cidRIndex.DeleteKey(ctx, cidAKey) + cidRIndex.Add(ctx, cidBKey, "not-a-pin-id") + + // Verify dirty + data, err := dstore.Get(dirtyKey) + if err != nil { + t.Fatalf("could not read dirty flag: %v", err) + } + if data[0] != 1 { + t.Fatal("dirty flag not set") + } + + has, err := cidRIndex.HasAny(ctx, cidAKey) + if err != nil { + t.Fatal(err) + } + if has { + t.Fatal("index should be deleted") + } + + // Create new pinner on same datastore that was never flushed. + p, err = New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + // Verify not dirty + data, err = dstore.Get(dirtyKey) + if err != nil { + t.Fatalf("could not read dirty flag: %v", err) + } + if data[0] != 0 { + t.Fatal("dirty flag is set") + } + + // Verify index rebuilt + cidRIndex = p.(*pinner).cidRIndex + has, err = cidRIndex.HasAny(ctx, cidAKey) + if err != nil { + t.Fatal(err) + } + if !has { + t.Fatal("index should have been rebuilt") + } + + has, err = cidRIndex.HasAny(ctx, cidBKey) + if err != nil { + t.Fatal(err) + } + if has { + t.Fatal("index should have been removed by rebuild") + } +} + +func TestEncodeDecodePin(t *testing.T) { + _, c := randNode() + + pin := newPin(c, ipfspin.Recursive, "testpin") + pin.Metadata = make(map[string]interface{}, 2) + pin.Metadata["hello"] = "world" + pin.Metadata["foo"] = "bar" + + encBytes, err := encodePin(pin) + if err != nil { + t.Fatal(err) + } + + decPin, err := decodePin(pin.Id, encBytes) + if err != nil { + t.Fatal(err) + } + + if decPin.Id != pin.Id { + t.Errorf("wrong pin id: expect %q got %q", pin.Id, decPin.Id) + } + if decPin.Cid != pin.Cid { + t.Errorf("wrong pin cid: expect %q got %q", pin.Cid.String(), decPin.Cid.String()) + } + if decPin.Mode != pin.Mode { + expect, _ := ipfspin.ModeToString(pin.Mode) + got, _ := ipfspin.ModeToString(decPin.Mode) + t.Errorf("wrong pin mode: expect %s got %s", expect, got) + } + if decPin.Name != pin.Name { + t.Errorf("wrong pin name: expect %q got %q", pin.Name, decPin.Name) + } + for key, val := range pin.Metadata { + dval, ok := decPin.Metadata[key] + if !ok { + t.Errorf("decoded pin missing metadata key %q", key) + } + if dval != val { + t.Errorf("wrong metadata value: expected %q got %q", val, dval) + } + } +} + +func makeTree(ctx context.Context, aBranchLen int, dserv ipld.DAGService, p ipfspin.Pinner) (aKeys []cid.Cid, bk cid.Cid, ck cid.Cid, err error) { + if aBranchLen < 3 { + err = errors.New("set aBranchLen to at least 3") + return + } + + aNodes := make([]*mdag.ProtoNode, aBranchLen) + aKeys = make([]cid.Cid, aBranchLen) + for i := 0; i < aBranchLen; i++ { + a, _ := randNode() + if i >= 1 { + if err = a.AddNodeLink("child", aNodes[i-1]); err != nil { + return + } + } + + if err = dserv.Add(ctx, a); err != nil { + return + } + aNodes[i] = a + aKeys[i] = a.Cid() + } + + // Pin last A recursively + if err = p.Pin(ctx, aNodes[aBranchLen-1], true); err != nil { + return + } + + // Create node B and add A3 as child + b, _ := randNode() + if err = b.AddNodeLink("mychild", aNodes[3]); err != nil { + return + } + + // Create C node + c, _ := randNode() + // Add A0 as child of C + if err = c.AddNodeLink("child", aNodes[0]); err != nil { + return + } + + // Add C + if err = dserv.Add(ctx, c); err != nil { + return + } + ck = c.Cid() + + // Add C to B and Add B + if err = b.AddNodeLink("myotherchild", c); err != nil { + return + } + if err = dserv.Add(ctx, b); err != nil { + return + } + bk = b.Cid() + + // Pin C recursively + if err = p.Pin(ctx, c, true); err != nil { + return + } + + // Pin B recursively + if err = p.Pin(ctx, b, true); err != nil { + return + } + + if err = p.Flush(ctx); err != nil { + return + } + + return +} + +func makeNodes(count int, dserv ipld.DAGService) []ipld.Node { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nodes := make([]ipld.Node, count) + for i := 0; i < count; i++ { + n, _ := randNode() + err := dserv.Add(ctx, n) + if err != nil { + panic(err) + } + nodes[i] = n + } + return nodes +} + +func pinNodes(nodes []ipld.Node, p ipfspin.Pinner, recursive bool) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + var err error + + for i := range nodes { + err = p.Pin(ctx, nodes[i], recursive) + if err != nil { + panic(err) + } + } + err = p.Flush(ctx) + if err != nil { + panic(err) + } +} + +func unpinNodes(nodes []ipld.Node, p ipfspin.Pinner) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + var err error + + for i := range nodes { + err = p.Unpin(ctx, nodes[i].Cid(), true) + if err != nil { + panic(err) + } + } + err = p.Flush(ctx) + if err != nil { + panic(err) + } +} + +type batchWrap struct { + ds.Datastore +} + +func (d *batchWrap) Batch() (ds.Batch, error) { + return ds.NewBasicBatch(d), nil +} + +func makeStore() (ds.Datastore, ipld.DAGService) { + ldstore, err := lds.NewDatastore("", nil) + if err != nil { + panic(err) + } + var dstore ds.Batching + dstore = &batchWrap{ldstore} + + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + dserv := mdag.NewDAGService(bserv) + return dstore, dserv +} + +// BenchmarkLoadRebuild loads a pinner that has some number of saved pins, and +// compares the load time when rebuilding indexes to loading without rebuilding +// indexes. +func BenchmarkLoadRebuild(b *testing.B) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore, dserv := makeStore() + pinner, err := New(ctx, dstore, dserv) + if err != nil { + panic(err.Error()) + } + + nodes := makeNodes(4096, dserv) + pinNodes(nodes, pinner, true) + + b.Run("RebuildTrue", func(b *testing.B) { + for i := 0; i < b.N; i++ { + dstore.Put(dirtyKey, []byte{1}) + + _, err = New(ctx, dstore, dserv) + if err != nil { + panic(err.Error()) + } + } + }) + + b.Run("RebuildFalse", func(b *testing.B) { + for i := 0; i < b.N; i++ { + dstore.Put(dirtyKey, []byte{0}) + + _, err = New(ctx, dstore, dserv) + if err != nil { + panic(err.Error()) + } + } + }) +} + +// BenchmarkNthPins shows the time it takes to create/save 1 pin when a number +// of other pins already exist. Each run in the series shows performance for +// creating a pin in a larger number of existing pins. +func BenchmarkNthPin(b *testing.B) { + dstore, dserv := makeStore() + pinner, err := New(context.Background(), dstore, dserv) + if err != nil { + panic(err.Error()) + } + pinnerIPLD, err := ipldpinner.New(dstore, dserv, dserv) + if err != nil { + panic(err.Error()) + } + + for count := 1000; count <= 10000; count += 1000 { + b.Run(fmt.Sprint("PinDS-", count), func(b *testing.B) { + benchmarkNthPin(b, count, pinner, dserv) + }) + + b.Run(fmt.Sprint("PinIPLD-", count), func(b *testing.B) { + benchmarkNthPin(b, count, pinnerIPLD, dserv) + }) + } +} + +func benchmarkNthPin(b *testing.B, count int, pinner ipfspin.Pinner, dserv ipld.DAGService) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nodes := makeNodes(count, dserv) + pinNodes(nodes[:count-1], pinner, true) + b.ResetTimer() + + which := count - 1 + for i := 0; i < b.N; i++ { + // Pin the Nth node and Flush + err := pinner.Pin(ctx, nodes[which], true) + if err != nil { + panic(err) + } + err = pinner.Flush(ctx) + if err != nil { + panic(err) + } + // Unpin the nodes so that it can pinned next iter. + b.StopTimer() + err = pinner.Unpin(ctx, nodes[which].Cid(), true) + if err != nil { + panic(err) + } + err = pinner.Flush(ctx) + if err != nil { + panic(err) + } + b.StartTimer() + } +} + +// BenchmarkNPins demonstrates creating individual pins. Each run in the +// series shows performance for a larger number of individual pins. +func BenchmarkNPins(b *testing.B) { + for count := 128; count < 16386; count <<= 1 { + b.Run(fmt.Sprint("PinDS-", count), func(b *testing.B) { + dstore, dserv := makeStore() + pinner, err := New(context.Background(), dstore, dserv) + if err != nil { + panic(err.Error()) + } + benchmarkNPins(b, count, pinner, dserv) + }) + + b.Run(fmt.Sprint("PinIPLD-", count), func(b *testing.B) { + dstore, dserv := makeStore() + pinner, err := ipldpinner.New(dstore, dserv, dserv) + if err != nil { + panic(err.Error()) + } + benchmarkNPins(b, count, pinner, dserv) + }) + } +} + +func benchmarkNPins(b *testing.B, count int, pinner ipfspin.Pinner, dserv ipld.DAGService) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nodes := makeNodes(count, dserv) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + // Pin all the nodes one at a time. + for j := range nodes { + err := pinner.Pin(ctx, nodes[j], true) + if err != nil { + panic(err) + } + err = pinner.Flush(ctx) + if err != nil { + panic(err) + } + } + + // Unpin all nodes so that they can be pinned next iter. + b.StopTimer() + unpinNodes(nodes, pinner) + b.StartTimer() + } +} + +// BenchmarkNUnpins demonstrates unpinning individual pins. Each run in the +// series shows performance for a larger number of individual unpins. +func BenchmarkNUnpins(b *testing.B) { + for count := 128; count < 16386; count <<= 1 { + b.Run(fmt.Sprint("UnpinDS-", count), func(b *testing.B) { + dstore, dserv := makeStore() + pinner, err := New(context.Background(), dstore, dserv) + if err != nil { + panic(err.Error()) + } + benchmarkNUnpins(b, count, pinner, dserv) + }) + + b.Run(fmt.Sprint("UninIPLD-", count), func(b *testing.B) { + dstore, dserv := makeStore() + pinner, err := ipldpinner.New(dstore, dserv, dserv) + if err != nil { + panic(err.Error()) + } + benchmarkNUnpins(b, count, pinner, dserv) + }) + } +} + +func benchmarkNUnpins(b *testing.B, count int, pinner ipfspin.Pinner, dserv ipld.DAGService) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + nodes := makeNodes(count, dserv) + pinNodes(nodes, pinner, true) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for j := range nodes { + // Unpin nodes one at a time. + err := pinner.Unpin(ctx, nodes[j].Cid(), true) + if err != nil { + panic(err) + } + err = pinner.Flush(ctx) + if err != nil { + panic(err) + } + } + // Pin all nodes so that they can be unpinned next iter. + b.StopTimer() + pinNodes(nodes, pinner, true) + b.StartTimer() + } +} + +// BenchmarkPinAllSeries shows times to pin all nodes with only one Flush at +// the end. +func BenchmarkPinAll(b *testing.B) { + for count := 128; count < 16386; count <<= 1 { + b.Run(fmt.Sprint("PinAllDS-", count), func(b *testing.B) { + dstore, dserv := makeStore() + pinner, err := New(context.Background(), dstore, dserv) + if err != nil { + panic(err) + } + benchmarkPinAll(b, count, pinner, dserv) + }) + + b.Run(fmt.Sprint("PinAllIPLD-", count), func(b *testing.B) { + dstore, dserv := makeStore() + pinner, err := ipldpinner.New(dstore, dserv, dserv) + if err != nil { + panic(err.Error()) + } + benchmarkPinAll(b, count, pinner, dserv) + }) + } +} + +func benchmarkPinAll(b *testing.B, count int, pinner ipfspin.Pinner, dserv ipld.DAGService) { + nodes := makeNodes(count, dserv) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + pinNodes(nodes, pinner, true) + + b.StopTimer() + unpinNodes(nodes, pinner) + b.StartTimer() + } +} diff --git a/pinning/pinner/ipldpinner/pin.go b/pinning/pinner/ipldpinner/pin.go new file mode 100644 index 0000000000..d0824b349b --- /dev/null +++ b/pinning/pinner/ipldpinner/pin.go @@ -0,0 +1,528 @@ +// Package ipldpinner implements structures and methods to keep track of +// which objects a user wants to keep stored locally. This implementation +// stores pin information in a mdag structure. +package ipldpinner + +import ( + "context" + "fmt" + "os" + "sync" + "time" + + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" + mdag "github.com/ipfs/go-merkledag" + "github.com/ipfs/go-merkledag/dagutils" + + ipfspinner "github.com/ipfs/go-ipfs-pinner" +) + +const loadTimeout = 5 * time.Second + +var log = logging.Logger("pin") + +var pinDatastoreKey = ds.NewKey("/local/pins") + +var emptyKey cid.Cid + +var linkDirect, linkRecursive, linkInternal string + +func init() { + e, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") + if err != nil { + log.Error("failed to decode empty key constant") + os.Exit(1) + } + emptyKey = e + + directStr, ok := ipfspinner.ModeToString(ipfspinner.Direct) + if !ok { + panic("could not find Direct pin enum") + } + linkDirect = directStr + + recursiveStr, ok := ipfspinner.ModeToString(ipfspinner.Recursive) + if !ok { + panic("could not find Recursive pin enum") + } + linkRecursive = recursiveStr + + internalStr, ok := ipfspinner.ModeToString(ipfspinner.Internal) + if !ok { + panic("could not find Internal pin enum") + } + linkInternal = internalStr +} + +// pinner implements the Pinner interface +type pinner struct { + lock sync.RWMutex + recursePin *cid.Set + directPin *cid.Set + + // Track the keys used for storing the pinning state, so gc does + // not delete them. + internalPin *cid.Set + dserv ipld.DAGService + internal ipld.DAGService // dagservice used to store internal objects + dstore ds.Datastore +} + +var _ ipfspinner.Pinner = (*pinner)(nil) + +type syncDAGService interface { + ipld.DAGService + Sync() error +} + +// New creates a new pinner using the given datastore as a backend, and loads +// the pinner's keysets from the datastore +func New(dstore ds.Datastore, dserv, internal ipld.DAGService) (*pinner, error) { + rootKey, err := dstore.Get(pinDatastoreKey) + if err != nil { + if err == ds.ErrNotFound { + return &pinner{ + recursePin: cid.NewSet(), + directPin: cid.NewSet(), + internalPin: cid.NewSet(), + dserv: dserv, + internal: internal, + dstore: dstore, + }, nil + } + return nil, err + } + rootCid, err := cid.Cast(rootKey) + if err != nil { + return nil, err + } + + ctx, cancel := context.WithTimeout(context.TODO(), loadTimeout) + defer cancel() + + root, err := internal.Get(ctx, rootCid) + if err != nil { + return nil, fmt.Errorf("cannot find pinning root object: %v", err) + } + + rootpb, ok := root.(*mdag.ProtoNode) + if !ok { + return nil, mdag.ErrNotProtobuf + } + + internalset := cid.NewSet() + internalset.Add(rootCid) + recordInternal := internalset.Add + + // load recursive set + recurseKeys, err := loadSet(ctx, internal, rootpb, linkRecursive, recordInternal) + if err != nil { + return nil, fmt.Errorf("cannot load recursive pins: %v", err) + } + + // load direct set + directKeys, err := loadSet(ctx, internal, rootpb, linkDirect, recordInternal) + if err != nil { + return nil, fmt.Errorf("cannot load direct pins: %v", err) + } + + return &pinner{ + // assign pinsets + recursePin: cidSetWithValues(recurseKeys), + directPin: cidSetWithValues(directKeys), + internalPin: internalset, + // assign services + dserv: dserv, + dstore: dstore, + internal: internal, + }, nil +} + +// Pin the given node, optionally recursive +func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { + err := p.dserv.Add(ctx, node) + if err != nil { + return err + } + + c := node.Cid() + + p.lock.Lock() + defer p.lock.Unlock() + + if recurse { + if p.recursePin.Has(c) { + return nil + } + + p.lock.Unlock() + // temporary unlock to fetch the entire graph + err := mdag.FetchGraph(ctx, c, p.dserv) + p.lock.Lock() + if err != nil { + return err + } + + if p.recursePin.Has(c) { + return nil + } + + if p.directPin.Has(c) { + p.directPin.Remove(c) + } + + p.recursePin.Add(c) + } else { + if p.recursePin.Has(c) { + return fmt.Errorf("%s already pinned recursively", c.String()) + } + + p.directPin.Add(c) + } + return nil +} + +// ErrNotPinned is returned when trying to unpin items which are not pinned. +var ErrNotPinned = fmt.Errorf("not pinned or pinned indirectly") + +// Unpin a given key +func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { + p.lock.Lock() + defer p.lock.Unlock() + if p.recursePin.Has(c) { + if !recursive { + return fmt.Errorf("%s is pinned recursively", c) + } + p.recursePin.Remove(c) + return nil + } + if p.directPin.Has(c) { + p.directPin.Remove(c) + return nil + } + return ErrNotPinned +} + +func (p *pinner) isInternalPin(c cid.Cid) bool { + return p.internalPin.Has(c) +} + +// IsPinned returns whether or not the given key is pinned +// and an explanation of why its pinned +func (p *pinner) IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) { + p.lock.RLock() + defer p.lock.RUnlock() + return p.isPinnedWithType(ctx, c, ipfspinner.Any) +} + +// IsPinnedWithType returns whether or not the given cid is pinned with the +// given pin type, as well as returning the type of pin its pinned with. +func (p *pinner) IsPinnedWithType(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) (string, bool, error) { + p.lock.RLock() + defer p.lock.RUnlock() + return p.isPinnedWithType(ctx, c, mode) +} + +// isPinnedWithType is the implementation of IsPinnedWithType that does not lock. +// intended for use by other pinned methods that already take locks +func (p *pinner) isPinnedWithType(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) (string, bool, error) { + switch mode { + case ipfspinner.Any, ipfspinner.Direct, ipfspinner.Indirect, ipfspinner.Recursive, ipfspinner.Internal: + default: + err := fmt.Errorf("invalid Pin Mode '%d', must be one of {%d, %d, %d, %d, %d}", + mode, ipfspinner.Direct, ipfspinner.Indirect, ipfspinner.Recursive, ipfspinner.Internal, ipfspinner.Any) + return "", false, err + } + if (mode == ipfspinner.Recursive || mode == ipfspinner.Any) && p.recursePin.Has(c) { + return linkRecursive, true, nil + } + if mode == ipfspinner.Recursive { + return "", false, nil + } + + if (mode == ipfspinner.Direct || mode == ipfspinner.Any) && p.directPin.Has(c) { + return linkDirect, true, nil + } + if mode == ipfspinner.Direct { + return "", false, nil + } + + if (mode == ipfspinner.Internal || mode == ipfspinner.Any) && p.isInternalPin(c) { + return linkInternal, true, nil + } + if mode == ipfspinner.Internal { + return "", false, nil + } + + // Default is Indirect + visitedSet := cid.NewSet() + for _, rc := range p.recursePin.Keys() { + has, err := hasChild(ctx, p.dserv, rc, c, visitedSet.Visit) + if err != nil { + return "", false, err + } + if has { + return rc.String(), true, nil + } + } + return "", false, nil +} + +// CheckIfPinned Checks if a set of keys are pinned, more efficient than +// calling IsPinned for each key, returns the pinned status of cid(s) +func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinner.Pinned, error) { + p.lock.RLock() + defer p.lock.RUnlock() + pinned := make([]ipfspinner.Pinned, 0, len(cids)) + toCheck := cid.NewSet() + + // First check for non-Indirect pins directly + for _, c := range cids { + if p.recursePin.Has(c) { + pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Recursive}) + } else if p.directPin.Has(c) { + pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Direct}) + } else if p.isInternalPin(c) { + pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Internal}) + } else { + toCheck.Add(c) + } + } + + // Now walk all recursive pins to check for indirect pins + var checkChildren func(cid.Cid, cid.Cid) error + checkChildren = func(rk, parentKey cid.Cid) error { + links, err := ipld.GetLinks(ctx, p.dserv, parentKey) + if err != nil { + return err + } + for _, lnk := range links { + c := lnk.Cid + + if toCheck.Has(c) { + pinned = append(pinned, + ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk}) + toCheck.Remove(c) + } + + err := checkChildren(rk, c) + if err != nil { + return err + } + + if toCheck.Len() == 0 { + return nil + } + } + return nil + } + + for _, rk := range p.recursePin.Keys() { + err := checkChildren(rk, rk) + if err != nil { + return nil, err + } + if toCheck.Len() == 0 { + break + } + } + + // Anything left in toCheck is not pinned + for _, k := range toCheck.Keys() { + pinned = append(pinned, ipfspinner.Pinned{Key: k, Mode: ipfspinner.NotPinned}) + } + + return pinned, nil +} + +// RemovePinWithMode is for manually editing the pin structure. +// Use with care! If used improperly, garbage collection may not +// be successful. +func (p *pinner) RemovePinWithMode(c cid.Cid, mode ipfspinner.Mode) { + p.lock.Lock() + defer p.lock.Unlock() + switch mode { + case ipfspinner.Direct: + p.directPin.Remove(c) + case ipfspinner.Recursive: + p.recursePin.Remove(c) + default: + // programmer error, panic OK + panic("unrecognized pin type") + } +} + +func cidSetWithValues(cids []cid.Cid) *cid.Set { + out := cid.NewSet() + for _, c := range cids { + out.Add(c) + } + return out +} + +// DirectKeys returns a slice containing the directly pinned keys +func (p *pinner) DirectKeys(ctx context.Context) ([]cid.Cid, error) { + p.lock.RLock() + defer p.lock.RUnlock() + + return p.directPin.Keys(), nil +} + +// RecursiveKeys returns a slice containing the recursively pinned keys +func (p *pinner) RecursiveKeys(ctx context.Context) ([]cid.Cid, error) { + p.lock.RLock() + defer p.lock.RUnlock() + + return p.recursePin.Keys(), nil +} + +// Update updates a recursive pin from one cid to another +// this is more efficient than simply pinning the new one and unpinning the +// old one +func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error { + if from == to { + // Nothing to do. Don't remove this check or we'll end up + // _removing_ the pin. + // + // See #6648 + return nil + } + + p.lock.Lock() + defer p.lock.Unlock() + + if !p.recursePin.Has(from) { + return fmt.Errorf("'from' cid was not recursively pinned already") + } + + // Temporarily unlock while we fetch the differences. + p.lock.Unlock() + err := dagutils.DiffEnumerate(ctx, p.dserv, from, to) + p.lock.Lock() + + if err != nil { + return err + } + + p.recursePin.Add(to) + if unpin { + p.recursePin.Remove(from) + } + return nil +} + +// Flush encodes and writes pinner keysets to the datastore +func (p *pinner) Flush(ctx context.Context) error { + p.lock.Lock() + defer p.lock.Unlock() + + internalset := cid.NewSet() + recordInternal := internalset.Add + + root := &mdag.ProtoNode{} + { + n, err := storeSet(ctx, p.internal, p.directPin.Keys(), recordInternal) + if err != nil { + return err + } + if err := root.AddNodeLink(linkDirect, n); err != nil { + return err + } + } + + { + n, err := storeSet(ctx, p.internal, p.recursePin.Keys(), recordInternal) + if err != nil { + return err + } + if err := root.AddNodeLink(linkRecursive, n); err != nil { + return err + } + } + + // add the empty node, its referenced by the pin sets but never created + err := p.internal.Add(ctx, new(mdag.ProtoNode)) + if err != nil { + return err + } + + err = p.internal.Add(ctx, root) + if err != nil { + return err + } + + k := root.Cid() + + internalset.Add(k) + + if syncDServ, ok := p.dserv.(syncDAGService); ok { + if err := syncDServ.Sync(); err != nil { + return fmt.Errorf("cannot sync pinned data: %v", err) + } + } + + if syncInternal, ok := p.internal.(syncDAGService); ok { + if err := syncInternal.Sync(); err != nil { + return fmt.Errorf("cannot sync pinning data: %v", err) + } + } + + if err := p.dstore.Put(pinDatastoreKey, k.Bytes()); err != nil { + return fmt.Errorf("cannot store pin state: %v", err) + } + if err := p.dstore.Sync(pinDatastoreKey); err != nil { + return fmt.Errorf("cannot sync pin state: %v", err) + } + p.internalPin = internalset + return nil +} + +// InternalPins returns all cids kept pinned for the internal state of the +// pinner +func (p *pinner) InternalPins(ctx context.Context) ([]cid.Cid, error) { + p.lock.Lock() + defer p.lock.Unlock() + return p.internalPin.Keys(), nil +} + +// PinWithMode allows the user to have fine grained control over pin +// counts +func (p *pinner) PinWithMode(c cid.Cid, mode ipfspinner.Mode) { + p.lock.Lock() + defer p.lock.Unlock() + switch mode { + case ipfspinner.Recursive: + p.recursePin.Add(c) + case ipfspinner.Direct: + p.directPin.Add(c) + } +} + +// hasChild recursively looks for a Cid among the children of a root Cid. +// The visit function can be used to shortcut already-visited branches. +func hasChild(ctx context.Context, ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Cid) bool) (bool, error) { + links, err := ipld.GetLinks(ctx, ng, root) + if err != nil { + return false, err + } + for _, lnk := range links { + c := lnk.Cid + if lnk.Cid.Equals(child) { + return true, nil + } + if visit(c) { + has, err := hasChild(ctx, ng, c, child, visit) + if err != nil { + return false, err + } + + if has { + return has, nil + } + } + } + return false, nil +} diff --git a/pinning/pinner/pin_test.go b/pinning/pinner/ipldpinner/pin_test.go similarity index 90% rename from pinning/pinner/pin_test.go rename to pinning/pinner/ipldpinner/pin_test.go index e477ac07fe..e193aa96c3 100644 --- a/pinning/pinner/pin_test.go +++ b/pinning/pinner/ipldpinner/pin_test.go @@ -1,4 +1,4 @@ -package pin +package ipldpinner import ( "context" @@ -14,6 +14,7 @@ import ( dssync "github.com/ipfs/go-datastore/sync" blockstore "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" + pin "github.com/ipfs/go-ipfs-pinner" util "github.com/ipfs/go-ipfs-util" ) @@ -30,7 +31,7 @@ func randNode() (*mdag.ProtoNode, cid.Cid) { return nd, k } -func assertPinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { +func assertPinned(t *testing.T, p pin.Pinner, c cid.Cid, failmsg string) { _, pinned, err := p.IsPinned(context.Background(), c) if err != nil { t.Fatal(err) @@ -41,7 +42,7 @@ func assertPinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { } } -func assertUnpinned(t *testing.T, p Pinner, c cid.Cid, failmsg string) { +func assertUnpinned(t *testing.T, p pin.Pinner, c cid.Cid, failmsg string) { _, pinned, err := p.IsPinned(context.Background(), c) if err != nil { t.Fatal(err) @@ -62,10 +63,13 @@ func TestPinnerBasic(t *testing.T) { dserv := mdag.NewDAGService(bserv) // TODO does pinner need to share datastore with blockservice? - p := NewPinner(dstore, dserv, dserv) + p, err := New(dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } a, ak := randNode() - err := dserv.Add(ctx, a) + err = dserv.Add(ctx, a) if err != nil { t.Fatal(err) } @@ -151,7 +155,7 @@ func TestPinnerBasic(t *testing.T) { t.Fatal(err) } - np, err := LoadPinner(dstore, dserv, dserv) + np, err := New(dstore, dserv, dserv) if err != nil { t.Fatal(err) } @@ -188,7 +192,10 @@ func TestIsPinnedLookup(t *testing.T) { dserv := mdag.NewDAGService(bserv) // TODO does pinner need to share datastore with blockservice? - p := NewPinner(dstore, dserv, dserv) + p, err := New(dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } aNodes := make([]*mdag.ProtoNode, aBranchLen) aKeys := make([]cid.Cid, aBranchLen) @@ -229,7 +236,7 @@ func TestIsPinnedLookup(t *testing.T) { } // Add C - err := dserv.Add(ctx, c) + err = dserv.Add(ctx, c) if err != nil { t.Fatal(err) } @@ -289,11 +296,13 @@ func TestDuplicateSemantics(t *testing.T) { dserv := mdag.NewDAGService(bserv) - // TODO does pinner need to share datastore with blockservice? - p := NewPinner(dstore, dserv, dserv) + p, err := New(dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } a, _ := randNode() - err := dserv.Add(ctx, a) + err = dserv.Add(ctx, a) if err != nil { t.Fatal(err) } @@ -323,10 +332,13 @@ func TestFlush(t *testing.T) { bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - p := NewPinner(dstore, dserv, dserv) + p, err := New(dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } _, k := randNode() - p.PinWithMode(k, Recursive) + p.PinWithMode(k, pin.Recursive) if err := p.Flush(context.Background()); err != nil { t.Fatal(err) } @@ -340,11 +352,14 @@ func TestPinRecursiveFail(t *testing.T) { bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - p := NewPinner(dstore, dserv, dserv) + p, err := New(dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } a, _ := randNode() b, _ := randNode() - err := a.AddNodeLink("child", b) + err = a.AddNodeLink("child", b) if err != nil { t.Fatal(err) } @@ -385,7 +400,10 @@ func TestPinUpdate(t *testing.T) { bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) - p := NewPinner(dstore, dserv, dserv) + p, err := New(dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } n1, c1 := randNode() n2, c2 := randNode() diff --git a/pinning/pinner/set.go b/pinning/pinner/ipldpinner/set.go similarity index 94% rename from pinning/pinner/set.go rename to pinning/pinner/ipldpinner/set.go index ca437974ff..2fb931f93b 100644 --- a/pinning/pinner/set.go +++ b/pinning/pinner/ipldpinner/set.go @@ -1,4 +1,4 @@ -package pin +package ipldpinner import ( "bytes" @@ -55,9 +55,14 @@ func (s sortByHash) Swap(a, b int) { } func storeItems(ctx context.Context, dag ipld.DAGService, estimatedLen uint64, depth uint32, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { - links := make([]*ipld.Link, 0, defaultFanout+maxItems) + // Each node wastes up to defaultFanout in empty links. + var leafLinks uint64 + if estimatedLen < maxItems { + leafLinks = estimatedLen + } + links := make([]*ipld.Link, defaultFanout, defaultFanout+leafLinks) for i := 0; i < defaultFanout; i++ { - links = append(links, &ipld.Link{Cid: emptyKey}) + links[i] = &ipld.Link{Cid: emptyKey} } // add emptyKey to our set of internal pinset objects @@ -97,7 +102,7 @@ func storeItems(ctx context.Context, dag ipld.DAGService, estimatedLen uint64, d sort.Stable(s) } - hashed := make([][]cid.Cid, defaultFanout) + var hashed [][]cid.Cid for { // This loop essentially enumerates every single item in the set // and maps them all into a set of buckets. Each bucket will be recursively @@ -116,6 +121,9 @@ func storeItems(ctx context.Context, dag ipld.DAGService, estimatedLen uint64, d if !ok { break } + if hashed == nil { + hashed = make([][]cid.Cid, defaultFanout) + } h := hash(depth, k) % defaultFanout hashed[h] = append(hashed[h], k) } diff --git a/pinning/pinner/set_test.go b/pinning/pinner/ipldpinner/set_test.go similarity index 99% rename from pinning/pinner/set_test.go rename to pinning/pinner/ipldpinner/set_test.go index 61a3118b26..0f32e6b5e3 100644 --- a/pinning/pinner/set_test.go +++ b/pinning/pinner/ipldpinner/set_test.go @@ -1,4 +1,4 @@ -package pin +package ipldpinner import ( "context" diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index aa74c51854..7e1d886020 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -5,33 +5,14 @@ package pin import ( "context" "fmt" - "os" - "sync" - "time" cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" - mdag "github.com/ipfs/go-merkledag" - "github.com/ipfs/go-merkledag/dagutils" ) var log = logging.Logger("pin") -var pinDatastoreKey = ds.NewKey("/local/pins") - -var emptyKey cid.Cid - -func init() { - e, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") - if err != nil { - log.Error("failed to decode empty key constant") - os.Exit(1) - } - emptyKey = e -} - const ( linkRecursive = "recursive" linkDirect = "direct" @@ -177,482 +158,3 @@ func (p Pinned) String() string { return fmt.Sprintf("pinned: %s", modeStr) } } - -// pinner implements the Pinner interface -type pinner struct { - lock sync.RWMutex - recursePin *cid.Set - directPin *cid.Set - - // Track the keys used for storing the pinning state, so gc does - // not delete them. - internalPin *cid.Set - dserv ipld.DAGService - internal ipld.DAGService // dagservice used to store internal objects - dstore ds.Datastore -} - -type syncDAGService interface { - ipld.DAGService - Sync() error -} - -// NewPinner creates a new pinner using the given datastore as a backend -func NewPinner(dstore ds.Datastore, serv, internal ipld.DAGService) Pinner { - - rcset := cid.NewSet() - dirset := cid.NewSet() - - return &pinner{ - recursePin: rcset, - directPin: dirset, - dserv: serv, - dstore: dstore, - internal: internal, - internalPin: cid.NewSet(), - } -} - -// Pin the given node, optionally recursive -func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { - err := p.dserv.Add(ctx, node) - if err != nil { - return err - } - - c := node.Cid() - - p.lock.Lock() - defer p.lock.Unlock() - - if recurse { - if p.recursePin.Has(c) { - return nil - } - - p.lock.Unlock() - // temporary unlock to fetch the entire graph - err := mdag.FetchGraph(ctx, c, p.dserv) - p.lock.Lock() - if err != nil { - return err - } - - if p.recursePin.Has(c) { - return nil - } - - if p.directPin.Has(c) { - p.directPin.Remove(c) - } - - p.recursePin.Add(c) - } else { - if p.recursePin.Has(c) { - return fmt.Errorf("%s already pinned recursively", c.String()) - } - - p.directPin.Add(c) - } - return nil -} - -// ErrNotPinned is returned when trying to unpin items which are not pinned. -var ErrNotPinned = fmt.Errorf("not pinned or pinned indirectly") - -// Unpin a given key -func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { - p.lock.Lock() - defer p.lock.Unlock() - if p.recursePin.Has(c) { - if !recursive { - return fmt.Errorf("%s is pinned recursively", c) - } - p.recursePin.Remove(c) - return nil - } - if p.directPin.Has(c) { - p.directPin.Remove(c) - return nil - } - return ErrNotPinned -} - -func (p *pinner) isInternalPin(c cid.Cid) bool { - return p.internalPin.Has(c) -} - -// IsPinned returns whether or not the given key is pinned -// and an explanation of why its pinned -func (p *pinner) IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) { - p.lock.RLock() - defer p.lock.RUnlock() - return p.isPinnedWithType(ctx, c, Any) -} - -// IsPinnedWithType returns whether or not the given cid is pinned with the -// given pin type, as well as returning the type of pin its pinned with. -func (p *pinner) IsPinnedWithType(ctx context.Context, c cid.Cid, mode Mode) (string, bool, error) { - p.lock.RLock() - defer p.lock.RUnlock() - return p.isPinnedWithType(ctx, c, mode) -} - -// isPinnedWithType is the implementation of IsPinnedWithType that does not lock. -// intended for use by other pinned methods that already take locks -func (p *pinner) isPinnedWithType(ctx context.Context, c cid.Cid, mode Mode) (string, bool, error) { - switch mode { - case Any, Direct, Indirect, Recursive, Internal: - default: - err := fmt.Errorf("invalid Pin Mode '%d', must be one of {%d, %d, %d, %d, %d}", - mode, Direct, Indirect, Recursive, Internal, Any) - return "", false, err - } - if (mode == Recursive || mode == Any) && p.recursePin.Has(c) { - return linkRecursive, true, nil - } - if mode == Recursive { - return "", false, nil - } - - if (mode == Direct || mode == Any) && p.directPin.Has(c) { - return linkDirect, true, nil - } - if mode == Direct { - return "", false, nil - } - - if (mode == Internal || mode == Any) && p.isInternalPin(c) { - return linkInternal, true, nil - } - if mode == Internal { - return "", false, nil - } - - // Default is Indirect - visitedSet := cid.NewSet() - for _, rc := range p.recursePin.Keys() { - has, err := hasChild(ctx, p.dserv, rc, c, visitedSet.Visit) - if err != nil { - return "", false, err - } - if has { - return rc.String(), true, nil - } - } - return "", false, nil -} - -// CheckIfPinned Checks if a set of keys are pinned, more efficient than -// calling IsPinned for each key, returns the pinned status of cid(s) -func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]Pinned, error) { - p.lock.RLock() - defer p.lock.RUnlock() - pinned := make([]Pinned, 0, len(cids)) - toCheck := cid.NewSet() - - // First check for non-Indirect pins directly - for _, c := range cids { - if p.recursePin.Has(c) { - pinned = append(pinned, Pinned{Key: c, Mode: Recursive}) - } else if p.directPin.Has(c) { - pinned = append(pinned, Pinned{Key: c, Mode: Direct}) - } else if p.isInternalPin(c) { - pinned = append(pinned, Pinned{Key: c, Mode: Internal}) - } else { - toCheck.Add(c) - } - } - - // Now walk all recursive pins to check for indirect pins - var checkChildren func(cid.Cid, cid.Cid) error - checkChildren = func(rk, parentKey cid.Cid) error { - links, err := ipld.GetLinks(ctx, p.dserv, parentKey) - if err != nil { - return err - } - for _, lnk := range links { - c := lnk.Cid - - if toCheck.Has(c) { - pinned = append(pinned, - Pinned{Key: c, Mode: Indirect, Via: rk}) - toCheck.Remove(c) - } - - err := checkChildren(rk, c) - if err != nil { - return err - } - - if toCheck.Len() == 0 { - return nil - } - } - return nil - } - - for _, rk := range p.recursePin.Keys() { - err := checkChildren(rk, rk) - if err != nil { - return nil, err - } - if toCheck.Len() == 0 { - break - } - } - - // Anything left in toCheck is not pinned - for _, k := range toCheck.Keys() { - pinned = append(pinned, Pinned{Key: k, Mode: NotPinned}) - } - - return pinned, nil -} - -// RemovePinWithMode is for manually editing the pin structure. -// Use with care! If used improperly, garbage collection may not -// be successful. -func (p *pinner) RemovePinWithMode(c cid.Cid, mode Mode) { - p.lock.Lock() - defer p.lock.Unlock() - switch mode { - case Direct: - p.directPin.Remove(c) - case Recursive: - p.recursePin.Remove(c) - default: - // programmer error, panic OK - panic("unrecognized pin type") - } -} - -func cidSetWithValues(cids []cid.Cid) *cid.Set { - out := cid.NewSet() - for _, c := range cids { - out.Add(c) - } - return out -} - -// LoadPinner loads a pinner and its keysets from the given datastore -func LoadPinner(d ds.Datastore, dserv, internal ipld.DAGService) (Pinner, error) { - p := new(pinner) - - rootKey, err := d.Get(pinDatastoreKey) - if err != nil { - return nil, fmt.Errorf("cannot load pin state: %v", err) - } - rootCid, err := cid.Cast(rootKey) - if err != nil { - return nil, err - } - - ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5) - defer cancel() - - root, err := internal.Get(ctx, rootCid) - if err != nil { - return nil, fmt.Errorf("cannot find pinning root object: %v", err) - } - - rootpb, ok := root.(*mdag.ProtoNode) - if !ok { - return nil, mdag.ErrNotProtobuf - } - - internalset := cid.NewSet() - internalset.Add(rootCid) - recordInternal := internalset.Add - - { // load recursive set - recurseKeys, err := loadSet(ctx, internal, rootpb, linkRecursive, recordInternal) - if err != nil { - return nil, fmt.Errorf("cannot load recursive pins: %v", err) - } - p.recursePin = cidSetWithValues(recurseKeys) - } - - { // load direct set - directKeys, err := loadSet(ctx, internal, rootpb, linkDirect, recordInternal) - if err != nil { - return nil, fmt.Errorf("cannot load direct pins: %v", err) - } - p.directPin = cidSetWithValues(directKeys) - } - - p.internalPin = internalset - - // assign services - p.dserv = dserv - p.dstore = d - p.internal = internal - - return p, nil -} - -// DirectKeys returns a slice containing the directly pinned keys -func (p *pinner) DirectKeys(ctx context.Context) ([]cid.Cid, error) { - p.lock.RLock() - defer p.lock.RUnlock() - - return p.directPin.Keys(), nil -} - -// RecursiveKeys returns a slice containing the recursively pinned keys -func (p *pinner) RecursiveKeys(ctx context.Context) ([]cid.Cid, error) { - p.lock.RLock() - defer p.lock.RUnlock() - - return p.recursePin.Keys(), nil -} - -// Update updates a recursive pin from one cid to another -// this is more efficient than simply pinning the new one and unpinning the -// old one -func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error { - if from == to { - // Nothing to do. Don't remove this check or we'll end up - // _removing_ the pin. - // - // See #6648 - return nil - } - - p.lock.Lock() - defer p.lock.Unlock() - - if !p.recursePin.Has(from) { - return fmt.Errorf("'from' cid was not recursively pinned already") - } - - // Temporarily unlock while we fetch the differences. - p.lock.Unlock() - err := dagutils.DiffEnumerate(ctx, p.dserv, from, to) - p.lock.Lock() - - if err != nil { - return err - } - - p.recursePin.Add(to) - if unpin { - p.recursePin.Remove(from) - } - return nil -} - -// Flush encodes and writes pinner keysets to the datastore -func (p *pinner) Flush(ctx context.Context) error { - p.lock.Lock() - defer p.lock.Unlock() - - internalset := cid.NewSet() - recordInternal := internalset.Add - - root := &mdag.ProtoNode{} - { - n, err := storeSet(ctx, p.internal, p.directPin.Keys(), recordInternal) - if err != nil { - return err - } - if err := root.AddNodeLink(linkDirect, n); err != nil { - return err - } - } - - { - n, err := storeSet(ctx, p.internal, p.recursePin.Keys(), recordInternal) - if err != nil { - return err - } - if err := root.AddNodeLink(linkRecursive, n); err != nil { - return err - } - } - - // add the empty node, its referenced by the pin sets but never created - err := p.internal.Add(ctx, new(mdag.ProtoNode)) - if err != nil { - return err - } - - err = p.internal.Add(ctx, root) - if err != nil { - return err - } - - k := root.Cid() - - internalset.Add(k) - - if syncDServ, ok := p.dserv.(syncDAGService); ok { - if err := syncDServ.Sync(); err != nil { - return fmt.Errorf("cannot sync pinned data: %v", err) - } - } - - if syncInternal, ok := p.internal.(syncDAGService); ok { - if err := syncInternal.Sync(); err != nil { - return fmt.Errorf("cannot sync pinning data: %v", err) - } - } - - if err := p.dstore.Put(pinDatastoreKey, k.Bytes()); err != nil { - return fmt.Errorf("cannot store pin state: %v", err) - } - if err := p.dstore.Sync(pinDatastoreKey); err != nil { - return fmt.Errorf("cannot sync pin state: %v", err) - } - p.internalPin = internalset - return nil -} - -// InternalPins returns all cids kept pinned for the internal state of the -// pinner -func (p *pinner) InternalPins(ctx context.Context) ([]cid.Cid, error) { - p.lock.Lock() - defer p.lock.Unlock() - var out []cid.Cid - out = append(out, p.internalPin.Keys()...) - return out, nil -} - -// PinWithMode allows the user to have fine grained control over pin -// counts -func (p *pinner) PinWithMode(c cid.Cid, mode Mode) { - p.lock.Lock() - defer p.lock.Unlock() - switch mode { - case Recursive: - p.recursePin.Add(c) - case Direct: - p.directPin.Add(c) - } -} - -// hasChild recursively looks for a Cid among the children of a root Cid. -// The visit function can be used to shortcut already-visited branches. -func hasChild(ctx context.Context, ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Cid) bool) (bool, error) { - links, err := ipld.GetLinks(ctx, ng, root) - if err != nil { - return false, err - } - for _, lnk := range links { - c := lnk.Cid - if lnk.Cid.Equals(child) { - return true, nil - } - if visit(c) { - has, err := hasChild(ctx, ng, c, child, visit) - if err != nil { - return false, err - } - - if has { - return has, nil - } - } - } - return false, nil -} diff --git a/pinning/pinner/pinconv/pinconv.go b/pinning/pinner/pinconv/pinconv.go new file mode 100644 index 0000000000..9aee703a71 --- /dev/null +++ b/pinning/pinner/pinconv/pinconv.go @@ -0,0 +1,128 @@ +// Package pinconv converts pins between the dag-based ipldpinner and the +// datastore-based dspinner. Once conversion is complete, the pins from the +// source pinner are removed. +package pinconv + +import ( + "context" + "fmt" + + "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + ipfspinner "github.com/ipfs/go-ipfs-pinner" + "github.com/ipfs/go-ipfs-pinner/dspinner" + "github.com/ipfs/go-ipfs-pinner/ipldpinner" + ipld "github.com/ipfs/go-ipld-format" +) + +// ConvertPinsFromIPLDToDS converts pins stored in mdag based storage to pins +// stores in the datastore. Returns a dspinner loaded with the converted pins, +// and a count of the recursive and direct pins converted. +// +// After pins are stored in datastore, the root pin key is deleted to unlink +// the pin data in the DAGService. +func ConvertPinsFromIPLDToDS(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService, internal ipld.DAGService) (ipfspinner.Pinner, int, error) { + const ipldPinPath = "/local/pins" + + ipldPinner, err := ipldpinner.New(dstore, dserv, internal) + if err != nil { + return nil, 0, err + } + + dsPinner, err := dspinner.New(ctx, dstore, dserv) + if err != nil { + return nil, 0, err + } + + seen := cid.NewSet() + cids, err := ipldPinner.RecursiveKeys(ctx) + if err != nil { + return nil, 0, err + } + for i := range cids { + seen.Add(cids[i]) + dsPinner.PinWithMode(cids[i], ipfspinner.Recursive) + } + convCount := len(cids) + + cids, err = ipldPinner.DirectKeys(ctx) + if err != nil { + return nil, 0, err + } + for i := range cids { + if seen.Has(cids[i]) { + // Pin was already pinned recursively + continue + } + dsPinner.PinWithMode(cids[i], ipfspinner.Direct) + } + convCount += len(cids) + + err = dsPinner.Flush(ctx) + if err != nil { + return nil, 0, err + } + + // Delete root mdag key from datastore to remove old pin storage. + ipldPinDatastoreKey := ds.NewKey(ipldPinPath) + if err = dstore.Delete(ipldPinDatastoreKey); err != nil { + return nil, 0, fmt.Errorf("cannot delete old pin state: %v", err) + } + if err = dstore.Sync(ipldPinDatastoreKey); err != nil { + return nil, 0, fmt.Errorf("cannot sync old pin state: %v", err) + } + + return dsPinner, convCount, nil +} + +// ConvertPinsFromDSToIPLD converts the pins stored in the datastore by +// dspinner, into pins stored in the given internal DAGService by ipldpinner. +// Returns an ipldpinner loaded with the converted pins, and a count of the +// recursive and direct pins converted. +// +// After the pins are stored in the DAGService, the pins and their indexes are +// removed from the dspinner. +func ConvertPinsFromDSToIPLD(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService, internal ipld.DAGService) (ipfspinner.Pinner, int, error) { + dsPinner, err := dspinner.New(ctx, dstore, dserv) + if err != nil { + return nil, 0, err + } + + ipldPinner, err := ipldpinner.New(dstore, dserv, internal) + if err != nil { + return nil, 0, err + } + + cids, err := dsPinner.RecursiveKeys(ctx) + if err != nil { + return nil, 0, err + } + for i := range cids { + ipldPinner.PinWithMode(cids[i], ipfspinner.Recursive) + dsPinner.RemovePinWithMode(cids[i], ipfspinner.Recursive) + } + convCount := len(cids) + + cids, err = dsPinner.DirectKeys(ctx) + if err != nil { + return nil, 0, err + } + for i := range cids { + ipldPinner.PinWithMode(cids[i], ipfspinner.Direct) + dsPinner.RemovePinWithMode(cids[i], ipfspinner.Direct) + } + convCount += len(cids) + + // Save the ipldpinner pins + err = ipldPinner.Flush(ctx) + if err != nil { + return nil, 0, err + } + + err = dsPinner.Flush(ctx) + if err != nil { + return nil, 0, err + } + + return ipldPinner, convCount, nil +} diff --git a/pinning/pinner/pinconv/pinconv_test.go b/pinning/pinner/pinconv/pinconv_test.go new file mode 100644 index 0000000000..ac7f8ffc5f --- /dev/null +++ b/pinning/pinner/pinconv/pinconv_test.go @@ -0,0 +1,153 @@ +package pinconv + +import ( + "context" + "errors" + "io" + "testing" + + bs "github.com/ipfs/go-blockservice" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + lds "github.com/ipfs/go-ds-leveldb" + blockstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" + ipfspin "github.com/ipfs/go-ipfs-pinner" + "github.com/ipfs/go-ipfs-pinner/dspinner" + util "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" + mdag "github.com/ipfs/go-merkledag" +) + +var rand = util.NewTimeSeededRand() + +type batchWrap struct { + ds.Datastore +} + +func randNode() (*mdag.ProtoNode, cid.Cid) { + nd := new(mdag.ProtoNode) + nd.SetData(make([]byte, 32)) + _, err := io.ReadFull(rand, nd.Data()) + if err != nil { + panic(err) + } + k := nd.Cid() + return nd, k +} + +func (d *batchWrap) Batch() (ds.Batch, error) { + return ds.NewBasicBatch(d), nil +} + +func makeStore() (ds.Datastore, ipld.DAGService) { + ldstore, err := lds.NewDatastore("", nil) + if err != nil { + panic(err) + } + var dstore ds.Batching + dstore = &batchWrap{ldstore} + + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + dserv := mdag.NewDAGService(bserv) + return dstore, dserv +} + +func TestConversions(t *testing.T) { + ctx := context.Background() + dstore, dserv := makeStore() + + dsPinner, err := dspinner.New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + a, ak := randNode() + err = dsPinner.Pin(ctx, a, false) + if err != nil { + t.Fatal(err) + } + + // create new node c, to be indirectly pinned through b + c, ck := randNode() + dserv.Add(ctx, c) + + // Create new node b, to be parent to a and c + b, _ := randNode() + b.AddNodeLink("child", a) + b.AddNodeLink("otherchild", c) + bk := b.Cid() // CID changed after adding links + + // recursively pin B{A,C} + err = dsPinner.Pin(ctx, b, true) + if err != nil { + t.Fatal(err) + } + + err = dsPinner.Flush(ctx) + if err != nil { + t.Fatal(err) + } + + verifyPins := func(pinner ipfspin.Pinner) error { + pinned, err := pinner.CheckIfPinned(ctx, ak, bk, ck) + if err != nil { + return err + } + if len(pinned) != 3 { + return errors.New("incorrect number of results") + } + for _, pn := range pinned { + switch pn.Key { + case ak: + if pn.Mode != ipfspin.Direct { + return errors.New("A pinned with wrong mode") + } + case bk: + if pn.Mode != ipfspin.Recursive { + return errors.New("B pinned with wrong mode") + } + case ck: + if pn.Mode != ipfspin.Indirect { + return errors.New("C should be pinned indirectly") + } + if pn.Via != bk { + return errors.New("C should be pinned via B") + } + } + } + return nil + } + + err = verifyPins(dsPinner) + if err != nil { + t.Fatal(err) + } + + ipldPinner, toIPLDCount, err := ConvertPinsFromDSToIPLD(ctx, dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } + if toIPLDCount != 2 { + t.Fatal("expected 2 ds-to-ipld pins, got", toIPLDCount) + } + + err = verifyPins(ipldPinner) + if err != nil { + t.Fatal(err) + } + + toDSPinner, toDSCount, err := ConvertPinsFromIPLDToDS(ctx, dstore, dserv, dserv) + if err != nil { + t.Fatal(err) + } + if toDSCount != toIPLDCount { + t.Fatal("ds-to-ipld pins", toIPLDCount, "not equal to ipld-to-ds-pins", toDSCount) + } + + err = verifyPins(toDSPinner) + if err != nil { + t.Fatal(err) + } +} From d097b1d3ee904c7407d2baea3860f1182a9eca5a Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 17 Nov 2020 09:26:13 -0500 Subject: [PATCH 2902/3147] refactor: properly return non-GenericOpenAPIErrors This commit was moved from ipfs/go-pinning-service-http-client@450a21fea0ed8e3aa96cbc9274ef9c722f494c72 --- pinning/remote/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index e3c04176e3..206fd7ce6a 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -371,7 +371,7 @@ func httperr(resp *http.Response, e error) error { if ok { ferr, ok := oerr.Model().(openapi.Failure) if ok { - return errors.Wrapf(e,"statusCode: %d, reason : %q, details : %q", resp.StatusCode, ferr.Error.GetReason(), ferr.Error.GetDetails()) + return errors.Wrapf(e,"statusCode: %d, reason: %q, details: %q", resp.StatusCode, ferr.Error.GetReason(), ferr.Error.GetDetails()) } } From b0590c5faf496518469b1ab062e0a15281ab5dc6 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Thu, 19 Nov 2020 20:39:34 +0100 Subject: [PATCH 2903/3147] feat: LsBatchSync This adds function that returns a single batch and an int with total count. This enables consumer of this lib to implement manual pagination or get total pin count in efficient manner. This commit was moved from ipfs/go-pinning-service-http-client@0b51d34f4aa84df43b636677b1ece164921f86c8 --- pinning/remote/client/client.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index 206fd7ce6a..ca67634e28 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -195,6 +195,30 @@ func (c *Client) LsSync(ctx context.Context, opts ...LsOption) ([]PinStatusGette return res, <-errCh } +// Manual version of Ls that returns a single batch of results and int with total count +func (c *Client) LsBatchSync(ctx context.Context, opts ...LsOption) ([]PinStatusGetter, int, error) { + var res []PinStatusGetter + + settings := new(lsSettings) + for _, o := range opts { + if err := o(settings); err != nil { + return nil, 0, err + } + } + + pinRes, err := c.lsInternal(ctx, settings) + if err != nil { + return nil, 0, err + } + + results := pinRes.GetResults() + for _, r := range results { + res = append(res, &pinStatusObject{r}) + } + + return res, int(pinRes.Count), nil +} + func (c *Client) lsInternal(ctx context.Context, settings *lsSettings) (pinResults, error) { getter := c.client.PinsApi.PinsGet(ctx) if len(settings.cids) > 0 { @@ -257,7 +281,7 @@ func (pinAddOpts) WithName(name string) AddOption { } } -func (pinLsOpts) WithOrigins(origins ...multiaddr.Multiaddr) AddOption { +func (pinAddOpts) WithOrigins(origins ...multiaddr.Multiaddr) AddOption { return func(options *addSettings) error { for _, o := range origins { options.origins = append(options.origins, o.String()) @@ -326,7 +350,7 @@ func (c *Client) DeleteByID(ctx context.Context, pinID string) error { return nil } -func (c *Client) Modify(ctx context.Context, pinID string, cid cid.Cid, opts ...AddOption) (PinStatusGetter, error) { +func (c *Client) Replace(ctx context.Context, pinID string, cid cid.Cid, opts ...AddOption) (PinStatusGetter, error) { settings := new(addSettings) for _, o := range opts { if err := o(settings); err != nil { From d62225f78f0f79a571782d47f76fdfadadc51941 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Tue, 1 Dec 2020 00:07:37 +0100 Subject: [PATCH 2904/3147] style: clean up error messages this cleans up errors This commit was moved from ipfs/go-pinning-service-http-client@7ffc18b3a85f5c4c2f26e364127da6f15d6f5c59 --- pinning/remote/client/client.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index ca67634e28..40b4b09f4b 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -395,13 +395,13 @@ func httperr(resp *http.Response, e error) error { if ok { ferr, ok := oerr.Model().(openapi.Failure) if ok { - return errors.Wrapf(e,"statusCode: %d, reason: %q, details: %q", resp.StatusCode, ferr.Error.GetReason(), ferr.Error.GetDetails()) + return errors.Wrapf(e, "reason: %q, details: %q", ferr.Error.GetReason(), ferr.Error.GetDetails()) } } if resp == nil { - return errors.Wrapf(e,"empty response from remote pinning service") + return errors.Wrapf(e, "empty response from remote pinning service") } - return errors.Wrapf(e, "remote pinning service error. statusCode: %d", resp.StatusCode) + return errors.Wrapf(e, "remote pinning service returned http error %d", resp.StatusCode) } From c0b437ba6d7e2edc59d5e39bd8be650ec5f9cfb4 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 26 Aug 2020 13:17:48 -0400 Subject: [PATCH 2905/3147] ResolveToLastNode no longer fetches nodes it does not need This commit was moved from ipfs/go-path@9ba33de2c4e628f0942e4846366978910d627d77 --- path/resolver/resolver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 67bb9f6fb6..9f153840c8 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -89,6 +89,10 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. return cid.Cid{}, nil, err } + if len(rest) == 0 { + return lnk.Cid, nil, nil + } + next, err := lnk.GetNode(ctx, r.DAG) if err != nil { return cid.Cid{}, nil, err From 7902558debb9947429127a4d0ed84b53578f4d08 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 26 Aug 2020 13:59:39 -0400 Subject: [PATCH 2906/3147] test: add test that ResolveToLastNode does not perform unncessary fetches This commit was moved from ipfs/go-path@692649d53149f2ccd5db0e5de350f305b65805b9 --- path/resolver/resolver_test.go | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index 480ccdf1dd..d3c6913e7e 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -105,3 +105,43 @@ func TestRecurivePathResolution(t *testing.T) { p.String(), rCid.String(), cKey.String())) } } + +func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { + ctx := context.Background() + dagService := dagmock.Mock() + + a := randNode() + b := randNode() + + err := a.AddNodeLink("child", b) + if err != nil { + t.Fatal(err) + } + + err = dagService.Add(ctx, a) + if err != nil { + t.Fatal(err) + } + + aKey := a.Cid() + + segments := []string{aKey.String(), "child"} + p, err := path.FromSegments("/ipfs/", segments...) + if err != nil { + t.Fatal(err) + } + + resolver := resolver.NewBasicResolver(dagService) + resolvedCID, remainingPath, err := resolver.ResolveToLastNode(ctx, p) + if err != nil { + t.Fatal(err) + } + + if len(remainingPath) > 0 { + t.Fatal("cannot have remaining path") + } + + if !resolvedCID.Equals(b.Cid()) { + t.Fatal("resolved to the wrong CID") + } +} From 20494dd96cd3cc170960891dbe8a377862968f74 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Wed, 2 Dec 2020 11:55:42 +1100 Subject: [PATCH 2907/3147] fix: improved error message on broken CIDv0 move lidel's fix from https://github.com/ipfs/go-cid/pull/116 This commit was moved from ipfs/go-path@5e8ad22f98b2095a11e1d735856ba25fad40c294 --- path/path.go | 16 ++++++++++++---- path/path_test.go | 11 +++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/path/path.go b/path/path.go index 18a85a9021..df050008f8 100644 --- a/path/path.go +++ b/path/path.go @@ -96,7 +96,7 @@ func ParsePath(txt string) (Path, error) { // if the path doesnt begin with a '/' // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { - if _, err := cid.Decode(parts[0]); err != nil { + if _, err := decodeCid(parts[0]); err != nil { return "", &pathError{error: err, path: txt} } // The case when the path starts with hash without a protocol prefix @@ -114,7 +114,7 @@ func ParsePath(txt string) (Path, error) { return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} } // Validate Cid. - _, err := cid.Decode(parts[2]) + _, err := decodeCid(parts[2]) if err != nil { return "", &pathError{error: fmt.Errorf("invalid CID: %s", err), path: txt} } @@ -135,7 +135,7 @@ func ParseCidToPath(txt string) (Path, error) { return "", &pathError{error: fmt.Errorf("empty"), path: txt} } - c, err := cid.Decode(txt) + c, err := decodeCid(txt) if err != nil { return "", &pathError{error: err, path: txt} } @@ -172,7 +172,7 @@ func SplitAbsPath(fpath Path) (cid.Cid, []string, error) { return cid.Cid{}, nil, &pathError{error: fmt.Errorf("empty"), path: string(fpath)} } - c, err := cid.Decode(parts[0]) + c, err := decodeCid(parts[0]) // first element in the path is a cid if err != nil { return cid.Cid{}, nil, &pathError{error: fmt.Errorf("invalid CID: %s", err), path: string(fpath)} @@ -180,3 +180,11 @@ func SplitAbsPath(fpath Path) (cid.Cid, []string, error) { return c, parts[1:], nil } + +func decodeCid(cstr string) (cid.Cid, error) { + c, err := cid.Decode(cstr) + if err != nil && len(cstr) == 46 && cstr[:2] == "qm" { // https://github.com/ipfs/go-ipfs/issues/7792 + return cid.Cid{}, fmt.Errorf("%v (possible lowercased CIDv0; consider converting to a case-agnostic CIDv1, such as base32)", err) + } + return c, err +} diff --git a/path/path_test.go b/path/path_test.go index fdd71fc0c7..4552fc5f93 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -102,3 +102,14 @@ func TestPopLastSegment(t *testing.T) { } } } + +func TestV0ErrorDueToLowercase(t *testing.T) { + badb58 := "/ipfs/qmbwqxbekc3p8tqskc98xmwnzrzdtrlmimpl8wbutgsmnr" + _, err := ParsePath(badb58) + if err == nil { + t.Fatal("should have failed to decode") + } + if !strings.HasSuffix(err.Error(), "(possible lowercased CIDv0; consider converting to a case-agnostic CIDv1, such as base32)") { + t.Fatal("should have meaningful info about case-insensitive fix") + } +} From 4ce8cc3af8771a7673c5c6a195f484cbf856e04f Mon Sep 17 00:00:00 2001 From: Andrew Gillis Date: Wed, 27 Jan 2021 11:40:12 -0800 Subject: [PATCH 2908/3147] Avoid loading all pins into memory during migration (#5) * Converting from IPLD to datastore-based pins no longer requires loading all dag-storage pins (including indirect pins) into memory * increase test coverage This commit was moved from ipfs/go-ipfs-pinner@9ed588ac9b21e9fcc4dfa27d28bc1d5a266f5995 --- pinning/pinner/ipldpinner/pin.go | 35 ++++++++++ pinning/pinner/ipldpinner/pin_test.go | 96 +++++++++++++++++++++++++- pinning/pinner/ipldpinner/set.go | 35 +++++++++- pinning/pinner/pinconv/pinconv.go | 47 ++++++------- pinning/pinner/pinconv/pinconv_test.go | 28 +++++++- 5 files changed, 211 insertions(+), 30 deletions(-) diff --git a/pinning/pinner/ipldpinner/pin.go b/pinning/pinner/ipldpinner/pin.go index d0824b349b..dc90dd495f 100644 --- a/pinning/pinner/ipldpinner/pin.go +++ b/pinning/pinner/ipldpinner/pin.go @@ -141,6 +141,41 @@ func New(dstore ds.Datastore, dserv, internal ipld.DAGService) (*pinner, error) }, nil } +// LoadKeys reads the pinned CIDs and sends them on the given channel. This is +// used to read pins without loading them all into memory. +func LoadKeys(ctx context.Context, dstore ds.Datastore, dserv, internal ipld.DAGService, recursive bool, keyChan chan<- cid.Cid) error { + rootKey, err := dstore.Get(pinDatastoreKey) + if err != nil { + if err == ds.ErrNotFound { + return nil + } + return err + } + rootCid, err := cid.Cast(rootKey) + if err != nil { + return err + } + + root, err := internal.Get(ctx, rootCid) + if err != nil { + return fmt.Errorf("cannot find pinning root object: %v", err) + } + + rootpb, ok := root.(*mdag.ProtoNode) + if !ok { + return mdag.ErrNotProtobuf + } + + var linkName string + if recursive { + linkName = linkRecursive + } else { + linkName = linkDirect + } + + return loadSetChan(ctx, internal, rootpb, linkName, keyChan) +} + // Pin the given node, optionally recursive func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { err := p.dserv.Add(ctx, node) diff --git a/pinning/pinner/ipldpinner/pin_test.go b/pinning/pinner/ipldpinner/pin_test.go index e193aa96c3..3c61d41fd2 100644 --- a/pinning/pinner/ipldpinner/pin_test.go +++ b/pinning/pinner/ipldpinner/pin_test.go @@ -54,7 +54,8 @@ func assertUnpinned(t *testing.T, p pin.Pinner, c cid.Cid, failmsg string) { } func TestPinnerBasic(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() dstore := dssync.MutexWrap(ds.NewMapDatastore()) bstore := blockstore.NewBlockstore(dstore) @@ -62,7 +63,6 @@ func TestPinnerBasic(t *testing.T) { dserv := mdag.NewDAGService(bserv) - // TODO does pinner need to share datastore with blockservice? p, err := New(dstore, dserv, dserv) if err != nil { t.Fatal(err) @@ -165,6 +165,98 @@ func TestPinnerBasic(t *testing.T) { // Test recursively pinned assertPinned(t, np, bk, "could not find recursively pinned node") + + // Test that LoadKeys returns the expected CIDs. + keyChan := make(chan cid.Cid) + go func() { + err = LoadKeys(ctx, dstore, dserv, dserv, true, keyChan) + close(keyChan) + }() + keys := map[cid.Cid]struct{}{} + for c := range keyChan { + keys[c] = struct{}{} + } + if err != nil { + t.Fatal(err) + } + recKeys, _ := np.RecursiveKeys(ctx) + if len(keys) != len(recKeys) { + t.Fatal("wrong number of recursive keys from LoadKeys") + } + for _, k := range recKeys { + if _, ok := keys[k]; !ok { + t.Fatal("LoadKeys did not return correct recursive keys") + } + } + + keyChan = make(chan cid.Cid) + go func() { + err = LoadKeys(ctx, dstore, dserv, dserv, false, keyChan) + close(keyChan) + }() + keys = map[cid.Cid]struct{}{} + for c := range keyChan { + keys[c] = struct{}{} + } + if err != nil { + t.Fatal(err) + } + dirKeys, _ := np.DirectKeys(ctx) + if len(keys) != len(dirKeys) { + t.Fatal("wrong number of direct keys from LoadKeys") + } + for _, k := range dirKeys { + if _, ok := keys[k]; !ok { + t.Fatal("LoadKeys did not return correct direct keys") + } + } + + cancel() + emptyDS := dssync.MutexWrap(ds.NewMapDatastore()) + + // Check key not in datastore + err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil) + if err != nil { + t.Fatal(err) + } + + // Check error on bad key + if err = emptyDS.Put(pinDatastoreKey, []byte("bad-cid")); err != nil { + panic(err) + } + if err = emptyDS.Sync(pinDatastoreKey); err != nil { + panic(err) + } + if err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil); err == nil { + t.Fatal("expected error") + } + + // Lookup dag that does not exist + noKey, err := cid.Decode("QmYff9iHR1Hz6wufVeJodzXqQm4pkK4QNS9ms8tyPKVWm1") + if err != nil { + panic(err) + } + if err = emptyDS.Put(pinDatastoreKey, noKey.Bytes()); err != nil { + panic(err) + } + if err = emptyDS.Sync(pinDatastoreKey); err != nil { + panic(err) + } + err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil) + if err == nil || err.Error() != "cannot find pinning root object: merkledag: not found" { + t.Fatal("did not get expected error") + } + + // Check error when node has no links + if err = emptyDS.Put(pinDatastoreKey, emptyKey.Bytes()); err != nil { + panic(err) + } + if err = emptyDS.Sync(pinDatastoreKey); err != nil { + panic(err) + } + if err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil); err == nil { + t.Fatal("expected error") + } } func TestIsPinnedLookup(t *testing.T) { diff --git a/pinning/pinner/ipldpinner/set.go b/pinning/pinner/ipldpinner/set.go index 2fb931f93b..51951a2c01 100644 --- a/pinning/pinner/ipldpinner/set.go +++ b/pinning/pinner/ipldpinner/set.go @@ -219,13 +219,15 @@ func walkItems(ctx context.Context, dag ipld.DAGService, n *merkledag.ProtoNode, // readHdr guarantees fanout is a safe value fanout := hdr.GetFanout() for i, l := range n.Links()[fanout:] { - if err := fn(i, l); err != nil { + if err = fn(i, l); err != nil { return err } } for _, l := range n.Links()[:fanout] { c := l.Cid - children(c) + if children != nil { + children(c) + } if c.Equals(emptyKey) { continue } @@ -239,7 +241,7 @@ func walkItems(ctx context.Context, dag ipld.DAGService, n *merkledag.ProtoNode, return merkledag.ErrNotProtobuf } - if err := walkItems(ctx, dag, stpb, fn, children); err != nil { + if err = walkItems(ctx, dag, stpb, fn, children); err != nil { return err } } @@ -277,6 +279,33 @@ func loadSet(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode return res, nil } +func loadSetChan(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode, name string, keyChan chan<- cid.Cid) error { + l, err := root.GetNodeLink(name) + if err != nil { + return err + } + + n, err := l.GetNode(ctx, dag) + if err != nil { + return err + } + + pbn, ok := n.(*merkledag.ProtoNode) + if !ok { + return merkledag.ErrNotProtobuf + } + + walk := func(idx int, link *ipld.Link) error { + keyChan <- link.Cid + return nil + } + + if err = walkItems(ctx, dag, pbn, walk, nil); err != nil { + return err + } + return nil +} + func getCidListIterator(cids []cid.Cid) itemIterator { return func() (c cid.Cid, ok bool) { if len(cids) == 0 { diff --git a/pinning/pinner/pinconv/pinconv.go b/pinning/pinner/pinconv/pinconv.go index 9aee703a71..df21f85b03 100644 --- a/pinning/pinner/pinconv/pinconv.go +++ b/pinning/pinner/pinconv/pinconv.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "github.com/ipfs/go-cid" + cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" ipfspinner "github.com/ipfs/go-ipfs-pinner" "github.com/ipfs/go-ipfs-pinner/dspinner" @@ -24,39 +24,38 @@ import ( func ConvertPinsFromIPLDToDS(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService, internal ipld.DAGService) (ipfspinner.Pinner, int, error) { const ipldPinPath = "/local/pins" - ipldPinner, err := ipldpinner.New(dstore, dserv, internal) - if err != nil { - return nil, 0, err - } - dsPinner, err := dspinner.New(ctx, dstore, dserv) if err != nil { return nil, 0, err } - seen := cid.NewSet() - cids, err := ipldPinner.RecursiveKeys(ctx) - if err != nil { - return nil, 0, err + var convCount int + keyChan := make(chan cid.Cid) + + go func() { + err = ipldpinner.LoadKeys(ctx, dstore, dserv, internal, true, keyChan) + close(keyChan) + }() + for key := range keyChan { + dsPinner.PinWithMode(key, ipfspinner.Recursive) + convCount++ } - for i := range cids { - seen.Add(cids[i]) - dsPinner.PinWithMode(cids[i], ipfspinner.Recursive) + if err != nil { + return nil, 0, fmt.Errorf("cannot load recursive keys: %s", err) } - convCount := len(cids) - cids, err = ipldPinner.DirectKeys(ctx) - if err != nil { - return nil, 0, err + keyChan = make(chan cid.Cid) + go func() { + err = ipldpinner.LoadKeys(ctx, dstore, dserv, internal, false, keyChan) + close(keyChan) + }() + for key := range keyChan { + dsPinner.PinWithMode(key, ipfspinner.Direct) + convCount++ } - for i := range cids { - if seen.Has(cids[i]) { - // Pin was already pinned recursively - continue - } - dsPinner.PinWithMode(cids[i], ipfspinner.Direct) + if err != nil { + return nil, 0, fmt.Errorf("cannot load direct keys: %s", err) } - convCount += len(cids) err = dsPinner.Flush(ctx) if err != nil { diff --git a/pinning/pinner/pinconv/pinconv_test.go b/pinning/pinner/pinconv/pinconv_test.go index ac7f8ffc5f..02abca61cd 100644 --- a/pinning/pinner/pinconv/pinconv_test.go +++ b/pinning/pinner/pinconv/pinconv_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "io" + "strings" "testing" bs "github.com/ipfs/go-blockservice" @@ -55,7 +56,8 @@ func makeStore() (ds.Datastore, ipld.DAGService) { } func TestConversions(t *testing.T) { - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() dstore, dserv := makeStore() dsPinner, err := dspinner.New(ctx, dstore, dserv) @@ -151,3 +153,27 @@ func TestConversions(t *testing.T) { t.Fatal(err) } } + +func TestConvertLoadError(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore, dserv := makeStore() + // Point /local/pins to empty node to cause failure loading pins. + pinDatastoreKey := ds.NewKey("/local/pins") + emptyKey, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") + if err != nil { + panic(err) + } + if err = dstore.Put(pinDatastoreKey, emptyKey.Bytes()); err != nil { + panic(err) + } + if err = dstore.Sync(pinDatastoreKey); err != nil { + panic(err) + } + + _, _, err = ConvertPinsFromIPLDToDS(ctx, dstore, dserv, dserv) + if err == nil || !strings.HasPrefix(err.Error(), "cannot load recursive keys") { + t.Fatal("did not get expected error") + } +} From 158d298a69d288a393d5f422c57137ebd87005af Mon Sep 17 00:00:00 2001 From: "@RubenKelevra" Date: Thu, 28 Jan 2021 21:22:36 +0100 Subject: [PATCH 2909/3147] show the domain name with the error (#7886) * show the domain name if DNSLink failed to resolve a domain because it wasn't a valid domain name Original author: @AluisioASG This commit was moved from ipfs/go-namesys@f5566bc8463a10e03a55ae97ff6371fbc7d7a60a --- namesys/dns.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index 984a27aa80..0b48ad34bd 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -5,6 +5,7 @@ import ( "errors" "net" "strings" + "fmt" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" @@ -53,7 +54,7 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options domain := segments[0] if !isd.IsDomain(domain) { - out <- onceResult{err: errors.New("not a valid domain name")} + out <- onceResult{err: fmt.Errorf("not a valid domain name: %s", domain)} close(out) return out } From d7142764d10265880993dd804c99504d50007b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 5 Feb 2021 14:26:08 +0000 Subject: [PATCH 2910/3147] all: gofmt -s This "simplify" flag mainly removes redundant types in expressions. Not particularly important, but a nice change that also makes gopls not show warnings. This commit was moved from ipfs/go-namesys@996d2cba2fdd6877f2c4465d54fae606d6775cc1 --- namesys/dns.go | 2 +- namesys/dns_test.go | 44 ++++++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 0b48ad34bd..738612f46b 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -3,9 +3,9 @@ package namesys import ( "context" "errors" + "fmt" "net" "strings" - "fmt" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 653c3c7887..5a0e2a7d2f 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -61,72 +61,72 @@ func TestDnsEntryParsing(t *testing.T) { func newMockDNS() *mockDNS { return &mockDNS{ entries: map[string][]string{ - "multihash.example.com.": []string{ + "multihash.example.com.": { "dnslink=QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "ipfs.example.com.": []string{ + "ipfs.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "_dnslink.dipfs.example.com.": []string{ + "_dnslink.dipfs.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "dns1.example.com.": []string{ + "dns1.example.com.": { "dnslink=/ipns/ipfs.example.com", }, - "dns2.example.com.": []string{ + "dns2.example.com.": { "dnslink=/ipns/dns1.example.com", }, - "multi.example.com.": []string{ + "multi.example.com.": { "some stuff", "dnslink=/ipns/dns1.example.com", "masked dnslink=/ipns/example.invalid", }, - "equals.example.com.": []string{ + "equals.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/=equals", }, - "loop1.example.com.": []string{ + "loop1.example.com.": { "dnslink=/ipns/loop2.example.com", }, - "loop2.example.com.": []string{ + "loop2.example.com.": { "dnslink=/ipns/loop1.example.com", }, - "_dnslink.dloop1.example.com.": []string{ + "_dnslink.dloop1.example.com.": { "dnslink=/ipns/loop2.example.com", }, - "_dnslink.dloop2.example.com.": []string{ + "_dnslink.dloop2.example.com.": { "dnslink=/ipns/loop1.example.com", }, - "bad.example.com.": []string{ + "bad.example.com.": { "dnslink=", }, - "withsegment.example.com.": []string{ + "withsegment.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", }, - "withrecsegment.example.com.": []string{ + "withrecsegment.example.com.": { "dnslink=/ipns/withsegment.example.com/subsub", }, - "withtrailing.example.com.": []string{ + "withtrailing.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/", }, - "withtrailingrec.example.com.": []string{ + "withtrailingrec.example.com.": { "dnslink=/ipns/withtrailing.example.com/segment/", }, - "double.example.com.": []string{ + "double.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "_dnslink.double.example.com.": []string{ + "_dnslink.double.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "double.conflict.com.": []string{ + "double.conflict.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", }, - "_dnslink.conflict.example.com.": []string{ + "_dnslink.conflict.example.com.": { "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", }, - "fqdn.example.com.": []string{ + "fqdn.example.com.": { "dnslink=/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", }, - "www.wealdtech.eth.link.": []string{ + "www.wealdtech.eth.link.": { "dnslink=/ipns/ipfs.example.com", }, }, From c4684fac44453c7a756ef45e9237d90224ab9e38 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 18 Feb 2021 12:15:06 -0800 Subject: [PATCH 2911/3147] optimize CheckIfPinned 1. Parallelize fetching from disk. 2. Avoid re-visiting blocks we've already checked. Adding the same data over and over with small changes is pretty common. This commit was moved from ipfs/go-ipfs-pinner@49ac7c3aec6b138956ab5db061b9463a39b50834 --- pinning/pinner/dspinner/pin.go | 48 ++++++++++---------------------- pinning/pinner/ipldpinner/pin.go | 34 +++++++--------------- 2 files changed, 25 insertions(+), 57 deletions(-) diff --git a/pinning/pinner/dspinner/pin.go b/pinning/pinner/dspinner/pin.go index 5fd65e7bf2..f9f5ff9bf7 100644 --- a/pinning/pinner/dspinner/pin.go +++ b/pinning/pinner/dspinner/pin.go @@ -17,6 +17,7 @@ import ( "github.com/ipfs/go-ipfs-pinner/dsindex" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + "github.com/ipfs/go-merkledag" mdag "github.com/ipfs/go-merkledag" "github.com/ipfs/go-merkledag/dagutils" "github.com/polydawn/refmt/cbor" @@ -489,49 +490,30 @@ func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinn } } - // Now walk all recursive pins to check for indirect pins - var checkChildren func(cid.Cid, cid.Cid) error - checkChildren = func(rk, parentKey cid.Cid) error { - links, err := ipld.GetLinks(ctx, p.dserv, parentKey) - if err != nil { - return err - } - for _, lnk := range links { - c := lnk.Cid - - if toCheck.Has(c) { - pinned = append(pinned, - ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk}) - toCheck.Remove(c) - } - - err = checkChildren(rk, c) - if err != nil { - return err - } - - if toCheck.Len() == 0 { - return nil - } - } - return nil - } - var e error + visited := cid.NewSet() err := p.cidRIndex.ForEach(ctx, "", func(key, value string) bool { var rk cid.Cid rk, e = cid.Cast([]byte(key)) if e != nil { return false } - e = checkChildren(rk, rk) + e = merkledag.Walk(ctx, merkledag.GetLinksWithDAG(p.dserv), rk, func(c cid.Cid) bool { + if toCheck.Len() == 0 || !visited.Visit(c) { + return false + } + + if toCheck.Has(c) { + pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk}) + toCheck.Remove(c) + } + + return true + }, merkledag.Concurrent()) if e != nil { return false } - if toCheck.Len() == 0 { - return false - } - return true + return toCheck.Len() > 0 }) if err != nil { return nil, err diff --git a/pinning/pinner/ipldpinner/pin.go b/pinning/pinner/ipldpinner/pin.go index dc90dd495f..5620836988 100644 --- a/pinning/pinner/ipldpinner/pin.go +++ b/pinning/pinner/ipldpinner/pin.go @@ -14,6 +14,7 @@ import ( ds "github.com/ipfs/go-datastore" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + "github.com/ipfs/go-merkledag" mdag "github.com/ipfs/go-merkledag" "github.com/ipfs/go-merkledag/dagutils" @@ -328,35 +329,20 @@ func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinn } // Now walk all recursive pins to check for indirect pins - var checkChildren func(cid.Cid, cid.Cid) error - checkChildren = func(rk, parentKey cid.Cid) error { - links, err := ipld.GetLinks(ctx, p.dserv, parentKey) - if err != nil { - return err - } - for _, lnk := range links { - c := lnk.Cid + visited := cid.NewSet() + for _, rk := range p.recursePin.Keys() { + err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(p.dserv), rk, func(c cid.Cid) bool { + if toCheck.Len() == 0 || !visited.Visit(c) { + return false + } if toCheck.Has(c) { - pinned = append(pinned, - ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk}) + pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk}) toCheck.Remove(c) } - err := checkChildren(rk, c) - if err != nil { - return err - } - - if toCheck.Len() == 0 { - return nil - } - } - return nil - } - - for _, rk := range p.recursePin.Keys() { - err := checkChildren(rk, rk) + return true + }, merkledag.Concurrent()) if err != nil { return nil, err } From cc03039011eb9c1f6db2a5e519b982504e4cd61a Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 18 Feb 2021 22:54:58 +0100 Subject: [PATCH 2912/3147] Update imports This commit was moved from ipfs/go-namesys@9fb2fb3cd08ec4fd66a595e6b060b97453a271ea --- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 4 ++-- namesys/resolve/resolve.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 84dcc911cf..52b8eb8a4d 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -6,7 +6,7 @@ import ( "time" keystore "github.com/ipfs/go-ipfs/keystore" - namesys "github.com/ipfs/go-ipfs/namesys" + namesys "github.com/ipfs/go-namesys" path "github.com/ipfs/go-path" proto "github.com/gogo/protobuf/proto" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index c75d7faa9b..1f0dc6fab6 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -20,8 +20,8 @@ import ( "github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/core/bootstrap" mock "github.com/ipfs/go-ipfs/core/mock" - namesys "github.com/ipfs/go-ipfs/namesys" - . "github.com/ipfs/go-ipfs/namesys/republisher" + namesys "github.com/ipfs/go-namesys" + . "github.com/ipfs/go-namesys/republisher" ) func TestRepublish(t *testing.T) { diff --git a/namesys/resolve/resolve.go b/namesys/resolve/resolve.go index f838a6611f..5f1b4eed90 100644 --- a/namesys/resolve/resolve.go +++ b/namesys/resolve/resolve.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-path" - "github.com/ipfs/go-ipfs/namesys" + "github.com/ipfs/go-namesys" ) // ErrNoNamesys is an explicit error for when an IPFS node doesn't From 09e736ba65857561531b02cdc84b495125376396 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 18 Feb 2021 23:55:06 +0100 Subject: [PATCH 2913/3147] Remove dependencies to go-ipfs/core This commit was moved from ipfs/go-namesys@cfd50975208753b1da7fa82a34d534682b53155a --- namesys/republisher/repub_test.go | 149 ++++++++++++++++-------------- 1 file changed, 82 insertions(+), 67 deletions(-) diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 1f0dc6fab6..3e79eb666b 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -9,63 +9,91 @@ import ( "github.com/gogo/protobuf/proto" goprocess "github.com/jbenet/goprocess" + "github.com/libp2p/go-libp2p" + ic "github.com/libp2p/go-libp2p-core/crypto" + host "github.com/libp2p/go-libp2p-core/host" peer "github.com/libp2p/go-libp2p-core/peer" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + routing "github.com/libp2p/go-libp2p-core/routing" + dht "github.com/libp2p/go-libp2p-kad-dht" ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipns" - "github.com/ipfs/go-ipns/pb" + ipns_pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" - "github.com/ipfs/go-ipfs/core" - "github.com/ipfs/go-ipfs/core/bootstrap" - mock "github.com/ipfs/go-ipfs/core/mock" + keystore "github.com/ipfs/go-ipfs/keystore" namesys "github.com/ipfs/go-namesys" . "github.com/ipfs/go-namesys/republisher" ) +type mockNode struct { + h host.Host + id string + privKey ic.PrivKey + store ds.Batching + dht *dht.IpfsDHT + keystore keystore.Keystore +} + +func getMockNode(t *testing.T, ctx context.Context) *mockNode { + t.Helper() + + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + var idht *dht.IpfsDHT + h, err := libp2p.New( + ctx, + libp2p.ListenAddrStrings("/ip4/127.0.0.1/tcp/0"), + libp2p.Routing(func(h host.Host) (routing.PeerRouting, error) { + rt, err := dht.New(ctx, h, dht.Mode(dht.ModeServer)) + idht = rt + return rt, err + }), + ) + if err != nil { + t.Fatal(err) + } + + return &mockNode{ + h: h, + id: h.ID().Pretty(), + privKey: h.Peerstore().PrivKey(h.ID()), + store: dstore, + dht: idht, + keystore: keystore.NewMemKeystore(), + } +} + func TestRepublish(t *testing.T) { // set cache life to zero for testing low-period repubs ctx, cancel := context.WithCancel(context.Background()) defer cancel() - // create network - mn := mocknet.New(ctx) - - var nodes []*core.IpfsNode + var nsystems []namesys.NameSystem + var nodes []*mockNode for i := 0; i < 10; i++ { - nd, err := mock.MockPublicNode(ctx, mn) - if err != nil { - t.Fatal(err) - } - - nd.Namesys = namesys.NewNameSystem(nd.Routing, nd.Repo.Datastore(), 0) + n := getMockNode(t, ctx) + ns := namesys.NewNameSystem(n.dht, n.store, 0) - nodes = append(nodes, nd) + nsystems = append(nsystems, ns) + nodes = append(nodes, n) } - if err := mn.LinkAll(); err != nil { - t.Fatal(err) - } - - bsinf := bootstrap.BootstrapConfigWithPeers( - []peer.AddrInfo{ - nodes[0].Peerstore.PeerInfo(nodes[0].Identity), - }, - ) + pinfo := host.InfoFromHost(nodes[0].h) for _, n := range nodes[1:] { - if err := n.Bootstrap(bsinf); err != nil { + if err := n.h.Connect(ctx, *pinfo); err != nil { t.Fatal(err) } } // have one node publish a record that is valid for 1 second publisher := nodes[3] + p := path.FromString("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") // does not need to be valid - rp := namesys.NewIpnsPublisher(publisher.Routing, publisher.Repo.Datastore()) - name := "/ipns/" + publisher.Identity.Pretty() + rp := namesys.NewIpnsPublisher(publisher.dht, publisher.store) + name := "/ipns/" + publisher.id // Retry in case the record expires before we can fetch it. This can // happen when running the test on a slow machine. @@ -73,12 +101,12 @@ func TestRepublish(t *testing.T) { timeout := time.Second for { expiration = time.Now().Add(time.Second) - err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, expiration) + err := rp.PublishWithEOL(ctx, publisher.privKey, p, expiration) if err != nil { t.Fatal(err) } - err = verifyResolution(nodes, name, p) + err = verifyResolution(nsystems, name, p) if err == nil { break } @@ -92,14 +120,14 @@ func TestRepublish(t *testing.T) { // Now wait a second, the records will be invalid and we should fail to resolve time.Sleep(timeout) - if err := verifyResolutionFails(nodes, name); err != nil { + if err := verifyResolutionFails(nsystems, name); err != nil { t.Fatal(err) } // The republishers that are contained within the nodes have their timeout set // to 12 hours. Instead of trying to tweak those, we're just going to pretend // they don't exist and make our own. - repub := NewRepublisher(rp, publisher.Repo.Datastore(), publisher.PrivateKey, publisher.Repo.Keystore()) + repub := NewRepublisher(rp, publisher.store, publisher.privKey, publisher.keystore) repub.Interval = time.Second repub.RecordLifetime = time.Second * 5 @@ -110,7 +138,7 @@ func TestRepublish(t *testing.T) { time.Sleep(time.Second * 2) // we should be able to resolve them now - if err := verifyResolution(nodes, name, p); err != nil { + if err := verifyResolution(nsystems, name, p); err != nil { t.Fatal(err) } } @@ -121,33 +149,20 @@ func TestLongEOLRepublish(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - // create network - mn := mocknet.New(ctx) - - var nodes []*core.IpfsNode + var nsystems []namesys.NameSystem + var nodes []*mockNode for i := 0; i < 10; i++ { - nd, err := mock.MockPublicNode(ctx, mn) - if err != nil { - t.Fatal(err) - } + n := getMockNode(t, ctx) + ns := namesys.NewNameSystem(n.dht, n.store, 0) - nd.Namesys = namesys.NewNameSystem(nd.Routing, nd.Repo.Datastore(), 0) - - nodes = append(nodes, nd) + nsystems = append(nsystems, ns) + nodes = append(nodes, n) } - if err := mn.LinkAll(); err != nil { - t.Fatal(err) - } - - bsinf := bootstrap.BootstrapConfigWithPeers( - []peer.AddrInfo{ - nodes[0].Peerstore.PeerInfo(nodes[0].Identity), - }, - ) + pinfo := host.InfoFromHost(nodes[0].h) for _, n := range nodes[1:] { - if err := n.Bootstrap(bsinf); err != nil { + if err := n.h.Connect(ctx, *pinfo); err != nil { t.Fatal(err) } } @@ -155,16 +170,16 @@ func TestLongEOLRepublish(t *testing.T) { // have one node publish a record that is valid for 1 second publisher := nodes[3] p := path.FromString("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") // does not need to be valid - rp := namesys.NewIpnsPublisher(publisher.Routing, publisher.Repo.Datastore()) - name := "/ipns/" + publisher.Identity.Pretty() + rp := namesys.NewIpnsPublisher(publisher.dht, publisher.store) + name := "/ipns/" + publisher.id expiration := time.Now().Add(time.Hour) - err := rp.PublishWithEOL(ctx, publisher.PrivateKey, p, expiration) + err := rp.PublishWithEOL(ctx, publisher.privKey, p, expiration) if err != nil { t.Fatal(err) } - err = verifyResolution(nodes, name, p) + err = verifyResolution(nsystems, name, p) if err != nil { t.Fatal(err) } @@ -172,7 +187,7 @@ func TestLongEOLRepublish(t *testing.T) { // The republishers that are contained within the nodes have their timeout set // to 12 hours. Instead of trying to tweak those, we're just going to pretend // they don't exist and make our own. - repub := NewRepublisher(rp, publisher.Repo.Datastore(), publisher.PrivateKey, publisher.Repo.Keystore()) + repub := NewRepublisher(rp, publisher.store, publisher.privKey, publisher.keystore) repub.Interval = time.Millisecond * 500 repub.RecordLifetime = time.Second @@ -182,12 +197,12 @@ func TestLongEOLRepublish(t *testing.T) { // now wait a couple seconds for it to fire a few times time.Sleep(time.Second * 2) - err = verifyResolution(nodes, name, p) + err = verifyResolution(nsystems, name, p) if err != nil { t.Fatal(err) } - entry, err := getLastIPNSEntry(publisher.Repo.Datastore(), publisher.Identity) + entry, err := getLastIPNSEntry(publisher.store, publisher.h.ID()) if err != nil { t.Fatal(err) } @@ -216,11 +231,11 @@ func getLastIPNSEntry(dstore ds.Datastore, id peer.ID) (*ipns_pb.IpnsEntry, erro return e, nil } -func verifyResolution(nodes []*core.IpfsNode, key string, exp path.Path) error { +func verifyResolution(nsystems []namesys.NameSystem, key string, exp path.Path) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - for _, n := range nodes { - val, err := n.Namesys.Resolve(ctx, key) + for _, n := range nsystems { + val, err := n.Resolve(ctx, key) if err != nil { return err } @@ -232,11 +247,11 @@ func verifyResolution(nodes []*core.IpfsNode, key string, exp path.Path) error { return nil } -func verifyResolutionFails(nodes []*core.IpfsNode, key string) error { +func verifyResolutionFails(nsystems []namesys.NameSystem, key string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - for _, n := range nodes { - _, err := n.Namesys.Resolve(ctx, key) + for _, n := range nsystems { + _, err := n.Resolve(ctx, key) if err == nil { return errors.New("expected resolution to fail") } From d1e3dee42d961606fcb2dccf016dadf4c10cedb6 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 00:09:13 +0100 Subject: [PATCH 2914/3147] Add .travis, licenses, readme, gomod This commit was moved from ipfs/go-ipfs-keystore@3482535a9cc24d44a85e131e0da66ee1df21e688 --- keystore/LICENSE | 8 ++++++++ keystore/LICENSE-APACHE | 5 +++++ keystore/LICENSE-MIT | 19 ++++++++++++++++++ keystore/README.md | 43 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 keystore/LICENSE create mode 100644 keystore/LICENSE-APACHE create mode 100644 keystore/LICENSE-MIT create mode 100644 keystore/README.md diff --git a/keystore/LICENSE b/keystore/LICENSE new file mode 100644 index 0000000000..7b5f88c78e --- /dev/null +++ b/keystore/LICENSE @@ -0,0 +1,8 @@ +This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license. +Unless otherwise noted, all code contributed prior to 2019-05-06 and not contributed by +a user listed in [this signoff issue](https://github.com/ipfs/go-ipfs/issues/6302) is +licensed under MIT-only. All new contributions (and past contributions since 2019-05-06) +are licensed under a dual MIT/Apache-2.0 license. + +MIT: https://www.opensource.org/licenses/mit +Apache-2.0: https://www.apache.org/licenses/license-2.0 diff --git a/keystore/LICENSE-APACHE b/keystore/LICENSE-APACHE new file mode 100644 index 0000000000..14478a3b60 --- /dev/null +++ b/keystore/LICENSE-APACHE @@ -0,0 +1,5 @@ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/keystore/LICENSE-MIT b/keystore/LICENSE-MIT new file mode 100644 index 0000000000..72dc60d84b --- /dev/null +++ b/keystore/LICENSE-MIT @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/keystore/README.md b/keystore/README.md new file mode 100644 index 0000000000..7a74a139c8 --- /dev/null +++ b/keystore/README.md @@ -0,0 +1,43 @@ +# go-ipfs-keystore + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) + +> go-ipfs-keystore implements keystores for ipfs + +go-ipfs-keystore provides the Keystore interface for key management. Keystores support adding, retrieving, and deleting keys as well as listing all keys and checking for membership. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-ipfs-keystore` works like a regular Go module: +``` +> go get github.com/ipfs/go-ipfs-keystore +``` + +It uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. + +## Usage +``` +import "github.com/ipfs/go-ipfs-keystore" +``` + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +This project is dual-licensed under Apache 2.0 and MIT terms: + +- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) From 344b8821f36dba2eac3a484b96168b6c8cf5d44c Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 00:12:35 +0100 Subject: [PATCH 2915/3147] Add travis CI flag This commit was moved from ipfs/go-ipfs-keystore@1ca81d457701907df63297ad3b2bf4043604b81c --- keystore/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keystore/README.md b/keystore/README.md index 7a74a139c8..4dd7ef31bc 100644 --- a/keystore/README.md +++ b/keystore/README.md @@ -3,6 +3,8 @@ [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![Travis CI](https://travis-ci.org/ipfs/go-ipfs-keystore.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-keystore) + > go-ipfs-keystore implements keystores for ipfs From 61b85dd51e6417599fcc0ef24745277cbb4cf845 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 00:14:06 +0100 Subject: [PATCH 2916/3147] Switch badge to travis.com This commit was moved from ipfs/go-ipfs-keystore@2d5cf6f274d7e51ed0e69586756233d23750d1f4 --- keystore/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keystore/README.md b/keystore/README.md index 4dd7ef31bc..fc63d66f14 100644 --- a/keystore/README.md +++ b/keystore/README.md @@ -3,7 +3,7 @@ [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) [![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) -[![Travis CI](https://travis-ci.org/ipfs/go-ipfs-keystore.svg?branch=master)](https://travis-ci.org/ipfs/go-ipfs-keystore) +[![Travis CI](https://travis-ci.com/ipfs/go-ipfs-keystore.svg?branch=master)](https://travis-ci.com/ipfs/go-ipfs-keystore) > go-ipfs-keystore implements keystores for ipfs From f80f7a377db717ba4fc73eb7c23ee0a9bbdb88a0 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 00:26:19 +0100 Subject: [PATCH 2917/3147] Use extracted go-ipfs-keystore This commit was moved from ipfs/go-namesys@e77e070152877d9e588831b883a1a5bbdc7dd4f5 --- namesys/republisher/repub.go | 2 +- namesys/republisher/repub_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 52b8eb8a4d..6e2f862269 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -5,7 +5,7 @@ import ( "errors" "time" - keystore "github.com/ipfs/go-ipfs/keystore" + keystore "github.com/ipfs/go-ipfs-keystore" namesys "github.com/ipfs/go-namesys" path "github.com/ipfs/go-path" diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 3e79eb666b..0d1635aadb 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -22,7 +22,7 @@ import ( ipns_pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" - keystore "github.com/ipfs/go-ipfs/keystore" + keystore "github.com/ipfs/go-ipfs-keystore" namesys "github.com/ipfs/go-namesys" . "github.com/ipfs/go-namesys/republisher" ) From f3b8f7a7f2ba819d4a34d6abc5744b752203dbc7 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 00:28:41 +0100 Subject: [PATCH 2918/3147] README: this module does not use Gx This commit was moved from ipfs/go-ipfs-keystore@26d3af14055cdf698799e290144477cf7e641a3b --- keystore/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/keystore/README.md b/keystore/README.md index fc63d66f14..36951daa9d 100644 --- a/keystore/README.md +++ b/keystore/README.md @@ -24,8 +24,6 @@ go-ipfs-keystore provides the Keystore interface for key management. Keystores > go get github.com/ipfs/go-ipfs-keystore ``` -It uses [Gx](https://github.com/whyrusleeping/gx) to manage dependencies. - ## Usage ``` import "github.com/ipfs/go-ipfs-keystore" From 63ebbc5188858cc31958882aa39fdca93bcb4d5d Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 00:30:44 +0100 Subject: [PATCH 2919/3147] Add .travis, LICENSE, README This commit was moved from ipfs/go-namesys@5bf90d860320beefeb773f78291236c68b646c93 --- namesys/LICENSE | 8 ++++++++ namesys/LICENSE-APACHE | 5 +++++ namesys/LICENSE-MIT | 19 +++++++++++++++++++ namesys/README.md | 43 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 namesys/LICENSE create mode 100644 namesys/LICENSE-APACHE create mode 100644 namesys/LICENSE-MIT create mode 100644 namesys/README.md diff --git a/namesys/LICENSE b/namesys/LICENSE new file mode 100644 index 0000000000..7b5f88c78e --- /dev/null +++ b/namesys/LICENSE @@ -0,0 +1,8 @@ +This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license. +Unless otherwise noted, all code contributed prior to 2019-05-06 and not contributed by +a user listed in [this signoff issue](https://github.com/ipfs/go-ipfs/issues/6302) is +licensed under MIT-only. All new contributions (and past contributions since 2019-05-06) +are licensed under a dual MIT/Apache-2.0 license. + +MIT: https://www.opensource.org/licenses/mit +Apache-2.0: https://www.apache.org/licenses/license-2.0 diff --git a/namesys/LICENSE-APACHE b/namesys/LICENSE-APACHE new file mode 100644 index 0000000000..14478a3b60 --- /dev/null +++ b/namesys/LICENSE-APACHE @@ -0,0 +1,5 @@ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/namesys/LICENSE-MIT b/namesys/LICENSE-MIT new file mode 100644 index 0000000000..72dc60d84b --- /dev/null +++ b/namesys/LICENSE-MIT @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/namesys/README.md b/namesys/README.md new file mode 100644 index 0000000000..ab950f4448 --- /dev/null +++ b/namesys/README.md @@ -0,0 +1,43 @@ +# go-namesys + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![Travis CI](https://travis-ci.com/ipfs/go-namesys.svg?branch=master)](https://travis-ci.com/ipfs/go-namesys) + + +> go-namesys provides publish and resolution support for the /ipns/ namespace + +go-namesys allows to publish and resolve IPNS records or dnslink domain names. + +## Table of Contents + +- [Install](#install) +- [Usage](#usage) +- [Contribute](#contribute) +- [License](#license) + +## Install + +`go-namesys` works like a regular Go module: +``` +> go get github.com/ipfs/go-namesys +``` + +## Usage +``` +import "github.com/ipfs/go-namesys" +``` + +## Contribute + +PRs accepted. + +Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +## License + +This project is dual-licensed under Apache 2.0 and MIT terms: + +- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) From de8b73ddd55e2907d1195e2482346321896c3f2f Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 16:48:56 +0100 Subject: [PATCH 2920/3147] Fix staticcheck issues This commit was moved from ipfs/go-namesys@b5861cdf3280faf6f27d38bff5de4bf39ebf0c41 --- namesys/namesys_test.go | 4 +++- namesys/resolve_test.go | 7 +++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index cc0ca69590..68ff467441 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -120,6 +120,8 @@ func TestPublishWithCache0(t *testing.T) { } } +type ctxKey string + func TestPublishWithTTL(t *testing.T) { dst := dssync.MutexWrap(ds.NewMapDatastore()) priv, _, err := ci.GenerateKeyPair(ci.RSA, 2048) @@ -150,7 +152,7 @@ func TestPublishWithTTL(t *testing.T) { ttl := 1 * time.Second eol := time.Now().Add(2 * time.Second) - ctx := context.WithValue(context.Background(), "ipns-publish-ttl", ttl) + ctx := context.WithValue(context.Background(), ctxKey("ipns-publish-ttl"), ttl) err = nsys.Publish(ctx, priv, p) if err != nil { t.Fatal(err) diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index 4f92a2d0d0..f8b243669f 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -11,14 +11,13 @@ import ( mockrouting "github.com/ipfs/go-ipfs-routing/mock" ipns "github.com/ipfs/go-ipns" path "github.com/ipfs/go-path" - testutil "github.com/libp2p/go-libp2p-testing/net" tnet "github.com/libp2p/go-libp2p-testing/net" ) func TestRoutingResolve(t *testing.T) { dstore := dssync.MutexWrap(ds.NewMapDatastore()) serv := mockrouting.NewServer() - id := testutil.RandIdentityOrFatal(t) + id := tnet.RandIdentityOrFatal(t) d := serv.ClientWithDatastore(context.Background(), id, dstore) resolver := NewIpnsResolver(d) @@ -44,7 +43,7 @@ func TestRoutingResolve(t *testing.T) { func TestPrexistingExpiredRecord(t *testing.T) { dstore := dssync.MutexWrap(ds.NewMapDatastore()) - d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) + d := mockrouting.NewServer().ClientWithDatastore(context.Background(), tnet.RandIdentityOrFatal(t), dstore) resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) @@ -78,7 +77,7 @@ func TestPrexistingExpiredRecord(t *testing.T) { func TestPrexistingRecord(t *testing.T) { dstore := dssync.MutexWrap(ds.NewMapDatastore()) - d := mockrouting.NewServer().ClientWithDatastore(context.Background(), testutil.RandIdentityOrFatal(t), dstore) + d := mockrouting.NewServer().ClientWithDatastore(context.Background(), tnet.RandIdentityOrFatal(t), dstore) resolver := NewIpnsResolver(d) publisher := NewIpnsPublisher(d, dstore) From 92dcd0cab6744cbc201251a2be674734ea590c0c Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 17:56:39 +0100 Subject: [PATCH 2921/3147] golint: Improve package documentation and readme. This commit was moved from ipfs/go-namesys@0d5c0a8201e49123b5a6e9d9f743a89406b89533 --- namesys/README.md | 14 +++++++++++--- namesys/dns.go | 5 +++-- namesys/interface.go | 2 +- namesys/namesys.go | 13 +++++++++++++ namesys/proquint.go | 2 ++ namesys/publisher.go | 15 ++++++++++++++- namesys/republisher/repub.go | 6 ++++++ 7 files changed, 50 insertions(+), 7 deletions(-) diff --git a/namesys/README.md b/namesys/README.md index ab950f4448..5c17728da8 100644 --- a/namesys/README.md +++ b/namesys/README.md @@ -1,14 +1,20 @@ # go-namesys -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![Go Reference](https://pkg.go.dev/badge/github.com/ipfs/go-namesys.svg)](https://pkg.go.dev/github.com/ipfs/go-namesys) [![Travis CI](https://travis-ci.com/ipfs/go-namesys.svg?branch=master)](https://travis-ci.com/ipfs/go-namesys) > go-namesys provides publish and resolution support for the /ipns/ namespace -go-namesys allows to publish and resolve IPNS records or dnslink domain names. +Package namesys defines `Resolver` and `Publisher` interfaces for IPNS paths, that is, paths in the form of `/ipns/`. A "resolved" IPNS path becomes an `/ipfs/` path. + +Traditionally, these paths would be in the form of `/ipns/peer_id`, which references an IPNS record in a distributed `ValueStore` (usually the IPFS DHT). + +Additionally, the /ipns/ namespace can also be used with domain names that use DNSLink (/ipns/my.domain.example, see https://dnslink.io) and proquint strings. + +The package provides implementations for all three resolvers. ## Table of Contents @@ -29,6 +35,8 @@ go-namesys allows to publish and resolve IPNS records or dnslink domain names. import "github.com/ipfs/go-namesys" ``` +See the [Pkg.go.dev documentation](https://pkg.go.dev/github.com/ipfs/go-namesys) + ## Contribute PRs accepted. diff --git a/namesys/dns.go b/namesys/dns.go index 738612f46b..d8a42f210b 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -15,6 +15,7 @@ import ( const ethTLD = "eth" const linkTLD = "link" +// LookupTXTFunc is a generic type for a function that lookups TXT record values. type LookupTXTFunc func(name string) (txt []string, err error) // DNSResolver implements a Resolver on DNS domains @@ -146,10 +147,10 @@ func parseEntry(txt string) (path.Path, error) { return p, nil } - return tryParseDnsLink(txt) + return tryParseDNSLink(txt) } -func tryParseDnsLink(txt string) (path.Path, error) { +func tryParseDNSLink(txt string) (path.Path, error) { parts := strings.SplitN(txt, "=", 2) if len(parts) == 2 && parts[0] == "dnslink" { return path.ParsePath(parts[1]) diff --git a/namesys/interface.go b/namesys/interface.go index ecd80943be..b4136dfcc8 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -50,7 +50,7 @@ var ErrResolveRecursion = errors.New( // ErrPublishFailed signals an error when attempting to publish. var ErrPublishFailed = errors.New("could not publish name") -// Namesys represents a cohesive name publishing and resolving system. +// NameSystem represents a cohesive name publishing and resolving system. // // Publishing a name is the process of establishing a mapping, a key-value // pair, according to naming rules and databases. diff --git a/namesys/namesys.go b/namesys/namesys.go index 760d04c178..ae77771d7a 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,3 +1,16 @@ +// Package namesys defines Resolver and Publisher interfaces for IPNS paths, +// that is, IPFS paths in the form of /ipns/. A "resolved" +// IPNS path becomes an /ipfs/ path. +// +// Traditionally, these paths would be in the form of /ipns/peer_id, which +// references an IPNS record in a distributed ValueStore (usually the IPFS +// DHT). +// +// Additionally, the /ipns/ namespace can also be used with domain names that +// use DNSLink (/ipns/my.domain.example, see https://dnslink.io) and proquint +// strings. +// +// The package provides implementations for all three resolvers. package namesys import ( diff --git a/namesys/proquint.go b/namesys/proquint.go index 63cb62a047..b918ec986c 100644 --- a/namesys/proquint.go +++ b/namesys/proquint.go @@ -9,6 +9,8 @@ import ( opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ) +// ProquintResolver implements the Resolver interface for proquint identifiers +// (see http://arxiv.org/html/0901.4016). type ProquintResolver struct{} // Resolve implements Resolver. diff --git a/namesys/publisher.go b/namesys/publisher.go index f558eaf288..11cc6dcd78 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -22,6 +22,9 @@ import ( const ipnsPrefix = "/ipns/" +// DefaultRecordEOL specifies the time that the network will cache IPNS +// records after being publihsed. Records should be re-published before this +// interval expires. const DefaultRecordEOL = 24 * time.Hour // IpnsPublisher is capable of publishing and resolving names to the IPFS @@ -49,11 +52,13 @@ func (p *IpnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Pa return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordEOL)) } +// IpnsDsKey returns a datastore key given an IPNS identifier (peer +// ID). Defines the storage key for IPNS records in the local datastore. func IpnsDsKey(id peer.ID) ds.Key { return ds.NewKey("/ipns/" + base32.RawStdEncoding.EncodeToString([]byte(id))) } -// PublishedNames returns the latest IPNS records published by this node and +// ListPublished returns the latest IPNS records published by this node and // their expiration times. // // This method will not search the routing system for records published by other @@ -212,6 +217,10 @@ func checkCtxTTL(ctx context.Context) (time.Duration, bool) { return d, ok } +// PutRecordToRouting publishes the given entry using the provided ValueStore, +// using the ID associated to the provided public key and embedding the public +// key in the IPNS entry when it cannot be extracted from the ID. In that +// case, it calls PublishPublicKey in addition to PublishEntry. func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k ci.PubKey, entry *pb.IpnsEntry) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -260,6 +269,8 @@ func waitOnErrChan(ctx context.Context, errs chan error) error { } } +// PublishPublicKey stores the given public key in the ValueStore with the +// given key. func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk ci.PubKey) error { log.Debugf("Storing pubkey at: %s", k) pkbytes, err := pubk.Bytes() @@ -271,6 +282,8 @@ func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk return r.PutValue(ctx, k, pkbytes) } +// PublishEntry stores the given IpnsEntry in the ValueStore with the given +// ipnskey. func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec *pb.IpnsEntry) error { data, err := proto.Marshal(rec) if err != nil { diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 6e2f862269..4ba5d483c5 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -1,3 +1,5 @@ +// Package republisher provides a utility to automatically re-publish IPNS +// records related to the keys in a Keystore. package republisher import ( @@ -36,6 +38,8 @@ var FailureRetryInterval = time.Minute * 5 // DefaultRecordLifetime is the default lifetime for IPNS records const DefaultRecordLifetime = time.Hour * 24 +// Republisher facilitates the regular publishing of all the IPNS records +// associated to keys in a Keystore. type Republisher struct { ns namesys.Publisher ds ds.Datastore @@ -60,6 +64,8 @@ func NewRepublisher(ns namesys.Publisher, ds ds.Datastore, self ic.PrivKey, ks k } } +// Run starts the republisher facility. It can be stopped by stopping the +// provided proc. func (rp *Republisher) Run(proc goprocess.Process) { timer := time.NewTimer(InitialRebroadcastDelay) defer timer.Stop() From 9bca99eea424dd50194f9843dcdd506616fe5df4 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 18:02:09 +0100 Subject: [PATCH 2922/3147] Add link to pkg.go.dev This commit was moved from ipfs/go-ipfs-keystore@57e438e43d6628e4077ace2f7387440feaa88dce --- keystore/README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/keystore/README.md b/keystore/README.md index 36951daa9d..5fb84c6a1c 100644 --- a/keystore/README.md +++ b/keystore/README.md @@ -1,9 +1,9 @@ # go-ipfs-keystore -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![Travis CI](https://travis-ci.com/ipfs/go-ipfs-keystore.svg?branch=master)](https://travis-ci.com/ipfs/go-ipfs-keystore) +[![Go Reference](https://pkg.go.dev/badge/github.com/ipfs/go-ipfs-keystore.svg)](https://pkg.go.dev/github.com/ipfs/go-ipfs-keystore) > go-ipfs-keystore implements keystores for ipfs @@ -33,8 +33,6 @@ import "github.com/ipfs/go-ipfs-keystore" PRs accepted. -Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. - ## License This project is dual-licensed under Apache 2.0 and MIT terms: From c779e53df1b0ef1cbbf11e1a799b376dde91665e Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 18:08:36 +0100 Subject: [PATCH 2923/3147] Revert staticcheck fix as it breaks things. This commit was moved from ipfs/go-namesys@71c6e11b7f804a4053db4eaf0dd6c7cb3369ae6b --- namesys/namesys_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 68ff467441..cc0ca69590 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -120,8 +120,6 @@ func TestPublishWithCache0(t *testing.T) { } } -type ctxKey string - func TestPublishWithTTL(t *testing.T) { dst := dssync.MutexWrap(ds.NewMapDatastore()) priv, _, err := ci.GenerateKeyPair(ci.RSA, 2048) @@ -152,7 +150,7 @@ func TestPublishWithTTL(t *testing.T) { ttl := 1 * time.Second eol := time.Now().Add(2 * time.Second) - ctx := context.WithValue(context.Background(), ctxKey("ipns-publish-ttl"), ttl) + ctx := context.WithValue(context.Background(), "ipns-publish-ttl", ttl) err = nsys.Publish(ctx, priv, p) if err != nil { t.Fatal(err) From be01b8f31225f7a27ef4cf8e1233994d68bd6724 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 19 Feb 2021 21:53:22 +0100 Subject: [PATCH 2924/3147] Update publisher.go Co-authored-by: Adin Schmahmann This commit was moved from ipfs/go-namesys@e738bc0769b2eba77d0ba33e147d97293ba72c94 --- namesys/publisher.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 11cc6dcd78..e2f9e67d81 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -218,9 +218,8 @@ func checkCtxTTL(ctx context.Context) (time.Duration, bool) { } // PutRecordToRouting publishes the given entry using the provided ValueStore, -// using the ID associated to the provided public key and embedding the public -// key in the IPNS entry when it cannot be extracted from the ID. In that -// case, it calls PublishPublicKey in addition to PublishEntry. +// keyed on the ID associated with the provided public key. The public key is +// also made available to the routing system so that entries can be verified. func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k ci.PubKey, entry *pb.IpnsEntry) error { ctx, cancel := context.WithCancel(ctx) defer cancel() From ce6ed1b2303d3149a4eb8c143898040ebdeff1ea Mon Sep 17 00:00:00 2001 From: acruikshank Date: Mon, 22 Feb 2021 16:07:48 -0500 Subject: [PATCH 2925/3147] first commit This commit was moved from ipfs/go-fetcher@fae8c9ed946c4fcd02552f75c0205f9298b5087a --- fetcher/.gitignore | 0 fetcher/LICENSE | 21 ++++++ fetcher/README.md.go | 1 + fetcher/fetcher.go | 105 ++++++++++++++++++++++++++ fetcher/fetcher_test.go | 158 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 285 insertions(+) create mode 100644 fetcher/.gitignore create mode 100644 fetcher/LICENSE create mode 100644 fetcher/README.md.go create mode 100644 fetcher/fetcher.go create mode 100644 fetcher/fetcher_test.go diff --git a/fetcher/.gitignore b/fetcher/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fetcher/LICENSE b/fetcher/LICENSE new file mode 100644 index 0000000000..713896e4ef --- /dev/null +++ b/fetcher/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Eric Myhre + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/fetcher/README.md.go b/fetcher/README.md.go new file mode 100644 index 0000000000..b306ea4989 --- /dev/null +++ b/fetcher/README.md.go @@ -0,0 +1 @@ +package fetcher diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go new file mode 100644 index 0000000000..9e9062771c --- /dev/null +++ b/fetcher/fetcher.go @@ -0,0 +1,105 @@ +package fetcher + +import ( + "bytes" + "context" + "fmt" + "io" + + "github.com/ipld/go-ipld-prime/traversal/selector/builder" + + "github.com/ipld/go-ipld-prime/traversal" + + "github.com/ipld/go-ipld-prime/traversal/selector" + + "github.com/ipfs/go-bitswap" + + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + basicnode "github.com/ipld/go-ipld-prime/node/basic" +) + +// TODO: need to support sessions + +type Fetcher struct { + Exchange *bitswap.Bitswap +} + +func NewFetcher(exchange *bitswap.Bitswap) *Fetcher { + return &Fetcher{Exchange: exchange} +} + +func (f *Fetcher) FetchNode(ctx context.Context, c cid.Cid) (ipld.Node, error) { + nb := basicnode.Prototype.Any.NewBuilder() + + err := cidlink.Link{Cid: c}.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) + if err != nil { + return nil, err + } + + return nb.Build(), nil +} + +type NodeResult struct { + Node ipld.Node + Err error +} + +func (f *Fetcher) FetchMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan NodeResult, error) { + node, err := f.FetchNode(ctx, root) + if err != nil { + return nil, err + } + + results := make(chan NodeResult) + + go func() { + defer close(results) + err = traversal.Progress{ + Cfg: &traversal.Config{ + LinkLoader: f.loader(ctx), + LinkTargetNodePrototypeChooser: func(_ ipld.Link, _ ipld.LinkContext) (ipld.NodePrototype, error) { + return basicnode.Prototype__Any{}, nil + }, + }, + }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { + results <- NodeResult{Node: n} + return nil + }) + if err != nil { + results <- NodeResult{Err: err} + } + }() + + return results, nil +} + +func (f *Fetcher) FetchAll(ctx context.Context, root cid.Cid) (chan NodeResult, error) { + ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) + allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( + ssb.Matcher(), + ssb.ExploreAll(ssb.ExploreRecursiveEdge()), + )).Selector() + if err != nil { + return nil, err + } + return f.FetchMatching(ctx, root, allSelector) +} + +// TODO: take optional Cid channel for links traversed +func (f *Fetcher) loader(ctx context.Context) ipld.Loader { + return func(lnk ipld.Link, _ ipld.LinkContext) (io.Reader, error) { + cidLink, ok := lnk.(cidlink.Link) + if !ok { + return nil, fmt.Errorf("invalid link type for loading: %v", lnk) + } + + blk, err := f.Exchange.GetBlock(ctx, cidLink.Cid) + if err != nil { + return nil, err + } + + return bytes.NewReader(blk.RawData()), nil + } +} diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go new file mode 100644 index 0000000000..adb9d2b499 --- /dev/null +++ b/fetcher/fetcher_test.go @@ -0,0 +1,158 @@ +package fetcher_test + +import ( + "bytes" + "context" + "fmt" + "io" + "testing" + "time" + + testinstance "github.com/ipfs/go-bitswap/testinstance" + tn "github.com/ipfs/go-bitswap/testnet" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + delay "github.com/ipfs/go-ipfs-delay" + mockrouting "github.com/ipfs/go-ipfs-routing/mock" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/fluent" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/magiconair/properties/assert" + "github.com/stretchr/testify/require" + + "github.com/ipfs/fetcher" +) + +var _ cidlink.MulticodecDecoder = dagcbor.Decoder + +func TestFetchIPLDPrimeNode(t *testing.T) { + block, node, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + na.AssembleEntry("foo").AssignBool(true) + na.AssembleEntry("bar").AssignBool(false) + na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { + na.AssembleEntry("nonlink").AssignString("zoo") + }) + })) + + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0*time.Millisecond)) + ig := testinstance.NewTestInstanceGenerator(net, nil, nil) + defer ig.Close() + + peers := ig.Instances(2) + hasBlock := peers[0] + defer hasBlock.Exchange.Close() + + err := hasBlock.Exchange.HasBlock(block) + require.NoError(t, err) + + wantsBlock := peers[1] + defer wantsBlock.Exchange.Close() + + fetch := fetcher.NewFetcher(wantsBlock.Exchange) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + retrievedNode, err := fetch.FetchNode(ctx, block.Cid()) + require.NoError(t, err) + assert.Equal(t, node, retrievedNode) +} + +func TestFetchIPLDGraph(t *testing.T) { + block3, node3, link3 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("three").AssignBool(true) + })) + block4, node4, link4 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("four").AssignBool(true) + })) + block2, node2, link2 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + na.AssembleEntry("link3").AssignLink(link3) + na.AssembleEntry("link4").AssignLink(link4) + })) + block1, node1, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + na.AssembleEntry("foo").AssignBool(true) + na.AssembleEntry("bar").AssignBool(false) + na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { + na.AssembleEntry("link2").AssignLink(link2) + na.AssembleEntry("nonlink").AssignString("zoo") + }) + })) + + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0*time.Millisecond)) + ig := testinstance.NewTestInstanceGenerator(net, nil, nil) + defer ig.Close() + + peers := ig.Instances(2) + hasBlock := peers[0] + defer hasBlock.Exchange.Close() + + err := hasBlock.Exchange.HasBlock(block1) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block2) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block3) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block4) + require.NoError(t, err) + + wantsBlock := peers[1] + defer wantsBlock.Exchange.Close() + + fetch := fetcher.NewFetcher(wantsBlock.Exchange) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + nodeChan, err := fetch.FetchAll(ctx, block1.Cid()) + require.NoError(t, err) + + order := 0 + for res := range nodeChan { + require.NoError(t, res.Err) + + switch order { + case 0: + assert.Equal(t, node1, res.Node) + case 4: + assert.Equal(t, node2, res.Node) + case 5: + assert.Equal(t, node3, res.Node) + case 7: + assert.Equal(t, node4, res.Node) + } + order++ + } + + // expect 10 nodes altogether including sub nodes + assert.Equal(t, 10, order) +} + +func encodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { + lb := cidlink.LinkBuilder{cid.Prefix{ + Version: 1, + Codec: 0x71, + MhType: 0x17, + MhLength: 4, + }} + var b blocks.Block + lnk, err := lb.Build(context.Background(), ipld.LinkContext{}, n, + func(ipld.LinkContext) (io.Writer, ipld.StoreCommitter, error) { + buf := bytes.Buffer{} + return &buf, func(lnk ipld.Link) error { + clnk, ok := lnk.(cidlink.Link) + if !ok { + return fmt.Errorf("incorrect link type %v", lnk) + } + var err error + b, err = blocks.NewBlockWithCid(buf.Bytes(), clnk.Cid) + return err + }, nil + }, + ) + if err != nil { + panic(err) + } + return b, n, lnk +} From 61eeca5c2f60ecd8b9d1ecc944b9ebf1fd3f8bd7 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Mon, 22 Feb 2021 17:36:00 -0500 Subject: [PATCH 2926/3147] error channel, renaming This commit was moved from ipfs/go-fetcher@5aa0f059687a5791b248b880c25906a94a21bb51 --- fetcher/fetcher.go | 71 +++++++++++++++++++++++------------------ fetcher/fetcher_test.go | 37 +++++++++++++-------- 2 files changed, 63 insertions(+), 45 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 9e9062771c..cf99c60637 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -6,31 +6,34 @@ import ( "fmt" "io" - "github.com/ipld/go-ipld-prime/traversal/selector/builder" - - "github.com/ipld/go-ipld-prime/traversal" - - "github.com/ipld/go-ipld-prime/traversal/selector" - "github.com/ipfs/go-bitswap" - "github.com/ipfs/go-cid" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/ipld/go-ipld-prime/traversal" + "github.com/ipld/go-ipld-prime/traversal/selector" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) // TODO: need to support sessions type Fetcher struct { - Exchange *bitswap.Bitswap + exchange *bitswap.Bitswap +} + +type FetchResult struct { + Node ipld.Node + Path ipld.Path + LastBlockPath ipld.Path + LastBlockLink ipld.Link } -func NewFetcher(exchange *bitswap.Bitswap) *Fetcher { - return &Fetcher{Exchange: exchange} +func NewFetcher(exchange *bitswap.Bitswap) Fetcher { + return Fetcher{exchange: exchange} } -func (f *Fetcher) FetchNode(ctx context.Context, c cid.Cid) (ipld.Node, error) { +func (f Fetcher) FetchNode(ctx context.Context, c cid.Cid) (ipld.Node, error) { nb := basicnode.Prototype.Any.NewBuilder() err := cidlink.Link{Cid: c}.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) @@ -41,21 +44,20 @@ func (f *Fetcher) FetchNode(ctx context.Context, c cid.Cid) (ipld.Node, error) { return nb.Build(), nil } -type NodeResult struct { - Node ipld.Node - Err error -} - -func (f *Fetcher) FetchMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan NodeResult, error) { - node, err := f.FetchNode(ctx, root) - if err != nil { - return nil, err - } - - results := make(chan NodeResult) +func (f Fetcher) FetchMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan FetchResult, chan error) { + results := make(chan FetchResult) + errors := make(chan error) go func() { defer close(results) + + // retrieve first node + node, err := f.FetchNode(ctx, root) + if err != nil { + errors <- err + return + } + err = traversal.Progress{ Cfg: &traversal.Config{ LinkLoader: f.loader(ctx), @@ -64,38 +66,45 @@ func (f *Fetcher) FetchMatching(ctx context.Context, root cid.Cid, match selecto }, }, }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { - results <- NodeResult{Node: n} + results <- FetchResult{ + Node: n, + Path: prog.Path, + LastBlockPath: prog.LastBlock.Path, + LastBlockLink: prog.LastBlock.Link, + } return nil }) if err != nil { - results <- NodeResult{Err: err} + errors <- err + return } }() - return results, nil + return results, errors } -func (f *Fetcher) FetchAll(ctx context.Context, root cid.Cid) (chan NodeResult, error) { +func (f Fetcher) FetchAll(ctx context.Context, root cid.Cid) (chan FetchResult, chan error) { ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), ssb.ExploreAll(ssb.ExploreRecursiveEdge()), )).Selector() if err != nil { - return nil, err + errors := make(chan error, 1) + errors <- err + return nil, errors } return f.FetchMatching(ctx, root, allSelector) } -// TODO: take optional Cid channel for links traversed -func (f *Fetcher) loader(ctx context.Context) ipld.Loader { +func (f Fetcher) loader(ctx context.Context) ipld.Loader { return func(lnk ipld.Link, _ ipld.LinkContext) (io.Reader, error) { cidLink, ok := lnk.(cidlink.Link) if !ok { return nil, fmt.Errorf("invalid link type for loading: %v", lnk) } - blk, err := f.Exchange.GetBlock(ctx, cidLink.Cid) + blk, err := f.exchange.GetBlock(ctx, cidLink.Cid) if err != nil { return nil, err } diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index adb9d2b499..33fe69c97c 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -105,24 +105,33 @@ func TestFetchIPLDGraph(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - nodeChan, err := fetch.FetchAll(ctx, block1.Cid()) + nodeCh, errCh := fetch.FetchAll(ctx, block1.Cid()) require.NoError(t, err) order := 0 - for res := range nodeChan { - require.NoError(t, res.Err) - - switch order { - case 0: - assert.Equal(t, node1, res.Node) - case 4: - assert.Equal(t, node2, res.Node) - case 5: - assert.Equal(t, node3, res.Node) - case 7: - assert.Equal(t, node4, res.Node) + +Loop: + for { + select { + case res, ok := <-nodeCh: + if !ok { + break Loop + } + + switch order { + case 0: + assert.Equal(t, node1, res.Node) + case 4: + assert.Equal(t, node2, res.Node) + case 5: + assert.Equal(t, node3, res.Node) + case 7: + assert.Equal(t, node4, res.Node) + } + order++ + case err := <-errCh: + require.FailNow(t, err.Error()) } - order++ } // expect 10 nodes altogether including sub nodes From 66524ab04201444fe4e127546dbc45f16d9e481a Mon Sep 17 00:00:00 2001 From: acruikshank Date: Mon, 22 Feb 2021 17:45:35 -0500 Subject: [PATCH 2927/3147] simplify naming, add NodeAll This commit was moved from ipfs/go-fetcher@6173aee41ab6741105f08778e7662b213b3a7290 --- fetcher/fetcher.go | 63 +++++++++++++++++++++++++++-------------- fetcher/fetcher_test.go | 4 +-- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index cf99c60637..991e84a262 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -33,7 +33,7 @@ func NewFetcher(exchange *bitswap.Bitswap) Fetcher { return Fetcher{exchange: exchange} } -func (f Fetcher) FetchNode(ctx context.Context, c cid.Cid) (ipld.Node, error) { +func (f Fetcher) Block(ctx context.Context, c cid.Cid) (ipld.Node, error) { nb := basicnode.Prototype.Any.NewBuilder() err := cidlink.Link{Cid: c}.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) @@ -44,7 +44,24 @@ func (f Fetcher) FetchNode(ctx context.Context, c cid.Cid) (ipld.Node, error) { return nb.Build(), nil } -func (f Fetcher) FetchMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan FetchResult, chan error) { +func (f Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (chan FetchResult, chan error) { + results := make(chan FetchResult) + errors := make(chan error) + + go func() { + defer close(results) + + err := f.fetch(ctx, node, match, results) + if err != nil { + errors <- err + return + } + }() + + return results, errors +} + +func (f Fetcher) BlockMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan FetchResult, chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -52,28 +69,13 @@ func (f Fetcher) FetchMatching(ctx context.Context, root cid.Cid, match selector defer close(results) // retrieve first node - node, err := f.FetchNode(ctx, root) + node, err := f.Block(ctx, root) if err != nil { errors <- err return } - err = traversal.Progress{ - Cfg: &traversal.Config{ - LinkLoader: f.loader(ctx), - LinkTargetNodePrototypeChooser: func(_ ipld.Link, _ ipld.LinkContext) (ipld.NodePrototype, error) { - return basicnode.Prototype__Any{}, nil - }, - }, - }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { - results <- FetchResult{ - Node: n, - Path: prog.Path, - LastBlockPath: prog.LastBlock.Path, - LastBlockLink: prog.LastBlock.Link, - } - return nil - }) + err = f.fetch(ctx, node, match, results) if err != nil { errors <- err return @@ -83,7 +85,7 @@ func (f Fetcher) FetchMatching(ctx context.Context, root cid.Cid, match selector return results, errors } -func (f Fetcher) FetchAll(ctx context.Context, root cid.Cid) (chan FetchResult, chan error) { +func (f Fetcher) BlockAll(ctx context.Context, root cid.Cid) (chan FetchResult, chan error) { ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), @@ -94,7 +96,26 @@ func (f Fetcher) FetchAll(ctx context.Context, root cid.Cid) (chan FetchResult, errors <- err return nil, errors } - return f.FetchMatching(ctx, root, allSelector) + return f.BlockMatching(ctx, root, allSelector) +} + +func (f Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Selector, results chan FetchResult) error { + return traversal.Progress{ + Cfg: &traversal.Config{ + LinkLoader: f.loader(ctx), + LinkTargetNodePrototypeChooser: func(_ ipld.Link, _ ipld.LinkContext) (ipld.NodePrototype, error) { + return basicnode.Prototype__Any{}, nil + }, + }, + }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { + results <- FetchResult{ + Node: n, + Path: prog.Path, + LastBlockPath: prog.LastBlock.Path, + LastBlockLink: prog.LastBlock.Link, + } + return nil + }) } func (f Fetcher) loader(ctx context.Context) ipld.Loader { diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 33fe69c97c..456531f100 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -55,7 +55,7 @@ func TestFetchIPLDPrimeNode(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - retrievedNode, err := fetch.FetchNode(ctx, block.Cid()) + retrievedNode, err := fetch.Block(ctx, block.Cid()) require.NoError(t, err) assert.Equal(t, node, retrievedNode) } @@ -105,7 +105,7 @@ func TestFetchIPLDGraph(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - nodeCh, errCh := fetch.FetchAll(ctx, block1.Cid()) + nodeCh, errCh := fetch.BlockAll(ctx, block1.Cid()) require.NoError(t, err) order := 0 From 2079cd087a3c7e352f5f9ec64a04d9cc1287c414 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 22 Feb 2021 17:07:19 -0800 Subject: [PATCH 2928/3147] feat(fetcher): use block getter interface This commit was moved from ipfs/go-fetcher@a634b13c7b7144cadf8c434033959b1fb6292791 --- fetcher/fetcher.go | 12 +++++------- fetcher/fetcher_test.go | 11 +++++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 991e84a262..230b30b42c 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -6,7 +6,7 @@ import ( "fmt" "io" - "github.com/ipfs/go-bitswap" + "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" @@ -16,10 +16,8 @@ import ( "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) -// TODO: need to support sessions - type Fetcher struct { - exchange *bitswap.Bitswap + blockGetter blockservice.BlockGetter } type FetchResult struct { @@ -29,8 +27,8 @@ type FetchResult struct { LastBlockLink ipld.Link } -func NewFetcher(exchange *bitswap.Bitswap) Fetcher { - return Fetcher{exchange: exchange} +func NewFetcher(blockGetter blockservice.BlockGetter) Fetcher { + return Fetcher{blockGetter: blockGetter} } func (f Fetcher) Block(ctx context.Context, c cid.Cid) (ipld.Node, error) { @@ -125,7 +123,7 @@ func (f Fetcher) loader(ctx context.Context) ipld.Loader { return nil, fmt.Errorf("invalid link type for loading: %v", lnk) } - blk, err := f.exchange.GetBlock(ctx, cidLink.Cid) + blk, err := f.blockGetter.GetBlock(ctx, cidLink.Cid) if err != nil { return nil, err } diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 456531f100..6a83670c75 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -11,6 +11,7 @@ import ( testinstance "github.com/ipfs/go-bitswap/testinstance" tn "github.com/ipfs/go-bitswap/testnet" blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" delay "github.com/ipfs/go-ipfs-delay" mockrouting "github.com/ipfs/go-ipfs-routing/mock" @@ -50,7 +51,8 @@ func TestFetchIPLDPrimeNode(t *testing.T) { wantsBlock := peers[1] defer wantsBlock.Exchange.Close() - fetch := fetcher.NewFetcher(wantsBlock.Exchange) + wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) + fetch := fetcher.NewFetcher(wantsGetter) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -100,7 +102,8 @@ func TestFetchIPLDGraph(t *testing.T) { wantsBlock := peers[1] defer wantsBlock.Exchange.Close() - fetch := fetcher.NewFetcher(wantsBlock.Exchange) + wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) + fetch := fetcher.NewFetcher(wantsGetter) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -141,9 +144,9 @@ Loop: func encodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { lb := cidlink.LinkBuilder{cid.Prefix{ Version: 1, - Codec: 0x71, + Codec: cid.DagCBOR, MhType: 0x17, - MhLength: 4, + MhLength: 20, }} var b blocks.Block lnk, err := lb.Build(context.Background(), ipld.LinkContext{}, n, From 2181e98e7fa53ce88cdc29de2be63344e45b072f Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 22 Feb 2021 17:20:08 -0800 Subject: [PATCH 2929/3147] feat(fetcher): define sessions make a fetcher by default a session, with the singleton instance just being a config. only allow fetching methods on a session This commit was moved from ipfs/go-fetcher@62cdc719c38ebcd7240b3940444573032610e41c --- fetcher/fetcher.go | 31 +++++++++++++++++++++++-------- fetcher/fetcher_test.go | 7 ++++--- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 230b30b42c..9147771a35 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -16,7 +16,15 @@ import ( "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) +type FetcherConfig struct { + blockService blockservice.BlockService +} + type Fetcher struct { + // TODO: for now, passing this to instantiation of block session is enough to + // cancel on session context cancel, but we may want to use this direct reference + // more tightly in this code + ctx context.Context blockGetter blockservice.BlockGetter } @@ -27,11 +35,18 @@ type FetchResult struct { LastBlockLink ipld.Link } -func NewFetcher(blockGetter blockservice.BlockGetter) Fetcher { - return Fetcher{blockGetter: blockGetter} +func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { + return FetcherConfig{blockService: blockService} +} + +func (fc FetcherConfig) NewSession(ctx context.Context) *Fetcher { + return &Fetcher{ + ctx: ctx, + blockGetter: blockservice.NewSession(ctx, fc.blockService), + } } -func (f Fetcher) Block(ctx context.Context, c cid.Cid) (ipld.Node, error) { +func (f *Fetcher) Block(ctx context.Context, c cid.Cid) (ipld.Node, error) { nb := basicnode.Prototype.Any.NewBuilder() err := cidlink.Link{Cid: c}.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) @@ -42,7 +57,7 @@ func (f Fetcher) Block(ctx context.Context, c cid.Cid) (ipld.Node, error) { return nb.Build(), nil } -func (f Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (chan FetchResult, chan error) { +func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (chan FetchResult, chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -59,7 +74,7 @@ func (f Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selecto return results, errors } -func (f Fetcher) BlockMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan FetchResult, chan error) { +func (f *Fetcher) BlockMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan FetchResult, chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -83,7 +98,7 @@ func (f Fetcher) BlockMatching(ctx context.Context, root cid.Cid, match selector return results, errors } -func (f Fetcher) BlockAll(ctx context.Context, root cid.Cid) (chan FetchResult, chan error) { +func (f *Fetcher) BlockAll(ctx context.Context, root cid.Cid) (chan FetchResult, chan error) { ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), @@ -97,7 +112,7 @@ func (f Fetcher) BlockAll(ctx context.Context, root cid.Cid) (chan FetchResult, return f.BlockMatching(ctx, root, allSelector) } -func (f Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Selector, results chan FetchResult) error { +func (f *Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Selector, results chan FetchResult) error { return traversal.Progress{ Cfg: &traversal.Config{ LinkLoader: f.loader(ctx), @@ -116,7 +131,7 @@ func (f Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Selec }) } -func (f Fetcher) loader(ctx context.Context) ipld.Loader { +func (f *Fetcher) loader(ctx context.Context) ipld.Loader { return func(lnk ipld.Link, _ ipld.LinkContext) (io.Reader, error) { cidLink, ok := lnk.(cidlink.Link) if !ok { diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 6a83670c75..52965af2d8 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -52,7 +52,8 @@ func TestFetchIPLDPrimeNode(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetch := fetcher.NewFetcher(wantsGetter) + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetch := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -103,8 +104,8 @@ func TestFetchIPLDGraph(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetch := fetcher.NewFetcher(wantsGetter) - + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetch := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() From f19805da54b34924f85f528765d7af0943470e0c Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 25 Feb 2021 17:35:05 -0500 Subject: [PATCH 2930/3147] rework signatures to address types and document This commit was moved from ipfs/go-fetcher@20a76f27feaa685613a4103731b4a1d2075a0fb8 --- fetcher/.gitignore | 1 + fetcher/fetcher.go | 48 ++++++++++++++++++++++++++++++----------- fetcher/fetcher_test.go | 4 ++-- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/fetcher/.gitignore b/fetcher/.gitignore index e69de29bb2..485dee64bc 100644 --- a/fetcher/.gitignore +++ b/fetcher/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 9147771a35..a8afc83a2d 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -7,7 +7,6 @@ import ( "io" "github.com/ipfs/go-blockservice" - "github.com/ipfs/go-cid" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" @@ -21,10 +20,6 @@ type FetcherConfig struct { } type Fetcher struct { - // TODO: for now, passing this to instantiation of block session is enough to - // cancel on session context cancel, but we may want to use this direct reference - // more tightly in this code - ctx context.Context blockGetter blockservice.BlockGetter } @@ -35,21 +30,29 @@ type FetchResult struct { LastBlockLink ipld.Link } +// NewFetcherConfig creates a FetchConfig from which session may be created and nodes retrieved. func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { return FetcherConfig{blockService: blockService} } +// NewSession creates a session from which nodes may be retrieved. +// The session ends when the provided context is canceled. func (fc FetcherConfig) NewSession(ctx context.Context) *Fetcher { return &Fetcher{ - ctx: ctx, blockGetter: blockservice.NewSession(ctx, fc.blockService), } } -func (f *Fetcher) Block(ctx context.Context, c cid.Cid) (ipld.Node, error) { - nb := basicnode.Prototype.Any.NewBuilder() +// Block fetches a schemaless node graph corresponding to single block by link. +func (f *Fetcher) Block(ctx context.Context, link ipld.Link) (ipld.Node, error) { + return f.BlockOfType(ctx, link, basicnode.Prototype.Any) +} + +// BlockOfType fetches a node graph of the provided type corresponding to single block by link. +func (f *Fetcher) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) { + nb := ptype.NewBuilder() - err := cidlink.Link{Cid: c}.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) + err := link.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) if err != nil { return nil, err } @@ -57,6 +60,8 @@ func (f *Fetcher) Block(ctx context.Context, c cid.Cid) (ipld.Node, error) { return nb.Build(), nil } +// NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing +// block boundaries. Each matched node is sent to the FetchResult channel. func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (chan FetchResult, chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -74,7 +79,16 @@ func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match select return results, errors } -func (f *Fetcher) BlockMatching(ctx context.Context, root cid.Cid, match selector.Selector) (chan FetchResult, chan error) { +// BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing +// block boundaries. Each matched node is sent to the FetchResult channel. +func (f *Fetcher) BlockMatching(ctx context.Context, root ipld.Link, match selector.Selector) (chan FetchResult, chan error) { + return f.BlockMatchingOfType(ctx, root, match, basicnode.Prototype.Any) +} + +// BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly +// crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is sent to +// the FetchResult channel. +func (f *Fetcher) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (chan FetchResult, chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -82,7 +96,7 @@ func (f *Fetcher) BlockMatching(ctx context.Context, root cid.Cid, match selecto defer close(results) // retrieve first node - node, err := f.Block(ctx, root) + node, err := f.BlockOfType(ctx, root, ptype) if err != nil { errors <- err return @@ -98,7 +112,15 @@ func (f *Fetcher) BlockMatching(ctx context.Context, root cid.Cid, match selecto return results, errors } -func (f *Fetcher) BlockAll(ctx context.Context, root cid.Cid) (chan FetchResult, chan error) { +// BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results +// channel. +func (f *Fetcher) BlockAll(ctx context.Context, root ipld.Link) (chan FetchResult, chan error) { + return f.BlockAllOfType(ctx, root, basicnode.Prototype.Any) +} + +// BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype +// and send over the results channel. +func (f *Fetcher) BlockAllOfType(ctx context.Context, root ipld.Link, ptype ipld.NodePrototype) (chan FetchResult, chan error) { ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), @@ -109,7 +131,7 @@ func (f *Fetcher) BlockAll(ctx context.Context, root cid.Cid) (chan FetchResult, errors <- err return nil, errors } - return f.BlockMatching(ctx, root, allSelector) + return f.BlockMatchingOfType(ctx, root, allSelector, ptype) } func (f *Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Selector, results chan FetchResult) error { diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 52965af2d8..e1f75f966c 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -58,7 +58,7 @@ func TestFetchIPLDPrimeNode(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - retrievedNode, err := fetch.Block(ctx, block.Cid()) + retrievedNode, err := fetch.Block(ctx, cidlink.Link{Cid: block.Cid()}) require.NoError(t, err) assert.Equal(t, node, retrievedNode) } @@ -109,7 +109,7 @@ func TestFetchIPLDGraph(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - nodeCh, errCh := fetch.BlockAll(ctx, block1.Cid()) + nodeCh, errCh := fetch.BlockAll(ctx, cidlink.Link{Cid: block1.Cid()}) require.NoError(t, err) order := 0 From ea1834b2c605037858662f0d4de58fb112217744 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 25 Feb 2021 17:44:54 -0500 Subject: [PATCH 2931/3147] de-emptify the README This commit was moved from ipfs/go-fetcher@d18f1639fc1a60d9a4334362e7dfe2c0243467da --- fetcher/README.md | 15 +++++++++++++++ fetcher/README.md.go | 1 - 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 fetcher/README.md delete mode 100644 fetcher/README.md.go diff --git a/fetcher/README.md b/fetcher/README.md new file mode 100644 index 0000000000..bc1410afca --- /dev/null +++ b/fetcher/README.md @@ -0,0 +1,15 @@ +go-fetcher +================== + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) + +Go-fetcher is a library to retrieve IPLD prime nodes from IPFS using Bitswap. + +## Contribute + +PRs are welcome! + +## License + +MIT \ No newline at end of file diff --git a/fetcher/README.md.go b/fetcher/README.md.go deleted file mode 100644 index b306ea4989..0000000000 --- a/fetcher/README.md.go +++ /dev/null @@ -1 +0,0 @@ -package fetcher From 955784e155713db0d83b2cf0de5f4bf6ce355711 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 25 Feb 2021 17:55:24 -0500 Subject: [PATCH 2932/3147] support protobuf and raw nodes from fetcher This commit was moved from ipfs/go-fetcher@b89fa245d72bda38156ce6a600fc0c3f32dc72c2 --- fetcher/fetcher.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index a8afc83a2d..5145754cbf 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -6,6 +6,8 @@ import ( "fmt" "io" + dagpb "github.com/ipld/go-ipld-prime-proto" + "github.com/ipfs/go-blockservice" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" @@ -138,9 +140,9 @@ func (f *Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Sele return traversal.Progress{ Cfg: &traversal.Config{ LinkLoader: f.loader(ctx), - LinkTargetNodePrototypeChooser: func(_ ipld.Link, _ ipld.LinkContext) (ipld.NodePrototype, error) { + LinkTargetNodePrototypeChooser: dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, _ ipld.LinkContext) (ipld.NodePrototype, error) { return basicnode.Prototype__Any{}, nil - }, + }), }, }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { results <- FetchResult{ From b63141f65929a27d5bf90d83c5b6cd28efb02db5 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 25 Feb 2021 18:02:17 -0500 Subject: [PATCH 2933/3147] better chooser This commit was moved from ipfs/go-fetcher@a5568f5b87da6e8e4bf28f8175e2e7c1dfb2c4b8 --- fetcher/fetcher.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 5145754cbf..5715297b6b 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -6,6 +6,8 @@ import ( "fmt" "io" + "github.com/ipld/go-ipld-prime/schema" + dagpb "github.com/ipld/go-ipld-prime-proto" "github.com/ipfs/go-blockservice" @@ -140,8 +142,11 @@ func (f *Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Sele return traversal.Progress{ Cfg: &traversal.Config{ LinkLoader: f.loader(ctx), - LinkTargetNodePrototypeChooser: dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, _ ipld.LinkContext) (ipld.NodePrototype, error) { - return basicnode.Prototype__Any{}, nil + LinkTargetNodePrototypeChooser: dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil }), }, }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { From d0a4c9d42d9b8e3e824fdcdbd680bcb8dfb7b6c0 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Fri, 26 Feb 2021 11:23:20 -0500 Subject: [PATCH 2934/3147] assign prototypes based on Cid prefix whenn otherwise untyped This commit was moved from ipfs/go-fetcher@5bbfe2a464938759ba9435f1f740c10c3326450c --- fetcher/fetcher.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 5715297b6b..36f253db7d 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -49,7 +49,11 @@ func (fc FetcherConfig) NewSession(ctx context.Context) *Fetcher { // Block fetches a schemaless node graph corresponding to single block by link. func (f *Fetcher) Block(ctx context.Context, link ipld.Link) (ipld.Node, error) { - return f.BlockOfType(ctx, link, basicnode.Prototype.Any) + prototype, err := prototypeFromLink(link) + if err != nil { + return nil, err + } + return f.BlockOfType(ctx, link, prototype) } // BlockOfType fetches a node graph of the provided type corresponding to single block by link. @@ -86,7 +90,13 @@ func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match select // BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. func (f *Fetcher) BlockMatching(ctx context.Context, root ipld.Link, match selector.Selector) (chan FetchResult, chan error) { - return f.BlockMatchingOfType(ctx, root, match, basicnode.Prototype.Any) + prototype, err := prototypeFromLink(root) + if err != nil { + errors := make(chan error, 1) + errors <- err + return nil, errors + } + return f.BlockMatchingOfType(ctx, root, match, prototype) } // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly @@ -119,7 +129,13 @@ func (f *Fetcher) BlockMatchingOfType(ctx context.Context, root ipld.Link, match // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. func (f *Fetcher) BlockAll(ctx context.Context, root ipld.Link) (chan FetchResult, chan error) { - return f.BlockAllOfType(ctx, root, basicnode.Prototype.Any) + prototype, err := prototypeFromLink(root) + if err != nil { + errors := make(chan error, 1) + errors <- err + return nil, errors + } + return f.BlockAllOfType(ctx, root, prototype) } // BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype @@ -175,3 +191,9 @@ func (f *Fetcher) loader(ctx context.Context) ipld.Loader { return bytes.NewReader(blk.RawData()), nil } } + +func prototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, error) { + return dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + return basicnode.Prototype__Any{}, nil + })(lnk, ipld.LinkContext{}) +} From 0f0dc9b1716926166b3252cff269beffd49e4092 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Fri, 26 Feb 2021 11:27:13 -0500 Subject: [PATCH 2935/3147] declare returned chans readonly This commit was moved from ipfs/go-fetcher@ad44b88fc50918fd4d308fa8db9a05968a479910 --- fetcher/fetcher.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 36f253db7d..00ab2291ec 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -70,7 +70,7 @@ func (f *Fetcher) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.No // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. -func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (chan FetchResult, chan error) { +func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -89,7 +89,7 @@ func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match select // BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. -func (f *Fetcher) BlockMatching(ctx context.Context, root ipld.Link, match selector.Selector) (chan FetchResult, chan error) { +func (f *Fetcher) BlockMatching(ctx context.Context, root ipld.Link, match selector.Selector) (<-chan FetchResult, <-chan error) { prototype, err := prototypeFromLink(root) if err != nil { errors := make(chan error, 1) @@ -102,7 +102,7 @@ func (f *Fetcher) BlockMatching(ctx context.Context, root ipld.Link, match selec // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is sent to // the FetchResult channel. -func (f *Fetcher) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (chan FetchResult, chan error) { +func (f *Fetcher) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -128,7 +128,7 @@ func (f *Fetcher) BlockMatchingOfType(ctx context.Context, root ipld.Link, match // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. -func (f *Fetcher) BlockAll(ctx context.Context, root ipld.Link) (chan FetchResult, chan error) { +func (f *Fetcher) BlockAll(ctx context.Context, root ipld.Link) (<-chan FetchResult, <-chan error) { prototype, err := prototypeFromLink(root) if err != nil { errors := make(chan error, 1) @@ -140,7 +140,7 @@ func (f *Fetcher) BlockAll(ctx context.Context, root ipld.Link) (chan FetchResul // BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype // and send over the results channel. -func (f *Fetcher) BlockAllOfType(ctx context.Context, root ipld.Link, ptype ipld.NodePrototype) (chan FetchResult, chan error) { +func (f *Fetcher) BlockAllOfType(ctx context.Context, root ipld.Link, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), From d80f2f337777d9311b7091be8c46b1e2030fe9c4 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 1 Mar 2021 15:22:05 -0800 Subject: [PATCH 2936/3147] feat(fetcher): correct module name to match URL This commit was moved from ipfs/go-fetcher@eec0fbe50e4460cd31068d3b39ee6844cfd006a3 --- fetcher/fetcher_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 52965af2d8..d755fff37c 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -23,7 +23,7 @@ import ( "github.com/magiconair/properties/assert" "github.com/stretchr/testify/require" - "github.com/ipfs/fetcher" + "github.com/ipfs/go-fetcher" ) var _ cidlink.MulticodecDecoder = dagcbor.Decoder From 1ed85bc6dcd3a131c112b96e92abb5bececa67e3 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Tue, 2 Mar 2021 12:56:38 -0500 Subject: [PATCH 2937/3147] replace go-merkledag with go-fetcher This commit was moved from ipfs/go-ipfs-provider@fb15f2eef31d8dabde1c36bc885180a1b722a1b7 --- provider/simple/reprovide.go | 28 ++++++++++++++++++---------- provider/simple/reprovide_test.go | 10 +++++++--- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index bfe6173e1d..739ccd95ba 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -4,15 +4,15 @@ import ( "context" "errors" "fmt" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" "time" "github.com/cenkalti/backoff" "github.com/ipfs/go-cid" "github.com/ipfs/go-cidutil" + "github.com/ipfs/go-fetcher" blocks "github.com/ipfs/go-ipfs-blockstore" - ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" - "github.com/ipfs/go-merkledag" "github.com/ipfs/go-verifcid" "github.com/libp2p/go-libp2p-core/routing" ) @@ -184,9 +184,9 @@ type Pinner interface { } // NewPinnedProvider returns provider supplying pinned keys -func NewPinnedProvider(onlyRoots bool, pinning Pinner, dag ipld.DAGService) KeyChanFunc { +func NewPinnedProvider(onlyRoots bool, pinning Pinner, fetchConfig fetcher.FetcherConfig) KeyChanFunc { return func(ctx context.Context) (<-chan cid.Cid, error) { - set, err := pinSet(ctx, pinning, dag, onlyRoots) + set, err := pinSet(ctx, pinning, fetchConfig, onlyRoots) if err != nil { return nil, err } @@ -208,7 +208,7 @@ func NewPinnedProvider(onlyRoots bool, pinning Pinner, dag ipld.DAGService) KeyC } } -func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { +func pinSet(ctx context.Context, pinning Pinner, fetchConfig fetcher.FetcherConfig, onlyRoots bool) (*cidutil.StreamingSet, error) { set := cidutil.NewStreamingSet() go func() { @@ -230,12 +230,20 @@ func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots logR.Errorf("reprovide indirect pins: %s", err) return } + + session := fetchConfig.NewSession(ctx) for _, key := range rkeys { - if onlyRoots { - set.Visitor(ctx)(key) - } else { - err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) - if err != nil { + set.Visitor(ctx)(key) + if !onlyRoots { + nodeCh, errCh := fetcher.BlockAll(ctx, session, cidlink.Link{key}) + for res := range nodeCh { + clink, ok := res.LastBlockLink.(cidlink.Link) + if ok { + set.Visitor(ctx)(clink.Cid) + } + } + + if err := <-errCh; err != nil { logR.Errorf("reprovide indirect pins: %s", err) return } diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 3858baf5e9..913ca072c4 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -9,11 +9,13 @@ import ( "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" + "github.com/ipfs/go-fetcher" "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" mock "github.com/ipfs/go-ipfs-routing/mock" cbor "github.com/ipfs/go-ipld-cbor" - merkledag "github.com/ipfs/go-merkledag" + "github.com/ipld/go-ipld-prime/codec/dagcbor" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" peer "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-testing/net" mh "github.com/multiformats/go-multihash" @@ -21,6 +23,8 @@ import ( . "github.com/ipfs/go-ipfs-provider/simple" ) +var _ cidlink.MulticodecDecoder = dagcbor.Decoder + func setupRouting(t *testing.T) (clA, clB mock.Client, idA, idB peer.ID) { mrserv := mock.NewServer() @@ -195,7 +199,7 @@ func TestReprovidePinned(t *testing.T) { nodes, bstore := setupDag(t) - dag := merkledag.NewDAGService(bsrv.New(bstore, offline.Exchange(bstore))) + fetchConfig := fetcher.NewFetcherConfig(bsrv.New(bstore, offline.Exchange(bstore))) for i := 0; i < 2; i++ { clA, clB, idA, _ := setupRouting(t) @@ -215,7 +219,7 @@ func TestReprovidePinned(t *testing.T) { keyProvider := NewPinnedProvider(onlyRoots, &mockPinner{ recursive: []cid.Cid{nodes[1]}, direct: []cid.Cid{nodes[3]}, - }, dag) + }, fetchConfig) reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) err := reprov.Reprovide() From 15561c1ec81ad05d15d67a0696686ccdad1b9fa8 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Mon, 1 Mar 2021 11:47:14 -0500 Subject: [PATCH 2938/3147] split into common interface and helper methods This commit was moved from ipfs/go-fetcher@3ccc95e8d72c70af7c3cc808377ec5417d47ae70 --- fetcher/fetcher.go | 85 +++++++++++++++------------- fetcher/fetcher_test.go | 121 ++++++++++++++++++++++++++++++++++------ 2 files changed, 151 insertions(+), 55 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 00ab2291ec..e1fd9e87b2 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -23,7 +23,21 @@ type FetcherConfig struct { blockService blockservice.BlockService } -type Fetcher struct { +type Fetcher interface { + // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing + // block boundaries. Each matched node is sent to the FetchResult channel. + NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) + + // BlockOfType fetches a node graph of the provided type corresponding to single block by link. + BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) + + // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly + // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is sent to + // the FetchResult channel. + BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) +} + +type fetcherSession struct { blockGetter blockservice.BlockGetter } @@ -41,23 +55,14 @@ func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { // NewSession creates a session from which nodes may be retrieved. // The session ends when the provided context is canceled. -func (fc FetcherConfig) NewSession(ctx context.Context) *Fetcher { - return &Fetcher{ +func (fc FetcherConfig) NewSession(ctx context.Context) Fetcher { + return &fetcherSession{ blockGetter: blockservice.NewSession(ctx, fc.blockService), } } -// Block fetches a schemaless node graph corresponding to single block by link. -func (f *Fetcher) Block(ctx context.Context, link ipld.Link) (ipld.Node, error) { - prototype, err := prototypeFromLink(link) - if err != nil { - return nil, err - } - return f.BlockOfType(ctx, link, prototype) -} - // BlockOfType fetches a node graph of the provided type corresponding to single block by link. -func (f *Fetcher) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) { +func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) { nb := ptype.NewBuilder() err := link.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) @@ -68,9 +73,7 @@ func (f *Fetcher) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.No return nb.Build(), nil } -// NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing -// block boundaries. Each matched node is sent to the FetchResult channel. -func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) { +func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -87,22 +90,7 @@ func (f *Fetcher) NodeMatching(ctx context.Context, node ipld.Node, match select return results, errors } -// BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing -// block boundaries. Each matched node is sent to the FetchResult channel. -func (f *Fetcher) BlockMatching(ctx context.Context, root ipld.Link, match selector.Selector) (<-chan FetchResult, <-chan error) { - prototype, err := prototypeFromLink(root) - if err != nil { - errors := make(chan error, 1) - errors <- err - return nil, errors - } - return f.BlockMatchingOfType(ctx, root, match, prototype) -} - -// BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly -// crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is sent to -// the FetchResult channel. -func (f *Fetcher) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { +func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { results := make(chan FetchResult) errors := make(chan error) @@ -126,22 +114,43 @@ func (f *Fetcher) BlockMatchingOfType(ctx context.Context, root ipld.Link, match return results, errors } +// Block fetches a schemaless node graph corresponding to single block by link. +func Block(ctx context.Context, f Fetcher, link ipld.Link) (ipld.Node, error) { + prototype, err := prototypeFromLink(link) + if err != nil { + return nil, err + } + return f.BlockOfType(ctx, link, prototype) +} + +// BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing +// block boundaries. Each matched node is sent to the FetchResult channel. +func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selector.Selector) (<-chan FetchResult, <-chan error) { + prototype, err := prototypeFromLink(root) + if err != nil { + errors := make(chan error, 1) + errors <- err + return nil, errors + } + return f.BlockMatchingOfType(ctx, root, match, prototype) +} + // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. -func (f *Fetcher) BlockAll(ctx context.Context, root ipld.Link) (<-chan FetchResult, <-chan error) { +func BlockAll(ctx context.Context, f Fetcher, root ipld.Link) (<-chan FetchResult, <-chan error) { prototype, err := prototypeFromLink(root) if err != nil { errors := make(chan error, 1) errors <- err return nil, errors } - return f.BlockAllOfType(ctx, root, prototype) + return BlockAllOfType(ctx, f, root, prototype) } // BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype // and send over the results channel. -func (f *Fetcher) BlockAllOfType(ctx context.Context, root ipld.Link, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { - ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) +func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { + ssb := builder.NewSelectorSpecBuilder(ptype) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), ssb.ExploreAll(ssb.ExploreRecursiveEdge()), @@ -154,7 +163,7 @@ func (f *Fetcher) BlockAllOfType(ctx context.Context, root ipld.Link, ptype ipld return f.BlockMatchingOfType(ctx, root, allSelector, ptype) } -func (f *Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Selector, results chan FetchResult) error { +func (f *fetcherSession) fetch(ctx context.Context, node ipld.Node, match selector.Selector, results chan FetchResult) error { return traversal.Progress{ Cfg: &traversal.Config{ LinkLoader: f.loader(ctx), @@ -176,7 +185,7 @@ func (f *Fetcher) fetch(ctx context.Context, node ipld.Node, match selector.Sele }) } -func (f *Fetcher) loader(ctx context.Context) ipld.Loader { +func (f *fetcherSession) loader(ctx context.Context) ipld.Loader { return func(lnk ipld.Link, _ ipld.LinkContext) (io.Reader, error) { cidLink, ok := lnk.(cidlink.Link) if !ok { diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index e10aab8d24..aa40fe1bba 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -8,6 +8,9 @@ import ( "testing" "time" + "github.com/ipld/go-ipld-prime/traversal/selector" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" + testinstance "github.com/ipfs/go-bitswap/testinstance" tn "github.com/ipfs/go-bitswap/testnet" blocks "github.com/ipfs/go-block-format" @@ -53,12 +56,12 @@ func TestFetchIPLDPrimeNode(t *testing.T) { wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) - fetch := fetcherConfig.NewSession(context.Background()) + session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - retrievedNode, err := fetch.Block(ctx, cidlink.Link{Cid: block.Cid()}) + retrievedNode, err := fetcher.Block(ctx, session, cidlink.Link{Cid: block.Cid()}) require.NoError(t, err) assert.Equal(t, node, retrievedNode) } @@ -105,15 +108,106 @@ func TestFetchIPLDGraph(t *testing.T) { wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) - fetch := fetcherConfig.NewSession(context.Background()) + session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - nodeCh, errCh := fetch.BlockAll(ctx, cidlink.Link{Cid: block1.Cid()}) + nodeCh, errCh := fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}) require.NoError(t, err) - order := 0 + assertNodesInOrder(t, nodeCh, errCh, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) +} + +func TestHelpers(t *testing.T) { + block3, node3, link3 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("three").AssignBool(true) + })) + block4, node4, link4 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("four").AssignBool(true) + })) + block2, node2, link2 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + na.AssembleEntry("link3").AssignLink(link3) + na.AssembleEntry("link4").AssignLink(link4) + })) + block1, node1, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + na.AssembleEntry("foo").AssignBool(true) + na.AssembleEntry("bar").AssignBool(false) + na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { + na.AssembleEntry("link2").AssignLink(link2) + na.AssembleEntry("nonlink").AssignString("zoo") + }) + })) + + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0*time.Millisecond)) + ig := testinstance.NewTestInstanceGenerator(net, nil, nil) + defer ig.Close() + + peers := ig.Instances(2) + hasBlock := peers[0] + defer hasBlock.Exchange.Close() + + err := hasBlock.Exchange.HasBlock(block1) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block2) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block3) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block4) + require.NoError(t, err) + + wantsBlock := peers[1] + defer wantsBlock.Exchange.Close() + + wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) + t.Run("Block retrieves node", func(t *testing.T) { + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + session := fetcherConfig.NewSession(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + node, err := fetcher.Block(ctx, session, cidlink.Link{Cid: block1.Cid()}) + require.NoError(t, err) + + assert.Equal(t, node, node1) + }) + + t.Run("BlockMatching retrieves nodes matching selector", func(t *testing.T) { + // limit recursion depth to 2 nodes and expect to get only 2 blocks (4 nodes) + ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) + sel, err := ssb.ExploreRecursive(selector.RecursionLimitDepth(2), ssb.ExploreUnion( + ssb.Matcher(), + ssb.ExploreAll(ssb.ExploreRecursiveEdge()), + )).Selector() + require.NoError(t, err) + + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + session := fetcherConfig.NewSession(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + nodeCh, errCh := fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel) + require.NoError(t, err) + + assertNodesInOrder(t, nodeCh, errCh, 4, map[int]ipld.Node{0: node1, 4: node2}) + }) + + t.Run("BlockAllOfType retrieves all nodes with a schema", func(t *testing.T) { + // limit recursion depth to 2 nodes and expect to get only 2 blocks (4 nodes) + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + session := fetcherConfig.NewSession(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + nodeCh, errCh := fetcher.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}) + require.NoError(t, err) + + assertNodesInOrder(t, nodeCh, errCh, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) + }) +} + +func assertNodesInOrder(t *testing.T, nodeCh <-chan fetcher.FetchResult, errCh <-chan error, nodeCount int, nodes map[int]ipld.Node) { + order := 0 Loop: for { select { @@ -122,24 +216,17 @@ Loop: break Loop } - switch order { - case 0: - assert.Equal(t, node1, res.Node) - case 4: - assert.Equal(t, node2, res.Node) - case 5: - assert.Equal(t, node3, res.Node) - case 7: - assert.Equal(t, node4, res.Node) + expectedNode, ok := nodes[order] + if ok { + assert.Equal(t, expectedNode, res.Node) } + order++ case err := <-errCh: require.FailNow(t, err.Error()) } } - - // expect 10 nodes altogether including sub nodes - assert.Equal(t, 10, order) + assert.Equal(t, nodeCount, order) } func encodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { From d9b012ac641221bab6c9484c32ca13709a0451fe Mon Sep 17 00:00:00 2001 From: acruikshank Date: Tue, 2 Mar 2021 11:16:24 -0500 Subject: [PATCH 2939/3147] align license with go-ipfs This commit was moved from ipfs/go-fetcher@4ff0dac033d5bd193ae3c71e646d22fb14c7eab1 --- fetcher/LICENSE-APACHE | 5 +++++ fetcher/{LICENSE => LICENSE-MIT} | 0 fetcher/README.md | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 fetcher/LICENSE-APACHE rename fetcher/{LICENSE => LICENSE-MIT} (100%) diff --git a/fetcher/LICENSE-APACHE b/fetcher/LICENSE-APACHE new file mode 100644 index 0000000000..4c83a2841a --- /dev/null +++ b/fetcher/LICENSE-APACHE @@ -0,0 +1,5 @@ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. \ No newline at end of file diff --git a/fetcher/LICENSE b/fetcher/LICENSE-MIT similarity index 100% rename from fetcher/LICENSE rename to fetcher/LICENSE-MIT diff --git a/fetcher/README.md b/fetcher/README.md index bc1410afca..7039f39b38 100644 --- a/fetcher/README.md +++ b/fetcher/README.md @@ -12,4 +12,7 @@ PRs are welcome! ## License -MIT \ No newline at end of file +The go-fetcher project is dual-licensed under Apache 2.0 and MIT terms: + +- Apache License, Version 2.0, ([LICENSE-APACHE](https://github.com/ipfs/go-fetcher/blob/master/LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +- MIT license ([LICENSE-MIT](https://github.com/ipfs/go-fetcher/blob/master/LICENSE-MIT) or http://opensource.org/licenses/MIT) \ No newline at end of file From 79f9484e327c84582f107169213f4cac741977c2 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Tue, 2 Mar 2021 12:29:00 -0500 Subject: [PATCH 2940/3147] better channel behavior and documentation This commit was moved from ipfs/go-fetcher@7ec6d7375e7c624396d59e1836faafd095fa7c3b --- fetcher/fetcher.go | 10 ++++++++-- fetcher/fetcher_test.go | 24 ++++++++---------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index e1fd9e87b2..99b06e615c 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -26,6 +26,8 @@ type FetcherConfig struct { type Fetcher interface { // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. + // The results and error channels will be closed on query completion or error. The error channel is buffered, + // will emit at most one error and must be checked after processing the results. NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) // BlockOfType fetches a node graph of the provided type corresponding to single block by link. @@ -34,6 +36,8 @@ type Fetcher interface { // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is sent to // the FetchResult channel. + // The results and error channels will be closed on query completion or error. The error channel is buffered, + // will emit at most one error and must be checked after processing the results. BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) } @@ -75,10 +79,11 @@ func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) { results := make(chan FetchResult) - errors := make(chan error) + errors := make(chan error, 1) go func() { defer close(results) + defer close(errors) err := f.fetch(ctx, node, match, results) if err != nil { @@ -92,10 +97,11 @@ func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { results := make(chan FetchResult) - errors := make(chan error) + errors := make(chan error, 1) go func() { defer close(results) + defer close(errors) // retrieve first node node, err := f.BlockOfType(ctx, root, ptype) diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index aa40fe1bba..e7905fd64f 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -208,24 +208,16 @@ func TestHelpers(t *testing.T) { func assertNodesInOrder(t *testing.T, nodeCh <-chan fetcher.FetchResult, errCh <-chan error, nodeCount int, nodes map[int]ipld.Node) { order := 0 -Loop: - for { - select { - case res, ok := <-nodeCh: - if !ok { - break Loop - } - - expectedNode, ok := nodes[order] - if ok { - assert.Equal(t, expectedNode, res.Node) - } - - order++ - case err := <-errCh: - require.FailNow(t, err.Error()) + for res := range nodeCh { + expectedNode, ok := nodes[order] + if ok { + assert.Equal(t, expectedNode, res.Node) } + order++ } + + err := <-errCh + require.NoError(t, err) assert.Equal(t, nodeCount, order) } From 425f0a13b05e253053664d3fb76c418479ab1a11 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Tue, 2 Mar 2021 16:07:45 -0500 Subject: [PATCH 2941/3147] update go-fetcher version and fix import This commit was moved from ipfs/go-ipfs-provider@702a3da7867dc3bbc6c5f2ddaec376d8008eb956 --- provider/simple/reprovide.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 739ccd95ba..c52b6ff7e7 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" "time" "github.com/cenkalti/backoff" @@ -14,6 +13,7 @@ import ( blocks "github.com/ipfs/go-ipfs-blockstore" logging "github.com/ipfs/go-log" "github.com/ipfs/go-verifcid" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/libp2p/go-libp2p-core/routing" ) From f3094b9a3401eb8cd4bab9517e5498d320bf960a Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 4 Mar 2021 09:58:02 -0500 Subject: [PATCH 2942/3147] add test with more complicated selector This commit was moved from ipfs/go-fetcher@bc04b63c1e03cece0e3191db2ffae5dc2f83ea00 --- fetcher/fetcher_test.go | 66 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index e7905fd64f..a40c9106ac 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -5,6 +5,7 @@ import ( "context" "fmt" "io" + "strings" "testing" "time" @@ -23,7 +24,7 @@ import ( "github.com/ipld/go-ipld-prime/fluent" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/magiconair/properties/assert" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/ipfs/go-fetcher" @@ -118,6 +119,69 @@ func TestFetchIPLDGraph(t *testing.T) { assertNodesInOrder(t, nodeCh, errCh, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) } +func TestFetchIPLDPath(t *testing.T) { + block5, node5, link5 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("five").AssignBool(true) + })) + block3, _, link3 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("three").AssignLink(link5) + })) + block4, _, link4 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("four").AssignBool(true) + })) + block2, _, link2 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + na.AssembleEntry("link3").AssignLink(link3) + na.AssembleEntry("link4").AssignLink(link4) + })) + block1, _, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + na.AssembleEntry("foo").AssignBool(true) + na.AssembleEntry("bar").AssignBool(false) + na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { + na.AssembleEntry("link2").AssignLink(link2) + na.AssembleEntry("nonlink").AssignString("zoo") + }) + })) + + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0*time.Millisecond)) + ig := testinstance.NewTestInstanceGenerator(net, nil, nil) + defer ig.Close() + + peers := ig.Instances(2) + hasBlock := peers[0] + defer hasBlock.Exchange.Close() + + for _, blk := range []blocks.Block{block1, block2, block3, block4, block5} { + err := hasBlock.Exchange.HasBlock(blk) + require.NoError(t, err) + } + + wantsBlock := peers[1] + defer wantsBlock.Exchange.Close() + + wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + session := fetcherConfig.NewSession(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + path := strings.Split("nested/link2/link3/three", "/") + ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) + spec := ssb.Matcher() + explorePath := func(p string, s builder.SelectorSpec) builder.SelectorSpec { + return ssb.ExploreFields(func(efsb builder.ExploreFieldsSpecBuilder) { efsb.Insert(p, s) }) + } + for i := len(path) - 1; i >= 0; i-- { + spec = explorePath(path[i], spec) + } + sel, err := spec.Selector() + require.NoError(t, err) + + nodeCh, errCh := fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel) + require.NoError(t, err) + + assertNodesInOrder(t, nodeCh, errCh, 1, map[int]ipld.Node{0: node5}) +} + func TestHelpers(t *testing.T) { block3, node3, link3 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("three").AssignBool(true) From 5d202f30e0edd0418a7bae01fecfcf26a655817e Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 4 Mar 2021 14:40:36 -0500 Subject: [PATCH 2943/3147] switch from channels to callbacks This commit was moved from ipfs/go-fetcher@51577c0fe3a03978bde51667c1ce8118c10fa3e7 --- fetcher/fetcher.go | 111 +++++++++++++++------------------------- fetcher/fetcher_test.go | 46 ++++++++++------- 2 files changed, 69 insertions(+), 88 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 99b06e615c..d2cf87e593 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -6,14 +6,12 @@ import ( "fmt" "io" - "github.com/ipld/go-ipld-prime/schema" - - dagpb "github.com/ipld/go-ipld-prime-proto" - "github.com/ipfs/go-blockservice" "github.com/ipld/go-ipld-prime" + dagpb "github.com/ipld/go-ipld-prime-proto" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/ipld/go-ipld-prime/schema" "github.com/ipld/go-ipld-prime/traversal" "github.com/ipld/go-ipld-prime/traversal/selector" "github.com/ipld/go-ipld-prime/traversal/selector/builder" @@ -25,20 +23,19 @@ type FetcherConfig struct { type Fetcher interface { // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing - // block boundaries. Each matched node is sent to the FetchResult channel. - // The results and error channels will be closed on query completion or error. The error channel is buffered, - // will emit at most one error and must be checked after processing the results. - NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) + // block boundaries. Each matched node is sent to the FetchResult channel. This method blocks until all results + // are read or an error occurs. The provided function will be called once for every result and possibly once with an + // error after which not be called. + NodeMatching(context.Context, ipld.Node, selector.Selector, FetchCallback) // BlockOfType fetches a node graph of the provided type corresponding to single block by link. - BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) + BlockOfType(context.Context, ipld.Link, ipld.NodePrototype) (ipld.Node, error) // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is sent to - // the FetchResult channel. - // The results and error channels will be closed on query completion or error. The error channel is buffered, - // will emit at most one error and must be checked after processing the results. - BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) + // the FetchResult channel. This method blocks until all results are read or an error occurs. + // The provided function will be called once for every result and possibly once with an error after which not be called. + BlockMatchingOfType(context.Context, ipld.Link, selector.Selector, ipld.NodePrototype, FetchCallback) } type fetcherSession struct { @@ -52,6 +49,8 @@ type FetchResult struct { LastBlockLink ipld.Link } +type FetchCallback func(result FetchResult, err error) + // NewFetcherConfig creates a FetchConfig from which session may be created and nodes retrieved. func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { return FetcherConfig{blockService: blockService} @@ -77,47 +76,21 @@ func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype return nb.Build(), nil } -func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector) (<-chan FetchResult, <-chan error) { - results := make(chan FetchResult) - errors := make(chan error, 1) - - go func() { - defer close(results) - defer close(errors) - - err := f.fetch(ctx, node, match, results) - if err != nil { - errors <- err - return - } - }() - - return results, errors +func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) { + f.fetch(ctx, node, match, cb) } -func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { - results := make(chan FetchResult) - errors := make(chan error, 1) +func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, + ptype ipld.NodePrototype, cb FetchCallback) { - go func() { - defer close(results) - defer close(errors) - - // retrieve first node - node, err := f.BlockOfType(ctx, root, ptype) - if err != nil { - errors <- err - return - } - - err = f.fetch(ctx, node, match, results) - if err != nil { - errors <- err - return - } - }() + // retrieve first node + node, err := f.BlockOfType(ctx, root, ptype) + if err != nil { + cb(FetchResult{}, err) + return + } - return results, errors + f.fetch(ctx, node, match, cb) } // Block fetches a schemaless node graph corresponding to single block by link. @@ -131,46 +104,43 @@ func Block(ctx context.Context, f Fetcher, link ipld.Link) (ipld.Node, error) { // BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. -func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selector.Selector) (<-chan FetchResult, <-chan error) { +func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selector.Selector, cb FetchCallback) { prototype, err := prototypeFromLink(root) if err != nil { - errors := make(chan error, 1) - errors <- err - return nil, errors + cb(FetchResult{}, err) + return } - return f.BlockMatchingOfType(ctx, root, match, prototype) + f.BlockMatchingOfType(ctx, root, match, prototype, cb) } // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. -func BlockAll(ctx context.Context, f Fetcher, root ipld.Link) (<-chan FetchResult, <-chan error) { +func BlockAll(ctx context.Context, f Fetcher, root ipld.Link, cb FetchCallback) { prototype, err := prototypeFromLink(root) if err != nil { - errors := make(chan error, 1) - errors <- err - return nil, errors + cb(FetchResult{}, err) + return } - return BlockAllOfType(ctx, f, root, prototype) + BlockAllOfType(ctx, f, root, prototype, cb) } // BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype // and send over the results channel. -func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.NodePrototype) (<-chan FetchResult, <-chan error) { +func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.NodePrototype, cb FetchCallback) { ssb := builder.NewSelectorSpecBuilder(ptype) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), ssb.ExploreAll(ssb.ExploreRecursiveEdge()), )).Selector() if err != nil { - errors := make(chan error, 1) - errors <- err - return nil, errors + cb(FetchResult{}, err) + return } - return f.BlockMatchingOfType(ctx, root, allSelector, ptype) + f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) } -func (f *fetcherSession) fetch(ctx context.Context, node ipld.Node, match selector.Selector, results chan FetchResult) error { - return traversal.Progress{ +func (f *fetcherSession) fetch(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) { + err := traversal.Progress{ Cfg: &traversal.Config{ LinkLoader: f.loader(ctx), LinkTargetNodePrototypeChooser: dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { @@ -181,14 +151,17 @@ func (f *fetcherSession) fetch(ctx context.Context, node ipld.Node, match select }), }, }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { - results <- FetchResult{ + cb(FetchResult{ Node: n, Path: prog.Path, LastBlockPath: prog.LastBlock.Path, LastBlockLink: prog.LastBlock.Link, - } + }, nil) return nil }) + if err != nil { + cb(FetchResult{}, err) + } } func (f *fetcherSession) loader(ctx context.Context) ipld.Loader { diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index a40c9106ac..39c6cf0d43 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -113,10 +113,13 @@ func TestFetchIPLDGraph(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - nodeCh, errCh := fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}) - require.NoError(t, err) + results := []fetcher.FetchResult{} + fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, func(res fetcher.FetchResult, err error) { + require.NoError(t, err) + results = append(results, res) + }) - assertNodesInOrder(t, nodeCh, errCh, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) + assertNodesInOrder(t, results, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) } func TestFetchIPLDPath(t *testing.T) { @@ -176,10 +179,13 @@ func TestFetchIPLDPath(t *testing.T) { sel, err := spec.Selector() require.NoError(t, err) - nodeCh, errCh := fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel) - require.NoError(t, err) + results := []fetcher.FetchResult{} + fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult, err error) { + require.NoError(t, err) + results = append(results, res) + }) - assertNodesInOrder(t, nodeCh, errCh, 1, map[int]ipld.Node{0: node5}) + assertNodesInOrder(t, results, 1, map[int]ipld.Node{0: node5}) } func TestHelpers(t *testing.T) { @@ -250,10 +256,13 @@ func TestHelpers(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - nodeCh, errCh := fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel) - require.NoError(t, err) + results := []fetcher.FetchResult{} + fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult, err error) { + require.NoError(t, err) + results = append(results, res) + }) - assertNodesInOrder(t, nodeCh, errCh, 4, map[int]ipld.Node{0: node1, 4: node2}) + assertNodesInOrder(t, results, 4, map[int]ipld.Node{0: node1, 4: node2}) }) t.Run("BlockAllOfType retrieves all nodes with a schema", func(t *testing.T) { @@ -263,26 +272,25 @@ func TestHelpers(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - nodeCh, errCh := fetcher.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}) - require.NoError(t, err) + results := []fetcher.FetchResult{} + fetcher.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}, func(res fetcher.FetchResult, err error) { + require.NoError(t, err) + results = append(results, res) + }) - assertNodesInOrder(t, nodeCh, errCh, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) + assertNodesInOrder(t, results, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) }) } -func assertNodesInOrder(t *testing.T, nodeCh <-chan fetcher.FetchResult, errCh <-chan error, nodeCount int, nodes map[int]ipld.Node) { - order := 0 - for res := range nodeCh { +func assertNodesInOrder(t *testing.T, results []fetcher.FetchResult, nodeCount int, nodes map[int]ipld.Node) { + for order, res := range results { expectedNode, ok := nodes[order] if ok { assert.Equal(t, expectedNode, res.Node) } - order++ } - err := <-errCh - require.NoError(t, err) - assert.Equal(t, nodeCount, order) + assert.Equal(t, nodeCount, len(results)) } func encodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { From 60412437761bb66599cfd66b3d4d274e5b17f543 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 4 Mar 2021 15:36:58 -0500 Subject: [PATCH 2944/3147] correct and clarify documentation This commit was moved from ipfs/go-fetcher@dd838b25112cf1cfa25c75b75449472f152d4ac6 --- fetcher/fetcher.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index d2cf87e593..ba416c8492 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -23,18 +23,19 @@ type FetcherConfig struct { type Fetcher interface { // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing - // block boundaries. Each matched node is sent to the FetchResult channel. This method blocks until all results - // are read or an error occurs. The provided function will be called once for every result and possibly once with an - // error after which not be called. + // block boundaries. Each matched node is passed as FetchResult to the callback. + // The sequence of events is: NodeMatching begins, the callback is called zero or more times with a FetchResult, the + // callback is called zero or one time with an error, then NodeMatching returns. NodeMatching(context.Context, ipld.Node, selector.Selector, FetchCallback) // BlockOfType fetches a node graph of the provided type corresponding to single block by link. BlockOfType(context.Context, ipld.Link, ipld.NodePrototype) (ipld.Node, error) // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly - // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is sent to - // the FetchResult channel. This method blocks until all results are read or an error occurs. - // The provided function will be called once for every result and possibly once with an error after which not be called. + // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is passed as + // a FetchResult to the callback. + // The sequence of events is: BlockMatchingOfType begins, the callback is called zero or more times with a + // FetchResult, the callback is called zero or one time with an error, then BlockMatchingOfType returns. BlockMatchingOfType(context.Context, ipld.Link, selector.Selector, ipld.NodePrototype, FetchCallback) } From a7eb407ad863245a2932316bf4ce7b6a7ac48301 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 4 Mar 2021 15:56:51 -0500 Subject: [PATCH 2945/3147] return errors from function instead of passing to cb This commit was moved from ipfs/go-fetcher@0062e438af322806d0acaa783c9cb77516039304 --- fetcher/fetcher.go | 90 ++++++++++++++++++----------------------- fetcher/fetcher_test.go | 20 +++++---- 2 files changed, 51 insertions(+), 59 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index ba416c8492..1619a92a3d 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -23,20 +23,20 @@ type FetcherConfig struct { type Fetcher interface { // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing - // block boundaries. Each matched node is passed as FetchResult to the callback. - // The sequence of events is: NodeMatching begins, the callback is called zero or more times with a FetchResult, the - // callback is called zero or one time with an error, then NodeMatching returns. - NodeMatching(context.Context, ipld.Node, selector.Selector, FetchCallback) + // block boundaries. Each matched node is passed as FetchResult to the callback. Errors returned from callback will + // halt the traversal. The sequence of events is: NodeMatching begins, the callback is called zero or more times + // with a FetchResult, then NodeMatching returns. + NodeMatching(context.Context, ipld.Node, selector.Selector, FetchCallback) error // BlockOfType fetches a node graph of the provided type corresponding to single block by link. BlockOfType(context.Context, ipld.Link, ipld.NodePrototype) (ipld.Node, error) // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is passed as - // a FetchResult to the callback. + // a FetchResult to the callback. Errors returned from callback will halt the traversal. // The sequence of events is: BlockMatchingOfType begins, the callback is called zero or more times with a - // FetchResult, the callback is called zero or one time with an error, then BlockMatchingOfType returns. - BlockMatchingOfType(context.Context, ipld.Link, selector.Selector, ipld.NodePrototype, FetchCallback) + // FetchResult, then BlockMatchingOfType returns. + BlockMatchingOfType(context.Context, ipld.Link, selector.Selector, ipld.NodePrototype, FetchCallback) error } type fetcherSession struct { @@ -50,7 +50,7 @@ type FetchResult struct { LastBlockLink ipld.Link } -type FetchCallback func(result FetchResult, err error) +type FetchCallback func(result FetchResult) error // NewFetcherConfig creates a FetchConfig from which session may be created and nodes retrieved. func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { @@ -77,21 +77,37 @@ func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype return nb.Build(), nil } -func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) { - f.fetch(ctx, node, match, cb) +func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) error { + return traversal.Progress{ + Cfg: &traversal.Config{ + LinkLoader: f.loader(ctx), + LinkTargetNodePrototypeChooser: dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil + }), + }, + }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { + return cb(FetchResult{ + Node: n, + Path: prog.Path, + LastBlockPath: prog.LastBlock.Path, + LastBlockLink: prog.LastBlock.Link, + }) + }) } func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, - ptype ipld.NodePrototype, cb FetchCallback) { + ptype ipld.NodePrototype, cb FetchCallback) error { // retrieve first node node, err := f.BlockOfType(ctx, root, ptype) if err != nil { - cb(FetchResult{}, err) - return + return err } - f.fetch(ctx, node, match, cb) + return f.NodeMatching(ctx, node, match, cb) } // Block fetches a schemaless node graph corresponding to single block by link. @@ -105,64 +121,36 @@ func Block(ctx context.Context, f Fetcher, link ipld.Link) (ipld.Node, error) { // BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. -func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selector.Selector, cb FetchCallback) { +func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selector.Selector, cb FetchCallback) error { prototype, err := prototypeFromLink(root) if err != nil { - cb(FetchResult{}, err) - return + return err } - f.BlockMatchingOfType(ctx, root, match, prototype, cb) + return f.BlockMatchingOfType(ctx, root, match, prototype, cb) } // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. -func BlockAll(ctx context.Context, f Fetcher, root ipld.Link, cb FetchCallback) { +func BlockAll(ctx context.Context, f Fetcher, root ipld.Link, cb FetchCallback) error { prototype, err := prototypeFromLink(root) if err != nil { - cb(FetchResult{}, err) - return + return err } - BlockAllOfType(ctx, f, root, prototype, cb) + return BlockAllOfType(ctx, f, root, prototype, cb) } // BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype // and send over the results channel. -func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.NodePrototype, cb FetchCallback) { +func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.NodePrototype, cb FetchCallback) error { ssb := builder.NewSelectorSpecBuilder(ptype) allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), ssb.ExploreAll(ssb.ExploreRecursiveEdge()), )).Selector() if err != nil { - cb(FetchResult{}, err) - return - } - f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) -} - -func (f *fetcherSession) fetch(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) { - err := traversal.Progress{ - Cfg: &traversal.Config{ - LinkLoader: f.loader(ctx), - LinkTargetNodePrototypeChooser: dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { - if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { - return tlnkNd.LinkTargetNodePrototype(), nil - } - return basicnode.Prototype.Any, nil - }), - }, - }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { - cb(FetchResult{ - Node: n, - Path: prog.Path, - LastBlockPath: prog.LastBlock.Path, - LastBlockLink: prog.LastBlock.Link, - }, nil) - return nil - }) - if err != nil { - cb(FetchResult{}, err) + return err } + return f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) } func (f *fetcherSession) loader(ctx context.Context) ipld.Loader { diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 39c6cf0d43..715251bad7 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -114,10 +114,11 @@ func TestFetchIPLDGraph(t *testing.T) { defer cancel() results := []fetcher.FetchResult{} - fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, func(res fetcher.FetchResult, err error) { - require.NoError(t, err) + err = fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, func(res fetcher.FetchResult) error { results = append(results, res) + return nil }) + require.NoError(t, err) assertNodesInOrder(t, results, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) } @@ -180,10 +181,11 @@ func TestFetchIPLDPath(t *testing.T) { require.NoError(t, err) results := []fetcher.FetchResult{} - fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult, err error) { - require.NoError(t, err) + err = fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { results = append(results, res) + return nil }) + require.NoError(t, err) assertNodesInOrder(t, results, 1, map[int]ipld.Node{0: node5}) } @@ -257,10 +259,11 @@ func TestHelpers(t *testing.T) { defer cancel() results := []fetcher.FetchResult{} - fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult, err error) { - require.NoError(t, err) + err = fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { results = append(results, res) + return nil }) + require.NoError(t, err) assertNodesInOrder(t, results, 4, map[int]ipld.Node{0: node1, 4: node2}) }) @@ -273,10 +276,11 @@ func TestHelpers(t *testing.T) { defer cancel() results := []fetcher.FetchResult{} - fetcher.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}, func(res fetcher.FetchResult, err error) { - require.NoError(t, err) + err = fetcher.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}, func(res fetcher.FetchResult) error { results = append(results, res) + return nil }) + require.NoError(t, err) assertNodesInOrder(t, results, 10, map[int]ipld.Node{0: node1, 4: node2, 5: node3, 7: node4}) }) From 2c0d955f282a0dfa158b00fe28e60462a4118f28 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Thu, 4 Mar 2021 16:57:03 -0500 Subject: [PATCH 2946/3147] upgrade to latest go-fetcher This commit was moved from ipfs/go-ipfs-provider@ebfb3d13ba62029f7197ba1886e51632947aec27 --- provider/simple/reprovide.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index c52b6ff7e7..6161eaa70b 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -235,15 +235,14 @@ func pinSet(ctx context.Context, pinning Pinner, fetchConfig fetcher.FetcherConf for _, key := range rkeys { set.Visitor(ctx)(key) if !onlyRoots { - nodeCh, errCh := fetcher.BlockAll(ctx, session, cidlink.Link{key}) - for res := range nodeCh { + err := fetcher.BlockAll(ctx, session, cidlink.Link{key}, func(res fetcher.FetchResult) error { clink, ok := res.LastBlockLink.(cidlink.Link) if ok { set.Visitor(ctx)(clink.Cid) } - } - - if err := <-errCh; err != nil { + return nil + }) + if err != nil { logR.Errorf("reprovide indirect pins: %s", err) return } From 5745a8396acccfb33047c71073437a4fde7919fc Mon Sep 17 00:00:00 2001 From: acruikshank Date: Mon, 8 Mar 2021 13:33:04 -0500 Subject: [PATCH 2947/3147] make compatible with linksystem and dagpb, add prototype chooser config This commit was moved from ipfs/go-fetcher@a372586bf0e761f2178036228f253a8c2eb8e26b --- fetcher/fetcher.go | 80 ++++++++++++++++++++++++----------------- fetcher/fetcher_test.go | 39 ++++++++++---------- 2 files changed, 67 insertions(+), 52 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 1619a92a3d..85361a7658 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -7,8 +7,8 @@ import ( "io" "github.com/ipfs/go-blockservice" + dagpb "github.com/ipld/go-codec-dagpb" "github.com/ipld/go-ipld-prime" - dagpb "github.com/ipld/go-ipld-prime-proto" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" "github.com/ipld/go-ipld-prime/schema" @@ -18,7 +18,8 @@ import ( ) type FetcherConfig struct { - blockService blockservice.BlockService + blockService blockservice.BlockService + PrototypeChooser traversal.LinkTargetNodePrototypeChooser } type Fetcher interface { @@ -37,10 +38,14 @@ type Fetcher interface { // The sequence of events is: BlockMatchingOfType begins, the callback is called zero or more times with a // FetchResult, then BlockMatchingOfType returns. BlockMatchingOfType(context.Context, ipld.Link, selector.Selector, ipld.NodePrototype, FetchCallback) error + + // Uses the given link to pick a prototype to build the linked node. + PrototypeFromLink(link ipld.Link) (ipld.NodePrototype, error) } type fetcherSession struct { - blockGetter blockservice.BlockGetter + linkSystem ipld.LinkSystem + protoChooser traversal.LinkTargetNodePrototypeChooser } type FetchResult struct { @@ -54,39 +59,30 @@ type FetchCallback func(result FetchResult) error // NewFetcherConfig creates a FetchConfig from which session may be created and nodes retrieved. func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { - return FetcherConfig{blockService: blockService} + return FetcherConfig{ + blockService: blockService, + PrototypeChooser: DefaultPrototypeChooser, + } } // NewSession creates a session from which nodes may be retrieved. // The session ends when the provided context is canceled. func (fc FetcherConfig) NewSession(ctx context.Context) Fetcher { - return &fetcherSession{ - blockGetter: blockservice.NewSession(ctx, fc.blockService), - } + ls := cidlink.DefaultLinkSystem() + ls.StorageReadOpener = blockOpener(ctx, blockservice.NewSession(ctx, fc.blockService)) + return &fetcherSession{linkSystem: ls, protoChooser: fc.PrototypeChooser} } // BlockOfType fetches a node graph of the provided type corresponding to single block by link. func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) { - nb := ptype.NewBuilder() - - err := link.Load(ctx, ipld.LinkContext{}, nb, f.loader(ctx)) - if err != nil { - return nil, err - } - - return nb.Build(), nil + return f.linkSystem.Load(ipld.LinkContext{}, link, ptype) } func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) error { return traversal.Progress{ Cfg: &traversal.Config{ - LinkLoader: f.loader(ctx), - LinkTargetNodePrototypeChooser: dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { - if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { - return tlnkNd.LinkTargetNodePrototype(), nil - } - return basicnode.Prototype.Any, nil - }), + LinkSystem: f.linkSystem, + LinkTargetNodePrototypeChooser: f.protoChooser, }, }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { return cb(FetchResult{ @@ -110,9 +106,13 @@ func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link return f.NodeMatching(ctx, node, match, cb) } +func (f *fetcherSession) PrototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, error) { + return f.protoChooser(lnk, ipld.LinkContext{}) +} + // Block fetches a schemaless node graph corresponding to single block by link. func Block(ctx context.Context, f Fetcher, link ipld.Link) (ipld.Node, error) { - prototype, err := prototypeFromLink(link) + prototype, err := f.PrototypeFromLink(link) if err != nil { return nil, err } @@ -122,7 +122,7 @@ func Block(ctx context.Context, f Fetcher, link ipld.Link) (ipld.Node, error) { // BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selector.Selector, cb FetchCallback) error { - prototype, err := prototypeFromLink(root) + prototype, err := f.PrototypeFromLink(root) if err != nil { return err } @@ -132,7 +132,7 @@ func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selecto // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. func BlockAll(ctx context.Context, f Fetcher, root ipld.Link, cb FetchCallback) error { - prototype, err := prototypeFromLink(root) + prototype, err := f.PrototypeFromLink(root) if err != nil { return err } @@ -153,14 +153,14 @@ func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.N return f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) } -func (f *fetcherSession) loader(ctx context.Context) ipld.Loader { - return func(lnk ipld.Link, _ ipld.LinkContext) (io.Reader, error) { +func blockOpener(ctx context.Context, bs *blockservice.Session) ipld.BlockReadOpener { + return func(_ ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { cidLink, ok := lnk.(cidlink.Link) if !ok { return nil, fmt.Errorf("invalid link type for loading: %v", lnk) } - blk, err := f.blockGetter.GetBlock(ctx, cidLink.Cid) + blk, err := bs.GetBlock(ctx, cidLink.Cid) if err != nil { return nil, err } @@ -169,8 +169,24 @@ func (f *fetcherSession) loader(ctx context.Context) ipld.Loader { } } -func prototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, error) { - return dagpb.AddDagPBSupportToChooser(func(_ ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { - return basicnode.Prototype__Any{}, nil - })(lnk, ipld.LinkContext{}) +func DefaultPrototypeChooser(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + c, ok := lnk.(cidlink.Link) + if ok { + switch c.Cid.Prefix().Codec { + case 0x70: + return dagpb.Type.PBNode, nil + case 0x55: + return basicnode.Prototype.Bytes, nil + default: + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil + } + } + + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil } diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 715251bad7..904afed10c 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -20,9 +20,10 @@ import ( delay "github.com/ipfs/go-ipfs-delay" mockrouting "github.com/ipfs/go-ipfs-routing/mock" "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagcbor" + _ "github.com/ipld/go-ipld-prime/codec/dagcbor" "github.com/ipld/go-ipld-prime/fluent" cidlink "github.com/ipld/go-ipld-prime/linking/cid" + _ "github.com/ipld/go-ipld-prime/multihash/register/all" basicnode "github.com/ipld/go-ipld-prime/node/basic" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -30,8 +31,6 @@ import ( "github.com/ipfs/go-fetcher" ) -var _ cidlink.MulticodecDecoder = dagcbor.Decoder - func TestFetchIPLDPrimeNode(t *testing.T) { block, node, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { na.AssembleEntry("foo").AssignBool(true) @@ -298,27 +297,27 @@ func assertNodesInOrder(t *testing.T, results []fetcher.FetchResult, nodeCount i } func encodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { - lb := cidlink.LinkBuilder{cid.Prefix{ + ls := cidlink.DefaultLinkSystem() + var b blocks.Block + lb := cidlink.LinkPrototype{cid.Prefix{ Version: 1, - Codec: cid.DagCBOR, + Codec: 0x71, MhType: 0x17, MhLength: 20, }} - var b blocks.Block - lnk, err := lb.Build(context.Background(), ipld.LinkContext{}, n, - func(ipld.LinkContext) (io.Writer, ipld.StoreCommitter, error) { - buf := bytes.Buffer{} - return &buf, func(lnk ipld.Link) error { - clnk, ok := lnk.(cidlink.Link) - if !ok { - return fmt.Errorf("incorrect link type %v", lnk) - } - var err error - b, err = blocks.NewBlockWithCid(buf.Bytes(), clnk.Cid) - return err - }, nil - }, - ) + ls.StorageWriteOpener = func(ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { + buf := bytes.Buffer{} + return &buf, func(lnk ipld.Link) error { + clnk, ok := lnk.(cidlink.Link) + if !ok { + return fmt.Errorf("incorrect link type %v", lnk) + } + var err error + b, err = blocks.NewBlockWithCid(buf.Bytes(), clnk.Cid) + return err + }, nil + } + lnk, err := ls.Store(ipld.LinkContext{}, lb, n) if err != nil { panic(err) } From 63068475b3994422310f2c1caa58244047563261 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Mon, 15 Mar 2021 14:17:49 -0400 Subject: [PATCH 2948/3147] use linksystem tag This commit was moved from ipfs/go-fetcher@efee55b83ad98ffda383576cfffa549673828ca3 --- fetcher/fetcher_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 904afed10c..0dd5720200 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -23,7 +23,6 @@ import ( _ "github.com/ipld/go-ipld-prime/codec/dagcbor" "github.com/ipld/go-ipld-prime/fluent" cidlink "github.com/ipld/go-ipld-prime/linking/cid" - _ "github.com/ipld/go-ipld-prime/multihash/register/all" basicnode "github.com/ipld/go-ipld-prime/node/basic" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" From f4ded30259f80f76a96a4a170f5c11ee77b83fbd Mon Sep 17 00:00:00 2001 From: acruikshank Date: Mon, 15 Mar 2021 17:09:53 -0400 Subject: [PATCH 2949/3147] update to tagged ipld-prime and latest fetcher This commit was moved from ipfs/go-ipfs-provider@3ff3362e205a0fadf32540ffe3383882b81d6815 --- provider/simple/reprovide_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 913ca072c4..e43e791b3f 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -14,8 +14,7 @@ import ( offline "github.com/ipfs/go-ipfs-exchange-offline" mock "github.com/ipfs/go-ipfs-routing/mock" cbor "github.com/ipfs/go-ipld-cbor" - "github.com/ipld/go-ipld-prime/codec/dagcbor" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" + _ "github.com/ipld/go-ipld-prime/codec/dagcbor" peer "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-testing/net" mh "github.com/multiformats/go-multihash" @@ -23,7 +22,6 @@ import ( . "github.com/ipfs/go-ipfs-provider/simple" ) -var _ cidlink.MulticodecDecoder = dagcbor.Decoder func setupRouting(t *testing.T) (clA, clB mock.Client, idA, idB peer.ID) { mrserv := mock.NewServer() From eb3d7ddb5959c6f38f37f33891e777cb464b0005 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 16 Mar 2021 16:38:32 +0100 Subject: [PATCH 2950/3147] Remove InitializeKeyspace function from publisher This is mostly go-ipfs specific and has been moved there. See https://github.com/ipfs/go-ipfs/pull/7984 This commit was moved from ipfs/go-namesys@67510bf0749928fd3ca618418c76d67f5ff8e6dd --- namesys/publisher.go | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index e2f9e67d81..37dab0ed2e 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -9,11 +9,9 @@ import ( proto "github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-datastore" dsquery "github.com/ipfs/go-datastore/query" - pin "github.com/ipfs/go-ipfs-pinner" ipns "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" - ft "github.com/ipfs/go-unixfs" ci "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" routing "github.com/libp2p/go-libp2p-core/routing" @@ -294,27 +292,6 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec return r.PutValue(ctx, ipnskey, data) } -// InitializeKeyspace sets the ipns record for the given key to -// point to an empty directory. -// TODO: this doesnt feel like it belongs here -func InitializeKeyspace(ctx context.Context, pub Publisher, pins pin.Pinner, key ci.PrivKey) error { - emptyDir := ft.EmptyDirNode() - - // pin recursively because this might already be pinned - // and doing a direct pin would throw an error in that case - err := pins.Pin(ctx, emptyDir, true) - if err != nil { - return err - } - - err = pins.Flush(ctx) - if err != nil { - return err - } - - return pub.Publish(ctx, key, path.FromCid(emptyDir.Cid())) -} - // PkKeyForID returns the public key routing key for the given peer ID. func PkKeyForID(id peer.ID) string { return "/pk/" + string(id) From faba013c6c313cb9004bc22e8c1c6cc51e8cdcc9 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 16 Mar 2021 16:47:17 +0100 Subject: [PATCH 2951/3147] Remove dependencies to go-unixfs The remaining dependency was in tests. We can hardcode a CID instead of requiring unixfs just to obtain an arbitrary CID that correspond to the empty directory. This commit was moved from ipfs/go-namesys@d416a143bd64757d5965302e4def561cc9271fb9 --- namesys/namesys_test.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index cc0ca69590..0ae858f4ee 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -11,7 +11,6 @@ import ( offroute "github.com/ipfs/go-ipfs-routing/offline" ipns "github.com/ipfs/go-ipns" path "github.com/ipfs/go-path" - unixfs "github.com/ipfs/go-unixfs" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ci "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" @@ -110,7 +109,8 @@ func TestPublishWithCache0(t *testing.T) { }) nsys := NewNameSystem(routing, dst, 0) - p, err := path.ParsePath(unixfs.EmptyDirNode().Cid().String()) + // CID is arbitrary. + p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") if err != nil { t.Fatal(err) } @@ -142,7 +142,8 @@ func TestPublishWithTTL(t *testing.T) { }) nsys := NewNameSystem(routing, dst, 128) - p, err := path.ParsePath(unixfs.EmptyDirNode().Cid().String()) + // CID is arbitrary. + p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") if err != nil { t.Fatal(err) } From eddfec331ea8620baa639578f022840e44ee0cf4 Mon Sep 17 00:00:00 2001 From: acruikshank Date: Wed, 17 Mar 2021 11:14:12 -0400 Subject: [PATCH 2952/3147] upgrade dagpb, use its default chooser This commit was moved from ipfs/go-fetcher@7f06e527bfc240d654c9cff0879402ddab97519c --- fetcher/fetcher.go | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 85361a7658..752eafbff9 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -169,24 +169,10 @@ func blockOpener(ctx context.Context, bs *blockservice.Session) ipld.BlockReadOp } } -func DefaultPrototypeChooser(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { - c, ok := lnk.(cidlink.Link) - if ok { - switch c.Cid.Prefix().Codec { - case 0x70: - return dagpb.Type.PBNode, nil - case 0x55: - return basicnode.Prototype.Bytes, nil - default: - if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { - return tlnkNd.LinkTargetNodePrototype(), nil - } - return basicnode.Prototype.Any, nil - } - } - +// Chooser that supports DagPB nodes and choosing the prototype from the link. +var DefaultPrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { return tlnkNd.LinkTargetNodePrototype(), nil } return basicnode.Prototype.Any, nil -} +}) From bb6b14f33b6a95d716406c93b62a4ed2733a089a Mon Sep 17 00:00:00 2001 From: acruikshank Date: Wed, 17 Mar 2021 11:38:16 -0400 Subject: [PATCH 2953/3147] gofmt This commit was moved from ipfs/go-ipfs-provider@28506e1a9e9e7acee4301052d1c0423801e1a978 --- provider/simple/reprovide_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index e43e791b3f..7c796cbfee 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -22,7 +22,6 @@ import ( . "github.com/ipfs/go-ipfs-provider/simple" ) - func setupRouting(t *testing.T) (clA, clB mock.Client, idA, idB peer.ID) { mrserv := mock.NewServer() From 0f4e8f07dd21fffbe4f901e42af4e0c64e809180 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 22 Mar 2021 10:52:06 -0700 Subject: [PATCH 2954/3147] Revert "Merge pull request ipfs/go-ipfs-provider#30 from ipfs/feat/use_ipld_prime" This reverts commit bbafe76e26330b48b0f3ded318d51cc3a3ff65d4, reversing changes made to b8fd93c8e02bf176c5649b5684e535f51ae8686c. This commit was moved from ipfs/go-ipfs-provider@46797b12263096b6acbc422169311eef194e530b --- provider/simple/reprovide.go | 25 +++++++++---------------- provider/simple/reprovide_test.go | 7 +++---- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 6161eaa70b..bfe6173e1d 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -9,11 +9,11 @@ import ( "github.com/cenkalti/backoff" "github.com/ipfs/go-cid" "github.com/ipfs/go-cidutil" - "github.com/ipfs/go-fetcher" blocks "github.com/ipfs/go-ipfs-blockstore" + ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + "github.com/ipfs/go-merkledag" "github.com/ipfs/go-verifcid" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/libp2p/go-libp2p-core/routing" ) @@ -184,9 +184,9 @@ type Pinner interface { } // NewPinnedProvider returns provider supplying pinned keys -func NewPinnedProvider(onlyRoots bool, pinning Pinner, fetchConfig fetcher.FetcherConfig) KeyChanFunc { +func NewPinnedProvider(onlyRoots bool, pinning Pinner, dag ipld.DAGService) KeyChanFunc { return func(ctx context.Context) (<-chan cid.Cid, error) { - set, err := pinSet(ctx, pinning, fetchConfig, onlyRoots) + set, err := pinSet(ctx, pinning, dag, onlyRoots) if err != nil { return nil, err } @@ -208,7 +208,7 @@ func NewPinnedProvider(onlyRoots bool, pinning Pinner, fetchConfig fetcher.Fetch } } -func pinSet(ctx context.Context, pinning Pinner, fetchConfig fetcher.FetcherConfig, onlyRoots bool) (*cidutil.StreamingSet, error) { +func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { set := cidutil.NewStreamingSet() go func() { @@ -230,18 +230,11 @@ func pinSet(ctx context.Context, pinning Pinner, fetchConfig fetcher.FetcherConf logR.Errorf("reprovide indirect pins: %s", err) return } - - session := fetchConfig.NewSession(ctx) for _, key := range rkeys { - set.Visitor(ctx)(key) - if !onlyRoots { - err := fetcher.BlockAll(ctx, session, cidlink.Link{key}, func(res fetcher.FetchResult) error { - clink, ok := res.LastBlockLink.(cidlink.Link) - if ok { - set.Visitor(ctx)(clink.Cid) - } - return nil - }) + if onlyRoots { + set.Visitor(ctx)(key) + } else { + err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) if err != nil { logR.Errorf("reprovide indirect pins: %s", err) return diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 7c796cbfee..3858baf5e9 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -9,12 +9,11 @@ import ( "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" - "github.com/ipfs/go-fetcher" "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" mock "github.com/ipfs/go-ipfs-routing/mock" cbor "github.com/ipfs/go-ipld-cbor" - _ "github.com/ipld/go-ipld-prime/codec/dagcbor" + merkledag "github.com/ipfs/go-merkledag" peer "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-testing/net" mh "github.com/multiformats/go-multihash" @@ -196,7 +195,7 @@ func TestReprovidePinned(t *testing.T) { nodes, bstore := setupDag(t) - fetchConfig := fetcher.NewFetcherConfig(bsrv.New(bstore, offline.Exchange(bstore))) + dag := merkledag.NewDAGService(bsrv.New(bstore, offline.Exchange(bstore))) for i := 0; i < 2; i++ { clA, clB, idA, _ := setupRouting(t) @@ -216,7 +215,7 @@ func TestReprovidePinned(t *testing.T) { keyProvider := NewPinnedProvider(onlyRoots, &mockPinner{ recursive: []cid.Cid{nodes[1]}, direct: []cid.Cid{nodes[3]}, - }, fetchConfig) + }, dag) reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) err := reprov.Reprovide() From 33c53eec1ec0b2e98bc147758b3dda55c2b31212 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 5 Mar 2021 13:46:11 -0800 Subject: [PATCH 2955/3147] feat(helpers): add helpers for block visiting This commit was moved from ipfs/go-fetcher@be81ab796f5dfe4e47200ffffa0fdefb746c913e --- fetcher/fetcher.go | 26 +++-- fetcher/fetcher_test.go | 62 +++--------- fetcher/helpers/block_visitor.go | 43 ++++++++ fetcher/helpers/block_visitor_test.go | 140 ++++++++++++++++++++++++++ fetcher/testutil/testutil.go | 42 ++++++++ 5 files changed, 258 insertions(+), 55 deletions(-) create mode 100644 fetcher/helpers/block_visitor.go create mode 100644 fetcher/helpers/block_visitor_test.go create mode 100644 fetcher/testutil/testutil.go diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 752eafbff9..a4ba0e7d54 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -78,13 +78,8 @@ func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype return f.linkSystem.Load(ipld.LinkContext{}, link, ptype) } -func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) error { - return traversal.Progress{ - Cfg: &traversal.Config{ - LinkSystem: f.linkSystem, - LinkTargetNodePrototypeChooser: f.protoChooser, - }, - }.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { +func (f *fetcherSession) nodeMatching(ctx context.Context, initialProgress traversal.Progress, node ipld.Node, match selector.Selector, cb FetchCallback) error { + return initialProgress.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { return cb(FetchResult{ Node: n, Path: prog.Path, @@ -94,6 +89,19 @@ func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match }) } +func (f *fetcherSession) blankProgress(ctx context.Context) traversal.Progress { + return traversal.Progress{ + Cfg: &traversal.Config{ + LinkSystem: f.linkSystem, + LinkTargetNodePrototypeChooser: f.protoChooser, + }, + } +} + +func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) error { + return f.nodeMatching(ctx, f.blankProgress(ctx), node, match, cb) +} + func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, ptype ipld.NodePrototype, cb FetchCallback) error { @@ -103,7 +111,9 @@ func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link return err } - return f.NodeMatching(ctx, node, match, cb) + progress := f.blankProgress(ctx) + progress.LastBlock.Link = root + return f.nodeMatching(ctx, progress, node, match, cb) } func (f *fetcherSession) PrototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, error) { diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 0dd5720200..5287ef6b72 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -1,10 +1,7 @@ package fetcher_test import ( - "bytes" "context" - "fmt" - "io" "strings" "testing" "time" @@ -16,11 +13,10 @@ import ( tn "github.com/ipfs/go-bitswap/testnet" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" - "github.com/ipfs/go-cid" + "github.com/ipfs/go-fetcher/testutil" delay "github.com/ipfs/go-ipfs-delay" mockrouting "github.com/ipfs/go-ipfs-routing/mock" "github.com/ipld/go-ipld-prime" - _ "github.com/ipld/go-ipld-prime/codec/dagcbor" "github.com/ipld/go-ipld-prime/fluent" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" @@ -31,7 +27,7 @@ import ( ) func TestFetchIPLDPrimeNode(t *testing.T) { - block, node, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + block, node, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { na.AssembleEntry("foo").AssignBool(true) na.AssembleEntry("bar").AssignBool(false) na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { @@ -66,17 +62,17 @@ func TestFetchIPLDPrimeNode(t *testing.T) { } func TestFetchIPLDGraph(t *testing.T) { - block3, node3, link3 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + block3, node3, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("three").AssignBool(true) })) - block4, node4, link4 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + block4, node4, link4 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("four").AssignBool(true) })) - block2, node2, link2 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + block2, node2, link2 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { na.AssembleEntry("link3").AssignLink(link3) na.AssembleEntry("link4").AssignLink(link4) })) - block1, node1, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + block1, node1, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { na.AssembleEntry("foo").AssignBool(true) na.AssembleEntry("bar").AssignBool(false) na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { @@ -122,20 +118,20 @@ func TestFetchIPLDGraph(t *testing.T) { } func TestFetchIPLDPath(t *testing.T) { - block5, node5, link5 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + block5, node5, link5 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("five").AssignBool(true) })) - block3, _, link3 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + block3, _, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("three").AssignLink(link5) })) - block4, _, link4 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + block4, _, link4 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("four").AssignBool(true) })) - block2, _, link2 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + block2, _, link2 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { na.AssembleEntry("link3").AssignLink(link3) na.AssembleEntry("link4").AssignLink(link4) })) - block1, _, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + block1, _, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { na.AssembleEntry("foo").AssignBool(true) na.AssembleEntry("bar").AssignBool(false) na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { @@ -189,17 +185,17 @@ func TestFetchIPLDPath(t *testing.T) { } func TestHelpers(t *testing.T) { - block3, node3, link3 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + block3, node3, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("three").AssignBool(true) })) - block4, node4, link4 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + block4, node4, link4 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("four").AssignBool(true) })) - block2, node2, link2 := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + block2, node2, link2 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { na.AssembleEntry("link3").AssignLink(link3) na.AssembleEntry("link4").AssignLink(link4) })) - block1, node1, _ := encodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + block1, node1, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { na.AssembleEntry("foo").AssignBool(true) na.AssembleEntry("bar").AssignBool(false) na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { @@ -294,31 +290,3 @@ func assertNodesInOrder(t *testing.T, results []fetcher.FetchResult, nodeCount i assert.Equal(t, nodeCount, len(results)) } - -func encodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { - ls := cidlink.DefaultLinkSystem() - var b blocks.Block - lb := cidlink.LinkPrototype{cid.Prefix{ - Version: 1, - Codec: 0x71, - MhType: 0x17, - MhLength: 20, - }} - ls.StorageWriteOpener = func(ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { - buf := bytes.Buffer{} - return &buf, func(lnk ipld.Link) error { - clnk, ok := lnk.(cidlink.Link) - if !ok { - return fmt.Errorf("incorrect link type %v", lnk) - } - var err error - b, err = blocks.NewBlockWithCid(buf.Bytes(), clnk.Cid) - return err - }, nil - } - lnk, err := ls.Store(ipld.LinkContext{}, lb, n) - if err != nil { - panic(err) - } - return b, n, lnk -} diff --git a/fetcher/helpers/block_visitor.go b/fetcher/helpers/block_visitor.go new file mode 100644 index 0000000000..25fc5420cb --- /dev/null +++ b/fetcher/helpers/block_visitor.go @@ -0,0 +1,43 @@ +package helpers + +import ( + "github.com/ipfs/go-cid" + "github.com/ipfs/go-fetcher" + "github.com/ipld/go-ipld-prime" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" +) + +// BlockResult specifies a node at the top of a block boundary +type BlockResult struct { + Node ipld.Node + Link ipld.Link +} + +// BlockCallback is a callback for visiting blocks +type BlockCallback func(BlockResult) error + +// OnBlocks produces a fetch call back that only gets called when visiting blocks during a fetch +func OnBlocks(bv BlockCallback) fetcher.FetchCallback { + return func(fr fetcher.FetchResult) error { + if fr.LastBlockPath.String() == fr.Path.String() { + return bv(BlockResult{ + Node: fr.Node, + Link: fr.LastBlockLink, + }) + } + return nil + } +} + +// OnUniqueBlocks is a callback that only gets called visiting each block once +func OnUniqueBlocks(bv BlockCallback) fetcher.FetchCallback { + set := cid.NewSet() + return OnBlocks(func(br BlockResult) error { + c := br.Link.(cidlink.Link).Cid + if set.Has(c) { + return nil + } + set.Add(c) + return bv(br) + }) +} diff --git a/fetcher/helpers/block_visitor_test.go b/fetcher/helpers/block_visitor_test.go new file mode 100644 index 0000000000..097946af41 --- /dev/null +++ b/fetcher/helpers/block_visitor_test.go @@ -0,0 +1,140 @@ +package helpers_test + +import ( + "context" + "testing" + "time" + + testinstance "github.com/ipfs/go-bitswap/testinstance" + tn "github.com/ipfs/go-bitswap/testnet" + "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-fetcher" + "github.com/ipfs/go-fetcher/helpers" + "github.com/ipfs/go-fetcher/testutil" + delay "github.com/ipfs/go-ipfs-delay" + mockrouting "github.com/ipfs/go-ipfs-routing/mock" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/fluent" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFetchGraphToBlocks(t *testing.T) { + block3, node3, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("three").AssignBool(true) + })) + block4, node4, link4 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("four").AssignBool(true) + })) + block2, node2, link2 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + na.AssembleEntry("link3").AssignLink(link3) + na.AssembleEntry("link4").AssignLink(link4) + })) + block1, node1, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + na.AssembleEntry("foo").AssignBool(true) + na.AssembleEntry("bar").AssignBool(false) + na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { + na.AssembleEntry("link2").AssignLink(link2) + na.AssembleEntry("nonlink").AssignString("zoo") + }) + })) + + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0*time.Millisecond)) + ig := testinstance.NewTestInstanceGenerator(net, nil, nil) + defer ig.Close() + + peers := ig.Instances(2) + hasBlock := peers[0] + defer hasBlock.Exchange.Close() + + err := hasBlock.Exchange.HasBlock(block1) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block2) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block3) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block4) + require.NoError(t, err) + + wantsBlock := peers[1] + defer wantsBlock.Exchange.Close() + + wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + session := fetcherConfig.NewSession(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + results := []helpers.BlockResult{} + err = fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, helpers.OnBlocks(func(res helpers.BlockResult) error { + results = append(results, res) + return nil + })) + require.NoError(t, err) + + assertBlocksInOrder(t, results, 4, map[int]ipld.Node{0: node1, 1: node2, 2: node3, 3: node4}) +} + +func TestFetchGraphToUniqueBlocks(t *testing.T) { + block3, node3, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("three").AssignBool(true) + })) + block2, node2, link2 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + na.AssembleEntry("link3").AssignLink(link3) + })) + block1, node1, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { + na.AssembleEntry("foo").AssignBool(true) + na.AssembleEntry("bar").AssignBool(false) + na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { + na.AssembleEntry("link3").AssignLink(link3) + na.AssembleEntry("link2").AssignLink(link2) + na.AssembleEntry("nonlink").AssignString("zoo") + }) + })) + + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0*time.Millisecond)) + ig := testinstance.NewTestInstanceGenerator(net, nil, nil) + defer ig.Close() + + peers := ig.Instances(2) + hasBlock := peers[0] + defer hasBlock.Exchange.Close() + + err := hasBlock.Exchange.HasBlock(block1) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block2) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block3) + require.NoError(t, err) + + wantsBlock := peers[1] + defer wantsBlock.Exchange.Close() + + wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + session := fetcherConfig.NewSession(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + results := []helpers.BlockResult{} + err = fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, helpers.OnUniqueBlocks(func(res helpers.BlockResult) error { + results = append(results, res) + return nil + })) + require.NoError(t, err) + + assertBlocksInOrder(t, results, 3, map[int]ipld.Node{0: node1, 1: node3, 2: node2}) +} + +func assertBlocksInOrder(t *testing.T, results []helpers.BlockResult, nodeCount int, nodes map[int]ipld.Node) { + for order, res := range results { + expectedNode, ok := nodes[order] + if ok { + assert.Equal(t, expectedNode, res.Node) + } + } + + assert.Equal(t, nodeCount, len(results)) +} diff --git a/fetcher/testutil/testutil.go b/fetcher/testutil/testutil.go new file mode 100644 index 0000000000..87badbdfbe --- /dev/null +++ b/fetcher/testutil/testutil.go @@ -0,0 +1,42 @@ +package testutil + +import ( + "bytes" + "fmt" + "io" + + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/ipld/go-ipld-prime" + _ "github.com/ipld/go-ipld-prime/codec/dagcbor" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" +) + +// EncodeBlock produces an encoded block from a node +func EncodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { + ls := cidlink.DefaultLinkSystem() + var b blocks.Block + lb := cidlink.LinkPrototype{cid.Prefix{ + Version: 1, + Codec: 0x71, + MhType: 0x17, + MhLength: 20, + }} + ls.StorageWriteOpener = func(ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { + buf := bytes.Buffer{} + return &buf, func(lnk ipld.Link) error { + clnk, ok := lnk.(cidlink.Link) + if !ok { + return fmt.Errorf("incorrect link type %v", lnk) + } + var err error + b, err = blocks.NewBlockWithCid(buf.Bytes(), clnk.Cid) + return err + }, nil + } + lnk, err := ls.Store(ipld.LinkContext{}, lb, n) + if err != nil { + panic(err) + } + return b, n, lnk +} From 4d0f8e8085cd78ecf6e6cfc66c98925f49903e66 Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Tue, 30 Mar 2021 11:40:29 +1300 Subject: [PATCH 2956/3147] Use eth.domains instead of eth.link This commit was moved from ipfs/go-namesys@64c4398224e68fc9e2ed373702def2db4b9dfe59 --- namesys/dns.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index d8a42f210b..9938aa8dd5 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -13,7 +13,7 @@ import ( ) const ethTLD = "eth" -const linkTLD = "link" +const linkTLD = "domains" // LookupTXTFunc is a generic type for a function that lookups TXT record values. type LookupTXTFunc func(name string) (txt []string, err error) From 8bb80221b346d4fe2b7bedaf7db21dd706c23f58 Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Tue, 30 Mar 2021 11:43:19 +1300 Subject: [PATCH 2957/3147] Update tests to use eth.domains This commit was moved from ipfs/go-namesys@cbcc19cb1368b4a21c2c939d7eadd6f77f17c45d --- namesys/dns_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 5a0e2a7d2f..877b814642 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -126,7 +126,7 @@ func newMockDNS() *mockDNS { "fqdn.example.com.": { "dnslink=/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", }, - "www.wealdtech.eth.link.": { + "www.wealdtech.eth.domains.": { "dnslink=/ipns/ipfs.example.com", }, }, @@ -168,5 +168,5 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "fqdn.example.com.", opts.DefaultDepthLimit, "/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", nil) testResolution(t, r, "www.wealdtech.eth", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) testResolution(t, r, "www.wealdtech.eth", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) - testResolution(t, r, "www.wealdtech.eth.link", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "www.wealdtech.eth.domains", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) } From 19d6550eac23a682fb638d0b26d1ebe48659c746 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 1 Apr 2021 12:46:06 -0700 Subject: [PATCH 2958/3147] feat(fetcher): add on demand prototype chooser augmentation This commit was moved from ipfs/go-fetcher@7fc88c4425ce0d23a91e0fcc587f3e89226044c4 --- fetcher/README.md | 2 +- fetcher/fetcher.go | 19 +++++++- fetcher/fetcher_test.go | 102 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 2 deletions(-) diff --git a/fetcher/README.md b/fetcher/README.md index 7039f39b38..71def50d47 100644 --- a/fetcher/README.md +++ b/fetcher/README.md @@ -4,7 +4,7 @@ go-fetcher [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -Go-fetcher is a library to retrieve IPLD prime nodes from IPFS using Bitswap. +Go-fetcher is a library to retrieve IPLD prime nodes from IPFS using data exchange protocols ## Contribute diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index a4ba0e7d54..409e48b6c0 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -17,11 +17,19 @@ import ( "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) +// AugmentChooserFunc is a function that can augment a prototype chooser at the time the Fetcher is initialized, +// which is given the linksystem the fetcher itself will use +type AugmentChooserFunc func(*ipld.LinkSystem, traversal.LinkTargetNodePrototypeChooser) traversal.LinkTargetNodePrototypeChooser + +// FetcherConfig defines a configuration object from which Fetcher instances are constructed type FetcherConfig struct { blockService blockservice.BlockService + AugmentChooser AugmentChooserFunc PrototypeChooser traversal.LinkTargetNodePrototypeChooser } +// Fetcher is an interface for reading from a dag. Reads may be local or remote, and may employ data exchange +// protocols like graphsync and bitswap type Fetcher interface { // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing // block boundaries. Each matched node is passed as FetchResult to the callback. Errors returned from callback will @@ -48,6 +56,7 @@ type fetcherSession struct { protoChooser traversal.LinkTargetNodePrototypeChooser } +// FetchResult is a single node read as part of a dag operation called on a fetcher type FetchResult struct { Node ipld.Node Path ipld.Path @@ -55,6 +64,7 @@ type FetchResult struct { LastBlockLink ipld.Link } +// FetchCallback is called for each node traversed during a fetch type FetchCallback func(result FetchResult) error // NewFetcherConfig creates a FetchConfig from which session may be created and nodes retrieved. @@ -69,8 +79,15 @@ func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { // The session ends when the provided context is canceled. func (fc FetcherConfig) NewSession(ctx context.Context) Fetcher { ls := cidlink.DefaultLinkSystem() + // while we may be loading blocks remotely, they are already hash verified by the time they load + // into ipld-prime + ls.TrustedStorage = true ls.StorageReadOpener = blockOpener(ctx, blockservice.NewSession(ctx, fc.blockService)) - return &fetcherSession{linkSystem: ls, protoChooser: fc.PrototypeChooser} + protoChooser := fc.PrototypeChooser + if fc.AugmentChooser != nil { + protoChooser = fc.AugmentChooser(&ls, protoChooser) + } + return &fetcherSession{linkSystem: ls, protoChooser: protoChooser} } // BlockOfType fetches a node graph of the provided type corresponding to single block by link. diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 5287ef6b72..83205ce6b6 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/ipld/go-ipld-prime/traversal" "github.com/ipld/go-ipld-prime/traversal/selector" "github.com/ipld/go-ipld-prime/traversal/selector/builder" @@ -290,3 +291,104 @@ func assertNodesInOrder(t *testing.T, results []fetcher.FetchResult, nodeCount i assert.Equal(t, nodeCount, len(results)) } + +type selfLoader struct { + ipld.Node + ctx context.Context + ls *ipld.LinkSystem +} + +func (sl *selfLoader) LookupByString(key string) (ipld.Node, error) { + nd, err := sl.Node.LookupByString(key) + if err != nil { + return nd, err + } + if nd.Kind() == ipld.Kind_Link { + lnk, _ := nd.AsLink() + nd, err = sl.ls.Load(ipld.LinkContext{Ctx: sl.ctx}, lnk, basicnode.Prototype.Any) + } + return nd, err +} + +type selfLoadPrototype struct { + ctx context.Context + ls *ipld.LinkSystem + basePrototype ipld.NodePrototype +} + +func (slp *selfLoadPrototype) NewBuilder() ipld.NodeBuilder { + return &selfLoadBuilder{ctx: slp.ctx, NodeBuilder: slp.basePrototype.NewBuilder(), ls: slp.ls} +} + +type selfLoadBuilder struct { + ctx context.Context + ipld.NodeBuilder + ls *ipld.LinkSystem +} + +func (slb *selfLoadBuilder) Build() ipld.Node { + nd := slb.NodeBuilder.Build() + return &selfLoader{nd, slb.ctx, slb.ls} +} + +func TestChooserAugmentation(t *testing.T) { + // demonstrates how to use the augment chooser to build an ADL that self loads its own nodes + block3, node3, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("three").AssignBool(true) + })) + block4, node4, link4 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { + na.AssembleEntry("four").AssignBool(true) + })) + block2, _, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 2, func(na fluent.MapAssembler) { + na.AssembleEntry("link3").AssignLink(link3) + na.AssembleEntry("link4").AssignLink(link4) + })) + + net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0*time.Millisecond)) + ig := testinstance.NewTestInstanceGenerator(net, nil, nil) + defer ig.Close() + + peers := ig.Instances(2) + hasBlock := peers[0] + defer hasBlock.Exchange.Close() + + err := hasBlock.Exchange.HasBlock(block2) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block3) + require.NoError(t, err) + err = hasBlock.Exchange.HasBlock(block4) + require.NoError(t, err) + + wantsBlock := peers[1] + defer wantsBlock.Exchange.Close() + + wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) + fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + augmentChooser := func(ls *ipld.LinkSystem, base traversal.LinkTargetNodePrototypeChooser) traversal.LinkTargetNodePrototypeChooser { + return func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + np, err := base(lnk, lnkCtx) + if err != nil { + return np, err + } + return &selfLoadPrototype{ctx: lnkCtx.Ctx, ls: ls, basePrototype: np}, nil + } + } + fetcherConfig.AugmentChooser = augmentChooser + session := fetcherConfig.NewSession(context.Background()) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + retrievedNode, err := fetcher.Block(ctx, session, cidlink.Link{Cid: block2.Cid()}) + require.NoError(t, err) + + // instead of getting links back, we automatically load the nodes + + retrievedNode3, err := retrievedNode.LookupByString("link3") + require.NoError(t, err) + assert.Equal(t, node3, retrievedNode3) + + retrievedNode4, err := retrievedNode.LookupByString("link4") + require.NoError(t, err) + assert.Equal(t, node4, retrievedNode4) + +} From c06e355f962279ecf328a57272f4906df24800d1 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 1 Apr 2021 20:09:10 -0700 Subject: [PATCH 2959/3147] fix: handle missing session exchange in Session Otherwise, we'll panic. This commit was moved from ipfs/go-blockservice@39f3c34e410ee1a00af4255279f69adb31229ba9 --- blockservice/blockservice.go | 12 ++++++++++-- blockservice/blockservice_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 33f69141c6..2f320b139b 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -366,12 +366,20 @@ func (s *Session) getSession() exchange.Fetcher { // GetBlock gets a block in the context of a request session func (s *Session) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { - return getBlock(ctx, c, s.bs, s.getSession) // hash security + var f func() exchange.Fetcher + if s.sessEx != nil { + f = s.getSession + } + return getBlock(ctx, c, s.bs, f) // hash security } // GetBlocks gets blocks in the context of a request session func (s *Session) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { - return getBlocks(ctx, ks, s.bs, s.getSession) // hash security + var f func() exchange.Fetcher + if s.sessEx != nil { + f = s.getSession + } + return getBlocks(ctx, ks, s.bs, f) // hash security } var _ BlockGetter = (*Session)(nil) diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index dfd12fc437..36cdf0330c 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -119,3 +119,31 @@ func (fe *fakeSessionExchange) NewSession(ctx context.Context) exchange.Fetcher } return fe.session } + +func TestNilExchange(t *testing.T) { + ctx := context.Background() + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + bgen := butil.NewBlockGenerator() + block := bgen.Next() + + bs := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + bserv := NewWriteThrough(bs, nil) + sess := NewSession(ctx, bserv) + _, err := sess.GetBlock(ctx, block.Cid()) + if err != ErrNotFound { + t.Fatal("expected block to not be found") + } + err = bs.Put(block) + if err != nil { + t.Fatal(err) + } + b, err := sess.GetBlock(ctx, block.Cid()) + if err != nil { + t.Fatal(err) + } + if b.Cid() != block.Cid() { + t.Fatal("got the wrong block") + } +} From 0abaf0457867c3650e63f744a37207a794d692ae Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 2 Apr 2021 14:49:28 -0700 Subject: [PATCH 2960/3147] fix(fetcher): switch to node reifier This commit was moved from ipfs/go-fetcher@d4187fbb1ffc1cf945ab4d51a3d089f25b663080 --- fetcher/fetcher.go | 15 +++++++-------- fetcher/fetcher_test.go | 42 ++++++++--------------------------------- 2 files changed, 15 insertions(+), 42 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 409e48b6c0..a8cfc4dccb 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -7,6 +7,7 @@ import ( "io" "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-unixfsnode" dagpb "github.com/ipld/go-codec-dagpb" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" @@ -17,14 +18,10 @@ import ( "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) -// AugmentChooserFunc is a function that can augment a prototype chooser at the time the Fetcher is initialized, -// which is given the linksystem the fetcher itself will use -type AugmentChooserFunc func(*ipld.LinkSystem, traversal.LinkTargetNodePrototypeChooser) traversal.LinkTargetNodePrototypeChooser - // FetcherConfig defines a configuration object from which Fetcher instances are constructed type FetcherConfig struct { blockService blockservice.BlockService - AugmentChooser AugmentChooserFunc + NodeReifier ipld.NodeReifier PrototypeChooser traversal.LinkTargetNodePrototypeChooser } @@ -71,6 +68,7 @@ type FetchCallback func(result FetchResult) error func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { return FetcherConfig{ blockService: blockService, + NodeReifier: DefaultReifier, PrototypeChooser: DefaultPrototypeChooser, } } @@ -83,10 +81,9 @@ func (fc FetcherConfig) NewSession(ctx context.Context) Fetcher { // into ipld-prime ls.TrustedStorage = true ls.StorageReadOpener = blockOpener(ctx, blockservice.NewSession(ctx, fc.blockService)) + ls.NodeReifier = fc.NodeReifier + protoChooser := fc.PrototypeChooser - if fc.AugmentChooser != nil { - protoChooser = fc.AugmentChooser(&ls, protoChooser) - } return &fetcherSession{linkSystem: ls, protoChooser: protoChooser} } @@ -203,3 +200,5 @@ var DefaultPrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkC } return basicnode.Prototype.Any, nil }) + +var DefaultReifier = unixfsnode.Reify diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index 83205ce6b6..b20d27e539 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -6,7 +6,6 @@ import ( "testing" "time" - "github.com/ipld/go-ipld-prime/traversal" "github.com/ipld/go-ipld-prime/traversal/selector" "github.com/ipld/go-ipld-prime/traversal/selector/builder" @@ -310,28 +309,7 @@ func (sl *selfLoader) LookupByString(key string) (ipld.Node, error) { return nd, err } -type selfLoadPrototype struct { - ctx context.Context - ls *ipld.LinkSystem - basePrototype ipld.NodePrototype -} - -func (slp *selfLoadPrototype) NewBuilder() ipld.NodeBuilder { - return &selfLoadBuilder{ctx: slp.ctx, NodeBuilder: slp.basePrototype.NewBuilder(), ls: slp.ls} -} - -type selfLoadBuilder struct { - ctx context.Context - ipld.NodeBuilder - ls *ipld.LinkSystem -} - -func (slb *selfLoadBuilder) Build() ipld.Node { - nd := slb.NodeBuilder.Build() - return &selfLoader{nd, slb.ctx, slb.ls} -} - -func TestChooserAugmentation(t *testing.T) { +func TestNodeReification(t *testing.T) { // demonstrates how to use the augment chooser to build an ADL that self loads its own nodes block3, node3, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("three").AssignBool(true) @@ -364,16 +342,10 @@ func TestChooserAugmentation(t *testing.T) { wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) - augmentChooser := func(ls *ipld.LinkSystem, base traversal.LinkTargetNodePrototypeChooser) traversal.LinkTargetNodePrototypeChooser { - return func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { - np, err := base(lnk, lnkCtx) - if err != nil { - return np, err - } - return &selfLoadPrototype{ctx: lnkCtx.Ctx, ls: ls, basePrototype: np}, nil - } + nodeReifier := func(lnkCtx ipld.LinkContext, nd ipld.Node, ls *ipld.LinkSystem) (ipld.Node, error) { + return &selfLoader{Node: nd, ctx: lnkCtx.Ctx, ls: ls}, nil } - fetcherConfig.AugmentChooser = augmentChooser + fetcherConfig.NodeReifier = nodeReifier session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -385,10 +357,12 @@ func TestChooserAugmentation(t *testing.T) { retrievedNode3, err := retrievedNode.LookupByString("link3") require.NoError(t, err) - assert.Equal(t, node3, retrievedNode3) + underlying3 := retrievedNode3.(*selfLoader).Node + assert.Equal(t, node3, underlying3) retrievedNode4, err := retrievedNode.LookupByString("link4") require.NoError(t, err) - assert.Equal(t, node4, retrievedNode4) + underlying4 := retrievedNode4.(*selfLoader).Node + assert.Equal(t, node4, underlying4) } From aae6fd0a78564a263b924819d7d156effde6ad33 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 2 Apr 2021 17:07:14 -0700 Subject: [PATCH 2961/3147] feat(fetcher): remove default reifier This commit was moved from ipfs/go-fetcher@9362e80d1a76af371182eeda7bba87593f79f707 --- fetcher/fetcher.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index a8cfc4dccb..2402e64ffa 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -7,7 +7,6 @@ import ( "io" "github.com/ipfs/go-blockservice" - "github.com/ipfs/go-unixfsnode" dagpb "github.com/ipld/go-codec-dagpb" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" @@ -68,7 +67,6 @@ type FetchCallback func(result FetchResult) error func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { return FetcherConfig{ blockService: blockService, - NodeReifier: DefaultReifier, PrototypeChooser: DefaultPrototypeChooser, } } @@ -200,5 +198,3 @@ var DefaultPrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkC } return basicnode.Prototype.Any, nil }) - -var DefaultReifier = unixfsnode.Reify From 60c3e5f049bfe17bcc7b1266cfe4c99bc8bdadff Mon Sep 17 00:00:00 2001 From: zhoujiajie Date: Wed, 7 Apr 2021 10:08:01 +0800 Subject: [PATCH 2962/3147] chore: update the Usage part of readme This commit was moved from ipfs/go-ipfs-provider@f8b63a164afc1e0fbf12df07b1bc89b2dabd31de --- provider/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/README.md b/provider/README.md index d5f5aadc5a..98ee8c08a6 100644 --- a/provider/README.md +++ b/provider/README.md @@ -40,7 +40,7 @@ cid := (your cid to provide here) q := queue.NewQueue(context.Background(), "example", dstore) -reprov := simple.NewReprovider(context.Background(), time.Hour * 12, rsys, simple.NewBlockstoreProvider) +reprov := simple.NewReprovider(context.Background(), time.Hour * 12, rsys, simple.NewBlockstoreProvider(dstore)) prov := simple.NewProvider(context.Background(), q, rsys) sys := provider.NewSystem(prov, reprov) From 33050b4e6c480ea73b66dc234e7e309a835710af Mon Sep 17 00:00:00 2001 From: gammazero Date: Tue, 6 Apr 2021 02:08:34 -0700 Subject: [PATCH 2963/3147] Output a more useful resolve error This outputs a missage that blames a specific sife for not having DNSLink record. For example, the error message looks like: `could not resolve name: bad.example.net is missing DNSLink record (https://docs.ipfs.io/concepts/dnslink/)` The "could not resolve name" portion is still present because the returned error wraps the original ErrResolveFailed, allowing code to test if the error is an ErrorResolveFailed error. This commit was moved from ipfs/go-namesys@4e753ad875b58aebc217375b97f051db202336b4 --- namesys/base.go | 9 +++++++++ namesys/namesys_test.go | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/namesys/base.go b/namesys/base.go index 27cc38f888..096bdf91b3 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -2,6 +2,7 @@ package namesys import ( "context" + "fmt" "strings" "time" @@ -36,6 +37,14 @@ func resolve(ctx context.Context, r resolver, name string, options opts.ResolveO } } + if err == ErrResolveFailed { + i := len(name) - 1 + for i >= 0 && name[i] != '/' { + i-- + } + // Wrap error so that it can be tested if it is a ErrResolveFailed + err = fmt.Errorf("%w: %s is missing DNSLink record (https://docs.ipfs.io/concepts/dnslink/)", ErrResolveFailed, name[i+1:]) + } return p, err } diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 0ae858f4ee..30674106b4 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -2,6 +2,7 @@ package namesys import ( "context" + "errors" "fmt" "testing" "time" @@ -25,7 +26,7 @@ type mockResolver struct { func testResolution(t *testing.T, resolver Resolver, name string, depth uint, expected string, expError error) { t.Helper() p, err := resolver.Resolve(context.Background(), name, opts.Depth(depth)) - if err != expError { + if !errors.Is(err, expError) { t.Fatal(fmt.Errorf( "expected %s with a depth of %d to have a '%s' error, but got '%s'", name, depth, expError, err)) From 80ecd1a7c5bf53d0783f17d77fd0768fb30de6dc Mon Sep 17 00:00:00 2001 From: Andrew Gillis Date: Tue, 6 Apr 2021 11:36:17 -0700 Subject: [PATCH 2964/3147] Update base.go with suggestion Co-authored-by: Marcin Rataj This commit was moved from ipfs/go-namesys@3d9078203aa6d1eb557f5c4d590060791d62f6dc --- namesys/base.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/base.go b/namesys/base.go index 096bdf91b3..a463e48f15 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -43,7 +43,7 @@ func resolve(ctx context.Context, r resolver, name string, options opts.ResolveO i-- } // Wrap error so that it can be tested if it is a ErrResolveFailed - err = fmt.Errorf("%w: %s is missing DNSLink record (https://docs.ipfs.io/concepts/dnslink/)", ErrResolveFailed, name[i+1:]) + err = fmt.Errorf("%w: %q is missing a DNSLink record (https://docs.ipfs.io/concepts/dnslink/)", ErrResolveFailed, name[i+1:]) } return p, err } From 62a14187bba8bad0cd1f055ca1d3411a36926676 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 9 Apr 2021 17:39:41 -0700 Subject: [PATCH 2965/3147] feat(fetcher): switch selector to ipld.Node This commit was moved from ipfs/go-fetcher@69e4d9ba3745c36f090b435ea259daf8f1a9e8e6 --- fetcher/fetcher.go | 25 +++++++++++++------------ fetcher/fetcher_test.go | 10 ++++------ 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 2402e64ffa..d6702adfb1 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -31,7 +31,7 @@ type Fetcher interface { // block boundaries. Each matched node is passed as FetchResult to the callback. Errors returned from callback will // halt the traversal. The sequence of events is: NodeMatching begins, the callback is called zero or more times // with a FetchResult, then NodeMatching returns. - NodeMatching(context.Context, ipld.Node, selector.Selector, FetchCallback) error + NodeMatching(context.Context, ipld.Node, ipld.Node, FetchCallback) error // BlockOfType fetches a node graph of the provided type corresponding to single block by link. BlockOfType(context.Context, ipld.Link, ipld.NodePrototype) (ipld.Node, error) @@ -41,7 +41,7 @@ type Fetcher interface { // a FetchResult to the callback. Errors returned from callback will halt the traversal. // The sequence of events is: BlockMatchingOfType begins, the callback is called zero or more times with a // FetchResult, then BlockMatchingOfType returns. - BlockMatchingOfType(context.Context, ipld.Link, selector.Selector, ipld.NodePrototype, FetchCallback) error + BlockMatchingOfType(context.Context, ipld.Link, ipld.Node, ipld.NodePrototype, FetchCallback) error // Uses the given link to pick a prototype to build the linked node. PrototypeFromLink(link ipld.Link) (ipld.NodePrototype, error) @@ -90,8 +90,12 @@ func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype return f.linkSystem.Load(ipld.LinkContext{}, link, ptype) } -func (f *fetcherSession) nodeMatching(ctx context.Context, initialProgress traversal.Progress, node ipld.Node, match selector.Selector, cb FetchCallback) error { - return initialProgress.WalkMatching(node, match, func(prog traversal.Progress, n ipld.Node) error { +func (f *fetcherSession) nodeMatching(ctx context.Context, initialProgress traversal.Progress, node ipld.Node, match ipld.Node, cb FetchCallback) error { + matchSelector, err := selector.ParseSelector(match) + if err != nil { + return err + } + return initialProgress.WalkMatching(node, matchSelector, func(prog traversal.Progress, n ipld.Node) error { return cb(FetchResult{ Node: n, Path: prog.Path, @@ -110,11 +114,11 @@ func (f *fetcherSession) blankProgress(ctx context.Context) traversal.Progress { } } -func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match selector.Selector, cb FetchCallback) error { +func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match ipld.Node, cb FetchCallback) error { return f.nodeMatching(ctx, f.blankProgress(ctx), node, match, cb) } -func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match selector.Selector, +func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match ipld.Node, ptype ipld.NodePrototype, cb FetchCallback) error { // retrieve first node @@ -143,7 +147,7 @@ func Block(ctx context.Context, f Fetcher, link ipld.Link) (ipld.Node, error) { // BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. -func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match selector.Selector, cb FetchCallback) error { +func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match ipld.Node, cb FetchCallback) error { prototype, err := f.PrototypeFromLink(root) if err != nil { return err @@ -165,13 +169,10 @@ func BlockAll(ctx context.Context, f Fetcher, root ipld.Link, cb FetchCallback) // and send over the results channel. func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.NodePrototype, cb FetchCallback) error { ssb := builder.NewSelectorSpecBuilder(ptype) - allSelector, err := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( + allSelector := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), ssb.ExploreAll(ssb.ExploreRecursiveEdge()), - )).Selector() - if err != nil { - return err - } + )).Node() return f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) } diff --git a/fetcher/fetcher_test.go b/fetcher/fetcher_test.go index b20d27e539..434c60d7f6 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/fetcher_test.go @@ -171,11 +171,10 @@ func TestFetchIPLDPath(t *testing.T) { for i := len(path) - 1; i >= 0; i-- { spec = explorePath(path[i], spec) } - sel, err := spec.Selector() - require.NoError(t, err) + sel := spec.Node() results := []fetcher.FetchResult{} - err = fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { + err := fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { results = append(results, res) return nil }) @@ -241,11 +240,10 @@ func TestHelpers(t *testing.T) { t.Run("BlockMatching retrieves nodes matching selector", func(t *testing.T) { // limit recursion depth to 2 nodes and expect to get only 2 blocks (4 nodes) ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype__Any{}) - sel, err := ssb.ExploreRecursive(selector.RecursionLimitDepth(2), ssb.ExploreUnion( + sel := ssb.ExploreRecursive(selector.RecursionLimitDepth(2), ssb.ExploreUnion( ssb.Matcher(), ssb.ExploreAll(ssb.ExploreRecursiveEdge()), - )).Selector() - require.NoError(t, err) + )).Node() fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) From 0782fe6e1054ea1c250332c7312183d0d125d681 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 9 Apr 2021 17:57:03 -0700 Subject: [PATCH 2966/3147] feat(fetcher): seperate out implementation move block service implementation to its own package. move traversal helpers to traversal directory This commit was moved from ipfs/go-fetcher@3978480e91fe79e1354f40046446d9d99a7c115b --- fetcher/fetcher.go | 160 ------------------ fetcher/helpers/block_visitor_test.go | 10 +- fetcher/helpers/traversal.go | 50 ++++++ fetcher/impl/blockservice/fetcher.go | 127 ++++++++++++++ .../{ => impl/blockservice}/fetcher_test.go | 35 ++-- 5 files changed, 200 insertions(+), 182 deletions(-) create mode 100644 fetcher/helpers/traversal.go create mode 100644 fetcher/impl/blockservice/fetcher.go rename fetcher/{ => impl/blockservice}/fetcher_test.go (92%) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index d6702adfb1..6fa0db0a9d 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -1,29 +1,11 @@ package fetcher import ( - "bytes" "context" - "fmt" - "io" - "github.com/ipfs/go-blockservice" - dagpb "github.com/ipld/go-codec-dagpb" "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - basicnode "github.com/ipld/go-ipld-prime/node/basic" - "github.com/ipld/go-ipld-prime/schema" - "github.com/ipld/go-ipld-prime/traversal" - "github.com/ipld/go-ipld-prime/traversal/selector" - "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) -// FetcherConfig defines a configuration object from which Fetcher instances are constructed -type FetcherConfig struct { - blockService blockservice.BlockService - NodeReifier ipld.NodeReifier - PrototypeChooser traversal.LinkTargetNodePrototypeChooser -} - // Fetcher is an interface for reading from a dag. Reads may be local or remote, and may employ data exchange // protocols like graphsync and bitswap type Fetcher interface { @@ -47,11 +29,6 @@ type Fetcher interface { PrototypeFromLink(link ipld.Link) (ipld.NodePrototype, error) } -type fetcherSession struct { - linkSystem ipld.LinkSystem - protoChooser traversal.LinkTargetNodePrototypeChooser -} - // FetchResult is a single node read as part of a dag operation called on a fetcher type FetchResult struct { Node ipld.Node @@ -62,140 +39,3 @@ type FetchResult struct { // FetchCallback is called for each node traversed during a fetch type FetchCallback func(result FetchResult) error - -// NewFetcherConfig creates a FetchConfig from which session may be created and nodes retrieved. -func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { - return FetcherConfig{ - blockService: blockService, - PrototypeChooser: DefaultPrototypeChooser, - } -} - -// NewSession creates a session from which nodes may be retrieved. -// The session ends when the provided context is canceled. -func (fc FetcherConfig) NewSession(ctx context.Context) Fetcher { - ls := cidlink.DefaultLinkSystem() - // while we may be loading blocks remotely, they are already hash verified by the time they load - // into ipld-prime - ls.TrustedStorage = true - ls.StorageReadOpener = blockOpener(ctx, blockservice.NewSession(ctx, fc.blockService)) - ls.NodeReifier = fc.NodeReifier - - protoChooser := fc.PrototypeChooser - return &fetcherSession{linkSystem: ls, protoChooser: protoChooser} -} - -// BlockOfType fetches a node graph of the provided type corresponding to single block by link. -func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) { - return f.linkSystem.Load(ipld.LinkContext{}, link, ptype) -} - -func (f *fetcherSession) nodeMatching(ctx context.Context, initialProgress traversal.Progress, node ipld.Node, match ipld.Node, cb FetchCallback) error { - matchSelector, err := selector.ParseSelector(match) - if err != nil { - return err - } - return initialProgress.WalkMatching(node, matchSelector, func(prog traversal.Progress, n ipld.Node) error { - return cb(FetchResult{ - Node: n, - Path: prog.Path, - LastBlockPath: prog.LastBlock.Path, - LastBlockLink: prog.LastBlock.Link, - }) - }) -} - -func (f *fetcherSession) blankProgress(ctx context.Context) traversal.Progress { - return traversal.Progress{ - Cfg: &traversal.Config{ - LinkSystem: f.linkSystem, - LinkTargetNodePrototypeChooser: f.protoChooser, - }, - } -} - -func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match ipld.Node, cb FetchCallback) error { - return f.nodeMatching(ctx, f.blankProgress(ctx), node, match, cb) -} - -func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match ipld.Node, - ptype ipld.NodePrototype, cb FetchCallback) error { - - // retrieve first node - node, err := f.BlockOfType(ctx, root, ptype) - if err != nil { - return err - } - - progress := f.blankProgress(ctx) - progress.LastBlock.Link = root - return f.nodeMatching(ctx, progress, node, match, cb) -} - -func (f *fetcherSession) PrototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, error) { - return f.protoChooser(lnk, ipld.LinkContext{}) -} - -// Block fetches a schemaless node graph corresponding to single block by link. -func Block(ctx context.Context, f Fetcher, link ipld.Link) (ipld.Node, error) { - prototype, err := f.PrototypeFromLink(link) - if err != nil { - return nil, err - } - return f.BlockOfType(ctx, link, prototype) -} - -// BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing -// block boundaries. Each matched node is sent to the FetchResult channel. -func BlockMatching(ctx context.Context, f Fetcher, root ipld.Link, match ipld.Node, cb FetchCallback) error { - prototype, err := f.PrototypeFromLink(root) - if err != nil { - return err - } - return f.BlockMatchingOfType(ctx, root, match, prototype, cb) -} - -// BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results -// channel. -func BlockAll(ctx context.Context, f Fetcher, root ipld.Link, cb FetchCallback) error { - prototype, err := f.PrototypeFromLink(root) - if err != nil { - return err - } - return BlockAllOfType(ctx, f, root, prototype, cb) -} - -// BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype -// and send over the results channel. -func BlockAllOfType(ctx context.Context, f Fetcher, root ipld.Link, ptype ipld.NodePrototype, cb FetchCallback) error { - ssb := builder.NewSelectorSpecBuilder(ptype) - allSelector := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( - ssb.Matcher(), - ssb.ExploreAll(ssb.ExploreRecursiveEdge()), - )).Node() - return f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) -} - -func blockOpener(ctx context.Context, bs *blockservice.Session) ipld.BlockReadOpener { - return func(_ ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { - cidLink, ok := lnk.(cidlink.Link) - if !ok { - return nil, fmt.Errorf("invalid link type for loading: %v", lnk) - } - - blk, err := bs.GetBlock(ctx, cidLink.Cid) - if err != nil { - return nil, err - } - - return bytes.NewReader(blk.RawData()), nil - } -} - -// Chooser that supports DagPB nodes and choosing the prototype from the link. -var DefaultPrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { - if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { - return tlnkNd.LinkTargetNodePrototype(), nil - } - return basicnode.Prototype.Any, nil -}) diff --git a/fetcher/helpers/block_visitor_test.go b/fetcher/helpers/block_visitor_test.go index 097946af41..f7837043fd 100644 --- a/fetcher/helpers/block_visitor_test.go +++ b/fetcher/helpers/block_visitor_test.go @@ -8,8 +8,8 @@ import ( testinstance "github.com/ipfs/go-bitswap/testinstance" tn "github.com/ipfs/go-bitswap/testnet" "github.com/ipfs/go-blockservice" - "github.com/ipfs/go-fetcher" "github.com/ipfs/go-fetcher/helpers" + bsfetcher "github.com/ipfs/go-fetcher/impl/blockservice" "github.com/ipfs/go-fetcher/testutil" delay "github.com/ipfs/go-ipfs-delay" mockrouting "github.com/ipfs/go-ipfs-routing/mock" @@ -62,13 +62,13 @@ func TestFetchGraphToBlocks(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() results := []helpers.BlockResult{} - err = fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, helpers.OnBlocks(func(res helpers.BlockResult) error { + err = helpers.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, helpers.OnBlocks(func(res helpers.BlockResult) error { results = append(results, res) return nil })) @@ -113,13 +113,13 @@ func TestFetchGraphToUniqueBlocks(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() results := []helpers.BlockResult{} - err = fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, helpers.OnUniqueBlocks(func(res helpers.BlockResult) error { + err = helpers.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, helpers.OnUniqueBlocks(func(res helpers.BlockResult) error { results = append(results, res) return nil })) diff --git a/fetcher/helpers/traversal.go b/fetcher/helpers/traversal.go new file mode 100644 index 0000000000..37feeeb501 --- /dev/null +++ b/fetcher/helpers/traversal.go @@ -0,0 +1,50 @@ +package helpers + +import ( + "context" + + "github.com/ipfs/go-fetcher" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/traversal/selector" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" +) + +// Block fetches a schemaless node graph corresponding to single block by link. +func Block(ctx context.Context, f fetcher.Fetcher, link ipld.Link) (ipld.Node, error) { + prototype, err := f.PrototypeFromLink(link) + if err != nil { + return nil, err + } + return f.BlockOfType(ctx, link, prototype) +} + +// BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing +// block boundaries. Each matched node is sent to the FetchResult channel. +func BlockMatching(ctx context.Context, f fetcher.Fetcher, root ipld.Link, match ipld.Node, cb fetcher.FetchCallback) error { + prototype, err := f.PrototypeFromLink(root) + if err != nil { + return err + } + return f.BlockMatchingOfType(ctx, root, match, prototype, cb) +} + +// BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results +// channel. +func BlockAll(ctx context.Context, f fetcher.Fetcher, root ipld.Link, cb fetcher.FetchCallback) error { + prototype, err := f.PrototypeFromLink(root) + if err != nil { + return err + } + return BlockAllOfType(ctx, f, root, prototype, cb) +} + +// BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype +// and send over the results channel. +func BlockAllOfType(ctx context.Context, f fetcher.Fetcher, root ipld.Link, ptype ipld.NodePrototype, cb fetcher.FetchCallback) error { + ssb := builder.NewSelectorSpecBuilder(ptype) + allSelector := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( + ssb.Matcher(), + ssb.ExploreAll(ssb.ExploreRecursiveEdge()), + )).Node() + return f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) +} diff --git a/fetcher/impl/blockservice/fetcher.go b/fetcher/impl/blockservice/fetcher.go new file mode 100644 index 0000000000..92f5e59725 --- /dev/null +++ b/fetcher/impl/blockservice/fetcher.go @@ -0,0 +1,127 @@ +package bsfetcher + +import ( + "bytes" + "context" + "fmt" + "io" + + "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-fetcher" + dagpb "github.com/ipld/go-codec-dagpb" + "github.com/ipld/go-ipld-prime" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/ipld/go-ipld-prime/schema" + "github.com/ipld/go-ipld-prime/traversal" + "github.com/ipld/go-ipld-prime/traversal/selector" +) + +type fetcherSession struct { + linkSystem ipld.LinkSystem + protoChooser traversal.LinkTargetNodePrototypeChooser +} + +// FetcherConfig defines a configuration object from which Fetcher instances are constructed +type FetcherConfig struct { + blockService blockservice.BlockService + NodeReifier ipld.NodeReifier + PrototypeChooser traversal.LinkTargetNodePrototypeChooser +} + +// NewFetcherConfig creates a FetchConfig from which session may be created and nodes retrieved. +func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { + return FetcherConfig{ + blockService: blockService, + PrototypeChooser: DefaultPrototypeChooser, + } +} + +// NewSession creates a session from which nodes may be retrieved. +// The session ends when the provided context is canceled. +func (fc FetcherConfig) NewSession(ctx context.Context) fetcher.Fetcher { + ls := cidlink.DefaultLinkSystem() + // while we may be loading blocks remotely, they are already hash verified by the time they load + // into ipld-prime + ls.TrustedStorage = true + ls.StorageReadOpener = blockOpener(ctx, blockservice.NewSession(ctx, fc.blockService)) + ls.NodeReifier = fc.NodeReifier + + protoChooser := fc.PrototypeChooser + return &fetcherSession{linkSystem: ls, protoChooser: protoChooser} +} + +// BlockOfType fetches a node graph of the provided type corresponding to single block by link. +func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) { + return f.linkSystem.Load(ipld.LinkContext{}, link, ptype) +} + +func (f *fetcherSession) nodeMatching(ctx context.Context, initialProgress traversal.Progress, node ipld.Node, match ipld.Node, cb fetcher.FetchCallback) error { + matchSelector, err := selector.ParseSelector(match) + if err != nil { + return err + } + return initialProgress.WalkMatching(node, matchSelector, func(prog traversal.Progress, n ipld.Node) error { + return cb(fetcher.FetchResult{ + Node: n, + Path: prog.Path, + LastBlockPath: prog.LastBlock.Path, + LastBlockLink: prog.LastBlock.Link, + }) + }) +} + +func (f *fetcherSession) blankProgress(ctx context.Context) traversal.Progress { + return traversal.Progress{ + Cfg: &traversal.Config{ + LinkSystem: f.linkSystem, + LinkTargetNodePrototypeChooser: f.protoChooser, + }, + } +} + +func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match ipld.Node, cb fetcher.FetchCallback) error { + return f.nodeMatching(ctx, f.blankProgress(ctx), node, match, cb) +} + +func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match ipld.Node, + ptype ipld.NodePrototype, cb fetcher.FetchCallback) error { + + // retrieve first node + node, err := f.BlockOfType(ctx, root, ptype) + if err != nil { + return err + } + + progress := f.blankProgress(ctx) + progress.LastBlock.Link = root + return f.nodeMatching(ctx, progress, node, match, cb) +} + +func (f *fetcherSession) PrototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, error) { + return f.protoChooser(lnk, ipld.LinkContext{}) +} + +// DefaultPrototypeChooser supports DagPB nodes and choosing the prototype from the link. +var DefaultPrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil +}) + +func blockOpener(ctx context.Context, bs *blockservice.Session) ipld.BlockReadOpener { + return func(_ ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { + cidLink, ok := lnk.(cidlink.Link) + if !ok { + return nil, fmt.Errorf("invalid link type for loading: %v", lnk) + } + + blk, err := bs.GetBlock(ctx, cidLink.Cid) + if err != nil { + return nil, err + } + + return bytes.NewReader(blk.RawData()), nil + } +} diff --git a/fetcher/fetcher_test.go b/fetcher/impl/blockservice/fetcher_test.go similarity index 92% rename from fetcher/fetcher_test.go rename to fetcher/impl/blockservice/fetcher_test.go index 434c60d7f6..f8c2d00822 100644 --- a/fetcher/fetcher_test.go +++ b/fetcher/impl/blockservice/fetcher_test.go @@ -1,4 +1,4 @@ -package fetcher_test +package bsfetcher_test import ( "context" @@ -13,6 +13,9 @@ import ( tn "github.com/ipfs/go-bitswap/testnet" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-fetcher" + "github.com/ipfs/go-fetcher/helpers" + bsfetcher "github.com/ipfs/go-fetcher/impl/blockservice" "github.com/ipfs/go-fetcher/testutil" delay "github.com/ipfs/go-ipfs-delay" mockrouting "github.com/ipfs/go-ipfs-routing/mock" @@ -22,8 +25,6 @@ import ( basicnode "github.com/ipld/go-ipld-prime/node/basic" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - - "github.com/ipfs/go-fetcher" ) func TestFetchIPLDPrimeNode(t *testing.T) { @@ -50,13 +51,13 @@ func TestFetchIPLDPrimeNode(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - retrievedNode, err := fetcher.Block(ctx, session, cidlink.Link{Cid: block.Cid()}) + retrievedNode, err := helpers.Block(ctx, session, cidlink.Link{Cid: block.Cid()}) require.NoError(t, err) assert.Equal(t, node, retrievedNode) } @@ -102,13 +103,13 @@ func TestFetchIPLDGraph(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() results := []fetcher.FetchResult{} - err = fetcher.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, func(res fetcher.FetchResult) error { + err = helpers.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, func(res fetcher.FetchResult) error { results = append(results, res) return nil }) @@ -157,7 +158,7 @@ func TestFetchIPLDPath(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -174,7 +175,7 @@ func TestFetchIPLDPath(t *testing.T) { sel := spec.Node() results := []fetcher.FetchResult{} - err := fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { + err := helpers.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { results = append(results, res) return nil }) @@ -226,12 +227,12 @@ func TestHelpers(t *testing.T) { wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) t.Run("Block retrieves node", func(t *testing.T) { - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - node, err := fetcher.Block(ctx, session, cidlink.Link{Cid: block1.Cid()}) + node, err := helpers.Block(ctx, session, cidlink.Link{Cid: block1.Cid()}) require.NoError(t, err) assert.Equal(t, node, node1) @@ -245,13 +246,13 @@ func TestHelpers(t *testing.T) { ssb.ExploreAll(ssb.ExploreRecursiveEdge()), )).Node() - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() results := []fetcher.FetchResult{} - err = fetcher.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { + err = helpers.BlockMatching(ctx, session, cidlink.Link{Cid: block1.Cid()}, sel, func(res fetcher.FetchResult) error { results = append(results, res) return nil }) @@ -262,13 +263,13 @@ func TestHelpers(t *testing.T) { t.Run("BlockAllOfType retrieves all nodes with a schema", func(t *testing.T) { // limit recursion depth to 2 nodes and expect to get only 2 blocks (4 nodes) - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) session := fetcherConfig.NewSession(context.Background()) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() results := []fetcher.FetchResult{} - err = fetcher.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}, func(res fetcher.FetchResult) error { + err = helpers.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}, func(res fetcher.FetchResult) error { results = append(results, res) return nil }) @@ -339,7 +340,7 @@ func TestNodeReification(t *testing.T) { defer wantsBlock.Exchange.Close() wantsGetter := blockservice.New(wantsBlock.Blockstore(), wantsBlock.Exchange) - fetcherConfig := fetcher.NewFetcherConfig(wantsGetter) + fetcherConfig := bsfetcher.NewFetcherConfig(wantsGetter) nodeReifier := func(lnkCtx ipld.LinkContext, nd ipld.Node, ls *ipld.LinkSystem) (ipld.Node, error) { return &selfLoader{Node: nd, ctx: lnkCtx.Ctx, ls: ls}, nil } @@ -348,7 +349,7 @@ func TestNodeReification(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - retrievedNode, err := fetcher.Block(ctx, session, cidlink.Link{Cid: block2.Cid()}) + retrievedNode, err := helpers.Block(ctx, session, cidlink.Link{Cid: block2.Cid()}) require.NoError(t, err) // instead of getting links back, we automatically load the nodes From 352b91e07d3c507ee43176cf19f243714deeb4da Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 9 Apr 2021 18:06:54 -0700 Subject: [PATCH 2967/3147] style(lint): fix lint errors This commit was moved from ipfs/go-fetcher@febb8de4105ad6876d8872f00466b0ba365910f3 --- fetcher/testutil/testutil.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fetcher/testutil/testutil.go b/fetcher/testutil/testutil.go index 87badbdfbe..f67e6ca767 100644 --- a/fetcher/testutil/testutil.go +++ b/fetcher/testutil/testutil.go @@ -8,6 +8,8 @@ import ( blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/ipld/go-ipld-prime" + + // used to make sure we have dagcbor encoding _ "github.com/ipld/go-ipld-prime/codec/dagcbor" cidlink "github.com/ipld/go-ipld-prime/linking/cid" ) @@ -16,7 +18,7 @@ import ( func EncodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { ls := cidlink.DefaultLinkSystem() var b blocks.Block - lb := cidlink.LinkPrototype{cid.Prefix{ + lb := cidlink.LinkPrototype{Prefix: cid.Prefix{ Version: 1, Codec: 0x71, MhType: 0x17, From b3aaf9c5b6fa42571a1dcc79c4be6481ac5f2ffd Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 9 Apr 2021 18:14:54 -0700 Subject: [PATCH 2968/3147] feat(fetcher): define factory interface define an interface for making new instances of the fetcher This commit was moved from ipfs/go-fetcher@571518e2eca7d61008d3e9c7707ef75aee20a432 --- fetcher/fetcher.go | 5 +++++ fetcher/impl/blockservice/fetcher.go | 3 +++ 2 files changed, 8 insertions(+) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 6fa0db0a9d..87059396c9 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -39,3 +39,8 @@ type FetchResult struct { // FetchCallback is called for each node traversed during a fetch type FetchCallback func(result FetchResult) error + +// Factory is anything that can create new sessions of the fetcher +type Factory interface { + NewSession(ctx context.Context) Fetcher +} diff --git a/fetcher/impl/blockservice/fetcher.go b/fetcher/impl/blockservice/fetcher.go index 92f5e59725..ffefcf69d2 100644 --- a/fetcher/impl/blockservice/fetcher.go +++ b/fetcher/impl/blockservice/fetcher.go @@ -51,6 +51,9 @@ func (fc FetcherConfig) NewSession(ctx context.Context) fetcher.Fetcher { return &fetcherSession{linkSystem: ls, protoChooser: protoChooser} } +// interface check +var _ fetcher.Factory = FetcherConfig{} + // BlockOfType fetches a node graph of the provided type corresponding to single block by link. func (f *fetcherSession) BlockOfType(ctx context.Context, link ipld.Link, ptype ipld.NodePrototype) (ipld.Node, error) { return f.linkSystem.Load(ipld.LinkContext{}, link, ptype) From d921b23d26bf41872c7b7682592989d6df4f74d6 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 9 Apr 2021 19:54:15 -0700 Subject: [PATCH 2969/3147] style(fetcher): add param names update parameter names on interface to be more clear This commit was moved from ipfs/go-fetcher@5325cff258c02c11f7ce7107070a0bc89bdbb35a --- fetcher/fetcher.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/fetcher/fetcher.go b/fetcher/fetcher.go index 87059396c9..f332d9f121 100644 --- a/fetcher/fetcher.go +++ b/fetcher/fetcher.go @@ -9,21 +9,26 @@ import ( // Fetcher is an interface for reading from a dag. Reads may be local or remote, and may employ data exchange // protocols like graphsync and bitswap type Fetcher interface { - // NodeMatching traverses a node graph starting with the provided node using the given selector and possibly crossing - // block boundaries. Each matched node is passed as FetchResult to the callback. Errors returned from callback will - // halt the traversal. The sequence of events is: NodeMatching begins, the callback is called zero or more times - // with a FetchResult, then NodeMatching returns. - NodeMatching(context.Context, ipld.Node, ipld.Node, FetchCallback) error + // NodeMatching traverses a node graph starting with the provided root node using the given selector node and + // possibly crossing block boundaries. Each matched node is passed as FetchResult to the callback. Errors returned + // from callback will halt the traversal. The sequence of events is: NodeMatching begins, the callback is called zero + // or more times with a FetchResult, then NodeMatching returns. + NodeMatching(ctx context.Context, root ipld.Node, selector ipld.Node, cb FetchCallback) error // BlockOfType fetches a node graph of the provided type corresponding to single block by link. - BlockOfType(context.Context, ipld.Link, ipld.NodePrototype) (ipld.Node, error) + BlockOfType(ctx context.Context, link ipld.Link, nodePrototype ipld.NodePrototype) (ipld.Node, error) - // BlockMatchingOfType traverses a node graph starting with the given link using the given selector and possibly - // crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is passed as - // a FetchResult to the callback. Errors returned from callback will halt the traversal. + // BlockMatchingOfType traverses a node graph starting with the given root link using the given selector node and + // possibly crossing block boundaries. The nodes will be typed using the provided prototype. Each matched node is + // passed as a FetchResult to the callback. Errors returned from callback will halt the traversal. // The sequence of events is: BlockMatchingOfType begins, the callback is called zero or more times with a // FetchResult, then BlockMatchingOfType returns. - BlockMatchingOfType(context.Context, ipld.Link, ipld.Node, ipld.NodePrototype, FetchCallback) error + BlockMatchingOfType( + ctx context.Context, + root ipld.Link, + selector ipld.Node, + nodePrototype ipld.NodePrototype, + cb FetchCallback) error // Uses the given link to pick a prototype to build the linked node. PrototypeFromLink(link ipld.Link) (ipld.NodePrototype, error) From 50e049b7c01363ba6e9c6e0196ae186b238ac58d Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Thu, 15 Apr 2021 23:47:52 -0700 Subject: [PATCH 2970/3147] io/dagreader.go This commit was moved from ipfs/go-unixfs@77ff92dc786d343a8c1d2a614ac734c40df3102b --- unixfs/io/dagreader.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 374b509163..9fb37afffb 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -56,9 +56,27 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe } switch fsNode.Type() { - case unixfs.TFile, unixfs.TRaw: + case unixfs.TFile: size = fsNode.FileSize() + case unixfs.TRaw: + stat, err := n.Stat() + if err != nil { + return nil, err + } + size = uint64(stat.DataSize) + for _, link := range n.Links() { + ln, err := link.GetNode(ctx, serv) + if err != nil { + return nil, err + } + stat, err := ln.Stat() + if err != nil { + return nil, err + } + size += uint64(stat.DataSize) + } + case unixfs.TDirectory, unixfs.THAMTShard: // Dont allow reading directories return nil, ErrIsDir From 7e3eb2d3d0276c11c961f16d7210fb708ec390c6 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Fri, 16 Apr 2021 15:29:59 -0700 Subject: [PATCH 2971/3147] Fix in size func This commit was moved from ipfs/go-unixfs@7e96bad956c88140fe130b2ad2129c486e546408 --- unixfs/io/dagreader.go | 20 +------------------- unixfs/unixfs.go | 4 ++-- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 9fb37afffb..374b509163 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -56,27 +56,9 @@ func NewDagReader(ctx context.Context, n ipld.Node, serv ipld.NodeGetter) (DagRe } switch fsNode.Type() { - case unixfs.TFile: + case unixfs.TFile, unixfs.TRaw: size = fsNode.FileSize() - case unixfs.TRaw: - stat, err := n.Stat() - if err != nil { - return nil, err - } - size = uint64(stat.DataSize) - for _, link := range n.Links() { - ln, err := link.GetNode(ctx, serv) - if err != nil { - return nil, err - } - stat, err := ln.Stat() - if err != nil { - return nil, err - } - size += uint64(stat.DataSize) - } - case unixfs.TDirectory, unixfs.THAMTShard: // Dont allow reading directories return nil, ErrIsDir diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 05abf6576d..555d24efc5 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -159,9 +159,9 @@ func size(pbdata *pb.Data) (uint64, error) { switch pbdata.GetType() { case pb.Data_Directory, pb.Data_HAMTShard: return 0, errors.New("can't get data size of directory") - case pb.Data_File: + case pb.Data_File, pb.Data_Raw: return pbdata.GetFilesize(), nil - case pb.Data_Symlink, pb.Data_Raw: + case pb.Data_Symlink: return uint64(len(pbdata.GetData())), nil default: return 0, errors.New("unrecognized node data type") From c16575e2e2f5462d765104b23411a96555e5d213 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 19 Apr 2021 13:00:02 -0700 Subject: [PATCH 2972/3147] fix(blockservice): remove ref to dag pb This commit was moved from ipfs/go-fetcher@6e0ef2aeedf1526048c988bafd982ab87a18d4f6 --- fetcher/impl/blockservice/fetcher.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fetcher/impl/blockservice/fetcher.go b/fetcher/impl/blockservice/fetcher.go index ffefcf69d2..0a0244d8b5 100644 --- a/fetcher/impl/blockservice/fetcher.go +++ b/fetcher/impl/blockservice/fetcher.go @@ -8,7 +8,6 @@ import ( "github.com/ipfs/go-blockservice" "github.com/ipfs/go-fetcher" - dagpb "github.com/ipld/go-codec-dagpb" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" @@ -106,12 +105,12 @@ func (f *fetcherSession) PrototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, e } // DefaultPrototypeChooser supports DagPB nodes and choosing the prototype from the link. -var DefaultPrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { +var DefaultPrototypeChooser = func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { return tlnkNd.LinkTargetNodePrototype(), nil } return basicnode.Prototype.Any, nil -}) +} func blockOpener(ctx context.Context, bs *blockservice.Session) ipld.BlockReadOpener { return func(_ ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { From 5cfe6154a526a28419239eb983b749ca26195728 Mon Sep 17 00:00:00 2001 From: Andrew Gillis Date: Wed, 21 Apr 2021 12:58:44 -0700 Subject: [PATCH 2973/3147] Properly report DNSLink errors (#12) * Properly report DNSLink errors Only report that there is no DNSLink for a name when there are no DNSLink TXT records available for that name. For all other errors, such as being offline, report the more general "cannot resolve name" error. * Document that we give precedence to good results from looking up DNSLinks in TXT records from `"_dnslink."+fqdn` over results from `fqdn`. This commit was moved from ipfs/go-namesys@22432d192e27fd822f08595a0b121da092218fd0 --- namesys/base.go | 9 --------- namesys/dns.go | 29 ++++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/namesys/base.go b/namesys/base.go index a463e48f15..27cc38f888 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -2,7 +2,6 @@ package namesys import ( "context" - "fmt" "strings" "time" @@ -37,14 +36,6 @@ func resolve(ctx context.Context, r resolver, name string, options opts.ResolveO } } - if err == ErrResolveFailed { - i := len(name) - 1 - for i >= 0 && name[i] != '/' { - i-- - } - // Wrap error so that it can be tested if it is a ErrResolveFailed - err = fmt.Errorf("%w: %q is missing a DNSLink record (https://docs.ipfs.io/concepts/dnslink/)", ErrResolveFailed, name[i+1:]) - } return p, err } diff --git a/namesys/dns.go b/namesys/dns.go index 9938aa8dd5..74fc1093e9 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net" + gpath "path" "strings" path "github.com/ipfs/go-path" @@ -88,6 +89,7 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options go func() { defer close(out) + var rootResErr, subResErr error for { select { case subRes, ok := <-subChan: @@ -98,8 +100,11 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options if subRes.error == nil { p, err := appendPath(subRes.path) emitOnceResult(ctx, out, onceResult{value: p, err: err}) + // Return without waiting for rootRes, since this result + // (for "_dnslink."+fqdn) takes precedence return } + subResErr = subRes.error case rootRes, ok := <-rootChan: if !ok { rootChan = nil @@ -108,11 +113,24 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options if rootRes.error == nil { p, err := appendPath(rootRes.path) emitOnceResult(ctx, out, onceResult{value: p, err: err}) + // Do not return here. Wait for subRes so that it is + // output last if good, thereby giving subRes precedence. + } else { + rootResErr = rootRes.error } case <-ctx.Done(): return } if subChan == nil && rootChan == nil { + // If here, then both lookups are done + // + // If both lookups failed due to no TXT records with a + // dnslink, then output a more specific error message + if rootResErr == ErrResolveFailed && subResErr == ErrResolveFailed { + // Wrap error so that it can be tested if it is a ErrResolveFailed + err := fmt.Errorf("%w: %q is missing a DNSLink record (https://docs.ipfs.io/concepts/dnslink/)", ErrResolveFailed, gpath.Base(name)) + emitOnceResult(ctx, out, onceResult{err: err}) + } return } } @@ -126,7 +144,14 @@ func workDomain(r *DNSResolver, name string, res chan lookupRes) { txt, err := r.lookupTXT(name) if err != nil { - // Error is != nil + if dnsErr, ok := err.(*net.DNSError); ok { + // If no TXT records found, return same error as when no text + // records contain dnslink. Otherwise, return the actual error. + if dnsErr.IsNotFound { + err = ErrResolveFailed + } + } + // Could not look up any text records for name res <- lookupRes{"", err} return } @@ -138,6 +163,8 @@ func workDomain(r *DNSResolver, name string, res chan lookupRes) { return } } + + // There were no TXT records with a dnslink res <- lookupRes{"", ErrResolveFailed} } From f7083da82fa24cd297134ab6499701111ed38b28 Mon Sep 17 00:00:00 2001 From: web3-bot Date: Fri, 23 Apr 2021 04:06:26 +0000 Subject: [PATCH 2974/3147] run gofmt -s This commit was moved from ipfs/go-path@32d3a4f5fe76ab132554b62327cc657b332335e4 --- path/path_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/path/path_test.go b/path/path_test.go index 4552fc5f93..42cacddf17 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -76,12 +76,12 @@ func TestIsJustAKey(t *testing.T) { func TestPopLastSegment(t *testing.T) { cases := map[string][]string{ - "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", ""}, - "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", ""}, - "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", "a"}, - "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": []string{"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a", "b"}, - "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y/z": []string{"/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y", "z"}, - "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y/z": []string{"/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y", "z"}, + "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": {"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", ""}, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": {"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", ""}, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a": {"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n", "a"}, + "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a/b": {"/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/a", "b"}, + "/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y/z": {"/ipns/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y", "z"}, + "/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y/z": {"/ipld/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n/x/y", "z"}, } for p, expected := range cases { From 4f151169e67a07d3574dbe0e7bd185a2a170733b Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 12 Apr 2021 12:11:39 +0300 Subject: [PATCH 2975/3147] make DNS resolver pluggable, use new madns.BasicResolver interface This commit was moved from ipfs/go-namesys@a718e16e7538e9a132152dd88084bbe979108983 --- namesys/dns.go | 15 ++++++++------- namesys/dns_test.go | 3 ++- namesys/namesys.go | 5 +++-- namesys/namesys_test.go | 5 +++-- namesys/republisher/repub_test.go | 6 ++++-- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 74fc1093e9..511b373b06 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -11,13 +11,14 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" isd "github.com/jbenet/go-is-domain" + madns "github.com/multiformats/go-multiaddr-dns" ) const ethTLD = "eth" const linkTLD = "domains" // LookupTXTFunc is a generic type for a function that lookups TXT record values. -type LookupTXTFunc func(name string) (txt []string, err error) +type LookupTXTFunc func(ctx context.Context, name string) (txt []string, err error) // DNSResolver implements a Resolver on DNS domains type DNSResolver struct { @@ -27,8 +28,8 @@ type DNSResolver struct { } // NewDNSResolver constructs a name resolver using DNS TXT records. -func NewDNSResolver() *DNSResolver { - return &DNSResolver{lookupTXT: net.LookupTXT} +func NewDNSResolver(rslv madns.BasicResolver) *DNSResolver { + return &DNSResolver{lookupTXT: rslv.LookupTXT} } // Resolve implements Resolver. @@ -75,10 +76,10 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options } rootChan := make(chan lookupRes, 1) - go workDomain(r, fqdn, rootChan) + go workDomain(ctx, r, fqdn, rootChan) subChan := make(chan lookupRes, 1) - go workDomain(r, "_dnslink."+fqdn, subChan) + go workDomain(ctx, r, "_dnslink."+fqdn, subChan) appendPath := func(p path.Path) (path.Path, error) { if len(segments) > 1 { @@ -139,10 +140,10 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options return out } -func workDomain(r *DNSResolver, name string, res chan lookupRes) { +func workDomain(ctx context.Context, r *DNSResolver, name string, res chan lookupRes) { defer close(res) - txt, err := r.lookupTXT(name) + txt, err := r.lookupTXT(ctx, name) if err != nil { if dnsErr, ok := err.(*net.DNSError); ok { // If no TXT records found, return same error as when no text diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 877b814642..66f10e7630 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -1,6 +1,7 @@ package namesys import ( + "context" "fmt" "testing" @@ -11,7 +12,7 @@ type mockDNS struct { entries map[string][]string } -func (m *mockDNS) lookupTXT(name string) (txt []string, err error) { +func (m *mockDNS) lookupTXT(ctx context.Context, name string) (txt []string, err error) { txt, ok := m.entries[name] if !ok { return nil, fmt.Errorf("no TXT entry for %s", name) diff --git a/namesys/namesys.go b/namesys/namesys.go index ae77771d7a..b1649f6849 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -29,6 +29,7 @@ import ( ci "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" routing "github.com/libp2p/go-libp2p-core/routing" + madns "github.com/multiformats/go-multiaddr-dns" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. @@ -49,7 +50,7 @@ type mpns struct { } // NewNameSystem will construct the IPFS naming system based on Routing -func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSystem { +func NewNameSystem(r routing.ValueStore, ds ds.Datastore, rslv madns.BasicResolver, cachesize int) NameSystem { var ( cache *lru.Cache staticMap map[string]path.Path @@ -73,7 +74,7 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSys } return &mpns{ - dnsResolver: NewDNSResolver(), + dnsResolver: NewDNSResolver(rslv), proquintResolver: new(ProquintResolver), ipnsResolver: NewIpnsResolver(r), ipnsPublisher: NewIpnsPublisher(r, ds), diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 30674106b4..02068be320 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -17,6 +17,7 @@ import ( peer "github.com/libp2p/go-libp2p-core/peer" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" + madns "github.com/multiformats/go-multiaddr-dns" ) type mockResolver struct { @@ -109,7 +110,7 @@ func TestPublishWithCache0(t *testing.T) { "pk": record.PublicKeyValidator{}, }) - nsys := NewNameSystem(routing, dst, 0) + nsys := NewNameSystem(routing, dst, madns.DefaultResolver, 0) // CID is arbitrary. p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") if err != nil { @@ -142,7 +143,7 @@ func TestPublishWithTTL(t *testing.T) { "pk": record.PublicKeyValidator{}, }) - nsys := NewNameSystem(routing, dst, 128) + nsys := NewNameSystem(routing, dst, madns.DefaultResolver, 128) // CID is arbitrary. p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") if err != nil { diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 0d1635aadb..985c7169f1 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -22,6 +22,8 @@ import ( ipns_pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" + madns "github.com/multiformats/go-multiaddr-dns" + keystore "github.com/ipfs/go-ipfs-keystore" namesys "github.com/ipfs/go-namesys" . "github.com/ipfs/go-namesys/republisher" @@ -74,7 +76,7 @@ func TestRepublish(t *testing.T) { var nodes []*mockNode for i := 0; i < 10; i++ { n := getMockNode(t, ctx) - ns := namesys.NewNameSystem(n.dht, n.store, 0) + ns := namesys.NewNameSystem(n.dht, n.store, madns.DefaultResolver, 0) nsystems = append(nsystems, ns) nodes = append(nodes, n) @@ -153,7 +155,7 @@ func TestLongEOLRepublish(t *testing.T) { var nodes []*mockNode for i := 0; i < 10; i++ { n := getMockNode(t, ctx) - ns := namesys.NewNameSystem(n.dht, n.store, 0) + ns := namesys.NewNameSystem(n.dht, n.store, madns.DefaultResolver, 0) nsystems = append(nsystems, ns) nodes = append(nodes, n) From cdae7adaa5792117c626aa8bdaa1b7fc4bdb13ba Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 12 Apr 2021 13:28:32 +0300 Subject: [PATCH 2976/3147] parameterize DNSResolver on the lookup TXT function This commit was moved from ipfs/go-namesys@1077b5af95a778de07171d59075b593a1af7f71f --- namesys/dns.go | 5 ++--- namesys/namesys.go | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 511b373b06..9b7f45bf8d 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -11,7 +11,6 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" isd "github.com/jbenet/go-is-domain" - madns "github.com/multiformats/go-multiaddr-dns" ) const ethTLD = "eth" @@ -28,8 +27,8 @@ type DNSResolver struct { } // NewDNSResolver constructs a name resolver using DNS TXT records. -func NewDNSResolver(rslv madns.BasicResolver) *DNSResolver { - return &DNSResolver{lookupTXT: rslv.LookupTXT} +func NewDNSResolver(lookup LookupTXTFunc) *DNSResolver { + return &DNSResolver{lookupTXT: lookup} } // Resolve implements Resolver. diff --git a/namesys/namesys.go b/namesys/namesys.go index b1649f6849..a5f9304674 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -74,7 +74,7 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, rslv madns.BasicResolv } return &mpns{ - dnsResolver: NewDNSResolver(rslv), + dnsResolver: NewDNSResolver(rslv.LookupTXT), proquintResolver: new(ProquintResolver), ipnsResolver: NewIpnsResolver(r), ipnsPublisher: NewIpnsPublisher(r, ds), From 594c293e56fba08a8e375d9a238cbca02c771835 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 16 Apr 2021 00:28:32 +0300 Subject: [PATCH 2977/3147] introduce functional options for NewNamesys constructor This commit was moved from ipfs/go-namesys@ea4eec1d06a8962f58c00eb0e4704a4256276936 --- namesys/namesys.go | 79 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 15 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index a5f9304674..85075d2287 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -23,6 +23,7 @@ import ( lru "github.com/hashicorp/golang-lru" cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" isd "github.com/jbenet/go-is-domain" @@ -42,6 +43,8 @@ import ( // It can only publish to: (a) IPFS routing naming. // type mpns struct { + ds ds.Datastore + dnsResolver, proquintResolver, ipnsResolver resolver ipnsPublisher Publisher @@ -49,15 +52,45 @@ type mpns struct { cache *lru.Cache } -// NewNameSystem will construct the IPFS naming system based on Routing -func NewNameSystem(r routing.ValueStore, ds ds.Datastore, rslv madns.BasicResolver, cachesize int) NameSystem { - var ( - cache *lru.Cache - staticMap map[string]path.Path - ) - if cachesize > 0 { - cache, _ = lru.New(cachesize) +type Option func(*mpns) error + +// WithCache is an option that instructs the name system to use a (LRU) cache of the given size. +func WithCache(size int) Option { + return func(ns *mpns) error { + if size <= 0 { + return fmt.Errorf("invalid cache size %d; must be > 0", size) + } + + cache, err := lru.New(size) + if err != nil { + return err + } + + ns.cache = cache + return nil } +} + +// WithDNSResolver is an option that supplies a custom DNS resolver to use instead of the system +// default. +func WithDNSResolver(rslv madns.BasicResolver) Option { + return func(ns *mpns) error { + ns.dnsResolver = NewDNSResolver(rslv.LookupTXT) + return nil + } +} + +// WithDatastore is an option that supplies a datastore to use instead of an in-memory map datastore. +func WithDatastore(ds ds.Datastore) Option { + return func(ns *mpns) error { + ns.ds = ds + return nil + } +} + +// NewNameSystem will construct the IPFS naming system based on Routing +func NewNameSystem(r routing.ValueStore, opts ...Option) (NameSystem, error) { + var staticMap map[string]path.Path // Prewarm namesys cache with static records for deterministic tests and debugging. // Useful for testing things like DNSLink without real DNS lookup. @@ -73,14 +106,30 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, rslv madns.BasicResolv } } - return &mpns{ - dnsResolver: NewDNSResolver(rslv.LookupTXT), - proquintResolver: new(ProquintResolver), - ipnsResolver: NewIpnsResolver(r), - ipnsPublisher: NewIpnsPublisher(r, ds), - staticMap: staticMap, - cache: cache, + ns := &mpns{ + staticMap: staticMap, + } + + for _, opt := range opts { + err := opt(ns) + if err != nil { + return nil, err + } + } + + if ns.ds == nil { + ns.ds = dssync.MutexWrap(ds.NewMapDatastore()) + } + + if ns.dnsResolver == nil { + ns.dnsResolver = NewDNSResolver(madns.DefaultResolver.LookupTXT) } + + ns.proquintResolver = new(ProquintResolver) + ns.ipnsResolver = NewIpnsResolver(r) + ns.ipnsPublisher = NewIpnsPublisher(r, ns.ds) + + return ns, nil } // DefaultResolverCacheTTL defines max ttl of a record placed in namesys cache. From a30368da785e805a07459c481e1016ca922050ae Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 16 Apr 2021 00:28:41 +0300 Subject: [PATCH 2978/3147] fix tests This commit was moved from ipfs/go-namesys@a360c661079483df7356fdeee04d0128b52da0fa --- namesys/namesys_test.go | 13 ++++++++++--- namesys/republisher/repub_test.go | 12 ++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 02068be320..6ae94a6cf1 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -17,7 +17,6 @@ import ( peer "github.com/libp2p/go-libp2p-core/peer" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" - madns "github.com/multiformats/go-multiaddr-dns" ) type mockResolver struct { @@ -110,7 +109,11 @@ func TestPublishWithCache0(t *testing.T) { "pk": record.PublicKeyValidator{}, }) - nsys := NewNameSystem(routing, dst, madns.DefaultResolver, 0) + nsys, err := NewNameSystem(routing, WithDatastore(dst)) + if err != nil { + t.Fatal(err) + } + // CID is arbitrary. p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") if err != nil { @@ -143,7 +146,11 @@ func TestPublishWithTTL(t *testing.T) { "pk": record.PublicKeyValidator{}, }) - nsys := NewNameSystem(routing, dst, madns.DefaultResolver, 128) + nsys, err := NewNameSystem(routing, WithDatastore(dst), WithCache(128)) + if err != nil { + t.Fatal(err) + } + // CID is arbitrary. p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn") if err != nil { diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 985c7169f1..3775b188a6 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -22,8 +22,6 @@ import ( ipns_pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" - madns "github.com/multiformats/go-multiaddr-dns" - keystore "github.com/ipfs/go-ipfs-keystore" namesys "github.com/ipfs/go-namesys" . "github.com/ipfs/go-namesys/republisher" @@ -76,7 +74,10 @@ func TestRepublish(t *testing.T) { var nodes []*mockNode for i := 0; i < 10; i++ { n := getMockNode(t, ctx) - ns := namesys.NewNameSystem(n.dht, n.store, madns.DefaultResolver, 0) + ns, err := namesys.NewNameSystem(n.dht, namesys.WithDatastore(n.store)) + if err != nil { + t.Fatal(err) + } nsystems = append(nsystems, ns) nodes = append(nodes, n) @@ -155,7 +156,10 @@ func TestLongEOLRepublish(t *testing.T) { var nodes []*mockNode for i := 0; i < 10; i++ { n := getMockNode(t, ctx) - ns := namesys.NewNameSystem(n.dht, n.store, madns.DefaultResolver, 0) + ns, err := namesys.NewNameSystem(n.dht, namesys.WithDatastore(n.store)) + if err != nil { + t.Fatal(err) + } nsystems = append(nsystems, ns) nodes = append(nodes, n) From 69a6288b81ac0ef5c9d487615abb2af748451976 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 16 Apr 2021 00:52:49 +0300 Subject: [PATCH 2979/3147] remove special casing of .eth domains This commit was moved from ipfs/go-namesys@c91aa69e9d10af88be194de773ee8cef334ac062 --- namesys/dns.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 9b7f45bf8d..96b9a6b25d 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -13,9 +13,6 @@ import ( isd "github.com/jbenet/go-is-domain" ) -const ethTLD = "eth" -const linkTLD = "domains" - // LookupTXTFunc is a generic type for a function that lookups TXT record values. type LookupTXTFunc func(ctx context.Context, name string) (txt []string, err error) @@ -68,12 +65,6 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options fqdn = domain + "." } - if strings.HasSuffix(fqdn, "."+ethTLD+".") { - // This is an ENS name. As we're resolving via an arbitrary DNS server - // that may not know about .eth we need to add our link domain suffix. - fqdn += linkTLD + "." - } - rootChan := make(chan lookupRes, 1) go workDomain(ctx, r, fqdn, rootChan) From 246dfc7f244e1bee489db846f165240861e01f09 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 16 Apr 2021 00:52:55 +0300 Subject: [PATCH 2980/3147] fix test This commit was moved from ipfs/go-namesys@16c89a5712d67ad02a811f58319f7db50c02a801 --- namesys/dns_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 66f10e7630..1cb75b62d1 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -127,7 +127,7 @@ func newMockDNS() *mockDNS { "fqdn.example.com.": { "dnslink=/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", }, - "www.wealdtech.eth.domains.": { + "www.wealdtech.eth.": { "dnslink=/ipns/ipfs.example.com", }, }, @@ -169,5 +169,5 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "fqdn.example.com.", opts.DefaultDepthLimit, "/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", nil) testResolution(t, r, "www.wealdtech.eth", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) testResolution(t, r, "www.wealdtech.eth", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) - testResolution(t, r, "www.wealdtech.eth.domains", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) + testResolution(t, r, "www.wealdtech.eth", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) } From a5c21d5c133f73400c412dbb6c08fb8f039ec291 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Wed, 21 Apr 2021 19:42:03 +0200 Subject: [PATCH 2981/3147] feat: support non-ICANN DNSLink names https://github.com/ipfs/go-ipfs/issues/8060 This commit was moved from ipfs/go-namesys@1f2af4e5527ae625c797bad31f2528c4df44d092 --- namesys/dns.go | 4 ++-- namesys/namesys.go | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/namesys/dns.go b/namesys/dns.go index 96b9a6b25d..43768804fe 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -10,7 +10,7 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - isd "github.com/jbenet/go-is-domain" + dns "github.com/miekg/dns" ) // LookupTXTFunc is a generic type for a function that lookups TXT record values. @@ -52,7 +52,7 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options segments := strings.SplitN(name, "/", 2) domain := segments[0] - if !isd.IsDomain(domain) { + if _, ok := dns.IsDomainName(domain); !ok { out <- onceResult{err: fmt.Errorf("not a valid domain name: %s", domain)} close(out) return out diff --git a/namesys/namesys.go b/namesys/namesys.go index 85075d2287..b28c13309b 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -7,8 +7,8 @@ // DHT). // // Additionally, the /ipns/ namespace can also be used with domain names that -// use DNSLink (/ipns/my.domain.example, see https://dnslink.io) and proquint -// strings. +// use DNSLink (/ipns/, https://docs.ipfs.io/concepts/dnslink/) +// and proquint strings. // // The package provides implementations for all three resolvers. package namesys @@ -26,10 +26,10 @@ import ( dssync "github.com/ipfs/go-datastore/sync" path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - isd "github.com/jbenet/go-is-domain" ci "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" routing "github.com/libp2p/go-libp2p-core/routing" + dns "github.com/miekg/dns" madns "github.com/multiformats/go-multiaddr-dns" ) @@ -225,9 +225,13 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. if err == nil { res = ns.ipnsResolver - } else if isd.IsDomain(key) { + } else if _, ok := dns.IsDomainName(key); ok { res = ns.dnsResolver } else { + // TODO: remove proquint? + // dns.IsDomainName(key) will return true for proquint strings, + // so this block is a dead code. + // (alternative is to move this before DNS check) res = ns.proquintResolver } From 6f288d9cbd6e1834526f85461db979977ad00759 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Wed, 21 Apr 2021 21:13:51 +0200 Subject: [PATCH 2982/3147] test: non-ICANN DNS names This commit was moved from ipfs/go-namesys@2ae3baed70b7704521469e83157911555765cb35 --- namesys/dns_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index 1cb75b62d1..cde077e471 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -127,6 +127,15 @@ func newMockDNS() *mockDNS { "fqdn.example.com.": { "dnslink=/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", }, + "en.wikipedia-on-ipfs.org.": { + "dnslink=/ipfs/bafybeiaysi4s6lnjev27ln5icwm6tueaw2vdykrtjkwiphwekaywqhcjze", + }, + "custom.non-icann.tldextravaganza.": { + "dnslink=/ipfs/bafybeieto6mcuvqlechv4iadoqvnffondeiwxc2bcfcewhvpsd2odvbmvm", + }, + "singlednslabelshouldbeok.": { + "dnslink=/ipfs/bafybeih4a6ylafdki6ailjrdvmr7o4fbbeceeeuty4v3qyyouiz5koqlpi", + }, "www.wealdtech.eth.": { "dnslink=/ipns/ipfs.example.com", }, @@ -167,6 +176,9 @@ func TestDNSResolution(t *testing.T) { testResolution(t, r, "double.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "conflict.example.com", opts.DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjE", nil) testResolution(t, r, "fqdn.example.com.", opts.DefaultDepthLimit, "/ipfs/QmYvMB9yrsSf7RKBghkfwmHJkzJhW2ZgVwq3LxBXXPasFr", nil) + testResolution(t, r, "en.wikipedia-on-ipfs.org", 2, "/ipfs/bafybeiaysi4s6lnjev27ln5icwm6tueaw2vdykrtjkwiphwekaywqhcjze", nil) + testResolution(t, r, "custom.non-icann.tldextravaganza.", 2, "/ipfs/bafybeieto6mcuvqlechv4iadoqvnffondeiwxc2bcfcewhvpsd2odvbmvm", nil) + testResolution(t, r, "singlednslabelshouldbeok", 2, "/ipfs/bafybeih4a6ylafdki6ailjrdvmr7o4fbbeceeeuty4v3qyyouiz5koqlpi", nil) testResolution(t, r, "www.wealdtech.eth", 1, "/ipns/ipfs.example.com", ErrResolveRecursion) testResolution(t, r, "www.wealdtech.eth", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) testResolution(t, r, "www.wealdtech.eth", 2, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", nil) From b5662a5cb42965efdf7181db027c2876773b6cd5 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Wed, 21 Apr 2021 22:30:32 +0200 Subject: [PATCH 2983/3147] refactor: remove proquint.go See discussion in: https://github.com/ipfs/go-namesys/pull/13#pullrequestreview-641398404 This commit was moved from ipfs/go-namesys@aa54bc9e2df08848ace68fcb1914eb850ee4fb8a --- namesys/README.md | 4 ++-- namesys/namesys.go | 16 +++++----------- namesys/proquint.go | 34 ---------------------------------- 3 files changed, 7 insertions(+), 47 deletions(-) delete mode 100644 namesys/proquint.go diff --git a/namesys/README.md b/namesys/README.md index 5c17728da8..78060ca032 100644 --- a/namesys/README.md +++ b/namesys/README.md @@ -10,9 +10,9 @@ Package namesys defines `Resolver` and `Publisher` interfaces for IPNS paths, that is, paths in the form of `/ipns/`. A "resolved" IPNS path becomes an `/ipfs/` path. -Traditionally, these paths would be in the form of `/ipns/peer_id`, which references an IPNS record in a distributed `ValueStore` (usually the IPFS DHT). +Traditionally, these paths would be in the form of `/ipns/{libp2p-key}`, which references an IPNS record in a distributed `ValueStore` (usually the IPFS DHT). -Additionally, the /ipns/ namespace can also be used with domain names that use DNSLink (/ipns/my.domain.example, see https://dnslink.io) and proquint strings. +Additionally, the `/ipns/` namespace can also be used with domain names that use DNSLink (`/ipns/en.wikipedia-on-ipfs.org`, see https://docs.ipfs.io/concepts/dnslink/). The package provides implementations for all three resolvers. diff --git a/namesys/namesys.go b/namesys/namesys.go index b28c13309b..f1c1d22c25 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -8,7 +8,6 @@ // // Additionally, the /ipns/ namespace can also be used with domain names that // use DNSLink (/ipns/, https://docs.ipfs.io/concepts/dnslink/) -// and proquint strings. // // The package provides implementations for all three resolvers. package namesys @@ -38,15 +37,14 @@ import ( // Uses several Resolvers: // (a) IPFS routing naming: SFS-like PKI names. // (b) dns domains: resolves using links in DNS TXT records -// (c) proquints: interprets string as the raw byte data. // // It can only publish to: (a) IPFS routing naming. // type mpns struct { ds ds.Datastore - dnsResolver, proquintResolver, ipnsResolver resolver - ipnsPublisher Publisher + dnsResolver, ipnsResolver resolver + ipnsPublisher Publisher staticMap map[string]path.Path cache *lru.Cache @@ -125,7 +123,6 @@ func NewNameSystem(r routing.ValueStore, opts ...Option) (NameSystem, error) { ns.dnsResolver = NewDNSResolver(madns.DefaultResolver.LookupTXT) } - ns.proquintResolver = new(ProquintResolver) ns.ipnsResolver = NewIpnsResolver(r) ns.ipnsPublisher = NewIpnsPublisher(r, ns.ds) @@ -188,7 +185,6 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. // Resolver selection: // 1. if it is a PeerID/CID/multihash resolve through "ipns". // 2. if it is a domain name, resolve through "dns" - // 3. otherwise resolve through the "proquint" resolver var res resolver ipnsKey, err := peer.Decode(key) @@ -228,11 +224,9 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. } else if _, ok := dns.IsDomainName(key); ok { res = ns.dnsResolver } else { - // TODO: remove proquint? - // dns.IsDomainName(key) will return true for proquint strings, - // so this block is a dead code. - // (alternative is to move this before DNS check) - res = ns.proquintResolver + out <- onceResult{err: fmt.Errorf("invalid IPNS root: %q", key)} + close(out) + return out } resCh := res.resolveOnceAsync(ctx, key, options) diff --git a/namesys/proquint.go b/namesys/proquint.go deleted file mode 100644 index b918ec986c..0000000000 --- a/namesys/proquint.go +++ /dev/null @@ -1,34 +0,0 @@ -package namesys - -import ( - "context" - "errors" - - proquint "github.com/bren2010/proquint" - path "github.com/ipfs/go-path" - opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" -) - -// ProquintResolver implements the Resolver interface for proquint identifiers -// (see http://arxiv.org/html/0901.4016). -type ProquintResolver struct{} - -// Resolve implements Resolver. -func (r *ProquintResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { - return resolve(ctx, r, name, opts.ProcessOpts(options)) -} - -// resolveOnce implements resolver. Decodes the proquint string. -func (r *ProquintResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { - out := make(chan onceResult, 1) - defer close(out) - - ok, err := proquint.IsProquint(name) - if err != nil || !ok { - out <- onceResult{err: errors.New("not a valid proquint string")} - return out - } - // Return a 0 TTL as caching this result is pointless. - out <- onceResult{value: path.FromString(string(proquint.Decode(name)))} - return out -} From b1a0055a331cf77cf65adc8c3432aafa658fb81b Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 22 Apr 2021 15:28:18 -0700 Subject: [PATCH 2984/3147] doc: document WithDatastore option Co-authored-by: Adin Schmahmann This commit was moved from ipfs/go-namesys@415b3531024d4505e2e8ade7314568ce5e085d47 --- namesys/namesys.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index f1c1d22c25..537f0d1b0f 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -78,7 +78,7 @@ func WithDNSResolver(rslv madns.BasicResolver) Option { } } -// WithDatastore is an option that supplies a datastore to use instead of an in-memory map datastore. +// WithDatastore is an option that supplies a datastore to use instead of an in-memory map datastore. The datastore is used to store published IPNS records and make them available for querying. func WithDatastore(ds ds.Datastore) Option { return func(ns *mpns) error { ns.ds = ds From be784924bbd7cd1492c03b79b82d0e851dc9a248 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 23 Apr 2021 20:26:04 +0300 Subject: [PATCH 2985/3147] comment cosmetics This commit was moved from ipfs/go-namesys@df97fc2540cfbe4f21a76695885784a7fcee6eaf --- namesys/dns.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index 43768804fe..1398356171 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -13,7 +13,7 @@ import ( dns "github.com/miekg/dns" ) -// LookupTXTFunc is a generic type for a function that lookups TXT record values. +// LookupTXTFunc is a function that lookups TXT record values. type LookupTXTFunc func(ctx context.Context, name string) (txt []string, err error) // DNSResolver implements a Resolver on DNS domains From 09f0a056535a4e78c0b99e387b60146510ec3881 Mon Sep 17 00:00:00 2001 From: frrist Date: Mon, 3 May 2021 11:51:03 -0700 Subject: [PATCH 2986/3147] fix(arc): striped locking on last byte of CID - fixes #64 This commit was moved from ipfs/go-ipfs-blockstore@8d1f7bfec762ad72f6e34ab4966dfac0c7cf36c8 --- blockstore/arc_cache.go | 70 ++++++++++++++++++++++++++++++++++-- blockstore/arc_cache_test.go | 38 ++++++++++++++------ 2 files changed, 95 insertions(+), 13 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 1e497abf97..7f859f3427 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -2,6 +2,7 @@ package blockstore import ( "context" + "sync" lru "github.com/hashicorp/golang-lru" blocks "github.com/ipfs/go-block-format" @@ -17,7 +18,9 @@ type cacheSize int // size. This provides block access-time improvements, allowing // to short-cut many searches without querying the underlying datastore. type arccache struct { - cache *lru.TwoQueueCache + cache *lru.TwoQueueCache + lks [256]sync.RWMutex + blockstore Blockstore viewer Viewer @@ -42,11 +45,27 @@ func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, return c, nil } +func (b *arccache) getLock(k cid.Cid) *sync.RWMutex { + return &b.lks[mutexKey(k)] +} + +func mutexKey(k cid.Cid) uint8 { + return k.KeyString()[len(k.KeyString())-1] +} + func (b *arccache) DeleteBlock(k cid.Cid) error { + if !k.Defined() { + return nil + } + if has, _, ok := b.queryCache(k); ok && !has { return nil } + lk := b.getLock(k) + lk.Lock() + defer lk.Unlock() + b.cache.Remove(k) // Invalidate cache before deleting. err := b.blockstore.DeleteBlock(k) if err == nil { @@ -56,9 +75,18 @@ func (b *arccache) DeleteBlock(k cid.Cid) error { } func (b *arccache) Has(k cid.Cid) (bool, error) { + if !k.Defined() { + return false, nil + } + if has, _, ok := b.queryCache(k); ok { return has, nil } + + lk := b.getLock(k) + lk.RLock() + defer lk.RUnlock() + has, err := b.blockstore.Has(k) if err != nil { return false, err @@ -68,6 +96,10 @@ func (b *arccache) Has(k cid.Cid) (bool, error) { } func (b *arccache) GetSize(k cid.Cid) (int, error) { + if !k.Defined() { + return -1, ErrNotFound + } + if has, blockSize, ok := b.queryCache(k); ok { if !has { // don't have it, return @@ -79,6 +111,11 @@ func (b *arccache) GetSize(k cid.Cid) (int, error) { } // we have it but don't know the size, ask the datastore. } + + lk := b.getLock(k) + lk.RLock() + defer lk.RUnlock() + blockSize, err := b.blockstore.GetSize(k) if err == ErrNotFound { b.cacheHave(k, false) @@ -100,7 +137,6 @@ func (b *arccache) View(k cid.Cid, callback func([]byte) error) error { } if !k.Defined() { - log.Error("undefined cid in arc cache") return ErrNotFound } @@ -110,12 +146,15 @@ func (b *arccache) View(k cid.Cid, callback func([]byte) error) error { return ErrNotFound } + lk := b.getLock(k) + lk.RLock() + defer lk.RUnlock() + return b.viewer.View(k, callback) } func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { if !k.Defined() { - log.Error("undefined cid in arc cache") return nil, ErrNotFound } @@ -123,6 +162,10 @@ func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { return nil, ErrNotFound } + lk := b.getLock(k) + lk.RLock() + defer lk.RUnlock() + bl, err := b.blockstore.Get(k) if bl == nil && err == ErrNotFound { b.cacheHave(k, false) @@ -137,6 +180,10 @@ func (b *arccache) Put(bl blocks.Block) error { return nil } + lk := b.getLock(bl.Cid()) + lk.Lock() + defer lk.Unlock() + err := b.blockstore.Put(bl) if err == nil { b.cacheSize(bl.Cid(), len(bl.RawData())) @@ -145,14 +192,31 @@ func (b *arccache) Put(bl blocks.Block) error { } func (b *arccache) PutMany(bs []blocks.Block) error { + mxs := [256]*sync.RWMutex{} var good []blocks.Block for _, block := range bs { // call put on block if result is inconclusive or we are sure that // the block isn't in storage if has, _, ok := b.queryCache(block.Cid()); !ok || (ok && !has) { good = append(good, block) + mxs[mutexKey(block.Cid())] = &b.lks[mutexKey(block.Cid())] + } + } + + for _, mx := range mxs { + if mx != nil { + mx.Lock() } } + + defer func() { + for _, mx := range mxs { + if mx != nil { + mx.Unlock() + } + } + }() + err := b.blockstore.PutMany(good) if err != nil { return err diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index dcd9c6e309..a15ff2d3ab 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -246,16 +246,34 @@ func TestDifferentKeyObjectsWork(t *testing.T) { } func TestPutManyCaches(t *testing.T) { - arc, _, cd := createStores(t) - arc.PutMany([]blocks.Block{exampleBlock}) + t.Run("happy path PutMany", func(t *testing.T) { + arc, _, cd := createStores(t) + arc.PutMany([]blocks.Block{exampleBlock}) + + trap("has hit datastore", cd, t) + arc.Has(exampleBlock.Cid()) + arc.GetSize(exampleBlock.Cid()) + untrap(cd) + arc.DeleteBlock(exampleBlock.Cid()) + + arc.Put(exampleBlock) + trap("PunMany has hit datastore", cd, t) + arc.PutMany([]blocks.Block{exampleBlock}) + }) - trap("has hit datastore", cd, t) - arc.Has(exampleBlock.Cid()) - arc.GetSize(exampleBlock.Cid()) - untrap(cd) - arc.DeleteBlock(exampleBlock.Cid()) + t.Run("PutMany with duplicates", func(t *testing.T) { + arc, _, cd := createStores(t) + arc.PutMany([]blocks.Block{exampleBlock, exampleBlock}) + + trap("has hit datastore", cd, t) + arc.Has(exampleBlock.Cid()) + arc.GetSize(exampleBlock.Cid()) + untrap(cd) + arc.DeleteBlock(exampleBlock.Cid()) + + arc.Put(exampleBlock) + trap("PunMany has hit datastore", cd, t) + arc.PutMany([]blocks.Block{exampleBlock}) + }) - arc.Put(exampleBlock) - trap("PunMany has hit datastore", cd, t) - arc.PutMany([]blocks.Block{exampleBlock}) } From 401c064bce856dc0bcc93eda338972f4ff705104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 28 Apr 2021 13:51:41 +0100 Subject: [PATCH 2987/3147] WIP: add BenchmarkARCCacheConcurrentOps This commit was moved from ipfs/go-ipfs-blockstore@b3408fff0fa09a9491280404e50821c294bc84c2 --- blockstore/arc_cache_test.go | 121 ++++++++++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 1 deletion(-) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index a15ff2d3ab..64f45df6ca 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -2,7 +2,11 @@ package blockstore import ( "context" + "io" + "math/rand" + "sync/atomic" "testing" + "time" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" @@ -26,7 +30,7 @@ func testArcCached(ctx context.Context, bs Blockstore) (*arccache, error) { return nil, err } -func createStores(t *testing.T) (*arccache, Blockstore, *callbackDatastore) { +func createStores(t testing.TB) (*arccache, Blockstore, *callbackDatastore) { cd := &callbackDatastore{f: func() {}, ds: ds.NewMapDatastore()} bs := NewBlockstore(syncds.MutexWrap(cd)) arc, err := testArcCached(context.TODO(), bs) @@ -275,5 +279,120 @@ func TestPutManyCaches(t *testing.T) { trap("PunMany has hit datastore", cd, t) arc.PutMany([]blocks.Block{exampleBlock}) }) +} + +func BenchmarkARCCacheConcurrentOps(b *testing.B) { + // ~4k blocks seems high enough to be realistic, + // but low enough to cause collisions. + // Keep it as a power of 2, to simplify code below. + const numBlocks = 4 << 10 + + dummyBlocks := make([]blocks.Block, numBlocks) + + { + // scope dummyRand to prevent its unsafe concurrent use below + dummyRand := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := range dummyBlocks { + dummy := make([]byte, 32) + if _, err := io.ReadFull(dummyRand, dummy); err != nil { + b.Fatal(err) + } + dummyBlocks[i] = blocks.NewBlock(dummy) + } + } + + // Each test begins with half the blocks present in the cache. + // This allows test cases to have both hits and misses, + // regardless of whether or not they do Puts. + putHalfBlocks := func(arc *arccache) { + for i, block := range dummyBlocks { + if i%2 == 0 { + if err := arc.Put(block); err != nil { + b.Fatal(err) + } + } + } + } + + // We always mix just two operations at a time. + const numOps = 2 + var testOps = []struct { + name string + ops [numOps]func(*arccache, blocks.Block) + }{ + {"PutDelete", [...]func(*arccache, blocks.Block){ + func(arc *arccache, block blocks.Block) { + arc.Put(block) + }, + func(arc *arccache, block blocks.Block) { + arc.DeleteBlock(block.Cid()) + }, + }}, + {"GetDelete", [...]func(*arccache, blocks.Block){ + func(arc *arccache, block blocks.Block) { + arc.Get(block.Cid()) + }, + func(arc *arccache, block blocks.Block) { + arc.DeleteBlock(block.Cid()) + }, + }}, + {"GetPut", [...]func(*arccache, blocks.Block){ + func(arc *arccache, block blocks.Block) { + arc.Get(block.Cid()) + }, + func(arc *arccache, block blocks.Block) { + arc.Put(block) + }, + }}, + } + for _, test := range testOps { + test := test // prevent reuse of the range var + b.Run(test.name, func(b *testing.B) { + arc, _, _ := createStores(b) + putHalfBlocks(arc) + var opCounts [numOps]uint64 + + b.ResetTimer() + b.ReportAllocs() + + b.RunParallel(func(pb *testing.PB) { + rnd := rand.New(rand.NewSource(time.Now().UnixNano())) + for pb.Next() { + n := rnd.Int63() + blockIdx := n % numBlocks // lower bits decide the block + opIdx := (n / numBlocks) % numOps // higher bits decide what operation + + block := dummyBlocks[blockIdx] + op := test.ops[opIdx] + op(arc, block) + + atomic.AddUint64(&opCounts[opIdx], 1) + } + }) + + // We expect each op to fire roughly an equal amount of times. + // Error otherwise, as that likely means the logic is wrong. + var minIdx, maxIdx int + var minCount, maxCount uint64 + for opIdx, count := range opCounts { + if minCount == 0 || count < minCount { + minIdx = opIdx + minCount = count + } + if maxCount == 0 || count > maxCount { + maxIdx = opIdx + maxCount = count + } + } + // Skip this check if we ran few times, to avoid false positives. + if maxCount > 100 { + ratio := float64(maxCount) / float64(minCount) + if maxRatio := 2.0; ratio > maxRatio { + b.Fatalf("op %d ran %fx as many times as %d", maxIdx, ratio, minIdx) + } + } + + }) + } } From 4e36c997a8a820d2d153104296d0b2ed96ad316e Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 5 May 2021 20:35:43 -0300 Subject: [PATCH 2988/3147] feat: add UpgradeableDirectory This commit was moved from ipfs/go-unixfs@8c3d5ec04263f16e58962dfa0cf2e26c53fdc59b --- unixfs/io/directory.go | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index f773704a22..37d496b582 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -81,7 +81,10 @@ type HAMTDirectory struct { dserv ipld.DAGService } -// NewDirectory returns a Directory. It needs a `DAGService` to add the children. +// NewDirectory returns a Directory that can either be a HAMTDirectory if the +// UseHAMTSharding is set, or otherwise an UpgradeableDirectory containing a +// BasicDirectory that can be converted to a HAMTDirectory if the option is +// set in the future. func NewDirectory(dserv ipld.DAGService) Directory { if UseHAMTSharding { dir := new(HAMTDirectory) @@ -94,10 +97,10 @@ func NewDirectory(dserv ipld.DAGService) Directory { return dir } - dir := new(BasicDirectory) - dir.node = format.EmptyDirNode() - dir.dserv = dserv - return dir + basicDir := new(BasicDirectory) + basicDir.node = format.EmptyDirNode() + basicDir.dserv = dserv + return UpgradeableDirectory{basicDir} } // ErrNotADir implies that the given node was not a unixfs directory @@ -294,3 +297,27 @@ func (d *HAMTDirectory) GetNode() (ipld.Node, error) { func (d *HAMTDirectory) GetCidBuilder() cid.Builder { return d.shard.CidBuilder() } + +// UpgradeableDirectory wraps a Directory interface and provides extra logic +// to upgrade from its BasicDirectory implementation to HAMTDirectory. +type UpgradeableDirectory struct { + Directory +} + +var _ Directory = (*UpgradeableDirectory)(nil) + +// AddChild implements the `Directory` interface. We check when adding new entries +// if we should switch to HAMTDirectory according to global option(s). +func (d UpgradeableDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { + if UseHAMTSharding { + if basicDir, ok := d.Directory.(*BasicDirectory); ok { + hamtDir, err := basicDir.SwitchToSharding(ctx) + if err != nil { + return err + } + d.Directory = hamtDir + } + } + + return d.Directory.AddChild(ctx, name, nd) +} From caf348ae2e09cd09c099f1db5dd80541ed91cfa4 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 5 May 2021 21:01:46 -0300 Subject: [PATCH 2989/3147] add test This commit was moved from ipfs/go-unixfs@930e8c98a84d167b57b3394d2b0e6565b6d42bd2 --- unixfs/io/directory_test.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 12c4817537..09286458b3 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -98,6 +98,30 @@ func TestDuplicateAddDir(t *testing.T) { } } +func TestUpgradeableDirectory(t *testing.T) { + oldHamtOption := UseHAMTSharding + defer func() {UseHAMTSharding = oldHamtOption}() + + ds := mdtest.Mock() + UseHAMTSharding = false // Create a BasicDirectory. + dir := NewDirectory(ds) + if _, ok := dir.(UpgradeableDirectory).Directory.(*BasicDirectory); !ok { + t.Fatal("UpgradeableDirectory doesn't contain BasicDirectory") + } + + // Any new directory entry will trigger the upgrade to HAMTDirectory + UseHAMTSharding = true + + err := dir.AddChild(context.Background(), "test", ft.EmptyDirNode()) + if err != nil { + t.Fatal(err) + } + + if _, ok := dir.(UpgradeableDirectory).Directory.(*HAMTDirectory); !ok { + t.Fatal("UpgradeableDirectory wasn't upgraded to HAMTDirectory") + } +} + func TestDirBuilder(t *testing.T) { ds := mdtest.Mock() dir := NewDirectory(ds) From 2021a81bb23240623834810e0e047bc6c1ee55c9 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 5 May 2021 21:05:06 -0300 Subject: [PATCH 2990/3147] fix: add pointer receiver This commit was moved from ipfs/go-unixfs@cd9b8c9ff657f500824efbd174728803972503e6 --- unixfs/io/directory.go | 4 ++-- unixfs/io/directory_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 37d496b582..03b84b98f0 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -100,7 +100,7 @@ func NewDirectory(dserv ipld.DAGService) Directory { basicDir := new(BasicDirectory) basicDir.node = format.EmptyDirNode() basicDir.dserv = dserv - return UpgradeableDirectory{basicDir} + return &UpgradeableDirectory{basicDir} } // ErrNotADir implies that the given node was not a unixfs directory @@ -308,7 +308,7 @@ var _ Directory = (*UpgradeableDirectory)(nil) // AddChild implements the `Directory` interface. We check when adding new entries // if we should switch to HAMTDirectory according to global option(s). -func (d UpgradeableDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { +func (d *UpgradeableDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { if UseHAMTSharding { if basicDir, ok := d.Directory.(*BasicDirectory); ok { hamtDir, err := basicDir.SwitchToSharding(ctx) diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 09286458b3..f7240b0f8c 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -105,7 +105,7 @@ func TestUpgradeableDirectory(t *testing.T) { ds := mdtest.Mock() UseHAMTSharding = false // Create a BasicDirectory. dir := NewDirectory(ds) - if _, ok := dir.(UpgradeableDirectory).Directory.(*BasicDirectory); !ok { + if _, ok := dir.(*UpgradeableDirectory).Directory.(*BasicDirectory); !ok { t.Fatal("UpgradeableDirectory doesn't contain BasicDirectory") } @@ -117,7 +117,7 @@ func TestUpgradeableDirectory(t *testing.T) { t.Fatal(err) } - if _, ok := dir.(UpgradeableDirectory).Directory.(*HAMTDirectory); !ok { + if _, ok := dir.(*UpgradeableDirectory).Directory.(*HAMTDirectory); !ok { t.Fatal("UpgradeableDirectory wasn't upgraded to HAMTDirectory") } } From abf28084bfbc090a00dc679c21702a146895e2fc Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 5 May 2021 21:10:02 -0300 Subject: [PATCH 2991/3147] go fmt This commit was moved from ipfs/go-unixfs@28e86c5e803d504df2f20f740a918116d07f4f18 --- unixfs/io/directory_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index f7240b0f8c..2b6e6afa23 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -100,7 +100,7 @@ func TestDuplicateAddDir(t *testing.T) { func TestUpgradeableDirectory(t *testing.T) { oldHamtOption := UseHAMTSharding - defer func() {UseHAMTSharding = oldHamtOption}() + defer func() { UseHAMTSharding = oldHamtOption }() ds := mdtest.Mock() UseHAMTSharding = false // Create a BasicDirectory. From 5f07e6f1126428d70822bb973cbd43704a1f48dd Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Fri, 7 May 2021 17:03:37 +0100 Subject: [PATCH 2992/3147] chore: fixup tests and ensure go vet and staticcheck pass This commit was moved from ipfs/go-namesys@f16eb589a6907639ecc4dbdad7f47695243e5e31 --- namesys/dns_test.go | 1 - namesys/namesys_test.go | 2 +- namesys/publisher.go | 12 +++++++++++- namesys/publisher_test.go | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/namesys/dns_test.go b/namesys/dns_test.go index cde077e471..adab3e7d29 100644 --- a/namesys/dns_test.go +++ b/namesys/dns_test.go @@ -21,7 +21,6 @@ func (m *mockDNS) lookupTXT(ctx context.Context, name string) (txt []string, err } func TestDnsEntryParsing(t *testing.T) { - goodEntries := []string{ "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD", diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index 6ae94a6cf1..c3e5534294 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -160,7 +160,7 @@ func TestPublishWithTTL(t *testing.T) { ttl := 1 * time.Second eol := time.Now().Add(2 * time.Second) - ctx := context.WithValue(context.Background(), "ipns-publish-ttl", ttl) + ctx := ContextWithTTL(context.Background(), ttl) err = nsys.Publish(ctx, priv, p) if err != nil { t.Fatal(err) diff --git a/namesys/publisher.go b/namesys/publisher.go index 37dab0ed2e..edf57375a7 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -206,7 +206,7 @@ func (p *IpnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value // as such, i'm using the context to wire it through to avoid changing too // much code along the way. func checkCtxTTL(ctx context.Context) (time.Duration, bool) { - v := ctx.Value("ipns-publish-ttl") + v := ctx.Value(ttlContextKey) if v == nil { return 0, false } @@ -296,3 +296,13 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec func PkKeyForID(id peer.ID) string { return "/pk/" + string(id) } + +// contextKey is a private comparable type used to hold value keys in contexts +type contextKey string + +var ttlContextKey contextKey = "ipns-publish-ttl" + +// ContextWithTTL returns a copy of the parent context with an added value representing the TTL +func ContextWithTTL(ctx context.Context, ttl time.Duration) context.Context { + return context.WithValue(context.Background(), ttlContextKey, ttl) +} diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 6251033835..afc9efcc2c 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -3,10 +3,11 @@ package namesys import ( "context" "crypto/rand" - "github.com/ipfs/go-path" "testing" "time" + "github.com/ipfs/go-path" + ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" dshelp "github.com/ipfs/go-ipfs-ds-help" From a45e97d9902000e9d7aa86b5c8d4ee8db37b0d46 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 7 May 2021 16:43:55 -0300 Subject: [PATCH 2993/3147] feat: switch to HAMT based on size (#91) This commit was moved from ipfs/go-unixfs@4a10174b3e417406de313481042a510768b47d3c --- unixfs/io/directory.go | 148 +++++++++++++++++++++++++++--------- unixfs/io/directory_test.go | 104 +++++++++++++++++++++++-- unixfs/unixfs.go | 5 ++ 3 files changed, 212 insertions(+), 45 deletions(-) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 03b84b98f0..b0c4549aa7 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -12,11 +12,18 @@ import ( cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log" ) -// UseHAMTSharding is a global flag that signifies whether or not to use the -// HAMT sharding scheme for directory creation -var UseHAMTSharding = false +var log = logging.Logger("unixfs") + +// HAMTShardingSize is a global option that allows switching to a HAMTDirectory +// when the BasicDirectory grows above the size (in bytes) signalled by this +// flag. The default size of 0 disables the option. +// The size is not the *exact* block size of the encoded BasicDirectory but just +// the estimated size based byte length of links name and CID (BasicDirectory's +// ProtoNode doesn't use the Data field so this estimate is pretty accurate). +var HAMTShardingSize = 0 // DefaultShardWidth is the default value used for hamt sharding width. var DefaultShardWidth = 256 @@ -72,6 +79,13 @@ type Directory interface { type BasicDirectory struct { node *mdag.ProtoNode dserv ipld.DAGService + + // Internal variable used to cache the estimated size of the basic directory: + // for each link, aggregate link name + link CID. DO NOT CHANGE THIS + // as it will affect the HAMT transition behavior in HAMTShardingSize. + // (We maintain this value up to date even if the HAMTShardingSize is off + // since potentially the option could be activated on the fly.) + estimatedSize int } // HAMTDirectory is the HAMT implementation of `Directory`. @@ -81,26 +95,25 @@ type HAMTDirectory struct { dserv ipld.DAGService } -// NewDirectory returns a Directory that can either be a HAMTDirectory if the -// UseHAMTSharding is set, or otherwise an UpgradeableDirectory containing a -// BasicDirectory that can be converted to a HAMTDirectory if the option is -// set in the future. -func NewDirectory(dserv ipld.DAGService) Directory { - if UseHAMTSharding { - dir := new(HAMTDirectory) - s, err := hamt.NewShard(dserv, DefaultShardWidth) - if err != nil { - panic(err) // will only panic if DefaultShardWidth is a bad value - } - dir.shard = s - dir.dserv = dserv - return dir - } +func newEmptyBasicDirectory(dserv ipld.DAGService) *BasicDirectory { + return newBasicDirectoryFromNode(dserv, format.EmptyDirNode()) +} +func newBasicDirectoryFromNode(dserv ipld.DAGService, node *mdag.ProtoNode) *BasicDirectory { basicDir := new(BasicDirectory) - basicDir.node = format.EmptyDirNode() + basicDir.node = node basicDir.dserv = dserv - return &UpgradeableDirectory{basicDir} + + // Scan node links (if any) to restore estimated size. + basicDir.computeEstimatedSize() + + return basicDir +} + +// NewDirectory returns a Directory implemented by UpgradeableDirectory +// containing a BasicDirectory that can be converted to a HAMTDirectory. +func NewDirectory(dserv ipld.DAGService) Directory { + return &UpgradeableDirectory{newEmptyBasicDirectory(dserv)} } // ErrNotADir implies that the given node was not a unixfs directory @@ -121,10 +134,7 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err switch fsNode.Type() { case format.TDirectory: - return &BasicDirectory{ - dserv: dserv, - node: protoBufNode.Copy().(*mdag.ProtoNode), - }, nil + return newBasicDirectoryFromNode(dserv, protoBufNode.Copy().(*mdag.ProtoNode)), nil case format.THAMTShard: shard, err := hamt.NewHamtFromDag(dserv, node) if err != nil { @@ -139,6 +149,31 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err return nil, ErrNotADir } +func (d *BasicDirectory) computeEstimatedSize() { + d.ForEachLink(nil, func(l *ipld.Link) error { + d.addToEstimatedSize(l.Name, l.Cid) + return nil + }) +} + +func estimatedLinkSize(linkName string, linkCid cid.Cid) int { + return len(linkName) + linkCid.ByteLen() +} + +func (d *BasicDirectory) addToEstimatedSize(name string, linkCid cid.Cid) { + d.estimatedSize += estimatedLinkSize(name, linkCid) +} + +func (d *BasicDirectory) removeFromEstimatedSize(name string, linkCid cid.Cid) { + d.estimatedSize -= estimatedLinkSize(name, linkCid) + if d.estimatedSize < 0 { + // Something has gone very wrong. Log an error and recompute the + // size from scratch. + log.Error("BasicDirectory's estimatedSize went below 0") + d.computeEstimatedSize() + } +} + // SetCidBuilder implements the `Directory` interface. func (d *BasicDirectory) SetCidBuilder(builder cid.Builder) { d.node.SetCidBuilder(builder) @@ -147,10 +182,18 @@ func (d *BasicDirectory) SetCidBuilder(builder cid.Builder) { // AddChild implements the `Directory` interface. It adds (or replaces) // a link to the given `node` under `name`. func (d *BasicDirectory) AddChild(ctx context.Context, name string, node ipld.Node) error { - d.node.RemoveNodeLink(name) - // Remove old link (if it existed), don't check a potential `ErrNotFound`. + // Remove old link (if it existed; ignore `ErrNotExist` otherwise). + err := d.RemoveChild(ctx, name) + if err != nil && err != os.ErrNotExist { + return err + } - return d.node.AddNodeLink(name, node) + err = d.node.AddNodeLink(name, node) + if err != nil { + return err + } + d.addToEstimatedSize(name, node.Cid()) + return nil } // EnumLinksAsync returns a channel which will receive Links in the directory @@ -203,11 +246,24 @@ func (d *BasicDirectory) Find(ctx context.Context, name string) (ipld.Node, erro // RemoveChild implements the `Directory` interface. func (d *BasicDirectory) RemoveChild(ctx context.Context, name string) error { - err := d.node.RemoveNodeLink(name) + // We need to *retrieve* the link before removing it to update the estimated + // size. This means we may iterate the links slice twice: if traversing this + // becomes a problem, a factor of 2 isn't going to make much of a difference. + // We'd likely need to cache a link resolution map in that case. + link, err := d.node.GetNodeLink(name) if err == mdag.ErrLinkNotFound { - err = os.ErrNotExist + return os.ErrNotExist + } + if err != nil { + return err // at the moment there is no other error besides ErrLinkNotFound } - return err + + // The name actually existed so we should update the estimated size. + d.removeFromEstimatedSize(link.Name, link.Cid) + + return d.node.RemoveNodeLink(name) + // GetNodeLink didn't return ErrLinkNotFound so this won't fail with that + // and we don't need to convert the error again. } // GetNode implements the `Directory` interface. @@ -309,15 +365,31 @@ var _ Directory = (*UpgradeableDirectory)(nil) // AddChild implements the `Directory` interface. We check when adding new entries // if we should switch to HAMTDirectory according to global option(s). func (d *UpgradeableDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { - if UseHAMTSharding { - if basicDir, ok := d.Directory.(*BasicDirectory); ok { - hamtDir, err := basicDir.SwitchToSharding(ctx) - if err != nil { - return err - } - d.Directory = hamtDir + err := d.Directory.AddChild(ctx, name, nd) + if err != nil { + return err + } + + // Evaluate possible HAMT upgrade. + if HAMTShardingSize == 0 { + return nil + } + basicDir, ok := d.Directory.(*BasicDirectory) + if !ok { + return nil + } + if basicDir.estimatedSize >= HAMTShardingSize { + // Ideally to minimize performance we should check if this last + // `AddChild` call would bring the directory size over the threshold + // *before* executing it since we would end up switching anyway and + // that call would be "wasted". This is a minimal performance impact + // and we prioritize a simple code base. + hamtDir, err := basicDir.SwitchToSharding(ctx) + if err != nil { + return err } + d.Directory = hamtDir } - return d.Directory.AddChild(ctx, name, nd) + return nil } diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 2b6e6afa23..8c5d8e1091 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -3,9 +3,11 @@ package io import ( "context" "fmt" + "math" "testing" ipld "github.com/ipfs/go-ipld-format" + mdag "github.com/ipfs/go-merkledag" mdtest "github.com/ipfs/go-merkledag/test" ft "github.com/ipfs/go-unixfs" @@ -98,27 +100,115 @@ func TestDuplicateAddDir(t *testing.T) { } } +// FIXME: Nothing blocking but nice to have: +// * Check estimated size against link enumeration (indirectly done in the +// restored node check from NewDirectoryFromNode). +// * Check estimated size against encoded node (the difference should only be +// a small percentage for a directory with 10s of entries). +func TestBasicDirectory_estimatedSize(t *testing.T) { + ds := mdtest.Mock() + ctx := context.Background() + child := ft.EmptyFileNode() + err := ds.Add(ctx, child) + if err != nil { + t.Fatal(err) + } + + basicDir := newEmptyBasicDirectory(ds) + + // Several overwrites should not corrupt the size estimation. + basicDir.AddChild(ctx, "child", child) + basicDir.AddChild(ctx, "child", child) + basicDir.AddChild(ctx, "child", child) + basicDir.RemoveChild(ctx, "child") + basicDir.AddChild(ctx, "child", child) + basicDir.RemoveChild(ctx, "child") + // FIXME: Check errors above (abstract adds/removals in iteration). + if basicDir.estimatedSize != 0 { + t.Fatal("estimated size is not zero after removing all entries") + } + + for i := 0; i < 100; i++ { + basicDir.AddChild(ctx, fmt.Sprintf("child-%03d", i), child) // e.g., "child-045" + } + // Estimated entry size: name (9) + CID (32 from hash and 2 extra for header) + entrySize := 9 + 32 + 2 + expectedSize := 100 * entrySize + if basicDir.estimatedSize != expectedSize { + t.Fatalf("estimated size (%d) inaccurate after adding many entries (expected %d)", + basicDir.estimatedSize, expectedSize) + } + + basicDir.RemoveChild(ctx, "child-045") // just random values + basicDir.RemoveChild(ctx, "child-063") + basicDir.RemoveChild(ctx, "child-011") + basicDir.RemoveChild(ctx, "child-000") + basicDir.RemoveChild(ctx, "child-099") + + basicDir.RemoveChild(ctx, "child-045") // already removed, won't impact size + basicDir.RemoveChild(ctx, "nonexistent-name") // also doesn't count + basicDir.RemoveChild(ctx, "child-100") // same + expectedSize -= 5 * entrySize + if basicDir.estimatedSize != expectedSize { + t.Fatalf("estimated size (%d) inaccurate after removing some entries (expected %d)", + basicDir.estimatedSize, expectedSize) + } + + // Restore a directory from original's node and check estimated size consistency. + basicDirSingleNode, _ := basicDir.GetNode() // no possible error + restoredBasicDir := newBasicDirectoryFromNode(ds, basicDirSingleNode.(*mdag.ProtoNode)) + if basicDir.estimatedSize != restoredBasicDir.estimatedSize { + t.Fatalf("restored basic directory size (%d) doesn't match original estimate (%d)", + basicDir.estimatedSize, restoredBasicDir.estimatedSize) + } +} + +// Basic test on extreme threshold to trigger switch. More fine-grained sizes +// are checked in TestBasicDirectory_estimatedSize (without the swtich itself +// but focusing on the size computation). +// FIXME: Ideally, instead of checking size computation on one test and directory +// upgrade on another a better structured test should test both dimensions +// simultaneously. func TestUpgradeableDirectory(t *testing.T) { - oldHamtOption := UseHAMTSharding - defer func() { UseHAMTSharding = oldHamtOption }() + oldHamtOption := HAMTShardingSize + defer func() { HAMTShardingSize = oldHamtOption }() ds := mdtest.Mock() - UseHAMTSharding = false // Create a BasicDirectory. dir := NewDirectory(ds) + ctx := context.Background() + child := ft.EmptyDirNode() + err := ds.Add(ctx, child) + if err != nil { + t.Fatal(err) + } + + HAMTShardingSize = 0 // Create a BasicDirectory. if _, ok := dir.(*UpgradeableDirectory).Directory.(*BasicDirectory); !ok { t.Fatal("UpgradeableDirectory doesn't contain BasicDirectory") } - // Any new directory entry will trigger the upgrade to HAMTDirectory - UseHAMTSharding = true + // Set a threshold so big a new entry won't trigger the change. + HAMTShardingSize = math.MaxInt32 + + err = dir.AddChild(ctx, "test", child) + if err != nil { + t.Fatal(err) + } + + if _, ok := dir.(*UpgradeableDirectory).Directory.(*HAMTDirectory); ok { + t.Fatal("UpgradeableDirectory was upgraded to HAMTDirectory for a large threshold") + } + + // Now set it so low to make sure any new entry will trigger the upgrade. + HAMTShardingSize = 1 - err := dir.AddChild(context.Background(), "test", ft.EmptyDirNode()) + err = dir.AddChild(ctx, "test", child) // overwriting an entry should also trigger the switch if err != nil { t.Fatal(err) } if _, ok := dir.(*UpgradeableDirectory).Directory.(*HAMTDirectory); !ok { - t.Fatal("UpgradeableDirectory wasn't upgraded to HAMTDirectory") + t.Fatal("UpgradeableDirectory wasn't upgraded to HAMTDirectory for a low threshold") } } diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 555d24efc5..026b8bb3fb 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -361,6 +361,11 @@ func EmptyDirNode() *dag.ProtoNode { return dag.NodeWithData(FolderPBData()) } +// EmptyFileNode creates an empty file Protonode. +func EmptyFileNode() *dag.ProtoNode { + return dag.NodeWithData(FilePBData(nil, 0)) +} + // ReadUnixFSNodeData extracts the UnixFS data from an IPLD node. // Raw nodes are (also) processed because they are used as leaf // nodes containing (only) UnixFS data. From 20e9dac666c7ae39eafb902306aab5a716ca9d8f Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Thu, 1 Apr 2021 15:10:15 -0400 Subject: [PATCH 2994/3147] Add support for extensible records (and v2 signature) This commit was moved from ipfs/go-ipns@3deb032d28934baa818e4624507dd0b1fefbbdc6 --- ipns/examples/embed.go | 2 +- ipns/ipns.go | 236 ++++++++++++++++++++++- ipns/ipns_test.go | 4 +- ipns/pb/ipns.pb.go | 422 ++++++++++++++++++++++++++++++++++++----- ipns/pb/ipns.proto | 15 +- ipns/select_test.go | 14 +- ipns/validate_test.go | 220 ++++++++++++++++++++- 7 files changed, 844 insertions(+), 69 deletions(-) diff --git a/ipns/examples/embed.go b/ipns/examples/embed.go index 78ca4595a4..cfd6ea7541 100644 --- a/ipns/examples/embed.go +++ b/ipns/examples/embed.go @@ -15,7 +15,7 @@ import ( func CreateEntryWithEmbed(ipfsPath string, publicKey crypto.PubKey, privateKey crypto.PrivKey) (*pb.IpnsEntry, error) { ipfsPathByte := []byte(ipfsPath) eol := time.Now().Add(time.Hour * 48) - entry, err := ipns.Create(privateKey, ipfsPathByte, 1, eol) + entry, err := ipns.Create(privateKey, ipfsPathByte, 1, eol, 0) if err != nil { return nil, err } diff --git a/ipns/ipns.go b/ipns/ipns.go index 32a6104a71..f94863c351 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -3,8 +3,20 @@ package ipns import ( "bytes" "fmt" + "sort" "time" + "github.com/pkg/errors" + + "github.com/ipld/go-ipld-prime" + _ "github.com/ipld/go-ipld-prime/codec/dagcbor" // used to import the DagCbor encoder/decoder + ipldcodec "github.com/ipld/go-ipld-prime/multicodec" + "github.com/ipld/go-ipld-prime/node/basic" + + "github.com/multiformats/go-multicodec" + + "github.com/gogo/protobuf/proto" + pb "github.com/ipfs/go-ipns/pb" u "github.com/ipfs/go-ipfs-util" @@ -12,11 +24,19 @@ import ( peer "github.com/libp2p/go-libp2p-core/peer" ) +const ( + validity = "Validity" + validityType = "ValidityType" + value = "Value" + sequence = "Sequence" + ttl = "TTL" +) + // Create creates a new IPNS entry and signs it with the given private key. // // This function does not embed the public key. If you want to do that, use // `EmbedPublicKey`. -func Create(sk ic.PrivKey, val []byte, seq uint64, eol time.Time) (*pb.IpnsEntry, error) { +func Create(sk ic.PrivKey, val []byte, seq uint64, eol time.Time, ttl time.Duration) (*pb.IpnsEntry, error) { entry := new(pb.IpnsEntry) entry.Value = val @@ -25,20 +45,112 @@ func Create(sk ic.PrivKey, val []byte, seq uint64, eol time.Time) (*pb.IpnsEntry entry.Sequence = &seq entry.Validity = []byte(u.FormatRFC3339(eol)) - sig, err := sk.Sign(ipnsEntryDataForSig(entry)) + ttlNs := uint64(ttl.Nanoseconds()) + entry.Ttl = proto.Uint64(ttlNs) + + cborData, err := createCborDataForIpnsEntry(entry) + if err != nil { + return nil, err + } + entry.Data = cborData + + sig1, err := sk.Sign(ipnsEntryDataForSigV1(entry)) + if err != nil { + return nil, errors.Wrap(err, "could not compute signature data") + } + entry.SignatureV1 = sig1 + + sig2Data, err := ipnsEntryDataForSigV2(entry) + if err != nil { + return nil, err + } + sig2, err := sk.Sign(sig2Data) if err != nil { return nil, err } - entry.Signature = sig + entry.SignatureV2 = sig2 return entry, nil } +func createCborDataForIpnsEntry(e *pb.IpnsEntry) ([]byte, error) { + m := make(map[string]ipld.Node) + var keys []string + m[value] = basicnode.NewBytes(e.GetValue()) + keys = append(keys, value) + + m[validity] = basicnode.NewBytes(e.GetValidity()) + keys = append(keys, validity) + + m[validityType] = basicnode.NewInt(int64(e.GetValidityType())) + keys = append(keys, validityType) + + m[sequence] = basicnode.NewInt(int64(e.GetSequence())) + keys = append(keys, sequence) + + m[ttl] = basicnode.NewInt(int64(e.GetTtl())) + keys = append(keys, ttl) + + sort.Sort(cborMapKeyString_RFC7049(keys)) + + newNd := basicnode.Prototype__Map{}.NewBuilder() + ma, err := newNd.BeginMap(int64(len(keys))) + if err != nil { + return nil, err + } + + for _, k := range keys { + if err := ma.AssembleKey().AssignString(k); err != nil { + return nil, err + } + if err := ma.AssembleValue().AssignNode(m[k]); err != nil { + return nil, err + } + } + + if err := ma.Finish(); err != nil { + return nil, err + } + + nd := newNd.Build() + + enc, err := ipldcodec.LookupEncoder(uint64(multicodec.DagCbor)) + if err != nil { + return nil, err + } + + buf := new(bytes.Buffer) + if err := enc(nd, buf); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + // Validates validates the given IPNS entry against the given public key. func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { // Check the ipns record signature with the public key - if ok, err := pk.Verify(ipnsEntryDataForSig(entry), entry.GetSignature()); err != nil || !ok { - return ErrSignature + + // Check v2 signature if it's available, otherwise use the v1 signature + if entry.GetSignatureV2() != nil { + sig2Data, err := ipnsEntryDataForSigV2(entry) + if err != nil { + return fmt.Errorf("could not compute signature data: %w", err) + } + if ok, err := pk.Verify(sig2Data, entry.GetSignatureV2()); err != nil || !ok { + return ErrSignature + } + + // TODO: If we switch from pb.IpnsEntry to a more generic IpnsRecord type then perhaps we should only check + // this if there is no v1 signature. In the meanwhile this helps avoid some potential rough edges around people + // checking the entry fields instead of doing CBOR decoding everywhere. + if err := validateCborDataMatchesPbData(entry); err != nil { + return err + } + } else { + if ok, err := pk.Verify(ipnsEntryDataForSigV1(entry), entry.GetSignatureV1()); err != nil || !ok { + return ErrSignature + } } eol, err := GetEOL(entry) @@ -51,6 +163,87 @@ func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { return nil } +// TODO: Most of this function could probably be replaced with codegen +func validateCborDataMatchesPbData(entry *pb.IpnsEntry) error { + if len(entry.GetData()) == 0 { + return fmt.Errorf("record data is missing") + } + + dec, err := ipldcodec.LookupDecoder(uint64(multicodec.DagCbor)) + if err != nil { + return err + } + + ndbuilder := basicnode.Prototype__Map{}.NewBuilder() + if err := dec(ndbuilder, bytes.NewReader(entry.GetData())); err != nil { + return err + } + + fullNd := ndbuilder.Build() + nd, err := fullNd.LookupByString(value) + if err != nil { + return err + } + ndBytes, err := nd.AsBytes() + if err != nil { + return err + } + if !bytes.Equal(entry.GetValue(), ndBytes) { + return fmt.Errorf("field \"%v\" did not match between protobuf and CBOR", value) + } + + nd, err = fullNd.LookupByString(validity) + if err != nil { + return err + } + ndBytes, err = nd.AsBytes() + if err != nil { + return err + } + if !bytes.Equal(entry.GetValidity(), ndBytes) { + return fmt.Errorf("field \"%v\" did not match between protobuf and CBOR", validity) + } + + nd, err = fullNd.LookupByString(validityType) + if err != nil { + return err + } + ndInt, err := nd.AsInt() + if err != nil { + return err + } + if int64(entry.GetValidityType()) != ndInt { + return fmt.Errorf("field \"%v\" did not match between protobuf and CBOR", validityType) + } + + nd, err = fullNd.LookupByString(sequence) + if err != nil { + return err + } + ndInt, err = nd.AsInt() + if err != nil { + return err + } + + if entry.GetSequence() != uint64(ndInt) { + return fmt.Errorf("field \"%v\" did not match between protobuf and CBOR", sequence) + } + + nd, err = fullNd.LookupByString("TTL") + if err != nil { + return err + } + ndInt, err = nd.AsInt() + if err != nil { + return err + } + if entry.GetTtl() != uint64(ndInt) { + return fmt.Errorf("field \"%v\" did not match between protobuf and CBOR", ttl) + } + + return nil +} + // GetEOL returns the EOL of this IPNS entry // // This function returns ErrUnrecognizedValidity if the validity type of the @@ -130,6 +323,16 @@ func ExtractPublicKey(pid peer.ID, entry *pb.IpnsEntry) (ic.PubKey, error) { // `bytes.Compare`). You must do this if you are implementing a libp2p record // validator (or you can just use the one provided for you by this package). func Compare(a, b *pb.IpnsEntry) (int, error) { + aHasV2Sig := a.GetSignatureV2() != nil + bHasV2Sig := b.GetSignatureV2() != nil + + // Having a newer signature version is better than an older signature version + if aHasV2Sig && !bHasV2Sig { + return 1, nil + } else if !aHasV2Sig && bHasV2Sig { + return -1, nil + } + as := a.GetSequence() bs := b.GetSequence() @@ -158,7 +361,7 @@ func Compare(a, b *pb.IpnsEntry) (int, error) { return 0, nil } -func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { +func ipnsEntryDataForSigV1(e *pb.IpnsEntry) []byte { return bytes.Join([][]byte{ e.Value, e.Validity, @@ -166,3 +369,24 @@ func ipnsEntryDataForSig(e *pb.IpnsEntry) []byte { }, []byte{}) } + +func ipnsEntryDataForSigV2(e *pb.IpnsEntry) ([]byte, error) { + dataForSig := []byte("ipns-signature:") + dataForSig = append(dataForSig, e.Data...) + + return dataForSig, nil +} + +type cborMapKeyString_RFC7049 []string + +func (x cborMapKeyString_RFC7049) Len() int { return len(x) } +func (x cborMapKeyString_RFC7049) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x cborMapKeyString_RFC7049) Less(i, j int) bool { + li, lj := len(x[i]), len(x[j]) + if li == lj { + return x[i] < x[j] + } + return li < lj +} + +var _ sort.Interface = (cborMapKeyString_RFC7049)(nil) diff --git a/ipns/ipns_test.go b/ipns/ipns_test.go index 84a4b1d804..f56d1e7e2e 100644 --- a/ipns/ipns_test.go +++ b/ipns/ipns_test.go @@ -23,7 +23,7 @@ func TestEmbedPublicKey(t *testing.T) { t.Fatal(err) } - e, err := Create(priv, []byte("/a/b"), 0, time.Now().Add(1*time.Hour)) + e, err := Create(priv, []byte("/a/b"), 0, time.Now().Add(1*time.Hour), 0) if err != nil { t.Fatal(err) } @@ -54,7 +54,7 @@ func ExampleCreate() { // Create an IPNS record that expires in one hour and points to the IPFS address // /ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5 - ipnsRecord, err := Create(privateKey, []byte("/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5"), 0, time.Now().Add(1*time.Hour)) + ipnsRecord, err := Create(privateKey, []byte("/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5"), 0, time.Now().Add(1*time.Hour), 0) if err != nil { panic(err) } diff --git a/ipns/pb/ipns.pb.go b/ipns/pb/ipns.pb.go index 6354831d08..8bcace7fcc 100644 --- a/ipns/pb/ipns.pb.go +++ b/ipns/pb/ipns.pb.go @@ -5,7 +5,6 @@ package ipns_pb import ( fmt "fmt" - github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -62,8 +61,8 @@ func (IpnsEntry_ValidityType) EnumDescriptor() ([]byte, []int) { } type IpnsEntry struct { - Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"` + Value []byte `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` + SignatureV1 []byte `protobuf:"bytes,2,opt,name=signatureV1" json:"signatureV1,omitempty"` ValidityType *IpnsEntry_ValidityType `protobuf:"varint,3,opt,name=validityType,enum=ipns.pb.IpnsEntry_ValidityType" json:"validityType,omitempty"` Validity []byte `protobuf:"bytes,4,opt,name=validity" json:"validity,omitempty"` Sequence *uint64 `protobuf:"varint,5,opt,name=sequence" json:"sequence,omitempty"` @@ -73,6 +72,8 @@ type IpnsEntry struct { // the record itself. For newer ed25519 keys, the public key can be embedded in the // peerID, making this field unnecessary. PubKey []byte `protobuf:"bytes,7,opt,name=pubKey" json:"pubKey,omitempty"` + SignatureV2 []byte `protobuf:"bytes,8,opt,name=signatureV2" json:"signatureV2,omitempty"` + Data []byte `protobuf:"bytes,9,opt,name=data" json:"data,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -118,9 +119,9 @@ func (m *IpnsEntry) GetValue() []byte { return nil } -func (m *IpnsEntry) GetSignature() []byte { +func (m *IpnsEntry) GetSignatureV1() []byte { if m != nil { - return m.Signature + return m.SignatureV1 } return nil } @@ -160,29 +161,102 @@ func (m *IpnsEntry) GetPubKey() []byte { return nil } +func (m *IpnsEntry) GetSignatureV2() []byte { + if m != nil { + return m.SignatureV2 + } + return nil +} + +func (m *IpnsEntry) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +type IpnsSignatureV2Checker struct { + PubKey []byte `protobuf:"bytes,7,opt,name=pubKey" json:"pubKey,omitempty"` + SignatureV2 []byte `protobuf:"bytes,8,opt,name=signatureV2" json:"signatureV2,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IpnsSignatureV2Checker) Reset() { *m = IpnsSignatureV2Checker{} } +func (m *IpnsSignatureV2Checker) String() string { return proto.CompactTextString(m) } +func (*IpnsSignatureV2Checker) ProtoMessage() {} +func (*IpnsSignatureV2Checker) Descriptor() ([]byte, []int) { + return fileDescriptor_4d5b16fb32bfe8ea, []int{1} +} +func (m *IpnsSignatureV2Checker) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IpnsSignatureV2Checker) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IpnsSignatureV2Checker.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *IpnsSignatureV2Checker) XXX_Merge(src proto.Message) { + xxx_messageInfo_IpnsSignatureV2Checker.Merge(m, src) +} +func (m *IpnsSignatureV2Checker) XXX_Size() int { + return m.Size() +} +func (m *IpnsSignatureV2Checker) XXX_DiscardUnknown() { + xxx_messageInfo_IpnsSignatureV2Checker.DiscardUnknown(m) +} + +var xxx_messageInfo_IpnsSignatureV2Checker proto.InternalMessageInfo + +func (m *IpnsSignatureV2Checker) GetPubKey() []byte { + if m != nil { + return m.PubKey + } + return nil +} + +func (m *IpnsSignatureV2Checker) GetSignatureV2() []byte { + if m != nil { + return m.SignatureV2 + } + return nil +} + func init() { proto.RegisterEnum("ipns.pb.IpnsEntry_ValidityType", IpnsEntry_ValidityType_name, IpnsEntry_ValidityType_value) proto.RegisterType((*IpnsEntry)(nil), "ipns.pb.IpnsEntry") + proto.RegisterType((*IpnsSignatureV2Checker)(nil), "ipns.pb.IpnsSignatureV2Checker") } func init() { proto.RegisterFile("ipns.proto", fileDescriptor_4d5b16fb32bfe8ea) } var fileDescriptor_4d5b16fb32bfe8ea = []byte{ - // 221 bytes of a gzipped FileDescriptorProto + // 272 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xca, 0x2c, 0xc8, 0x2b, - 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0xb0, 0x93, 0x94, 0xfe, 0x33, 0x72, 0x71, + 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0xb0, 0x93, 0x94, 0x76, 0x32, 0x71, 0x71, 0x7a, 0x16, 0xe4, 0x15, 0xbb, 0xe6, 0x95, 0x14, 0x55, 0x0a, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, - 0x94, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x69, 0xf0, 0x04, 0x41, 0x38, 0x42, 0x32, 0x5c, 0x9c, 0xc5, - 0x99, 0xe9, 0x79, 0x89, 0x25, 0xa5, 0x45, 0xa9, 0x12, 0x4c, 0x60, 0x19, 0x84, 0x80, 0x90, 0x33, - 0x17, 0x4f, 0x59, 0x62, 0x4e, 0x66, 0x4a, 0x66, 0x49, 0x65, 0x48, 0x65, 0x41, 0xaa, 0x04, 0xb3, - 0x02, 0xa3, 0x06, 0x9f, 0x91, 0xbc, 0x1e, 0xd4, 0x06, 0x3d, 0xb8, 0xe9, 0x7a, 0x61, 0x48, 0xca, - 0x82, 0x50, 0x34, 0x09, 0x49, 0x71, 0x71, 0xc0, 0xf8, 0x12, 0x2c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, - 0x70, 0x3e, 0x48, 0xae, 0x38, 0xb5, 0xb0, 0x34, 0x35, 0x2f, 0x39, 0x55, 0x82, 0x55, 0x81, 0x51, - 0x83, 0x25, 0x08, 0xce, 0x17, 0x12, 0xe0, 0x62, 0x2e, 0x29, 0xc9, 0x91, 0x60, 0x03, 0x0b, 0x83, - 0x98, 0x42, 0x62, 0x5c, 0x6c, 0x05, 0xa5, 0x49, 0xde, 0xa9, 0x95, 0x12, 0xec, 0x60, 0x73, 0xa0, - 0x3c, 0x25, 0x71, 0x2e, 0x1e, 0x64, 0xfb, 0x85, 0xd8, 0xb9, 0x98, 0x5d, 0xfd, 0x7d, 0x04, 0x18, - 0x9c, 0x78, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0x46, 0x40, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x32, 0x35, 0xc7, 0xf2, 0x25, 0x01, 0x00, 0x00, + 0x94, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0xf0, 0x04, 0x41, 0x38, 0x42, 0x0a, 0x5c, 0xdc, 0xc5, + 0x99, 0xe9, 0x79, 0x89, 0x25, 0xa5, 0x45, 0xa9, 0x61, 0x86, 0x12, 0x4c, 0x60, 0x39, 0x64, 0x21, + 0x21, 0x67, 0x2e, 0x9e, 0xb2, 0xc4, 0x9c, 0xcc, 0x94, 0xcc, 0x92, 0xca, 0x90, 0xca, 0x82, 0x54, + 0x09, 0x66, 0x05, 0x46, 0x0d, 0x3e, 0x23, 0x79, 0x3d, 0xa8, 0x2d, 0x7a, 0x70, 0x1b, 0xf4, 0xc2, + 0x90, 0x94, 0x05, 0xa1, 0x68, 0x12, 0x92, 0xe2, 0xe2, 0x80, 0xf1, 0x25, 0x58, 0xc0, 0x76, 0xc0, + 0xf9, 0x20, 0xb9, 0xe2, 0xd4, 0xc2, 0xd2, 0xd4, 0xbc, 0xe4, 0x54, 0x09, 0x56, 0x05, 0x46, 0x0d, + 0x96, 0x20, 0x38, 0x5f, 0x48, 0x80, 0x8b, 0xb9, 0xa4, 0x24, 0x47, 0x82, 0x0d, 0x2c, 0x0c, 0x62, + 0x0a, 0x89, 0x71, 0xb1, 0x15, 0x94, 0x26, 0x79, 0xa7, 0x56, 0x4a, 0xb0, 0x83, 0xcd, 0x81, 0xf2, + 0x50, 0x3d, 0x62, 0x24, 0xc1, 0x81, 0xee, 0x11, 0x23, 0x21, 0x21, 0x2e, 0x96, 0x94, 0xc4, 0x92, + 0x44, 0x09, 0x4e, 0xb0, 0x14, 0x98, 0xad, 0x24, 0xce, 0xc5, 0x83, 0xec, 0x6a, 0x21, 0x76, 0x2e, + 0x66, 0x57, 0x7f, 0x1f, 0x01, 0x06, 0xa5, 0x20, 0x2e, 0x31, 0x90, 0xc7, 0x82, 0x11, 0xfa, 0x9d, + 0x33, 0x52, 0x93, 0xb3, 0x53, 0x8b, 0xc8, 0x77, 0x80, 0x93, 0xc4, 0x89, 0x47, 0x72, 0x8c, 0x17, + 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x18, 0xc5, 0xa5, 0xa7, 0x6f, 0x0d, 0x0a, 0xc3, 0xf8, + 0x82, 0x24, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x32, 0x85, 0x5b, 0xed, 0xbf, 0x01, 0x00, 0x00, } func (m *IpnsEntry) Marshal() (dAtA []byte, err error) { @@ -209,6 +283,20 @@ func (m *IpnsEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Data != nil { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintIpns(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x4a + } + if m.SignatureV2 != nil { + i -= len(m.SignatureV2) + copy(dAtA[i:], m.SignatureV2) + i = encodeVarintIpns(dAtA, i, uint64(len(m.SignatureV2))) + i-- + dAtA[i] = 0x42 + } if m.PubKey != nil { i -= len(m.PubKey) copy(dAtA[i:], m.PubKey) @@ -238,18 +326,14 @@ func (m *IpnsEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if m.Signature == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") - } else { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintIpns(dAtA, i, uint64(len(m.Signature))) + if m.SignatureV1 != nil { + i -= len(m.SignatureV1) + copy(dAtA[i:], m.SignatureV1) + i = encodeVarintIpns(dAtA, i, uint64(len(m.SignatureV1))) i-- dAtA[i] = 0x12 } - if m.Value == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") - } else { + if m.Value != nil { i -= len(m.Value) copy(dAtA[i:], m.Value) i = encodeVarintIpns(dAtA, i, uint64(len(m.Value))) @@ -259,6 +343,47 @@ func (m *IpnsEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IpnsSignatureV2Checker) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IpnsSignatureV2Checker) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IpnsSignatureV2Checker) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.SignatureV2 != nil { + i -= len(m.SignatureV2) + copy(dAtA[i:], m.SignatureV2) + i = encodeVarintIpns(dAtA, i, uint64(len(m.SignatureV2))) + i-- + dAtA[i] = 0x42 + } + if m.PubKey != nil { + i -= len(m.PubKey) + copy(dAtA[i:], m.PubKey) + i = encodeVarintIpns(dAtA, i, uint64(len(m.PubKey))) + i-- + dAtA[i] = 0x3a + } + return len(dAtA) - i, nil +} + func encodeVarintIpns(dAtA []byte, offset int, v uint64) int { offset -= sovIpns(v) base := offset @@ -280,8 +405,8 @@ func (m *IpnsEntry) Size() (n int) { l = len(m.Value) n += 1 + l + sovIpns(uint64(l)) } - if m.Signature != nil { - l = len(m.Signature) + if m.SignatureV1 != nil { + l = len(m.SignatureV1) n += 1 + l + sovIpns(uint64(l)) } if m.ValidityType != nil { @@ -301,6 +426,34 @@ func (m *IpnsEntry) Size() (n int) { l = len(m.PubKey) n += 1 + l + sovIpns(uint64(l)) } + if m.SignatureV2 != nil { + l = len(m.SignatureV2) + n += 1 + l + sovIpns(uint64(l)) + } + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovIpns(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *IpnsSignatureV2Checker) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PubKey != nil { + l = len(m.PubKey) + n += 1 + l + sovIpns(uint64(l)) + } + if m.SignatureV2 != nil { + l = len(m.SignatureV2) + n += 1 + l + sovIpns(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -314,7 +467,6 @@ func sozIpns(x uint64) (n int) { return sovIpns(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } func (m *IpnsEntry) Unmarshal(dAtA []byte) error { - var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -377,10 +529,9 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { m.Value = []byte{} } iNdEx = postIndex - hasFields[0] |= uint64(0x00000001) case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SignatureV1", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -407,12 +558,11 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) - if m.Signature == nil { - m.Signature = []byte{} + m.SignatureV1 = append(m.SignatureV1[:0], dAtA[iNdEx:postIndex]...) + if m.SignatureV1 == nil { + m.SignatureV1 = []byte{} } iNdEx = postIndex - hasFields[0] |= uint64(0x00000002) case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ValidityType", wireType) @@ -541,16 +691,81 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { m.PubKey = []byte{} } iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignatureV2", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignatureV2 = append(m.SignatureV2[:0], dAtA[iNdEx:postIndex]...) + if m.SignatureV2 == nil { + m.SignatureV2 = []byte{} + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipIpns(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthIpns - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthIpns } if (iNdEx + skippy) > l { @@ -560,11 +775,124 @@ func (m *IpnsEntry) Unmarshal(dAtA []byte) error { iNdEx += skippy } } - if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + + if iNdEx > l { + return io.ErrUnexpectedEOF } - if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") + return nil +} +func (m *IpnsSignatureV2Checker) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IpnsSignatureV2Checker: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IpnsSignatureV2Checker: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PubKey = append(m.PubKey[:0], dAtA[iNdEx:postIndex]...) + if m.PubKey == nil { + m.PubKey = []byte{} + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignatureV2", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIpns + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthIpns + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthIpns + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignatureV2 = append(m.SignatureV2[:0], dAtA[iNdEx:postIndex]...) + if m.SignatureV2 == nil { + m.SignatureV2 = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipIpns(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthIpns + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } } if iNdEx > l { @@ -629,9 +957,6 @@ func skipIpns(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthIpns } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthIpns - } case 3: depth++ case 4: @@ -644,6 +969,9 @@ func skipIpns(dAtA []byte) (n int, err error) { default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthIpns + } if depth == 0 { return iNdEx, nil } diff --git a/ipns/pb/ipns.proto b/ipns/pb/ipns.proto index f2e79feff4..9fd8bda83b 100644 --- a/ipns/pb/ipns.proto +++ b/ipns/pb/ipns.proto @@ -2,13 +2,15 @@ syntax = "proto2"; package ipns.pb; +option go_package = "./;ipns_pb"; + message IpnsEntry { enum ValidityType { // setting an EOL says "this record is valid until..." EOL = 0; } - required bytes value = 1; - required bytes signature = 2; + optional bytes value = 1; + optional bytes signatureV1 = 2; optional ValidityType validityType = 3; optional bytes validity = 4; @@ -22,4 +24,13 @@ message IpnsEntry { // the record itself. For newer ed25519 keys, the public key can be embedded in the // peerID, making this field unnecessary. optional bytes pubKey = 7; + + optional bytes signatureV2 = 8; + + optional bytes data = 9; +} + +message IpnsSignatureV2Checker { + optional bytes pubKey = 7; + optional bytes signatureV2 = 8; } diff --git a/ipns/select_test.go b/ipns/select_test.go index 35fc3f618a..905afb1da8 100644 --- a/ipns/select_test.go +++ b/ipns/select_test.go @@ -15,7 +15,7 @@ import ( func shuffle(a []*pb.IpnsEntry) { for n := 0; n < 5; n++ { - for i, _ := range a { + for i := range a { j := rand.Intn(len(a)) a[i], a[j] = a[j], a[i] } @@ -56,32 +56,32 @@ func TestOrdering(t *testing.T) { t.Fatal(err) } - e1, err := Create(priv, []byte("foo"), 1, ts.Add(time.Hour)) + e1, err := Create(priv, []byte("foo"), 1, ts.Add(time.Hour), 0) if err != nil { t.Fatal(err) } - e2, err := Create(priv, []byte("bar"), 2, ts.Add(time.Hour)) + e2, err := Create(priv, []byte("bar"), 2, ts.Add(time.Hour), 0) if err != nil { t.Fatal(err) } - e3, err := Create(priv, []byte("baz"), 3, ts.Add(time.Hour)) + e3, err := Create(priv, []byte("baz"), 3, ts.Add(time.Hour), 0) if err != nil { t.Fatal(err) } - e4, err := Create(priv, []byte("cat"), 3, ts.Add(time.Hour*2)) + e4, err := Create(priv, []byte("cat"), 3, ts.Add(time.Hour*2), 0) if err != nil { t.Fatal(err) } - e5, err := Create(priv, []byte("dog"), 4, ts.Add(time.Hour*3)) + e5, err := Create(priv, []byte("dog"), 4, ts.Add(time.Hour*3), 0) if err != nil { t.Fatal(err) } - e6, err := Create(priv, []byte("fish"), 4, ts.Add(time.Hour*3)) + e6, err := Create(priv, []byte("fish"), 4, ts.Add(time.Hour*3), 0) if err != nil { t.Fatal(err) } diff --git a/ipns/validate_test.go b/ipns/validate_test.go index 741d20bc1a..276e6d4dac 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -1,6 +1,8 @@ package ipns import ( + "bytes" + "errors" "fmt" "math/rand" "strings" @@ -9,6 +11,10 @@ import ( pb "github.com/ipfs/go-ipns/pb" + ipldcodec "github.com/ipld/go-ipld-prime/multicodec" + basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/multiformats/go-multicodec" + proto "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" ci "github.com/libp2p/go-libp2p-core/crypto" @@ -44,7 +50,7 @@ func testValidatorCaseMatchFunc(t *testing.T, priv ci.PrivKey, kbook pstore.KeyB data := val if data == nil { p := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - entry, err := Create(priv, p, 1, eol) + entry, err := Create(priv, p, 1, eol, 0) if err != nil { t.Fatal(err) } @@ -64,7 +70,9 @@ func TestValidator(t *testing.T) { priv, id, _ := genKeys(t) priv2, id2, _ := genKeys(t) kbook := pstoremem.NewPeerstore() - kbook.AddPubKey(id, priv.GetPublic()) + if err := kbook.AddPubKey(id, priv.GetPublic()); err != nil { + t.Fatal(err) + } emptyKbook := pstoremem.NewPeerstore() testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), nil) @@ -95,7 +103,7 @@ func TestEmbeddedPubKeyValidate(t *testing.T) { priv, _, ipnsk := genKeys(t) - entry, err := Create(priv, pth, 1, goodeol) + entry, err := Create(priv, pth, 1, goodeol, 0) if err != nil { t.Fatal(err) } @@ -147,7 +155,7 @@ func TestPeerIDPubKeyValidate(t *testing.T) { ipnsk := "/ipns/" + string(pid) - entry, err := Create(sk, pth, 1, goodeol) + entry, err := Create(sk, pth, 1, goodeol, 0) if err != nil { t.Fatal(err) } @@ -160,6 +168,210 @@ func TestPeerIDPubKeyValidate(t *testing.T) { testValidatorCase(t, sk, kbook, ipnsk, dataNoKey, goodeol, nil) } +func TestBothSignatureVersionsValidate(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + + sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + if err != nil { + t.Fatal(err) + } + + path1 := []byte("/path/1") + entry, err := Create(sk, path1, 1, goodeol, 0) + if err != nil { + t.Fatal(err) + } + + if err := Validate(pk, entry); err != nil { + t.Fatal(err) + } + + entry.SignatureV2 = nil + if err := Validate(pk, entry); err != nil { + t.Fatal(err) + } + + entry.SignatureV1 = nil + if err := Validate(pk, entry); !errors.Is(err, ErrSignature) { + t.Fatal(err) + } +} + +func TestNewSignatureVersionPreferred(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + + sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + if err != nil { + t.Fatal(err) + } + + pid, err := peer.IDFromPublicKey(pk) + if err != nil { + t.Fatal(err) + } + + ipnsk := "/ipns/" + string(pid) + + path1 := []byte("/path/1") + entry1, err := Create(sk, path1, 1, goodeol, 0) + if err != nil { + t.Fatal(err) + } + + path2 := []byte("/path/2") + entry2, err := Create(sk, path2, 2, goodeol, 0) + if err != nil { + t.Fatal(err) + } + + if err := Validate(pk, entry1); err != nil { + t.Fatal(err) + } + + if err := Validate(pk, entry2); err != nil { + t.Fatal(err) + } + + v := Validator{} + best, err := v.Select(ipnsk, [][]byte{mustMarshal(t, entry1), mustMarshal(t, entry2)}) + if err != nil { + t.Fatal(err) + } + if best != 1 { + t.Fatal("entry2 should be better than entry1") + } + + // Having only the v1 signature should be valid + entry2.SignatureV2 = nil + if err := Validate(pk, entry2); err != nil { + t.Fatal(err) + } + + // However the v2 signature should be preferred + best, err = v.Select(ipnsk, [][]byte{mustMarshal(t, entry1), mustMarshal(t, entry2)}) + if err != nil { + t.Fatal(err) + } + if best != 0 { + t.Fatal("entry1 should be better than entry2") + } + + // Having a missing v1 signature is acceptable as long as there is a valid v2 signature + entry1.SignatureV1 = nil + if err := Validate(pk, entry1); err != nil { + t.Fatal(err) + } + + // Having an invalid v1 signature is acceptable as long as there is a valid v2 signature + entry1.SignatureV1 = []byte("garbage") + if err := Validate(pk, entry1); err != nil { + t.Fatal(err) + } +} + +func TestCborDataCanonicalization(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + + sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + if err != nil { + t.Fatal(err) + } + + path := append([]byte("/path/1"), 0x00) + seqnum := uint64(1) + entry, err := Create(sk, path, seqnum, goodeol, time.Hour) + if err != nil { + t.Fatal(err) + } + + if err := Validate(pk, entry); err != nil { + t.Fatal(err) + } + + dec, err := ipldcodec.LookupDecoder(uint64(multicodec.DagCbor)) + if err != nil { + t.Fatal(err) + } + + ndbuilder := basicnode.Prototype__Map{}.NewBuilder() + if err := dec(ndbuilder, bytes.NewReader(entry.GetData())); err != nil { + t.Fatal(err) + } + + nd := ndbuilder.Build() + iter := nd.MapIterator() + var fields []string + for !iter.Done() { + k, v, err := iter.Next() + if err != nil { + t.Fatal(err) + } + kstr, err := k.AsString() + if err != nil { + t.Fatal(err) + } + + switch kstr { + case value: + b, err := v.AsBytes() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(path, b) { + t.Fatal("value did not match") + } + case sequence: + s, err := v.AsInt() + if err != nil { + t.Fatal(err) + } + if uint64(s) != seqnum { + t.Fatal("sequence numbers did not match") + } + case validity: + val, err := v.AsBytes() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(val, []byte(u.FormatRFC3339(goodeol))) { + t.Fatal("validity did not match") + } + case validityType: + vt, err := v.AsInt() + if err != nil { + t.Fatal(err) + } + if uint64(vt) != 0 { + t.Fatal("validity types did not match") + } + case ttl: + ttlVal, err := v.AsInt() + if err != nil { + t.Fatal(err) + } + // TODO: test non-zero TTL + if uint64(ttlVal) != uint64(time.Hour.Nanoseconds()) { + t.Fatal("TTLs did not match") + } + } + + fields = append(fields, kstr) + } + + // Check for map sort order (i.e. by length then by value) + expectedOrder := []string{"TTL", "Value", "Sequence", "Validity", "ValidityType"} + if len(fields) != len(expectedOrder) { + t.Fatal("wrong number of fields") + } + + for i, f := range fields { + expected := expectedOrder[i] + if f != expected { + t.Fatalf("expected %s, got %s", expected, f) + } + } +} + func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string) { sr := u.NewTimeSeededRand() priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 2048, sr) From 735d02dc733b022b175bf53f150789b9ea1e08a0 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 11 May 2021 15:27:54 -0400 Subject: [PATCH 2995/3147] chore: update dep This commit was moved from ipfs/go-namesys@8af847d76a2e4ab2a1283889ee02d5f898ae3981 --- namesys/ipns_resolver_validation_test.go | 8 ++++---- namesys/publisher.go | 13 +++++-------- namesys/publisher_test.go | 2 +- namesys/resolve_test.go | 4 ++-- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index 5dbfabf9cd..d896b9e0dc 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -57,7 +57,7 @@ func testResolverValidation(t *testing.T, keyType int) { priv, id, _, ipnsDHTPath := genKeys(t, keyType) ts := time.Now() p := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - entry, err := createIPNSRecordWithEmbeddedPublicKey(priv, p, 1, ts.Add(time.Hour)) + entry, err := createIPNSRecordWithEmbeddedPublicKey(priv, p, 1, ts.Add(time.Hour), 0) if err != nil { t.Fatal(err) } @@ -77,7 +77,7 @@ func testResolverValidation(t *testing.T, keyType int) { t.Fatalf("Mismatch between published path %s and resolved path %s", p, resp) } // Create expired entry - expiredEntry, err := createIPNSRecordWithEmbeddedPublicKey(priv, p, 1, ts.Add(-1*time.Hour)) + expiredEntry, err := createIPNSRecordWithEmbeddedPublicKey(priv, p, 1, ts.Add(-1*time.Hour), 0) if err != nil { t.Fatal(err) } @@ -146,8 +146,8 @@ func genKeys(t *testing.T, keyType int) (ci.PrivKey, peer.ID, string, string) { return sk, id, PkKeyForID(id), ipns.RecordKey(id) } -func createIPNSRecordWithEmbeddedPublicKey(sk ci.PrivKey, val []byte, seq uint64, eol time.Time) (*ipns_pb.IpnsEntry, error) { - entry, err := ipns.Create(sk, val, seq, eol) +func createIPNSRecordWithEmbeddedPublicKey(sk ci.PrivKey, val []byte, seq uint64, eol time.Time, ttl time.Duration) (*ipns_pb.IpnsEntry, error) { + entry, err := ipns.Create(sk, val, seq, eol, ttl) if err != nil { return nil, err } diff --git a/namesys/publisher.go b/namesys/publisher.go index edf57375a7..f67a8bf52b 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -162,19 +162,16 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value pa seqno++ } + // Set the TTL + // TODO: Make this less hacky. + ttl, _ := checkCtxTTL(ctx) + // Create record - entry, err := ipns.Create(k, []byte(value), seqno, eol) + entry, err := ipns.Create(k, []byte(value), seqno, eol, ttl) if err != nil { return nil, err } - // Set the TTL - // TODO: Make this less hacky. - ttl, ok := checkCtxTTL(ctx) - if ok { - entry.Ttl = proto.Uint64(uint64(ttl.Nanoseconds())) - } - data, err := proto.Marshal(entry) if err != nil { return nil, err diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index afc9efcc2c..844ed86ed4 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -76,7 +76,7 @@ func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expected serv := mockrouting.NewServer() r := serv.ClientWithDatastore(context.Background(), &identity{p}, dstore) - entry, err := ipns.Create(privKey, value, seqnum, eol) + entry, err := ipns.Create(privKey, value, seqnum, eol, 0) if err != nil { t.Fatal(err) } diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go index f8b243669f..b654936c41 100644 --- a/namesys/resolve_test.go +++ b/namesys/resolve_test.go @@ -54,7 +54,7 @@ func TestPrexistingExpiredRecord(t *testing.T) { h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour * -1) - entry, err := ipns.Create(identity.PrivateKey(), []byte(h), 0, eol) + entry, err := ipns.Create(identity.PrivateKey(), []byte(h), 0, eol, 0) if err != nil { t.Fatal(err) } @@ -87,7 +87,7 @@ func TestPrexistingRecord(t *testing.T) { // Make a good record and put it in the datastore h := path.FromString("/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN") eol := time.Now().Add(time.Hour) - entry, err := ipns.Create(identity.PrivateKey(), []byte(h), 0, eol) + entry, err := ipns.Create(identity.PrivateKey(), []byte(h), 0, eol, 0) if err != nil { t.Fatal(err) } From 259f6afee25e8018564d1eb3ef897f5450f26226 Mon Sep 17 00:00:00 2001 From: gammazero Date: Wed, 12 May 2021 15:33:46 -0700 Subject: [PATCH 2996/3147] Remove old ipldpinner that has been replaced by dspinner - Remove old ipld pinner code - Remove pin conversion package - Remove ipldpinner portion of benchmarks This commit was moved from ipfs/go-ipfs-pinner@14ba63732f5e6a71c5deca423faef51fc5ecac82 --- pinning/pinner/dspinner/pin_test.go | 36 -- pinning/pinner/ipldpinner/pin.go | 549 ------------------------- pinning/pinner/ipldpinner/pin_test.go | 526 ----------------------- pinning/pinner/ipldpinner/set.go | 334 --------------- pinning/pinner/ipldpinner/set_test.go | 100 ----- pinning/pinner/pinconv/pinconv.go | 127 ------ pinning/pinner/pinconv/pinconv_test.go | 179 -------- 7 files changed, 1851 deletions(-) delete mode 100644 pinning/pinner/ipldpinner/pin.go delete mode 100644 pinning/pinner/ipldpinner/pin_test.go delete mode 100644 pinning/pinner/ipldpinner/set.go delete mode 100644 pinning/pinner/ipldpinner/set_test.go delete mode 100644 pinning/pinner/pinconv/pinconv.go delete mode 100644 pinning/pinner/pinconv/pinconv_test.go diff --git a/pinning/pinner/dspinner/pin_test.go b/pinning/pinner/dspinner/pin_test.go index 40e2c70cac..46a2f94a5f 100644 --- a/pinning/pinner/dspinner/pin_test.go +++ b/pinning/pinner/dspinner/pin_test.go @@ -18,7 +18,6 @@ import ( blockstore "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" ipfspin "github.com/ipfs/go-ipfs-pinner" - "github.com/ipfs/go-ipfs-pinner/ipldpinner" util "github.com/ipfs/go-ipfs-util" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" @@ -951,19 +950,11 @@ func BenchmarkNthPin(b *testing.B) { if err != nil { panic(err.Error()) } - pinnerIPLD, err := ipldpinner.New(dstore, dserv, dserv) - if err != nil { - panic(err.Error()) - } for count := 1000; count <= 10000; count += 1000 { b.Run(fmt.Sprint("PinDS-", count), func(b *testing.B) { benchmarkNthPin(b, count, pinner, dserv) }) - - b.Run(fmt.Sprint("PinIPLD-", count), func(b *testing.B) { - benchmarkNthPin(b, count, pinnerIPLD, dserv) - }) } } @@ -1011,15 +1002,6 @@ func BenchmarkNPins(b *testing.B) { } benchmarkNPins(b, count, pinner, dserv) }) - - b.Run(fmt.Sprint("PinIPLD-", count), func(b *testing.B) { - dstore, dserv := makeStore() - pinner, err := ipldpinner.New(dstore, dserv, dserv) - if err != nil { - panic(err.Error()) - } - benchmarkNPins(b, count, pinner, dserv) - }) } } @@ -1061,15 +1043,6 @@ func BenchmarkNUnpins(b *testing.B) { } benchmarkNUnpins(b, count, pinner, dserv) }) - - b.Run(fmt.Sprint("UninIPLD-", count), func(b *testing.B) { - dstore, dserv := makeStore() - pinner, err := ipldpinner.New(dstore, dserv, dserv) - if err != nil { - panic(err.Error()) - } - benchmarkNUnpins(b, count, pinner, dserv) - }) } } @@ -1111,15 +1084,6 @@ func BenchmarkPinAll(b *testing.B) { } benchmarkPinAll(b, count, pinner, dserv) }) - - b.Run(fmt.Sprint("PinAllIPLD-", count), func(b *testing.B) { - dstore, dserv := makeStore() - pinner, err := ipldpinner.New(dstore, dserv, dserv) - if err != nil { - panic(err.Error()) - } - benchmarkPinAll(b, count, pinner, dserv) - }) } } diff --git a/pinning/pinner/ipldpinner/pin.go b/pinning/pinner/ipldpinner/pin.go deleted file mode 100644 index 5620836988..0000000000 --- a/pinning/pinner/ipldpinner/pin.go +++ /dev/null @@ -1,549 +0,0 @@ -// Package ipldpinner implements structures and methods to keep track of -// which objects a user wants to keep stored locally. This implementation -// stores pin information in a mdag structure. -package ipldpinner - -import ( - "context" - "fmt" - "os" - "sync" - "time" - - cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - ipld "github.com/ipfs/go-ipld-format" - logging "github.com/ipfs/go-log" - "github.com/ipfs/go-merkledag" - mdag "github.com/ipfs/go-merkledag" - "github.com/ipfs/go-merkledag/dagutils" - - ipfspinner "github.com/ipfs/go-ipfs-pinner" -) - -const loadTimeout = 5 * time.Second - -var log = logging.Logger("pin") - -var pinDatastoreKey = ds.NewKey("/local/pins") - -var emptyKey cid.Cid - -var linkDirect, linkRecursive, linkInternal string - -func init() { - e, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") - if err != nil { - log.Error("failed to decode empty key constant") - os.Exit(1) - } - emptyKey = e - - directStr, ok := ipfspinner.ModeToString(ipfspinner.Direct) - if !ok { - panic("could not find Direct pin enum") - } - linkDirect = directStr - - recursiveStr, ok := ipfspinner.ModeToString(ipfspinner.Recursive) - if !ok { - panic("could not find Recursive pin enum") - } - linkRecursive = recursiveStr - - internalStr, ok := ipfspinner.ModeToString(ipfspinner.Internal) - if !ok { - panic("could not find Internal pin enum") - } - linkInternal = internalStr -} - -// pinner implements the Pinner interface -type pinner struct { - lock sync.RWMutex - recursePin *cid.Set - directPin *cid.Set - - // Track the keys used for storing the pinning state, so gc does - // not delete them. - internalPin *cid.Set - dserv ipld.DAGService - internal ipld.DAGService // dagservice used to store internal objects - dstore ds.Datastore -} - -var _ ipfspinner.Pinner = (*pinner)(nil) - -type syncDAGService interface { - ipld.DAGService - Sync() error -} - -// New creates a new pinner using the given datastore as a backend, and loads -// the pinner's keysets from the datastore -func New(dstore ds.Datastore, dserv, internal ipld.DAGService) (*pinner, error) { - rootKey, err := dstore.Get(pinDatastoreKey) - if err != nil { - if err == ds.ErrNotFound { - return &pinner{ - recursePin: cid.NewSet(), - directPin: cid.NewSet(), - internalPin: cid.NewSet(), - dserv: dserv, - internal: internal, - dstore: dstore, - }, nil - } - return nil, err - } - rootCid, err := cid.Cast(rootKey) - if err != nil { - return nil, err - } - - ctx, cancel := context.WithTimeout(context.TODO(), loadTimeout) - defer cancel() - - root, err := internal.Get(ctx, rootCid) - if err != nil { - return nil, fmt.Errorf("cannot find pinning root object: %v", err) - } - - rootpb, ok := root.(*mdag.ProtoNode) - if !ok { - return nil, mdag.ErrNotProtobuf - } - - internalset := cid.NewSet() - internalset.Add(rootCid) - recordInternal := internalset.Add - - // load recursive set - recurseKeys, err := loadSet(ctx, internal, rootpb, linkRecursive, recordInternal) - if err != nil { - return nil, fmt.Errorf("cannot load recursive pins: %v", err) - } - - // load direct set - directKeys, err := loadSet(ctx, internal, rootpb, linkDirect, recordInternal) - if err != nil { - return nil, fmt.Errorf("cannot load direct pins: %v", err) - } - - return &pinner{ - // assign pinsets - recursePin: cidSetWithValues(recurseKeys), - directPin: cidSetWithValues(directKeys), - internalPin: internalset, - // assign services - dserv: dserv, - dstore: dstore, - internal: internal, - }, nil -} - -// LoadKeys reads the pinned CIDs and sends them on the given channel. This is -// used to read pins without loading them all into memory. -func LoadKeys(ctx context.Context, dstore ds.Datastore, dserv, internal ipld.DAGService, recursive bool, keyChan chan<- cid.Cid) error { - rootKey, err := dstore.Get(pinDatastoreKey) - if err != nil { - if err == ds.ErrNotFound { - return nil - } - return err - } - rootCid, err := cid.Cast(rootKey) - if err != nil { - return err - } - - root, err := internal.Get(ctx, rootCid) - if err != nil { - return fmt.Errorf("cannot find pinning root object: %v", err) - } - - rootpb, ok := root.(*mdag.ProtoNode) - if !ok { - return mdag.ErrNotProtobuf - } - - var linkName string - if recursive { - linkName = linkRecursive - } else { - linkName = linkDirect - } - - return loadSetChan(ctx, internal, rootpb, linkName, keyChan) -} - -// Pin the given node, optionally recursive -func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { - err := p.dserv.Add(ctx, node) - if err != nil { - return err - } - - c := node.Cid() - - p.lock.Lock() - defer p.lock.Unlock() - - if recurse { - if p.recursePin.Has(c) { - return nil - } - - p.lock.Unlock() - // temporary unlock to fetch the entire graph - err := mdag.FetchGraph(ctx, c, p.dserv) - p.lock.Lock() - if err != nil { - return err - } - - if p.recursePin.Has(c) { - return nil - } - - if p.directPin.Has(c) { - p.directPin.Remove(c) - } - - p.recursePin.Add(c) - } else { - if p.recursePin.Has(c) { - return fmt.Errorf("%s already pinned recursively", c.String()) - } - - p.directPin.Add(c) - } - return nil -} - -// ErrNotPinned is returned when trying to unpin items which are not pinned. -var ErrNotPinned = fmt.Errorf("not pinned or pinned indirectly") - -// Unpin a given key -func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { - p.lock.Lock() - defer p.lock.Unlock() - if p.recursePin.Has(c) { - if !recursive { - return fmt.Errorf("%s is pinned recursively", c) - } - p.recursePin.Remove(c) - return nil - } - if p.directPin.Has(c) { - p.directPin.Remove(c) - return nil - } - return ErrNotPinned -} - -func (p *pinner) isInternalPin(c cid.Cid) bool { - return p.internalPin.Has(c) -} - -// IsPinned returns whether or not the given key is pinned -// and an explanation of why its pinned -func (p *pinner) IsPinned(ctx context.Context, c cid.Cid) (string, bool, error) { - p.lock.RLock() - defer p.lock.RUnlock() - return p.isPinnedWithType(ctx, c, ipfspinner.Any) -} - -// IsPinnedWithType returns whether or not the given cid is pinned with the -// given pin type, as well as returning the type of pin its pinned with. -func (p *pinner) IsPinnedWithType(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) (string, bool, error) { - p.lock.RLock() - defer p.lock.RUnlock() - return p.isPinnedWithType(ctx, c, mode) -} - -// isPinnedWithType is the implementation of IsPinnedWithType that does not lock. -// intended for use by other pinned methods that already take locks -func (p *pinner) isPinnedWithType(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) (string, bool, error) { - switch mode { - case ipfspinner.Any, ipfspinner.Direct, ipfspinner.Indirect, ipfspinner.Recursive, ipfspinner.Internal: - default: - err := fmt.Errorf("invalid Pin Mode '%d', must be one of {%d, %d, %d, %d, %d}", - mode, ipfspinner.Direct, ipfspinner.Indirect, ipfspinner.Recursive, ipfspinner.Internal, ipfspinner.Any) - return "", false, err - } - if (mode == ipfspinner.Recursive || mode == ipfspinner.Any) && p.recursePin.Has(c) { - return linkRecursive, true, nil - } - if mode == ipfspinner.Recursive { - return "", false, nil - } - - if (mode == ipfspinner.Direct || mode == ipfspinner.Any) && p.directPin.Has(c) { - return linkDirect, true, nil - } - if mode == ipfspinner.Direct { - return "", false, nil - } - - if (mode == ipfspinner.Internal || mode == ipfspinner.Any) && p.isInternalPin(c) { - return linkInternal, true, nil - } - if mode == ipfspinner.Internal { - return "", false, nil - } - - // Default is Indirect - visitedSet := cid.NewSet() - for _, rc := range p.recursePin.Keys() { - has, err := hasChild(ctx, p.dserv, rc, c, visitedSet.Visit) - if err != nil { - return "", false, err - } - if has { - return rc.String(), true, nil - } - } - return "", false, nil -} - -// CheckIfPinned Checks if a set of keys are pinned, more efficient than -// calling IsPinned for each key, returns the pinned status of cid(s) -func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinner.Pinned, error) { - p.lock.RLock() - defer p.lock.RUnlock() - pinned := make([]ipfspinner.Pinned, 0, len(cids)) - toCheck := cid.NewSet() - - // First check for non-Indirect pins directly - for _, c := range cids { - if p.recursePin.Has(c) { - pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Recursive}) - } else if p.directPin.Has(c) { - pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Direct}) - } else if p.isInternalPin(c) { - pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Internal}) - } else { - toCheck.Add(c) - } - } - - // Now walk all recursive pins to check for indirect pins - visited := cid.NewSet() - for _, rk := range p.recursePin.Keys() { - err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(p.dserv), rk, func(c cid.Cid) bool { - if toCheck.Len() == 0 || !visited.Visit(c) { - return false - } - - if toCheck.Has(c) { - pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk}) - toCheck.Remove(c) - } - - return true - }, merkledag.Concurrent()) - if err != nil { - return nil, err - } - if toCheck.Len() == 0 { - break - } - } - - // Anything left in toCheck is not pinned - for _, k := range toCheck.Keys() { - pinned = append(pinned, ipfspinner.Pinned{Key: k, Mode: ipfspinner.NotPinned}) - } - - return pinned, nil -} - -// RemovePinWithMode is for manually editing the pin structure. -// Use with care! If used improperly, garbage collection may not -// be successful. -func (p *pinner) RemovePinWithMode(c cid.Cid, mode ipfspinner.Mode) { - p.lock.Lock() - defer p.lock.Unlock() - switch mode { - case ipfspinner.Direct: - p.directPin.Remove(c) - case ipfspinner.Recursive: - p.recursePin.Remove(c) - default: - // programmer error, panic OK - panic("unrecognized pin type") - } -} - -func cidSetWithValues(cids []cid.Cid) *cid.Set { - out := cid.NewSet() - for _, c := range cids { - out.Add(c) - } - return out -} - -// DirectKeys returns a slice containing the directly pinned keys -func (p *pinner) DirectKeys(ctx context.Context) ([]cid.Cid, error) { - p.lock.RLock() - defer p.lock.RUnlock() - - return p.directPin.Keys(), nil -} - -// RecursiveKeys returns a slice containing the recursively pinned keys -func (p *pinner) RecursiveKeys(ctx context.Context) ([]cid.Cid, error) { - p.lock.RLock() - defer p.lock.RUnlock() - - return p.recursePin.Keys(), nil -} - -// Update updates a recursive pin from one cid to another -// this is more efficient than simply pinning the new one and unpinning the -// old one -func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error { - if from == to { - // Nothing to do. Don't remove this check or we'll end up - // _removing_ the pin. - // - // See #6648 - return nil - } - - p.lock.Lock() - defer p.lock.Unlock() - - if !p.recursePin.Has(from) { - return fmt.Errorf("'from' cid was not recursively pinned already") - } - - // Temporarily unlock while we fetch the differences. - p.lock.Unlock() - err := dagutils.DiffEnumerate(ctx, p.dserv, from, to) - p.lock.Lock() - - if err != nil { - return err - } - - p.recursePin.Add(to) - if unpin { - p.recursePin.Remove(from) - } - return nil -} - -// Flush encodes and writes pinner keysets to the datastore -func (p *pinner) Flush(ctx context.Context) error { - p.lock.Lock() - defer p.lock.Unlock() - - internalset := cid.NewSet() - recordInternal := internalset.Add - - root := &mdag.ProtoNode{} - { - n, err := storeSet(ctx, p.internal, p.directPin.Keys(), recordInternal) - if err != nil { - return err - } - if err := root.AddNodeLink(linkDirect, n); err != nil { - return err - } - } - - { - n, err := storeSet(ctx, p.internal, p.recursePin.Keys(), recordInternal) - if err != nil { - return err - } - if err := root.AddNodeLink(linkRecursive, n); err != nil { - return err - } - } - - // add the empty node, its referenced by the pin sets but never created - err := p.internal.Add(ctx, new(mdag.ProtoNode)) - if err != nil { - return err - } - - err = p.internal.Add(ctx, root) - if err != nil { - return err - } - - k := root.Cid() - - internalset.Add(k) - - if syncDServ, ok := p.dserv.(syncDAGService); ok { - if err := syncDServ.Sync(); err != nil { - return fmt.Errorf("cannot sync pinned data: %v", err) - } - } - - if syncInternal, ok := p.internal.(syncDAGService); ok { - if err := syncInternal.Sync(); err != nil { - return fmt.Errorf("cannot sync pinning data: %v", err) - } - } - - if err := p.dstore.Put(pinDatastoreKey, k.Bytes()); err != nil { - return fmt.Errorf("cannot store pin state: %v", err) - } - if err := p.dstore.Sync(pinDatastoreKey); err != nil { - return fmt.Errorf("cannot sync pin state: %v", err) - } - p.internalPin = internalset - return nil -} - -// InternalPins returns all cids kept pinned for the internal state of the -// pinner -func (p *pinner) InternalPins(ctx context.Context) ([]cid.Cid, error) { - p.lock.Lock() - defer p.lock.Unlock() - return p.internalPin.Keys(), nil -} - -// PinWithMode allows the user to have fine grained control over pin -// counts -func (p *pinner) PinWithMode(c cid.Cid, mode ipfspinner.Mode) { - p.lock.Lock() - defer p.lock.Unlock() - switch mode { - case ipfspinner.Recursive: - p.recursePin.Add(c) - case ipfspinner.Direct: - p.directPin.Add(c) - } -} - -// hasChild recursively looks for a Cid among the children of a root Cid. -// The visit function can be used to shortcut already-visited branches. -func hasChild(ctx context.Context, ng ipld.NodeGetter, root cid.Cid, child cid.Cid, visit func(cid.Cid) bool) (bool, error) { - links, err := ipld.GetLinks(ctx, ng, root) - if err != nil { - return false, err - } - for _, lnk := range links { - c := lnk.Cid - if lnk.Cid.Equals(child) { - return true, nil - } - if visit(c) { - has, err := hasChild(ctx, ng, c, child, visit) - if err != nil { - return false, err - } - - if has { - return has, nil - } - } - } - return false, nil -} diff --git a/pinning/pinner/ipldpinner/pin_test.go b/pinning/pinner/ipldpinner/pin_test.go deleted file mode 100644 index 3c61d41fd2..0000000000 --- a/pinning/pinner/ipldpinner/pin_test.go +++ /dev/null @@ -1,526 +0,0 @@ -package ipldpinner - -import ( - "context" - "io" - "testing" - "time" - - bs "github.com/ipfs/go-blockservice" - mdag "github.com/ipfs/go-merkledag" - - cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" - blockstore "github.com/ipfs/go-ipfs-blockstore" - offline "github.com/ipfs/go-ipfs-exchange-offline" - pin "github.com/ipfs/go-ipfs-pinner" - util "github.com/ipfs/go-ipfs-util" -) - -var rand = util.NewTimeSeededRand() - -func randNode() (*mdag.ProtoNode, cid.Cid) { - nd := new(mdag.ProtoNode) - nd.SetData(make([]byte, 32)) - _, err := io.ReadFull(rand, nd.Data()) - if err != nil { - panic(err) - } - k := nd.Cid() - return nd, k -} - -func assertPinned(t *testing.T, p pin.Pinner, c cid.Cid, failmsg string) { - _, pinned, err := p.IsPinned(context.Background(), c) - if err != nil { - t.Fatal(err) - } - - if !pinned { - t.Fatal(failmsg) - } -} - -func assertUnpinned(t *testing.T, p pin.Pinner, c cid.Cid, failmsg string) { - _, pinned, err := p.IsPinned(context.Background(), c) - if err != nil { - t.Fatal(err) - } - - if pinned { - t.Fatal(failmsg) - } -} - -func TestPinnerBasic(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - - dserv := mdag.NewDAGService(bserv) - - p, err := New(dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - - a, ak := randNode() - err = dserv.Add(ctx, a) - if err != nil { - t.Fatal(err) - } - - // Pin A{} - err = p.Pin(ctx, a, false) - if err != nil { - t.Fatal(err) - } - - assertPinned(t, p, ak, "Failed to find key") - - // create new node c, to be indirectly pinned through b - c, _ := randNode() - err = dserv.Add(ctx, c) - if err != nil { - t.Fatal(err) - } - ck := c.Cid() - - // Create new node b, to be parent to a and c - b, _ := randNode() - err = b.AddNodeLink("child", a) - if err != nil { - t.Fatal(err) - } - - err = b.AddNodeLink("otherchild", c) - if err != nil { - t.Fatal(err) - } - - err = dserv.Add(ctx, b) - if err != nil { - t.Fatal(err) - } - bk := b.Cid() - - // recursively pin B{A,C} - err = p.Pin(ctx, b, true) - if err != nil { - t.Fatal(err) - } - - assertPinned(t, p, ck, "child of recursively pinned node not found") - - assertPinned(t, p, bk, "Recursively pinned node not found..") - - d, _ := randNode() - _ = d.AddNodeLink("a", a) - _ = d.AddNodeLink("c", c) - - e, _ := randNode() - _ = d.AddNodeLink("e", e) - - // Must be in dagserv for unpin to work - err = dserv.Add(ctx, e) - if err != nil { - t.Fatal(err) - } - err = dserv.Add(ctx, d) - if err != nil { - t.Fatal(err) - } - - // Add D{A,C,E} - err = p.Pin(ctx, d, true) - if err != nil { - t.Fatal(err) - } - - dk := d.Cid() - assertPinned(t, p, dk, "pinned node not found.") - - // Test recursive unpin - err = p.Unpin(ctx, dk, true) - if err != nil { - t.Fatal(err) - } - - err = p.Flush(ctx) - if err != nil { - t.Fatal(err) - } - - np, err := New(dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - - // Test directly pinned - assertPinned(t, np, ak, "Could not find pinned node!") - - // Test recursively pinned - assertPinned(t, np, bk, "could not find recursively pinned node") - - // Test that LoadKeys returns the expected CIDs. - keyChan := make(chan cid.Cid) - go func() { - err = LoadKeys(ctx, dstore, dserv, dserv, true, keyChan) - close(keyChan) - }() - keys := map[cid.Cid]struct{}{} - for c := range keyChan { - keys[c] = struct{}{} - } - if err != nil { - t.Fatal(err) - } - recKeys, _ := np.RecursiveKeys(ctx) - if len(keys) != len(recKeys) { - t.Fatal("wrong number of recursive keys from LoadKeys") - } - for _, k := range recKeys { - if _, ok := keys[k]; !ok { - t.Fatal("LoadKeys did not return correct recursive keys") - } - } - - keyChan = make(chan cid.Cid) - go func() { - err = LoadKeys(ctx, dstore, dserv, dserv, false, keyChan) - close(keyChan) - }() - keys = map[cid.Cid]struct{}{} - for c := range keyChan { - keys[c] = struct{}{} - } - if err != nil { - t.Fatal(err) - } - dirKeys, _ := np.DirectKeys(ctx) - if len(keys) != len(dirKeys) { - t.Fatal("wrong number of direct keys from LoadKeys") - } - for _, k := range dirKeys { - if _, ok := keys[k]; !ok { - t.Fatal("LoadKeys did not return correct direct keys") - } - } - - cancel() - emptyDS := dssync.MutexWrap(ds.NewMapDatastore()) - - // Check key not in datastore - err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil) - if err != nil { - t.Fatal(err) - } - - // Check error on bad key - if err = emptyDS.Put(pinDatastoreKey, []byte("bad-cid")); err != nil { - panic(err) - } - if err = emptyDS.Sync(pinDatastoreKey); err != nil { - panic(err) - } - if err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil); err == nil { - t.Fatal("expected error") - } - - // Lookup dag that does not exist - noKey, err := cid.Decode("QmYff9iHR1Hz6wufVeJodzXqQm4pkK4QNS9ms8tyPKVWm1") - if err != nil { - panic(err) - } - if err = emptyDS.Put(pinDatastoreKey, noKey.Bytes()); err != nil { - panic(err) - } - if err = emptyDS.Sync(pinDatastoreKey); err != nil { - panic(err) - } - err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil) - if err == nil || err.Error() != "cannot find pinning root object: merkledag: not found" { - t.Fatal("did not get expected error") - } - - // Check error when node has no links - if err = emptyDS.Put(pinDatastoreKey, emptyKey.Bytes()); err != nil { - panic(err) - } - if err = emptyDS.Sync(pinDatastoreKey); err != nil { - panic(err) - } - if err = LoadKeys(ctx, emptyDS, dserv, dserv, true, nil); err == nil { - t.Fatal("expected error") - } -} - -func TestIsPinnedLookup(t *testing.T) { - // We are going to test that lookups work in pins which share - // the same branches. For that we will construct this tree: - // - // A5->A4->A3->A2->A1->A0 - // / / - // B------- / - // \ / - // C--------------- - // - // We will ensure that IsPinned works for all objects both when they - // are pinned and once they have been unpinned. - aBranchLen := 6 - if aBranchLen < 3 { - t.Fatal("set aBranchLen to at least 3") - } - - ctx := context.Background() - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - - dserv := mdag.NewDAGService(bserv) - - // TODO does pinner need to share datastore with blockservice? - p, err := New(dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - - aNodes := make([]*mdag.ProtoNode, aBranchLen) - aKeys := make([]cid.Cid, aBranchLen) - for i := 0; i < aBranchLen; i++ { - a, _ := randNode() - if i >= 1 { - err := a.AddNodeLink("child", aNodes[i-1]) - if err != nil { - t.Fatal(err) - } - } - - err := dserv.Add(ctx, a) - if err != nil { - t.Fatal(err) - } - //t.Logf("a[%d] is %s", i, ak) - aNodes[i] = a - aKeys[i] = a.Cid() - } - - // Pin A5 recursively - if err := p.Pin(ctx, aNodes[aBranchLen-1], true); err != nil { - t.Fatal(err) - } - - // Create node B and add A3 as child - b, _ := randNode() - if err := b.AddNodeLink("mychild", aNodes[3]); err != nil { - t.Fatal(err) - } - - // Create C node - c, _ := randNode() - // Add A0 as child of C - if err := c.AddNodeLink("child", aNodes[0]); err != nil { - t.Fatal(err) - } - - // Add C - err = dserv.Add(ctx, c) - if err != nil { - t.Fatal(err) - } - ck := c.Cid() - //t.Logf("C is %s", ck) - - // Add C to B and Add B - if err := b.AddNodeLink("myotherchild", c); err != nil { - t.Fatal(err) - } - err = dserv.Add(ctx, b) - if err != nil { - t.Fatal(err) - } - bk := b.Cid() - //t.Logf("B is %s", bk) - - // Pin C recursively - - if err := p.Pin(ctx, c, true); err != nil { - t.Fatal(err) - } - - // Pin B recursively - - if err := p.Pin(ctx, b, true); err != nil { - t.Fatal(err) - } - - assertPinned(t, p, aKeys[0], "A0 should be pinned") - assertPinned(t, p, aKeys[1], "A1 should be pinned") - assertPinned(t, p, ck, "C should be pinned") - assertPinned(t, p, bk, "B should be pinned") - - // Unpin A5 recursively - if err := p.Unpin(ctx, aKeys[5], true); err != nil { - t.Fatal(err) - } - - assertPinned(t, p, aKeys[0], "A0 should still be pinned through B") - assertUnpinned(t, p, aKeys[4], "A4 should be unpinned") - - // Unpin B recursively - if err := p.Unpin(ctx, bk, true); err != nil { - t.Fatal(err) - } - assertUnpinned(t, p, bk, "B should be unpinned") - assertUnpinned(t, p, aKeys[1], "A1 should be unpinned") - assertPinned(t, p, aKeys[0], "A0 should still be pinned through C") -} - -func TestDuplicateSemantics(t *testing.T) { - ctx := context.Background() - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - - dserv := mdag.NewDAGService(bserv) - - p, err := New(dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - - a, _ := randNode() - err = dserv.Add(ctx, a) - if err != nil { - t.Fatal(err) - } - - // pin is recursively - err = p.Pin(ctx, a, true) - if err != nil { - t.Fatal(err) - } - - // pinning directly should fail - err = p.Pin(ctx, a, false) - if err == nil { - t.Fatal("expected direct pin to fail") - } - - // pinning recursively again should succeed - err = p.Pin(ctx, a, true) - if err != nil { - t.Fatal(err) - } -} - -func TestFlush(t *testing.T) { - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - - dserv := mdag.NewDAGService(bserv) - p, err := New(dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - _, k := randNode() - - p.PinWithMode(k, pin.Recursive) - if err := p.Flush(context.Background()); err != nil { - t.Fatal(err) - } - assertPinned(t, p, k, "expected key to still be pinned") -} - -func TestPinRecursiveFail(t *testing.T) { - ctx := context.Background() - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - dserv := mdag.NewDAGService(bserv) - - p, err := New(dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - - a, _ := randNode() - b, _ := randNode() - err = a.AddNodeLink("child", b) - if err != nil { - t.Fatal(err) - } - - // NOTE: This isnt a time based test, we expect the pin to fail - mctx, cancel := context.WithTimeout(ctx, time.Millisecond) - defer cancel() - - err = p.Pin(mctx, a, true) - if err == nil { - t.Fatal("should have failed to pin here") - } - - err = dserv.Add(ctx, b) - if err != nil { - t.Fatal(err) - } - - err = dserv.Add(ctx, a) - if err != nil { - t.Fatal(err) - } - - // this one is time based... but shouldnt cause any issues - mctx, cancel = context.WithTimeout(ctx, time.Second) - defer cancel() - err = p.Pin(mctx, a, true) - if err != nil { - t.Fatal(err) - } -} - -func TestPinUpdate(t *testing.T) { - ctx := context.Background() - - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - - dserv := mdag.NewDAGService(bserv) - p, err := New(dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - n1, c1 := randNode() - n2, c2 := randNode() - - if err := dserv.Add(ctx, n1); err != nil { - t.Fatal(err) - } - if err := dserv.Add(ctx, n2); err != nil { - t.Fatal(err) - } - - if err := p.Pin(ctx, n1, true); err != nil { - t.Fatal(err) - } - - if err := p.Update(ctx, c1, c2, true); err != nil { - t.Fatal(err) - } - - assertPinned(t, p, c2, "c2 should be pinned now") - assertUnpinned(t, p, c1, "c1 should no longer be pinned") - - if err := p.Update(ctx, c2, c1, false); err != nil { - t.Fatal(err) - } - - assertPinned(t, p, c2, "c2 should be pinned still") - assertPinned(t, p, c1, "c1 should be pinned now") -} diff --git a/pinning/pinner/ipldpinner/set.go b/pinning/pinner/ipldpinner/set.go deleted file mode 100644 index 51951a2c01..0000000000 --- a/pinning/pinner/ipldpinner/set.go +++ /dev/null @@ -1,334 +0,0 @@ -package ipldpinner - -import ( - "bytes" - "context" - "encoding/binary" - "errors" - "fmt" - "hash/fnv" - "sort" - - "github.com/gogo/protobuf/proto" - cid "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" - "github.com/ipfs/go-merkledag" - - "github.com/ipfs/go-ipfs-pinner/internal/pb" -) - -const ( - // defaultFanout specifies the default number of fan-out links per layer - defaultFanout = 256 - - // maxItems is the maximum number of items that will fit in a single bucket - maxItems = 8192 -) - -func hash(seed uint32, c cid.Cid) uint32 { - var buf [4]byte - binary.LittleEndian.PutUint32(buf[:], seed) - h := fnv.New32a() - _, _ = h.Write(buf[:]) - _, _ = h.Write(c.Bytes()) - return h.Sum32() -} - -type itemIterator func() (c cid.Cid, ok bool) - -type keyObserver func(cid.Cid) - -type sortByHash struct { - links []*ipld.Link -} - -func (s sortByHash) Len() int { - return len(s.links) -} - -func (s sortByHash) Less(a, b int) bool { - return bytes.Compare(s.links[a].Cid.Bytes(), s.links[b].Cid.Bytes()) == -1 -} - -func (s sortByHash) Swap(a, b int) { - s.links[a], s.links[b] = s.links[b], s.links[a] -} - -func storeItems(ctx context.Context, dag ipld.DAGService, estimatedLen uint64, depth uint32, iter itemIterator, internalKeys keyObserver) (*merkledag.ProtoNode, error) { - // Each node wastes up to defaultFanout in empty links. - var leafLinks uint64 - if estimatedLen < maxItems { - leafLinks = estimatedLen - } - links := make([]*ipld.Link, defaultFanout, defaultFanout+leafLinks) - for i := 0; i < defaultFanout; i++ { - links[i] = &ipld.Link{Cid: emptyKey} - } - - // add emptyKey to our set of internal pinset objects - n := &merkledag.ProtoNode{} - n.SetLinks(links) - - internalKeys(emptyKey) - - hdr := &pb.Set{ - Version: 1, - Fanout: defaultFanout, - Seed: depth, - } - if err := writeHdr(n, hdr); err != nil { - return nil, err - } - - if estimatedLen < maxItems { - // it'll probably fit - links := n.Links() - for i := 0; i < maxItems; i++ { - k, ok := iter() - if !ok { - // all done - break - } - - links = append(links, &ipld.Link{Cid: k}) - } - - n.SetLinks(links) - - // sort by hash, also swap item Data - s := sortByHash{ - links: n.Links()[defaultFanout:], - } - sort.Stable(s) - } - - var hashed [][]cid.Cid - for { - // This loop essentially enumerates every single item in the set - // and maps them all into a set of buckets. Each bucket will be recursively - // turned into its own sub-set, and so on down the chain. Each sub-set - // gets added to the dagservice, and put into its place in a set nodes - // links array. - // - // Previously, the bucket was selected by taking an int32 from the hash of - // the input key + seed. This was erroneous as we would later be assigning - // the created sub-sets into an array of length 256 by the modulus of the - // int32 hash value with 256. This resulted in overwriting existing sub-sets - // and losing pins. The fix (a few lines down from this comment), is to - // map the hash value down to the 8 bit keyspace here while creating the - // buckets. This way, we avoid any overlapping later on. - k, ok := iter() - if !ok { - break - } - if hashed == nil { - hashed = make([][]cid.Cid, defaultFanout) - } - h := hash(depth, k) % defaultFanout - hashed[h] = append(hashed[h], k) - } - - for h, items := range hashed { - if len(items) == 0 { - // recursion base case - continue - } - - childIter := getCidListIterator(items) - - // recursively create a pinset from the items for this bucket index - child, err := storeItems(ctx, dag, uint64(len(items)), depth+1, childIter, internalKeys) - if err != nil { - return nil, err - } - - size, err := child.Size() - if err != nil { - return nil, err - } - - err = dag.Add(ctx, child) - if err != nil { - return nil, err - } - childKey := child.Cid() - - internalKeys(childKey) - - // overwrite the 'empty key' in the existing links array - n.Links()[h] = &ipld.Link{ - Cid: childKey, - Size: size, - } - } - return n, nil -} - -func readHdr(n *merkledag.ProtoNode) (*pb.Set, error) { - hdrLenRaw, consumed := binary.Uvarint(n.Data()) - if consumed <= 0 { - return nil, errors.New("invalid Set header length") - } - - pbdata := n.Data()[consumed:] - if hdrLenRaw > uint64(len(pbdata)) { - return nil, errors.New("impossibly large Set header length") - } - // as hdrLenRaw was <= an int, we now know it fits in an int - hdrLen := int(hdrLenRaw) - var hdr pb.Set - if err := proto.Unmarshal(pbdata[:hdrLen], &hdr); err != nil { - return nil, err - } - - if v := hdr.GetVersion(); v != 1 { - return nil, fmt.Errorf("unsupported Set version: %d", v) - } - if uint64(hdr.GetFanout()) > uint64(len(n.Links())) { - return nil, errors.New("impossibly large Fanout") - } - return &hdr, nil -} - -func writeHdr(n *merkledag.ProtoNode, hdr *pb.Set) error { - hdrData, err := proto.Marshal(hdr) - if err != nil { - return err - } - - // make enough space for the length prefix and the marshaled header data - data := make([]byte, binary.MaxVarintLen64, binary.MaxVarintLen64+len(hdrData)) - - // write the uvarint length of the header data - uvarlen := binary.PutUvarint(data, uint64(len(hdrData))) - - // append the actual protobuf data *after* the length value we wrote - data = append(data[:uvarlen], hdrData...) - - n.SetData(data) - return nil -} - -type walkerFunc func(idx int, link *ipld.Link) error - -func walkItems(ctx context.Context, dag ipld.DAGService, n *merkledag.ProtoNode, fn walkerFunc, children keyObserver) error { - hdr, err := readHdr(n) - if err != nil { - return err - } - // readHdr guarantees fanout is a safe value - fanout := hdr.GetFanout() - for i, l := range n.Links()[fanout:] { - if err = fn(i, l); err != nil { - return err - } - } - for _, l := range n.Links()[:fanout] { - c := l.Cid - if children != nil { - children(c) - } - if c.Equals(emptyKey) { - continue - } - subtree, err := l.GetNode(ctx, dag) - if err != nil { - return err - } - - stpb, ok := subtree.(*merkledag.ProtoNode) - if !ok { - return merkledag.ErrNotProtobuf - } - - if err = walkItems(ctx, dag, stpb, fn, children); err != nil { - return err - } - } - return nil -} - -func loadSet(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode, name string, internalKeys keyObserver) ([]cid.Cid, error) { - l, err := root.GetNodeLink(name) - if err != nil { - return nil, err - } - - lnkc := l.Cid - internalKeys(lnkc) - - n, err := l.GetNode(ctx, dag) - if err != nil { - return nil, err - } - - pbn, ok := n.(*merkledag.ProtoNode) - if !ok { - return nil, merkledag.ErrNotProtobuf - } - - var res []cid.Cid - walk := func(idx int, link *ipld.Link) error { - res = append(res, link.Cid) - return nil - } - - if err := walkItems(ctx, dag, pbn, walk, internalKeys); err != nil { - return nil, err - } - return res, nil -} - -func loadSetChan(ctx context.Context, dag ipld.DAGService, root *merkledag.ProtoNode, name string, keyChan chan<- cid.Cid) error { - l, err := root.GetNodeLink(name) - if err != nil { - return err - } - - n, err := l.GetNode(ctx, dag) - if err != nil { - return err - } - - pbn, ok := n.(*merkledag.ProtoNode) - if !ok { - return merkledag.ErrNotProtobuf - } - - walk := func(idx int, link *ipld.Link) error { - keyChan <- link.Cid - return nil - } - - if err = walkItems(ctx, dag, pbn, walk, nil); err != nil { - return err - } - return nil -} - -func getCidListIterator(cids []cid.Cid) itemIterator { - return func() (c cid.Cid, ok bool) { - if len(cids) == 0 { - return cid.Cid{}, false - } - - first := cids[0] - cids = cids[1:] - return first, true - } -} - -func storeSet(ctx context.Context, dag ipld.DAGService, cids []cid.Cid, internalKeys keyObserver) (*merkledag.ProtoNode, error) { - iter := getCidListIterator(cids) - - n, err := storeItems(ctx, dag, uint64(len(cids)), 0, iter, internalKeys) - if err != nil { - return nil, err - } - err = dag.Add(ctx, n) - if err != nil { - return nil, err - } - internalKeys(n.Cid()) - return n, nil -} diff --git a/pinning/pinner/ipldpinner/set_test.go b/pinning/pinner/ipldpinner/set_test.go deleted file mode 100644 index 0f32e6b5e3..0000000000 --- a/pinning/pinner/ipldpinner/set_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package ipldpinner - -import ( - "context" - "encoding/binary" - "testing" - - bserv "github.com/ipfs/go-blockservice" - cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - dsq "github.com/ipfs/go-datastore/query" - blockstore "github.com/ipfs/go-ipfs-blockstore" - offline "github.com/ipfs/go-ipfs-exchange-offline" - dag "github.com/ipfs/go-merkledag" -) - -func ignoreCids(_ cid.Cid) {} - -func objCount(d ds.Datastore) int { - q := dsq.Query{KeysOnly: true} - res, err := d.Query(q) - if err != nil { - panic(err) - } - - var count int - for { - _, ok := res.NextSync() - if !ok { - break - } - - count++ - } - return count -} - -func TestSet(t *testing.T) { - dst := ds.NewMapDatastore() - bstore := blockstore.NewBlockstore(dst) - ds := dag.NewDAGService(bserv.New(bstore, offline.Exchange(bstore))) - - // this value triggers the creation of a recursive shard. - // If the recursive sharding is done improperly, this will result in - // an infinite recursion and crash (OOM) - limit := uint32((defaultFanout * maxItems) + 1) - - var inputs []cid.Cid - buf := make([]byte, 4) - for i := uint32(0); i < limit; i++ { - binary.BigEndian.PutUint32(buf, i) - c := dag.NewRawNode(buf).Cid() - inputs = append(inputs, c) - } - - _, err := storeSet(context.Background(), ds, inputs[:len(inputs)-1], ignoreCids) - if err != nil { - t.Fatal(err) - } - - objs1 := objCount(dst) - - out, err := storeSet(context.Background(), ds, inputs, ignoreCids) - if err != nil { - t.Fatal(err) - } - - objs2 := objCount(dst) - if objs2-objs1 > 2 { - t.Fatal("set sharding does not appear to be deterministic") - } - - // weird wrapper node because loadSet expects us to pass an - // object pointing to multiple named sets - setroot := &dag.ProtoNode{} - err = setroot.AddNodeLink("foo", out) - if err != nil { - t.Fatal(err) - } - - outset, err := loadSet(context.Background(), ds, setroot, "foo", ignoreCids) - if err != nil { - t.Fatal(err) - } - - if uint32(len(outset)) != limit { - t.Fatal("got wrong number", len(outset), limit) - } - - seen := cid.NewSet() - for _, c := range outset { - seen.Add(c) - } - - for _, c := range inputs { - if !seen.Has(c) { - t.Fatalf("expected to have '%s', didnt find it", c) - } - } -} diff --git a/pinning/pinner/pinconv/pinconv.go b/pinning/pinner/pinconv/pinconv.go deleted file mode 100644 index df21f85b03..0000000000 --- a/pinning/pinner/pinconv/pinconv.go +++ /dev/null @@ -1,127 +0,0 @@ -// Package pinconv converts pins between the dag-based ipldpinner and the -// datastore-based dspinner. Once conversion is complete, the pins from the -// source pinner are removed. -package pinconv - -import ( - "context" - "fmt" - - cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - ipfspinner "github.com/ipfs/go-ipfs-pinner" - "github.com/ipfs/go-ipfs-pinner/dspinner" - "github.com/ipfs/go-ipfs-pinner/ipldpinner" - ipld "github.com/ipfs/go-ipld-format" -) - -// ConvertPinsFromIPLDToDS converts pins stored in mdag based storage to pins -// stores in the datastore. Returns a dspinner loaded with the converted pins, -// and a count of the recursive and direct pins converted. -// -// After pins are stored in datastore, the root pin key is deleted to unlink -// the pin data in the DAGService. -func ConvertPinsFromIPLDToDS(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService, internal ipld.DAGService) (ipfspinner.Pinner, int, error) { - const ipldPinPath = "/local/pins" - - dsPinner, err := dspinner.New(ctx, dstore, dserv) - if err != nil { - return nil, 0, err - } - - var convCount int - keyChan := make(chan cid.Cid) - - go func() { - err = ipldpinner.LoadKeys(ctx, dstore, dserv, internal, true, keyChan) - close(keyChan) - }() - for key := range keyChan { - dsPinner.PinWithMode(key, ipfspinner.Recursive) - convCount++ - } - if err != nil { - return nil, 0, fmt.Errorf("cannot load recursive keys: %s", err) - } - - keyChan = make(chan cid.Cid) - go func() { - err = ipldpinner.LoadKeys(ctx, dstore, dserv, internal, false, keyChan) - close(keyChan) - }() - for key := range keyChan { - dsPinner.PinWithMode(key, ipfspinner.Direct) - convCount++ - } - if err != nil { - return nil, 0, fmt.Errorf("cannot load direct keys: %s", err) - } - - err = dsPinner.Flush(ctx) - if err != nil { - return nil, 0, err - } - - // Delete root mdag key from datastore to remove old pin storage. - ipldPinDatastoreKey := ds.NewKey(ipldPinPath) - if err = dstore.Delete(ipldPinDatastoreKey); err != nil { - return nil, 0, fmt.Errorf("cannot delete old pin state: %v", err) - } - if err = dstore.Sync(ipldPinDatastoreKey); err != nil { - return nil, 0, fmt.Errorf("cannot sync old pin state: %v", err) - } - - return dsPinner, convCount, nil -} - -// ConvertPinsFromDSToIPLD converts the pins stored in the datastore by -// dspinner, into pins stored in the given internal DAGService by ipldpinner. -// Returns an ipldpinner loaded with the converted pins, and a count of the -// recursive and direct pins converted. -// -// After the pins are stored in the DAGService, the pins and their indexes are -// removed from the dspinner. -func ConvertPinsFromDSToIPLD(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService, internal ipld.DAGService) (ipfspinner.Pinner, int, error) { - dsPinner, err := dspinner.New(ctx, dstore, dserv) - if err != nil { - return nil, 0, err - } - - ipldPinner, err := ipldpinner.New(dstore, dserv, internal) - if err != nil { - return nil, 0, err - } - - cids, err := dsPinner.RecursiveKeys(ctx) - if err != nil { - return nil, 0, err - } - for i := range cids { - ipldPinner.PinWithMode(cids[i], ipfspinner.Recursive) - dsPinner.RemovePinWithMode(cids[i], ipfspinner.Recursive) - } - convCount := len(cids) - - cids, err = dsPinner.DirectKeys(ctx) - if err != nil { - return nil, 0, err - } - for i := range cids { - ipldPinner.PinWithMode(cids[i], ipfspinner.Direct) - dsPinner.RemovePinWithMode(cids[i], ipfspinner.Direct) - } - convCount += len(cids) - - // Save the ipldpinner pins - err = ipldPinner.Flush(ctx) - if err != nil { - return nil, 0, err - } - - err = dsPinner.Flush(ctx) - if err != nil { - return nil, 0, err - } - - return ipldPinner, convCount, nil -} diff --git a/pinning/pinner/pinconv/pinconv_test.go b/pinning/pinner/pinconv/pinconv_test.go deleted file mode 100644 index 02abca61cd..0000000000 --- a/pinning/pinner/pinconv/pinconv_test.go +++ /dev/null @@ -1,179 +0,0 @@ -package pinconv - -import ( - "context" - "errors" - "io" - "strings" - "testing" - - bs "github.com/ipfs/go-blockservice" - cid "github.com/ipfs/go-cid" - ds "github.com/ipfs/go-datastore" - lds "github.com/ipfs/go-ds-leveldb" - blockstore "github.com/ipfs/go-ipfs-blockstore" - offline "github.com/ipfs/go-ipfs-exchange-offline" - ipfspin "github.com/ipfs/go-ipfs-pinner" - "github.com/ipfs/go-ipfs-pinner/dspinner" - util "github.com/ipfs/go-ipfs-util" - ipld "github.com/ipfs/go-ipld-format" - mdag "github.com/ipfs/go-merkledag" -) - -var rand = util.NewTimeSeededRand() - -type batchWrap struct { - ds.Datastore -} - -func randNode() (*mdag.ProtoNode, cid.Cid) { - nd := new(mdag.ProtoNode) - nd.SetData(make([]byte, 32)) - _, err := io.ReadFull(rand, nd.Data()) - if err != nil { - panic(err) - } - k := nd.Cid() - return nd, k -} - -func (d *batchWrap) Batch() (ds.Batch, error) { - return ds.NewBasicBatch(d), nil -} - -func makeStore() (ds.Datastore, ipld.DAGService) { - ldstore, err := lds.NewDatastore("", nil) - if err != nil { - panic(err) - } - var dstore ds.Batching - dstore = &batchWrap{ldstore} - - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - dserv := mdag.NewDAGService(bserv) - return dstore, dserv -} - -func TestConversions(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - dstore, dserv := makeStore() - - dsPinner, err := dspinner.New(ctx, dstore, dserv) - if err != nil { - t.Fatal(err) - } - - a, ak := randNode() - err = dsPinner.Pin(ctx, a, false) - if err != nil { - t.Fatal(err) - } - - // create new node c, to be indirectly pinned through b - c, ck := randNode() - dserv.Add(ctx, c) - - // Create new node b, to be parent to a and c - b, _ := randNode() - b.AddNodeLink("child", a) - b.AddNodeLink("otherchild", c) - bk := b.Cid() // CID changed after adding links - - // recursively pin B{A,C} - err = dsPinner.Pin(ctx, b, true) - if err != nil { - t.Fatal(err) - } - - err = dsPinner.Flush(ctx) - if err != nil { - t.Fatal(err) - } - - verifyPins := func(pinner ipfspin.Pinner) error { - pinned, err := pinner.CheckIfPinned(ctx, ak, bk, ck) - if err != nil { - return err - } - if len(pinned) != 3 { - return errors.New("incorrect number of results") - } - for _, pn := range pinned { - switch pn.Key { - case ak: - if pn.Mode != ipfspin.Direct { - return errors.New("A pinned with wrong mode") - } - case bk: - if pn.Mode != ipfspin.Recursive { - return errors.New("B pinned with wrong mode") - } - case ck: - if pn.Mode != ipfspin.Indirect { - return errors.New("C should be pinned indirectly") - } - if pn.Via != bk { - return errors.New("C should be pinned via B") - } - } - } - return nil - } - - err = verifyPins(dsPinner) - if err != nil { - t.Fatal(err) - } - - ipldPinner, toIPLDCount, err := ConvertPinsFromDSToIPLD(ctx, dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - if toIPLDCount != 2 { - t.Fatal("expected 2 ds-to-ipld pins, got", toIPLDCount) - } - - err = verifyPins(ipldPinner) - if err != nil { - t.Fatal(err) - } - - toDSPinner, toDSCount, err := ConvertPinsFromIPLDToDS(ctx, dstore, dserv, dserv) - if err != nil { - t.Fatal(err) - } - if toDSCount != toIPLDCount { - t.Fatal("ds-to-ipld pins", toIPLDCount, "not equal to ipld-to-ds-pins", toDSCount) - } - - err = verifyPins(toDSPinner) - if err != nil { - t.Fatal(err) - } -} - -func TestConvertLoadError(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - dstore, dserv := makeStore() - // Point /local/pins to empty node to cause failure loading pins. - pinDatastoreKey := ds.NewKey("/local/pins") - emptyKey, err := cid.Decode("QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n") - if err != nil { - panic(err) - } - if err = dstore.Put(pinDatastoreKey, emptyKey.Bytes()); err != nil { - panic(err) - } - if err = dstore.Sync(pinDatastoreKey); err != nil { - panic(err) - } - - _, _, err = ConvertPinsFromIPLDToDS(ctx, dstore, dserv, dserv) - if err == nil || !strings.HasPrefix(err.Error(), "cannot load recursive keys") { - t.Fatal("did not get expected error") - } -} From 2d5bca0320b59b5ab1b8f2d86b237955db37b374 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 13 May 2021 08:15:10 -0700 Subject: [PATCH 2997/3147] remove Makefile This commit was moved from ipfs/go-ipns@bce60af9cfd607d79747871908c1a330812642f0 --- ipns/Makefile | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 ipns/Makefile diff --git a/ipns/Makefile b/ipns/Makefile deleted file mode 100644 index 54152565e9..0000000000 --- a/ipns/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -export IPFS_API ?= v04x.ipfs.io - -gx: - go get -u github.com/whyrusleeping/gx - go get -u github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite From 5968bb2130feadbf586df2b3c91b7ac0c13dea42 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 13 May 2021 08:24:30 -0700 Subject: [PATCH 2998/3147] remove Makefile This commit was moved from ipfs/interface-go-ipfs-core@9b4e1a554b3d82c37b68785e25e7c0381b11470a --- coreiface/Makefile | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 coreiface/Makefile diff --git a/coreiface/Makefile b/coreiface/Makefile deleted file mode 100644 index 89fc88d7f4..0000000000 --- a/coreiface/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -all: deps -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go -deps: gx - gx --verbose install --global - gx-go rewrite -test: deps - gx test -v -race -coverprofile=coverage.txt -covermode=atomic . -rw: - gx-go rewrite -rwundo: - gx-go rewrite --undo -publish: rwundo - gx publish -.PHONY: all gx deps test rw rwundo publish From 6dfedd99957439607056235bf2caaa971a718ead Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 13 May 2021 08:27:04 -0700 Subject: [PATCH 2999/3147] remove Makefile This commit was moved from ipfs/go-path@575c743c48744adaf2582c8b7aeb487275fceb61 --- path/Makefile | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 path/Makefile diff --git a/path/Makefile b/path/Makefile deleted file mode 100644 index 20619413c9..0000000000 --- a/path/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go - -deps: gx - gx --verbose install --global - gx-go rewrite - -publish: - gx-go rewrite --undo - From 9287cef08e600a783066e43c59bd4f2dd7f17e8b Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 13 May 2021 08:31:44 -0700 Subject: [PATCH 3000/3147] remove Makefile This commit was moved from ipfs/go-mfs@dbec3d53dbd0a3b8eeb44616619a1ee3b3febdd6 --- mfs/Makefile | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 mfs/Makefile diff --git a/mfs/Makefile b/mfs/Makefile deleted file mode 100644 index 73f2841f61..0000000000 --- a/mfs/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -all: deps -gx: - go get github.com/whyrusleeping/gx - go get github.com/whyrusleeping/gx-go -deps: gx - gx --verbose install --global - gx-go rewrite -test: deps - gx test -v -race -coverprofile=coverage.txt -covermode=atomic . -rw: - gx-go rewrite -rwundo: - gx-go rewrite --undo -publish: rwundo - gx publish -.PHONY: all gx deps test rw rwundo publish - - From dae4407c6ba038a36d07ba7c77067c0afbad9204 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 13 May 2021 09:40:44 -0700 Subject: [PATCH 3001/3147] fix: remove the rest of the pb backed pinner This commit was moved from ipfs/go-ipfs-pinner@500826fdfdfa1656b1446216dd97a028ffd65a1e --- pinning/pinner/internal/pb/Makefile | 11 - pinning/pinner/internal/pb/doc.go | 3 - pinning/pinner/internal/pb/header.pb.go | 355 ------------------------ pinning/pinner/internal/pb/header.proto | 14 - 4 files changed, 383 deletions(-) delete mode 100644 pinning/pinner/internal/pb/Makefile delete mode 100644 pinning/pinner/internal/pb/doc.go delete mode 100644 pinning/pinner/internal/pb/header.pb.go delete mode 100644 pinning/pinner/internal/pb/header.proto diff --git a/pinning/pinner/internal/pb/Makefile b/pinning/pinner/internal/pb/Makefile deleted file mode 100644 index df34e54b01..0000000000 --- a/pinning/pinner/internal/pb/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --proto_path=$(GOPATH)/src:. --gogofaster_out=. $< - -clean: - rm -f *.pb.go - rm -f *.go diff --git a/pinning/pinner/internal/pb/doc.go b/pinning/pinner/internal/pb/doc.go deleted file mode 100644 index 95d4afe671..0000000000 --- a/pinning/pinner/internal/pb/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -package pb - -//go:generate protoc --gogo_out=. header.proto diff --git a/pinning/pinner/internal/pb/header.pb.go b/pinning/pinner/internal/pb/header.pb.go deleted file mode 100644 index b8b3b0e7dd..0000000000 --- a/pinning/pinner/internal/pb/header.pb.go +++ /dev/null @@ -1,355 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: header.proto - -package pb - -import ( - encoding_binary "encoding/binary" - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Set struct { - // 1 for now, library will refuse to handle entries with an unrecognized version. - Version uint32 `protobuf:"varint,1,opt,name=version" json:"version"` - // how many of the links are subtrees - Fanout uint32 `protobuf:"varint,2,opt,name=fanout" json:"fanout"` - // hash seed for subtree selection, a random number - Seed uint32 `protobuf:"fixed32,3,opt,name=seed" json:"seed"` -} - -func (m *Set) Reset() { *m = Set{} } -func (m *Set) String() string { return proto.CompactTextString(m) } -func (*Set) ProtoMessage() {} -func (*Set) Descriptor() ([]byte, []int) { - return fileDescriptor_6398613e36d6c2ce, []int{0} -} -func (m *Set) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Set) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Set.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Set) XXX_Merge(src proto.Message) { - xxx_messageInfo_Set.Merge(m, src) -} -func (m *Set) XXX_Size() int { - return m.Size() -} -func (m *Set) XXX_DiscardUnknown() { - xxx_messageInfo_Set.DiscardUnknown(m) -} - -var xxx_messageInfo_Set proto.InternalMessageInfo - -func (m *Set) GetVersion() uint32 { - if m != nil { - return m.Version - } - return 0 -} - -func (m *Set) GetFanout() uint32 { - if m != nil { - return m.Fanout - } - return 0 -} - -func (m *Set) GetSeed() uint32 { - if m != nil { - return m.Seed - } - return 0 -} - -func init() { - proto.RegisterType((*Set)(nil), "ipfs.pin.Set") -} - -func init() { proto.RegisterFile("header.proto", fileDescriptor_6398613e36d6c2ce) } - -var fileDescriptor_6398613e36d6c2ce = []byte{ - // 146 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xc9, 0x48, 0x4d, 0x4c, - 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xc8, 0x2c, 0x48, 0x2b, 0xd6, 0x2b, - 0xc8, 0xcc, 0x53, 0x8a, 0xe5, 0x62, 0x0e, 0x4e, 0x2d, 0x11, 0x92, 0xe3, 0x62, 0x2f, 0x4b, 0x2d, - 0x2a, 0xce, 0xcc, 0xcf, 0x93, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x75, 0x62, 0x39, 0x71, 0x4f, 0x9e, - 0x21, 0x08, 0x26, 0x28, 0x24, 0xc3, 0xc5, 0x96, 0x96, 0x98, 0x97, 0x5f, 0x5a, 0x22, 0xc1, 0x84, - 0x24, 0x0d, 0x15, 0x13, 0x92, 0xe0, 0x62, 0x29, 0x4e, 0x4d, 0x4d, 0x91, 0x60, 0x56, 0x60, 0xd4, - 0x60, 0x87, 0xca, 0x81, 0x45, 0x9c, 0x64, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, - 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, - 0x21, 0x8a, 0xa9, 0x20, 0x09, 0x10, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x49, 0x19, 0x51, 0x95, 0x00, - 0x00, 0x00, -} - -func (m *Set) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Set) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Set) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= 4 - encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(m.Seed)) - i-- - dAtA[i] = 0x1d - i = encodeVarintHeader(dAtA, i, uint64(m.Fanout)) - i-- - dAtA[i] = 0x10 - i = encodeVarintHeader(dAtA, i, uint64(m.Version)) - i-- - dAtA[i] = 0x8 - return len(dAtA) - i, nil -} - -func encodeVarintHeader(dAtA []byte, offset int, v uint64) int { - offset -= sovHeader(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Set) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += 1 + sovHeader(uint64(m.Version)) - n += 1 + sovHeader(uint64(m.Fanout)) - n += 5 - return n -} - -func sovHeader(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozHeader(x uint64) (n int) { - return sovHeader(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Set) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowHeader - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Set: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Set: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - m.Version = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowHeader - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Version |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Fanout", wireType) - } - m.Fanout = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowHeader - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Fanout |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 5 { - return fmt.Errorf("proto: wrong wireType = %d for field Seed", wireType) - } - m.Seed = 0 - if (iNdEx + 4) > l { - return io.ErrUnexpectedEOF - } - m.Seed = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) - iNdEx += 4 - default: - iNdEx = preIndex - skippy, err := skipHeader(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthHeader - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthHeader - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipHeader(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowHeader - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowHeader - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowHeader - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthHeader - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupHeader - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthHeader - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthHeader = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowHeader = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupHeader = fmt.Errorf("proto: unexpected end of group") -) diff --git a/pinning/pinner/internal/pb/header.proto b/pinning/pinner/internal/pb/header.proto deleted file mode 100644 index 36b32b36dd..0000000000 --- a/pinning/pinner/internal/pb/header.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto2"; - -package ipfs.pin; - -option go_package = "pb"; - -message Set { - // 1 for now, library will refuse to handle entries with an unrecognized version. - optional uint32 version = 1; - // how many of the links are subtrees - optional uint32 fanout = 2; - // hash seed for subtree selection, a random number - optional fixed32 seed = 3; -} From f0e1f0827951702bf21a139b9e64d004b334912f Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 14 May 2021 01:04:19 -0700 Subject: [PATCH 3002/3147] Bulk Provide/Reproviding System (#34) * batched: added a batching providing and reproviding system that takes advantage of an underlying provide emitting system that can operate on many items at a time. The implementation is experimental and likely to change. * queue: modified documentation to indicate that its durability is best effort and determined by the underlying datastore This commit was moved from ipfs/go-ipfs-provider@d391dae4a595473f6797eb5d5b803a529a7bbdbc --- provider/batched/system.go | 415 ++++++++++++++++++++++++++++++++ provider/batched/system_test.go | 117 +++++++++ provider/queue/queue.go | 8 +- 3 files changed, 536 insertions(+), 4 deletions(-) create mode 100644 provider/batched/system.go create mode 100644 provider/batched/system_test.go diff --git a/provider/batched/system.go b/provider/batched/system.go new file mode 100644 index 0000000000..5637e55b1a --- /dev/null +++ b/provider/batched/system.go @@ -0,0 +1,415 @@ +package batched + +import ( + "context" + "errors" + "fmt" + "strconv" + "sync" + "time" + + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + provider "github.com/ipfs/go-ipfs-provider" + "github.com/ipfs/go-ipfs-provider/queue" + "github.com/ipfs/go-ipfs-provider/simple" + logging "github.com/ipfs/go-log" + "github.com/ipfs/go-verifcid" + "github.com/multiformats/go-multihash" +) + +var log = logging.Logger("provider.batched") + +type BatchProvidingSystem struct { + ctx context.Context + close context.CancelFunc + closewg sync.WaitGroup + + reprovideInterval time.Duration + initalReprovideDelay time.Duration + initialReprovideDelaySet bool + + rsys provideMany + keyProvider simple.KeyChanFunc + + q *queue.Queue + ds datastore.Batching + + reprovideCh chan cid.Cid + + totalProvides, lastReprovideBatchSize int + avgProvideDuration, lastReprovideDuration time.Duration +} + +var _ provider.System = (*BatchProvidingSystem)(nil) + +type provideMany interface { + ProvideMany(ctx context.Context, keys []multihash.Multihash) error + Ready() bool +} + +// Option defines the functional option type that can be used to configure +// BatchProvidingSystem instances +type Option func(system *BatchProvidingSystem) error + +var lastReprovideKey = datastore.NewKey("/provider/reprovide/lastreprovide") + +func New(provider provideMany, q *queue.Queue, opts ...Option) (*BatchProvidingSystem, error) { + s := &BatchProvidingSystem{ + reprovideInterval: time.Hour * 24, + rsys: provider, + keyProvider: nil, + q: q, + ds: datastore.NewMapDatastore(), + reprovideCh: make(chan cid.Cid), + } + + for _, o := range opts { + if err := o(s); err != nil { + return nil, err + } + } + + // Setup default behavior for the initial reprovide delay + // + // If the reprovide ticker is larger than a minute (likely), + // provide once after we've been up a minute. + // + // Don't provide _immediately_ as we might be just about to stop. + if !s.initialReprovideDelaySet && s.reprovideInterval > time.Minute { + s.initalReprovideDelay = time.Minute + s.initialReprovideDelaySet = true + } + + if s.keyProvider == nil { + s.keyProvider = func(ctx context.Context) (<-chan cid.Cid, error) { + ch := make(chan cid.Cid) + close(ch) + return ch, nil + } + } + + // This is after the options processing so we do not have to worry about leaking a context if there is an + // initialization error processing the options + ctx, cancel := context.WithCancel(context.Background()) + s.ctx = ctx + s.close = cancel + + return s, nil +} + +func Datastore(batching datastore.Batching) Option { + return func(system *BatchProvidingSystem) error { + system.ds = batching + return nil + } +} + +func ReproviderInterval(duration time.Duration) Option { + return func(system *BatchProvidingSystem) error { + system.reprovideInterval = duration + return nil + } +} + +func KeyProvider(fn simple.KeyChanFunc) Option { + return func(system *BatchProvidingSystem) error { + system.keyProvider = fn + return nil + } +} + +func initialReprovideDelay(duration time.Duration) Option { + return func(system *BatchProvidingSystem) error { + system.initialReprovideDelaySet = true + system.initalReprovideDelay = duration + return nil + } +} + +func (s *BatchProvidingSystem) Run() { + // how long we wait between the first provider we hear about and batching up the provides to send out + const pauseDetectionThreshold = time.Millisecond * 500 + // how long we are willing to collect providers for the batch after we receive the first one + const maxCollectionDuration = time.Minute * 10 + + provCh := s.q.Dequeue() + + s.closewg.Add(1) + go func() { + defer s.closewg.Done() + + m := make(map[cid.Cid]struct{}) + + // setup stopped timers + maxCollectionDurationTimer := time.NewTimer(time.Hour) + pauseDetectTimer := time.NewTimer(time.Hour) + stopAndEmptyTimer(maxCollectionDurationTimer) + stopAndEmptyTimer(pauseDetectTimer) + + // make sure timers are cleaned up + defer maxCollectionDurationTimer.Stop() + defer pauseDetectTimer.Stop() + + resetTimersAfterReceivingProvide := func() { + firstProvide := len(m) == 0 + if firstProvide { + // after receiving the first provider start up the timers + maxCollectionDurationTimer.Reset(maxCollectionDuration) + pauseDetectTimer.Reset(pauseDetectionThreshold) + } else { + // otherwise just do a full restart of the pause timer + stopAndEmptyTimer(pauseDetectTimer) + pauseDetectTimer.Reset(pauseDetectionThreshold) + } + } + + for { + performedReprovide := false + + // at the start of every loop the maxCollectionDurationTimer and pauseDetectTimer should be already be + // stopped and have empty channels + loop: + for { + select { + case <-maxCollectionDurationTimer.C: + // if this timer has fired then the pause timer has started so let's stop and empty it + stopAndEmptyTimer(pauseDetectTimer) + break loop + default: + } + + select { + case c := <-provCh: + resetTimersAfterReceivingProvide() + m[c] = struct{}{} + continue + default: + } + + select { + case c := <-provCh: + resetTimersAfterReceivingProvide() + m[c] = struct{}{} + case c := <-s.reprovideCh: + resetTimersAfterReceivingProvide() + m[c] = struct{}{} + performedReprovide = true + case <-pauseDetectTimer.C: + // if this timer has fired then the max collection timer has started so let's stop and empty it + stopAndEmptyTimer(maxCollectionDurationTimer) + break loop + case <-maxCollectionDurationTimer.C: + // if this timer has fired then the pause timer has started so let's stop and empty it + stopAndEmptyTimer(pauseDetectTimer) + break loop + case <-s.ctx.Done(): + return + } + } + + if len(m) == 0 { + continue + } + + keys := make([]multihash.Multihash, 0, len(m)) + for c := range m { + delete(m, c) + + // hash security + if err := verifcid.ValidateCid(c); err != nil { + log.Errorf("insecure hash in reprovider, %s (%s)", c, err) + continue + } + + keys = append(keys, c.Hash()) + } + + for !s.rsys.Ready() { + log.Debugf("reprovider system not ready") + select { + case <-time.After(time.Minute): + case <-s.ctx.Done(): + return + } + } + + log.Debugf("starting provide of %d keys", len(keys)) + start := time.Now() + err := s.rsys.ProvideMany(s.ctx, keys) + if err != nil { + log.Debugf("providing failed %v", err) + continue + } + dur := time.Since(start) + + totalProvideTime := int64(s.totalProvides) * int64(s.avgProvideDuration) + recentAvgProvideDuration := time.Duration(int64(dur) / int64(len(keys))) + s.avgProvideDuration = time.Duration((totalProvideTime + int64(dur)) / int64(s.totalProvides+len(keys))) + s.totalProvides += len(keys) + + log.Debugf("finished providing of %d keys. It took %v with an average of %v per provide", len(keys), dur, recentAvgProvideDuration) + + if performedReprovide { + s.lastReprovideBatchSize = len(keys) + s.lastReprovideDuration = dur + + if err := s.ds.Put(lastReprovideKey, storeTime(time.Now())); err != nil { + log.Errorf("could not store last reprovide time: %v", err) + } + if err := s.ds.Sync(lastReprovideKey); err != nil { + log.Errorf("could not perform sync of last reprovide time: %v", err) + } + } + } + }() + + s.closewg.Add(1) + go func() { + defer s.closewg.Done() + + var initialReprovideCh, reprovideCh <-chan time.Time + + // If reproviding is enabled (non-zero) + if s.reprovideInterval > 0 { + reprovideTicker := time.NewTicker(s.reprovideInterval) + defer reprovideTicker.Stop() + reprovideCh = reprovideTicker.C + + // if there is a non-zero initial reprovide time that was set in the initializer or if the fallback has been + if s.initialReprovideDelaySet { + initialReprovideTimer := time.NewTimer(s.initalReprovideDelay) + defer initialReprovideTimer.Stop() + + initialReprovideCh = initialReprovideTimer.C + } + } + + for s.ctx.Err() == nil { + select { + case <-initialReprovideCh: + case <-reprovideCh: + case <-s.ctx.Done(): + return + } + + err := s.reprovide(s.ctx, false) + + // only log if we've hit an actual error, otherwise just tell the client we're shutting down + if s.ctx.Err() == nil && err != nil { + log.Errorf("failed to reprovide: %s", err) + } + } + }() +} + +func stopAndEmptyTimer(t *time.Timer) { + if !t.Stop() { + <-t.C + } +} + +func storeTime(t time.Time) []byte { + val := []byte(fmt.Sprintf("%d", t.UnixNano())) + return val +} + +func parseTime(b []byte) (time.Time, error) { + tns, err := strconv.ParseInt(string(b), 10, 64) + if err != nil { + return time.Time{}, err + } + return time.Unix(0, tns), nil +} + +func (s *BatchProvidingSystem) Close() error { + s.close() + err := s.q.Close() + s.closewg.Wait() + return err +} + +func (s *BatchProvidingSystem) Provide(cid cid.Cid) error { + return s.q.Enqueue(cid) +} + +func (s *BatchProvidingSystem) Reprovide(ctx context.Context) error { + return s.reprovide(ctx, true) +} + +func (s *BatchProvidingSystem) reprovide(ctx context.Context, force bool) error { + if !s.shouldReprovide() && !force { + return nil + } + + kch, err := s.keyProvider(ctx) + if err != nil { + return err + } + +reprovideCidLoop: + for { + select { + case c, ok := <-kch: + if !ok { + break reprovideCidLoop + } + + select { + case s.reprovideCh <- c: + case <-ctx.Done(): + return ctx.Err() + } + case <-ctx.Done(): + return ctx.Err() + } + } + + return nil +} + +func (s *BatchProvidingSystem) getLastReprovideTime() (time.Time, error) { + val, err := s.ds.Get(lastReprovideKey) + if errors.Is(err, datastore.ErrNotFound) { + return time.Time{}, nil + } + if err != nil { + return time.Time{}, fmt.Errorf("could not get last reprovide time") + } + + t, err := parseTime(val) + if err != nil { + return time.Time{}, fmt.Errorf("could not decode last reprovide time, got %q", string(val)) + } + + return t, nil +} + +func (s *BatchProvidingSystem) shouldReprovide() bool { + t, err := s.getLastReprovideTime() + if err != nil { + log.Debugf("getting last reprovide time failed: %s", err) + return false + } + + if time.Since(t) < time.Duration(float64(s.reprovideInterval)*0.5) { + return false + } + return true +} + +type BatchedProviderStats struct { + TotalProvides, LastReprovideBatchSize int + AvgProvideDuration, LastReprovideDuration time.Duration +} + +// Stat returns various stats about this provider system +func (s *BatchProvidingSystem) Stat(ctx context.Context) (BatchedProviderStats, error) { + // TODO: Does it matter that there is no locking around the total+average values? + return BatchedProviderStats{ + TotalProvides: s.totalProvides, + LastReprovideBatchSize: s.lastReprovideBatchSize, + AvgProvideDuration: s.avgProvideDuration, + LastReprovideDuration: s.lastReprovideDuration, + }, nil +} diff --git a/provider/batched/system_test.go b/provider/batched/system_test.go new file mode 100644 index 0000000000..b2b3120206 --- /dev/null +++ b/provider/batched/system_test.go @@ -0,0 +1,117 @@ +package batched + +import ( + "context" + "strconv" + "sync" + "testing" + "time" + + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + mh "github.com/multiformats/go-multihash" + + q "github.com/ipfs/go-ipfs-provider/queue" +) + +type mockProvideMany struct { + lk sync.Mutex + keys []mh.Multihash +} + +func (m *mockProvideMany) ProvideMany(ctx context.Context, keys []mh.Multihash) error { + m.lk.Lock() + defer m.lk.Unlock() + m.keys = keys + return nil +} + +func (m *mockProvideMany) Ready() bool { + return true +} + +func (m *mockProvideMany) GetKeys() []mh.Multihash { + m.lk.Lock() + defer m.lk.Unlock() + return m.keys[:] +} + +var _ provideMany = (*mockProvideMany)(nil) + +func TestBatched(t *testing.T) { + ctx := context.Background() + defer ctx.Done() + + ds := dssync.MutexWrap(datastore.NewMapDatastore()) + queue, err := q.NewQueue(ctx, "test", ds) + if err != nil { + t.Fatal(err) + } + + provider := &mockProvideMany{} + + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + + const numProvides = 100 + keysToProvide := make(map[cid.Cid]int) + for i := 0; i < numProvides; i++ { + h, err := mh.Sum([]byte(strconv.Itoa(i)), mh.SHA2_256, -1) + if err != nil { + panic(err) + } + c := cid.NewCidV1(cid.Raw, h) + keysToProvide[c] = i + } + + batchSystem, err := New(provider, queue, KeyProvider(func(ctx context.Context) (<-chan cid.Cid, error) { + ch := make(chan cid.Cid) + go func() { + for k := range keysToProvide { + select { + case ch <- k: + case <-ctx.Done(): + return + } + } + }() + return ch, nil + }), initialReprovideDelay(0)) + if err != nil { + t.Fatal(err) + } + + batchSystem.Run() + + var keys []mh.Multihash + for { + if ctx.Err() != nil { + t.Fatal("test hung") + } + keys = provider.GetKeys() + if len(keys) != 0 { + break + } + time.Sleep(time.Millisecond * 100) + } + + if len(keys) != numProvides { + t.Fatalf("expected %d provider keys, got %d", numProvides, len(keys)) + } + + provMap := make(map[string]struct{}) + for _, k := range keys { + provMap[string(k)] = struct{}{} + } + + for i := 0; i < numProvides; i++ { + h, err := mh.Sum([]byte(strconv.Itoa(i)), mh.SHA2_256, -1) + if err != nil { + panic(err) + } + if _, found := provMap[string(h)]; !found { + t.Fatalf("could not find provider with value %d", i) + } + } +} diff --git a/provider/queue/queue.go b/provider/queue/queue.go index 2c33502563..e81e341f63 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -14,11 +14,11 @@ import ( var log = logging.Logger("provider.queue") -// Queue provides a durable, FIFO interface to the datastore for storing cids +// Queue provides a best-effort durability, FIFO interface to the datastore for storing cids // -// Durability just means that cids in the process of being provided when a -// crash or shutdown occurs will still be in the queue when the node is -// brought back online. +// Best-effort durability just means that cids in the process of being provided when a +// crash or shutdown occurs may be in the queue when the node is brought back online +// depending on whether the underlying datastore has synchronous or asynchronous writes. type Queue struct { // used to differentiate queues in datastore // e.g. provider vs reprovider From 925510281b5466638f4daf426ddc0230a3c0a3b0 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 15 May 2021 17:53:19 -0700 Subject: [PATCH 3003/3147] fix staticcheck This commit was moved from ipfs/go-ipfs-blockstore@c8a6ece032042c2c35fcb67d3294004b848734e1 --- blockstore/idstore.go | 2 +- blockstore/idstore_test.go | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/blockstore/idstore.go b/blockstore/idstore.go index 1166e5bda1..b1a85b6b9b 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -34,7 +34,7 @@ func extractContents(k cid.Cid) (bool, []byte) { } dmh, err := mh.Decode(k.Hash()) - if err != nil || dmh.Code != mh.ID { + if err != nil || dmh.Code != mh.IDENTITY { return false, nil } return true, dmh.Digest diff --git a/blockstore/idstore_test.go b/blockstore/idstore_test.go index 321d5ec779..65b902ef19 100644 --- a/blockstore/idstore_test.go +++ b/blockstore/idstore_test.go @@ -17,7 +17,7 @@ func createTestStores() (Blockstore, *callbackDatastore) { } func TestIdStore(t *testing.T) { - idhash1, _ := cid.NewPrefixV1(cid.Raw, mh.ID).Sum([]byte("idhash1")) + idhash1, _ := cid.NewPrefixV1(cid.Raw, mh.IDENTITY).Sum([]byte("idhash1")) idblock1, _ := blk.NewBlockWithCid([]byte("idhash1"), idhash1) hash1, _ := cid.NewPrefixV1(cid.Raw, mh.SHA2_256).Sum([]byte("hash1")) block1, _ := blk.NewBlockWithCid([]byte("hash1"), hash1) @@ -110,7 +110,7 @@ func TestIdStore(t *testing.T) { t.Fatal(err) } - idhash2, _ := cid.NewPrefixV1(cid.Raw, mh.ID).Sum([]byte("idhash2")) + idhash2, _ := cid.NewPrefixV1(cid.Raw, mh.IDENTITY).Sum([]byte("idhash2")) idblock2, _ := blk.NewBlockWithCid([]byte("idhash2"), idhash2) hash2, _ := cid.NewPrefixV1(cid.Raw, mh.SHA2_256).Sum([]byte("hash2")) block2, _ := blk.NewBlockWithCid([]byte("hash2"), hash2) @@ -146,10 +146,13 @@ func TestIdStore(t *testing.T) { } ch, err := ids.AllKeysChan(context.TODO()) + if err != nil { + t.Fatal(err) + } cnt := 0 for c := range ch { cnt++ - if c.Prefix().MhType == mh.ID { + if c.Prefix().MhType == mh.IDENTITY { t.Fatalf("block with identity hash found in blockstore") } } From 68f1ef886dd0f240b860d7b7559c34763e363f58 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 15 May 2021 18:01:37 -0700 Subject: [PATCH 3004/3147] fix staticcheck This commit was moved from ipfs/go-filestore@c2dbc1416d7aa7b77f4fcbee503ebce40c49bd74 --- filestore/fsrefstore.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index bc183fc38f..a29c2264e1 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -149,10 +149,10 @@ func (f *FileManager) getDataObj(m mh.Multihash) (*pb.DataObj, error) { switch err { case ds.ErrNotFound: return nil, blockstore.ErrNotFound - default: - return nil, err case nil: // + default: + return nil, err } return unmarshalDataObj(o) @@ -290,7 +290,8 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { if !f.AllowFiles { return ErrFilestoreNotEnabled } - if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { //nolint:staticcheck + //lint:ignore SA1019 // ignore staticcheck + if !filepath.HasPrefix(b.PosInfo.FullPath, f.root) { return fmt.Errorf("cannot add filestore references outside ipfs root (%s)", f.root) } From 2a4eb0c9335686e2d43f8c6b6c1166f40c246450 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 15 May 2021 18:07:02 -0700 Subject: [PATCH 3005/3147] fix staticcheck This commit was moved from ipfs/go-ipfs-pinner@40ae33dcdc59ec69db2f4ec8188146cea89e906d --- pinning/pinner/dsindex/indexer.go | 6 ++++-- pinning/pinner/dspinner/pin.go | 3 +-- pinning/pinner/dspinner/pin_test.go | 4 +--- pinning/pinner/pin.go | 3 --- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/pinning/pinner/dsindex/indexer.go b/pinning/pinner/dsindex/indexer.go index e48af2e17b..e1119acacc 100644 --- a/pinning/pinner/dsindex/indexer.go +++ b/pinning/pinner/dsindex/indexer.go @@ -127,12 +127,14 @@ func (x *indexer) ForEach(ctx context.Context, key string, fn func(key, value st break } ent := r.Entry - decIdx, err := decode(path.Base(path.Dir(ent.Key))) + var decIdx string + decIdx, err = decode(path.Base(path.Dir(ent.Key))) if err != nil { err = fmt.Errorf("cannot decode index: %v", err) break } - decKey, err := decode(path.Base(ent.Key)) + var decKey string + decKey, err = decode(path.Base(ent.Key)) if err != nil { err = fmt.Errorf("cannot decode key: %v", err) break diff --git a/pinning/pinner/dspinner/pin.go b/pinning/pinner/dspinner/pin.go index f9f5ff9bf7..4adf95a6ea 100644 --- a/pinning/pinner/dspinner/pin.go +++ b/pinning/pinner/dspinner/pin.go @@ -18,7 +18,6 @@ import ( ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" "github.com/ipfs/go-merkledag" - mdag "github.com/ipfs/go-merkledag" "github.com/ipfs/go-merkledag/dagutils" "github.com/polydawn/refmt/cbor" "github.com/polydawn/refmt/obj/atlas" @@ -191,7 +190,7 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { // temporary unlock to fetch the entire graph p.lock.Unlock() // Fetch graph starting at node identified by cid - err = mdag.FetchGraph(ctx, c, p.dserv) + err = merkledag.FetchGraph(ctx, c, p.dserv) p.lock.Lock() if err != nil { return err diff --git a/pinning/pinner/dspinner/pin_test.go b/pinning/pinner/dspinner/pin_test.go index 46a2f94a5f..500d3e3e74 100644 --- a/pinning/pinner/dspinner/pin_test.go +++ b/pinning/pinner/dspinner/pin_test.go @@ -893,9 +893,7 @@ func makeStore() (ds.Datastore, ipld.DAGService) { if err != nil { panic(err) } - var dstore ds.Batching - dstore = &batchWrap{ldstore} - + dstore := &batchWrap{ldstore} bstore := blockstore.NewBlockstore(dstore) bserv := bs.New(bstore, offline.Exchange(bstore)) dserv := mdag.NewDAGService(bserv) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 7e1d886020..2bae758419 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -8,11 +8,8 @@ import ( cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" - logging "github.com/ipfs/go-log" ) -var log = logging.Logger("pin") - const ( linkRecursive = "recursive" linkDirect = "direct" From f2a8fd4329e65cf6c5f41a11c515e1188ef6ee63 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 15 May 2021 18:11:40 -0700 Subject: [PATCH 3006/3147] fix staticcheck This commit was moved from ipfs/go-blockservice@9659d2af50549ac49c9e2b849d197b873b081c2f --- blockservice/test/mock.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index a6eba6911c..d4a611d435 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -1,24 +1,23 @@ package bstest import ( - . "github.com/ipfs/go-blockservice" - testinstance "github.com/ipfs/go-bitswap/testinstance" tn "github.com/ipfs/go-bitswap/testnet" + "github.com/ipfs/go-blockservice" delay "github.com/ipfs/go-ipfs-delay" mockrouting "github.com/ipfs/go-ipfs-routing/mock" ) // Mocks returns |n| connected mock Blockservices -func Mocks(n int) []BlockService { +func Mocks(n int) []blockservice.BlockService { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) sg := testinstance.NewTestInstanceGenerator(net) instances := sg.Instances(n) - var servs []BlockService + var servs []blockservice.BlockService for _, i := range instances { - servs = append(servs, New(i.Blockstore(), i.Exchange)) + servs = append(servs, blockservice.New(i.Blockstore(), i.Exchange)) } return servs } From 43462bd16cb81d7b51ca4e449d046425da18fe6e Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 17 May 2021 10:50:06 -0700 Subject: [PATCH 3007/3147] update go-bitswap to v0.3.4 This fixes a panic of the tests on i386, see https://github.com/ipfs/go-bitswap/pull/478 for details. This commit was moved from ipfs/go-blockservice@418971a9884fd4d97bec0e61de2bb9ca65ddd683 --- blockservice/blockservice.go | 10 +++++----- blockservice/test/mock.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 2f320b139b..2c860aefdf 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -147,7 +147,7 @@ func (s *blockService) AddBlock(o blocks.Block) error { return err } - log.Event(context.TODO(), "BlockService.BlockAdded", c) + log.Debugf("BlockService.BlockAdded %s", c) if s.exchange != nil { if err := s.exchange.HasBlock(o); err != nil { @@ -193,7 +193,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { if s.exchange != nil { for _, o := range toput { - log.Event(context.TODO(), "BlockService.BlockAdded", o.Cid()) + log.Debugf("BlockService.BlockAdded %s", o.Cid()) if err := s.exchange.HasBlock(o); err != nil { log.Errorf("HasBlock: %s", err.Error()) } @@ -243,7 +243,7 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun } return nil, err } - log.Event(ctx, "BlockService.BlockFetched", c) + log.Debugf("BlockService.BlockFetched %s", c) return blk, nil } @@ -320,7 +320,7 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget } for b := range rblocks { - log.Event(ctx, "BlockService.BlockFetched", b.Cid()) + log.Debugf("BlockService.BlockFetched %s", b.Cid()) select { case out <- b: case <-ctx.Done(): @@ -335,7 +335,7 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func (s *blockService) DeleteBlock(c cid.Cid) error { err := s.blockstore.DeleteBlock(c) if err == nil { - log.Event(context.TODO(), "BlockService.BlockDeleted", c) + log.Debugf("BlockService.BlockDeleted %s", c) } return err } diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go index d4a611d435..d55be8a3f4 100644 --- a/blockservice/test/mock.go +++ b/blockservice/test/mock.go @@ -11,7 +11,7 @@ import ( // Mocks returns |n| connected mock Blockservices func Mocks(n int) []blockservice.BlockService { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0)) - sg := testinstance.NewTestInstanceGenerator(net) + sg := testinstance.NewTestInstanceGenerator(net, nil, nil) instances := sg.Instances(n) From aebf6e183c75f4d2f1e54716c836d8e7996815b3 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Wed, 19 May 2021 13:16:44 -0300 Subject: [PATCH 3008/3147] fix: always return upgradeable instead of basic dir (#92) This commit was moved from ipfs/go-unixfs@9dd1330c931383ed297ba39c191dd5f8b8f9ab55 --- unixfs/io/directory.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index b0c4549aa7..0812670df1 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -134,7 +134,7 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err switch fsNode.Type() { case format.TDirectory: - return newBasicDirectoryFromNode(dserv, protoBufNode.Copy().(*mdag.ProtoNode)), nil + return &UpgradeableDirectory{newBasicDirectoryFromNode(dserv, protoBufNode.Copy().(*mdag.ProtoNode))}, nil case format.THAMTShard: shard, err := hamt.NewHamtFromDag(dserv, node) if err != nil { From b85e50b956d3766b2f00201e79aba74d2e7e047d Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 19 May 2021 12:32:04 -0700 Subject: [PATCH 3009/3147] fix staticcheck This commit was moved from ipfs/go-ipfs-exchange-offline@57aa7ef2f88ce79285781157fc6454d544fe91f6 --- exchange/offline/offline.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index cb82b8a0a2..88d04469b1 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -34,7 +34,7 @@ func (e *offlineExchange) HasBlock(b blocks.Block) error { } // Close always returns nil. -func (_ *offlineExchange) Close() error { +func (e *offlineExchange) Close() error { // NB: exchange doesn't own the blockstore's underlying datastore, so it is // not responsible for closing it. return nil @@ -44,11 +44,9 @@ func (e *offlineExchange) GetBlocks(ctx context.Context, ks []cid.Cid) (<-chan b out := make(chan blocks.Block) go func() { defer close(out) - var misses []cid.Cid for _, k := range ks { hit, err := e.bs.Get(k) if err != nil { - misses = append(misses, k) // a long line of misses should abort when context is cancelled. select { // TODO case send misses down channel From f60162cb66c693adb5d89049f0ab4ec927822171 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Fri, 21 May 2021 16:50:49 -0300 Subject: [PATCH 3010/3147] fix(directory): initialize size when computing it This commit was moved from ipfs/go-unixfs@c3f568f65f9883981076ba81a8e11cfa3b0f55ff --- unixfs/io/directory.go | 1 + 1 file changed, 1 insertion(+) diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index b0c4549aa7..62e57c8746 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -150,6 +150,7 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err } func (d *BasicDirectory) computeEstimatedSize() { + d.estimatedSize = 0 d.ForEachLink(nil, func(l *ipld.Link) error { d.addToEstimatedSize(l.Name, l.Cid) return nil From 6e2490351853d5935bf49e488fe8c1991c5410f5 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 25 May 2021 19:23:37 -0400 Subject: [PATCH 3011/3147] fix: skip providing if the key set is empty after removing invalid CIDs This commit was moved from ipfs/go-ipfs-provider@28e02d77939162d75120b6ce3dac99317221c5a7 --- provider/batched/system.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/provider/batched/system.go b/provider/batched/system.go index 5637e55b1a..111ee115be 100644 --- a/provider/batched/system.go +++ b/provider/batched/system.go @@ -225,6 +225,11 @@ func (s *BatchProvidingSystem) Run() { keys = append(keys, c.Hash()) } + // in case after removing all the invalid CIDs there are no valid ones left + if len(keys) == 0 { + continue + } + for !s.rsys.Ready() { log.Debugf("reprovider system not ready") select { From 5df09f84256c8b490f356c161c96b49d3a46bfd0 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 2 Jun 2021 09:11:14 -0700 Subject: [PATCH 3012/3147] fix staticcheck This commit was moved from ipfs/interface-go-ipfs-core@08bd316e61238880f341d7061c518c2a62830bd9 --- coreiface/tests/api.go | 2 +- coreiface/tests/block.go | 2 +- coreiface/tests/dag.go | 2 +- coreiface/tests/dht.go | 2 +- coreiface/tests/key.go | 12 ++++++------ coreiface/tests/name.go | 2 +- coreiface/tests/object.go | 2 +- coreiface/tests/pin.go | 2 +- coreiface/tests/pubsub.go | 2 +- coreiface/tests/unixfs.go | 5 ++--- 10 files changed, 16 insertions(+), 17 deletions(-) diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index 1af3a83b37..0801b3ca7f 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -9,7 +9,7 @@ import ( coreiface "github.com/ipfs/interface-go-ipfs-core" ) -var apiNotImplemented = errors.New("api not implemented") +var errAPINotImplemented = errors.New("api not implemented") func (tp *TestSuite) makeAPI(ctx context.Context) (coreiface.CoreAPI, error) { api, err := tp.MakeAPISwarm(ctx, false, 1) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 1f72525475..7dbfa4df04 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -32,7 +32,7 @@ func cborBlock() io.Reader { func (tp *TestSuite) TestBlock(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Block() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 2f68bbf05e..6f9d9659e1 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -18,7 +18,7 @@ import ( func (tp *TestSuite) TestDag(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Dag() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) diff --git a/coreiface/tests/dht.go b/coreiface/tests/dht.go index a957d66d71..c2e6d690fc 100644 --- a/coreiface/tests/dht.go +++ b/coreiface/tests/dht.go @@ -13,7 +13,7 @@ import ( func (tp *TestSuite) TestDht(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Dht() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) diff --git a/coreiface/tests/key.go b/coreiface/tests/key.go index c3cd8626fa..47f278f972 100644 --- a/coreiface/tests/key.go +++ b/coreiface/tests/key.go @@ -5,8 +5,7 @@ import ( "strings" "testing" - cid "github.com/ipfs/go-cid" - coreiface "github.com/ipfs/interface-go-ipfs-core" + "github.com/ipfs/go-cid" iface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" mbase "github.com/multiformats/go-multibase" @@ -15,7 +14,7 @@ import ( func (tp *TestSuite) TestKey(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Key() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) @@ -67,8 +66,8 @@ func (tp *TestSuite) TestListSelf(t *testing.T) { t.Errorf("expected the key to be called 'self', got '%s'", keys[0].Name()) } - if keys[0].Path().String() != "/ipns/"+coreiface.FormatKeyID(self.ID()) { - t.Errorf("expected the key to have path '/ipns/%s', got '%s'", coreiface.FormatKeyID(self.ID()), keys[0].Path().String()) + if keys[0].Path().String() != "/ipns/"+iface.FormatKeyID(self.ID()) { + t.Errorf("expected the key to have path '/ipns/%s', got '%s'", iface.FormatKeyID(self.ID()), keys[0].Path().String()) } } @@ -185,9 +184,10 @@ func (tp *TestSuite) TestGenerateSize(t *testing.T) { } func (tp *TestSuite) TestGenerateType(t *testing.T) { + t.Skip("disabled until libp2p/specs#111 is fixed") + ctx, cancel := context.WithCancel(context.Background()) defer cancel() - t.Skip("disabled until libp2p/specs#111 is fixed") api, err := tp.makeAPI(ctx) if err != nil { diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 021c1bb975..2a8b4d76af 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -19,7 +19,7 @@ import ( func (tp *TestSuite) TestName(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Name() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index 2e066ca71b..e8ab1a7f4b 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -15,7 +15,7 @@ import ( func (tp *TestSuite) TestObject(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Object() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index 476bbea6be..d378d1015c 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -18,7 +18,7 @@ import ( func (tp *TestSuite) TestPin(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.Pin() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index 36353f8360..f8339f2283 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -12,7 +12,7 @@ import ( func (tp *TestSuite) TestPubSub(t *testing.T) { tp.hasApi(t, func(api iface.CoreAPI) error { if api.PubSub() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 1ed80e8733..4273386aaa 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -31,7 +31,7 @@ import ( func (tp *TestSuite) TestUnixfs(t *testing.T) { tp.hasApi(t, func(api coreiface.CoreAPI) error { if api.Unixfs() == nil { - return apiNotImplemented + return errAPINotImplemented } return nil }) @@ -1035,8 +1035,7 @@ func (tp *TestSuite) TestGetReadAt(t *testing.T) { origR := bytes.NewReader(orig) - r, err = api.Unixfs().Get(ctx, p) - if err != nil { + if _, err := api.Unixfs().Get(ctx, p); err != nil { t.Fatal(err) } From 74605a9fef1b920af6a4ad53b253fd36df681f2d Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 2 Jun 2021 09:17:07 -0700 Subject: [PATCH 3013/3147] fix staticcheck This commit was moved from ipfs/go-ipfs-routing@be9d9edc34835283c29a722be14e2898c447ffc0 --- routing/mock/centralized_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index 2767ff1a29..fc832cf7a8 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" delay "github.com/ipfs/go-ipfs-delay" u "github.com/ipfs/go-ipfs-util" @@ -44,8 +44,8 @@ func TestClientFindProviders(t *testing.T) { providersFromClient := client.FindProvidersAsync(context.Background(), k, max) isInClient := false - for pi := range providersFromClient { - if pi.ID == pi.ID { // <-- typo? + for p := range providersFromClient { + if p.ID == pi.ID() { isInClient = true } } From 973264d33e0d1747f62b63f2c38fdd58fcdd5dc1 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 2 Jun 2021 09:20:01 -0700 Subject: [PATCH 3014/3147] fix staticcheck This commit was moved from ipfs/go-ipfs-util@508ba17d06c4133acccb88c2aeab4c50aed04b8c --- util/util.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/util.go b/util/util.go index 8ebe3c706f..ffcab2f33d 100644 --- a/util/util.go +++ b/util/util.go @@ -23,14 +23,14 @@ const DefaultIpfsHash = mh.SHA2_256 var Debug bool // ErrNotImplemented signifies a function has not been implemented yet. -var ErrNotImplemented = errors.New("Error: not implemented yet.") +var ErrNotImplemented = errors.New("error: not implemented yet") // ErrTimeout implies that a timeout has been triggered -var ErrTimeout = errors.New("Error: Call timed out.") +var ErrTimeout = errors.New("error: call timed out") -// ErrSearchIncomplete implies that a search type operation didnt +// ErrSearchIncomplete implies that a search type operation didn't // find the expected node, but did find 'a' node. -var ErrSearchIncomplete = errors.New("Error: Search Incomplete.") +var ErrSearchIncomplete = errors.New("error: search incomplete") // ErrCast is returned when a cast fails AND the program should not panic. func ErrCast() error { From e320b1c850abcf2ddb1b71b2ec7ab877e7505568 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 2 Jun 2021 09:26:35 -0700 Subject: [PATCH 3015/3147] fix staticcheck This commit was moved from ipfs/go-unixfs@c8d1d63a7e0c0eca4b3064fa174e18ed5e2f5d84 --- unixfs/hamt/hamt_test.go | 21 +++++++++++++++++++++ unixfs/io/directory.go | 6 +++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 4d2f64b225..8d0b93889d 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -280,6 +280,9 @@ func TestRemoveAfterMarshal(t *testing.T) { } s, err = NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } ctx := context.Background() @@ -334,7 +337,13 @@ func TestSetAfterMarshal(t *testing.T) { } nd, err = nds.Node() + if err != nil { + t.Fatal(err) + } nds, err = NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } links, err := nds.EnumLinks(ctx) if err != nil { @@ -408,7 +417,13 @@ func TestDuplicateAddShard(t *testing.T) { } node, err := dir.Node() + if err != nil { + t.Fatal(err) + } dir, err = NewHamtFromDag(ds, node) + if err != nil { + t.Fatal(err) + } lnks, err := dir.EnumLinks(ctx) if err != nil { @@ -503,7 +518,13 @@ func TestRemoveElemsAfterMarshal(t *testing.T) { } nd, err = nds.Node() + if err != nil { + t.Fatal(err) + } nds, err = NewHamtFromDag(ds, nd) + if err != nil { + t.Fatal(err) + } links, err := nds.EnumLinks(ctx) if err != nil { diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 4163b80d62..15c7e862a3 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -8,9 +8,9 @@ import ( mdag "github.com/ipfs/go-merkledag" format "github.com/ipfs/go-unixfs" - hamt "github.com/ipfs/go-unixfs/hamt" + "github.com/ipfs/go-unixfs/hamt" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" ) @@ -151,7 +151,7 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err func (d *BasicDirectory) computeEstimatedSize() { d.estimatedSize = 0 - d.ForEachLink(nil, func(l *ipld.Link) error { + d.ForEachLink(context.TODO(), func(l *ipld.Link) error { d.addToEstimatedSize(l.Name, l.Cid) return nil }) From b5d59127b697a0c60df116cec59142ab6c1ee7fd Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 11 Jun 2021 14:03:42 -0700 Subject: [PATCH 3016/3147] chore(deps): move bitfield to ipfs org This commit was moved from ipfs/go-unixfs@a5cc10dc5f2517199908135a5421de68fd8d4495 --- unixfs/hamt/hamt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 374f47df24..55b798ce49 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -25,7 +25,7 @@ import ( "fmt" "os" - bitfield "github.com/Stebalien/go-bitfield" + bitfield "github.com/ipfs/go-bitfield" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" From 10c9d33c5c4a99c0b75009d1e2199049d70b26cb Mon Sep 17 00:00:00 2001 From: Dr Ian Preston Date: Thu, 17 Jun 2021 14:52:14 +0100 Subject: [PATCH 3017/3147] Use bloom filter in GetSize This commit was moved from ipfs/go-ipfs-blockstore@2e485bebeebac8bdc0d000c5115265368e25d710 --- blockstore/bloom_cache.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index da302c97d1..70fe5106bc 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -155,6 +155,10 @@ func (b *bloomcache) Has(k cid.Cid) (bool, error) { } func (b *bloomcache) GetSize(k cid.Cid) (int, error) { + if has, ok := b.hasCached(k); ok && !has { + return -1, ErrNotFound + } + return b.blockstore.GetSize(k) } From daa11ac0a8b4241e83b3bdd90e38226339694a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Thu, 1 Jul 2021 18:18:20 +0200 Subject: [PATCH 3018/3147] Define ErrNotPinned alongside the Pinner interface Allows for alternative implementation with the same error being part of the interface contract. This commit was moved from ipfs/go-ipfs-pinner@3565d71fb90b70426cd6c001fb20f5402661d945 --- pinning/pinner/dspinner/pin.go | 5 +---- pinning/pinner/dspinner/pin_test.go | 4 ++-- pinning/pinner/pin.go | 4 ++++ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pinning/pinner/dspinner/pin.go b/pinning/pinner/dspinner/pin.go index 4adf95a6ea..b793cf2ea6 100644 --- a/pinning/pinner/dspinner/pin.go +++ b/pinning/pinner/dspinner/pin.go @@ -31,9 +31,6 @@ const ( ) var ( - // ErrNotPinned is returned when trying to unpin items that are not pinned. - ErrNotPinned = errors.New("not pinned or pinned indirectly") - log logging.StandardLogger = logging.Logger("pin") linkDirect, linkRecursive string @@ -346,7 +343,7 @@ func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { return err } if !has { - return ErrNotPinned + return ipfspinner.ErrNotPinned } } diff --git a/pinning/pinner/dspinner/pin_test.go b/pinning/pinner/dspinner/pin_test.go index 500d3e3e74..d8c4e95492 100644 --- a/pinning/pinner/dspinner/pin_test.go +++ b/pinning/pinner/dspinner/pin_test.go @@ -260,8 +260,8 @@ func TestPinnerBasic(t *testing.T) { } err = p.Unpin(ctx, dk, true) - if err != ErrNotPinned { - t.Fatal("expected error:", ErrNotPinned) + if err != ipfspin.ErrNotPinned { + t.Fatal("expected error:", ipfspin.ErrNotPinned) } err = p.Flush(ctx) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 2bae758419..bbabac5a03 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -75,6 +75,9 @@ func StringToMode(s string) (Mode, bool) { return mode, ok } +// ErrNotPinned is returned when trying to unpin items that are not pinned. +var ErrNotPinned = fmt.Errorf("not pinned or pinned indirectly") + // A Pinner provides the necessary methods to keep track of Nodes which are // to be kept locally, according to a pin mode. In practice, a Pinner is in // in charge of keeping the list of items from the local storage that should @@ -93,6 +96,7 @@ type Pinner interface { // Unpin the given cid. If recursive is true, removes either a recursive or // a direct pin. If recursive is false, only removes a direct pin. + // If the pin doesn't exist, return ErrNotPinned Unpin(ctx context.Context, cid cid.Cid, recursive bool) error // Update updates a recursive pin from one cid to another From 4c474f60d8b161a0e1b598c07a1ce50b8eee6b51 Mon Sep 17 00:00:00 2001 From: anorth <445306+anorth@users.noreply.github.com> Date: Fri, 16 Jul 2021 11:20:26 +1000 Subject: [PATCH 3019/3147] Fix lint errors This commit was moved from ipfs/go-mfs@352cb78f15d9792154f6823e1728cb8e28935631 --- mfs/file.go | 2 +- mfs/mfs_test.go | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/mfs/file.go b/mfs/file.go index bbe508ac3e..2a2789a3ea 100644 --- a/mfs/file.go +++ b/mfs/file.go @@ -169,7 +169,7 @@ func (fi *File) Sync() error { // just being able to take the writelock means the descriptor is synced // TODO: Why? fi.desclock.Lock() - fi.desclock.Unlock() + defer fi.desclock.Unlock() // Defer works around "empty critical section (SA2001)" return nil } diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 3c08fd9a6b..1ea90ef337 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -1162,6 +1162,7 @@ func TestConcurrentWrites(t *testing.T) { var wg sync.WaitGroup nloops := 100 + errs := make(chan error, 1000) for i := 0; i < 10; i++ { wg.Add(1) go func() { @@ -1171,16 +1172,19 @@ func TestConcurrentWrites(t *testing.T) { err := writeFile(rt, "a/b/c/afile", func(buf []byte) []byte { if len(buf) == 0 { if lastSeen > 0 { - t.Fatalf("file corrupted, last seen: %d", lastSeen) + errs <- fmt.Errorf("file corrupted, last seen: %d", lastSeen) + return buf } buf = make([]byte, 8) } else if len(buf) != 8 { - t.Fatal("buf not the right size") + errs <- fmt.Errorf("buf not the right size") + return buf } num := binary.LittleEndian.Uint64(buf) if num < lastSeen { - t.Fatalf("count decreased: was %d, is %d", lastSeen, num) + errs <- fmt.Errorf("count decreased: was %d, is %d", lastSeen, num) + return buf } else { t.Logf("count correct: was %d, is %d", lastSeen, num) } @@ -1190,13 +1194,17 @@ func TestConcurrentWrites(t *testing.T) { return buf }) if err != nil { - t.Error("writefile failed: ", err) + errs <- fmt.Errorf("writefile failed: %v", err) return } } }() } wg.Wait() + close(errs) + for e := range errs { + t.Fatal(e) + } buf := make([]byte, 8) if err := readFile(rt, "a/b/c/afile", 0, buf); err != nil { t.Fatal(err) @@ -1353,10 +1361,10 @@ func TestTruncateAndWrite(t *testing.T) { } fd, err := fi.Open(Flags{Read: true, Write: true, Sync: true}) - defer fd.Close() if err != nil { t.Fatal(err) } + defer fd.Close() for i := 0; i < 200; i++ { err = fd.Truncate(0) if err != nil { From f99c88be186a5b0402d3ffe58943a8d57f5891b2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 22 Jul 2021 15:47:31 -0700 Subject: [PATCH 3020/3147] fix: remove deprecated calls This commit was moved from ipfs/go-ipns@a2d4e93f7e8ffc9f996471eb1a24ff12c8484120 --- ipns/ipns.go | 2 +- ipns/validate_test.go | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ipns/ipns.go b/ipns/ipns.go index f94863c351..f85b1ad8ec 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -273,7 +273,7 @@ func EmbedPublicKey(pk ic.PubKey, entry *pb.IpnsEntry) error { // We failed to extract the public key from the peer ID, embed it in the // record. - pkBytes, err := pk.Bytes() + pkBytes, err := ic.MarshalPublicKey(pk) if err != nil { return err } diff --git a/ipns/validate_test.go b/ipns/validate_test.go index 276e6d4dac..40b41b6e39 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -17,13 +17,13 @@ import ( proto "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" - ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" pstore "github.com/libp2p/go-libp2p-core/peerstore" pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" ) -func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { +func testValidatorCase(t *testing.T, priv crypto.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { t.Helper() match := func(t *testing.T, err error) { @@ -43,7 +43,7 @@ func testValidatorCase(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key testValidatorCaseMatchFunc(t, priv, kbook, key, val, eol, match) } -func testValidatorCaseMatchFunc(t *testing.T, priv ci.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, matchf func(*testing.T, error)) { +func testValidatorCaseMatchFunc(t *testing.T, priv crypto.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, matchf func(*testing.T, error)) { t.Helper() validator := Validator{kbook} @@ -110,7 +110,7 @@ func TestEmbeddedPubKeyValidate(t *testing.T) { testValidatorCase(t, priv, kbook, ipnsk, mustMarshal(t, entry), goodeol, ErrPublicKeyNotFound) - pubkb, err := priv.GetPublic().Bytes() + pubkb, err := crypto.MarshalPublicKey(priv.GetPublic()) if err != nil { t.Fatal(err) } @@ -126,7 +126,7 @@ func TestEmbeddedPubKeyValidate(t *testing.T) { }) opriv, _, _ := genKeys(t) - wrongkeydata, err := opriv.GetPublic().Bytes() + wrongkeydata, err := crypto.MarshalPublicKey(opriv.GetPublic()) if err != nil { t.Fatal(err) } @@ -143,7 +143,7 @@ func TestPeerIDPubKeyValidate(t *testing.T) { pth := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") - sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + sk, pk, err := crypto.GenerateEd25519Key(rand.New(rand.NewSource(42))) if err != nil { t.Fatal(err) } @@ -171,7 +171,7 @@ func TestPeerIDPubKeyValidate(t *testing.T) { func TestBothSignatureVersionsValidate(t *testing.T) { goodeol := time.Now().Add(time.Hour) - sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + sk, pk, err := crypto.GenerateEd25519Key(rand.New(rand.NewSource(42))) if err != nil { t.Fatal(err) } @@ -200,7 +200,7 @@ func TestBothSignatureVersionsValidate(t *testing.T) { func TestNewSignatureVersionPreferred(t *testing.T) { goodeol := time.Now().Add(time.Hour) - sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + sk, pk, err := crypto.GenerateEd25519Key(rand.New(rand.NewSource(42))) if err != nil { t.Fatal(err) } @@ -272,7 +272,7 @@ func TestNewSignatureVersionPreferred(t *testing.T) { func TestCborDataCanonicalization(t *testing.T) { goodeol := time.Now().Add(time.Hour) - sk, pk, err := ci.GenerateEd25519Key(rand.New(rand.NewSource(42))) + sk, pk, err := crypto.GenerateEd25519Key(rand.New(rand.NewSource(42))) if err != nil { t.Fatal(err) } @@ -372,9 +372,9 @@ func TestCborDataCanonicalization(t *testing.T) { } } -func genKeys(t *testing.T) (ci.PrivKey, peer.ID, string) { +func genKeys(t *testing.T) (crypto.PrivKey, peer.ID, string) { sr := u.NewTimeSeededRand() - priv, _, err := ci.GenerateKeyPairWithReader(ci.RSA, 2048, sr) + priv, _, err := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, sr) if err != nil { t.Fatal(err) } From 3d1dd48587f136d349d9105fe10033e583545578 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 22 Jul 2021 15:51:34 -0700 Subject: [PATCH 3021/3147] fix: remove deprecated call to pk.Bytes And rename import. This commit was moved from ipfs/go-namesys@863ceca683c01626aa03c70921e9c602416fa677 --- namesys/publisher.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index f67a8bf52b..307b3920c3 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -12,7 +12,7 @@ import ( ipns "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" path "github.com/ipfs/go-path" - ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/crypto" peer "github.com/libp2p/go-libp2p-core/peer" routing "github.com/libp2p/go-libp2p-core/routing" base32 "github.com/whyrusleeping/base32" @@ -45,7 +45,7 @@ func NewIpnsPublisher(route routing.ValueStore, ds ds.Datastore) *IpnsPublisher // Publish implements Publisher. Accepts a keypair and a value, // and publishes it out to the routing system -func (p *IpnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { +func (p *IpnsPublisher) Publish(ctx context.Context, k crypto.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordEOL)) } @@ -140,7 +140,7 @@ func (p *IpnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouti return e, nil } -func (p *IpnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) (*pb.IpnsEntry, error) { +func (p *IpnsPublisher) updateRecord(ctx context.Context, k crypto.PrivKey, value path.Path, eol time.Time) (*pb.IpnsEntry, error) { id, err := peer.IDFromPrivateKey(k) if err != nil { return nil, err @@ -190,7 +190,7 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k ci.PrivKey, value pa // PublishWithEOL is a temporary stand in for the ipns records implementation // see here for more details: https://github.com/ipfs/specs/tree/master/records -func (p *IpnsPublisher) PublishWithEOL(ctx context.Context, k ci.PrivKey, value path.Path, eol time.Time) error { +func (p *IpnsPublisher) PublishWithEOL(ctx context.Context, k crypto.PrivKey, value path.Path, eol time.Time) error { record, err := p.updateRecord(ctx, k, value, eol) if err != nil { return err @@ -215,7 +215,7 @@ func checkCtxTTL(ctx context.Context) (time.Duration, bool) { // PutRecordToRouting publishes the given entry using the provided ValueStore, // keyed on the ID associated with the provided public key. The public key is // also made available to the routing system so that entries can be verified. -func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k ci.PubKey, entry *pb.IpnsEntry) error { +func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k crypto.PubKey, entry *pb.IpnsEntry) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -265,9 +265,9 @@ func waitOnErrChan(ctx context.Context, errs chan error) error { // PublishPublicKey stores the given public key in the ValueStore with the // given key. -func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk ci.PubKey) error { +func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk crypto.PubKey) error { log.Debugf("Storing pubkey at: %s", k) - pkbytes, err := pubk.Bytes() + pkbytes, err := crypto.MarshalPublicKey(pubk) if err != nil { return err } From e1880a0df237d26a90434f6835c49af69f8f7d6d Mon Sep 17 00:00:00 2001 From: Andrew Gillis Date: Thu, 29 Jul 2021 08:39:25 -0700 Subject: [PATCH 3022/3147] Fix/minimize rebuild (#15) * Sync pinner on every pin operation by default * Optimize reindexing by writing only corrupt pins * Sync periodically while reindexing * Log pinning and reindexing operations Co-authored-by: Petar Maymounkov This commit was moved from ipfs/go-ipfs-pinner@f708928dd30b209c6fc0d9aa2c3996fe0f8af22a --- pinning/pinner/dsindex/indexer.go | 32 +- pinning/pinner/dspinner/pin.go | 447 +++++++++++++++++---------- pinning/pinner/dspinner/pin_test.go | 336 ++++++++++++++++++-- pinning/pinner/dspinner/sync_test.go | 88 ++++++ 4 files changed, 694 insertions(+), 209 deletions(-) create mode 100644 pinning/pinner/dspinner/sync_test.go diff --git a/pinning/pinner/dsindex/indexer.go b/pinning/pinner/dsindex/indexer.go index e1119acacc..884cd8025f 100644 --- a/pinning/pinner/dsindex/indexer.go +++ b/pinning/pinner/dsindex/indexer.go @@ -112,40 +112,30 @@ func (x *indexer) ForEach(ctx context.Context, key string, fn func(key, value st if err != nil { return err } + defer results.Close() - for { - r, ok := results.NextSync() - if !ok { - break + for r := range results.Next() { + if ctx.Err() != nil { + return ctx.Err() } if r.Error != nil { - err = r.Error - break - } - if ctx.Err() != nil { - err = ctx.Err() - break + return fmt.Errorf("cannot read index: %v", r.Error) } ent := r.Entry - var decIdx string - decIdx, err = decode(path.Base(path.Dir(ent.Key))) + decIdx, err := decode(path.Base(path.Dir(ent.Key))) if err != nil { - err = fmt.Errorf("cannot decode index: %v", err) - break + return fmt.Errorf("cannot decode index: %v", err) } - var decKey string - decKey, err = decode(path.Base(ent.Key)) + decKey, err := decode(path.Base(ent.Key)) if err != nil { - err = fmt.Errorf("cannot decode key: %v", err) - break + return fmt.Errorf("cannot decode key: %v", err) } if !fn(decIdx, decKey) { - break + return nil } } - results.Close() - return err + return nil } func (x *indexer) HasValue(ctx context.Context, key, value string) (bool, error) { diff --git a/pinning/pinner/dspinner/pin.go b/pinning/pinner/dspinner/pin.go index b793cf2ea6..a02f015478 100644 --- a/pinning/pinner/dspinner/pin.go +++ b/pinning/pinner/dspinner/pin.go @@ -84,7 +84,8 @@ func init() { // pinner implements the Pinner interface type pinner struct { - lock sync.RWMutex + autoSync bool + lock sync.RWMutex dserv ipld.DAGService dstore ds.Datastore @@ -113,7 +114,7 @@ func (p *pin) dsKey() ds.Key { func newPin(c cid.Cid, mode ipfspinner.Mode, name string) *pin { return &pin{ - Id: ds.RandomKey().String(), + Id: path.Base(ds.RandomKey().String()), Cid: c, Name: name, Mode: mode, @@ -127,8 +128,13 @@ type syncDAGService interface { // New creates a new pinner and loads its keysets from the given datastore. If // there is no data present in the datastore, then an empty pinner is returned. -func New(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService) (ipfspinner.Pinner, error) { +// +// By default, changes are automatically flushed to the datastore. This can be +// disabled by calling SetAutosync(false), which will require that Flush be +// called explicitly. +func New(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService) (*pinner, error) { p := &pinner{ + autoSync: true, cidDIndex: dsindex.New(dstore, ds.NewKey(pinCidDIndexPath)), cidRIndex: dsindex.New(dstore, ds.NewKey(pinCidRIndexPath)), nameIndex: dsindex.New(dstore, ds.NewKey(pinNameIndexPath)), @@ -146,12 +152,7 @@ func New(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService) (ipfsp if data[0] == 1 { p.dirty = 1 - pins, err := p.loadAllPins(ctx) - if err != nil { - return nil, fmt.Errorf("cannot load pins: %v", err) - } - - err = p.rebuildIndexes(ctx, pins) + err = p.rebuildIndexes(ctx) if err != nil { return nil, fmt.Errorf("cannot rebuild indexes: %v", err) } @@ -160,6 +161,17 @@ func New(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService) (ipfsp return p, nil } +// SetAutosync allows auto-syncing to be enabled or disabled during runtime. +// This may be used to turn off autosync before doing many repeated pinning +// operations, and then turn it on after. Returns the previous value. +func (p *pinner) SetAutosync(auto bool) bool { + p.lock.Lock() + defer p.lock.Unlock() + + p.autoSync, auto = auto, p.autoSync + return auto +} + // Pin the given node, optionally recursive func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { err := p.dserv.Add(ctx, node) @@ -193,6 +205,12 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { return err } + // If autosyncing, sync dag service before making any change to pins + err = p.flushDagService(ctx, false) + if err != nil { + return err + } + // Only look again if something has changed. if p.dirty != dirtyBefore { found, err = p.cidRIndex.HasAny(ctx, cidKey) @@ -210,7 +228,10 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { return err } if found { - p.removePinsForCid(ctx, c, ipfspinner.Direct) + _, err = p.removePinsForCid(ctx, c, ipfspinner.Direct) + if err != nil { + return err + } } _, err = p.addPin(ctx, c, ipfspinner.Recursive, "") @@ -231,7 +252,7 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { return err } } - return nil + return p.flushPins(ctx, false) } func (p *pinner) addPin(ctx context.Context, c cid.Cid, mode ipfspinner.Mode, name string) (string, error) { @@ -244,7 +265,13 @@ func (p *pinner) addPin(ctx context.Context, c cid.Cid, mode ipfspinner.Mode, na return "", fmt.Errorf("could not encode pin: %v", err) } - p.setDirty(ctx, true) + p.setDirty(ctx) + + // Store the pin + err = p.dstore.Put(pp.dsKey(), pinData) + if err != nil { + return "", err + } // Store CID index switch mode { @@ -263,36 +290,28 @@ func (p *pinner) addPin(ctx context.Context, c cid.Cid, mode ipfspinner.Mode, na // Store name index err = p.nameIndex.Add(ctx, name, pp.Id) if err != nil { + if mode == ipfspinner.Recursive { + e := p.cidRIndex.Delete(ctx, c.KeyString(), pp.Id) + if e != nil { + log.Errorf("error deleting index: %s", e) + } + } else { + e := p.cidDIndex.Delete(ctx, c.KeyString(), pp.Id) + if e != nil { + log.Errorf("error deleting index: %s", e) + } + } return "", fmt.Errorf("could not add pin name index: %v", err) } } - // Store the pin. Pin must be stored after index for recovery to work. - err = p.dstore.Put(pp.dsKey(), pinData) - if err != nil { - if mode == ipfspinner.Recursive { - p.cidRIndex.Delete(ctx, c.KeyString(), pp.Id) - } else { - p.cidDIndex.Delete(ctx, c.KeyString(), pp.Id) - } - if name != "" { - p.nameIndex.Delete(ctx, name, pp.Id) - } - return "", err - } - return pp.Id, nil } func (p *pinner) removePin(ctx context.Context, pp *pin) error { - p.setDirty(ctx, true) + p.setDirty(ctx) + var err error - // Remove pin from datastore. Pin must be removed before index for - // recovery to work. - err := p.dstore.Delete(pp.dsKey()) - if err != nil { - return err - } // Remove cid index from datastore if pp.Mode == ipfspinner.Recursive { err = p.cidRIndex.Delete(ctx, pp.Cid.KeyString(), pp.Id) @@ -311,6 +330,13 @@ func (p *pinner) removePin(ctx context.Context, pp *pin) error { } } + // The pin is removed last so that an incomplete remove is detected by a + // pin that has a missing index. + err = p.dstore.Delete(pp.dsKey()) + if err != nil { + return err + } + return nil } @@ -347,12 +373,15 @@ func (p *pinner) Unpin(ctx context.Context, c cid.Cid, recursive bool) error { } } - _, err = p.removePinsForCid(ctx, c, ipfspinner.Any) + removed, err := p.removePinsForCid(ctx, c, ipfspinner.Any) if err != nil { return err } + if !removed { + return nil + } - return nil + return p.flushPins(ctx, false) } // IsPinned returns whether or not the given key is pinned @@ -542,7 +571,17 @@ func (p *pinner) RemovePinWithMode(c cid.Cid, mode ipfspinner.Mode) { p.lock.Lock() defer p.lock.Unlock() - p.removePinsForCid(ctx, c, mode) + removed, err := p.removePinsForCid(ctx, c, mode) + if err != nil { + log.Error("cound not remove pins: %s", err) + return + } + if !removed { + return + } + if err = p.flushPins(ctx, false); err != nil { + log.Error("cound not remove pins: %s", err) + } } // removePinsForCid removes all pins for a cid that has the specified mode. @@ -583,17 +622,35 @@ func (p *pinner) removePinsForCid(ctx context.Context, c cid.Cid, mode ipfspinne pp, err = p.loadPin(ctx, pid) if err != nil { if err == ds.ErrNotFound { - p.setDirty(ctx, true) + p.setDirty(ctx) // Fix index; remove index for pin that does not exist switch mode { case ipfspinner.Recursive: - p.cidRIndex.DeleteKey(ctx, cidKey) + _, err = p.cidRIndex.DeleteKey(ctx, cidKey) + if err != nil { + return false, fmt.Errorf("error deleting index: %s", err) + } case ipfspinner.Direct: - p.cidDIndex.DeleteKey(ctx, cidKey) + _, err = p.cidDIndex.DeleteKey(ctx, cidKey) + if err != nil { + return false, fmt.Errorf("error deleting index: %s", err) + } case ipfspinner.Any: - p.cidRIndex.DeleteKey(ctx, cidKey) - p.cidDIndex.DeleteKey(ctx, cidKey) + _, err = p.cidRIndex.DeleteKey(ctx, cidKey) + if err != nil { + return false, fmt.Errorf("error deleting index: %s", err) + } + _, err = p.cidDIndex.DeleteKey(ctx, cidKey) + if err != nil { + return false, fmt.Errorf("error deleting index: %s", err) + } + } + if err = p.flushPins(ctx, true); err != nil { + return false, err } + // Mark this as removed since it removed an index, which is + // what prevents determines if an item is pinned. + removed = true log.Error("found CID index with missing pin") continue } @@ -619,95 +676,6 @@ func (p *pinner) loadPin(ctx context.Context, pid string) (*pin, error) { return decodePin(pid, pinData) } -// loadAllPins loads all pins from the datastore. -func (p *pinner) loadAllPins(ctx context.Context) ([]*pin, error) { - q := query.Query{ - Prefix: pinKeyPath, - } - results, err := p.dstore.Query(q) - if err != nil { - return nil, err - } - ents, err := results.Rest() - if err != nil { - return nil, err - } - if len(ents) == 0 { - return nil, nil - } - - pins := make([]*pin, len(ents)) - for i := range ents { - if ctx.Err() != nil { - return nil, ctx.Err() - } - var p *pin - p, err = decodePin(path.Base(ents[i].Key), ents[i].Value) - if err != nil { - return nil, err - } - pins[i] = p - } - return pins, nil -} - -// rebuildIndexes uses the stored pins to rebuild secondary indexes. This -// resolves any discrepancy between secondary indexes and pins that could -// result from a program termination between saving the two. -func (p *pinner) rebuildIndexes(ctx context.Context, pins []*pin) error { - // Build temporary in-memory CID index from pins - dstoreMem := ds.NewMapDatastore() - tmpCidDIndex := dsindex.New(dstoreMem, ds.NewKey(pinCidDIndexPath)) - tmpCidRIndex := dsindex.New(dstoreMem, ds.NewKey(pinCidRIndexPath)) - tmpNameIndex := dsindex.New(dstoreMem, ds.NewKey(pinNameIndexPath)) - var hasNames bool - for _, pp := range pins { - if ctx.Err() != nil { - return ctx.Err() - } - if pp.Mode == ipfspinner.Recursive { - tmpCidRIndex.Add(ctx, pp.Cid.KeyString(), pp.Id) - } else if pp.Mode == ipfspinner.Direct { - tmpCidDIndex.Add(ctx, pp.Cid.KeyString(), pp.Id) - } - if pp.Name != "" { - tmpNameIndex.Add(ctx, pp.Name, pp.Id) - hasNames = true - } - } - - // Sync the CID index to what was build from pins. This fixes any invalid - // indexes, which could happen if ipfs was terminated between writing pin - // and writing secondary index. - changed, err := dsindex.SyncIndex(ctx, tmpCidRIndex, p.cidRIndex) - if err != nil { - return fmt.Errorf("cannot sync indexes: %v", err) - } - if changed { - log.Info("invalid recursive indexes detected - rebuilt") - } - - changed, err = dsindex.SyncIndex(ctx, tmpCidDIndex, p.cidDIndex) - if err != nil { - return fmt.Errorf("cannot sync indexes: %v", err) - } - if changed { - log.Info("invalid direct indexes detected - rebuilt") - } - - if hasNames { - changed, err = dsindex.SyncIndex(ctx, tmpNameIndex, p.nameIndex) - if err != nil { - return fmt.Errorf("cannot sync name indexes: %v", err) - } - if changed { - log.Info("invalid name indexes detected - rebuilt") - } - } - - return p.Flush(ctx) -} - // DirectKeys returns a slice containing the directly pinned keys func (p *pinner) DirectKeys(ctx context.Context) ([]cid.Cid, error) { p.lock.RLock() @@ -810,37 +778,50 @@ func (p *pinner) Update(ctx context.Context, from, to cid.Cid, unpin bool) error return err } - if !unpin { - return nil - } - - _, err = p.removePinsForCid(ctx, from, ipfspinner.Recursive) - if err != nil { - return err + if unpin { + _, err = p.removePinsForCid(ctx, from, ipfspinner.Recursive) + if err != nil { + return err + } } - return nil + return p.flushPins(ctx, false) } -// Flush encodes and writes pinner keysets to the datastore -func (p *pinner) Flush(ctx context.Context) error { - p.lock.Lock() - defer p.lock.Unlock() - +func (p *pinner) flushDagService(ctx context.Context, force bool) error { + if !p.autoSync && !force { + return nil + } if syncDServ, ok := p.dserv.(syncDAGService); ok { if err := syncDServ.Sync(); err != nil { return fmt.Errorf("cannot sync pinned data: %v", err) } } + return nil +} - // Sync pins and indexes +func (p *pinner) flushPins(ctx context.Context, force bool) error { + if !p.autoSync && !force { + return nil + } if err := p.dstore.Sync(ds.NewKey(basePath)); err != nil { return fmt.Errorf("cannot sync pin state: %v", err) } + p.setClean(ctx) + return nil +} - p.setDirty(ctx, false) +// Flush encodes and writes pinner keysets to the datastore +func (p *pinner) Flush(ctx context.Context) error { + p.lock.Lock() + defer p.lock.Unlock() - return nil + err := p.flushDagService(ctx, true) + if err != nil { + return err + } + + return p.flushPins(ctx, true) } // PinWithMode allows the user to have fine grained control over pin @@ -869,6 +850,9 @@ func (p *pinner) PinWithMode(c cid.Cid, mode ipfspinner.Mode) { if err != nil { return } + if err = p.flushPins(ctx, false); err != nil { + log.Errorf("failed to create %s pin: %s", mode, err) + } } // hasChild recursively looks for a Cid among the children of a root Cid. @@ -914,26 +898,163 @@ func decodePin(pid string, data []byte) (*pin, error) { return p, nil } -// setDirty saves a boolean dirty flag in the datastore whenever there is a -// transition between a dirty (counter > 0) and non-dirty (counter == 0) state. -func (p *pinner) setDirty(ctx context.Context, dirty bool) { - isClean := p.dirty == p.clean - if dirty { - p.dirty++ - if !isClean { - return // do not save; was already dirty - } - } else if isClean { +// setDirty updates the dirty counter and saves a dirty state in the datastore +// if the state was previously clean +func (p *pinner) setDirty(ctx context.Context) { + wasClean := p.dirty == p.clean + p.dirty++ + + if !wasClean { + return // do not save; was already dirty + } + + data := []byte{1} + err := p.dstore.Put(dirtyKey, data) + if err != nil { + log.Errorf("failed to set pin dirty flag: %s", err) + return + } + err = p.dstore.Sync(dirtyKey) + if err != nil { + log.Errorf("failed to sync pin dirty flag: %s", err) + } +} + +// setClean saves a clean state value in the datastore if the state was +// previously dirty +func (p *pinner) setClean(ctx context.Context) { + if p.dirty == p.clean { return // already clean - } else { - p.clean = p.dirty // set clean } - // Do edge-triggered write to datastore data := []byte{0} - if dirty { - data[0] = 1 + err := p.dstore.Put(dirtyKey, data) + if err != nil { + log.Errorf("failed to set clear dirty flag: %s", err) + return } - p.dstore.Put(dirtyKey, data) - p.dstore.Sync(dirtyKey) + if err = p.dstore.Sync(dirtyKey); err != nil { + log.Errorf("failed to sync cleared pin dirty flag: %s", err) + return + } + p.clean = p.dirty // set clean +} + +// sync datastore after every 50 cid repairs +const syncRepairFrequency = 50 + +// rebuildIndexes uses the stored pins to rebuild secondary indexes. This +// resolves any discrepancy between secondary indexes and pins that could +// result from a program termination between saving the two. +func (p *pinner) rebuildIndexes(ctx context.Context) error { + // Load all pins from the datastore. + q := query.Query{ + Prefix: pinKeyPath, + } + results, err := p.dstore.Query(q) + if err != nil { + return err + } + defer results.Close() + + var checkedCount, repairedCount int + + // Iterate all pins and check if the corresponding recursive or direct + // index is missing. If the index is missing then create the index. + for r := range results.Next() { + if ctx.Err() != nil { + return ctx.Err() + } + if r.Error != nil { + return fmt.Errorf("cannot read index: %v", r.Error) + } + ent := r.Entry + pp, err := decodePin(path.Base(ent.Key), ent.Value) + if err != nil { + return err + } + + indexKey := pp.Cid.KeyString() + + var indexer, staleIndexer dsindex.Indexer + var idxrName, staleIdxrName string + if pp.Mode == ipfspinner.Recursive { + indexer = p.cidRIndex + staleIndexer = p.cidDIndex + idxrName = linkRecursive + staleIdxrName = linkDirect + } else if pp.Mode == ipfspinner.Direct { + indexer = p.cidDIndex + staleIndexer = p.cidRIndex + idxrName = linkDirect + staleIdxrName = linkRecursive + } else { + log.Error("unrecognized pin mode:", pp.Mode) + continue + } + + // Remove any stale index from unused indexer + ok, err := staleIndexer.HasValue(ctx, indexKey, pp.Id) + if err != nil { + return err + } + if ok { + // Delete any stale index + log.Errorf("deleting stale %s pin index for cid %v", staleIdxrName, pp.Cid.String()) + if err = staleIndexer.Delete(ctx, indexKey, pp.Id); err != nil { + return err + } + } + + // Check that the indexer indexes this pin + ok, err = indexer.HasValue(ctx, indexKey, pp.Id) + if err != nil { + return err + } + + var repaired bool + if !ok { + // Do not rebuild if index has an old value with leading slash + ok, err = indexer.HasValue(ctx, indexKey, "/"+pp.Id) + if err != nil { + return err + } + if !ok { + log.Errorf("repairing %s pin index for cid: %s", idxrName, pp.Cid.String()) + // There was no index found for this pin. This was either an + // incomplete add or and incomplete delete of a pin. Either + // way, restore the index to complete the add or to undo the + // incomplete delete. + if err = indexer.Add(ctx, indexKey, pp.Id); err != nil { + return err + } + repaired = true + } + } + // Check for missing name index + if pp.Name != "" { + ok, err = p.nameIndex.HasValue(ctx, pp.Name, pp.Id) + if err != nil { + return err + } + if !ok { + log.Errorf("repairing name pin index for cid: %s", pp.Cid.String()) + if err = p.nameIndex.Add(ctx, pp.Name, pp.Id); err != nil { + return err + } + } + repaired = true + } + + if repaired { + repairedCount++ + } + checkedCount++ + if checkedCount%syncRepairFrequency == 0 { + p.flushPins(ctx, true) + } + } + + log.Errorf("checked %d pins for invalid indexes, repaired %d pins", checkedCount, repairedCount) + return p.flushPins(ctx, true) } diff --git a/pinning/pinner/dspinner/pin_test.go b/pinning/pinner/dspinner/pin_test.go index d8c4e95492..ed28286580 100644 --- a/pinning/pinner/dspinner/pin_test.go +++ b/pinning/pinner/dspinner/pin_test.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io" + "path" "testing" "time" @@ -13,6 +14,7 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/query" dssync "github.com/ipfs/go-datastore/sync" lds "github.com/ipfs/go-ds-leveldb" blockstore "github.com/ipfs/go-ipfs-blockstore" @@ -162,11 +164,20 @@ func TestPinnerBasic(t *testing.T) { assertPinnedWithType(t, p, bk, ipfspin.Recursive, "Recursively pinned node not found") d, _ := randNode() - d.AddNodeLink("a", a) - d.AddNodeLink("c", c) + err = d.AddNodeLink("a", a) + if err != nil { + panic(err) + } + err = d.AddNodeLink("c", c) + if err != nil { + panic(err) + } e, _ := randNode() - d.AddNodeLink("e", e) + err = d.AddNodeLink("e", e) + if err != nil { + panic(err) + } // Must be in dagserv for unpin to work err = dserv.Add(ctx, e) @@ -281,15 +292,14 @@ func TestPinnerBasic(t *testing.T) { assertPinned(t, p, bk, "could not find recursively pinned node") // Remove the pin but not the index to simulate corruption - dsp := p.(*pinner) - ids, err := dsp.cidDIndex.Search(ctx, ak.KeyString()) + ids, err := p.cidDIndex.Search(ctx, ak.KeyString()) if err != nil { t.Fatal(err) } if len(ids) == 0 { t.Fatal("did not find pin for cid", ak.String()) } - pp, err := dsp.loadPin(ctx, ids[0]) + pp, err := p.loadPin(ctx, ids[0]) if err != nil { t.Fatal(err) } @@ -299,7 +309,7 @@ func TestPinnerBasic(t *testing.T) { if pp.Cid != ak { t.Error("loaded pin has wrong cid") } - err = dsp.dstore.Delete(pp.dsKey()) + err = p.dstore.Delete(pp.dsKey()) if err != nil { t.Fatal(err) } @@ -331,15 +341,16 @@ func TestAddLoadPin(t *testing.T) { dserv := mdag.NewDAGService(bserv) - ipfsPin, err := New(ctx, dstore, dserv) + p, err := New(ctx, dstore, dserv) if err != nil { t.Fatal(err) } - p := ipfsPin.(*pinner) - a, ak := randNode() - dserv.Add(ctx, a) + err = dserv.Add(ctx, a) + if err != nil { + panic(err) + } mode := ipfspin.Recursive name := "my-pin" @@ -380,11 +391,17 @@ func TestRemovePinWithMode(t *testing.T) { } a, ak := randNode() - dserv.Add(ctx, a) + err = dserv.Add(ctx, a) + if err != nil { + panic(err) + } - p.Pin(ctx, a, false) + err = p.Pin(ctx, a, false) + if err != nil { + t.Fatal(err) + } - ok, err := p.(*pinner).removePinsForCid(ctx, ak, ipfspin.Recursive) + ok, err := p.removePinsForCid(ctx, ak, ipfspin.Recursive) if err != nil { t.Fatal(err) } @@ -642,6 +659,18 @@ func TestLoadDirty(t *testing.T) { if err != nil { t.Fatal(err) } + prev := p.SetAutosync(false) + if !prev { + t.Fatal("expected previous autosync to be true") + } + prev = p.SetAutosync(false) + if prev { + t.Fatal("expected previous autosync to be false") + } + prev = p.SetAutosync(true) + if prev { + t.Fatal("expected previous autosync to be false") + } a, ak := randNode() err = dserv.Add(ctx, a) @@ -660,9 +689,18 @@ func TestLoadDirty(t *testing.T) { cidBKey := bk.KeyString() // Corrupt index - cidRIndex := p.(*pinner).cidRIndex - cidRIndex.DeleteKey(ctx, cidAKey) - cidRIndex.Add(ctx, cidBKey, "not-a-pin-id") + cidRIndex := p.cidRIndex + _, err = cidRIndex.DeleteKey(ctx, cidAKey) + if err != nil { + t.Fatal(err) + } + err = cidRIndex.Add(ctx, cidBKey, "not-a-pin-id") + if err != nil { + t.Fatal(err) + } + + // Force dirty, since Pin syncs automatically + p.setDirty(ctx) // Verify dirty data, err := dstore.Get(dirtyKey) @@ -681,7 +719,8 @@ func TestLoadDirty(t *testing.T) { t.Fatal("index should be deleted") } - // Create new pinner on same datastore that was never flushed. + // Create new pinner on same datastore that was never flushed. This should + // detect the dirty flag and repair the indexes. p, err = New(ctx, dstore, dserv) if err != nil { t.Fatal(err) @@ -697,7 +736,7 @@ func TestLoadDirty(t *testing.T) { } // Verify index rebuilt - cidRIndex = p.(*pinner).cidRIndex + cidRIndex = p.cidRIndex has, err = cidRIndex.HasAny(ctx, cidAKey) if err != nil { t.Fatal(err) @@ -706,12 +745,12 @@ func TestLoadDirty(t *testing.T) { t.Fatal("index should have been rebuilt") } - has, err = cidRIndex.HasAny(ctx, cidBKey) + has, err = p.removePinsForCid(ctx, bk, ipfspin.Any) if err != nil { t.Fatal(err) } - if has { - t.Fatal("index should have been removed by rebuild") + if !has { + t.Fatal("expected Unpin to return true since index removed") } } @@ -903,7 +942,7 @@ func makeStore() (ds.Datastore, ipld.DAGService) { // BenchmarkLoadRebuild loads a pinner that has some number of saved pins, and // compares the load time when rebuilding indexes to loading without rebuilding // indexes. -func BenchmarkLoadRebuild(b *testing.B) { +func BenchmarkLoad(b *testing.B) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -918,7 +957,10 @@ func BenchmarkLoadRebuild(b *testing.B) { b.Run("RebuildTrue", func(b *testing.B) { for i := 0; i < b.N; i++ { - dstore.Put(dirtyKey, []byte{1}) + err = dstore.Put(dirtyKey, []byte{1}) + if err != nil { + panic(err.Error()) + } _, err = New(ctx, dstore, dserv) if err != nil { @@ -929,7 +971,10 @@ func BenchmarkLoadRebuild(b *testing.B) { b.Run("RebuildFalse", func(b *testing.B) { for i := 0; i < b.N; i++ { - dstore.Put(dirtyKey, []byte{0}) + err = dstore.Put(dirtyKey, []byte{0}) + if err != nil { + panic(err.Error()) + } _, err = New(ctx, dstore, dserv) if err != nil { @@ -1097,3 +1142,244 @@ func benchmarkPinAll(b *testing.B, count int, pinner ipfspin.Pinner, dserv ipld. b.StartTimer() } } + +func BenchmarkRebuild(b *testing.B) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore, dserv := makeStore() + pinIncr := 32768 + + for pins := pinIncr; pins <= pinIncr*5; pins += pinIncr { + pinner, err := New(ctx, dstore, dserv) + if err != nil { + panic(err.Error()) + } + nodes := makeNodes(pinIncr, dserv) + pinNodes(nodes, pinner, true) + + b.Run(fmt.Sprintf("Rebuild %d", pins), func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + err = dstore.Put(dirtyKey, []byte{1}) + if err != nil { + panic(err.Error()) + } + + _, err = New(ctx, dstore, dserv) + if err != nil { + panic(err.Error()) + } + } + }) + } +} + +func TestCidIndex(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore, dserv := makeStore() + pinner, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + nodes := makeNodes(1, dserv) + node := nodes[0] + + c := node.Cid() + cidKey := c.KeyString() + + // Pin the cid + pid, err := pinner.addPin(ctx, c, ipfspin.Recursive, "") + if err != nil { + t.Fatal(err) + } + + t.Log("Added pin:", pid) + t.Log("CID index:", c.String(), "-->", pid) + + // Check that the index exists + ok, err := pinner.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + t.Fatal(err) + } + if !ok { + t.Fatal("R-index has no value for", cidKey) + } + + // Check that searching for the cid returns a value + values, err := pinner.cidRIndex.Search(ctx, cidKey) + if err != nil { + t.Fatal(err) + } + if len(values) != 1 { + t.Fatal("expect index to return one value") + } + if values[0] != pid { + t.Fatal("indexer should have has value", cidKey, "-->", pid) + } + + // Check that index has specific value + ok, err = pinner.cidRIndex.HasValue(ctx, cidKey, pid) + if err != nil { + t.Fatal(err) + } + if !ok { + t.Fatal("indexer should have has value", cidKey, "-->", pid) + } + + // Iterate values of index + var seen bool + err = pinner.cidRIndex.ForEach(ctx, "", func(key, value string) bool { + if seen { + t.Fatal("expected one key-value pair") + } + if key != cidKey { + t.Fatal("unexpected key:", key) + } + if value != pid { + t.Fatal("unexpected value:", value) + } + seen = true + return true + }) + if err != nil { + t.Fatal(err) + } + + // Load all pins from the datastore. + q := query.Query{ + Prefix: pinKeyPath, + } + results, err := pinner.dstore.Query(q) + if err != nil { + t.Fatal(err) + } + defer results.Close() + + // Iterate all pins and check if the corresponding recursive or direct + // index is missing. If the index is missing then create the index. + seen = false + for r := range results.Next() { + if seen { + t.Fatal("has more than one pin") + } + if r.Error != nil { + t.Fatal(fmt.Errorf("cannot read index: %v", r.Error)) + } + ent := r.Entry + pp, err := decodePin(path.Base(ent.Key), ent.Value) + if err != nil { + t.Fatal(err) + } + t.Log("Found pin:", pp.Id) + if pp.Id != pid { + t.Fatal("ID of loaded pin is not the same known to indexer") + } + seen = true + } +} + +func TestRebuild(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + dstore, dserv := makeStore() + pinner, err := New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + nodes := makeNodes(3, dserv) + pinNodes(nodes, pinner, true) + + c1 := nodes[0].Cid() + cid1Key := c1.KeyString() + c2 := nodes[1].Cid() + cid2Key := c2.KeyString() + c3 := nodes[2].Cid() + cid3Key := c3.KeyString() + + // Get pin IDs + values, err := pinner.cidRIndex.Search(ctx, cid1Key) + if err != nil { + t.Fatal(err) + } + pid1 := values[0] + values, err = pinner.cidRIndex.Search(ctx, cid2Key) + if err != nil { + t.Fatal(err) + } + pid2 := values[0] + values, err = pinner.cidRIndex.Search(ctx, cid3Key) + if err != nil { + t.Fatal(err) + } + pid3 := values[0] + + // Corrupt by adding direct index when there is already a recursive index + err = pinner.cidDIndex.Add(ctx, cid1Key, pid1) + if err != nil { + t.Fatal(err) + } + + // Corrupt index by deleting cid index 2 to simulate an incomplete add or delete + _, err = pinner.cidRIndex.DeleteKey(ctx, cid2Key) + if err != nil { + t.Fatal(err) + } + + // Corrupt index by deleting pin to simulate corruption + var pp *pin + pp, err = pinner.loadPin(ctx, pid3) + if err != nil { + t.Fatal(err) + } + err = pinner.dstore.Delete(pp.dsKey()) + if err != nil { + t.Fatal(err) + } + + pinner.setDirty(ctx) + + // Rebuild indexes + pinner, err = New(ctx, dstore, dserv) + if err != nil { + t.Fatal(err) + } + + // Verify that indexes have same values as before + err = verifyIndexValue(ctx, pinner, cid1Key, pid1) + if err != nil { + t.Fatal(err) + } + err = verifyIndexValue(ctx, pinner, cid2Key, pid2) + if err != nil { + t.Fatal(err) + } + err = verifyIndexValue(ctx, pinner, cid3Key, pid3) + if err != nil { + t.Fatal(err) + } +} + +func verifyIndexValue(ctx context.Context, pinner *pinner, cidKey, expectedPid string) error { + values, err := pinner.cidRIndex.Search(ctx, cidKey) + if err != nil { + return err + } + if len(values) != 1 { + return errors.New("expected 1 value") + } + if expectedPid != values[0] { + return errors.New("index has wrong value") + } + ok, err := pinner.cidDIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if ok { + return errors.New("should not have a direct index") + } + return nil +} diff --git a/pinning/pinner/dspinner/sync_test.go b/pinning/pinner/dspinner/sync_test.go new file mode 100644 index 0000000000..0f3c81ad41 --- /dev/null +++ b/pinning/pinner/dspinner/sync_test.go @@ -0,0 +1,88 @@ +package dspinner + +import ( + "context" + "os" + "testing" + + bs "github.com/ipfs/go-blockservice" + ds "github.com/ipfs/go-datastore" + bds "github.com/ipfs/go-ds-badger" + lds "github.com/ipfs/go-ds-leveldb" + blockstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" + ipld "github.com/ipfs/go-ipld-format" + mdag "github.com/ipfs/go-merkledag" +) + +func makeStoreLevelDB(dir string) (ds.Datastore, ipld.DAGService) { + ldstore, err := lds.NewDatastore(dir, nil) + if err != nil { + panic(err) + } + // dstore := &batchWrap{ldstore} + dstore := ldstore + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + dserv := mdag.NewDAGService(bserv) + return dstore, dserv +} + +func makeStoreBadger(dir string) (ds.Datastore, ipld.DAGService) { + bdstore, err := bds.NewDatastore(dir, nil) + if err != nil { + panic(err) + } + dstore := &batchWrap{bdstore} + bstore := blockstore.NewBlockstore(dstore) + bserv := bs.New(bstore, offline.Exchange(bstore)) + dserv := mdag.NewDAGService(bserv) + return dstore, dserv +} + +func benchAutoSync(b *testing.B, N int, auto bool, dstore ds.Datastore, dserv ipld.DAGService) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + pinner, err := New(ctx, dstore, dserv) + if err != nil { + panic(err.Error()) + } + + nodes := makeNodes(N, dserv) + + pinner.SetAutosync(auto) + pinNodes(nodes, pinner, true) +} + +func BenchmarkSyncOnceBadger(b *testing.B) { + const dsDir = "b-once" + dstoreB1, dservB1 := makeStoreBadger(dsDir) + defer os.RemoveAll(dsDir) + benchAutoSync(b, b.N, false, dstoreB1, dservB1) + dstoreB1.Close() +} + +func BenchmarkSyncEveryBadger(b *testing.B) { + const dsDir = "b-every" + dstoreB2, dservB2 := makeStoreBadger(dsDir) + defer os.RemoveAll(dsDir) + benchAutoSync(b, b.N, true, dstoreB2, dservB2) + dstoreB2.Close() +} + +func BenchmarkSyncOnceLevelDB(b *testing.B) { + const dsDir = "l-once" + dstoreL1, dservL1 := makeStoreLevelDB(dsDir) + defer os.RemoveAll(dsDir) + benchAutoSync(b, b.N, false, dstoreL1, dservL1) + dstoreL1.Close() +} + +func BenchmarkSyncEveryLevelDB(b *testing.B) { + const dsDir = "l-every" + dstoreL2, dservL2 := makeStoreLevelDB(dsDir) + defer os.RemoveAll(dsDir) + benchAutoSync(b, b.N, true, dstoreL2, dservL2) + dstoreL2.Close() +} From 999b9e081d04a3af1c3427c97b3b7ef08d0bb56a Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Mon, 2 Aug 2021 14:42:09 -0700 Subject: [PATCH 3023/3147] add constructor that doesnt mess with datastore keys This commit was moved from ipfs/go-ipfs-blockstore@c56038684c45ce32184d5c1441d7e8b1d6bfa512 --- blockstore/blockstore.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 6625a34113..0f96866834 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -121,6 +121,16 @@ func NewBlockstore(d ds.Batching) Blockstore { } } +// NewBlockstoreNoPrefix returns a default Blockstore implementation +// using the provided datastore.Batching backend. +// This constructor does not modify input keys in any way +func NewBlockstoreNoPrefix(d ds.Batching) Blockstore { + return &blockstore{ + datastore: d, + rehash: uatomic.NewBool(false), + } +} + type blockstore struct { datastore ds.Batching From 7310da4b188ccb6f10f772e688a5aecbd44a4fde Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 5 Aug 2021 23:33:41 -0700 Subject: [PATCH 3024/3147] style(comments): make comment more accurate This commit was moved from ipfs/go-fetcher@e5100db9d7788d8a7a3d0243f0ef891b5e849d56 --- fetcher/impl/blockservice/fetcher.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fetcher/impl/blockservice/fetcher.go b/fetcher/impl/blockservice/fetcher.go index 0a0244d8b5..b0ee9f417c 100644 --- a/fetcher/impl/blockservice/fetcher.go +++ b/fetcher/impl/blockservice/fetcher.go @@ -104,7 +104,8 @@ func (f *fetcherSession) PrototypeFromLink(lnk ipld.Link) (ipld.NodePrototype, e return f.protoChooser(lnk, ipld.LinkContext{}) } -// DefaultPrototypeChooser supports DagPB nodes and choosing the prototype from the link. +// DefaultPrototypeChooser supports choosing the prototype from the link and falling +// back to a basicnode.Any builder var DefaultPrototypeChooser = func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { return tlnkNd.LinkTargetNodePrototype(), nil From dff188c46985a4db71239bab0fb49194115527f7 Mon Sep 17 00:00:00 2001 From: Will Scott Date: Mon, 9 Aug 2021 22:55:11 -0700 Subject: [PATCH 3025/3147] Add a WithReifier method to allow easier derivation of different pathing semantics This commit was moved from ipfs/go-fetcher@b24de2cb27b4008c031e886138a6f348ecaffd16 --- fetcher/impl/blockservice/fetcher.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fetcher/impl/blockservice/fetcher.go b/fetcher/impl/blockservice/fetcher.go index b0ee9f417c..237f3f9551 100644 --- a/fetcher/impl/blockservice/fetcher.go +++ b/fetcher/impl/blockservice/fetcher.go @@ -50,6 +50,16 @@ func (fc FetcherConfig) NewSession(ctx context.Context) fetcher.Fetcher { return &fetcherSession{linkSystem: ls, protoChooser: protoChooser} } +// WithReifier derives a different fetcher factory from the same source but +// with a chosen NodeReifier for pathing semantics. +func (fc FetcherConfig) WithReifier(nr ipld.NodeReifier) fetcher.Factory { + return FetcherConfig{ + blockService: fc.blockService, + NodeReifier: nr, + PrototypeChooser: fc.PrototypeChooser, + } +} + // interface check var _ fetcher.Factory = FetcherConfig{} From 49cba9701f51ad69bfcd89b8b45dbecf44fe5f7e Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 12 Aug 2021 08:41:35 -0700 Subject: [PATCH 3026/3147] fix(tests): fix tests for ipld update This commit was moved from ipfs/go-fetcher@ef6ef50eaf5c3968d412d87980e3ff45a7e3e6c2 --- fetcher/helpers/block_visitor_test.go | 4 ++-- fetcher/testutil/testutil.go | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fetcher/helpers/block_visitor_test.go b/fetcher/helpers/block_visitor_test.go index f7837043fd..2fcf58d037 100644 --- a/fetcher/helpers/block_visitor_test.go +++ b/fetcher/helpers/block_visitor_test.go @@ -88,8 +88,8 @@ func TestFetchGraphToUniqueBlocks(t *testing.T) { na.AssembleEntry("foo").AssignBool(true) na.AssembleEntry("bar").AssignBool(false) na.AssembleEntry("nested").CreateMap(2, func(na fluent.MapAssembler) { - na.AssembleEntry("link3").AssignLink(link3) na.AssembleEntry("link2").AssignLink(link2) + na.AssembleEntry("link3").AssignLink(link3) na.AssembleEntry("nonlink").AssignString("zoo") }) })) @@ -125,7 +125,7 @@ func TestFetchGraphToUniqueBlocks(t *testing.T) { })) require.NoError(t, err) - assertBlocksInOrder(t, results, 3, map[int]ipld.Node{0: node1, 1: node3, 2: node2}) + assertBlocksInOrder(t, results, 3, map[int]ipld.Node{0: node1, 1: node2, 2: node3}) } func assertBlocksInOrder(t *testing.T, results []helpers.BlockResult, nodeCount int, nodes map[int]ipld.Node) { diff --git a/fetcher/testutil/testutil.go b/fetcher/testutil/testutil.go index f67e6ca767..ecb7ac102e 100644 --- a/fetcher/testutil/testutil.go +++ b/fetcher/testutil/testutil.go @@ -24,6 +24,9 @@ func EncodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { MhType: 0x17, MhLength: 20, }} + ls.StorageReadOpener = func(ipld.LinkContext, ipld.Link) (io.Reader, error) { + return bytes.NewReader(b.RawData()), nil + } ls.StorageWriteOpener = func(ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { buf := bytes.Buffer{} return &buf, func(lnk ipld.Link) error { @@ -40,5 +43,9 @@ func EncodeBlock(n ipld.Node) (blocks.Block, ipld.Node, ipld.Link) { if err != nil { panic(err) } - return b, n, lnk + ln, err := ls.Load(ipld.LinkContext{}, lnk, n.Prototype()) + if err != nil { + panic(err) + } + return b, ln, lnk } From 1df7385e41f9e784e014612e3c960878051a19e0 Mon Sep 17 00:00:00 2001 From: Hannah Howard Date: Thu, 12 Aug 2021 08:52:05 -0700 Subject: [PATCH 3027/3147] IPLD Prime In IPFS: Target Merge Branch (#36) * Use go-fetcher, unixfsnode, and ipld-prime to resolve paths. (#34) * first pass * Update resolver/resolver.go Co-authored-by: Eric Myhre * update dependencies to tagged versions * correctly handles nested nodes within blocks * return link from resolve path so we can fetch container block * return expected NoSuchLink error * more accurate errors * feat(resolver): remove resolve once remove ResolveOnce as it's no longer used and is just confusing Co-authored-by: acruikshank Co-authored-by: Eric Myhre Co-authored-by: hannahhoward * fix(update to tagged branches): update to tagged branches and use node reifier * fix(deps): update go-unixfsnode * fix(deps): update to latest go fetcher (#37) * feat(resolver): take fetcher config as parameter (#38) * fix(deps): switch to tagged go-fetcher * fix(resolver): removed ipldcbor dependency * fix(mod): remove unneeded deps * fix(resolver): correct comments * test(resolver): add test verifying ErrNoLink functionality * fix(lint): fix lint errors resolve go vet and staticcheck issues. note we had to ignore two lines that use deprecated behavior, but which replacing could have unintended effects * fix(resolver): LookupBySegment to handle list indexes as well as map fields (#42) * fix(resolver): LookupBySegment to handle list indexes as well as map fields * Add test for /mixed/path/segment/types/1/2/3 * feat(resolver): address more PR comments * style(tests): add clarification * style(lint): fix lint errors, redo test fix * fix(deps): update deps to tagged version Co-authored-by: Alex Cruikshank <169613+acruikshank@users.noreply.github.com> Co-authored-by: acruikshank Co-authored-by: Eric Myhre Co-authored-by: Rod Vagg This commit was moved from ipfs/go-path@ea3a11629c2ec53a75b322a6deeb7d4bc1641339 --- path/resolver/resolver.go | 260 +++++++++++++++++++++------------ path/resolver/resolver_test.go | 204 ++++++++++++++++++++++---- 2 files changed, 339 insertions(+), 125 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 9f153840c8..e42855e0cf 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -7,12 +7,19 @@ import ( "fmt" "time" + "github.com/ipld/go-ipld-prime/schema" + path "github.com/ipfs/go-path" cid "github.com/ipfs/go-cid" - ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-fetcher" + fetcherhelpers "github.com/ipfs/go-fetcher/helpers" + format "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" - dag "github.com/ipfs/go-merkledag" + "github.com/ipld/go-ipld-prime" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) var log = logging.Logger("pathresolv") @@ -34,29 +41,24 @@ func (e ErrNoLink) Error() string { return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.String()) } -// ResolveOnce resolves path through a single node -type ResolveOnce func(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) - // Resolver provides path resolution to IPFS -// It has a pointer to a DAGService, which is uses to resolve nodes. +// It references a FetcherFactory, which is uses to resolve nodes. // TODO: now that this is more modular, try to unify this code with the // the resolvers in namesys type Resolver struct { - DAG ipld.NodeGetter - - ResolveOnce ResolveOnce + FetcherFactory fetcher.Factory } // NewBasicResolver constructs a new basic resolver. -func NewBasicResolver(ds ipld.DAGService) *Resolver { +func NewBasicResolver(fetcherFactory fetcher.Factory) *Resolver { return &Resolver{ - DAG: ds, - ResolveOnce: ResolveSingle, + FetcherFactory: fetcherFactory, } } -// ResolveToLastNode walks the given path and returns the cid of the last node -// referenced by the path +// ResolveToLastNode walks the given path and returns the cid of the last block +// referenced by the path, and the path segments to traverse from the final block boundary to the final node +// within the block. func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { c, p, err := path.SplitAbsPath(fpath) if err != nil { @@ -67,147 +69,213 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. return c, nil, nil } - nd, err := r.DAG.Get(ctx, c) + // create a selector to traverse and match all path segments + pathSelector := pathAllSelector(p[:len(p)-1]) + + // resolve node before last path segment + nodes, lastCid, depth, err := r.resolveNodes(ctx, c, pathSelector) if err != nil { return cid.Cid{}, nil, err } - for len(p) > 0 { - lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) - - // Note: have to drop the error here as `ResolveOnce` doesn't handle 'leaf' - // paths (so e.g. for `echo '{"foo":123}' | ipfs dag put` we wouldn't be - // able to resolve `zdpu[...]/foo`) - if lnk == nil { - break - } - - if err != nil { - if err == dag.ErrLinkNotFound { - err = ErrNoLink{Name: p[0], Node: nd.Cid()} - } - return cid.Cid{}, nil, err - } + if len(nodes) < 1 { + return cid.Cid{}, nil, fmt.Errorf("path %v did not resolve to a node", fpath) + } else if len(nodes) < len(p) { + return cid.Undef, nil, ErrNoLink{Name: p[len(nodes)-1], Node: lastCid} + } - if len(rest) == 0 { - return lnk.Cid, nil, nil - } + parent := nodes[len(nodes)-1] + lastSegment := p[len(p)-1] - next, err := lnk.GetNode(ctx, r.DAG) - if err != nil { - return cid.Cid{}, nil, err - } - nd = next - p = rest + // find final path segment within node + nd, err := parent.LookupBySegment(ipld.ParsePathSegment(lastSegment)) + switch err.(type) { + case nil: + case schema.ErrNoSuchField: + return cid.Undef, nil, ErrNoLink{Name: lastSegment, Node: lastCid} + default: + return cid.Cid{}, nil, err } - if len(p) == 0 { - return nd.Cid(), nil, nil + // if last node is not a link, just return it's cid, add path to remainder and return + if nd.Kind() != ipld.Kind_Link { + // return the cid and the remainder of the path + return lastCid, p[len(p)-depth-1:], nil } - // Confirm the path exists within the object - val, rest, err := nd.Resolve(p) + lnk, err := nd.AsLink() if err != nil { - if err == dag.ErrLinkNotFound { - err = ErrNoLink{Name: p[0], Node: nd.Cid()} - } return cid.Cid{}, nil, err } - if len(rest) > 0 { - return cid.Cid{}, nil, errors.New("path failed to resolve fully") - } - switch val.(type) { - case *ipld.Link: - return cid.Cid{}, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") - default: - return nd.Cid(), p, nil + clnk, ok := lnk.(cidlink.Link) + if !ok { + return cid.Cid{}, nil, fmt.Errorf("path %v resolves to a link that is not a cid link: %v", fpath, lnk) } + + return clnk.Cid, []string{}, nil } // ResolvePath fetches the node for given path. It returns the last item -// returned by ResolvePathComponents. -func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, error) { +// returned by ResolvePathComponents and the last link traversed which can be used to recover the block. +func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) { // validate path if err := fpath.IsValid(); err != nil { - return nil, err + return nil, nil, err } - nodes, err := r.ResolvePathComponents(ctx, fpath) - if err != nil || nodes == nil { - return nil, err + c, p, err := path.SplitAbsPath(fpath) + if err != nil { + return nil, nil, err } - return nodes[len(nodes)-1], err + + // create a selector to traverse all path segments but only match the last + pathSelector := pathLeafSelector(p) + + nodes, c, _, err := r.resolveNodes(ctx, c, pathSelector) + if err != nil { + return nil, nil, err + } + if len(nodes) < 1 { + return nil, nil, fmt.Errorf("path %v did not resolve to a node", fpath) + } + return nodes[len(nodes)-1], cidlink.Link{Cid: c}, nil } // ResolveSingle simply resolves one hop of a path through a graph with no // extra context (does not opaquely resolve through sharded nodes) -func ResolveSingle(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) { +// Deprecated: fetch node as ipld-prime or convert it and then use a selector to traverse through it. +func ResolveSingle(ctx context.Context, ds format.NodeGetter, nd format.Node, names []string) (*format.Link, []string, error) { return nd.ResolveLink(names) } // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then -// resolves all other components walking the links, with ResolveLinks. +// resolves all other components walking the links via a selector traversal func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { + //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) defer evt.Done() - h, parts, err := path.SplitAbsPath(fpath) - if err != nil { + // validate path + if err := fpath.IsValid(); err != nil { evt.Append(logging.LoggableMap{"error": err.Error()}) return nil, err } - log.Debug("resolve dag get") - nd, err := r.DAG.Get(ctx, h) + c, p, err := path.SplitAbsPath(fpath) if err != nil { evt.Append(logging.LoggableMap{"error": err.Error()}) return nil, err } - return r.ResolveLinks(ctx, nd, parts) + // create a selector to traverse and match all path segments + pathSelector := pathAllSelector(p) + + nodes, _, _, err := r.resolveNodes(ctx, c, pathSelector) + if err != nil { + evt.Append(logging.LoggableMap{"error": err.Error()}) + } + + return nodes, err } // ResolveLinks iteratively resolves names by walking the link hierarchy. -// Every node is fetched from the DAGService, resolving the next name. +// Every node is fetched from the Fetcher, resolving the next name. // Returns the list of nodes forming the path, starting with ndd. This list is // guaranteed never to be empty. // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { - + //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) defer evt.Done() - result := make([]ipld.Node, 0, len(names)+1) - result = append(result, ndd) - nd := ndd // dup arg workaround - - // for each of the path components - for len(names) > 0 { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, time.Minute) - defer cancel() - - lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, names) - if err == dag.ErrLinkNotFound { - evt.Append(logging.LoggableMap{"error": err.Error()}) - return result, ErrNoLink{Name: names[0], Node: nd.Cid()} - } else if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) - return result, err + + // create a selector to traverse and match all path segments + pathSelector := pathAllSelector(names) + + // create a new cancellable session + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + + session := r.FetcherFactory.NewSession(ctx) + + // traverse selector + nodes := []ipld.Node{ndd} + err := session.NodeMatching(ctx, ndd, pathSelector, func(res fetcher.FetchResult) error { + nodes = append(nodes, res.Node) + return nil + }) + if err != nil { + evt.Append(logging.LoggableMap{"error": err.Error()}) + return nil, err + } + + return nodes, err +} + +// Finds nodes matching the selector starting with a cid. Returns the matched nodes, the cid of the block containing +// the last node, and the depth of the last node within its block (root is depth 0). +func (r *Resolver) resolveNodes(ctx context.Context, c cid.Cid, sel ipld.Node) ([]ipld.Node, cid.Cid, int, error) { + // create a new cancellable session + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + + session := r.FetcherFactory.NewSession(ctx) + + // traverse selector + lastLink := cid.Undef + depth := 0 + nodes := []ipld.Node{} + err := fetcherhelpers.BlockMatching(ctx, session, cidlink.Link{Cid: c}, sel, func(res fetcher.FetchResult) error { + if res.LastBlockLink == nil { + res.LastBlockLink = cidlink.Link{Cid: c} + } + cidLnk, ok := res.LastBlockLink.(cidlink.Link) + if !ok { + return fmt.Errorf("link is not a cidlink: %v", cidLnk) } - nextnode, err := lnk.GetNode(ctx, r.DAG) - if err != nil { - evt.Append(logging.LoggableMap{"error": err.Error()}) - return result, err + // if we hit a block boundary + if !lastLink.Equals(cidLnk.Cid) { + depth = 0 + lastLink = cidLnk.Cid + } else { + depth++ } - nd = nextnode - result = append(result, nextnode) - names = rest + nodes = append(nodes, res.Node) + return nil + }) + if err != nil { + return nil, cid.Undef, 0, err + } + + return nodes, lastLink, depth, nil +} + +func pathLeafSelector(path []string) ipld.Node { + ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) + return pathSelector(path, ssb, func(p string, s builder.SelectorSpec) builder.SelectorSpec { + return ssb.ExploreFields(func(efsb builder.ExploreFieldsSpecBuilder) { efsb.Insert(p, s) }) + }) +} + +func pathAllSelector(path []string) ipld.Node { + ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) + return pathSelector(path, ssb, func(p string, s builder.SelectorSpec) builder.SelectorSpec { + return ssb.ExploreUnion( + ssb.Matcher(), + ssb.ExploreFields(func(efsb builder.ExploreFieldsSpecBuilder) { efsb.Insert(p, s) }), + ) + }) +} + +func pathSelector(path []string, ssb builder.SelectorSpecBuilder, reduce func(string, builder.SelectorSpec) builder.SelectorSpec) ipld.Node { + spec := ssb.Matcher() + for i := len(path) - 1; i >= 0; i-- { + spec = reduce(path[i], spec) } - return result, nil + return spec.Node() } diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index d3c6913e7e..b1d8dec9e4 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -1,18 +1,33 @@ package resolver_test import ( + "bytes" "context" "fmt" "math/rand" + "strings" "testing" "time" - path "github.com/ipfs/go-path" - "github.com/ipfs/go-path/resolver" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + bsfetcher "github.com/ipfs/go-fetcher/impl/blockservice" + dagpb "github.com/ipld/go-codec-dagpb" + "github.com/ipld/go-ipld-prime" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/ipld/go-ipld-prime/schema" + "github.com/multiformats/go-multihash" - ipld "github.com/ipfs/go-ipld-format" merkledag "github.com/ipfs/go-merkledag" dagmock "github.com/ipfs/go-merkledag/test" + path "github.com/ipfs/go-path" + "github.com/ipfs/go-path/resolver" + "github.com/ipfs/go-unixfsnode" + dagcbor "github.com/ipld/go-ipld-prime/codec/dagcbor" + dagjson "github.com/ipld/go-ipld-prime/codec/dagjson" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func randNode() *merkledag.ProtoNode { @@ -25,7 +40,7 @@ func randNode() *merkledag.ProtoNode { func TestRecurivePathResolution(t *testing.T) { ctx := context.Background() - dagService := dagmock.Mock() + bsrv := dagmock.Bserv() a := randNode() b := randNode() @@ -41,8 +56,8 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - for _, n := range []ipld.Node{a, b, c} { - err = dagService.Add(ctx, n) + for _, n := range []*merkledag.ProtoNode{a, b, c} { + err = bsrv.AddBlock(n) if err != nil { t.Fatal(err) } @@ -56,19 +71,31 @@ func TestRecurivePathResolution(t *testing.T) { t.Fatal(err) } - resolver := resolver.NewBasicResolver(dagService) - node, err := resolver.ResolvePath(ctx, p) + fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) + fetcherFactory.NodeReifier = unixfsnode.Reify + fetcherFactory.PrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil + }) + resolver := resolver.NewBasicResolver(fetcherFactory) + + node, lnk, err := resolver.ResolvePath(ctx, p) if err != nil { t.Fatal(err) } + uNode, ok := node.(unixfsnode.PathedPBNode) + require.True(t, ok) + fd := uNode.FieldData() + byts, err := fd.Must().AsBytes() + require.NoError(t, err) + + assert.Equal(t, cidlink.Link{Cid: c.Cid()}, lnk) + + assert.Equal(t, c.Data(), byts) cKey := c.Cid() - key := node.Cid() - if key.String() != cKey.String() { - t.Fatal(fmt.Errorf( - "recursive path resolution failed for %s: %s != %s", - p.String(), key.String(), cKey.String())) - } rCid, rest, err := resolver.ResolveToLastNode(ctx, p) if err != nil { @@ -105,43 +132,162 @@ func TestRecurivePathResolution(t *testing.T) { p.String(), rCid.String(), cKey.String())) } } - -func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { +func TestResolveToLastNode_ErrNoLink(t *testing.T) { ctx := context.Background() - dagService := dagmock.Mock() + bsrv := dagmock.Bserv() a := randNode() b := randNode() + c := randNode() - err := a.AddNodeLink("child", b) + err := b.AddNodeLink("grandchild", c) if err != nil { t.Fatal(err) } - err = dagService.Add(ctx, a) + err = a.AddNodeLink("child", b) if err != nil { t.Fatal(err) } + for _, n := range []*merkledag.ProtoNode{a, b, c} { + err = bsrv.AddBlock(n) + if err != nil { + t.Fatal(err) + } + } + + aKey := a.Cid() + + fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) + fetcherFactory.PrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil + }) + fetcherFactory.NodeReifier = unixfsnode.Reify + r := resolver.NewBasicResolver(fetcherFactory) + + // test missing link intermediate segment + segments := []string{aKey.String(), "cheese", "time"} + p, err := path.FromSegments("/ipfs/", segments...) + require.NoError(t, err) + + _, _, err = r.ResolveToLastNode(ctx, p) + require.EqualError(t, err, resolver.ErrNoLink{Name: "cheese", Node: aKey}.Error()) + + // test missing link at end + bKey := b.Cid() + segments = []string{aKey.String(), "child", "apples"} + p, err = path.FromSegments("/ipfs/", segments...) + require.NoError(t, err) + + _, _, err = r.ResolveToLastNode(ctx, p) + require.EqualError(t, err, resolver.ErrNoLink{Name: "apples", Node: bKey}.Error()) +} + +func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { + ctx := context.Background() + bsrv := dagmock.Bserv() + + a := randNode() + b := randNode() + + err := a.AddNodeLink("child", b) + require.NoError(t, err) + + err = bsrv.AddBlock(a) + require.NoError(t, err) + aKey := a.Cid() segments := []string{aKey.String(), "child"} p, err := path.FromSegments("/ipfs/", segments...) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) + + fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) + fetcherFactory.PrototypeChooser = dagpb.AddSupportToChooser(func(lnk ipld.Link, lnkCtx ipld.LinkContext) (ipld.NodePrototype, error) { + if tlnkNd, ok := lnkCtx.LinkNode.(schema.TypedLinkNode); ok { + return tlnkNd.LinkTargetNodePrototype(), nil + } + return basicnode.Prototype.Any, nil + }) + fetcherFactory.NodeReifier = unixfsnode.Reify + resolver := resolver.NewBasicResolver(fetcherFactory) - resolver := resolver.NewBasicResolver(dagService) resolvedCID, remainingPath, err := resolver.ResolveToLastNode(ctx, p) + require.NoError(t, err) + + require.Equal(t, len(remainingPath), 0, "cannot have remaining path") + require.Equal(t, b.Cid(), resolvedCID) +} + +func TestPathRemainder(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + bsrv := dagmock.Bserv() + + nb := basicnode.Prototype.Any.NewBuilder() + err := dagjson.Decode(nb, strings.NewReader(`{"foo": {"bar": "baz"}}`)) + require.NoError(t, err) + out := new(bytes.Buffer) + err = dagcbor.Encode(nb.Build(), out) + require.NoError(t, err) + lnk, err := cid.Prefix{ + Version: 1, + Codec: cid.DagCBOR, + MhType: multihash.SHA2_256, + MhLength: 32, + }.Sum(out.Bytes()) + require.NoError(t, err) + blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) + require.NoError(t, err) + bsrv.AddBlock(blk) + fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) + resolver := resolver.NewBasicResolver(fetcherFactory) + + rp1, remainder, err := resolver.ResolveToLastNode(ctx, path.FromString(lnk.String()+"/foo/bar")) + require.NoError(t, err) + + assert.Equal(t, lnk, rp1) + require.Equal(t, "foo/bar", path.Join(remainder)) +} + +func TestResolveToLastNode_MixedSegmentTypes(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + bsrv := dagmock.Bserv() + a := randNode() + err := bsrv.AddBlock(a) if err != nil { t.Fatal(err) } - if len(remainingPath) > 0 { - t.Fatal("cannot have remaining path") - } + nb := basicnode.Prototype.Any.NewBuilder() + json := `{"foo":{"bar":[0,{"boom":["baz",1,2,{"/":"CID"},"blop"]}]}}` + json = strings.ReplaceAll(json, "CID", a.Cid().String()) + err = dagjson.Decode(nb, strings.NewReader(json)) + require.NoError(t, err) + out := new(bytes.Buffer) + err = dagcbor.Encode(nb.Build(), out) + require.NoError(t, err) + lnk, err := cid.Prefix{ + Version: 1, + Codec: cid.DagCBOR, + MhType: multihash.SHA2_256, + MhLength: 32, + }.Sum(out.Bytes()) + require.NoError(t, err) + blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) + require.NoError(t, err) + bsrv.AddBlock(blk) + fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) + resolver := resolver.NewBasicResolver(fetcherFactory) - if !resolvedCID.Equals(b.Cid()) { - t.Fatal("resolved to the wrong CID") - } + cid, remainder, err := resolver.ResolveToLastNode(ctx, path.FromString(lnk.String()+"/foo/bar/1/boom/3")) + require.NoError(t, err) + + assert.Equal(t, 0, len(remainder)) + assert.True(t, cid.Equals(a.Cid())) } From 991fe0d4052e04bba6be6793d977af279aa1a254 Mon Sep 17 00:00:00 2001 From: Will Date: Thu, 12 Aug 2021 09:01:43 -0700 Subject: [PATCH 3028/3147] Update to IPLD Prime (#32) Update for use with IPLD prime Co-authored-by: hannahhoward This commit was moved from ipfs/go-ipfs-provider@681975ae2fde4168f9b2fefb32bf66fe736b481c --- provider/simple/reprovide.go | 26 ++++++++++------ provider/simple/reprovide_test.go | 50 ++++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 19 deletions(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index bfe6173e1d..c46148c724 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -9,11 +9,12 @@ import ( "github.com/cenkalti/backoff" "github.com/ipfs/go-cid" "github.com/ipfs/go-cidutil" + "github.com/ipfs/go-fetcher" + fetcherhelpers "github.com/ipfs/go-fetcher/helpers" blocks "github.com/ipfs/go-ipfs-blockstore" - ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" - "github.com/ipfs/go-merkledag" "github.com/ipfs/go-verifcid" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/libp2p/go-libp2p-core/routing" ) @@ -184,9 +185,9 @@ type Pinner interface { } // NewPinnedProvider returns provider supplying pinned keys -func NewPinnedProvider(onlyRoots bool, pinning Pinner, dag ipld.DAGService) KeyChanFunc { +func NewPinnedProvider(onlyRoots bool, pinning Pinner, fetchConfig fetcher.Factory) KeyChanFunc { return func(ctx context.Context) (<-chan cid.Cid, error) { - set, err := pinSet(ctx, pinning, dag, onlyRoots) + set, err := pinSet(ctx, pinning, fetchConfig, onlyRoots) if err != nil { return nil, err } @@ -208,7 +209,7 @@ func NewPinnedProvider(onlyRoots bool, pinning Pinner, dag ipld.DAGService) KeyC } } -func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots bool) (*cidutil.StreamingSet, error) { +func pinSet(ctx context.Context, pinning Pinner, fetchConfig fetcher.Factory, onlyRoots bool) (*cidutil.StreamingSet, error) { set := cidutil.NewStreamingSet() go func() { @@ -230,11 +231,18 @@ func pinSet(ctx context.Context, pinning Pinner, dag ipld.DAGService, onlyRoots logR.Errorf("reprovide indirect pins: %s", err) return } + + session := fetchConfig.NewSession(ctx) for _, key := range rkeys { - if onlyRoots { - set.Visitor(ctx)(key) - } else { - err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(dag), key, set.Visitor(ctx)) + set.Visitor(ctx)(key) + if !onlyRoots { + err := fetcherhelpers.BlockAll(ctx, session, cidlink.Link{key}, func(res fetcher.FetchResult) error { + clink, ok := res.LastBlockLink.(cidlink.Link) + if ok { + set.Visitor(ctx)(clink.Cid) + } + return nil + }) if err != nil { logR.Errorf("reprovide indirect pins: %s", err) return diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 3858baf5e9..e29524ae2c 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -1,19 +1,25 @@ package simple_test import ( + "bytes" "context" "testing" "time" + blocks "github.com/ipfs/go-block-format" bsrv "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" - "github.com/ipfs/go-ipfs-blockstore" + bsfetcher "github.com/ipfs/go-fetcher/impl/blockservice" + blockstore "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" mock "github.com/ipfs/go-ipfs-routing/mock" - cbor "github.com/ipfs/go-ipld-cbor" - merkledag "github.com/ipfs/go-merkledag" + "github.com/ipld/go-ipld-prime" + "github.com/ipld/go-ipld-prime/codec/dagcbor" + "github.com/ipld/go-ipld-prime/fluent/qp" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + basicnode "github.com/ipld/go-ipld-prime/node/basic" peer "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-testing/net" mh "github.com/multiformats/go-multihash" @@ -36,22 +42,24 @@ func setupRouting(t *testing.T) (clA, clB mock.Client, idA, idB peer.ID) { func setupDag(t *testing.T) (nodes []cid.Cid, bstore blockstore.Blockstore) { bstore = blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) for _, data := range []string{"foo", "bar"} { - blk, err := cbor.WrapObject(data, mh.SHA2_256, -1) + nb := basicnode.Prototype.Any.NewBuilder() + err := nb.AssignString(data) if err != nil { t.Fatal(err) } + blk := toBlock(t, nb.Build()) err = bstore.Put(blk) if err != nil { t.Fatal(err) } nodes = append(nodes, blk.Cid()) - - blk, err = cbor.WrapObject(map[string]interface{}{ - "child": blk.Cid(), - }, mh.SHA2_256, -1) + nd, err := qp.BuildMap(basicnode.Prototype.Map, 1, func(ma ipld.MapAssembler) { + qp.MapEntry(ma, "child", qp.Link(cidlink.Link{Cid: blk.Cid()})) + }) if err != nil { t.Fatal(err) } + blk = toBlock(t, nd) err = bstore.Put(blk) if err != nil { t.Fatal(err) @@ -62,6 +70,28 @@ func setupDag(t *testing.T) (nodes []cid.Cid, bstore blockstore.Blockstore) { return nodes, bstore } +func toBlock(t *testing.T, nd ipld.Node) blocks.Block { + buf := new(bytes.Buffer) + err := dagcbor.Encode(nd, buf) + if err != nil { + t.Fatal(err) + } + c, err := cid.Prefix{ + Version: 1, + Codec: cid.DagCBOR, + MhType: mh.SHA2_256, + MhLength: -1, + }.Sum(buf.Bytes()) + if err != nil { + t.Fatal(err) + } + blk, err := blocks.NewBlockWithCid(buf.Bytes(), c) + if err != nil { + t.Fatal(err) + } + return blk +} + func TestReprovide(t *testing.T) { testReprovide(t, func(r *Reprovider, ctx context.Context) error { return r.Reprovide() @@ -195,7 +225,7 @@ func TestReprovidePinned(t *testing.T) { nodes, bstore := setupDag(t) - dag := merkledag.NewDAGService(bsrv.New(bstore, offline.Exchange(bstore))) + fetchConfig := bsfetcher.NewFetcherConfig(bsrv.New(bstore, offline.Exchange(bstore))) for i := 0; i < 2; i++ { clA, clB, idA, _ := setupRouting(t) @@ -215,7 +245,7 @@ func TestReprovidePinned(t *testing.T) { keyProvider := NewPinnedProvider(onlyRoots, &mockPinner{ recursive: []cid.Cid{nodes[1]}, direct: []cid.Cid{nodes[3]}, - }, dag) + }, fetchConfig) reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) err := reprov.Reprovide() From 8f0db8f18428127afb5e6c114ada8c751d5116de Mon Sep 17 00:00:00 2001 From: Hannah Howard Date: Thu, 12 Aug 2021 09:35:49 -0700 Subject: [PATCH 3029/3147] IPLD In IPFS: Target Merge Branch (#67) * update go-path and error message * add node api for prime interactions * use go-unixfsnode * update against fetcher Co-authored-by: acruikshank This commit was moved from ipfs/interface-go-ipfs-core@49cdff8024e607072e57a7f7556e9875d2aa0412 --- coreiface/coreapi.go | 1 + coreiface/tests/path.go | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 12cb166a88..aacda04593 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -4,6 +4,7 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 2d9497244c..5a249fabfd 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -2,11 +2,14 @@ package tests import ( "context" - "github.com/ipfs/interface-go-ipfs-core/path" + "errors" "math" "strings" "testing" + "github.com/ipfs/go-path/resolver" + "github.com/ipfs/interface-go-ipfs-core/path" + "github.com/ipfs/interface-go-ipfs-core/options" ipldcbor "github.com/ipfs/go-ipld-cbor" @@ -138,7 +141,7 @@ func (tp *TestSuite) TestInvalidPathRemainder(t *testing.T) { } _, err = api.ResolvePath(ctx, path.New("/ipld/"+nd.Cid().String()+"/bar/baz")) - if err == nil || !strings.Contains(err.Error(), "no such link found") { + if err == nil || !errors.As(err, &resolver.ErrNoLink{}) { t.Fatalf("unexpected error: %s", err) } } From 21945952f68690addf556dfe69ce1c722e353a61 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 13 Aug 2021 01:24:24 -0400 Subject: [PATCH 3030/3147] feat: do not special case downloading the first block in the blockservice fetcher This commit was moved from ipfs/go-fetcher@101960bbcd62556c4dabe5621e8de3a6873c1b55 --- fetcher/impl/blockservice/fetcher.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/fetcher/impl/blockservice/fetcher.go b/fetcher/impl/blockservice/fetcher.go index 237f3f9551..3327a4ecd6 100644 --- a/fetcher/impl/blockservice/fetcher.go +++ b/fetcher/impl/blockservice/fetcher.go @@ -97,10 +97,14 @@ func (f *fetcherSession) NodeMatching(ctx context.Context, node ipld.Node, match } func (f *fetcherSession) BlockMatchingOfType(ctx context.Context, root ipld.Link, match ipld.Node, - ptype ipld.NodePrototype, cb fetcher.FetchCallback) error { + _ ipld.NodePrototype, cb fetcher.FetchCallback) error { // retrieve first node - node, err := f.BlockOfType(ctx, root, ptype) + prototype, err := f.PrototypeFromLink(root) + if err != nil { + return err + } + node, err := f.BlockOfType(ctx, root, prototype) if err != nil { return err } From 0ab30632be7adcfd1884213ce00793ed600c3b78 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 13 Aug 2021 01:28:50 -0400 Subject: [PATCH 3031/3147] fix: delete BlockAllOfType helper and fix BlockAll helper so that the selector now always compiles This commit was moved from ipfs/go-fetcher@e91ab79237f6545ce880e2ae7a69aa07161051fb --- fetcher/helpers/traversal.go | 22 +++++----------------- fetcher/impl/blockservice/fetcher_test.go | 2 +- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/fetcher/helpers/traversal.go b/fetcher/helpers/traversal.go index 37feeeb501..87b631d1e9 100644 --- a/fetcher/helpers/traversal.go +++ b/fetcher/helpers/traversal.go @@ -5,6 +5,7 @@ import ( "github.com/ipfs/go-fetcher" "github.com/ipld/go-ipld-prime" + basicnode "github.com/ipld/go-ipld-prime/node/basic" "github.com/ipld/go-ipld-prime/traversal/selector" "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) @@ -21,30 +22,17 @@ func Block(ctx context.Context, f fetcher.Fetcher, link ipld.Link) (ipld.Node, e // BlockMatching traverses a schemaless node graph starting with the given link using the given selector and possibly crossing // block boundaries. Each matched node is sent to the FetchResult channel. func BlockMatching(ctx context.Context, f fetcher.Fetcher, root ipld.Link, match ipld.Node, cb fetcher.FetchCallback) error { - prototype, err := f.PrototypeFromLink(root) - if err != nil { - return err - } - return f.BlockMatchingOfType(ctx, root, match, prototype, cb) + return f.BlockMatchingOfType(ctx, root, match, nil, cb) } // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. func BlockAll(ctx context.Context, f fetcher.Fetcher, root ipld.Link, cb fetcher.FetchCallback) error { - prototype, err := f.PrototypeFromLink(root) - if err != nil { - return err - } - return BlockAllOfType(ctx, f, root, prototype, cb) -} - -// BlockAllOfType traverses all nodes in the graph linked by root. The nodes will typed according to ptype -// and send over the results channel. -func BlockAllOfType(ctx context.Context, f fetcher.Fetcher, root ipld.Link, ptype ipld.NodePrototype, cb fetcher.FetchCallback) error { - ssb := builder.NewSelectorSpecBuilder(ptype) + ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) allSelector := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( ssb.Matcher(), ssb.ExploreAll(ssb.ExploreRecursiveEdge()), )).Node() - return f.BlockMatchingOfType(ctx, root, allSelector, ptype, cb) + + return f.BlockMatchingOfType(ctx, root, allSelector, nil, cb) } diff --git a/fetcher/impl/blockservice/fetcher_test.go b/fetcher/impl/blockservice/fetcher_test.go index f8c2d00822..42d31d4366 100644 --- a/fetcher/impl/blockservice/fetcher_test.go +++ b/fetcher/impl/blockservice/fetcher_test.go @@ -269,7 +269,7 @@ func TestHelpers(t *testing.T) { defer cancel() results := []fetcher.FetchResult{} - err = helpers.BlockAllOfType(ctx, session, cidlink.Link{Cid: block1.Cid()}, basicnode.Prototype__Any{}, func(res fetcher.FetchResult) error { + err = helpers.BlockAll(ctx, session, cidlink.Link{Cid: block1.Cid()}, func(res fetcher.FetchResult) error { results = append(results, res) return nil }) From d38d37bac5204c68a28dc497675dab9789f68a50 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 13 Aug 2021 01:32:00 -0400 Subject: [PATCH 3032/3147] feat: precompile the matchAll selector This commit was moved from ipfs/go-fetcher@760b004af53a8be83ca201343becdd26a392cd6a --- fetcher/helpers/traversal.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fetcher/helpers/traversal.go b/fetcher/helpers/traversal.go index 87b631d1e9..0bc42acff9 100644 --- a/fetcher/helpers/traversal.go +++ b/fetcher/helpers/traversal.go @@ -10,6 +10,16 @@ import ( "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) +var matchAllSelector ipld.Node + +func init() { + ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) + matchAllSelector = ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( + ssb.Matcher(), + ssb.ExploreAll(ssb.ExploreRecursiveEdge()), + )).Node() +} + // Block fetches a schemaless node graph corresponding to single block by link. func Block(ctx context.Context, f fetcher.Fetcher, link ipld.Link) (ipld.Node, error) { prototype, err := f.PrototypeFromLink(link) @@ -28,11 +38,5 @@ func BlockMatching(ctx context.Context, f fetcher.Fetcher, root ipld.Link, match // BlockAll traverses all nodes in the graph linked by root. The nodes will be untyped and send over the results // channel. func BlockAll(ctx context.Context, f fetcher.Fetcher, root ipld.Link, cb fetcher.FetchCallback) error { - ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any) - allSelector := ssb.ExploreRecursive(selector.RecursionLimitNone(), ssb.ExploreUnion( - ssb.Matcher(), - ssb.ExploreAll(ssb.ExploreRecursiveEdge()), - )).Node() - - return f.BlockMatchingOfType(ctx, root, allSelector, nil, cb) + return f.BlockMatchingOfType(ctx, root, matchAllSelector, nil, cb) } From a1f3f890866135fa4f5815a67043ec76907a73f4 Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Tue, 17 Aug 2021 10:54:30 -0400 Subject: [PATCH 3033/3147] sync: update CI config files (#34) This commit was moved from ipfs/go-ipfs-chunker@494c66c779132d72965f085ab9cb3bf7575a01ea --- chunker/buzhash_norace_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chunker/buzhash_norace_test.go b/chunker/buzhash_norace_test.go index 2565a4c533..7d1d03d6d4 100644 --- a/chunker/buzhash_norace_test.go +++ b/chunker/buzhash_norace_test.go @@ -1,4 +1,5 @@ -//+build !race +//go:build !race +// +build !race package chunk From b722930c08cda76a887769564a94055f41268c38 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 17 Aug 2021 13:10:26 -0700 Subject: [PATCH 3034/3147] fix: check errors by string Unfortunately, we return errors over the HTTP API and lose the type. This commit was moved from ipfs/interface-go-ipfs-core@98e72571bc4514239cbe7bba4321ab5da4194366 --- coreiface/tests/path.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/coreiface/tests/path.go b/coreiface/tests/path.go index 5a249fabfd..f6d05372e8 100644 --- a/coreiface/tests/path.go +++ b/coreiface/tests/path.go @@ -2,12 +2,10 @@ package tests import ( "context" - "errors" "math" "strings" "testing" - "github.com/ipfs/go-path/resolver" "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" @@ -141,7 +139,7 @@ func (tp *TestSuite) TestInvalidPathRemainder(t *testing.T) { } _, err = api.ResolvePath(ctx, path.New("/ipld/"+nd.Cid().String()+"/bar/baz")) - if err == nil || !errors.As(err, &resolver.ErrNoLink{}) { + if err == nil || !strings.Contains(err.Error(), `no link named "bar"`) { t.Fatalf("unexpected error: %s", err) } } From af75974067786dbe494642ba4118958b34f0ebab Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 14 Sep 2021 09:12:49 -0400 Subject: [PATCH 3035/3147] fix: give one minute timeouts to function calls instead of block retrievals to get around issues with shared IPLD ADL contexts This commit was moved from ipfs/go-path@d0512cea3d6455f4bb15837224d5d06dbab3e358 --- path/resolver/resolver.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index e42855e0cf..06533f0e22 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -72,6 +72,10 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. // create a selector to traverse and match all path segments pathSelector := pathAllSelector(p[:len(p)-1]) + // create a new cancellable session + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + // resolve node before last path segment nodes, lastCid, depth, err := r.resolveNodes(ctx, c, pathSelector) if err != nil { @@ -132,6 +136,10 @@ func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, // create a selector to traverse all path segments but only match the last pathSelector := pathLeafSelector(p) + // create a new cancellable session + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + nodes, c, _, err := r.resolveNodes(ctx, c, pathSelector) if err != nil { return nil, nil, err @@ -172,6 +180,10 @@ func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ( // create a selector to traverse and match all path segments pathSelector := pathAllSelector(p) + // create a new cancellable session + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + nodes, _, _, err := r.resolveNodes(ctx, c, pathSelector) if err != nil { evt.Append(logging.LoggableMap{"error": err.Error()}) @@ -218,10 +230,6 @@ func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []stri // Finds nodes matching the selector starting with a cid. Returns the matched nodes, the cid of the block containing // the last node, and the depth of the last node within its block (root is depth 0). func (r *Resolver) resolveNodes(ctx context.Context, c cid.Cid, sel ipld.Node) ([]ipld.Node, cid.Cid, int, error) { - // create a new cancellable session - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - session := r.FetcherFactory.NewSession(ctx) // traverse selector From 3f77af4ef81785db3843c1cedb6e3f848e39dc84 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 15 Sep 2021 16:55:14 +0200 Subject: [PATCH 3036/3147] chore: update log This commit was moved from ipfs/go-blockservice@631cc327f2972b4eac7bdf265af1cfc77aa3a49f --- blockservice/blockservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 2c860aefdf..6346bec5fc 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,7 +13,7 @@ import ( cid "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" - logging "github.com/ipfs/go-log" + logging "github.com/ipfs/go-log/v2" "github.com/ipfs/go-verifcid" ) From 2104ab54f7873faef772db9f3666647e0ee5ff1c Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Mon, 20 Sep 2021 13:04:19 -0400 Subject: [PATCH 3037/3147] removed timeouts for all resolver functions except for ResolveToLastNode This commit was moved from ipfs/go-path@c2dfedef9ee084ae45ff1d6269e7255a5054f89d --- path/resolver/resolver.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 06533f0e22..f3957c6efa 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -136,10 +136,6 @@ func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, // create a selector to traverse all path segments but only match the last pathSelector := pathLeafSelector(p) - // create a new cancellable session - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - nodes, c, _, err := r.resolveNodes(ctx, c, pathSelector) if err != nil { return nil, nil, err @@ -180,10 +176,6 @@ func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ( // create a selector to traverse and match all path segments pathSelector := pathAllSelector(p) - // create a new cancellable session - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - nodes, _, _, err := r.resolveNodes(ctx, c, pathSelector) if err != nil { evt.Append(logging.LoggableMap{"error": err.Error()}) @@ -207,10 +199,6 @@ func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []stri // create a selector to traverse and match all path segments pathSelector := pathAllSelector(names) - // create a new cancellable session - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - session := r.FetcherFactory.NewSession(ctx) // traverse selector From c661a6d9222a9ca5739b2d36f71d6458faed818b Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Mon, 20 Sep 2021 13:13:18 -0400 Subject: [PATCH 3038/3147] add warning note about context cancellation and ADLs to functions that work with fetchers and return IPLD nodes This commit was moved from ipfs/go-path@461c266805c82ecf43f70bf1fd5073743907b70f --- path/resolver/resolver.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index f3957c6efa..47dd470751 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -122,6 +122,9 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. // ResolvePath fetches the node for given path. It returns the last item // returned by ResolvePathComponents and the last link traversed which can be used to recover the block. +// +// Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be +// possible to load certain values. func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) { // validate path if err := fpath.IsValid(); err != nil { @@ -156,6 +159,9 @@ func ResolveSingle(ctx context.Context, ds format.NodeGetter, nd format.Node, na // ResolvePathComponents fetches the nodes for each segment of the given path. // It uses the first path component as a hash (key) of the first node, then // resolves all other components walking the links via a selector traversal +// +// Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be +// possible to load certain values. func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) @@ -191,6 +197,9 @@ func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ( // // ResolveLinks(nd, []string{"foo", "bar", "baz"}) // would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links +// +// Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be +// possible to load certain values. func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) From 92e1b6b4d4d223951a28eb81db2048f1415ece5c Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 22 Sep 2021 17:49:56 +0100 Subject: [PATCH 3039/3147] Resolve lint issues prior to CI integration Remove unused functions. Resolve staticcheck issues and run `go mod tidy` Upgrade module to `1.16` This commit was moved from ipfs/go-pinning-service-http-client@133fb5347ddc144063d2e7e88e8c37ed8f8fd60c --- pinning/remote/client/openapi/client.go | 46 +++---------------- .../remote/client/openapi/configuration.go | 4 +- 2 files changed, 8 insertions(+), 42 deletions(-) diff --git a/pinning/remote/client/openapi/client.go b/pinning/remote/client/openapi/client.go index 9854089875..029d1cd72c 100644 --- a/pinning/remote/client/openapi/client.go +++ b/pinning/remote/client/openapi/client.go @@ -16,6 +16,7 @@ import ( "encoding/xml" "errors" "fmt" + "golang.org/x/oauth2" "io" "log" "mime/multipart" @@ -26,12 +27,8 @@ import ( "path/filepath" "reflect" "regexp" - "strconv" "strings" "time" - "unicode/utf8" - - "golang.org/x/oauth2" ) var ( @@ -71,10 +68,6 @@ func NewAPIClient(cfg *Configuration) *APIClient { return c } -func atoi(in string) (int, error) { - return strconv.Atoi(in) -} - // selectHeaderContentType select a content type from the available list. func selectHeaderContentType(contentTypes []string) string { if len(contentTypes) == 0 { @@ -102,27 +95,13 @@ func selectHeaderAccept(accepts []string) string { // contains is a case insenstive match, finding needle in a haystack func contains(haystack []string, needle string) bool { for _, a := range haystack { - if strings.ToLower(a) == strings.ToLower(needle) { + if strings.EqualFold(a, needle) { return true } } return false } -// Verify optional parameters are of the correct type. -func typeCheckParameter(obj interface{}, expected string, name string) error { - // Make sure there is an object. - if obj == nil { - return nil - } - - // Check the type is as expected. - if reflect.TypeOf(obj).String() != expected { - return fmt.Errorf("Expected %s to be of type %s but received %s.", name, expected, reflect.TypeOf(obj).String()) - } - return nil -} - // parameterToString convert interface{} parameters to string, using a delimiter if format is provided. func parameterToString(obj interface{}, collectionFormat string) string { var delimiter string @@ -147,15 +126,6 @@ func parameterToString(obj interface{}, collectionFormat string) string { return fmt.Sprintf("%v", obj) } -// helper for converting interface{} parameters to json strings -func parameterToJson(obj interface{}) (string, error) { - jsonBuf, err := json.Marshal(obj) - if err != nil { - return "", err - } - return string(jsonBuf), err -} - // callAPI do the request. func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) { if c.cfg.Debug { @@ -218,7 +188,7 @@ func (c *APIClient) prepareRequest( // add form parameters and file if available. if strings.HasPrefix(headerParams["Content-Type"], "multipart/form-data") && len(formParams) > 0 || (len(fileBytes) > 0 && fileName != "") { if body != nil { - return nil, errors.New("Cannot specify postBody and multipart form at the same time.") + return nil, errors.New("cannot specify postBody and multipart form at the same time") } body = &bytes.Buffer{} w := multipart.NewWriter(body) @@ -258,7 +228,7 @@ func (c *APIClient) prepareRequest( if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 { if body != nil { - return nil, errors.New("Cannot specify postBody and x-www-form-urlencoded form at the same time.") + return nil, errors.New("cannot specify postBody and x-www-form-urlencoded form at the same time") } body = &bytes.Buffer{} body.WriteString(formParams.Encode()) @@ -370,7 +340,7 @@ func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err err return err } } else { - errors.New("Unknown type with GetActualInstance but no unmarshalObj.UnmarshalJSON defined") + return errors.New("unknown type with GetActualInstance but no unmarshalObj.UnmarshalJSON defined") } } else if err = json.Unmarshal(b, v); err != nil { // simple model return err @@ -427,7 +397,7 @@ func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err e } if bodyBuf.Len() == 0 { - err = fmt.Errorf("Invalid body type %s\n", contentType) + err = fmt.Errorf("invalid body type %s", contentType) return nil, err } return bodyBuf, nil @@ -504,10 +474,6 @@ func CacheExpires(r *http.Response) time.Time { return expires } -func strlen(s string) int { - return utf8.RuneCountInString(s) -} - // GenericOpenAPIError Provides access to the body, error and model on returned errors. type GenericOpenAPIError struct { body []byte diff --git a/pinning/remote/client/openapi/configuration.go b/pinning/remote/client/openapi/configuration.go index 2f31e1352e..bb0a8e5073 100644 --- a/pinning/remote/client/openapi/configuration.go +++ b/pinning/remote/client/openapi/configuration.go @@ -121,7 +121,7 @@ func (c *Configuration) AddDefaultHeader(key string, value string) { // URL formats template on a index using given variables func (sc ServerConfigurations) URL(index int, variables map[string]string) (string, error) { if index < 0 || len(sc) <= index { - return "", fmt.Errorf("Index %v out of range %v", index, len(sc)-1) + return "", fmt.Errorf("index %v out of range %v", index, len(sc)-1) } server := sc[index] url := server.URL @@ -136,7 +136,7 @@ func (sc ServerConfigurations) URL(index int, variables map[string]string) (stri } } if !found { - return "", fmt.Errorf("The variable %s in the server URL has invalid value %v. Must be %v", name, value, variable.EnumValues) + return "", fmt.Errorf("the variable %s in the server URL has invalid value %v. Must be %v", name, value, variable.EnumValues) } url = strings.Replace(url, "{"+name+"}", value, -1) } else { From 0e594882a8d72754142d334ab2476befbc90665e Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Thu, 21 Oct 2021 10:16:30 -0700 Subject: [PATCH 3040/3147] add a fetcher constructor for the case where we already have a session This commit was moved from ipfs/go-fetcher@99235cc120519afe2bddcb6b1f7a6844ecc3707f --- fetcher/impl/blockservice/fetcher.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fetcher/impl/blockservice/fetcher.go b/fetcher/impl/blockservice/fetcher.go index 3327a4ecd6..d203a15974 100644 --- a/fetcher/impl/blockservice/fetcher.go +++ b/fetcher/impl/blockservice/fetcher.go @@ -39,11 +39,15 @@ func NewFetcherConfig(blockService blockservice.BlockService) FetcherConfig { // NewSession creates a session from which nodes may be retrieved. // The session ends when the provided context is canceled. func (fc FetcherConfig) NewSession(ctx context.Context) fetcher.Fetcher { + return fc.FetcherWithSession(ctx, blockservice.NewSession(ctx, fc.blockService)) +} + +func (fc FetcherConfig) FetcherWithSession(ctx context.Context, s *blockservice.Session) fetcher.Fetcher { ls := cidlink.DefaultLinkSystem() // while we may be loading blocks remotely, they are already hash verified by the time they load // into ipld-prime ls.TrustedStorage = true - ls.StorageReadOpener = blockOpener(ctx, blockservice.NewSession(ctx, fc.blockService)) + ls.StorageReadOpener = blockOpener(ctx, s) ls.NodeReifier = fc.NodeReifier protoChooser := fc.PrototypeChooser From b7dfe90b28ea139103e655e46648cfb6b14ffbc4 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Thu, 21 Oct 2021 14:08:19 -0400 Subject: [PATCH 3041/3147] feat: plumb through context changes This commit was moved from ipfs/go-path@6f599234c77d0f23f9eb62aa6c4e3d89906ba8e5 --- path/resolver/resolver_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index b1d8dec9e4..d2420af044 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -57,7 +57,7 @@ func TestRecurivePathResolution(t *testing.T) { } for _, n := range []*merkledag.ProtoNode{a, b, c} { - err = bsrv.AddBlock(n) + err = bsrv.AddBlock(ctx, n) if err != nil { t.Fatal(err) } @@ -151,7 +151,7 @@ func TestResolveToLastNode_ErrNoLink(t *testing.T) { } for _, n := range []*merkledag.ProtoNode{a, b, c} { - err = bsrv.AddBlock(n) + err = bsrv.AddBlock(ctx, n) if err != nil { t.Fatal(err) } @@ -197,7 +197,7 @@ func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { err := a.AddNodeLink("child", b) require.NoError(t, err) - err = bsrv.AddBlock(a) + err = bsrv.AddBlock(ctx, a) require.NoError(t, err) aKey := a.Cid() @@ -243,7 +243,7 @@ func TestPathRemainder(t *testing.T) { require.NoError(t, err) blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) require.NoError(t, err) - bsrv.AddBlock(blk) + bsrv.AddBlock(ctx, blk) fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) resolver := resolver.NewBasicResolver(fetcherFactory) @@ -259,7 +259,7 @@ func TestResolveToLastNode_MixedSegmentTypes(t *testing.T) { defer cancel() bsrv := dagmock.Bserv() a := randNode() - err := bsrv.AddBlock(a) + err := bsrv.AddBlock(ctx, a) if err != nil { t.Fatal(err) } @@ -281,7 +281,7 @@ func TestResolveToLastNode_MixedSegmentTypes(t *testing.T) { require.NoError(t, err) blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) require.NoError(t, err) - bsrv.AddBlock(blk) + bsrv.AddBlock(ctx, blk) fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) resolver := resolver.NewBasicResolver(fetcherFactory) From 793bb035fe1c3b7c981fbb6c36204526ca2f2cee Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Thu, 21 Oct 2021 14:11:36 -0400 Subject: [PATCH 3042/3147] Revert "feat: plumb through context changes" This reverts commit b7dfe90b28ea139103e655e46648cfb6b14ffbc4. This commit was moved from ipfs/go-path@bda72a40745b64afc01b19e619761d5470b8aa2f --- path/resolver/resolver_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index d2420af044..b1d8dec9e4 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -57,7 +57,7 @@ func TestRecurivePathResolution(t *testing.T) { } for _, n := range []*merkledag.ProtoNode{a, b, c} { - err = bsrv.AddBlock(ctx, n) + err = bsrv.AddBlock(n) if err != nil { t.Fatal(err) } @@ -151,7 +151,7 @@ func TestResolveToLastNode_ErrNoLink(t *testing.T) { } for _, n := range []*merkledag.ProtoNode{a, b, c} { - err = bsrv.AddBlock(ctx, n) + err = bsrv.AddBlock(n) if err != nil { t.Fatal(err) } @@ -197,7 +197,7 @@ func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { err := a.AddNodeLink("child", b) require.NoError(t, err) - err = bsrv.AddBlock(ctx, a) + err = bsrv.AddBlock(a) require.NoError(t, err) aKey := a.Cid() @@ -243,7 +243,7 @@ func TestPathRemainder(t *testing.T) { require.NoError(t, err) blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) require.NoError(t, err) - bsrv.AddBlock(ctx, blk) + bsrv.AddBlock(blk) fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) resolver := resolver.NewBasicResolver(fetcherFactory) @@ -259,7 +259,7 @@ func TestResolveToLastNode_MixedSegmentTypes(t *testing.T) { defer cancel() bsrv := dagmock.Bserv() a := randNode() - err := bsrv.AddBlock(ctx, a) + err := bsrv.AddBlock(a) if err != nil { t.Fatal(err) } @@ -281,7 +281,7 @@ func TestResolveToLastNode_MixedSegmentTypes(t *testing.T) { require.NoError(t, err) blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) require.NoError(t, err) - bsrv.AddBlock(ctx, blk) + bsrv.AddBlock(blk) fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) resolver := resolver.NewBasicResolver(fetcherFactory) From b0665591e329a76f05bece9a16cf2b0728577054 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Thu, 28 Oct 2021 10:21:57 -0400 Subject: [PATCH 3043/3147] feat: add context to interface (#18) This commit was moved from ipfs/go-ipfs-exchange-interface@09692a6b268b868db071fc36a2afc64ef7b01a76 --- exchange/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index c3032b2350..7640c57333 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -15,7 +15,7 @@ type Interface interface { // type Exchanger interface // TODO Should callers be concerned with whether the block was made // available on the network? - HasBlock(blocks.Block) error + HasBlock(context.Context, blocks.Block) error IsOnline() bool From d041c547b61567d4e7bcbfc22825d673e4b606b2 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Fri, 29 Oct 2021 16:30:27 -0400 Subject: [PATCH 3044/3147] feat: plumb through context changes (#28) This commit was moved from ipfs/go-ipfs-routing@be1ea983aa42904278cc0a8717c44c44dd858064 --- routing/offline/offline.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routing/offline/offline.go b/routing/offline/offline.go index c76f920983..0b3083c596 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -67,11 +67,11 @@ func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte, _ return err } - return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data) + return c.datastore.Put(ctx, dshelp.NewKeyFromBinary([]byte(key)), data) } func (c *offlineRouting) GetValue(ctx context.Context, key string, _ ...routing.Option) ([]byte, error) { - buf, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key))) + buf, err := c.datastore.Get(ctx, dshelp.NewKeyFromBinary([]byte(key))) if err != nil { return nil, err } From d1cf54c89982b7175e722d3bc59afcccbb6b870d Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Wed, 10 Nov 2021 12:43:08 -0500 Subject: [PATCH 3045/3147] feat: plumb through contexts (#42) This commit was moved from ipfs/go-ipfs-exchange-offline@6ef3e0ac8dfd20522c918e1eb6f8ac07cec41bd1 --- exchange/offline/offline.go | 10 +++++----- exchange/offline/offline_test.go | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 88d04469b1..73622659bc 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -24,13 +24,13 @@ type offlineExchange struct { // GetBlock returns nil to signal that a block could not be retrieved for the // given key. // NB: This function may return before the timeout expires. -func (e *offlineExchange) GetBlock(_ context.Context, k cid.Cid) (blocks.Block, error) { - return e.bs.Get(k) +func (e *offlineExchange) GetBlock(ctx context.Context, k cid.Cid) (blocks.Block, error) { + return e.bs.Get(ctx, k) } // HasBlock always returns nil. -func (e *offlineExchange) HasBlock(b blocks.Block) error { - return e.bs.Put(b) +func (e *offlineExchange) HasBlock(ctx context.Context, b blocks.Block) error { + return e.bs.Put(ctx, b) } // Close always returns nil. @@ -45,7 +45,7 @@ func (e *offlineExchange) GetBlocks(ctx context.Context, ks []cid.Cid) (<-chan b go func() { defer close(out) for _, k := range ks { - hit, err := e.bs.Get(k) + hit, err := e.bs.Get(ctx, k) if err != nil { // a long line of misses should abort when context is cancelled. select { diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 3b84b8c1ee..0ac95a6b66 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -28,12 +28,12 @@ func TestHasBlockReturnsNil(t *testing.T) { ex := Exchange(store) block := blocks.NewBlock([]byte("data")) - err := ex.HasBlock(block) + err := ex.HasBlock(context.Background(), block) if err != nil { t.Fail() } - if _, err := store.Get(block.Cid()); err != nil { + if _, err := store.Get(context.Background(), block.Cid()); err != nil { t.Fatal(err) } } @@ -46,7 +46,7 @@ func TestGetBlocks(t *testing.T) { expected := g.Blocks(2) for _, b := range expected { - if err := ex.HasBlock(b); err != nil { + if err := ex.HasBlock(context.Background(), b); err != nil { t.Fail() } } From 378fb2130fd761e11b00c9c7b9b756efe8839e22 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Wed, 10 Nov 2021 14:33:32 -0500 Subject: [PATCH 3046/3147] feat: add context to interfaces (#86) This commit was moved from ipfs/go-blockservice@285f9bc81cd0f4eeff330aa162b493583b113c16 --- blockservice/blockservice.go | 30 +++++++++++++++--------------- blockservice/blockservice_test.go | 14 +++++++------- blockservice/test/blocks_test.go | 4 ++-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 6346bec5fc..66905a6779 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -51,14 +51,14 @@ type BlockService interface { Exchange() exchange.Interface // AddBlock puts a given block to the underlying datastore - AddBlock(o blocks.Block) error + AddBlock(ctx context.Context, o blocks.Block) error // AddBlocks adds a slice of blocks at the same time using batching // capabilities of the underlying datastore whenever possible. - AddBlocks(bs []blocks.Block) error + AddBlocks(ctx context.Context, bs []blocks.Block) error // DeleteBlock deletes the given block from the blockservice. - DeleteBlock(o cid.Cid) error + DeleteBlock(ctx context.Context, o cid.Cid) error } type blockService struct { @@ -130,7 +130,7 @@ func NewSession(ctx context.Context, bs BlockService) *Session { // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. -func (s *blockService) AddBlock(o blocks.Block) error { +func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { c := o.Cid() // hash security err := verifcid.ValidateCid(c) @@ -138,19 +138,19 @@ func (s *blockService) AddBlock(o blocks.Block) error { return err } if s.checkFirst { - if has, err := s.blockstore.Has(c); has || err != nil { + if has, err := s.blockstore.Has(ctx, c); has || err != nil { return err } } - if err := s.blockstore.Put(o); err != nil { + if err := s.blockstore.Put(ctx, o); err != nil { return err } log.Debugf("BlockService.BlockAdded %s", c) if s.exchange != nil { - if err := s.exchange.HasBlock(o); err != nil { + if err := s.exchange.HasBlock(ctx, o); err != nil { log.Errorf("HasBlock: %s", err.Error()) } } @@ -158,7 +158,7 @@ func (s *blockService) AddBlock(o blocks.Block) error { return nil } -func (s *blockService) AddBlocks(bs []blocks.Block) error { +func (s *blockService) AddBlocks(ctx context.Context, bs []blocks.Block) error { // hash security for _, b := range bs { err := verifcid.ValidateCid(b.Cid()) @@ -170,7 +170,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { if s.checkFirst { toput = make([]blocks.Block, 0, len(bs)) for _, b := range bs { - has, err := s.blockstore.Has(b.Cid()) + has, err := s.blockstore.Has(ctx, b.Cid()) if err != nil { return err } @@ -186,7 +186,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { return nil } - err := s.blockstore.PutMany(toput) + err := s.blockstore.PutMany(ctx, toput) if err != nil { return err } @@ -194,7 +194,7 @@ func (s *blockService) AddBlocks(bs []blocks.Block) error { if s.exchange != nil { for _, o := range toput { log.Debugf("BlockService.BlockAdded %s", o.Cid()) - if err := s.exchange.HasBlock(o); err != nil { + if err := s.exchange.HasBlock(ctx, o); err != nil { log.Errorf("HasBlock: %s", err.Error()) } } @@ -225,7 +225,7 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun return nil, err } - block, err := bs.Get(c) + block, err := bs.Get(ctx, c) if err == nil { return block, nil } @@ -296,7 +296,7 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget var misses []cid.Cid for _, c := range ks { - hit, err := bs.Get(c) + hit, err := bs.Get(ctx, c) if err != nil { misses = append(misses, c) continue @@ -332,8 +332,8 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget } // DeleteBlock deletes a block in the blockservice from the datastore -func (s *blockService) DeleteBlock(c cid.Cid) error { - err := s.blockstore.DeleteBlock(c) +func (s *blockService) DeleteBlock(ctx context.Context, c cid.Cid) error { + err := s.blockstore.DeleteBlock(ctx, c) if err == nil { log.Debugf("BlockService.BlockDeleted %s", c) } diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 36cdf0330c..268a7a5928 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -26,7 +26,7 @@ func TestWriteThroughWorks(t *testing.T) { block := bgen.Next() t.Logf("PutCounter: %d", bstore.PutCounter) - err := bserv.AddBlock(block) + err := bserv.AddBlock(context.Background(), block) if err != nil { t.Fatal(err) } @@ -34,7 +34,7 @@ func TestWriteThroughWorks(t *testing.T) { t.Fatalf("expected just one Put call, have: %d", bstore.PutCounter) } - err = bserv.AddBlock(block) + err = bserv.AddBlock(context.Background(), block) if err != nil { t.Fatal(err) } @@ -58,12 +58,12 @@ func TestLazySessionInitialization(t *testing.T) { bgen := butil.NewBlockGenerator() block := bgen.Next() - err := bstore.Put(block) + err := bstore.Put(ctx, block) if err != nil { t.Fatal(err) } block2 := bgen.Next() - err = session.HasBlock(block2) + err = session.HasBlock(ctx, block2) if err != nil { t.Fatal(err) } @@ -101,9 +101,9 @@ type PutCountingBlockstore struct { PutCounter int } -func (bs *PutCountingBlockstore) Put(block blocks.Block) error { +func (bs *PutCountingBlockstore) Put(ctx context.Context, block blocks.Block) error { bs.PutCounter++ - return bs.Blockstore.Put(block) + return bs.Blockstore.Put(ctx, block) } var _ exchange.SessionExchange = (*fakeSessionExchange)(nil) @@ -135,7 +135,7 @@ func TestNilExchange(t *testing.T) { if err != ErrNotFound { t.Fatal("expected block to not be found") } - err = bs.Put(block) + err = bs.Put(ctx, block) if err != nil { t.Fatal(err) } diff --git a/blockservice/test/blocks_test.go b/blockservice/test/blocks_test.go index ee808e66e8..c9e2faee78 100644 --- a/blockservice/test/blocks_test.go +++ b/blockservice/test/blocks_test.go @@ -33,7 +33,7 @@ func TestBlocks(t *testing.T) { t.Error("Block key and data multihash key not equal") } - err := bs.AddBlock(o) + err := bs.AddBlock(context.Background(), o) if err != nil { t.Error("failed to add block to BlockService", err) return @@ -74,7 +74,7 @@ func TestGetBlocksSequential(t *testing.T) { var cids []cid.Cid for _, o := range objs { cids = append(cids, o.Cid()) - err := servs[0].AddBlock(o) + err := servs[0].AddBlock(context.Background(), o) if err != nil { t.Fatal(err) } From ae9364a8f22d661b7eeea4816c97856c983d7d83 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Wed, 10 Nov 2021 16:03:21 -0500 Subject: [PATCH 3047/3147] feat: plumb through context changes (#28) This commit was moved from ipfs/go-fetcher@d2ffddced6cb002bbb98237798c2e12096dad66c --- fetcher/helpers/block_visitor_test.go | 16 +++++++------ fetcher/impl/blockservice/fetcher_test.go | 28 ++++++++++++----------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/fetcher/helpers/block_visitor_test.go b/fetcher/helpers/block_visitor_test.go index 2fcf58d037..300e3d09cf 100644 --- a/fetcher/helpers/block_visitor_test.go +++ b/fetcher/helpers/block_visitor_test.go @@ -21,6 +21,8 @@ import ( "github.com/stretchr/testify/require" ) +var bg = context.Background() + func TestFetchGraphToBlocks(t *testing.T) { block3, node3, link3 := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 1, func(na fluent.MapAssembler) { na.AssembleEntry("three").AssignBool(true) @@ -49,13 +51,13 @@ func TestFetchGraphToBlocks(t *testing.T) { hasBlock := peers[0] defer hasBlock.Exchange.Close() - err := hasBlock.Exchange.HasBlock(block1) + err := hasBlock.Exchange.HasBlock(bg, block1) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block2) + err = hasBlock.Exchange.HasBlock(bg, block2) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block3) + err = hasBlock.Exchange.HasBlock(bg, block3) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block4) + err = hasBlock.Exchange.HasBlock(bg, block4) require.NoError(t, err) wantsBlock := peers[1] @@ -102,11 +104,11 @@ func TestFetchGraphToUniqueBlocks(t *testing.T) { hasBlock := peers[0] defer hasBlock.Exchange.Close() - err := hasBlock.Exchange.HasBlock(block1) + err := hasBlock.Exchange.HasBlock(bg, block1) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block2) + err = hasBlock.Exchange.HasBlock(bg, block2) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block3) + err = hasBlock.Exchange.HasBlock(bg, block3) require.NoError(t, err) wantsBlock := peers[1] diff --git a/fetcher/impl/blockservice/fetcher_test.go b/fetcher/impl/blockservice/fetcher_test.go index 42d31d4366..33cd2ee538 100644 --- a/fetcher/impl/blockservice/fetcher_test.go +++ b/fetcher/impl/blockservice/fetcher_test.go @@ -27,6 +27,8 @@ import ( "github.com/stretchr/testify/require" ) +var bg = context.Background() + func TestFetchIPLDPrimeNode(t *testing.T) { block, node, _ := testutil.EncodeBlock(fluent.MustBuildMap(basicnode.Prototype__Map{}, 3, func(na fluent.MapAssembler) { na.AssembleEntry("foo").AssignBool(true) @@ -44,7 +46,7 @@ func TestFetchIPLDPrimeNode(t *testing.T) { hasBlock := peers[0] defer hasBlock.Exchange.Close() - err := hasBlock.Exchange.HasBlock(block) + err := hasBlock.Exchange.HasBlock(bg, block) require.NoError(t, err) wantsBlock := peers[1] @@ -90,13 +92,13 @@ func TestFetchIPLDGraph(t *testing.T) { hasBlock := peers[0] defer hasBlock.Exchange.Close() - err := hasBlock.Exchange.HasBlock(block1) + err := hasBlock.Exchange.HasBlock(bg, block1) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block2) + err = hasBlock.Exchange.HasBlock(bg, block2) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block3) + err = hasBlock.Exchange.HasBlock(bg, block3) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block4) + err = hasBlock.Exchange.HasBlock(bg, block4) require.NoError(t, err) wantsBlock := peers[1] @@ -150,7 +152,7 @@ func TestFetchIPLDPath(t *testing.T) { defer hasBlock.Exchange.Close() for _, blk := range []blocks.Block{block1, block2, block3, block4, block5} { - err := hasBlock.Exchange.HasBlock(blk) + err := hasBlock.Exchange.HasBlock(bg, blk) require.NoError(t, err) } @@ -212,13 +214,13 @@ func TestHelpers(t *testing.T) { hasBlock := peers[0] defer hasBlock.Exchange.Close() - err := hasBlock.Exchange.HasBlock(block1) + err := hasBlock.Exchange.HasBlock(bg, block1) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block2) + err = hasBlock.Exchange.HasBlock(bg, block2) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block3) + err = hasBlock.Exchange.HasBlock(bg, block3) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block4) + err = hasBlock.Exchange.HasBlock(bg, block4) require.NoError(t, err) wantsBlock := peers[1] @@ -329,11 +331,11 @@ func TestNodeReification(t *testing.T) { hasBlock := peers[0] defer hasBlock.Exchange.Close() - err := hasBlock.Exchange.HasBlock(block2) + err := hasBlock.Exchange.HasBlock(bg, block2) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block3) + err = hasBlock.Exchange.HasBlock(bg, block3) require.NoError(t, err) - err = hasBlock.Exchange.HasBlock(block4) + err = hasBlock.Exchange.HasBlock(bg, block4) require.NoError(t, err) wantsBlock := peers[1] From 3a39d7e054ac3ccff120ccb0a203349d6196e728 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Wed, 10 Nov 2021 17:26:29 -0500 Subject: [PATCH 3048/3147] feat: plumb through context changes (#47) This commit was moved from ipfs/go-path@19b77b2365c51c8fab1dc5b8a062ee96c21d91a8 --- path/resolver/resolver_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/path/resolver/resolver_test.go b/path/resolver/resolver_test.go index b1d8dec9e4..d2420af044 100644 --- a/path/resolver/resolver_test.go +++ b/path/resolver/resolver_test.go @@ -57,7 +57,7 @@ func TestRecurivePathResolution(t *testing.T) { } for _, n := range []*merkledag.ProtoNode{a, b, c} { - err = bsrv.AddBlock(n) + err = bsrv.AddBlock(ctx, n) if err != nil { t.Fatal(err) } @@ -151,7 +151,7 @@ func TestResolveToLastNode_ErrNoLink(t *testing.T) { } for _, n := range []*merkledag.ProtoNode{a, b, c} { - err = bsrv.AddBlock(n) + err = bsrv.AddBlock(ctx, n) if err != nil { t.Fatal(err) } @@ -197,7 +197,7 @@ func TestResolveToLastNode_NoUnnecessaryFetching(t *testing.T) { err := a.AddNodeLink("child", b) require.NoError(t, err) - err = bsrv.AddBlock(a) + err = bsrv.AddBlock(ctx, a) require.NoError(t, err) aKey := a.Cid() @@ -243,7 +243,7 @@ func TestPathRemainder(t *testing.T) { require.NoError(t, err) blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) require.NoError(t, err) - bsrv.AddBlock(blk) + bsrv.AddBlock(ctx, blk) fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) resolver := resolver.NewBasicResolver(fetcherFactory) @@ -259,7 +259,7 @@ func TestResolveToLastNode_MixedSegmentTypes(t *testing.T) { defer cancel() bsrv := dagmock.Bserv() a := randNode() - err := bsrv.AddBlock(a) + err := bsrv.AddBlock(ctx, a) if err != nil { t.Fatal(err) } @@ -281,7 +281,7 @@ func TestResolveToLastNode_MixedSegmentTypes(t *testing.T) { require.NoError(t, err) blk, err := blocks.NewBlockWithCid(out.Bytes(), lnk) require.NoError(t, err) - bsrv.AddBlock(blk) + bsrv.AddBlock(ctx, blk) fetcherFactory := bsfetcher.NewFetcherConfig(bsrv) resolver := resolver.NewBasicResolver(fetcherFactory) From 8604dc0c64c8975faf3856bd0ab3763c62dd35ae Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Thu, 11 Nov 2021 13:09:08 -0500 Subject: [PATCH 3049/3147] feat: plumb through context changes (#18) This commit was moved from ipfs/go-ipfs-pinner@72f5e02e73db5e05ef0a140a7938cbc89dfc38b0 --- pinning/pinner/dsindex/indexer.go | 12 ++++++------ pinning/pinner/dspinner/pin.go | 20 ++++++++++---------- pinning/pinner/dspinner/pin_test.go | 18 +++++++++--------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pinning/pinner/dsindex/indexer.go b/pinning/pinner/dsindex/indexer.go index 884cd8025f..8384ad5d5a 100644 --- a/pinning/pinner/dsindex/indexer.go +++ b/pinning/pinner/dsindex/indexer.go @@ -75,7 +75,7 @@ func (x *indexer) Add(ctx context.Context, key, value string) error { return ErrEmptyValue } dsKey := ds.NewKey(encode(key)).ChildString(encode(value)) - return x.dstore.Put(dsKey, []byte{}) + return x.dstore.Put(ctx, dsKey, []byte{}) } func (x *indexer) Delete(ctx context.Context, key, value string) error { @@ -85,7 +85,7 @@ func (x *indexer) Delete(ctx context.Context, key, value string) error { if value == "" { return ErrEmptyValue } - return x.dstore.Delete(ds.NewKey(encode(key)).ChildString(encode(value))) + return x.dstore.Delete(ctx, ds.NewKey(encode(key)).ChildString(encode(value))) } func (x *indexer) DeleteKey(ctx context.Context, key string) (int, error) { @@ -108,7 +108,7 @@ func (x *indexer) ForEach(ctx context.Context, key string, fn func(key, value st Prefix: key, KeysOnly: true, } - results, err := x.dstore.Query(q) + results, err := x.dstore.Query(ctx, q) if err != nil { return err } @@ -145,7 +145,7 @@ func (x *indexer) HasValue(ctx context.Context, key, value string) (bool, error) if value == "" { return false, ErrEmptyValue } - return x.dstore.Has(ds.NewKey(encode(key)).ChildString(encode(value))) + return x.dstore.Has(ctx, ds.NewKey(encode(key)).ChildString(encode(value))) } func (x *indexer) HasAny(ctx context.Context, key string) (bool, error) { @@ -238,7 +238,7 @@ func (x *indexer) deletePrefix(ctx context.Context, prefix string) (int, error) } for i := range ents { - err = x.dstore.Delete(ds.NewKey(ents[i].Key)) + err = x.dstore.Delete(ctx, ds.NewKey(ents[i].Key)) if err != nil { return 0, err } @@ -252,7 +252,7 @@ func (x *indexer) queryPrefix(ctx context.Context, prefix string) ([]query.Entry Prefix: prefix, KeysOnly: true, } - results, err := x.dstore.Query(q) + results, err := x.dstore.Query(ctx, q) if err != nil { return nil, err } diff --git a/pinning/pinner/dspinner/pin.go b/pinning/pinner/dspinner/pin.go index a02f015478..fa3d9e7540 100644 --- a/pinning/pinner/dspinner/pin.go +++ b/pinning/pinner/dspinner/pin.go @@ -142,7 +142,7 @@ func New(ctx context.Context, dstore ds.Datastore, dserv ipld.DAGService) (*pinn dstore: dstore, } - data, err := dstore.Get(dirtyKey) + data, err := dstore.Get(ctx, dirtyKey) if err != nil { if err == ds.ErrNotFound { return p, nil @@ -268,7 +268,7 @@ func (p *pinner) addPin(ctx context.Context, c cid.Cid, mode ipfspinner.Mode, na p.setDirty(ctx) // Store the pin - err = p.dstore.Put(pp.dsKey(), pinData) + err = p.dstore.Put(ctx, pp.dsKey(), pinData) if err != nil { return "", err } @@ -332,7 +332,7 @@ func (p *pinner) removePin(ctx context.Context, pp *pin) error { // The pin is removed last so that an incomplete remove is detected by a // pin that has a missing index. - err = p.dstore.Delete(pp.dsKey()) + err = p.dstore.Delete(ctx, pp.dsKey()) if err != nil { return err } @@ -669,7 +669,7 @@ func (p *pinner) removePinsForCid(ctx context.Context, c cid.Cid, mode ipfspinne // loadPin loads a single pin from the datastore. func (p *pinner) loadPin(ctx context.Context, pid string) (*pin, error) { - pinData, err := p.dstore.Get(ds.NewKey(path.Join(pinKeyPath, pid))) + pinData, err := p.dstore.Get(ctx, ds.NewKey(path.Join(pinKeyPath, pid))) if err != nil { return nil, err } @@ -804,7 +804,7 @@ func (p *pinner) flushPins(ctx context.Context, force bool) error { if !p.autoSync && !force { return nil } - if err := p.dstore.Sync(ds.NewKey(basePath)); err != nil { + if err := p.dstore.Sync(ctx, ds.NewKey(basePath)); err != nil { return fmt.Errorf("cannot sync pin state: %v", err) } p.setClean(ctx) @@ -909,12 +909,12 @@ func (p *pinner) setDirty(ctx context.Context) { } data := []byte{1} - err := p.dstore.Put(dirtyKey, data) + err := p.dstore.Put(ctx, dirtyKey, data) if err != nil { log.Errorf("failed to set pin dirty flag: %s", err) return } - err = p.dstore.Sync(dirtyKey) + err = p.dstore.Sync(ctx, dirtyKey) if err != nil { log.Errorf("failed to sync pin dirty flag: %s", err) } @@ -928,12 +928,12 @@ func (p *pinner) setClean(ctx context.Context) { } data := []byte{0} - err := p.dstore.Put(dirtyKey, data) + err := p.dstore.Put(ctx, dirtyKey, data) if err != nil { log.Errorf("failed to set clear dirty flag: %s", err) return } - if err = p.dstore.Sync(dirtyKey); err != nil { + if err = p.dstore.Sync(ctx, dirtyKey); err != nil { log.Errorf("failed to sync cleared pin dirty flag: %s", err) return } @@ -951,7 +951,7 @@ func (p *pinner) rebuildIndexes(ctx context.Context) error { q := query.Query{ Prefix: pinKeyPath, } - results, err := p.dstore.Query(q) + results, err := p.dstore.Query(ctx, q) if err != nil { return err } diff --git a/pinning/pinner/dspinner/pin_test.go b/pinning/pinner/dspinner/pin_test.go index ed28286580..4e12fefb71 100644 --- a/pinning/pinner/dspinner/pin_test.go +++ b/pinning/pinner/dspinner/pin_test.go @@ -309,7 +309,7 @@ func TestPinnerBasic(t *testing.T) { if pp.Cid != ak { t.Error("loaded pin has wrong cid") } - err = p.dstore.Delete(pp.dsKey()) + err = p.dstore.Delete(ctx, pp.dsKey()) if err != nil { t.Fatal(err) } @@ -703,7 +703,7 @@ func TestLoadDirty(t *testing.T) { p.setDirty(ctx) // Verify dirty - data, err := dstore.Get(dirtyKey) + data, err := dstore.Get(ctx, dirtyKey) if err != nil { t.Fatalf("could not read dirty flag: %v", err) } @@ -727,7 +727,7 @@ func TestLoadDirty(t *testing.T) { } // Verify not dirty - data, err = dstore.Get(dirtyKey) + data, err = dstore.Get(ctx, dirtyKey) if err != nil { t.Fatalf("could not read dirty flag: %v", err) } @@ -923,7 +923,7 @@ type batchWrap struct { ds.Datastore } -func (d *batchWrap) Batch() (ds.Batch, error) { +func (d *batchWrap) Batch(_ context.Context) (ds.Batch, error) { return ds.NewBasicBatch(d), nil } @@ -957,7 +957,7 @@ func BenchmarkLoad(b *testing.B) { b.Run("RebuildTrue", func(b *testing.B) { for i := 0; i < b.N; i++ { - err = dstore.Put(dirtyKey, []byte{1}) + err = dstore.Put(ctx, dirtyKey, []byte{1}) if err != nil { panic(err.Error()) } @@ -971,7 +971,7 @@ func BenchmarkLoad(b *testing.B) { b.Run("RebuildFalse", func(b *testing.B) { for i := 0; i < b.N; i++ { - err = dstore.Put(dirtyKey, []byte{0}) + err = dstore.Put(ctx, dirtyKey, []byte{0}) if err != nil { panic(err.Error()) } @@ -1161,7 +1161,7 @@ func BenchmarkRebuild(b *testing.B) { b.Run(fmt.Sprintf("Rebuild %d", pins), func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { - err = dstore.Put(dirtyKey, []byte{1}) + err = dstore.Put(ctx, dirtyKey, []byte{1}) if err != nil { panic(err.Error()) } @@ -1252,7 +1252,7 @@ func TestCidIndex(t *testing.T) { q := query.Query{ Prefix: pinKeyPath, } - results, err := pinner.dstore.Query(q) + results, err := pinner.dstore.Query(ctx, q) if err != nil { t.Fatal(err) } @@ -1335,7 +1335,7 @@ func TestRebuild(t *testing.T) { if err != nil { t.Fatal(err) } - err = pinner.dstore.Delete(pp.dsKey()) + err = pinner.dstore.Delete(ctx, pp.dsKey()) if err != nil { t.Fatal(err) } From 01d2a5e4d1184e212da369ebc5471abf6928b75a Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Thu, 11 Nov 2021 13:45:22 -0500 Subject: [PATCH 3050/3147] feat: plumb through datastore contexts (#39) This commit was moved from ipfs/go-ipfs-provider@4aff05e6304c6e222c4ff7ebbb6c6f8df6d8aa17 --- provider/batched/system.go | 6 +++--- provider/queue/queue.go | 8 ++++---- provider/queue/queue_test.go | 4 ++-- provider/simple/reprovide.go | 4 ++-- provider/simple/reprovide_test.go | 5 +++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/provider/batched/system.go b/provider/batched/system.go index 111ee115be..de9177796f 100644 --- a/provider/batched/system.go +++ b/provider/batched/system.go @@ -259,10 +259,10 @@ func (s *BatchProvidingSystem) Run() { s.lastReprovideBatchSize = len(keys) s.lastReprovideDuration = dur - if err := s.ds.Put(lastReprovideKey, storeTime(time.Now())); err != nil { + if err := s.ds.Put(s.ctx, lastReprovideKey, storeTime(time.Now())); err != nil { log.Errorf("could not store last reprovide time: %v", err) } - if err := s.ds.Sync(lastReprovideKey); err != nil { + if err := s.ds.Sync(s.ctx, lastReprovideKey); err != nil { log.Errorf("could not perform sync of last reprovide time: %v", err) } } @@ -374,7 +374,7 @@ reprovideCidLoop: } func (s *BatchProvidingSystem) getLastReprovideTime() (time.Time, error) { - val, err := s.ds.Get(lastReprovideKey) + val, err := s.ds.Get(s.ctx, lastReprovideKey) if errors.Is(err, datastore.ErrNotFound) { return time.Time{}, nil } diff --git a/provider/queue/queue.go b/provider/queue/queue.go index e81e341f63..18ed6a7980 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -97,7 +97,7 @@ func (q *Queue) work() { c, err = cid.Parse(head.Value) if err != nil { log.Warningf("error parsing queue entry cid with key (%s), removing it from queue: %s", head.Key, err) - err = q.ds.Delete(k) + err = q.ds.Delete(q.ctx, k) if err != nil { log.Errorf("error deleting queue entry with key (%s), due to error (%s), stopping provider", head.Key, err) return @@ -120,12 +120,12 @@ func (q *Queue) work() { keyPath := fmt.Sprintf("%d/%s", time.Now().UnixNano(), c.String()) nextKey := datastore.NewKey(keyPath) - if err := q.ds.Put(nextKey, toQueue.Bytes()); err != nil { + if err := q.ds.Put(q.ctx, nextKey, toQueue.Bytes()); err != nil { log.Errorf("Failed to enqueue cid: %s", err) continue } case dequeue <- c: - err := q.ds.Delete(k) + err := q.ds.Delete(q.ctx, k) if err != nil { log.Errorf("Failed to delete queued cid %s with key %s: %s", c, k, err) @@ -141,7 +141,7 @@ func (q *Queue) work() { func (q *Queue) getQueueHead() (*query.Entry, error) { qry := query.Query{Orders: []query.Order{query.OrderByKey{}}, Limit: 1} - results, err := q.ds.Query(qry) + results, err := q.ds.Query(q.ctx, qry) if err != nil { return nil, err } diff --git a/provider/queue/queue_test.go b/provider/queue/queue_test.go index 819fa90f97..a0fa36c3ad 100644 --- a/provider/queue/queue_test.go +++ b/provider/queue/queue_test.go @@ -8,7 +8,7 @@ import ( "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/sync" - "github.com/ipfs/go-ipfs-blocksutil" + blocksutil "github.com/ipfs/go-ipfs-blocksutil" ) var blockGenerator = blocksutil.NewBlockGenerator() @@ -72,7 +72,7 @@ func TestMangledData(t *testing.T) { // put bad data in the queue queueKey := datastore.NewKey("/test/0") - err = queue.ds.Put(queueKey, []byte("borked")) + err = queue.ds.Put(ctx, queueKey, []byte("borked")) if err != nil { t.Fatal(err) } diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index c46148c724..b62369a07e 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -45,7 +45,7 @@ type Reprovider struct { } // NewReprovider creates new Reprovider instance. -func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys routing.ContentRouting, keyProvider KeyChanFunc) *Reprovider { +func NewReprovider(ctx context.Context, reprovideInterval time.Duration, rsys routing.ContentRouting, keyProvider KeyChanFunc) *Reprovider { ctx, cancel := context.WithCancel(ctx) return &Reprovider{ ctx: ctx, @@ -55,7 +55,7 @@ func NewReprovider(ctx context.Context, reprovideIniterval time.Duration, rsys r rsys: rsys, keyProvider: keyProvider, - tick: reprovideIniterval, + tick: reprovideInterval, } } diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index e29524ae2c..20b066e60e 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -48,7 +48,7 @@ func setupDag(t *testing.T) (nodes []cid.Cid, bstore blockstore.Blockstore) { t.Fatal(err) } blk := toBlock(t, nb.Build()) - err = bstore.Put(blk) + err = bstore.Put(context.Background(), blk) if err != nil { t.Fatal(err) } @@ -60,7 +60,7 @@ func setupDag(t *testing.T) (nodes []cid.Cid, bstore blockstore.Blockstore) { t.Fatal(err) } blk = toBlock(t, nd) - err = bstore.Put(blk) + err = bstore.Put(context.Background(), blk) if err != nil { t.Fatal(err) } @@ -117,6 +117,7 @@ func testReprovide(t *testing.T, trigger func(r *Reprovider, ctx context.Context keyProvider := NewBlockstoreProvider(bstore) reprov := NewReprovider(ctx, time.Hour, clA, keyProvider) + reprov.Trigger(context.Background()) err := trigger(reprov, ctx) if err != nil { t.Fatal(err) From 8232413c90f8f9458ee81d4ce7e997c84456c7d7 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Thu, 11 Nov 2021 22:12:23 -0300 Subject: [PATCH 3051/3147] Size-based unsharding (#94) * Renamed UpgradeableDirectory to DynamicDirectory to indicate that we can switch between Basic and HAMT Directories * Transition between HAMT directory and Basic Directory based on the global sharding threshold * Unexported BasicDirectory.SwitchToSharding as an unnecessary exposure point until requested * NewDirectoryFromNode always returns a DynamicDirectory instead of an UpgradeableDirectory or HAMTDirectory * Added Swap and Take functions to HAMT Shards * Fix for the size estimation logic where we were not tracking that replacing an entry with a differently sized CID could trigger switching between being a Basic or HAMT directory * Use custom parallel DAG traversal to the EnumLinksAsync for HAMTs that is closer to DFS than BFS * Added lots of comments to the HAMT code * Exported LogTwo function to make it more accessible within the package Co-authored-by: Lucas Molas Co-authored-by: Adin Schmahmann This commit was moved from ipfs/go-unixfs@bd53b6a811b1e1a594f02e384cf6e9606d853657 --- unixfs/hamt/hamt.go | 356 +++++++++++++++----- unixfs/hamt/util.go | 18 +- unixfs/internal/config.go | 3 + unixfs/io/completehamt_test.go | 97 ++++++ unixfs/io/directory.go | 314 ++++++++++++++--- unixfs/io/directory_test.go | 500 +++++++++++++++++++++++----- unixfs/private/linksize/linksize.go | 5 + 7 files changed, 1081 insertions(+), 212 deletions(-) create mode 100644 unixfs/internal/config.go create mode 100644 unixfs/io/completehamt_test.go create mode 100644 unixfs/private/linksize/linksize.go diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 55b798ce49..ac1c5e4584 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -24,12 +24,17 @@ import ( "context" "fmt" "os" + "sync" + + "golang.org/x/sync/errgroup" + + format "github.com/ipfs/go-unixfs" + "github.com/ipfs/go-unixfs/internal" bitfield "github.com/ipfs/go-bitfield" cid "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" dag "github.com/ipfs/go-merkledag" - format "github.com/ipfs/go-unixfs" ) const ( @@ -37,27 +42,41 @@ const ( HashMurmur3 uint64 = 0x22 ) +func init() { + internal.HAMTHashFunction = murmur3Hash +} + func (ds *Shard) isValueNode() bool { return ds.key != "" && ds.val != nil } // A Shard represents the HAMT. It should be initialized with NewShard(). type Shard struct { - cid cid.Cid - childer *childer - tableSize int + // Entries per node (number of possible childs indexed by the partial key). + tableSize int + // Bits needed to encode child indexes (log2 of number of entries). This is + // the number of bits taken from the hash key on each level of the tree. tableSizeLg2 int builder cid.Builder hashFunc uint64 + // String format with number of zeros that will be present in the hexadecimal + // encoding of the child index to always reach the fixed maxpadlen chars. + // Example: maxpadlen = 4 => prefixPadStr: "%04X" (print number in hexadecimal + // format padding with zeros to always reach 4 characters). prefixPadStr string - maxpadlen int + // Length in chars of string that encodes child indexes. We encode indexes + // as hexadecimal strings to this is log4 of number of entries. + maxpadlen int dserv ipld.DAGService + // FIXME: Remove. We don't actually store "value nodes". This confusing + // abstraction just removes the maxpadlen from the link names to extract + // the actual value link the trie is storing. // leaf node key string val *ipld.Link @@ -70,12 +89,13 @@ func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { return nil, err } + // FIXME: Make this at least a static configuration for testing. ds.hashFunc = HashMurmur3 return ds, nil } func makeShard(ds ipld.DAGService, size int) (*Shard, error) { - lg2s, err := logtwo(size) + lg2s, err := Logtwo(size) if err != nil { return nil, err } @@ -123,7 +143,6 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { ds.childer.makeChilder(fsn.Data(), pbnd.Links()) - ds.cid = pbnd.Cid() ds.hashFunc = fsn.HashType() ds.builder = pbnd.CidBuilder() @@ -206,31 +225,49 @@ func (ds *Shard) makeShardValue(lnk *ipld.Link) (*Shard, error) { // Set sets 'name' = nd in the HAMT func (ds *Shard) Set(ctx context.Context, name string, nd ipld.Node) error { - hv := &hashBits{b: hash([]byte(name))} - err := ds.dserv.Add(ctx, nd) + _, err := ds.Swap(ctx, name, nd) + return err +} + +// Swap sets a link pointing to the passed node as the value under the +// name key in this Shard or its children. It also returns the previous link +// under that name key (if any). +func (ds *Shard) Swap(ctx context.Context, name string, node ipld.Node) (*ipld.Link, error) { + hv := newHashBits(name) + err := ds.dserv.Add(ctx, node) if err != nil { - return err + return nil, err } - lnk, err := ipld.MakeLink(nd) + lnk, err := ipld.MakeLink(node) if err != nil { - return err + return nil, err } + + // FIXME: We don't need to set the name here, it will get overwritten. + // This is confusing, confirm and remove this line. lnk.Name = ds.linkNamePrefix(0) + name - return ds.modifyValue(ctx, hv, name, lnk) + return ds.swapValue(ctx, hv, name, lnk) } // Remove deletes the named entry if it exists. Otherwise, it returns // os.ErrNotExist. func (ds *Shard) Remove(ctx context.Context, name string) error { - hv := &hashBits{b: hash([]byte(name))} - return ds.modifyValue(ctx, hv, name, nil) + _, err := ds.Take(ctx, name) + return err +} + +// Take is similar to the public Remove but also returns the +// old removed link (if it exists). +func (ds *Shard) Take(ctx context.Context, name string) (*ipld.Link, error) { + hv := newHashBits(name) + return ds.swapValue(ctx, hv, name, nil) } // Find searches for a child node by 'name' within this hamt func (ds *Shard) Find(ctx context.Context, name string) (*ipld.Link, error) { - hv := &hashBits{b: hash([]byte(name))} + hv := newHashBits(name) var out *ipld.Link err := ds.getValue(ctx, hv, name, func(sv *Shard) error { @@ -338,9 +375,11 @@ func (ds *Shard) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { go func() { defer close(linkResults) defer cancel() - getLinks := makeAsyncTrieGetLinks(ds.dserv, linkResults) - cset := cid.NewSet() - err := dag.Walk(ctx, getLinks, ds.cid, cset.Visit, dag.Concurrent()) + + err := parallelShardWalk(ctx, ds, ds.dserv, func(formattedLink *ipld.Link) error { + emitResult(ctx, linkResults, format.LinkResult{Link: formattedLink, Err: nil}) + return nil + }) if err != nil { emitResult(ctx, linkResults, format.LinkResult{Link: nil, Err: err}) } @@ -348,44 +387,178 @@ func (ds *Shard) EnumLinksAsync(ctx context.Context) <-chan format.LinkResult { return linkResults } -// makeAsyncTrieGetLinks builds a getLinks function that can be used with EnumerateChildrenAsync -// to iterate a HAMT shard. It takes an IPLD Dag Service to fetch nodes, and a call back that will get called -// on all links to leaf nodes in a HAMT tree, so they can be collected for an EnumLinks operation -func makeAsyncTrieGetLinks(dagService ipld.DAGService, linkResults chan<- format.LinkResult) dag.GetLinks { - - return func(ctx context.Context, currentCid cid.Cid) ([]*ipld.Link, error) { - node, err := dagService.Get(ctx, currentCid) - if err != nil { - return nil, err - } - directoryShard, err := NewHamtFromDag(dagService, node) - if err != nil { - return nil, err - } +type listCidsAndShards struct { + cids []cid.Cid + shards []*Shard +} - childShards := make([]*ipld.Link, 0, directoryShard.childer.length()) - links := directoryShard.childer.links - for idx := range directoryShard.childer.children { - lnk := links[idx] - lnkLinkType, err := directoryShard.childLinkType(lnk) +func (ds *Shard) walkChildren(processLinkValues func(formattedLink *ipld.Link) error) (*listCidsAndShards, error) { + res := &listCidsAndShards{} + for idx, lnk := range ds.childer.links { + if nextShard := ds.childer.children[idx]; nextShard == nil { + lnkLinkType, err := ds.childLinkType(lnk) if err != nil { return nil, err } - if lnkLinkType == shardLink { - childShards = append(childShards, lnk) - } else { - sv, err := directoryShard.makeShardValue(lnk) + + switch lnkLinkType { + case shardValueLink: + sv, err := ds.makeShardValue(lnk) if err != nil { return nil, err } formattedLink := sv.val formattedLink.Name = sv.key - emitResult(ctx, linkResults, format.LinkResult{Link: formattedLink, Err: nil}) + + if err := processLinkValues(formattedLink); err != nil { + return nil, err + } + case shardLink: + res.cids = append(res.cids, lnk.Cid) + default: + return nil, fmt.Errorf("unsupported shard link type") + } + + } else { + if nextShard.val != nil { + formattedLink := &ipld.Link{ + Name: nextShard.key, + Size: nextShard.val.Size, + Cid: nextShard.val.Cid, + } + if err := processLinkValues(formattedLink); err != nil { + return nil, err + } + } else { + res.shards = append(res.shards, nextShard) } } - return childShards, nil } + return res, nil +} + +// parallelShardWalk is quite similar to the DAG walking algorithm from https://github.com/ipfs/go-merkledag/blob/594e515f162e764183243b72c2ba84f743424c8c/merkledag.go#L464 +// However, there are a few notable differences: +// 1. Some children are actualized Shard structs and some are in the blockstore, this will leverage walking over the in memory Shards as well as the stored blocks +// 2. Instead of just passing each child into the worker pool by itself we group them so that we can leverage optimizations from GetMany. +// This optimization also makes the walk a little more biased towards depth (as opposed to BFS) in the earlier part of the DAG. +// This is particularly helpful for operations like estimating the directory size which should complete quickly when possible. +// 3. None of the extra options from that package are needed +func parallelShardWalk(ctx context.Context, root *Shard, dserv ipld.DAGService, processShardValues func(formattedLink *ipld.Link) error) error { + const concurrency = 32 + + var visitlk sync.Mutex + visitSet := cid.NewSet() + visit := visitSet.Visit + + // Setup synchronization + grp, errGrpCtx := errgroup.WithContext(ctx) + + // Input and output queues for workers. + feed := make(chan *listCidsAndShards) + out := make(chan *listCidsAndShards) + done := make(chan struct{}) + + for i := 0; i < concurrency; i++ { + grp.Go(func() error { + for feedChildren := range feed { + for _, nextShard := range feedChildren.shards { + nextChildren, err := nextShard.walkChildren(processShardValues) + if err != nil { + return err + } + + select { + case out <- nextChildren: + case <-errGrpCtx.Done(): + return nil + } + } + + var linksToVisit []cid.Cid + for _, nextCid := range feedChildren.cids { + var shouldVisit bool + + visitlk.Lock() + shouldVisit = visit(nextCid) + visitlk.Unlock() + + if shouldVisit { + linksToVisit = append(linksToVisit, nextCid) + } + } + + chNodes := dserv.GetMany(errGrpCtx, linksToVisit) + for optNode := range chNodes { + if optNode.Err != nil { + return optNode.Err + } + + nextShard, err := NewHamtFromDag(dserv, optNode.Node) + if err != nil { + return err + } + + nextChildren, err := nextShard.walkChildren(processShardValues) + if err != nil { + return err + } + + select { + case out <- nextChildren: + case <-errGrpCtx.Done(): + return nil + } + } + + select { + case done <- struct{}{}: + case <-errGrpCtx.Done(): + } + } + return nil + }) + } + + send := feed + var todoQueue []*listCidsAndShards + var inProgress int + + next := &listCidsAndShards{ + shards: []*Shard{root}, + } + +dispatcherLoop: + for { + select { + case send <- next: + inProgress++ + if len(todoQueue) > 0 { + next = todoQueue[0] + todoQueue = todoQueue[1:] + } else { + next = nil + send = nil + } + case <-done: + inProgress-- + if inProgress == 0 && next == nil { + break dispatcherLoop + } + case nextNodes := <-out: + if next == nil { + next = nextNodes + send = feed + } else { + todoQueue = append(todoQueue, nextNodes) + } + case <-errGrpCtx.Done(): + break dispatcherLoop + } + } + close(feed) + return grp.Wait() } func emitResult(ctx context.Context, linkResults chan<- format.LinkResult, r format.LinkResult) { @@ -419,75 +592,95 @@ func (ds *Shard) walkTrie(ctx context.Context, cb func(*Shard) error) error { }) } -func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val *ipld.Link) error { +// swapValue sets the link `value` in the given key, either creating the entry +// if it didn't exist or overwriting the old one. It returns the old entry (if any). +func (ds *Shard) swapValue(ctx context.Context, hv *hashBits, key string, value *ipld.Link) (*ipld.Link, error) { idx, err := hv.Next(ds.tableSizeLg2) if err != nil { - return err + return nil, err } if !ds.childer.has(idx) { - return ds.childer.insert(key, val, idx) + // Entry does not exist, create a new one. + return nil, ds.childer.insert(key, value, idx) } i := ds.childer.sliceIndex(idx) - child, err := ds.childer.get(ctx, i) if err != nil { - return err + return nil, err } if child.isValueNode() { + // Leaf node. This is the base case of this recursive function. if child.key == key { - // value modification - if val == nil { - return ds.childer.rm(idx) + // We are in the correct shard (tree level) so we modify this child + // and return. + oldValue := child.val + + if value == nil { // Remove old entry. + return oldValue, ds.childer.rm(idx) } - child.val = val - return nil + child.val = value // Overwrite entry. + return oldValue, nil } - if val == nil { - return os.ErrNotExist + if value == nil { + return nil, os.ErrNotExist } - // replace value with another shard, one level deeper - ns, err := NewShard(ds.dserv, ds.tableSize) + // We are in the same slot with another entry with a different key + // so we need to fork this leaf node into a shard with two childs: + // the old entry and the new one being inserted here. + // We don't overwrite anything here so we keep: + // `oldValue = nil` + + // The child of this shard will now be a new shard. The old child value + // will be a child of this new shard (along with the new value being + // inserted). + grandChild := child + child, err = NewShard(ds.dserv, ds.tableSize) if err != nil { - return err - } - ns.builder = ds.builder - chhv := &hashBits{ - b: hash([]byte(child.key)), - consumed: hv.consumed, + return nil, err } - - err = ns.modifyValue(ctx, hv, key, val) + child.builder = ds.builder + chhv := newConsumedHashBits(grandChild.key, hv.consumed) + + // We explicitly ignore the oldValue returned by the next two insertions + // (which will be nil) to highlight there is no overwrite here: they are + // done with different keys to a new (empty) shard. (At best this shard + // will create new ones until we find different slots for both.) + _, err = child.swapValue(ctx, hv, key, value) if err != nil { - return err + return nil, err } - - err = ns.modifyValue(ctx, chhv, child.key, child.val) + _, err = child.swapValue(ctx, chhv, grandChild.key, grandChild.val) if err != nil { - return err + return nil, err } - ds.childer.set(ns, i) - return nil + // Replace this leaf node with the new Shard node. + ds.childer.set(child, i) + return nil, nil } else { - err := child.modifyValue(ctx, hv, key, val) + // We are in a Shard (internal node). We will recursively call this + // function until finding the leaf (the logic of the `if` case above). + oldValue, err := child.swapValue(ctx, hv, key, value) if err != nil { - return err + return nil, err } - if val == nil { + if value == nil { + // We have removed an entry, check if we should remove shards + // as well. switch child.childer.length() { case 0: // empty sub-shard, prune it // Note: this shouldnt normally ever happen // in the event of another implementation creates flawed // structures, this will help to normalize them. - return ds.childer.rm(idx) + return oldValue, ds.childer.rm(idx) case 1: // The single child _should_ be a value by // induction. However, we allow for it to be a @@ -499,24 +692,25 @@ func (ds *Shard) modifyValue(ctx context.Context, hv *hashBits, key string, val if schild.isValueNode() { ds.childer.set(schild, i) } - return nil + return oldValue, nil } // Otherwise, work with the link. slnk := child.childer.link(0) - lnkType, err := child.childer.sd.childLinkType(slnk) + var lnkType linkType + lnkType, err = child.childer.sd.childLinkType(slnk) if err != nil { - return err + return nil, err } if lnkType == shardValueLink { // sub-shard with a single value element, collapse it ds.childer.setLink(slnk, i) } - return nil + return oldValue, nil } } - return nil + return oldValue, nil } } diff --git a/unixfs/hamt/util.go b/unixfs/hamt/util.go index 7ae02dfb3f..29f59435e5 100644 --- a/unixfs/hamt/util.go +++ b/unixfs/hamt/util.go @@ -2,9 +2,11 @@ package hamt import ( "fmt" + "math/bits" + + "github.com/ipfs/go-unixfs/internal" "github.com/spaolacci/murmur3" - "math/bits" ) // hashBits is a helper that allows the reading of the 'next n bits' as an integer. @@ -13,6 +15,16 @@ type hashBits struct { consumed int } +func newHashBits(val string) *hashBits { + return &hashBits{b: internal.HAMTHashFunction([]byte(val))} +} + +func newConsumedHashBits(val string, consumed int) *hashBits { + hv := &hashBits{b: internal.HAMTHashFunction([]byte(val))} + hv.consumed = consumed + return hv +} + func mkmask(n int) byte { return (1 << uint(n)) - 1 } @@ -50,7 +62,7 @@ func (hb *hashBits) next(i int) int { } } -func logtwo(v int) (int, error) { +func Logtwo(v int) (int, error) { if v <= 0 { return 0, fmt.Errorf("hamt size should be a power of two") } @@ -61,7 +73,7 @@ func logtwo(v int) (int, error) { return lg2, nil } -func hash(val []byte) []byte { +func murmur3Hash(val []byte) []byte { h := murmur3.New64() h.Write(val) return h.Sum(nil) diff --git a/unixfs/internal/config.go b/unixfs/internal/config.go new file mode 100644 index 0000000000..9250ae2ae3 --- /dev/null +++ b/unixfs/internal/config.go @@ -0,0 +1,3 @@ +package internal + +var HAMTHashFunction func(val []byte) []byte diff --git a/unixfs/io/completehamt_test.go b/unixfs/io/completehamt_test.go new file mode 100644 index 0000000000..2af652e324 --- /dev/null +++ b/unixfs/io/completehamt_test.go @@ -0,0 +1,97 @@ +package io + +import ( + "context" + "encoding/binary" + "fmt" + "github.com/ipfs/go-unixfs/internal" + "math" + "testing" + + mdtest "github.com/ipfs/go-merkledag/test" + "github.com/stretchr/testify/assert" + + "github.com/ipfs/go-unixfs" + "github.com/ipfs/go-unixfs/hamt" + + ipld "github.com/ipfs/go-ipld-format" +) + +// CreateCompleteHAMT creates a HAMT the following properties: +// * its height (distance/edges from root to deepest node) is specified by treeHeight. +// * all leaf Shard nodes have the same depth (and have only 'value' links). +// * all internal Shard nodes point only to other Shards (and hence have zero 'value' links). +// * the total number of 'value' links (directory entries) is: +// childsPerNode ^ (treeHeight). +// treeHeight: The number of layers of non-value HAMT nodes (e.g. height = 1 is a single shard pointing to some values) +// FIXME: HAMTHashFunction needs to be set to idHash by the caller. We depend on +// this simplification for the current logic to work. +func CreateCompleteHAMT(ds ipld.DAGService, treeHeight int, childsPerNode int) (ipld.Node, error) { + if treeHeight < 1 { + panic("treeHeight < 1") + } + if treeHeight > 8 { + panic("treeHeight > 8: we don't allow a key larger than what can be encoded in a 64-bit word") + } + + rootShard, err := hamt.NewShard(ds, childsPerNode) + if err != nil { + return nil, err + } + + // Assuming we are using the ID hash function we can just insert all + // the combinations of a byte slice that will reach the desired height. + totalChildren := int(math.Pow(float64(childsPerNode), float64(treeHeight))) + log2ofChilds, err := hamt.Logtwo(childsPerNode) + if err != nil { + return nil, err + } + if log2ofChilds*treeHeight%8 != 0 { + return nil, fmt.Errorf("childsPerNode * treeHeight should be multiple of 8") + } + bytesInKey := log2ofChilds * treeHeight / 8 + for i := 0; i < totalChildren; i++ { + var hashbuf [8]byte + binary.LittleEndian.PutUint64(hashbuf[:], uint64(i)) + var oldLink *ipld.Link + oldLink, err = rootShard.Swap(context.Background(), string(hashbuf[:bytesInKey]), unixfs.EmptyFileNode()) + if err != nil { + return nil, err + } + if oldLink != nil { + // We shouldn't be overwriting any value, otherwise the tree + // won't be complete. + return nil, fmt.Errorf("we have overwritten entry %s", + oldLink.Cid) + } + } + + return rootShard.Node() +} + +// Return the same value as the hash. +func idHash(val []byte) []byte { + return val +} + +// FIXME: This is not checking the exact height of the tree but just making +// sure there are as many children as we would have with a complete HAMT. +func TestCreateCompleteShard(t *testing.T) { + oldHashFunc := internal.HAMTHashFunction + defer func() { internal.HAMTHashFunction = oldHashFunc }() + internal.HAMTHashFunction = idHash + + ds := mdtest.Mock() + childsPerNode := 16 + treeHeight := 2 + node, err := CreateCompleteHAMT(ds, treeHeight, childsPerNode) + assert.NoError(t, err) + + shard, err := hamt.NewHamtFromDag(ds, node) + assert.NoError(t, err) + links, err := shard.EnumLinks(context.Background()) + assert.NoError(t, err) + + childNodes := int(math.Pow(float64(childsPerNode), float64(treeHeight))) + assert.Equal(t, childNodes, len(links)) +} diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 15c7e862a3..2ec8622479 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -5,14 +5,15 @@ import ( "fmt" "os" - mdag "github.com/ipfs/go-merkledag" - - format "github.com/ipfs/go-unixfs" "github.com/ipfs/go-unixfs/hamt" + "github.com/ipfs/go-unixfs/private/linksize" + "github.com/alecthomas/units" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + mdag "github.com/ipfs/go-merkledag" + format "github.com/ipfs/go-unixfs" ) var log = logging.Logger("unixfs") @@ -23,9 +24,10 @@ var log = logging.Logger("unixfs") // The size is not the *exact* block size of the encoded BasicDirectory but just // the estimated size based byte length of links name and CID (BasicDirectory's // ProtoNode doesn't use the Data field so this estimate is pretty accurate). -var HAMTShardingSize = 0 +var HAMTShardingSize = int(256 * units.KiB) // DefaultShardWidth is the default value used for hamt sharding width. +// Needs to be a power of two (shard entry size) and multiple of 8 (bitfield size). var DefaultShardWidth = 256 // Directory defines a UnixFS directory. It is used for creating, reading and @@ -74,6 +76,16 @@ type Directory interface { // TODO: Evaluate removing `dserv` from this layer and providing it in MFS. // (The functions should in that case add a `DAGService` argument.) +// Link size estimation function. For production it's usually the one here +// but during test we may mock it to get fixed sizes. +func productionLinkSize(linkName string, linkCid cid.Cid) int { + return len(linkName) + linkCid.ByteLen() +} + +func init() { + linksize.LinkSizeFunction = productionLinkSize +} + // BasicDirectory is the basic implementation of `Directory`. All the entries // are stored in a single node. type BasicDirectory struct { @@ -93,6 +105,10 @@ type BasicDirectory struct { type HAMTDirectory struct { shard *hamt.Shard dserv ipld.DAGService + + // Track the changes in size by the AddChild and RemoveChild calls + // for the HAMTShardingSize option. + sizeChange int } func newEmptyBasicDirectory(dserv ipld.DAGService) *BasicDirectory { @@ -110,10 +126,10 @@ func newBasicDirectoryFromNode(dserv ipld.DAGService, node *mdag.ProtoNode) *Bas return basicDir } -// NewDirectory returns a Directory implemented by UpgradeableDirectory +// NewDirectory returns a Directory implemented by DynamicDirectory // containing a BasicDirectory that can be converted to a HAMTDirectory. func NewDirectory(dserv ipld.DAGService) Directory { - return &UpgradeableDirectory{newEmptyBasicDirectory(dserv)} + return &DynamicDirectory{newEmptyBasicDirectory(dserv)} } // ErrNotADir implies that the given node was not a unixfs directory @@ -134,16 +150,13 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err switch fsNode.Type() { case format.TDirectory: - return &UpgradeableDirectory{newBasicDirectoryFromNode(dserv, protoBufNode.Copy().(*mdag.ProtoNode))}, nil + return &DynamicDirectory{newBasicDirectoryFromNode(dserv, protoBufNode.Copy().(*mdag.ProtoNode))}, nil case format.THAMTShard: shard, err := hamt.NewHamtFromDag(dserv, node) if err != nil { return nil, err } - return &HAMTDirectory{ - dserv: dserv, - shard: shard, - }, nil + return &DynamicDirectory{&HAMTDirectory{shard, dserv, 0}}, nil } return nil, ErrNotADir @@ -155,18 +168,16 @@ func (d *BasicDirectory) computeEstimatedSize() { d.addToEstimatedSize(l.Name, l.Cid) return nil }) -} - -func estimatedLinkSize(linkName string, linkCid cid.Cid) int { - return len(linkName) + linkCid.ByteLen() + // ForEachLink will never fail traversing the BasicDirectory + // and neither the inner callback `addToEstimatedSize`. } func (d *BasicDirectory) addToEstimatedSize(name string, linkCid cid.Cid) { - d.estimatedSize += estimatedLinkSize(name, linkCid) + d.estimatedSize += linksize.LinkSizeFunction(name, linkCid) } func (d *BasicDirectory) removeFromEstimatedSize(name string, linkCid cid.Cid) { - d.estimatedSize -= estimatedLinkSize(name, linkCid) + d.estimatedSize -= linksize.LinkSizeFunction(name, linkCid) if d.estimatedSize < 0 { // Something has gone very wrong. Log an error and recompute the // size from scratch. @@ -183,17 +194,50 @@ func (d *BasicDirectory) SetCidBuilder(builder cid.Builder) { // AddChild implements the `Directory` interface. It adds (or replaces) // a link to the given `node` under `name`. func (d *BasicDirectory) AddChild(ctx context.Context, name string, node ipld.Node) error { - // Remove old link (if it existed; ignore `ErrNotExist` otherwise). + link, err := ipld.MakeLink(node) + if err != nil { + return err + } + + return d.addLinkChild(ctx, name, link) +} + +func (d *BasicDirectory) needsToSwitchToHAMTDir(name string, nodeToAdd ipld.Node) (bool, error) { + if HAMTShardingSize == 0 { // Option disabled. + return false, nil + } + + operationSizeChange := 0 + // Find if there is an old entry under that name that will be overwritten. + entryToRemove, err := d.node.GetNodeLink(name) + if err != mdag.ErrLinkNotFound { + if err != nil { + return false, err + } + operationSizeChange -= linksize.LinkSizeFunction(name, entryToRemove.Cid) + } + if nodeToAdd != nil { + operationSizeChange += linksize.LinkSizeFunction(name, nodeToAdd.Cid()) + } + + return d.estimatedSize+operationSizeChange >= HAMTShardingSize, nil +} + +// addLinkChild adds the link as an entry to this directory under the given +// name. Plumbing function for the AddChild API. +func (d *BasicDirectory) addLinkChild(ctx context.Context, name string, link *ipld.Link) error { + // Remove old link and account for size change (if it existed; ignore + // `ErrNotExist` otherwise). err := d.RemoveChild(ctx, name) if err != nil && err != os.ErrNotExist { return err } - err = d.node.AddNodeLink(name, node) + err = d.node.AddRawLink(name, link) if err != nil { return err } - d.addToEstimatedSize(name, node.Cid()) + d.addToEstimatedSize(name, link.Cid) return nil } @@ -218,7 +262,7 @@ func (d *BasicDirectory) EnumLinksAsync(ctx context.Context) <-chan format.LinkR } // ForEachLink implements the `Directory` interface. -func (d *BasicDirectory) ForEachLink(ctx context.Context, f func(*ipld.Link) error) error { +func (d *BasicDirectory) ForEachLink(_ context.Context, f func(*ipld.Link) error) error { for _, l := range d.node.Links() { if err := f(l); err != nil { return err @@ -277,8 +321,8 @@ func (d *BasicDirectory) GetCidBuilder() cid.Builder { return d.node.CidBuilder() } -// SwitchToSharding returns a HAMT implementation of this directory. -func (d *BasicDirectory) SwitchToSharding(ctx context.Context) (Directory, error) { +// switchToSharding returns a HAMT implementation of this directory. +func (d *BasicDirectory) switchToSharding(ctx context.Context) (*HAMTDirectory, error) { hamtDir := new(HAMTDirectory) hamtDir.dserv = d.dserv @@ -311,7 +355,16 @@ func (d *HAMTDirectory) SetCidBuilder(builder cid.Builder) { // AddChild implements the `Directory` interface. func (d *HAMTDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { - return d.shard.Set(ctx, name, nd) + oldChild, err := d.shard.Swap(ctx, name, nd) + if err != nil { + return err + } + + if oldChild != nil { + d.removeFromSizeChange(oldChild.Name, oldChild.Cid) + } + d.addToSizeChange(name, nd.Cid()) + return nil } // ForEachLink implements the `Directory` interface. @@ -342,7 +395,16 @@ func (d *HAMTDirectory) Find(ctx context.Context, name string) (ipld.Node, error // RemoveChild implements the `Directory` interface. func (d *HAMTDirectory) RemoveChild(ctx context.Context, name string) error { - return d.shard.Remove(ctx, name) + oldChild, err := d.shard.Take(ctx, name) + if err != nil { + return err + } + + if oldChild != nil { + d.removeFromSizeChange(oldChild.Name, oldChild.Cid) + } + + return nil } // GetNode implements the `Directory` interface. @@ -355,42 +417,198 @@ func (d *HAMTDirectory) GetCidBuilder() cid.Builder { return d.shard.CidBuilder() } -// UpgradeableDirectory wraps a Directory interface and provides extra logic -// to upgrade from its BasicDirectory implementation to HAMTDirectory. -type UpgradeableDirectory struct { +// switchToBasic returns a BasicDirectory implementation of this directory. +func (d *HAMTDirectory) switchToBasic(ctx context.Context) (*BasicDirectory, error) { + basicDir := newEmptyBasicDirectory(d.dserv) + basicDir.SetCidBuilder(d.GetCidBuilder()) + + err := d.ForEachLink(ctx, func(lnk *ipld.Link) error { + err := basicDir.addLinkChild(ctx, lnk.Name, lnk) + if err != nil { + return err + } + + return nil + // This function enumerates all the links in the Directory requiring all + // shards to be accessible but it is only called *after* sizeBelowThreshold + // returns true, which means we have already enumerated and fetched *all* + // shards in the first place (that's the only way we can be really sure + // we are actually below the threshold). + }) + if err != nil { + return nil, err + } + + return basicDir, nil +} + +func (d *HAMTDirectory) addToSizeChange(name string, linkCid cid.Cid) { + d.sizeChange += linksize.LinkSizeFunction(name, linkCid) +} + +func (d *HAMTDirectory) removeFromSizeChange(name string, linkCid cid.Cid) { + d.sizeChange -= linksize.LinkSizeFunction(name, linkCid) +} + +// Evaluate a switch from HAMTDirectory to BasicDirectory in case the size will +// go above the threshold when we are adding or removing an entry. +// In both the add/remove operations any old name will be removed, and for the +// add operation in particular a new entry will be added under that name (otherwise +// nodeToAdd is nil). We compute both (potential) future subtraction and +// addition to the size change. +func (d *HAMTDirectory) needsToSwitchToBasicDir(ctx context.Context, name string, nodeToAdd ipld.Node) (switchToBasic bool, err error) { + if HAMTShardingSize == 0 { // Option disabled. + return false, nil + } + + operationSizeChange := 0 + + // Find if there is an old entry under that name that will be overwritten + // (AddEntry) or flat out removed (RemoveEntry). + entryToRemove, err := d.shard.Find(ctx, name) + if err != os.ErrNotExist { + if err != nil { + return false, err + } + operationSizeChange -= linksize.LinkSizeFunction(name, entryToRemove.Cid) + } + + // For the AddEntry case compute the size addition of the new entry. + if nodeToAdd != nil { + operationSizeChange += linksize.LinkSizeFunction(name, nodeToAdd.Cid()) + } + + if d.sizeChange+operationSizeChange >= 0 { + // We won't have reduced the HAMT net size. + return false, nil + } + + // We have reduced the directory size, check if went below the + // HAMTShardingSize threshold to trigger a switch. + return d.sizeBelowThreshold(ctx, operationSizeChange) +} + +// Evaluate directory size and a future sizeChange and check if it will be below +// HAMTShardingSize threshold (to trigger a transition to a BasicDirectory). +// Instead of enumerating the entire tree we eagerly call EnumLinksAsync +// until we either reach a value above the threshold (in that case no need +// to keep counting) or an error occurs (like the context being canceled +// if we take too much time fetching the necessary shards). +func (d *HAMTDirectory) sizeBelowThreshold(ctx context.Context, sizeChange int) (below bool, err error) { + if HAMTShardingSize == 0 { + panic("asked to compute HAMT size with HAMTShardingSize option off (0)") + } + + // We don't necessarily compute the full size of *all* shards as we might + // end early if we already know we're above the threshold or run out of time. + partialSize := 0 + + // We stop the enumeration once we have enough information and exit this function. + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + for linkResult := range d.EnumLinksAsync(ctx) { + if linkResult.Err != nil { + return false, linkResult.Err + } + + partialSize += linksize.LinkSizeFunction(linkResult.Link.Name, linkResult.Link.Cid) + if partialSize+sizeChange >= HAMTShardingSize { + // We have already fetched enough shards to assert we are + // above the threshold, so no need to keep fetching. + return false, nil + } + } + + // We enumerated *all* links in all shards and didn't reach the threshold. + return true, nil +} + +// DynamicDirectory wraps a Directory interface and provides extra logic +// to switch from BasicDirectory to HAMTDirectory and backwards based on +// size. +type DynamicDirectory struct { Directory } -var _ Directory = (*UpgradeableDirectory)(nil) +var _ Directory = (*DynamicDirectory)(nil) // AddChild implements the `Directory` interface. We check when adding new entries // if we should switch to HAMTDirectory according to global option(s). -func (d *UpgradeableDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { - err := d.Directory.AddChild(ctx, name, nd) +func (d *DynamicDirectory) AddChild(ctx context.Context, name string, nd ipld.Node) error { + hamtDir, ok := d.Directory.(*HAMTDirectory) + if ok { + // We evaluate a switch in the HAMTDirectory case even for an AddChild + // as it may overwrite an existing entry and end up actually reducing + // the directory size. + switchToBasic, err := hamtDir.needsToSwitchToBasicDir(ctx, name, nd) + if err != nil { + return err + } + + if switchToBasic { + basicDir, err := hamtDir.switchToBasic(ctx) + if err != nil { + return err + } + err = basicDir.AddChild(ctx, name, nd) + if err != nil { + return err + } + d.Directory = basicDir + return nil + } + + return d.Directory.AddChild(ctx, name, nd) + } + + // BasicDirectory + basicDir := d.Directory.(*BasicDirectory) + switchToHAMT, err := basicDir.needsToSwitchToHAMTDir(name, nd) if err != nil { return err } - - // Evaluate possible HAMT upgrade. - if HAMTShardingSize == 0 { - return nil + if !switchToHAMT { + return basicDir.AddChild(ctx, name, nd) } - basicDir, ok := d.Directory.(*BasicDirectory) + hamtDir, err = basicDir.switchToSharding(ctx) + if err != nil { + return err + } + hamtDir.AddChild(ctx, name, nd) + if err != nil { + return err + } + d.Directory = hamtDir + return nil +} + +// RemoveChild implements the `Directory` interface. Used in the case where we wrap +// a HAMTDirectory that might need to be downgraded to a BasicDirectory. The +// upgrade path is in AddChild. +func (d *DynamicDirectory) RemoveChild(ctx context.Context, name string) error { + hamtDir, ok := d.Directory.(*HAMTDirectory) if !ok { - return nil + return d.Directory.RemoveChild(ctx, name) } - if basicDir.estimatedSize >= HAMTShardingSize { - // Ideally to minimize performance we should check if this last - // `AddChild` call would bring the directory size over the threshold - // *before* executing it since we would end up switching anyway and - // that call would be "wasted". This is a minimal performance impact - // and we prioritize a simple code base. - hamtDir, err := basicDir.SwitchToSharding(ctx) - if err != nil { - return err - } - d.Directory = hamtDir + + switchToBasic, err := hamtDir.needsToSwitchToBasicDir(ctx, name, nil) + if err != nil { + return err } + if !switchToBasic { + return hamtDir.RemoveChild(ctx, name) + } + + basicDir, err := hamtDir.switchToBasic(ctx) + if err != nil { + return err + } + basicDir.RemoveChild(ctx, name) + if err != nil { + return err + } + d.Directory = basicDir return nil } diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index 8c5d8e1091..f5fa2e564d 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -4,13 +4,30 @@ import ( "context" "fmt" "math" + "sort" + "strconv" + "strings" + "sync" "testing" - + "time" + + blocks "github.com/ipfs/go-block-format" + bsrv "github.com/ipfs/go-blockservice" + cid "github.com/ipfs/go-cid" + ds "github.com/ipfs/go-datastore" + dssync "github.com/ipfs/go-datastore/sync" + blockstore "github.com/ipfs/go-ipfs-blockstore" + offline "github.com/ipfs/go-ipfs-exchange-offline" ipld "github.com/ipfs/go-ipld-format" mdag "github.com/ipfs/go-merkledag" mdtest "github.com/ipfs/go-merkledag/test" ft "github.com/ipfs/go-unixfs" + "github.com/ipfs/go-unixfs/hamt" + "github.com/ipfs/go-unixfs/internal" + "github.com/ipfs/go-unixfs/private/linksize" + + "github.com/stretchr/testify/assert" ) func TestEmptyNode(t *testing.T) { @@ -100,116 +117,331 @@ func TestDuplicateAddDir(t *testing.T) { } } -// FIXME: Nothing blocking but nice to have: -// * Check estimated size against link enumeration (indirectly done in the -// restored node check from NewDirectoryFromNode). -// * Check estimated size against encoded node (the difference should only be -// a small percentage for a directory with 10s of entries). func TestBasicDirectory_estimatedSize(t *testing.T) { ds := mdtest.Mock() + basicDir := newEmptyBasicDirectory(ds) + + testDirectorySizeEstimation(t, basicDir, ds, func(dir Directory) int { + return dir.(*BasicDirectory).estimatedSize + }) +} + +func TestHAMTDirectory_sizeChange(t *testing.T) { + ds := mdtest.Mock() + hamtDir, err := newEmptyHAMTDirectory(ds, DefaultShardWidth) + assert.NoError(t, err) + + testDirectorySizeEstimation(t, hamtDir, ds, func(dir Directory) int { + // Since we created a HAMTDirectory from scratch with size 0 its + // internal sizeChange delta will in fact track the directory size + // throughout this run. + return dir.(*HAMTDirectory).sizeChange + }) +} + +func fullSizeEnumeration(dir Directory) int { + size := 0 + dir.ForEachLink(context.Background(), func(l *ipld.Link) error { + size += linksize.LinkSizeFunction(l.Name, l.Cid) + return nil + }) + return size +} + +func testDirectorySizeEstimation(t *testing.T, dir Directory, ds ipld.DAGService, size func(Directory) int) { + linksize.LinkSizeFunction = mockLinkSizeFunc(1) + defer func() { linksize.LinkSizeFunction = productionLinkSize }() + ctx := context.Background() child := ft.EmptyFileNode() - err := ds.Add(ctx, child) - if err != nil { - t.Fatal(err) - } - - basicDir := newEmptyBasicDirectory(ds) + assert.NoError(t, ds.Add(ctx, child)) // Several overwrites should not corrupt the size estimation. - basicDir.AddChild(ctx, "child", child) - basicDir.AddChild(ctx, "child", child) - basicDir.AddChild(ctx, "child", child) - basicDir.RemoveChild(ctx, "child") - basicDir.AddChild(ctx, "child", child) - basicDir.RemoveChild(ctx, "child") - // FIXME: Check errors above (abstract adds/removals in iteration). - if basicDir.estimatedSize != 0 { - t.Fatal("estimated size is not zero after removing all entries") - } - - for i := 0; i < 100; i++ { - basicDir.AddChild(ctx, fmt.Sprintf("child-%03d", i), child) // e.g., "child-045" - } - // Estimated entry size: name (9) + CID (32 from hash and 2 extra for header) - entrySize := 9 + 32 + 2 - expectedSize := 100 * entrySize - if basicDir.estimatedSize != expectedSize { - t.Fatalf("estimated size (%d) inaccurate after adding many entries (expected %d)", - basicDir.estimatedSize, expectedSize) - } - - basicDir.RemoveChild(ctx, "child-045") // just random values - basicDir.RemoveChild(ctx, "child-063") - basicDir.RemoveChild(ctx, "child-011") - basicDir.RemoveChild(ctx, "child-000") - basicDir.RemoveChild(ctx, "child-099") - - basicDir.RemoveChild(ctx, "child-045") // already removed, won't impact size - basicDir.RemoveChild(ctx, "nonexistent-name") // also doesn't count - basicDir.RemoveChild(ctx, "child-100") // same - expectedSize -= 5 * entrySize - if basicDir.estimatedSize != expectedSize { - t.Fatalf("estimated size (%d) inaccurate after removing some entries (expected %d)", - basicDir.estimatedSize, expectedSize) - } + assert.NoError(t, dir.AddChild(ctx, "child", child)) + assert.NoError(t, dir.AddChild(ctx, "child", child)) + assert.NoError(t, dir.AddChild(ctx, "child", child)) + assert.NoError(t, dir.RemoveChild(ctx, "child")) + assert.NoError(t, dir.AddChild(ctx, "child", child)) + assert.NoError(t, dir.RemoveChild(ctx, "child")) + assert.Equal(t, 0, size(dir), "estimated size is not zero after removing all entries") + + dirEntries := 100 + for i := 0; i < dirEntries; i++ { + assert.NoError(t, dir.AddChild(ctx, fmt.Sprintf("child-%03d", i), child)) + } + assert.Equal(t, dirEntries, size(dir), "estimated size inaccurate after adding many entries") + + assert.NoError(t, dir.RemoveChild(ctx, "child-045")) // just random values + assert.NoError(t, dir.RemoveChild(ctx, "child-063")) + assert.NoError(t, dir.RemoveChild(ctx, "child-011")) + assert.NoError(t, dir.RemoveChild(ctx, "child-000")) + assert.NoError(t, dir.RemoveChild(ctx, "child-099")) + dirEntries -= 5 + assert.Equal(t, dirEntries, size(dir), "estimated size inaccurate after removing some entries") + + // All of the following remove operations will fail (won't impact dirEntries): + assert.Error(t, dir.RemoveChild(ctx, "nonexistent-name")) + assert.Error(t, dir.RemoveChild(ctx, "child-045")) // already removed + assert.Error(t, dir.RemoveChild(ctx, "child-100")) + assert.Equal(t, dirEntries, size(dir), "estimated size inaccurate after failed remove attempts") // Restore a directory from original's node and check estimated size consistency. - basicDirSingleNode, _ := basicDir.GetNode() // no possible error - restoredBasicDir := newBasicDirectoryFromNode(ds, basicDirSingleNode.(*mdag.ProtoNode)) - if basicDir.estimatedSize != restoredBasicDir.estimatedSize { - t.Fatalf("restored basic directory size (%d) doesn't match original estimate (%d)", - basicDir.estimatedSize, restoredBasicDir.estimatedSize) + dirNode, err := dir.GetNode() + assert.NoError(t, err) + restoredDir, err := NewDirectoryFromNode(ds, dirNode.(*mdag.ProtoNode)) + assert.NoError(t, err) + assert.Equal(t, size(dir), fullSizeEnumeration(restoredDir), "restored directory's size doesn't match original's") + // We don't use the estimation size function for the restored directory + // because in the HAMT case this function depends on the sizeChange variable + // that will be cleared when loading the directory from the node. + // This also covers the case of comparing the size estimation `size()` with + // the full enumeration function `fullSizeEnumeration()` to make sure it's + // correct. +} + +// Any entry link size will have the fixedSize passed. +func mockLinkSizeFunc(fixedSize int) func(linkName string, linkCid cid.Cid) int { + return func(_ string, _ cid.Cid) int { + return fixedSize } } -// Basic test on extreme threshold to trigger switch. More fine-grained sizes -// are checked in TestBasicDirectory_estimatedSize (without the swtich itself -// but focusing on the size computation). -// FIXME: Ideally, instead of checking size computation on one test and directory -// upgrade on another a better structured test should test both dimensions -// simultaneously. -func TestUpgradeableDirectory(t *testing.T) { +func checkBasicDirectory(t *testing.T, dir Directory, errorMessage string) { + if _, ok := dir.(*DynamicDirectory).Directory.(*BasicDirectory); !ok { + t.Fatal(errorMessage) + } +} + +func checkHAMTDirectory(t *testing.T, dir Directory, errorMessage string) { + if _, ok := dir.(*DynamicDirectory).Directory.(*HAMTDirectory); !ok { + t.Fatal(errorMessage) + } +} + +func TestProductionLinkSize(t *testing.T) { + link, err := ipld.MakeLink(ft.EmptyDirNode()) + assert.NoError(t, err) + link.Name = "directory_link_name" + assert.Equal(t, 53, productionLinkSize(link.Name, link.Cid)) + + link, err = ipld.MakeLink(ft.EmptyFileNode()) + assert.NoError(t, err) + link.Name = "file_link_name" + assert.Equal(t, 48, productionLinkSize(link.Name, link.Cid)) + + ds := mdtest.Mock() + basicDir := newEmptyBasicDirectory(ds) + assert.NoError(t, err) + for i := 0; i < 10; i++ { + basicDir.AddChild(context.Background(), strconv.FormatUint(uint64(i), 10), ft.EmptyFileNode()) + } + basicDirNode, err := basicDir.GetNode() + assert.NoError(t, err) + link, err = ipld.MakeLink(basicDirNode) + assert.NoError(t, err) + link.Name = "basic_dir" + assert.Equal(t, 43, productionLinkSize(link.Name, link.Cid)) +} + +// Test HAMTDirectory <-> BasicDirectory switch based on directory size. The +// switch is managed by the DynamicDirectory abstraction. +func TestDynamicDirectorySwitch(t *testing.T) { oldHamtOption := HAMTShardingSize defer func() { HAMTShardingSize = oldHamtOption }() + HAMTShardingSize = 0 // Disable automatic switch at the start. + linksize.LinkSizeFunction = mockLinkSizeFunc(1) + defer func() { linksize.LinkSizeFunction = productionLinkSize }() ds := mdtest.Mock() dir := NewDirectory(ds) + checkBasicDirectory(t, dir, "new dir is not BasicDirectory") + ctx := context.Background() child := ft.EmptyDirNode() err := ds.Add(ctx, child) - if err != nil { - t.Fatal(err) - } + assert.NoError(t, err) - HAMTShardingSize = 0 // Create a BasicDirectory. - if _, ok := dir.(*UpgradeableDirectory).Directory.(*BasicDirectory); !ok { - t.Fatal("UpgradeableDirectory doesn't contain BasicDirectory") - } + err = dir.AddChild(ctx, "1", child) + assert.NoError(t, err) + checkBasicDirectory(t, dir, "added child, option still disabled") // Set a threshold so big a new entry won't trigger the change. HAMTShardingSize = math.MaxInt32 - err = dir.AddChild(ctx, "test", child) - if err != nil { - t.Fatal(err) - } - - if _, ok := dir.(*UpgradeableDirectory).Directory.(*HAMTDirectory); ok { - t.Fatal("UpgradeableDirectory was upgraded to HAMTDirectory for a large threshold") - } + err = dir.AddChild(ctx, "2", child) + assert.NoError(t, err) + checkBasicDirectory(t, dir, "added child, option now enabled but at max") // Now set it so low to make sure any new entry will trigger the upgrade. HAMTShardingSize = 1 - err = dir.AddChild(ctx, "test", child) // overwriting an entry should also trigger the switch - if err != nil { - t.Fatal(err) + // We are already above the threshold, we trigger the switch with an overwrite + // (any AddChild() should reevaluate the size). + err = dir.AddChild(ctx, "2", child) + assert.NoError(t, err) + checkHAMTDirectory(t, dir, "added child, option at min, should switch up") + + // Set threshold at the number of current entries and delete the last one + // to trigger a switch and evaluate if the rest of the entries are conserved. + HAMTShardingSize = 2 + err = dir.RemoveChild(ctx, "2") + assert.NoError(t, err) + checkBasicDirectory(t, dir, "removed threshold entry, option at min, should switch down") +} + +func TestIntegrityOfDirectorySwitch(t *testing.T) { + ds := mdtest.Mock() + dir := NewDirectory(ds) + checkBasicDirectory(t, dir, "new dir is not BasicDirectory") + + ctx := context.Background() + child := ft.EmptyDirNode() + err := ds.Add(ctx, child) + assert.NoError(t, err) + + basicDir := newEmptyBasicDirectory(ds) + hamtDir, err := newEmptyHAMTDirectory(ds, DefaultShardWidth) + assert.NoError(t, err) + for i := 0; i < 1000; i++ { + basicDir.AddChild(ctx, strconv.FormatUint(uint64(i), 10), child) + hamtDir.AddChild(ctx, strconv.FormatUint(uint64(i), 10), child) + } + compareDirectoryEntries(t, basicDir, hamtDir) + + hamtDirFromSwitch, err := basicDir.switchToSharding(ctx) + assert.NoError(t, err) + basicDirFromSwitch, err := hamtDir.switchToBasic(ctx) + assert.NoError(t, err) + compareDirectoryEntries(t, basicDir, basicDirFromSwitch) + compareDirectoryEntries(t, hamtDir, hamtDirFromSwitch) +} + +// This is the value of concurrent fetches during dag.Walk. Used in +// test to better predict how many nodes will be fetched. +var defaultConcurrentFetch = 32 + +// FIXME: Taken from private github.com/ipfs/go-merkledag@v0.2.3/merkledag.go. +// (We can also pass an explicit concurrency value in `(*Shard).EnumLinksAsync()` +// and take ownership of this configuration, but departing from the more +// standard and reliable one in `go-merkledag`. + +// Test that we fetch as little nodes as needed to reach the HAMTShardingSize +// during the sizeBelowThreshold computation. +func TestHAMTEnumerationWhenComputingSize(t *testing.T) { + // Adjust HAMT global/static options for the test to simplify its logic. + // FIXME: These variables weren't designed to be modified and we should + // review in depth side effects. + + // Set all link sizes to a uniform 1 so the estimated directory size + // is just the count of its entry links (in HAMT/Shard terminology these + // are the "value" links pointing to anything that is *not* another Shard). + linksize.LinkSizeFunction = mockLinkSizeFunc(1) + defer func() { linksize.LinkSizeFunction = productionLinkSize }() + + // Use an identity hash function to ease the construction of "complete" HAMTs + // (see CreateCompleteHAMT below for more details). (Ideally this should be + // a parameter we pass and not a global option we modify in the caller.) + oldHashFunc := internal.HAMTHashFunction + defer func() { internal.HAMTHashFunction = oldHashFunc }() + internal.HAMTHashFunction = idHash + + oldHamtOption := HAMTShardingSize + defer func() { HAMTShardingSize = oldHamtOption }() + + // --- End of test static configuration adjustments. --- + + // Some arbitrary values below that make this test not that expensive. + treeHeight := 4 + // How many leaf shards nodes (with value links, + // i.e., directory entries) do we need to reach the threshold. + thresholdToWidthRatio := 4 + // Departing from DefaultShardWidth of 256 to reduce HAMT size in + // CreateCompleteHAMT. + shardWidth := 16 + HAMTShardingSize = shardWidth * thresholdToWidthRatio + + // We create a "complete" HAMT (see CreateCompleteHAMT for more details) + // with a regular structure to be able to predict how many Shard nodes we + // will need to fetch in order to reach the HAMTShardingSize threshold in + // sizeBelowThreshold (assuming a sequential DAG walk function). + + bstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + countGetsDS := newCountGetsDS(bstore) + dsrv := mdag.NewDAGService(bsrv.New(countGetsDS, offline.Exchange(countGetsDS))) + completeHAMTRoot, err := CreateCompleteHAMT(dsrv, treeHeight, shardWidth) + assert.NoError(t, err) + + // Calculate the optimal number of nodes to traverse + optimalNodesToFetch := 0 + nodesToProcess := HAMTShardingSize + for i := 0; i < treeHeight-1; i++ { + // divide by the shard width to get the parents and continue up the tree + parentNodes := int(math.Ceil(float64(nodesToProcess) / float64(shardWidth))) + optimalNodesToFetch += parentNodes + nodesToProcess = parentNodes + } + + // With this structure and a BFS traversal (from `parallelWalkDepth`) then + // we would roughly fetch the following nodes: + nodesToFetch := 0 + // * all layers up to (but not including) the last one with leaf nodes + // (because it's a BFS) + for i := 0; i < treeHeight-1; i++ { + nodesToFetch += int(math.Pow(float64(shardWidth), float64(i))) + } + // * `thresholdToWidthRatio` leaf Shards with enough value links to reach + // the HAMTShardingSize threshold. + nodesToFetch += thresholdToWidthRatio + + hamtDir, err := newHAMTDirectoryFromNode(dsrv, completeHAMTRoot) + assert.NoError(t, err) + + countGetsDS.resetCounter() + countGetsDS.setRequestDelay(10 * time.Millisecond) + // (Without the `setRequestDelay` above the number of nodes fetched + // drops dramatically and unpredictably as the BFS starts to behave + // more like a DFS because some search paths are fetched faster than + // others.) + below, err := hamtDir.sizeBelowThreshold(context.TODO(), 0) + assert.NoError(t, err) + assert.False(t, below) + t.Logf("fetched %d nodes (predicted range: %d-%d)", + countGetsDS.uniqueCidsFetched(), optimalNodesToFetch, nodesToFetch+defaultConcurrentFetch) + // Check that the actual number of nodes fetched is within the margin of the + // estimated `nodesToFetch` plus an extra of `defaultConcurrentFetch` since + // we are fetching in parallel. + assert.True(t, countGetsDS.uniqueCidsFetched() <= nodesToFetch+defaultConcurrentFetch) + assert.True(t, countGetsDS.uniqueCidsFetched() >= optimalNodesToFetch) +} + +// Compare entries in the leftDir against the rightDir and possibly +// missingEntries in the second. +func compareDirectoryEntries(t *testing.T, leftDir Directory, rightDir Directory) { + leftLinks, err := getAllLinksSortedByName(leftDir) + assert.NoError(t, err) + rightLinks, err := getAllLinksSortedByName(rightDir) + assert.NoError(t, err) + + assert.Equal(t, len(leftLinks), len(rightLinks)) + + for i, leftLink := range leftLinks { + assert.Equal(t, leftLink, rightLinks[i]) // FIXME: Can we just compare the entire struct? } +} - if _, ok := dir.(*UpgradeableDirectory).Directory.(*HAMTDirectory); !ok { - t.Fatal("UpgradeableDirectory wasn't upgraded to HAMTDirectory for a low threshold") +func getAllLinksSortedByName(d Directory) ([]*ipld.Link, error) { + entries, err := d.Links(context.Background()) + if err != nil { + return nil, err } + sortLinksByName(entries) + return entries, nil +} + +func sortLinksByName(l []*ipld.Link) { + sort.SliceStable(l, func(i, j int) bool { + return strings.Compare(l[i].Name, l[j].Name) == -1 // FIXME: Is this correct? + }) } func TestDirBuilder(t *testing.T) { @@ -296,3 +528,111 @@ func TestDirBuilder(t *testing.T) { t.Fatal("wrong number of links", len(asyncLinks), count) } } + +func newHAMTDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (*HAMTDirectory, error) { + shard, err := hamt.NewHamtFromDag(dserv, node) + if err != nil { + return nil, err + } + return &HAMTDirectory{ + dserv: dserv, + shard: shard, + }, nil +} + +func newEmptyHAMTDirectory(dserv ipld.DAGService, shardWidth int) (*HAMTDirectory, error) { + shard, err := hamt.NewShard(dserv, shardWidth) + if err != nil { + return nil, err + } + + return &HAMTDirectory{ + dserv: dserv, + shard: shard, + }, nil +} + +// countGetsDS is a DAG service that keeps track of the number of +// unique CIDs fetched. +type countGetsDS struct { + blockstore.Blockstore + + cidsFetched map[cid.Cid]struct{} + mapLock sync.Mutex + started bool + + getRequestDelay time.Duration +} + +var _ blockstore.Blockstore = (*countGetsDS)(nil) + +func newCountGetsDS(bs blockstore.Blockstore) *countGetsDS { + return &countGetsDS{ + bs, + make(map[cid.Cid]struct{}), + sync.Mutex{}, + false, + 0, + } +} + +func (d *countGetsDS) resetCounter() { + d.mapLock.Lock() + defer d.mapLock.Unlock() + d.cidsFetched = make(map[cid.Cid]struct{}) + d.started = true +} + +func (d *countGetsDS) uniqueCidsFetched() int { + d.mapLock.Lock() + defer d.mapLock.Unlock() + return len(d.cidsFetched) +} + +func (d *countGetsDS) setRequestDelay(timeout time.Duration) { + d.getRequestDelay = timeout +} + +func (d *countGetsDS) maybeSleep(c cid.Cid) { + d.mapLock.Lock() + _, cidRequestedBefore := d.cidsFetched[c] + d.cidsFetched[c] = struct{}{} + d.mapLock.Unlock() + + if d.getRequestDelay != 0 && !cidRequestedBefore { + // First request gets a timeout to simulate a network fetch. + // Subsequent requests get no timeout simulating an in-disk cache. + time.Sleep(d.getRequestDelay) + } +} + +func (d *countGetsDS) Has(c cid.Cid) (bool, error) { + if d.started { + panic("implement me") + } + return d.Blockstore.Has(c) +} + +func (d *countGetsDS) Get(c cid.Cid) (blocks.Block, error) { + blk, err := d.Blockstore.Get(c) + if err != nil { + return nil, err + } + + d.maybeSleep(c) + return blk, nil +} + +func (d *countGetsDS) GetSize(c cid.Cid) (int, error) { + if d.started { + panic("implement me") + } + return d.Blockstore.GetSize(c) +} + +func (d *countGetsDS) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { + if d.started { + panic("implement me") + } + return d.Blockstore.AllKeysChan(ctx) +} diff --git a/unixfs/private/linksize/linksize.go b/unixfs/private/linksize/linksize.go new file mode 100644 index 0000000000..e7ae098b61 --- /dev/null +++ b/unixfs/private/linksize/linksize.go @@ -0,0 +1,5 @@ +package linksize + +import "github.com/ipfs/go-cid" + +var LinkSizeFunction func(linkName string, linkCid cid.Cid) int From 2614f3ecb4532255fbaf8ad544b58fd4e563b0de Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Fri, 12 Nov 2021 13:41:18 -0500 Subject: [PATCH 3052/3147] feat: add context to interfaces (#90) This commit was moved from ipfs/go-ipfs-blockstore@60f8b66fddb5bf2fa7c1b6b6ee04370e05c23035 --- blockstore/arc_cache.go | 46 +++++++------- blockstore/arc_cache_test.go | 112 ++++++++++++++++----------------- blockstore/blockstore.go | 68 ++++++++++---------- blockstore/blockstore_test.go | 72 ++++++++++----------- blockstore/bloom_cache.go | 46 +++++++------- blockstore/bloom_cache_test.go | 58 ++++++++--------- blockstore/idstore.go | 34 +++++----- blockstore/idstore_test.go | 36 +++++------ 8 files changed, 237 insertions(+), 235 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 7f859f3427..09aa441387 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -53,7 +53,7 @@ func mutexKey(k cid.Cid) uint8 { return k.KeyString()[len(k.KeyString())-1] } -func (b *arccache) DeleteBlock(k cid.Cid) error { +func (b *arccache) DeleteBlock(ctx context.Context, k cid.Cid) error { if !k.Defined() { return nil } @@ -67,14 +67,14 @@ func (b *arccache) DeleteBlock(k cid.Cid) error { defer lk.Unlock() b.cache.Remove(k) // Invalidate cache before deleting. - err := b.blockstore.DeleteBlock(k) + err := b.blockstore.DeleteBlock(ctx, k) if err == nil { b.cacheHave(k, false) } return err } -func (b *arccache) Has(k cid.Cid) (bool, error) { +func (b *arccache) Has(ctx context.Context, k cid.Cid) (bool, error) { if !k.Defined() { return false, nil } @@ -87,7 +87,7 @@ func (b *arccache) Has(k cid.Cid) (bool, error) { lk.RLock() defer lk.RUnlock() - has, err := b.blockstore.Has(k) + has, err := b.blockstore.Has(ctx, k) if err != nil { return false, err } @@ -95,7 +95,7 @@ func (b *arccache) Has(k cid.Cid) (bool, error) { return has, nil } -func (b *arccache) GetSize(k cid.Cid) (int, error) { +func (b *arccache) GetSize(ctx context.Context, k cid.Cid) (int, error) { if !k.Defined() { return -1, ErrNotFound } @@ -116,7 +116,7 @@ func (b *arccache) GetSize(k cid.Cid) (int, error) { lk.RLock() defer lk.RUnlock() - blockSize, err := b.blockstore.GetSize(k) + blockSize, err := b.blockstore.GetSize(ctx, k) if err == ErrNotFound { b.cacheHave(k, false) } else if err == nil { @@ -125,11 +125,11 @@ func (b *arccache) GetSize(k cid.Cid) (int, error) { return blockSize, err } -func (b *arccache) View(k cid.Cid, callback func([]byte) error) error { +func (b *arccache) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { // shortcircuit and fall back to Get if the underlying store // doesn't support Viewer. if b.viewer == nil { - blk, err := b.Get(k) + blk, err := b.Get(ctx, k) if err != nil { return err } @@ -150,10 +150,10 @@ func (b *arccache) View(k cid.Cid, callback func([]byte) error) error { lk.RLock() defer lk.RUnlock() - return b.viewer.View(k, callback) + return b.viewer.View(ctx, k, callback) } -func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { +func (b *arccache) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { if !k.Defined() { return nil, ErrNotFound } @@ -166,7 +166,7 @@ func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { lk.RLock() defer lk.RUnlock() - bl, err := b.blockstore.Get(k) + bl, err := b.blockstore.Get(ctx, k) if bl == nil && err == ErrNotFound { b.cacheHave(k, false) } else if bl != nil { @@ -175,7 +175,7 @@ func (b *arccache) Get(k cid.Cid) (blocks.Block, error) { return bl, err } -func (b *arccache) Put(bl blocks.Block) error { +func (b *arccache) Put(ctx context.Context, bl blocks.Block) error { if has, _, ok := b.queryCache(bl.Cid()); ok && has { return nil } @@ -184,14 +184,14 @@ func (b *arccache) Put(bl blocks.Block) error { lk.Lock() defer lk.Unlock() - err := b.blockstore.Put(bl) + err := b.blockstore.Put(ctx, bl) if err == nil { b.cacheSize(bl.Cid(), len(bl.RawData())) } return err } -func (b *arccache) PutMany(bs []blocks.Block) error { +func (b *arccache) PutMany(ctx context.Context, bs []blocks.Block) error { mxs := [256]*sync.RWMutex{} var good []blocks.Block for _, block := range bs { @@ -217,7 +217,7 @@ func (b *arccache) PutMany(bs []blocks.Block) error { } }() - err := b.blockstore.PutMany(good) + err := b.blockstore.PutMany(ctx, good) if err != nil { return err } @@ -227,8 +227,8 @@ func (b *arccache) PutMany(bs []blocks.Block) error { return nil } -func (b *arccache) HashOnRead(enabled bool) { - b.blockstore.HashOnRead(enabled) +func (b *arccache) HashOnRead(ctx context.Context, enabled bool) { + b.blockstore.HashOnRead(ctx, enabled) } func (b *arccache) cacheHave(c cid.Cid, have bool) { @@ -276,14 +276,14 @@ func (b *arccache) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.blockstore.AllKeysChan(ctx) } -func (b *arccache) GCLock() Unlocker { - return b.blockstore.(GCBlockstore).GCLock() +func (b *arccache) GCLock(ctx context.Context) Unlocker { + return b.blockstore.(GCBlockstore).GCLock(ctx) } -func (b *arccache) PinLock() Unlocker { - return b.blockstore.(GCBlockstore).PinLock() +func (b *arccache) PinLock(ctx context.Context) Unlocker { + return b.blockstore.(GCBlockstore).PinLock(ctx) } -func (b *arccache) GCRequested() bool { - return b.blockstore.(GCBlockstore).GCRequested() +func (b *arccache) GCRequested(ctx context.Context) bool { + return b.blockstore.(GCBlockstore).GCRequested(ctx) } diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 64f45df6ca..992cd26880 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -52,7 +52,7 @@ func untrap(cd *callbackDatastore) { func TestRemoveCacheEntryOnDelete(t *testing.T) { arc, _, cd := createStores(t) - arc.Put(exampleBlock) + arc.Put(bg, exampleBlock) cd.Lock() writeHitTheDatastore := false @@ -62,8 +62,8 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { writeHitTheDatastore = true }) - arc.DeleteBlock(exampleBlock.Cid()) - arc.Put(exampleBlock) + arc.DeleteBlock(bg, exampleBlock.Cid()) + arc.Put(bg, exampleBlock) if !writeHitTheDatastore { t.Fail() } @@ -72,29 +72,29 @@ func TestRemoveCacheEntryOnDelete(t *testing.T) { func TestElideDuplicateWrite(t *testing.T) { arc, _, cd := createStores(t) - arc.Put(exampleBlock) + arc.Put(bg, exampleBlock) trap("write hit datastore", cd, t) - arc.Put(exampleBlock) + arc.Put(bg, exampleBlock) } func TestHasRequestTriggersCache(t *testing.T) { arc, _, cd := createStores(t) - arc.Has(exampleBlock.Cid()) + arc.Has(bg, exampleBlock.Cid()) trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Cid()); has || err != nil { + if has, err := arc.Has(bg, exampleBlock.Cid()); has || err != nil { t.Fatal("has was true but there is no such block") } untrap(cd) - err := arc.Put(exampleBlock) + err := arc.Put(bg, exampleBlock) if err != nil { t.Fatal(err) } trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Cid()); !has || err != nil { + if has, err := arc.Has(bg, exampleBlock.Cid()); !has || err != nil { t.Fatal("has returned invalid result") } } @@ -102,31 +102,31 @@ func TestHasRequestTriggersCache(t *testing.T) { func TestGetFillsCache(t *testing.T) { arc, _, cd := createStores(t) - if bl, err := arc.Get(exampleBlock.Cid()); bl != nil || err == nil { + if bl, err := arc.Get(bg, exampleBlock.Cid()); bl != nil || err == nil { t.Fatal("block was found or there was no error") } trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Cid()); has || err != nil { + if has, err := arc.Has(bg, exampleBlock.Cid()); has || err != nil { t.Fatal("has was true but there is no such block") } - if _, err := arc.GetSize(exampleBlock.Cid()); err != ErrNotFound { + if _, err := arc.GetSize(bg, exampleBlock.Cid()); err != ErrNotFound { t.Fatal("getsize was true but there is no such block") } untrap(cd) - if err := arc.Put(exampleBlock); err != nil { + if err := arc.Put(bg, exampleBlock); err != nil { t.Fatal(err) } trap("has hit datastore", cd, t) - if has, err := arc.Has(exampleBlock.Cid()); !has || err != nil { + if has, err := arc.Has(bg, exampleBlock.Cid()); !has || err != nil { t.Fatal("has returned invalid result") } - if blockSize, err := arc.GetSize(exampleBlock.Cid()); blockSize == -1 || err != nil { + if blockSize, err := arc.GetSize(bg, exampleBlock.Cid()); blockSize == -1 || err != nil { t.Fatal("getsize returned invalid result", blockSize, err) } } @@ -134,16 +134,16 @@ func TestGetFillsCache(t *testing.T) { func TestGetAndDeleteFalseShortCircuit(t *testing.T) { arc, _, cd := createStores(t) - arc.Has(exampleBlock.Cid()) - arc.GetSize(exampleBlock.Cid()) + arc.Has(bg, exampleBlock.Cid()) + arc.GetSize(bg, exampleBlock.Cid()) trap("get hit datastore", cd, t) - if bl, err := arc.Get(exampleBlock.Cid()); bl != nil || err != ErrNotFound { + if bl, err := arc.Get(bg, exampleBlock.Cid()); bl != nil || err != ErrNotFound { t.Fatal("get returned invalid result") } - if arc.DeleteBlock(exampleBlock.Cid()) != nil { + if arc.DeleteBlock(bg, exampleBlock.Cid()) != nil { t.Fatal("expected deletes to be idempotent") } } @@ -157,7 +157,7 @@ func TestArcCreationFailure(t *testing.T) { func TestInvalidKey(t *testing.T) { arc, _, _ := createStores(t) - bl, err := arc.Get(cid.Cid{}) + bl, err := arc.Get(bg, cid.Cid{}) if bl != nil { t.Fatal("blocks should be nil") @@ -170,30 +170,30 @@ func TestInvalidKey(t *testing.T) { func TestHasAfterSucessfulGetIsCached(t *testing.T) { arc, bs, cd := createStores(t) - bs.Put(exampleBlock) + bs.Put(bg, exampleBlock) - arc.Get(exampleBlock.Cid()) + arc.Get(bg, exampleBlock.Cid()) trap("has hit datastore", cd, t) - arc.Has(exampleBlock.Cid()) + arc.Has(bg, exampleBlock.Cid()) } func TestGetSizeAfterSucessfulGetIsCached(t *testing.T) { arc, bs, cd := createStores(t) - bs.Put(exampleBlock) + bs.Put(bg, exampleBlock) - arc.Get(exampleBlock.Cid()) + arc.Get(bg, exampleBlock.Cid()) trap("has hit datastore", cd, t) - arc.GetSize(exampleBlock.Cid()) + arc.GetSize(bg, exampleBlock.Cid()) } func TestGetSizeAfterSucessfulHas(t *testing.T) { arc, bs, _ := createStores(t) - bs.Put(exampleBlock) - has, err := arc.Has(exampleBlock.Cid()) + bs.Put(bg, exampleBlock) + has, err := arc.Has(bg, exampleBlock.Cid()) if err != nil { t.Fatal(err) } @@ -201,7 +201,7 @@ func TestGetSizeAfterSucessfulHas(t *testing.T) { t.Fatal("expected to have block") } - if size, err := arc.GetSize(exampleBlock.Cid()); err != nil { + if size, err := arc.GetSize(bg, exampleBlock.Cid()); err != nil { t.Fatal(err) } else if size != len(exampleBlock.RawData()) { t.Fatalf("expected size %d, got %d", len(exampleBlock.RawData()), size) @@ -213,20 +213,20 @@ func TestGetSizeMissingZeroSizeBlock(t *testing.T) { emptyBlock := blocks.NewBlock([]byte{}) missingBlock := blocks.NewBlock([]byte("missingBlock")) - bs.Put(emptyBlock) + bs.Put(bg, emptyBlock) - arc.Get(emptyBlock.Cid()) + arc.Get(bg, emptyBlock.Cid()) trap("has hit datastore", cd, t) - if blockSize, err := arc.GetSize(emptyBlock.Cid()); blockSize != 0 || err != nil { + if blockSize, err := arc.GetSize(bg, emptyBlock.Cid()); blockSize != 0 || err != nil { t.Fatal("getsize returned invalid result") } untrap(cd) - arc.Get(missingBlock.Cid()) + arc.Get(bg, missingBlock.Cid()) trap("has hit datastore", cd, t) - if _, err := arc.GetSize(missingBlock.Cid()); err != ErrNotFound { + if _, err := arc.GetSize(bg, missingBlock.Cid()); err != ErrNotFound { t.Fatal("getsize returned invalid result") } } @@ -234,9 +234,9 @@ func TestGetSizeMissingZeroSizeBlock(t *testing.T) { func TestDifferentKeyObjectsWork(t *testing.T) { arc, bs, cd := createStores(t) - bs.Put(exampleBlock) + bs.Put(bg, exampleBlock) - arc.Get(exampleBlock.Cid()) + arc.Get(bg, exampleBlock.Cid()) trap("has hit datastore", cd, t) cidstr := exampleBlock.Cid().String() @@ -246,38 +246,38 @@ func TestDifferentKeyObjectsWork(t *testing.T) { t.Fatal(err) } - arc.Has(ncid) + arc.Has(bg, ncid) } func TestPutManyCaches(t *testing.T) { t.Run("happy path PutMany", func(t *testing.T) { arc, _, cd := createStores(t) - arc.PutMany([]blocks.Block{exampleBlock}) + arc.PutMany(bg, []blocks.Block{exampleBlock}) trap("has hit datastore", cd, t) - arc.Has(exampleBlock.Cid()) - arc.GetSize(exampleBlock.Cid()) + arc.Has(bg, exampleBlock.Cid()) + arc.GetSize(bg, exampleBlock.Cid()) untrap(cd) - arc.DeleteBlock(exampleBlock.Cid()) + arc.DeleteBlock(bg, exampleBlock.Cid()) - arc.Put(exampleBlock) + arc.Put(bg, exampleBlock) trap("PunMany has hit datastore", cd, t) - arc.PutMany([]blocks.Block{exampleBlock}) + arc.PutMany(bg, []blocks.Block{exampleBlock}) }) t.Run("PutMany with duplicates", func(t *testing.T) { arc, _, cd := createStores(t) - arc.PutMany([]blocks.Block{exampleBlock, exampleBlock}) + arc.PutMany(bg, []blocks.Block{exampleBlock, exampleBlock}) trap("has hit datastore", cd, t) - arc.Has(exampleBlock.Cid()) - arc.GetSize(exampleBlock.Cid()) + arc.Has(bg, exampleBlock.Cid()) + arc.GetSize(bg, exampleBlock.Cid()) untrap(cd) - arc.DeleteBlock(exampleBlock.Cid()) + arc.DeleteBlock(bg, exampleBlock.Cid()) - arc.Put(exampleBlock) + arc.Put(bg, exampleBlock) trap("PunMany has hit datastore", cd, t) - arc.PutMany([]blocks.Block{exampleBlock}) + arc.PutMany(bg, []blocks.Block{exampleBlock}) }) } @@ -307,7 +307,7 @@ func BenchmarkARCCacheConcurrentOps(b *testing.B) { putHalfBlocks := func(arc *arccache) { for i, block := range dummyBlocks { if i%2 == 0 { - if err := arc.Put(block); err != nil { + if err := arc.Put(bg, block); err != nil { b.Fatal(err) } } @@ -322,26 +322,26 @@ func BenchmarkARCCacheConcurrentOps(b *testing.B) { }{ {"PutDelete", [...]func(*arccache, blocks.Block){ func(arc *arccache, block blocks.Block) { - arc.Put(block) + arc.Put(bg, block) }, func(arc *arccache, block blocks.Block) { - arc.DeleteBlock(block.Cid()) + arc.DeleteBlock(bg, block.Cid()) }, }}, {"GetDelete", [...]func(*arccache, blocks.Block){ func(arc *arccache, block blocks.Block) { - arc.Get(block.Cid()) + arc.Get(bg, block.Cid()) }, func(arc *arccache, block blocks.Block) { - arc.DeleteBlock(block.Cid()) + arc.DeleteBlock(bg, block.Cid()) }, }}, {"GetPut", [...]func(*arccache, blocks.Block){ func(arc *arccache, block blocks.Block) { - arc.Get(block.Cid()) + arc.Get(bg, block.Cid()) }, func(arc *arccache, block blocks.Block) { - arc.Put(block) + arc.Put(bg, block) }, }}, } diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 0f96866834..dfac6ce42c 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -33,19 +33,19 @@ var ErrNotFound = errors.New("blockstore: block not found") // Blockstore wraps a Datastore block-centered methods and provides a layer // of abstraction which allows to add different caching strategies. type Blockstore interface { - DeleteBlock(cid.Cid) error - Has(cid.Cid) (bool, error) - Get(cid.Cid) (blocks.Block, error) + DeleteBlock(context.Context, cid.Cid) error + Has(context.Context, cid.Cid) (bool, error) + Get(context.Context, cid.Cid) (blocks.Block, error) // GetSize returns the CIDs mapped BlockSize - GetSize(cid.Cid) (int, error) + GetSize(context.Context, cid.Cid) (int, error) // Put puts a given block to the underlying datastore - Put(blocks.Block) error + Put(context.Context, blocks.Block) error // PutMany puts a slice of blocks at the same time using batching // capabilities of the underlying datastore whenever possible. - PutMany([]blocks.Block) error + PutMany(context.Context, []blocks.Block) error // AllKeysChan returns a channel from which // the CIDs in the Blockstore can be read. It should respect @@ -54,7 +54,7 @@ type Blockstore interface { // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. - HashOnRead(enabled bool) + HashOnRead(ctx context.Context, enabled bool) } // Viewer can be implemented by blockstores that offer zero-copy access to @@ -69,7 +69,7 @@ type Blockstore interface { // the block is found); otherwise, the error will be propagated. Errors returned // by the callback will be propagated as well. type Viewer interface { - View(cid cid.Cid, callback func([]byte) error) error + View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error } // GCLocker abstract functionality to lock a blockstore when performing @@ -78,17 +78,17 @@ type GCLocker interface { // GCLock locks the blockstore for garbage collection. No operations // that expect to finish with a pin should ocurr simultaneously. // Reading during GC is safe, and requires no lock. - GCLock() Unlocker + GCLock(context.Context) Unlocker // PinLock locks the blockstore for sequences of puts expected to finish // with a pin (before GC). Multiple put->pin sequences can write through // at the same time, but no GC should happen simulatenously. // Reading during Pinning is safe, and requires no lock. - PinLock() Unlocker + PinLock(context.Context) Unlocker // GcRequested returns true if GCLock has been called and is waiting to // take the lock - GCRequested() bool + GCRequested(context.Context) bool } // GCBlockstore is a blockstore that can safely run garbage-collection @@ -137,16 +137,16 @@ type blockstore struct { rehash *uatomic.Bool } -func (bs *blockstore) HashOnRead(enabled bool) { +func (bs *blockstore) HashOnRead(_ context.Context, enabled bool) { bs.rehash.Store(enabled) } -func (bs *blockstore) Get(k cid.Cid) (blocks.Block, error) { +func (bs *blockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { if !k.Defined() { log.Error("undefined cid in blockstore") return nil, ErrNotFound } - bdata, err := bs.datastore.Get(dshelp.MultihashToDsKey(k.Hash())) + bdata, err := bs.datastore.Get(ctx, dshelp.MultihashToDsKey(k.Hash())) if err == ds.ErrNotFound { return nil, ErrNotFound } @@ -168,51 +168,51 @@ func (bs *blockstore) Get(k cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(bdata, k) } -func (bs *blockstore) Put(block blocks.Block) error { +func (bs *blockstore) Put(ctx context.Context, block blocks.Block) error { k := dshelp.MultihashToDsKey(block.Cid().Hash()) // Has is cheaper than Put, so see if we already have it - exists, err := bs.datastore.Has(k) + exists, err := bs.datastore.Has(ctx, k) if err == nil && exists { return nil // already stored. } - return bs.datastore.Put(k, block.RawData()) + return bs.datastore.Put(ctx, k, block.RawData()) } -func (bs *blockstore) PutMany(blocks []blocks.Block) error { - t, err := bs.datastore.Batch() +func (bs *blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { + t, err := bs.datastore.Batch(ctx) if err != nil { return err } for _, b := range blocks { k := dshelp.MultihashToDsKey(b.Cid().Hash()) - exists, err := bs.datastore.Has(k) + exists, err := bs.datastore.Has(ctx, k) if err == nil && exists { continue } - err = t.Put(k, b.RawData()) + err = t.Put(ctx, k, b.RawData()) if err != nil { return err } } - return t.Commit() + return t.Commit(ctx) } -func (bs *blockstore) Has(k cid.Cid) (bool, error) { - return bs.datastore.Has(dshelp.MultihashToDsKey(k.Hash())) +func (bs *blockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { + return bs.datastore.Has(ctx, dshelp.MultihashToDsKey(k.Hash())) } -func (bs *blockstore) GetSize(k cid.Cid) (int, error) { - size, err := bs.datastore.GetSize(dshelp.MultihashToDsKey(k.Hash())) +func (bs *blockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { + size, err := bs.datastore.GetSize(ctx, dshelp.MultihashToDsKey(k.Hash())) if err == ds.ErrNotFound { return -1, ErrNotFound } return size, err } -func (bs *blockstore) DeleteBlock(k cid.Cid) error { - return bs.datastore.Delete(dshelp.MultihashToDsKey(k.Hash())) +func (bs *blockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { + return bs.datastore.Delete(ctx, dshelp.MultihashToDsKey(k.Hash())) } // AllKeysChan runs a query for keys from the blockstore. @@ -223,7 +223,7 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // KeysOnly, because that would be _a lot_ of data. q := dsq.Query{KeysOnly: true} - res, err := bs.datastore.Query(q) + res, err := bs.datastore.Query(ctx, q) if err != nil { return nil, err } @@ -277,30 +277,30 @@ type gclocker struct { // Unlocker represents an object which can Unlock // something. type Unlocker interface { - Unlock() + Unlock(context.Context) } type unlocker struct { unlock func() } -func (u *unlocker) Unlock() { +func (u *unlocker) Unlock(_ context.Context) { u.unlock() u.unlock = nil // ensure its not called twice } -func (bs *gclocker) GCLock() Unlocker { +func (bs *gclocker) GCLock(_ context.Context) Unlocker { atomic.AddInt32(&bs.gcreq, 1) bs.lk.Lock() atomic.AddInt32(&bs.gcreq, -1) return &unlocker{bs.lk.Unlock} } -func (bs *gclocker) PinLock() Unlocker { +func (bs *gclocker) PinLock(_ context.Context) Unlocker { bs.lk.RLock() return &unlocker{bs.lk.RUnlock} } -func (bs *gclocker) GCRequested() bool { +func (bs *gclocker) GCRequested(_ context.Context) bool { return atomic.LoadInt32(&bs.gcreq) > 0 } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 28f98e14a3..423be2b279 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -17,7 +17,7 @@ import ( func TestGetWhenKeyNotPresent(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) c := cid.NewCidV0(u.Hash([]byte("stuff"))) - bl, err := bs.Get(c) + bl, err := bs.Get(bg, c) if bl != nil { t.Error("nil block expected") @@ -29,7 +29,7 @@ func TestGetWhenKeyNotPresent(t *testing.T) { func TestGetWhenKeyIsNil(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) - _, err := bs.Get(cid.Cid{}) + _, err := bs.Get(bg, cid.Cid{}) if err != ErrNotFound { t.Fail() } @@ -39,12 +39,12 @@ func TestPutThenGetBlock(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) block := blocks.NewBlock([]byte("some data")) - err := bs.Put(block) + err := bs.Put(bg, block) if err != nil { t.Fatal(err) } - blockFromBlockstore, err := bs.Get(block.Cid()) + blockFromBlockstore, err := bs.Get(bg, block.Cid()) if err != nil { t.Fatal(err) } @@ -57,12 +57,12 @@ func TestCidv0v1(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) block := blocks.NewBlock([]byte("some data")) - err := bs.Put(block) + err := bs.Put(bg, block) if err != nil { t.Fatal(err) } - blockFromBlockstore, err := bs.Get(cid.NewCidV1(cid.DagProtobuf, block.Cid().Hash())) + blockFromBlockstore, err := bs.Get(bg, cid.NewCidV1(cid.DagProtobuf, block.Cid().Hash())) if err != nil { t.Fatal(err) } @@ -77,12 +77,12 @@ func TestPutThenGetSizeBlock(t *testing.T) { missingBlock := blocks.NewBlock([]byte("missingBlock")) emptyBlock := blocks.NewBlock([]byte{}) - err := bs.Put(block) + err := bs.Put(bg, block) if err != nil { t.Fatal(err) } - blockSize, err := bs.GetSize(block.Cid()) + blockSize, err := bs.GetSize(bg, block.Cid()) if err != nil { t.Fatal(err) } @@ -90,16 +90,16 @@ func TestPutThenGetSizeBlock(t *testing.T) { t.Fail() } - err = bs.Put(emptyBlock) + err = bs.Put(bg, emptyBlock) if err != nil { t.Fatal(err) } - if blockSize, err := bs.GetSize(emptyBlock.Cid()); blockSize != 0 || err != nil { + if blockSize, err := bs.GetSize(bg, emptyBlock.Cid()); blockSize != 0 || err != nil { t.Fatal(err) } - if blockSize, err := bs.GetSize(missingBlock.Cid()); blockSize != -1 || err == nil { + if blockSize, err := bs.GetSize(bg, missingBlock.Cid()); blockSize != -1 || err == nil { t.Fatal("getsize returned invalid result") } } @@ -109,9 +109,9 @@ type countHasDS struct { hasCount int } -func (ds *countHasDS) Has(key ds.Key) (exists bool, err error) { +func (ds *countHasDS) Has(ctx context.Context, key ds.Key) (exists bool, err error) { ds.hasCount += 1 - return ds.Datastore.Has(key) + return ds.Datastore.Has(ctx, key) } func TestPutUsesHas(t *testing.T) { @@ -125,10 +125,10 @@ func TestPutUsesHas(t *testing.T) { } bs := NewBlockstore(ds_sync.MutexWrap(ds)) bl := blocks.NewBlock([]byte("some data")) - if err := bs.Put(bl); err != nil { + if err := bs.Put(bg, bl); err != nil { t.Fatal(err) } - if err := bs.Put(bl); err != nil { + if err := bs.Put(bg, bl); err != nil { t.Fatal(err) } if ds.hasCount != 2 { @@ -150,15 +150,15 @@ func TestHashOnRead(t *testing.T) { t.Fatal("debug is off, still got an error") } bl2 := blocks.NewBlock([]byte("some other data")) - bs.Put(blBad) - bs.Put(bl2) - bs.HashOnRead(true) + bs.Put(bg, blBad) + bs.Put(bg, bl2) + bs.HashOnRead(bg, true) - if _, err := bs.Get(bl.Cid()); err != ErrHashMismatch { + if _, err := bs.Get(bg, bl.Cid()); err != ErrHashMismatch { t.Fatalf("expected '%v' got '%v'\n", ErrHashMismatch, err) } - if b, err := bs.Get(bl2.Cid()); err != nil || b.String() != bl2.String() { + if b, err := bs.Get(bg, bl2.Cid()); err != nil || b.String() != bl2.String() { t.Fatal("got wrong blocks") } } @@ -172,7 +172,7 @@ func newBlockStoreWithKeys(t *testing.T, d ds.Datastore, N int) (Blockstore, []c keys := make([]cid.Cid, N) for i := 0; i < N; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) - err := bs.Put(block) + err := bs.Put(bg, block) if err != nil { t.Fatal(err) } @@ -293,38 +293,38 @@ type queryTestDS struct { func (c *queryTestDS) SetFunc(f func(dsq.Query) (dsq.Results, error)) { c.cb = f } -func (c *queryTestDS) Put(key ds.Key, value []byte) (err error) { - return c.ds.Put(key, value) +func (c *queryTestDS) Put(ctx context.Context, key ds.Key, value []byte) (err error) { + return c.ds.Put(ctx, key, value) } -func (c *queryTestDS) Get(key ds.Key) (value []byte, err error) { - return c.ds.Get(key) +func (c *queryTestDS) Get(ctx context.Context, key ds.Key) (value []byte, err error) { + return c.ds.Get(ctx, key) } -func (c *queryTestDS) Has(key ds.Key) (exists bool, err error) { - return c.ds.Has(key) +func (c *queryTestDS) Has(ctx context.Context, key ds.Key) (exists bool, err error) { + return c.ds.Has(ctx, key) } -func (c *queryTestDS) GetSize(key ds.Key) (size int, err error) { - return c.ds.GetSize(key) +func (c *queryTestDS) GetSize(ctx context.Context, key ds.Key) (size int, err error) { + return c.ds.GetSize(ctx, key) } -func (c *queryTestDS) Delete(key ds.Key) (err error) { - return c.ds.Delete(key) +func (c *queryTestDS) Delete(ctx context.Context, key ds.Key) (err error) { + return c.ds.Delete(ctx, key) } -func (c *queryTestDS) Query(q dsq.Query) (dsq.Results, error) { +func (c *queryTestDS) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) { if c.cb != nil { return c.cb(q) } - return c.ds.Query(q) + return c.ds.Query(ctx, q) } -func (c *queryTestDS) Sync(key ds.Key) error { - return c.ds.Sync(key) +func (c *queryTestDS) Sync(ctx context.Context, key ds.Key) error { + return c.ds.Sync(ctx, key) } -func (c *queryTestDS) Batch() (ds.Batch, error) { +func (c *queryTestDS) Batch(_ context.Context) (ds.Batch, error) { return ds.NewBasicBatch(c), nil } func (c *queryTestDS) Close() error { diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 70fe5106bc..37990191d7 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -118,12 +118,12 @@ func (b *bloomcache) build(ctx context.Context) error { } } -func (b *bloomcache) DeleteBlock(k cid.Cid) error { +func (b *bloomcache) DeleteBlock(ctx context.Context, k cid.Cid) error { if has, ok := b.hasCached(k); ok && !has { return nil } - return b.blockstore.DeleteBlock(k) + return b.blockstore.DeleteBlock(ctx, k) } // if ok == false has is inconclusive @@ -146,25 +146,25 @@ func (b *bloomcache) hasCached(k cid.Cid) (has bool, ok bool) { return false, false } -func (b *bloomcache) Has(k cid.Cid) (bool, error) { +func (b *bloomcache) Has(ctx context.Context, k cid.Cid) (bool, error) { if has, ok := b.hasCached(k); ok { return has, nil } - return b.blockstore.Has(k) + return b.blockstore.Has(ctx, k) } -func (b *bloomcache) GetSize(k cid.Cid) (int, error) { +func (b *bloomcache) GetSize(ctx context.Context, k cid.Cid) (int, error) { if has, ok := b.hasCached(k); ok && !has { return -1, ErrNotFound } - return b.blockstore.GetSize(k) + return b.blockstore.GetSize(ctx, k) } -func (b *bloomcache) View(k cid.Cid, callback func([]byte) error) error { +func (b *bloomcache) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { if b.viewer == nil { - blk, err := b.Get(k) + blk, err := b.Get(ctx, k) if err != nil { return err } @@ -174,32 +174,32 @@ func (b *bloomcache) View(k cid.Cid, callback func([]byte) error) error { if has, ok := b.hasCached(k); ok && !has { return ErrNotFound } - return b.viewer.View(k, callback) + return b.viewer.View(ctx, k, callback) } -func (b *bloomcache) Get(k cid.Cid) (blocks.Block, error) { +func (b *bloomcache) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { if has, ok := b.hasCached(k); ok && !has { return nil, ErrNotFound } - return b.blockstore.Get(k) + return b.blockstore.Get(ctx, k) } -func (b *bloomcache) Put(bl blocks.Block) error { +func (b *bloomcache) Put(ctx context.Context, bl blocks.Block) error { // See comment in PutMany - err := b.blockstore.Put(bl) + err := b.blockstore.Put(ctx, bl) if err == nil { b.bloom.AddTS(bl.Cid().Hash()) } return err } -func (b *bloomcache) PutMany(bs []blocks.Block) error { +func (b *bloomcache) PutMany(ctx context.Context, bs []blocks.Block) error { // bloom cache gives only conclusive resulty if key is not contained // to reduce number of puts we need conclusive information if block is contained // this means that PutMany can't be improved with bloom cache so we just // just do a passthrough. - err := b.blockstore.PutMany(bs) + err := b.blockstore.PutMany(ctx, bs) if err != nil { return err } @@ -209,22 +209,22 @@ func (b *bloomcache) PutMany(bs []blocks.Block) error { return nil } -func (b *bloomcache) HashOnRead(enabled bool) { - b.blockstore.HashOnRead(enabled) +func (b *bloomcache) HashOnRead(ctx context.Context, enabled bool) { + b.blockstore.HashOnRead(ctx, enabled) } func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.blockstore.AllKeysChan(ctx) } -func (b *bloomcache) GCLock() Unlocker { - return b.blockstore.(GCBlockstore).GCLock() +func (b *bloomcache) GCLock(ctx context.Context) Unlocker { + return b.blockstore.(GCBlockstore).GCLock(ctx) } -func (b *bloomcache) PinLock() Unlocker { - return b.blockstore.(GCBlockstore).PinLock() +func (b *bloomcache) PinLock(ctx context.Context) Unlocker { + return b.blockstore.(GCBlockstore).PinLock(ctx) } -func (b *bloomcache) GCRequested() bool { - return b.blockstore.(GCBlockstore).GCRequested() +func (b *bloomcache) GCRequested(ctx context.Context) bool { + return b.blockstore.(GCBlockstore).GCRequested(ctx) } diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 3b290a0c2c..43f747d5e7 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -13,6 +13,8 @@ import ( syncds "github.com/ipfs/go-datastore/sync" ) +var bg = context.Background() + func testBloomCached(ctx context.Context, bs Blockstore) (*bloomcache, error) { if ctx == nil { ctx = context.Background() @@ -45,12 +47,12 @@ func TestPutManyAddsToBloom(t *testing.T) { block2 := blocks.NewBlock([]byte("bar")) emptyBlock := blocks.NewBlock([]byte{}) - cachedbs.PutMany([]blocks.Block{block1, emptyBlock}) - has, err := cachedbs.Has(block1.Cid()) + cachedbs.PutMany(bg, []blocks.Block{block1, emptyBlock}) + has, err := cachedbs.Has(bg, block1.Cid()) if err != nil { t.Fatal(err) } - blockSize, err := cachedbs.GetSize(block1.Cid()) + blockSize, err := cachedbs.GetSize(bg, block1.Cid()) if err != nil { t.Fatal(err) } @@ -58,11 +60,11 @@ func TestPutManyAddsToBloom(t *testing.T) { t.Fatal("added block is reported missing") } - has, err = cachedbs.Has(block2.Cid()) + has, err = cachedbs.Has(bg, block2.Cid()) if err != nil { t.Fatal(err) } - blockSize, err = cachedbs.GetSize(block2.Cid()) + blockSize, err = cachedbs.GetSize(bg, block2.Cid()) if err != nil && err != ErrNotFound { t.Fatal(err) } @@ -70,11 +72,11 @@ func TestPutManyAddsToBloom(t *testing.T) { t.Fatal("not added block is reported to be in blockstore") } - has, err = cachedbs.Has(emptyBlock.Cid()) + has, err = cachedbs.Has(bg, emptyBlock.Cid()) if err != nil { t.Fatal(err) } - blockSize, err = cachedbs.GetSize(emptyBlock.Cid()) + blockSize, err = cachedbs.GetSize(bg, emptyBlock.Cid()) if err != nil { t.Fatal(err) } @@ -95,7 +97,7 @@ func TestHasIsBloomCached(t *testing.T) { bs := NewBlockstore(syncds.MutexWrap(cd)) for i := 0; i < 1000; i++ { - bs.Put(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i)))) + bs.Put(bg, blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i)))) } ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() @@ -115,7 +117,7 @@ func TestHasIsBloomCached(t *testing.T) { }) for i := 0; i < 1000; i++ { - cachedbs.Has(blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i+2000))).Cid()) + cachedbs.Has(bg, blocks.NewBlock([]byte(fmt.Sprintf("data: %d", i+2000))).Cid()) } if float64(cacheFails)/float64(1000) > float64(0.05) { @@ -125,20 +127,20 @@ func TestHasIsBloomCached(t *testing.T) { cacheFails = 0 block := blocks.NewBlock([]byte("newBlock")) - cachedbs.PutMany([]blocks.Block{block}) + cachedbs.PutMany(bg, []blocks.Block{block}) if cacheFails != 2 { t.Fatalf("expected two datastore hits: %d", cacheFails) } - cachedbs.Put(block) + cachedbs.Put(bg, block) if cacheFails != 3 { t.Fatalf("expected datastore hit: %d", cacheFails) } - if has, err := cachedbs.Has(block.Cid()); !has || err != nil { + if has, err := cachedbs.Has(bg, block.Cid()); !has || err != nil { t.Fatal("has gave wrong response") } - bl, err := cachedbs.Get(block.Cid()) + bl, err := cachedbs.Get(bg, block.Cid()) if bl.String() != block.String() { t.Fatal("block data doesn't match") } @@ -168,45 +170,45 @@ func (c *callbackDatastore) CallF() { c.f() } -func (c *callbackDatastore) Put(key ds.Key, value []byte) (err error) { +func (c *callbackDatastore) Put(ctx context.Context, key ds.Key, value []byte) (err error) { c.CallF() - return c.ds.Put(key, value) + return c.ds.Put(ctx, key, value) } -func (c *callbackDatastore) Get(key ds.Key) (value []byte, err error) { +func (c *callbackDatastore) Get(ctx context.Context, key ds.Key) (value []byte, err error) { c.CallF() - return c.ds.Get(key) + return c.ds.Get(ctx, key) } -func (c *callbackDatastore) Has(key ds.Key) (exists bool, err error) { +func (c *callbackDatastore) Has(ctx context.Context, key ds.Key) (exists bool, err error) { c.CallF() - return c.ds.Has(key) + return c.ds.Has(ctx, key) } -func (c *callbackDatastore) GetSize(key ds.Key) (size int, err error) { +func (c *callbackDatastore) GetSize(ctx context.Context, key ds.Key) (size int, err error) { c.CallF() - return c.ds.GetSize(key) + return c.ds.GetSize(ctx, key) } func (c *callbackDatastore) Close() error { return nil } -func (c *callbackDatastore) Delete(key ds.Key) (err error) { +func (c *callbackDatastore) Delete(ctx context.Context, key ds.Key) (err error) { c.CallF() - return c.ds.Delete(key) + return c.ds.Delete(ctx, key) } -func (c *callbackDatastore) Query(q dsq.Query) (dsq.Results, error) { +func (c *callbackDatastore) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) { c.CallF() - return c.ds.Query(q) + return c.ds.Query(ctx, q) } -func (c *callbackDatastore) Sync(key ds.Key) error { +func (c *callbackDatastore) Sync(ctx context.Context, key ds.Key) error { c.CallF() - return c.ds.Sync(key) + return c.ds.Sync(ctx, key) } -func (c *callbackDatastore) Batch() (ds.Batch, error) { +func (c *callbackDatastore) Batch(_ context.Context) (ds.Batch, error) { return ds.NewBasicBatch(c), nil } diff --git a/blockstore/idstore.go b/blockstore/idstore.go index b1a85b6b9b..497d5c5053 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -40,25 +40,25 @@ func extractContents(k cid.Cid) (bool, []byte) { return true, dmh.Digest } -func (b *idstore) DeleteBlock(k cid.Cid) error { +func (b *idstore) DeleteBlock(ctx context.Context, k cid.Cid) error { isId, _ := extractContents(k) if isId { return nil } - return b.bs.DeleteBlock(k) + return b.bs.DeleteBlock(ctx, k) } -func (b *idstore) Has(k cid.Cid) (bool, error) { +func (b *idstore) Has(ctx context.Context, k cid.Cid) (bool, error) { isId, _ := extractContents(k) if isId { return true, nil } - return b.bs.Has(k) + return b.bs.Has(ctx, k) } -func (b *idstore) View(k cid.Cid, callback func([]byte) error) error { +func (b *idstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { if b.viewer == nil { - blk, err := b.Get(k) + blk, err := b.Get(ctx, k) if err != nil { return err } @@ -68,34 +68,34 @@ func (b *idstore) View(k cid.Cid, callback func([]byte) error) error { if isId { return callback(bdata) } - return b.viewer.View(k, callback) + return b.viewer.View(ctx, k, callback) } -func (b *idstore) GetSize(k cid.Cid) (int, error) { +func (b *idstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { isId, bdata := extractContents(k) if isId { return len(bdata), nil } - return b.bs.GetSize(k) + return b.bs.GetSize(ctx, k) } -func (b *idstore) Get(k cid.Cid) (blocks.Block, error) { +func (b *idstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { isId, bdata := extractContents(k) if isId { return blocks.NewBlockWithCid(bdata, k) } - return b.bs.Get(k) + return b.bs.Get(ctx, k) } -func (b *idstore) Put(bl blocks.Block) error { +func (b *idstore) Put(ctx context.Context, bl blocks.Block) error { isId, _ := extractContents(bl.Cid()) if isId { return nil } - return b.bs.Put(bl) + return b.bs.Put(ctx, bl) } -func (b *idstore) PutMany(bs []blocks.Block) error { +func (b *idstore) PutMany(ctx context.Context, bs []blocks.Block) error { toPut := make([]blocks.Block, 0, len(bs)) for _, bl := range bs { isId, _ := extractContents(bl.Cid()) @@ -104,11 +104,11 @@ func (b *idstore) PutMany(bs []blocks.Block) error { } toPut = append(toPut, bl) } - return b.bs.PutMany(toPut) + return b.bs.PutMany(ctx, toPut) } -func (b *idstore) HashOnRead(enabled bool) { - b.bs.HashOnRead(enabled) +func (b *idstore) HashOnRead(ctx context.Context, enabled bool) { + b.bs.HashOnRead(ctx, enabled) } func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { diff --git a/blockstore/idstore_test.go b/blockstore/idstore_test.go index 65b902ef19..5f96bc9031 100644 --- a/blockstore/idstore_test.go +++ b/blockstore/idstore_test.go @@ -26,12 +26,12 @@ func TestIdStore(t *testing.T) { ids, cb := createTestStores() - have, _ := ids.Has(idhash1) + have, _ := ids.Has(bg, idhash1) if !have { t.Fatal("Has() failed on idhash") } - _, err := ids.Get(idhash1) + _, err := ids.Get(bg, idhash1) if err != nil { t.Fatalf("Get() failed on idhash: %v", err) } @@ -42,70 +42,70 @@ func TestIdStore(t *testing.T) { } cb.f = failIfPassThough - err = ids.Put(idblock1) + err = ids.Put(bg, idblock1) if err != nil { t.Fatal(err) } cb.f = noop - err = ids.Put(block1) + err = ids.Put(bg, block1) if err != nil { t.Fatalf("Put() failed on normal block: %v", err) } - have, _ = ids.Has(hash1) + have, _ = ids.Has(bg, hash1) if !have { t.Fatal("normal block not added to datastore") } - blockSize, _ := ids.GetSize(hash1) + blockSize, _ := ids.GetSize(bg, hash1) if blockSize == -1 { t.Fatal("normal block not added to datastore") } - _, err = ids.Get(hash1) + _, err = ids.Get(bg, hash1) if err != nil { t.Fatal(err) } - err = ids.Put(emptyBlock) + err = ids.Put(bg, emptyBlock) if err != nil { t.Fatalf("Put() failed on normal block: %v", err) } - have, _ = ids.Has(emptyHash) + have, _ = ids.Has(bg, emptyHash) if !have { t.Fatal("normal block not added to datastore") } - blockSize, _ = ids.GetSize(emptyHash) + blockSize, _ = ids.GetSize(bg, emptyHash) if blockSize != 0 { t.Fatal("normal block not added to datastore") } cb.f = failIfPassThough - err = ids.DeleteBlock(idhash1) + err = ids.DeleteBlock(bg, idhash1) if err != nil { t.Fatal(err) } cb.f = noop - err = ids.DeleteBlock(hash1) + err = ids.DeleteBlock(bg, hash1) if err != nil { t.Fatal(err) } - have, _ = ids.Has(hash1) + have, _ = ids.Has(bg, hash1) if have { t.Fatal("normal block not deleted from datastore") } - blockSize, _ = ids.GetSize(hash1) + blockSize, _ = ids.GetSize(bg, hash1) if blockSize > -1 { t.Fatal("normal block not deleted from datastore") } - err = ids.DeleteBlock(emptyHash) + err = ids.DeleteBlock(bg, emptyHash) if err != nil { t.Fatal(err) } @@ -116,7 +116,7 @@ func TestIdStore(t *testing.T) { block2, _ := blk.NewBlockWithCid([]byte("hash2"), hash2) cb.f = failIfPassThough - err = ids.PutMany([]blk.Block{idblock1, idblock2}) + err = ids.PutMany(bg, []blk.Block{idblock1, idblock2}) if err != nil { t.Fatal(err) } @@ -126,7 +126,7 @@ func TestIdStore(t *testing.T) { opCount++ } - err = ids.PutMany([]blk.Block{block1, block2}) + err = ids.PutMany(bg, []blk.Block{block1, block2}) if err != nil { t.Fatal(err) } @@ -136,7 +136,7 @@ func TestIdStore(t *testing.T) { } opCount = 0 - err = ids.PutMany([]blk.Block{idblock1, block1}) + err = ids.PutMany(bg, []blk.Block{idblock1, block1}) if err != nil { t.Fatal(err) } From bfa7e921bdfde67e88f8da8af3dbe3dafc6672ff Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Thu, 21 Oct 2021 13:40:28 -0400 Subject: [PATCH 3053/3147] feat: plumb through datastore context changes This commit was moved from ipfs/go-unixfs@abdf700b6b5b76a2f684eb730cd83353603206d4 --- unixfs/io/directory_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/unixfs/io/directory_test.go b/unixfs/io/directory_test.go index f5fa2e564d..ca67f5d256 100644 --- a/unixfs/io/directory_test.go +++ b/unixfs/io/directory_test.go @@ -606,15 +606,15 @@ func (d *countGetsDS) maybeSleep(c cid.Cid) { } } -func (d *countGetsDS) Has(c cid.Cid) (bool, error) { +func (d *countGetsDS) Has(ctx context.Context, c cid.Cid) (bool, error) { if d.started { panic("implement me") } - return d.Blockstore.Has(c) + return d.Blockstore.Has(ctx, c) } -func (d *countGetsDS) Get(c cid.Cid) (blocks.Block, error) { - blk, err := d.Blockstore.Get(c) +func (d *countGetsDS) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + blk, err := d.Blockstore.Get(ctx, c) if err != nil { return nil, err } @@ -623,11 +623,11 @@ func (d *countGetsDS) Get(c cid.Cid) (blocks.Block, error) { return blk, nil } -func (d *countGetsDS) GetSize(c cid.Cid) (int, error) { +func (d *countGetsDS) GetSize(ctx context.Context, c cid.Cid) (int, error) { if d.started { panic("implement me") } - return d.Blockstore.GetSize(c) + return d.Blockstore.GetSize(ctx, c) } func (d *countGetsDS) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { From 91853fbb7ab45174e198b1eaf7da9113f7409efa Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Mon, 15 Nov 2021 21:07:50 -0300 Subject: [PATCH 3054/3147] support threshold based automatic sharding and unsharding of directories (#88) * feat: update go-unixfs and use built in automatic sharding and unsharding * chore: update deps Co-authored-by: Adin Schmahmann Co-authored-by: Gus Eggert This commit was moved from ipfs/go-mfs@e61420fa2f77775867cedd654709b6671270f58a --- mfs/dir.go | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/mfs/dir.go b/mfs/dir.go index 61f85d064d..52b1b046d8 100644 --- a/mfs/dir.go +++ b/mfs/dir.go @@ -128,7 +128,7 @@ func (d *Directory) localUpdate(c child) (*dag.ProtoNode, error) { // Update child entry in the underlying UnixFS directory. func (d *Directory) updateChild(c child) error { - err := d.addUnixFSChild(c) + err := d.unixfsDir.AddChild(d.ctx, c.Name, c.Node) if err != nil { return err } @@ -313,7 +313,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) { return nil, err } - err = d.addUnixFSChild(child{name, ndir}) + err = d.unixfsDir.AddChild(d.ctx, name, ndir) if err != nil { return nil, err } @@ -360,7 +360,7 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return err } - err = d.addUnixFSChild(child{name, nd}) + err = d.unixfsDir.AddChild(d.ctx, name, nd) if err != nil { return err } @@ -369,29 +369,6 @@ func (d *Directory) AddChild(name string, nd ipld.Node) error { return nil } -// addUnixFSChild adds a child to the inner UnixFS directory -// and transitions to a HAMT implementation if needed. -func (d *Directory) addUnixFSChild(c child) error { - if uio.UseHAMTSharding { - // If the directory HAMT implementation is being used and this - // directory is actually a basic implementation switch it to HAMT. - if basicDir, ok := d.unixfsDir.(*uio.BasicDirectory); ok { - hamtDir, err := basicDir.SwitchToSharding(d.ctx) - if err != nil { - return err - } - d.unixfsDir = hamtDir - } - } - - err := d.unixfsDir.AddChild(d.ctx, c.Name, c.Node) - if err != nil { - return err - } - - return nil -} - func (d *Directory) sync() error { for name, entry := range d.entriesCache { nd, err := entry.GetNode() From 8c04627a0f96ff55a87e2f0db3ce6796c1df0552 Mon Sep 17 00:00:00 2001 From: galargh Date: Wed, 17 Nov 2021 13:44:34 +0100 Subject: [PATCH 3055/3147] chore: add keys to composite literal fields This commit was moved from ipfs/go-ipfs-provider@bb73e1b7d8674f625b756aa243370e2aa82e02af --- provider/simple/reprovide.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index b62369a07e..38d6f86d77 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -236,7 +236,7 @@ func pinSet(ctx context.Context, pinning Pinner, fetchConfig fetcher.Factory, on for _, key := range rkeys { set.Visitor(ctx)(key) if !onlyRoots { - err := fetcherhelpers.BlockAll(ctx, session, cidlink.Link{key}, func(res fetcher.FetchResult) error { + err := fetcherhelpers.BlockAll(ctx, session, cidlink.Link{Cid: key}, func(res fetcher.FetchResult) error { clink, ok := res.LastBlockLink.(cidlink.Link) if ok { set.Visitor(ctx)(clink.Cid) From f47878a2b8043d1380ff5f0c0903c273ce72b5cf Mon Sep 17 00:00:00 2001 From: galargh Date: Wed, 17 Nov 2021 13:46:54 +0100 Subject: [PATCH 3056/3147] chore: use Warnf instead of Warningf This commit was moved from ipfs/go-ipfs-provider@56883e0765868ca990331aee5e690850d243f7cc --- provider/queue/queue.go | 2 +- provider/simple/provider.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/provider/queue/queue.go b/provider/queue/queue.go index 18ed6a7980..753d66c638 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -96,7 +96,7 @@ func (q *Queue) work() { k = datastore.NewKey(head.Key) c, err = cid.Parse(head.Value) if err != nil { - log.Warningf("error parsing queue entry cid with key (%s), removing it from queue: %s", head.Key, err) + log.Warnf("error parsing queue entry cid with key (%s), removing it from queue: %s", head.Key, err) err = q.ds.Delete(q.ctx, k) if err != nil { log.Errorf("error deleting queue entry with key (%s), due to error (%s), stopping provider", head.Key, err) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index 6c50ef925b..d43cd6ac88 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -110,7 +110,7 @@ func (p *Provider) doProvide(c cid.Cid) { logP.Info("announce - start - ", c) if err := p.contentRouting.Provide(ctx, c, true); err != nil { - logP.Warningf("Unable to provide entry: %s, %s", c, err) + logP.Warnf("Unable to provide entry: %s, %s", c, err) } logP.Info("announce - end - ", c) } From c57ae7942c0fc9e2074548372ff3d6a45f84c582 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Fri, 19 Nov 2021 15:35:11 -0500 Subject: [PATCH 3057/3147] fix: remove context from HashOnRead This is so that v0 and v1 have identical interfaces, which is required to avoid massive pain for consumers like estuary. Since we have already plumbed v0 all the way through, it's easiest to just remove the probably-unnecessary context from HashOnRead. This commit was moved from ipfs/go-ipfs-blockstore@fbe708e941904f4048d0ae4261f34b74a347a3dd --- blockstore/arc_cache.go | 4 ++-- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 2 +- blockstore/bloom_cache.go | 4 ++-- blockstore/idstore.go | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 09aa441387..bb78c2a2ac 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -227,8 +227,8 @@ func (b *arccache) PutMany(ctx context.Context, bs []blocks.Block) error { return nil } -func (b *arccache) HashOnRead(ctx context.Context, enabled bool) { - b.blockstore.HashOnRead(ctx, enabled) +func (b *arccache) HashOnRead(enabled bool) { + b.blockstore.HashOnRead(enabled) } func (b *arccache) cacheHave(c cid.Cid, have bool) { diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index dfac6ce42c..9572f76c0b 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -54,7 +54,7 @@ type Blockstore interface { // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. - HashOnRead(ctx context.Context, enabled bool) + HashOnRead(enabled bool) } // Viewer can be implemented by blockstores that offer zero-copy access to @@ -137,7 +137,7 @@ type blockstore struct { rehash *uatomic.Bool } -func (bs *blockstore) HashOnRead(_ context.Context, enabled bool) { +func (bs *blockstore) HashOnRead(enabled bool) { bs.rehash.Store(enabled) } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 423be2b279..1ee3341c35 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -152,7 +152,7 @@ func TestHashOnRead(t *testing.T) { bl2 := blocks.NewBlock([]byte("some other data")) bs.Put(bg, blBad) bs.Put(bg, bl2) - bs.HashOnRead(bg, true) + bs.HashOnRead(true) if _, err := bs.Get(bg, bl.Cid()); err != ErrHashMismatch { t.Fatalf("expected '%v' got '%v'\n", ErrHashMismatch, err) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 37990191d7..e3332ef38f 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -209,8 +209,8 @@ func (b *bloomcache) PutMany(ctx context.Context, bs []blocks.Block) error { return nil } -func (b *bloomcache) HashOnRead(ctx context.Context, enabled bool) { - b.blockstore.HashOnRead(ctx, enabled) +func (b *bloomcache) HashOnRead(enabled bool) { + b.blockstore.HashOnRead(enabled) } func (b *bloomcache) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { diff --git a/blockstore/idstore.go b/blockstore/idstore.go index 497d5c5053..25a6284c89 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -107,8 +107,8 @@ func (b *idstore) PutMany(ctx context.Context, bs []blocks.Block) error { return b.bs.PutMany(ctx, toPut) } -func (b *idstore) HashOnRead(ctx context.Context, enabled bool) { - b.bs.HashOnRead(ctx, enabled) +func (b *idstore) HashOnRead(enabled bool) { + b.bs.HashOnRead(enabled) } func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { From e81cb4c04decababe4b54ba7ecb711457b311315 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Fri, 19 Nov 2021 14:21:53 -0500 Subject: [PATCH 3058/3147] feat: plumb through context changes This commit was moved from ipfs/go-filestore@9d7d5b4ea6c3ace567f121731c4abcca220a45d2 --- filestore/filestore.go | 40 ++++++++++++++--------------- filestore/filestore_test.go | 12 +++++---- filestore/fsrefstore.go | 50 ++++++++++++++++++------------------- filestore/util.go | 43 +++++++++++++++---------------- 4 files changed, 74 insertions(+), 71 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index a9c36c5d30..6382a6db43 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -115,13 +115,13 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // blockstore. As expected, in the case of FileManager blocks, only the // reference is deleted, not its contents. It may return // ErrNotFound when the block is not stored. -func (f *Filestore) DeleteBlock(c cid.Cid) error { - err1 := f.bs.DeleteBlock(c) +func (f *Filestore) DeleteBlock(ctx context.Context, c cid.Cid) error { + err1 := f.bs.DeleteBlock(ctx, c) if err1 != nil && err1 != blockstore.ErrNotFound { return err1 } - err2 := f.fm.DeleteBlock(c) + err2 := f.fm.DeleteBlock(ctx, c) // if we successfully removed something from the blockstore, but the // filestore didnt have it, return success @@ -140,13 +140,13 @@ func (f *Filestore) DeleteBlock(c cid.Cid) error { // Get retrieves the block with the given Cid. It may return // ErrNotFound when the block is not stored. -func (f *Filestore) Get(c cid.Cid) (blocks.Block, error) { - blk, err := f.bs.Get(c) +func (f *Filestore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + blk, err := f.bs.Get(ctx, c) switch err { case nil: return blk, nil case blockstore.ErrNotFound: - return f.fm.Get(c) + return f.fm.Get(ctx, c) default: return nil, err } @@ -154,13 +154,13 @@ func (f *Filestore) Get(c cid.Cid) (blocks.Block, error) { // GetSize returns the size of the requested block. It may return ErrNotFound // when the block is not stored. -func (f *Filestore) GetSize(c cid.Cid) (int, error) { - size, err := f.bs.GetSize(c) +func (f *Filestore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + size, err := f.bs.GetSize(ctx, c) switch err { case nil: return size, nil case blockstore.ErrNotFound: - return f.fm.GetSize(c) + return f.fm.GetSize(ctx, c) default: return -1, err } @@ -168,8 +168,8 @@ func (f *Filestore) GetSize(c cid.Cid) (int, error) { // Has returns true if the block with the given Cid is // stored in the Filestore. -func (f *Filestore) Has(c cid.Cid) (bool, error) { - has, err := f.bs.Has(c) +func (f *Filestore) Has(ctx context.Context, c cid.Cid) (bool, error) { + has, err := f.bs.Has(ctx, c) if err != nil { return false, err } @@ -178,15 +178,15 @@ func (f *Filestore) Has(c cid.Cid) (bool, error) { return true, nil } - return f.fm.Has(c) + return f.fm.Has(ctx, c) } // Put stores a block in the Filestore. For blocks of // underlying type FilestoreNode, the operation is // delegated to the FileManager, while the rest of blocks // are handled by the regular blockstore. -func (f *Filestore) Put(b blocks.Block) error { - has, err := f.Has(b.Cid()) +func (f *Filestore) Put(ctx context.Context, b blocks.Block) error { + has, err := f.Has(ctx, b.Cid()) if err != nil { return err } @@ -197,20 +197,20 @@ func (f *Filestore) Put(b blocks.Block) error { switch b := b.(type) { case *posinfo.FilestoreNode: - return f.fm.Put(b) + return f.fm.Put(ctx, b) default: - return f.bs.Put(b) + return f.bs.Put(ctx, b) } } // PutMany is like Put(), but takes a slice of blocks, allowing // the underlying blockstore to perform batch transactions. -func (f *Filestore) PutMany(bs []blocks.Block) error { +func (f *Filestore) PutMany(ctx context.Context, bs []blocks.Block) error { var normals []blocks.Block var fstores []*posinfo.FilestoreNode for _, b := range bs { - has, err := f.Has(b.Cid()) + has, err := f.Has(ctx, b.Cid()) if err != nil { return err } @@ -228,14 +228,14 @@ func (f *Filestore) PutMany(bs []blocks.Block) error { } if len(normals) > 0 { - err := f.bs.PutMany(normals) + err := f.bs.PutMany(ctx, normals) if err != nil { return err } } if len(fstores) > 0 { - err := f.fm.PutMany(fstores) + err := f.fm.PutMany(ctx, fstores) if err != nil { return err } diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 783dc86f94..e3b822cf44 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -15,6 +15,8 @@ import ( posinfo "github.com/ipfs/go-ipfs-posinfo" ) +var bg = context.Background() + func newTestFilestore(t *testing.T) (string, *Filestore) { mds := ds.NewMapDatastore() @@ -65,7 +67,7 @@ func TestBasicFilestore(t *testing.T) { Node: dag.NewRawNode(buf[i*10 : (i+1)*10]), } - err := fs.Put(n) + err := fs.Put(bg, n) if err != nil { t.Fatal(err) } @@ -73,7 +75,7 @@ func TestBasicFilestore(t *testing.T) { } for i, c := range cids { - blk, err := fs.Get(c) + blk, err := fs.Get(bg, c) if err != nil { t.Fatal(err) } @@ -122,7 +124,7 @@ func randomFileAdd(t *testing.T, fs *Filestore, dir string, size int) (string, [ }, Node: dag.NewRawNode(buf[i*10 : (i+1)*10]), } - err := fs.Put(n) + err := fs.Put(bg, n) if err != nil { t.Fatal(err) } @@ -137,7 +139,7 @@ func TestDeletes(t *testing.T) { _, cids := randomFileAdd(t, fs, dir, 100) todelete := cids[:4] for _, c := range todelete { - err := fs.DeleteBlock(c) + err := fs.DeleteBlock(bg, c) if err != nil { t.Fatal(err) } @@ -145,7 +147,7 @@ func TestDeletes(t *testing.T) { deleted := make(map[string]bool) for _, c := range todelete { - _, err := fs.Get(c) + _, err := fs.Get(bg, c) if err != blockstore.ErrNotFound { t.Fatal("expected blockstore not found error") } diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index a29c2264e1..9eb2b4316e 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -66,7 +66,7 @@ func NewFileManager(ds ds.Batching, root string) *FileManager { func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { q := dsq.Query{KeysOnly: true} - res, err := f.ds.Query(q) + res, err := f.ds.Query(ctx, q) if err != nil { return nil, err } @@ -100,8 +100,8 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // DeleteBlock deletes the reference-block from the underlying // datastore. It does not touch the referenced data. -func (f *FileManager) DeleteBlock(c cid.Cid) error { - err := f.ds.Delete(dshelp.MultihashToDsKey(c.Hash())) +func (f *FileManager) DeleteBlock(ctx context.Context, c cid.Cid) error { + err := f.ds.Delete(ctx, dshelp.MultihashToDsKey(c.Hash())) if err == ds.ErrNotFound { return blockstore.ErrNotFound } @@ -112,12 +112,12 @@ func (f *FileManager) DeleteBlock(c cid.Cid) error { // is done in two steps: the first step retrieves the reference // block from the datastore. The second step uses the stored // path and offsets to read the raw block data directly from disk. -func (f *FileManager) Get(c cid.Cid) (blocks.Block, error) { - dobj, err := f.getDataObj(c.Hash()) +func (f *FileManager) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + dobj, err := f.getDataObj(ctx, c.Hash()) if err != nil { return nil, err } - out, err := f.readDataObj(c.Hash(), dobj) + out, err := f.readDataObj(ctx, c.Hash(), dobj) if err != nil { return nil, err } @@ -129,23 +129,23 @@ func (f *FileManager) Get(c cid.Cid) (blocks.Block, error) { // // This method may successfully return the size even if returning the block // would fail because the associated file is no longer available. -func (f *FileManager) GetSize(c cid.Cid) (int, error) { - dobj, err := f.getDataObj(c.Hash()) +func (f *FileManager) GetSize(ctx context.Context, c cid.Cid) (int, error) { + dobj, err := f.getDataObj(ctx, c.Hash()) if err != nil { return -1, err } return int(dobj.GetSize_()), nil } -func (f *FileManager) readDataObj(m mh.Multihash, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readDataObj(ctx context.Context, m mh.Multihash, d *pb.DataObj) ([]byte, error) { if IsURL(d.GetFilePath()) { - return f.readURLDataObj(m, d) + return f.readURLDataObj(ctx, m, d) } return f.readFileDataObj(m, d) } -func (f *FileManager) getDataObj(m mh.Multihash) (*pb.DataObj, error) { - o, err := f.ds.Get(dshelp.MultihashToDsKey(m)) +func (f *FileManager) getDataObj(ctx context.Context, m mh.Multihash) (*pb.DataObj, error) { + o, err := f.ds.Get(ctx, dshelp.MultihashToDsKey(m)) switch err { case ds.ErrNotFound: return nil, blockstore.ErrNotFound @@ -213,12 +213,12 @@ func (f *FileManager) readFileDataObj(m mh.Multihash, d *pb.DataObj) ([]byte, er } // reads and verifies the block from URL -func (f *FileManager) readURLDataObj(m mh.Multihash, d *pb.DataObj) ([]byte, error) { +func (f *FileManager) readURLDataObj(ctx context.Context, m mh.Multihash, d *pb.DataObj) ([]byte, error) { if !f.AllowUrls { return nil, ErrUrlstoreNotEnabled } - req, err := http.NewRequest("GET", d.GetFilePath(), nil) + req, err := http.NewRequestWithContext(ctx, "GET", d.GetFilePath(), nil) if err != nil { return nil, err } @@ -261,24 +261,24 @@ func (f *FileManager) readURLDataObj(m mh.Multihash, d *pb.DataObj) ([]byte, err // Has returns if the FileManager is storing a block reference. It does not // validate the data, nor checks if the reference is valid. -func (f *FileManager) Has(c cid.Cid) (bool, error) { +func (f *FileManager) Has(ctx context.Context, c cid.Cid) (bool, error) { // NOTE: interesting thing to consider. Has doesnt validate the data. // So the data on disk could be invalid, and we could think we have it. dsk := dshelp.MultihashToDsKey(c.Hash()) - return f.ds.Has(dsk) + return f.ds.Has(ctx, dsk) } type putter interface { - Put(ds.Key, []byte) error + Put(context.Context, ds.Key, []byte) error } // Put adds a new reference block to the FileManager. It does not check // that the reference is valid. -func (f *FileManager) Put(b *posinfo.FilestoreNode) error { - return f.putTo(b, f.ds) +func (f *FileManager) Put(ctx context.Context, b *posinfo.FilestoreNode) error { + return f.putTo(ctx, b, f.ds) } -func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { +func (f *FileManager) putTo(ctx context.Context, b *posinfo.FilestoreNode, to putter) error { var dobj pb.DataObj if IsURL(b.PosInfo.FullPath) { @@ -310,24 +310,24 @@ func (f *FileManager) putTo(b *posinfo.FilestoreNode, to putter) error { return err } - return to.Put(dshelp.MultihashToDsKey(b.Cid().Hash()), data) + return to.Put(ctx, dshelp.MultihashToDsKey(b.Cid().Hash()), data) } // PutMany is like Put() but takes a slice of blocks instead, // allowing it to create a batch transaction. -func (f *FileManager) PutMany(bs []*posinfo.FilestoreNode) error { - batch, err := f.ds.Batch() +func (f *FileManager) PutMany(ctx context.Context, bs []*posinfo.FilestoreNode) error { + batch, err := f.ds.Batch(ctx) if err != nil { return err } for _, b := range bs { - if err := f.putTo(b, batch); err != nil { + if err := f.putTo(ctx, b, batch); err != nil { return err } } - return batch.Commit() + return batch.Commit(ctx) } // IsURL returns true if the string represents a valid URL that the diff --git a/filestore/util.go b/filestore/util.go index dc860f7352..4bd1226d34 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -1,6 +1,7 @@ package filestore import ( + "context" "fmt" "sort" @@ -86,64 +87,64 @@ func (r *ListRes) FormatLong(enc func(cid.Cid) string) string { // of the given Filestore and returns a ListRes object with the information. // List does not verify that the reference is valid or whether the // raw data is accesible. See Verify(). -func List(fs *Filestore, key cid.Cid) *ListRes { - return list(fs, false, key.Hash()) +func List(ctx context.Context, fs *Filestore, key cid.Cid) *ListRes { + return list(ctx, fs, false, key.Hash()) } // ListAll returns a function as an iterator which, once invoked, returns // one by one each block in the Filestore's FileManager. // ListAll does not verify that the references are valid or whether // the raw data is accessible. See VerifyAll(). -func ListAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { +func ListAll(ctx context.Context, fs *Filestore, fileOrder bool) (func(context.Context) *ListRes, error) { if fileOrder { - return listAllFileOrder(fs, false) + return listAllFileOrder(ctx, fs, false) } - return listAll(fs, false) + return listAll(ctx, fs, false) } // Verify fetches the block with the given key from the Filemanager // of the given Filestore and returns a ListRes object with the information. // Verify makes sure that the reference is valid and the block data can be // read. -func Verify(fs *Filestore, key cid.Cid) *ListRes { - return list(fs, true, key.Hash()) +func Verify(ctx context.Context, fs *Filestore, key cid.Cid) *ListRes { + return list(ctx, fs, true, key.Hash()) } // VerifyAll returns a function as an iterator which, once invoked, // returns one by one each block in the Filestore's FileManager. // VerifyAll checks that the reference is valid and that the block data // can be read. -func VerifyAll(fs *Filestore, fileOrder bool) (func() *ListRes, error) { +func VerifyAll(ctx context.Context, fs *Filestore, fileOrder bool) (func(context.Context) *ListRes, error) { if fileOrder { - return listAllFileOrder(fs, true) + return listAllFileOrder(ctx, fs, true) } - return listAll(fs, true) + return listAll(ctx, fs, true) } -func list(fs *Filestore, verify bool, key mh.Multihash) *ListRes { - dobj, err := fs.fm.getDataObj(key) +func list(ctx context.Context, fs *Filestore, verify bool, key mh.Multihash) *ListRes { + dobj, err := fs.fm.getDataObj(ctx, key) if err != nil { return mkListRes(key, nil, err) } if verify { - _, err = fs.fm.readDataObj(key, dobj) + _, err = fs.fm.readDataObj(ctx, key, dobj) } return mkListRes(key, dobj, err) } -func listAll(fs *Filestore, verify bool) (func() *ListRes, error) { +func listAll(ctx context.Context, fs *Filestore, verify bool) (func(context.Context) *ListRes, error) { q := dsq.Query{} - qr, err := fs.fm.ds.Query(q) + qr, err := fs.fm.ds.Query(ctx, q) if err != nil { return nil, err } - return func() *ListRes { + return func(ctx context.Context) *ListRes { mhash, dobj, err := next(qr) if dobj == nil && err == nil { return nil } else if err == nil && verify { - _, err = fs.fm.readDataObj(mhash, dobj) + _, err = fs.fm.readDataObj(ctx, mhash, dobj) } return mkListRes(mhash, dobj, err) }, nil @@ -169,9 +170,9 @@ func next(qr dsq.Results) (mh.Multihash, *pb.DataObj, error) { return mhash, dobj, nil } -func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { +func listAllFileOrder(ctx context.Context, fs *Filestore, verify bool) (func(context.Context) *ListRes, error) { q := dsq.Query{} - qr, err := fs.fm.ds.Query(q) + qr, err := fs.fm.ds.Query(ctx, q) if err != nil { return nil, err } @@ -201,7 +202,7 @@ func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { sort.Sort(entries) i := 0 - return func() *ListRes { + return func(ctx context.Context) *ListRes { if i >= len(entries) { return nil } @@ -228,7 +229,7 @@ func listAllFileOrder(fs *Filestore, verify bool) (func() *ListRes, error) { // finally verify the dataobj if requested var err error if verify { - _, err = fs.fm.readDataObj(mhash, &dobj) + _, err = fs.fm.readDataObj(ctx, mhash, &dobj) } return mkListRes(mhash, &dobj, err) }, nil From c66b60c62c4654763488920374d89ea6af5cb8fe Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Mon, 22 Nov 2021 16:53:15 -0500 Subject: [PATCH 3059/3147] feat: plumb through datastore contexts This commit was moved from ipfs/go-namesys@aaf9aa85f1e2edd60aa514286588875004eb6e23 --- namesys/ipns_resolver_validation_test.go | 5 ++++- namesys/namesys_test.go | 10 ++++++++-- namesys/publisher.go | 8 ++++---- namesys/publisher_test.go | 6 +++--- namesys/republisher/repub.go | 6 +++--- namesys/republisher/repub_test.go | 7 +++---- 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index d896b9e0dc..cc3b58f361 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -46,7 +46,10 @@ func testResolverValidation(t *testing.T, keyType int) { ctx := context.Background() rid := testutil.RandIdentityOrFatal(t) dstore := dssync.MutexWrap(ds.NewMapDatastore()) - peerstore := pstoremem.NewPeerstore() + peerstore, err := pstoremem.NewPeerstore() + if err != nil { + t.Fatal(err) + } vstore := newMockValueStore(rid, dstore, peerstore) resolver := NewIpnsResolver(vstore) diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index c3e5534294..af115ac2bb 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -94,7 +94,10 @@ func TestPublishWithCache0(t *testing.T) { if err != nil { t.Fatal(err) } - ps := pstoremem.NewPeerstore() + ps, err := pstoremem.NewPeerstore() + if err != nil { + t.Fatal(err) + } pid, err := peer.IDFromPrivateKey(priv) if err != nil { t.Fatal(err) @@ -131,7 +134,10 @@ func TestPublishWithTTL(t *testing.T) { if err != nil { t.Fatal(err) } - ps := pstoremem.NewPeerstore() + ps, err := pstoremem.NewPeerstore() + if err != nil { + t.Fatal(err) + } pid, err := peer.IDFromPrivateKey(priv) if err != nil { t.Fatal(err) diff --git a/namesys/publisher.go b/namesys/publisher.go index 307b3920c3..3b69bce733 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -62,7 +62,7 @@ func IpnsDsKey(id peer.ID) ds.Key { // This method will not search the routing system for records published by other // nodes. func (p *IpnsPublisher) ListPublished(ctx context.Context) (map[peer.ID]*pb.IpnsEntry, error) { - query, err := p.ds.Query(dsquery.Query{ + query, err := p.ds.Query(ctx, dsquery.Query{ Prefix: ipnsPrefix, }) if err != nil { @@ -112,7 +112,7 @@ func (p *IpnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouti ctx, cancel := context.WithTimeout(ctx, time.Second*30) defer cancel() - value, err := p.ds.Get(IpnsDsKey(id)) + value, err := p.ds.Get(ctx, IpnsDsKey(id)) switch err { case nil: case ds.ErrNotFound: @@ -179,10 +179,10 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k crypto.PrivKey, valu // Put the new record. key := IpnsDsKey(id) - if err := p.ds.Put(key, data); err != nil { + if err := p.ds.Put(ctx, key, data); err != nil { return nil, err } - if err := p.ds.Sync(key); err != nil { + if err := p.ds.Sync(ctx, key); err != nil { return nil, err } return entry, nil diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 844ed86ed4..4be9ec8464 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -95,7 +95,7 @@ func testNamekeyPublisher(t *testing.T, keyType int, expectedErr error, expected // Also check datastore for completeness key := dshelp.NewKeyFromBinary([]byte(namekey)) - exists, err := dstore.Has(key) + exists, err := dstore.Has(ctx, key) if err != nil { t.Fatal(err) } @@ -150,7 +150,7 @@ type checkSyncDS struct { syncKeys map[ds.Key]struct{} } -func (d *checkSyncDS) Sync(prefix ds.Key) error { +func (d *checkSyncDS) Sync(ctx context.Context, prefix ds.Key) error { d.syncKeys[prefix] = struct{}{} - return d.Datastore.Sync(prefix) + return d.Datastore.Sync(ctx, prefix) } diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 4ba5d483c5..5fefac2229 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -133,7 +133,7 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro log.Debugf("republishing ipns entry for %s", id) // Look for it locally only - e, err := rp.getLastIPNSEntry(id) + e, err := rp.getLastIPNSEntry(ctx, id) if err != nil { if err == errNoEntry { return nil @@ -155,9 +155,9 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro return rp.ns.PublishWithEOL(ctx, priv, p, eol) } -func (rp *Republisher) getLastIPNSEntry(id peer.ID) (*pb.IpnsEntry, error) { +func (rp *Republisher) getLastIPNSEntry(ctx context.Context, id peer.ID) (*pb.IpnsEntry, error) { // Look for it locally only - val, err := rp.ds.Get(namesys.IpnsDsKey(id)) + val, err := rp.ds.Get(ctx, namesys.IpnsDsKey(id)) switch err { case nil: case ds.ErrNotFound: diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index 3775b188a6..c7c0f01856 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -42,7 +42,6 @@ func getMockNode(t *testing.T, ctx context.Context) *mockNode { dstore := dssync.MutexWrap(ds.NewMapDatastore()) var idht *dht.IpfsDHT h, err := libp2p.New( - ctx, libp2p.ListenAddrStrings("/ip4/127.0.0.1/tcp/0"), libp2p.Routing(func(h host.Host) (routing.PeerRouting, error) { rt, err := dht.New(ctx, h, dht.Mode(dht.ModeServer)) @@ -208,7 +207,7 @@ func TestLongEOLRepublish(t *testing.T) { t.Fatal(err) } - entry, err := getLastIPNSEntry(publisher.store, publisher.h.ID()) + entry, err := getLastIPNSEntry(ctx, publisher.store, publisher.h.ID()) if err != nil { t.Fatal(err) } @@ -223,9 +222,9 @@ func TestLongEOLRepublish(t *testing.T) { } } -func getLastIPNSEntry(dstore ds.Datastore, id peer.ID) (*ipns_pb.IpnsEntry, error) { +func getLastIPNSEntry(ctx context.Context, dstore ds.Datastore, id peer.ID) (*ipns_pb.IpnsEntry, error) { // Look for it locally only - val, err := dstore.Get(namesys.IpnsDsKey(id)) + val, err := dstore.Get(ctx, namesys.IpnsDsKey(id)) if err != nil { return nil, err } From 261de8a069cc552151c69e053eae9f3b53f76f5e Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 23 Sep 2021 21:33:42 +0100 Subject: [PATCH 3060/3147] feat: per-cid locking Unfortunately, stripped locking breaks down when doing many concurrent operations. Luckily, per-cid locking isn't that expensive. In my benchmarks, it doesn't even make a noticeable difference. This commit was moved from ipfs/go-ipfs-blockstore@f5eac75f2f2368c73bff22c28c7a31ac52d7b137 --- blockstore/arc_cache.go | 251 +++++++++++++++++++++++++++++----------- 1 file changed, 183 insertions(+), 68 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index bb78c2a2ac..5dc7c6ed07 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -2,6 +2,7 @@ package blockstore import ( "context" + "sort" "sync" lru "github.com/hashicorp/golang-lru" @@ -13,13 +14,20 @@ import ( type cacheHave bool type cacheSize int +type lock struct { + mu sync.RWMutex + refcnt int +} + // arccache wraps a BlockStore with an Adaptive Replacement Cache (ARC) that // does not store the actual blocks, just metadata about them: existence and // size. This provides block access-time improvements, allowing // to short-cut many searches without querying the underlying datastore. type arccache struct { + lklk sync.Mutex + lks map[string]*lock + cache *lru.TwoQueueCache - lks [256]sync.RWMutex blockstore Blockstore viewer Viewer @@ -36,7 +44,7 @@ func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, if err != nil { return nil, err } - c := &arccache{cache: cache, blockstore: bs} + c := &arccache{cache: cache, blockstore: bs, lks: make(map[string]*lock)} c.hits = metrics.NewCtx(ctx, "arc.hits_total", "Number of ARC cache hits").Counter() c.total = metrics.NewCtx(ctx, "arc_total", "Total number of ARC cache requests").Counter() if v, ok := bs.(Viewer); ok { @@ -45,12 +53,39 @@ func newARCCachedBS(ctx context.Context, bs Blockstore, lruSize int) (*arccache, return c, nil } -func (b *arccache) getLock(k cid.Cid) *sync.RWMutex { - return &b.lks[mutexKey(k)] +func (b *arccache) lock(k string, write bool) { + b.lklk.Lock() + lk, ok := b.lks[k] + if !ok { + lk = new(lock) + b.lks[k] = lk + } + lk.refcnt++ + b.lklk.Unlock() + if write { + lk.mu.Lock() + } else { + lk.mu.RLock() + } +} + +func (b *arccache) unlock(key string, write bool) { + b.lklk.Lock() + lk := b.lks[key] + lk.refcnt-- + if lk.refcnt == 0 { + delete(b.lks, key) + } + b.lklk.Unlock() + if write { + lk.mu.Unlock() + } else { + lk.mu.RUnlock() + } } -func mutexKey(k cid.Cid) uint8 { - return k.KeyString()[len(k.KeyString())-1] +func cacheKey(k cid.Cid) string { + return string(k.Hash()) } func (b *arccache) DeleteBlock(ctx context.Context, k cid.Cid) error { @@ -58,18 +93,20 @@ func (b *arccache) DeleteBlock(ctx context.Context, k cid.Cid) error { return nil } - if has, _, ok := b.queryCache(k); ok && !has { + key := cacheKey(k) + + if has, _, ok := b.queryCache(key); ok && !has { return nil } - lk := b.getLock(k) - lk.Lock() - defer lk.Unlock() + b.lock(key, true) + defer b.unlock(key, true) - b.cache.Remove(k) // Invalidate cache before deleting. err := b.blockstore.DeleteBlock(ctx, k) if err == nil { - b.cacheHave(k, false) + b.cacheHave(key, false) + } else { + b.cacheInvalidate(key) } return err } @@ -79,19 +116,20 @@ func (b *arccache) Has(ctx context.Context, k cid.Cid) (bool, error) { return false, nil } - if has, _, ok := b.queryCache(k); ok { + key := cacheKey(k) + + if has, _, ok := b.queryCache(key); ok { return has, nil } - lk := b.getLock(k) - lk.RLock() - defer lk.RUnlock() + b.lock(key, false) + defer b.unlock(key, false) has, err := b.blockstore.Has(ctx, k) if err != nil { return false, err } - b.cacheHave(k, has) + b.cacheHave(key, has) return has, nil } @@ -100,7 +138,9 @@ func (b *arccache) GetSize(ctx context.Context, k cid.Cid) (int, error) { return -1, ErrNotFound } - if has, blockSize, ok := b.queryCache(k); ok { + key := cacheKey(k) + + if has, blockSize, ok := b.queryCache(key); ok { if !has { // don't have it, return return -1, ErrNotFound @@ -112,15 +152,14 @@ func (b *arccache) GetSize(ctx context.Context, k cid.Cid) (int, error) { // we have it but don't know the size, ask the datastore. } - lk := b.getLock(k) - lk.RLock() - defer lk.RUnlock() + b.lock(key, false) + defer b.unlock(key, false) blockSize, err := b.blockstore.GetSize(ctx, k) if err == ErrNotFound { - b.cacheHave(k, false) + b.cacheHave(key, false) } else if err == nil { - b.cacheSize(k, blockSize) + b.cacheSize(key, blockSize) } return blockSize, err } @@ -140,17 +179,33 @@ func (b *arccache) View(ctx context.Context, k cid.Cid, callback func([]byte) er return ErrNotFound } - if has, _, ok := b.queryCache(k); ok && !has { + key := cacheKey(k) + + if has, _, ok := b.queryCache(key); ok && !has { // short circuit if the cache deterministically tells us the item // doesn't exist. return ErrNotFound } - lk := b.getLock(k) - lk.RLock() - defer lk.RUnlock() + b.lock(key, false) + defer b.unlock(key, false) - return b.viewer.View(ctx, k, callback) + var cberr error + var size int + if err := b.viewer.View(ctx, k, func(buf []byte) error { + size = len(buf) + cberr = callback(buf) + return nil + }); err != nil { + if err == ErrNotFound { + b.cacheHave(key, false) + } + return err + } + + b.cacheSize(key, size) + + return cberr } func (b *arccache) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { @@ -158,72 +213,134 @@ func (b *arccache) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { return nil, ErrNotFound } - if has, _, ok := b.queryCache(k); ok && !has { + key := cacheKey(k) + + if has, _, ok := b.queryCache(key); ok && !has { return nil, ErrNotFound } - lk := b.getLock(k) - lk.RLock() - defer lk.RUnlock() + b.lock(key, false) + defer b.unlock(key, false) bl, err := b.blockstore.Get(ctx, k) if bl == nil && err == ErrNotFound { - b.cacheHave(k, false) + b.cacheHave(key, false) } else if bl != nil { - b.cacheSize(k, len(bl.RawData())) + b.cacheSize(key, len(bl.RawData())) } return bl, err } func (b *arccache) Put(ctx context.Context, bl blocks.Block) error { - if has, _, ok := b.queryCache(bl.Cid()); ok && has { + key := cacheKey(bl.Cid()) + + if has, _, ok := b.queryCache(key); ok && has { return nil } - lk := b.getLock(bl.Cid()) - lk.Lock() - defer lk.Unlock() + b.lock(key, true) + defer b.unlock(key, true) err := b.blockstore.Put(ctx, bl) if err == nil { - b.cacheSize(bl.Cid(), len(bl.RawData())) + b.cacheSize(key, len(bl.RawData())) + } else { + b.cacheInvalidate(key) } return err } +type keyedBlocks struct { + keys []string + blocks []blocks.Block +} + +func (b *keyedBlocks) Len() int { + return len(b.keys) +} + +func (b *keyedBlocks) Less(i, j int) bool { + return b.keys[i] < b.keys[j] +} + +func (b *keyedBlocks) Swap(i, j int) { + b.keys[i], b.keys[j] = b.keys[j], b.keys[i] + b.blocks[i], b.blocks[j] = b.blocks[j], b.blocks[i] +} + +func (b *keyedBlocks) append(key string, blk blocks.Block) { + b.keys = append(b.keys, key) + b.blocks = append(b.blocks, blk) +} + +func (b *keyedBlocks) isEmpty() bool { + return len(b.keys) == 0 +} + +func (b *keyedBlocks) sortAndDedup() { + if b.isEmpty() { + return + } + + sort.Sort(b) + + // https://github.com/golang/go/wiki/SliceTricks#in-place-deduplicate-comparable + j := 0 + for i := 1; i < len(b.keys); i++ { + if b.keys[j] == b.keys[i] { + continue + } + j++ + b.keys[j] = b.keys[i] + b.blocks[j] = b.blocks[i] + } + + b.keys = b.keys[:j+1] + b.blocks = b.blocks[:j+1] +} + +func newKeyedBlocks(cap int) *keyedBlocks { + return &keyedBlocks{ + keys: make([]string, 0, cap), + blocks: make([]blocks.Block, 0, cap), + } +} + func (b *arccache) PutMany(ctx context.Context, bs []blocks.Block) error { - mxs := [256]*sync.RWMutex{} - var good []blocks.Block - for _, block := range bs { + good := newKeyedBlocks(len(bs)) + for _, blk := range bs { // call put on block if result is inconclusive or we are sure that // the block isn't in storage - if has, _, ok := b.queryCache(block.Cid()); !ok || (ok && !has) { - good = append(good, block) - mxs[mutexKey(block.Cid())] = &b.lks[mutexKey(block.Cid())] + key := cacheKey(blk.Cid()) + if has, _, ok := b.queryCache(key); !ok || (ok && !has) { + good.append(key, blk) } } - for _, mx := range mxs { - if mx != nil { - mx.Lock() - } + if good.isEmpty() { + return nil + } + + good.sortAndDedup() + + for _, key := range good.keys { + b.lock(key, true) } defer func() { - for _, mx := range mxs { - if mx != nil { - mx.Unlock() - } + for _, key := range good.keys { + b.unlock(key, true) } }() - err := b.blockstore.PutMany(ctx, good) + err := b.blockstore.PutMany(ctx, good.blocks) if err != nil { return err } - for _, block := range good { - b.cacheSize(block.Cid(), len(block.RawData())) + for i, key := range good.keys { + b.cacheSize(key, len(good.blocks[i].RawData())) } + return nil } @@ -231,12 +348,16 @@ func (b *arccache) HashOnRead(enabled bool) { b.blockstore.HashOnRead(enabled) } -func (b *arccache) cacheHave(c cid.Cid, have bool) { - b.cache.Add(string(c.Hash()), cacheHave(have)) +func (b *arccache) cacheHave(key string, have bool) { + b.cache.Add(key, cacheHave(have)) +} + +func (b *arccache) cacheSize(key string, blockSize int) { + b.cache.Add(key, cacheSize(blockSize)) } -func (b *arccache) cacheSize(c cid.Cid, blockSize int) { - b.cache.Add(string(c.Hash()), cacheSize(blockSize)) +func (b *arccache) cacheInvalidate(key string) { + b.cache.Remove(key) } // queryCache checks if the CID is in the cache. If so, it returns: @@ -250,16 +371,10 @@ func (b *arccache) cacheSize(c cid.Cid, blockSize int) { // // When ok is true, exists carries the correct answer, and size carries the // size, if known, or -1 if not. -func (b *arccache) queryCache(k cid.Cid) (exists bool, size int, ok bool) { +func (b *arccache) queryCache(k string) (exists bool, size int, ok bool) { b.total.Inc() - if !k.Defined() { - log.Error("undefined cid in arccache") - // Return cache invalid so the call to blockstore happens - // in case of invalid key and correct error is created. - return false, -1, false - } - h, ok := b.cache.Get(string(k.Hash())) + h, ok := b.cache.Get(k) if ok { b.hits.Inc() switch h := h.(type) { From de93c866c318470fb67fbb3e5687e991d38c08f9 Mon Sep 17 00:00:00 2001 From: Shu Shen Date: Wed, 9 Feb 2022 22:07:06 -0800 Subject: [PATCH 3061/3147] chore: improve error message for invalid ipfs paths This commit was moved from ipfs/go-path@5e4e8349c90f7dfcbb97fc550aa721545d4e5ba6 --- path/path.go | 2 +- path/path_test.go | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index df050008f8..bc9065a2af 100644 --- a/path/path.go +++ b/path/path.go @@ -104,7 +104,7 @@ func ParsePath(txt string) (Path, error) { } if len(parts) < 3 { - return "", &pathError{error: fmt.Errorf("path does not begin with '/'"), path: txt} + return "", &pathError{error: fmt.Errorf("invalid ipfs path"), path: txt} } //TODO: make this smarter diff --git a/path/path_test.go b/path/path_test.go index 42cacddf17..2b26a56786 100644 --- a/path/path_test.go +++ b/path/path_test.go @@ -51,6 +51,19 @@ func TestNoComponents(t *testing.T) { } } +func TestInvalidPaths(t *testing.T) { + for _, s := range []string{ + "/ipfs", + "/testfs", + "/", + } { + _, err := ParsePath(s) + if err == nil || !strings.Contains(err.Error(), "invalid ipfs path") || !strings.Contains(err.Error(), s) { + t.Error("wrong error") + } + } +} + func TestIsJustAKey(t *testing.T) { cases := map[string]bool{ "QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n": true, From a3031a7b378978315cad9e91361c451b9a2a0d76 Mon Sep 17 00:00:00 2001 From: Shu Shen Date: Wed, 9 Feb 2022 22:11:54 -0800 Subject: [PATCH 3062/3147] chore: update doc to match implementation for CID only paths This commit was moved from ipfs/go-path@9500a344406b9c33831bce44770c78394e0c5824 --- path/path.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/path.go b/path/path.go index bc9065a2af..f49dde1106 100644 --- a/path/path.go +++ b/path/path.go @@ -10,7 +10,7 @@ import ( ) // A Path represents an ipfs content path: -// * //path/to/file +// * /path/to/file // * /ipfs/ // * /ipns//path/to/folder // * etc From 3ea7266a648938330afc555c5327fce0e03f6f73 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Fri, 25 Feb 2022 10:04:05 +0100 Subject: [PATCH 3063/3147] Resolver: convert to interface. This converts Resolver to an interface and leaves its implementation to the BasicResolver type. This should cause minimal distruption upstream (*Resolver -> Resolver) and opens the door to swap the BasicResolver for custom Resolvers. This commit was moved from ipfs/go-path@289629653f40e30327932a43cc5088071699b70d --- path/resolver/resolver.go | 43 +++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 47dd470751..55c322aafc 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -41,25 +41,42 @@ func (e ErrNoLink) Error() string { return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.String()) } -// Resolver provides path resolution to IPFS +// Resolver provides path resolution to IPFS. +type Resolver interface { + // ResolveToLastNode walks the given path and returns the cid of the + // last block referenced by the path, and the path segments to + // traverse from the final block boundary to the final node within the + // block. + ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) + // ResolvePath fetches the node for given path. It returns the last + // item returned by ResolvePathComponents and the last link traversed + // which can be used to recover the block. + ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) + // ResolvePathComponents fetches the nodes for each segment of the given path. + // It uses the first path component as a hash (key) of the first node, then + // resolves all other components walking the links via a selector traversal + ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) +} + +// BasicResolver implements the Resolver interface. // It references a FetcherFactory, which is uses to resolve nodes. // TODO: now that this is more modular, try to unify this code with the -// the resolvers in namesys -type Resolver struct { +// the resolvers in namesys. +type BasicResolver struct { FetcherFactory fetcher.Factory } // NewBasicResolver constructs a new basic resolver. -func NewBasicResolver(fetcherFactory fetcher.Factory) *Resolver { - return &Resolver{ +func NewBasicResolver(fetcherFactory fetcher.Factory) Resolver { + return &BasicResolver{ FetcherFactory: fetcherFactory, } } -// ResolveToLastNode walks the given path and returns the cid of the last block -// referenced by the path, and the path segments to traverse from the final block boundary to the final node -// within the block. -func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { +// ResolveToLastNode walks the given path and returns the cid of the last +// block referenced by the path, and the path segments to traverse from the +// final block boundary to the final node within the block. +func (r *BasicResolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { c, p, err := path.SplitAbsPath(fpath) if err != nil { return cid.Cid{}, nil, err @@ -125,7 +142,7 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid. // // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. -func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) { +func (r *BasicResolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) { // validate path if err := fpath.IsValid(); err != nil { return nil, nil, err @@ -162,7 +179,7 @@ func ResolveSingle(ctx context.Context, ds format.NodeGetter, nd format.Node, na // // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. -func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { +func (r *BasicResolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) defer evt.Done() @@ -200,7 +217,7 @@ func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ( // // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. -func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { +func (r *BasicResolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) defer evt.Done() @@ -226,7 +243,7 @@ func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []stri // Finds nodes matching the selector starting with a cid. Returns the matched nodes, the cid of the block containing // the last node, and the depth of the last node within its block (root is depth 0). -func (r *Resolver) resolveNodes(ctx context.Context, c cid.Cid, sel ipld.Node) ([]ipld.Node, cid.Cid, int, error) { +func (r *BasicResolver) resolveNodes(ctx context.Context, c cid.Cid, sel ipld.Node) ([]ipld.Node, cid.Cid, int, error) { session := r.FetcherFactory.NewSession(ctx) // traverse selector From 4547f9ea3f328f3b0ec3dc8262e751a16b60812e Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 7 Apr 2020 19:01:48 +0200 Subject: [PATCH 3064/3147] Use ipld.ErrNotFound for NotFound errors This commit was moved from ipfs/go-ipfs-blockstore@b598a29143df44364db9a1b80ddfc3549f7cdce5 --- blockstore/arc_cache.go | 19 ++++++++++--------- blockstore/arc_cache_test.go | 7 ++++--- blockstore/blockstore.go | 12 +++++------- blockstore/blockstore_test.go | 3 ++- blockstore/bloom_cache.go | 7 ++++--- blockstore/bloom_cache_test.go | 3 ++- 6 files changed, 27 insertions(+), 24 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 5dc7c6ed07..14d6bd4bf1 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -8,6 +8,7 @@ import ( lru "github.com/hashicorp/golang-lru" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" metrics "github.com/ipfs/go-metrics-interface" ) @@ -135,7 +136,7 @@ func (b *arccache) Has(ctx context.Context, k cid.Cid) (bool, error) { func (b *arccache) GetSize(ctx context.Context, k cid.Cid) (int, error) { if !k.Defined() { - return -1, ErrNotFound + return -1, ipld.ErrNotFound{Cid: k} } key := cacheKey(k) @@ -143,7 +144,7 @@ func (b *arccache) GetSize(ctx context.Context, k cid.Cid) (int, error) { if has, blockSize, ok := b.queryCache(key); ok { if !has { // don't have it, return - return -1, ErrNotFound + return -1, ipld.ErrNotFound{Cid: k} } if blockSize >= 0 { // have it and we know the size @@ -156,7 +157,7 @@ func (b *arccache) GetSize(ctx context.Context, k cid.Cid) (int, error) { defer b.unlock(key, false) blockSize, err := b.blockstore.GetSize(ctx, k) - if err == ErrNotFound { + if ipld.IsNotFound(err) { b.cacheHave(key, false) } else if err == nil { b.cacheSize(key, blockSize) @@ -176,7 +177,7 @@ func (b *arccache) View(ctx context.Context, k cid.Cid, callback func([]byte) er } if !k.Defined() { - return ErrNotFound + return ipld.ErrNotFound{Cid: k} } key := cacheKey(k) @@ -184,7 +185,7 @@ func (b *arccache) View(ctx context.Context, k cid.Cid, callback func([]byte) er if has, _, ok := b.queryCache(key); ok && !has { // short circuit if the cache deterministically tells us the item // doesn't exist. - return ErrNotFound + return ipld.ErrNotFound{Cid: k} } b.lock(key, false) @@ -197,7 +198,7 @@ func (b *arccache) View(ctx context.Context, k cid.Cid, callback func([]byte) er cberr = callback(buf) return nil }); err != nil { - if err == ErrNotFound { + if ipld.IsNotFound(err) { b.cacheHave(key, false) } return err @@ -210,20 +211,20 @@ func (b *arccache) View(ctx context.Context, k cid.Cid, callback func([]byte) er func (b *arccache) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { if !k.Defined() { - return nil, ErrNotFound + return nil, ipld.ErrNotFound{Cid: k} } key := cacheKey(k) if has, _, ok := b.queryCache(key); ok && !has { - return nil, ErrNotFound + return nil, ipld.ErrNotFound{Cid: k} } b.lock(key, false) defer b.unlock(key, false) bl, err := b.blockstore.Get(ctx, k) - if bl == nil && err == ErrNotFound { + if bl == nil && ipld.IsNotFound(err) { b.cacheHave(key, false) } else if bl != nil { b.cacheSize(key, len(bl.RawData())) diff --git a/blockstore/arc_cache_test.go b/blockstore/arc_cache_test.go index 992cd26880..164457d1bf 100644 --- a/blockstore/arc_cache_test.go +++ b/blockstore/arc_cache_test.go @@ -12,6 +12,7 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" syncds "github.com/ipfs/go-datastore/sync" + ipld "github.com/ipfs/go-ipld-format" ) var exampleBlock = blocks.NewBlock([]byte("foo")) @@ -111,7 +112,7 @@ func TestGetFillsCache(t *testing.T) { if has, err := arc.Has(bg, exampleBlock.Cid()); has || err != nil { t.Fatal("has was true but there is no such block") } - if _, err := arc.GetSize(bg, exampleBlock.Cid()); err != ErrNotFound { + if _, err := arc.GetSize(bg, exampleBlock.Cid()); !ipld.IsNotFound(err) { t.Fatal("getsize was true but there is no such block") } @@ -139,7 +140,7 @@ func TestGetAndDeleteFalseShortCircuit(t *testing.T) { trap("get hit datastore", cd, t) - if bl, err := arc.Get(bg, exampleBlock.Cid()); bl != nil || err != ErrNotFound { + if bl, err := arc.Get(bg, exampleBlock.Cid()); bl != nil || !ipld.IsNotFound(err) { t.Fatal("get returned invalid result") } @@ -226,7 +227,7 @@ func TestGetSizeMissingZeroSizeBlock(t *testing.T) { arc.Get(bg, missingBlock.Cid()) trap("has hit datastore", cd, t) - if _, err := arc.GetSize(bg, missingBlock.Cid()); err != ErrNotFound { + if _, err := arc.GetSize(bg, missingBlock.Cid()); !ipld.IsNotFound(err) { t.Fatal("getsize returned invalid result") } } diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 9572f76c0b..b0a50e2d71 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -14,6 +14,7 @@ import ( dsns "github.com/ipfs/go-datastore/namespace" dsq "github.com/ipfs/go-datastore/query" dshelp "github.com/ipfs/go-ipfs-ds-help" + ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" uatomic "go.uber.org/atomic" ) @@ -27,9 +28,6 @@ var BlockPrefix = ds.NewKey("blocks") // is different than expected. var ErrHashMismatch = errors.New("block in storage has different hash than requested") -// ErrNotFound is an error returned when a block is not found. -var ErrNotFound = errors.New("blockstore: block not found") - // Blockstore wraps a Datastore block-centered methods and provides a layer // of abstraction which allows to add different caching strategies. type Blockstore interface { @@ -143,12 +141,12 @@ func (bs *blockstore) HashOnRead(enabled bool) { func (bs *blockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { if !k.Defined() { - log.Error("undefined cid in blockstore") - return nil, ErrNotFound + logger.Error("undefined cid in blockstore") + return nil, ipld.ErrNotFound{Cid: k} } bdata, err := bs.datastore.Get(ctx, dshelp.MultihashToDsKey(k.Hash())) if err == ds.ErrNotFound { - return nil, ErrNotFound + return nil, ipld.ErrNotFound{Cid: k} } if err != nil { return nil, err @@ -206,7 +204,7 @@ func (bs *blockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { func (bs *blockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { size, err := bs.datastore.GetSize(ctx, dshelp.MultihashToDsKey(k.Hash())) if err == ds.ErrNotFound { - return -1, ErrNotFound + return -1, ipld.ErrNotFound{Cid: k} } return size, err } diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 1ee3341c35..522ed95d35 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -12,6 +12,7 @@ import ( dsq "github.com/ipfs/go-datastore/query" ds_sync "github.com/ipfs/go-datastore/sync" u "github.com/ipfs/go-ipfs-util" + ipld "github.com/ipfs/go-ipld-format" ) func TestGetWhenKeyNotPresent(t *testing.T) { @@ -30,7 +31,7 @@ func TestGetWhenKeyNotPresent(t *testing.T) { func TestGetWhenKeyIsNil(t *testing.T) { bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) _, err := bs.Get(bg, cid.Cid{}) - if err != ErrNotFound { + if !ipld.IsNotFound(err) { t.Fail() } } diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index e3332ef38f..64092f5d12 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -9,6 +9,7 @@ import ( bloom "github.com/ipfs/bbloom" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" metrics "github.com/ipfs/go-metrics-interface" ) @@ -156,7 +157,7 @@ func (b *bloomcache) Has(ctx context.Context, k cid.Cid) (bool, error) { func (b *bloomcache) GetSize(ctx context.Context, k cid.Cid) (int, error) { if has, ok := b.hasCached(k); ok && !has { - return -1, ErrNotFound + return -1, ipld.ErrNotFound{Cid: k} } return b.blockstore.GetSize(ctx, k) @@ -172,14 +173,14 @@ func (b *bloomcache) View(ctx context.Context, k cid.Cid, callback func([]byte) } if has, ok := b.hasCached(k); ok && !has { - return ErrNotFound + return ipld.ErrNotFound{Cid: k} } return b.viewer.View(ctx, k, callback) } func (b *bloomcache) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { if has, ok := b.hasCached(k); ok && !has { - return nil, ErrNotFound + return nil, ipld.ErrNotFound{Cid: k} } return b.blockstore.Get(ctx, k) diff --git a/blockstore/bloom_cache_test.go b/blockstore/bloom_cache_test.go index 43f747d5e7..3c998c5512 100644 --- a/blockstore/bloom_cache_test.go +++ b/blockstore/bloom_cache_test.go @@ -11,6 +11,7 @@ import ( ds "github.com/ipfs/go-datastore" dsq "github.com/ipfs/go-datastore/query" syncds "github.com/ipfs/go-datastore/sync" + ipld "github.com/ipfs/go-ipld-format" ) var bg = context.Background() @@ -65,7 +66,7 @@ func TestPutManyAddsToBloom(t *testing.T) { t.Fatal(err) } blockSize, err = cachedbs.GetSize(bg, block2.Cid()) - if err != nil && err != ErrNotFound { + if err != nil && !ipld.IsNotFound(err) { t.Fatal(err) } if blockSize > -1 || has { From 8dceb79e3cd2b78e85ab4ec8070b3409bd33e91f Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 7 Apr 2020 19:05:18 +0200 Subject: [PATCH 3065/3147] s/log/logger This commit was moved from ipfs/go-ipfs-blockstore@b3ee1d9409119e0ca8962dad77531760b055e873 --- blockstore/arc_cache.go | 3 +++ blockstore/blockstore.go | 6 +++--- blockstore/bloom_cache.go | 8 ++++---- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 14d6bd4bf1..2733dfc37e 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -114,6 +114,9 @@ func (b *arccache) DeleteBlock(ctx context.Context, k cid.Cid) error { func (b *arccache) Has(ctx context.Context, k cid.Cid) (bool, error) { if !k.Defined() { + logger.Error("undefined cid in arccache") + // Return cache invalid so the call to blockstore happens + // in case of invalid key and correct error is created. return false, nil } diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index b0a50e2d71..61cb780f89 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -19,7 +19,7 @@ import ( uatomic "go.uber.org/atomic" ) -var log = logging.Logger("blockstore") +var logger = logging.Logger("blockstore") // BlockPrefix namespaces blockstore datastores var BlockPrefix = ds.NewKey("blocks") @@ -239,14 +239,14 @@ func (bs *blockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return } if e.Error != nil { - log.Errorf("blockstore.AllKeysChan got err: %s", e.Error) + logger.Errorf("blockstore.AllKeysChan got err: %s", e.Error) return } // need to convert to key.Key using key.KeyFromDsKey. bk, err := dshelp.BinaryFromDsKey(ds.RawKey(e.Key)) if err != nil { - log.Warningf("error parsing key from binary: %s", err) + logger.Warningf("error parsing key from binary: %s", err) continue } k := cid.NewCidV1(cid.Raw, bk) diff --git a/blockstore/bloom_cache.go b/blockstore/bloom_cache.go index 64092f5d12..23d14832c1 100644 --- a/blockstore/bloom_cache.go +++ b/blockstore/bloom_cache.go @@ -38,9 +38,9 @@ func bloomCached(ctx context.Context, bs Blockstore, bloomSize, hashCount int) ( if err != nil { select { case <-ctx.Done(): - log.Warning("Cache rebuild closed by context finishing: ", err) + logger.Warning("Cache rebuild closed by context finishing: ", err) default: - log.Error(err) + logger.Error(err) } return } @@ -95,7 +95,7 @@ func (b *bloomcache) Wait(ctx context.Context) error { } func (b *bloomcache) build(ctx context.Context) error { - evt := log.EventBegin(ctx, "bloomcache.build") + evt := logger.EventBegin(ctx, "bloomcache.build") defer evt.Done() defer close(b.buildChan) @@ -132,7 +132,7 @@ func (b *bloomcache) DeleteBlock(ctx context.Context, k cid.Cid) error { func (b *bloomcache) hasCached(k cid.Cid) (has bool, ok bool) { b.total.Inc() if !k.Defined() { - log.Error("undefined in bloom cache") + logger.Error("undefined in bloom cache") // Return cache invalid so call to blockstore // in case of invalid key is forwarded deeper return false, false From 8001a94d5b444b7c3e0f0d8c9d77a5c9707fe845 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 7 Apr 2020 23:09:02 +0200 Subject: [PATCH 3066/3147] Use ipld.ErrNotFound instead of ErrNotFound This commit was moved from ipfs/go-blockservice@56521629cb9bfc87208b49abbf9e5b9ae3507d83 --- blockservice/blockservice.go | 15 +++------------ blockservice/blockservice_test.go | 3 ++- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 66905a6779..0bb0165472 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -5,7 +5,6 @@ package blockservice import ( "context" - "errors" "io" "sync" @@ -13,14 +12,13 @@ import ( cid "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" + ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log/v2" "github.com/ipfs/go-verifcid" ) var log = logging.Logger("blockservice") -var ErrNotFound = errors.New("blockservice: key not found") - // BlockGetter is the common interface shared between blockservice sessions and // the blockservice. type BlockGetter interface { @@ -151,7 +149,7 @@ func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { if s.exchange != nil { if err := s.exchange.HasBlock(ctx, o); err != nil { - log.Errorf("HasBlock: %s", err.Error()) + logger.Errorf("HasBlock: %s", err.Error()) } } @@ -230,7 +228,7 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun return block, nil } - if err == blockstore.ErrNotFound && fget != nil { + if ipld.IsNotFound(err) && fget != nil { f := fget() // Don't load the exchange until we have to // TODO be careful checking ErrNotFound. If the underlying @@ -238,9 +236,6 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun log.Debug("Blockservice: Searching bitswap") blk, err := f.GetBlock(ctx, c) if err != nil { - if err == blockstore.ErrNotFound { - return nil, ErrNotFound - } return nil, err } log.Debugf("BlockService.BlockFetched %s", c) @@ -248,10 +243,6 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun } log.Debug("Blockservice GetBlock: Not found") - if err == blockstore.ErrNotFound { - return nil, ErrNotFound - } - return nil, err } diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 268a7a5928..c29f0cfc50 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -11,6 +11,7 @@ import ( butil "github.com/ipfs/go-ipfs-blocksutil" exchange "github.com/ipfs/go-ipfs-exchange-interface" offline "github.com/ipfs/go-ipfs-exchange-offline" + ipld "github.com/ipfs/go-ipld-format" ) func TestWriteThroughWorks(t *testing.T) { @@ -132,7 +133,7 @@ func TestNilExchange(t *testing.T) { bserv := NewWriteThrough(bs, nil) sess := NewSession(ctx, bserv) _, err := sess.GetBlock(ctx, block.Cid()) - if err != ErrNotFound { + if !ipld.IsNotFound(err) { t.Fatal("expected block to not be found") } err = bs.Put(ctx, block) From 00a68a654ea781df6e8927bb86e1bea33938dc67 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 2 Mar 2022 15:34:09 +0100 Subject: [PATCH 3067/3147] s/log/logger This commit was moved from ipfs/go-blockservice@60962f59d0f2ad2b12ed4aa13c6fbf63ccb946c2 --- blockservice/blockservice.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 0bb0165472..4249f54c2e 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -17,7 +17,7 @@ import ( "github.com/ipfs/go-verifcid" ) -var log = logging.Logger("blockservice") +var logger = logging.Logger("blockservice") // BlockGetter is the common interface shared between blockservice sessions and // the blockservice. @@ -70,7 +70,7 @@ type blockService struct { // NewBlockService creates a BlockService with given datastore instance. func New(bs blockstore.Blockstore, rem exchange.Interface) BlockService { if rem == nil { - log.Debug("blockservice running in local (offline) mode.") + logger.Debug("blockservice running in local (offline) mode.") } return &blockService{ @@ -84,7 +84,7 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) BlockService { // through to the blockstore and are not skipped by cache checks. func NewWriteThrough(bs blockstore.Blockstore, rem exchange.Interface) BlockService { if rem == nil { - log.Debug("blockservice running in local (offline) mode.") + logger.Debug("blockservice running in local (offline) mode.") } return &blockService{ @@ -145,7 +145,7 @@ func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { return err } - log.Debugf("BlockService.BlockAdded %s", c) + logger.Debugf("BlockService.BlockAdded %s", c) if s.exchange != nil { if err := s.exchange.HasBlock(ctx, o); err != nil { @@ -191,9 +191,9 @@ func (s *blockService) AddBlocks(ctx context.Context, bs []blocks.Block) error { if s.exchange != nil { for _, o := range toput { - log.Debugf("BlockService.BlockAdded %s", o.Cid()) + logger.Debugf("BlockService.BlockAdded %s", o.Cid()) if err := s.exchange.HasBlock(ctx, o); err != nil { - log.Errorf("HasBlock: %s", err.Error()) + logger.Errorf("HasBlock: %s", err.Error()) } } } @@ -203,7 +203,7 @@ func (s *blockService) AddBlocks(ctx context.Context, bs []blocks.Block) error { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { - log.Debugf("BlockService GetBlock: '%s'", c) + logger.Debugf("BlockService GetBlock: '%s'", c) var f func() exchange.Fetcher if s.exchange != nil { @@ -233,16 +233,16 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun // TODO be careful checking ErrNotFound. If the underlying // implementation changes, this will break. - log.Debug("Blockservice: Searching bitswap") + logger.Debug("Blockservice: Searching bitswap") blk, err := f.GetBlock(ctx, c) if err != nil { return nil, err } - log.Debugf("BlockService.BlockFetched %s", c) + logger.Debugf("BlockService.BlockFetched %s", c) return blk, nil } - log.Debug("Blockservice GetBlock: Not found") + logger.Debug("Blockservice GetBlock: Not found") return nil, err } @@ -279,7 +279,7 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget if err := verifcid.ValidateCid(c); err == nil { ks2 = append(ks2, c) } else { - log.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) + logger.Errorf("unsafe CID (%s) passed to blockService.GetBlocks: %s", c, err) } } ks = ks2 @@ -306,12 +306,12 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget f := fget() // don't load exchange unless we have to rblocks, err := f.GetBlocks(ctx, misses) if err != nil { - log.Debugf("Error with GetBlocks: %s", err) + logger.Debugf("Error with GetBlocks: %s", err) return } for b := range rblocks { - log.Debugf("BlockService.BlockFetched %s", b.Cid()) + logger.Debugf("BlockService.BlockFetched %s", b.Cid()) select { case out <- b: case <-ctx.Done(): @@ -326,13 +326,13 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func (s *blockService) DeleteBlock(ctx context.Context, c cid.Cid) error { err := s.blockstore.DeleteBlock(ctx, c) if err == nil { - log.Debugf("BlockService.BlockDeleted %s", c) + logger.Debugf("BlockService.BlockDeleted %s", c) } return err } func (s *blockService) Close() error { - log.Debug("blockservice is shutting down...") + logger.Debug("blockservice is shutting down...") return s.exchange.Close() } From 4ec405c16891a8524e66da7e85396587467d5f53 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 8 Apr 2020 00:01:52 +0200 Subject: [PATCH 3068/3147] Improve NotFound error description This provide a better description when the offline exchange does not find a block. Rather than bubbling a blockstore error, it wraps it and specifies that the block was not found locally (offline). This commit was moved from ipfs/go-ipfs-exchange-offline@84971a95e6ed894af9cdeb239459dcbffc785ac8 --- exchange/offline/offline.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 73622659bc..7c5d7c5ea8 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -4,11 +4,13 @@ package offline import ( "context" + "fmt" blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" + ipld "github.com/ipfs/go-ipld-format" ) func Exchange(bs blockstore.Blockstore) exchange.Interface { @@ -25,7 +27,11 @@ type offlineExchange struct { // given key. // NB: This function may return before the timeout expires. func (e *offlineExchange) GetBlock(ctx context.Context, k cid.Cid) (blocks.Block, error) { - return e.bs.Get(ctx, k) + blk, err := e.bs.Get(ctx, k) + if ipld.IsNotFound(err) { + return nil, fmt.Errorf("block was not found locally (offline): %w", err) + } + return blk, err } // HasBlock always returns nil. From 049d13b0e6c67cede58681469dfb54b86bdcbb07 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 8 Apr 2020 00:33:40 +0200 Subject: [PATCH 3069/3147] Use ipld.ErrNotFound This commit was moved from ipfs/go-filestore@54dbf5f297c1667e7ac1bbfbe0cf2537faa1510c --- filestore/filestore.go | 36 +++++++++++++++--------------------- filestore/filestore_test.go | 3 ++- filestore/fsrefstore.go | 6 +++--- filestore/util.go | 4 ++-- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 6382a6db43..2372a6074e 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -16,6 +16,7 @@ import ( dsq "github.com/ipfs/go-datastore/query" blockstore "github.com/ipfs/go-ipfs-blockstore" posinfo "github.com/ipfs/go-ipfs-posinfo" + ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" ) @@ -117,7 +118,7 @@ func (f *Filestore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { // ErrNotFound when the block is not stored. func (f *Filestore) DeleteBlock(ctx context.Context, c cid.Cid) error { err1 := f.bs.DeleteBlock(ctx, c) - if err1 != nil && err1 != blockstore.ErrNotFound { + if err1 != nil && !ipld.IsNotFound(err1) { return err1 } @@ -125,45 +126,38 @@ func (f *Filestore) DeleteBlock(ctx context.Context, c cid.Cid) error { // if we successfully removed something from the blockstore, but the // filestore didnt have it, return success - switch err2 { - case nil: - return nil - case blockstore.ErrNotFound: - if err1 == blockstore.ErrNotFound { - return blockstore.ErrNotFound + if ipld.IsNotFound(err2) { + if ipld.IsNotFound(err1) { + return err1 } + // being here means err1 was nil and err2 NotFound. return nil - default: - return err2 } + + return err2 } // Get retrieves the block with the given Cid. It may return // ErrNotFound when the block is not stored. func (f *Filestore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { blk, err := f.bs.Get(ctx, c) - switch err { - case nil: - return blk, nil - case blockstore.ErrNotFound: + if ipld.IsNotFound(err) { return f.fm.Get(ctx, c) - default: - return nil, err } + return blk, err } // GetSize returns the size of the requested block. It may return ErrNotFound // when the block is not stored. func (f *Filestore) GetSize(ctx context.Context, c cid.Cid) (int, error) { size, err := f.bs.GetSize(ctx, c) - switch err { - case nil: - return size, nil - case blockstore.ErrNotFound: - return f.fm.GetSize(ctx, c) - default: + if err != nil { + if ipld.IsNotFound(err) { + return f.fm.GetSize(ctx, c) + } return -1, err } + return size, nil } // Has returns true if the block with the given Cid is diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index e3b822cf44..8117a23929 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -13,6 +13,7 @@ import ( ds "github.com/ipfs/go-datastore" blockstore "github.com/ipfs/go-ipfs-blockstore" posinfo "github.com/ipfs/go-ipfs-posinfo" + ipld "github.com/ipfs/go-ipld-format" ) var bg = context.Background() @@ -148,7 +149,7 @@ func TestDeletes(t *testing.T) { deleted := make(map[string]bool) for _, c := range todelete { _, err := fs.Get(bg, c) - if err != blockstore.ErrNotFound { + if !ipld.IsNotFound(err) { t.Fatal("expected blockstore not found error") } deleted[c.KeyString()] = true diff --git a/filestore/fsrefstore.go b/filestore/fsrefstore.go index 9eb2b4316e..844acd8857 100644 --- a/filestore/fsrefstore.go +++ b/filestore/fsrefstore.go @@ -16,9 +16,9 @@ import ( ds "github.com/ipfs/go-datastore" dsns "github.com/ipfs/go-datastore/namespace" dsq "github.com/ipfs/go-datastore/query" - blockstore "github.com/ipfs/go-ipfs-blockstore" dshelp "github.com/ipfs/go-ipfs-ds-help" posinfo "github.com/ipfs/go-ipfs-posinfo" + ipld "github.com/ipfs/go-ipld-format" mh "github.com/multiformats/go-multihash" ) @@ -103,7 +103,7 @@ func (f *FileManager) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { func (f *FileManager) DeleteBlock(ctx context.Context, c cid.Cid) error { err := f.ds.Delete(ctx, dshelp.MultihashToDsKey(c.Hash())) if err == ds.ErrNotFound { - return blockstore.ErrNotFound + return ipld.ErrNotFound{Cid: c} } return err } @@ -148,7 +148,7 @@ func (f *FileManager) getDataObj(ctx context.Context, m mh.Multihash) (*pb.DataO o, err := f.ds.Get(ctx, dshelp.MultihashToDsKey(m)) switch err { case ds.ErrNotFound: - return nil, blockstore.ErrNotFound + return nil, ipld.ErrNotFound{Cid: cid.NewCidV1(cid.Raw, m)} case nil: // default: diff --git a/filestore/util.go b/filestore/util.go index 4bd1226d34..125b96b049 100644 --- a/filestore/util.go +++ b/filestore/util.go @@ -10,8 +10,8 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dsq "github.com/ipfs/go-datastore/query" - blockstore "github.com/ipfs/go-ipfs-blockstore" dshelp "github.com/ipfs/go-ipfs-ds-help" + ipld "github.com/ipfs/go-ipld-format" mh "github.com/multiformats/go-multihash" ) @@ -261,7 +261,7 @@ func mkListRes(m mh.Multihash, d *pb.DataObj, err error) *ListRes { status := StatusOk errorMsg := "" if err != nil { - if err == ds.ErrNotFound || err == blockstore.ErrNotFound { + if err == ds.ErrNotFound || ipld.IsNotFound(err) { status = StatusKeyNotFound } else if err, ok := err.(*CorruptReferenceError); ok { status = err.Code From 3f1d60e6c62e8fc20432db83990a10b7af89e6c3 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Fri, 18 Mar 2022 00:17:03 +0100 Subject: [PATCH 3070/3147] refactor: follow the happy left practice in Filestore.DeleteBlock This commit was moved from ipfs/go-filestore@f280748ba419477beb2cf93a9fa3e7ebbefe73a3 --- filestore/filestore.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/filestore/filestore.go b/filestore/filestore.go index 2372a6074e..8b966f3fa4 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -123,18 +123,18 @@ func (f *Filestore) DeleteBlock(ctx context.Context, c cid.Cid) error { } err2 := f.fm.DeleteBlock(ctx, c) + // if we successfully removed something from the blockstore, but the // filestore didnt have it, return success + if !ipld.IsNotFound(err2) { + return err2 + } - if ipld.IsNotFound(err2) { - if ipld.IsNotFound(err1) { - return err1 - } - // being here means err1 was nil and err2 NotFound. - return nil + if ipld.IsNotFound(err1) { + return err1 } - return err2 + return nil } // Get retrieves the block with the given Cid. It may return From 2263eca4a44789edb3c0d244c961c12bcb1585ad Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 2 Mar 2022 16:44:11 +0100 Subject: [PATCH 3071/3147] Update tests to use ipld.IsNotFound to check for notfound errors This commit was moved from ipfs/interface-go-ipfs-core@01ee9419a28353cab04979f0791133df9869f30a --- coreiface/tests/block.go | 5 +++-- coreiface/tests/unixfs.go | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 7dbfa4df04..8d0243e7ee 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -8,6 +8,7 @@ import ( "strings" "testing" + ipld "github.com/ipfs/go-ipld-format" coreiface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" "github.com/ipfs/interface-go-ipfs-core/path" @@ -179,7 +180,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) { if err == nil { t.Fatal("expected err to exist") } - if !strings.Contains(err.Error(), "blockservice: key not found") { + if !ipld.IsNotFound(err) { t.Errorf("unexpected error; %s", err.Error()) } @@ -187,7 +188,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) { if err == nil { t.Fatal("expected err to exist") } - if !strings.Contains(err.Error(), "blockstore: block not found") { + if !strings.Contains(err.Error(), "not found") { t.Errorf("unexpected error; %s", err.Error()) } diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 4273386aaa..f47d34d0a5 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -5,7 +5,6 @@ import ( "context" "encoding/hex" "fmt" - "github.com/ipfs/interface-go-ipfs-core/path" "io" "io/ioutil" "math" @@ -16,12 +15,15 @@ import ( "sync" "testing" + "github.com/ipfs/interface-go-ipfs-core/path" + coreiface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" "github.com/ipfs/go-cid" - "github.com/ipfs/go-ipfs-files" + files "github.com/ipfs/go-ipfs-files" cbor "github.com/ipfs/go-ipld-cbor" + ipld "github.com/ipfs/go-ipld-format" mdag "github.com/ipfs/go-merkledag" "github.com/ipfs/go-unixfs" "github.com/ipfs/go-unixfs/importer/helpers" @@ -576,7 +578,7 @@ func (tp *TestSuite) TestAddHashOnly(t *testing.T) { if err == nil { t.Fatal("expected an error") } - if !strings.Contains(err.Error(), "blockservice: key not found") { + if !ipld.IsNotFound(err) { t.Errorf("unxepected error: %s", err.Error()) } } From 44ec33010423e8a4ee04e19ec5a3059d2273ab53 Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Fri, 18 Mar 2022 03:41:51 +0100 Subject: [PATCH 3072/3147] sync: update CI config files (#15) * disable Travis * add version.json file * add .github/workflows/automerge.yml * add .github/workflows/go-test.yml * add .github/workflows/go-check.yml * add .github/workflows/releaser.yml * add .github/workflows/release-check.yml * add .github/workflows/tagpush.yml * fix: field cid is unused (U1000) https://github.com/ipfs/go-pinning-service-http-client/runs/5594929290?check_suite_focus=true#step:10:31 Co-authored-by: web3-bot Co-authored-by: Marcin Rataj This commit was moved from ipfs/go-pinning-service-http-client@014aba06c4d68a3e367f352cdb82ea0eef73cda6 --- pinning/remote/client/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index 40b4b09f4b..f4799a74d1 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -3,10 +3,11 @@ package go_pinning_service_http_client import ( "context" "fmt" - "github.com/pkg/errors" "net/http" "time" + "github.com/pkg/errors" + "github.com/ipfs/go-cid" "github.com/ipfs/go-pinning-service-http-client/openapi" "github.com/multiformats/go-multiaddr" @@ -261,7 +262,6 @@ func (c *Client) lsInternal(ctx context.Context, settings *lsSettings) (pinResul // TODO: We should probably make sure there are no duplicates sent type addSettings struct { - cid string name string origins []string meta map[string]string From e9c49a2bc004dc7ef014605bf0882c1ab7ce779f Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 23 Mar 2022 19:21:31 +0100 Subject: [PATCH 3073/3147] Resolver: unexport BasicResover This commit was moved from ipfs/go-path@29ae0276833f231c99258840ec806f06964e082e --- path/resolver/resolver.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 55c322aafc..64778c1cab 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -58,17 +58,17 @@ type Resolver interface { ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) } -// BasicResolver implements the Resolver interface. +// basicResolver implements the Resolver interface. // It references a FetcherFactory, which is uses to resolve nodes. // TODO: now that this is more modular, try to unify this code with the // the resolvers in namesys. -type BasicResolver struct { +type basicResolver struct { FetcherFactory fetcher.Factory } // NewBasicResolver constructs a new basic resolver. func NewBasicResolver(fetcherFactory fetcher.Factory) Resolver { - return &BasicResolver{ + return &basicResolver{ FetcherFactory: fetcherFactory, } } @@ -76,7 +76,7 @@ func NewBasicResolver(fetcherFactory fetcher.Factory) Resolver { // ResolveToLastNode walks the given path and returns the cid of the last // block referenced by the path, and the path segments to traverse from the // final block boundary to the final node within the block. -func (r *BasicResolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { +func (r *basicResolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { c, p, err := path.SplitAbsPath(fpath) if err != nil { return cid.Cid{}, nil, err @@ -142,7 +142,7 @@ func (r *BasicResolver) ResolveToLastNode(ctx context.Context, fpath path.Path) // // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. -func (r *BasicResolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) { +func (r *basicResolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) { // validate path if err := fpath.IsValid(); err != nil { return nil, nil, err @@ -179,7 +179,7 @@ func ResolveSingle(ctx context.Context, ds format.NodeGetter, nd format.Node, na // // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. -func (r *BasicResolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { +func (r *basicResolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) defer evt.Done() @@ -217,7 +217,7 @@ func (r *BasicResolver) ResolvePathComponents(ctx context.Context, fpath path.Pa // // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. -func (r *BasicResolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { +func (r *basicResolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) defer evt.Done() @@ -243,7 +243,7 @@ func (r *BasicResolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names [ // Finds nodes matching the selector starting with a cid. Returns the matched nodes, the cid of the block containing // the last node, and the depth of the last node within its block (root is depth 0). -func (r *BasicResolver) resolveNodes(ctx context.Context, c cid.Cid, sel ipld.Node) ([]ipld.Node, cid.Cid, int, error) { +func (r *basicResolver) resolveNodes(ctx context.Context, c cid.Cid, sel ipld.Node) ([]ipld.Node, cid.Cid, int, error) { session := r.FetcherFactory.NewSession(ctx) // traverse selector From f9d0ad972ce79a1fca890370606d585cf49416fe Mon Sep 17 00:00:00 2001 From: godcong Date: Fri, 25 Mar 2022 22:32:10 +0800 Subject: [PATCH 3074/3147] fix: document error (#74) This commit was moved from ipfs/interface-go-ipfs-core@e9a299166898903a08f98e766aa23f452170496a --- coreiface/coreapi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index aacda04593..894ffb3187 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -32,7 +32,7 @@ type CoreAPI interface { // Pin returns an implementation of Pin API Pin() PinAPI - // ObjectAPI returns an implementation of Object API + // Object returns an implementation of Object API Object() ObjectAPI // Dht returns an implementation of Dht API From af325c0139aa9b6dfb222588b7a9b05bd226e4bd Mon Sep 17 00:00:00 2001 From: godcong Date: Fri, 25 Mar 2022 23:45:20 +0800 Subject: [PATCH 3075/3147] fix(publisher): fix garbled code output (#28) This commit was moved from ipfs/go-namesys@ff68a748348b2853e66be031629c826c967cb8b0 --- namesys/publisher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/publisher.go b/namesys/publisher.go index 3b69bce733..1ea9e2145d 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -284,7 +284,7 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec return err } - log.Debugf("Storing ipns entry at: %s", ipnskey) + log.Debugf("Storing ipns entry at: %x", ipnskey) // Store ipns entry at "/ipns/"+h(pubkey) return r.PutValue(ctx, ipnskey, data) } From 548e3d4298370c022c6e79dbe5614d8c80ea90b9 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Thu, 31 Mar 2022 23:55:17 +0200 Subject: [PATCH 3076/3147] fix: use IPLD.ErrNotFound instead of string comparison in tests This commit was moved from ipfs/interface-go-ipfs-core@03f4e9cca18f0882ae13f718d4b3e18ef1f361ca --- coreiface/tests/block.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 8d0243e7ee..87fa90b650 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -188,7 +188,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) { if err == nil { t.Fatal("expected err to exist") } - if !strings.Contains(err.Error(), "not found") { + if !ipld.IsNotFound(err) { t.Errorf("unexpected error; %s", err.Error()) } From 948dcb33278f7ee434fab22af624941444cd2466 Mon Sep 17 00:00:00 2001 From: Gus Eggert Date: Fri, 8 Apr 2022 10:56:07 -0400 Subject: [PATCH 3077/3147] feat: add tracing (#30) * feat: add tracing * make span names and attributes more consistent This commit was moved from ipfs/go-namesys@bf4b3cffd9bdc0fb668bb6879f17070128145798 --- namesys/base.go | 6 ++++++ namesys/dns.go | 17 +++++++++++++++++ namesys/namesys.go | 21 +++++++++++++++++++++ namesys/publisher.go | 14 ++++++++++++++ namesys/republisher/repub.go | 13 ++++++++++++- namesys/resolve/resolve.go | 4 ++++ namesys/routing.go | 12 ++++++++++++ namesys/tracing.go | 13 +++++++++++++ 8 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 namesys/tracing.go diff --git a/namesys/base.go b/namesys/base.go index 27cc38f888..5bf64c0e34 100644 --- a/namesys/base.go +++ b/namesys/base.go @@ -40,12 +40,18 @@ func resolve(ctx context.Context, r resolver, name string, options opts.ResolveO } func resolveAsync(ctx context.Context, r resolver, name string, options opts.ResolveOpts) <-chan Result { + ctx, span := StartSpan(ctx, "ResolveAsync") + defer span.End() + resCh := r.resolveOnceAsync(ctx, name, options) depth := options.Depth outCh := make(chan Result, 1) go func() { defer close(outCh) + ctx, span := StartSpan(ctx, "ResolveAsync.Worker") + defer span.End() + var subCh <-chan Result var cancelSub context.CancelFunc defer func() { diff --git a/namesys/dns.go b/namesys/dns.go index 1398356171..ba19061621 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -11,6 +11,8 @@ import ( path "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" dns "github.com/miekg/dns" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) // LookupTXTFunc is a function that lookups TXT record values. @@ -30,11 +32,17 @@ func NewDNSResolver(lookup LookupTXTFunc) *DNSResolver { // Resolve implements Resolver. func (r *DNSResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { + ctx, span := StartSpan(ctx, "DNSResolver.Resolve") + defer span.End() + return resolve(ctx, r, name, opts.ProcessOpts(options)) } // ResolveAsync implements Resolver. func (r *DNSResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { + ctx, span := StartSpan(ctx, "DNSResolver.ResolveAsync") + defer span.End() + return resolveAsync(ctx, r, name, opts.ProcessOpts(options)) } @@ -47,6 +55,9 @@ type lookupRes struct { // TXT records for a given domain name should contain a b58 // encoded multihash. func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + ctx, span := StartSpan(ctx, "DNSResolver.ResolveOnceAsync") + defer span.End() + var fqdn string out := make(chan onceResult, 1) segments := strings.SplitN(name, "/", 2) @@ -80,6 +91,9 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options go func() { defer close(out) + ctx, span := StartSpan(ctx, "DNSResolver.ResolveOnceAsync.Worker") + defer span.End() + var rootResErr, subResErr error for { select { @@ -131,6 +145,9 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options } func workDomain(ctx context.Context, r *DNSResolver, name string, res chan lookupRes) { + ctx, span := StartSpan(ctx, "DNSResolver.WorkDomain", trace.WithAttributes(attribute.String("Name", name))) + defer span.End() + defer close(res) txt, err := r.lookupTXT(ctx, name) diff --git a/namesys/namesys.go b/namesys/namesys.go index 537f0d1b0f..51b5e70967 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -30,6 +30,8 @@ import ( routing "github.com/libp2p/go-libp2p-core/routing" dns "github.com/miekg/dns" madns "github.com/multiformats/go-multiaddr-dns" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) // mpns (a multi-protocol NameSystem) implements generic IPFS naming. @@ -134,6 +136,9 @@ const DefaultResolverCacheTTL = time.Minute // Resolve implements Resolver. func (ns *mpns) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { + ctx, span := StartSpan(ctx, "MPNS.Resolve", trace.WithAttributes(attribute.String("Name", name))) + defer span.End() + if strings.HasPrefix(name, "/ipfs/") { return path.ParsePath(name) } @@ -146,6 +151,9 @@ func (ns *mpns) Resolve(ctx context.Context, name string, options ...opts.Resolv } func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { + ctx, span := StartSpan(ctx, "MPNS.ResolveAsync", trace.WithAttributes(attribute.String("Name", name))) + defer span.End() + if strings.HasPrefix(name, "/ipfs/") { p, err := path.ParsePath(name) res := make(chan Result, 1) @@ -167,6 +175,9 @@ func (ns *mpns) ResolveAsync(ctx context.Context, name string, options ...opts.R // resolveOnce implements resolver. func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + ctx, span := StartSpan(ctx, "MPNS.ResolveOnceAsync") + defer span.End() + out := make(chan onceResult, 1) if !strings.HasPrefix(name, ipnsPrefix) { @@ -213,11 +224,14 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. if len(segments) > 3 { p, err = path.FromSegments("", strings.TrimRight(p.String(), "/"), segments[3]) } + span.SetAttributes(attribute.Bool("CacheHit", true)) + span.RecordError(err) out <- onceResult{value: p, err: err} close(out) return out } + span.SetAttributes(attribute.Bool("CacheHit", false)) if err == nil { res = ns.ipnsResolver @@ -273,18 +287,25 @@ func emitOnceResult(ctx context.Context, outCh chan<- onceResult, r onceResult) // Publish implements Publisher func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { + ctx, span := StartSpan(ctx, "MPNS.Publish") + defer span.End() return ns.PublishWithEOL(ctx, name, value, time.Now().Add(DefaultRecordEOL)) } func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { + ctx, span := StartSpan(ctx, "MPNS.PublishWithEOL", trace.WithAttributes(attribute.String("Value", value.String()))) + defer span.End() id, err := peer.IDFromPrivateKey(name) if err != nil { + span.RecordError(err) return err } + span.SetAttributes(attribute.String("ID", id.String())) if err := ns.ipnsPublisher.PublishWithEOL(ctx, name, value, eol); err != nil { // Invalidate the cache. Publishing may _partially_ succeed but // still return an error. ns.cacheInvalidate(string(id)) + span.RecordError(err) return err } ttl := DefaultResolverCacheTTL diff --git a/namesys/publisher.go b/namesys/publisher.go index 1ea9e2145d..bf1c46d9d4 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -16,6 +16,8 @@ import ( peer "github.com/libp2p/go-libp2p-core/peer" routing "github.com/libp2p/go-libp2p-core/routing" base32 "github.com/whyrusleeping/base32" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) const ipnsPrefix = "/ipns/" @@ -191,6 +193,9 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k crypto.PrivKey, valu // PublishWithEOL is a temporary stand in for the ipns records implementation // see here for more details: https://github.com/ipfs/specs/tree/master/records func (p *IpnsPublisher) PublishWithEOL(ctx context.Context, k crypto.PrivKey, value path.Path, eol time.Time) error { + ctx, span := StartSpan(ctx, "IpnsPublisher.PublishWithEOL", trace.WithAttributes(attribute.String("Value", value.String()))) + defer span.End() + record, err := p.updateRecord(ctx, k, value, eol) if err != nil { return err @@ -216,6 +221,9 @@ func checkCtxTTL(ctx context.Context) (time.Duration, bool) { // keyed on the ID associated with the provided public key. The public key is // also made available to the routing system so that entries can be verified. func PutRecordToRouting(ctx context.Context, r routing.ValueStore, k crypto.PubKey, entry *pb.IpnsEntry) error { + ctx, span := StartSpan(ctx, "PutRecordToRouting") + defer span.End() + ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -266,6 +274,9 @@ func waitOnErrChan(ctx context.Context, errs chan error) error { // PublishPublicKey stores the given public key in the ValueStore with the // given key. func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk crypto.PubKey) error { + ctx, span := StartSpan(ctx, "PublishPublicKey", trace.WithAttributes(attribute.String("Key", k))) + defer span.End() + log.Debugf("Storing pubkey at: %s", k) pkbytes, err := crypto.MarshalPublicKey(pubk) if err != nil { @@ -279,6 +290,9 @@ func PublishPublicKey(ctx context.Context, r routing.ValueStore, k string, pubk // PublishEntry stores the given IpnsEntry in the ValueStore with the given // ipnskey. func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec *pb.IpnsEntry) error { + ctx, span := StartSpan(ctx, "PublishEntry", trace.WithAttributes(attribute.String("IPNSKey", ipnskey))) + defer span.End() + data, err := proto.Marshal(rec) if err != nil { return err diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index 5fefac2229..a24e59dff9 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -10,6 +10,7 @@ import ( keystore "github.com/ipfs/go-ipfs-keystore" namesys "github.com/ipfs/go-namesys" path "github.com/ipfs/go-path" + "go.opentelemetry.io/otel/attribute" proto "github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-datastore" @@ -93,6 +94,8 @@ func (rp *Republisher) Run(proc goprocess.Process) { func (rp *Republisher) republishEntries(p goprocess.Process) error { ctx, cancel := context.WithCancel(gpctx.OnClosingContext(p)) defer cancel() + ctx, span := namesys.StartSpan(ctx, "Republisher.RepublishEntries") + defer span.End() // TODO: Use rp.ipns.ListPublished(). We can't currently *do* that // because: @@ -125,8 +128,11 @@ func (rp *Republisher) republishEntries(p goprocess.Process) error { } func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) error { + ctx, span := namesys.StartSpan(ctx, "Republisher.RepublishEntry") + defer span.End() id, err := peer.IDFromPrivateKey(priv) if err != nil { + span.RecordError(err) return err } @@ -136,14 +142,17 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro e, err := rp.getLastIPNSEntry(ctx, id) if err != nil { if err == errNoEntry { + span.SetAttributes(attribute.Bool("NoEntry", true)) return nil } + span.RecordError(err) return err } p := path.Path(e.GetValue()) prevEol, err := ipns.GetEOL(e) if err != nil { + span.RecordError(err) return err } @@ -152,7 +161,9 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro if prevEol.After(eol) { eol = prevEol } - return rp.ns.PublishWithEOL(ctx, priv, p, eol) + err = rp.ns.PublishWithEOL(ctx, priv, p, eol) + span.RecordError(err) + return err } func (rp *Republisher) getLastIPNSEntry(ctx context.Context, id peer.ID) (*pb.IpnsEntry, error) { diff --git a/namesys/resolve/resolve.go b/namesys/resolve/resolve.go index 5f1b4eed90..38096593eb 100644 --- a/namesys/resolve/resolve.go +++ b/namesys/resolve/resolve.go @@ -7,6 +7,8 @@ import ( "strings" "github.com/ipfs/go-path" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" "github.com/ipfs/go-namesys" ) @@ -18,6 +20,8 @@ var ErrNoNamesys = errors.New( // ResolveIPNS resolves /ipns paths func ResolveIPNS(ctx context.Context, nsys namesys.NameSystem, p path.Path) (path.Path, error) { + ctx, span := namesys.StartSpan(ctx, "ResolveIPNS", trace.WithAttributes(attribute.String("Path", p.String()))) + defer span.End() if strings.HasPrefix(p.String(), "/ipns/") { // TODO(cryptix): we should be able to query the local cache for the path if nsys == nil { diff --git a/namesys/routing.go b/namesys/routing.go index 8bdfe21e65..c73e23ed77 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -16,6 +16,8 @@ import ( routing "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" mh "github.com/multiformats/go-multihash" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) var log = logging.Logger("namesys") @@ -38,17 +40,24 @@ func NewIpnsResolver(route routing.ValueStore) *IpnsResolver { // Resolve implements Resolver. func (r *IpnsResolver) Resolve(ctx context.Context, name string, options ...opts.ResolveOpt) (path.Path, error) { + ctx, span := StartSpan(ctx, "IpnsResolver.Resolve", trace.WithAttributes(attribute.String("Name", name))) + defer span.End() return resolve(ctx, r, name, opts.ProcessOpts(options)) } // ResolveAsync implements Resolver. func (r *IpnsResolver) ResolveAsync(ctx context.Context, name string, options ...opts.ResolveOpt) <-chan Result { + ctx, span := StartSpan(ctx, "IpnsResolver.ResolveAsync", trace.WithAttributes(attribute.String("Name", name))) + defer span.End() return resolveAsync(ctx, r, name, opts.ProcessOpts(options)) } // resolveOnce implements resolver. Uses the IPFS routing system to // resolve SFS-like names. func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, options opts.ResolveOpts) <-chan onceResult { + ctx, span := StartSpan(ctx, "IpnsResolver.ResolveOnceAsync", trace.WithAttributes(attribute.String("Name", name))) + defer span.End() + out := make(chan onceResult, 1) log.Debugf("RoutingResolver resolving %s", name) cancel := func() {} @@ -86,6 +95,9 @@ func (r *IpnsResolver) resolveOnceAsync(ctx context.Context, name string, option go func() { defer cancel() defer close(out) + ctx, span := StartSpan(ctx, "IpnsResolver.ResolveOnceAsync.Worker") + defer span.End() + for { select { case val, ok := <-vals: diff --git a/namesys/tracing.go b/namesys/tracing.go new file mode 100644 index 0000000000..4ef84294ae --- /dev/null +++ b/namesys/tracing.go @@ -0,0 +1,13 @@ +package namesys + +import ( + "context" + "fmt" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/trace" +) + +func StartSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { + return otel.Tracer("go-namesys").Start(ctx, fmt.Sprintf("Namesys.%s", name)) +} From aca3a1839f42a590b5fa7ce30e743232c9336023 Mon Sep 17 00:00:00 2001 From: Lucas Molas Date: Thu, 21 Apr 2022 12:41:58 -0300 Subject: [PATCH 3078/3147] refactor(block): CIDv1 and BlockPutSettings CidPrefix (#80) * feat(block options): add store codec * refactor: BlockPutSettings.CidPrefix Removes duplicated fields and replaces them with cid.Prefix Codec, MhType and MhLength were already in prefix, and we already return prefix. A lot of duplicated values and code responsible for syncing them did not really need to exist. * test: CIDv1 raw and dag-pb cases * chore: release 0.7.0 Co-authored-by: Marcin Rataj This commit was moved from ipfs/interface-go-ipfs-core@a3374d99028d96a1ef262b81acb385690eb36f97 --- coreiface/options/block.go | 134 ++++++++++++++++++++++++------------- coreiface/tests/block.go | 103 +++++++++++++++++++++++++--- 2 files changed, 181 insertions(+), 56 deletions(-) diff --git a/coreiface/options/block.go b/coreiface/options/block.go index 043dfdea46..130648682f 100644 --- a/coreiface/options/block.go +++ b/coreiface/options/block.go @@ -2,15 +2,15 @@ package options import ( "fmt" + cid "github.com/ipfs/go-cid" + mc "github.com/multiformats/go-multicodec" mh "github.com/multiformats/go-multihash" ) type BlockPutSettings struct { - Codec string - MhType uint64 - MhLength int - Pin bool + CidPrefix cid.Prefix + Pin bool } type BlockRmSettings struct { @@ -20,53 +20,29 @@ type BlockRmSettings struct { type BlockPutOption func(*BlockPutSettings) error type BlockRmOption func(*BlockRmSettings) error -func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, cid.Prefix, error) { +func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, error) { + var cidPrefix cid.Prefix + + // Baseline is CIDv1 raw sha2-255-32 (can be tweaked later via opts) + cidPrefix.Version = 1 + cidPrefix.Codec = uint64(mc.Raw) + cidPrefix.MhType = mh.SHA2_256 + cidPrefix.MhLength = -1 // -1 means len is to be calculated during mh.Sum() + options := &BlockPutSettings{ - Codec: "", - MhType: mh.SHA2_256, - MhLength: -1, - Pin: false, + CidPrefix: cidPrefix, + Pin: false, } + // Apply any overrides for _, opt := range opts { err := opt(options) if err != nil { - return nil, cid.Prefix{}, err - } - } - - var pref cid.Prefix - pref.Version = 1 - - if options.Codec == "" { - if options.MhType != mh.SHA2_256 || (options.MhLength != -1 && options.MhLength != 32) { - options.Codec = "protobuf" - } else { - options.Codec = "v0" - } - } - - if options.Codec == "v0" && options.MhType == mh.SHA2_256 { - pref.Version = 0 - } - - formatval, ok := cid.Codecs[options.Codec] - if !ok { - return nil, cid.Prefix{}, fmt.Errorf("unrecognized format: %s", options.Codec) - } - - if options.Codec == "v0" { - if options.MhType != mh.SHA2_256 || (options.MhLength != -1 && options.MhLength != 32) { - return nil, cid.Prefix{}, fmt.Errorf("only sha2-255-32 is allowed with CIDv0") + return nil, err } } - pref.Codec = formatval - - pref.MhType = options.MhType - pref.MhLength = options.MhLength - - return options, pref, nil + return options, nil } func BlockRmOptions(opts ...BlockRmOption) (*BlockRmSettings, error) { @@ -87,13 +63,75 @@ type blockOpts struct{} var Block blockOpts -// Format is an option for Block.Put which specifies the multicodec to use to -// serialize the object. Default is "v0" -func (blockOpts) Format(codec string) BlockPutOption { +// CidCodec is the modern option for Block.Put which specifies the multicodec to use +// in the CID returned by the Block.Put operation. +// It uses correct codes from go-multicodec and replaces the old Format now with CIDv1 as the default. +func (blockOpts) CidCodec(codecName string) BlockPutOption { + return func(settings *BlockPutSettings) error { + if codecName == "" { + return nil + } + code, err := codeFromName(codecName) + if err != nil { + return err + } + settings.CidPrefix.Codec = uint64(code) + return nil + } +} + +// Map string to code from go-multicodec +func codeFromName(codecName string) (mc.Code, error) { + var cidCodec mc.Code + err := cidCodec.Set(codecName) + return cidCodec, err +} + +// Format is a legacy option for Block.Put which specifies the multicodec to +// use to serialize the object. +// Provided for backward-compatibility only. Use CidCodec instead. +func (blockOpts) Format(format string) BlockPutOption { return func(settings *BlockPutSettings) error { - settings.Codec = codec + if format == "" { + return nil + } + // Opt-in CIDv0 support for backward-compatibility + if format == "v0" { + settings.CidPrefix.Version = 0 + } + + // Fixup a legacy (invalid) names for dag-pb (0x70) + if format == "v0" || format == "protobuf" { + format = "dag-pb" + } + + // Fixup invalid name for dag-cbor (0x71) + if format == "cbor" { + format = "dag-cbor" + } + + // Set code based on name passed as "format" + code, err := codeFromName(format) + if err != nil { + return err + } + settings.CidPrefix.Codec = uint64(code) + + // If CIDv0, ensure all parameters are compatible + // (in theory go-cid would validate this anyway, but we want to provide better errors) + pref := settings.CidPrefix + if pref.Version == 0 { + if pref.Codec != uint64(mc.DagPb) { + return fmt.Errorf("only dag-pb is allowed with CIDv0") + } + if pref.MhType != mh.SHA2_256 || (pref.MhLength != -1 && pref.MhLength != 32) { + return fmt.Errorf("only sha2-255-32 is allowed with CIDv0") + } + } + return nil } + } // Hash is an option for Block.Put which specifies the multihash settings to use @@ -101,8 +139,8 @@ func (blockOpts) Format(codec string) BlockPutOption { // If mhLen is set to -1, default length for the hash will be used func (blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption { return func(settings *BlockPutSettings) error { - settings.MhType = mhType - settings.MhLength = mhLen + settings.CidPrefix.MhType = mhType + settings.CidPrefix.MhLength = mhLen return nil } } diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 87fa90b650..916e52dd3a 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -17,15 +17,19 @@ import ( ) var ( - pbCid = "QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN" - cborCid = "bafyreicnga62zhxnmnlt6ymq5hcbsg7gdhqdu6z4ehu3wpjhvqnflfy6nm" - cborKCid = "bafyr2qgsohbwdlk7ajmmbb4lhoytmest4wdbe5xnexfvtxeatuyqqmwv3fgxp3pmhpc27gwey2cct56gloqefoqwcf3yqiqzsaqb7p4jefhcw" + pbCidV0 = "QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN" // dag-pb + pbCid = "bafybeiffndsajwhk3lwjewwdxqntmjm4b5wxaaanokonsggenkbw6slwk4" // dag-pb + rawCid = "bafkreiffndsajwhk3lwjewwdxqntmjm4b5wxaaanokonsggenkbw6slwk4" // raw bytes + cborCid = "bafyreicnga62zhxnmnlt6ymq5hcbsg7gdhqdu6z4ehu3wpjhvqnflfy6nm" // dag-cbor + cborKCid = "bafyr2qgsohbwdlk7ajmmbb4lhoytmest4wdbe5xnexfvtxeatuyqqmwv3fgxp3pmhpc27gwey2cct56gloqefoqwcf3yqiqzsaqb7p4jefhcw" // dag-cbor keccak-512 ) +// dag-pb func pbBlock() io.Reader { return bytes.NewReader([]byte{10, 12, 8, 2, 18, 6, 104, 101, 108, 108, 111, 10, 24, 6}) } +// dag-cbor func cborBlock() io.Reader { return bytes.NewReader([]byte{101, 72, 101, 108, 108, 111}) } @@ -38,8 +42,12 @@ func (tp *TestSuite) TestBlock(t *testing.T) { return nil }) - t.Run("TestBlockPut", tp.TestBlockPut) - t.Run("TestBlockPutFormat", tp.TestBlockPutFormat) + t.Run("TestBlockPut (get raw CIDv1)", tp.TestBlockPut) + t.Run("TestBlockPutCidCodec: dag-pb", tp.TestBlockPutCidCodecDagPb) + t.Run("TestBlockPutCidCodec: dag-cbor", tp.TestBlockPutCidCodecDagCbor) + t.Run("TestBlockPutFormat (legacy): cbor → dag-cbor", tp.TestBlockPutFormatDagCbor) + t.Run("TestBlockPutFormat (legacy): protobuf → dag-pb", tp.TestBlockPutFormatDagPb) + t.Run("TestBlockPutFormat (legacy): v0 → CIDv0", tp.TestBlockPutFormatV0) t.Run("TestBlockPutHash", tp.TestBlockPutHash) t.Run("TestBlockGet", tp.TestBlockGet) t.Run("TestBlockRm", tp.TestBlockRm) @@ -47,6 +55,7 @@ func (tp *TestSuite) TestBlock(t *testing.T) { t.Run("TestBlockPin", tp.TestBlockPin) } +// when no opts are passed, produced CID has 'raw' codec func (tp *TestSuite) TestBlockPut(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -60,12 +69,14 @@ func (tp *TestSuite) TestBlockPut(t *testing.T) { t.Fatal(err) } - if res.Path().Cid().String() != pbCid { + if res.Path().Cid().String() != rawCid { t.Errorf("got wrong cid: %s", res.Path().Cid().String()) } } -func (tp *TestSuite) TestBlockPutFormat(t *testing.T) { +// Format is deprecated, it used invalid codec names. +// Confirm 'cbor' gets fixed to 'dag-cbor' +func (tp *TestSuite) TestBlockPutFormatDagCbor(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() api, err := tp.makeAPI(ctx) @@ -83,6 +94,82 @@ func (tp *TestSuite) TestBlockPutFormat(t *testing.T) { } } +// Format is deprecated, it used invalid codec names. +// Confirm 'protobuf' got fixed to 'dag-pb' +func (tp *TestSuite) TestBlockPutFormatDagPb(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + res, err := api.Block().Put(ctx, pbBlock(), opt.Block.Format("protobuf")) + if err != nil { + t.Fatal(err) + } + + if res.Path().Cid().String() != pbCid { + t.Errorf("got wrong cid: %s", res.Path().Cid().String()) + } +} + +// Format is deprecated, it used invalid codec names. +// Confirm fake codec 'v0' got fixed to CIDv0 (with implicit dag-pb codec) +func (tp *TestSuite) TestBlockPutFormatV0(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + res, err := api.Block().Put(ctx, pbBlock(), opt.Block.Format("v0")) + if err != nil { + t.Fatal(err) + } + + if res.Path().Cid().String() != pbCidV0 { + t.Errorf("got wrong cid: %s", res.Path().Cid().String()) + } +} + +func (tp *TestSuite) TestBlockPutCidCodecDagCbor(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + res, err := api.Block().Put(ctx, cborBlock(), opt.Block.CidCodec("dag-cbor")) + if err != nil { + t.Fatal(err) + } + + if res.Path().Cid().String() != cborCid { + t.Errorf("got wrong cid: %s", res.Path().Cid().String()) + } +} + +func (tp *TestSuite) TestBlockPutCidCodecDagPb(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + api, err := tp.makeAPI(ctx) + if err != nil { + t.Fatal(err) + } + + res, err := api.Block().Put(ctx, pbBlock(), opt.Block.CidCodec("dag-pb")) + if err != nil { + t.Fatal(err) + } + + if res.Path().Cid().String() != pbCid { + t.Errorf("got wrong cid: %s", res.Path().Cid().String()) + } +} + func (tp *TestSuite) TestBlockPutHash(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -95,7 +182,7 @@ func (tp *TestSuite) TestBlockPutHash(t *testing.T) { ctx, cborBlock(), opt.Block.Hash(mh.KECCAK_512, -1), - opt.Block.Format("cbor"), + opt.Block.CidCodec("dag-cbor"), ) if err != nil { t.Fatal(err) From a2af87efe6b346aa120c77ce66d27b72394759e4 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Sat, 16 Apr 2022 01:03:52 +0200 Subject: [PATCH 3079/3147] fix: error handling while enumerating pins This commit was moved from ipfs/go-pinning-service-http-client@e0e28d4c7d9538a7c869eeb559d4149844aacb76 --- pinning/remote/client/client.go | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index f4799a74d1..f1bed8af8e 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -153,8 +153,22 @@ func (c *Client) Ls(ctx context.Context, opts ...LsOption) (chan PinStatusGetter } go func() { - defer close(errs) - defer close(res) + defer func() { + if r := recover(); r != nil { + var err error + switch x := r.(type) { + case string: + err = fmt.Errorf("unexpected error while listing remote pins: %s", x) + case error: + err = fmt.Errorf("unexpected error while listing remote pins: %w", x) + default: + err = errors.New("unknown panic while listing remote pins") + } + errs <- err + } + close(errs) + close(res) + }() for { pinRes, err := c.lsInternal(ctx, settings) @@ -173,11 +187,19 @@ func (c *Client) Ls(ctx context.Context, opts ...LsOption) (chan PinStatusGetter } } - if int(pinRes.Count) == len(results) { + batchSize := len(results) + if int(pinRes.Count) == batchSize { + // no more batches + return + } + + // Better DX/UX for cases like https://github.com/application-research/estuary/issues/124 + if batchSize == 0 && int(pinRes.Count) != 0 { + errs <- fmt.Errorf("invalid pinning service response: PinResults.count=%d but no PinResults.results", int(pinRes.Count)) return } - oldestResult := pinRes.Results[len(pinRes.Results)-1] + oldestResult := results[batchSize-1] settings.before = &oldestResult.Created } }() From 043eed1b7bfb2d4068fd5eb380de9b0961f29ea0 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Wed, 27 Apr 2022 17:11:38 +0200 Subject: [PATCH 3080/3147] fix: CIDv1 error with go-libp2p 0.19 (#32) The error message changed in libp2p and we no longer get this nice error message. String matching is a bad practice so just removing it, as we validate CID and codec already. This commit was moved from ipfs/go-namesys@605965e675aa7758ef32c4b5cd8ae856738fe77c --- namesys/namesys.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 51b5e70967..6dfad0b716 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -202,12 +202,12 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. // CIDs in IPNS are expected to have libp2p-key multicodec // We ease the transition by returning a more meaningful error with a valid CID - if err != nil && err.Error() == "can't convert CID of type protobuf to a peer ID" { + if err != nil { ipnsCid, cidErr := cid.Decode(key) if cidErr == nil && ipnsCid.Version() == 1 && ipnsCid.Type() != cid.Libp2pKey { fixedCid := cid.NewCidV1(cid.Libp2pKey, ipnsCid.Hash()).String() codecErr := fmt.Errorf("peer ID represented as CIDv1 require libp2p-key multicodec: retry with /ipns/%s", fixedCid) - log.Debugf("RoutingResolver: could not convert public key hash %s to peer ID: %s\n", key, codecErr) + log.Debugf("RoutingResolver: could not convert public key hash %q to peer ID: %s\n", key, codecErr) out <- onceResult{err: codecErr} close(out) return out From 435dbbc3d260f4a6db82063967d95788e7dfab45 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 4 May 2022 11:33:03 +0100 Subject: [PATCH 3081/3147] feat: add basic tracing This commit was moved from ipfs/go-blockservice@4c0ba0c53bbde606dad4e1b5e4156f9561658d01 --- blockservice/blockservice.go | 25 ++++++++++++++++++++++++- blockservice/internal/tracing.go | 13 +++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 blockservice/internal/tracing.go diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 4249f54c2e..007d1131c1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -8,7 +8,11 @@ import ( "io" "sync" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-blockservice/internal" cid "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" @@ -129,6 +133,9 @@ func NewSession(ctx context.Context, bs BlockService) *Session { // AddBlock adds a particular block to the service, Putting it into the datastore. // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { + ctx, span := internal.StartSpan(ctx, "blockService.AddBlock") + defer span.End() + c := o.Cid() // hash security err := verifcid.ValidateCid(c) @@ -157,6 +164,9 @@ func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { } func (s *blockService) AddBlocks(ctx context.Context, bs []blocks.Block) error { + ctx, span := internal.StartSpan(ctx, "blockService.AddBlocks") + defer span.End() + // hash security for _, b := range bs { err := verifcid.ValidateCid(b.Cid()) @@ -203,7 +213,8 @@ func (s *blockService) AddBlocks(ctx context.Context, bs []blocks.Block) error { // GetBlock retrieves a particular block from the service, // Getting it from the datastore using the key (hash). func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { - logger.Debugf("BlockService GetBlock: '%s'", c) + ctx, span := internal.StartSpan(ctx, "blockService.GetBlock", trace.WithAttributes(attribute.Stringer("CID", c))) + defer span.End() var f func() exchange.Fetcher if s.exchange != nil { @@ -250,6 +261,9 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun // the returned channel. // NB: No guarantees are made about order. func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { + ctx, span := internal.StartSpan(ctx, "blockService.GetBlocks") + defer span.End() + var f func() exchange.Fetcher if s.exchange != nil { f = s.getExchange @@ -324,6 +338,9 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget // DeleteBlock deletes a block in the blockservice from the datastore func (s *blockService) DeleteBlock(ctx context.Context, c cid.Cid) error { + ctx, span := internal.StartSpan(ctx, "blockService.DeleteBlock", trace.WithAttributes(attribute.Stringer("CID", c))) + defer span.End() + err := s.blockstore.DeleteBlock(ctx, c) if err == nil { logger.Debugf("BlockService.BlockDeleted %s", c) @@ -357,6 +374,9 @@ func (s *Session) getSession() exchange.Fetcher { // GetBlock gets a block in the context of a request session func (s *Session) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) { + ctx, span := internal.StartSpan(ctx, "Session.GetBlock", trace.WithAttributes(attribute.Stringer("CID", c))) + defer span.End() + var f func() exchange.Fetcher if s.sessEx != nil { f = s.getSession @@ -366,6 +386,9 @@ func (s *Session) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) // GetBlocks gets blocks in the context of a request session func (s *Session) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Block { + ctx, span := internal.StartSpan(ctx, "Session.GetBlocks") + defer span.End() + var f func() exchange.Fetcher if s.sessEx != nil { f = s.getSession diff --git a/blockservice/internal/tracing.go b/blockservice/internal/tracing.go new file mode 100644 index 0000000000..96a61ff423 --- /dev/null +++ b/blockservice/internal/tracing.go @@ -0,0 +1,13 @@ +package internal + +import ( + "context" + "fmt" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/trace" +) + +func StartSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { + return otel.Tracer("go-blockservice").Start(ctx, fmt.Sprintf("Blockservice.%s", name), opts...) +} From 80f06e2c953103b30e8c09ccacf3a458de866c94 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 4 May 2022 11:47:06 +0100 Subject: [PATCH 3082/3147] feat: add basic tracing This commit was moved from ipfs/go-path@33dbd0ef83599fff9f2a4ccf65d4b3074f68d04a --- path/internal/tracing.go | 13 +++++++++++++ path/resolver/resolver.go | 24 +++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 path/internal/tracing.go diff --git a/path/internal/tracing.go b/path/internal/tracing.go new file mode 100644 index 0000000000..f9eda2f92c --- /dev/null +++ b/path/internal/tracing.go @@ -0,0 +1,13 @@ +package internal + +import ( + "context" + "fmt" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/trace" +) + +func StartSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { + return otel.Tracer("go-path").Start(ctx, fmt.Sprintf("Path.%s", name), opts...) +} diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 64778c1cab..5a1d3f870d 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -7,18 +7,20 @@ import ( "fmt" "time" - "github.com/ipld/go-ipld-prime/schema" - - path "github.com/ipfs/go-path" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" cid "github.com/ipfs/go-cid" "github.com/ipfs/go-fetcher" fetcherhelpers "github.com/ipfs/go-fetcher/helpers" format "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + path "github.com/ipfs/go-path" + "github.com/ipfs/go-path/internal" "github.com/ipld/go-ipld-prime" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/ipld/go-ipld-prime/schema" "github.com/ipld/go-ipld-prime/traversal/selector/builder" ) @@ -77,6 +79,9 @@ func NewBasicResolver(fetcherFactory fetcher.Factory) Resolver { // block referenced by the path, and the path segments to traverse from the // final block boundary to the final node within the block. func (r *basicResolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { + ctx, span := internal.StartSpan(ctx, "basicResolver.ResolveToLastNode", trace.WithAttributes(attribute.Stringer("Path", fpath))) + defer span.End() + c, p, err := path.SplitAbsPath(fpath) if err != nil { return cid.Cid{}, nil, err @@ -143,6 +148,9 @@ func (r *basicResolver) ResolveToLastNode(ctx context.Context, fpath path.Path) // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. func (r *basicResolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, ipld.Link, error) { + ctx, span := internal.StartSpan(ctx, "basicResolver.ResolvePath", trace.WithAttributes(attribute.Stringer("Path", fpath))) + defer span.End() + // validate path if err := fpath.IsValid(); err != nil { return nil, nil, err @@ -170,6 +178,8 @@ func (r *basicResolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld. // extra context (does not opaquely resolve through sharded nodes) // Deprecated: fetch node as ipld-prime or convert it and then use a selector to traverse through it. func ResolveSingle(ctx context.Context, ds format.NodeGetter, nd format.Node, names []string) (*format.Link, []string, error) { + ctx, span := internal.StartSpan(ctx, "ResolveSingle", trace.WithAttributes(attribute.Stringer("CID", nd.Cid()))) + defer span.End() return nd.ResolveLink(names) } @@ -180,6 +190,9 @@ func ResolveSingle(ctx context.Context, ds format.NodeGetter, nd format.Node, na // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. func (r *basicResolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { + ctx, span := internal.StartSpan(ctx, "basicResolver.ResolvePathComponents", trace.WithAttributes(attribute.Stringer("Path", fpath))) + defer span.End() + //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolvePathComponents", logging.LoggableMap{"fpath": fpath}) defer evt.Done() @@ -218,6 +231,9 @@ func (r *basicResolver) ResolvePathComponents(ctx context.Context, fpath path.Pa // Note: if/when the context is cancelled or expires then if a multi-block ADL node is returned then it may not be // possible to load certain values. func (r *basicResolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { + ctx, span := internal.StartSpan(ctx, "basicResolver.ResolveLinks") + defer span.End() + //lint:ignore SA1019 TODO: replace EventBegin evt := log.EventBegin(ctx, "resolveLinks", logging.LoggableMap{"names": names}) defer evt.Done() @@ -244,6 +260,8 @@ func (r *basicResolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names [ // Finds nodes matching the selector starting with a cid. Returns the matched nodes, the cid of the block containing // the last node, and the depth of the last node within its block (root is depth 0). func (r *basicResolver) resolveNodes(ctx context.Context, c cid.Cid, sel ipld.Node) ([]ipld.Node, cid.Cid, int, error) { + ctx, span := internal.StartSpan(ctx, "basicResolver.resolveNodes", trace.WithAttributes(attribute.Stringer("CID", c))) + defer span.End() session := r.FetcherFactory.NewSession(ctx) // traverse selector From 0bf8c2a0b2c64871ba6213be635e963a959a0d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Sat, 7 May 2022 00:04:33 +0200 Subject: [PATCH 3083/3147] feat: fast-path for PutMany, falling back to Put for single block call (#97) This commit was moved from ipfs/go-ipfs-blockstore@e4da93c569b737ab9f40ccf8c11a4e7dd2eebdba --- blockstore/blockstore.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 61cb780f89..509e678f55 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -178,6 +178,11 @@ func (bs *blockstore) Put(ctx context.Context, block blocks.Block) error { } func (bs *blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { + if len(blocks) == 1 { + // performance fast-path + return bs.Put(ctx, blocks[0]) + } + t, err := bs.datastore.Batch(ctx) if err != nil { return err From 9b58e529e5ce1e00314d983c2c7a6e6612bbe959 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 12 May 2022 14:08:55 +0100 Subject: [PATCH 3084/3147] Remove unused context This commit was moved from ipfs/go-path@6c040f7024577a6bc9e55066dc607ec9c607e34d --- path/resolver/resolver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index 5a1d3f870d..ba7e1a2c1d 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -178,7 +178,7 @@ func (r *basicResolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld. // extra context (does not opaquely resolve through sharded nodes) // Deprecated: fetch node as ipld-prime or convert it and then use a selector to traverse through it. func ResolveSingle(ctx context.Context, ds format.NodeGetter, nd format.Node, names []string) (*format.Link, []string, error) { - ctx, span := internal.StartSpan(ctx, "ResolveSingle", trace.WithAttributes(attribute.Stringer("CID", nd.Cid()))) + _, span := internal.StartSpan(ctx, "ResolveSingle", trace.WithAttributes(attribute.Stringer("CID", nd.Cid()))) defer span.End() return nd.ResolveLink(names) } From 9194b97973b73f0fdc8064c02a5115234af7c6e8 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 15 Jun 2022 20:00:49 +0200 Subject: [PATCH 3085/3147] Make switchToSharding more efficient When automatically switching a BasicDirectory to a HAMTDirectory because it grew too big, the current code: * loops every link in the BasicDirectory * reads each node referenced by those links * adds the nodes to a new HAMTDirectory shard, which in turn: * writes the nodes to the DAG service (they were just read from there!) * makes a link out of them (identical to the link in the BasicDirectory!) This would happen to about (~4000 nodes), which are fully read and written for nothing. This PR adds a new SetLink method to the HAMT Shard which, instead of taking an ipld.Node like Set(), takes directly an ipld.Link. Then it updates switchToSharding() to pass the links in the BasicDirectory directy, rather than reading all the nodes. Note that switchToBasic() works like this already, only using the links in the HAMT directory. This commit was moved from ipfs/go-unixfs@e0ef9c44e92cab793bdf321ac1531ceff418fd5f --- unixfs/hamt/hamt.go | 20 ++++++++++++++++++++ unixfs/io/directory.go | 7 +------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index ac1c5e4584..593b64627d 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -229,6 +229,26 @@ func (ds *Shard) Set(ctx context.Context, name string, nd ipld.Node) error { return err } +// Set sets 'name' = nd in the HAMT, using directly the information in the +// given link. This avoids writing the given node, then reading it to making a +// link out of it. +func (ds *Shard) SetLink(ctx context.Context, name string, lnk *ipld.Link) error { + hv := newHashBits(name) + + newLink := ipld.Link{ + Name: lnk.Name, + Size: lnk.Size, + Cid: lnk.Cid, + } + + // FIXME: We don't need to set the name here, it will get overwritten. + // This is confusing, confirm and remove this line. + newLink.Name = ds.linkNamePrefix(0) + name + + _, err := ds.swapValue(ctx, hv, name, &newLink) + return err +} + // Swap sets a link pointing to the passed node as the value under the // name key in this Shard or its children. It also returns the previous link // under that name key (if any). diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index 2ec8622479..b602bf9ab6 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -334,12 +334,7 @@ func (d *BasicDirectory) switchToSharding(ctx context.Context) (*HAMTDirectory, hamtDir.shard = shard for _, lnk := range d.node.Links() { - node, err := d.dserv.Get(ctx, lnk.Cid) - if err != nil { - return nil, err - } - - err = hamtDir.shard.Set(ctx, lnk.Name, node) + err = hamtDir.shard.SetLink(ctx, lnk.Name, lnk) if err != nil { return nil, err } From 9abb6939f634a72024c77e12953015d69d67f1a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 13 Jul 2022 15:55:37 +0200 Subject: [PATCH 3086/3147] Rename HasBlock to NotifyNewBlocks, and make it accept multiple blocks The goal here is twofold: - allows for batched handling of multiple blocks at once - act as a noisy signal for the breaking change that Bitswap is not adding blocks in the blockstore itself anymore (see https://github.com/ipfs/go-bitswap/pull/571) This commit was moved from ipfs/go-ipfs-exchange-interface@1786a28c67d2a28f623e87c95d78f5ae054169e1 --- exchange/interface.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 7640c57333..0d98750b56 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -13,9 +13,8 @@ import ( type Interface interface { // type Exchanger interface Fetcher - // TODO Should callers be concerned with whether the block was made - // available on the network? - HasBlock(context.Context, blocks.Block) error + // NotifyNewBlocks tells the exchange that new blocks are available and can be served. + NotifyNewBlocks(ctx context.Context, blocks ...blocks.Block) error IsOnline() bool From 1b9178f9538b24947ab602e20ee143aa4dc2236c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 13 Jul 2022 16:28:04 +0200 Subject: [PATCH 3087/3147] remove IsOnline() as it's not used anywhere This commit was moved from ipfs/go-ipfs-exchange-interface@1181846dc171626f47c736bf66f031264fb755e1 --- exchange/interface.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/exchange/interface.go b/exchange/interface.go index 0d98750b56..2c04628e31 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -16,8 +16,6 @@ type Interface interface { // type Exchanger interface // NotifyNewBlocks tells the exchange that new blocks are available and can be served. NotifyNewBlocks(ctx context.Context, blocks ...blocks.Block) error - IsOnline() bool - io.Closer } From 2fac27e7caa0981cae4dab06a14ec57dbc25f774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Fri, 8 Jul 2022 18:53:22 +0200 Subject: [PATCH 3088/3147] write blocks retrieved from the exchange to the blockstore This follows the change in bitswap where that responsibility was removed. This commit was moved from ipfs/go-blockservice@4a60416c7b617009b95b917e1ef6b9a4ed1bb086 --- blockservice/blockservice.go | 60 ++++++++++++++++++++------ blockservice/blockservice_test.go | 71 ++++++++++++++++++++++++++++--- 2 files changed, 113 insertions(+), 18 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 007d1131c1..134de222bd 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -12,13 +12,14 @@ import ( "go.opentelemetry.io/otel/trace" blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-blockservice/internal" cid "github.com/ipfs/go-cid" blockstore "github.com/ipfs/go-ipfs-blockstore" exchange "github.com/ipfs/go-ipfs-exchange-interface" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log/v2" "github.com/ipfs/go-verifcid" + + "github.com/ipfs/go-blockservice/internal" ) var logger = logging.Logger("blockservice") @@ -84,7 +85,7 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) BlockService { } } -// NewWriteThrough ceates a BlockService that guarantees writes will go +// NewWriteThrough creates a BlockService that guarantees writes will go // through to the blockstore and are not skipped by cache checks. func NewWriteThrough(bs blockstore.Blockstore, rem exchange.Interface) BlockService { if rem == nil { @@ -131,7 +132,6 @@ func NewSession(ctx context.Context, bs BlockService) *Session { } // AddBlock adds a particular block to the service, Putting it into the datastore. -// TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { ctx, span := internal.StartSpan(ctx, "blockService.AddBlock") defer span.End() @@ -155,8 +155,8 @@ func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { logger.Debugf("BlockService.BlockAdded %s", c) if s.exchange != nil { - if err := s.exchange.HasBlock(ctx, o); err != nil { - logger.Errorf("HasBlock: %s", err.Error()) + if err := s.exchange.NotifyNewBlocks(ctx, o); err != nil { + logger.Errorf("NotifyNewBlocks: %s", err.Error()) } } @@ -200,11 +200,9 @@ func (s *blockService) AddBlocks(ctx context.Context, bs []blocks.Block) error { } if s.exchange != nil { - for _, o := range toput { - logger.Debugf("BlockService.BlockAdded %s", o.Cid()) - if err := s.exchange.HasBlock(ctx, o); err != nil { - logger.Errorf("HasBlock: %s", err.Error()) - } + logger.Debugf("BlockService.BlockAdded %d blocks", len(toput)) + if err := s.exchange.NotifyNewBlocks(ctx, toput...); err != nil { + logger.Errorf("NotifyNewBlocks: %s", err.Error()) } } return nil @@ -249,6 +247,11 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun if err != nil { return nil, err } + // also write in the blockstore for caching + err = bs.Put(ctx, blk) + if err != nil { + return nil, err + } logger.Debugf("BlockService.BlockFetched %s", c) return blk, nil } @@ -325,12 +328,43 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget } for b := range rblocks { + // batch available blocks together + batch := make([]blocks.Block, 0, 8) + batch = append(batch, b) logger.Debugf("BlockService.BlockFetched %s", b.Cid()) - select { - case out <- b: - case <-ctx.Done(): + + batchLoop: + for { + select { + case moreBlock, ok := <-rblocks: + if !ok { + // rblock has been closed, we set it to nil to avoid pulling zero values + rblocks = nil + } else { + logger.Debugf("BlockService.BlockFetched %s", moreBlock.Cid()) + batch = append(batch, moreBlock) + } + case <-ctx.Done(): + return + default: + break batchLoop + } + } + + // also write in the blockstore for caching + err = bs.PutMany(ctx, batch) + if err != nil { + logger.Errorf("could not write blocks from the network to the blockstore: %s", err) return } + + for _, b = range batch { + select { + case out <- b: + case <-ctx.Done(): + return + } + } } }() return out diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index c29f0cfc50..5753d3a9d4 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -5,6 +5,7 @@ import ( "testing" blocks "github.com/ipfs/go-block-format" + cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" blockstore "github.com/ipfs/go-ipfs-blockstore" @@ -19,8 +20,8 @@ func TestWriteThroughWorks(t *testing.T) { blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())), 0, } - bstore2 := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) - exch := offline.Exchange(bstore2) + exchbstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + exch := offline.Exchange(exchbstore) bserv := NewWriteThrough(bstore, exch) bgen := butil.NewBlockGenerator() @@ -44,6 +45,57 @@ func TestWriteThroughWorks(t *testing.T) { } } +func TestExchangeWrite(t *testing.T) { + bstore := &PutCountingBlockstore{ + blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())), + 0, + } + exchbstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) + exch := offline.Exchange(exchbstore) + bserv := NewWriteThrough(bstore, exch) + bgen := butil.NewBlockGenerator() + + // GetBlock + block := bgen.Next() + err := exchbstore.Put(context.Background(), block) + if err != nil { + t.Fatal(err) + } + got, err := bserv.GetBlock(context.Background(), block.Cid()) + if err != nil { + t.Fatal(err) + } + if got.Cid() != block.Cid() { + t.Fatalf("GetBlock returned unexpected block") + } + if bstore.PutCounter != 1 { + t.Fatalf("expected one Put call, have: %d", bstore.PutCounter) + } + + // GetBlocks + b1 := bgen.Next() + err = exchbstore.Put(context.Background(), b1) + if err != nil { + t.Fatal(err) + } + b2 := bgen.Next() + err = exchbstore.Put(context.Background(), b2) + if err != nil { + t.Fatal(err) + } + bchan := bserv.GetBlocks(context.Background(), []cid.Cid{b1.Cid(), b2.Cid()}) + var gotBlocks []blocks.Block + for b := range bchan { + gotBlocks = append(gotBlocks, b) + } + if len(gotBlocks) != 2 { + t.Fatalf("expected to retrieve 2 blocks, got %d", len(gotBlocks)) + } + if bstore.PutCounter != 3 { + t.Fatalf("expected 3 Put call, have: %d", bstore.PutCounter) + } +} + func TestLazySessionInitialization(t *testing.T) { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) @@ -53,8 +105,8 @@ func TestLazySessionInitialization(t *testing.T) { bstore2 := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) bstore3 := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) session := offline.Exchange(bstore2) - exchange := offline.Exchange(bstore3) - sessionExch := &fakeSessionExchange{Interface: exchange, session: session} + exch := offline.Exchange(bstore3) + sessionExch := &fakeSessionExchange{Interface: exch, session: session} bservSessEx := NewWriteThrough(bstore, sessionExch) bgen := butil.NewBlockGenerator() @@ -64,7 +116,11 @@ func TestLazySessionInitialization(t *testing.T) { t.Fatal(err) } block2 := bgen.Next() - err = session.HasBlock(ctx, block2) + err = bstore2.Put(ctx, block2) + if err != nil { + t.Fatal(err) + } + err = session.NotifyNewBlocks(ctx, block2) if err != nil { t.Fatal(err) } @@ -107,6 +163,11 @@ func (bs *PutCountingBlockstore) Put(ctx context.Context, block blocks.Block) er return bs.Blockstore.Put(ctx, block) } +func (bs *PutCountingBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { + bs.PutCounter += len(blocks) + return bs.Blockstore.PutMany(ctx, blocks) +} + var _ exchange.SessionExchange = (*fakeSessionExchange)(nil) type fakeSessionExchange struct { From 931b05363833d5de3b64e86a6c75f5c6cf5e7fd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Thu, 14 Jul 2022 12:27:39 +0200 Subject: [PATCH 3089/3147] Exchange don't add blocks on their own anymore Follows: - https://github.com/ipfs/go-ipfs-exchange-interface/pull/23 - https://github.com/ipfs/go-bitswap/pull/571 This commit was moved from ipfs/go-ipfs-exchange-offline@678648ad69e71cacaee5caff28ce179f5aa96bfa --- exchange/offline/offline.go | 11 ++++------- exchange/offline/offline_test.go | 16 ++++++++++------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/exchange/offline/offline.go b/exchange/offline/offline.go index 7c5d7c5ea8..430a8d7445 100644 --- a/exchange/offline/offline.go +++ b/exchange/offline/offline.go @@ -34,9 +34,10 @@ func (e *offlineExchange) GetBlock(ctx context.Context, k cid.Cid) (blocks.Block return blk, err } -// HasBlock always returns nil. -func (e *offlineExchange) HasBlock(ctx context.Context, b blocks.Block) error { - return e.bs.Put(ctx, b) +// NotifyNewBlocks tells the exchange that new blocks are available and can be served. +func (e *offlineExchange) NotifyNewBlocks(ctx context.Context, blocks ...blocks.Block) error { + // as an offline exchange we have nothing to do + return nil } // Close always returns nil. @@ -71,7 +72,3 @@ func (e *offlineExchange) GetBlocks(ctx context.Context, ks []cid.Cid) (<-chan b }() return out, nil } - -func (e *offlineExchange) IsOnline() bool { - return false -} diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index 0ac95a6b66..e329372b71 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -28,13 +28,14 @@ func TestHasBlockReturnsNil(t *testing.T) { ex := Exchange(store) block := blocks.NewBlock([]byte("data")) - err := ex.HasBlock(context.Background(), block) - if err != nil { - t.Fail() + // we don't need to do that for the test, but that illustrate the normal workflow + if err := store.Put(context.Background(), block); err != nil { + t.Fatal(err) } - if _, err := store.Get(context.Background(), block.Cid()); err != nil { - t.Fatal(err) + err := ex.NotifyNewBlocks(context.Background(), block) + if err != nil { + t.Fail() } } @@ -46,7 +47,10 @@ func TestGetBlocks(t *testing.T) { expected := g.Blocks(2) for _, b := range expected { - if err := ex.HasBlock(context.Background(), b); err != nil { + if err := store.Put(context.Background(), b); err != nil { + t.Fatal(err) + } + if err := ex.NotifyNewBlocks(context.Background(), b); err != nil { t.Fail() } } From b739af18ef85e7c9c667be9b4d620a3d2484bc76 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Wed, 27 Jul 2022 17:23:20 +0200 Subject: [PATCH 3090/3147] test: remove TestHasBlockReturnsNil The function body is just ```go return nil ``` And it's testing that this code returns nil. Pointless This commit was moved from ipfs/go-ipfs-exchange-offline@cdbe3d1b96514186d529dad54f95557b28e2fb2e --- exchange/offline/offline_test.go | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/exchange/offline/offline_test.go b/exchange/offline/offline_test.go index e329372b71..07ac1d0014 100644 --- a/exchange/offline/offline_test.go +++ b/exchange/offline/offline_test.go @@ -4,7 +4,6 @@ import ( "context" "testing" - blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" ds_sync "github.com/ipfs/go-datastore/sync" @@ -23,22 +22,6 @@ func TestBlockReturnsErr(t *testing.T) { t.Fail() } -func TestHasBlockReturnsNil(t *testing.T) { - store := bstore() - ex := Exchange(store) - block := blocks.NewBlock([]byte("data")) - - // we don't need to do that for the test, but that illustrate the normal workflow - if err := store.Put(context.Background(), block); err != nil { - t.Fatal(err) - } - - err := ex.NotifyNewBlocks(context.Background(), block) - if err != nil { - t.Fail() - } -} - func TestGetBlocks(t *testing.T) { store := bstore() ex := Exchange(store) From 8ee16bb46719f767ee357b1d7bd66207d5225bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 27 Jul 2022 19:21:20 +0200 Subject: [PATCH 3091/3147] blockservice should notify the exchange when caching blocks in GetBlock(s) This commit was moved from ipfs/go-blockservice@f2a4f4f21dfc5f9ff7d4abb3c1f96368fa707600 --- blockservice/blockservice.go | 33 ++++++--- blockservice/blockservice_test.go | 110 +++++++++++++++++++----------- 2 files changed, 93 insertions(+), 50 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 134de222bd..015f81a060 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -214,7 +214,7 @@ func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, e ctx, span := internal.StartSpan(ctx, "blockService.GetBlock", trace.WithAttributes(attribute.Stringer("CID", c))) defer span.End() - var f func() exchange.Fetcher + var f func() exchange.Interface if s.exchange != nil { f = s.getExchange } @@ -222,11 +222,11 @@ func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, e return getBlock(ctx, c, s.blockstore, f) // hash security } -func (s *blockService) getExchange() exchange.Fetcher { +func (s *blockService) getExchange() exchange.Interface { return s.exchange } -func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) (blocks.Block, error) { +func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() exchange.Interface) (blocks.Block, error) { err := verifcid.ValidateCid(c) // hash security if err != nil { return nil, err @@ -247,11 +247,15 @@ func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget fun if err != nil { return nil, err } - // also write in the blockstore for caching + // also write in the blockstore for caching, inform the exchange that the block is available err = bs.Put(ctx, blk) if err != nil { return nil, err } + err = f.NotifyNewBlocks(ctx, blk) + if err != nil { + return nil, err + } logger.Debugf("BlockService.BlockFetched %s", c) return blk, nil } @@ -267,7 +271,7 @@ func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan block ctx, span := internal.StartSpan(ctx, "blockService.GetBlocks") defer span.End() - var f func() exchange.Fetcher + var f func() exchange.Interface if s.exchange != nil { f = s.getExchange } @@ -275,7 +279,7 @@ func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan block return getBlocks(ctx, ks, s.blockstore, f) // hash security } -func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) <-chan blocks.Block { +func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func() exchange.Interface) <-chan blocks.Block { out := make(chan blocks.Block) go func() { @@ -351,13 +355,19 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget } } - // also write in the blockstore for caching + // also write in the blockstore for caching, inform the exchange that the blocks are available err = bs.PutMany(ctx, batch) if err != nil { logger.Errorf("could not write blocks from the network to the blockstore: %s", err) return } + err = f.NotifyNewBlocks(ctx, batch...) + if err != nil { + logger.Errorf("could not tell the exchange about new blocks: %s", err) + return + } + for _, b = range batch { select { case out <- b: @@ -396,14 +406,15 @@ type Session struct { lk sync.Mutex } -func (s *Session) getSession() exchange.Fetcher { +func (s *Session) getSession() exchange.Interface { s.lk.Lock() defer s.lk.Unlock() if s.ses == nil { s.ses = s.sessEx.NewSession(s.sessCtx) } - return s.ses + // TODO: don't do that + return s.ses.(exchange.Interface) } // GetBlock gets a block in the context of a request session @@ -411,7 +422,7 @@ func (s *Session) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) ctx, span := internal.StartSpan(ctx, "Session.GetBlock", trace.WithAttributes(attribute.Stringer("CID", c))) defer span.End() - var f func() exchange.Fetcher + var f func() exchange.Interface if s.sessEx != nil { f = s.getSession } @@ -423,7 +434,7 @@ func (s *Session) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Blo ctx, span := internal.StartSpan(ctx, "Session.GetBlocks") defer span.End() - var f func() exchange.Fetcher + var f func() exchange.Interface if s.sessEx != nil { f = s.getSession } diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index 5753d3a9d4..846ae71695 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -51,48 +51,68 @@ func TestExchangeWrite(t *testing.T) { 0, } exchbstore := blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) - exch := offline.Exchange(exchbstore) + exch := ¬ifyCountingExchange{ + offline.Exchange(exchbstore), + 0, + } bserv := NewWriteThrough(bstore, exch) bgen := butil.NewBlockGenerator() - // GetBlock - block := bgen.Next() - err := exchbstore.Put(context.Background(), block) - if err != nil { - t.Fatal(err) - } - got, err := bserv.GetBlock(context.Background(), block.Cid()) - if err != nil { - t.Fatal(err) - } - if got.Cid() != block.Cid() { - t.Fatalf("GetBlock returned unexpected block") - } - if bstore.PutCounter != 1 { - t.Fatalf("expected one Put call, have: %d", bstore.PutCounter) - } - - // GetBlocks - b1 := bgen.Next() - err = exchbstore.Put(context.Background(), b1) - if err != nil { - t.Fatal(err) - } - b2 := bgen.Next() - err = exchbstore.Put(context.Background(), b2) - if err != nil { - t.Fatal(err) - } - bchan := bserv.GetBlocks(context.Background(), []cid.Cid{b1.Cid(), b2.Cid()}) - var gotBlocks []blocks.Block - for b := range bchan { - gotBlocks = append(gotBlocks, b) - } - if len(gotBlocks) != 2 { - t.Fatalf("expected to retrieve 2 blocks, got %d", len(gotBlocks)) - } - if bstore.PutCounter != 3 { - t.Fatalf("expected 3 Put call, have: %d", bstore.PutCounter) + for name, fetcher := range map[string]BlockGetter{ + "blockservice": bserv, + "session": NewSession(context.Background(), bserv), + } { + t.Run(name, func(t *testing.T) { + // GetBlock + block := bgen.Next() + err := exchbstore.Put(context.Background(), block) + if err != nil { + t.Fatal(err) + } + got, err := fetcher.GetBlock(context.Background(), block.Cid()) + if err != nil { + t.Fatal(err) + } + if got.Cid() != block.Cid() { + t.Fatalf("GetBlock returned unexpected block") + } + if bstore.PutCounter != 1 { + t.Fatalf("expected one Put call, have: %d", bstore.PutCounter) + } + if exch.notifyCount != 1 { + t.Fatalf("expected one NotifyNewBlocks call, have: %d", exch.notifyCount) + } + + // GetBlocks + b1 := bgen.Next() + err = exchbstore.Put(context.Background(), b1) + if err != nil { + t.Fatal(err) + } + b2 := bgen.Next() + err = exchbstore.Put(context.Background(), b2) + if err != nil { + t.Fatal(err) + } + bchan := fetcher.GetBlocks(context.Background(), []cid.Cid{b1.Cid(), b2.Cid()}) + var gotBlocks []blocks.Block + for b := range bchan { + gotBlocks = append(gotBlocks, b) + } + if len(gotBlocks) != 2 { + t.Fatalf("expected to retrieve 2 blocks, got %d", len(gotBlocks)) + } + if bstore.PutCounter != 3 { + t.Fatalf("expected 3 Put call, have: %d", bstore.PutCounter) + } + if exch.notifyCount != 3 { + t.Fatalf("expected one NotifyNewBlocks call, have: %d", exch.notifyCount) + } + + // reset counts + bstore.PutCounter = 0 + exch.notifyCount = 0 + }) } } @@ -168,6 +188,18 @@ func (bs *PutCountingBlockstore) PutMany(ctx context.Context, blocks []blocks.Bl return bs.Blockstore.PutMany(ctx, blocks) } +var _ exchange.Interface = (*notifyCountingExchange)(nil) + +type notifyCountingExchange struct { + exchange.Interface + notifyCount int +} + +func (n *notifyCountingExchange) NotifyNewBlocks(ctx context.Context, blocks ...blocks.Block) error { + n.notifyCount += len(blocks) + return n.Interface.NotifyNewBlocks(ctx, blocks...) +} + var _ exchange.SessionExchange = (*fakeSessionExchange)(nil) type fakeSessionExchange struct { From 620a34f5e1f01e3fd7bf89d48c8ce01d92822a08 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Wed, 27 Jul 2022 22:01:37 +0200 Subject: [PATCH 3092/3147] fix: correctly fallback to non session exchanges with sessions. This commit was moved from ipfs/go-blockservice@c72dade75a0ec8b9a719ed80dada29bdde114f42 --- blockservice/blockservice.go | 83 +++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 015f81a060..b86f2ebbb8 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -118,16 +118,18 @@ func NewSession(ctx context.Context, bs BlockService) *Session { exch := bs.Exchange() if sessEx, ok := exch.(exchange.SessionExchange); ok { return &Session{ - sessCtx: ctx, - ses: nil, - sessEx: sessEx, - bs: bs.Blockstore(), + sessCtx: ctx, + ses: nil, + sessEx: sessEx, + bs: bs.Blockstore(), + notifier: exch, } } return &Session{ - ses: exch, - sessCtx: ctx, - bs: bs.Blockstore(), + ses: exch, + sessCtx: ctx, + bs: bs.Blockstore(), + notifier: exch, } } @@ -214,7 +216,7 @@ func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, e ctx, span := internal.StartSpan(ctx, "blockService.GetBlock", trace.WithAttributes(attribute.Stringer("CID", c))) defer span.End() - var f func() exchange.Interface + var f func() notifiableFetcher if s.exchange != nil { f = s.getExchange } @@ -222,11 +224,11 @@ func (s *blockService) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, e return getBlock(ctx, c, s.blockstore, f) // hash security } -func (s *blockService) getExchange() exchange.Interface { +func (s *blockService) getExchange() notifiableFetcher { return s.exchange } -func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() exchange.Interface) (blocks.Block, error) { +func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() notifiableFetcher) (blocks.Block, error) { err := verifcid.ValidateCid(c) // hash security if err != nil { return nil, err @@ -271,7 +273,7 @@ func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan block ctx, span := internal.StartSpan(ctx, "blockService.GetBlocks") defer span.End() - var f func() exchange.Interface + var f func() notifiableFetcher if s.exchange != nil { f = s.getExchange } @@ -279,7 +281,7 @@ func (s *blockService) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan block return getBlocks(ctx, ks, s.blockstore, f) // hash security } -func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func() exchange.Interface) <-chan blocks.Block { +func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget func() notifiableFetcher) <-chan blocks.Block { out := make(chan blocks.Block) go func() { @@ -397,24 +399,53 @@ func (s *blockService) Close() error { return s.exchange.Close() } +type notifier interface { + NotifyNewBlocks(context.Context, ...blocks.Block) error +} + // Session is a helper type to provide higher level access to bitswap sessions type Session struct { - bs blockstore.Blockstore - ses exchange.Fetcher - sessEx exchange.SessionExchange - sessCtx context.Context - lk sync.Mutex + bs blockstore.Blockstore + ses exchange.Fetcher + sessEx exchange.SessionExchange + sessCtx context.Context + notifier notifier + lk sync.Mutex } -func (s *Session) getSession() exchange.Interface { +type notifiableFetcher interface { + exchange.Fetcher + notifier +} + +type notifiableFetcherWrapper struct { + exchange.Fetcher + notifier +} + +func (s *Session) getSession() notifiableFetcher { s.lk.Lock() defer s.lk.Unlock() if s.ses == nil { s.ses = s.sessEx.NewSession(s.sessCtx) } - // TODO: don't do that - return s.ses.(exchange.Interface) + return notifiableFetcherWrapper{s.ses, s.notifier} +} + +func (s *Session) getExchange() notifiableFetcher { + return notifiableFetcherWrapper{s.ses, s.notifier} +} + +func (s *Session) getFetcherFactory() func() notifiableFetcher { + if s.sessEx != nil { + return s.getSession + } + if s.ses != nil { + // Our exchange isn't session compatible, let's fallback to non sessions fetches + return s.getExchange + } + return nil } // GetBlock gets a block in the context of a request session @@ -422,11 +453,7 @@ func (s *Session) GetBlock(ctx context.Context, c cid.Cid) (blocks.Block, error) ctx, span := internal.StartSpan(ctx, "Session.GetBlock", trace.WithAttributes(attribute.Stringer("CID", c))) defer span.End() - var f func() exchange.Interface - if s.sessEx != nil { - f = s.getSession - } - return getBlock(ctx, c, s.bs, f) // hash security + return getBlock(ctx, c, s.bs, s.getFetcherFactory()) // hash security } // GetBlocks gets blocks in the context of a request session @@ -434,11 +461,7 @@ func (s *Session) GetBlocks(ctx context.Context, ks []cid.Cid) <-chan blocks.Blo ctx, span := internal.StartSpan(ctx, "Session.GetBlocks") defer span.End() - var f func() exchange.Interface - if s.sessEx != nil { - f = s.getSession - } - return getBlocks(ctx, ks, s.bs, f) // hash security + return getBlocks(ctx, ks, s.bs, s.getFetcherFactory()) // hash security } var _ BlockGetter = (*Session)(nil) From 00087bb91924e9ce5944e164cccb9cb575be5613 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Thu, 28 Jul 2022 05:14:06 +0200 Subject: [PATCH 3093/3147] refactor: rewrite getBlocks batch loop to be clearer This commit was moved from ipfs/go-blockservice@30ca6aad09fdc64f3cda352c3a2a52468df7ceb1 --- blockservice/blockservice.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index b86f2ebbb8..8594e253a1 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -333,23 +333,22 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget return } - for b := range rblocks { - // batch available blocks together - batch := make([]blocks.Block, 0, 8) - batch = append(batch, b) - logger.Debugf("BlockService.BlockFetched %s", b.Cid()) - + // batch available blocks together + const batchSize = 32 + batch := make([]blocks.Block, 0, batchSize) + for { + var noMoreBlocks bool batchLoop: - for { + for len(batch) < batchSize { select { - case moreBlock, ok := <-rblocks: + case b, ok := <-rblocks: if !ok { - // rblock has been closed, we set it to nil to avoid pulling zero values - rblocks = nil - } else { - logger.Debugf("BlockService.BlockFetched %s", moreBlock.Cid()) - batch = append(batch, moreBlock) + noMoreBlocks = true + break batchLoop } + + logger.Debugf("BlockService.BlockFetched %s", b.Cid()) + batch = append(batch, b) case <-ctx.Done(): return default: @@ -370,13 +369,17 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget return } - for _, b = range batch { + for _, b := range batch { select { case out <- b: case <-ctx.Done(): return } } + batch = batch[:0] + if noMoreBlocks { + break + } } }() return out From 89bd5ed0e52937d443c00d802dfe5f22fe7d9bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Fri, 5 Aug 2022 19:55:21 +0200 Subject: [PATCH 3094/3147] docs: Add proper documenation to the interface. This commit was moved from ipfs/go-ipfs-exchange-interface@7604dcd563e1eda7f15bd4bbbfbec4fad67c9ac1 --- exchange/interface.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/exchange/interface.go b/exchange/interface.go index 2c04628e31..3ae174d5c3 100644 --- a/exchange/interface.go +++ b/exchange/interface.go @@ -21,8 +21,11 @@ type Interface interface { // type Exchanger interface // Fetcher is an object that can be used to retrieve blocks type Fetcher interface { - // GetBlock returns the block associated with a given key. + // GetBlock returns the block associated with a given cid. GetBlock(context.Context, cid.Cid) (blocks.Block, error) + // GetBlocks returns the blocks associated with the given cids. + // If the requested blocks are not found immediately, this function should hang until + // they are found. If they can't be found later, it's also acceptable to terminate. GetBlocks(context.Context, []cid.Cid) (<-chan blocks.Block, error) } @@ -30,5 +33,8 @@ type Fetcher interface { // sessions. type SessionExchange interface { Interface + // NewSession generates a new exchange session. You should use this, rather + // that calling GetBlocks, any time you intend to do several related calls + // in a row. The exchange can leverage that to be more efficient. NewSession(context.Context) Fetcher } From 912fc33114889cd525c7c401b277acba3607e78c Mon Sep 17 00:00:00 2001 From: Claudia Richoux Date: Thu, 30 Jun 2022 16:06:22 -0400 Subject: [PATCH 3095/3147] feat: add blake3 as a good hash This include fixing versions, adding tests, restraining blake3 to 20 <= x <= 128 bytes of length, improving error messages, fixing deprecation warnings. This commit was moved from ipfs/go-verifcid@71377ec686e3333895ca71bdbf85e829ddcc73b4 --- verifcid/validate.go | 14 ++++++++++---- verifcid/validate_test.go | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/verifcid/validate.go b/verifcid/validate.go index 8a76e4933e..e594629f4b 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -2,15 +2,16 @@ package verifcid import ( "fmt" - cid "github.com/ipfs/go-cid" mh "github.com/multiformats/go-multihash" ) var ErrPossiblyInsecureHashFunction = fmt.Errorf("potentially insecure hash functions not allowed") -var ErrBelowMinimumHashLength = fmt.Errorf("hashes must be at %d least bytes long", minimumHashLength) +var ErrBelowMinimumHashLength = fmt.Errorf("hashes must be at least %d bytes long", minimumHashLength) +var ErrAboveMaximumHashLength = fmt.Errorf("hashes must be at most %d bytes long", maximumHashLength) const minimumHashLength = 20 +const maximumHashLength = 128 var goodset = map[uint64]bool{ mh.SHA2_256: true, @@ -25,7 +26,8 @@ var goodset = map[uint64]bool{ mh.KECCAK_256: true, mh.KECCAK_384: true, mh.KECCAK_512: true, - mh.ID: true, + mh.BLAKE3: true, + mh.IDENTITY: true, mh.SHA1: true, // not really secure but still useful } @@ -54,9 +56,13 @@ func ValidateCid(c cid.Cid) error { return ErrPossiblyInsecureHashFunction } - if pref.MhType != mh.ID && pref.MhLength < minimumHashLength { + if pref.MhType != mh.IDENTITY && pref.MhLength < minimumHashLength { return ErrBelowMinimumHashLength } + if pref.MhType != mh.IDENTITY && pref.MhLength > maximumHashLength { + return ErrAboveMaximumHashLength + } + return nil } diff --git a/verifcid/validate_test.go b/verifcid/validate_test.go index 1d31e54648..5129b861af 100644 --- a/verifcid/validate_test.go +++ b/verifcid/validate_test.go @@ -35,7 +35,7 @@ func TestValidateCids(t *testing.T) { mhcid := func(code uint64, length int) cid.Cid { mhash, err := mh.Sum([]byte{}, code, length) if err != nil { - t.Fatal(err) + t.Fatalf("%v: code: %x length: %d", err, code, length) } return cid.NewCidV1(cid.DagCBOR, mhash) } @@ -46,7 +46,10 @@ func TestValidateCids(t *testing.T) { }{ {mhcid(mh.SHA2_256, 32), nil}, {mhcid(mh.SHA2_256, 16), ErrBelowMinimumHashLength}, - {mhcid(mh.MURMUR3, 4), ErrPossiblyInsecureHashFunction}, + {mhcid(mh.MURMUR3X64_64, 4), ErrPossiblyInsecureHashFunction}, + {mhcid(mh.BLAKE3, 32), nil}, + {mhcid(mh.BLAKE3, 69), nil}, + {mhcid(mh.BLAKE3, 128), nil}, } for i, cas := range cases { @@ -56,4 +59,12 @@ func TestValidateCids(t *testing.T) { } } + longBlake3Hex := "1e810104e0bb39f30b1a3feb89f536c93be15055482df748674b00d26e5a75777702e9791074b7511b59d31c71c62f5a745689fa6c9497f68bdf1061fe07f518d410c0b0c27f41b3cf083f8a7fdc67a877e21790515762a754a45dcb8a356722698a7af5ed2bb608983d5aa75d4d61691ef132efe8631ce0afc15553a08fffc60ee9369b" + longBlake3Mh, err := mh.FromHexString(longBlake3Hex) + if err != nil { + t.Fatalf("failed to produce a multihash from the long blake3 hash: %v", err) + } + if ValidateCid(cid.NewCidV1(cid.DagCBOR, longBlake3Mh)) != ErrAboveMaximumHashLength { + t.Errorf("a CID that was longer than the maximum hash length did not error with ErrAboveMaximumHashLength") + } } From 0f23770ba4b900470ac98c832b64f6087c33e353 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 19 Aug 2022 17:06:46 +0300 Subject: [PATCH 3096/3147] use peer.IDFromBytes instead of peer.IDFromString (#38) This commit was moved from ipfs/go-ipns@0d8e99ba180a607c39a3a1f4a787aba188489f70 --- ipns/record.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipns/record.go b/ipns/record.go index cd2ec3cdd3..43750bf3b7 100644 --- a/ipns/record.go +++ b/ipns/record.go @@ -6,10 +6,10 @@ import ( pb "github.com/ipfs/go-ipns/pb" - proto "github.com/gogo/protobuf/proto" + "github.com/gogo/protobuf/proto" logging "github.com/ipfs/go-log" ic "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peer" pstore "github.com/libp2p/go-libp2p-core/peerstore" record "github.com/libp2p/go-libp2p-record" ) @@ -46,7 +46,7 @@ func (v Validator) Validate(key string, value []byte) error { } // Get the public key defined by the ipns path - pid, err := peer.IDFromString(pidString) + pid, err := peer.IDFromBytes([]byte(pidString)) if err != nil { log.Debugf("failed to parse ipns record key %s into peer ID", pidString) return ErrKeyFormat From 1b8377b58d915a538afce6617d60ac901da615c6 Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Tue, 23 Aug 2022 18:50:03 +0200 Subject: [PATCH 3097/3147] sync: update CI config files (#105) This commit was moved from ipfs/go-ipfs-blockstore@9904c18f1d0af576cdd27bbc825a920e14a71b9e --- blockstore/arc_cache.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blockstore/arc_cache.go b/blockstore/arc_cache.go index 2733dfc37e..ba8ecbb637 100644 --- a/blockstore/arc_cache.go +++ b/blockstore/arc_cache.go @@ -366,9 +366,9 @@ func (b *arccache) cacheInvalidate(key string) { // queryCache checks if the CID is in the cache. If so, it returns: // -// * exists (bool): whether the CID is known to exist or not. -// * size (int): the size if cached, or -1 if not cached. -// * ok (bool): whether present in the cache. +// - exists (bool): whether the CID is known to exist or not. +// - size (int): the size if cached, or -1 if not cached. +// - ok (bool): whether present in the cache. // // When ok is false, the answer in inconclusive and the caller must ignore the // other two return values. Querying the underying store is necessary. From 3cb06eb87f657b119bcaa7c49049cc541d801e2c Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Tue, 23 Aug 2022 18:52:01 +0200 Subject: [PATCH 3098/3147] sync: update CI config files (#34) This commit was moved from ipfs/go-ipfs-routing@bf0374f99212a07b1a33f92cb7e341a2e2a8061b --- routing/none/none_client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 9604ab07c1..2ba1a8f8f9 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -53,5 +53,5 @@ func ConstructNilRouting(_ context.Context, _ host.Host, _ ds.Batching, _ record return &nilclient{}, nil } -// ensure nilclient satisfies interface +// ensure nilclient satisfies interface var _ routing.Routing = &nilclient{} From 5cfe8e6e48cfb6c80c5322260b033c1b48ced66f Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Tue, 23 Aug 2022 18:52:25 +0200 Subject: [PATCH 3099/3147] sync: update CI config files (#60) This commit was moved from ipfs/go-path@34ee0e38d040b22a4baf20740af45e43c8a5d50e --- path/path.go | 8 ++++---- path/resolver/resolver.go | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/path/path.go b/path/path.go index f49dde1106..e70d963844 100644 --- a/path/path.go +++ b/path/path.go @@ -10,10 +10,10 @@ import ( ) // A Path represents an ipfs content path: -// * /path/to/file -// * /ipfs/ -// * /ipns//path/to/folder -// * etc +// - /path/to/file +// - /ipfs/ +// - /ipns//path/to/folder +// - etc type Path string // ^^^ diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index ba7e1a2c1d..74c5b27ed1 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -63,7 +63,8 @@ type Resolver interface { // basicResolver implements the Resolver interface. // It references a FetcherFactory, which is uses to resolve nodes. // TODO: now that this is more modular, try to unify this code with the -// the resolvers in namesys. +// +// the resolvers in namesys. type basicResolver struct { FetcherFactory fetcher.Factory } From b180aa18693c06de87594f3a36e489c962c33d04 Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Tue, 23 Aug 2022 18:53:02 +0200 Subject: [PATCH 3100/3147] sync: update CI config files (#39) This commit was moved from ipfs/go-ipfs-chunker@7d123e096f645cc95d8fe48365e1d17b0336a005 --- chunker/buzhash_norace_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/chunker/buzhash_norace_test.go b/chunker/buzhash_norace_test.go index 7d1d03d6d4..50dc0e5ce2 100644 --- a/chunker/buzhash_norace_test.go +++ b/chunker/buzhash_norace_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package chunk From ea6ac8cb6aa02f6cd88cb141f3f077e206277829 Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Thu, 25 Aug 2022 15:07:58 +0200 Subject: [PATCH 3101/3147] sync: update CI config files (#87) This commit was moved from ipfs/interface-go-ipfs-core@de3410bbe2bbdbf50e090a06eda0f741cad5381c --- coreiface/block.go | 3 ++- coreiface/dht.go | 1 + coreiface/key.go | 1 + coreiface/name.go | 1 + coreiface/object.go | 3 ++- coreiface/options/key.go | 2 +- coreiface/options/name.go | 1 - coreiface/options/pin.go | 40 +++++++++++++++++++-------------------- coreiface/path/path.go | 2 +- coreiface/pin.go | 1 + coreiface/tests/block.go | 5 ++--- coreiface/tests/dag.go | 3 ++- coreiface/tests/object.go | 10 +++++----- coreiface/tests/pin.go | 2 +- coreiface/tests/pubsub.go | 2 +- coreiface/tests/unixfs.go | 9 ++++----- coreiface/unixfs.go | 3 ++- 17 files changed, 47 insertions(+), 42 deletions(-) diff --git a/coreiface/block.go b/coreiface/block.go index b105b079df..49ffe75d72 100644 --- a/coreiface/block.go +++ b/coreiface/block.go @@ -2,9 +2,10 @@ package iface import ( "context" - path "github.com/ipfs/interface-go-ipfs-core/path" "io" + path "github.com/ipfs/interface-go-ipfs-core/path" + "github.com/ipfs/interface-go-ipfs-core/options" ) diff --git a/coreiface/dht.go b/coreiface/dht.go index 5f49e74a35..81a20ee2b6 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -2,6 +2,7 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" diff --git a/coreiface/key.go b/coreiface/key.go index db729b3b41..9672556656 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -2,6 +2,7 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" diff --git a/coreiface/name.go b/coreiface/name.go index 3dc9f68783..d2725e028b 100644 --- a/coreiface/name.go +++ b/coreiface/name.go @@ -3,6 +3,7 @@ package iface import ( "context" "errors" + path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" diff --git a/coreiface/object.go b/coreiface/object.go index 86536d4210..733dc2beef 100644 --- a/coreiface/object.go +++ b/coreiface/object.go @@ -2,9 +2,10 @@ package iface import ( "context" - path "github.com/ipfs/interface-go-ipfs-core/path" "io" + path "github.com/ipfs/interface-go-ipfs-core/path" + "github.com/ipfs/interface-go-ipfs-core/options" "github.com/ipfs/go-cid" diff --git a/coreiface/options/key.go b/coreiface/options/key.go index 80beea3529..4bc53a65fe 100644 --- a/coreiface/options/key.go +++ b/coreiface/options/key.go @@ -69,7 +69,7 @@ func (keyOpts) Type(algorithm string) KeyGenerateOption { // generated. Default is -1 // // value of -1 means 'use default size for key type': -// * 2048 for RSA +// - 2048 for RSA func (keyOpts) Size(size int) KeyGenerateOption { return func(settings *KeyGenerateSettings) error { settings.Size = size diff --git a/coreiface/options/name.go b/coreiface/options/name.go index 59aaf2ca36..aa80828632 100644 --- a/coreiface/options/name.go +++ b/coreiface/options/name.go @@ -113,7 +113,6 @@ func (nameOpts) Cache(cache bool) NameResolveOption { } } -// func (nameOpts) ResolveOption(opt ropts.ResolveOpt) NameResolveOption { return func(settings *NameResolveSettings) error { settings.ResolveOpts = append(settings.ResolveOpts, opt) diff --git a/coreiface/options/pin.go b/coreiface/options/pin.go index 5014a2d2b1..75c2b8a263 100644 --- a/coreiface/options/pin.go +++ b/coreiface/options/pin.go @@ -164,11 +164,11 @@ func (pinLsOpts) Indirect() PinLsOption { // type. // // Supported values: -// * "direct" - directly pinned objects -// * "recursive" - roots of recursive pins -// * "indirect" - indirectly pinned objects (referenced by recursively pinned -// objects) -// * "all" - all pinned objects (default) +// - "direct" - directly pinned objects +// - "recursive" - roots of recursive pins +// - "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// - "all" - all pinned objects (default) func (pinLsOpts) Type(typeStr string) (PinLsOption, error) { switch typeStr { case "all", "direct", "indirect", "recursive": @@ -182,11 +182,11 @@ func (pinLsOpts) Type(typeStr string) (PinLsOption, error) { // be returned // // Supported values: -// * "direct" - directly pinned objects -// * "recursive" - roots of recursive pins -// * "indirect" - indirectly pinned objects (referenced by recursively pinned -// objects) -// * "all" - all pinned objects (default) +// - "direct" - directly pinned objects +// - "recursive" - roots of recursive pins +// - "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// - "all" - all pinned objects (default) func (pinLsOpts) pinType(t string) PinLsOption { return func(settings *PinLsSettings) error { settings.Type = t @@ -224,11 +224,11 @@ func (pinIsPinnedOpts) Indirect() PinIsPinnedOption { // type. // // Supported values: -// * "direct" - directly pinned objects -// * "recursive" - roots of recursive pins -// * "indirect" - indirectly pinned objects (referenced by recursively pinned -// objects) -// * "all" - all pinned objects (default) +// - "direct" - directly pinned objects +// - "recursive" - roots of recursive pins +// - "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// - "all" - all pinned objects (default) func (pinIsPinnedOpts) Type(typeStr string) (PinIsPinnedOption, error) { switch typeStr { case "all", "direct", "indirect", "recursive": @@ -242,11 +242,11 @@ func (pinIsPinnedOpts) Type(typeStr string) (PinIsPinnedOption, error) { // pin is expected to be, speeding up the research. // // Supported values: -// * "direct" - directly pinned objects -// * "recursive" - roots of recursive pins -// * "indirect" - indirectly pinned objects (referenced by recursively pinned -// objects) -// * "all" - all pinned objects (default) +// - "direct" - directly pinned objects +// - "recursive" - roots of recursive pins +// - "indirect" - indirectly pinned objects (referenced by recursively pinned +// objects) +// - "all" - all pinned objects (default) func (pinIsPinnedOpts) pinType(t string) PinIsPinnedOption { return func(settings *PinIsPinnedSettings) error { settings.WithType = t diff --git a/coreiface/path/path.go b/coreiface/path/path.go index 01b1673b1d..e2562936d4 100644 --- a/coreiface/path/path.go +++ b/coreiface/path/path.go @@ -15,7 +15,7 @@ import ( // * /ipfs - Immutable unixfs path (files) // * /ipld - Immutable ipld path (data) // * /ipns - Mutable names. Usually resolves to one of the immutable paths -//TODO: /local (MFS) +// TODO: /local (MFS) type Path interface { // String returns the path as a string. String() string diff --git a/coreiface/pin.go b/coreiface/pin.go index 4c1788c682..6205a9b209 100644 --- a/coreiface/pin.go +++ b/coreiface/pin.go @@ -2,6 +2,7 @@ package iface import ( "context" + path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" diff --git a/coreiface/tests/block.go b/coreiface/tests/block.go index 916e52dd3a..a819699164 100644 --- a/coreiface/tests/block.go +++ b/coreiface/tests/block.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "io" - "io/ioutil" "strings" "testing" @@ -211,7 +210,7 @@ func (tp *TestSuite) TestBlockGet(t *testing.T) { t.Fatal(err) } - d, err := ioutil.ReadAll(r) + d, err := io.ReadAll(r) if err != nil { t.Fatal(err) } @@ -249,7 +248,7 @@ func (tp *TestSuite) TestBlockRm(t *testing.T) { t.Fatal(err) } - d, err := ioutil.ReadAll(r) + d, err := io.ReadAll(r) if err != nil { t.Fatal(err) } diff --git a/coreiface/tests/dag.go b/coreiface/tests/dag.go index 6f9d9659e1..5ea0d3eb12 100644 --- a/coreiface/tests/dag.go +++ b/coreiface/tests/dag.go @@ -2,12 +2,13 @@ package tests import ( "context" - path "github.com/ipfs/interface-go-ipfs-core/path" "math" gopath "path" "strings" "testing" + path "github.com/ipfs/interface-go-ipfs-core/path" + coreiface "github.com/ipfs/interface-go-ipfs-core" ipldcbor "github.com/ipfs/go-ipld-cbor" diff --git a/coreiface/tests/object.go b/coreiface/tests/object.go index e8ab1a7f4b..c3437853c5 100644 --- a/coreiface/tests/object.go +++ b/coreiface/tests/object.go @@ -4,11 +4,11 @@ import ( "bytes" "context" "encoding/hex" - "io/ioutil" + "io" "strings" "testing" - "github.com/ipfs/interface-go-ipfs-core" + iface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" ) @@ -143,7 +143,7 @@ func (tp *TestSuite) TestObjectData(t *testing.T) { t.Fatal(err) } - data, err := ioutil.ReadAll(r) + data, err := io.ReadAll(r) if err != nil { t.Fatal(err) } @@ -383,7 +383,7 @@ func (tp *TestSuite) TestObjectAddData(t *testing.T) { t.Fatal(err) } - data, err := ioutil.ReadAll(r) + data, err := io.ReadAll(r) if err != nil { t.Fatal(err) } @@ -416,7 +416,7 @@ func (tp *TestSuite) TestObjectSetData(t *testing.T) { t.Fatal(err) } - data, err := ioutil.ReadAll(r) + data, err := io.ReadAll(r) if err != nil { t.Fatal(err) } diff --git a/coreiface/tests/pin.go b/coreiface/tests/pin.go index d378d1015c..ad1a0fdd21 100644 --- a/coreiface/tests/pin.go +++ b/coreiface/tests/pin.go @@ -6,7 +6,7 @@ import ( "strings" "testing" - "github.com/ipfs/interface-go-ipfs-core" + iface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" "github.com/ipfs/interface-go-ipfs-core/path" diff --git a/coreiface/tests/pubsub.go b/coreiface/tests/pubsub.go index f8339f2283..18da2103d1 100644 --- a/coreiface/tests/pubsub.go +++ b/coreiface/tests/pubsub.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/ipfs/interface-go-ipfs-core" + iface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" ) diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index f47d34d0a5..05226dbbf0 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -6,7 +6,6 @@ import ( "encoding/hex" "fmt" "io" - "io/ioutil" "math" "math/rand" "os" @@ -113,7 +112,7 @@ func (tp *TestSuite) TestAdd(t *testing.T) { return path.IpfsPath(c) } - rf, err := ioutil.TempFile(os.TempDir(), "unixfs-add-real") + rf, err := os.CreateTemp(os.TempDir(), "unixfs-add-real") if err != nil { t.Fatal(err) } @@ -134,7 +133,7 @@ func (tp *TestSuite) TestAdd(t *testing.T) { defer os.Remove(rfp) realFile := func() files.Node { - n, err := files.NewReaderPathFile(rfp, ioutil.NopCloser(strings.NewReader(helloStr)), stat) + n, err := files.NewReaderPathFile(rfp, io.NopCloser(strings.NewReader(helloStr)), stat) if err != nil { t.Fatal(err) } @@ -474,12 +473,12 @@ func (tp *TestSuite) TestAdd(t *testing.T) { defer orig.Close() defer got.Close() - do, err := ioutil.ReadAll(orig.(files.File)) + do, err := io.ReadAll(orig.(files.File)) if err != nil { t.Fatal(err) } - dg, err := ioutil.ReadAll(got.(files.File)) + dg, err := io.ReadAll(got.(files.File)) if err != nil { t.Fatal(err) } diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index 686c402987..c398b67223 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -2,11 +2,12 @@ package iface import ( "context" + "github.com/ipfs/interface-go-ipfs-core/options" path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/go-cid" - "github.com/ipfs/go-ipfs-files" + files "github.com/ipfs/go-ipfs-files" ) type AddEvent struct { From c5d4aa055b7b5f76a69644436e150593fa2842df Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Fri, 26 Aug 2022 12:34:06 +0200 Subject: [PATCH 3102/3147] sync: update CI config files (#125) This commit was moved from ipfs/go-unixfs@2c23c3ea6fae3ef1b487cfc0c606a4ffc7893676 --- unixfs/hamt/hamt.go | 16 +- unixfs/importer/balanced/balanced_test.go | 11 +- unixfs/importer/balanced/builder.go | 176 +++++++++++----------- unixfs/importer/helpers/helpers.go | 19 +-- unixfs/importer/importer_test.go | 7 +- unixfs/importer/trickle/trickle_test.go | 25 ++- unixfs/io/completehamt_test.go | 22 +-- unixfs/io/dagreader_test.go | 5 +- unixfs/mod/dagmodifier_test.go | 15 +- unixfs/pb/unixfs.pb.go | 3 +- unixfs/test/utils.go | 3 +- unixfs/unixfs.go | 6 +- 12 files changed, 155 insertions(+), 153 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index 593b64627d..d9947770ff 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -9,8 +9,10 @@ // wikipedia article is the collapsing of empty shards. // Given the following tree: ( '[' = shards, '{' = values ) // [ 'A' ] -> [ 'B' ] -> { "ABC" } -// | L-> { "ABD" } -// L-> { "ASDF" } +// +// | L-> { "ABD" } +// L-> { "ASDF" } +// // If we simply removed "ABC", we would end up with a tree where shard 'B' only // has a single child. This causes two issues, the first, is that now we have // an extra lookup required to get to "ABD". The second issue is that now we @@ -460,11 +462,11 @@ func (ds *Shard) walkChildren(processLinkValues func(formattedLink *ipld.Link) e // parallelShardWalk is quite similar to the DAG walking algorithm from https://github.com/ipfs/go-merkledag/blob/594e515f162e764183243b72c2ba84f743424c8c/merkledag.go#L464 // However, there are a few notable differences: -// 1. Some children are actualized Shard structs and some are in the blockstore, this will leverage walking over the in memory Shards as well as the stored blocks -// 2. Instead of just passing each child into the worker pool by itself we group them so that we can leverage optimizations from GetMany. -// This optimization also makes the walk a little more biased towards depth (as opposed to BFS) in the earlier part of the DAG. -// This is particularly helpful for operations like estimating the directory size which should complete quickly when possible. -// 3. None of the extra options from that package are needed +// 1. Some children are actualized Shard structs and some are in the blockstore, this will leverage walking over the in memory Shards as well as the stored blocks +// 2. Instead of just passing each child into the worker pool by itself we group them so that we can leverage optimizations from GetMany. +// This optimization also makes the walk a little more biased towards depth (as opposed to BFS) in the earlier part of the DAG. +// This is particularly helpful for operations like estimating the directory size which should complete quickly when possible. +// 3. None of the extra options from that package are needed func parallelShardWalk(ctx context.Context, root *Shard, dserv ipld.DAGService, processShardValues func(formattedLink *ipld.Link) error) error { const concurrency = 32 diff --git a/unixfs/importer/balanced/balanced_test.go b/unixfs/importer/balanced/balanced_test.go index b2069e3a93..bfb348ed9b 100644 --- a/unixfs/importer/balanced/balanced_test.go +++ b/unixfs/importer/balanced/balanced_test.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "io/ioutil" mrand "math/rand" "testing" @@ -53,7 +52,7 @@ func getTestDag(t *testing.T, ds ipld.DAGService, size int64, blksize int64) (*d return nd, data } -//Test where calls to read are smaller than the chunk size +// Test where calls to read are smaller than the chunk size func TestSizeBasedSplit(t *testing.T) { if testing.Short() { t.SkipNow() @@ -119,7 +118,7 @@ func arrComp(a, b []byte) error { } func dagrArrComp(t *testing.T, r io.Reader, should []byte) { - out, err := ioutil.ReadAll(r) + out, err := io.ReadAll(r) if err != nil { t.Fatal(err) } @@ -138,7 +137,7 @@ func TestIndirectBlocks(t *testing.T) { t.Fatal(err) } - out, err := ioutil.ReadAll(reader) + out, err := io.ReadAll(reader) if err != nil { t.Fatal(err) } @@ -179,7 +178,7 @@ func TestSeekToBegin(t *testing.T) { t.Fatal(err) } - n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + n, err := io.CopyN(io.Discard, rs, 1024*4) if err != nil { t.Fatal(err) } @@ -207,7 +206,7 @@ func TestSeekToAlmostBegin(t *testing.T) { t.Fatal(err) } - n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + n, err := io.CopyN(io.Discard, rs, 1024*4) if err != nil { t.Fatal(err) } diff --git a/unixfs/importer/balanced/builder.go b/unixfs/importer/balanced/builder.go index 407117dad1..3379e97655 100644 --- a/unixfs/importer/balanced/builder.go +++ b/unixfs/importer/balanced/builder.go @@ -17,36 +17,37 @@ // that the UnixFS node. // // Notes: -// 1. In the implementation. `FSNodeOverDag` structure is used for representing -// the UnixFS node encoded inside the DAG node. -// (see https://github.com/ipfs/go-ipfs/pull/5118.) -// 2. `TFile` is used for backwards-compatibility. It was a bug causing the leaf -// nodes to be generated with this type instead of `TRaw`. The former one -// should be used (like the trickle builder does). -// (See https://github.com/ipfs/go-ipfs/pull/5120.) // -// +-------------+ -// | Root 4 | -// +-------------+ -// | -// +--------------------------+----------------------------+ -// | | -// +-------------+ +-------------+ -// | Node 2 | | Node 5 | -// +-------------+ +-------------+ -// | | -// +-------------+-------------+ +-------------+ -// | | | -// +-------------+ +-------------+ +-------------+ -// | Node 1 | | Node 3 | | Node 6 | -// +-------------+ +-------------+ +-------------+ -// | | | -// +------+------+ +------+------+ +------+ -// | | | | | -// +=========+ +=========+ +=========+ +=========+ +=========+ -// | Chunk 1 | | Chunk 2 | | Chunk 3 | | Chunk 4 | | Chunk 5 | -// +=========+ +=========+ +=========+ +=========+ +=========+ +// 1. In the implementation. `FSNodeOverDag` structure is used for representing +// the UnixFS node encoded inside the DAG node. +// (see https://github.com/ipfs/go-ipfs/pull/5118.) // +// 2. `TFile` is used for backwards-compatibility. It was a bug causing the leaf +// nodes to be generated with this type instead of `TRaw`. The former one +// should be used (like the trickle builder does). +// (See https://github.com/ipfs/go-ipfs/pull/5120.) +// +// +-------------+ +// | Root 4 | +// +-------------+ +// | +// +--------------------------+----------------------------+ +// | | +// +-------------+ +-------------+ +// | Node 2 | | Node 5 | +// +-------------+ +-------------+ +// | | +// +-------------+-------------+ +-------------+ +// | | | +// +-------------+ +-------------+ +-------------+ +// | Node 1 | | Node 3 | | Node 6 | +// +-------------+ +-------------+ +-------------+ +// | | | +// +------+------+ +------+------+ +------+ +// | | | | | +// +=========+ +=========+ +=========+ +=========+ +=========+ +// | Chunk 1 | | Chunk 2 | | Chunk 3 | | Chunk 4 | | Chunk 5 | +// +=========+ +=========+ +=========+ +=========+ +=========+ package balanced import ( @@ -80,55 +81,54 @@ import ( // offset in the file the graph represents: each internal node uses the file size // of its children as an index when seeking. // -// `Layout` creates a root and hands it off to be filled: -// -// +-------------+ -// | Root 1 | -// +-------------+ -// | -// ( fillNodeRec fills in the ) -// ( chunks on the root. ) -// | -// +------+------+ -// | | -// + - - - - + + - - - - + -// | Chunk 1 | | Chunk 2 | -// + - - - - + + - - - - + +// `Layout` creates a root and hands it off to be filled: // -// ↓ -// When the root is full but there's more data... -// ↓ +// +-------------+ +// | Root 1 | +// +-------------+ +// | +// ( fillNodeRec fills in the ) +// ( chunks on the root. ) +// | +// +------+------+ +// | | +// + - - - - + + - - - - + +// | Chunk 1 | | Chunk 2 | +// + - - - - + + - - - - + // -// +-------------+ -// | Root 1 | -// +-------------+ -// | -// +------+------+ -// | | -// +=========+ +=========+ + - - - - + -// | Chunk 1 | | Chunk 2 | | Chunk 3 | -// +=========+ +=========+ + - - - - + +// ↓ +// When the root is full but there's more data... +// ↓ // -// ↓ -// ...Layout's job is to create a new root. -// ↓ +// +-------------+ +// | Root 1 | +// +-------------+ +// | +// +------+------+ +// | | +// +=========+ +=========+ + - - - - + +// | Chunk 1 | | Chunk 2 | | Chunk 3 | +// +=========+ +=========+ + - - - - + // -// +-------------+ -// | Root 2 | -// +-------------+ -// | -// +-------------+ - - - - - - - - + -// | | -// +-------------+ ( fillNodeRec creates the ) -// | Node 1 | ( branch that connects ) -// +-------------+ ( "Root 2" to "Chunk 3." ) -// | | -// +------+------+ + - - - - -+ -// | | | -// +=========+ +=========+ + - - - - + -// | Chunk 1 | | Chunk 2 | | Chunk 3 | -// +=========+ +=========+ + - - - - + +// ↓ +// ...Layout's job is to create a new root. +// ↓ // +// +-------------+ +// | Root 2 | +// +-------------+ +// | +// +-------------+ - - - - - - - - + +// | | +// +-------------+ ( fillNodeRec creates the ) +// | Node 1 | ( branch that connects ) +// +-------------+ ( "Root 2" to "Chunk 3." ) +// | | +// +------+------+ + - - - - -+ +// | | | +// +=========+ +=========+ + - - - - + +// | Chunk 1 | | Chunk 2 | | Chunk 3 | +// +=========+ +=========+ + - - - - + func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { if db.Done() { // No data, return just an empty node. @@ -185,22 +185,22 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { // root, and those children will in turn be filled (calling `fillNodeRec` // recursively). // -// +-------------+ -// | `node` | -// | (new root) | -// +-------------+ -// | -// +-------------+ - - - - - - + - - - - - - - - - - - + -// | | | -// +--------------+ + - - - - - + + - - - - - + -// | (old root) | | new child | | | -// +--------------+ + - - - - - + + - - - - - + -// | | | -// +------+------+ + - - + - - - + -// | | | | -// +=========+ +=========+ + - - - - + + - - - - + -// | Chunk 1 | | Chunk 2 | | Chunk 3 | | Chunk 4 | -// +=========+ +=========+ + - - - - + + - - - - + +// +-------------+ +// | `node` | +// | (new root) | +// +-------------+ +// | +// +-------------+ - - - - - - + - - - - - - - - - - - + +// | | | +// +--------------+ + - - - - - + + - - - - - + +// | (old root) | | new child | | | +// +--------------+ + - - - - - + + - - - - - + +// | | | +// +------+------+ + - - + - - - + +// | | | | +// +=========+ +=========+ + - - - - + + - - - - + +// | Chunk 1 | | Chunk 2 | | Chunk 3 | | Chunk 4 | +// +=========+ +=========+ + - - - - + + - - - - + // // The `node` to be filled uses the `FSNodeOverDag` abstraction that allows adding // child nodes without packing/unpacking the UnixFS layer node (having an internal diff --git a/unixfs/importer/helpers/helpers.go b/unixfs/importer/helpers/helpers.go index 075b2d2d29..20cb598e62 100644 --- a/unixfs/importer/helpers/helpers.go +++ b/unixfs/importer/helpers/helpers.go @@ -13,17 +13,18 @@ var roughLinkSize = 34 + 8 + 5 // sha256 multihash + size + no name + protobuf // DefaultLinksPerBlock governs how the importer decides how many links there // will be per block. This calculation is based on expected distributions of: -// * the expected distribution of block sizes -// * the expected distribution of link sizes -// * desired access speed +// - the expected distribution of block sizes +// - the expected distribution of link sizes +// - desired access speed +// // For now, we use: // -// var roughLinkBlockSize = 1 << 13 // 8KB -// var roughLinkSize = 34 + 8 + 5 // sha256 multihash + size + no name -// // + protobuf framing -// var DefaultLinksPerBlock = (roughLinkBlockSize / roughLinkSize) -// = ( 8192 / 47 ) -// = (approximately) 174 +// var roughLinkBlockSize = 1 << 13 // 8KB +// var roughLinkSize = 34 + 8 + 5 // sha256 multihash + size + no name +// // + protobuf framing +// var DefaultLinksPerBlock = (roughLinkBlockSize / roughLinkSize) +// = ( 8192 / 47 ) +// = (approximately) 174 var DefaultLinksPerBlock = roughLinkBlockSize / roughLinkSize // ErrSizeLimitExceeded signals that a block is larger than BlockSizeLimit. diff --git a/unixfs/importer/importer_test.go b/unixfs/importer/importer_test.go index b39aff57d7..96732be202 100644 --- a/unixfs/importer/importer_test.go +++ b/unixfs/importer/importer_test.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "io" - "io/ioutil" "testing" uio "github.com/ipfs/go-unixfs/io" @@ -60,7 +59,7 @@ func TestStableCid(t *testing.T) { t.Fatal(err) } - out, err := ioutil.ReadAll(dr) + out, err := io.ReadAll(dr) if err != nil { t.Fatal(err) } @@ -86,7 +85,7 @@ func TestBalancedDag(t *testing.T) { t.Fatal(err) } - out, err := ioutil.ReadAll(dr) + out, err := io.ReadAll(dr) if err != nil { t.Fatal(err) } @@ -144,7 +143,7 @@ func runReadBench(b *testing.B, nd ipld.Node, ds ipld.DAGService) { b.Fatal(err) } - _, err = read.WriteTo(ioutil.Discard) + _, err = read.WriteTo(io.Discard) if err != nil && err != io.EOF { b.Fatal(err) } diff --git a/unixfs/importer/trickle/trickle_test.go b/unixfs/importer/trickle/trickle_test.go index 2b6e0bd461..5965a490af 100644 --- a/unixfs/importer/trickle/trickle_test.go +++ b/unixfs/importer/trickle/trickle_test.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "io/ioutil" mrand "math/rand" "testing" @@ -62,7 +61,7 @@ func buildTestDag(ds ipld.DAGService, spl chunker.Splitter, rawLeaves UseRawLeav }) } -//Test where calls to read are smaller than the chunk size +// Test where calls to read are smaller than the chunk size func TestSizeBasedSplit(t *testing.T) { runBothSubtests(t, testSizeBasedSplit) } @@ -103,7 +102,7 @@ func testFileConsistency(t *testing.T, bs chunker.SplitterGen, nbytes int, rawLe t.Fatal(err) } - out, err := ioutil.ReadAll(r) + out, err := io.ReadAll(r) if err != nil { t.Fatal(err) } @@ -133,7 +132,7 @@ func testBuilderConsistency(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal(err) } - out, err := ioutil.ReadAll(r) + out, err := io.ReadAll(r) if err != nil { t.Fatal(err) } @@ -179,7 +178,7 @@ func testIndirectBlocks(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal(err) } - out, err := ioutil.ReadAll(reader) + out, err := io.ReadAll(reader) if err != nil { t.Fatal(err) } @@ -219,7 +218,7 @@ func testSeekingBasic(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal("Failed to seek to correct offset") } - out, err := ioutil.ReadAll(rs) + out, err := io.ReadAll(rs) if err != nil { t.Fatal(err) } @@ -251,7 +250,7 @@ func testSeekToBegin(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal(err) } - n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + n, err := io.CopyN(io.Discard, rs, 1024*4) if err != nil { t.Fatal(err) } @@ -267,7 +266,7 @@ func testSeekToBegin(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal("Failed to seek to beginning") } - out, err := ioutil.ReadAll(rs) + out, err := io.ReadAll(rs) if err != nil { t.Fatal(err) } @@ -299,7 +298,7 @@ func testSeekToAlmostBegin(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal(err) } - n, err := io.CopyN(ioutil.Discard, rs, 1024*4) + n, err := io.CopyN(io.Discard, rs, 1024*4) if err != nil { t.Fatal(err) } @@ -315,7 +314,7 @@ func testSeekToAlmostBegin(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal("Failed to seek to almost beginning") } - out, err := ioutil.ReadAll(rs) + out, err := io.ReadAll(rs) if err != nil { t.Fatal(err) } @@ -534,7 +533,7 @@ func testAppend(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal(err) } - out, err := ioutil.ReadAll(fread) + out, err := io.ReadAll(fread) if err != nil { t.Fatal(err) } @@ -600,7 +599,7 @@ func testMultipleAppends(t *testing.T, rawLeaves UseRawLeaves) { t.Fatal(err) } - out, err := ioutil.ReadAll(fread) + out, err := io.ReadAll(fread) if err != nil { t.Fatal(err) } @@ -654,7 +653,7 @@ func TestAppendSingleBytesToEmpty(t *testing.T) { t.Fatal(err) } - out, err := ioutil.ReadAll(fread) + out, err := io.ReadAll(fread) if err != nil { t.Fatal(err) } diff --git a/unixfs/io/completehamt_test.go b/unixfs/io/completehamt_test.go index 2af652e324..9be35d8ad9 100644 --- a/unixfs/io/completehamt_test.go +++ b/unixfs/io/completehamt_test.go @@ -4,10 +4,11 @@ import ( "context" "encoding/binary" "fmt" - "github.com/ipfs/go-unixfs/internal" "math" "testing" + "github.com/ipfs/go-unixfs/internal" + mdtest "github.com/ipfs/go-merkledag/test" "github.com/stretchr/testify/assert" @@ -18,14 +19,16 @@ import ( ) // CreateCompleteHAMT creates a HAMT the following properties: -// * its height (distance/edges from root to deepest node) is specified by treeHeight. -// * all leaf Shard nodes have the same depth (and have only 'value' links). -// * all internal Shard nodes point only to other Shards (and hence have zero 'value' links). -// * the total number of 'value' links (directory entries) is: -// childsPerNode ^ (treeHeight). -// treeHeight: The number of layers of non-value HAMT nodes (e.g. height = 1 is a single shard pointing to some values) +// - its height (distance/edges from root to deepest node) is specified by treeHeight. +// - all leaf Shard nodes have the same depth (and have only 'value' links). +// - all internal Shard nodes point only to other Shards (and hence have zero 'value' links). +// - the total number of 'value' links (directory entries) is: +// childsPerNode ^ (treeHeight). +// treeHeight: The number of layers of non-value HAMT nodes (e.g. height = 1 is a single shard pointing to some values) +// // FIXME: HAMTHashFunction needs to be set to idHash by the caller. We depend on -// this simplification for the current logic to work. +// +// this simplification for the current logic to work. func CreateCompleteHAMT(ds ipld.DAGService, treeHeight int, childsPerNode int) (ipld.Node, error) { if treeHeight < 1 { panic("treeHeight < 1") @@ -75,7 +78,8 @@ func idHash(val []byte) []byte { } // FIXME: This is not checking the exact height of the tree but just making -// sure there are as many children as we would have with a complete HAMT. +// +// sure there are as many children as we would have with a complete HAMT. func TestCreateCompleteShard(t *testing.T) { oldHashFunc := internal.HAMTHashFunction defer func() { internal.HAMTHashFunction = oldHashFunc }() diff --git a/unixfs/io/dagreader_test.go b/unixfs/io/dagreader_test.go index de664370c4..1ec3225bbc 100644 --- a/unixfs/io/dagreader_test.go +++ b/unixfs/io/dagreader_test.go @@ -3,7 +3,6 @@ package io import ( "bytes" "io" - "io/ioutil" "strings" "testing" @@ -26,7 +25,7 @@ func TestBasicRead(t *testing.T) { t.Fatal(err) } - outbuf, err := ioutil.ReadAll(reader) + outbuf, err := io.ReadAll(reader) if err != nil { t.Fatal(err) } @@ -257,7 +256,7 @@ func TestMetadataNode(t *testing.T) { if err != nil { t.Fatal(err) } - readdata, err := ioutil.ReadAll(reader) + readdata, err := io.ReadAll(reader) if err != nil { t.Fatal(err) } diff --git a/unixfs/mod/dagmodifier_test.go b/unixfs/mod/dagmodifier_test.go index 9870b2022c..a37590679c 100644 --- a/unixfs/mod/dagmodifier_test.go +++ b/unixfs/mod/dagmodifier_test.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "testing" dag "github.com/ipfs/go-merkledag" @@ -63,7 +62,7 @@ func verifyNode(t *testing.T, orig []byte, dm *DagModifier, opts testu.NodeOpts) t.Fatal(err) } - after, err := ioutil.ReadAll(rd) + after, err := io.ReadAll(rd) if err != nil { t.Fatal(err) } @@ -329,7 +328,7 @@ func testLargeWriteChunks(t *testing.T, opts testu.NodeOpts) { t.Fatal(err) } - out, err := ioutil.ReadAll(dagmod) + out, err := io.ReadAll(dagmod) if err != nil { t.Fatal(err) } @@ -374,7 +373,7 @@ func testDagTruncate(t *testing.T, opts testu.NodeOpts) { t.Fatal(err) } - out, err := ioutil.ReadAll(dagmod) + out, err := io.ReadAll(dagmod) if err != nil { t.Fatal(err) } @@ -458,7 +457,7 @@ func TestDagSync(t *testing.T) { t.Fatal(err) } - out, err := ioutil.ReadAll(dagmod) + out, err := io.ReadAll(dagmod) if err != nil { t.Fatal(err) } @@ -540,7 +539,7 @@ func testSparseWrite(t *testing.T, opts testu.NodeOpts) { t.Fatal(err) } - out, err := ioutil.ReadAll(dagmod) + out, err := io.ReadAll(dagmod) if err != nil { t.Fatal(err) } @@ -593,7 +592,7 @@ func testSeekPastEndWrite(t *testing.T, opts testu.NodeOpts) { t.Fatal(err) } - out, err := ioutil.ReadAll(dagmod) + out, err := io.ReadAll(dagmod) if err != nil { t.Fatal(err) } @@ -627,7 +626,7 @@ func testRelativeSeek(t *testing.T, opts testu.NodeOpts) { } } - out, err := ioutil.ReadAll(dagmod) + out, err := io.ReadAll(dagmod) if err != nil { t.Fatal(err) } diff --git a/unixfs/pb/unixfs.pb.go b/unixfs/pb/unixfs.pb.go index 6f1c8fe830..e523140075 100644 --- a/unixfs/pb/unixfs.pb.go +++ b/unixfs/pb/unixfs.pb.go @@ -5,8 +5,9 @@ package unixfs_pb import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" math "math" + + proto "github.com/gogo/protobuf/proto" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/unixfs/test/utils.go b/unixfs/test/utils.go index bb251bc118..b30f43c21e 100644 --- a/unixfs/test/utils.go +++ b/unixfs/test/utils.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "testing" ft "github.com/ipfs/go-unixfs" @@ -87,7 +86,7 @@ func GetEmptyNode(t testing.TB, dserv ipld.DAGService, opts NodeOpts) ipld.Node // GetRandomNode returns a random unixfs file node. func GetRandomNode(t testing.TB, dserv ipld.DAGService, size int64, opts NodeOpts) ([]byte, ipld.Node) { in := io.LimitReader(u.NewTimeSeededRand(), size) - buf, err := ioutil.ReadAll(in) + buf, err := io.ReadAll(in) if err != nil { t.Fatal(err) } diff --git a/unixfs/unixfs.go b/unixfs/unixfs.go index 026b8bb3fb..cd3481ea4a 100644 --- a/unixfs/unixfs.go +++ b/unixfs/unixfs.go @@ -69,7 +69,7 @@ func FilePBData(data []byte, totalsize uint64) []byte { return data } -//FolderPBData returns Bytes that represent a Directory. +// FolderPBData returns Bytes that represent a Directory. func FolderPBData() []byte { pbfile := new(pb.Data) typ := pb.Data_Directory @@ -83,7 +83,7 @@ func FolderPBData() []byte { return data } -//WrapData marshals raw bytes into a `Data_Raw` type protobuf message. +// WrapData marshals raw bytes into a `Data_Raw` type protobuf message. func WrapData(b []byte) []byte { pbdata := new(pb.Data) typ := pb.Data_Raw @@ -100,7 +100,7 @@ func WrapData(b []byte) []byte { return out } -//SymlinkData returns a `Data_Symlink` protobuf message for the path you specify. +// SymlinkData returns a `Data_Symlink` protobuf message for the path you specify. func SymlinkData(path string) ([]byte, error) { pbdata := new(pb.Data) typ := pb.Data_Symlink From fe8211a5ec28bd79928a2923a4620b76c55f0798 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 27 Aug 2022 16:06:24 +0300 Subject: [PATCH 3103/3147] update go-libp2p to v0.22.0, release v0.2.0 (#39) * chore: update go-libp2p to v0.22.0 * release v0.2.0 This commit was moved from ipfs/go-ipns@1df1d60158451c21e93737844a09036fd9cce3ad --- ipns/examples/embed.go | 4 ++-- ipns/examples/examples_test.go | 2 +- ipns/examples/key.go | 2 +- ipns/ipns.go | 9 ++++----- ipns/ipns_test.go | 4 ++-- ipns/record.go | 8 ++++---- ipns/select_test.go | 4 ++-- ipns/validate_test.go | 34 ++++++++++++++++++++++------------ 8 files changed, 38 insertions(+), 29 deletions(-) diff --git a/ipns/examples/embed.go b/ipns/examples/embed.go index cfd6ea7541..97757d91fe 100644 --- a/ipns/examples/embed.go +++ b/ipns/examples/embed.go @@ -5,8 +5,8 @@ import ( pb "github.com/ipfs/go-ipns/pb" - ipns "github.com/ipfs/go-ipns" - crypto "github.com/libp2p/go-libp2p-core/crypto" + "github.com/ipfs/go-ipns" + "github.com/libp2p/go-libp2p/core/crypto" ) // CreateEntryWithEmbed shows how you can create an IPNS entry diff --git a/ipns/examples/examples_test.go b/ipns/examples/examples_test.go index caa21e34cc..17d905051d 100644 --- a/ipns/examples/examples_test.go +++ b/ipns/examples/examples_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/ipfs/go-ipns/examples" - crypto "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p/core/crypto" ) var testPath = "/ipfs/Qme1knMqwt1hKZbc1BmQFmnm9f36nyQGwXxPGVpVJ9rMK5" diff --git a/ipns/examples/key.go b/ipns/examples/key.go index 6354521eea..94f219b8d2 100644 --- a/ipns/examples/key.go +++ b/ipns/examples/key.go @@ -1,7 +1,7 @@ package examples import ( - crypto "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p/core/crypto" ) // GenerateRSAKeyPair is used to generate an RSA key pair diff --git a/ipns/ipns.go b/ipns/ipns.go index f85b1ad8ec..5036afba54 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -6,22 +6,21 @@ import ( "sort" "time" + "github.com/multiformats/go-multicodec" "github.com/pkg/errors" "github.com/ipld/go-ipld-prime" _ "github.com/ipld/go-ipld-prime/codec/dagcbor" // used to import the DagCbor encoder/decoder ipldcodec "github.com/ipld/go-ipld-prime/multicodec" - "github.com/ipld/go-ipld-prime/node/basic" - - "github.com/multiformats/go-multicodec" + basicnode "github.com/ipld/go-ipld-prime/node/basic" "github.com/gogo/protobuf/proto" pb "github.com/ipfs/go-ipns/pb" u "github.com/ipfs/go-ipfs-util" - ic "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" ) const ( diff --git a/ipns/ipns_test.go b/ipns/ipns_test.go index f56d1e7e2e..711c7f6fd5 100644 --- a/ipns/ipns_test.go +++ b/ipns/ipns_test.go @@ -6,8 +6,8 @@ import ( "time" u "github.com/ipfs/go-ipfs-util" - ci "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" + ci "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" ) func TestEmbedPublicKey(t *testing.T) { diff --git a/ipns/record.go b/ipns/record.go index 43750bf3b7..a7710a4c35 100644 --- a/ipns/record.go +++ b/ipns/record.go @@ -7,11 +7,11 @@ import ( pb "github.com/ipfs/go-ipns/pb" "github.com/gogo/protobuf/proto" - logging "github.com/ipfs/go-log" - ic "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" - pstore "github.com/libp2p/go-libp2p-core/peerstore" + logging "github.com/ipfs/go-log/v2" record "github.com/libp2p/go-libp2p-record" + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + pstore "github.com/libp2p/go-libp2p/core/peerstore" ) var log = logging.Logger("ipns") diff --git a/ipns/select_test.go b/ipns/select_test.go index 905afb1da8..7dbdfdf12f 100644 --- a/ipns/select_test.go +++ b/ipns/select_test.go @@ -8,9 +8,9 @@ import ( pb "github.com/ipfs/go-ipns/pb" - proto "github.com/gogo/protobuf/proto" + "github.com/gogo/protobuf/proto" u "github.com/ipfs/go-ipfs-util" - ci "github.com/libp2p/go-libp2p-core/crypto" + ci "github.com/libp2p/go-libp2p/core/crypto" ) func shuffle(a []*pb.IpnsEntry) { diff --git a/ipns/validate_test.go b/ipns/validate_test.go index 40b41b6e39..e231934a9d 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -9,18 +9,16 @@ import ( "testing" "time" + "github.com/gogo/protobuf/proto" + u "github.com/ipfs/go-ipfs-util" pb "github.com/ipfs/go-ipns/pb" - ipldcodec "github.com/ipld/go-ipld-prime/multicodec" basicnode "github.com/ipld/go-ipld-prime/node/basic" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + pstore "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" "github.com/multiformats/go-multicodec" - - proto "github.com/gogo/protobuf/proto" - u "github.com/ipfs/go-ipfs-util" - "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" - pstore "github.com/libp2p/go-libp2p-core/peerstore" - pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" ) func testValidatorCase(t *testing.T, priv crypto.PrivKey, kbook pstore.KeyBook, key string, val []byte, eol time.Time, exp error) { @@ -69,11 +67,17 @@ func TestValidator(t *testing.T) { priv, id, _ := genKeys(t) priv2, id2, _ := genKeys(t) - kbook := pstoremem.NewPeerstore() + kbook, err := pstoremem.NewPeerstore() + if err != nil { + t.Fatal(err) + } if err := kbook.AddPubKey(id, priv.GetPublic()); err != nil { t.Fatal(err) } - emptyKbook := pstoremem.NewPeerstore() + emptyKbook, err := pstoremem.NewPeerstore() + if err != nil { + t.Fatal(err) + } testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour), nil) testValidatorCase(t, priv, kbook, "/ipns/"+string(id), nil, ts.Add(time.Hour*-1), ErrExpiredRecord) @@ -97,7 +101,10 @@ func mustMarshal(t *testing.T, entry *pb.IpnsEntry) []byte { func TestEmbeddedPubKeyValidate(t *testing.T) { goodeol := time.Now().Add(time.Hour) - kbook := pstoremem.NewPeerstore() + kbook, err := pstoremem.NewPeerstore() + if err != nil { + t.Fatal(err) + } pth := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") @@ -139,7 +146,10 @@ func TestPeerIDPubKeyValidate(t *testing.T) { t.Skip("disabled until libp2p/go-libp2p-crypto#51 is fixed") goodeol := time.Now().Add(time.Hour) - kbook := pstoremem.NewPeerstore() + kbook, err := pstoremem.NewPeerstore() + if err != nil { + t.Fatal(err) + } pth := []byte("/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG") From e23fe4499b93bd863cf109baef766bb0031249ee Mon Sep 17 00:00:00 2001 From: web3-bot Date: Mon, 29 Aug 2022 14:25:59 +0000 Subject: [PATCH 3104/3147] stop using the deprecated io/ioutil package This commit was moved from ipfs/go-filestore@866d05c88c5e5f307864f6afcece8012eddcd009 --- filestore/filestore_test.go | 6 +++--- filestore/pb/dataobj.pb.go | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 8117a23929..f3f3e64ddb 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -3,8 +3,8 @@ package filestore import ( "bytes" "context" - "io/ioutil" "math/rand" + "os" "testing" dag "github.com/ipfs/go-merkledag" @@ -21,7 +21,7 @@ var bg = context.Background() func newTestFilestore(t *testing.T) (string, *Filestore) { mds := ds.NewMapDatastore() - testdir, err := ioutil.TempDir("", "filestore-test") + testdir, err := os.MkdirTemp("", "filestore-test") if err != nil { t.Fatal(err) } @@ -34,7 +34,7 @@ func newTestFilestore(t *testing.T) (string, *Filestore) { } func makeFile(dir string, data []byte) (string, error) { - f, err := ioutil.TempFile(dir, "file") + f, err := os.CreateTemp(dir, "file") if err != nil { return "", err } diff --git a/filestore/pb/dataobj.pb.go b/filestore/pb/dataobj.pb.go index 5ecc2489e0..d342cabe51 100644 --- a/filestore/pb/dataobj.pb.go +++ b/filestore/pb/dataobj.pb.go @@ -5,10 +5,11 @@ package datastore_pb import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" + + proto "github.com/gogo/protobuf/proto" ) // Reference imports to suppress errors if they are not otherwise used. From 5c8841a14c44a54ac2961776e7af536bad402fff Mon Sep 17 00:00:00 2001 From: web3-bot Date: Mon, 29 Aug 2022 14:27:13 +0000 Subject: [PATCH 3105/3147] stop using the deprecated io/ioutil package This commit was moved from ipfs/go-pinning-service-http-client@905bf818553964cd19e4194bcd502ed0d252312b --- pinning/remote/client/cmd/main.go | 5 ++- pinning/remote/client/model.go | 3 +- pinning/remote/client/openapi/api_pins.go | 45 +++++++++++++---------- pinning/remote/client/openapi/client.go | 3 +- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/pinning/remote/client/cmd/main.go b/pinning/remote/client/cmd/main.go index c095ed08c7..3136bbd166 100644 --- a/pinning/remote/client/cmd/main.go +++ b/pinning/remote/client/cmd/main.go @@ -3,10 +3,11 @@ package main import ( "context" "fmt" - "github.com/ipfs/go-cid" - pinclient "github.com/ipfs/go-pinning-service-http-client" "os" "time" + + "github.com/ipfs/go-cid" + pinclient "github.com/ipfs/go-pinning-service-http-client" ) func main() { diff --git a/pinning/remote/client/model.go b/pinning/remote/client/model.go index 506c43ae32..a87f9c9130 100644 --- a/pinning/remote/client/model.go +++ b/pinning/remote/client/model.go @@ -3,10 +3,11 @@ package go_pinning_service_http_client import ( "encoding/json" "fmt" + "time" + "github.com/ipfs/go-cid" "github.com/ipfs/go-pinning-service-http-client/openapi" "github.com/multiformats/go-multiaddr" - "time" ) // PinGetter Getter for Pin object diff --git a/pinning/remote/client/openapi/api_pins.go b/pinning/remote/client/openapi/api_pins.go index 8c45df5a32..341abfd697 100644 --- a/pinning/remote/client/openapi/api_pins.go +++ b/pinning/remote/client/openapi/api_pins.go @@ -11,7 +11,6 @@ package openapi import ( _context "context" - _ioutil "io/ioutil" _nethttp "net/http" _neturl "net/url" "strings" @@ -76,7 +75,8 @@ func (r apiPinsGetRequest) Meta(meta map[string]string) apiPinsGetRequest { /* PinsGet List pin objects List all the pin objects, matching optional filters; when no filter is provided, only successful pins are returned - * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + - @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + @return apiPinsGetRequest */ func (a *PinsApiService) PinsGet(ctx _context.Context) apiPinsGetRequest { @@ -88,7 +88,8 @@ func (a *PinsApiService) PinsGet(ctx _context.Context) apiPinsGetRequest { /* Execute executes the request - @return PinResults + + @return PinResults */ func (r apiPinsGetRequest) Execute() (PinResults, *_nethttp.Response, error) { var ( @@ -159,7 +160,7 @@ func (r apiPinsGetRequest) Execute() (PinResults, *_nethttp.Response, error) { return localVarReturnValue, localVarHTTPResponse, err } - localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarBody, err := _io.ReadAll(localVarHTTPResponse.Body) localVarHTTPResponse.Body.Close() if err != nil { return localVarReturnValue, localVarHTTPResponse, err @@ -209,7 +210,8 @@ func (r apiPinsPostRequest) Pin(pin Pin) apiPinsPostRequest { /* PinsPost Add pin object Add a new pin object for the current access token - * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + - @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + @return apiPinsPostRequest */ func (a *PinsApiService) PinsPost(ctx _context.Context) apiPinsPostRequest { @@ -221,7 +223,8 @@ func (a *PinsApiService) PinsPost(ctx _context.Context) apiPinsPostRequest { /* Execute executes the request - @return PinStatus + + @return PinStatus */ func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { var ( @@ -277,7 +280,7 @@ func (r apiPinsPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { return localVarReturnValue, localVarHTTPResponse, err } - localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarBody, err := _io.ReadAll(localVarHTTPResponse.Body) localVarHTTPResponse.Body.Close() if err != nil { return localVarReturnValue, localVarHTTPResponse, err @@ -322,8 +325,9 @@ type apiPinsRequestidDeleteRequest struct { /* PinsRequestidDelete Remove pin object Remove a pin object - * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param requestid + - @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + - @param requestid + @return apiPinsRequestidDeleteRequest */ func (a *PinsApiService) PinsRequestidDelete(ctx _context.Context, requestid string) apiPinsRequestidDeleteRequest { @@ -336,7 +340,6 @@ func (a *PinsApiService) PinsRequestidDelete(ctx _context.Context, requestid str /* Execute executes the request - */ func (r apiPinsRequestidDeleteRequest) Execute() (*_nethttp.Response, error) { var ( @@ -386,7 +389,7 @@ func (r apiPinsRequestidDeleteRequest) Execute() (*_nethttp.Response, error) { return localVarHTTPResponse, err } - localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarBody, err := _io.ReadAll(localVarHTTPResponse.Body) localVarHTTPResponse.Body.Close() if err != nil { return localVarHTTPResponse, err @@ -422,8 +425,9 @@ type apiPinsRequestidGetRequest struct { /* PinsRequestidGet Get pin object Get a pin object and its status - * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param requestid + - @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + - @param requestid + @return apiPinsRequestidGetRequest */ func (a *PinsApiService) PinsRequestidGet(ctx _context.Context, requestid string) apiPinsRequestidGetRequest { @@ -436,7 +440,8 @@ func (a *PinsApiService) PinsRequestidGet(ctx _context.Context, requestid string /* Execute executes the request - @return PinStatus + + @return PinStatus */ func (r apiPinsRequestidGetRequest) Execute() (PinStatus, *_nethttp.Response, error) { var ( @@ -487,7 +492,7 @@ func (r apiPinsRequestidGetRequest) Execute() (PinStatus, *_nethttp.Response, er return localVarReturnValue, localVarHTTPResponse, err } - localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarBody, err := _io.ReadAll(localVarHTTPResponse.Body) localVarHTTPResponse.Body.Close() if err != nil { return localVarReturnValue, localVarHTTPResponse, err @@ -538,8 +543,9 @@ func (r apiPinsRequestidPostRequest) Pin(pin Pin) apiPinsRequestidPostRequest { /* PinsRequestidPost Replace pin object Replace an existing pin object (shortcut for executing remove and add operations in one step to avoid unnecessary garbage collection of blocks present in both recursive pins) - * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - * @param requestid + - @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + - @param requestid + @return apiPinsRequestidPostRequest */ func (a *PinsApiService) PinsRequestidPost(ctx _context.Context, requestid string) apiPinsRequestidPostRequest { @@ -552,7 +558,8 @@ func (a *PinsApiService) PinsRequestidPost(ctx _context.Context, requestid strin /* Execute executes the request - @return PinStatus + + @return PinStatus */ func (r apiPinsRequestidPostRequest) Execute() (PinStatus, *_nethttp.Response, error) { var ( @@ -609,7 +616,7 @@ func (r apiPinsRequestidPostRequest) Execute() (PinStatus, *_nethttp.Response, e return localVarReturnValue, localVarHTTPResponse, err } - localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body) + localVarBody, err := _io.ReadAll(localVarHTTPResponse.Body) localVarHTTPResponse.Body.Close() if err != nil { return localVarReturnValue, localVarHTTPResponse, err diff --git a/pinning/remote/client/openapi/client.go b/pinning/remote/client/openapi/client.go index 029d1cd72c..a0fc90e6fa 100644 --- a/pinning/remote/client/openapi/client.go +++ b/pinning/remote/client/openapi/client.go @@ -16,7 +16,6 @@ import ( "encoding/xml" "errors" "fmt" - "golang.org/x/oauth2" "io" "log" "mime/multipart" @@ -29,6 +28,8 @@ import ( "regexp" "strings" "time" + + "golang.org/x/oauth2" ) var ( From eea2118fc329c9ed7e3e157884286bc7fc91db01 Mon Sep 17 00:00:00 2001 From: web3-bot Date: Mon, 29 Aug 2022 14:27:28 +0000 Subject: [PATCH 3106/3147] stop using the deprecated io/ioutil package This commit was moved from ipfs/go-mfs@80d7a0f99971271980f5806fbe07829b3501ef17 --- mfs/mfs_test.go | 11 +++++------ mfs/repub.go | 8 ++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/mfs/mfs_test.go b/mfs/mfs_test.go index 1ea90ef337..ace1f76677 100644 --- a/mfs/mfs_test.go +++ b/mfs/mfs_test.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math/rand" "os" "sort" @@ -176,7 +175,7 @@ func assertFileAtPath(ds ipld.DAGService, root *Directory, expn ipld.Node, pth s return err } - out, err := ioutil.ReadAll(rfd) + out, err := io.ReadAll(rfd) if err != nil { return err } @@ -199,7 +198,7 @@ func catNode(ds ipld.DAGService, nd *dag.ProtoNode) ([]byte, error) { } defer r.Close() - return ioutil.ReadAll(r) + return io.ReadAll(r) } func setupRoot(ctx context.Context, t *testing.T) (ipld.DAGService, *Root) { @@ -831,7 +830,7 @@ func actorReadFile(d *Directory) error { return err } - _, err = ioutil.ReadAll(rfd) + _, err = io.ReadAll(rfd) if err != nil { return err } @@ -1116,7 +1115,7 @@ func writeFile(rt *Root, path string, transform func([]byte) []byte) error { } defer fd.Close() - data, err := ioutil.ReadAll(fd) + data, err := io.ReadAll(fd) if err != nil { return err } @@ -1383,7 +1382,7 @@ func TestTruncateAndWrite(t *testing.T) { t.Fatal(err) } - data, err := ioutil.ReadAll(fd) + data, err := io.ReadAll(fd) if err != nil { t.Fatal(err) } diff --git a/mfs/repub.go b/mfs/repub.go index 2c9dbd25da..463810414c 100644 --- a/mfs/repub.go +++ b/mfs/repub.go @@ -87,10 +87,10 @@ func (rp *Republisher) Update(c cid.Cid) { // updates. // // Algorithm: -// 1. When we receive the first update after publishing, we set a `longer` timer. -// 2. When we receive any update, we reset the `quick` timer. -// 3. If either the `quick` timeout or the `longer` timeout elapses, -// we call `publish` with the latest updated value. +// 1. When we receive the first update after publishing, we set a `longer` timer. +// 2. When we receive any update, we reset the `quick` timer. +// 3. If either the `quick` timeout or the `longer` timeout elapses, +// we call `publish` with the latest updated value. // // The `longer` timer ensures that we delay publishing by at most // `TimeoutLong`. The `quick` timer allows us to publish sooner if From c7bfc09efe5ffc65230fb0b740c1dfe04ae0ead7 Mon Sep 17 00:00:00 2001 From: galargh Date: Wed, 31 Aug 2022 22:36:30 +0200 Subject: [PATCH 3107/3147] fix: import io as _io This commit was moved from ipfs/go-pinning-service-http-client@61e9e65db4dbcbfa78fc94230694760219135f66 --- pinning/remote/client/openapi/api_pins.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pinning/remote/client/openapi/api_pins.go b/pinning/remote/client/openapi/api_pins.go index 341abfd697..b2858c5eea 100644 --- a/pinning/remote/client/openapi/api_pins.go +++ b/pinning/remote/client/openapi/api_pins.go @@ -11,6 +11,7 @@ package openapi import ( _context "context" + _io "io" _nethttp "net/http" _neturl "net/url" "strings" From 3bf94cdfb16ef7db42a7e2b740c0c3c6f994d674 Mon Sep 17 00:00:00 2001 From: web3-bot Date: Thu, 1 Sep 2022 09:14:36 +0000 Subject: [PATCH 3108/3147] stop using the deprecated io/ioutil package This commit was moved from ipfs/go-ipfs-keystore@fadb8f32307c568bdf8eaf185042b17ee16ab5ca --- keystore/keystore.go | 3 +-- keystore/keystore_test.go | 13 ++++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 9b2109ccdf..10606a8c9f 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -2,7 +2,6 @@ package keystore import ( "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -112,7 +111,7 @@ func (ks *FSKeystore) Get(name string) (ci.PrivKey, error) { kp := filepath.Join(ks.dir, name) - data, err := ioutil.ReadFile(kp) + data, err := os.ReadFile(kp) if err != nil { if os.IsNotExist(err) { return nil, ErrNoSuchKey diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index 06f2fccc53..bbfde6c86a 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -2,7 +2,6 @@ package keystore import ( "fmt" - "io/ioutil" "math/rand" "os" "path/filepath" @@ -27,7 +26,7 @@ func privKeyOrFatal(t *testing.T) ci.PrivKey { } func TestKeystoreBasics(t *testing.T) { - tdir, err := ioutil.TempDir("", "keystore-test") + tdir, err := os.MkdirTemp("", "keystore-test") if err != nil { t.Fatal(err) } @@ -146,7 +145,7 @@ func TestKeystoreBasics(t *testing.T) { } func TestInvalidKeyFiles(t *testing.T) { - tdir, err := ioutil.TempDir("", "keystore-test") + tdir, err := os.MkdirTemp("", "keystore-test") if err != nil { t.Fatal(err) @@ -171,12 +170,12 @@ func TestInvalidKeyFiles(t *testing.T) { t.Fatal(err) } - err = ioutil.WriteFile(filepath.Join(ks.dir, encodedName), bytes, 0644) + err = os.WriteFile(filepath.Join(ks.dir, encodedName), bytes, 0644) if err != nil { t.Fatal(err) } - err = ioutil.WriteFile(filepath.Join(ks.dir, "z.invalid"), bytes, 0644) + err = os.WriteFile(filepath.Join(ks.dir, "z.invalid"), bytes, 0644) if err != nil { t.Fatal(err) } @@ -205,7 +204,7 @@ func TestInvalidKeyFiles(t *testing.T) { } func TestNonExistingKey(t *testing.T) { - tdir, err := ioutil.TempDir("", "keystore-test") + tdir, err := os.MkdirTemp("", "keystore-test") if err != nil { t.Fatal(err) } @@ -245,7 +244,7 @@ func assertGetKey(ks Keystore, name string, exp ci.PrivKey) error { } func assertDirContents(dir string, exp []string) error { - finfos, err := ioutil.ReadDir(dir) + finfos, err := os.ReadDir(dir) if err != nil { return err } From dbe72d0f8d30503aaef183ef58bef13cf23b6ac1 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Thu, 18 Aug 2022 15:15:37 +0200 Subject: [PATCH 3109/3147] refactor: cleanup Sprintf for Bearer token This commit was moved from ipfs/go-pinning-service-http-client@67b82bcbd5d6c5e0333140c2a0a79c91d1843079 --- pinning/remote/client/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pinning/remote/client/client.go b/pinning/remote/client/client.go index f1bed8af8e..3d8c8331d9 100644 --- a/pinning/remote/client/client.go +++ b/pinning/remote/client/client.go @@ -27,8 +27,7 @@ type Client struct { func NewClient(url, bearerToken string) *Client { config := openapi.NewConfiguration() config.UserAgent = UserAgent - bearer := fmt.Sprintf("Bearer %s", bearerToken) - config.AddDefaultHeader("Authorization", bearer) + config.AddDefaultHeader("Authorization", "Bearer "+bearerToken) config.Servers = openapi.ServerConfigurations{ openapi.ServerConfiguration{ URL: url, From 62bb9386990edcb7dbbdeb2ac54e4aae50e9cfe8 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Thu, 18 Aug 2022 15:25:55 +0200 Subject: [PATCH 3110/3147] fix: send up to nanosecond precision This commit was moved from ipfs/go-pinning-service-http-client@05198b4897e722900553b3242a94a28d512769b4 --- pinning/remote/client/openapi/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/remote/client/openapi/client.go b/pinning/remote/client/openapi/client.go index a0fc90e6fa..b3cea998b5 100644 --- a/pinning/remote/client/openapi/client.go +++ b/pinning/remote/client/openapi/client.go @@ -121,7 +121,7 @@ func parameterToString(obj interface{}, collectionFormat string) string { if reflect.TypeOf(obj).Kind() == reflect.Slice { return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]") } else if t, ok := obj.(time.Time); ok { - return t.Format(time.RFC3339) + return t.Format(time.RFC3339Nano) } return fmt.Sprintf("%v", obj) From f02f43cbc8781a933c09aa63e96bb4fb5d011d82 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Mon, 12 Sep 2022 21:34:59 +0200 Subject: [PATCH 3111/3147] chore: require V2 signatures This is part of deprecation described in https://github.com/ipfs/kubo/issues/9240 - record creation continues to create both V1 and V2 signatures - record validation no longer accepts V1 signatures Meaning: - modern nodes are 100% V2, they ignore V1 signatures - legacy nodes (go-ipfs < v0.9.0) are still able to resolve names created by go-ipns, because V1 is still present This commit was moved from ipfs/go-ipns@b655f6b85fee922023f92d2def55aab47c7c9cd4 --- ipns/README.md | 7 +++---- ipns/ipns.go | 11 +++++++---- ipns/validate_test.go | 15 +++++---------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/ipns/README.md b/ipns/README.md index eb1158e2a5..148778df1d 100644 --- a/ipns/README.md +++ b/ipns/README.md @@ -1,14 +1,13 @@ # go-ipns -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai) -[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) -[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](https://ipfs.tech/) [![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) [![GoDoc](https://godoc.org/github.com/ipfs/go-datastore?status.svg)](https://godoc.org/github.com/ipfs/go-ipns) > ipns record definitions -This package contains all of the components necessary to create, understand, and validate IPNS records. It does *not* publish or resolve those records. [`go-ipfs`](https://github.com/ipfs/go-ipfs) uses this package internally to manipulate records. +This package contains all of the components necessary to create, understand, and validate IPNS records. It does *not* publish or resolve those records. [Kubo](https://github.com/ipfs/kubo) uses this package internally to manipulate records. ## Lead Maintainer diff --git a/ipns/ipns.go b/ipns/ipns.go index 5036afba54..5f9eb25d1a 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -53,6 +53,10 @@ func Create(sk ic.PrivKey, val []byte, seq uint64, eol time.Time, ttl time.Durat } entry.Data = cborData + // For now we still create V1 signatures. These are deprecated, and not + // used during verification anymore (Validate func requires SignatureV2), + // but setting it here allows legacy nodes (e.g., go-ipfs < v0.9.0) to + // still resolve IPNS published by modern nodes. sig1, err := sk.Sign(ipnsEntryDataForSigV1(entry)) if err != nil { return nil, errors.Wrap(err, "could not compute signature data") @@ -130,7 +134,7 @@ func createCborDataForIpnsEntry(e *pb.IpnsEntry) ([]byte, error) { func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { // Check the ipns record signature with the public key - // Check v2 signature if it's available, otherwise use the v1 signature + // Check v2 signature if it's available if entry.GetSignatureV2() != nil { sig2Data, err := ipnsEntryDataForSigV2(entry) if err != nil { @@ -147,9 +151,8 @@ func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { return err } } else { - if ok, err := pk.Verify(ipnsEntryDataForSigV1(entry), entry.GetSignatureV1()); err != nil || !ok { - return ErrSignature - } + // always error if no valid signature could be found + return ErrSignature } eol, err := GetEOL(entry) diff --git a/ipns/validate_test.go b/ipns/validate_test.go index e231934a9d..a0d7f7e02c 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -178,7 +178,7 @@ func TestPeerIDPubKeyValidate(t *testing.T) { testValidatorCase(t, sk, kbook, ipnsk, dataNoKey, goodeol, nil) } -func TestBothSignatureVersionsValidate(t *testing.T) { +func TestOnlySignatureV2Validate(t *testing.T) { goodeol := time.Now().Add(time.Hour) sk, pk, err := crypto.GenerateEd25519Key(rand.New(rand.NewSource(42))) @@ -197,17 +197,12 @@ func TestBothSignatureVersionsValidate(t *testing.T) { } entry.SignatureV2 = nil - if err := Validate(pk, entry); err != nil { - t.Fatal(err) - } - - entry.SignatureV1 = nil if err := Validate(pk, entry); !errors.Is(err, ErrSignature) { t.Fatal(err) } } -func TestNewSignatureVersionPreferred(t *testing.T) { +func TestSignatureV1Ignored(t *testing.T) { goodeol := time.Now().Add(time.Hour) sk, pk, err := crypto.GenerateEd25519Key(rand.New(rand.NewSource(42))) @@ -251,13 +246,13 @@ func TestNewSignatureVersionPreferred(t *testing.T) { t.Fatal("entry2 should be better than entry1") } - // Having only the v1 signature should be valid + // Having only the v1 signature should be invalid entry2.SignatureV2 = nil - if err := Validate(pk, entry2); err != nil { + if err := Validate(pk, entry2); !errors.Is(err, ErrSignature) { t.Fatal(err) } - // However the v2 signature should be preferred + // Record with v2 signature should always be preferred best, err = v.Select(ipnsk, [][]byte{mustMarshal(t, entry1), mustMarshal(t, entry2)}) if err != nil { t.Fatal(err) From c7a481767eaf3ad8d7a51e8e9927374d61bb5590 Mon Sep 17 00:00:00 2001 From: nisainan Date: Tue, 13 Sep 2022 15:06:46 +0800 Subject: [PATCH 3112/3147] chore: update go-libp2p to v0.22.0 This commit was moved from ipfs/go-ipfs-routing@e8c4a5b70efe2092ef35af35d543f2189b52b84f --- routing/mock/centralized_client.go | 14 ++++++-------- routing/mock/centralized_server.go | 10 ++++------ routing/mock/centralized_test.go | 5 ++--- routing/mock/interface.go | 7 +++---- routing/none/none_client.go | 10 ++++------ routing/offline/offline.go | 10 ++++------ routing/offline/offline_test.go | 4 ++-- 7 files changed, 25 insertions(+), 35 deletions(-) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index e57d03239c..ac3f938ccd 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -4,13 +4,11 @@ import ( "context" "time" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log" - - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/routing" - "github.com/libp2p/go-libp2p-testing/net" - + tnet "github.com/libp2p/go-libp2p-testing/net" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/routing" ma "github.com/multiformats/go-multiaddr" ) @@ -22,13 +20,13 @@ type client struct { peer tnet.Identity } -// FIXME(brian): is this method meant to simulate putting a value into the network? +// PutValue FIXME(brian): is this method meant to simulate putting a value into the network? func (c *client) PutValue(ctx context.Context, key string, val []byte, opts ...routing.Option) error { log.Debugf("PutValue: %s", key) return c.vs.PutValue(ctx, key, val, opts...) } -// FIXME(brian): is this method meant to simulate getting a value from the network? +// GetValue FIXME(brian): is this method meant to simulate getting a value from the network? func (c *client) GetValue(ctx context.Context, key string, opts ...routing.Option) ([]byte, error) { log.Debugf("GetValue: %s", key) return c.vs.GetValue(ctx, key, opts...) diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 9c8bd853c1..8ff614ca72 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -6,14 +6,12 @@ import ( "sync" "time" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" - - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-testing/net" - - offline "github.com/ipfs/go-ipfs-routing/offline" + "github.com/ipfs/go-ipfs-routing/offline" + tnet "github.com/libp2p/go-libp2p-testing/net" + "github.com/libp2p/go-libp2p/core/peer" ) // server is the mockrouting.Client's private interface to the routing server diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index fc832cf7a8..6c36e492a6 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -8,9 +8,8 @@ import ( "github.com/ipfs/go-cid" delay "github.com/ipfs/go-ipfs-delay" u "github.com/ipfs/go-ipfs-util" - - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-testing/net" + tnet "github.com/libp2p/go-libp2p-testing/net" + "github.com/libp2p/go-libp2p/core/peer" ) func TestKeyNotFound(t *testing.T) { diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 6b02065348..35430a72c5 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -9,10 +9,9 @@ import ( ds "github.com/ipfs/go-datastore" delay "github.com/ipfs/go-ipfs-delay" - - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/routing" - "github.com/libp2p/go-libp2p-testing/net" + tnet "github.com/libp2p/go-libp2p-testing/net" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/routing" ) // MockValidator is a record validator that always returns success. diff --git a/routing/none/none_client.go b/routing/none/none_client.go index 2ba1a8f8f9..6f400b54a1 100644 --- a/routing/none/none_client.go +++ b/routing/none/none_client.go @@ -5,14 +5,12 @@ import ( "context" "errors" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" - - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/routing" - record "github.com/libp2p/go-libp2p-record" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/routing" ) type nilclient struct { diff --git a/routing/offline/offline.go b/routing/offline/offline.go index 0b3083c596..7e4292f565 100644 --- a/routing/offline/offline.go +++ b/routing/offline/offline.go @@ -8,16 +8,14 @@ import ( "errors" "time" - proto "github.com/gogo/protobuf/proto" - cid "github.com/ipfs/go-cid" + "github.com/gogo/protobuf/proto" + "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dshelp "github.com/ipfs/go-ipfs-ds-help" - - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/routing" - record "github.com/libp2p/go-libp2p-record" pb "github.com/libp2p/go-libp2p-record/pb" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/routing" ) // ErrOffline is returned when trying to perform operations that diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go index 00e0174ba9..9a17e86898 100644 --- a/routing/offline/offline_test.go +++ b/routing/offline/offline_test.go @@ -8,8 +8,8 @@ import ( cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" - "github.com/libp2p/go-libp2p-core/routing" - "github.com/libp2p/go-libp2p-core/test" + "github.com/libp2p/go-libp2p/core/routing" + "github.com/libp2p/go-libp2p/core/test" mh "github.com/multiformats/go-multihash" ) From fc4155a824f26f21fbebd0aa0c3c5fa7b42c0a41 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Tue, 20 Sep 2022 23:06:50 +0200 Subject: [PATCH 3113/3147] refactor: avoid nested code https://github.com/ipfs/go-ipns/pull/41#discussion_r975078116 This commit was moved from ipfs/go-ipns@237111a8d232ee4adfe2c8907fa95f779acf7170 --- ipns/ipns.go | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/ipns/ipns.go b/ipns/ipns.go index 5f9eb25d1a..fae3f6e2c4 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -133,28 +133,27 @@ func createCborDataForIpnsEntry(e *pb.IpnsEntry) ([]byte, error) { // Validates validates the given IPNS entry against the given public key. func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { // Check the ipns record signature with the public key - - // Check v2 signature if it's available - if entry.GetSignatureV2() != nil { - sig2Data, err := ipnsEntryDataForSigV2(entry) - if err != nil { - return fmt.Errorf("could not compute signature data: %w", err) - } - if ok, err := pk.Verify(sig2Data, entry.GetSignatureV2()); err != nil || !ok { - return ErrSignature - } - - // TODO: If we switch from pb.IpnsEntry to a more generic IpnsRecord type then perhaps we should only check - // this if there is no v1 signature. In the meanwhile this helps avoid some potential rough edges around people - // checking the entry fields instead of doing CBOR decoding everywhere. - if err := validateCborDataMatchesPbData(entry); err != nil { - return err - } - } else { + if entry.GetSignatureV2() == nil { // always error if no valid signature could be found return ErrSignature } + sig2Data, err := ipnsEntryDataForSigV2(entry) + if err != nil { + return fmt.Errorf("could not compute signature data: %w", err) + } + if ok, err := pk.Verify(sig2Data, entry.GetSignatureV2()); err != nil || !ok { + return ErrSignature + } + + // TODO: If we switch from pb.IpnsEntry to a more generic IpnsRecord type then perhaps we should only check + // this if there is no v1 signature. In the meanwhile this helps avoid some potential rough edges around people + // checking the entry fields instead of doing CBOR decoding everywhere. + // See https://github.com/ipfs/go-ipns/pull/42 for next steps here + if err := validateCborDataMatchesPbData(entry); err != nil { + return err + } + eol, err := GetEOL(entry) if err != nil { return err From f748bd4f578b55eeeee5b7026f5857e57b279e38 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Tue, 20 Sep 2022 23:50:44 +0200 Subject: [PATCH 3114/3147] fix: MaxRecordSize of 10 KiB See rationale: https://github.com/ipfs/specs/pull/319#discussion_r968304911 This commit was moved from ipfs/go-ipns@e5d96b34e49b2e60e6dd9985b607185d3be4f7e5 --- ipns/errors.go | 7 +++++++ ipns/ipns.go | 5 +++++ ipns/validate_test.go | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/ipns/errors.go b/ipns/errors.go index ebcd4e263f..d78aafffa0 100644 --- a/ipns/errors.go +++ b/ipns/errors.go @@ -35,3 +35,10 @@ var ErrPublicKeyMismatch = errors.New("public key in record did not match expect // ErrBadRecord should be returned when an ipns record cannot be unmarshalled var ErrBadRecord = errors.New("record could not be unmarshalled") + +// 10 KiB limit defined in https://github.com/ipfs/specs/pull/319 +const MaxRecordSize int = 10 << (10 * 1) + +// ErrRecordSize should be returned when an ipns record is +// invalid due to being too big +var ErrRecordSize = errors.New("record exceeds allowed size limit") diff --git a/ipns/ipns.go b/ipns/ipns.go index fae3f6e2c4..8782356cf0 100644 --- a/ipns/ipns.go +++ b/ipns/ipns.go @@ -132,6 +132,11 @@ func createCborDataForIpnsEntry(e *pb.IpnsEntry) ([]byte, error) { // Validates validates the given IPNS entry against the given public key. func Validate(pk ic.PubKey, entry *pb.IpnsEntry) error { + // Make sure max size is respected + if entry.Size() > MaxRecordSize { + return ErrRecordSize + } + // Check the ipns record signature with the public key if entry.GetSignatureV2() == nil { // always error if no valid signature could be found diff --git a/ipns/validate_test.go b/ipns/validate_test.go index a0d7f7e02c..0b38329fc3 100644 --- a/ipns/validate_test.go +++ b/ipns/validate_test.go @@ -274,6 +274,26 @@ func TestSignatureV1Ignored(t *testing.T) { } } +func TestMaxSizeValidate(t *testing.T) { + goodeol := time.Now().Add(time.Hour) + + sk, pk, err := crypto.GenerateEd25519Key(rand.New(rand.NewSource(42))) + if err != nil { + t.Fatal(err) + } + + // Create record over the max size (value+other fields) + value := make([]byte, MaxRecordSize) + entry, err := Create(sk, value, 1, goodeol, 0) + if err != nil { + t.Fatal(err) + } + // Must fail with ErrRecordSize + if err := Validate(pk, entry); !errors.Is(err, ErrRecordSize) { + t.Fatal(err) + } +} + func TestCborDataCanonicalization(t *testing.T) { goodeol := time.Now().Add(time.Hour) From 105eb5fd191434d8f5375ebf5b18cfecff042b23 Mon Sep 17 00:00:00 2001 From: Antonio Navarro Perez Date: Wed, 12 Oct 2022 17:02:12 +0200 Subject: [PATCH 3115/3147] Fix: panic when childer is nil (#127) * Fix panic when childer is nil Signed-off-by: Antonio Navarro Perez * Apply suggestions from code review Co-authored-by: Gus Eggert Signed-off-by: Antonio Navarro Perez Co-authored-by: Gus Eggert This commit was moved from ipfs/go-unixfs@fede2ed6837d42eb20c2e125025ee591b7eda04f --- unixfs/hamt/hamt.go | 22 +++++++++++++++++----- unixfs/hamt/hamt_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index d9947770ff..c6cae88ea7 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -86,7 +86,12 @@ type Shard struct { // NewShard creates a new, empty HAMT shard with the given size. func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { - ds, err := makeShard(dserv, size) + return NewShardValue(dserv, size, "", nil) +} + +// NewShardValue creates a new, empty HAMT shard with the given key, value and size. +func NewShardValue(dserv ipld.DAGService, size int, key string, value *ipld.Link) (*Shard, error) { + ds, err := makeShard(dserv, size, key, value) if err != nil { return nil, err } @@ -96,7 +101,7 @@ func NewShard(dserv ipld.DAGService, size int) (*Shard, error) { return ds, nil } -func makeShard(ds ipld.DAGService, size int) (*Shard, error) { +func makeShard(ds ipld.DAGService, size int, key string, val *ipld.Link) (*Shard, error) { lg2s, err := Logtwo(size) if err != nil { return nil, err @@ -109,6 +114,9 @@ func makeShard(ds ipld.DAGService, size int) (*Shard, error) { childer: newChilder(ds, size), tableSize: size, dserv: ds, + + key: key, + val: val, } s.childer.sd = s @@ -138,7 +146,7 @@ func NewHamtFromDag(dserv ipld.DAGService, nd ipld.Node) (*Shard, error) { size := int(fsn.Fanout()) - ds, err := makeShard(dserv, size) + ds, err := makeShard(dserv, size, "", nil) if err != nil { return nil, err } @@ -214,7 +222,7 @@ func (ds *Shard) Node() (ipld.Node, error) { func (ds *Shard) makeShardValue(lnk *ipld.Link) (*Shard, error) { lnk2 := *lnk - s, err := makeShard(ds.dserv, ds.tableSize) + s, err := makeShard(ds.dserv, ds.tableSize, "", nil) if err != nil { return nil, err } @@ -795,7 +803,11 @@ func (s *childer) insert(key string, lnk *ipld.Link, idx int) error { lnk.Name = s.sd.linkNamePrefix(idx) + key i := s.sliceIndex(idx) - sd := &Shard{key: key, val: lnk} + + sd, err := NewShardValue(s.dserv, 256, key, lnk) + if err != nil { + return err + } s.children = append(s.children[:i], append([]*Shard{sd}, s.children[i:]...)...) s.links = append(s.links[:i], append([]*ipld.Link{nil}, s.links[i:]...)...) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 8d0b93889d..150b97b904 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -435,6 +435,38 @@ func TestDuplicateAddShard(t *testing.T) { } } +// fix https://github.com/ipfs/kubo/issues/9063 +func TestSetLink(t *testing.T) { + ds := mdtest.Mock() + dir, _ := NewShard(ds, 256) + _, s, err := makeDir(ds, 300) + if err != nil { + t.Fatal(err) + } + + lnk, err := s.Link() + if err != nil { + t.Fatal(err) + } + + ctx := context.Background() + + err = dir.SetLink(ctx, "test", lnk) + if err != nil { + t.Fatal(err) + } + + if len(dir.childer.children) != 1 { + t.Fatal("no child") + } + + for _, sh := range dir.childer.children { + if sh.childer == nil { + t.Fatal("no childer on shard") + } + } +} + func TestLoadFailsFromNonShard(t *testing.T) { ds := mdtest.Mock() nd := ft.EmptyDirNode() From 3605c1683b7ca482719c534eb781f72caa46f4e0 Mon Sep 17 00:00:00 2001 From: web3-bot Date: Tue, 6 Dec 2022 13:47:01 +0000 Subject: [PATCH 3116/3147] stop using the deprecated io/ioutil package This commit was moved from ipfs/go-ipfs-provider@93e3121406f147f1b5246359451e005a47eb30ea --- provider/offline.go | 1 + provider/provider.go | 1 + provider/system.go | 1 + 3 files changed, 3 insertions(+) diff --git a/provider/offline.go b/provider/offline.go index 5511364ed7..030a70ab13 100644 --- a/provider/offline.go +++ b/provider/offline.go @@ -2,6 +2,7 @@ package provider import ( "context" + "github.com/ipfs/go-cid" ) diff --git a/provider/provider.go b/provider/provider.go index 7dec4c172e..3b9c6ba3eb 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -2,6 +2,7 @@ package provider import ( "context" + "github.com/ipfs/go-cid" ) diff --git a/provider/system.go b/provider/system.go index b3e17ee40c..9fc3e8879c 100644 --- a/provider/system.go +++ b/provider/system.go @@ -2,6 +2,7 @@ package provider import ( "context" + "github.com/ipfs/go-cid" ) From 65758c3d975e4cc15191b1afc43203057a687026 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 21 Nov 2022 10:20:57 +1300 Subject: [PATCH 3117/3147] chore: update go-lib2p, avoid depending on go-libp2p-core, bump go.mod version This commit was moved from ipfs/go-ipfs-provider@ed88972f33b66970ae456228a3860b464d192a1a --- provider/simple/provider.go | 2 +- provider/simple/provider_test.go | 8 ++++---- provider/simple/reprovide.go | 2 +- provider/simple/reprovide_test.go | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/provider/simple/provider.go b/provider/simple/provider.go index d43cd6ac88..ab0b18998a 100644 --- a/provider/simple/provider.go +++ b/provider/simple/provider.go @@ -10,7 +10,7 @@ import ( "github.com/ipfs/go-cid" q "github.com/ipfs/go-ipfs-provider/queue" logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p/core/routing" ) var logP = logging.Logger("provider.simple") diff --git a/provider/simple/provider_test.go b/provider/simple/provider_test.go index d8dbf96f00..b4e170bff3 100644 --- a/provider/simple/provider_test.go +++ b/provider/simple/provider_test.go @@ -6,11 +6,11 @@ import ( "testing" "time" - cid "github.com/ipfs/go-cid" - datastore "github.com/ipfs/go-datastore" - sync "github.com/ipfs/go-datastore/sync" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/sync" blocksutil "github.com/ipfs/go-ipfs-blocksutil" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" q "github.com/ipfs/go-ipfs-provider/queue" diff --git a/provider/simple/reprovide.go b/provider/simple/reprovide.go index 38d6f86d77..0225340d17 100644 --- a/provider/simple/reprovide.go +++ b/provider/simple/reprovide.go @@ -15,7 +15,7 @@ import ( logging "github.com/ipfs/go-log" "github.com/ipfs/go-verifcid" cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/libp2p/go-libp2p-core/routing" + "github.com/libp2p/go-libp2p/core/routing" ) var logR = logging.Logger("reprovider.simple") diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 20b066e60e..4d5563b0d7 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -20,8 +20,8 @@ import ( "github.com/ipld/go-ipld-prime/fluent/qp" cidlink "github.com/ipld/go-ipld-prime/linking/cid" basicnode "github.com/ipld/go-ipld-prime/node/basic" - peer "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-testing/net" + "github.com/libp2p/go-libp2p/core/peer" mh "github.com/multiformats/go-multihash" . "github.com/ipfs/go-ipfs-provider/simple" From 02df8225c4e4071110d2229fd152654d232eb754 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Fri, 9 Dec 2022 12:02:52 +0100 Subject: [PATCH 3118/3147] fix: multihash keying in the tests This commit was moved from ipfs/go-ipfs-provider@8d650d573dc43033fca464c58856bcaa36c24ec8 --- provider/simple/reprovide_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/provider/simple/reprovide_test.go b/provider/simple/reprovide_test.go index 4d5563b0d7..e29d6e408f 100644 --- a/provider/simple/reprovide_test.go +++ b/provider/simple/reprovide_test.go @@ -127,6 +127,14 @@ func testReprovide(t *testing.T, trigger func(r *Reprovider, ctx context.Context maxProvs := 100 for _, c := range nodes { + // We provide raw cids because of the multihash keying + // FIXME(@Jorropo): I think this change should be done in the DHT layer, probably an issue with our routing mock. + b := c.Bytes() + b[1] = 0x55 // rewrite the cid to raw + _, c, err := cid.CidFromBytes(b) + if err != nil { + t.Fatal(err) + } provChan := clB.FindProvidersAsync(ctx, c, maxProvs) for p := range provChan { providers = append(providers, p) From a8baf452edb9062caa14c4512346ef8db0ac1296 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 21 Nov 2022 10:11:01 +1300 Subject: [PATCH 3119/3147] chore: update go-libp2p This commit was moved from ipfs/go-ipfs-keystore@dea784f37c219c0478105d3ac78a5e6a75935327 --- keystore/keystore.go | 4 ++-- keystore/keystore_test.go | 4 ++-- keystore/memkeystore.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/keystore/keystore.go b/keystore/keystore.go index 10606a8c9f..fc6793a1ee 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -6,10 +6,10 @@ import ( "path/filepath" "strings" - base32 "encoding/base32" + "encoding/base32" logging "github.com/ipfs/go-log" - ci "github.com/libp2p/go-libp2p-core/crypto" + ci "github.com/libp2p/go-libp2p/core/crypto" ) var log = logging.Logger("keystore") diff --git a/keystore/keystore_test.go b/keystore/keystore_test.go index bbfde6c86a..9a44062173 100644 --- a/keystore/keystore_test.go +++ b/keystore/keystore_test.go @@ -8,7 +8,7 @@ import ( "sort" "testing" - ci "github.com/libp2p/go-libp2p-core/crypto" + ci "github.com/libp2p/go-libp2p/core/crypto" ) type rr struct{} @@ -160,7 +160,7 @@ func TestInvalidKeyFiles(t *testing.T) { key := privKeyOrFatal(t) - bytes, err := key.Bytes() + bytes, err := key.Raw() if err != nil { t.Fatal(err) } diff --git a/keystore/memkeystore.go b/keystore/memkeystore.go index 94411144d4..0ea62f4e1a 100644 --- a/keystore/memkeystore.go +++ b/keystore/memkeystore.go @@ -3,7 +3,7 @@ package keystore import ( "errors" - ci "github.com/libp2p/go-libp2p-core/crypto" + ci "github.com/libp2p/go-libp2p/core/crypto" ) // MemKeystore is an in memory keystore implementation that is not persisted to From 90ca296f80108f2fd10943895a8df31e28967850 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 21 Nov 2022 09:38:01 +1300 Subject: [PATCH 3120/3147] chore: update go-libp2p to v0.23.4 This commit was moved from ipfs/interface-go-ipfs-core@96e9f233339ef16c3f1be4db6ced89ff82accfbb --- coreiface/dht.go | 4 ++-- coreiface/idfmt.go | 2 +- coreiface/key.go | 4 ++-- coreiface/pubsub.go | 4 ++-- coreiface/swarm.go | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/coreiface/dht.go b/coreiface/dht.go index 81a20ee2b6..73bf483056 100644 --- a/coreiface/dht.go +++ b/coreiface/dht.go @@ -3,11 +3,11 @@ package iface import ( "context" - path "github.com/ipfs/interface-go-ipfs-core/path" + "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ) // DhtAPI specifies the interface to the DHT diff --git a/coreiface/idfmt.go b/coreiface/idfmt.go index 1ba79e6023..80fd0f822f 100644 --- a/coreiface/idfmt.go +++ b/coreiface/idfmt.go @@ -1,7 +1,7 @@ package iface import ( - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" mbase "github.com/multiformats/go-multibase" ) diff --git a/coreiface/key.go b/coreiface/key.go index 9672556656..b0e739cb83 100644 --- a/coreiface/key.go +++ b/coreiface/key.go @@ -3,11 +3,11 @@ package iface import ( "context" - path "github.com/ipfs/interface-go-ipfs-core/path" + "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ) // Key specifies the interface to Keys in KeyAPI Keystore diff --git a/coreiface/pubsub.go b/coreiface/pubsub.go index d9826551d4..427256251e 100644 --- a/coreiface/pubsub.go +++ b/coreiface/pubsub.go @@ -4,9 +4,9 @@ import ( "context" "io" - options "github.com/ipfs/interface-go-ipfs-core/options" + "github.com/ipfs/interface-go-ipfs-core/options" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/peer" ) // PubSubSubscription is an active PubSub subscription diff --git a/coreiface/swarm.go b/coreiface/swarm.go index d7b25d5e87..9aa5466ba4 100644 --- a/coreiface/swarm.go +++ b/coreiface/swarm.go @@ -5,9 +5,9 @@ import ( "errors" "time" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" ma "github.com/multiformats/go-multiaddr" ) From 7f249456102362475b5ca6b9f8f602e9c95813bb Mon Sep 17 00:00:00 2001 From: Jorropo Date: Fri, 9 Dec 2022 13:31:02 +0100 Subject: [PATCH 3121/3147] fix: make queue 64bits on 32bits platforms too `int` is 32bits on 32bits platforms, it is realistical that you would overflow it (afaik by having more than 2b blocks in one datastore) Also we don't need 63 leading digits, a uint64 can always be represented in 20 base 10 digits. Fix bug introduced in 9bf7907fe1cf811df1328255c953028569c00087.Fix bug introduced in 9bf7907fe1cf811df1328255c953028569c00087. This commit was moved from ipfs/go-ipfs-provider@ef94782b5be979858fa8e4c57c68308dab035d7e --- provider/queue/queue.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/provider/queue/queue.go b/provider/queue/queue.go index d2ba30a79f..618256bbee 100644 --- a/provider/queue/queue.go +++ b/provider/queue/queue.go @@ -28,7 +28,7 @@ type Queue struct { close context.CancelFunc closed chan struct{} - counter int + counter uint64 } // NewQueue creates a queue for cids @@ -117,7 +117,7 @@ func (q *Queue) work() { select { case toQueue := <-q.enqueue: - keyPath := fmt.Sprintf("%063d/%s", q.counter, c.String()) + keyPath := fmt.Sprintf("%020d/%s", q.counter, c.String()) q.counter++ nextKey := datastore.NewKey(keyPath) From 8d416893043ebba71a6c0610f8db2fed1a6d6526 Mon Sep 17 00:00:00 2001 From: web3-bot Date: Tue, 6 Dec 2022 13:47:37 +0000 Subject: [PATCH 3122/3147] stop using the deprecated io/ioutil package This commit was moved from ipfs/go-namesys@6e2d8f84f7f12d14cb179f57e4a34d61377b7c71 --- namesys/interface.go | 18 +++++++++--------- namesys/namesys.go | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index b4136dfcc8..471bf6501d 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -7,15 +7,15 @@ That works well for many use cases, but doesn't allow you to answer questions like "what is Alice's current homepage?". The mutable name system allows Alice to publish information like: - The current homepage for alice.example.com is - /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj + The current homepage for alice.example.com is + /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj or: - The current homepage for node - QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy - is - /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj + The current homepage for node + QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy + is + /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj The mutable name system also allows users to resolve those references to find the immutable IPFS object currently referenced by a given @@ -23,9 +23,9 @@ mutable name. For command-line bindings to this functionality, see: - ipfs name - ipfs dns - ipfs resolve + ipfs name + ipfs dns + ipfs resolve */ package namesys diff --git a/namesys/namesys.go b/namesys/namesys.go index 6dfad0b716..11335c4118 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -41,7 +41,6 @@ import ( // (b) dns domains: resolves using links in DNS TXT records // // It can only publish to: (a) IPFS routing naming. -// type mpns struct { ds ds.Datastore From 156fc8445014c80abc194f2af5a55d73ee623729 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 21 Nov 2022 09:26:40 +1300 Subject: [PATCH 3123/3147] chore: update go-libp2p to v0.23.4, update go.mod version to 1.18 This commit was moved from ipfs/go-namesys@64a7679c04fdf0f314226fa51fe89c9d679de1b5 --- namesys/interface.go | 6 +++--- namesys/ipns_resolver_validation_test.go | 18 +++++++++--------- namesys/namesys.go | 12 ++++++------ namesys/namesys_test.go | 10 +++++----- namesys/publisher.go | 14 +++++++------- namesys/publisher_test.go | 6 +++--- namesys/republisher/repub.go | 14 +++++++------- namesys/republisher/repub_test.go | 14 +++++++------- namesys/routing.go | 12 ++++++------ 9 files changed, 53 insertions(+), 53 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 471bf6501d..94045129b0 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -33,11 +33,11 @@ import ( "errors" "time" - context "context" + "context" - path "github.com/ipfs/go-path" + "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-core/crypto" + ci "github.com/libp2p/go-libp2p/core/crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/ipns_resolver_validation_test.go b/namesys/ipns_resolver_validation_test.go index cc3b58f361..9653a42458 100644 --- a/namesys/ipns_resolver_validation_test.go +++ b/namesys/ipns_resolver_validation_test.go @@ -8,19 +8,19 @@ import ( ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" mockrouting "github.com/ipfs/go-ipfs-routing/mock" - offline "github.com/ipfs/go-ipfs-routing/offline" - ipns "github.com/ipfs/go-ipns" + "github.com/ipfs/go-ipfs-routing/offline" + "github.com/ipfs/go-ipns" ipns_pb "github.com/ipfs/go-ipns/pb" - path "github.com/ipfs/go-path" + "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" - pstore "github.com/libp2p/go-libp2p-core/peerstore" - routing "github.com/libp2p/go-libp2p-core/routing" - "github.com/libp2p/go-libp2p-core/test" - pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" testutil "github.com/libp2p/go-libp2p-testing/net" + ci "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + pstore "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/libp2p/go-libp2p/core/routing" + "github.com/libp2p/go-libp2p/core/test" + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" ) func TestResolverValidation(t *testing.T) { diff --git a/namesys/namesys.go b/namesys/namesys.go index 11335c4118..f8218d371c 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -20,15 +20,15 @@ import ( "time" lru "github.com/hashicorp/golang-lru" - cid "github.com/ipfs/go-cid" + "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" - path "github.com/ipfs/go-path" + "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" - routing "github.com/libp2p/go-libp2p-core/routing" - dns "github.com/miekg/dns" + ci "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/routing" + "github.com/miekg/dns" madns "github.com/multiformats/go-multiaddr-dns" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index af115ac2bb..b56aa763a4 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -10,13 +10,13 @@ import ( ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" offroute "github.com/ipfs/go-ipfs-routing/offline" - ipns "github.com/ipfs/go-ipns" - path "github.com/ipfs/go-path" + "github.com/ipfs/go-ipns" + "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - ci "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" - pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" + ci "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" ) type mockResolver struct { diff --git a/namesys/publisher.go b/namesys/publisher.go index bf1c46d9d4..317e0e7be2 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -6,16 +6,16 @@ import ( "sync" "time" - proto "github.com/gogo/protobuf/proto" + "github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-datastore" dsquery "github.com/ipfs/go-datastore/query" - ipns "github.com/ipfs/go-ipns" + "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" - path "github.com/ipfs/go-path" - "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" - routing "github.com/libp2p/go-libp2p-core/routing" - base32 "github.com/whyrusleeping/base32" + "github.com/ipfs/go-path" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/routing" + "github.com/whyrusleeping/base32" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go index 4be9ec8464..3b9b66f9d0 100644 --- a/namesys/publisher_test.go +++ b/namesys/publisher_test.go @@ -12,10 +12,10 @@ import ( dssync "github.com/ipfs/go-datastore/sync" dshelp "github.com/ipfs/go-ipfs-ds-help" mockrouting "github.com/ipfs/go-ipfs-routing/mock" - ipns "github.com/ipfs/go-ipns" - ci "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipfs/go-ipns" testutil "github.com/libp2p/go-libp2p-testing/net" + ci "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" ) diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index a24e59dff9..c1259d8c41 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -8,19 +8,19 @@ import ( "time" keystore "github.com/ipfs/go-ipfs-keystore" - namesys "github.com/ipfs/go-namesys" - path "github.com/ipfs/go-path" + "github.com/ipfs/go-namesys" + "github.com/ipfs/go-path" "go.opentelemetry.io/otel/attribute" - proto "github.com/gogo/protobuf/proto" + "github.com/gogo/protobuf/proto" ds "github.com/ipfs/go-datastore" - ipns "github.com/ipfs/go-ipns" + "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" logging "github.com/ipfs/go-log" - goprocess "github.com/jbenet/goprocess" + "github.com/jbenet/goprocess" gpctx "github.com/jbenet/goprocess/context" - ic "github.com/libp2p/go-libp2p-core/crypto" - peer "github.com/libp2p/go-libp2p-core/peer" + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" ) var errNoEntry = errors.New("no previous entry") diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index c7c0f01856..e73edef95a 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -8,22 +8,22 @@ import ( "github.com/gogo/protobuf/proto" - goprocess "github.com/jbenet/goprocess" + "github.com/jbenet/goprocess" "github.com/libp2p/go-libp2p" - ic "github.com/libp2p/go-libp2p-core/crypto" - host "github.com/libp2p/go-libp2p-core/host" - peer "github.com/libp2p/go-libp2p-core/peer" - routing "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" + ic "github.com/libp2p/go-libp2p/core/crypto" + host "github.com/libp2p/go-libp2p/core/host" + peer "github.com/libp2p/go-libp2p/core/peer" + routing "github.com/libp2p/go-libp2p/core/routing" ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-ipns" ipns_pb "github.com/ipfs/go-ipns/pb" - path "github.com/ipfs/go-path" + "github.com/ipfs/go-path" keystore "github.com/ipfs/go-ipfs-keystore" - namesys "github.com/ipfs/go-namesys" + "github.com/ipfs/go-namesys" . "github.com/ipfs/go-namesys/republisher" ) diff --git a/namesys/routing.go b/namesys/routing.go index c73e23ed77..8c8fbee3e4 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -5,16 +5,16 @@ import ( "strings" "time" - proto "github.com/gogo/protobuf/proto" - cid "github.com/ipfs/go-cid" - ipns "github.com/ipfs/go-ipns" + "github.com/gogo/protobuf/proto" + "github.com/ipfs/go-cid" + "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" logging "github.com/ipfs/go-log" - path "github.com/ipfs/go-path" + "github.com/ipfs/go-path" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" - peer "github.com/libp2p/go-libp2p-core/peer" - routing "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/routing" mh "github.com/multiformats/go-multihash" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" From ff2eb2bff265f34012cca335447987da546ecee2 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 12 Dec 2022 21:09:45 +0100 Subject: [PATCH 3124/3147] feat: add UseCumulativeSize UnixfsLs option (#95) This commit was moved from ipfs/interface-go-ipfs-core@b1299abda0c69529c7efa02d5efb9f8905fdd4fe --- coreiface/options/unixfs.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/coreiface/options/unixfs.go b/coreiface/options/unixfs.go index 3fd96f772c..cd15991e27 100644 --- a/coreiface/options/unixfs.go +++ b/coreiface/options/unixfs.go @@ -39,7 +39,8 @@ type UnixfsAddSettings struct { } type UnixfsLsSettings struct { - ResolveChildren bool + ResolveChildren bool + UseCumulativeSize bool } type UnixfsAddOption func(*UnixfsAddSettings) error @@ -283,3 +284,10 @@ func (unixfsOpts) ResolveChildren(resolve bool) UnixfsLsOption { return nil } } + +func (unixfsOpts) UseCumulativeSize(use bool) UnixfsLsOption { + return func(settings *UnixfsLsSettings) error { + settings.UseCumulativeSize = use + return nil + } +} From 01de18ff3f4ccd639e02226048fda8a8f140941c Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 12 Jan 2023 11:45:13 +0100 Subject: [PATCH 3125/3147] chore: migrate files (#97) This commit was moved from ipfs/interface-go-ipfs-core@f7b346b76c5724489877c511754f0f11923d3214 --- coreiface/tests/name.go | 2 +- coreiface/tests/unixfs.go | 2 +- coreiface/unixfs.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coreiface/tests/name.go b/coreiface/tests/name.go index 2a8b4d76af..2e648babaa 100644 --- a/coreiface/tests/name.go +++ b/coreiface/tests/name.go @@ -10,7 +10,7 @@ import ( path "github.com/ipfs/interface-go-ipfs-core/path" - files "github.com/ipfs/go-ipfs-files" + "github.com/ipfs/go-libipfs/files" coreiface "github.com/ipfs/interface-go-ipfs-core" opt "github.com/ipfs/interface-go-ipfs-core/options" diff --git a/coreiface/tests/unixfs.go b/coreiface/tests/unixfs.go index 05226dbbf0..121d3db693 100644 --- a/coreiface/tests/unixfs.go +++ b/coreiface/tests/unixfs.go @@ -20,9 +20,9 @@ import ( "github.com/ipfs/interface-go-ipfs-core/options" "github.com/ipfs/go-cid" - files "github.com/ipfs/go-ipfs-files" cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-libipfs/files" mdag "github.com/ipfs/go-merkledag" "github.com/ipfs/go-unixfs" "github.com/ipfs/go-unixfs/importer/helpers" diff --git a/coreiface/unixfs.go b/coreiface/unixfs.go index c398b67223..3b21a8e238 100644 --- a/coreiface/unixfs.go +++ b/coreiface/unixfs.go @@ -7,7 +7,7 @@ import ( path "github.com/ipfs/interface-go-ipfs-core/path" "github.com/ipfs/go-cid" - files "github.com/ipfs/go-ipfs-files" + "github.com/ipfs/go-libipfs/files" ) type AddEvent struct { From bcf04980d0a2830974b19b530c5e616105ee3f20 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 12 Jan 2023 11:45:23 +0100 Subject: [PATCH 3126/3147] chore: migrate files (#134) This commit was moved from ipfs/go-unixfs@a76f0e5f3e2ec94638ea0fd358c5e13bd7ed4745 --- unixfs/file/unixfile.go | 2 +- unixfs/importer/helpers/dagbuilder.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unixfs/file/unixfile.go b/unixfs/file/unixfile.go index df3ce9e892..82ee20a4d4 100644 --- a/unixfs/file/unixfile.go +++ b/unixfs/file/unixfile.go @@ -7,8 +7,8 @@ import ( ft "github.com/ipfs/go-unixfs" uio "github.com/ipfs/go-unixfs/io" - files "github.com/ipfs/go-ipfs-files" ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-libipfs/files" dag "github.com/ipfs/go-merkledag" ) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index e3cf7b44f0..b59f41380f 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -13,9 +13,9 @@ import ( cid "github.com/ipfs/go-cid" chunker "github.com/ipfs/go-ipfs-chunker" - files "github.com/ipfs/go-ipfs-files" pi "github.com/ipfs/go-ipfs-posinfo" ipld "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-libipfs/files" ) var ErrMissingFsRef = errors.New("missing file path or URL, can't create filestore reference") From bcb9190c2bdbc0ad4823a1b1785fb87ec8014723 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 24 Jan 2023 23:44:55 +0100 Subject: [PATCH 3127/3147] feat: add namesys publish options (#94) * feat: add namesys publish options * feat: export DefaultIPNSRecordEOL * feat: export DefaultIPNSRecordTTL This commit was moved from ipfs/interface-go-ipfs-core@468dea4bb45aec6ddce2a6225334dcc062d6e752 --- coreiface/options/namesys/opts.go | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/coreiface/options/namesys/opts.go b/coreiface/options/namesys/opts.go index ee2bd5ac2a..0cd1ba7781 100644 --- a/coreiface/options/namesys/opts.go +++ b/coreiface/options/namesys/opts.go @@ -13,6 +13,15 @@ const ( // trust resolution to eventually complete and can't put an upper // limit on how many steps it will take. UnlimitedDepth = 0 + + // DefaultIPNSRecordTTL specifies the time that the record can be cached + // before checking if its validity again. + DefaultIPNSRecordTTL = time.Minute + + // DefaultIPNSRecordEOL specifies the time that the network will cache IPNS + // records after being published. Records should be re-published before this + // interval expires. We use the same default expiration as the DHT. + DefaultIPNSRecordEOL = 48 * time.Hour ) // ResolveOpts specifies options for resolving an IPNS path @@ -72,3 +81,43 @@ func ProcessOpts(opts []ResolveOpt) ResolveOpts { } return rsopts } + +// PublishOptions specifies options for publishing an IPNS record. +type PublishOptions struct { + EOL time.Time + TTL time.Duration +} + +// DefaultPublishOptions returns the default options for publishing an IPNS record. +func DefaultPublishOptions() PublishOptions { + return PublishOptions{ + EOL: time.Now().Add(DefaultIPNSRecordEOL), + TTL: DefaultIPNSRecordTTL, + } +} + +// PublishOption is used to set an option for PublishOpts. +type PublishOption func(*PublishOptions) + +// PublishWithEOL sets an EOL. +func PublishWithEOL(eol time.Time) PublishOption { + return func(o *PublishOptions) { + o.EOL = eol + } +} + +// PublishWithEOL sets a TTL. +func PublishWithTTL(ttl time.Duration) PublishOption { + return func(o *PublishOptions) { + o.TTL = ttl + } +} + +// ProcessPublishOptions converts an array of PublishOpt into a PublishOpts object. +func ProcessPublishOptions(opts []PublishOption) PublishOptions { + rsopts := DefaultPublishOptions() + for _, option := range opts { + option(&rsopts) + } + return rsopts +} From 00661e346e6eb11d375830e762f4dbc64b0230d9 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Wed, 25 Jan 2023 00:34:07 +0100 Subject: [PATCH 3128/3147] feat: use PublishOptions for publishing IPNS records (#35) * feat: use PublishOptions for publishing IPNS records * chore: interface-go-ipfs-core v0.9.0 Co-authored-by: Marcin Rataj This commit was moved from ipfs/go-namesys@3f6313c8c9d00ac4104def9edc36ad159f5c6b14 --- namesys/interface.go | 8 +--- namesys/namesys.go | 24 ++++++------ namesys/namesys_test.go | 3 +- namesys/publisher.go | 64 ++++++++----------------------- namesys/republisher/repub.go | 3 +- namesys/republisher/repub_test.go | 5 ++- 6 files changed, 35 insertions(+), 72 deletions(-) diff --git a/namesys/interface.go b/namesys/interface.go index 94045129b0..bd72538dab 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -31,7 +31,6 @@ package namesys import ( "errors" - "time" "context" @@ -95,12 +94,7 @@ type Resolver interface { // Publisher is an object capable of publishing particular names. type Publisher interface { - // Publish establishes a name-value mapping. // TODO make this not PrivKey specific. - Publish(ctx context.Context, name ci.PrivKey, value path.Path) error - - // TODO: to be replaced by a more generic 'PublishWithValidity' type - // call once the records spec is implemented - PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error + Publish(ctx context.Context, name ci.PrivKey, value path.Path, options ...opts.PublishOption) error } diff --git a/namesys/namesys.go b/namesys/namesys.go index f8218d371c..540aba4ea3 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -285,22 +285,24 @@ func emitOnceResult(ctx context.Context, outCh chan<- onceResult, r onceResult) } // Publish implements Publisher -func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { +func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path, options ...opts.PublishOption) error { ctx, span := StartSpan(ctx, "MPNS.Publish") defer span.End() - return ns.PublishWithEOL(ctx, name, value, time.Now().Add(DefaultRecordEOL)) -} -func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { - ctx, span := StartSpan(ctx, "MPNS.PublishWithEOL", trace.WithAttributes(attribute.String("Value", value.String()))) - defer span.End() + // This is a bit hacky. We do this because the EOL is based on the current + // time, but also needed in the end of the function. Therefore, we parse + // the options immediately and add an option PublishWithEOL with the EOL + // calculated in this moment. + publishOpts := opts.ProcessPublishOptions(options) + options = append(options, opts.PublishWithEOL(publishOpts.EOL)) + id, err := peer.IDFromPrivateKey(name) if err != nil { span.RecordError(err) return err } span.SetAttributes(attribute.String("ID", id.String())) - if err := ns.ipnsPublisher.PublishWithEOL(ctx, name, value, eol); err != nil { + if err := ns.ipnsPublisher.Publish(ctx, name, value, options...); err != nil { // Invalidate the cache. Publishing may _partially_ succeed but // still return an error. ns.cacheInvalidate(string(id)) @@ -308,11 +310,11 @@ func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path. return err } ttl := DefaultResolverCacheTTL - if setTTL, ok := checkCtxTTL(ctx); ok { - ttl = setTTL + if publishOpts.TTL >= 0 { + ttl = publishOpts.TTL } - if ttEol := time.Until(eol); ttEol < ttl { - ttl = ttEol + if ttEOL := time.Until(publishOpts.EOL); ttEOL < ttl { + ttl = ttEOL } ns.cacheSet(string(id), value, ttl) return nil diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index b56aa763a4..c641d49114 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -166,8 +166,7 @@ func TestPublishWithTTL(t *testing.T) { ttl := 1 * time.Second eol := time.Now().Add(2 * time.Second) - ctx := ContextWithTTL(context.Background(), ttl) - err = nsys.Publish(ctx, priv, p) + err = nsys.Publish(context.Background(), priv, p, opts.PublishWithEOL(eol), opts.PublishWithTTL(ttl)) if err != nil { t.Fatal(err) } diff --git a/namesys/publisher.go b/namesys/publisher.go index 317e0e7be2..37590f6215 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -12,6 +12,7 @@ import ( "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/routing" @@ -22,11 +23,6 @@ import ( const ipnsPrefix = "/ipns/" -// DefaultRecordEOL specifies the time that the network will cache IPNS -// records after being publihsed. Records should be re-published before this -// interval expires. -const DefaultRecordEOL = 24 * time.Hour - // IpnsPublisher is capable of publishing and resolving names to the IPFS // routing system. type IpnsPublisher struct { @@ -47,9 +43,18 @@ func NewIpnsPublisher(route routing.ValueStore, ds ds.Datastore) *IpnsPublisher // Publish implements Publisher. Accepts a keypair and a value, // and publishes it out to the routing system -func (p *IpnsPublisher) Publish(ctx context.Context, k crypto.PrivKey, value path.Path) error { +func (p *IpnsPublisher) Publish(ctx context.Context, k crypto.PrivKey, value path.Path, options ...opts.PublishOption) error { log.Debugf("Publish %s", value) - return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordEOL)) + + ctx, span := StartSpan(ctx, "IpnsPublisher.Publish", trace.WithAttributes(attribute.String("Value", value.String()))) + defer span.End() + + record, err := p.updateRecord(ctx, k, value, options...) + if err != nil { + return err + } + + return PutRecordToRouting(ctx, p.routing, k.GetPublic(), record) } // IpnsDsKey returns a datastore key given an IPNS identifier (peer @@ -142,7 +147,7 @@ func (p *IpnsPublisher) GetPublished(ctx context.Context, id peer.ID, checkRouti return e, nil } -func (p *IpnsPublisher) updateRecord(ctx context.Context, k crypto.PrivKey, value path.Path, eol time.Time) (*pb.IpnsEntry, error) { +func (p *IpnsPublisher) updateRecord(ctx context.Context, k crypto.PrivKey, value path.Path, options ...opts.PublishOption) (*pb.IpnsEntry, error) { id, err := peer.IDFromPrivateKey(k) if err != nil { return nil, err @@ -164,12 +169,10 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k crypto.PrivKey, valu seqno++ } - // Set the TTL - // TODO: Make this less hacky. - ttl, _ := checkCtxTTL(ctx) + opts := opts.ProcessPublishOptions(options) // Create record - entry, err := ipns.Create(k, []byte(value), seqno, eol, ttl) + entry, err := ipns.Create(k, []byte(value), seqno, opts.EOL, opts.TTL) if err != nil { return nil, err } @@ -190,33 +193,6 @@ func (p *IpnsPublisher) updateRecord(ctx context.Context, k crypto.PrivKey, valu return entry, nil } -// PublishWithEOL is a temporary stand in for the ipns records implementation -// see here for more details: https://github.com/ipfs/specs/tree/master/records -func (p *IpnsPublisher) PublishWithEOL(ctx context.Context, k crypto.PrivKey, value path.Path, eol time.Time) error { - ctx, span := StartSpan(ctx, "IpnsPublisher.PublishWithEOL", trace.WithAttributes(attribute.String("Value", value.String()))) - defer span.End() - - record, err := p.updateRecord(ctx, k, value, eol) - if err != nil { - return err - } - - return PutRecordToRouting(ctx, p.routing, k.GetPublic(), record) -} - -// setting the TTL on published records is an experimental feature. -// as such, i'm using the context to wire it through to avoid changing too -// much code along the way. -func checkCtxTTL(ctx context.Context) (time.Duration, bool) { - v := ctx.Value(ttlContextKey) - if v == nil { - return 0, false - } - - d, ok := v.(time.Duration) - return d, ok -} - // PutRecordToRouting publishes the given entry using the provided ValueStore, // keyed on the ID associated with the provided public key. The public key is // also made available to the routing system so that entries can be verified. @@ -307,13 +283,3 @@ func PublishEntry(ctx context.Context, r routing.ValueStore, ipnskey string, rec func PkKeyForID(id peer.ID) string { return "/pk/" + string(id) } - -// contextKey is a private comparable type used to hold value keys in contexts -type contextKey string - -var ttlContextKey contextKey = "ipns-publish-ttl" - -// ContextWithTTL returns a copy of the parent context with an added value representing the TTL -func ContextWithTTL(ctx context.Context, ttl time.Duration) context.Context { - return context.WithValue(context.Background(), ttlContextKey, ttl) -} diff --git a/namesys/republisher/repub.go b/namesys/republisher/repub.go index c1259d8c41..d0857b48a9 100644 --- a/namesys/republisher/repub.go +++ b/namesys/republisher/repub.go @@ -17,6 +17,7 @@ import ( "github.com/ipfs/go-ipns" pb "github.com/ipfs/go-ipns/pb" logging "github.com/ipfs/go-log" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" "github.com/jbenet/goprocess" gpctx "github.com/jbenet/goprocess/context" ic "github.com/libp2p/go-libp2p/core/crypto" @@ -161,7 +162,7 @@ func (rp *Republisher) republishEntry(ctx context.Context, priv ic.PrivKey) erro if prevEol.After(eol) { eol = prevEol } - err = rp.ns.PublishWithEOL(ctx, priv, p, eol) + err = rp.ns.Publish(ctx, priv, p, opts.PublishWithEOL(eol)) span.RecordError(err) return err } diff --git a/namesys/republisher/repub_test.go b/namesys/republisher/repub_test.go index e73edef95a..cf857023ac 100644 --- a/namesys/republisher/repub_test.go +++ b/namesys/republisher/repub_test.go @@ -21,6 +21,7 @@ import ( "github.com/ipfs/go-ipns" ipns_pb "github.com/ipfs/go-ipns/pb" "github.com/ipfs/go-path" + opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" keystore "github.com/ipfs/go-ipfs-keystore" "github.com/ipfs/go-namesys" @@ -103,7 +104,7 @@ func TestRepublish(t *testing.T) { timeout := time.Second for { expiration = time.Now().Add(time.Second) - err := rp.PublishWithEOL(ctx, publisher.privKey, p, expiration) + err := rp.Publish(ctx, publisher.privKey, p, opts.PublishWithEOL(expiration)) if err != nil { t.Fatal(err) } @@ -179,7 +180,7 @@ func TestLongEOLRepublish(t *testing.T) { name := "/ipns/" + publisher.id expiration := time.Now().Add(time.Hour) - err := rp.PublishWithEOL(ctx, publisher.privKey, p, expiration) + err := rp.Publish(ctx, publisher.privKey, p, opts.PublishWithEOL(expiration)) if err != nil { t.Fatal(err) } From b3ab88834562c689b5eadfed2e08e732fea4392a Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 14 Nov 2022 17:18:43 +0100 Subject: [PATCH 3129/3147] feat: add RoutingAPI to CoreAPI This commit was moved from ipfs/interface-go-ipfs-core@177d25ba92ed67ab4916cb13827321c389961de0 --- coreiface/coreapi.go | 3 +++ coreiface/routing.go | 14 ++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 coreiface/routing.go diff --git a/coreiface/coreapi.go b/coreiface/coreapi.go index 894ffb3187..722c00a0f5 100644 --- a/coreiface/coreapi.go +++ b/coreiface/coreapi.go @@ -44,6 +44,9 @@ type CoreAPI interface { // PubSub returns an implementation of PubSub API PubSub() PubSubAPI + // Routing returns an implementation of Routing API + Routing() RoutingAPI + // ResolvePath resolves the path using Unixfs resolver ResolvePath(context.Context, path.Path) (path.Resolved, error) diff --git a/coreiface/routing.go b/coreiface/routing.go new file mode 100644 index 0000000000..a28ceb9e77 --- /dev/null +++ b/coreiface/routing.go @@ -0,0 +1,14 @@ +package iface + +import ( + "context" +) + +// RoutingAPI specifies the interface to the routing layer. +type RoutingAPI interface { + // Get retrieves the best value for a given key + Get(context.Context, string) ([]byte, error) + + // Put sets a value for a given key + Put(ctx context.Context, key string, value []byte) error +} From 61995069b81268f3e5dc8d7cea930087c60406c1 Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Wed, 8 Feb 2023 16:03:14 +0100 Subject: [PATCH 3130/3147] sync: update CI config files (#45) This commit was moved from ipfs/go-ipns@72be64e27e743b828fe4eb8a721abd1b97610421 --- ipns/pb/ipns.pb.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ipns/pb/ipns.pb.go b/ipns/pb/ipns.pb.go index 8bcace7fcc..8bbb654d21 100644 --- a/ipns/pb/ipns.pb.go +++ b/ipns/pb/ipns.pb.go @@ -5,10 +5,11 @@ package ipns_pb import ( fmt "fmt" - proto "github.com/gogo/protobuf/proto" io "io" math "math" math_bits "math/bits" + + proto "github.com/gogo/protobuf/proto" ) // Reference imports to suppress errors if they are not otherwise used. From 790ce94eb6c76f9f1003c17232eec2539b040202 Mon Sep 17 00:00:00 2001 From: web3-bot <81333946+web3-bot@users.noreply.github.com> Date: Wed, 8 Feb 2023 16:04:00 +0100 Subject: [PATCH 3131/3147] sync: update CI config files (#18) This commit was moved from ipfs/go-verifcid@c45e93b5f91e708e398cf06f3257262f2dc5d56a --- verifcid/validate.go | 1 + 1 file changed, 1 insertion(+) diff --git a/verifcid/validate.go b/verifcid/validate.go index e594629f4b..7b27debc94 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -2,6 +2,7 @@ package verifcid import ( "fmt" + cid "github.com/ipfs/go-cid" mh "github.com/multiformats/go-multihash" ) From 48f8c69a903b1e66f8725f6b5ce9741b8e88c5a1 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Wed, 8 Feb 2023 08:37:20 +0100 Subject: [PATCH 3132/3147] test: basic routing interface test This commit was moved from ipfs/interface-go-ipfs-core@d069f41be1eea938a4bbaa16dae953eed24bc945 --- coreiface/tests/api.go | 1 + coreiface/tests/routing.go | 92 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 coreiface/tests/routing.go diff --git a/coreiface/tests/api.go b/coreiface/tests/api.go index 0801b3ca7f..ec1f63ae6b 100644 --- a/coreiface/tests/api.go +++ b/coreiface/tests/api.go @@ -69,6 +69,7 @@ func TestApi(p Provider) func(t *testing.T) { t.Run("Path", tp.TestPath) t.Run("Pin", tp.TestPin) t.Run("PubSub", tp.TestPubSub) + t.Run("Routing", tp.TestRouting) t.Run("Unixfs", tp.TestUnixfs) apis <- -1 diff --git a/coreiface/tests/routing.go b/coreiface/tests/routing.go new file mode 100644 index 0000000000..14e0d2e66e --- /dev/null +++ b/coreiface/tests/routing.go @@ -0,0 +1,92 @@ +package tests + +import ( + "context" + "testing" + "time" + + "github.com/gogo/protobuf/proto" + ipns_pb "github.com/ipfs/go-ipns/pb" + iface "github.com/ipfs/interface-go-ipfs-core" +) + +func (tp *TestSuite) TestRouting(t *testing.T) { + tp.hasApi(t, func(api iface.CoreAPI) error { + if api.Routing() == nil { + return errAPINotImplemented + } + return nil + }) + + t.Run("TestRoutingGet", tp.TestRoutingGet) + t.Run("TestRoutingPut", tp.TestRoutingPut) +} + +func (tp *TestSuite) testRoutingPublishKey(t *testing.T, ctx context.Context, api iface.CoreAPI) iface.IpnsEntry { + p, err := addTestObject(ctx, api) + if err != nil { + t.Fatal(err) + } + + entry, err := api.Name().Publish(ctx, p) + if err != nil { + t.Fatal(err) + } + + time.Sleep(3 * time.Second) + return entry +} + +func (tp *TestSuite) TestRoutingGet(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + apis, err := tp.MakeAPISwarm(ctx, true, 2) + if err != nil { + t.Fatal(err) + } + + // Node 1: publishes an IPNS name + ipnsEntry := tp.testRoutingPublishKey(t, ctx, apis[0]) + + // Node 2: retrieves the best value for the IPNS name. + data, err := apis[1].Routing().Get(ctx, "/ipns/"+ipnsEntry.Name()) + if err != nil { + t.Fatal(err) + } + + // Checks if values match. + var entry ipns_pb.IpnsEntry + err = proto.Unmarshal(data, &entry) + if err != nil { + t.Fatal(err) + } + + if string(entry.GetValue()) != ipnsEntry.Value().String() { + t.Fatalf("routing key has wrong value, expected %s, got %s", ipnsEntry.Value().String(), string(entry.GetValue())) + } +} + +func (tp *TestSuite) TestRoutingPut(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + apis, err := tp.MakeAPISwarm(ctx, true, 1) + if err != nil { + t.Fatal(err) + } + + // Create and publish IPNS entry. + ipnsEntry := tp.testRoutingPublishKey(t, ctx, apis[0]) + + // Get valid routing value. + data, err := apis[0].Routing().Get(ctx, "/ipns/"+ipnsEntry.Name()) + if err != nil { + t.Fatal(err) + } + + // Put routing value. + err = apis[0].Routing().Put(ctx, "/ipns/"+ipnsEntry.Name(), data) + if err != nil { + t.Fatal(err) + } +} From 4e262c8820c1d17c07c579b85d09b9a04955585a Mon Sep 17 00:00:00 2001 From: Jorropo Date: Tue, 10 Jan 2023 14:31:19 +0100 Subject: [PATCH 3133/3147] fix: correctly handle degenerate hamts while reading data Fixes https://github.com/ipfs/go-unixfs/security/advisories/GHSA-q264-w97q-q778 This commit was moved from ipfs/go-unixfs@dbcc43ec3e2db0d01e8d80c55040bba3cf22cb4b --- unixfs/hamt/hamt.go | 22 ++++++++++++++++++---- unixfs/hamt/hamt_test.go | 8 +++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/unixfs/hamt/hamt.go b/unixfs/hamt/hamt.go index c6cae88ea7..3dc7b8a6f8 100644 --- a/unixfs/hamt/hamt.go +++ b/unixfs/hamt/hamt.go @@ -106,12 +106,16 @@ func makeShard(ds ipld.DAGService, size int, key string, val *ipld.Link) (*Shard if err != nil { return nil, err } + childer, err := newChilder(ds, size) + if err != nil { + return nil, err + } maxpadding := fmt.Sprintf("%X", size-1) s := &Shard{ tableSizeLg2: lg2s, prefixPadStr: fmt.Sprintf("%%0%dX", len(maxpadding)), maxpadlen: len(maxpadding), - childer: newChilder(ds, size), + childer: childer, tableSize: size, dserv: ds, @@ -765,11 +769,21 @@ type childer struct { children []*Shard } -func newChilder(ds ipld.DAGService, size int) *childer { +const maximumHamtWidth = 1 << 10 // FIXME: Spec this and decide of a correct value + +func newChilder(ds ipld.DAGService, size int) (*childer, error) { + if size > maximumHamtWidth { + return nil, fmt.Errorf("hamt witdh (%d) exceed maximum allowed (%d)", size, maximumHamtWidth) + } + bf, err := bitfield.NewBitfield(size) + if err != nil { + return nil, err + } + return &childer{ dserv: ds, - bitfield: bitfield.NewBitfield(size), - } + bitfield: bf, + }, nil } func (s *childer) makeChilder(data []byte, links []*ipld.Link) *childer { diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index 150b97b904..c68e05632c 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -737,8 +737,10 @@ func BenchmarkHAMTSet(b *testing.B) { } func TestHamtBadSize(t *testing.T) { - _, err := NewShard(nil, 7) - if err == nil { - t.Fatal("should have failed to construct hamt with bad size") + for _, size := range [...]int{-8, 7, 2, 1337, 1024 + 8, -3} { + _, err := NewShard(nil, size) + if err == nil { + t.Error("should have failed to construct hamt with bad size: %d", size) + } } } From 6c761b340929aac8fc4cd4f580539adb251af1cf Mon Sep 17 00:00:00 2001 From: Jorropo Date: Thu, 9 Feb 2023 20:02:06 +0100 Subject: [PATCH 3134/3147] test: fix tests after hamt issues fixes This commit was moved from ipfs/go-unixfs@6727e33d441dba5b2c97c309c1c9fa1b49e78047 --- unixfs/hamt/hamt_test.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/unixfs/hamt/hamt_test.go b/unixfs/hamt/hamt_test.go index c68e05632c..2b9a7f4046 100644 --- a/unixfs/hamt/hamt_test.go +++ b/unixfs/hamt/hamt_test.go @@ -31,7 +31,10 @@ func makeDir(ds ipld.DAGService, size int) ([]string, *Shard, error) { func makeDirWidth(ds ipld.DAGService, size, width int) ([]string, *Shard, error) { ctx := context.Background() - s, _ := NewShard(ds, width) + s, err := NewShard(ds, width) + if err != nil { + return nil, nil, err + } var dirs []string for i := 0; i < size; i++ { @@ -42,8 +45,11 @@ func makeDirWidth(ds ipld.DAGService, size, width int) ([]string, *Shard, error) for i := 0; i < len(dirs); i++ { nd := ft.EmptyDirNode() - ds.Add(ctx, nd) - err := s.Set(ctx, dirs[i], nd) + err := ds.Add(ctx, nd) + if err != nil { + return nil, nil, err + } + err = s.Set(ctx, dirs[i], nd) if err != nil { return nil, nil, err } @@ -126,7 +132,7 @@ func assertSerializationWorks(ds ipld.DAGService, s *Shard) error { func TestBasicSet(t *testing.T) { ds := mdtest.Mock() - for _, w := range []int{128, 256, 512, 1024, 2048, 4096} { + for _, w := range []int{128, 256, 512, 1024} { t.Run(fmt.Sprintf("BasicSet%d", w), func(t *testing.T) { names, s, err := makeDirWidth(ds, 1000, w) if err != nil { @@ -740,7 +746,7 @@ func TestHamtBadSize(t *testing.T) { for _, size := range [...]int{-8, 7, 2, 1337, 1024 + 8, -3} { _, err := NewShard(nil, size) if err == nil { - t.Error("should have failed to construct hamt with bad size: %d", size) + t.Errorf("should have failed to construct hamt with bad size: %d", size) } } } From 54d20f01739e73f7c770db8f2dc0be1c2185ce20 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Fri, 10 Feb 2023 03:25:12 +0100 Subject: [PATCH 3135/3147] test: use two nodes in publish This spin up online nodes instead of offline ones. This commit was moved from ipfs/interface-go-ipfs-core@a8d2741bbe08a6ba54cf4a4e229eff6978be1b77 --- coreiface/tests/routing.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreiface/tests/routing.go b/coreiface/tests/routing.go index 14e0d2e66e..64287487e2 100644 --- a/coreiface/tests/routing.go +++ b/coreiface/tests/routing.go @@ -70,7 +70,7 @@ func (tp *TestSuite) TestRoutingGet(t *testing.T) { func (tp *TestSuite) TestRoutingPut(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - apis, err := tp.MakeAPISwarm(ctx, true, 1) + apis, err := tp.MakeAPISwarm(ctx, true, 2) if err != nil { t.Fatal(err) } @@ -85,7 +85,7 @@ func (tp *TestSuite) TestRoutingPut(t *testing.T) { } // Put routing value. - err = apis[0].Routing().Put(ctx, "/ipns/"+ipnsEntry.Name(), data) + err = apis[1].Routing().Put(ctx, "/ipns/"+ipnsEntry.Name(), data) if err != nil { t.Fatal(err) } From 6e23bc24bd8fa077df3b119c43b332ea216e53d0 Mon Sep 17 00:00:00 2001 From: zuuluuz <55690197+cpucorecore@users.noreply.github.com> Date: Wed, 14 Dec 2022 10:21:35 +0800 Subject: [PATCH 3136/3147] fix: correctly handle errors in balancedbuilder's Layout this will lose block when newRoot.AddChild returns err. in ipfs-cluster single dag service add(context.TODO(), node) maybe failed when not enough peers to allocate for this block node This commit was moved from ipfs/go-unixfs@98e2622dffd9735f0638b178d4387e4eab65ad1c --- unixfs/importer/balanced/builder.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unixfs/importer/balanced/builder.go b/unixfs/importer/balanced/builder.go index 3379e97655..a58bc1f1a2 100644 --- a/unixfs/importer/balanced/builder.go +++ b/unixfs/importer/balanced/builder.go @@ -158,7 +158,10 @@ func Layout(db *h.DagBuilderHelper) (ipld.Node, error) { // Add the old `root` as a child of the `newRoot`. newRoot := db.NewFSNodeOverDag(ft.TFile) - newRoot.AddChild(root, fileSize, db) + err = newRoot.AddChild(root, fileSize, db) + if err != nil { + return nil, err + } // Fill the `newRoot` (that has the old `root` already as child) // and make it the current `root` for the next iteration (when From 9f118149f9db2d1de8fe5970eda531661185f9a1 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Fri, 10 Feb 2023 14:22:08 +0100 Subject: [PATCH 3137/3147] fix: correctly handle return errors This commit was moved from ipfs/go-unixfs@b7f6de0737d9ba79aded9ae3c52bf367bee2febf --- unixfs/importer/helpers/dagbuilder.go | 5 ++--- unixfs/io/directory.go | 7 ++++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/unixfs/importer/helpers/dagbuilder.go b/unixfs/importer/helpers/dagbuilder.go index b59f41380f..e724246671 100644 --- a/unixfs/importer/helpers/dagbuilder.go +++ b/unixfs/importer/helpers/dagbuilder.go @@ -189,11 +189,10 @@ func (db *DagBuilderHelper) FillNodeLayer(node *FSNodeOverDag) error { return err } } - node.Commit() // TODO: Do we need to commit here? The caller who created the // `FSNodeOverDag` should be in charge of that. - - return nil + _, err := node.Commit() + return err } // NewLeafDataNode builds the `node` with the data obtained from the diff --git a/unixfs/io/directory.go b/unixfs/io/directory.go index b602bf9ab6..d591e08d23 100644 --- a/unixfs/io/directory.go +++ b/unixfs/io/directory.go @@ -164,7 +164,8 @@ func NewDirectoryFromNode(dserv ipld.DAGService, node ipld.Node) (Directory, err func (d *BasicDirectory) computeEstimatedSize() { d.estimatedSize = 0 - d.ForEachLink(context.TODO(), func(l *ipld.Link) error { + // err is just breaking the iteration and we always return nil + _ = d.ForEachLink(context.TODO(), func(l *ipld.Link) error { d.addToEstimatedSize(l.Name, l.Cid) return nil }) @@ -570,7 +571,7 @@ func (d *DynamicDirectory) AddChild(ctx context.Context, name string, nd ipld.No if err != nil { return err } - hamtDir.AddChild(ctx, name, nd) + err = hamtDir.AddChild(ctx, name, nd) if err != nil { return err } @@ -600,7 +601,7 @@ func (d *DynamicDirectory) RemoveChild(ctx context.Context, name string) error { if err != nil { return err } - basicDir.RemoveChild(ctx, name) + err = basicDir.RemoveChild(ctx, name) if err != nil { return err } From e19b61d2a7c71464d1a6f0ef95302d5215725548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 22 Feb 2023 15:46:32 +0100 Subject: [PATCH 3138/3147] feat!: add and connect missing context, remove RemovePinWithMode (#23) This commit was moved from ipfs/go-ipfs-pinner@9abb80fb49ff5c8567bf4746ee4fc543da941c64 --- pinning/pinner/dspinner/pin.go | 165 ++++++++++++---------------- pinning/pinner/dspinner/pin_test.go | 44 +------- pinning/pinner/pin.go | 9 +- 3 files changed, 74 insertions(+), 144 deletions(-) diff --git a/pinning/pinner/dspinner/pin.go b/pinning/pinner/dspinner/pin.go index fa3d9e7540..efe36df553 100644 --- a/pinning/pinner/dspinner/pin.go +++ b/pinning/pinner/dspinner/pin.go @@ -13,14 +13,15 @@ import ( "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/query" - ipfspinner "github.com/ipfs/go-ipfs-pinner" - "github.com/ipfs/go-ipfs-pinner/dsindex" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" "github.com/ipfs/go-merkledag" "github.com/ipfs/go-merkledag/dagutils" "github.com/polydawn/refmt/cbor" "github.com/polydawn/refmt/obj/atlas" + + ipfspinner "github.com/ipfs/go-ipfs-pinner" + "github.com/ipfs/go-ipfs-pinner/dsindex" ) const ( @@ -179,23 +180,30 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { return err } - c := node.Cid() + if recurse { + return p.doPinRecursive(ctx, node.Cid(), true) + } else { + return p.doPinDirect(ctx, node.Cid()) + } +} + +func (p *pinner) doPinRecursive(ctx context.Context, c cid.Cid, fetch bool) error { cidKey := c.KeyString() p.lock.Lock() defer p.lock.Unlock() - if recurse { - found, err := p.cidRIndex.HasAny(ctx, cidKey) - if err != nil { - return err - } - if found { - return nil - } + found, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if found { + return nil + } - dirtyBefore := p.dirty + dirtyBefore := p.dirty + if fetch { // temporary unlock to fetch the entire graph p.lock.Unlock() // Fetch graph starting at node identified by cid @@ -204,54 +212,63 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error { if err != nil { return err } + } - // If autosyncing, sync dag service before making any change to pins - err = p.flushDagService(ctx, false) - if err != nil { - return err - } - - // Only look again if something has changed. - if p.dirty != dirtyBefore { - found, err = p.cidRIndex.HasAny(ctx, cidKey) - if err != nil { - return err - } - if found { - return nil - } - } + // If autosyncing, sync dag service before making any change to pins + err = p.flushDagService(ctx, false) + if err != nil { + return err + } - // TODO: remove this to support multiple pins per CID - found, err = p.cidDIndex.HasAny(ctx, cidKey) + // Only look again if something has changed. + if p.dirty != dirtyBefore { + found, err = p.cidRIndex.HasAny(ctx, cidKey) if err != nil { return err } if found { - _, err = p.removePinsForCid(ctx, c, ipfspinner.Direct) - if err != nil { - return err - } + return nil } + } - _, err = p.addPin(ctx, c, ipfspinner.Recursive, "") - if err != nil { - return err - } - } else { - found, err := p.cidRIndex.HasAny(ctx, cidKey) + // TODO: remove this to support multiple pins per CID + found, err = p.cidDIndex.HasAny(ctx, cidKey) + if err != nil { + return err + } + if found { + _, err = p.removePinsForCid(ctx, c, ipfspinner.Direct) if err != nil { return err } - if found { - return fmt.Errorf("%s already pinned recursively", c.String()) - } + } - _, err = p.addPin(ctx, c, ipfspinner.Direct, "") - if err != nil { - return err - } + _, err = p.addPin(ctx, c, ipfspinner.Recursive, "") + if err != nil { + return err + } + return p.flushPins(ctx, false) +} + +func (p *pinner) doPinDirect(ctx context.Context, c cid.Cid) error { + cidKey := c.KeyString() + + p.lock.Lock() + defer p.lock.Unlock() + + found, err := p.cidRIndex.HasAny(ctx, cidKey) + if err != nil { + return err } + if found { + return fmt.Errorf("%s already pinned recursively", c.String()) + } + + _, err = p.addPin(ctx, c, ipfspinner.Direct, "") + if err != nil { + return err + } + return p.flushPins(ctx, false) } @@ -555,35 +572,6 @@ func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinn return pinned, nil } -// RemovePinWithMode is for manually editing the pin structure. -// Use with care! If used improperly, garbage collection may not -// be successful. -func (p *pinner) RemovePinWithMode(c cid.Cid, mode ipfspinner.Mode) { - ctx := context.TODO() - // Check cache to see if CID is pinned - switch mode { - case ipfspinner.Direct, ipfspinner.Recursive: - default: - // programmer error, panic OK - panic("unrecognized pin type") - } - - p.lock.Lock() - defer p.lock.Unlock() - - removed, err := p.removePinsForCid(ctx, c, mode) - if err != nil { - log.Error("cound not remove pins: %s", err) - return - } - if !removed { - return - } - if err = p.flushPins(ctx, false); err != nil { - log.Error("cound not remove pins: %s", err) - } -} - // removePinsForCid removes all pins for a cid that has the specified mode. // Returns true if any pins, and all corresponding CID index entries, were // removed. Otherwise, returns false. @@ -826,32 +814,15 @@ func (p *pinner) Flush(ctx context.Context) error { // PinWithMode allows the user to have fine grained control over pin // counts -func (p *pinner) PinWithMode(c cid.Cid, mode ipfspinner.Mode) { - ctx := context.TODO() - - p.lock.Lock() - defer p.lock.Unlock() - +func (p *pinner) PinWithMode(ctx context.Context, c cid.Cid, mode ipfspinner.Mode) error { // TODO: remove his to support multiple pins per CID switch mode { case ipfspinner.Recursive: - if has, _ := p.cidRIndex.HasAny(ctx, c.KeyString()); has { - return // already a recursive pin for this CID - } + return p.doPinRecursive(ctx, c, false) case ipfspinner.Direct: - if has, _ := p.cidDIndex.HasAny(ctx, c.KeyString()); has { - return // already a direct pin for this CID - } + return p.doPinDirect(ctx, c) default: - panic("unrecognized pin mode") - } - - _, err := p.addPin(ctx, c, mode, "") - if err != nil { - return - } - if err = p.flushPins(ctx, false); err != nil { - log.Errorf("failed to create %s pin: %s", mode, err) + return fmt.Errorf("unrecognized pin mode") } } diff --git a/pinning/pinner/dspinner/pin_test.go b/pinning/pinner/dspinner/pin_test.go index 4e12fefb71..11c7ade192 100644 --- a/pinning/pinner/dspinner/pin_test.go +++ b/pinning/pinner/dspinner/pin_test.go @@ -19,10 +19,11 @@ import ( lds "github.com/ipfs/go-ds-leveldb" blockstore "github.com/ipfs/go-ipfs-blockstore" offline "github.com/ipfs/go-ipfs-exchange-offline" - ipfspin "github.com/ipfs/go-ipfs-pinner" util "github.com/ipfs/go-ipfs-util" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log" + + ipfspin "github.com/ipfs/go-ipfs-pinner" ) var rand = util.NewTimeSeededRand() @@ -375,45 +376,6 @@ func TestAddLoadPin(t *testing.T) { } } -func TestRemovePinWithMode(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - dstore := dssync.MutexWrap(ds.NewMapDatastore()) - bstore := blockstore.NewBlockstore(dstore) - bserv := bs.New(bstore, offline.Exchange(bstore)) - - dserv := mdag.NewDAGService(bserv) - - p, err := New(ctx, dstore, dserv) - if err != nil { - t.Fatal(err) - } - - a, ak := randNode() - err = dserv.Add(ctx, a) - if err != nil { - panic(err) - } - - err = p.Pin(ctx, a, false) - if err != nil { - t.Fatal(err) - } - - ok, err := p.removePinsForCid(ctx, ak, ipfspin.Recursive) - if err != nil { - t.Fatal(err) - } - if ok { - t.Error("pin should not have been removed") - } - - p.RemovePinWithMode(ak, ipfspin.Direct) - - assertUnpinned(t, p, ak, "pin was not removed") -} - func TestIsPinnedLookup(t *testing.T) { // Test that lookups work in pins which share // the same branches. For that construct this tree: @@ -523,7 +485,7 @@ func TestFlush(t *testing.T) { } _, k := randNode() - p.PinWithMode(k, ipfspin.Recursive) + p.PinWithMode(ctx, k, ipfspin.Recursive) if err = p.Flush(ctx); err != nil { t.Fatal(err) } diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index bbabac5a03..27f4b4065f 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -92,6 +92,8 @@ type Pinner interface { IsPinnedWithType(ctx context.Context, c cid.Cid, mode Mode) (string, bool, error) // Pin the given node, optionally recursively. + // Pin will make sure that the given node and its children if recursive is set + // are stored locally. Pin(ctx context.Context, node ipld.Node, recursive bool) error // Unpin the given cid. If recursive is true, removes either a recursive or @@ -111,12 +113,7 @@ type Pinner interface { // PinWithMode is for manually editing the pin structure. Use with // care! If used improperly, garbage collection may not be // successful. - PinWithMode(cid.Cid, Mode) - - // RemovePinWithMode is for manually editing the pin structure. - // Use with care! If used improperly, garbage collection may not - // be successful. - RemovePinWithMode(cid.Cid, Mode) + PinWithMode(context.Context, cid.Cid, Mode) error // Flush writes the pin state to the backing datastore Flush(ctx context.Context) error From 61d62da9f084432ba0bc91f0717c1d92acd5dcee Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 22 Feb 2023 23:20:04 +0100 Subject: [PATCH 3139/3147] Make poseidon hashes good hashes This hash function is heavily used by Filecoin, making Kubo unable to operate with Filecoin data. This commit was moved from ipfs/go-verifcid@d55ee9d460b3be77ec753ec6f0927be9c154612c --- verifcid/validate.go | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/verifcid/validate.go b/verifcid/validate.go index 7b27debc94..02a48b200d 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -15,20 +15,21 @@ const minimumHashLength = 20 const maximumHashLength = 128 var goodset = map[uint64]bool{ - mh.SHA2_256: true, - mh.SHA2_512: true, - mh.SHA3_224: true, - mh.SHA3_256: true, - mh.SHA3_384: true, - mh.SHA3_512: true, - mh.SHAKE_256: true, - mh.DBL_SHA2_256: true, - mh.KECCAK_224: true, - mh.KECCAK_256: true, - mh.KECCAK_384: true, - mh.KECCAK_512: true, - mh.BLAKE3: true, - mh.IDENTITY: true, + mh.SHA2_256: true, + mh.SHA2_512: true, + mh.SHA3_224: true, + mh.SHA3_256: true, + mh.SHA3_384: true, + mh.SHA3_512: true, + mh.SHAKE_256: true, + mh.DBL_SHA2_256: true, + mh.KECCAK_224: true, + mh.KECCAK_256: true, + mh.KECCAK_384: true, + mh.KECCAK_512: true, + mh.BLAKE3: true, + mh.IDENTITY: true, + mh.POSEIDON_BLS12_381_A1_FC1: true, mh.SHA1: true, // not really secure but still useful } From 8f28875eec44d5729ce5cb0b188926d7566ee7d7 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 22 Feb 2023 23:30:33 +0100 Subject: [PATCH 3140/3147] Add SHA2_256_TRUNC254_PADDED and X11 (additional filecoin hashes) This commit was moved from ipfs/go-verifcid@4c96c9345d7c202cede5bdd17280aede61ea18b6 --- verifcid/validate.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/verifcid/validate.go b/verifcid/validate.go index 02a48b200d..9164d6d85e 100644 --- a/verifcid/validate.go +++ b/verifcid/validate.go @@ -30,6 +30,8 @@ var goodset = map[uint64]bool{ mh.BLAKE3: true, mh.IDENTITY: true, mh.POSEIDON_BLS12_381_A1_FC1: true, + mh.SHA2_256_TRUNC254_PADDED: true, + mh.X11: true, mh.SHA1: true, // not really secure but still useful } From cd0d3b130253593931b98af387e38576de773699 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Thu, 23 Feb 2023 15:00:37 +0100 Subject: [PATCH 3141/3147] feat: expose ErrInvalidPath and implement .Is function (#66) This commit was moved from ipfs/go-path@679319821f9cc9314cd7ca478adc2b48e37aa938 --- path/error.go | 16 ++++++++++------ path/error_test.go | 16 ++++++++++++++++ path/path.go | 20 ++++++++++---------- 3 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 path/error_test.go diff --git a/path/error.go b/path/error.go index ca2e8416d5..dafc446b5a 100644 --- a/path/error.go +++ b/path/error.go @@ -4,20 +4,24 @@ import ( "fmt" ) -// helper type so path parsing errors include the path -type pathError struct { +type ErrInvalidPath struct { error error path string } -func (e *pathError) Error() string { +func (e ErrInvalidPath) Error() string { return fmt.Sprintf("invalid path %q: %s", e.path, e.error) } -func (e *pathError) Unwrap() error { +func (e ErrInvalidPath) Unwrap() error { return e.error } -func (e *pathError) Path() string { - return e.path +func (e ErrInvalidPath) Is(err error) bool { + switch err.(type) { + case ErrInvalidPath: + return true + default: + return false + } } diff --git a/path/error_test.go b/path/error_test.go new file mode 100644 index 0000000000..07aab64081 --- /dev/null +++ b/path/error_test.go @@ -0,0 +1,16 @@ +package path + +import ( + "errors" + "testing" +) + +func TestErrorIs(t *testing.T) { + if !errors.Is(ErrInvalidPath{path: "foo", error: errors.New("bar")}, ErrInvalidPath{}) { + t.Fatal("error must be error") + } + + if !errors.Is(&ErrInvalidPath{path: "foo", error: errors.New("bar")}, ErrInvalidPath{}) { + t.Fatal("pointer to error must be error") + } +} diff --git a/path/path.go b/path/path.go index e70d963844..6d53ade047 100644 --- a/path/path.go +++ b/path/path.go @@ -97,33 +97,33 @@ func ParsePath(txt string) (Path, error) { // we expect this to start with a hash, and be an 'ipfs' path if parts[0] != "" { if _, err := decodeCid(parts[0]); err != nil { - return "", &pathError{error: err, path: txt} + return "", &ErrInvalidPath{error: err, path: txt} } // The case when the path starts with hash without a protocol prefix return Path("/ipfs/" + txt), nil } if len(parts) < 3 { - return "", &pathError{error: fmt.Errorf("invalid ipfs path"), path: txt} + return "", &ErrInvalidPath{error: fmt.Errorf("invalid ipfs path"), path: txt} } //TODO: make this smarter switch parts[1] { case "ipfs", "ipld": if parts[2] == "" { - return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} + return "", &ErrInvalidPath{error: fmt.Errorf("not enough path components"), path: txt} } // Validate Cid. _, err := decodeCid(parts[2]) if err != nil { - return "", &pathError{error: fmt.Errorf("invalid CID: %s", err), path: txt} + return "", &ErrInvalidPath{error: fmt.Errorf("invalid CID: %w", err), path: txt} } case "ipns": if parts[2] == "" { - return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} + return "", &ErrInvalidPath{error: fmt.Errorf("not enough path components"), path: txt} } default: - return "", &pathError{error: fmt.Errorf("unknown namespace %q", parts[1]), path: txt} + return "", &ErrInvalidPath{error: fmt.Errorf("unknown namespace %q", parts[1]), path: txt} } return Path(txt), nil @@ -132,12 +132,12 @@ func ParsePath(txt string) (Path, error) { // ParseCidToPath takes a CID in string form and returns a valid ipfs Path. func ParseCidToPath(txt string) (Path, error) { if txt == "" { - return "", &pathError{error: fmt.Errorf("empty"), path: txt} + return "", &ErrInvalidPath{error: fmt.Errorf("empty"), path: txt} } c, err := decodeCid(txt) if err != nil { - return "", &pathError{error: err, path: txt} + return "", &ErrInvalidPath{error: err, path: txt} } return FromCid(c), nil @@ -169,13 +169,13 @@ func SplitAbsPath(fpath Path) (cid.Cid, []string, error) { // if nothing, bail. if len(parts) == 0 { - return cid.Cid{}, nil, &pathError{error: fmt.Errorf("empty"), path: string(fpath)} + return cid.Cid{}, nil, &ErrInvalidPath{error: fmt.Errorf("empty"), path: string(fpath)} } c, err := decodeCid(parts[0]) // first element in the path is a cid if err != nil { - return cid.Cid{}, nil, &pathError{error: fmt.Errorf("invalid CID: %s", err), path: string(fpath)} + return cid.Cid{}, nil, &ErrInvalidPath{error: fmt.Errorf("invalid CID: %w", err), path: string(fpath)} } return c, parts[1:], nil From fbb6fad3849a6bf8fa69db30d59ae7e207d7a2dd Mon Sep 17 00:00:00 2001 From: Steve Moyer Date: Mon, 27 Feb 2023 09:44:25 -0500 Subject: [PATCH 3142/3147] docs(pinning): eliminate copy-n-paste typo (#28) This commit was moved from ipfs/go-ipfs-pinner@1174ddd23d65dd4ff4355c049e1e5e662a424b3f --- pinning/pinner/pin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pinning/pinner/pin.go b/pinning/pinner/pin.go index 27f4b4065f..fcf7d764a7 100644 --- a/pinning/pinner/pin.go +++ b/pinning/pinner/pin.go @@ -121,7 +121,7 @@ type Pinner interface { // DirectKeys returns all directly pinned cids DirectKeys(ctx context.Context) ([]cid.Cid, error) - // DirectKeys returns all recursively pinned cids + // RecursiveKeys returns all recursively pinned cids RecursiveKeys(ctx context.Context) ([]cid.Cid, error) // InternalPins returns all cids kept pinned for the internal state of the From dc90d162f51e294d04f5efdc64d7e06bf28da770 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Mon, 27 Feb 2023 23:57:38 +0100 Subject: [PATCH 3143/3147] Allow using a NewWriteThrough() blockstore. Similar to blockservice.NewWriteThrough(). Currently the default blockstore trades read amplification for every write. While this is fine in cases where writes are very expensive and the datastore offers a quick Has() method, it is not always the case. Some datastore backends may be better off just getting all the writes no matter what. At least I would like to try it out. This commit was moved from ipfs/go-ipfs-blockstore@498084aa0095be077c5c590d806ddbb03c943ccc --- blockstore/blockstore.go | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 509e678f55..5f183cfc34 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -114,8 +114,22 @@ func NewBlockstore(d ds.Batching) Blockstore { dd := dsns.Wrap(d, BlockPrefix) dsb = dd return &blockstore{ - datastore: dsb, - rehash: uatomic.NewBool(false), + datastore: dsb, + rehash: uatomic.NewBool(false), + checkFirst: true, + } +} + +// NewWriteThrough returns a default Blockstore implementation +// which does not tries to check if blocks exist prior to writing. +func NewWriteThrough(d ds.Batching) Blockstore { + var dsb ds.Batching + dd := dsns.Wrap(d, BlockPrefix) + dsb = dd + return &blockstore{ + datastore: dsb, + rehash: uatomic.NewBool(false), + checkFirst: false, } } @@ -132,7 +146,8 @@ func NewBlockstoreNoPrefix(d ds.Batching) Blockstore { type blockstore struct { datastore ds.Batching - rehash *uatomic.Bool + rehash *uatomic.Bool + checkFirst bool } func (bs *blockstore) HashOnRead(enabled bool) { @@ -170,9 +185,11 @@ func (bs *blockstore) Put(ctx context.Context, block blocks.Block) error { k := dshelp.MultihashToDsKey(block.Cid().Hash()) // Has is cheaper than Put, so see if we already have it - exists, err := bs.datastore.Has(ctx, k) - if err == nil && exists { - return nil // already stored. + if bs.checkFirst { + exists, err := bs.datastore.Has(ctx, k) + if err == nil && exists { + return nil // already stored. + } } return bs.datastore.Put(ctx, k, block.RawData()) } @@ -189,9 +206,12 @@ func (bs *blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error } for _, b := range blocks { k := dshelp.MultihashToDsKey(b.Cid().Hash()) - exists, err := bs.datastore.Has(ctx, k) - if err == nil && exists { - continue + + if bs.checkFirst { + exists, err := bs.datastore.Has(ctx, k) + if err == nil && exists { + continue + } } err = t.Put(ctx, k, b.RawData()) From 2cd3f887e0910aa3b29a10156833381d2d889651 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 8 Mar 2023 10:43:43 +0100 Subject: [PATCH 3144/3147] Accept options for blockstore: start with WriteThrough and NoPrefix This commit was moved from ipfs/go-ipfs-blockstore@7ad322b313506226f416ad1ae0421c775792103e --- blockstore/blockstore.go | 65 +++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 5f183cfc34..4d88ba54d1 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -107,47 +107,56 @@ type gcBlockstore struct { GCLocker } -// NewBlockstore returns a default Blockstore implementation -// using the provided datastore.Batching backend. -func NewBlockstore(d ds.Batching) Blockstore { - var dsb ds.Batching - dd := dsns.Wrap(d, BlockPrefix) - dsb = dd - return &blockstore{ - datastore: dsb, - rehash: uatomic.NewBool(false), - checkFirst: true, +// Option is a default implementation Blockstore option +type Option struct { + f func(bs *blockstore) +} + +// WriteThrough skips checking if the blockstore already has a block before +// writing it. +func WriteThrough() Option { + return Option{ + func(bs *blockstore) { + bs.writeThrough = true + }, } } -// NewWriteThrough returns a default Blockstore implementation -// which does not tries to check if blocks exist prior to writing. -func NewWriteThrough(d ds.Batching) Blockstore { - var dsb ds.Batching - dd := dsns.Wrap(d, BlockPrefix) - dsb = dd - return &blockstore{ - datastore: dsb, - rehash: uatomic.NewBool(false), - checkFirst: false, +// NoPrefix avoids wrapping the blockstore into the BlockPrefix namespace +// ("/blocks"), so keys will not be modified in any way. +func NoPrefix() Option { + return Option{ + func(bs *blockstore) { + bs.noPrefix = true + }, } } -// NewBlockstoreNoPrefix returns a default Blockstore implementation +// NewBlockstore returns a default Blockstore implementation // using the provided datastore.Batching backend. -// This constructor does not modify input keys in any way -func NewBlockstoreNoPrefix(d ds.Batching) Blockstore { - return &blockstore{ +func NewBlockstore(d ds.Batching, opts ...Option) Blockstore { + bs := &blockstore{ datastore: d, rehash: uatomic.NewBool(false), } + + for _, o := range opts { + o.f(bs) + } + + if !bs.noPrefix { + dd := dsns.Wrap(d, BlockPrefix) + bs.datastore = dd + } + return bs } type blockstore struct { datastore ds.Batching - rehash *uatomic.Bool - checkFirst bool + rehash *uatomic.Bool + writeThrough bool + noPrefix bool } func (bs *blockstore) HashOnRead(enabled bool) { @@ -185,7 +194,7 @@ func (bs *blockstore) Put(ctx context.Context, block blocks.Block) error { k := dshelp.MultihashToDsKey(block.Cid().Hash()) // Has is cheaper than Put, so see if we already have it - if bs.checkFirst { + if !bs.writeThrough { exists, err := bs.datastore.Has(ctx, k) if err == nil && exists { return nil // already stored. @@ -207,7 +216,7 @@ func (bs *blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error for _, b := range blocks { k := dshelp.MultihashToDsKey(b.Cid().Hash()) - if bs.checkFirst { + if !bs.writeThrough { exists, err := bs.datastore.Has(ctx, k) if err == nil && exists { continue From eeceee548e4b497be22116877752077987171e10 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Wed, 8 Mar 2023 11:21:47 +0100 Subject: [PATCH 3145/3147] feat: stub and deprecate NewBlockstoreNoPrefix This commit was moved from ipfs/go-ipfs-blockstore@1323a474b64ac660ba8d9991ba2dcdffd8b3d3a3 --- blockstore/blockstore.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 4d88ba54d1..81fafe6178 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -145,12 +145,20 @@ func NewBlockstore(d ds.Batching, opts ...Option) Blockstore { } if !bs.noPrefix { - dd := dsns.Wrap(d, BlockPrefix) - bs.datastore = dd + bs.datastore = dsns.Wrap(bs.datastore, BlockPrefix) } return bs } +// NewBlockstoreNoPrefix returns a default Blockstore implementation +// using the provided datastore.Batching backend. +// This constructor does not modify input keys in any way +// +// Deprecated: Use NewBlockstore with the NoPrefix option instead. +func NewBlockstoreNoPrefix(d ds.Batching) Blockstore { + return NewBlockstore(d, NoPrefix()) +} + type blockstore struct { datastore ds.Batching From fdfe12ca8806576f06fcc048f10a65b8467c5c8c Mon Sep 17 00:00:00 2001 From: Laurent Senta Date: Wed, 8 Mar 2023 18:28:30 +0100 Subject: [PATCH 3146/3147] feat: human-readable cache keys for IPFS_NS_MAP (#38) * feat: use peer.String() to use a human-readable cache key * fix: use normalized key representation * fix: cache ipns key can be any format This commit was moved from ipfs/go-namesys@af35385a1f71a71f75ab8007e1d4e5d7f04d8968 --- namesys/namesys.go | 31 ++++++++++++++++++++++++------- namesys/namesys_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/namesys/namesys.go b/namesys/namesys.go index 540aba4ea3..256dc42930 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -24,6 +24,7 @@ import ( ds "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" "github.com/ipfs/go-path" + iface "github.com/ipfs/interface-go-ipfs-core" opts "github.com/ipfs/interface-go-ipfs-core/options/namesys" ci "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" @@ -87,6 +88,23 @@ func WithDatastore(ds ds.Datastore) Option { } } +func loadStaticMap(list string) (map[string]path.Path, error) { + staticMap := make(map[string]path.Path) + for _, pair := range strings.Split(list, ",") { + mapping := strings.SplitN(pair, ":", 2) + key := mapping[0] + value := path.FromString(mapping[1]) + + ipnsKey, err := peer.Decode(key) + if err == nil { + key = iface.FormatKeyID(ipnsKey) + } + + staticMap[key] = value + } + return staticMap, nil +} + // NewNameSystem will construct the IPFS naming system based on Routing func NewNameSystem(r routing.ValueStore, opts ...Option) (NameSystem, error) { var staticMap map[string]path.Path @@ -96,12 +114,11 @@ func NewNameSystem(r routing.ValueStore, opts ...Option) (NameSystem, error) { // Example: // IPFS_NS_MAP="dnslink-test.example.com:/ipfs/bafkreicysg23kiwv34eg2d7qweipxwosdo2py4ldv42nbauguluen5v6am" if list := os.Getenv("IPFS_NS_MAP"); list != "" { - staticMap = make(map[string]path.Path) - for _, pair := range strings.Split(list, ",") { - mapping := strings.SplitN(pair, ":", 2) - key := mapping[0] - value := path.FromString(mapping[1]) - staticMap[key] = value + var err error + staticMap, err = loadStaticMap(list) + + if err != nil { + return nil, err } } @@ -215,7 +232,7 @@ func (ns *mpns) resolveOnceAsync(ctx context.Context, name string, options opts. cacheKey := key if err == nil { - cacheKey = string(ipnsKey) + cacheKey = iface.FormatKeyID(ipnsKey) } if p, ok := ns.cacheGet(cacheKey); ok { diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go index c641d49114..3441f4106b 100644 --- a/namesys/namesys_test.go +++ b/namesys/namesys_test.go @@ -88,6 +88,32 @@ func TestNamesysResolution(t *testing.T) { testResolution(t, r, "/ipns/bafzbeickencdqw37dpz3ha36ewrh4undfjt2do52chtcky4rxkj447qhdm", 1, "/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n", ErrResolveRecursion) } +func TestNamesysResolutionWithCache(t *testing.T) { + nsMap := "dnslink-test.example.com:/ipfs/bafyaaeykceeaeeqlgiydemzngazc2mrtbimaw,12D3KooWQbpsnyzdBcxw6GUMbijV8WgXE4L8EtfnbcQWLfyxBKho:/ipfs/bafyaagakcyeaeeqqgiydemzngazc2mrtfvuxa3ttbimba,k51qzi5uqu5dkwkqm42v9j9kqcam2jiuvloi16g72i4i4amoo2m8u3ol3mqu6s:/ipfs/bafyaahikdmeaeeqvgiydemzngazc2mrtfvuxa3ttfvsgk5lybimbk" + + staticMap, err := loadStaticMap(nsMap) + if err != nil { + t.Fatal(err) + } + + r := &mpns{ + ipnsResolver: mockResolverOne(), + dnsResolver: mockResolverTwo(), + staticMap: staticMap, + } + + testResolution(t, r, "/ipns/dnslink-test.example.com", opts.DefaultDepthLimit, "/ipfs/bafyaaeykceeaeeqlgiydemzngazc2mrtbimaw", nil) + + testResolution(t, r, "/ipns/bafzaajaiaejcbw5i6oyqsktsn36r2vxgl2jzosyao46rybqztxt4rx4tfa3hpogg", opts.DefaultDepthLimit, "/ipfs/bafyaagakcyeaeeqqgiydemzngazc2mrtfvuxa3ttbimba", nil) + testResolution(t, r, "/ipns/k51qzi5uqu5dlnojhwrggtpty9c0cp5hvnkdozowth4eqb726jvoros8k9niyu", opts.DefaultDepthLimit, "/ipfs/bafyaagakcyeaeeqqgiydemzngazc2mrtfvuxa3ttbimba", nil) + testResolution(t, r, "/ipns/12D3KooWQbpsnyzdBcxw6GUMbijV8WgXE4L8EtfnbcQWLfyxBKho", opts.DefaultDepthLimit, "/ipfs/bafyaagakcyeaeeqqgiydemzngazc2mrtfvuxa3ttbimba", nil) + + testResolution(t, r, "/ipns/bafzaajaiaejcbpltl72da5f3y7ojrtsa7hsfn5bbnkjbkwyesziqqtdry6vjilku", opts.DefaultDepthLimit, "/ipfs/bafyaahikdmeaeeqvgiydemzngazc2mrtfvuxa3ttfvsgk5lybimbk", nil) + testResolution(t, r, "/ipns/k51qzi5uqu5dkwkqm42v9j9kqcam2jiuvloi16g72i4i4amoo2m8u3ol3mqu6s", opts.DefaultDepthLimit, "/ipfs/bafyaahikdmeaeeqvgiydemzngazc2mrtfvuxa3ttfvsgk5lybimbk", nil) + testResolution(t, r, "/ipns/12D3KooWNZuG8phqhoNK9KWcUhwfzA3biDKNCUNVWEaJgigr6Acj", opts.DefaultDepthLimit, "/ipfs/bafyaahikdmeaeeqvgiydemzngazc2mrtfvuxa3ttfvsgk5lybimbk", nil) + +} + func TestPublishWithCache0(t *testing.T) { dst := dssync.MutexWrap(ds.NewMapDatastore()) priv, _, err := ci.GenerateKeyPair(ci.RSA, 2048) From a8700eb893b4d63c7ec4cd90aa20b7bd8a57cfef Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Wed, 8 Mar 2023 18:20:58 +0100 Subject: [PATCH 3147/3147] docs: improved DNSLink lookup error - updates docs link to .tech - makes it very clear what is missing This commit was moved from ipfs/go-namesys@e30a7b84705484a67d9b378a541f5242bfd19776 --- namesys/dns.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/namesys/dns.go b/namesys/dns.go index ba19061621..a47e380a72 100644 --- a/namesys/dns.go +++ b/namesys/dns.go @@ -133,7 +133,7 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options // dnslink, then output a more specific error message if rootResErr == ErrResolveFailed && subResErr == ErrResolveFailed { // Wrap error so that it can be tested if it is a ErrResolveFailed - err := fmt.Errorf("%w: %q is missing a DNSLink record (https://docs.ipfs.io/concepts/dnslink/)", ErrResolveFailed, gpath.Base(name)) + err := fmt.Errorf("%w: _dnslink subdomain at %q is missing a TXT record (https://docs.ipfs.tech/concepts/dnslink/)", ErrResolveFailed, gpath.Base(name)) emitOnceResult(ctx, out, onceResult{err: err}) } return